:root{color-scheme:dark;--page:#102c26;--panel:#13372f;--table:#1c5747;--cream:#f6f1e5;--muted:#b4c4b9;--gold:#e4c889;--line:#ffffff24;--red:#b6232c;--card-w:84px;--card-h:122px;--overlap:-35px;font-family:"PingFang SC","Microsoft YaHei",system-ui,sans-serif;color:var(--cream);background:var(--page)}
*{box-sizing:border-box}body{margin:0}button,select{font:inherit}button{cursor:pointer}button:disabled{cursor:default}button,a,select{-webkit-tap-highlight-color:transparent}button:focus-visible,a:focus-visible,summary:focus-visible,select:focus-visible{outline:3px solid var(--gold);outline-offset:4px}button{color:inherit}a{color:inherit}button,select{border-radius:6px}.topbar{height:94px;max-width:1480px;margin:auto;display:flex;align-items:center;justify-content:space-between;gap:25px;padding:0 42px;border-bottom:1px solid var(--line)}.brand{display:flex;gap:12px;align-items:center;text-decoration:none;font-family:"Songti SC",Georgia,serif;font-size:27px;font-weight:600;letter-spacing:3px}.brand-mark{font-family:Georgia,serif;font-size:44px;color:var(--gold)}.brand small{display:block;font:10px/1.3 system-ui;letter-spacing:4px;color:var(--muted);margin-top:4px}.edition{font-size:12px;color:var(--muted);letter-spacing:2px}.topbar nav{display:flex;gap:20px;align-items:center}.text-button{border:0;background:transparent;padding:10px 0;color:var(--muted);font-size:13px}.outline-button,.primary-button{padding:10px 16px;border:1px solid #ffffff38;background:transparent;font-size:13px;white-space:nowrap}.outline-button:hover{border-color:var(--gold);color:var(--gold)}.primary-button{background:var(--gold);border-color:var(--gold);color:#20352b;font-weight:650}.primary-button:hover{background:#f2dca8}.primary-button:disabled{background:#40564a;color:#aab5ad;border-color:transparent}.layout{max-width:1480px;margin:0 auto;padding:28px 42px 0;display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:32px}.game-column{min-width:0}.table-caption{display:flex;justify-content:space-between;font-size:12px;color:var(--muted);margin-bottom:14px;letter-spacing:1px}.table{position:relative;height:565px;background:radial-gradient(ellipse at 50% 40%,#25634f 0,#1b5142 62%,#184637 100%);border:1px solid #67847666;border-radius:110px;box-shadow:inset 0 0 0 7px #173e3255,inset 0 0 65px #061f2355,0 18px 50px #061b2433;isolation:isolate}.table:before{content:"";position:absolute;inset:0;border-radius:inherit;opacity:.18;pointer-events:none;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 160 160' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.8' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' opacity='.45' filter='url(%23n)'/%3E%3C/svg%3E")}.table-ring{position:absolute;inset:20px;border:1px solid #d4d5b61b;border-radius:92px;pointer-events:none}.seat{position:absolute;z-index:2;text-align:center}.north{top:25px;left:50%;transform:translateX(-50%);width:76%;--card-w:60px;--card-h:87px;--overlap:-27px}.south{bottom:23px;left:50%;transform:translateX(-50%);width:96%}.west{left:22px;top:44%;transform:translateY(-50%);width:108px}.east{right:22px;top:44%;transform:translateY(-50%);width:108px}.seat-label{display:flex;gap:8px;align-items:center;justify-content:center;font-size:12px;margin:0 0 10px;white-space:nowrap}.seat-label .avatar{display:grid;place-items:center;width:26px;height:26px;border:1px solid #ffffff45;border-radius:50%;color:var(--muted);font-size:11px}.seat.active .avatar{background:var(--gold);color:#20352b;border-color:var(--gold);box-shadow:0 0 0 4px #e4c88920}.seat.active .seat-name{color:var(--gold)}.seat-role{font-size:10px;color:#bed0c4}.south .seat-label{margin-top:13px;margin-bottom:0}.hand{display:flex;justify-content:center;align-items:center;min-height:var(--card-h);padding-top:8px}.card{position:relative;display:block;width:var(--card-w);height:var(--card-h);padding:0;border:0;border-radius:5px;background:#fff;flex-shrink:0;box-shadow:0 2px 4px #0005;transition:transform .16s ease,filter .16s ease;overflow:hidden}.hand>.card+.card{margin-left:var(--overlap)}.card img{display:block;width:100%;height:100%;object-fit:fill;pointer-events:none}.card.playable:hover,.card.playable:focus-visible{transform:translateY(-17px);z-index:5;box-shadow:0 0 0 2px var(--gold),0 9px 12px #0005}.card.playable{cursor:pointer}.card.illegal{filter:brightness(.65)}.card.hinted{transform:translateY(-15px);box-shadow:0 0 0 3px var(--gold);z-index:4}.card-back{background:#fff;padding:4px}.back-pattern{height:100%;width:100%;position:relative;overflow:hidden;border:3px double #f5f1e5;background-color:#172c67;background-image:repeating-conic-gradient(from 45deg at 50% 50%,#f6f1e580 0deg 5deg,transparent 5deg 85deg,#f6f1e580 85deg 90deg);background-size:12px 12px;box-shadow:0 0 0 1px #172c67}.back-pattern:before,.back-pattern:after{content:"♧";position:absolute;left:14%;width:72%;height:43%;border:3px double #f5f1e5;border-radius:50%;color:#f5f1e5;display:grid;place-items:center;background:#172c67;font-family:Georgia,serif;font-size:27px}.back-pattern:before{top:5%}.back-pattern:after{bottom:5%;transform:rotate(180deg)}.concealed{height:65px;position:relative;display:flex;justify-content:center;align-items:center}.concealed .card{width:41px;height:60px;transform:rotate(-6deg)}.concealed .card+.card{margin-left:-30px;transform:rotate(5deg)}.concealed .card:nth-child(3){transform:rotate(15deg)}.north .concealed{height:65px}.count-label{display:block;font-size:10px;color:#bbd1c3;margin-top:9px;letter-spacing:1px}.east .hand,.west .hand{display:grid;grid-template-columns:repeat(4,22px);gap:5px 0;--card-w:42px;--card-h:61px}.east .hand>.card+.card,.west .hand>.card+.card{margin:0}.center-zone{position:absolute;left:50%;top:45%;transform:translate(-50%,-50%);width:260px;height:230px;z-index:1;display:grid;place-items:center}.center-idle{text-align:center}.center-idle .suit-emblem{font-family:Georgia,serif;font-size:62px;color:#e5d49e65;line-height:1}.center-idle h2{font-family:"Songti SC",Georgia,serif;font-size:22px;letter-spacing:3px;font-weight:400;margin:14px 0 8px}.center-idle p{font-size:11px;letter-spacing:2px;color:#b5cdbba6;margin:0}.played{position:absolute;--card-w:65px;--card-h:94px;animation:deal-in .2s ease-out}.played.p0{top:-8px;left:95px;transform:rotate(-5deg)}.played.p1{right:6px;top:60px;transform:rotate(7deg)}.played.p2{bottom:-9px;left:92px;transform:rotate(5deg)}.played.p3{left:6px;top:60px;transform:rotate(-8deg)}.played.winner .card{box-shadow:0 0 0 3px var(--gold),0 8px 20px #0004}.played-name{font-size:10px;text-align:center;color:var(--gold);margin-top:3px}.compass{font:11px Georgia,serif;color:#d6d9bd75;letter-spacing:4px}.table-signature{position:absolute;bottom:194px;left:50%;transform:translateX(-50%);font:9px Georgia,serif;letter-spacing:4px;color:#b3c7aa40;white-space:nowrap}.action-panel{padding:23px 1px 20px;min-height:204px}.action-heading{display:flex;align-items:center;justify-content:space-between;gap:12px}.step-label{font-size:10px;color:var(--gold);letter-spacing:2px}.action-heading h1{font-size:20px;font-weight:500;margin:7px 0 0}.action-heading>.outline-button{align-self:end}#message{font-size:12px;color:var(--muted);line-height:1.8;margin:10px 0 15px;min-height:21px}.bid-controls{display:flex;gap:10px;align-items:center;flex-wrap:wrap}.bid-controls label{font-size:11px;color:var(--muted)}.bid-controls select{background:#1f453a;color:var(--cream);border:1px solid #ffffff38;height:40px;padding:0 12px;min-width:64px}.bid-controls .suit-picker{min-width:105px}.call-special{padding:10px 13px;border:1px solid #ffffff38;background:transparent;font-size:13px}.call-special:disabled{opacity:.3}.action-buttons{display:flex;gap:10px;flex-wrap:wrap}.hand-strength{font-size:11px;color:var(--muted);margin-top:12px}.sidebar{padding-top:28px}.eyebrow{font-size:10px;letter-spacing:2px;color:var(--gold);margin:0 0 19px}.contract-name{font:39px/1.2 Georgia,"Songti SC",serif;margin-bottom:8px;min-height:48px}.contract-detail{font-size:12px;line-height:1.8;color:var(--muted)}.trick-score{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-top:25px}.trick-score>div{display:flex;flex-direction:column;gap:7px}.trick-score>div:last-child{text-align:right}.trick-score span{font-size:11px;color:var(--muted)}.trick-score strong{font:46px/1 Georgia,serif;font-weight:400}.trick-score .score-divider{font:25px Georgia,serif;color:#9bb5a080}#trick-progress{font-size:11px;color:var(--muted);margin:15px 0 24px}.auction-section,.notes-section{border-top:1px solid var(--line);padding-top:22px;margin-top:22px}.section-heading{display:flex;justify-content:space-between;align-items:center;margin-bottom:14px}.section-heading h2{font-size:13px;font-weight:500;margin:0}.section-heading>span{font-size:10px;color:var(--muted)}.auction-scroll{max-height:220px;overflow:auto;scrollbar-width:thin}.auction-table{border-collapse:collapse;width:100%;table-layout:fixed;font-size:12px;text-align:center}.auction-table th{font-weight:400;color:var(--muted);font-size:10px;padding:9px 0;background:#ffffff06}.auction-table td{padding:10px 0;border-bottom:1px solid #ffffff0b}.auction-table .you{color:var(--gold)}.auction-table .pass{color:#94ad9d}.auction-table .red{color:#ffb0a5}.auction-table .empty{color:#728a7d}#tip{font-size:12px;line-height:1.9;color:var(--muted);margin:0}.settings{display:flex;justify-content:space-between;align-items:center;font-size:11px;color:var(--muted);margin-top:19px}.settings select{font-size:11px;padding:5px 8px;background:#1b4236;color:var(--cream);border:1px solid #ffffff25}details{margin-top:20px;font-size:11px;color:var(--muted)}summary{cursor:pointer;padding:5px 0}#last-trick-content{padding-top:10px;line-height:2}.save-note{font-size:10px;color:#9db3a3;margin-top:27px}.footer{max-width:1480px;margin:auto;display:flex;justify-content:space-between;padding:15px 42px 27px;border-top:1px solid #ffffff10;font-size:10px;color:#91aa9b;letter-spacing:1px}.result-summary{padding:14px 0}.result-summary h3{font:27px "Songti SC",Georgia,serif;margin:0 0 12px;color:var(--gold)}.result-parts{display:flex;gap:10px 22px;flex-wrap:wrap;margin:12px 0 18px;color:var(--muted);font-size:12px}.result-parts strong{font-weight:500;color:var(--cream);margin-left:6px}.review-hands{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;font-size:12px;line-height:1.8;margin:18px 0}.review-hands h4{color:var(--gold);font-size:12px;margin:0 0 7px}.review-hands p{margin:0}.review-hands .red{color:#ffb0a5}.table-result{background:#183d32e8;padding:25px 30px;border:1px solid #b9bf9055;min-width:220px;text-align:center;border-radius:8px}.table-result strong{font:42px Georgia,serif;color:var(--gold)}.table-result p{font-size:12px;color:var(--muted);line-height:1.8}.table-result .result-label{color:var(--cream);font-size:18px}dialog{background:#183c32;color:var(--cream);border:1px solid #688473;border-radius:12px;max-width:620px;width:calc(100% - 36px);padding:35px;box-shadow:0 30px 90px #0008;max-height:85dvh}dialog::backdrop{background:#081c18b8;backdrop-filter:blur(5px)}dialog h2{font:29px "Songti SC",Georgia,serif;margin:0 0 18px}dialog p{font-size:13px;color:var(--muted);line-height:1.9}dialog .dialog-close{position:absolute;right:17px;top:12px;background:transparent;border:0;font-size:28px;color:var(--muted)}.rules-list{padding-left:21px}.rules-list li{padding-left:5px;margin-top:20px}.rules-list strong{font-size:14px;font-weight:500}.rules-list p{margin:7px 0}.fine-print{font-size:11px!important}.dialog-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:25px}@keyframes deal-in{from{opacity:0;translate:0 -10px}to{opacity:1;translate:0 0}}
@media(min-width:1400px){.table{height:590px}.center-zone{top:46%}}
@media(max-width:1100px){.layout{grid-template-columns:minmax(0,1fr) 235px;gap:22px;padding-left:25px;padding-right:25px}.topbar{padding:0 25px}.table{border-radius:70px;height:540px}.table-ring{border-radius:58px}.west{left:10px}.east{right:10px}:root{--card-w:73px;--card-h:106px;--overlap:-39px}.north{--card-w:54px;--card-h:79px;--overlap:-25px}.center-zone{width:215px;height:220px}.played.p0,.played.p2{left:76px}.played.p1{right:0}.played.p3{left:0}}
@media(max-width:850px){.layout{grid-template-columns:1fr;gap:10px;max-width:750px}.sidebar{display:grid;grid-template-columns:1fr 1fr;gap:20px;padding-top:5px}.score-section{padding:0}.auction-section{border-top:0;margin:0;padding:0}.notes-section{grid-column:1/-1;margin:0}.save-note{grid-column:1/-1;margin:0 0 20px}.edition{display:none}.table{height:560px}.contract-name{font-size:30px}.trick-score{margin-top:15px}.footer{padding:18px 25px}.table-signature{bottom:175px}}
@media(max-width:520px){:root{--card-w:61px;--card-h:89px;--overlap:-38px}.topbar{height:78px;padding:0 16px;gap:12px}.brand{font-size:23px;gap:7px}.brand-mark{font-size:35px}.brand small{font-size:8px;letter-spacing:3px}.topbar nav{gap:14px}.topbar .outline-button{font-size:11px;padding:9px 10px}.text-button{font-size:11px}.layout{padding:19px 12px 0}.table-caption{font-size:10px;letter-spacing:0;padding:0 3px}.table{height:490px;border-radius:48px}.table-ring{inset:10px;border-radius:38px}.north{top:20px;width:92%;--card-w:45px;--card-h:66px;--overlap:-21px}.south{bottom:17px;width:100%}.south .hand{padding-top:20px}.seat-label{font-size:10px;gap:5px;margin-bottom:5px}.seat-role{font-size:9px}.seat-label .avatar{width:22px;height:22px;font-size:10px}.east,.west{top:43%;width:67px}.east{right:6px}.west{left:6px}.east .seat-label,.west .seat-label{flex-wrap:wrap;gap:3px}.east .seat-role,.west .seat-role{width:100%}.east .hand,.west .hand{grid-template-columns:repeat(3,17px);--card-w:29px;--card-h:43px;gap:3px 0}.concealed .card{width:31px;height:46px}.concealed .card+.card{margin-left:-24px}.concealed{height:51px}.count-label{font-size:9px;margin-top:5px}.center-zone{width:185px;height:190px;top:45%}.played{--card-w:52px;--card-h:76px}.played.p0{left:65px;top:-5px}.played.p2{left:65px;bottom:-5px}.played.p1{right:0;top:56px}.played.p3{left:0;top:56px}.played-name{font-size:9px}.center-idle .suit-emblem{font-size:46px}.center-idle h2{font-size:18px}.center-idle p{font-size:9px}.table-signature{bottom:151px;font-size:8px}.action-panel{padding:21px 4px}.action-heading h1{font-size:18px}.action-heading .outline-button{font-size:11px;padding:9px 12px}.bid-controls{gap:8px}.bid-controls select{padding:0 8px;min-width:58px}.bid-controls .suit-picker{min-width:82px}.call-special{font-size:12px;padding:10px 12px}.bid-controls label{font-size:10px}.sidebar{padding:0 4px;gap:20px}.trick-score strong{font-size:35px}.trick-score span{font-size:10px}.trick-score{gap:6px}.contract-detail{font-size:10px}.contract-name{font-size:28px;min-height:34px}.auction-table{font-size:11px}.auction-table td{padding:8px 0}.score-section .eyebrow{margin-bottom:13px}.footer{padding:18px 16px;gap:15px;line-height:1.8;letter-spacing:0}.footer span{max-width:50%}.table-result{min-width:175px;padding:16px}.table-result strong{font-size:34px}.table-result .result-label{font-size:16px}dialog{padding:28px 23px}.review-hands{grid-template-columns:1fr}}
@media(max-width:365px){:root{--card-w:55px;--card-h:80px;--overlap:-35px}.north{--card-w:42px;--card-h:61px;--overlap:-23px}.topbar nav{gap:8px}.table{height:470px}.center-zone{width:164px}.played.p0,.played.p2{left:55px}.bid-controls{gap:6px}}
@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;transition:none!important;scroll-behavior:auto!important}}

/* Shared portrait mark: explicit dimensions keep the header stable. */
.brand .brand-logo{display:block;width:40px;height:40px;flex:0 0 40px;object-fit:cover;border-radius:50%}
@media(max-width:520px){.brand .brand-logo{width:30px;height:30px;flex-basis:30px}}
