Reference
Design system
Every ratio was computed with tools/a11y/contrast.py against all three grounds.
This page is noindex: it documents the template for whoever builds with it.
The glyphs are text
Twelve characters set as live text rather than exported as an image. Select them, copy them, paste them into your own document, resize the page — which is the only test of a character that means anything, and precisely the test a PNG specimen quietly prevents. It is also why the whole page is legible at 400% zoom without a horizontal scrollbar.
Partial is a state with a column
Full, Partial, None — word, glyph, hue, as always. But the coverage table has a fourth signal the others do not: a column that names the exact missing characters wherever the state is Partial. A partial claim without specifics is a marketing claim, and it is how a font ends up shipping a cedilla where Romanian wants a comma below.
inLanguage lists only what is Full
Each family is a Product carrying its glyph count and an
inLanguage list built by a strict rule: a language group appears only where
the table says Full. Schema has no way to express “Romanian, except the two
characters Romanian actually needs”, so putting Partial in would make the
machine-readable version say exactly what the page refuses to. No offers, because nothing
here is priced.
Two forms, on purpose
A trial request and a commission enquiry. Merging them gets neither — a trial is a thirty-second ask and a commission is a conversation about languages and reading sizes. This is the only template in the library with two forms and it is the thing that makes it structurally a foundry rather than a portfolio.
Type
Rozha One — display
Fira Sans Condensed — 502 glyphs · 6 weights · 134 Vietnamese
Body is the system stack. A high-contrast Didone chosen because this page sets it at 96 px, where contrast is the whole point of the design; at 12 px it would be the wrong choice and the page never asks it to be. Neither face appears in days 1–124.
Tokens
| Swatch | Token | Value | Measured |
|---|---|---|---|
--color-bg | #15130F | Warm ink-black | |
--color-bg-alt | #1D1A15 | Banding | |
--color-surface | #26221B | Glyph cards and family cards | |
--color-text | #F4F1E9 | 16.44 / 15.37 / 14.02:1 · AAA | |
--color-text-muted | #ABA598 | 7.57 / 7.08 / 6.46:1 · AAA | |
--color-border | #767164 | 3.81 / 3.56 / 3.25 — non-text only | |
--color-accent | #58D7E0 | Cyan — 10.79 / 10.09 / 9.20:1 · AAA | |
--c-full | #8FD46A | Full — 10.42 / 9.74 / 8.89:1 · AAA | |
--c-partial | #E8B44A | Partial — 9.77 / 9.13 / 8.33:1 · AAA | |
--c-none | #FF8F7A | None — 8.36 / 7.81 / 7.13:1 · AAA | |
--color-band | #F4F1E9 | The band inverts: paper on ink | |
--color-on-band | #15130F | 16.44:1 on band · AAA | |
--color-on-band-muted | #5C574B | 6.37:1 on band · AA | |
--color-accent-on-band | #0C6067 | 6.45:1 on band · AA |
The border token clears 3:1 against all three grounds, which is what WCAG 1.4.11 asks of a non-text boundary. It is never used for text.