@@ -7,24 +7,58 @@ backend behavior, game ABI, and sandbox limits are not changed by this shell.
77## Navigation and focus
88
99- Marketplace is the initial destination, including while signed out.
10- - Tab/Shift+Tab cycles navigation, content, and actions. Arrows select within the
11- focused area; Enter activates. A normal game row opens details; Continue
12- Playing and the explicit Play action launch the game.
13- - At 120 or more columns the sidebar takes 22 columns. At smaller widths it is
14- an on-demand overlay. Non-game content is centered and capped at 100 columns.
10+ - The navigation's Sign in / @username item is pinned at the bottom of the
11+ rail. Navigation has no local divider or key legend; the shared footer swaps
12+ to ↓ Tab · ↑ Shift+Tab · ✓ Enter · ✕ Esc while nav is focused. Library and installed
13+ offline games remain accessible
14+ while signed out; a long library scrolls without displacing the account row.
15+ - Ctrl+N directly toggles navigation and page content, even if an action
16+ previously had focus. It never steps through the footer. Tab is next and
17+ Shift+Tab is previous within the focused list, action row, form, dialog, or
18+ pause menu. They do not open or close navigation. Arrows still select
19+ within the focused area; Enter activates. A
20+ normal game row opens details; Continue Playing and the explicit Play action
21+ launch the game.
22+ - When open at 120 or more columns, navigation reserves 22 columns and pushes
23+ the content. On smaller terminals it overlays without reflowing the content.
24+ In both cases it stops above the main divider so page actions and keyboard
25+ hints stay fully visible. Closed navigation reserves no width. Non-game
26+ content stays centered and capped at 100 columns. If pushing would squeeze a
27+ fixed-size game, navigation uses the overlay instead, even on a wide terminal.
1528- The supported baseline is 80×24. Lists and long text scroll. Page Up/Down
1629 moves list selection with the viewport, so actions do not target a hidden row.
17- - During active gameplay, keys belong to the game. Esc/P pauses; Tab can then
30+ - During active gameplay, keys belong to the game. Esc/P pauses; Ctrl+N can then
1831 focus navigation. Leaving Play closes the guest and records an abandoned run.
1932- Pause retains Resume, Restart, pixel selection for the next start, and Leave
2033 Play. Pixel changes do not stretch or mutate an existing guest framebuffer.
2134- Forms consume typed/pasted characters. Tab moves between fields/buttons;
2235 left/right, Home/End, Backspace/Delete and Ctrl+U edit a field. Enter activates
2336 a button rather than silently submitting from a text field.
2437- Ctrl+C quits from every state. Escape dismisses/backtracks outside gameplay.
38+ - Product pages/states share one bottom-anchored footer that spans the full
39+ terminal width. Its contents follow the focused context (navigation, page
40+ actions, forms, gameplay). Keyboard hints use ↓ Tab, ↑ Shift+Tab, ✓ Enter,
41+ and ✕ Esc. Marketplace/library game actions are keyed directly: ✕ Esc Back,
42+ ↻ R Refresh, ▶ P Play, + A Add, and ⌫ U Uninstall.
43+ Pause choices and game hints are in this footer rather than over the artwork.
44+ Footer rows are reserved before content is laid out; games keep their fixed
45+ cell dimensions and show a too-small notice rather than being cropped.
2546
2647## Library and package actions
2748
49+ Marketplace and Library have a Search row at the top of the list. Tab/Shift+Tab
50+ or arrows move onto it to type; ` / ` jumps there. Enter, Tab, or down moves to
51+ results without clearing. Esc is still Back. Ctrl+U clears the query. Queries
52+ survive visiting details or another destination during this TUI session.
53+
54+ Marketplace uses server name/slug/description search (not owner), debounced by
55+ 300ms, and follows cursors through the full result set. An API/network failure
56+ shows an error rather than a complete-looking partial list. The API accepts at
57+ most 64 UTF-8 bytes after trimming. Library immediately filters its view using
58+ the same fields when metadata is available, including installed local-only games.
59+ Neither sidebar games nor shared membership are filtered. Continue Playing is
60+ hidden while the query is nonblank; an empty filtered list says No matching games.
61+
2862Library is an ID-keyed union of account membership and installed packages.
2963Installed versions are shown independently of the newest registry metadata.
3064
@@ -70,6 +104,22 @@ revoke. Account changes/expiry clear cached private member/session views.
70104
71105## Local development pairing
72106
107+ Choose the bottom Sign in item (or Sign in within Settings) to open a centered
108+ dialog over the current screen. The dialog title is Sign in. Below it, the
109+ pairing URL, a blank line, the pairing code, and Open browser / Cancel options
110+ are centered. The URL is ` /pair/ABCD-EFGH ` so the pair page can look the device
111+ up automatically; it remains an OSC-8 hyperlink in terminals that support
112+ clicks. Approval in the browser is still explicit. Open browser is explicit,
113+ and passwords/email codes are never entered in the TUI. Tab or arrows select
114+ those options; Enter activates. Ctrl+N does nothing in the dialog. Esc
115+ closes it without navigating away. Successful sign-in also closes
116+ it. A paused game remains
117+ paused and open underneath. Very small terminals show a resize notice and
118+ accept only Esc/Ctrl+C until controls fit. Status sits above the divider; below
119+ it the hints are ↓ Tab, ↑ Shift+Tab, ✓ Enter, and ✕ Esc.
120+ Cancel stops waiting; if credential saving has begun, the shell reconciles
121+ actual state because a completed save cannot be undone by canceling its result.
122+
73123Use the actual API/app ports printed by ` make dev ` in the backend checkout:
74124
75125``` sh
0 commit comments