cards
The full-screen cards: the title, how-to-play, pause, WIN and MORNING SHIFT. Each builder is a pure function of (metrics, state), so the component can rebuild a card on any change and get the same tree.
cards
The full-screen cards: the title, how-to-play, pause, WIN and MORNING SHIFT. Each builder is a pure function of (metrics, state), so the component can rebuild a card on any change and get the same tree.
Every row carries an id of the form row-<action>. That one name is what
the Focus module walks, what onCallback receives when a finger or a mouse
hits the row, and what a pointer crossing the row re-points the focus to —
so a pad, a keyboard, a mouse and a finger all arrive at the same action.
The entrance is driven, not declared: setEntrance(t) takes the seconds
since the card opened and every block fades up and settles on a stagger of
that number.
Interface
What this asset declares: the schema it conforms to, what it exposes, and the rendered structured payload.
conforms to
zero/source-extract/v2game.ui.cards — the full-screen cards: title, how to play, pause, and the two endings. A card IS allowed to cover the viewport — that is what makes it modal, and while one is up the menu input map has stood the game's controls down anyway. Each builder is a pure function of (metrics, state), so the component can rebuild a card on any change and get the same tree. Every row carries an `id` of the form `row-<action>`: that is the id the Focus module walks, the id `onCallback` receives when a finger or a mouse hits it, and the id the pointer hover moves the focus to. One name, four input families. The entrance is DRIVEN, not declared: `M.setEntrance(t)` is handed the seconds since the card opened and every block fades up and settles on a stagger of that number. A CSS `animation` would be the natural way to write it, and a one-shot one plays once per element ID and does not replay when the same tree is pushed again — so a card whose rows are rebuilt on every move of the focus would animate the first time it was ever shown and never again. Driven, the entrance belongs to the card OPENING, which is the thing the player is watching.
setEntrance(t: number) → void
Tell the cards how far into its entrance the card is.
| arg | type | description |
|---|---|---|
| t | number | Seconds since the card opened; >= 1 means settled. |
entering( ) → boolean
Whether a rebuild is still worth doing for the entrance alone.
E(style: { [string]: any }, order: number?, dy: number?) → void
Merge the entrance for stagger step `order` into a style, in place.
| arg | type | description |
|---|---|---|
| style | { [string]: any } | |
| order | number? | |
| dy | number? |
backdrop(m: T.Metrics, kids: { any }, tint: string?) → any
The night behind every card: a blue-black wash, a pink glow up where the neon is, and the whole thing blurring what it covers.
| arg | type | description |
|---|---|---|
| m | T.Metrics | |
| kids | { any } | |
| tint | string? |
rule(m: T.Metrics, color: string?) → any
| arg | type | description |
|---|---|---|
| m | T.Metrics | |
| color | string? |
row(m: T.Metrics, r: Row, focused: boolean, order: number) → any
One menu row. `focused` lights it: a brighter face, a red edge, a caret and a glow, so which row is live is visible from across a room and on a pad with no pointer at all.
| arg | type | description |
|---|---|---|
| m | T.Metrics | |
| r | Row | |
| focused | boolean | |
| order | number |
rowStack(m: T.Metrics, rows: { Row }, focusedId: string?, order: number) → any
| arg | type | description |
|---|---|---|
| m | T.Metrics | |
| rows | { Row } | |
| focusedId | string? | |
| order | number |
footer(m: T.Metrics, family: controls.Family, order: number) → any
| arg | type | description |
|---|---|---|
| m | T.Metrics | |
| family | controls.Family | |
| order | number |
heading(m: T.Metrics, text: string, order: number, color: string?) → any
| arg | type | description |
|---|---|---|
| m | T.Metrics | |
| text | string | |
| order | number | |
| color | string? |
rowIds(rows: { Row }) → void
The ids a card's focus walks, in order. The component asks for this rather than deriving it, so the walk and the drawing can never disagree about what is on the card.
| arg | type | description |
|---|---|---|
| rows | { Row } |
titleRows(family: controls.Family) → void
The rows the title card offers.
| arg | type | description |
|---|---|---|
| family | controls.Family |
title(m: T.Metrics, focusedId: string?, family: controls.Family) → any
The title card: the name of the game, the three cats, the dot.
| arg | type | description |
|---|---|---|
| m | T.Metrics | |
| focusedId | string? | |
| family | controls.Family |
howtoRows(family: controls.Family) → void
The rows the how-to-play card offers: a tab per device, then back.
| arg | type | description |
|---|---|---|
| family | controls.Family |
controlTable(m: T.Metrics, shown: controls.Family, order: number) → any
| arg | type | description |
|---|---|---|
| m | T.Metrics | |
| shown | controls.Family | |
| order | number |
howto(m: T.Metrics, focusedId: string?, family: controls.Family, shown: controls.Family) → any
The how-to-play card, showing one device family's controls with the other two a row away — a player on a pad can still read what the phone does, which is what a shared screen needs.
| arg | type | description |
|---|---|---|
| m | T.Metrics | |
| focusedId | string? | |
| family | controls.Family | |
| shown | controls.Family |
pauseRows(family: controls.Family) → void
The rows the pause card offers.
| arg | type | description |
|---|---|---|
| family | controls.Family |
statCell(m: T.Metrics, cap: string, value: string, tone: string) → any
| arg | type | description |
|---|---|---|
| m | T.Metrics | |
| cap | string | |
| value | string | |
| tone | string |
pause(m: T.Metrics, focusedId: string?, family: controls.Family) → any
The pause card, with where the night stands written on it.
| arg | type | description |
|---|---|---|
| m | T.Metrics | |
| focusedId | string? | |
| family | controls.Family |
catStrip(m: T.Metrics, asleep: boolean, order: number) → any
| arg | type | description |
|---|---|---|
| m | T.Metrics | |
| asleep | boolean | |
| order | number |
endRows(family: controls.Family, won: boolean) → void
The rows an ending card offers.
| arg | type | description |
|---|---|---|
| family | controls.Family | |
| won | boolean |
bigWord(m: T.Metrics, text: string, color: string, spacing: number, order: number, glow: string?) → any
| arg | type | description |
|---|---|---|
| m | T.Metrics | |
| text | string | |
| color | string | |
| spacing | number | |
| order | number | |
| glow | string? |
won(m: T.Metrics, focusedId: string?, family: controls.Family) → any
The WIN card. The score is how much of the night was left.
| arg | type | description |
|---|---|---|
| m | T.Metrics | |
| focusedId | string? | |
| family | controls.Family |
lost(m: T.Metrics, focusedId: string?, family: controls.Family) → any
The LOSE card: the sun came up with cats still awake.
| arg | type | description |
|---|---|---|
| m | T.Metrics | |
| focusedId | string? | |
| family | controls.Family |
Row = { id: string, text: string, hint: string?, tone: string?, small: boolean? }The five full-screen cards of RED DOT RISING — title, how to play, pause, WIN and MORNING SHIFT — with focus-driven rows that a pad, a keyboard, a mouse and a finger all reach.Sub-parts
Everything contained inside this part. Assets are composite children (clickable cards). Files are leaf payloads. Expand any row to view its source.
Problems
Everything affecting this asset right now: its own problems, anything wrong inside it, and problems on its direct dependencies.
agent_score is exposed.+ quality × 0.35
+ performance × 0.25
± compat factor
Usability ratings
Did the part work as advertised when consumers tried to drop it in. Separate from upvotes: those are taste; this is "did it function".
Scoped to this part · feeds back into the world's score.