Skip to contentWolf-Rayet

Decision records

ADR-0099 Three type roles and five faces

Accepted2026-09-17Phase 7

Amends: ADR-0023

#Context

ADR-0098 chose the direction: an instrument voice for the interior themes and a signage voice for the field themes, with one display face shared by all four. ADR-0023 gave the system two type roles, display and body, resolved per theme. The new direction also relies on figures that line up: readings, counts, times and codes. Until now that meant a body face with tabular numerals, which gives no signal that a string is data.

#Decision

A third role, mono. Components read --wr-family-mono for figures that line up, the same way they read display and body. The verifier's role list now names three roles.

Five faces, all from google/fonts at a pinned commit, under the SIL Open Font License, recorded in packages/tokens/assets/fonts/upstream/SOURCES.md:

RoleInterior themesField themes
displayBig Shoulders DisplayBig Shoulders Display
bodyChivoAtkinson Hyperlegible Next
monoChivo MonoAtkinson Hyperlegible Mono
  • Display is condensed. Set in caps, it is for page titles indoors, and

for section headings too in the field. It is never used for body copy or below 24px. Its fallback leads with Arial Narrow, the closest common metric.

  • Field faces stay the Atkinson family (ADR-0023's legibility argument),

moved to its Next and Mono cuts.

The old faces (Signika Negative, Inter, Atkinson Hyperlegible 400 and 700) are removed from the upstream set and from both apps. subset-faces.py subsets the new faces to the declared Latin-1 range. Each app ships the licence text beside the faces.

#Consequences

  • No component reads a family role yet: components inherit the body face from

the root. Applying display and mono to components is the component treatment unit. No scene value moved, because fixtures render in the engine's metric face.

  • Both apps now load five variable faces, which subset to 128,456 bytes per

app in total.

#Rejected

  • Tabular numerals in the body face instead of a mono role. They give no

signal that a string is data, and field legibility wants the Mono cut's distinguishable 0, O, l and 1.

  • Italic cuts. Nothing in the direction uses them.