Consequential

ContentsAct II · MakeDesign it yourself

Move 20

Two weights, two sizes

Every weight is free now, which is precisely why your interface has six of them and looks like a ransom note.

Count the distinct font weights on your busiest screen. Then count the sizes.

Most codebases come back with five or six of each, and none of them was chosen. They accumulated: 500 because a component library shipped it, 300 because somebody thought a caption should look lighter, 600 and 700 both present because two people solved the same problem in different weeks.

There is a specific technical reason this got worse. CSS Fonts Level 4 defines font-weight as any number from 1 to 1000, with names mapped at each hundred, from Thin at 100 to Black at 900. With variable fonts, every one of those is free. No extra file, no extra request. The constraint that used to force a decision is gone, and nothing replaced it.

The subtraction

Colour is already doing most of your hierarchy work, and the previous chapters settled that. This one is about what is left, and the answer is: much less than you are currently using.

Two weights. One for normal text, one for emphasis. In practice 400 to 500 and 600 to 700.

Two sizes per component. One for the content, one for its label or metadata.

Everything else, every additional shade of importance you need, comes from colour you have already chosen, not from a new weight or a new step on the type scale.

The move

Two font weights and two font sizes per component. Anything you still need after that comes from colour, not from another value.

Where the outline overstates it, and where light weights actually hurt

The usual ranking is colour first, weight second, size last. That is a good rule for signalling importance without shouting, and it is Refactoring UI’s, so it is craft rather than measurement.

The independent research does not rank the dials that way, and it is worth knowing the difference. Size is the weakest lever on perceived importance and the strongest on legibility, which are different jobs. Do not shrink something to demote it if people still have to read it.

Where the evidence is unambiguous is at the light end. An eye-tracking study of light and ultra-light fonts concluded that “light and ultra-light fonts are less legible than their regular and bold counterparts” across two text variations. That is not a taste objection to font-weight: 300. It is a measured cost, and it lands on exactly the users least able to absorb it.

So the two weights you pick should both be at or above normal. The lighter one is 400, not 300.

BEFORE                            AFTER

font-weight: 300   caption        400   body, captions, labels
             400   body           600   headings, emphasis, the
             500   nav item             one thing per card that
             600   card title           matters
             700   page heading
             800   the CTA        14px  labels and metadata
                                  16px  content
11px  timestamp
13px  label                       everything else is colour:
14px  body                          #111 primary
15px  nav                           #555 secondary
18px  card title                    #888 tertiary
24px  page title
                                  two weights. two sizes per
six weights, six sizes,           component. three greys, already
none of them decided              chosen in move 16.

The floor nobody documents

There is one hard limit worth knowing, and it lives in a browser’s source rather than in a spec.

WebKit on iOS decides whether to zoom into a focused input by comparing its font size against a built-in standard. Set the text smaller than that threshold and the page zooms when a user taps the field, which is the origin of the notorious iOS form-zoom behaviour that teams usually fix by disabling zoom entirely.

Which is the wrong fix, because disabling zoom breaks it for anyone who needs to magnify. The right fix is to not go below 16px on inputs. That is not a design preference. It is the number that keeps a browser from taking over your layout.

What it costs

Two weights is genuinely restrictive on marketing surfaces. A landing page with one heading weight can look flat, and that is a real limitation rather than a discipline you should force. This rule is for product interfaces, where repetition across hundreds of screens is what makes consistency legible. Say which side of the line you are on before applying it.

And “two sizes per component” has no source. I could not find one, in Refactoring UI or anywhere else, so treat it as my working rule rather than received practice. What is defensible is the underlying point: every additional size is a claim that a new level of hierarchy exists, and most interfaces have three levels and eight sizes.

Try this week

Grep your stylesheet for font-weight and font-size and count the distinct values.

Then delete. Map every weight onto your two, and every size onto the smallest set that still lets each component distinguish its content from its labels. Most teams land at two weights and four sizes total across the whole product, not per component.

The screens will look flatter for about a day, until you notice that the hierarchy is still entirely legible, because it was being carried by colour the whole time.

And check your inputs for anything under 16px while you are in there. That one is not aesthetic.