[hidden]{display:none!important}
.plaza-shell{position:relative;z-index:2;max-width:1360px;margin:0 auto;padding:0 var(--pad) 100px}
.plaza-hero{padding:clamp(48px,8vw,108px) 0 34px;max-width:850px}
.plaza-hero h1{font-family:var(--font-display);font-size:clamp(38px,6vw,72px);line-height:1;margin:10px 0 18px}
.plaza-hero .lead{font-family:var(--font-serif);font-size:clamp(18px,1.7vw,23px);line-height:1.5;color:var(--muted);max-width:66ch}
.plaza-gate,.plaza-loading{border:1px solid var(--line);background:rgba(10,8,18,.88);padding:clamp(28px,5vw,54px);text-align:center;max-width:700px;margin:20px auto}
.plaza-gate h2{font-family:var(--font-display);font-size:clamp(22px,3vw,32px);margin:10px 0}
.plaza-gate p{font-family:var(--font-serif);font-size:18px;color:var(--muted);margin:0 auto 24px;max-width:48ch}
.plaza-seal{font-family:var(--font-cjk);font-size:42px;color:var(--gold)}
.plaza-loading{display:flex;align-items:center;justify-content:center;gap:14px;font-family:var(--font-mono);font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}
.orbit{width:22px;height:22px;border:1px solid var(--line);border-top-color:var(--gold);border-radius:50%;animation:orbit 1s linear infinite}@keyframes orbit{to{transform:rotate(360deg)}}
.plaza-heading{display:flex;align-items:end;justify-content:space-between;gap:20px;margin:0 0 22px}
.plaza-heading h2{font-family:var(--font-display);font-size:clamp(24px,3vw,36px);margin:0}
.plaza-heading p{font-family:var(--font-serif);font-size:17px;color:var(--muted);margin:6px 0 0}
.game-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}
.game-card{position:relative;overflow:hidden;border:1px solid var(--line);background:linear-gradient(145deg,rgba(24,17,39,.95),rgba(10,8,18,.96));padding:clamp(24px,3vw,38px);min-height:310px;display:flex;flex-direction:column}
.game-card:before{content:"";position:absolute;width:220px;height:220px;border:1px solid rgba(226,189,119,.08);border-radius:50%;right:-90px;top:-100px;box-shadow:0 0 80px rgba(111,76,161,.13)}
.game-card__sigil{font-family:var(--font-cjk);font-size:38px;color:var(--gold);margin-bottom:30px}
.game-card h3{font-family:var(--font-display);font-size:clamp(23px,2.6vw,31px);margin:0 0 12px}
.game-card p{font-family:var(--font-serif);font-size:18px;line-height:1.5;color:var(--muted);margin:0 0 24px;max-width:45ch}
.game-card__meta{font-family:var(--font-mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--gold);margin-top:auto;margin-bottom:16px}
.game-card__actions{display:flex;gap:10px;flex-wrap:wrap}.game-card__actions .btn{border:0}.btn--line{border:1px solid var(--line)!important;background:transparent;color:var(--ivory)}
.match-filter{display:flex;align-items:center;gap:9px;margin:14px 0 0;font-family:var(--font-mono);font-size:11px;line-height:1.4;color:var(--muted)}
.match-filter input{accent-color:var(--gold)}
.plaza-lower{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:20px}
.plaza-panel{border:1px solid var(--line);background:rgba(10,8,18,.82);padding:24px}
.plaza-panel h3{font-family:var(--font-display);font-size:20px;margin:0 0 15px}
.invite-row,.friend-row{display:flex;align-items:center;gap:13px;padding:13px 0;border-top:1px solid var(--line-soft)}
.invite-row:first-child,.friend-row:first-child{border-top:0}.person-av{width:40px;height:40px;border-radius:50%;display:grid;place-items:center;overflow:hidden;color:var(--ink);background:linear-gradient(135deg,var(--gold-bright),var(--gold));font-family:var(--font-display)}
.person-av img{width:100%;height:100%;object-fit:cover}.person-id{min-width:0;flex:1}.person-id strong{display:block;font-family:var(--font-serif);font-size:17px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.person-id span{font-family:var(--font-mono);font-size:10px;color:var(--muted-2)}
.mini-actions{display:flex;gap:7px}.mini-btn{font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;border:1px solid var(--line);background:transparent;color:var(--ivory);padding:8px 10px;cursor:pointer}.mini-btn--gold{background:var(--gold);color:var(--ink);border-color:var(--gold)}
.queue-card{border:1px solid var(--gold-deep);background:rgba(226,189,119,.05);padding:24px;text-align:center}.queue-card .orbit{display:block;margin:0 auto 16px}.queue-card strong{display:block;font-family:var(--font-display);font-size:21px}.queue-card p{font-family:var(--font-serif);color:var(--muted);margin:8px 0 18px}
.room-top{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:18px}.room-back{font-family:var(--font-mono);font-size:11px;color:var(--muted);background:none;border:0;cursor:pointer}.room-back:hover{color:var(--gold)}
.room-stage{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:20px}.playboard,.room-chat{border:1px solid var(--line);background:rgba(10,8,18,.9)}.playboard{padding:clamp(24px,4vw,46px);min-height:570px}.room-chat{display:flex;flex-direction:column;min-height:570px}
.players{display:flex;align-items:center;justify-content:center;gap:15px;margin-bottom:36px}.player-chip{display:flex;align-items:center;gap:8px;font-family:var(--font-serif);font-size:16px}.player-chip .person-av{width:34px;height:34px}.resonance-line{flex:1;max-width:190px;height:1px;background:linear-gradient(90deg,transparent,var(--gold),transparent);position:relative}.resonance-line:after{content:"✦";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background:var(--void);color:var(--gold);padding:0 8px}
.round-meta{display:flex;justify-content:space-between;gap:10px;font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--gold);margin-bottom:15px}.question-prompt{font-family:var(--font-serif);font-size:clamp(25px,3.3vw,40px);line-height:1.18;margin:0 0 28px;max-width:22ch}.private-clue{border-inline-start:2px solid var(--gold);padding:13px 16px;margin:0 0 24px;background:rgba(226,189,119,.05)}.private-clue span{display:block;font-family:var(--font-mono);font-size:9px;letter-spacing:.13em;text-transform:uppercase;color:var(--gold);margin-bottom:5px}.private-clue strong{font-family:var(--font-serif);font-size:18px}
.answer-grid{display:grid;gap:11px}.answer-btn{width:100%;text-align:start;padding:15px 17px;border:1px solid var(--line);background:rgba(239,231,214,.025);color:var(--ivory);font-family:var(--font-serif);font-size:18px;cursor:pointer;transition:.2s}.answer-btn:hover:not(:disabled){border-color:var(--gold);background:rgba(226,189,119,.08)}.answer-btn:disabled{opacity:.55}.answer-btn.is-selected{border-color:var(--gold);color:var(--gold)}
.answer-compose{display:grid;gap:11px;max-width:640px}.answer-compose select{width:100%;box-sizing:border-box;background:#100c19;border:1px solid var(--line);color:var(--ivory);padding:13px 14px;font-family:var(--font-serif);font-size:17px}.round-results{display:grid;gap:9px;margin:20px 0}.round-result{display:grid;gap:5px;border-top:1px solid var(--line-soft);padding:12px 0}.round-result strong{font-family:var(--font-serif);font-size:17px;color:var(--ivory)}.round-result span{font-family:var(--font-mono);font-size:10px;color:var(--muted)}
.waiting-peer{text-align:center;padding:28px 0;color:var(--muted);font-family:var(--font-serif);font-size:18px}.waiting-peer .orbit{display:block;margin:0 auto 12px}
.result-orb{width:180px;height:180px;margin:30px auto;border-radius:50%;display:grid;place-items:center;border:1px solid var(--gold);box-shadow:0 0 70px rgba(226,189,119,.15),inset 0 0 45px rgba(111,76,161,.18)}.result-orb strong{font-family:var(--font-display);font-size:48px;color:var(--gold)}.result-orb span{display:block;font-family:var(--font-mono);font-size:9px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}
.chat-head{padding:17px 18px;border-bottom:1px solid var(--line);font-family:var(--font-display);font-size:16px}.chat-log{flex:1;padding:14px;overflow:auto;max-height:470px}.chat-msg{margin:0 0 12px}.chat-msg strong{font-family:var(--font-mono);font-size:9px;color:var(--gold);display:block}.chat-msg p{font-family:var(--font-serif);font-size:15px;line-height:1.35;margin:3px 0;color:var(--ivory);word-break:break-word}.chat-form{display:flex;border-top:1px solid var(--line)}.chat-form input{min-width:0;flex:1;border:0;background:transparent;color:var(--ivory);padding:13px;font-family:var(--font-serif);font-size:15px;outline:none}.chat-form button{border:0;border-inline-start:1px solid var(--line);background:transparent;color:var(--gold);padding:0 14px;font-family:var(--font-mono);font-size:10px;text-transform:uppercase;cursor:pointer}
.tarot-spread{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin:25px 0}.tarot-card{aspect-ratio:2/3;border:1px solid var(--line);background:linear-gradient(150deg,#171025,#0a0812);padding:12px;display:flex;flex-direction:column;justify-content:space-between;text-align:center}.tarot-card__mark{font-size:24px;color:var(--gold)}.tarot-card strong{font-family:var(--font-serif);font-size:15px}.tarot-card span{font-family:var(--font-mono);font-size:8px;color:var(--muted);text-transform:uppercase}.focus-box{display:grid;gap:10px;max-width:620px}.focus-box textarea,.follow-box textarea{width:100%;box-sizing:border-box;min-height:95px;background:rgba(239,231,214,.03);border:1px solid var(--line);color:var(--ivory);padding:13px;font-family:var(--font-serif);font-size:17px;resize:vertical}.reading{margin-top:25px}.reading h3{font-family:var(--font-display);font-size:22px}.reading p{font-family:var(--font-serif);font-size:18px;line-height:1.55;color:var(--muted)}.reading-card{border-top:1px solid var(--line-soft);padding:14px 0}.reading-card strong{font-family:var(--font-serif);font-size:19px;color:var(--ivory)}
.plaza-modal{position:fixed;inset:0;z-index:100;display:grid;place-items:center;padding:18px}.plaza-modal__backdrop{position:absolute;inset:0;border:0;background:rgba(5,4,9,.78)}.plaza-modal__window{position:relative;width:min(560px,100%);max-height:80vh;overflow:auto;border:1px solid var(--gold-deep);background:var(--void);padding:24px}.plaza-modal__head{display:flex;justify-content:space-between;align-items:center}.plaza-modal__head h2{font-family:var(--font-display);font-size:23px}.plaza-x{border:0;background:none;color:var(--muted);font-size:26px;cursor:pointer}.empty-note{font-family:var(--font-serif);font-size:17px;color:var(--muted);line-height:1.5}.toast{position:fixed;z-index:130;left:50%;bottom:26px;transform:translate(-50%,20px);opacity:0;border:1px solid var(--line);background:var(--ink);color:var(--ivory);padding:12px 18px;font-family:var(--font-mono);font-size:12px;transition:.25s}.toast.show{opacity:1;transform:translate(-50%,0)}
@media(max-width:900px){.game-grid,.plaza-lower,.room-stage{grid-template-columns:1fr}.room-chat{min-height:360px}.playboard{min-height:0}}
@media(max-width:620px){.tarot-spread{grid-template-columns:repeat(2,1fr)}.plaza-heading{align-items:start;flex-direction:column}.players{gap:8px}.player-chip{font-size:13px}.resonance-line{max-width:70px}.game-card__actions .btn{width:100%}}

/* ===== 五行斗诀 · Wuxing Duel (arcade increment 1) =====
   观星台克制风格：玄黑 + 单一鎏金 + 五行色仅作元素标识。
   遵 GDD 4.12 UI 反赌场化规范——无筹码/金币/霓虹隐喻，胜负反馈与本体一致。 */
.wuxing-enemy{display:flex;flex-direction:column;align-items:center;gap:.35rem;margin:1.25rem auto;
  width:min(220px,60vw);aspect-ratio:1;border-radius:50%;justify-content:center;
  border:1px solid rgba(226,189,119,.35);background:radial-gradient(circle at 50% 40%,rgba(226,189,119,.10),transparent 70%);
  animation:wxIn .32s cubic-bezier(.2,.9,.3,1.2)}
.wuxing-enemy__glyph{font-family:"Noto Serif SC","Noto Serif TC",serif;font-size:clamp(3rem,12vw,4.5rem);line-height:1;color:#e2bd77}
.wuxing-enemy__name{font-family:"IBM Plex Mono",monospace;font-size:.72rem;letter-spacing:.18em;text-transform:uppercase;opacity:.7}
@keyframes wxIn{from{opacity:0;transform:scale(.86)}to{opacity:1;transform:scale(1)}}

.wuxing-el--metal{--wx:#d8d8de}.wuxing-el--wood{--wx:#7fb08a}.wuxing-el--water{--wx:#6f8fb8}
.wuxing-el--fire{--wx:#c8452f}.wuxing-el--earth{--wx:#c9a227}
.wuxing-enemy[class*="wuxing-el--"]{border-color:color-mix(in srgb,var(--wx) 45%,transparent)}
.wuxing-enemy[class*="wuxing-el--"] .wuxing-enemy__glyph{color:var(--wx)}

.wuxing-cam{position:relative;margin:0 auto 1rem;width:min(320px,80vw);border-radius:14px;overflow:hidden;
  border:1px solid rgba(226,189,119,.25);background:#0a0812}
.wuxing-cam video{display:block;width:100%;height:auto;transform:scaleX(-1)} /* 镜像，符合直觉 */
.wuxing-cam__status{display:block;padding:.4rem .6rem;font-family:"IBM Plex Mono",monospace;
  font-size:.68rem;letter-spacing:.06em;opacity:.75;text-align:center}

.wuxing-pad{margin-top:.75rem}
.wuxing-pad .answer-btn{border-color:color-mix(in srgb,var(--wx,#e2bd77) 40%,transparent)}
.wuxing-hint{margin-top:.5rem;font-size:.72rem;opacity:.6;text-align:center}
.wuxing-chart{margin-top:1rem;padding-top:.75rem;border-top:1px solid rgba(226,189,119,.15);
  font-family:"IBM Plex Mono",monospace;font-size:.68rem;letter-spacing:.05em;opacity:.55;text-align:center}
.wuxing-rollover{color:#e2bd77;font-weight:600}
.wuxing-peer-ready{margin-top:.5rem;font-size:.75rem;opacity:.7;text-align:center}

@media (prefers-reduced-motion:reduce){.wuxing-enemy{animation:none}}

/* ===== 星谕游艺场 板块入口 + 星相斗诀阁 分区 (arcade IA) ===== */

/* 机制图标：线性描边，继承金色，卡片/板块/分区头共用同一套 */
.game-card__icon,.arcade-panel__icon,.hall-zone__icon{color:#e2bd77;display:block}
.game-card__icon svg{width:44px;height:44px}
.game-card__icon{margin-bottom:.85rem}
.arcade-panel__icon svg{width:64px;height:64px}
.hall-zone__icon svg{width:40px;height:40px}

/* 大板块入口：比普通卡片更重的存在感，但仍是观星台的克制语言 */
.arcade-panel{position:relative;display:flex;align-items:center;gap:1.5rem;margin-top:1.5rem;
  padding:1.75rem 1.9rem;border-radius:16px;cursor:pointer;overflow:hidden;
  border:1px solid rgba(226,189,119,.30);
  background:
    radial-gradient(120% 160% at 88% -10%,rgba(226,189,119,.14),transparent 58%),
    linear-gradient(180deg,rgba(226,189,119,.045),rgba(10,8,18,0) 70%),#0d0a17;
  transition:border-color .25s ease,transform .25s ease,box-shadow .25s ease}
.arcade-panel:hover,.arcade-panel:focus-visible{border-color:rgba(226,189,119,.6);
  transform:translateY(-2px);box-shadow:0 14px 40px -22px rgba(226,189,119,.5);outline:none}
.arcade-panel__body{flex:1;min-width:0}
.arcade-panel__eyebrow{display:block;font-family:"IBM Plex Mono",monospace;font-size:.62rem;
  letter-spacing:.26em;text-transform:uppercase;opacity:.6;margin-bottom:.35rem}
.arcade-panel h3{font-family:"Cinzel","Noto Serif SC","Noto Serif TC",serif;
  font-size:clamp(1.35rem,3.2vw,1.8rem);margin:0 0 .4rem}
.arcade-panel p{margin:0;opacity:.75;font-size:.9rem;line-height:1.55}
.arcade-panel__meta{display:flex;flex-wrap:wrap;gap:.4rem 1rem;margin-top:.7rem;
  font-family:"IBM Plex Mono",monospace;font-size:.68rem;letter-spacing:.08em;opacity:.6}
.arcade-panel__cta{flex-shrink:0;font-family:"IBM Plex Mono",monospace;font-size:.72rem;
  letter-spacing:.14em;color:#e2bd77;white-space:nowrap}

/* 星相斗诀阁：门禁分区，用朱砂调的边框与主区拉开层级 */
.hall-zone{margin-top:2rem;padding:1.5rem;border-radius:16px;
  border:1px solid rgba(200,69,47,.28);
  background:linear-gradient(180deg,rgba(200,69,47,.05),rgba(10,8,18,0) 60%),#0b0813}
.hall-zone__head{display:flex;align-items:flex-start;gap:1rem;margin-bottom:.5rem}
.hall-zone__head h3{font-family:"Cinzel","Noto Serif SC","Noto Serif TC",serif;
  font-size:1.25rem;margin:0 0 .25rem}
.hall-zone__head p{margin:0;opacity:.7;font-size:.85rem}
.hall-zone__icon{color:#c8452f}
.hall-zone__note{margin:.35rem 0 1.1rem;padding:.55rem .8rem;border-radius:8px;
  background:rgba(200,69,47,.08);border:1px solid rgba(200,69,47,.18);
  font-family:"IBM Plex Mono",monospace;font-size:.68rem;letter-spacing:.04em;opacity:.8}

/* 即将开放：可看不可玩，是路线图也是诱锁物料 */
.game-card--soon{opacity:.55}
.game-card--soon .game-card__icon{color:rgba(226,189,119,.6)}
.game-card--soon .game-card__meta{color:#e2bd77;opacity:.85}

@media (max-width:640px){
  .arcade-panel{flex-direction:column;align-items:flex-start;gap:1rem;padding:1.4rem}
  .arcade-panel__cta{align-self:flex-end}
}
@media (prefers-reduced-motion:reduce){.arcade-panel{transition:none}.arcade-panel:hover{transform:none}}

/* ===== 三层结构：游艺场分类区 + 斗诀阁入口板块 ===== */
.arcade-main-note{display:flex;flex-wrap:wrap;align-items:baseline;gap:.5rem 1rem;
  margin:.25rem 0 1.5rem;padding:.7rem .95rem;border-radius:10px;
  border:1px solid rgba(226,189,119,.16);background:rgba(226,189,119,.045)}
.arcade-main-note strong{font-family:"Cinzel","Noto Serif SC","Noto Serif TC",serif;
  font-size:.95rem;color:#e2bd77}
.arcade-main-note span{font-size:.8rem;opacity:.7}

.arcade-cat{margin-bottom:2rem}
.arcade-cat__title{display:flex;align-items:center;gap:.85rem;margin:0 0 .9rem;
  font-family:"IBM Plex Mono",monospace;font-size:.7rem;letter-spacing:.24em;
  text-transform:uppercase;opacity:.62;font-weight:500}
.arcade-cat__title::after{content:"";flex:1;height:1px;
  background:linear-gradient(90deg,rgba(226,189,119,.28),transparent)}

/* 斗诀阁入口沿用大板块骨架，但换朱砂调，与本体区拉开性质差异 */
.hall-panel{margin-top:2.25rem;border-color:rgba(200,69,47,.34);
  background:
    radial-gradient(120% 160% at 88% -10%,rgba(200,69,47,.16),transparent 58%),
    linear-gradient(180deg,rgba(200,69,47,.05),rgba(10,8,18,0) 70%),#0d0a17}
.hall-panel:hover,.hall-panel:focus-visible{border-color:rgba(200,69,47,.68);
  box-shadow:0 14px 40px -22px rgba(200,69,47,.55)}
.hall-panel .arcade-panel__icon{color:#c8452f}
.hall-panel .arcade-panel__cta{color:#e2bd77}
.hall-panel .arcade-panel__meta{max-width:46ch}

/* ===== 抢星对决 · Star Snatch Duel ===== */
.snatch-stage{display:flex;align-items:center;justify-content:center;
  width:min(280px,72vw);aspect-ratio:1;margin:1.25rem auto;padding:0;cursor:pointer;
  border-radius:50%;border:1px solid rgba(226,189,119,.22);background:#0a0812;
  transition:background .12s ease,border-color .12s ease,transform .08s ease}
.snatch-stage:active{transform:scale(.985)}
.snatch-star{font-size:clamp(3rem,13vw,5rem);line-height:1;color:rgba(226,189,119,.14);
  transition:color .06s ease,text-shadow .06s ease}
/* 真信号：瞬时切换，不加过渡时长以免污染反应时测量 */
.snatch-stage.is-live{border-color:#e2bd77;background:radial-gradient(circle,rgba(226,189,119,.20),rgba(10,8,18,1) 72%)}
.snatch-stage.is-live .snatch-star{color:#e2bd77;text-shadow:0 0 28px rgba(226,189,119,.75)}
/* 诱饵：70% 亮度的假象；闪烁：更短促的一瞥 */
.snatch-stage.is-decoy .snatch-star{color:rgba(226,189,119,.5)}
.snatch-stage.is-flicker .snatch-star{color:rgba(226,189,119,.62)}
.snatch-hint{margin:0;text-align:center;font-family:"IBM Plex Mono",monospace;
  font-size:.72rem;letter-spacing:.16em;text-transform:uppercase;opacity:.6}
@media (prefers-reduced-motion:reduce){.snatch-stage,.snatch-star{transition:none}}

/* ===== 流星指隙 · Meteor Rush ===== */
.mr-intro{text-align:center}
.mr-intro .btn{margin-top:1rem}
.mr-hud{display:flex;align-items:baseline;justify-content:center;gap:1.5rem;margin-bottom:.6rem;
  font-family:"IBM Plex Mono",monospace}
.mr-clock{font-size:1.35rem;color:#e2bd77;letter-spacing:.06em}
.mr-combo{font-size:1.1rem;color:#e2bd77;min-width:3.5ch;text-align:center}
.mr-grade{font-size:.72rem;letter-spacing:.2em;text-transform:uppercase;opacity:.75;min-width:8ch}
.mr-track{height:2px;border-radius:2px;background:rgba(226,189,119,.14);overflow:hidden;margin-bottom:1rem}
.mr-progress{height:100%;width:0;background:linear-gradient(90deg,rgba(226,189,119,.5),#e2bd77)}

.mr-field{position:relative;height:min(220px,42vw);margin:0 auto 1rem;overflow:hidden;
  border-radius:14px;border:1px solid rgba(226,189,119,.12);background:#0a0812}
.mr-ring{position:absolute;top:50%;left:50%;width:84px;height:84px;margin:-42px 0 0 -42px;
  border-radius:50%;border:1.5px solid rgba(226,189,119,.4)}
.mr-ring.is-perfect{border-color:#e2bd77;box-shadow:0 0 34px rgba(226,189,119,.7);animation:mrPop .18s ease-out}
.mr-ring.is-great{border-color:rgba(226,189,119,.85);animation:mrPop .16s ease-out}
.mr-ring.is-good{border-color:rgba(226,189,119,.55)}
.mr-ring.is-miss{border-color:rgba(200,69,47,.7)}
@keyframes mrPop{from{transform:scale(.9)}to{transform:scale(1)}}

/* --p: 0 = 自边缘出现，1 = 抵达环心 */
.mr-meteor{position:absolute;top:50%;width:12px;height:2px;margin-top:-1px;border-radius:2px;
  background:linear-gradient(90deg,transparent,#e2bd77);
  opacity:calc(0.35 + 0.65 * var(--p)); }
.mr-meteor--left{left:calc(var(--p) * 50%)}
.mr-meteor--right{right:calc(var(--p) * 50%);
  background:linear-gradient(270deg,transparent,#e2bd77)}

.mr-pads{display:grid;grid-template-columns:1fr 1fr;gap:.6rem}
.mr-pad{height:74px;border-radius:12px;cursor:pointer;
  border:1px solid rgba(226,189,119,.22);background:rgba(226,189,119,.045)}
.mr-pad:active{background:rgba(226,189,119,.14)}
.mr-review{color:#c8452f}
@media (prefers-reduced-motion:reduce){.mr-ring{animation:none}}

/* ===== 摘星叠塔 · Stack to the Sky ===== */
.stk-field{position:relative;height:min(260px,50vw);margin:0 auto 1rem;overflow:hidden;
  border-radius:14px;border:1px solid rgba(226,189,119,.12);background:#0a0812;
  display:flex;align-items:flex-end;justify-content:center}
/* --x: -1..1 归一化摆幅 */
.stk-stone{position:absolute;top:14px;width:52px;height:16px;border-radius:3px;
  background:linear-gradient(180deg,#e2bd77,rgba(226,189,119,.45));
  left:50%;transform:translateX(calc(-50% + var(--x) * 34%))}
.stk-tower{display:flex;flex-direction:column-reverse;align-items:center;padding-bottom:10px}
/* --off: 0..1 偏移比例，越大越歪 */
.stk-block{display:block;width:52px;height:11px;margin-top:2px;border-radius:2px;
  background:rgba(226,189,119,.42);
  transform:translateX(calc(var(--off) * 20px))}
.stk-block.is-perfect{background:#e2bd77;box-shadow:0 0 12px rgba(226,189,119,.55)}
.stk-pad{width:100%;color:#e2bd77;font-family:"IBM Plex Mono",monospace;
  font-size:.78rem;letter-spacing:.14em}

/* ===== 陨星闪避 · Meteor Dodge ===== */
.dg-board{position:relative;width:min(360px,80vw);aspect-ratio:1;margin:0 auto 1rem;
  border-radius:12px;border:1px solid rgba(226,189,119,.16);background:#0a0812;
  background-image:linear-gradient(rgba(226,189,119,.05) 1px,transparent 1px),
    linear-gradient(90deg,rgba(226,189,119,.05) 1px,transparent 1px);
  background-size:12.5% 12.5%;touch-action:none;overflow:hidden}
.dg-meteors{position:absolute;inset:0}
/* --c/--r 为格坐标 0..7；12.5% 即一格 */
.dg-star{position:absolute;width:9%;height:9%;border-radius:50%;background:#e2bd77;
  box-shadow:0 0 16px rgba(226,189,119,.8);
  left:calc(var(--c) * 12.5% + 1.75%);top:calc(var(--r) * 12.5% + 1.75%)}
.dg-meteor{position:absolute;width:10%;height:10%;border-radius:3px;
  background:rgba(200,69,47,.9);box-shadow:0 0 10px rgba(200,69,47,.6);
  left:calc(var(--c) * 12.5% + 1.25%);top:calc(var(--r) * 12.5% + 1.25%)}
.dg-warn{position:absolute;top:0;bottom:0;width:12.5%;
  left:calc(var(--c) * 12.5%);background:linear-gradient(180deg,rgba(200,69,47,.22),transparent)}

/* ===== 急急如律令 · Snap Sigil ===== */
.sg-targets{display:flex;align-items:center;justify-content:center;gap:.75rem;margin:1.1rem 0}
.sg-target{display:flex;flex-direction:column;align-items:center;gap:.2rem;
  width:96px;padding:.7rem .4rem;border-radius:12px;
  border:1px solid color-mix(in srgb,var(--wx,#e2bd77) 45%,transparent);
  background:radial-gradient(circle at 50% 35%,color-mix(in srgb,var(--wx,#e2bd77) 12%,transparent),transparent 70%)}
.sg-target__glyph{font-family:"Noto Serif SC","Noto Serif TC",serif;
  font-size:2.4rem;line-height:1;color:var(--wx,#e2bd77)}
.sg-target__name{font-family:"IBM Plex Mono",monospace;font-size:.6rem;
  letter-spacing:.14em;text-transform:uppercase;opacity:.7}
.sg-arrow{color:#e2bd77;opacity:.6;font-size:1.2rem}
.sg-seq{min-height:1.4em;margin:.5rem 0;text-align:center;color:#e2bd77;
  font-family:"Noto Serif SC","Noto Serif TC",serif;font-size:1.1rem;letter-spacing:.1em}

/* ===== 盘制（多局）显示 =====
   与 round-meta 同一套排印语言：等宽小字 + 单一鎏金，不引入任何计分板/筹码隐喻。 */
.series-bar{display:flex;align-items:baseline;justify-content:space-between;gap:10px;
  font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;
  color:var(--muted);border-bottom:1px solid var(--line-soft);padding-bottom:8px;margin-bottom:14px}
.series-bar__label{color:var(--gold)}
.series-bar__score{font-family:var(--font-display);font-size:17px;letter-spacing:.06em;color:var(--ivory)}
.series-bar__goal{opacity:.7}

.series-recap{display:grid;gap:5px;border-inline-start:2px solid var(--gold);
  padding:13px 16px;margin:0 0 22px;background:rgba(226,189,119,.05)}
.series-recap__head{font-family:var(--font-mono);font-size:9px;letter-spacing:.13em;
  text-transform:uppercase;color:var(--gold)}
.series-recap__who{font-family:var(--font-serif);font-size:18px;color:var(--ivory)}
.series-recap__detail{font-family:var(--font-display);font-size:15px;color:var(--muted)}
.series-recap__next{font-family:var(--font-mono);font-size:9px;color:var(--muted);opacity:.75}

.series-tally{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 16px;
  border-top:1px solid var(--line-soft);padding-top:14px;margin:18px 0}
.series-tally strong{font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;
  text-transform:uppercase;color:var(--gold)}
.series-tally span{font-family:var(--font-mono);font-size:10px;color:var(--muted)}

/* ===== 群星结印大会 · Seal Royale =====
   十人同框要在一屏里读完，所以星台压成紧凑网格；沿用观星台金线语言，
   出局用降低不透明度而不是红叉——遵 4.12，失败反馈与本体一致，不做惩罚性视觉。 */
.ry-roster{display:grid;grid-template-columns:repeat(auto-fit,minmax(104px,1fr));gap:8px;margin:0 0 20px}
.ry-seat{display:grid;gap:5px;padding:10px 11px;border:1px solid var(--line);
  background:rgba(239,231,214,.025);transition:.25s}
.ry-seat.is-me{border-color:var(--gold);background:rgba(226,189,119,.07)}
.ry-seat.is-out{opacity:.38}
.ry-seat__name{font-family:var(--font-serif);font-size:14px;color:var(--ivory);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ry-seat__embers{display:flex;align-items:center;gap:4px;min-height:12px}
.ry-ember{width:7px;height:7px;border-radius:50%;background:var(--gold);
  box-shadow:0 0 7px rgba(226,189,119,.6)}
.ry-seat__out{font-family:var(--font-mono);font-size:8px;letter-spacing:.12em;
  text-transform:uppercase;color:var(--muted)}
.ry-seat__pts{font-family:var(--font-display);font-size:15px;color:var(--gold)}

.ry-command{display:grid;gap:10px;justify-items:center;padding:18px 16px;margin:0 0 20px;
  border:1px solid var(--line);background:radial-gradient(circle at 50% 0%,rgba(226,189,119,.08),transparent 70%)}
.ry-command--inverse{border-color:var(--gold-deep);background:radial-gradient(circle at 50% 0%,rgba(111,76,161,.16),transparent 70%)}
.ry-command__kind{font-family:var(--font-mono);font-size:9px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--gold)}
.ry-command--inverse .ry-command__kind{color:#c9a8ff}
.ry-command__glyphs{display:flex;align-items:center;gap:10px;flex-wrap:wrap;justify-content:center}

/* 判定窗倒计条：纯展示，判定一律以服务器时刻为准 */
.ry-window{width:min(320px,80%);height:3px;background:rgba(239,231,214,.12);position:relative;overflow:hidden}
.ry-window:after{content:"";position:absolute;inset-block:0;inset-inline-start:0;
  width:var(--ry-fill,100%);background:var(--gold);transition:width .06s linear}
.ry-window.is-arming:after{background:rgba(239,231,214,.28)}
.ry-window.is-shut:after{background:var(--gold-deep)}

.ry-spectate{display:grid;gap:6px;justify-items:center;padding:26px 0;text-align:center}
.ry-spectate strong{font-family:var(--font-serif);font-size:20px;color:var(--ivory)}
.ry-spectate span{font-family:var(--font-mono);font-size:10px;color:var(--muted)}

@media(max-width:620px){.ry-roster{grid-template-columns:repeat(auto-fit,minmax(88px,1fr))}}

/* ===== 组队房 =====
   邀请码字号给大、字距拉开：玩家会把它念给旁边的人听，不是复制粘贴。 */
.party-panel{border:1px solid var(--gold-deep);background:linear-gradient(150deg,rgba(24,17,39,.95),rgba(10,8,18,.96));
  padding:clamp(20px,3vw,30px);margin:0 0 26px;display:grid;gap:14px}
.party-panel h2{font-family:var(--font-display);font-size:clamp(21px,2.4vw,27px);margin:0}
.party-code{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.party-code__label{font-family:var(--font-mono);font-size:9px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--muted)}
.party-code__value{font-family:var(--font-display);font-size:clamp(28px,4.5vw,40px);
  letter-spacing:.22em;color:var(--gold)}
.party-hint{font-family:var(--font-serif);font-size:15px;color:var(--muted);margin:0;max-width:48ch}
.party-members{display:grid;gap:6px}
.party-member{display:flex;align-items:center;gap:10px;border-top:1px solid var(--line-soft);padding:9px 0}
.party-member__seat{font-family:var(--font-mono);font-size:10px;width:18px;color:var(--gold)}
.party-member strong{font-family:var(--font-serif);font-size:16px;color:var(--ivory)}
.party-member__host{font-family:var(--font-mono);font-size:8px;letter-spacing:.12em;
  text-transform:uppercase;color:var(--muted);border:1px solid var(--line);padding:2px 6px}
.party-count{font-family:var(--font-mono);font-size:10px;letter-spacing:.12em;
  text-transform:uppercase;color:var(--gold)}
.game-card__seats{font-family:var(--font-mono);font-size:9px;letter-spacing:.12em;
  text-transform:uppercase;color:var(--muted);margin-bottom:10px}

/* ===== 流星摹影 · Comet Trace =====
   画布保持 3:2，逻辑坐标 1200×800 等比缩放，两端判定一致。 */
.ct-stage{position:relative;width:100%;max-width:760px;margin:0 auto 16px;
  border:1px solid var(--line);background:radial-gradient(ellipse at 50% 30%,rgba(111,76,161,.14),rgba(6,5,12,.96) 70%)}
.ct-canvas{display:block;width:100%;height:auto;aspect-ratio:3/2;
  touch-action:none;cursor:crosshair}
.ct-hint{font-size:clamp(19px,2.2vw,26px);margin:0 0 8px;text-align:center;max-width:none}

/* ===== 摘星手 · Star Snatch ===== */
.ss-stage{width:100%;max-width:760px;margin:0 auto 16px;border:1px solid var(--line);
  background:radial-gradient(ellipse at 50% 40%,rgba(111,76,161,.13),rgba(6,5,12,.96) 72%)}
.ss-field{display:block;width:100%;height:auto;aspect-ratio:3/2;touch-action:none;cursor:pointer}
.ss-cal{display:grid;gap:12px;justify-items:start;border-inline-start:2px solid var(--gold);
  padding:18px 20px;margin:0 0 20px;background:rgba(226,189,119,.05)}
.ss-cal h3{font-family:var(--font-display);font-size:21px;margin:0}
.ss-cal p{font-family:var(--font-serif);font-size:16px;color:var(--muted);margin:0;max-width:46ch}

/* ===== 坠星接力 · Meteor Relay ===== */
.rl-stage{width:100%;max-width:420px;margin:0 auto 14px;border:1px solid var(--line);
  background:linear-gradient(180deg,rgba(6,5,12,.98),rgba(24,17,39,.9))}
.rl-track{display:block;width:100%;height:auto;aspect-ratio:3/4;touch-action:none;cursor:pointer}
.rl-order{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 16px}
.rl-leg{display:flex;align-items:center;gap:7px;padding:8px 11px;border:1px solid var(--line);
  background:rgba(239,231,214,.025);transition:.25s}
.rl-leg.is-done{opacity:.4}
.rl-leg.is-active{border-color:var(--gold);background:rgba(226,189,119,.09)}
.rl-leg.is-me strong{color:var(--gold)}
.rl-leg__n{font-family:var(--font-mono);font-size:10px;color:var(--muted)}
.rl-leg strong{font-family:var(--font-serif);font-size:14px}
.rl-handoff{font-family:var(--font-serif);font-size:17px;color:var(--gold);margin:0 0 8px}

/* ===== 星轨连击 · Star Rail Rush ===== */
.sr-stage{width:100%;max-width:420px;margin:0 auto 14px;border:1px solid var(--line);
  background:linear-gradient(180deg,rgba(6,5,12,.98),rgba(18,13,30,.94))}
.sr-field{display:block;width:100%;height:auto;aspect-ratio:2/3;touch-action:none;cursor:pointer}

/* ===== 玩法模式选择 =====
   日卡专属的模式不禁用，只挂徽标——GDD 要求非日卡用户能看完整预览，
   拦截发生在真正开局那一刻，不是在这里。 */
.mode-picker{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 14px}
.mode-chip{display:inline-flex;align-items:center;gap:6px;padding:7px 13px;
  border:1px solid var(--line);background:transparent;color:var(--muted);
  font-family:var(--font-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;
  cursor:pointer;transition:.2s}
.mode-chip:hover{border-color:var(--gold);color:var(--ivory)}
.mode-chip.is-on{border-color:var(--gold);background:rgba(226,189,119,.1);color:var(--gold)}
.mode-chip__pass{font-size:8px;padding:1px 5px;border:1px solid var(--gold-deep);
  color:var(--gold);letter-spacing:.08em}

/* ---- 星轨夺域 ---- */
.ob-stage{display:flex;justify-content:center;margin:10px 0}
.ob-field{width:min(100%,420px);height:auto;aspect-ratio:2/3;border:1px solid var(--line);
  border-radius:14px;background:#0b0817;touch-action:none;cursor:crosshair}
.ob-tally{display:flex;flex-direction:column;gap:6px;margin:14px auto;max-width:280px}
.ob-tally-row{display:flex;align-items:center;gap:10px;padding:7px 12px;border:1px solid var(--line);
  border-radius:10px;background:rgba(255,255,255,.02)}
.ob-tally-row.is-me{border-color:var(--gold);background:rgba(226,189,119,.08)}
.ob-dot{width:11px;height:11px;border-radius:50%;flex:0 0 11px}
.ob-tally-seat{font-family:var(--mono);font-size:12px;letter-spacing:.1em;color:var(--muted)}
.ob-tally-score{margin-left:auto;font-family:var(--mono);font-size:15px;color:var(--gold-bright)}

/* ---- 星影相随 ---- */
.am-tally{display:flex;flex-direction:column;gap:6px;margin:14px auto;max-width:320px}
.am-tally-row{display:flex;align-items:center;gap:10px;padding:8px 14px;border:1px solid var(--line);
  border-radius:10px;background:rgba(255,255,255,.02)}
.am-tally-row.is-me{border-color:var(--gold);background:rgba(226,189,119,.08)}
.am-tally-seat{font-family:var(--font-mono);font-size:13px;color:var(--muted)}
.am-tally-avg{margin-left:auto;font-family:var(--font-mono);font-size:16px;color:var(--gold-bright)}

/* ---- 双笔同辉 ---- */
.tw-stage{display:flex;justify-content:center;margin:10px 0}
.tw-canvas{width:min(100%,760px);height:auto;aspect-ratio:16/9;border:1px solid var(--line);
  border-radius:12px;background:#0b0817;touch-action:none;cursor:crosshair}
