:root{color:#111;font-synthesis:none;--paper:#fff;--ink:#111;--muted:#555;--line:#111;--accent:#f2c94c;--danger:#a51d28;--effect-overlay:#0a0c12eb;--first-player-overlay:#11111194;--effect-card:#f7f4e8;--player-1:#ff0d22;--player-2:#21db3b;--player-3:#00aefc;--player-4:#b500fc;background:#f3f1eb;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}*,:before,:after{box-sizing:border-box}html{background:var(--paper);min-width:280px;min-height:100%}body{background:var(--paper);min-height:100svh;margin:0}button,input{font:inherit;color:inherit}button{border:2px solid var(--line);background:var(--paper);cursor:pointer;border-radius:10px;min-height:44px;padding:.65rem 1rem}button:hover{background:#f5f5f0}button:focus-visible,input:focus-visible,[role=button]:focus-visible{outline-offset:3px;outline:4px solid #3278c6}button:disabled{color:#777;cursor:not-allowed;background:var(--paper);box-shadow:none}input{border:2px solid var(--line);background:var(--paper);border-radius:8px;width:100%;min-height:46px;margin-top:.4rem;padding:.65rem .75rem}h1,h2,p{margin-top:0}h1{font-size:clamp(1.65rem,5vw,2.6rem);line-height:1.15}h2{font-size:1.3rem}label{font-weight:700;display:block}.app-shell{min-height:100svh;padding:env(safe-area-inset-top) max(1rem, env(safe-area-inset-right)) env(safe-area-inset-bottom) max(1rem, env(safe-area-inset-left))}.topbar{justify-content:space-between;align-items:center;gap:1rem;width:min(100%,960px);min-height:58px;margin:0 auto;display:flex}.brand{background:0 0;border:0;padding:.4rem 0;font-size:1.05rem;font-weight:900}.build-hash{border:1px solid var(--line);background:var(--paper);border-radius:999px;flex:none;padding:.25rem .55rem;font-family:ui-monospace,monospace;font-size:.72rem}.panel,.play-layout{width:min(100%,820px);margin:clamp(1rem,7vh,4rem) auto 0}.panel.narrow{max-width:520px}.eyebrow{color:var(--muted);letter-spacing:.04em;text-transform:uppercase;margin-bottom:.35rem;font-size:.88rem;font-weight:800}.primary{background:var(--accent);font-weight:900}.panel>.primary{width:100%;margin-top:1rem}.choice-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem;display:grid}.choice{text-align:left;flex-direction:column;justify-content:center;gap:.35rem;min-height:130px;display:flex}.choice strong{font-size:1.2rem}.choice span{color:var(--muted)}.join-box{grid-row:span 2;justify-content:flex-start}.join-box button{margin-top:.75rem}.error{color:var(--danger);margin-top:1rem;font-weight:800}.game-list{gap:1.25rem;margin-top:1rem;display:grid}.filters{flex-wrap:wrap;gap:.5rem;margin-top:.75rem;display:flex}.filters>div{flex-wrap:wrap;gap:.35rem;display:flex}.filters button{min-height:36px;padding:.35rem .65rem}.filters button.selected{background:var(--accent);font-weight:900}.game-card{border:2px solid var(--line);background:var(--paper);border-radius:14px;justify-content:space-between;gap:1rem;padding:1rem;display:flex}.game-card h2{margin-bottom:.25rem}.people{color:var(--muted);margin-bottom:.65rem}.tags{flex-wrap:wrap;gap:.35rem;display:flex}.tags span{border:1px solid var(--line);border-radius:999px;padding:.2rem .55rem;font-size:.8rem}.game-actions{flex-direction:column;justify-content:center;gap:.5rem;min-width:130px;display:flex}.game-status{justify-content:space-between;align-items:center;gap:1rem;display:flex}.game-status h1{margin-bottom:0}.play-status-slot{min-height:1.75rem;margin-top:.65rem}.play-status-slot p{white-space:nowrap;text-overflow:ellipsis;min-height:1.75rem;margin:0;overflow:hidden}.seat-badge{align-items:center;gap:.45rem;margin:0;font-weight:900;display:flex}.seat-badge:before{border:2px solid var(--line);background:var(--seat-color,var(--paper));content:"";border-radius:50%;width:1rem;height:1rem}.seat-badge.player-1{--seat-color:var(--player-1)}.seat-badge.player-2{--seat-color:var(--player-2)}.restart-notice{margin:0;font-weight:800}.opening-coin{text-align:center}.first-player-choice{z-index:19;padding:max(1rem, env(safe-area-inset-top)) max(1rem, env(safe-area-inset-right)) max(1rem, env(safe-area-inset-bottom)) max(1rem, env(safe-area-inset-left));background:var(--first-player-overlay);place-items:center;display:grid;position:fixed;inset:0}.first-player-choice-card{border:3px solid var(--line);text-align:center;background:var(--paper);border-radius:16px;width:min(100%,520px);padding:clamp(1rem,5vw,2rem)}.first-player-choice-card>div{grid-template-columns:repeat(2,minmax(0,1fr));gap:.75rem;display:grid}.first-player-choice-card p{margin:.75rem 0 0}.board{touch-action:manipulation;width:min(100%,620px);max-height:calc(100svh - 230px);margin:1rem auto 0;display:block}.board [role=button]{cursor:pointer}.board-background{fill:#fff;stroke:var(--line)}.board-cell{fill:var(--paper);stroke:var(--line)}.board-hit-area{fill:#0000}.roulette-highlight{fill:var(--accent);opacity:.55;pointer-events:none}.move-preview{opacity:.5;pointer-events:none}.last-turn-marker{fill:var(--ink);stroke:var(--paper);stroke-width:6px;paint-order:stroke;pointer-events:none}.vote-dot{fill:var(--ink);stroke:var(--paper);stroke-width:3px;pointer-events:none}.vote-dot.own-vote.player-1{fill:var(--player-1)}.vote-dot.own-vote.player-2{fill:var(--player-2)}.vote-marker{pointer-events:none}.vote-marker circle{fill:var(--paper);stroke:var(--ink);stroke-width:4px}.vote-marker text{fill:var(--ink);font-size:20px;font-weight:900}.vote-marker.own-vote.player-1 circle{fill:var(--player-1)}.vote-marker.own-vote.player-2 circle{fill:var(--player-2)}.board-cell.player-1{fill:var(--player-1)}.board-cell.player-2{fill:var(--player-2)}.board-cell.player-3{fill:var(--player-3)}.board-cell.player-4{fill:var(--player-4)}.piece-shape{dominant-baseline:middle;fill:var(--ink);pointer-events:none;font-size:42px;font-weight:900}.piece-number{dominant-baseline:middle;fill:var(--ink);stroke:var(--paper);stroke-width:4px;paint-order:stroke;pointer-events:none;font-size:21px;font-weight:900}.hint{text-align:center;color:var(--muted);margin:.7rem auto;font-size:.9rem}.confirm-move{min-width:8rem;margin:.7rem auto 0;display:block}.restart{margin:.75rem auto;display:block}.rematch{text-align:center}.rematch p{margin:.35rem 0}.room-lobby{grid-template-rows:auto auto auto minmax(280px,1fr) auto;gap:.65rem;width:min(100%,720px);min-height:calc(100svh - 58px);margin:0 auto;display:grid}.room-lobby>h1{text-align:center;letter-spacing:.08em;margin:0;font:900 clamp(2rem,10vw,4rem)/1 ui-monospace,monospace}.lobby-game{border:2px solid var(--line);border-radius:14px;justify-content:space-between;gap:.75rem;padding:.8rem 1rem;display:flex;position:relative}.lobby-game h2,.lobby-game p{margin-bottom:.2rem}.game-settings summary{cursor:pointer;font-size:1.25rem}.game-settings-popup{z-index:4;border:2px solid var(--line);background:var(--paper);border-radius:10px;width:180px;padding:.7rem;position:absolute;top:3rem;right:.7rem}.game-settings-popup label{justify-content:space-between;align-items:center;gap:.75rem;display:flex}.game-settings-popup input{width:24px;min-height:24px;margin:0}.team-headings,.participant-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:.55rem;display:grid}.team-headings strong{text-align:center}.team-headings input{margin-top:.15rem}.ai-opponent-banner{text-align:center;margin:0;font-weight:900}.participant-grid{grid-template-rows:repeat(3,minmax(86px,112px));align-content:start}.participant{border:2px solid var(--line);border-radius:12px;flex-direction:column;justify-content:center;gap:.25rem;min-width:0;max-height:112px;padding:.55rem;display:flex}.participant>span{color:var(--muted)}.participant>button{min-height:34px;padding:.25rem}.participant details{margin-top:.15rem}.participant summary{cursor:pointer;font-size:1.25rem}.participant-menu{z-index:3;border:2px solid var(--line);background:var(--paper);gap:.2rem;width:155px;padding:.4rem;display:grid;position:absolute;right:0}.participant-menu button{min-height:34px;padding:.25rem}.lobby-actions{padding-bottom:max(.5rem, env(safe-area-inset-bottom));grid-template-columns:1fr 1fr;gap:.5rem;display:grid}.lobby-actions strong{text-align:center;grid-column:1/-1}.update-banner{z-index:10;right:max(1rem, env(safe-area-inset-right));bottom:max(1rem, env(safe-area-inset-bottom));left:max(1rem, env(safe-area-inset-left));border:3px solid var(--line);background:var(--accent);box-shadow:0 5px 0 var(--line);border-radius:12px;justify-content:center;align-items:center;gap:1rem;padding:.75rem;font-weight:800;display:flex;position:fixed}.viewport-vignette{z-index:8;pointer-events:none;background:radial-gradient(ellipse at center, transparent 62%, rgb(0 0 0/calc(var(--vignette-intensity) * .35)) 82%, rgb(0 0 0/var(--vignette-intensity)) 100%);animation:vignette-flash var(--vignette-period) ease-in-out infinite alternate;position:fixed;inset:0}.viewport-countdown{z-index:9;bottom:max(.2rem, env(safe-area-inset-bottom));color:var(--ink);text-shadow:0 1px var(--paper);font-size:clamp(1.5rem,7vw,3rem);font-weight:900;line-height:1;position:fixed;left:50%;transform:translate(-50%)}@keyframes vignette-flash{0%{opacity:.2}to{opacity:1}}.effects-page{margin-top:1rem;padding-bottom:3rem}.effects-page>h1{margin-top:1rem}.effect-selectors{grid-template-columns:repeat(2,minmax(0,1fr));gap:.75rem;display:grid}.effect-selectors select{border:2px solid var(--line);width:100%;min-height:44px;color:var(--ink);background:var(--paper);border-radius:8px;margin-top:.35rem;padding:.45rem;display:block}.effect-demo{border:2px solid var(--line);background:var(--paper);border-radius:14px;margin-top:1rem;padding:1rem;position:relative;overflow:hidden}.effect-demo h2{margin-bottom:.65rem}.effect-grid{grid-template-columns:repeat(auto-fit,minmax(44px,1fr));align-items:center;gap:clamp(.35rem,2vw,.75rem);width:100%;min-height:80px;display:grid}.effect-coin,.effect-die{aspect-ratio:1;width:clamp(42px,11vw,64px);animation-delay:calc(var(--effect-index) * 55ms);justify-self:center;animation-fill-mode:both}.effect-coin{border:3px solid var(--line);border-radius:50%;place-items:center;font-size:clamp(1.25rem,5vw,2rem);font-weight:900;animation-name:coin-toss;animation-duration:.65s;display:grid}.effect-coin.face-H{color:var(--ink);background:var(--paper)}.effect-coin.face-T{color:var(--paper);background:var(--ink)}.effect-die{border:3px solid var(--line);background:var(--paper);box-shadow:0 3px 0 var(--line);border-radius:12px;grid-template:repeat(3,1fr)/repeat(3,1fr);padding:7px;animation-name:die-roll;animation-duration:.65s;display:grid}.die-pip{aspect-ratio:1;background:0 0;border-radius:50%;place-self:center;width:min(9px,60%);position:relative}.die-pip.is-on{animation:.65s step-end both die-pip-reveal;animation-delay:calc(var(--effect-index) * 55ms)}.die-pip:before{background:var(--ink);opacity:0;content:"";animation-duration:.65s;animation-timing-function:step-end;animation-fill-mode:both;animation-delay:calc(var(--effect-index) * 55ms);border-radius:50%;position:absolute;inset:0}.die-pip.scramble-111:before{animation-name:die-pip-scramble-111}.die-pip.scramble-011:before{animation-name:die-pip-scramble-011}.die-pip.scramble-101:before{animation-name:die-pip-scramble-101}.effect-controls{align-items:center;gap:.8rem;margin-top:.75rem;display:flex}.effect-controls label{align-items:center;gap:.35rem;display:flex}.effect-controls input{width:24px;min-height:24px;margin:0}.deck-timing-controls{grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:.5rem;margin-bottom:.75rem;display:grid}.deck-timing-controls label{border:1px solid var(--line);border-radius:8px;padding:.45rem;font-size:.78rem}.deck-timing-controls input{min-height:24px;margin:.15rem 0;padding:0}.deck-timing-controls output{text-align:right;font:700 .75rem/1 ui-monospace,monospace;display:block}.deck-shuffle-overlay{z-index:20;color:var(--paper);background:var(--effect-overlay);pointer-events:none;animation:deck-overlay var(--total-ms) linear both;place-items:center;display:grid;position:fixed;inset:0;overflow:hidden}.shuffle-scene{flex-direction:column;align-items:center;gap:min(7.6vw,30px);display:flex}.shuffle-deck{aspect-ratio:2/3;width:min(38vw,150px);position:relative}.shuffle-card{border:3px solid var(--line);background:var(--effect-card);width:100%;height:100%;box-shadow:inset 0 0 0 7px var(--paper), inset 0 0 0 9px var(--line), 0 2px 0 var(--line);opacity:0;border-radius:12px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.spawn-card{z-index:var(--card-order);animation:deck-card-spring-drop var(--fall-ms) cubic-bezier(.18, .72, .24, 1.18) var(--card-delay) forwards, deck-card-fade var(--fade-ms) linear var(--card-delay) forwards, deck-card-gather var(--gather-ms) cubic-bezier(.2, .9, .3, 1.12) var(--gather-start) forwards, deck-hide 1ms steps(1, end) var(--shuffle-start) forwards}.shuffle-card-a{z-index:3;animation:deck-show 1ms steps(1, end) var(--shuffle-start) forwards, deck-split-right var(--split-1-ms) cubic-bezier(.2, .9, .3, 1.12) var(--split-1-start) forwards, deck-join-right var(--join-ms) cubic-bezier(.2, .9, .3, 1.12) var(--join-1-start) forwards, deck-lower 1ms steps(1, end) var(--split-2-start) forwards, deck-split-right var(--split-ms) cubic-bezier(.2, .9, .3, 1.12) var(--split-2-start) forwards, deck-join-right var(--join-ms) cubic-bezier(.2, .9, .3, 1.12) var(--join-2-start) forwards, deck-raise 1ms steps(1, end) var(--split-3-start) forwards, deck-split-right var(--split-ms) cubic-bezier(.2, .9, .3, 1.12) var(--split-3-start) forwards, deck-join-right var(--join-ms) cubic-bezier(.2, .9, .3, 1.12) var(--join-3-start) forwards, deck-hide 1ms steps(1, end) var(--exit-start) forwards}.shuffle-card-b{z-index:2;animation:deck-show 1ms steps(1, end) var(--shuffle-start) forwards, deck-split-left var(--split-1-ms) cubic-bezier(.2, .9, .3, 1.12) var(--split-1-start) forwards, deck-join-left var(--join-ms) cubic-bezier(.2, .9, .3, 1.12) var(--join-1-start) forwards, deck-raise 1ms steps(1, end) var(--split-2-start) forwards, deck-split-left var(--split-ms) cubic-bezier(.2, .9, .3, 1.12) var(--split-2-start) forwards, deck-join-left var(--join-ms) cubic-bezier(.2, .9, .3, 1.12) var(--join-2-start) forwards, deck-lower 1ms steps(1, end) var(--split-3-start) forwards, deck-split-left var(--split-ms) cubic-bezier(.2, .9, .3, 1.12) var(--split-3-start) forwards, deck-join-left var(--join-ms) cubic-bezier(.2, .9, .3, 1.12) var(--join-3-start) forwards, deck-hide 1ms steps(1, end) var(--exit-start) forwards}.exit-band{z-index:4;animation-duration:var(--exit-ms);animation-timing-function:linear;animation-delay:var(--exit-start);border-radius:12px;animation-fill-mode:forwards}.exit-left{-webkit-mask-image:repeating-linear-gradient(to bottom, var(--ink) 0 10px, transparent 10px 20px);mask-image:repeating-linear-gradient(to bottom, var(--ink) 0 10px, transparent 10px 20px);animation-name:deck-exit-left}.exit-right{-webkit-mask-image:repeating-linear-gradient(to bottom, transparent 0 10px, var(--ink) 10px 20px);mask-image:repeating-linear-gradient(to bottom, transparent 0 10px, var(--ink) 10px 20px);animation-name:deck-exit-right}.shuffle-caption{text-align:center;width:min(90vw,500px);animation:deck-caption var(--total-ms) linear both;margin:0;font-size:clamp(1.1rem,5vw,2rem);font-weight:900}@keyframes coin-toss{0%{opacity:0;transform:translateY(-24vh)rotateY(540deg)}72%{transform:translateY(7px)rotateY(0)}to{opacity:1;transform:none}}@keyframes die-roll{0%{opacity:0;transform:translateY(-20vh)rotate(300deg)scale(.7)}50%{opacity:1;transform:translateY(7px)rotate(20deg)}62%{transform:translateY(-18px)rotate(-12deg)}72%{transform:translateY(0)rotate(0)}to{opacity:1;transform:none}}@keyframes die-pip-reveal{0%,72%{background:0 0}73%,to{background:var(--ink)}}@keyframes die-pip-scramble-111{0%,72%{opacity:1}73%,to{opacity:0}}@keyframes die-pip-scramble-011{0%,23%{opacity:0}24%,72%{opacity:1}73%,to{opacity:0}}@keyframes die-pip-scramble-101{0%,23%{opacity:1}24%,47%{opacity:0}48%,72%{opacity:1}73%,to{opacity:0}}@keyframes deck-card-spring-drop{0%{transform:translate(-50%, calc(-50% - var(--fall-start)))}82%{transform:translate(-50%, calc(-48% - var(--stack-y)))}to{transform:translate(-50%, calc(-50% - var(--stack-y)))}}@keyframes deck-card-fade{0%{opacity:0}to{opacity:1}}@keyframes deck-card-gather{0%{transform:translate(-50%, calc(-50% - var(--stack-y)))}to{transform:translate(-50%, calc(-50% - var(--gather-y)))}}@keyframes deck-show{to{opacity:1}}@keyframes deck-hide{to{opacity:0;visibility:hidden}}@keyframes deck-raise{to{z-index:3}}@keyframes deck-lower{to{z-index:2}}@keyframes deck-split-right{0%{transform:translate(-50%,-50%)rotate(0)}to{transform:translate(-20%,-50%)rotate(20deg)}}@keyframes deck-split-left{0%{transform:translate(-50%,-50%)rotate(0)}to{transform:translate(-80%,-50%)rotate(-20deg)}}@keyframes deck-join-right{0%{transform:translate(-20%,-50%)rotate(20deg)}to{transform:translate(-50%,-50%)rotate(0)}}@keyframes deck-join-left{0%{transform:translate(-80%,-50%)rotate(-20deg)}to{transform:translate(-50%,-50%)rotate(0)}}@keyframes deck-exit-left{0%{opacity:1;transform:translate(-50%,-50%)}to{opacity:0;transform:translate(calc(-50% - 60vw),-50%)}}@keyframes deck-exit-right{0%{opacity:1;transform:translate(-50%,-50%)}to{opacity:0;transform:translate(calc(60vw - 50%),-50%)}}@keyframes deck-caption{0%,92%{opacity:1}to{opacity:0}}@keyframes deck-overlay{0%,92%{opacity:1;visibility:visible}to{opacity:0;visibility:hidden}}@media (width<=600px){.choice-grid{grid-template-columns:1fr}.join-box{grid-row:auto}.game-card{flex-direction:column}.game-actions{min-width:0}.game-status{align-items:flex-start}.board{max-height:none}}@media (width>=850px) and (orientation:landscape){.play-layout{grid-template-columns:minmax(280px,620px) minmax(180px,1fr);align-items:center;column-gap:1.5rem;display:grid}.board{grid-row:1/span 3;margin:0}.game-status,.confirm-move,.hint,.rematch{grid-column:2}.game-status{display:block}.game-status button{margin-top:1rem}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important}.viewport-vignette{opacity:.3;animation:none}.effect-coin,.effect-die,.die-pip,.die-pip:before,.shuffle-card,.shuffle-caption{animation:none}.die-pip:before{display:none}.die-pip.is-on{background:var(--ink)}.deck-shuffle-overlay{visibility:visible;opacity:1;min-height:260px;margin-top:.75rem;position:relative;inset:auto}.spawn-card{opacity:0}.shuffle-card-a,.shuffle-card-b{opacity:1}.exit-band{display:none}}
