Scenario UI — the poker table [UI]
Source path: knowledge-base/diagrams/ui/scenario-ui.md
# Scenario UI — the poker table `[UI]`
One metaphor, skinned by the app theme: a **poker table**. The whole game is a single chrome-less fullscreen window (`ScenarioModal`); `ScenarioShell` lays it out like the domain WorkspaceShell so the two feel like one app. The active tab follows the human loop (**Brief → Prepare → Commit → Consequence**) while the structural `read/write/scenario` keys remain stable underneath. Showdown locks the table to **Round**. The turn logic is in [flows/scenario-loop](../flows/scenario-loop.md).
## Screen regions
```mermaid
flowchart TB
subgraph WIN["Scenario window · fullscreen · chrome-less · theme-skinned"]
direction TB
subgraph BODY[" "]
direction LR
RAIL["**Seat rail**<br/>avatars · whose-turn ring ·<br/>AI vs human tell ·<br/>act-as-seat"]
subgraph MAIN["main column"]
direction TB
TABS["**Tab strip** — Round · World · Brief · Prepare · Talk ·<br/>Story · Continuity · Strategy · Impact · Record · Director Log"]
CENTER["**CENTER = active tab**<br/>ROUND: oval felt · seat pods · centre pedestal<br/>SHOWDOWN: full takeover — flips + inline Realism consequence<br/>STRATEGY: per-scene reasoning + Decision Matrices<br/>BRIEF / PREPARE / TALK: orient · author · coordinate"]
end
end
PBAR["**Phase + timer bar** — Brief → Prepare → Commit → Showdown → Consequence → Strategy · clock · +time"]
DOCK["**Bottom dock** — Director deck (Advance · Pause · End · Clear)<br/>⟷ impersonated hand (staked cards · conceal · raise · veto)"]
end
```
## Component tree
```mermaid
flowchart TD
TopBar["TopBar — Play / Resume"] --> Modal["ScenarioModal — routes by lifecycle"]
Modal -->|no room| Setup["GameSetup — seat the table, set rules"]
Modal -->|ended| Report["GameReport — debrief"]
Modal -->|live| Shell["ScenarioShell"]
Shell --> Rail["Seat rail — act-as-seat"]
Shell --> Tabs["Tab strip — auto-advances with phase"]
Shell --> Bar["PhaseBar — stepper + clock"]
Shell --> Dock["GameBottomPanel — Director deck OR hand"]
Tabs --> Board["Round — live table"]
Tabs --> World["World — spatial board + travel"]
Tabs --> Persp["Brief — seat perspective"]
Tabs --> Write["Prepare — Streams + Priors"]
Tabs --> Chat["Talk — global + location whispers"]
Tabs --> Theory["Strategy — generated scenes · reasoning · Decision Matrices"]
Tabs --> Impact["Impact — attributed Fate movement + External"]
Tabs --> Record["Record — committed Stream history"]
Board -->|showdown| Show["Showdown — reveal + inline Realism consequence"]
Board -->|else| Felt["PokerTable — felt · seat pods · Fate odometer"]
Dock -->|impersonating| Hand["SeatHand / ScenarioCard"]
Dock -->|Director, resolve| Gen["GeneratePanel — review merge + generate"]
Show -->|Director steer| Refine["Refine consequence — winner fixed · re-read what follows"]
```
- **Setup** — `GameSetup`: seat the table off a searchable, prominence-sorted roster (characters · units · locations · artifacts), AI **Suggest cast** by Characters / Units / Locations / Mixed, per-seat driver (agent / member / Director), then **Rules** (Showdown + Prepare/Commit clocks; conviction economy under Advanced).
- **Live board** — `ScenarioShell` wraps board + tabs + Director dock, surfaces the **Generate Panel at Arc Gen**, and carries the always-visible phase + timer bar. `PokerTable` is the felt (seats as avatar + conviction stack, rotating dealer button, centre pedestal, corner Impact). `SeatHand` / `ScenarioCard` is the act-as-seat hand.
- **Latest strategic read** — the Strategy tab follows the round-to-Arc record: before a new continuation exists it retains the latest completed Arc analysis; once Arc Gen lands it switches to that generated continuation and preserves the mapping in round history. The Director and `/scenario` surfaces render the same scene-level `AnalysisTimeline`; phones use its stacked decision field rather than squeezing the desktop matrix.
- **Home preview** — `LobbyGamePreview` is the compact poker-table projection used by both the Games dashboard and the in-domain player picker. It receives the branch scene count in the cross-domain summary, shows the latest review's decision count, and uses a taller phone aspect so the centre read and seat pods remain legible.
- **Orchestration** — `hooks/useScenario` threads the pure engine through the store and async generation ([flows/scenario-loop](../flows/scenario-loop.md)). Agents are full participants. Types layer over shipped `Perspective` / `Stream` / `Merge` — see [LANGUAGE.md](../../knowledge/vocabulary/index.md).
Open on GitHubRaw Markdown source