Field
Where the player types a name, a room code or a recovery code. One field style on the raise surface, errors in rose words where the hint was, and a recovery code typed straight into its tiles.
Usage
Use the field (.field) for free text: your name on Home, the older long recovery code, and the word lookup ("Is it a word?").
Use the code field (.field.code) to type a host's 4-letter room code in the Join a game sheet.
Use the code tiles (.rc-type) for the six-character recovery code. The six tiles are the field: you tap them and type.
Don't put a code you show in a field. A room's own code, the one the host reads out, is open display text (54px, +14px tracking), never boxed. Your recovery code is shown as tiles and copied by tapping it.
Don't block with the field. Guide, don't block: keep the buttons enabled, and when something is missing, focus the field and say what it needs.
Anatomy
| Part | Spec | Token |
|---|---|---|
| Label | .lbl: 700 12px, uppercase, +1.5px tracking, 8px above the field | --fg-soft |
| Field | .field: full width, 52px tall, radius 12, padding 0 14px, 500 16px | --raise fill, 1px --rule, --fg text |
| Code field | .field.code: 700 20px, uppercase, +6px tracking, centred | as the field |
| Hint | .hint: 13.5px / 1.45, 8px above and below | --fg-soft |
| Field error | .field-err: the hint's exact metrics, in the hint's place | --danger |
| Sheet error | .err: radius 10, padding 10px 12px, 1px edge, 13.5px / 1.45 | --danger-wash fill, --danger edge and text |
The code tiles. A panel of six tiles in two groups of three, with a real input laid invisibly over them.
| Part | Spec | Token |
|---|---|---|
| Panel | .rc-panel: radius 14, padding 22px 16px 14px, the tiles and hint stacked 14px apart | --raise fill, 1px --rule |
| Tile | .rct: 42×42, radius 10, 1.5px edge, 900 21px display type; 6px apart, with an 8px spacer between the groups | --fg edge and letter |
| Empty tile | .rct.empty: dashed edge | --rule-strong |
| Next tile | .rct.cur: solid edge and a 2×20px caret that blinks once a second | --fg |
| Input | .rc-type-in: covers the panel at opacity 0, 16px | |
| Hint | .rc-hint: 600 13px, "Paste works too." | --fg-soft |
States
| State | Name field | Room code | Recovery code tiles |
|---|---|---|---|
| Empty | placeholder "shows on the leaderboard" | placeholder "CODE"; the Join button is off | six dashed tiles |
| Typing | each letter lands on the name board above | letters uppercase as you type, 4 at most | letters fill the tiles in order; the next one is solid with a caret |
| Focus | 2px ring, offset 2px | 2px ring, offset 2px | the caret and the solid edge |
| Error | a rose line replaces the hint | a rose banner replaces the hint | every tile's edge turns --danger; the message sits under the panel |
| Busy | the button reads "Looking…" and waits |
The field itself never changes colour on error; the message does the work. The code tiles are the exception: their edges turn rose.
Behaviour
- Errors clear as you type. Any change to the field removes its error.
- The name is checked when you leave the field, and again before anything that banks (Join a game, Create game and the Compete cards): if it's missing or invalid, the field takes focus, scrolls into view and says why. Blocked words are caught as you type.
- The room code is checked when you tap Join: it must be 4 letters, then a game that exists, hasn't started and isn't full.
- Tap anywhere on the code panel to type. The panel is a
<label>for the hidden input, so the keyboard, paste and autofill all work. Enter tries the code. - Find my account stays tappable. It looks soft until six characters are in; tapping it early focuses the tiles and, if anything is typed, says "Your code has six characters."
- Long codes switch over. Pasting an older
word-word-idcode into the tiles swaps to a plain field, and "Use a six-character code" swaps back. - Five misses an hour, then "Too many tries. Wait a little and try again."
- Errors don't shake. A wrong code turns the tiles rose, with plain words under them. No movement.
Accessibility
| Pair | Dark | Light |
|---|---|---|
--danger on --grounderror text on the page | 8.52AAA | 7.54AAA |
| Pair | Dark | Light |
|---|---|---|
--fg-soft on --groundlabels and hints | 6.36AA | 4.78AA |
- Text you type is at least 16px. The hidden recovery input is 16px so iOS doesn't zoom when it takes focus.
- Labels: the name field has a visible label ("Your name"), the long-code field "Your code", and the tile input an
aria-label("Your six-character code"); the tiles themselves arearia-hidden. The room code field and the word lookup have only a placeholder. See Known issues. - The hint under the tiles is a status region. Error messages aren't, and they aren't linked to their field. See Known issues.
- Keyboards: the code fields turn autocorrect off; the recovery input asks for capitals and offers one-time-code autofill.
- Reduced motion: the caret stops blinking.
Content
- The hint says what the field is for: "Spell it out and watch it land on the board.", "Get the 4-letter code from your host.", "Paste works too."
- Errors say what's wrong and what to do, and never apologise. Verbatim:
| Field | Errors |
|---|---|
| Name | "Add your name first. It's what shows on the leaderboard." · "Names need at least 2 letters." · "Use at least two different letters." · "Pick a different name." |
| Room code | "Room codes are 4 letters." · "No game found with that code. Double-check the letters with your host, or pick one from Public games below." · "That game already started. Ask the host for a new round." · "That room is full. 12 players max." |
| Recovery code | "Your code has six characters." · "Type the code you saved." · "We couldn't find that code. Check it against your saved photo." · "You're offline. Connect and try again." · "Too many tries. Wait a little and try again." · "That's already you on this phone." |
Why it's built this way
Known issues and gaps
- The Join button is off until something is typed, and so is the word lookup's Check button, against "guide, don't block".
- Two fields have no label. The room code field ("CODE") and the word lookup ("type it") rely on their placeholders.
- Errors aren't announced and aren't linked to their field (
aria-describedby); on the recovery tiles the status region empties when an error appears. - The validation timing is documented wrong. The long reference page says fields validate on submit, never while typing. In the code the name is checked when the field loses focus, and blocked words are caught as you type.
- The field CSS reads legacy names (
--tray-raise,--tray-line,--paper,--paper-dim,--error-text,--error-surface,--error-border); they resolve to the canonical roles.
Related
- Recovery: the code sheet, saving and getting back in
- D-010, short recovery codes, shown as tiles
- Button: guide, don't block, from the button's side
- Sheet: where the room code and recovery fields live
- Color: rose means refused
Changelog
| Version | Change |
|---|---|
| 3.21.2 | The recovery code's six tiles become the field: tap and type, with a caret in the next tile; paste and autofill work |
| 3.21.0 | Restore has six slots that fill as you type, five misses an hour, and plain errors |
| 3.9.5 | The name's error is rose text in the hint's place, not a card |
| 3.9.2 | A name is required before anything that banks; the field takes focus and scrolls into view |