:root{--felt-center: #1a8060;--felt-edge: #0b3d2e;--felt-rim: #07261c;--gold: #e2c069;--gold-soft: #f1dca0;--gold-deep: #b8902f;--active: #ffd86b;--paper: #fbfaf6;--text: #f4f1e9;--text-dim: #c5d2c9;--text-mute: #8fa79a;--suit-red: #c8302b;--suit-black: #1b2230;--good: #5bd394;--panel: rgba(8, 28, 22, .82);--card-w: clamp(44px, min(6.6vw, 10vh), 92px);--card-h: calc(var(--card-w) * 1.4);--radius-sm: 9px;--ease: cubic-bezier(.22, 1, .36, 1);--ease-soft: cubic-bezier(.4, 0, .2, 1);--shadow-card: 0 6px 14px rgba(0, 0, 0, .35), 0 2px 4px rgba(0, 0, 0, .25);color-scheme:dark}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html,body,#root{height:100%}body{font-family:Inter,Segoe UI,system-ui,-apple-system,Helvetica Neue,Arial,sans-serif;-webkit-font-smoothing:antialiased;color:var(--text);background:#061a13;overflow:hidden;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}button{font-family:inherit;cursor:pointer;border:none;background:none;color:inherit}.numeric{font-variant-numeric:tabular-nums}.card{position:relative;width:var(--card-w);height:calc(var(--card-w) * 1.4);border-radius:var(--radius-sm);flex:0 0 auto;-webkit-user-drag:none}.card-face{width:100%;height:100%;border-radius:inherit;background:linear-gradient(150deg,#fff 0%,var(--paper) 55%,#f0ece0 100%);box-shadow:var(--shadow-card);border:1px solid rgba(0,0,0,.12);position:relative;overflow:hidden}.card-face:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;box-shadow:inset 0 1px 1px #ffffffe6,inset 0 -8px 18px #0000000a;pointer-events:none}.card.is-red .card-face{color:var(--suit-red)}.card.is-black .card-face{color:var(--suit-black)}.card-index{position:absolute;display:flex;flex-direction:column;align-items:center;line-height:.82;font-weight:800;letter-spacing:-.02em;z-index:2}.card-index .rank{font-size:calc(var(--card-w) * .22)}.card-index .pip{font-size:calc(var(--card-w) * .15)}.card-index.tl{top:calc(var(--card-w) * .07);left:calc(var(--card-w) * .08)}.card-index.br{bottom:calc(var(--card-w) * .07);right:calc(var(--card-w) * .08);transform:rotate(180deg)}.card-center{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:1;line-height:.9}.card-center .big-rank{font-size:calc(var(--card-w) * .42);font-weight:800;letter-spacing:-.04em}.card-center .big-suit{font-size:calc(var(--card-w) * .52);line-height:1}.card-back{width:100%;height:100%;border-radius:inherit;box-shadow:var(--shadow-card);border:1px solid rgba(0,0,0,.25);background:linear-gradient(135deg,#123e63,#0d2c49);position:relative;overflow:hidden}.card-back:before{content:"";position:absolute;inset:calc(var(--card-w) * .07);border-radius:calc(var(--radius-sm) - 3px);border:1.5px solid rgba(226,192,105,.55);background-image:radial-gradient(rgba(226,192,105,.45) 1.2px,transparent 1.3px),radial-gradient(rgba(226,192,105,.22) 1.2px,transparent 1.3px);background-size:calc(var(--card-w) * .2) calc(var(--card-w) * .2),calc(var(--card-w) * .2) calc(var(--card-w) * .2);background-position:0 0,calc(var(--card-w) * .1) calc(var(--card-w) * .1)}.card-back:after{content:"♠";position:absolute;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;font-size:calc(var(--card-w) * .42);color:#e2c069d9}.card.playable{cursor:pointer}.card.playable .card-face{outline:2px solid transparent;transition:outline-color .18s var(--ease-soft)}@media(hover:hover){.card.playable:hover .card-face{outline-color:var(--gold)}}.card.dim .card-face{filter:saturate(.5) brightness(.78)}.app{display:flex;flex-direction:column;height:100%;position:relative}.topbar{display:flex;align-items:center;gap:14px;padding:9px 16px;background:linear-gradient(180deg,#04120df2,#04120db3);border-bottom:1px solid rgba(226,192,105,.18);z-index:20}.topbar .brand{font-weight:800;letter-spacing:.01em;white-space:nowrap}.topbar .brand .mark{color:var(--gold)}.topbar .spacer{flex:1}.ctrls{display:flex;gap:8px}.ctrls button{height:34px;padding:0 12px;border-radius:10px;font-size:.86rem;font-weight:600;color:var(--text);border:1px solid rgba(226,192,105,.32);background:#e2c06914;transition:background .16s var(--ease-soft)}.ctrls button:hover{background:#e2c0692e}.ctrls button.on{background:#e2c06938;border-color:#e2c0698c}.ctrls button.icon{display:inline-flex;align-items:center;justify-content:center;width:40px;padding:0}.ctrls button.icon.on,.ctrls button.icon.invite{color:var(--gold-soft)}.invite-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;display:grid;place-items:center;padding:20px;background:#030c08a8;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.invite-panel{width:min(340px,100%);background:var(--panel);border:1px solid rgba(226,192,105,.28);border-radius:18px;padding:22px;text-align:center;box-shadow:0 18px 50px #00000080}.invite-panel h3{font-size:1.15rem;margin-bottom:4px}.invite-panel .dim{font-size:.82rem;margin-bottom:14px}.qr-frame{display:grid;place-items:center;margin-bottom:14px}.qr{width:220px;height:220px;border-radius:12px;background:var(--paper);box-shadow:0 4px 14px #00000059}.qr.ph{opacity:.25}.invite-link{margin-bottom:16px;word-break:break-all}.invite-link code{font-size:.78rem;color:var(--text-dim);background:#00000040;padding:6px 10px;border-radius:8px;display:inline-block}.invite-actions{display:flex;gap:10px;justify-content:center}.ghost{padding:10px 16px;border-radius:10px;font-weight:700;color:var(--text-dim);border:1px solid rgba(255,255,255,.14);background:#ffffff0d}.ghost:hover{background:#ffffff1a}.scan-link{display:inline-flex;align-items:center;justify-content:center;gap:8px;width:100%;margin-top:10px;padding:11px;border-radius:10px;font-size:.86rem;font-weight:600;color:var(--text-dim);border:1px solid rgba(226,192,105,.28);background:#e2c0690f}.scan-link:hover{background:#e2c06924;color:var(--text)}.scan-link svg{width:16px;height:16px}.scan-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:110;display:grid;place-items:center;padding:20px;background:#030c08d1}.scan-panel{width:min(360px,100%);background:var(--panel);border:1px solid rgba(226,192,105,.28);border-radius:18px;padding:20px;text-align:center;box-shadow:0 18px 50px #00000080}.scan-panel h3{margin-bottom:12px}.scan-stage{position:relative;width:100%;aspect-ratio:1;border-radius:14px;overflow:hidden;background:#000;margin-bottom:12px}.scan-video{width:100%;height:100%;object-fit:cover}.scan-reticle{position:absolute;top:18%;right:18%;bottom:18%;left:18%;border:3px solid rgba(242,193,78,.9);border-radius:16px;box-shadow:0 0 0 100vmax #00000040;pointer-events:none}.scan-panel .dim,.scan-panel .err{font-size:.82rem;margin-bottom:12px}.table-wrap{flex:1;position:relative;min-height:0;background:radial-gradient(120% 90% at 50% 40%,var(--felt-center) 0%,var(--felt-edge) 62%,var(--felt-rim) 100%);overflow:hidden}.table-wrap:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background-image:radial-gradient(rgba(255,255,255,.018) 1px,transparent 1px);background-size:3px 3px;pointer-events:none}.table-wrap:after{content:"";position:absolute;top:12px;right:12px;bottom:12px;left:12px;border-radius:48%/38%;border:10px solid transparent;box-shadow:inset 0 0 0 2px #e2c06929,0 0 60px #00000073 inset;pointer-events:none}.seat{position:absolute;display:flex;flex-direction:column;align-items:center;gap:6px;z-index:5}.seat-bottom{bottom:calc(var(--card-h) * 1.45 + 8px);left:50%;transform:translate(-50%)}.seat-top{top:14px;left:50%;transform:translate(-50%)}.seat-left{left:16px;top:42%;transform:translateY(-50%);align-items:flex-start}.seat-right{right:16px;top:42%;transform:translateY(-50%);align-items:flex-end}.seat-info{display:flex;align-items:center;gap:11px;padding:8px 14px 8px 8px;border-radius:999px;background:var(--panel);border:1px solid rgba(255,255,255,.06);box-shadow:0 6px 18px #00000059;transition:box-shadow .25s var(--ease),border-color .25s var(--ease)}.seat.is-turn .seat-info{border-color:var(--active);box-shadow:0 0 0 1px var(--active),0 0 22px #ffd86b66}.seat-av{width:clamp(42px,7.2vh,60px);height:clamp(42px,7.2vh,60px);border-radius:14px;overflow:hidden;flex:0 0 auto;display:grid;place-items:center;background:linear-gradient(150deg,var(--gold-soft),var(--gold-deep));color:#10231a;font-weight:800;font-size:1.25rem;box-shadow:inset 0 1px 2px #ffffff80}.seat-av.bot{background:linear-gradient(150deg,#2b4a3b,#16281f);color:#9fe7bd;font-size:1.4rem}.seat-av.away{opacity:.55;filter:grayscale(.4)}.seat-text .sub .ai-tag{color:var(--gold-soft);font-weight:700}.seat-av video{width:100%;height:100%;object-fit:cover}.seat-av video.mirror{transform:scaleX(-1)}.seat.speaking .seat-av{box-shadow:0 0 0 2px var(--good),0 0 14px #5bd39480}.seat-text{display:flex;flex-direction:column;line-height:1.15}.seat-text .name{font-weight:700;font-size:.98rem;max-width:9ch;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.seat-text .sub{font-size:.76rem;color:var(--text-mute)}.seat-text .sub .away{color:var(--warn, #ffcf66)}.seat-badges{display:flex;gap:5px;align-items:center}.badge{font-size:.72rem;font-weight:800;padding:2px 8px;border-radius:7px;background:#ffffff14;border:1px solid rgba(255,255,255,.1);white-space:nowrap}.badge.dealer{color:var(--text-dim)}.badge.tricks{background:#5bd3941f;border-color:#5bd3944d;color:var(--good)}.mini-fan{display:flex;height:calc(var(--card-w) * .66)}.mini-fan .mini-card{width:calc(var(--card-w) * .5);height:calc(var(--card-w) * .7);margin-left:calc(var(--card-w) * -.32);border-radius:5px;background:linear-gradient(135deg,#123e63,#0d2c49);border:1px solid rgba(226,192,105,.3);flex:0 0 auto}.mini-fan .mini-card:first-child{margin-left:0}.seat-left .mini-fan{justify-content:flex-start}.seat-right .mini-fan{justify-content:flex-end}.trick-area{position:absolute;left:50%;top:43%;transform:translate(-50%,-50%);width:calc(var(--card-w) * 3.6);height:calc(var(--card-h) * 2.5);z-index:6;pointer-events:none}.trick-slot{position:absolute;width:var(--card-w);height:var(--card-h);transition:all .2s var(--ease)}.trick-slot.at-top{left:50%;top:0;margin-left:calc(var(--card-w) / -2)}.trick-slot.at-bottom{left:50%;bottom:0;margin-left:calc(var(--card-w) / -2)}.trick-slot.at-left{left:0;top:50%;margin-top:calc(var(--card-h) / -2)}.trick-slot.at-right{right:0;top:50%;margin-top:calc(var(--card-h) / -2)}.trick-slot.winner .card-face{box-shadow:0 0 0 2px var(--active),0 0 26px #ffd86b99}.trump-tag{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);text-align:center;color:#fff6;pointer-events:none}.trump-tag .glyph{font-size:calc(var(--card-w) * .95);line-height:1}.trump-tag .glyph.red{color:#c8302bbf}.trump-tag .lbl{font-size:.62rem;letter-spacing:.18em;text-transform:uppercase}.hand-zone{position:absolute;bottom:0;left:0;right:0;display:flex;flex-direction:column;align-items:center;padding-bottom:6px;z-index:12}.hand-fan{--span: calc(1 + (var(--n, 13) - 1) * .7);--card-w: min(clamp(44px, min(8vw, 13vh), 116px), calc(95vw / var(--span)));--card-h: calc(var(--card-w) * 1.4);position:relative;display:flex;justify-content:center;align-items:flex-end;height:calc(var(--card-h) * 1.3);padding-top:calc(var(--card-h) * .22)}.hand-fan .card{transition:transform .18s var(--ease);transform-origin:bottom center}@media(hover:hover){.hand-fan .card.playable:hover{transform:translateY(calc(var(--card-h) * -.18)) rotate(0)!important;z-index:50!important}}.prompt{font-size:.8rem;color:var(--active);font-weight:700;padding-bottom:2px}.spectating{color:var(--text-dim);font-size:.9rem;padding:14px}.scoreboard{position:absolute;top:10px;right:12px;display:flex;gap:8px;z-index:8}.score{text-align:center;background:var(--panel);border:1px solid rgba(255,255,255,.08);border-radius:10px;padding:5px 11px;min-width:64px}.score.mine{border-color:#e2c0698c}.score-num{font-size:1.3rem;font-weight:800;color:var(--gold)}.score-label{font-size:.66rem;color:var(--text-dim);letter-spacing:.04em}.score-tricks{font-size:.62rem;color:var(--text-mute)}.banner{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:var(--panel);border:1px solid rgba(226,192,105,.3);border-radius:16px;padding:20px 26px;text-align:center;display:flex;flex-direction:column;gap:12px;align-items:center;z-index:15;box-shadow:0 18px 50px #00000080}.banner.subtle{background:#081c16b3;padding:12px 18px;font-size:.9rem}.banner .big{font-size:1.4rem;font-weight:800}.dim{color:var(--text-mute)}.primary{background:linear-gradient(180deg,var(--gold-soft),var(--gold-deep));color:#20180a;border-radius:10px;font-weight:800;padding:10px 18px;font-size:.95rem}.primary.big{width:100%;padding:13px;font-size:1.05rem}.primary:disabled{opacity:.6;cursor:default}.gate{min-height:100%;display:grid;place-items:center;padding:24px;background:radial-gradient(1200px 600px at 50% -10%,#1c3b2c,#061a13)}.card-panel{width:min(440px,100%);background:var(--panel);border:1px solid rgba(226,192,105,.22);border-radius:18px;padding:28px;box-shadow:0 18px 50px #00000080}.card-panel h1{margin:0 0 6px;font-size:30px}.on{color:var(--gold);font-weight:700}.sub-text{color:var(--text-dim);font-size:14px;line-height:1.5;margin:0 0 18px}.field{display:block;margin-bottom:14px}.field span{display:block;font-size:13px;color:var(--text-mute);margin-bottom:6px}.field input{width:100%;padding:12px;border-radius:10px;border:1px solid rgba(226,192,105,.28);background:#0f1813;color:var(--text);font-size:16px}.check{display:flex;align-items:center;gap:8px;font-size:14px;color:var(--text-dim);margin-bottom:18px}.err{color:#ff9b9b;font-size:13px}.room{margin:16px 0 0;font-size:12px;color:var(--text-mute)}.room code{color:var(--text-dim)}.debug{position:fixed;left:6px;bottom:6px;z-index:9999;background:#000c;color:#8f8;font:11px/1.4 ui-monospace,monospace;padding:6px 8px;border-radius:6px;pointer-events:none;white-space:nowrap}@media(max-width:680px){.seat-text .sub{display:none}.seat-info{gap:8px;padding:6px 11px 6px 6px}.seat-text .name{font-size:.85rem;max-width:6ch}}@media(orientation:portrait)and (max-width:560px){.seat-left{left:6px;top:34%}.seat-right{right:6px;top:34%}.seat-top{top:8px}.trick-area{top:40%}.seat-bottom{bottom:calc(var(--card-h) * 1.5 + 6px)}.scoreboard{top:8px;right:8px;flex-direction:column;gap:5px}}.kib-tag{font-weight:700;color:var(--gold-soft);background:#081c168c;border:1px solid rgba(226,192,105,.35);padding:5px 12px;border-radius:999px;font-size:.92rem;white-space:nowrap}.prompt.dim{color:var(--gold-soft);opacity:.85}.chat-panel{position:fixed;left:12px;bottom:12px;z-index:40;width:min(300px,78vw);max-height:min(46vh,420px);display:flex;flex-direction:column;background:var(--panel);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border:1px solid rgba(226,192,105,.28);border-radius:14px;box-shadow:0 10px 30px #00000073;overflow:hidden;color:var(--text)}.chat-head{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;font-weight:700;font-size:.86rem;color:var(--gold-soft);border-bottom:1px solid rgba(226,192,105,.18)}.chat-x{background:none;border:none;color:var(--text-mute);cursor:pointer;font-size:1rem;line-height:1;padding:2px 6px}.chat-log{flex:1;overflow-y:auto;padding:8px 10px;display:flex;flex-direction:column;gap:6px;scrollbar-width:thin}.chat-empty{color:var(--text-mute);font-size:.82rem;text-align:center;padding:10px 0}.chat-line{font-size:.86rem;line-height:1.35;word-break:break-word}.chat-who{font-weight:700;color:var(--text-dim);margin-right:6px}.chat-line.mine .chat-who{color:var(--good)}.chat-line.kib .chat-who{color:var(--gold)}.chat-line.kib{font-style:italic;color:var(--gold-soft)}.chat-input{display:flex;gap:6px;padding:8px;border-top:1px solid rgba(226,192,105,.18)}.chat-input input{flex:1;min-width:0;background:#00000047;border:1px solid rgba(226,192,105,.25);border-radius:8px;color:var(--text);padding:7px 9px;font-size:.86rem}.chat-input input:focus{outline:none;border-color:var(--gold)}.chat-input button{background:var(--gold-deep);color:#1a1205;font-weight:700;border:none;border-radius:8px;padding:0 12px;cursor:pointer;font-size:.84rem}.chat-input button:disabled{opacity:.5;cursor:default}.chat-fab{position:fixed;left:12px;bottom:12px;z-index:40;width:46px;height:46px;border-radius:50%;border:1px solid rgba(226,192,105,.35);background:var(--panel);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);color:var(--gold-soft);font-size:1.2rem;cursor:pointer;box-shadow:0 8px 22px #0006}.chat-badge{position:absolute;top:-4px;right:-4px;background:var(--suit-red);color:#fff;font-size:.62rem;font-weight:700;min-width:17px;height:17px;line-height:17px;border-radius:999px;padding:0 4px}
