docs(handoff): record ESC accelerator; B's next step is HC polish

Post-v0.21.4 fourth carve-out: 90e24d9 wires ESC for replay-stop
with a cross-plugin gate in pause_plugin to defer when replay is
playing. Footer extended in lockstep to
[SPACE] pause/resume · [ESC] stop. Update Since-cut log,
visual-identity bullet, B option in the Resume menu, status
(1240 → 1243 tests), and HEAD hint.

B option's next-step menu now has three branches: HC polish
(smallest), ← / → wiring (medium, needs backwards-step path),
and the multi-session move-log/preview arcs that close B-2.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
funman300
2026-05-08 16:07:33 -07:00
parent 90e24d9711
commit 3cc8eacafa
+71 -39
View File
@@ -35,11 +35,12 @@ resume.
- **`artwork/` directory:** still untracked. Intentional.
- **Build:** `cargo clippy --workspace --all-targets -- -D warnings`
clean.
- **Tests:** **1240 passing / 0 failing** across the workspace
- **Tests:** **1243 passing / 0 failing** across the workspace
(1228 in v0.21.4 + 4 from `fe68861`'s scrub-notch tests + 4
from `d322abf`'s notch-label tests + 4 from `1873b3f`'s
keybind-footer tests). Detail in `CHANGELOG.md` § [0.21.4]
§ Stats; post-cut delta tracked here.
keybind-footer tests + 3 from `90e24d9`'s ESC-accelerator
tests). Detail in `CHANGELOG.md` § [0.21.4] § Stats; post-cut
delta tracked here.
- **Tags on origin:** `v0.9.0` through `v0.21.4`. v0.21.4 is on
`23ff62c`; v0.21.3 stays on `3d92a91`; v0.21.2 stays on
`f23df3b`; v0.21.1 stays on `daa655a`; v0.21.0 stays on
@@ -96,6 +97,19 @@ resume.
footer text spawns. 1px top border in `BORDER_SUBTLE`
separates the footer from the labels row. 4 new tests;
1236 → 1240.
- **`90e24d9` — `feat(replay): wire ESC accelerator for stop,
gate pause modal`.** ESC during an active replay now stops it
(mirrors the Stop button click). New `handle_stop_keyboard`
system in `replay_overlay.rs` parallels `handle_pause_keyboard`
in shape. Cross-plugin coordination via `pause_plugin::toggle_pause`:
added a fourth defer-if check
(`replay_state.is_some_and(|s| s.is_playing())`) right after
`other_modal_scrims` and before `selection`. Symmetric to the
existing modal-stack defer pattern. Footer hint extended from
`[SPACE] pause/resume` → `[SPACE] pause/resume · [ESC] stop`
in lockstep with the wiring; the only-wired-keybinds
discipline holds. 3 new tests + 1 updated helper-pin test;
1240 → 1243.
Banner geometry is now mutable — every prior B-2 commit fit
inside fixed 60 px space, but the notch-labels commit
@@ -105,21 +119,29 @@ again. The next sub-pieces need significantly more vertical
room and follow the same shape.
Next finite step on B-2: choices are
1. **Wire ESC for stop** + extend the keybind-footer text to
`[SPACE] pause/resume · [ESC] stop`. Small, single-axis
commit. UI-first contract for the existing Stop button gets
a keyboard accelerator; the footer carrying only-wired
keybinds means the text update is in lockstep.
2. **Wire ← / → for prev/next move** — needs a "step
1. **Wire ← / → for prev/next move** — needs a "step
backwards" path in `replay_playback`, which currently only
supports forward stepping. Bigger; new state plumbing.
3. **Move-log scroller / mini-tableau preview** — both need
supports forward stepping. Backwards stepping is non-trivial:
the `Replay` carries the move list but no intermediate game
states, so rewinding means either replaying-from-start to
`cursor - 1` or hooking into the game's undo system. New
state plumbing either way. Footer hint would extend to
`[SPACE] pause/resume · [ESC] stop · [← →] step` in
lockstep with the wiring.
2. **Move-log scroller / mini-tableau preview** — both need
a much larger banner-height grow (effectively the takeover
container itself). Bigger arcs.
container itself). Bigger arcs; the natural place to land
the layout reflow that turns the banner into a takeover.
3. **HC-mode coverage for the new banner pieces** — labels
and footer texts currently use `TEXT_SECONDARY`; under HC
mode they should bump to `TEXT_PRIMARY` (or use the
`HighContrastBorder` marker pattern for the 1 px borders).
Small accessibility polish.
Recommended order: ESC (option 1) next as the smallest
cadence-preserving step, then either ← / → or move-log/preview
depending on appetite.
Recommended order: option 3 (HC polish) is the smallest next
step and keeps the cadence; option 1 (← / →) is the right
medium-scope next-feature; option 2 is the multi-session arc
that closes B-2.
## Open punch list
@@ -168,13 +190,17 @@ palette refresh all shipped in v0.20.0 + v0.21.0. What stays open:
(banner 60 → 76 px to make room for a 16 px label row).
Keybind-hint footer (vim-style mode line + `[SPACE]
pause/resume`) shipped post-v0.21.4 in `1873b3f` (banner
76 → 92 px). Banner geometry is now mutable. What still
needs to land: ESC accelerator wiring (small) + ← / →
scrub keys (needs new backwards-step path), then the
bigger pieces — a move-log scroller and a mini-tableau
preview — both screen-takeover-only pieces that need a
much larger banner height grow (effectively the takeover
container itself). Multi-session.
76 → 92 px). ESC accelerator wiring (with cross-plugin gate
in `pause_plugin::toggle_pause`) shipped post-v0.21.4 in
`90e24d9`; footer hint extended to
`[SPACE] pause/resume · [ESC] stop` in lockstep. Banner
geometry is now mutable. What still needs to land: ← / →
scrub keys (needs new backwards-step path), HC-mode
coverage for the new banner pieces (labels + footer
texts), then the bigger pieces — a move-log scroller and a
mini-tableau preview — both screen-takeover-only pieces
that need a much larger banner height grow (effectively the
takeover container itself). Multi-session.
- *Floating `MOVE N/M` chip above the focused card during
playback — closed 2026-05-08 by `2fb2d63`.* World-space
`Text2d` entity sibling to the banner overlay; uses the same
@@ -327,10 +353,11 @@ v0.21.1 at daa655a, v0.21.0 at 04f9bf9. Working tree clean. See
CHANGELOG.md § [0.21.4] for full detail.
State: HEAD locally — see `git rev-parse HEAD`. Post-cut HEAD is
`1873b3f` (three carved-out commits on top of v0.21.4 — scrub-
bar notches `fe68861`, notch labels `d322abf`, keybind-hint
footer `1873b3f`). All workspace tests pass (1240; check with
`cargo test --workspace`), clippy clean.
`90e24d9` (four carved-out commits on top of v0.21.4 — scrub-bar
notches `fe68861`, notch labels `d322abf`, keybind-hint footer
`1873b3f`, ESC accelerator + pause-modal gate `90e24d9`). All
workspace tests pass (1243; check with `cargo test --workspace`),
clippy clean.
READ FIRST (in order, before doing anything):
1. SESSION_HANDOFF.md — this file
@@ -363,19 +390,24 @@ DECISION TO ASK THE PLAYER FIRST:
0/25/50/75/100 %); percentage labels under each notch
shipped in `d322abf` (banner 60 → 76 px — first layout
change); keybind-hint footer shipped in `1873b3f`
(banner 76 → 92 px — vim-style mode line on the left,
`[SPACE] pause/resume` on the right). Banner geometry
is now mutable. The natural next finite step is to
**wire ESC for stop** and extend the footer text to
`[SPACE] pause/resume · [ESC] stop` — small, single-
axis, surfaces another keyboard accelerator alongside
the existing Stop button. After that: ← / → for
prev/next move (needs new backwards-step path in
`replay_playback`), then move-log scroller and mini-
tableau preview — both screen-takeover-only pieces that
need a much larger banner-height grow (effectively the
takeover container itself). Mockup at
`docs/ui-mockups/replay-overlay-mobile.html`.
(banner 76 → 92 px — vim-style mode line + `[SPACE]
pause/resume`); ESC accelerator wiring shipped in
`90e24d9` (cross-plugin gate in `pause_plugin`; footer
extended to `[SPACE] pause/resume · [ESC] stop`).
Banner geometry is now mutable. Natural next finite
steps:
1. **HC-mode coverage** for the new banner pieces
(labels + footer texts use `TEXT_SECONDARY`; under
HC they should bump). Smallest next step.
2. **Wire ← / → for prev/next move.** Needs a
backwards-step path in `replay_playback` — either
replay-from-start or hook into the game's undo
system. Medium-scope next-feature.
3. **Move-log scroller / mini-tableau preview** — both
need a much larger banner-height grow (effectively
the takeover container itself). Multi-session arcs
that close B-2.
Mockup at `docs/ui-mockups/replay-overlay-mobile.html`.
C. Phase 8 (sync) — local storage scaffolding, self-hosted
Axum server, `SolitaireServerClient` impl, GPGS stub
wired into Settings. The biggest open arc by scope; rolls