Skip to contentWolf-Rayet

Decision records

ADR-0023 Type families, three families resolved on the theme axis

Superseded by ADR-00352026-09-01Phase 4

#Context

ADR-0022 already put a type family into this repository: three roles — display, body and legibility — with Signika Negative for display, Inter for body, Atkinson Hyperlegible for legibility, and field-day and field-night overriding body alone to legibility. Display stayed Signika Negative in all four themes, so every surface the system serves already renders a chosen face rather than whatever the browser falls back to. Playbook section 4 puts four themes on one axis and two of them are hostile: field-day is direct sun through possibly polarized eyewear, field-night is a dark adapted eye — and that split reached body copy but not display, the largest and most attention-carrying text in the ladder. Section 7's three authored tiers still have no place of their own for a family; ADR-0022 gave it a fourth home beside the type scale instead, with a per-theme override table bolted alongside rather than resolved the way every other semantic role resolves. A component roster is being built against that shape — thirty-eight of the forty-five ADR-0021 names are still to build — and a family resolved differently after most of the roster ships is a family retrofitted into everything already built against the old shape.

#Decision

Three families enter the Primitives collection, mode less, alongside the ramps and the spatial scales, and two semantic roles resolve them per theme. The display role resolves to Signika Negative in interior-light and interior-dark and to Atkinson Hyperlegible in field-day and field-night. The body role resolves to Inter in the interior themes and to Atkinson Hyperlegible in the field themes. Signika Negative and Inter are variable faces; Atkinson Hyperlegible ships no variable file at its canonical distribution, so its two static weights, Regular and Bold, are used instead. All three are under the SIL Open Font License, self hosted in this repository beside their license files, never fetched from a third party at render time. Components consume the two roles and never a family name, on the same discipline that makes a raw duration a lint error.

#Rejected options

One family for every role and every theme, Inter alone. It had the strongest practical case in the set: one face to load, one metric system, no family axis to resolve, and a face already proven at interface sizes. It lost on section 4. Inter is an interior grade face designed for screens read at a comfortable distance in controlled light, and it has no rung that answers glare or a dark adapted eye. Section 4 says build the hostile cases first and promote inward. A single interior face is the hostile case built last.

Keep the current fallback stack. It costs nothing, ships today, and its metrics are already whatever every scene was measured against. It lost because it is not a choice. The face that renders is the face the reader's machine happens to have, which makes typography the one part of this system whose output cannot be predicted from its source, in a repository whose entire claim is that the rendered result is derivable and checkable.

A single superfamily spanning all three roles. Tidy, one license, matched metrics across roles, and the vertical rhythm falls out for free. It lost on what the field role is for. A superfamily's sans grade is drawn for harmony with its siblings, not for telling a capital I from a lowercase l at arm's length in sunlight, and buying harmony at the cost of disambiguation inverts which of the two this system says matters.

Family as a density concern rather than a theme concern. Density already owns the spatial tokens, so the plumbing exists and no new resolution axis is needed. It lost because density means comfortable or compact, which is a question about how much room the content gets, and legibility pressure comes from ambient light and viewing distance. A compact interior panel does not need disambiguated letterforms and a comfortable field screen does. Resolving families on the wrong axis would give the right answer only by accident.

#Consequences

Theme completeness now has two more roles to resolve in four themes, and the existing row in section 10 covers them without amendment. The namespace rule holds unchanged: each new name is owned by exactly one tier.

Rendered pixels move wherever a real face renders. Emission is measured on the lightness of painted pixels, so a family is an emission input and not only a stylistic one: a face that paints more ink at the same size raises a scope's load without a single token changing. That is the reason this record lands before the component roster rather than after it.

Fixture scenes keep the generated metric face. The harness is a measurement instrument and it may not depend on which faces a machine has installed, so the scenes override the family roles deliberately, and that override is part of the design rather than a gap in it.