Kelly's window — mechanics

The fork in this look

Three first moves, no door cards: scroll (the standard route: the ring docks, the page reads in dial order), turn (← → on the ring, a swipe or hover swings the light; Enter or a click opens the section) and type (keys pressed on the first screen land on the rule: the mind).

A section opens by same-document view transition: its square flies into the section's 40 px marker as the document jumps, rather than scrolling 13,000 px; a first-screen question flies its warmed panes into the new answer's marker. The weights differ: the standard route is the page itself, taken by scrolling; the mind holds a rule on every screen.

The standard route

Asking the mind

Typing warms the expected panes to half light, using the mockup's keyword table (ROUTES) and no model call. Enter holds them there, the light leaning their way through the 1.2–3.1 s before first words; as each component's JSON closes, its pane goes full and casts its patch, and unused panes go dark. That swing is all of "thinking", and the model never picks a colour: a fixed table maps speakers to Lineup (and a shared day), sessions and agenda_day to their day, venue, tickets and partners to their own pane, FAQ and bare text to Ask.

An answered or partial reply becomes the next numbered section and index entry: marker, the question as Caslon heading, say in the italic wide axis, then:

Fallbacks: off_topic stays in the card, unnumbered; not_in_snapshot lights Ask alone; emptied components drop; errors keep the prototype's codes, restore the hour, leave the question on the rule and their copy on the state line. With the proxy down or budget spent, Enter jumps to the keyword table's section; without JavaScript the rule points down the page.

The assistant in the chrome

Data, performance and accessibility

The fixture holds what this look renders: 77 speakers (59 photos, 36 bios), 50 sessions with speaker ids, tickets, partners, FAQ, all with placeholder flags, rendered by id instead of the page's inline JSON. Whova and WordPress must add rooms, session ids keyed to Whova ids (fixture slugs embed day and time, so a retimed session breaks deep links), speaker titles in REST, Press and Speak copy, confirmed FAQ answers and a staff-curated "others asked" list, since visitor questions are never logged.

Motion runs only while light changes: one loop, a compositor-only dock, the caret; long sections get content-visibility: auto. Reduced motion: hour lit at once, no blink, sequence or flights, instant scrolls, the dock a cross-fade. Keyboard: the mockup's document-level ↑ ↓ capture blocks arrow scrolling; arrows belong to the ring, one roving-tabindex stop. Screen readers: cast light hidden, clock not live, diamond titles as hidden text, each answer announced once via summarize(), focus never moved.

Build plan

Carries over: server.py's stream, sanitizer, sessions, budget, guards and cache; the fixture; the brief's reconciled catalogue; the renderer's logic (mind.html's reader, error copy, reconcile(), summarize(), standard.html's filter-and-reveal merge), retemplated; the concept's glass painter, clock, turn handlers, CSS dock, calendar beat and keyword table. Changed: server.py grows from seven components to that catalogue plus sources and coverage, and sends the page note (realm, or site with visible ids). New: the pane table, card, state line, view transitions, per-section pages, roving focus, and answer 01 and hints precomputed per snapshot. Effort: a local demo in three days; this look's front end about three weeks for one developer, beside the shared backend.

Risks