Saturday, March 2, 2024
HomeCSSCSS Findings From The Threads App

CSS Findings From The Threads App

After I encounter a brand new product, one of many first issues that involves thoughts is how they applied the CSS. This was no completely different once I got here throughout Threads by Meta. I shortly explored the cellular app and observed that I may preview public posts on the internet.

This offered a chance for me to dig deeper. I got here throughout a couple of attention-grabbing findings, which I’ll focus on on this article.

Let’s dive in!

Utilizing CSS grid for the submit format

One of the crucial noteworthy use instances of CSS Grid in a manufacturing app is present in Threads. CSS Grid is used to construct the submit format.

Have a look:

:root {
  --barcelona-threadline-column-width: 48px;

.submit {
  show: grid;
    minmax(0, 1fr);
  grid-template-rows: 21px 19px max-content max-content;

Enjoyable reality: the primary grid column is known as --barcelona. I’m curious to know the explanation behind this selection.

The submit format consists of a 2-column * 4-row grid. There is no such thing as a fundamental container; every merchandise throughout the submit is manually positioned utilizing the grid-column and grid-row properties.

The consumer avatar

.post-avatar {
  padding-top: 4px;
  grid-row: 1 / span 2;
  grid-column: 1;

The avatar is positioned within the first column and spans the primary two rows. It’s price noting the presence of padding-top. Though I couldn’t discover a particular cause for it within the manufacturing code, it appears to be fine-tuning the UI alignment.

Here’s a earlier than & after search for an avatar with and with out the padding-top therapy:

The opposite cause for making use of the padding-top right here might be to push the avatar all the way in which down and make it nearer to the road.

Utilizing odd values for the grid rows

Why use 21px and 19px as row values? After inspecting additional, it appears to be a type of fine-tuning for the UI. The sum of the row heights is 40px, which accounts for the avatar top plus the padding-top (36px + 4px).

You may be curious why these values usually are not standardized. Design techniques are generally related to the idea that designers should strictly comply with predefined guidelines for UI components.

Nevertheless, this instance reveals that utilizing manually adjusted values may be acceptable. It’s okay to deviate from strict tips in sure conditions.

Limitations of Utilizing Mounted-Dimension Rows

As a result of mounted widths of the primary two rows, it’s not doable so as to add padding to them. Nonetheless, so long as you’re conscious of this limitation, it may be labored round through the use of margins as an alternative.

Right here is an instance:

Including high and backside padding didn’t have an effect on the submit header because of the fixed-size rows.

The area between the format columns feels a bit hacky

The present hole between the format columns is zero. As a substitute, the picture has a measurement of 36*36 pixels, whereas its container is 48 pixels in width.

This mimics the spacing right here. I don’t know why the crew opt-in for that, however I would favor to make use of hole as an alternative.

Why not use named CSS grid areas?

Primarily based on what I’ve noticed to date, there are three variations of the grid format, and all of them may benefit from utilizing named grid areas.

I attempted to duplicate the grid and construct it based mostly on the named areas. It seems simpler to scan than specifying values for the columns and rows.

To reveal this, let’s assign a grid-area to every merchandise within the format:

.AvatarContainer {
  grid-area: avatar;

.HeaderContainer {
  grid-area: header;

.BodyContainer {
  grid-area: physique;

.ThreadlineContainer {
  grid-area: line;

.FooterContainer {
  grid-area: footer;

Variation 1: the default

Then, we are able to begin engaged on the variations. Right here is the default format:

.submit {
  show: grid;
    minmax(0, 1fr);
  grid-template-rows: 21px 19px max-content max-content;
    "avatar header"
    "avatar physique"
    ". physique"
    ". footer";

Be aware the usage of . to characterize empty areas.

Variation 2: the reply

A variation is when somebody replies to a different.

.post--reply {
  grid-template-rows: 36px 0 max-content max-content;
    "avatar header"
    "physique physique"
    "physique physique"
    "footer footer";

Variation 3: the default with a thread line

.post--withLine {
    "avatar header"
    "avatar physique"
    "line physique"
    "footer footer";

Utilizing named grid areas right here made it doable to vary the format by modifying in a single place solely.

SVG for the thread traces

To be trustworthy, what initially caught my consideration within the Threads app was the swirl line. I grew to become interested by the way it was constructed since I had beforehand written about an analogous subject a couple of weeks in the past.

See the next determine:

That line connecting my avatar to Mark’s one is an SVG path. It consists of three elements.

The size of the primary half is calculated with JavaScript.

Inline CSS variables for CSS grid

I’m glad to see a factor that I and plenty of others advocated for is getting used on a large-scale app like Threads.

Within the consumer profile, the tabs grid format is constructed with an inline CSS variable that features the depend of the tabs.

That is helpful. When the variety of tabs elevated, we solely want to vary the worth of the CSS variable. Neat, proper?

Overflow wrapping

I observed the usage of overflow-wrap: wherever for the submit physique. I haven’t used or heard of that key phrase earlier than. I exploit break-word.

As per MDN, it’s the identical as break-word however with one extra factor:

Gentle wrap alternatives launched by the phrase break are thought-about when calculating min-content intrinsic sizes.

I nonetheless didn’t discover a distinction when utilizing break-word vs wherever. I’m very curious to know why, if any of the Threads crew is studying this.

The usage of dynamic viewport items

I like the usage of the dynamic viewport unit dvh for the splash display screen.

If you wish to be taught extra, I wrote an in depth article on the brand new viewport items.

Defensive CSS methods

To make it possible for a flexbox format received’t break due to the minimal content material size, min-width: 0 is used to reset that habits.

Learn extra about this in my defensive CSS submit concerning the minimal content material measurement in flexbox.


That’s it for at present. I loved inspecting the CSS and attending to know the way the Threads crew is constructing the product. I’m certain there are lots of issues that I haven’t observed as a result of that is the preview-only model on the internet.



Please enter your comment!
Please enter your name here

Most Popular

Recent Comments