:root {
  --ink:#17344a;--muted:#698394;--blue-50:#f5fbfe;--blue-100:#e4f6fb;--blue-200:#c6eaf6;--blue-500:#43a9cd;--blue-700:#247a9e;
  --tank:#6f9fd6;--tank-soft:#edf4fc;--healer:#72b58a;--healer-soft:#eef8f1;--dps:#d98383;--dps-soft:#fff1f1;
  --white:#fff;--shadow:0 20px 54px rgba(35,112,143,.14);
}
*{box-sizing:border-box}body{margin:0;min-height:100vh;color:var(--ink);font-family:"Noto Sans TC","Microsoft JhengHei",system-ui,sans-serif;background:linear-gradient(145deg,#f9fdff 0%,#dff4fb 50%,#f8fcff 100%);overflow-x:hidden}
[hidden]{display:none!important}
button,input{font:inherit}.sky-glow{position:fixed;z-index:-1;border-radius:50%;filter:blur(16px);opacity:.58}.sky-glow--one{width:440px;height:440px;top:-180px;right:-80px;background:#afe7fa}.sky-glow--two{width:360px;height:360px;bottom:-160px;left:-100px;background:#c9eeff}
.topbar{width:min(1180px,calc(100% - 40px));margin:0 auto;padding:22px 0;display:flex;align-items:center;gap:18px}.brand{display:flex;align-items:center;gap:10px;margin-right:auto;color:var(--ink);text-decoration:none}.brand-star{display:grid;place-items:center;width:38px;height:38px;border-radius:12px;color:#fff;background:var(--blue-700);box-shadow:0 8px 18px rgba(36,122,158,.22)}.brand strong,.brand small{display:block}.brand small{margin-top:2px;color:var(--muted);font-size:.58rem;letter-spacing:.14em}
.connection-badge,.count-pill{padding:7px 11px;border-radius:99px;color:var(--blue-700);background:var(--blue-100);font-size:.75rem;font-weight:800}.connection-badge.is-online{color:#397554;background:#e9f7ee}.user-area{display:flex;align-items:center;gap:9px;font-size:.85rem;font-weight:750}.user-area img{width:32px;height:32px;border-radius:50%;object-fit:cover;background:var(--blue-100)}.role-badge{padding:4px 8px;border-radius:999px;color:var(--blue-700);background:var(--blue-100);font-size:.62rem}
main{width:min(1120px,calc(100% - 40px));margin:0 auto 50px}.view{animation:view-in .45s ease both}@keyframes view-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}.glass-panel{border:1px solid rgba(255,255,255,.85);border-radius:26px;background:rgba(255,255,255,.72);box-shadow:var(--shadow);backdrop-filter:blur(18px)}
.welcome-view{min-height:calc(100vh - 110px);display:grid;grid-template-columns:1.2fr .8fr;gap:60px;align-items:center;padding:48px 0 90px}.eyebrow,.step-label{margin:0;color:var(--blue-700);font-size:.72rem;font-weight:850;letter-spacing:.17em}.welcome-copy h1,.view-heading h1{margin:12px 0 18px;font-size:clamp(2.5rem,5vw,4.8rem);line-height:1.12;letter-spacing:-.05em}.lead{max-width:650px;color:var(--muted);font-size:1.05rem;line-height:1.8}.setup-notice{display:flex;flex-direction:column;gap:5px;margin-top:24px;padding:15px 17px;border-left:3px solid var(--blue-500);border-radius:0 13px 13px 0;background:rgba(255,255,255,.55);font-size:.84rem}.setup-notice span{color:var(--muted)}
.login-card{padding:30px}.login-card h2,.lobby-card h2{margin:8px 0 25px}.primary-button,.secondary-button,.text-button{border:0;cursor:pointer;font-weight:800;transition:.2s ease}.login-card label,.lobby-card label{display:block;margin:0 0 7px;color:var(--muted);font-size:.78rem;font-weight:750}.login-card input{margin-bottom:13px}.inline-form{display:flex;gap:9px}input{width:100%;min-width:0;padding:13px 15px;border:1px solid #c8e2ec;border-radius:12px;color:var(--ink);background:rgba(255,255,255,.9);outline:none}input:focus{border-color:var(--blue-500);box-shadow:0 0 0 4px rgba(67,169,205,.13)}.primary-button{padding:12px 19px;border-radius:12px;color:#fff;background:var(--blue-700);box-shadow:0 8px 20px rgba(36,122,158,.2)}.primary-button:hover:not(:disabled){background:#1d6d8c;transform:translateY(-1px)}.primary-button:disabled{cursor:not-allowed;opacity:.45}.secondary-button{padding:11px 17px;border:1px solid #acd9e9;border-radius:12px;color:var(--blue-700);background:rgba(255,255,255,.76)}.secondary-button.compact{padding:8px 12px;font-size:.78rem}.text-button{padding:6px;color:var(--muted);background:transparent}.privacy-note{margin:18px 0 0;color:#8ba0ad;font-size:.7rem;line-height:1.5}
.lobby-view{padding:65px 0}.view-heading{margin-bottom:26px}.view-heading h1{font-size:clamp(2.3rem,4vw,4rem)}.lobby-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:22px}.lobby-card{padding:30px}.lobby-card input{margin-bottom:13px}.full-button{width:100%}
.dashboard-section{margin-top:22px;padding:28px}.dashboard-section .section-heading{margin-bottom:16px}.dashboard-list,.history-list{display:grid;gap:10px}.dashboard-item{display:flex;align-items:center;justify-content:space-between;gap:18px;padding:14px 16px;border:1px solid #d7eaf0;border-radius:15px;background:rgba(247,252,254,.8)}.dashboard-item strong,.dashboard-item span,.history-heading strong,.history-heading span{display:block}.dashboard-item span,.history-heading span{margin-top:4px;color:var(--muted);font-size:.72rem}.history-entry{padding:17px;border:1px solid #d7eaf0;border-radius:17px;background:rgba(247,252,254,.8)}.history-heading{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:13px}.history-results{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}.history-results>span{display:flex;align-items:center;gap:8px;min-width:0;padding:9px 10px;border:1.5px solid var(--role-color);border-radius:11px;background:var(--role-soft);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.72rem}.history-results>span b{font-family:Georgia,serif;font-size:.9rem}.history-results>[data-kind=tank]{--role-color:var(--tank);--role-soft:var(--tank-soft)}.history-results>[data-kind=healer]{--role-color:var(--healer);--role-soft:var(--healer-soft)}.history-results>[data-kind=dps]{--role-color:var(--dps);--role-soft:var(--dps-soft)}
.room-view{padding:32px 0 70px}.room-header{display:flex;justify-content:space-between;align-items:center;gap:30px;padding:25px 28px;margin-bottom:22px}.room-header h1{margin:6px 0 0;font-size:clamp(1.7rem,3vw,2.5rem)}.room-code-block{text-align:right}.room-code-block>span{display:block;color:var(--muted);font-size:.7rem}.room-code-block strong{display:inline-block;margin:3px 10px 0 0;font-family:monospace;font-size:1.35rem;letter-spacing:.1em}.party-panel,.cards-panel,.result-panel{padding:28px;margin-bottom:22px}.section-heading{display:flex;align-items:end;justify-content:space-between;gap:18px;margin-bottom:22px}.section-heading h2{margin:6px 0 0;font-size:1.55rem}.player-list{display:grid;grid-template-columns:repeat(8,1fr);gap:10px}.player-seat{min-width:0;padding:14px 8px;border:1px solid #d7eaf0;border-radius:15px;background:rgba(242,250,253,.72);text-align:center}.player-seat.is-empty{opacity:.46}.avatar-shell{position:relative;width:48px;height:48px;margin:0 auto 8px}.avatar-shell img,.avatar-fallback{position:absolute;inset:0;width:100%;height:100%;border-radius:50%;object-fit:cover;background:var(--blue-100)}.avatar-fallback{display:grid;place-items:center;color:var(--blue-700);font-weight:850}.player-seat strong,.player-seat small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.player-seat strong{font-size:.78rem}.player-seat small{margin-top:3px;color:var(--muted);font-size:.62rem}.host-actions{display:flex;justify-content:space-between;align-items:center;gap:16px;margin-top:20px}.host-actions p{margin:0;color:var(--muted);font-size:.82rem}
.danger-button{border:1px solid #e4b6b6;border-radius:12px;color:#a55252;background:#fff5f5;cursor:pointer;font-weight:800}.danger-button.compact{padding:8px 12px;font-size:.78rem}.danger-text{color:#a55252}
.card-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:17px}.role-card{width:100%;aspect-ratio:2/3;padding:0;border:0;border-radius:19px;background:transparent;cursor:pointer;perspective:1000px}.role-card:disabled{cursor:not-allowed}.card-inner{position:relative;display:block;width:100%;height:100%;transform-style:preserve-3d;transition:transform .7s cubic-bezier(.2,.75,.2,1)}.role-card.is-flipped .card-inner{transform:rotateY(180deg)}.card-face{position:absolute;inset:0;display:grid;place-items:center;border-radius:19px;overflow:hidden;backface-visibility:hidden;box-shadow:0 12px 25px rgba(29,93,119,.17)}.card-front{border:3px solid #fff;background:#d7f1fa}.card-front img{width:100%;height:100%;object-fit:contain}.card-number{position:absolute;right:10px;bottom:10px;width:29px;height:29px;display:grid;place-items:center;border-radius:50%;color:#fff;background:rgba(18,64,86,.62);font-size:.72rem}.card-back{transform:rotateY(180deg);align-content:center;gap:6px;border:3px solid var(--role-color,#acd9e9);color:var(--role-ink,var(--ink));background:radial-gradient(circle at 50% 15%,#fff 0%,var(--role-soft,#edf8fc) 70%,#e8f5fa 100%)}.role-card[data-kind=tank]{--role-color:var(--tank);--role-ink:#3f6fa7;--role-soft:var(--tank-soft)}.role-card[data-kind=healer]{--role-color:var(--healer);--role-ink:#427c57;--role-soft:var(--healer-soft)}.role-card[data-kind=dps]{--role-color:var(--dps);--role-ink:#a55252;--role-soft:var(--dps-soft)}.role-icon{font-size:2rem}.role-name{font-family:Georgia,serif;font-size:2.7rem}.role-type{font-weight:750;opacity:.72}.claimed-player{position:absolute;left:10px;right:10px;bottom:13px;padding:7px;border-radius:10px;background:rgba(255,255,255,.78);font-size:.7rem;font-weight:800}.role-card.is-claimed:not(.is-mine){opacity:.68}.role-card.is-dealing{animation:deal-in .75s cubic-bezier(.2,.72,.22,1) var(--delay) both}@keyframes deal-in{from{opacity:0;transform:translateY(-30px) scale(.88) rotate(var(--tilt))}to{opacity:1;transform:none}}
.result-list{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.result-item{display:flex;align-items:center;gap:10px;padding:12px;border:1.5px solid var(--role-color);border-radius:13px;background:var(--role-soft)}.result-item[data-kind=tank]{--role-color:var(--tank);--role-soft:var(--tank-soft)}.result-item[data-kind=healer]{--role-color:var(--healer);--role-soft:var(--healer-soft)}.result-item[data-kind=dps]{--role-color:var(--dps);--role-soft:var(--dps-soft)}.result-role{font-family:Georgia,serif;font-size:1.15rem;font-weight:850}.result-item span:last-child{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.78rem}.empty-state{grid-column:1/-1;padding:28px;border:1px dashed #b8dce8;border-radius:15px;color:var(--muted);text-align:center}.toast{position:fixed;left:50%;bottom:25px;z-index:10;max-width:min(90vw,520px);padding:11px 17px;border-radius:12px;color:#fff;background:#1d536d;box-shadow:0 10px 30px rgba(20,69,92,.26);opacity:0;pointer-events:none;transform:translate(-50%,12px);transition:.25s}.toast.is-visible{opacity:1;transform:translate(-50%,0)}
@media(max-width:900px){.welcome-view{grid-template-columns:1fr;gap:28px}.welcome-copy h1{font-size:clamp(2.5rem,8vw,4.2rem)}.player-list{grid-template-columns:repeat(4,1fr)}.result-list,.history-results{grid-template-columns:repeat(2,1fr)}}
@media(max-width:600px){.topbar,main{width:min(100% - 24px,1120px)}.topbar{flex-wrap:wrap}.connection-badge{order:3}.welcome-view{padding:25px 0}.login-card,.lobby-card,.party-panel,.cards-panel,.result-panel,.dashboard-section{padding:20px}.lobby-grid{grid-template-columns:1fr}.room-header,.host-actions{align-items:flex-start;flex-direction:column}.room-code-block{text-align:left}.player-list{grid-template-columns:repeat(2,1fr)}.card-grid{grid-template-columns:repeat(2,1fr);gap:10px}.result-list,.history-results{grid-template-columns:1fr}.dashboard-item{align-items:flex-start;flex-direction:column}}

/* 第二階段：確認、鎖牌與同步開牌 */
.confirm-status{display:inline-block;margin-top:8px;padding:3px 7px;border-radius:999px;color:#7f94a0;background:#edf4f7;font-size:.58rem;font-weight:850}
.confirm-status.is-confirmed{color:#28724b;background:#e1f5e9}
.draw-actions{display:flex;justify-content:flex-end;flex-wrap:wrap;gap:9px}
.reveal-countdown{margin:-5px 0 20px;padding:14px 18px;border:1px solid #9fd5e7;border-radius:14px;color:var(--blue-700);background:linear-gradient(90deg,rgba(220,245,252,.92),rgba(245,252,255,.92));text-align:center;font-weight:850}
.locked-player{position:absolute;left:10px;right:48px;bottom:10px;padding:7px 9px;border-radius:10px;color:#fff;background:rgba(18,64,86,.76);font-size:.66rem;font-weight:850}
.role-card.is-locked .card-front{border-color:#69b9d5;box-shadow:0 0 0 4px rgba(105,185,213,.18),0 12px 25px rgba(29,93,119,.17)}
.role-card.is-locked:not(.is-mine){opacity:.72}
@media(max-width:600px){.draw-actions{width:100%;justify-content:flex-start}.draw-actions button{width:100%}}
@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}

/* Fast, transform-only deal motion keeps the full eight-card sequence under one second. */
.role-card.is-dealing{animation:deal-in .4s cubic-bezier(.2,.8,.24,1) var(--delay) both}
@keyframes deal-in{0%{opacity:0;transform:translate3d(80px,-70px,0) scale(.86) rotate(7deg)}78%{opacity:1;transform:translate3d(-3px,2px,0) scale(1.015) rotate(-1deg)}100%{opacity:1;transform:translate3d(0,0,0) scale(1) rotate(0)}}
