Typography
The system face sets almost everything you read. A heavy display face is kept for a few loud moments, mostly numbers, and one small uppercase label, the eyebrow, does the structural work.
How it works
Three font families are tokens, defined once next to the colour tokens in app.jsx:
| Token | Stack | What it sets | References in css/app.css |
|---|---|---|---|
--font-body | system-ui, -apple-system, 'Segoe UI', sans-serif | Everything you read: buttons, pills, questions, labels, body copy, and the letters on the tiles | 158 |
--font-display | 'Arial Black', system-ui, sans-serif | The wordmark, big numbers (the countdown, the trivia count), the room code, the recovery code tiles | 23 |
--font-word | 'Arial Black', 'Helvetica Neue', system-ui, sans-serif | Read through its alias --font-die: the looked-up word on the dictionary screen | 5 |
The body face is the workhorse: 158 of the 186 font references. The display face is used with restraint, mostly for big numbers and codes. The word face survives on one screen.
Weights
Five weights ship, each with a job (spec §3). Counts are rules in css/app.css at 3.23.6.
| Weight | Rules | Job |
|---|---|---|
| 500 | 31 | tile letters, fields, body meta |
| 600 | 53 | secondary labels, secondary buttons, list words and names |
| 700 | 74 | primary buttons, eyebrows, most emphasis |
| 800 | 30 | pills, sheet titles, the trivia question, big stats |
| 900 | 11 | big display numbers: the trivia count, the code tiles, the ? tile |
The roles
Every size below is read from the game's CSS. "Not set" means the rule names the display face but no weight (see Known issues).
| Role | Class | Face | Size · weight | Tracking | Notes |
|---|---|---|---|---|---|
| Countdown | .count-num | display | 110px · not set | 3, 2, 1 before a round | |
| Room code | .room-code | display | 54px · not set | 14px | the lobby's one giant moment |
| Run total | .tv-sum-n | display | 54px · 900, line-height 1.05 | the end of a trivia run | |
| Code tile | .rct | display | 21px · 900 | the recovery code | |
| Wordmark | .brand-mark | display | 1em of the mark · 700 | −0.5px | see Brand mark |
| Big stat | .cc-big | body | 22px · 800, tabular | "46 pts" on a Compete card | |
| Question | .tv-q | body | 20px · 800, line-height 1.3 | 18px on screens under 760px tall | |
| Sheet title | .modal-title | body | 17px · 800 | 0.2px | every bottom sheet |
| Word pill | .word-pill | body | 17px · 800, uppercase | 2px | the word being traced |
| HUD pill | .pill | body | 16px · 800, tabular | 1px on the timer | the clock and the score |
| Primary button | .primary | body | 16px · 700 | 17px when .big | |
| Field | .field | body | 16px · 500 | the code field is 20px · 700, 6px, uppercase | |
| List word, name | .wword, .standing-name | body | 16px · 600 | 0.3px on words | |
| Secondary button | .secondary | body | 15px · 600 | ||
| Helper copy | .hint, .meta | body | 13.5px, 13px · line-height 1.45, 1.5 | under fields and sections | |
| Sheet sub | .modal-sub | body | 12.5px · 500, line-height 1.45 | ||
| Eyebrow | .eyebrow | body | 11px · 700, uppercase | 2px | --fg-soft; the structural label |
| Tile letter | .tile-face | body | clamp(24px, 52cqw, 46px) · 500 | 52% of the tile's own width |
Numbers
- Live numbers are tabular.
font-variant-numeric: tabular-numsis on.pill(the clock and the score),.cc-big,.team-bar-ptsand the help sheet's copies of the HUD, so a ticking number never changes width. - Numbers lead, names last. A line that mixes a number and a player name puts the number first: "Top 7 · Samra-the real1", "833 pts · 104 behind Samra". A long name then only truncates itself.
- Clock format is minutes and seconds,
1:42, in the timer pill.
Rules
The labels, side by side
The eyebrow has near-twins (audit finding 7). Here they are with the same words, so the differences show.
| Class | Size · weight | Tracking | Colour | Where |
|---|---|---|---|---|
.eyebrow | 11px · 700 | 2px | --fg-soft | section labels everywhere |
.cc-eb | 11px · 700 | 1.2px | --fg | Compete card titles |
.tv-qn | 10.5px · 700 | 1.5px | --fg-soft | "Question 2 · Easy" |
.tv-rest | 10px · 700 | 2px | --fg-soft | "Swipe the answer" |
.words-head | 10px · 700 | 2px | --fg-soft | column headers over the word list |
Why it's built this way
Known issues and gaps
From the 3.23.6 audit, plus what turned up while writing this page:
- No type scale. 28 distinct font sizes, including five half-pixel sizes (10.5, 11.5, 12.5, 13.5 and 14.5px, 38 uses between them), and 16 letter-spacing values that mix px and em. Counting the CSS the app still renders, small uppercase labels (12px and under) come in 18 different recipes of size, weight and tracking; the table above shows five. Planned fix: a 7-step scale as tokens (
--text-micro…--text-display) and one micro-label class, with the half sizes collapsed. Scales ship one family per release after the 3.23.7 patch and the alias rename, each mocked first. - Display rules with no weight (open since 3.9.1). 3.9.1 named seven:
h1,h2,.room-code,.count-num,.timer.done,.rankand.headword. None has gained a weight since.h1andh2pick up bold from the browser's default heading style; the room code, the countdown and "Time!" render at regular weight on any phone without Arial Black. The fix was held because it changes five screens at once. - The word face is nearly unused. The spec says
--font-wordsets "the traced word / tile lettering", but the tile letters and the word pill both use--font-body(spec §5 agrees with the code). Of its five references, three style classes nothing renders. Either the token gets a real job or it goes. - The spec's tile letter size is out of date. It reads
clamp(26px, 42vw / cols, 38px); the code isclamp(24px, 52cqw, 46px)with thevwline as a fallback. - The reference page lists four weights. The one-page reference still says "500, 600, 700, 800, nothing else"; 900 ships in 11 rules. The spec was corrected in 3.23.6.
- Screenshots aren't phone type. The trivia screens were captured in Chromium at phone size, so their type is the browser's system font, not the iPhone's.
Related
- Color: the ink tokens every role uses
- Layout and spacing: the column the type sits in
- Pill: the one live value, in 16px / 800 tabular
- Voice: what the words say