utwordSystem v3.25.7
Foundations

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:

TokenStackWhat it setsReferences in css/app.css
--font-bodysystem-ui, -apple-system, 'Segoe UI', sans-serifEverything you read: buttons, pills, questions, labels, body copy, and the letters on the tiles158
--font-display'Arial Black', system-ui, sans-serifThe wordmark, big numbers (the countdown, the trivia count), the room code, the recovery code tiles23
--font-word'Arial Black', 'Helvetica Neue', system-ui, sans-serifRead through its alias --font-die: the looked-up word on the dictionary screen5

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.

WeightRulesJob
50031tile letters, fields, body meta
60053secondary labels, secondary buttons, list words and names
70074primary buttons, eyebrows, most emphasis
80030pills, sheet titles, the trivia question, big stats
90011big 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).

RoleClassFaceSize · weightTrackingNotes
Countdown.count-numdisplay110px · not set3, 2, 1 before a round
Room code.room-codedisplay54px · not set14pxthe lobby's one giant moment
Run total.tv-sum-ndisplay54px · 900, line-height 1.05the end of a trivia run
Code tile.rctdisplay21px · 900the recovery code
Wordmark.brand-markdisplay1em of the mark · 700−0.5pxsee Brand mark
Big stat.cc-bigbody22px · 800, tabular"46 pts" on a Compete card
Question.tv-qbody20px · 800, line-height 1.318px on screens under 760px tall
Sheet title.modal-titlebody17px · 8000.2pxevery bottom sheet
Word pill.word-pillbody17px · 800, uppercase2pxthe word being traced
HUD pill.pillbody16px · 800, tabular1px on the timerthe clock and the score
Primary button.primarybody16px · 70017px when .big
Field.fieldbody16px · 500the code field is 20px · 700, 6px, uppercase
List word, name.wword, .standing-namebody16px · 6000.3px on words
Secondary button.secondarybody15px · 600
Helper copy.hint, .metabody13.5px, 13px · line-height 1.45, 1.5under fields and sections
Sheet sub.modal-subbody12.5px · 500, line-height 1.45
Eyebrow.eyebrowbody11px · 700, uppercase2px--fg-soft; the structural label
Tile letter.tile-facebodyclamp(24px, 52cqw, 46px) · 50052% of the tile's own width
Dark
Light
Type in a round the HUD pills are tabular; the caption and the pill are two jobs in two elements
Dark
Light
Type around the round Home's name field and Play section, as shipped
Dark
Light
The display face Arial Black where the device has it; the system face at the rule's weight where it doesn't, as on every iPhone

Numbers

  • Live numbers are tabular. font-variant-numeric: tabular-nums is on .pill (the clock and the score), .cc-big, .team-bar-pts and 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.

Dark
Light
Five small uppercase labels that should be one top to bottom: .eyebrow, .cc-eb, .tv-qn, .tv-rest, .words-head
ClassSize · weightTrackingColourWhere
.eyebrow11px · 7002px--fg-softsection labels everywhere
.cc-eb11px · 7001.2px--fgCompete card titles
.tv-qn10.5px · 7001.5px--fg-soft"Question 2 · Easy"
.tv-rest10px · 7002px--fg-soft"Swipe the answer"
.words-head10px · 7002px--fg-softcolumn 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, .rank and .headword. None has gained a weight since. h1 and h2 pick 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-word sets "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 is clamp(24px, 52cqw, 46px) with the vw line 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.
  • 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