Typography
Three voices — an optical serif for editorial lines, Geist for the interface, Geist with tabular figures for data.
Lumen speaks in three voices — the type equivalent of the brand's core tension, the warmth of care and the precision of an instrument.
The three voices
| Voice | Face | Carries | Where |
|---|---|---|---|
| Editorial | Fraunces (optical serif) | warmth, character, the human | the headline, and the one sentence that says how she is doing |
| Interface | Geist (grotesque sans) | precision, calm, legibility | body, UI, labels, nav |
| Data | Geist (tabular figures) | exactness | vitals, labs, doses, time; Geist Mono only for codes and IDs |
Fraunces is a variable old-style serif with an optical-size axis — it adapts its contrast to the size, and that optical idea is the same one the whole brand comes from (the lens, the eye). It reads warm and editorial without tipping into clinical-cold or consumer-cute. Geist stays the workhorse — neutral and precise, it does the reading. The serif is the warmth; the sans is the instrument.
Restraint
The serif is spent on editorial lines only: a headline, and the one sentence that says how she is
doing. It never sets a number, and never sets interface text. check_truth.py enforces both rules.
Type scale
Every role, rendered from its --type-* token. Sizes follow iOS points, so body text is 17. Nothing is
smaller than 12. Use the type-* utilities from lumen/tailwind.css (type-display, type-body,
type-metric-xl, …); each sets the face, weight, size, leading and tracking together.
Tokens: --font-display (= --font-serif), --font-sans, --font-mono — or the Tailwind utilities
font-display, font-sans, font-mono from lumen/tailwind.css.
Numerals
Anything quantitative — vitals, labs, doses, gestational age — sets in Geist with
font-variant-numeric: tabular-nums (the data roles set it for you) so columns stay aligned and digits
never reflow as they tick. A view leads with one focal number: metric-xl (56) for the hero,
metric-l (34) inside a card, metric-m (22) in rows and tiles. The unit sits beside it in
unit (17), muted.