:root{--felt:#12573f;--felt-dark:#0c3f2d;--felt-line:#ffffff24;--ink:#f4f1e8;--ink-dim:#f4f1e8b8;--gold:#f2c14e;--card:#fffdf7;--card-edge:#d8d2c2;--red:#c8102e;--black:#1c1c1c;--panel:#fbf8f1;--panel-ink:#1d2a24;--panel-line:#ddd6c6;--accent:#1f7a57;--danger:#b3261e;--card-w:clamp(40px, 8.6vw, 74px);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--felt:#0f4433;--felt-dark:#082a1f;--panel:#1d2421;--panel-ink:#ece7db;--panel-line:#3a4440;--card:#f6f2e7;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}}:root[data-theme=dark]{--felt:#0f4433;--felt-dark:#082a1f;--panel:#1d2421;--panel-ink:#ece7db;--panel-line:#3a4440;--card:#f6f2e7;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*{box-sizing:border-box}html,body{background:var(--felt-dark);min-height:100%;color:var(--ink);-webkit-tap-highlight-color:transparent;margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif}button{font:inherit;cursor:pointer;border:1px solid var(--panel-line);background:var(--panel);color:var(--panel-ink);border-radius:8px;padding:6px 12px}button:disabled{cursor:default;opacity:.4}button.primary{background:var(--accent);border-color:var(--accent);color:#fff}button.link{color:var(--accent);background:0 0;border:none;padding:0;text-decoration:underline}button:focus-visible{outline:3px solid var(--gold);outline-offset:2px}.app{min-height:100dvh;padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left);background:radial-gradient(ellipse at center, var(--felt) 0%, var(--felt-dark) 85%);flex-direction:column;display:flex}.topbar{border-bottom:1px solid var(--felt-line);flex-wrap:wrap;align-items:center;gap:12px;padding:8px 16px;display:flex}.topbar h1{letter-spacing:.04em;color:var(--gold);margin:0;font-size:1.4rem}.scores{color:var(--ink-dim);flex-wrap:wrap;flex:1;gap:16px;font-size:.95rem;display:flex}.scores b{color:var(--ink);margin-left:4px;font-size:1.1rem}.scores .lead b{color:var(--gold)}.scores .short{display:none}.topbar nav{gap:8px;display:flex}.table{flex:1;grid-template:".north.""west center east"minmax(200px,1fr)"south south south"/minmax(64px,1fr) minmax(0,3fr) minmax(64px,1fr);gap:8px;width:100%;max-width:1100px;margin:0 auto;padding:8px 16px 16px;display:grid}.seat-north{grid-area:north;justify-self:center}.seat-west{grid-area:west;align-self:center}.seat-east{text-align:right;grid-area:east;align-self:center}.center{flex-direction:column;grid-area:center;justify-content:center;align-items:center;gap:8px;min-width:0;display:flex}.south{flex-direction:column;grid-area:south;align-items:center;gap:8px;min-width:0;display:flex}.seat{border:1px solid var(--felt-line);background:#0000002e;border-radius:12px;min-width:0;padding:6px 10px;position:relative}.seat.thinking{border-color:var(--gold);box-shadow:0 0 0 2px #f2c14e40}.seat-name{flex-wrap:wrap;align-items:center;gap:6px;font-weight:600;display:flex}.seat-east .seat-name{justify-content:flex-end}.seat-sub{color:var(--ink-dim);font-size:.75rem}.tag,.chip{border-radius:999px;padding:1px 6px;font-size:.68rem;font-weight:600}.tag{background:#ffffff1f}.chip{background:var(--ink);color:var(--felt-dark)}.chip.declarer{background:var(--gold)}.backs{--card-w:clamp(22px, 4vw, 34px);min-width:0;margin-top:4px;display:flex}.seat-east .backs{justify-content:flex-end}.back-slot{width:calc(var(--card-w) * .58);flex:0 auto;min-width:4px}.back-slot:last-child{flex:none;width:auto}.bubble{white-space:nowrap;background:var(--panel);color:var(--panel-ink);z-index:2;border-radius:8px;padding:2px 8px;font-size:.8rem;font-weight:600;position:absolute;top:calc(100% + 4px);left:50%;transform:translate(-50%)}.contract{color:var(--ink-dim);font-size:.9rem}.contract strong{color:var(--gold)}.auction{border:1px solid var(--felt-line);background:#00000038;border-radius:12px;min-width:min(260px,100%);padding:10px 14px}.auction-title{color:var(--ink-dim);margin-bottom:6px;font-size:.8rem}.auction-row{border-top:1px solid var(--felt-line);justify-content:space-between;gap:16px;padding:3px 0;display:flex}.auction-row.current,.auction-row strong.bid{color:var(--gold)}.trick-area{--table-card-w:var(--card-w);width:calc(var(--card-w) * 3.6);height:calc(var(--card-w) * 3.3);position:relative;container-type:size}.trick-card{--card-w:min(var(--table-card-w), 30cqh);transition:transform .2s;position:absolute}.trick-card.at-north{top:0;left:50%;transform:translate(-50%)}.trick-card.at-south{bottom:0;left:50%;transform:translate(-50%)}.trick-card.at-west{top:50%;left:0;transform:translateY(-50%)}.trick-card.at-east{top:50%;right:0;transform:translateY(-50%)}.trick-card.winning .card{box-shadow:0 0 0 3px var(--gold), 0 4px 10px #0006}.named{text-align:center;width:100%;color:var(--gold);font-size:.8rem;position:absolute;bottom:-22px}.waiting{color:var(--ink-dim);font-style:italic}.card{width:var(--card-w);height:calc(var(--card-w) * 1.4);border-radius:calc(var(--card-w) * .1);background:var(--card);border:1px solid var(--card-edge);color:var(--black);opacity:1;flex:none;padding:0;font-weight:700;transition:transform .12s,box-shadow .12s;display:inline-block;position:relative;box-shadow:0 2px 4px #0000004d}.card:disabled{opacity:1}.card.red{color:var(--red)}.card.joker{color:#6b2fa0}.card .corner{line-height:1;font-size:calc(var(--card-w) * .26);flex-direction:column;align-items:center;display:flex;position:absolute;top:3px;left:4px}.card .corner .suit{font-size:calc(var(--card-w) * .24)}.card .pip{font-size:calc(var(--card-w) * .5);padding-top:calc(var(--card-w) * .2);justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.card.joker .pip{font-size:calc(var(--card-w) * .2);letter-spacing:.05em}.card .badge{font-size:calc(var(--card-w) * .2);background:var(--gold);color:#2a2000;border-radius:4px;padding:0 3px;position:absolute;bottom:3px;right:3px}.card .kitty-tag{background:var(--accent);color:#fff;border-radius:6px;padding:0 4px;font-size:.6rem;position:absolute;top:-8px;right:-4px}.card.trump{border-color:#b8952f}.card.back{background:repeating-linear-gradient(45deg,#7a1f2b 0 4px,#962a38 4px 8px);border:2px solid #f4efe4}.card.small{--card-w:clamp(22px, 4vw, 34px)}.card.small .badge,.card.small .kitty-tag{display:none}.hand{justify-content:center;max-width:100%;padding-top:14px;display:flex}.hand .card+.card{margin-left:calc(var(--card-w) * -.28)}.hand.crowded .card+.card{margin-left:calc(var(--card-w) * -.4)}.hand .card.playable{cursor:pointer;--lift:-8px;box-shadow:0 6px 12px #00000059}.hand .card.playable:hover{--lift:-14px}.hand .card.selected{--lift:-22px;box-shadow:0 0 0 3px var(--gold), 0 8px 14px #0006}.hand:has(.playable) .card:not(.playable){filter:brightness(.82)}.status{text-align:center;min-height:1.4em;font-weight:500}.bidding-box{border:1px solid var(--felt-line);background:#00000040;border-radius:12px;gap:4px;padding:10px;display:grid}.bidding-box .note{color:var(--gold);margin:0 0 4px;font-size:.85rem}.call-row{grid-template-columns:74px repeat(5,minmax(44px,1fr));align-items:center;gap:4px;display:grid}.row-label{color:var(--ink-dim);font-size:.8rem}.call{min-height:34px;padding:6px 4px;font-weight:700}.call.red{color:var(--red)}.joker-choice,.discard-bar{flex-wrap:wrap;justify-content:center;align-items:center;gap:6px;display:flex}.dialog{background:var(--panel);color:var(--panel-ink);width:min(440px,100vw - 32px);max-height:calc(100dvh - 32px - env(safe-area-inset-top) - env(safe-area-inset-bottom));border:none;border-radius:14px;padding:0}.dialog.wide{width:min(820px,100vw - 32px)}.dialog::backdrop{background:#00000080}.dialog header{border-bottom:1px solid var(--panel-line);background:var(--panel);justify-content:space-between;align-items:center;padding:12px 16px;display:flex;position:sticky;top:0}.dialog h2{margin:0;font-size:1.1rem}.dialog h3{margin:16px 0 6px;font-size:.95rem}.dialog .icon{border:none;padding:0 6px;font-size:1.4rem;line-height:1}.dialog-body{padding:12px 16px 16px}.actions{justify-content:flex-end;gap:8px;margin-top:16px;display:flex}.made{color:var(--accent)}.down{color:var(--danger)}.hand-result table{border-collapse:collapse;width:100%}.hand-result td{padding:4px 0}.hand-result td:nth-child(n+2){text-align:right}.game-over{font-size:1.1rem;font-weight:700}.new-game{gap:14px;display:grid}.new-game label{gap:4px;display:grid}.new-game label.inline{text-transform:capitalize;gap:4px;margin-right:14px;display:inline-flex}.new-game select{font:inherit;border-radius:8px;padding:6px}.new-game small{color:color-mix(in srgb, var(--panel-ink) 70%, transparent)}.new-game fieldset{border:1px solid var(--panel-line);border-radius:8px}.score-pad{border-collapse:collapse;width:100%;font-size:.9rem}.score-pad th,.score-pad td{text-align:left;border-bottom:1px solid var(--panel-line);padding:6px 8px}.review-hands{grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:10px;display:grid}.review-hand .who{margin-bottom:4px;font-size:.85rem}.mini-hand{flex-wrap:wrap;gap:2px;display:flex}.auction-line,.trick-list li{flex-wrap:wrap;gap:4px 14px;font-size:.9rem;display:flex}.trick-list{padding-left:22px}.trick-list .winner{font-weight:700;text-decoration:underline}.loading,.fatal{text-align:center;margin:auto;padding:32px}@media (max-width:640px){.table{grid-template-columns:minmax(56px,1fr) minmax(0,2.2fr) minmax(56px,1fr);gap:6px;padding:6px 8px 12px}.topbar{padding:6px 12px}.topbar h1{font-size:1.15rem}.topbar nav button{padding:4px 8px;font-size:.85rem}.scores{gap:10px;font-size:.85rem}.scores .long{display:none}.scores .short{display:inline}.seat{padding:4px 6px}.seat-name{font-size:.8rem}.backs{display:none}.hand .card+.card{margin-left:calc(var(--card-w) * -.38)}.hand.crowded .card+.card{margin-left:calc(var(--card-w) * -.5)}.call-row{grid-template-columns:56px repeat(5,minmax(36px,1fr))}.call{min-height:32px;padding:4px 2px;font-size:.85rem}}:root{--best:#2e8b57;--good:#5a9e6f;--inaccuracy:#c08a00;--mistake:#d2691e;--blunder:#c62828}.status-row{flex-wrap:wrap;justify-content:center;align-items:center;gap:10px;display:flex}.hint-button{color:var(--gold);border-color:var(--gold);background:#f2c14e26;padding:3px 12px;font-weight:600}.finish-button{color:var(--ink);border-color:var(--felt-line);background:#ffffff1a;padding:3px 12px}.coach-panel{background:var(--panel);width:min(560px,100%);color:var(--panel-ink);border-left:5px solid var(--gold);border-radius:12px;padding:8px 12px;font-size:.9rem}.coach-panel.grade.best,.coach-panel.grade.good{border-left-color:var(--best)}.coach-panel.grade.inaccuracy{border-left-color:var(--inaccuracy)}.coach-panel.grade.mistake{border-left-color:var(--mistake)}.coach-panel.grade.blunder{border-left-color:var(--blunder)}.coach-panel ul{margin:6px 0 2px;padding-left:18px}.coach-panel li+li{margin-top:2px}.coach-head{justify-content:space-between;align-items:center;gap:8px;display:flex}.coach-head .icon{color:inherit;background:0 0;border:none;padding:0 4px;font-size:1.2rem}.coach-actions{align-items:center;gap:6px;display:flex}.coach-options{flex-wrap:wrap;gap:4px 14px;margin:4px 0;display:flex}.coach-foot{opacity:.7;margin:4px 0 0;font-size:.75rem}.verdict{text-transform:uppercase;letter-spacing:.03em;color:#fff;background:var(--good);border-radius:999px;padding:1px 7px;font-size:.72rem;font-weight:700;display:inline-block}.verdict.best{background:var(--best)}.verdict.inaccuracy{background:var(--inaccuracy)}.verdict.mistake{background:var(--mistake)}.verdict.blunder{background:var(--blunder)}.loss{opacity:.75}.card.hinted{box-shadow:0 0 0 3px var(--gold), 0 0 14px 4px #f2c14eb3!important}.card.also-good{box-shadow:0 0 0 2px #f2c14ed9,0 0 0 5px #f2c14e40!important}.close-call{background:color-mix(in srgb, var(--gold) 30%, transparent);vertical-align:middle;border-radius:999px;margin-left:8px;padding:1px 7px;font-size:.72rem;font-weight:600}.call.hinted{outline:3px solid var(--gold);outline-offset:1px}.trump-count{color:var(--ink);background:#ffffff1f;border-radius:999px;margin-left:10px;padding:1px 8px;font-size:.8rem}.tracker{background:#0003;border-radius:10px;flex-wrap:wrap;justify-content:center;gap:4px 16px;padding:4px 12px;font-size:.85rem;display:flex}.tracker .red{color:#ff8a8a}.tabs{border-bottom:1px solid var(--panel-line);flex-wrap:wrap;gap:4px;margin-bottom:10px;display:flex}.tabs button{background:0 0;border:none;border-radius:8px 8px 0 0;padding:6px 10px}.tabs button.active{background:var(--panel-line);font-weight:600}.decision-list{padding-left:22px}.decision-list>li{margin-bottom:8px}.decision-list ul{margin:4px 0 0;padding-left:18px;font-size:.88rem}.trick-list .costly{color:var(--blunder)}.trick-list .par{opacity:.6;font-size:.8rem}.waiting-text{opacity:.75;font-style:italic}.new-game label.check{align-items:flex-start;gap:10px;display:flex}.new-game label.check span{gap:2px;display:grid}.note{opacity:.8;font-size:.85rem}.app{background:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/></filter><rect width='100%' height='100%' filter='url(%23n)' opacity='0.07'/></svg>"), radial-gradient(ellipse at 50% 45%, #1d7c57 0%, var(--felt) 45%, var(--felt-dark) 90%)}@media (min-width:900px){.table{background:radial-gradient(at 50% 40%,#ffffff0f,#0000001f 75%);border-radius:56px;margin-top:14px;box-shadow:inset 0 0 70px #00000073,0 0 0 10px #5b3a1d,0 0 0 13px #82552c,0 0 0 15px #3d2511,0 18px 40px #0000008c}}.avatar{font-size:1.15em;line-height:1}.icon-toggle{padding:4px 8px;font-size:1rem;line-height:1}.icon-toggle.off{opacity:.45}.card.face .pip{line-height:.95;font-size:calc(var(--card-w) * .3);flex-direction:column}.card.face .pip b{font-family:Georgia,Times New Roman,serif;font-size:calc(var(--card-w) * .5)}.card.face{background:linear-gradient(160deg,#fffdf7 0%,#f6efd9 100%)}.card.back{background:radial-gradient(circle,#ffffff2e 0 18%,#0000 19%),repeating-linear-gradient(45deg,#7a1f2b 0 4px,#962a38 4px 8px)}.card.fanned{transform:translateY(calc(var(--drop,0px) + var(--lift,0px))) rotate(var(--rot,0deg));transform-origin:50% 130%;animation:.38s ease-out both deal-in;animation-delay:calc(var(--i,0) * 45ms)}@keyframes deal-in{0%{opacity:0;transform:translateY(-90px)rotate(0)scale(.85)}}.trick-card .card{transition:transform .32s ease-in,opacity .32s ease-in}.trick-card.at-west .card{animation:.28s ease-out fly-west}.trick-card.at-east .card{animation:.28s ease-out fly-east}.trick-card.at-north .card{animation:.28s ease-out fly-north}.trick-card.at-south .card{animation:.28s ease-out fly-south}@keyframes fly-west{0%{opacity:0;transform:translate(-120px)rotate(-12deg)}}@keyframes fly-east{0%{opacity:0;transform:translate(120px)rotate(12deg)}}@keyframes fly-north{0%{opacity:0;transform:translateY(-110px)}}@keyframes fly-south{0%{opacity:0;transform:translateY(130px)}}.trick-area.sweep .card{opacity:0}.trick-area.sweep-west .card{transform:translate(-160px)scale(.55)}.trick-area.sweep-east .card{transform:translate(160px)scale(.55)}.trick-area.sweep-north .card{transform:translateY(-150px)scale(.55)}.trick-area.sweep-south .card{transform:translateY(170px)scale(.55)}.celebration{pointer-events:none;position:fixed;inset:0;overflow:hidden}.banner{white-space:nowrap;border-radius:999px;padding:.25em .9em;font-size:clamp(1.6rem,6vw,2.6rem);font-weight:800;animation:1.9s forwards banner-pop;position:absolute;top:12%;left:50%;translate:-50%;box-shadow:0 10px 30px #0006}.banner.good{color:#3b2a00;background:linear-gradient(135deg,#f7d774,#e0a82e)}.banner.bad{color:#fff3f3;background:linear-gradient(135deg,#b23a3a,#7d1f1f)}@keyframes banner-pop{0%{opacity:0;scale:.4}15%{opacity:1;scale:1.08}25%{scale:1}80%{opacity:1}to{opacity:0;translate:-50% -20px}}.confetti{border-radius:2px;width:9px;height:14px;animation:linear forwards confetti-fall;position:absolute;top:-12px}@keyframes confetti-fall{to{transform:translateY(105vh) rotate(var(--spin,360deg));opacity:.8}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}}.void-chip{color:#e8e2d0;background:#00000059;border-radius:999px;margin-left:6px;padding:0 6px;font-size:.7rem;font-weight:700;display:inline-block}.void-chip.red{color:#ff9a9a}.tracker em{opacity:.75;font-style:normal}.quiz p{margin:6px 0}.quiz-options{flex-wrap:wrap;gap:8px;display:flex}.quiz-options button{min-width:52px;font-weight:700}.quiz-options button.right{background:var(--best);color:#fff;border-color:var(--best)}.quiz-options button.wrong{background:var(--blunder);color:#fff;border-color:var(--blunder)}.learn-button{background:var(--gold);border-color:var(--gold);color:#2a2000;font-weight:700}.lesson-list{gap:6px;padding:0;list-style:none;display:grid}.lesson-item{text-align:left;gap:2px;width:100%;padding:8px 12px;display:grid}.lesson-title{font-weight:600}.lesson-item small{opacity:.75}.lesson h4{margin:14px 0 4px}.lesson p,.lesson li{line-height:1.5}.quiz-question{border-top:1px solid var(--panel-line);margin-top:8px;padding-top:8px}.drill-hand{flex-wrap:wrap;gap:4px;margin:8px 0;display:flex}.drill .bidding-box{background:#0000000f}.drill .bidding-box .row-label{color:inherit}.puzzle .table{color:var(--ink);box-shadow:none;background:var(--felt);border-radius:16px;margin:8px 0}.stat-tiles{grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:8px;display:grid}.stat{border:1px solid var(--panel-line);border-radius:10px;gap:2px;padding:10px 12px;display:grid}.stat-value{font-size:1.6rem;font-weight:700}.stat-label{opacity:.75;font-size:.8rem}.verdict-bar{border-radius:4px;gap:2px;height:18px;display:flex;overflow:hidden}.verdict-bar .seg{min-width:3px}.verdict-bar .seg.best{background:var(--best)}.verdict-bar .seg.good{background:var(--good)}.verdict-bar .seg.inaccuracy{background:var(--inaccuracy)}.verdict-bar .seg.mistake{background:var(--mistake)}.verdict-bar .seg.blunder{background:var(--blunder)}.verdict-legend{flex-wrap:wrap;gap:4px 14px;margin-top:6px;font-size:.85rem;display:flex}.trend{border-bottom:1px solid var(--panel-line);align-items:flex-end;gap:6px;height:120px;padding:4px 0;display:flex}.trend-col{flex-direction:column;flex:1;justify-content:flex-end;align-items:center;gap:2px;height:100%;display:flex}.trend-bar{background:var(--accent);border-radius:4px 4px 0 0;width:70%;min-height:2px}.trend-col:hover .trend-bar{filter:brightness(1.25)}.trend-label{opacity:.6;font-size:.7rem}.visually-hidden{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.four-color .card.suit-D,.four-color .call.strain-D{color:#1565c0}.four-color .card.suit-C,.four-color .call.strain-C{color:#2e7d32}.big-cards .seat-name,.big-cards .status{font-size:1.1rem}@media (forced-colors:active){.card{border:2px solid canvastext}.card.playable{outline:2px solid highlight}}.lobby{gap:14px;display:grid}.lobby .join{align-items:center;gap:14px;display:flex}.lobby .join img{background:#fff;border-radius:8px;flex:none}.lobby .join p{margin:0}.lobby .url{white-space:nowrap;font-family:ui-monospace,monospace}.lobby-warning{color:var(--danger);margin:0;font-weight:600}.lobby-name label{gap:4px;max-width:260px;display:grid}.lobby-name input,.lobby-seat select{font:inherit;border:1px solid var(--panel-line);border-radius:8px;min-width:0;padding:6px}.lobby-seats{grid-template-columns:repeat(3,minmax(0,1fr));grid-template-areas:".north.""west center east"".south.";gap:8px;display:grid}.lobby-seat{border:1px solid var(--panel-line);border-radius:10px;align-content:start;gap:6px;padding:8px;display:grid}.lobby-seat.mine{border-color:var(--accent);box-shadow:0 0 0 2px color-mix(in srgb, var(--accent) 35%, transparent)}.lobby-seat.north{grid-area:north}.lobby-seat.west{grid-area:west}.lobby-seat.east{grid-area:east}.lobby-seat.south{grid-area:south}.lobby-center{text-align:center;color:color-mix(in srgb, var(--panel-ink) 65%, transparent);grid-area:center;place-items:center;font-size:.8rem;display:grid}.lobby-seat-head{flex-wrap:wrap;align-items:center;gap:6px;font-weight:700;display:flex}.lobby-seat .tag{background:color-mix(in srgb, var(--accent) 18%, transparent);border-radius:999px;padding:1px 6px;font-size:.72rem;font-weight:600}.lobby-person{overflow-wrap:anywhere;align-items:center;gap:6px;display:flex}.lobby-person .dot{background:var(--accent);border-radius:50%;flex:none;width:9px;height:9px}.lobby-person .dot.away{border:2px solid var(--danger);background:0 0}.lobby-seat-actions{flex-wrap:wrap;gap:6px;display:flex}.lobby-seat-actions button{font-size:.85rem}.lobby-pace{border:1px solid var(--panel-line);border-radius:8px}.lobby-pace label.inline{text-transform:capitalize;gap:4px;margin-right:14px;display:inline-flex}.lobby .actions{flex-wrap:wrap;align-items:center}.lobby .confirm{margin-right:auto;font-size:.9rem}button.danger{background:var(--danger);border-color:var(--danger);color:#fff}@media (max-width:520px){.lobby-seats{grid-template-columns:repeat(2,minmax(0,1fr));grid-template-areas:"north north""west east""south south"}.lobby-center{display:none}.lobby .join img{width:96px;height:96px}}.app.at-table{height:100dvh;min-height:0;overflow:hidden}:root{--card-w:clamp(38px, min(8.6vw, 10.5dvh), 74px)}.big-cards{--card-w:clamp(46px, min(11vw, 13dvh), 96px)}.topbar{flex-wrap:nowrap;flex:none}.topbar nav{flex-wrap:nowrap;gap:6px}.nav-button{white-space:nowrap;align-items:center;gap:6px;display:inline-flex}.play-area{flex:1;justify-content:center;gap:18px;width:100%;max-width:1480px;min-height:0;margin:0 auto;padding:0 12px;display:flex}.play-area>.table{flex:1;grid-template-rows:auto minmax(0,1fr) auto;grid-template-areas:"info north.""west center east""south south south";max-width:1100px;min-height:0;margin:0}@media (min-width:900px){.play-area>.table{margin:14px 0 18px}}.table-info{grid-area:info;align-self:start;min-width:0}.center{justify-content:stretch;min-height:0}.dock{flex:none;justify-items:center;gap:6px;width:min(560px,100%);max-height:55%;display:grid;overflow:auto}.center-main{flex-direction:column;flex:1;justify-content:center;align-items:center;width:100%;min-height:0;display:flex;overflow:auto}.rail{flex-direction:column;flex:none;gap:10px;width:300px;min-height:0;margin:14px 0 18px;display:flex;overflow:auto}.rail .coach-panel{width:100%}.south{gap:4px}.south-bar{justify-content:center;align-items:center;gap:12px;width:100%;display:flex}.south-bar .status-row{flex:0 auto}.hand{padding-top:10px}.bidding-box{gap:3px;padding:8px}.call{min-height:clamp(26px,4.4dvh,36px);padding:2px 4px}.call.pass{margin-top:2px}.seat{transition:border-color .2s,box-shadow .2s}.seat.to-act{border-color:var(--gold);animation:1.3s ease-in-out infinite alternate seat-glow}@keyframes seat-glow{0%{box-shadow:0 0 0 2px #f2c14e59,0 0 10px #f2c14e59}to{box-shadow:0 0 0 3px #f2c14eb3,0 0 26px #f2c14ebf}}.seat.just-called{animation:1.4s ease-out seat-called}@keyframes seat-called{0%{box-shadow:0 0 0 3px #ffffffe6,0 0 30px #ffffffb3}to{box-shadow:0 0 #0000}}.seat .turn{color:var(--gold);margin-left:6px;font-weight:700}.seat-south{flex:none}.bubble{border:2px solid #0000;border-radius:10px;padding:3px 10px;font-size:.95rem;box-shadow:0 3px 10px #00000059}.bubble.pass{color:#3a3a3a;background:#d9d4c7}.bubble.mention{color:#123a5c;background:#cfe3f5}.bubble.six{color:#4a1f6b;background:#e6d6f2}.bubble.bid{background:var(--gold);color:#2a2000}.bubble.latest{border-color:#fff;animation:.45s cubic-bezier(.2,1.6,.4,1) bubble-pop}@keyframes bubble-pop{0%{opacity:0;scale:.4}}.seat-west .bubble{top:calc(100% + 6px);left:0;transform:none}.seat-east .bubble{top:calc(100% + 6px);left:auto;right:0;transform:none}.seat-south .bubble{top:auto;bottom:calc(100% + 6px)}.seat-north .bubble{top:50%;left:calc(100% + 8px);transform:translateY(-50%)}.piles{flex-wrap:wrap;align-items:center;gap:5px;min-height:22px;margin-top:5px;display:flex}.seat-east .piles{justify-content:flex-end}.pile{background:repeating-linear-gradient(45deg,#7a1f2b 0 3px,#962a38 3px 6px);border:1px solid #f4efe4;border-radius:3px;width:16px;height:22px;padding:0;animation:.35s ease-out pile-in;box-shadow:1px 1px #5a1720,2px 2px #f4efe4,3px 3px #5a1720}.pile.crossed{width:22px;height:16px}.pile:hover:not(:disabled){outline:2px solid var(--gold)}.pile:disabled{opacity:1;cursor:default}@keyframes pile-in{0%{opacity:0;transform:translateY(-14px)scale(1.3)}}.info-panel{border:1px solid var(--felt-line);background:#0000003d;border-radius:12px;gap:6px;padding:8px 12px;font-size:.88rem;display:grid}.info-game{text-transform:uppercase;letter-spacing:.06em;color:var(--gold);font-size:.75rem}.info-panel .auction{background:0 0;border:none;min-width:0;padding:0}.info-panel .auction ol{margin:0;padding:0;list-style:none}.info-panel .auction-row{gap:8px}.info-panel .auction-row.latest{font-weight:700}.info-panel .auction-row strong.pass{color:var(--ink-dim);font-weight:500}.info-panel .contract{font-size:inherit;color:var(--ink);gap:2px;display:grid}.info-panel .trump-count{justify-self:start;margin:0}.contract-tricks{color:var(--ink-dim)}.contract-tricks b{color:var(--ink)}.past-tricks-button{justify-self:start;padding:3px 10px;font-size:.8rem}.table-info .info-panel{padding:6px 8px;font-size:.78rem}.past-tricks{--card-w:46px;gap:10px;margin:0;padding:0;list-style:none;display:grid}.past-tricks li{border:1px solid var(--panel-line);border-radius:10px;padding:8px}.past-tricks li.focused{border-color:var(--accent);box-shadow:0 0 0 2px color-mix(in srgb, var(--accent) 30%, transparent)}.past-trick-head{flex-wrap:wrap;gap:4px 12px;margin-bottom:6px;font-size:.85rem;display:flex}.past-trick-head .won.ours{color:var(--accent);font-weight:600}.past-trick-head .won.theirs{color:var(--danger);font-weight:600}.past-trick-cards{flex-wrap:wrap;gap:10px;display:flex}.past-trick-cards figure{justify-items:center;gap:2px;margin:0;font-size:.72rem;display:grid}.past-trick-cards figure.winner .card{box-shadow:0 0 0 3px var(--gold)}.joker-choice,.discard-bar{border:1px solid var(--felt-line);background:#00000040;border-radius:12px;flex-direction:column;padding:10px 14px}.joker-choice>div{gap:6px;display:flex}.discard-bar p{margin:0}.main-menu{min-height:calc(100dvh - env(safe-area-inset-top) - env(safe-area-inset-bottom));flex:1;place-items:center;padding:24px 16px;display:grid}.menu-card{text-align:center;width:min(420px,100%)}.menu-card h1{color:var(--gold);letter-spacing:.04em;text-shadow:0 4px 18px #00000073;margin:0;font-size:clamp(3.5rem,14vw,5.5rem);line-height:1}.menu-suits{color:var(--ink);justify-content:center;gap:10px;margin-top:6px;font-size:1.6rem;display:flex}.menu-suits .red{color:#ff8a8a}.menu-tag{color:var(--ink-dim);margin:10px 0 22px}.menu-buttons{gap:10px;display:grid}.menu-buttons button{text-align:left;border-radius:12px;gap:2px;padding:12px 16px;font-size:1.1rem;font-weight:700;display:grid}.menu-buttons button small{opacity:.8;font-size:.82rem;font-weight:400}.settings h3{margin:6px 0 -4px}@media (max-width:760px){.nav-label{display:none}.nav-button{padding:4px 8px}}@media (max-width:640px){.play-area{padding:0}.topbar{gap:8px;padding:6px 8px}.topbar nav{gap:4px}.topbar nav button{padding:4px 6px}.table-info .info-panel{gap:3px;padding:4px 6px;font-size:.68rem}.table-info .auction ol{display:none}.past-tricks-button{padding:2px 6px;font-size:.7rem}.bubble{padding:2px 7px;font-size:.85rem}.seat-west .bubble,.seat-east .bubble{top:calc(100% + 4px);transform:none}.seat-west .bubble{left:0}.seat-east .bubble{right:0}.south-bar{gap:6px}.seat-south .seat-sub{display:none}}.puzzle .table{grid-template-areas:".north.""west center east""south south south"}.puzzle .center{min-height:180px}.center-main:not(:has(.bidding-box)){overflow:visible}@media (max-width:640px){.play-area>.table{grid-template-rows:auto auto minmax(0,1fr) auto;grid-template-columns:repeat(3,minmax(0,1fr));grid-template-areas:"west north east""info info info""center center center""south south south";gap:6px}.play-area>.table .seat-west,.play-area>.table .seat-east,.play-area>.table .seat-north{place-self:stretch stretch}.play-area>.table .seat-north{text-align:center}.play-area>.table .seat-north .seat-name,.play-area>.table .seat-north .piles{justify-content:center}.table-info .info-panel{flex-wrap:wrap;align-items:center;gap:2px 10px;padding:4px 8px;font-size:.74rem;display:flex}.table-info .info-panel .contract{flex-wrap:wrap;gap:2px 10px;display:flex}.table-info .info-game{font-size:.68rem}.play-area .bubble,.play-area .seat-west .bubble,.play-area .seat-east .bubble,.play-area .seat-south .bubble{margin-top:4px;display:inline-block;position:static;transform:none}.play-area .seat-south .bubble{margin:0 0 0 6px}.play-area .seat-south{align-items:center;display:flex}.dock{max-height:42%}.dock .coach-panel{padding:6px 10px;font-size:.8rem}}.info-buttons{flex-wrap:wrap;gap:6px;display:flex}.info-buttons:empty{display:none}.decision-list{padding-left:0;list-style:none}.decision-list details>summary{cursor:pointer}.decision-when{min-width:4.6em;color:color-mix(in srgb, var(--panel-ink) 65%, transparent);font-size:.8rem;display:inline-block}.decision-deal h3{margin-top:14px}.leaks{gap:10px;padding-left:1.2em;display:grid}.leak-head{flex-wrap:wrap;align-items:baseline;gap:4px 12px;display:flex}.leaks p{margin:4px 0 6px}.hinted-tag{background:color-mix(in srgb, var(--gold) 25%, transparent);border-radius:999px;margin-left:8px;padding:1px 7px;font-size:.72rem}.record-toast{inset:auto;top:calc(60px + env(safe-area-inset-top));z-index:60;background:var(--gold);max-width:calc(100vw - 32px);color:var(--felt-dark);border:none;border-radius:999px;margin:0;padding:8px 18px;font-weight:700;animation:.4s ease-out record-in,.6s ease-in 5.4s forwards record-out;position:fixed;left:50%;transform:translate(-50%);box-shadow:0 6px 20px #00000059}@keyframes record-in{0%{opacity:0;transform:translate(-50%,-30px)}}@keyframes record-out{to{opacity:0}}.replay-banner{color:#123a5c;background:#cfe3f5f2;border-radius:999px;padding:2px 10px;font-size:.85rem;font-weight:600}.replay-banner button{padding:1px 8px;font-size:.8rem}.moment-actions{gap:6px;margin:4px 0 2px;display:inline-flex}.moment-actions button,.replay-trick{padding:1px 8px;font-size:.78rem}.replay-trick{margin-left:8px}.hand-code{text-align:center;letter-spacing:.08em;width:100%;padding:6px;font:600 1.3rem/1.4 ui-monospace,monospace}.standings td:first-child,.standings th:first-child{text-align:center;width:3.5em}.standings .you-row td{background:#f2c14e2e;font-weight:700}.standings .style,.round-tables .style,.award .style,.podium .style{opacity:.7;font-size:.85em}.you{font-weight:700}.round-tables{margin:4px 0 10px;padding-left:1.2em}.round-tables li{margin:3px 0}.award{margin:4px 0}.podium{flex-direction:column;gap:10px;margin:8px 0 14px;display:flex}.podium-step{background:#0000000d;border-radius:12px;flex-wrap:wrap;align-items:baseline;gap:4px 12px;padding:10px 14px;animation:.6s ease-out podium-in;display:flex}@keyframes podium-in{0%{opacity:0;transform:translateY(-10px)scale(.97)}}.podium-step.place-1{background:#f2c14e59;font-size:1.15rem}.podium-label{min-width:8em;font-weight:700}.podium-name{font-weight:600}@media (max-height:500px){.topbar{gap:8px;padding:4px 10px}.topbar h1{font-size:1.1rem}.nav-label{display:none}.topbar nav{gap:4px}.topbar nav button,.nav-button{padding:3px 7px;font-size:.85rem}.scores{flex-wrap:nowrap;gap:10px;font-size:.85rem}.scores .long{display:none}.scores .short{display:inline}.play-area>.table{gap:4px 8px;margin:4px 0}.table-info .info-panel{flex-wrap:wrap;align-items:center;gap:2px 8px;padding:4px 8px;font-size:.7rem;display:flex}.table-info .info-panel .contract{flex-wrap:wrap;gap:2px 8px;display:flex}.table-info .auction ol{display:none}.table-info .info-buttons button{padding:2px 8px;font-size:.7rem}.play-area>.table{grid-template-rows:auto minmax(0,1fr) auto;grid-template-areas:"west north east""info center.""south south south"}.play-area>.table .seat-west,.play-area>.table .seat-east,.play-area>.table .seat-north{place-self:stretch stretch}.play-area>.table .seat-north{text-align:center}.play-area>.table .seat-north .seat-name,.play-area>.table .seat-north .piles{justify-content:center}.table-info{align-self:stretch;min-height:0;overflow-y:auto}.play-area .bubble,.play-area .seat-west .bubble,.play-area .seat-east .bubble,.play-area .seat-south .bubble{margin-top:2px;display:inline-block;position:static;transform:none}.play-area .seat-south .bubble{margin:0 0 0 6px}.dock{max-height:34%}.seat{padding:3px 8px}.seat-name{font-size:.8rem}.seat-sub{display:none}.backs{--card-w:clamp(18px, 6dvh, 28px);margin-top:2px}}.touch-tip{z-index:70;color:#f4f1e8;pointer-events:none;white-space:pre-line;background:#1d2420;border:none;border-radius:8px;max-width:min(320px,100vw - 16px);margin:0;padding:8px 12px;font-size:.9rem;line-height:1.35;position:fixed;inset:auto;box-shadow:0 4px 16px #00000073}.app button,.app [title]{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}.achievement-list{grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:8px;margin:0;padding:0;list-style:none;display:grid}.achievement{border:1px solid var(--panel-line);border-radius:10px;align-items:flex-start;gap:10px;padding:10px 12px;display:flex}.achievement.done{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 10%, transparent)}.achievement-icon{filter:grayscale();opacity:.45;font-size:1.6rem;line-height:1}.achievement.done .achievement-icon{filter:none;opacity:1}.achievement-body{gap:2px;min-width:0;display:grid}.achievement-text{opacity:.8;font-size:.85rem}.achievement-meta{opacity:.85;align-items:center;gap:8px;margin-top:2px;font-size:.8rem;display:flex}.achievement.done .achievement-meta{color:var(--accent);opacity:1;font-weight:600}.achievement-bar{background:var(--panel-line);border-radius:3px;flex:1;max-width:140px;height:6px;overflow:hidden}.achievement-bar>span{background:var(--accent);border-radius:3px;height:100%;display:block}.record-toast{text-align:center}.record-toast>span{display:block}:root{--score-up:#3987e5;--score-down:#e34948}.game-grid-key{opacity:.8;flex-wrap:wrap;align-items:center;gap:4px 6px;margin:4px 0 6px;font-size:.8rem;display:flex}.game-grid-key .swatch{border-radius:3px;width:12px;height:12px;display:inline-block}.game-grid-key .swatch.up{background:color-mix(in srgb, var(--score-up) 45%, transparent)}.game-grid-key .swatch.down{background:color-mix(in srgb, var(--score-down) 45%, transparent);margin-left:6px}.game-grid-scroll{max-width:100%;overflow-x:auto}.game-grid table{font-variant-numeric:tabular-nums;border-collapse:separate;border-spacing:2px;width:auto;font-size:.85rem}.game-grid th,.game-grid td{white-space:nowrap;padding:3px 6px}.game-grid tr>:first-child,.game-grid tr>:nth-child(2),.game-grid tr>:nth-child(3){background:var(--panel);z-index:1;box-shadow:-2px 0 0 var(--panel), 2px 0 0 var(--panel);position:sticky}.game-grid tr>:first-child{text-align:center;width:2.2em;min-width:2.2em;left:2px}.game-grid tr>:nth-child(2){text-overflow:ellipsis;text-align:left;width:4.8em;min-width:4.8em;max-width:4.8em;left:calc(2.2em + 4px);overflow:hidden}.game-grid tr>:nth-child(3){left:calc(7em + 6px)}.game-grid tbody th{font-weight:500}.game-grid .game-cell{text-align:right;border-radius:4px;min-width:3.4em}.game-grid .best-mark{color:var(--gold);-webkit-text-stroke:.4px #00000080;margin-left:1px;font-size:.75em}.game-grid .game-total,.game-grid thead th:nth-child(3){text-align:right;border-right:1px solid var(--panel-line);padding-right:10px;font-weight:700}.game-grid .you-row td,.game-grid .you-row th{font-weight:700}.game-grid tr.chosen th button{text-decoration:underline;text-decoration-thickness:2px}.player-games{gap:4px;margin:4px 0 8px;padding:0;list-style:none;display:grid}.player-games li{background:#0000000a;border-radius:6px;flex-wrap:wrap;align-items:baseline;gap:2px 10px;padding:4px 8px;display:flex}.player-games .pg-round{min-width:2em;font-weight:700}.player-games .pg-who{flex:1;min-width:12em}.player-games .pg-score{font-variant-numeric:tabular-nums;font-weight:600}.game-grid-details summary{cursor:pointer;margin:8px 0 4px;font-weight:600}
