clone

a browser grid puzzle game where you push words around to rewrite the rules of each level

main
miau-is-true / openspec / changes / archive / 2026-09-24-add-world-index-presentation / specs / world-index-presentation / spec.md
spec.md 6.6K rendered
1## ADDED Requirements23### Requirement: INDEX SHALL present the active world as the header subject45The INDEX presentation SHALL render an 11px tracked `INDEX | WORLD NN`6eyebrow, the active world name in `--fg`, weight 800, and its muted tagline7with 8px vertical spacing. The tagline SHALL fall back to8`walk the path, pick a proof` when the normalized world has none. The large9standalone INDEX heading and overlapping world-number stack SHALL not be10rendered. The presentation SHALL also show `★ n / N`, where both counts are11scoped to the active world view model.1213#### Scenario: Desktop world header establishes hierarchy1415- **WHEN** INDEX renders an active world on a desktop canvas16- **THEN** the eyebrow, name, tagline, and per-world count are legible,17 separated by the specified spacing, and do not overlap the board or world18 strip1920#### Scenario: Missing tagline uses the approved fallback2122- **WHEN** the normalized active world has no tagline23- **THEN** INDEX renders `walk the path, pick a proof` in the tagline region2425#### Scenario: Mobile header remains inside its owning region2627- **WHEN** INDEX renders at 390px wide28- **THEN** the complete world name, fallback or authored tagline, and per-world29 count remain inside the header region without covering the board or footer3031### Requirement: INDEX SHALL render the world strip as an actionable control3233The desktop strip SHALL render `[Q] ◀ ● • • ▶ [E]` with drawn Q and E keycaps,3414px arrows, 10px dots, and one dot per world. The active dot SHALL use the35normalized world's accent when present; inactive dots SHALL use the neutral dot36role. On mobile or coarse pointers, keycaps SHALL be omitted and each arrow37SHALL expose a 44px tap target. Hit geometry SHALL match the visible arrows.3839#### Scenario: World strip exposes adjacent actions4041- **WHEN** INDEX renders three worlds on desktop42- **THEN** it shows Q, a previous arrow, three dots, a next arrow, and E in43 that order, with the active dot accented4445#### Scenario: Mobile strip exposes touch targets4647- **WHEN** INDEX renders on a 390px canvas or a coarse pointer48- **THEN** Q/E keycaps are absent and the previous and next arrows each have a49 44px tappable target5051#### Scenario: Dot slide follows a world transition5253- **WHEN** the D20 seam reports a world switch54- **THEN** the active dot travels from its prior position to its new position55 over 110ms with back-ease, while the world sheet uses the same transition56 start and its 280ms ease5758#### Scenario: Reduced motion settles the strip5960- **WHEN** reduced motion is enabled during a world switch61- **THEN** the strip renders the destination dot and sheet immediately without62 an intermediate slide6364### Requirement: The first-entry world card SHALL present and dismiss world identity6566The INDEX SHALL consume the D20 `world-card` request and render a centered,67hard-edged card containing the normalized glyph at 96px, `WORLD NN` eyebrow,6832px name, 15px muted tagline when present, a meta line with proof count,69`★ n / N`, and `by <author>` only when an author exists, followed by an action.70These elements SHALL use a 16px vertical rhythm. The card SHALL never show71`by Unknown author`. Its 2px stroke SHALL use the normalized world accent.72Desktop SHALL show `[ENTER] enter world`; mobile and coarse-pointer layouts73SHALL show a full-width 48px accent `ENTER WORLD` button without a keycap.74The card SHALL fit all copy inside at desktop and mobile sizes and preserve75the existing iris entry choreography. ENTER or the76equivalent confirmed pointer/touch action SHALL dismiss the card and leave the77player on the settled INDEX sheet without selecting a proof. The card SHALL78not install packs or mutate simulation state.7980#### Scenario: INDEX first entry opens a readable world card8182- **WHEN** D20 requests a card with origin `index`83- **THEN** the card shows its glyph, `WORLD NN`, name, tagline, proof count,84 completion, author when present, and the correct desktop or touch action85 without clipping8687#### Scenario: Core uses a first-party identity8889- **WHEN** the player first enters the Core world90- **THEN** its card uses `🐈`, `Where the rules first bend.`, the `you` accent,91 and `by Miau Is True` rather than the fallback identity9293#### Scenario: Missing author leaves no placeholder9495- **WHEN** an imported world omits author96- **THEN** its meta line omits the byline segment and never prints97 `by Unknown author`9899#### Scenario: Workshop PLAY uses the same card presentation100101- **WHEN** D20 requests a card with origin `workshop`102- **THEN** the card uses the same composition and preserves the Workshop103 selected pack's first node for the subsequent INDEX sheet104105#### Scenario: Card confirmation returns to INDEX106107- **WHEN** the player confirms ENTER on an open world card108- **THEN** the card closes and INDEX remains on the active world's sheet; no109 proof move or simulation turn is recorded110111#### Scenario: Touch confirmation has a large target112113- **WHEN** the card is rendered for a coarse pointer114- **THEN** the card has no visible keycap and its full-width accent115 `ENTER WORLD` button is 48px high and tappable across that width116117#### Scenario: Card motion respects reduced motion118119- **WHEN** reduced motion is enabled120- **THEN** the card appears in its settled geometry without an iris intermediate121122### Requirement: Mobile INDEX controls SHALL use touch affordances and coherent narration123124Below 760px or on coarse pointers, INDEX SHALL omit keyboard keycap hints,125render `tap the cat to play` below the active proof banner, and expose the126bottom `☰ menu` thumb affordance. Workshop SHALL remain reached through that127menu. The INDEX accessibility label SHALL include world number/name,128world-scoped completion, total proof count, and the keyboard world-switch129action where keyboard controls are available. An open card label SHALL include130world identity, author, and its ENTER action.131132#### Scenario: Mobile footer removes desktop hints133134- **WHEN** INDEX renders below 760px or for a coarse pointer135- **THEN** it shows the cat play prompt and menu thumb affordance without the136 desktop ENTER, ESC, or SPACE keycap row137138#### Scenario: Accessibility follows the visible world state139140- **WHEN** the active world or its completed count changes141- **THEN** the INDEX label names the current world and its updated `n of N`142 proof progress, and announces Q/E switching when applicable143144#### Scenario: Presentation leaves simulation and grid state unchanged145146- **WHEN** any header, strip, card, or mobile footer presentation is measured,147 animated, or dismissed148- **THEN** engine rules, simulation snapshots, integer board coordinates,149 progress keys, and pointer semantics remain unchanged