FOUNDATIONS
Typography
Three roles, two families, and a set of themes that are allowed to swap both. Type is where the pixel aesthetic is most load-bearing — and most fragile.
Families
Each role is a token, not a font name. Components ask for font-header; the active theme decides what that resolves to.
GeistPixel Square
--font-headerHEADERS AND DISPLAY TYPE
A true pixel typeface. Carries the entire retro read of the product — used sparingly, at larger sizes, where the pixel grid is legible.
JetBrains Mono SemiBold
--font-subheaderLABELS, EYEBROWS, BUTTONS
Uppercased and letter-spaced. The monospace grid reinforces the terminal feel without costing legibility at small sizes.
JetBrains Mono
--font-bodyBODY COPY AND UI TEXT
Monospace body text is an unusual choice and a deliberate one — it keeps numeric data (scores, playtime, dates) aligned everywhere it appears.
The ramp
Seven steps. Anything outside them is a one-off that should probably be folded back in.
font-header · 30pxfont-header · 20pxfont-header · 16pxfont-subheader · 12px · trackedfont-body · 14pxfont-body · 12pxfont-body · 10px · tertiaryThemes that reassign type
Most themes only change color. These change the typeface too, which is the point at which a theme stops being a palette and starts being a different product skin.
No theme currently overrides a font token — every theme inherits the default GeistPixel / JetBrains Mono pairing.