Four Text Levels, Not Two
SHOULD: Define four text levels as tokens and use all four — primary (body, highest contrast), secondary (supporting copy), tertiary (metadata: timestamps, field labels, counts), muted (disabled/placeholder, lowest contrast). Two levels ("text" and "gray text") collapse every secondary role onto one step, so nothing recedes. Weight and colour carry more hierarchy than size — a single 14px size can hold three tiers.
Build four text levels — primary, secondary, tertiary, muted — and use all four, instead of shipping "text" and "gray text"
Bad
Good
Why it matters
The four levels have fixed jobs: primary is default body text at the highest contrast; secondary is supporting copy, slightly muted; tertiary is metadata — timestamps, field labels, counts; muted is disabled and placeholder text, the lowest contrast in the system. Ship only two and every secondary role collapses onto one step: the field label, the supporting sentence, the timestamp and the greyed-out placeholder all shout at the same volume, so nothing recedes and the eye has nowhere to go.
The fix is not a new font size — the Apple/Linear move is that weight and colour carry more hierarchy than size, so a single 14px size can hold three tiers cleanly. Define the four as tokens once and bind every text role to one of them, rather than reaching for whichever grey is nearest.