*{margin:0;padding:0;box-sizing:border-box}:root{--felt-green: #237a48;--felt-dark: #1a6035;--felt-border: #0d3d22;--card-white: #f5f0e8;--card-shadow: rgba(0,0,0,.3);--gold: #d4a843;--red: #c0392b;--blue: #2471a3;--vulnerable: #c0392b;--active: #f1c40f;--card-h: min(182px, calc(13vw + 10px) );--card-w: calc(var(--card-h) * .715);--card-h-small: min(119px, calc((6vw + 22px)*1.4) );--card-w-small: min(85px, calc(6vw + 22px) );--dummy-card-h: min(147px, calc((8vw + 18px)*1.4) );--dummy-card-w: min(105px, calc(8vw + 18px) );--fan-spread: 60deg;--fan-pivot: 180%;--fan-bottom: calc(var(--card-h) * .3);--fan-width: calc(var(--card-h) * 2 + var(--card-w));--fan-height: calc(var(--card-h) * 1.35)}body{font-family:Segoe UI,system-ui,-apple-system,sans-serif;background:#0a0a0a;color:#eee;overflow:hidden;height:100vh;height:100dvh}#root{height:100vh;height:100dvh}.app{height:100vh;height:100dvh;display:flex;flex-direction:column}.connecting,.loading{display:flex;align-items:center;justify-content:center;flex-direction:column;flex:1;font-size:1.2rem;color:var(--gold)}.logo h1{font-size:2.5rem;color:var(--gold)}.logo p{color:#aaa;margin-top:.5rem}.lobby-screen{background:linear-gradient(135deg,var(--felt-dark),var(--felt-green));display:flex;align-items:center;justify-content:center}.lobby{background:#0009;border-radius:16px;padding:2.5rem;width:400px;max-width:95vw;border:2px solid var(--gold)}.lobby h1{text-align:center;color:var(--gold);font-size:2rem;margin-bottom:.25rem}.subtitle{text-align:center;color:#aaa;margin-bottom:1.5rem;font-size:.9rem}.form-group{margin-bottom:1.25rem}.form-group label{display:block;margin-bottom:.4rem;font-size:.85rem;color:#ccc;text-transform:uppercase;letter-spacing:1px}.form-group input{width:100%;padding:.7rem 1rem;border:2px solid #444;border-radius:8px;background:#1a1a1a;color:#fff;font-size:1rem;outline:none;transition:border-color .2s}.form-group input:focus{border-color:var(--gold)}.seat-picker{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.seat-btn{padding:.6rem;border:2px solid #444;border-radius:8px;background:#1a1a1a;color:#ccc;font-size:.95rem;cursor:pointer;transition:all .2s}.seat-btn:hover{border-color:var(--gold);color:#fff}.seat-btn.selected{border-color:var(--gold);background:#d4a84333;color:var(--gold);font-weight:700}.join-btn{width:100%;padding:.8rem;border:none;border-radius:8px;background:var(--gold);color:#000;font-size:1.1rem;font-weight:700;cursor:pointer;transition:opacity .2s;margin-top:.5rem}.join-btn:disabled{opacity:.4;cursor:not-allowed}.join-btn:hover:not(:disabled){opacity:.9}.preset-players{display:grid;grid-template-columns:1fr 1fr;gap:.75rem;margin-bottom:1rem}.preset-player-btn{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.2rem;padding:1rem .75rem;min-height:86px;border:2px solid #444;border-radius:10px;background:#1a1a1a;color:#ddd;cursor:pointer;transition:all .2s;font-family:inherit}.preset-player-btn:hover:not(:disabled){border-color:var(--gold);background:#d4a8431a;color:#fff;transform:translateY(-1px)}.preset-player-btn .preset-name{font-size:1.15rem;font-weight:700;color:var(--gold)}.preset-player-btn .preset-seat{font-size:.75rem;text-transform:uppercase;letter-spacing:1px;color:#aaa}.preset-player-btn .preset-status{font-size:.7rem;color:#888;margin-top:.25rem;font-style:italic;text-align:center}.preset-player-btn.occupied{opacity:.5;cursor:not-allowed;border-color:#333}.preset-player-btn.self{border-color:#2ecc71;background:#2ecc7114}.preset-player-btn.self .preset-name{color:#2ecc71}.preset-player-btn.bot-sitting{border-color:#8e44ad;background:#8e44ad14}.preset-player-btn:disabled{cursor:not-allowed}.lobby-hint{text-align:center;color:#888;font-size:.85rem;margin-top:.5rem;line-height:1.4}.error-msg{color:var(--red);text-align:center;margin-bottom:.75rem;font-size:.9rem}.game-screen{background:var(--felt-green);background-image:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,0,0,.03) 2px,rgba(0,0,0,.03) 4px),repeating-linear-gradient(115deg,transparent,transparent 3px,rgba(255,255,255,.015) 3px,rgba(255,255,255,.015) 5px),repeating-linear-gradient(45deg,transparent,transparent 1px,rgba(0,0,0,.02) 1px,rgba(0,0,0,.02) 2px),radial-gradient(ellipse at center,var(--felt-green) 0%,var(--felt-dark) 100%)}.table:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;background:radial-gradient(ellipse at 30% 40%,rgba(255,255,255,.04) 0%,transparent 60%),radial-gradient(ellipse at 70% 60%,rgba(0,0,0,.06) 0%,transparent 50%);pointer-events:none;z-index:0}.table:after{content:"";position:absolute;top:0;left:0;right:0;bottom:0;box-shadow:inset 0 0 80px #0006,inset 0 0 20px #0003;pointer-events:none;z-index:1;border-radius:0}.top-bar{display:flex;justify-content:space-between;align-items:center;padding:.6rem 1.2rem;background:#0009;border-bottom:1px solid rgba(255,255,255,.1);z-index:10;flex-shrink:0}.game-info{display:flex;gap:1.2rem;font-size:1rem}.game-code{color:var(--gold);font-weight:700}.deal-info{color:#ccc}.vul-info{color:#8f8}.vul-info.vul{color:var(--red);font-weight:700}.contract-info{color:#fff;font-weight:700;font-size:1.05rem}.tricks-info{color:#bbb;font-size:.95rem}.score-btn{padding:.5rem 1.2rem;border:1px solid var(--gold);border-radius:6px;background:transparent;color:var(--gold);font-size:1rem;cursor:pointer}.score-btn:hover{background:#d4a84333}.table{flex:1;position:relative;overflow:hidden}.player-position{position:absolute;z-index:5}.pos-bottom{bottom:calc(var(--fan-height) + 20px);left:50%;transform:translate(-50%)}.seat-N:not(.plays-both) .pos-bottom,.seat-E:not(.plays-both) .pos-bottom,.seat-W:not(.plays-both) .pos-bottom{bottom:20px}.pos-top{top:8px;left:50%;transform:translate(-50%)}.pos-left{left:8px;top:50%;transform:translateY(-50%)}.pos-right{right:8px;top:50%;transform:translateY(-50%)}.player-info{background:#000000a6;padding:.5rem 1rem;border-radius:10px;display:flex;flex-direction:column;align-items:center;gap:.2rem;min-width:110px;border:2px solid transparent;transition:border-color .3s}.player-info.active-turn{border-color:var(--active);box-shadow:0 0 16px #f1c40f80}.player-info.vulnerable{background:#8c141480}.player-name{font-weight:700;font-size:1.05rem}.player-seat{font-size:.8rem;color:#aaa;text-transform:uppercase}.dealer-badge{background:var(--gold);color:#000;font-size:.75rem;font-weight:700;padding:.15rem .45rem;border-radius:4px}.hcp-badge{background:#ffffff26;padding:.15rem .5rem;border-radius:4px;font-size:.8rem;color:var(--gold)}.card-count{font-size:.75rem;color:#888}.center-area{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:3;width:620px;max-width:90vw}.waiting-area{text-align:center;background:#0009;border-radius:14px;padding:2rem;border:1px solid var(--gold)}.waiting-area h2{color:var(--gold);margin-bottom:1.2rem;font-size:1.6rem}.seated-list{display:grid;grid-template-columns:1fr 1fr;gap:.6rem;margin-bottom:1.2rem}.seat-status{padding:.6rem;background:#0006;border-radius:8px;font-size:1.05rem}.seat-status.filled{color:#8f8}.waiting-actions{display:flex;gap:.6rem;justify-content:center;flex-wrap:wrap}.start-btn,.next-btn{padding:.85rem 2.5rem;border:none;border-radius:10px;background:var(--gold);color:#000;font-size:1.15rem;font-weight:700;cursor:pointer;margin:.3rem}.start-btn:hover,.next-btn:hover{opacity:.9}.bidding-area{text-align:center}.bidding-history{margin-bottom:1rem;background:#00000080;border-radius:10px;padding:1rem}.bidding-history table{width:100%;border-collapse:collapse;font-size:1.05rem}.bidding-history th{color:var(--gold);padding:.4rem .6rem;border-bottom:1px solid rgba(255,255,255,.2);font-size:1.1rem}.bidding-history td{padding:.4rem .6rem;text-align:center}.pass-bid{color:#888}.bidding-box{background:#000000b3;border-radius:12px;padding:1.2rem;border:1px solid rgba(255,255,255,.15)}.bidding-box h3{color:var(--gold);margin-bottom:.85rem;font-size:1.05rem}.bid-grid{display:flex;flex-direction:column;gap:4px;margin-bottom:.85rem}.bid-row{display:flex;gap:4px;justify-content:center}.bid-btn{width:68px;height:48px;border:1px solid #555;border-radius:6px;background:#2a2a2a;color:#fff;font-size:1rem;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:2px;transition:all .15s}.bid-btn:hover:not(:disabled){background:#3a3a3a;border-color:var(--gold)}.bid-btn.disabled,.bid-btn:disabled{opacity:.25;cursor:not-allowed}.bid-level{font-weight:700;font-size:1.05rem}.bid-suit-sym{font-size:1.5rem;line-height:1}.bid-suit-sym.suit-red{color:#e74c3c}.bid-suit-sym.suit-black{color:#f0f0f0}.bid-suit-sym.suit-nt{color:#a8c8ff;font-size:1.1rem}.suit-red{color:#e74c3c;font-size:1.1em}.suit-black{color:#f0f0f0;font-size:1.1em}.hist-pass{color:#888}.hist-dbl{color:#e74c3c;font-weight:700}.hist-rdbl{color:#a569bd;font-weight:700}.hist-bid{font-weight:700;color:#fff}.bid-actions{display:flex;gap:.6rem;justify-content:center}.bid-action{padding:.6rem 1.5rem;border:none;border-radius:8px;font-size:1.05rem;font-weight:700;cursor:pointer}.bid-action.pass{background:#27ae60;color:#fff}.bid-action.double{background:#e74c3c;color:#fff}.bid-action.redouble{background:#8e44ad;color:#fff}.bid-action.disabled,.bid-action:disabled{opacity:.3;cursor:not-allowed}.waiting-bid{color:#aaa;font-style:italic;margin-top:.85rem;font-size:1.05rem}.trick-area-overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:3;pointer-events:none}.trick-info{position:absolute;top:60px;left:50%;transform:translate(-50%);text-align:center;pointer-events:none;background:#0000008c;padding:.4rem 1.2rem;border-radius:8px;z-index:4}.contract-display{margin-bottom:.3rem;font-size:1.2rem}.contract-text{color:var(--gold);font-weight:700;font-size:1.5rem}.contract-by{color:#ccc;font-size:1rem}.trick-count{display:flex;justify-content:center;gap:1.5rem;font-size:1rem;color:#ccc}.tricks-ns,.tricks-ew{font-weight:700}.trick-card-spread{position:absolute;transition:all .3s ease;pointer-events:none}.trick-pos-bottom{bottom:22%;left:50%;transform:translate(-50%)}.trick-pos-top{top:16%;left:50%;transform:translate(-50%)}.trick-pos-left{top:50%;left:22%;transform:translate(-50%,-50%)}.trick-pos-right{top:50%;right:22%;transform:translate(50%,-50%)}.trick-winner{filter:drop-shadow(0 0 10px rgba(46,204,113,.9))}.trick-winner .card{border:2px solid #2ecc71;box-shadow:0 0 14px #2ecc7199}.card{width:var(--card-w);height:var(--card-h);background:var(--card-white);border-radius:8px;position:relative;box-shadow:1px 2px 6px var(--card-shadow);-webkit-user-select:none;user-select:none;flex-shrink:0}.card.small{width:var(--card-w-small);height:var(--card-h-small)}.card.red{color:#c0392b}.card.black{color:#1a1a1a}.card.face-down{background:linear-gradient(135deg,#1a3a6b,#2c5aa0);border:2px solid #3d6db5;background-image:linear-gradient(135deg,#1a3a6b 25%,transparent 25%),linear-gradient(225deg,#1a3a6b 25%,transparent 25%),linear-gradient(315deg,#1a3a6b 25%,transparent 25%),linear-gradient(45deg,#1a3a6b 25%,transparent 25%);background-size:10px 10px}.card.playable{box-shadow:0 0 8px #f1c40f99,1px 2px 4px var(--card-shadow);border:2px solid var(--active)}.card.clickable{cursor:pointer}.card.clickable:hover{transform:translateY(-8px);box-shadow:0 6px 16px var(--card-shadow)}.card-corner{position:absolute;display:flex;flex-direction:column;align-items:center;line-height:1}.top-left{top:5px;left:6px}.bottom-right{bottom:5px;right:6px;transform:rotate(180deg)}.card-rank{font-size:1.75rem;font-weight:700}.card-suit{font-size:1.65rem}.card-center{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.card-suit-large{font-size:4rem}.card.small .card-rank{font-size:1.15rem}.card.small .card-suit{font-size:.95rem}.card.small .card-suit-large{font-size:2.25rem}.hand{position:absolute;z-index:4}.hand-bottom{bottom:10px;left:50%;transform:translate(-50%)}.hand-top{top:120px;left:50%;transform:translate(-50%)}.hand-left{left:140px;top:50%;transform:translateY(-50%)}.hand-right{right:140px;top:50%;transform:translateY(-50%)}.hand-cards{display:flex;gap:0}.hand:not(.hand-fan) .hand-card-slot{display:contents}.hand-fan .hand-cards{position:relative;display:block;width:var(--fan-width);height:var(--fan-height);margin:0 auto}.hand-fan .hand-card-slot{position:absolute;left:50%;bottom:var(--fan-bottom);margin-left:calc(var(--card-w) / -2);transform-origin:50% var(--fan-pivot);transform:rotate(calc((var(--card-idx) - (var(--card-count) - 1) / 2) * var(--fan-spread) / max(var(--card-count) - 1,1)));transition:transform .25s ease}.hand-top:not(.hand-fan) .hand-cards .card,.hand-top:not(.hand-fan) .hand-cards .card.small{width:min(85px,calc(6vw + 22px));height:min(119px,calc((6vw + 22px)*1.4));flex-shrink:0}.hand-top:not(.hand-fan) .hand-cards .hand-card-slot+.hand-card-slot .card,.hand-top:not(.hand-fan) .hand-cards .hand-card-slot+.hand-card-slot .card.small{margin-left:-6vw}@media (min-width: 833px){.hand-top:not(.hand-fan) .hand-cards .hand-card-slot+.hand-card-slot .card,.hand-top:not(.hand-fan) .hand-cards .hand-card-slot+.hand-card-slot .card.small{margin-left:-50px}}.hand-left:not(.hand-fan) .hand-cards,.hand-right:not(.hand-fan) .hand-cards{flex-direction:column}.hand-left:not(.hand-fan) .hand-cards .card,.hand-right:not(.hand-fan) .hand-cards .card{margin-left:0}.hand-left:not(.hand-fan) .hand-cards .hand-card-slot+.hand-card-slot .card,.hand-right:not(.hand-fan) .hand-cards .hand-card-slot+.hand-card-slot .card{margin-top:-65px}.hand-fan.hand-top .hand-card-slot{top:var(--fan-bottom);bottom:auto;transform-origin:50% -80%}.hand-fan.hand-top .card .bottom-right{transform:none}.dummy-label{text-align:center;color:var(--gold);font-size:.85rem;font-weight:700;text-transform:uppercase;letter-spacing:1px;margin-bottom:6px;background:#00000080;padding:2px 8px;border-radius:4px;display:inline-block}.dummy-hand .card.playable{border-color:#2ecc71;box-shadow:0 0 8px #2ecc7180}.dummy-grid{text-align:center}.dummy-grid .dummy-columns{display:flex;flex-direction:row;gap:8px;align-items:flex-start}.dummy-grid .card.small{width:var(--dummy-card-w);height:var(--dummy-card-h)}.dummy-grid .card.small .card-rank{font-size:1.25rem}.dummy-grid .card.small .card-suit{font-size:1rem}.dummy-grid .card.small .card-suit-large{font-size:2.5rem}.dummy-grid .dummy-column{display:flex;flex-direction:column;align-items:center;min-height:var(--dummy-card-h);min-width:var(--dummy-card-w)}.dummy-grid .dummy-slot{margin-top:calc(var(--dummy-card-h) * -.7)}.dummy-grid .dummy-column .dummy-slot:first-child{margin-top:0}.dummy-grid .dummy-empty{width:var(--dummy-card-w);height:calc(var(--dummy-card-h) * .35);color:#fff6;font-size:1.4rem;display:flex;align-items:center;justify-content:center}.hand-top.dummy-grid{top:70px;left:50%;transform:translate(-50%)}.hand-left.dummy-grid{left:16px;top:50%;transform:translateY(-50%)}.hand-right.dummy-grid{right:16px;left:auto;top:50%;transform:translateY(-50%)}.play-status{text-align:center;pointer-events:none}.status-your-turn{background:#2ecc7140;border:2px solid #2ecc71;border-radius:12px;padding:.8rem 1.6rem;color:#2ecc71;font-size:1.3rem;font-weight:700;display:flex;flex-direction:column;align-items:center;gap:.3rem;animation:pulseGlow 1.5s ease-in-out infinite}.status-dummy{background:#0009;border:1px solid var(--gold);border-radius:12px;padding:.8rem 1.6rem;color:var(--gold);font-size:1.2rem;display:flex;flex-direction:column;align-items:center;gap:.3rem}.status-sub{font-size:.95rem;color:#aaa;font-weight:400}.dummy-progress{display:flex;flex-direction:column;gap:.2rem;margin-top:.5rem;padding-top:.5rem;border-top:1px solid rgba(255,255,255,.15);font-size:.9rem;color:#ccc}.dummy-tricks-display{font-weight:700;color:#fff;font-size:1rem}.dummy-target{font-size:.85rem;color:var(--gold)}.status-icon{font-size:1.6rem}.status-waiting{color:#ccc;font-style:italic;font-size:1.1rem}@keyframes pulseGlow{0%,to{box-shadow:0 0 8px #2ecc714d}50%{box-shadow:0 0 20px #2ecc7199}}.seat-S.phase-playing .center-area{top:auto;bottom:calc(var(--fan-height) + 120px);transform:translate(-50%)}.seat-N.phase-playing .center-area,.seat-E.phase-playing .center-area,.seat-W.phase-playing .center-area{top:50%;bottom:auto;transform:translate(-50%,-50%)}.hand-complete,.round-complete{text-align:center;background:#000000b3;border-radius:14px;padding:2rem;border:1px solid var(--gold)}.hand-complete h2,.round-complete h2{color:var(--gold);margin-bottom:1rem;font-size:1.5rem}.hand-result{margin-bottom:1.2rem}.result-contract{font-size:1.4rem;font-weight:700;color:#fff}.result-tricks{color:#ccc;margin:.4rem 0;font-size:1.1rem}.result-score{color:var(--gold);font-weight:700;font-size:1.2rem}.round-totals{margin:1.2rem 0;padding:1rem;background:#ffffff0d;border-radius:10px}.round-totals h3{color:#ccc;margin-bottom:.6rem;font-size:1.05rem}.total{font-size:1.3rem;font-weight:700}.score-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:#000c;display:flex;align-items:center;justify-content:center;z-index:100}.score-sheet{background:#1a1a1a;border-radius:12px;padding:1.5rem;border:2px solid var(--gold);min-width:400px;max-width:95vw;max-height:80vh;overflow-y:auto}.score-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem}.score-header h2{color:var(--gold)}.close-btn{background:none;border:none;color:#888;font-size:1.5rem;cursor:pointer}.close-btn:hover{color:#fff}.score-table{width:100%;border-collapse:collapse;font-size:.85rem}.score-table th{color:var(--gold);padding:.5rem;border-bottom:2px solid #444;text-align:center}.score-table td{padding:.4rem .5rem;text-align:center;border-bottom:1px solid #333}.score-table tr.round-end td{border-bottom:2px solid var(--gold)}.score-table .positive{color:#2ecc71;font-weight:700}.total-row td{border-top:2px solid var(--gold);font-weight:700;padding-top:.6rem}.total-score{color:var(--gold);font-size:1.1rem}.individual-scores{margin-top:1.2rem;padding-top:1rem;border-top:2px solid var(--gold)}.individual-scores h3{color:var(--gold);font-size:1.1rem;margin-bottom:.7rem;text-align:center}.individual-grid{display:flex;flex-direction:column;gap:.4rem}.individual-row{display:flex;align-items:center;gap:.5rem;padding:.5rem .8rem;background:#ffffff0d;border-radius:8px;font-size:1rem}.individual-row.leader{background:#d4a84326;border:1px solid rgba(212,168,67,.4)}.individual-rank{color:#888;font-weight:700;width:1.5rem}.individual-row.leader .individual-rank{color:var(--gold)}.individual-name{flex:1;font-weight:700;color:#fff}.individual-seat{color:#888;font-size:.85rem}.individual-score{font-weight:700;font-size:1.1rem;color:var(--gold);min-width:50px;text-align:right}.error-toast{position:fixed;bottom:20px;left:50%;transform:translate(-50%);background:#c0392be6;color:#fff;padding:.6rem 1.5rem;border-radius:8px;z-index:200;animation:fadeInOut 3s ease forwards}@keyframes fadeInOut{0%{opacity:0;transform:translate(-50%) translateY(10px)}10%{opacity:1;transform:translate(-50%) translateY(0)}80%{opacity:1}to{opacity:0}}.deal-review-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:#000000d9;display:flex;align-items:center;justify-content:center;z-index:90;overflow-y:auto;padding:1rem}.deal-review{background:#1a1a1a;border-radius:14px;padding:1.5rem 2rem;border:2px solid var(--gold);max-width:750px;width:100%;max-height:95vh;overflow-y:auto}.deal-review h2{text-align:center;color:var(--gold);font-size:1.6rem;margin-bottom:.8rem}.review-result{text-align:center;background:#ffffff0d;border-radius:10px;padding:.8rem 1rem;margin-bottom:1.2rem;display:flex;flex-direction:column;gap:.3rem}.review-contract{font-size:1.3rem;font-weight:700;color:#fff}.review-tricks{color:#ccc;font-size:1.05rem}.review-score{color:var(--gold);font-weight:700;font-size:1.15rem}.review-passed-out{color:#888;font-size:1.2rem;font-style:italic}.review-content{display:flex;gap:1.5rem;align-items:flex-start}.review-hands-compass{flex:1;display:flex;flex-direction:column;align-items:center;gap:.4rem}.compass-top,.compass-bottom{display:flex;justify-content:center}.compass-middle{display:flex;align-items:center;gap:.5rem;width:100%;justify-content:center}.compass-center-spacer{width:40px;flex-shrink:0}.review-hand{background:#ffffff0f;border-radius:10px;padding:.6rem .9rem;min-width:140px}.review-hand-header{display:flex;align-items:center;gap:.5rem;margin-bottom:.4rem;flex-wrap:wrap}.review-seat-name{font-weight:700;font-size:1rem;color:#fff}.review-seat-label{font-size:.8rem;color:#888}.review-hcp{font-size:.8rem;color:var(--gold);background:#d4a84326;padding:.1rem .4rem;border-radius:4px}.review-badge{font-size:.7rem;font-weight:700;padding:.1rem .4rem;border-radius:4px;text-transform:uppercase}.review-badge.dealer-badge{background:var(--gold);color:#000}.review-badge.declarer-badge{background:#2ecc71;color:#000}.review-badge.dummy-badge-tag{background:#3498db;color:#fff}.review-hand-suits{display:flex;flex-direction:column;gap:.15rem}.review-suit-row{display:flex;align-items:center;gap:.4rem;font-size:1rem}.review-suit-symbol{font-size:1.15rem;width:1.2rem;text-align:center;flex-shrink:0}.review-suit-symbol.red{color:#e74c3c}.review-suit-symbol.black{color:#ddd}.review-suit-cards{color:#ccc;font-family:Courier New,monospace;font-size:.95rem;letter-spacing:1px}.review-bidding-section{flex-shrink:0;min-width:200px}.review-bidding-section h3{color:var(--gold);text-align:center;margin-bottom:.5rem;font-size:1rem}.review-analysis{margin:1rem 0;padding:1rem;background:#8e44ad1a;border:1px solid rgba(142,68,173,.3);border-radius:10px}.review-analysis h3{color:#a569bd;text-align:center;margin-bottom:.6rem;font-size:1rem}.analysis-loading{text-align:center;color:#a569bd;font-style:italic;animation:pulse 1.5s ease-in-out infinite}@keyframes pulse{0%,to{opacity:.5}50%{opacity:1}}.analysis-best-contract{color:var(--gold);font-weight:700;font-size:1.05rem;margin-bottom:.6rem;padding:.5rem .8rem;background:#d4a8431a;border-left:3px solid var(--gold);border-radius:4px;line-height:1.5}.analysis-text{color:#ddd;line-height:1.6;font-size:.95rem;white-space:pre-wrap}.review-standings{margin:1rem 0;padding:.8rem;background:#ffffff0d;border-radius:10px}.review-standings h3{color:var(--gold);text-align:center;margin-bottom:.5rem;font-size:1rem}.review-standings-list{display:flex;flex-direction:column;gap:.3rem}.review-standing-row{display:flex;align-items:center;gap:.5rem;padding:.35rem .6rem;border-radius:6px}.review-standing-row.leader{background:#d4a84326}.standing-rank{color:#888;font-weight:700;width:1.5rem}.review-standing-row.leader .standing-rank{color:var(--gold)}.standing-name{flex:1;color:#ccc;font-size:.95rem}.standing-score{font-weight:700;color:var(--gold);font-size:1.05rem}.review-actions{display:flex;gap:.8rem;justify-content:center;margin-top:1.2rem;flex-wrap:wrap}.review-btn{padding:.7rem 1.8rem;border:none;border-radius:10px;font-size:1.05rem;font-weight:700;cursor:pointer;transition:opacity .2s}.review-btn:hover{opacity:.9}.review-btn.next-btn{background:var(--gold);color:#000}.review-btn.analyse-btn{background:#8e44ad;color:#fff;border:1px solid #a569bd}.review-btn.analyse-btn:hover{background:#9b59b6}.review-btn.replay-btn{background:#2c3e50;color:#d4a843;border:1px solid #4a6278}.review-btn.replay-btn:hover{background:#34495e}.replay-badge{display:inline-block;background:#2c3e50;color:#d4a843;font-size:.65rem;font-weight:400;padding:.15rem .5rem;border-radius:6px;border:1px solid #4a6278;vertical-align:middle;margin-left:.5rem;letter-spacing:.5px;text-transform:uppercase}.last-trick-btn{padding:.3rem .7rem;border:1px solid var(--gold);border-radius:6px;background:#d4a84326;color:var(--gold);font-size:.8rem;cursor:pointer;transition:background .2s}.last-trick-btn:hover{background:#d4a8434d}.last-trick-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#000000a6;z-index:200;display:flex;align-items:center;justify-content:center}.last-trick-modal{background:#1a1a2e;border:2px solid var(--gold);border-radius:14px;padding:1.5rem 2rem;min-width:300px;max-width:95vw;text-align:center}.last-trick-modal h3{color:var(--gold);margin-bottom:1.2rem;font-size:1.1rem}.trick-winner-label{color:#aaa;font-size:.85rem;font-weight:400;margin-left:.4rem}.last-trick-compass{display:grid;grid-template-areas:". north ." "west center east" ". south .";grid-template-columns:1fr 1fr 1fr;grid-template-rows:auto auto auto;gap:.5rem;margin-bottom:1.2rem}.last-trick-top{grid-area:north}.last-trick-bottom{grid-area:south}.last-trick-left{grid-area:west}.last-trick-right{grid-area:east}.last-trick-pos{display:flex;flex-direction:column;align-items:center;gap:.3rem}.last-trick-seat-name{font-size:.75rem;color:#aaa}.last-trick-card{width:60px!important;height:84px!important;cursor:default!important;transform:none!important}.trick-winner .last-trick-card,.last-trick-pos.trick-winner .last-trick-card{box-shadow:0 0 12px #f1c40fcc,0 0 0 2px var(--active)!important;border:2px solid var(--active)!important}.last-trick-empty{width:60px;height:84px;display:flex;align-items:center;justify-content:center;color:#555;font-size:1.5rem}.last-trick-close{padding:.5rem 1.5rem;border:1px solid #555;border-radius:8px;background:#2c2c3e;color:#ccc;cursor:pointer;font-size:.9rem;transition:background .2s}.last-trick-close:hover{background:#3a3a50}.phase-bidding .center-area{top:120px;bottom:auto;transform:translate(-50%);max-height:calc(100% - 120px - var(--fan-height) - 110px);display:flex;flex-direction:column;overflow:hidden}.phase-bidding .bidding-area{display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden}.phase-bidding .bidding-history{flex:1;min-height:0;overflow-y:auto;margin-bottom:.5rem}.phase-bidding .bidding-box{flex-shrink:0}.seat-N.phase-bidding .center-area{top:260px;max-height:calc(100% - 390px)}@media (max-width: 768px){.phase-bidding .pos-left,.phase-bidding .pos-right{top:68px;transform:none}.phase-bidding .center-area{top:auto;bottom:calc(var(--fan-height) + 70px);transform:translate(-50%);max-height:calc(100dvh - var(--fan-height) - 220px);background:#0a1e0af7;border-radius:14px 14px 0 0;box-shadow:0 -4px 20px #00000080}.phase-bidding .bidding-history{display:block}.phase-bidding .bidding-box{padding:.5rem}.phase-bidding .bidding-box h3{font-size:.9rem;margin-bottom:.3rem}.phase-bidding .bid-grid{gap:3px;margin-bottom:.4rem}.phase-bidding .bid-row{gap:3px}.phase-bidding .bid-actions{gap:.4rem}}@media (min-width: 1400px){:root{--card-w: 175px;--card-h: 245px;--fan-spread: 65deg}.card-rank{font-size:1.7rem}.card-suit{font-size:1.25rem}.card-suit-large{font-size:3.6rem}.hand-fan.hand-top{transform:translate(-50%) scale(.72);transform-origin:center top;top:80px}}@media (min-width: 1800px){:root{--card-w: 200px;--card-h: 280px}.card-rank{font-size:1.95rem}.card-suit{font-size:1.4rem}.card-suit-large{font-size:4.2rem}.hand-fan.hand-top{transform:translate(-50%) scale(.65);top:70px}}@media (max-width: 768px){:root{--card-w: 62px;--card-h: 88px;--card-w-small: 50px;--card-h-small: 70px;--dummy-card-w: 56px;--dummy-card-h: 78px;--fan-spread: 60deg}.card-rank{font-size:.95rem}.card-suit{font-size:.8rem}.card-suit-large{font-size:1.7rem}.bid-btn{width:44px;height:32px;font-size:.78rem}.bid-suit-sym{font-size:1rem}.center-area{width:95vw}.trick-pos-bottom{bottom:18%}.trick-pos-top{top:12%}.trick-pos-left{left:15%}.trick-pos-right{right:15%}}@media (max-width: 480px){:root{--card-h: min(85px, calc((100vw - 24px) / 2.6));--card-w: calc(var(--card-h) * .7);--card-h-small: calc(var(--card-h) * .55);--card-w-small: calc(var(--card-h-small) * .7);--fan-spread: 60deg}.card-rank{font-size:.78rem}.card-suit{font-size:.65rem}.card-suit-large{font-size:1.25rem}.hand-bottom{bottom:10px;padding-bottom:env(safe-area-inset-bottom,0px)}.bidding-box{padding:.35rem}.bidding-box h3{font-size:.78rem;margin-bottom:.3rem}.bid-grid{gap:2px;margin-bottom:.35rem}.bid-row{gap:2px}.bid-btn{width:38px;height:26px;font-size:.7rem}.bid-level{font-size:.75rem}.bid-suit-sym{font-size:.8rem}.bid-action{padding:.3rem .65rem;font-size:.78rem}.bid-actions{gap:.3rem}.bidding-history{padding:.3rem;margin-bottom:.3rem}.bidding-history table{font-size:.72rem}.bidding-history th{padding:.15rem .3rem;font-size:.72rem}.bidding-history td{padding:.15rem .3rem}.player-info{padding:.35rem .6rem;min-width:80px}.player-name{font-size:.9rem}.player-seat{font-size:.7rem}.score-sheet{min-width:unset;width:95vw}.hand-left{left:80px}.hand-right{right:80px}.hand-left{left:70px}.hand-right{right:70px}.hand-left .hand-cards .card.small,.hand-right .hand-cards .card.small{margin-top:-48px}.dummy-label{font-size:.7rem;margin-bottom:2px;padding:1px 5px}.deal-review{padding:1rem}.review-content{flex-direction:column}.review-hand,.review-bidding-section{min-width:unset}.top-bar{padding:.3rem .6rem;flex-direction:column;align-items:stretch;gap:.25rem}.game-info{gap:.5rem;font-size:.8rem;flex-wrap:wrap}.top-actions{display:flex;flex-wrap:wrap;gap:.3rem;justify-content:flex-end}.video-toggle-btn{display:none}.score-btn{padding:.25rem .6rem;font-size:.75rem;border-radius:4px}.leave-btn,.restart-btn{padding:3px 8px;font-size:.75rem;border-radius:4px}.last-trick-btn{padding:.25rem .6rem;font-size:.75rem}.seat-N.phase-bidding .center-area{top:200px;bottom:auto;max-height:calc(100dvh - 280px);background:#0a1e0af7;border-radius:14px;box-shadow:0 -4px 20px #00000080}.seat-E.phase-bidding .center-area,.seat-W.phase-bidding .center-area{top:120px;bottom:auto;max-height:calc(100dvh - 200px);background:#0a1e0af7;border-radius:14px;box-shadow:0 -4px 20px #00000080}.player-info{padding:.3rem .5rem;min-width:75px;gap:.1rem}.player-name{font-size:.85rem}.hcp-badge{font-size:.7rem;padding:.1rem .3rem}.card-count{font-size:.65rem}body{overflow:hidden;height:100vh;height:100dvh}.table{padding-bottom:env(safe-area-inset-bottom,0px)}}@media (max-width: 375px){:root{--fan-spread: 64deg}.card{border-radius:6px}.card.small{border-radius:5px}.card.small .card-rank{font-size:.65rem}.card.small .card-suit{font-size:.5rem}.card.small .card-suit-large{font-size:.9rem}.hand-bottom{bottom:6px}.pos-top{top:4px}.pos-left{left:2px}.pos-right{right:2px}.player-info{padding:.3rem .5rem;min-width:70px;border-radius:6px}.player-name{font-size:.8rem}.player-seat{font-size:.65rem}.dealer-badge{font-size:.6rem;padding:.1rem .3rem}.hcp-badge{font-size:.65rem;padding:.1rem .3rem}.hand-left{left:55px}.hand-right{right:55px}.hand-top{top:65px}.hand-left .hand-cards .card.small,.hand-right .hand-cards .card.small{margin-top:-42px}.hand-top .hand-cards .card.small{margin-left:-28px}.center-area{width:96vw}.bidding-box{padding:.3rem}.bid-btn{width:36px;height:24px;font-size:.68rem}.bid-level{font-size:.7rem}.bid-suit-sym{font-size:.75rem}.bid-action{padding:.25rem .55rem;font-size:.72rem}.bidding-history th{font-size:.68rem;padding:.15rem .25rem}.bidding-history td{padding:.15rem .25rem;font-size:.68rem}.trick-pos-bottom{bottom:14%}.trick-pos-top{top:10%}.trick-pos-left{left:8%}.trick-pos-right{right:8%}.trick-info{padding:.3rem .6rem}.contract-text{font-size:1.1rem}.trick-count{font-size:.8rem;gap:.8rem}.score-sheet{min-width:unset;width:95vw;padding:.8rem}.score-table{font-size:.7rem}.score-table th{padding:.3rem .2rem}.score-table td{padding:.25rem .2rem}.deal-review{padding:.8rem;max-width:100vw}.deal-review h2{font-size:1.2rem}.review-content{flex-direction:column;gap:.8rem}.review-hand{min-width:unset;padding:.4rem .6rem}.review-seat-name,.review-suit-row{font-size:.85rem}.review-suit-symbol{font-size:.95rem}.review-suit-cards{font-size:.8rem}.review-bidding-section{min-width:unset}.compass-center-spacer{width:20px}.review-result{padding:.5rem}.review-contract{font-size:1rem}.review-actions{gap:.5rem}.review-btn{padding:.5rem 1rem;font-size:.9rem}.top-bar{padding:.4rem .6rem}.game-info{gap:.4rem;font-size:.75rem;flex-wrap:wrap}.score-btn{padding:.3rem .6rem;font-size:.8rem}.lobby{padding:1.5rem}.lobby h1{font-size:1.5rem}.analysis-best-contract{font-size:.9rem;padding:.4rem .6rem}.analysis-text{font-size:.85rem}.status-your-turn,.status-dummy{padding:.5rem 1rem;font-size:1rem}.waiting-bid{font-size:.9rem}}@media (max-width: 768px) and (pointer: coarse){.card.clickable{min-width:48px;min-height:48px}.card.playable{transform:translateY(-8px);transition:transform .15s ease}.bid-btn{min-width:36px;min-height:30px}.review-actions{flex-direction:column;align-items:stretch}.review-btn{text-align:center;padding:.75rem 1rem;font-size:1rem}.form-group input{font-size:16px;padding:.9rem 1rem}.seat-btn{padding:.9rem;font-size:1rem}.join-btn{padding:1rem;font-size:1.1rem}.score-btn{padding:.45rem .8rem;min-height:36px}}.partnership-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:#000000d9;display:flex;align-items:center;justify-content:center;z-index:200}.partnership-modal{background:#1a1a1a;border-radius:14px;padding:1.75rem 2rem;border:2px solid var(--gold);max-width:640px;width:92vw;max-height:90vh;overflow-y:auto;box-shadow:0 10px 40px #0009}.partnership-modal h2{color:var(--gold);margin:0 0 .5rem;text-align:center}.partnership-subtitle{color:#ccc;text-align:center;margin:0 0 .5rem;font-size:.95rem}.partnership-instructions{color:#aaa;text-align:center;margin:0 0 1.25rem;font-size:.9rem}.partnership-waiting{color:#ddd;text-align:center;margin:1rem 0}.partnership-seats{display:grid;grid-template-columns:repeat(2,1fr);gap:.75rem;margin-top:1rem}.partnership-seat{background:#262626;border:1px solid #444;border-radius:8px;padding:.75rem 1rem;display:flex;justify-content:space-between;align-items:center}.partnership-seat.filled{border-color:var(--gold)}.partnership-seat .seat-label{color:#888;font-weight:700}.partnership-seat .seat-name{color:#fff}.partnership-options{display:flex;flex-direction:column;gap:1rem}.partnership-option{background:#222;border:2px solid #444;border-radius:10px;padding:1rem 1.25rem;color:#fff;cursor:pointer;transition:all .15s ease;text-align:left;font-family:inherit}.partnership-option:hover:not(:disabled){border-color:var(--gold);background:#2a2a2a;transform:translateY(-1px)}.partnership-option:disabled{opacity:.5;cursor:not-allowed}.partnership-option .pair-row{display:flex;align-items:center;gap:.75rem;padding:.35rem 0}.partnership-option .pair-label{color:#888;font-size:.8rem;font-weight:700;min-width:50px}.partnership-option .pair-names{color:#fff;font-size:1.1rem;font-weight:600}.partnership-option .vs{color:var(--gold);font-size:.8rem;text-align:center;margin:.15rem 0;letter-spacing:.15em}.partnership-option .partner-hint{margin-top:.5rem;padding-top:.5rem;border-top:1px dashed #444;color:#bbb;font-size:.85rem}.partnership-option .partner-hint strong{color:var(--gold)}.video-feeds{position:fixed;z-index:80;pointer-events:none}.video-tile{position:fixed;width:280px;height:210px;border:2px solid var(--gold);border-radius:10px;overflow:hidden;background:#000;box-shadow:0 4px 12px #00000080;pointer-events:auto}.video-tile.local{border-color:#4aa}.video-tile video{width:100%;height:100%;object-fit:cover;display:block}.video-tile.local video{transform:scaleX(-1)}.video-tile .tile-label{position:absolute;bottom:4px;left:6px;right:6px;color:#fff;font-size:.75rem;background:#0000008c;padding:2px 6px;border-radius:4px;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}.video-tile .tile-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:#666;font-size:.75rem;text-align:center;padding:0 .5rem}.video-tile.video-top{top:52px;right:8px}.video-tile.video-left{bottom:52px;left:8px}.video-tile.video-right{top:52px;left:8px}.video-tile.video-bottom{bottom:8px;right:8px}.video-controls{position:fixed;bottom:8px;left:8px;z-index:90;display:flex;gap:6px;pointer-events:auto}.video-controls button{background:#222;color:#fff;border:1px solid #555;border-radius:6px;padding:6px 10px;font-size:.8rem;cursor:pointer}.video-controls button.active{background:#2a5;border-color:#2a5}.video-controls button.off{background:#722;border-color:#a44}@media (max-width: 1400px){.video-tile{width:230px;height:173px}}@media (max-width: 1200px){.video-tile{width:190px;height:143px}}@media (max-width: 900px){.video-tile{width:155px;height:116px}}@media (max-width: 600px){.video-tile{width:120px;height:90px}.video-tile .tile-label{font-size:.65rem}}.leave-btn,.restart-btn{background:#2a2a2a;color:#ddd;border:1px solid #555;border-radius:6px;padding:6px 12px;font-size:.85rem;cursor:pointer;font-family:inherit;transition:all .15s ease}.restart-btn:hover{background:#3a3a3a;border-color:var(--gold);color:var(--gold)}.leave-btn{background:#3a1a1a;border-color:#7a3333;color:#f5a5a5}.leave-btn:hover{background:#5a1a1a;border-color:#c0392b;color:#fff}
