One dealer button on the felt, and Enter that presses what you're on #62
Closed
jheaps
wants to merge 2 commits from
fix/casino-holdem-one-dealer-button into fix/casino-holdem-landscape-table
pull from: fix/casino-holdem-one-dealer-button
merge into: :fix/casino-holdem-landscape-table
:master
:feature/socialism
:polish/holdem-seats-one-size
:fix/holdem-dealer-chip-eats-its-seat
:polish/holdem-game-night-ready
:polish/holdem-round-next
:polish/holdem-seat-collisions
:polish/holdem-offline-and-render
:fix/naming-a-blind-deals-the-hand
:release/casino-holdem-polish
:fix/casino-holdem-phone-look
:fix/casino-holdem-sidebar-crowding
:fix/casino-holdem-contribution-rule
:fix/casino-holdem-one-stack-rule
:fix/casino-holdem-default-stack-buyin
:feat/casino-holdem-waiting-list
:feat/casino-holdem-misdeal
:feat/casino-holdem-cash-out
:feat/casino-holdem-clock
:feat/casino-holdem-rake
:fix/casino-holdem-stadium-ring
:fix/casino-holdem-phone-felt-shape
:fix/casino-holdem-audit-runs-everything
:feat/casino-holdem-straddle
:fix/casino-holdem-landscape-ring
:feat/casino-holdem-table-file
:fix/casino-holdem-touch-targets
:fix/casino-holdem-audit-modal-blindspot
:fix/casino-holdem-quicksplit-chop
:fix/casino-holdem-buildable-bet-sizes
:fix/casino-holdem-pot-sized-raise
:fix/casino-holdem-chips-to-count-out
:fix/casino-holdem-first-buy-in
:fix/casino-holdem-seating-a-table
:fix/casino-holdem-showdown-order
:fix/casino-holdem-hand-log-filter
:fix/casino-holdem-posting-in
:fix/casino-holdem-dead-button
:fix/casino-holdem-discarded-pot
:fix/casino-holdem-honest-tank-clock
:fix/casino-holdem-export-the-notes
:fix/casino-holdem-stacks-in-chips
:fix/casino-holdem-close-audit-blind-spots
:fix/casino-holdem-readable-dim-states
:fix/casino-holdem-drop-broken-watermark
:fix/casino-holdem-two-tabs
:fix/casino-holdem-unreadable-save
:fix/casino-holdem-say-when-not-saving
:fix/casino-holdem-shortcut-discovery
:fix/casino-holdem-rulings-index-compact
:fix/casino-holdem-rulings-index
:fix/casino-holdem-payout-in-chips
:fix/casino-holdem-move-seat-on-touch
:fix/casino-holdem-amount-fields-select
:fix/casino-holdem-touch-targets-by-pointer
:fix/casino-holdem-button-box-model
:fix/casino-holdem-blind-badge-placement
:fix/casino-holdem-buyin-deals-in
:fix/casino-holdem-bet-vs-raise
:fix/casino-holdem-deal-around-broke
:fix/casino-holdem-settle-up
:fix/casino-holdem-allin-and-bar
:fix/casino-holdem-one-dealer-button
:fix/casino-holdem-manual-deal
:fix/casino-holdem-less-guessing
:feature/casino-holdem-seat-editor
:fix/casino-holdem-landscape-table
:feature/casino-holdem-acting-seat
:feature/casino-holdem-raise-guard
:feature/casino-holdem-first-run
:feature/casino-holdem-contrast-audit
:feature/casino-holdem-layout-audit
:feature/casino-holdem-blind-fairness
:feature/casino-holdem-rulings-depth
:feature/casino-holdem-bank-audit
:feature/casino-holdem-fewer-taps
:feature/casino-holdem-render-perf
:feature/casino-holdem-keyboard-focus
:feature/casino-holdem-resilience
:feature/casino-holdem-messy-tables
:feature/casino-holdem-touch-mobile
:chore/casino-holdem-tech-debt
:feature/casino-holdem-dealer-batch
:feature/casino-holdem-seat-count-safety
:feature/casino-holdem-odd-chip
:feature/casino-holdem-button-moves
:feature/casino-holdem-allin-runout
:feature/casino-holdem-heads-up
:feature/casino-holdem-contrast
:feature/casino-holdem-touch-audit
:feature/casino-holdem-wizard-polish
:feature/casino-quicksplit-side-pots
:feature/casino-holdem-rebuys
:feature/casino-holdem-rulings
:feature/casino-holdem-sidebar-polish
:feature/casino-holdem-keyboard
:feature/casino-holdem-action-undo
:feature/casino-holdem-pace
:feature/casino-holdem-side-pot-breakdown
:feature/casino-holdem-gestures
:feature/casino-holdem-card-picker
:feature/casino-holdem-live-betting
:feature/casino-holdem-bet-chips
:feature/casino-holdem-seat-legibility
:feature/casino-holdem-undo-toasts
:feature/casino-holdem-quick-split
:feature/casino-holdem-mobile-table
:feature/casino-holdem-hand-history
:feature/casino-texas-holdem
:feature/casino-holdem-dealer-mode-polish
:feature/fractional-learned-weights
:fix/stockfish-dispose-hang
:fix/blog-cache-staleness
:fix/workflows
:gitea/workflows
:echo-acoustic-ranging
:chess-ui-overhaul
:feature/customChessEngine
:feature/blog
:AddProject
:feature/generalUpdate
:tech-debt/chess-cleanup
:tests/CreatePlaywrightTests
:UpdateParticleSimulatorButton
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Two faults in the same surface — how a dealer reaches a control. Stacked on #61.
A poker table has one dealer button. This one drew nine.
Every seat carried a puck: the real one in gold, and eight ghosts at
opacity: 0.32that existed to be pressed. Measured on a nine-seat table — eight pale discs, all eight showing the letter D, one of them the button. Finding it meant comparing nine identical shapes for the one that's gold, when it should be the only thing of its kind on the felt.The ghosts also sat on their neighbours. Every remaining "something important is covered" offender on a crowded table was a live seat covered by the seat-next-door's ghost puck — 844x390, 915x412, 360x640 and 640x360 each reported one, and they were all the same thing.
And a screen reader heard nine buttons named "D".
So a seat without the button doesn't draw one. Hovering a seat fades its slot in — a preview of where the button would go, one click as before — and on touch, where there is no hover, "Give the button" has been in the seat's long-press menu all along. Keyboard reaches it by focus, where the slot appears too.
pointer-eventsmatters as much as the opacity: an invisible puck that still took taps would be worse than a visible one.The audit checks it now, because it's a rule about the table rather than about CSS: one puck drawn, and no two announcing themselves the same way. Verified against the old behaviour put back — it reports 9 and 9.
The keyboard could reach the button and then couldn't press it
Found while checking that. Enter and Space were bound to
advancefor the whole document, with an exception only for text fields. Those two keys are how a keyboard presses the control it is sitting on, so every button on the page lost them — and not to nothing:The inconsistency is the handler's return value: it calls
preventDefaultonly when it handled the key, so whenadvanceapplied it ran instead of the button, and when it didn't apply the browser's own activation got through. A control that does something else every other press is worse than one that does nothing.Enter and Space now go to a focused
button,[role=button], link orsummary; the shortcut claims them only when nothing pressable has focus. The letters stay live with a button focused — a button does nothing with "f", and a dealer whose hand is on the keys shouldn't lose them to a stray focus ring.Space still advances: dealt →
f,f,c,c→ Space → flop. The action bar rebuilds after every press, so focus falls back to the body and the dealer's Space is never quietly aimed at the Fold they just clicked.Validation
163 tests passing (11 new for the shortcut rule — and they fail on the old handler, 4 of them, exactly the Enter/Space-on-a-control cases).
Driven through Playwright at 9 viewports: one puck everywhere, no console errors, contrast clean, six of nine fully clean. Hover reveals the slot on the hovered seat only and clicking it moves the button; Tab reaches an inactive slot, it becomes visible, Enter moves the button; no seat's centre goes to an invisible puck (0 of 9).
The three remaining offenders (844x390's action bar over two empty seats, and two seat-body overlaps at 640x360 / 667x375) are the pre-existing crowding documented in #61.
A poker table has one dealer button. This one drew nine. Every seat carried a puck: the real one in gold, and eight ghosts at 0.32 opacity that existed to be pressed. Measured on a nine-seat table -- eight pale discs, all eight showing the letter D, one of them the button. Finding it meant comparing nine identical shapes for the one that's gold, when it should be the only thing of its kind on the felt. The ghosts also sat on their neighbours. Every remaining "something important is covered" offender on a crowded table was a live seat covered by the seat-next-door's ghost puck: 844x390, 915x412, 360x640 and 640x360 each reported one, and they were all the same thing. And a screen reader heard nine buttons named "D". So a seat without the button doesn't draw one. Hovering a seat fades its slot in -- a preview of where the button would go, one click as before -- and on touch, where there is no hover, "Give the button" has been in the seat's long-press menu all along. Keyboard reaches it by focus, where the slot appears too. pointer-events matters as much as the opacity: an invisible puck that still took taps would be worse than a visible one. visible pucks 9 -> 1 at every size layout offenders 915x412 1->0, 360x640 1->0, 844x390 3->2, 640x360 3->2 clean viewports 4 of 9 -> 6 of 9 labels nine "D" -> "Ann has the dealer button" and "Give the dealer button to Ben" The audit now checks it, because this is a rule about the table rather than about CSS: one puck drawn, and no two announcing themselves the same way. Verified against the old behaviour put back -- it reports 9 and 9. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_015bnp7xKUPFFSpwkYNFaPgbjheaps referenced this pull request2026-09-02 03:14:22 -06:00
Pull request closed