An entry
Its title is a link, so it is the louder of the two and a page of them can be scanned by title alone.
Every size on it comes off one scale and every gap off one grid. That is not a house style — it is the only thing that lets a reader tell a heading from a title from a label before they read any of them.
Prose is the reading register: a paragraph at 16px, held to a measure, with headings above it that get quieter as they get deeper. Anything the machine wrote — a control, a table row, a code block — runs on the same scale a few steps down, because a reader scans it rather than reads it.
The mistake the scale exists to prevent is a third voice — a size chosen for one component because neither register looked right that afternoon. Every such size reads as a fourth level of hierarchy that means nothing.
| Register | Steps | What it is for |
|---|---|---|
| Display | 58 / 44 / 34 | A page opener and the two headings under it. Once each. |
| Reading | 20 / 19 / 16 | A third heading, a lead, and the paragraph that is the measure for everything else. |
| Dense | 14 / 13 | Every control, every table row, and everything the machine wrote. |
| Label | 12 / 11 | A machine name, a table head, a caption. Never a sentence. |
A reader reads anything with a heading over its own text, so its body is the page's own size. Only the title tells two kinds apart: a card and a result carry the louder one, because their title is somewhere you can go rather than something you read.
Below is the same shape twice: once as an entry, whose title is a destination, and once as a surface, which states something in place. The bodies are one size and only the titles differ.
Its title is a link, so it is the louder of the two and a page of them can be scanned by title alone.
What separates two things on a page is the air between them, and the air is what says which of them owns the other. A second-level heading takes 40px above it and the flow gap below: the large one belongs to the section it opens, the small one binds it to what it introduces.
Get that pair backwards and the heading floats between two sections and belongs to neither. That is the most common way a page with correct sizes still reads as a list of fragments.
A heading is the top of what follows, not a gap after what came before.
A token, or it is a defect. The scale holds the sizes and the grid holds the gaps, and a component that needs something between two steps has found either a missing step or a decision it must not make alone.
/* a reader reads a block, so it takes the page it stands on */
--block-title-size: var(--font-size-body);
--entry-title-size: var(--font-size-h3);
--block-body-size: var(--font-size-body);
/* and the line *about* a thing is not the thing */
--aside-size: var(--font-size-small);
Every value named above, with what it is for and what it is never for.