utwordSystem v3.25.7
Components

Card

A surface one step up from the page, with a 1px rule and no shadow. A card groups what the player reads or taps as one thing, and a Compete card turns green only once you've played it today.

stable

Usage

Use a card for something the player reads or taps as one thing: a game on Home's Compete section, a player's row in the standings, a trivia question, a public room to join, the recovery code panel.

Use a card for spare space. When a fixed container has room to spare, it shows as a card with its content centred, never as empty ground on one side. That's how the trivia question card was built.

Don't lift a card with a shadow. Depth comes from flat surface levels, not a shadow stack.

Don't turn a card green to make it inviting. A Compete card goes green once you've played that game today, and never before: green means earned.

Dark
Light
Compete on Home the Daily board card, full width; Trivia not yet played and played, side by side

Anatomy

Surfaces. Three flat levels and one opaque helper. Each is a token with a dark and a light value.

LevelTokenDarkLightUsed for
Ground--ground#202845#F2F0EAthe page, and a sheet's panel
Raise--raisergba(242,240,234,.08)#FAF9F6cards, fields, rows
Raise, opaque--raise-solid#313852#FAF9F6the crown's halo on a raised row, where a translucent fill can't cover what's behind it
Lit--lit#3D445C#D5D4D3a lit surface that isn't a tile: today, only the 3rd-place podium columns

The card. The cards share one build, with a few corner and padding sizes:

PartSpecToken
Fillthe raise level--raise
Edge1px solid, the whole way round--rule
Corners14px on the newer cards (Compete, question, room, code panel, Home's notices); 12px on standings rows, the trivia rules card and the lobby's settings
Padding14px on Compete cards; 14px 16px on the question card and room rows; 12px 14px on a standings row's head
Shadownone

The Compete card (.cc-card) adds a 24×24 arrow fixed 8px from the top-right corner, with 36px kept clear on the right of a wide card and 22px on a tall card's top row. Wide cards (.cc-wide, .cc-row) are one row; tall cards (.cc-tall) sit two to a row in .cc-pair, 10px apart, at least 140px tall, with their text pinned to the bottom. Covers are small tiles (.cc-t): DAILY in selected tiles, and on the Longest word card your own word in selected tiles, five to a line.

States

Dark
Light
The Daily board card, before and after play: the soft select-stroke edge; done: green fill, green edge, green arrow
CardStateLook
Compete cardto play (.play)--raise fill, edge in --select-stroke
played today (.done)fill is 7% green mixed into --raise, edge is 45% green, the arrow and eyebrow turn --earned with a check
no connection (:disabled)opacity 0.5; a card already played stays live
Standings rowat rest (.standing)--raise head, 1px --rule edge
1st (.winner)edge in --fg
earned (.unlocker)edge in --earned: the day's trivia leader, or whoever found the longest word first
showing its word (.sel)edge in --fg
you, on the podium list (.pod-you)edge in --fg

Green takes the whole card, fill and edge together, never a green fill inside a neutral rule.

Compete with nothing played today
Not played today
Compete with trivia played, 1st today
Trivia played, 1st

Behaviour

  • A Compete card is one tap target. The whole card is a <button>: tap to play, or, once played, to see today's results.
  • A Compete card's cover fades in over 600ms when Home opens, and holds still under reduced motion.
  • A standings row presses as one piece. Tapping its head dips the whole card, edge included, to scale(0.99).
  • A standings row opens in place to show that player's words or stats, with the chevron turning 180°.
  • The question card keeps one height for a whole trivia run, so the board under it never moves. See Trivia.

Accessibility

TokenDark · groundDark · cardLight · groundLight · card
--fg
body text
12.70AAA10.14AAA12.70AAA13.75AAA
--fg-soft
secondary text
6.36AA5.07AA4.78AA5.17AA
--fg-faint
tertiary
3.19UI only2.55decorative2.29decorative2.48decorative
--earned
earned (green)
8.98AAA7.17AAA5.71AA6.18AA
--danger
refused (rose)
8.52AAA6.80AA7.54AAA8.16AAA
--focus
focus ring
5.27AA4.21UI only5.38AA5.82AA

WCAG contrast, computed from the tokens on every build. AA needs 4.5:1 for text, 3:1 for large text and UI.

  • Text on a card: --fg is 10.14:1 (dark) and 13.75:1 (light) on --raise; --fg-soft is 5.07:1 and 5.17:1. Both pass AA.
  • The edge is decorative. --rule is 1.65:1 (dark) and 1.30:1 (light) against the ground, below the 3:1 target for UI. That's deliberate, for the hairline look, so a card's edge alone never marks it as tappable: Compete cards also carry an arrow, and standings rows a chevron.
  • A Compete card is read as its words. Its covers and arrow are aria-hidden, so a screen reader reads only the card's text.
  • Green is never the only signal: a played card also changes its words, showing its result ("46 pts") in place of the time and board size.

Content

  • Numbers lead, names last. "833 pts · 104 behind Samra", "Top 7 · Samra-the real1": a long name only ever truncates itself.
  • An eyebrow names the card, uppercase: "Leaderboard · October", "Daily board", "Trivia".
  • A played card shows the result, not the instructions: "46 pts", "6 solved", "1st today / of 4".
  • Compact. Home cards strike a middle ground between visuals and space.

Why it's built this way

Known issues and gaps

  • The spec's three levels don't match the code. The spec says the levels are ground, raise and lit, with --lit for "a tile in the current trace", and that depth comes from the tile's inset lip. A traced tile uses --select; --lit is used only by the 3rd-place podium column; and the tile has no lip, only its 2.5px edge.
  • Two recipes for an earned card. .cc-card.done mixes its green with color-mix() (7% fill, 45% edge) instead of using --earned-card-bg and --earned-card-border, the tokens made for it. The rules that do use those tokens (.daily-card.done, .daily-chip.cracked) aren't reached by any screen.
  • Cards that don't follow the mode swap. The longest-on-board card (.lob-card) uses a hardcoded white tint, and the .daily-card rules behind Home's podium card carry a pale blue that no screen reaches (3.23.6 audit).
  • Corners and padding vary: 12 and 14 for corners, and several paddings. There are no radius or spacing tokens yet.
  • The card CSS reads legacy names (--tray-raise, --tray-line, --paper, --ok-green); they resolve to the canonical roles.
  • Home: how the Compete cards are arranged
  • Trivia: the question card
  • Rank: the circle on the leaderboard card and in standings rows
  • Color: --raise, --rule and green

Changelog

VersionChange
3.23.6The trivia question sits in a card styled like the Home cards: --raise, --rule, 14px corners
3.23.2The played Trivia card shows your place today, your count and one quiet line
3.23.0Compete card arrows sit in the top-right corner, 8px from the edge
3.22.0Compete becomes a bento of cards, each turning green once played today; 14px padding and a 1px edge on every card
3.20.0--raise-solid, the opaque twin of --raise, for the crown's halo