Replace the browser confirm boxes with undo and in-page dialogs

Three system confirm() dialogs sat in the middle of dealing. The worst was on
Next Hand — the most-pressed button in a session, asking "are you sure?" every
single time, stealing focus and, on a phone, taking over the screen.

Next Hand now just happens, and a toast says where the button landed with an
Undo beside it for the few seconds anyone would notice a misclick. The same
undo covers the pot wizard, which is the more valuable case: paying the wrong
player is a real mistake, and rolling it back restores the hand history entry
and the session standings along with the seats. The snapshot is in-memory only
— an undo is for the mistake you just made, not one from last night.

The two genuinely destructive actions keep a confirmation, but as an in-page
dialog that matches the table instead of the browser's own: Escape or the
backdrop cancels, Enter confirms, and on a phone the buttons go full width with
Cancel nearest the thumb.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_015bnp7xKUPFFSpwkYNFaPgb
This commit is contained in:
2026-08-31 18:22:50 -06:00
co-authored by Claude Sonnet 5
parent a39675f975
commit d01c67fc45
4 changed files with 329 additions and 12 deletions
+142
View File
@@ -753,6 +753,135 @@ body {
/* ---------- Pot wizard ---------- */
/* ---------- Toasts ---------- */
#toastHost {
position: fixed;
left: 50%;
bottom: 1.25rem;
transform: translateX(-50%);
z-index: 80;
width: min(560px, calc(100vw - 1.5rem));
pointer-events: none;
}
.toast {
display: flex;
align-items: center;
gap: 0.75rem;
background: linear-gradient(180deg, #2b2b2b, #202020);
border: 1px solid #414141;
border-left: 3px solid #d8b46a;
border-radius: 10px;
padding: 0.7rem 0.8rem 0.7rem 0.9rem;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.55);
pointer-events: auto;
opacity: 0;
transform: translateY(12px);
transition: opacity 0.18s ease, transform 0.18s ease;
}
.toast.toastVisible {
opacity: 1;
transform: translateY(0);
}
.toastText {
flex: 1;
min-width: 0;
color: #e9e9e9;
font-size: 0.85rem;
line-height: 1.35;
}
.toastAction {
flex: none;
min-height: 38px;
padding: 0.35rem 0.9rem;
border-radius: 8px;
border: 1px solid #d8b46a;
background: rgba(216, 180, 106, 0.12);
color: #f0d9a8;
font-size: 0.85rem;
font-weight: 600;
font-family: inherit;
cursor: pointer;
}
.toastAction:hover {
background: rgba(216, 180, 106, 0.22);
}
.toastClose {
flex: none;
width: 30px;
height: 30px;
border-radius: 50%;
border: none;
background: transparent;
color: #888;
font-size: 0.8rem;
font-family: inherit;
cursor: pointer;
}
.toastClose:hover {
background: #333;
color: #ddd;
}
/* ---------- Confirmation dialog ---------- */
#confirmOverlay {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.72);
display: flex;
align-items: center;
justify-content: center;
z-index: 90;
padding: 1.5rem;
}
#confirmOverlay[hidden] {
display: none;
}
#confirmModal {
background: #1e1e1e;
border: 1px solid #3a3a3a;
border-radius: 12px;
width: 100%;
max-width: 420px;
padding: 1.3rem 1.4rem 1.2rem;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6);
outline: none;
}
#confirmTitle {
margin: 0 0 0.5rem;
font-size: 1.05rem;
font-weight: 500;
color: #f5f5f5;
}
#confirmMessage {
margin: 0 0 1.2rem;
color: #a5a5a5;
font-size: 0.85rem;
line-height: 1.5;
}
.confirmActions {
display: flex;
justify-content: flex-end;
gap: 0.6rem;
}
.confirmActions .holdemBtn {
min-height: 44px;
}
#potWizardOverlay {
position: fixed;
inset: 0;
@@ -1053,4 +1182,17 @@ body {
min-height: 44px;
margin-top: 0.4rem;
}
.toastAction {
min-height: 44px;
}
.confirmActions {
flex-direction: column-reverse;
}
.confirmActions .holdemBtn {
width: 100%;
justify-content: center;
}
}