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
- Nav: twelve linked panes, then the 72 px docked window beside the section's name; the lit pane marks progress.
- Pages: the long page is home; each section is also a static page from the same partial (
/lineup,/agenda/tuesday), so escape links and search have URLs. Twelve panes only: Gallery and past summits go in Theme, contact in Press and Speak. - Agenda: the four-days beat, then a timetable per day (120 px hours, hairlines, quiet breaks), rows anchored by session id.
- Speakers: the wall with day diamonds; a name opens a stub (portrait, bio, sessions), replacing hover on touch.
- Tickets: four rows, one Eventbrite link, snapshot prices only.
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:
- Text (
faq): the site's answer as a lede. - Speakers: a cut of the wall;
speaker_cardis the stub. - Sessions, agenda day: timetable rows; a track filter notes "6 of 15".
- Venue: the Austin lede and a fact list, no map image.
- Tickets: the four rows, off-sale tiers quiet.
- Choices: up to four underlined 12 px phrases, sent via the rule.
- Sources: the footnote, fixed lines per page id, "sample data" for any
placeholderrecord.
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
- The rule: "ask", caret, input (600 characters,
enterkeyhint="send"), two hints, a 1 px hairline; no box, pill or send button;[ stop ]replaces them while streaming;/focuses it anywhere. - The edge-parked card holds answers that must not move the reader (asked while docked, or off-topic): 360 px of stone in a 1 px ink frame at the right edge above the strip, with marker, streaming
say, a one-line summary and "read it as 03 ↑" while the answer composes in the thread. If its records are on the page it adds "marked in Tuesday ↓" and lights their diamonds. Non-modal, never timed; a sheet on phones. - The state line: the hints' slot is the polite status region: "03 · thinking", then "03 · composed · lights Tuesday, Lineup".
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
- The keyword preview will sometimes contradict the model; at half light its correction reads as settling.
- The real lineup (147 at ETS26) doubles a 16,600 px phone page: a featured cut at home, the full wall on
/lineup. - The panes ship at full colour until the end-of-body script darkens them: a slow first paint flashes the rainbow the jurors rejected. Darken from a head-set
jsclass. - A thirteenth destination or a three-day edition breaks the dial.