:root{color-scheme:dark;--bg: #10211a;--bg-deep: #0b1712;--felt: #1d6b43;--felt-dark: #145233;--gold: #f0d59a;--ink: #17241c;--paper: #f7f1e6;--muted: #d5e6da;--line: rgba(240, 213, 154, .35);--you: #8fd0c4;--opp: #f0b59a;--danger: #ffb4a8;font-family:Avenir Next,Segoe UI,sans-serif}*{box-sizing:border-box}html,body,#root{min-height:100%}body{margin:0;background:radial-gradient(circle at top,rgba(240,213,154,.08),transparent 30%),var(--bg);color:var(--paper)}button,input,select{font:inherit;touch-action:manipulation}button{cursor:pointer}button:disabled{cursor:not-allowed;opacity:.55}button:focus-visible,input:focus-visible,select:focus-visible{outline:2px solid var(--gold);outline-offset:2px}.app{min-height:100dvh;display:flex;flex-direction:column}.topbar{display:flex;align-items:center;gap:12px;padding:12px 16px}.talk-menu{position:relative;margin-left:auto}.talk-panel{position:absolute;right:0;top:calc(100% + 8px);z-index:20;width:min(92vw,420px);display:flex;flex-direction:column;gap:8px;background:var(--bg-deep);border:1px solid var(--line);border-radius:16px;padding:14px;box-shadow:0 16px 40px #00000059}.talk-panel label{display:flex;gap:8px;align-items:center}.talk-panel fieldset{display:flex;flex-direction:column}.talk-panel .detail{color:var(--muted);font-size:12px;overflow-wrap:anywhere}.brand{font-family:Palatino,Iowan Old Style,Georgia,serif;font-size:28px;letter-spacing:.04em}.room-code{color:var(--gold);font-weight:700;letter-spacing:.12em}.connection{font-size:13px}.connection.live{color:var(--you)}.connection.down{color:var(--danger)}.banner,.toast,.booting{margin:0 16px 8px;padding:10px 12px;border-radius:12px}.banner,.booting{background:#3d3420;color:var(--gold)}.toast{border:0;background:#5a2b28;color:#fff;text-align:left}.primary,.secondary,.ghost,.suit-button,.camera-button,.text-button{border-radius:999px;min-height:44px;padding:10px 16px;border:1px solid transparent}.primary{background:var(--gold);color:var(--ink);font-weight:700}.secondary,.suit-button,.camera-button{background:transparent;color:var(--paper);border-color:var(--line)}.suit-button{display:inline-flex;align-items:center;gap:8px}.suit-icon{width:22px;height:22px;display:inline-flex}.suit-icon img{width:100%;height:100%;object-fit:contain}.ghost,.text-button{background:transparent;color:var(--gold);border-color:transparent}.home{padding:8px 16px 32px;max-width:1080px;margin:0 auto}.hero h1{margin:0;font-family:Palatino,Iowan Old Style,Georgia,serif;font-size:clamp(56px,8vw,92px);line-height:.9}.eyebrow{margin:0;color:var(--gold);letter-spacing:.14em;text-transform:uppercase;font-size:12px}.lede{max-width:62ch;color:var(--muted)}.mode-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.mode-card,.lobby-panel,.sheet{background:#08140fb8;border:1px solid var(--line);border-radius:20px;padding:18px}.mode-card h2{margin:0 0 8px;font-family:Palatino,Georgia,serif}.field{display:flex;flex-direction:column;gap:6px;margin:12px 0}.field input,.field select{min-height:44px;border-radius:12px;border:1px solid var(--line);background:#0e1b15;color:var(--paper);padding:8px 12px}.options{display:flex;flex-wrap:wrap;gap:12px}fieldset{border:1px solid var(--line);border-radius:12px;margin:0;padding:8px 12px}legend{color:var(--gold);padding:0 6px}fieldset label{display:flex;gap:8px;align-items:center;margin:6px 0}.join-row{display:flex;gap:8px;align-items:end}.join-row .field{flex:1}.table-screen{width:min(100%,1280px);margin:0 auto;padding:0 12px 20px;display:flex;flex-direction:column;gap:10px}.scoreboard{display:grid;grid-template-columns:1fr 1.4fr 1fr;gap:8px;text-align:center;background:#08140f8c;border:1px solid var(--line);border-radius:16px;padding:8px 14px 10px}.scoreboard strong{display:block;font-size:28px;line-height:1;font-family:Palatino,Georgia,serif}.scoreboard span,.scoreboard small{display:block;color:var(--muted)}.deal-score{color:var(--gold);font-weight:700}.score-center small{margin-top:4px}.felt{display:grid;grid-template-columns:132px minmax(0,1fr) 132px;grid-template-areas:"north north north" "west play east" "south south south";gap:10px;padding:14px;border-radius:46px;background:radial-gradient(ellipse at 50% 42%,rgba(255,255,255,.16),transparent 46%),radial-gradient(ellipse at center,#2c9b5e,#187046 58%,#0e4c2c);box-shadow:inset 0 0 0 3px #f0d59a80,inset 0 0 0 12px #4a2a129e,inset 0 20px 50px #ffffff0d,0 18px 36px #00000047}.felt:not(.is-lobby){grid-template-columns:118px minmax(0,1fr) 118px}.felt:not(.is-lobby){grid-template-rows:auto minmax(240px,1fr) auto;min-height:clamp(500px,54vw,640px)}.north{grid-area:north;display:flex;justify-content:center}.west,.east{display:flex;align-items:center;justify-content:center}.west{grid-area:west}.east{grid-area:east}.play{grid-area:play;min-width:0}.south{grid-area:south;display:flex;align-items:center;justify-content:center;gap:14px;min-height:0}.south-cards{display:flex;flex-direction:column;align-items:center;gap:8px;min-width:0;width:100%}.felt:not(.is-lobby) .south:has(.south-cards){display:grid;grid-template-columns:152px minmax(0,1fr) 152px;align-items:center}.felt:not(.is-lobby) .south:has(.south-cards)>.tile{width:140px;justify-self:start}.felt:not(.is-lobby) .south-cards{grid-column:2;width:auto}.felt:not(.is-lobby) .north .tile,.felt:not(.is-lobby) .west .tile,.felt:not(.is-lobby) .east .tile{width:112px;align-items:center}.felt:not(.is-lobby) .frame{width:72px;height:72px;aspect-ratio:1;border-radius:50%}.felt:not(.is-lobby) .meta{align-items:center;text-align:center}.felt:not(.is-lobby) .name-row{justify-content:center}.felt:not(.is-lobby) .devices,.felt:not(.is-lobby) .detail,.felt:not(.is-lobby) .badges,.felt:not(.is-lobby) .meta>span:not(.name-row){display:none}.felt:not(.is-lobby) .placeholder em{display:none}.felt:not(.is-lobby) .placeholder strong{font-size:18px}.felt:not(.is-lobby) .pos-bottom .frame{width:128px;height:128px;aspect-ratio:1}.felt:not(.is-lobby) .pos-bottom .placeholder strong{font-size:36px}.felt:not(.is-lobby) .pos-bottom .detail{display:block;font-size:11px;text-align:center}.felt:not(.is-lobby) .pos-bottom .camera-button{min-height:32px;padding:4px 8px;font-size:12px}.south .camera-button{white-space:nowrap}.tile{width:min(100%,190px);display:flex;flex-direction:column;gap:6px}.portrait{position:relative;width:100%;display:flex;justify-content:center}.frame{position:relative;width:132px;max-width:100%;aspect-ratio:1;border-radius:50%;overflow:hidden;background:#10241c;border:2px solid transparent}.team-you .frame{border-color:var(--you)}.team-opp .frame{border-color:var(--opp)}.is-turn .frame{box-shadow:0 0 0 3px var(--gold)}.pulse .frame{animation:pulse .8s ease}@keyframes pulse{50%{box-shadow:0 0 0 5px var(--gold)}}.frame video,.placeholder{width:100%;height:100%}.frame video{object-fit:cover}.mirror{transform:scaleX(-1)}.placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;background:linear-gradient(160deg,rgba(255,255,255,.05),transparent 40%),#163528}.placeholder strong{font-size:28px}.placeholder em{font-style:normal;color:var(--muted);font-size:12px}.turn-pill{position:absolute;left:8px;top:8px;z-index:2;background:var(--gold);color:var(--ink);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:700}.caller-badge{position:absolute;right:-4px;bottom:-4px;z-index:3;width:32px;height:32px;border-radius:50%;background:var(--paper);display:grid;place-items:center;box-shadow:0 2px 8px #00000059}.caller-badge img{width:18px;height:18px;object-fit:contain}.meta{font-size:13px;display:flex;flex-direction:column;gap:2px;min-width:0}.name-row{display:flex;align-items:center;gap:6px;min-width:0}.name-row span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.caller-inline{width:16px;height:16px;flex:0 0 auto;object-fit:contain}.meta strong,.devices,.detail{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devices,.detail{color:var(--muted)}.badges{display:flex;flex-wrap:wrap;gap:4px}.badges i{font-style:normal;border:1px solid var(--line);border-radius:999px;padding:1px 6px;font-size:11px}.seat-actions{display:flex;flex-direction:column;gap:4px}.camera-button,.seat-actions button,.text-button{width:100%}.trick-wrap{position:relative;display:flex;flex-direction:column;align-items:center;gap:6px;width:100%}.turn-line{margin:0;font-weight:700;display:flex;gap:8px;align-items:baseline}.turn-line.mine{color:var(--gold)}.clock{font-variant-numeric:tabular-nums;font-size:13px;color:var(--paper)}.declare-status{margin:0;color:var(--gold);text-align:center}.trump-mark{position:absolute;left:50%;top:50%;width:72px;height:72px;transform:translate(-50%,-50%);display:grid;place-items:center;pointer-events:none;z-index:0}.trump-mark img{width:64px;height:64px;object-fit:contain;filter:drop-shadow(0 2px 6px rgba(0,0,0,.45))}.phase-label{margin:0;color:var(--paper);font-size:12px}.trick{position:relative;width:100%;min-height:150px;container-type:inline-size}.trick.has-cards{height:250px}.trick-card{position:absolute;left:50%;top:50%;transform:translate3d(-50%,-50%,0) translate3d(var(--to-x),var(--to-y),0) rotate(var(--to-rot))}.trick-card .flight{transform-origin:center center}.trick-card .card{width:74px;height:104px;box-shadow:0 10px 18px #00000059}.trick-card.pos-bottom{--fly-x: 0px;--fly-y: 180px;--fly-rot: -8deg;--to-x: -8px;--to-y: 78px;--to-rot: -6deg}.trick-card.pos-top{--fly-x: 0px;--fly-y: -160px;--fly-rot: 8deg;--to-x: 8px;--to-y: -78px;--to-rot: 6deg}.trick-card.pos-left{--fly-x: -32cqw;--fly-y: 12px;--fly-rot: -14deg;--to-x: -46px;--to-y: 2px;--to-rot: -6deg}.trick-card.pos-right{--fly-x: 32cqw;--fly-y: -8px;--fly-rot: 12deg;--to-x: 46px;--to-y: -2px;--to-rot: 6deg}.flight.is-flying{animation:fly-card .64s cubic-bezier(.16,.84,.28,1) both;will-change:transform}@keyframes fly-card{0%{transform:translate3d(var(--fly-x),var(--fly-y),0) rotate(var(--fly-rot))}to{transform:translateZ(0) rotate(0)}}.previous-label{position:absolute;left:50%;top:6px;transform:translate(-50%);color:var(--gold);font-size:12px;letter-spacing:.08em;text-transform:uppercase;z-index:5}.latest{margin:0;text-align:center;min-height:1.3em;font-size:14px}.chips{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;padding:0;margin:0;list-style:none}.chips li{border:1px solid var(--line);border-radius:999px;padding:4px 8px;font-size:12px}.hand{display:flex;justify-content:center;align-items:flex-end;width:100%;min-height:132px;padding:22px 4px 6px}.fan-card{position:relative;margin-left:-50px;transition:transform .16s ease}.fan-card:first-child{margin-left:0}.fan-card .card{width:86px;height:120px}.hand .card.playable:hover,.hand .card.playable:focus-visible{transform:none}.fan-card:has(.playable):hover,.fan-card:has(.playable):focus-within{z-index:30;transform:translateY(-22px)}.felt:not(.is-lobby) .turn-pill{top:auto;bottom:4px;left:50%;transform:translate(-50%)}.backs{display:flex;justify-content:center;height:40px}.backs img{width:28px;height:40px;margin-left:-18px;border-radius:3px;box-shadow:0 2px 5px #00000059}.backs img:first-child{margin-left:0}.card.playable{transition:transform .16s ease}.hand.empty{color:var(--muted);display:block;text-align:center}.card{width:72px;height:104px;flex:0 0 auto;border:0;border-radius:7px;background:#fff;box-shadow:0 8px 16px #00000040;position:relative;padding:0;overflow:hidden}.card img{width:100%;height:100%;object-fit:contain;display:block;pointer-events:none}.card.dim{filter:saturate(.35);opacity:.72}.card.playable{cursor:pointer}.card.playable:hover,.card.playable:focus-visible{transform:translateY(-12px)}.actions{width:min(100%,720px);text-align:center}.actions p{margin:0 0 8px}.action-row,.decl-list{display:flex;flex-wrap:wrap;gap:8px;justify-content:center}.decl-option{display:flex;gap:8px;align-items:center;background:#0000002e;border-radius:12px;padding:8px 10px}.log{background:#0000002e;border-radius:16px;padding:8px 12px}.log ol{margin:8px 0 0;padding-left:18px;max-height:180px;overflow:auto}.log li+li{margin-top:4px}.rules ul{margin:8px 0 0;padding-left:18px;max-width:80ch}.rules li+li{margin-top:6px}.lobby-panel{max-width:460px;margin:12px auto;display:flex;flex-direction:column;gap:8px}.lobby-panel h2{margin:0;letter-spacing:.18em;font-size:40px}.block{color:var(--gold)}.sheet-back{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;display:grid;place-items:center;padding:16px;background:#060c098c}.sheet{position:relative;z-index:1;width:min(100%,640px);max-height:min(100dvh - 32px,760px);margin:0;overflow:auto;background:var(--bg-deep);box-shadow:0 16px 40px #00000059}.sheet h2{margin:0 0 8px;font-family:Palatino,Georgia,serif}.sheet dl{display:grid;grid-template-columns:1fr 1fr;gap:8px 16px;margin:12px 0}.sheet dt{color:var(--muted);font-size:13px}.sheet dd{margin:0;font-size:18px}.modal-back{position:fixed;top:0;right:0;bottom:0;left:0;z-index:30;display:grid;place-items:center;background:#060c099e;padding:16px}.modal{width:min(100%,420px);background:var(--bg-deep);color:var(--paper);border:1px solid var(--line);border-radius:18px;padding:20px;box-shadow:0 20px 50px #0006}.modal h2{margin:0 0 8px;font-family:Palatino,Georgia,serif}.modal p{margin:0 0 16px;line-height:1.4}.modal button{min-width:120px}@media(max-width:800px){.mode-grid{grid-template-columns:1fr}.felt.is-lobby{grid-template-columns:1fr 1fr;grid-template-areas:"north north" "west east" "play play" "south south"}.join-row{flex-direction:column;align-items:stretch}.felt{grid-template-columns:92px minmax(0,1fr) 92px;padding:8px}.card{width:58px;height:84px}.hand{min-height:108px;padding-top:16px}.fan-card{margin-left:-40px}.fan-card .card{width:70px;height:98px}.trick.has-cards{height:210px}.trump-mark,.trump-mark img{width:48px;height:48px}.trick-card .card{width:52px;height:74px}.trick-card.pos-bottom{--fly-y: 120px;--to-y: 48px}.trick-card.pos-top{--fly-y: -110px;--to-y: -48px}.trick-card.pos-left{--to-x: -34px}.trick-card.pos-right{--to-x: 34px}.scoreboard strong{font-size:26px}.topbar{padding-inline:10px}}@media(min-width:801px){.felt:not(.is-lobby){grid-template-columns:140px minmax(0,1fr) 140px;grid-template-areas:"north north north" "west play east" "south south south";padding:16px 22px}}@media(max-width:680px){.table-screen{padding:0 8px 12px;gap:6px}.topbar{padding:8px;gap:8px}.brand{font-size:22px}.scoreboard{grid-template-columns:1fr 1.15fr 1fr;gap:4px}.scoreboard{align-items:start}.scoreboard>div{min-width:0}.scoreboard strong{font-size:22px}.scoreboard span,.scoreboard small{font-size:11px;line-height:1.25}.score-center small+small{display:none}.felt:not(.is-lobby){grid-template-columns:72px minmax(0,1fr) 72px;gap:6px;padding:8px;border-radius:28px}.felt:not(.is-lobby) .north .tile,.felt:not(.is-lobby) .west .tile,.felt:not(.is-lobby) .east .tile{width:64px}.felt:not(.is-lobby) .frame{width:48px;height:48px}.felt:not(.is-lobby) .placeholder strong{font-size:13px}.felt:not(.is-lobby) .backs{height:28px}.felt:not(.is-lobby) .backs img{width:18px;height:26px;margin-left:-12px}.felt:not(.is-lobby) .south:has(.south-cards){grid-template-columns:96px minmax(0,1fr);gap:8px}.felt:not(.is-lobby) .south:has(.south-cards)>.tile{width:92px}.felt:not(.is-lobby) .pos-bottom .frame{width:84px;height:84px}.felt:not(.is-lobby) .pos-bottom .placeholder strong{font-size:26px}.felt:not(.is-lobby) .pos-bottom .camera-button{min-height:28px;padding:2px 4px;font-size:11px}.felt:not(.is-lobby) .south-cards{width:auto}.hand{min-height:92px;padding:14px 0 2px}.fan-card{margin-left:-34px}.fan-card .card{width:58px;height:82px}.trick{min-height:120px}.trick.has-cards{height:188px}.trump-mark,.trump-mark img{width:36px;height:36px}.trick-card .card{width:44px;height:62px}.trick-card.pos-bottom{--fly-y: 90px;--to-y: 36px}.trick-card.pos-top{--fly-y: -80px;--to-y: -36px}.trick-card.pos-left{--to-x: -26px}.trick-card.pos-right{--to-x: 26px}.latest{min-height:0;font-size:13px}.actions{width:100%}.log ol{max-height:120px}}@media(prefers-reduced-motion:reduce){.pulse .frame,.card.playable:hover,.fan-card:hover{animation:none;transform:none}.flight.is-flying{animation:none}}
