:root{--ink:#17241f;--jade:#245b49;--jade2:#1c493b;--paper:#f4f0e7;--white:#fff;--red:#c8493e;--gold:#c99a3d;--line:#d8d2c6;--muted:#6d766f}*{box-sizing:border-box}html,body{margin:0;min-height:100%;background:var(--paper);color:var(--ink);font-family:"PingFang SC","Microsoft YaHei",system-ui,sans-serif}button,input{font:inherit}button{cursor:pointer}.safety{height:28px;display:grid;place-items:center;background:#101815;color:#d9ddd9;font-size:11px}.appbar{height:72px;display:flex;align-items:center;padding:0 4vw;background:#fff;border-bottom:1px solid var(--line);gap:28px;position:sticky;top:0;z-index:20}.brand{border:0;background:none;display:flex;align-items:center;gap:10px;padding:0;color:inherit;text-align:left}.brand>span:last-child{display:grid}.brand strong{font-family:serif;font-size:21px}.brand small{font-size:10px;color:var(--muted)}.logo{width:38px;height:38px;display:grid!important;place-items:center;background:var(--red);color:#fff;font-family:serif;font-weight:900;border-radius:4px}nav{display:flex;align-self:stretch;margin-left:auto}nav button{border:0;border-bottom:3px solid transparent;background:none;padding:0 18px;color:#68726b;font-size:13px}nav button.active{color:var(--ink);border-color:var(--jade);font-weight:700}.gift-button{border:1px solid var(--line);background:#fff;padding:9px 13px;border-radius:4px}.balance{min-width:112px;border-left:1px solid var(--line);padding-left:18px}.balance small,.balance b{display:block}.balance small{font-size:10px;color:var(--muted)}.balance b{font-size:20px;font-variant-numeric:tabular-nums}.view{display:none}.view.active{display:block}main{max-width:1460px;margin:auto}.lobby{padding:42px 4vw 64px}.lobby-head,.role-head{display:flex;justify-content:space-between;align-items:end;margin-bottom:26px}.lobby-head h1,.role-head h1,.roombar h1{font-family:serif;font-size:34px;margin:0}.lobby-head p,.role-head p{margin:5px 0 0;color:var(--muted)}.online{font-size:12px}.online i{display:inline-block;width:7px;height:7px;background:#3b9b69;border-radius:50%;margin-right:6px}.game-rail{display:grid;grid-template-columns:repeat(3,1fr);border:1px solid #bcb6aa;background:#18251f}.game-card{height:238px;border:0;border-right:1px solid #ffffff1c;border-bottom:1px solid #ffffff1c;background:#20342c;color:#fff;position:relative;overflow:hidden;text-align:left;padding:24px;transition:.2s}.game-card:nth-child(3n){border-right:0}.game-card:nth-child(n+4){border-bottom:0}.game-card:hover{background:#2a5a49;transform:translateY(-2px);z-index:1}.game-card:nth-child(2),.game-card:nth-child(5){background:#3f322a}.game-card:nth-child(3),.game-card:nth-child(6){background:#4b2928}.game-card:hover:nth-child(2),.game-card:hover:nth-child(5){background:#594235}.game-card:hover:nth-child(3),.game-card:hover:nth-child(6){background:#673331}.game-no{font-size:11px;color:#ffffff80}.game-art{position:absolute;right:22px;top:20px;font-family:serif;font-size:72px;color:#ffffff16}.game-copy{position:absolute;left:24px;bottom:50px}.game-copy i,.game-copy b,.game-copy small{display:block}.game-copy i{font-style:normal;color:#e4bd68;font-size:11px}.game-copy b{font-family:serif;font-size:28px;margin:5px 0}.game-copy small{color:#ffffffa8}.enter{position:absolute;right:22px;bottom:20px;font-size:11px;color:#fff}.lobby-lower{display:grid;grid-template-columns:1.5fr .75fr;gap:28px;margin-top:32px}.open-panel,.side-panel{padding:0 2px}.side-panel{border-left:1px solid var(--line);padding-left:28px}.section-head{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--line);padding-bottom:12px}.section-head h2{font-family:serif;font-size:18px;margin:0}.section-head span{font-size:11px;color:var(--muted)}.history-row{display:grid;grid-template-columns:40px 1fr 60px 70px;align-items:center;gap:12px;padding:13px 0;border-bottom:1px solid #e2ddd3}.history-mark{width:34px;height:34px;display:grid;place-items:center;background:#e7e1d6;border-radius:4px}.history-row b,.history-row small{display:block}.history-row b{font-size:13px}.history-row small,.history-row time{font-size:10px;color:var(--muted)}.history-row strong{text-align:right}.win{color:#26714f}.lose{color:var(--red)}.empty{padding:30px 0;color:var(--muted);font-size:13px}.progress{height:6px;background:#dcd6ca;margin:24px 0 12px}.progress i{display:block;height:100%;background:var(--jade);transition:.3s}.side-panel>p{font-size:12px;color:var(--muted)}.rule-note{margin-top:28px;padding:18px 0;border-top:1px solid var(--line)}.rule-note b,.rule-note span{display:block}.rule-note b{font-size:12px}.rule-note span{font-size:11px;color:var(--muted);margin-top:6px;line-height:1.6}.game-room{min-height:calc(100vh - 100px);background:#17241f;color:#fff;padding:24px 4vw 48px}.roombar{display:grid;grid-template-columns:1fr 1fr 1fr;align-items:center;margin-bottom:20px}.roombar>div:nth-child(2){min-width:0;text-align:center}.roombar span{font-size:10px;color:#d5b870}.icon-text{justify-self:start;border:1px solid #ffffff30;background:transparent;color:#fff;padding:10px 14px;border-radius:4px}.round-info{justify-self:end!important;text-align:right!important}.round-info>span{display:block;margin-bottom:5px}.wager-control{display:flex}.wager-control button,.wager-control input{height:34px;border:1px solid #ffffff2d;background:#ffffff10;color:#fff;text-align:center}.wager-control button{width:34px}.wager-control input{width:70px;border-left:0;border-right:0}.game-stage{width:100%;max-width:1040px;margin:auto;min-width:0}.game-help{text-align:center;color:#c6cec9;font-size:12px;line-height:1.5;margin-bottom:16px;overflow-wrap:anywhere}.table-surface{background:#225945;border:8px solid #604838;box-shadow:inset 0 0 0 2px #ffffff12,0 22px 50px #0005;border-radius:8px;padding:30px;position:relative;display:grid;place-items:center}.game-actions{width:100%;min-width:0;min-height:72px;display:flex;justify-content:center;align-items:center;gap:18px}.play-button,.primary{border:0;background:var(--red);color:#fff;padding:12px 26px;border-radius:4px;font-weight:700}.choice-group{display:flex;max-width:100%;min-width:0;border:1px solid #ffffff30}.choice-group button{min-width:0;border:0;background:#ffffff0c;color:#fff;padding:11px 24px;line-height:1.25}.choice-group button.selected{background:#fff;color:var(--ink)}.dice-total{text-align:center;font-size:18px;margin-top:20px;color:#f0d490}.wheel-wrap{position:relative}.pointer{position:absolute;z-index:2;left:calc(50% - 10px);top:-24px;color:#f0d490;font-size:28px}.wheel{width:330px;height:330px;border:12px solid #d5b870;border-radius:50%;background:conic-gradient(#b84036 0 60deg,#f2e8d2 60deg 120deg,#b84036 120deg 180deg,#f2e8d2 180deg 240deg,#b84036 240deg 300deg,#f2e8d2 300deg);position:relative;transition:transform 2s cubic-bezier(.1,.7,.1,1)}.wheel span{position:absolute;left:148px;top:22px;height:140px;transform-origin:17px 143px;color:#17241f;font-weight:800}.wheel b{position:absolute;inset:120px;display:grid;place-items:center;border-radius:50%;background:#173d32;color:#fff;font-size:28px}.versus{display:flex;align-items:center;gap:55px}.versus em{font-family:serif;font-size:30px;color:#d8be83}.side{width:190px;text-align:center}.side span{display:block;margin-bottom:12px}.match-status{display:flex;justify-content:space-between;width:min(520px,100%);position:absolute;top:20px;font-size:12px}.match-grid{display:grid;gap:14px}.match-grid button{color:#d6bc7b;font-family:serif;font-size:30px}.gomoku-status{position:absolute;top:8px;font-size:11px}.gomoku-board{aspect-ratio:1;display:grid;grid-template-columns:repeat(15,1fr);background-color:#d8ad67;background-image:linear-gradient(#765b34 1px,transparent 1px),linear-gradient(90deg,#765b34 1px,transparent 1px);background-size:calc(100% / 14) calc(100% / 14);background-position:center;padding:0}.gomoku-board button{border:0;background:transparent;position:relative;padding:0}.gomoku-board button:after{content:"";position:absolute;width:72%;aspect-ratio:1;border-radius:50%;left:14%;top:14%}.gomoku-board .black-piece:after{background:#17201d;box-shadow:inset -3px -3px 5px #000}.gomoku-board .white-piece:after{background:#f4f0e7;box-shadow:inset -3px -3px 5px #aaa}.role-view{padding:44px 4vw 70px}.role-head>div>span{font-size:11px;color:var(--red)}.stats{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-bottom:20px}.stats article,.panel{background:#fff;border:1px solid var(--line);padding:22px}.stats article span{float:right;color:#26714f;font-size:11px}.stats b{display:block}.stats p{color:var(--muted);font-size:12px}.two-col{display:grid;grid-template-columns:1fr 1.5fr;gap:20px}.admin-grid{grid-template-columns:1.15fr 1fr}.panel-head{display:flex;align-items:center;justify-content:space-between;gap:12px;border-bottom:1px solid var(--line);padding-bottom:14px}.panel-head>*{min-width:0}.panel-head h2{font-family:serif;font-size:18px;margin:0}.stack{display:grid;gap:15px;margin-top:18px}.stack label,.field{font-size:11px;font-weight:700}.stack input,.field input,.dialog-body input,#role-form input{display:block;width:100%;margin-top:7px;border:1px solid #cfc9bd;padding:11px;background:#fcfbf8;border-radius:4px}.table>div{display:grid;grid-template-columns:1.4fr 1fr 60px 60px;gap:8px;padding:12px 0;border-bottom:1px solid #e4dfd5;font-size:11px}.table code{min-width:0;color:var(--jade);overflow-wrap:anywhere}.table i{font-style:normal;color:var(--red)}.weight{display:grid;grid-template-columns:120px 1fr 45px 52px;gap:10px;align-items:center;padding:13px 0;border-bottom:1px solid #e5e0d7}.weight label span{display:block;color:var(--muted);font-size:10px}.weight button{border:0;background:var(--jade);color:#fff;padding:7px;border-radius:3px}.field{display:block;margin-top:18px}.warning{font-size:10px;color:var(--red)}.status-dot{font-size:10px;color:#26714f}.audit{max-height:470px;overflow:auto}.audit>div{display:grid;grid-template-columns:48px minmax(0,1fr);gap:10px;padding:12px 0;border-bottom:1px solid #e4dfd5}.audit small{overflow-wrap:anywhere}.audit time,.audit small{color:var(--muted);font-size:10px}.audit b{font-size:12px;display:block}.toast{position:fixed;right:24px;bottom:24px;max-width:calc(100vw - 48px);background:var(--jade);color:#fff;padding:13px 18px;border-radius:4px;overflow-wrap:anywhere;opacity:0;transform:translateY(10px);transition:.2s;pointer-events:none;z-index:50}.toast.show{opacity:1;transform:none}.toast.bad{background:var(--red)}dialog{border:1px solid #cfc9bd;border-radius:6px;padding:0;width:min(430px,calc(100vw - 30px));box-shadow:0 24px 80px #0007}dialog::backdrop{background:#101815b8}.dialog-head{padding:22px 24px 14px;border-bottom:1px solid #e2ddd4}.dialog-head span{font-size:10px;color:var(--red)}.dialog-head h3{font-family:serif;font-size:22px;margin:5px 0 0}.dialog-body{padding:20px 24px}.dialog-body p{color:var(--muted);font-size:12px}.dialog-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:8px;padding:16px 24px 22px}.dialog-actions button{min-width:0;border:1px solid #cfc9bd;background:#fff;padding:10px 16px;border-radius:4px;line-height:1.25}.dialog-actions .primary{background:var(--red);border-color:var(--red)}#settlement{text-align:center;padding:30px 30px 0}#settlement>span{font-size:10px;color:var(--muted)}#settlement h2{font-family:serif;margin:8px}#settlement p{color:var(--muted);font-size:12px}.settle-icon{width:64px;height:64px;display:grid;place-items:center;border-radius:50%;margin:0 auto 16px;background:var(--jade);color:#fff;font-size:24px;font-family:serif}.settle-icon.lose{background:var(--red)}.settle-score{border-top:1px solid var(--line);margin-top:20px;padding:18px}.settle-score small,.settle-score b{display:block}.settle-score b{font-size:30px;color:var(--jade);margin:4px}
@media(max-width:800px){.appbar{height:auto;min-height:66px;padding:10px 14px;gap:10px;flex-wrap:wrap}.brand small,.gift-button{display:none}nav{order:3;width:100%;height:38px}nav button{flex:1;padding:0 6px}.balance{margin-left:auto}.lobby,.role-view{padding:26px 14px 50px}.lobby-head,.role-head{align-items:start}.lobby-head h1,.role-head h1{font-size:27px}.online,.role-head>p{display:none}.game-rail{grid-template-columns:1fr 1fr}.game-card{height:180px;padding:16px}.game-card:nth-child(n){border-right:1px solid #ffffff1c;border-bottom:1px solid #ffffff1c}.game-card:nth-child(2n){border-right:0}.game-copy{left:16px;bottom:40px}.game-copy b{font-size:23px}.game-copy small{font-size:10px}.game-art{font-size:48px}.enter{right:14px;bottom:14px}.lobby-lower,.two-col,.stats{grid-template-columns:1fr}.side-panel{border-left:0;border-top:1px solid var(--line);padding:24px 0 0}.game-room{padding:18px 10px}.roombar{grid-template-columns:minmax(0,1fr) minmax(0,1fr);column-gap:10px}.roombar>div:nth-child(2){text-align:right}.round-info{grid-column:1/-1;justify-self:center!important}.table-surface{padding:12px;border-width:5px}.versus{gap:18px}.side{width:115px}.wheel{width:270px;height:270px}.wheel span{left:118px;height:110px;transform-origin:17px 113px}.wheel b{inset:95px}.table>div{grid-template-columns:1fr 60px}.table span,.table i{display:none}.weight{grid-template-columns:100px 1fr 42px}.weight button{grid-column:2/-1}.history-row{grid-template-columns:35px 1fr 55px}.history-row time{display:none}}
.game-no{position:absolute;left:24px;top:22px}
@media(max-width:800px){.game-no{left:16px;top:14px}}
.poker-felt{position:absolute;inset:0;display:grid;place-items:center}.shoe{position:absolute;top:28px;right:35px;width:95px;height:65px;border:2px solid #b99a61;background:#1a372e;transform:skew(-8deg);display:flex;align-items:center;justify-content:center}.shoe span{position:absolute;width:54px;height:36px;background:#efe6d2;border:1px solid #bcae92;top:-8px}.shoe span:nth-child(2){top:-4px;left:22px}.shoe span:nth-child(3){top:0;left:26px}.shoe b{position:absolute;bottom:6px;font-size:10px;color:#d8c48d}.poker-card{width:176px;height:250px;border-radius:7px;border:6px solid #f4ead5;background:#9d382f;box-shadow:0 10px 22px #0005;position:relative;overflow:hidden}.poker-card.back:before{content:"";position:absolute;inset:7px;border:2px solid #e8cf96;background:repeating-linear-gradient(45deg,#9d382f 0 5px,#7d2c28 5px 10px)}.poker-card.back i{position:absolute;inset:0;display:grid;place-items:center;z-index:1;font-size:28px;color:#f1d69b}.poker-card.face{background:#fffaf0;color:#171c1a;padding:14px}.poker-card.face b{position:absolute;left:14px;top:10px;font-size:30px}.poker-card.face strong{position:absolute;inset:0;display:grid;place-items:center;font-size:78px}.poker-card.face small{position:absolute;right:12px;bottom:10px;font-size:18px;transform:rotate(180deg)}.poker-card.red-suit{color:#bd3d35}.deal-line{position:absolute;bottom:36px;display:flex;align-items:center;gap:12px;color:#e1cc94;font-size:10px}.deal-line i{display:block;width:100px;height:1px;background:#ffffff35}
@media(max-width:800px){.poker-card{width:120px;height:180px}.poker-card.face strong{font-size:55px}.shoe{display:none}.deal-line{bottom:24px}.deal-line i{width:50px}}
.online.offline{color:#9b5a22}.online.offline i{background:#d28b32}
.route-nav{margin-left:auto;align-self:stretch;display:flex;align-items:center;border-bottom:3px solid var(--jade);padding:0 18px}.route-nav strong{font-size:13px}.route-agent .user-header,.route-admin .user-header{display:none}.route-agent .route-nav,.route-admin .route-nav{margin-right:0}.route-agent .appbar,.route-admin .appbar{justify-content:space-between}.route-agent .role-view,.route-admin .role-view{min-height:calc(100vh - 100px)}
.account-button{border:0;background:var(--jade);color:#fff;padding:10px 14px;border-radius:4px;font-size:12px;max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.role-session{display:flex;align-items:center;gap:12px}.role-session button{border:1px solid var(--line);background:#fff;padding:8px 12px;border-radius:4px}.role-layout{display:grid;grid-template-columns:minmax(260px,.72fr) minmax(520px,1.8fr);gap:20px}.wide-panel{min-width:0}.sub-head{margin-top:28px}.account-table{display:grid}.account-row{display:grid;grid-template-columns:minmax(180px,1.4fr) minmax(100px,.7fr) 70px;gap:12px;align-items:center;padding:13px 0;border-bottom:1px solid #e4dfd5}.admin-accounts .account-row{grid-template-columns:minmax(210px,1.5fr) minmax(120px,.8fr) 62px 70px}.account-row>*{min-width:0}.account-row b,.account-row small{display:block;overflow-wrap:anywhere}.account-row small{font-size:10px;color:var(--muted);margin-top:4px}.account-row button{min-width:0;border:1px solid #c9c3b7;background:#fff;padding:8px;border-radius:3px;line-height:1.2;white-space:normal}.account-row .danger-button{color:var(--red);border-color:#e1b6b1}.auth-tabs{display:grid;grid-template-columns:1fr 1fr;border-bottom:1px solid var(--line)}.auth-tabs button{border:0;background:#f5f3ee;padding:12px}.auth-tabs button.active{background:#fff;color:var(--jade);font-weight:700}.auth-fields{display:grid;gap:13px}.auth-fields label{font-size:11px;font-weight:700}.auth-fields label input{display:block;width:100%;margin-top:7px;border:1px solid #cfc9bd;padding:11px;background:#fcfbf8;border-radius:4px}.register-only{display:none!important}.register-mode .register-only{display:block!important}.mahjong-ways{position:absolute;inset:0;background:#6f1714;padding:75px 80px 45px;display:grid;place-items:center;background-image:linear-gradient(#ffffff0a 1px,transparent 1px);background-size:100% 62px}.ways-top{position:absolute;left:70px;right:70px;top:18px;display:grid;grid-template-columns:100px 1fr 120px;align-items:center;color:#f6d88a}.ways-top>span{font-size:11px}.multiplier-track{display:flex;justify-content:center;gap:10px}.multiplier-track b{font-size:20px;opacity:.38;padding:5px 15px;border-bottom:3px solid transparent}.multiplier-track b.active{opacity:1;color:#fff0a8;border-color:#f3c34d}.ways-win{text-align:right}.ways-win small,.ways-win strong{display:block}.ways-win strong{font-size:26px;color:#fff}.ways-grid{width:min(620px,80%);height:min(490px,82%);display:grid;grid-template-columns:repeat(5,1fr);grid-template-rows:repeat(4,1fr);gap:7px;padding:12px;background:#32663e;border:8px solid #d9a739;box-shadow:0 0 0 6px #53110e,0 20px 45px #25000080}.ways-tile{min-width:0;background:#f3f0d9;border:3px solid #dfd8b8;border-radius:5px;display:grid;place-items:center;align-content:center;position:relative;box-shadow:inset 0 -7px 0 #c7d5a7,0 3px 4px #0005;color:#9e2020;transition:.22s}.ways-tile b{font-family:serif;font-size:32px;line-height:1}.ways-tile i{font-style:normal;font-size:11px;color:#286b3c}.ways-tile span{font-family:serif;font-size:18px}.ways-tile.suit-筒 b{color:#31579d}.ways-tile.suit-条 b{color:#26744b}.ways-tile.winning{background:#fff1a2;border-color:#ffd64f;box-shadow:0 0 18px #ffd54f,inset 0 -7px 0 #e9b941;transform:scale(1.04);z-index:2}.ways-status{position:absolute;bottom:16px;color:#f4d68c;font-size:12px}.play-button:disabled{opacity:.55;cursor:wait}
@media(max-width:800px){.account-button{padding:8px;max-width:105px}.route-nav{order:3;width:100%;height:38px;justify-content:center}.role-layout{grid-template-columns:1fr}.role-session{display:none}.account-row{grid-template-columns:minmax(0,1fr) 78px 52px}.admin-accounts .account-row{grid-template-columns:minmax(0,1fr) 68px 48px 52px}.admin-accounts .account-row>span:nth-child(3){display:none}.mahjong-ways{padding:62px 18px 42px}.ways-top{left:16px;right:16px;grid-template-columns:60px 1fr 68px}.multiplier-track{gap:0}.multiplier-track b{font-size:14px;padding:4px 7px}.ways-grid{width:100%;gap:4px;border-width:5px}.ways-tile{border-width:2px}.ways-tile b{font-size:22px}.ways-win strong{font-size:19px}}
.agent-account-row{grid-template-columns:minmax(180px,1.4fr) minmax(100px,.7fr) 62px 70px}
@media(max-width:800px){.agent-account-row{grid-template-columns:minmax(0,1fr) 68px 48px 52px}}

/* Shared game motion */
.room-tools{min-width:0;justify-self:end;display:flex;align-items:center;gap:14px}.game-utilities{display:flex;gap:6px}.game-utilities button{width:36px;height:36px;border:1px solid #ffffff2d;background:#ffffff0b;color:#ffffff8f;border-radius:4px;font-weight:800}.game-utilities button.active{background:#d1ae5a;color:#17241f;border-color:#d1ae5a}.room-enter{animation:roomIn .28s cubic-bezier(.2,.8,.2,1) both}.room-leave{animation:roomOut .18s ease both}.stage-enter{animation:stageIn .3s .06s cubic-bezier(.2,.8,.2,1) both}.lobby-return{animation:lobbyIn .24s ease both}@keyframes roomIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}@keyframes roomOut{to{opacity:0;transform:translateY(8px)}}@keyframes stageIn{from{opacity:0;transform:scale(.985)}to{opacity:1;transform:none}}@keyframes lobbyIn{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}button{transition:transform .1s ease,background-color .18s ease,border-color .18s ease,opacity .18s ease}button:active:not(:disabled){transform:translateY(1px) scale(.985)}button:focus-visible{outline:3px solid #d9b95f;outline-offset:3px}button:disabled{cursor:not-allowed;opacity:.56}.play-button{min-width:128px;box-shadow:0 5px 0 #8f2e28,0 10px 24px #0003}.play-button:active:not(:disabled){box-shadow:0 2px 0 #8f2e28,0 5px 14px #0003;transform:translateY(3px)}.table-surface{min-height:clamp(400px,62dvh,540px);overflow:hidden}.game-actions{position:relative}.game-stage[aria-busy="true"] .wager-control{pointer-events:none}

/* Mahjong cascade */
.ways-tile{will-change:auto;backface-visibility:hidden}.ways-tile.tile-idle{animation:tileIdleIn .34s ease both;animation-delay:var(--tile-delay)}.ways-tile.tile-drop,.ways-tile.tile-refill{will-change:transform,opacity;animation:tileDrop .4s cubic-bezier(.18,.82,.28,1.18) both;animation-delay:var(--tile-delay)}.ways-tile.tile-refill{animation-name:tileRefill}.ways-tile.winning{animation:tileWin .48s ease-in-out both;will-change:transform}.ways-tile.tile-clear{animation:tileClear .24s ease-in both;pointer-events:none}.multiplier-track b.bump{animation:multiBump .3s ease}.ways-status{min-width:260px;max-width:calc(100% - 32px);text-align:center;overflow-wrap:anywhere}@keyframes tileIdleIn{from{opacity:0;transform:translateY(-16px) scale(.92)}to{opacity:1;transform:none}}@keyframes tileDrop{0%{opacity:0;transform:translateY(-90px) rotate(-3deg) scale(.94)}72%{opacity:1;transform:translateY(4px) rotate(1deg)}100%{opacity:1;transform:none}}@keyframes tileRefill{0%{opacity:0;transform:translateY(-120px) scale(.9)}78%{opacity:1;transform:translateY(5px)}100%{opacity:1;transform:none}}@keyframes tileWin{0%,100%{transform:scale(1.04)}45%{transform:scale(1.1) translateY(-3px)}}@keyframes tileClear{to{opacity:0;transform:scale(.35) rotate(5deg) translateY(12px)}}@keyframes multiBump{50%{transform:scale(1.28) translateY(-2px)}}

/* Dice */
.dice-tray{width:min(520px,92%);height:300px;border:2px solid #b08b52;border-radius:50% 50% 12px 12px;background:#193d31;box-shadow:inset 0 -35px 70px #071c15aa,0 18px 35px #0004;position:relative;display:grid;place-items:center}.dice-cup{display:flex;gap:34px;position:relative;z-index:1}.dice-cup-lid{position:absolute;width:245px;height:190px;border-radius:42% 42% 12px 12px;background:#6f302a;border:7px solid #a77745;box-shadow:inset 0 12px 0 #ffffff0c,0 18px 24px #0007;z-index:3;display:grid;place-items:center;transform:translateY(-18px);transform-origin:50% 80%}.dice-cup-lid span{width:58px;height:58px;display:grid;place-items:center;border:2px solid #d5b56d;color:#e8cf8c;font-family:serif;font-size:27px;transform:rotate(45deg)}.dice-cup-lid span::first-letter{transform:rotate(-45deg)}.dice-cup-lid.shaking{animation:cupShake .7s ease-in-out infinite}.dice-cup-lid.lifted{animation:cupLift .3s cubic-bezier(.2,.8,.2,1) both}.dice-cup.rolling{animation:diceTrayShake .14s linear infinite}.dice-cup.revealed{animation:revealBounce .32s ease both}.real-die{width:92px;height:92px;border-radius:14px;background:#faf3df;border:4px solid #ddd0b3;box-shadow:inset -8px -10px 0 #c9c0aa,0 10px 15px #0005;display:grid!important;grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(3,1fr);padding:12px;transform:rotate(var(--die-rotate,0deg));font-size:0!important}.real-die i{width:15px;height:15px;background:#253c33;border-radius:50%;place-self:center;opacity:0;box-shadow:inset 2px 2px 2px #0005}.face-1 i[data-dot="5"],.face-2 i[data-dot="1"],.face-2 i[data-dot="9"],.face-3 i[data-dot="1"],.face-3 i[data-dot="5"],.face-3 i[data-dot="9"],.face-4 i[data-dot="1"],.face-4 i[data-dot="3"],.face-4 i[data-dot="7"],.face-4 i[data-dot="9"],.face-5 i[data-dot="1"],.face-5 i[data-dot="3"],.face-5 i[data-dot="5"],.face-5 i[data-dot="7"],.face-5 i[data-dot="9"],.face-6 i[data-dot="1"],.face-6 i[data-dot="3"],.face-6 i[data-dot="4"],.face-6 i[data-dot="6"],.face-6 i[data-dot="7"],.face-6 i[data-dot="9"]{opacity:1}.dice-total.result-pop{animation:resultPop .34s ease both}@keyframes cupShake{0%,100%{transform:translate(-3px,-18px) rotate(-2deg)}50%{transform:translate(4px,-22px) rotate(2deg)}}@keyframes cupLift{to{transform:translate(150px,-125px) rotate(18deg);opacity:.42}}@keyframes diceTrayShake{0%,100%{transform:translateX(-5px) rotate(-4deg)}50%{transform:translateX(5px) rotate(5deg)}}@keyframes revealBounce{50%{transform:scale(1.08)}100%{transform:none}}@keyframes resultPop{50%{transform:scale(1.16);color:#ffe09a}100%{transform:none}}

/* Memory cards */
.match-grid{width:min(500px,100%);grid-template-columns:repeat(4,minmax(0,1fr));perspective:900px}.match-grid .match-card{position:relative;min-width:0;height:auto;aspect-ratio:.78;border:0;background:transparent!important;padding:0;box-shadow:none;perspective:800px}.match-card-inner{position:absolute;inset:0;display:block;transform-style:preserve-3d;transition:transform .32s cubic-bezier(.2,.75,.25,1)}.match-front,.match-back{position:absolute;inset:0;display:grid;place-items:center;border:2px solid #d6bc7b;border-radius:6px;backface-visibility:hidden;box-shadow:0 8px 15px #0003}.match-front{background:#173d32;color:#d6bc7b}.match-back{background:#fff8e7;color:#24352d;transform:rotateY(180deg);font-size:34px}.match-card.open .match-card-inner{transform:rotateY(180deg)}.match-card.matched .match-card-inner{animation:matchGlow .4s ease}.match-card.matched{opacity:.62;pointer-events:none}.match-card.mismatch .match-card-inner{animation:cardMismatch .32s ease}.match-status{z-index:2}@keyframes matchGlow{50%{transform:rotateY(180deg) translateY(-7px) scale(1.06)}}@keyframes cardMismatch{0%,100%{transform:rotateY(180deg) translateX(0)}30%{transform:rotateY(180deg) translateX(-6px)}70%{transform:rotateY(180deg) translateX(6px)}}

/* Wheel */
.wheel-status{position:absolute;top:20px;font-size:12px;color:#e5d4a2}.wheel-tick{position:absolute;left:calc(50% - 1px);top:3px;width:2px;height:14px;background:#6d2b28;transform-origin:1px 150px;z-index:2}.pointer{transform-origin:50% 0}.pointer.tick{animation:pointerTick .14s ease}.wheel span.landed{animation:sectorLand .45s ease}.wheel-wrap{filter:drop-shadow(0 18px 22px #0004)}@keyframes pointerTick{50%{transform:rotate(-14deg) translateY(3px)}}@keyframes sectorLand{50%{font-size:24px;color:#fff}}

/* Red/black card deal */
.poker-card{transform-style:preserve-3d;backface-visibility:hidden}.poker-card.deal-from-shoe{will-change:transform,opacity}.poker-card.deal-red{animation:dealRed .34s cubic-bezier(.18,.8,.28,1) both}.poker-card.deal-black{animation:dealBlack .34s cubic-bezier(.18,.8,.28,1) both}.poker-card.reveal{animation:cardReveal .32s ease both}.side-winner{animation:winnerLift .45s ease both}.side-winner .poker-card{box-shadow:0 0 0 3px #e0bd67,0 15px 30px #0005}.side-loser{opacity:.58;transform:translateY(8px)}#deal-status{min-width:120px;text-align:center}@keyframes dealRed{from{opacity:.2;transform:translate(260px,-170px) rotate(16deg) scale(.72)}to{opacity:1;transform:none}}@keyframes dealBlack{from{opacity:.2;transform:translate(80px,-170px) rotate(-12deg) scale(.72)}to{opacity:1;transform:none}}@keyframes cardReveal{0%{transform:rotateY(90deg) scale(.95)}100%{transform:none}}@keyframes winnerLift{to{transform:translateY(-12px) scale(1.035)}}

/* Gomoku */
.gomoku-status{min-width:150px;text-align:center;z-index:3}.thinking-dots{display:inline-flex;gap:3px;margin-left:5px}.thinking-dots i{width:4px;height:4px;border-radius:50%;background:#e7cf91;animation:thinking 1s infinite ease-in-out}.thinking-dots i:nth-child(2){animation-delay:.14s}.thinking-dots i:nth-child(3){animation-delay:.28s}.gomoku-board button:not(.black-piece):not(.white-piece):hover::before{content:"";position:absolute;width:58%;aspect-ratio:1;border-radius:50%;left:21%;top:21%;background:#17201d2e}.gomoku-board .stone-pop::after{animation:stoneDrop .2s cubic-bezier(.2,.8,.3,1.25)}.gomoku-board [data-last-move]{position:absolute;z-index:2;left:calc(50% - 2px);top:calc(50% - 2px);width:4px;height:4px;border-radius:50%;background:#c8493e;pointer-events:none}.gomoku-board .win-stone::after{animation:winStone .42s ease both;box-shadow:0 0 0 3px #c8493e,0 0 15px #f4d27a}.gomoku-board{width:min(100%,520px)}@keyframes thinking{0%,60%,100%{opacity:.3;transform:translateY(0)}30%{opacity:1;transform:translateY(-3px)}}@keyframes stoneDrop{from{opacity:0;transform:scale(.3) translateY(-10px)}to{opacity:1;transform:none}}@keyframes winStone{50%{transform:scale(1.18)}}

/* Settlement */
#settlement-dialog{opacity:0;transform:scale(.96) translateY(8px);transition:opacity .2s ease,transform .22s cubic-bezier(.2,.8,.2,1)}#settlement-dialog::backdrop{opacity:0;transition:opacity .18s ease}#settlement-dialog.settlement-enter{opacity:1;transform:none}#settlement-dialog.settlement-enter::backdrop{opacity:1}.settle-burst{position:absolute;left:50%;top:64px;width:1px;height:1px}.settle-burst i{position:absolute;width:4px;height:13px;background:#d8ad4e;transform-origin:0 42px;animation:shardBurst .65s ease-out both;animation-delay:var(--shard-delay);rotate:var(--angle)}.settle-icon{position:relative;z-index:2}.settlement-enter .settle-icon{animation:settleMark .38s cubic-bezier(.2,.9,.3,1.25) both}@keyframes settleMark{from{opacity:0;transform:scale(.45) rotate(-10deg)}to{opacity:1;transform:none}}@keyframes shardBurst{from{opacity:1;transform:translateY(0) scale(1)}to{opacity:0;transform:translateY(-54px) scale(.4)}}

@media(max-width:800px){.room-tools{grid-column:1/-1;justify-self:stretch;justify-content:center;display:flex;flex-wrap:wrap;margin-top:12px}.round-info{margin-top:0}.game-utilities button{width:34px;height:34px}.game-actions{position:sticky;bottom:0;z-index:8;flex-wrap:wrap;gap:10px;background:#17241fee;padding:10px 0 max(6px,env(safe-area-inset-bottom));backdrop-filter:blur(8px)}.choice-group{flex:0 1 auto}.choice-group button{flex:1 1 0;padding:10px 14px;white-space:normal}.dice-tray{height:260px}.dice-cup-lid{width:205px;height:166px}.real-die{width:72px;height:72px;padding:9px}.real-die i{width:12px;height:12px}.ways-grid{height:min(100%,360px);min-height:0}.ways-status{width:calc(100% - 32px);min-width:0;line-height:1.4}.table-surface{min-height:clamp(380px,60dvh,500px)}.match-grid{gap:8px}.wheel-tick{transform-origin:1px 120px}}
@media(max-width:480px){.balance{min-width:100px;padding-left:12px}.icon-text{padding:9px 10px}.roombar h1{font-size:26px;line-height:1.15}.game-rail{grid-template-columns:1fr}.game-card{height:142px}.game-card:nth-child(n){border-right:0}.game-copy{bottom:32px}.game-art{right:18px;top:18px}.enter{bottom:11px}.versus{gap:10px}.poker-card{width:105px;height:160px}.dice-cup{gap:18px}}
@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.01ms!important;animation-delay:0ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.01ms!important}.wheel{transition:none!important}.ways-tile,.poker-card,.real-die{will-change:auto!important}}
@media(max-width:900px){.role-layout{grid-template-columns:1fr}}
@media(max-width:800px){.gift-button{display:block;padding:8px 9px;font-size:12px}.role-head{flex-wrap:wrap;gap:12px}.role-session{display:flex;width:100%;justify-content:space-between}.route-user .route-nav{display:none}.route-user .appbar{gap:8px}.route-user .brand{margin-right:auto}.route-user .balance{margin-left:0;min-width:72px;padding-left:8px}.route-user .balance b{font-size:17px}}
@media(max-width:480px){.route-user .brand>span:last-child{display:none}.route-user .brand{gap:0}.route-user .account-button{max-width:82px}.route-user .balance{min-width:66px}}

/* Game-feel system: short input feedback, deliberate reveal timing, calm idle surfaces. */
:root{--ease-table:cubic-bezier(.16,1,.3,1);--ease-spring:cubic-bezier(.2,.9,.25,1.18);--motion-fast:140ms;--motion-base:260ms;--motion-slow:520ms}
.table-frame{position:relative;border:1px solid #8b6a52;background:#49362b;padding:5px;border-radius:8px;box-shadow:0 24px 55px #07110d80,0 2px 0 #a27b5e inset;transition:transform var(--motion-base) var(--ease-table),box-shadow var(--motion-base) ease}
.table-frame::before{content:"";position:absolute;inset:8px;border:1px solid #ffffff12;border-radius:4px;pointer-events:none;z-index:3}
.table-frame .table-surface{border-width:4px;box-shadow:inset 0 0 0 2px #ffffff10;isolation:isolate}
.game-stage[data-phase="requesting"] .table-frame,.game-stage[data-phase="starting"] .table-frame{box-shadow:0 24px 55px #07110d80,0 0 0 2px #d5b87055}
.game-stage[data-phase="thinking"] .table-frame{box-shadow:0 24px 55px #07110d80,0 0 0 2px #d5b8703d}
.round-win .table-frame{animation:tableWin .58s var(--ease-table) both}.round-lose .table-frame{animation:tableLose .46s ease both}.round-push .table-frame{animation:tablePush .48s ease both}
@keyframes tableWin{35%{transform:translateY(-3px) scale(1.008);box-shadow:0 26px 60px #07110d80,0 0 0 4px #e1bd677a,0 0 32px #e1bd6745}100%{transform:none}}
@keyframes tableLose{35%{transform:translateY(2px);filter:saturate(.72)}100%{transform:none;filter:none}}
@keyframes tablePush{45%{box-shadow:0 24px 55px #07110d80,0 0 0 3px #d9d5c768}100%{box-shadow:0 24px 55px #07110d80}}

.round-info{position:relative;min-width:230px}.round-info>span{display:flex!important;justify-content:space-between;align-items:center;gap:12px}.round-info>span small{color:#d9bd78;font-size:9px;font-weight:700}.wager-control{justify-content:flex-end}.bet-presets{display:flex;justify-content:flex-end;gap:5px;margin-top:6px}.bet-presets button{min-width:38px;height:24px;border:1px solid #ffffff22;background:#ffffff09;color:#ffffffa6;border-radius:3px;font-size:10px;font-variant-numeric:tabular-nums}.bet-presets button.selected{background:#d1ae5a;color:#17241f;border-color:#d1ae5a;font-weight:800}.bet-locked .bet-presets{opacity:.56}.round-info.wager-pulse{animation:wagerPulse .24s var(--ease-spring)}.round-info.bet-confirm{animation:betConfirm .38s var(--ease-spring)}
@keyframes wagerPulse{50%{transform:translateY(-2px)}}@keyframes betConfirm{35%{transform:scale(1.04);filter:brightness(1.18)}100%{transform:none;filter:none}}

.status-swap{animation:statusSwap .24s var(--ease-table)}.ui-pulse{animation:uiPulse .22s var(--ease-spring)}.choice-pop{animation:choicePop .24s var(--ease-spring)}
@keyframes statusSwap{from{opacity:.28;transform:translateY(4px)}to{opacity:1;transform:none}}@keyframes uiPulse{50%{transform:scale(1.04)}}@keyframes choicePop{45%{transform:translateY(-2px) scale(1.025)}}

.ways-grid.is-shuffling .ways-tile{animation:tileShuffle .5s ease-in-out infinite alternate;animation-delay:var(--tile-delay)}
@keyframes tileShuffle{from{transform:translateY(-2px) rotate(-.7deg);filter:brightness(.92)}to{transform:translateY(3px) rotate(.7deg);filter:brightness(1.08)}}
.ways-grid{transition:filter var(--motion-base) ease,transform var(--motion-base) var(--ease-table)}.ways-status,.dice-total,.wheel-status,#deal-status,#match-note,.gomoku-status{will-change:transform,opacity}

.dice-tray::after{content:"";position:absolute;left:18%;right:18%;bottom:22px;height:24px;border-radius:50%;background:#081b1480;filter:blur(9px);z-index:0}.dice-cup-lid.shaking{animation:cupShake 1.02s var(--ease-table) infinite}.dice-cup-lid.lifted{animation:cupLift .44s var(--ease-table) both}.dice-cup.rolling .real-die{filter:blur(.25px);transition:transform 70ms linear}.dice-cup.revealed .real-die{animation:dieSettle .38s var(--ease-spring) both}.dice-cup.revealed .real-die:nth-child(2){animation-delay:45ms}
@keyframes dieSettle{0%{transform:translateY(-18px) rotate(var(--die-rotate)) scale(.88)}65%{transform:translateY(4px) rotate(var(--die-rotate)) scale(1.04)}100%{transform:rotate(var(--die-rotate))}}

.wheel b{display:grid!important;align-content:center;gap:1px}.wheel b i{font-style:normal;font-size:28px;line-height:1}.wheel b small{font-size:8px;color:#d8be83}.wheel.spinning{filter:saturate(1.08) brightness(1.03)}.pointer{filter:drop-shadow(0 3px 2px #0007)}.wheel span.landed{animation:sectorLand .68s var(--ease-spring)}
@keyframes sectorLand{35%{font-size:25px;color:#fff;filter:drop-shadow(0 0 7px #fff7)}100%{filter:none}}

.side>span{display:flex!important;align-items:center;justify-content:center;gap:7px;font-weight:800}.side>span i{width:7px;height:7px;border-radius:50%;background:#c8493e;box-shadow:0 0 0 3px #c8493e26}.side.black>span i{background:#151b18;box-shadow:0 0 0 3px #ffffff1f}.side>small{display:block;margin-top:11px;color:#d7cda9;font-size:10px}.versus em{display:grid;gap:2px;text-align:center}.versus em b{font-style:normal;font-size:30px}.versus em small{font-style:normal;font-family:system-ui;font-size:9px;color:#ffffff70}.winner-pulse{animation:winnerPulse .58s var(--ease-spring)}.side-loser{transition:opacity .3s ease,transform .3s var(--ease-table)}
@keyframes winnerPulse{42%{transform:translateY(-15px) scale(1.055);filter:brightness(1.16)}}

.match-status{grid-template-columns:1fr minmax(130px,1.4fr) 1fr;display:grid!important;align-items:center}.match-status b{text-align:center;color:#efd18c;font-size:11px}.match-status span:last-child{text-align:right}.match-grid.waiting{opacity:.72;pointer-events:none}.match-grid.shuffling .match-card{animation:cardShuffle .52s var(--ease-table) infinite alternate}.match-grid.shuffling .match-card:nth-child(2n){animation-delay:70ms}.match-grid.shuffling .match-card:nth-child(3n){animation-delay:130ms}.match-card.card-reveal .match-card-inner{animation:cardLift .34s var(--ease-spring)}.match-card.pair-found .match-card-inner{animation:pairFound .46s var(--ease-spring)}.match-grid.finished .match-card.open:not(.matched){opacity:.82}
@keyframes cardShuffle{from{transform:translateY(0) rotate(-.5deg)}to{transform:translateY(-8px) rotate(.5deg)}}@keyframes cardLift{50%{transform:rotateY(180deg) translateY(-7px) scale(1.035)}}@keyframes pairFound{45%{transform:rotateY(180deg) translateY(-10px) scale(1.07);filter:brightness(1.13)}}

.gomoku-players{position:absolute;left:22px;right:22px;top:14px;display:flex;justify-content:space-between;z-index:4;pointer-events:none}.gomoku-players>span{display:grid;grid-template-columns:9px auto;column-gap:7px;align-items:center;color:#ffffff91}.gomoku-players i{grid-row:1/3;width:8px;height:8px;border-radius:50%;background:#171d1a;border:1px solid #ffffff2b}.gomoku-players span:last-child i{background:#f4f0e7}.gomoku-players b{font-size:11px}.gomoku-players small{font-size:9px}.gomoku-players .active{color:#f0d490}.gomoku-players .active i{box-shadow:0 0 0 4px #d8b7652e,0 0 12px #d8b765}.gomoku-status{top:48px}.gomoku-board{position:relative;margin-top:46px;width:min(100%,500px)}.board-star{position:absolute;z-index:0;width:6px;height:6px;border-radius:50%;background:#6e522e;left:calc(var(--col) * 100% / 14);top:calc(var(--row) * 100% / 14);transform:translate(-50%,-50%);pointer-events:none}.gomoku-board button{z-index:1}.gomoku-board .stone-pop::after{animation:stoneDrop .26s var(--ease-spring)}

#settlement-dialog{overflow:hidden}#settlement-dialog.outcome-win{border-color:#d6b563}#settlement-dialog.outcome-lose{border-color:#cf736a}#settlement-dialog.outcome-push{border-color:#8d9f96}.settlement-enter #settlement>*{animation:settleContent .38s var(--ease-table) both}.settlement-enter #settlement>*:nth-child(2){animation-delay:40ms}.settlement-enter #settlement>*:nth-child(3){animation-delay:80ms}.settlement-enter #settlement>*:nth-child(4){animation-delay:110ms}.settlement-enter #settlement>*:nth-child(5){animation-delay:140ms}.settlement-enter #settlement>*:nth-child(6){animation-delay:170ms}#settlement-dialog.settlement-exit{opacity:0;transform:scale(.97) translateY(8px)}
@keyframes settleContent{from{opacity:0;transform:translateY(9px)}to{opacity:1;transform:none}}

@media(max-width:800px){.table-frame{padding:3px}.round-info{width:100%;min-width:0}.round-info>span,.wager-control,.bet-presets{justify-content:center}.bet-presets{margin-top:7px}.gomoku-players{left:12px;right:12px}.gomoku-board{margin-top:52px}.match-status{grid-template-columns:1fr 1.4fr 1fr;gap:4px}.match-status b{font-size:10px}}
@media(max-width:480px){.bet-presets button{min-width:34px}.gomoku-players b{font-size:10px}.gomoku-players small{font-size:8px}.match-status b{max-width:120px;justify-self:center}.wheel b i{font-size:24px}}

.game-card{animation:gameCardIn .42s var(--ease-table) both}.game-card:nth-child(2){animation-delay:45ms}.game-card:nth-child(3){animation-delay:90ms}.game-card:nth-child(4){animation-delay:135ms}.game-card:nth-child(5){animation-delay:180ms}.game-card:nth-child(6){animation-delay:225ms}.game-card .game-art,.game-card .enter{transition:transform var(--motion-base) var(--ease-table),opacity var(--motion-base) ease}.game-card:hover .game-art{transform:translate(-4px,3px) scale(1.08);opacity:.9}.game-card:hover .enter{transform:translateX(3px)}.history-row{animation:historyIn .28s var(--ease-table) both}.history-row:nth-child(2){animation-delay:35ms}.history-row:nth-child(3){animation-delay:70ms}.history-row:nth-child(4){animation-delay:105ms}
@keyframes gameCardIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}@keyframes historyIn{from{opacity:0;transform:translateX(-5px)}to{opacity:1;transform:none}}

/* Turbo mode skips both scripted waits and CSS motion so table state stays synchronized. */
.turbo-mode *,.turbo-mode *::before,.turbo-mode *::after{animation-duration:.01ms!important;animation-delay:0ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}.turbo-mode .wheel{transition:none!important}
#settlement-dialog{max-height:calc(100dvh - 24px);overflow:auto}#settlement-dialog.settlement-exit::backdrop{opacity:0}
@media(max-width:800px){.dice-cup-lid.lifted{animation-name:cupLiftNarrow}.poker-card.deal-red{animation-name:dealRedNarrow}.poker-card.deal-black{animation-name:dealBlackNarrow}@keyframes cupLiftNarrow{to{transform:translate(min(12vw,56px),-108px) rotate(12deg);opacity:.42}}@keyframes dealRedNarrow{from{opacity:.2;transform:translate(58px,-78px) rotate(12deg) scale(.78)}to{opacity:1;transform:none}}@keyframes dealBlackNarrow{from{opacity:.2;transform:translate(-58px,-78px) rotate(-10deg) scale(.78)}to{opacity:1;transform:none}}}
