The GM's phone can take a reveal back, and a phone held sideways gets the phone view (#1020) #1063

Merged
claude-bot merged 7 commits from feat/1020-phone-table-takeback-landscape into main 2026-10-04 03:35:40 +00:00
Collaborator

Part of #1020: the owner's answers to Q143 and Q144 (D271, D272).

Summary

Take it back on the phone's stage (D271).

  • "Take it back" sits beside "Show the table" on the GM's phone stage, only when the card on stage is currently shown. It uses the same revoke() and wording as the desktop table's "Shown to the table" list.
  • Busy state. On failure, an inline banner with Try again. A stat block shown by field has each of its showings taken down.
  • The two arrows (‹ ›) are now one unit: they wrap as a pair onto their own row at 390 and 412 px, and sit at the row's end at 844×390.

A phone held sideways gets the phone view (D272).

  • The choice lives in one place, pages/table/usePhone.js: the phone face applies at (max-width: 640px), or at (max-height: 500px) and (pointer: coarse).
  • Why 500 px: the tallest phone on its side is about 430 px and the shortest tablet on its side is 744 px. A short desktop window with a mouse keeps the board, and so does a tablet in landscape.
  • TableFrame sets data-face="phone", and the table's phone CSS follows that attribute, not its own width queries (a container query cannot see pointer or height). A stylesheet test fails if a width-only phone block comes back. The players' table shares the frame and follows the same rule.
  • Rotating mid-session keeps the stage, the shelf and an open Show-the-table or sweep. Desktop-only panels close when the phone face takes over.

Drawing and ledger. lane4.html draws the stage with Take it back (shown, busy, failed) and a new section for the sideways phone. Ledger rows IS-484 and IS-485. CATALOGUE.md was rebuilt from the sources.

Changelog

  • changelog.d/1020-phone-table-takeback-landscape.changed.md

Test plan

  • New unit tests.
    • usePhone: 8 viewport cases, including 844×390 with a coarse and a fine pointer, an iPad mini in landscape, and a short desktop window.
    • GmTable: 5 Take it back cases and 2 rotation cases.
    • Stage: the arrows share a parent.
  • J4 phone journey (own compose project, no host ports): 6 passed, 2 skipped by design. It includes the landscape step: at 844×390 there is no board, the same card is on stage, and the button is still there.
  • Seen in the real app at 390×844, 412×839 and 844×390 with a shown card on stage. The row reads deliberately at each size.
  • Feedback-site tests: 127 passed. All 16 coverage scripts exit 0. eslint: 0 errors.
  • Full vitest on the loaded dev host: 3791 passed, 10 failed with timeouts in seven files this PR does not touch. Those seven pass when run alone (302 passed). CI is the clean run.
  • Not re-shot after the arrow change: the prototype drawing.

Noticed, not changed: at 390 px the foot row's "Sweep the shelf…" wraps onto two lines. That comes from the control's rename in the 1 October review, not from this PR.

🤖 Generated with Claude Code

Part of #1020: the owner's answers to Q143 and Q144 (D271, D272). ## Summary **Take it back on the phone's stage (D271).** - "Take it back" sits beside "Show the table" on the GM's phone stage, only when the card on stage is currently shown. It uses the same `revoke()` and wording as the desktop table's "Shown to the table" list. - Busy state. On failure, an inline banner with Try again. A stat block shown by field has each of its showings taken down. - The two arrows (‹ ›) are now one unit: they wrap as a pair onto their own row at 390 and 412 px, and sit at the row's end at 844×390. **A phone held sideways gets the phone view (D272).** - The choice lives in one place, `pages/table/usePhone.js`: the phone face applies at `(max-width: 640px)`, or at `(max-height: 500px) and (pointer: coarse)`. - Why 500 px: the tallest phone on its side is about 430 px and the shortest tablet on its side is 744 px. A short desktop window with a mouse keeps the board, and so does a tablet in landscape. - `TableFrame` sets `data-face="phone"`, and the table's phone CSS follows that attribute, not its own width queries (a container query cannot see pointer or height). A stylesheet test fails if a width-only phone block comes back. The players' table shares the frame and follows the same rule. - Rotating mid-session keeps the stage, the shelf and an open Show-the-table or sweep. Desktop-only panels close when the phone face takes over. **Drawing and ledger.** `lane4.html` draws the stage with Take it back (shown, busy, failed) and a new section for the sideways phone. Ledger rows IS-484 and IS-485. `CATALOGUE.md` was rebuilt from the sources. ## Changelog - [x] `changelog.d/1020-phone-table-takeback-landscape.changed.md` ## Test plan - [x] **New unit tests.** - `usePhone`: 8 viewport cases, including 844×390 with a coarse and a fine pointer, an iPad mini in landscape, and a short desktop window. - `GmTable`: 5 Take it back cases and 2 rotation cases. - Stage: the arrows share a parent. - [x] **J4 phone journey** (own compose project, no host ports): 6 passed, 2 skipped by design. It includes the landscape step: at 844×390 there is no board, the same card is on stage, and the button is still there. - [x] **Seen in the real app** at 390×844, 412×839 and 844×390 with a shown card on stage. The row reads deliberately at each size. - [x] Feedback-site tests: 127 passed. All 16 coverage scripts exit 0. eslint: 0 errors. - [ ] **Full vitest on the loaded dev host:** 3791 passed, 10 failed with timeouts in seven files this PR does not touch. Those seven pass when run alone (302 passed). CI is the clean run. - [ ] **Not re-shot** after the arrow change: the prototype drawing. **Noticed, not changed:** at 390 px the foot row's "Sweep the shelf…" wraps onto two lines. That comes from the control's rename in the 1 October review, not from this PR. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Merge origin/main; the catalogue rebuilt from the merged sources (#1020)
All checks were successful
CI / Does this change touch the recording path? (pull_request) Successful in 21s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Bot/backend version sync (pull_request) Successful in 28s
CI / Feedback site tests (pull_request) Successful in 51s
CI / Backend lint (ruff) (pull_request) Successful in 1m5s
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 2m2s
CI / Docker image build (pull_request) Successful in 2m18s
CI / Bot tests and audit (pull_request) Successful in 3m35s
CI / End-to-end journeys (phone) (pull_request) Successful in 9m51s
CI / Frontend (shard 2/2) (pull_request) Successful in 13m45s
CI / Frontend (shard 1/2) (pull_request) Successful in 16m50s
CI / End-to-end journeys (desktop) (pull_request) Successful in 21m8s
CI / End-to-end journeys (keyboard) (pull_request) Successful in 21m11s
CI / Backend migration, tests, and audit (pull_request) Successful in 45m25s
dc5d0968c8
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
claude-bot deleted branch feat/1020-phone-table-takeback-landscape 2026-10-04 03:35:40 +00:00
rbrooks referenced this pull request from a commit 2026-10-04 06:57:14 +00:00
Sign in to join this conversation.
No description provided.