Say ALL IN on the felt, and keep the table above the action bar #63
Closed
jheaps
wants to merge 2 commits from
fix/casino-holdem-allin-and-bar into fix/casino-holdem-one-dealer-button
pull from: fix/casino-holdem-allin-and-bar
merge into: :fix/casino-holdem-one-dealer-button
: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.
Both found by playing a hand with a short all-in and a side pot — the hand a dealer most needs help with. Stacked on #62.
A player with nothing behind had a blank where their stack goes
So did a seat whose stack nobody had entered. On a table with side pots that is the one distinction the dealer is working from — who can still be bet at, and who is already in for everything they have — and the felt drew the two states identically.
The action bar knew: it had already built
Main pot $48 — Ann, Ben, Cal, DeeandSide pot 1 $84 — Ann, Ben, Cal. The table it sits under didn't say a word.Betting.isAllInis the same stack testnextToActuses to pass over a player, which is the point: the seat the felt marks is exactly the seat the dealer will never be asked to act on again. There's a test asserting that equivalence rather than restating the condition.The second half of the condition matters: a seat with an empty stack that has put nothing in is a busted player who shouldn't have been dealt in, not a player who moved all-in, so it isn't marked.
"ALL IN" in gold where the stack was, plus a warmer border on the seat — deliberately quieter than the acting-seat ring, because all-in is a standing fact about a player rather than a request for attention.
The wide layout never read the bar's height
The bar publishes how tall it is so the layout can stay clear of it. Only the phone and landscape rules ever read it. The wide layout sized the felt from its own width — a box 72% as tall as it is wide — so it had no idea what was underneath.
Survivable while the bar was a constant. It isn't: 117px → 172px the moment a hand needs a side pot, which is exactly the hand where the dealer most needs to see who is still in. Measured with two side pots, six seats — how far the bottom seat sat behind the bar:
The first attempt didn't work, and the failure is worth recording. The wrap was a
padding-bottom: 72%box, and percentage padding resolves against the containing block's width, not the element's own. Capping the width narrowed the felt 822px → 746px and left it exactly 617px tall, so the seat stayed precisely where it was. It's anaspect-ratiobox now, with the shape stated once as--feltAspectso the height and the cap both derive from it.Six-seat tables at 1280x900, 1600x1000, 1024x768 and 768x1024 all go from one covered seat to a clean audit.
Not applied below 700px. The narrow layout already had an answer — it reserves the bar's height as scroll room under the table, and a phone is a thing you scroll — and capping there was measured and rejected: at 360x640 it took the felt 321px → 226px, which fixed the six-seat ring and broke the nine-seat one, two covered seats traded for two seats whose centre landed on a neighbour.
Landscape phones opt out too. They already set their own height from the bar and are sitting on their 7rem floor. 844x390 and 667x375 still have the bottom seat in the bar, and nothing about a 112px-tall table with 73px seats can fix that.
The seat overhang is a constant (~73px seat at every width) rather than something measured off the layout it is about to change, so this settles in one pass instead of asking a different question every time it shrinks the felt.
Validation
172 tests passing (9 new; they fail on a naive all-in condition — dropping the committed-chips and folded checks fails 4 of them).
Playwright across 10 viewports × 2, 6 and 9 seats, each driven through a real short-all-in hand: no console errors, contrast clean, and the wide sizes clean at 6 and 9 seats. Heads-up re-checked separately after a scripted-input artifact made it look broken — clean with the cap on and off.
Pull request closed