Apply velvet-table redesign, fix game lifecycle and history bugs
Frontend: - Dark green/gold "velvet table" visual redesign across the whole app (Auth, Lobby, GameList, GameTable, History, GameOver, modals), with Playfair Display/DM Sans typography and a centralized Tailwind palette. - Desktop game table fit-scales to fill the window; mobile gets overlapping hand/trick layouts and larger touch-friendly cards. - Standings sidebar now groups completed rounds by series with a per-series subtotal row, struck-through tips on missed bids. - History page rewritten into a scoreboard-style detail view (player totals beside names, series grouped 2-up on desktop / stacked on mobile) and gained game names, completed/abandoned status, and a button to reopen a prematurely-ended game back into the lobby. Backend: - Fix started games being deleted from memory (and vanishing from everyone's lobby) when all players disconnect; only `end_game` tears down a started game now. - Fix a crash writing a timezone-aware datetime into the naive `ended_at` Postgres column. - Add `reopen_game`/`restore_game` to un-end a prematurely-ended game from history and resume it from the lobby. - Let any seated player end an abandoned game once the host is offline, not just the host, so the game isn't stuck forever. - Expose SERIES_PER_GAME/ROUNDS_PER_SERIES as named constants on the engine so the persistence layer derives game-completion rules from bridzik.py instead of re-encoding them. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+67
-2
@@ -2,6 +2,71 @@
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
body {
|
||||
@apply bg-slate-900 text-white min-h-screen;
|
||||
@layer base {
|
||||
html,
|
||||
body,
|
||||
#root {
|
||||
@apply min-h-screen;
|
||||
}
|
||||
|
||||
/* Single global type lever: enlarges all rem-based Tailwind text (menu/list/
|
||||
auth/history screens). The game board uses fixed px + transform zoom, so it
|
||||
stays pixel-precise. Bump this one value to scale the menus up or down. */
|
||||
html {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
body {
|
||||
@apply bg-table text-green-score font-sans;
|
||||
background:
|
||||
radial-gradient(ellipse at 50% -10%, rgba(48, 104, 69, 0.16), transparent 60%),
|
||||
#090e0b;
|
||||
background-attachment: fixed;
|
||||
}
|
||||
|
||||
/* Form fields keep the velvet look across the app */
|
||||
input::placeholder {
|
||||
@apply text-green-dim/60;
|
||||
}
|
||||
}
|
||||
|
||||
/* Velvet-table animations (design handoff). Declared as raw CSS so they work
|
||||
both via Tailwind's animate-* utilities and inline `animation:` strings. */
|
||||
@keyframes tp {
|
||||
0%, 100% { opacity: 1; }
|
||||
50% { opacity: 0.5; }
|
||||
}
|
||||
@keyframes ci {
|
||||
from { opacity: 0; transform: translateY(-6px) scale(0.9); }
|
||||
to { opacity: 1; transform: none; }
|
||||
}
|
||||
@keyframes ar {
|
||||
0%, 100% {
|
||||
box-shadow: 0 0 0 3px rgba(201, 168, 76, 0.18), 0 0 18px rgba(201, 168, 76, 0.5), 0 0 42px rgba(201, 168, 76, 0.2);
|
||||
}
|
||||
50% {
|
||||
box-shadow: 0 0 0 5px rgba(201, 168, 76, 0.34), 0 0 32px rgba(201, 168, 76, 0.85), 0 0 56px rgba(201, 168, 76, 0.3);
|
||||
}
|
||||
}
|
||||
@keyframes g1 {
|
||||
0%, 100% { box-shadow: 0 0 18px rgba(201, 168, 76, 0.55), 0 6px 18px rgba(0, 0, 0, 0.55); }
|
||||
50% { box-shadow: 0 0 34px rgba(201, 168, 76, 0.85), 0 6px 18px rgba(0, 0, 0, 0.55); }
|
||||
}
|
||||
|
||||
/* A played card slides into the centre from the direction of its player. */
|
||||
@keyframes fly-top {
|
||||
from { opacity: 0; transform: translateY(-90px) scale(0.82); }
|
||||
to { opacity: 1; transform: none; }
|
||||
}
|
||||
@keyframes fly-bottom {
|
||||
from { opacity: 0; transform: translateY(90px) scale(0.82); }
|
||||
to { opacity: 1; transform: none; }
|
||||
}
|
||||
@keyframes fly-left {
|
||||
from { opacity: 0; transform: translateX(-110px) scale(0.82); }
|
||||
to { opacity: 1; transform: none; }
|
||||
}
|
||||
@keyframes fly-right {
|
||||
from { opacity: 0; transform: translateX(110px) scale(0.82); }
|
||||
to { opacity: 1; transform: none; }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user