/* ===== 365Lab Event Screen - Stage (shared canvas) ===== */
.stage-wrap{position:relative;overflow:hidden;border-radius:inherit;}
.stage{
  position:absolute;top:0;left:0;width:1600px;height:900px;
  transform-origin:top left;overflow:hidden;background:#0b1020;
  --txt:#fff;--accent:#ffd166;--fw:800;--fs:1;--copacity:1;
  --font:system-ui,-apple-system,"Segoe UI",Roboto,"PingFang SC","Microsoft YaHei",sans-serif;
  font-family:var(--font);color:var(--txt);
  -webkit-font-smoothing:antialiased;
}
.stage *{box-sizing:border-box;}
[hidden]{display:none !important;}

.st-bg{position:absolute;inset:-6%;z-index:0;background:linear-gradient(145deg,#0f172a,#1e3a8a);}
.st-overlay{position:absolute;inset:0;z-index:1;background:rgba(0,0,0,.35);pointer-events:none;}
.st-particles{position:absolute;inset:0;z-index:2;overflow:hidden;pointer-events:none;}
.st-particles i{position:absolute;border-radius:50%;background:radial-gradient(circle,#fff,rgba(255,255,255,0));
  animation:float linear infinite;}
@keyframes float{
  0%{transform:translate3d(0,0,0) scale(1);}
  50%{transform:translate3d(28px,-46px,0) scale(1.5);}
  100%{transform:translate3d(-18px,-96px,0) scale(1);}
}

.st-scene{position:absolute;inset:0;z-index:5;display:flex;align-items:center;justify-content:center;
  opacity:var(--copacity);padding:var(--pady,56px) var(--padx,64px);}
.st-scene.scene-enter{animation:sceneIn .55s cubic-bezier(.2,.7,.3,1);}
/* R153：入场动效改用「独立变换属性」translate / scale，不再动画 transform。
 * 原因：pw / rt / tx / we 等场景的「显示大小」由 renderScene 以**内联** transform:scale() 写在 .st-scene 上，
 * 而 CSS 动画在运行期间会覆盖内联样式——从其它场景切回这些场景时，动画的 transform:none（= scale 1）
 * 会让内容先以 100% 呈现约 .55s，动画结束内联 scale 才生效，肉眼即「文字先变大、再突然缩回」。
 * 独立变换属性与 transform 是**相乘合成**（translate → rotate → scale → transform），
 * 故入场期间场景自身的缩放始终生效，彻底消除尺寸跳变。 */
@keyframes sceneIn{from{opacity:0;translate:0 14px;scale:.99;}to{opacity:var(--copacity);translate:0 0;scale:1;}}
.st-blank{position:absolute;inset:0;z-index:55;background:#000;background-size:cover;background-position:center;}
.st-clock{position:absolute;z-index:8;--ck:1;text-align:right;line-height:1.1;
  text-shadow:0 3px 18px rgba(0,0,0,.5);}
.st-clock.pos-top-right{top:34px;right:44px;text-align:right;}
.st-clock.pos-top-left{top:34px;left:44px;text-align:left;}
.st-clock.pos-bottom-right{bottom:96px;right:44px;text-align:right;}
.st-clock.pos-bottom-left{bottom:96px;left:44px;text-align:left;}
/* R52 防抖动：角标时钟同样固定 HH:MM:SS 占位（右缘定位时每秒宽度变化会向左抖动） */
.ck-time{font-size:calc(var(--ckt,56px) * var(--ck));font-weight:700;letter-spacing:.02em;font-variant-numeric:tabular-nums;min-width:8ch;}
.ck-sub{font-size:calc(var(--ckd,22px) * var(--ck));opacity:.78;margin-top:4px;font-weight:500;}
/* R64 防抖动（全局）：数字定宽格子。tabular-nums 依赖字体自带 tnum 特性，
 * CJK 回退字体（如 Microsoft YaHei）或无 tnum 的字体下数字仍逐字异宽，
 * 逐秒跳变时时间串总宽微变 → 居中/右对齐时钟左右抖动（用户截图实证）。
 * 每个 ASCII 数字由 stage.js fixDigits() 包进 1ch（"0" 字宽）定宽格子，
 * 总宽 = N×1ch + 恒定冒号/后缀，恒定不抖。对角标时钟/全屏数字时钟/倒计时一并生效。 */
.tk-d{display:inline-block;width:1ch;text-align:center;}

/* ---------- marquee ---------- */
.st-marquee{position:absolute;left:0;right:0;z-index:9;--mq:1;overflow:hidden;
  background:linear-gradient(90deg,rgba(0,0,0,.55),rgba(0,0,0,.3),rgba(0,0,0,.55));
  border-top:1px solid rgba(255,255,255,.13);border-bottom:1px solid rgba(255,255,255,.13);
  padding:calc(10px * var(--mq)) 0;}
.st-marquee.pos-bottom{bottom:0;}
.st-marquee.pos-top{top:0;}
.st-marquee.nobar{background:none;border-top:0;border-bottom:0;}
.mq-track{display:inline-flex;white-space:nowrap;will-change:transform;
  animation:mqmove linear infinite;}
.mq-item{padding:0 var(--mqpad,40px);font-size:calc(38px * var(--mq));font-weight:var(--mqw,700);color:var(--mqc,var(--txt));
  text-shadow:0 2px 10px rgba(0,0,0,.45);}
@keyframes mqmove{from{transform:translateX(0);}to{transform:translateX(-50%);}}
@keyframes mqmoveR{from{transform:translateX(-50%);}to{transform:translateX(0);}}
.st-marquee.rev .mq-track{animation-name:mqmoveR;}

/* ---------- danmaku ---------- */
.st-danmaku{position:absolute;inset:0;z-index:20;overflow:hidden;pointer-events:none;}
.dm-item{position:absolute;left:100%;white-space:nowrap;font-weight:800;
  text-shadow:0 2px 8px rgba(0,0,0,.75);animation:dmmove linear forwards;}
@keyframes dmmove{from{transform:translateX(0);}to{transform:translateX(calc(-1 * var(--sw,1600px) - 100%));}}

/* ---------- 全局水印（R73）----------
 * 默认 hidden（文案为空），不参与命中测试；四个角可选，避免与角标时钟/跑马灯打架。 */
.st-wm{position:absolute;z-index:9;pointer-events:none;font-weight:700;letter-spacing:.08em;
  white-space:nowrap;max-width:46%;overflow:hidden;text-overflow:ellipsis;
  text-shadow:0 2px 12px rgba(0,0,0,.6);}
.st-wm[hidden]{display:none;}
/* R95：图片 Logo 角标模式——宽度由 --wmw 控制，高度自适应保持比例 */
.st-wm.wm-img{line-height:0;}
.st-wm.wm-img img{display:block;width:var(--wmw,160px);height:auto;max-width:40vw;object-fit:contain;}
.st-wm.pos-bottom-right{right:calc(30px * var(--fs,1));bottom:calc(24px * var(--fs,1));text-align:right;}
.st-wm.pos-bottom-left{left:calc(30px * var(--fs,1));bottom:calc(24px * var(--fs,1));text-align:left;}
.st-wm.pos-top-left{left:calc(30px * var(--fs,1));top:calc(24px * var(--fs,1));text-align:left;}
.st-wm.pos-top-right{right:calc(30px * var(--fs,1));top:calc(24px * var(--fs,1));text-align:right;}

/* ---------- toast / popup ---------- */
.st-toast{position:absolute;top:26px;left:50%;transform:translateX(-50%);z-index:40;
  display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none;}
.toast-item{background:rgba(12,16,28,.9);border:1px solid rgba(255,255,255,.18);color:#eaf1ff;max-width:min(92vw,520px);white-space:pre-wrap;overflow-wrap:anywhere;
  padding:12px 22px;border-radius:12px;font-size:24px;font-weight:600;transition:opacity .5s,transform .5s;
  box-shadow:0 12px 40px rgba(0,0,0,.5);}
.toast-item.out{opacity:0;transform:translateY(-10px);}

.st-popup{position:absolute;inset:0;z-index:45;display:flex;align-items:center;justify-content:center;
  background:rgba(0,0,0,.45);opacity:0;transition:opacity .35s;}
.st-popup.show{opacity:1;}
.pop-card{padding:52px 84px;border-radius:28px;background:linear-gradient(135deg,rgba(255,255,255,.16),rgba(255,255,255,.06));
  border:2px solid var(--accent);box-shadow:0 30px 90px rgba(0,0,0,.6);transform:scale(.86);transition:transform .4s cubic-bezier(.2,1.5,.4,1);}
.st-popup.show .pop-card{transform:scale(1);}
.pop-text{font-size:96px;font-weight:900;color:var(--accent);text-shadow:0 6px 30px rgba(0,0,0,.6);}

.st-confetti{position:absolute;inset:0;z-index:35;pointer-events:none;}
.cf-canvas{position:absolute;inset:0;width:100%;height:100%;}

/* ============ 倒计时 ============ */
.cd-wrap{--cds:1;display:flex;flex-direction:column;align-items:center;gap:calc(26px * var(--cds));width:100%;}
.cd-title{font-size:calc(66px * var(--fs) * var(--cdts,1));font-weight:var(--fw);letter-spacing:.04em;color:var(--cdtc, inherit);display:var(--cdth, block);
  text-shadow:0 4px 22px rgba(0,0,0,.5);text-align:center;line-height:1.2;}
.cd-row{display:flex;align-items:flex-end;justify-content:center;gap:calc(28px * var(--cds));flex-wrap:nowrap;}
.cd-cell{position:relative;display:flex;flex-direction:column;align-items:center;gap:8px;}
.cd-num{font-variant-numeric:tabular-nums;font-weight:900;line-height:.98;color:var(--cdnc, var(--cdc, var(--txt)));
  font-size:calc(210px * var(--cds));letter-spacing:.01em;}
.cd-unit{font-size:calc(34px * var(--cds) * var(--cdus,1));font-weight:600;opacity:.8;letter-spacing:.14em;color:var(--cduc, inherit);display:var(--cduh, block);}
.cd-sep{font-size:calc(150px * var(--cds));font-weight:800;opacity:.5;padding-bottom:calc(52px * var(--cds));color:var(--cdsc, inherit);display:var(--cdsh, block);}
.cd-status{min-height:1.2em;font-size:calc(40px * var(--fs));font-weight:700;opacity:.85;color:var(--cdstc, inherit);display:var(--cdsth, block);}
.cd-status.is-end{color:var(--accent);font-size:calc(72px * var(--fs));animation:pulse 1.1s ease-in-out infinite;}
@keyframes pulse{0%,100%{transform:scale(1);opacity:1;}50%{transform:scale(1.06);opacity:.82;}}

/* 卡片样式 */
.cd-row.style-block .cd-cell{background:linear-gradient(160deg,rgba(255,255,255,.17),rgba(255,255,255,.05));
  border:1px solid rgba(255,255,255,.2);border-radius:calc(26px * var(--cds));
  padding:calc(22px * var(--cds)) calc(30px * var(--cds)) calc(16px * var(--cds));
  box-shadow:0 18px 50px rgba(0,0,0,.35),inset 0 1px 0 rgba(255,255,255,.25);
  min-width:calc(220px * var(--cds));}
.cd-row.style-block .cd-num{color:var(--cdnc, var(--cdc,var(--txt)));text-shadow:0 8px 26px rgba(0,0,0,.45);}
.cd-row.style-block .cd-unit{color:var(--cduc, var(--accent));}

/* 纯数字 */
.cd-row.style-plain .cd-num{text-shadow:0 8px 30px rgba(0,0,0,.45);}
.cd-row.style-plain .cd-unit{opacity:.62;}

/* 霓虹 */
.cd-row.style-neon .cd-num{color:var(--cdc,#fff);
  text-shadow:0 0 12px var(--accent),0 0 34px var(--accent),0 0 78px var(--accent);}
.cd-row.style-neon .cd-unit{color:var(--cduc, var(--accent));text-shadow:0 0 14px var(--accent);}

/* 圆环 */
.cd-row.style-ring .cd-cell{width:calc(300px * var(--cds));height:calc(300px * var(--cds));justify-content:center;}
.cd-ring{position:absolute;inset:0;width:100%;height:100%;transform:rotate(-90deg);}
.cd-ring .rbg{fill:none;stroke:var(--cdrb,rgba(255,255,255,.14));stroke-width:var(--cdrw,6);}
.cd-ring .rfg{fill:none;stroke:var(--accent);stroke-width:var(--cdrw,6);stroke-linecap:round;
  transition:stroke-dashoffset .35s linear;}
.cd-row.style-ring .cd-num{font-size:calc(112px * var(--cds));}
.cd-row.style-ring .cd-unit{font-size:calc(26px * var(--cds));}

.cd-row.urgent .cd-num{color:var(--cdw,#ff5c6c);animation:shake .5s ease-in-out infinite;}
.cd-row.urgent.noshake .cd-num{animation:none;}
.cd-row.urgent.style-neon .cd-num{color:#fff;text-shadow:0 0 14px var(--cdw,#ff5c6c),0 0 40px var(--cdw,#ff5c6c);}
@keyframes shake{0%,100%{transform:translateY(0) scale(1);}50%{transform:translateY(-6px) scale(1.03);}}
.cd-num.flip{animation:flipin .28s ease-out;}
@keyframes flipin{from{transform:translateY(-14%) scale(.94);opacity:.35;}to{transform:none;opacity:1;}}

/* ============ 抽奖 ============ */
.lo-wrap{--los:1;--loc:var(--accent);position:relative;display:flex;flex-direction:column;align-items:center;gap:26px;width:100%;height:100%;
  justify-content:center;}
/* R246: 开启中奖记录时与抽奖主区并排（主区左、记录右），避免记录浮层挡抽奖。
 * 增加水平内边距防止右侧记录面板贴边，同时拉大主区与记录板间距；
 * 槽位网格在 .lo-main 内按内容宽度居中，避免中奖人数少时左侧出现大段空白。
 * 主区仍由 .lo-main-col flex:1 自适应，自动排版按可用宽度继续生效。 */
.lo-wrap.rec-on{flex-direction:row;align-items:center;justify-content:center;gap:clamp(28px,3.5vw,56px);padding:0 clamp(32px,4vw,72px);}
.lo-main-col{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:26px;flex:1 1 auto;min-width:0;min-height:0;height:100%;width:100%;}   /* R185：同 .wh-main-col —— 并排(row)父容器下必须显式 height:100%，否则本列高度=内容高度、名单墙永远不让位 */
/* R183: 并排布局下记录改为常驻右侧 flex 子项（与转盘 .wh-records.pos-right 同纪律） */
.lo-wrap.rec-on .lo-records{flex:0 0 auto;align-self:center;width:var(--whrecw,260px);max-width:var(--whrecw,260px);max-height:86%;position:relative;top:auto;right:auto;transform:none;box-shadow:0 10px 30px rgba(0,0,0,.35);}
.lo-head{display:flex;flex-direction:column;align-items:center;gap:10px;flex:0 0 auto;}   /* R185：标题优先级最高，绝不压缩 */
.lo-title{font-size:calc(var(--lots,60px) * var(--fs));font-weight:var(--fw);letter-spacing:.05em;
  color:var(--lotc,var(--txt));text-shadow:0 4px 20px rgba(0,0,0,.5);display:var(--loth,block);}
.lo-meta{display:var(--lomh,flex);gap:12px;align-items:center;justify-content:center;flex-wrap:wrap;font-size:calc(var(--loms,30px) * var(--fs));color:var(--lomc,var(--txt));}
.lo-prize{background:var(--accent);color:#1a1205;font-weight:900;border-radius:999px;padding:5px 16px;white-space:nowrap;line-height:1.15;max-width:100%;overflow:hidden;text-overflow:ellipsis;}
.lo-prize.full{background:#22c55e;color:#fff;}
.lo-count{opacity:.72;font-weight:600;white-space:nowrap;width:100%;text-align:center;}
.lo-main{display:flex;flex-direction:column;align-items:center;gap:18px;width:100%;flex:0 0 auto;min-height:0;}   /* R185：中奖槽位区不压缩（名单墙让位） */
.lo-congrats{font-size:calc(var(--locs,40px) * var(--fs));font-weight:800;color:var(--locc,var(--accent));letter-spacing:.18em;
  animation:pulse 1.4s ease-in-out infinite;display:var(--loch,block);}
.lo-grid{display:flex;flex-wrap:wrap;gap:20px 28px;justify-content:center;align-items:center;align-content:center;width:100%;}
.lo-slot{min-width:340px;padding:22px 40px;border-radius:22px;text-align:center;word-break:break-word;overflow-wrap:anywhere;
  background:linear-gradient(160deg,rgba(255,255,255,.14),rgba(255,255,255,.04));
  border:1px solid rgba(255,255,255,.2);box-shadow:0 16px 44px rgba(0,0,0,.35);
  font-size:calc(104px * var(--fs));font-weight:900;line-height:1.12;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.lo-slot.won{border-color:var(--loc);color:var(--loc);
  box-shadow:0 20px 60px rgba(0,0,0,.45);
  box-shadow:0 0 0 3px color-mix(in srgb,var(--loc) 28%,transparent),0 20px 60px rgba(0,0,0,.45);
  animation:won .6s cubic-bezier(.2,1.6,.4,1);}
@keyframes won{from{transform:scale(.7);opacity:0;}to{transform:scale(1);opacity:1;}}
.lo-slot.won{display:flex;flex-direction:column;align-items:center;gap:.15em;}
.lo-slot-prize{font-size:var(--lsps,.28em);font-weight:800;letter-spacing:.06em;color:var(--lspc,#231a05);
  background:var(--accent);border-radius:999px;padding:.18em .8em;opacity:.95;display:var(--lsph,inline-block);}
/* R101 照片抽取模式：头像圆 + 姓名（.lo-pimg font-size .45em → width:3.4em ≈ 1.53 倍槽位字号直径） */
.lo-slot.lo-pslot{display:flex;flex-direction:column;align-items:center;gap:.12em;white-space:normal;overflow:visible;}
.lo-pimg{width:3.4em;height:3.4em;border-radius:var(--loas,50%);flex:none;display:flex;align-items:center;justify-content:center;
  font-size:.45em;font-weight:800;overflow:hidden;color:var(--loc,#fff);
  background-color:rgba(255,255,255,.12);background-size:cover;background-position:center;}
.lo-pimg:not(.has){font-size:.35em;}
.lo-pimg.has{color:transparent;box-shadow:0 4px 18px rgba(0,0,0,.35);}
.lo-pname{font-size:var(--lns,.34em);font-weight:900;line-height:1.15;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-break:break-all;color:var(--lnc,inherit);display:var(--lnh,block);}
.lo-grid.n1 .lo-slot{font-size:calc(150px * var(--fs) * var(--los));min-width:calc(640px * var(--los));}
.lo-grid.n2 .lo-slot{font-size:calc(112px * var(--fs) * var(--los));min-width:calc(480px * var(--los));}
.lo-grid.n3 .lo-slot{font-size:calc(90px * var(--fs) * var(--los));min-width:calc(380px * var(--los));}
.lo-grid.n4 .lo-slot,.lo-grid.n5 .lo-slot,.lo-grid.n6 .lo-slot{font-size:calc(70px * var(--fs) * var(--los));min-width:calc(320px * var(--los));}
.lo-grid.n7 .lo-slot,.lo-grid.n8 .lo-slot,.lo-grid.n9 .lo-slot,
.lo-grid.n10 .lo-slot,.lo-grid.n11 .lo-slot,.lo-grid.n12 .lo-slot{font-size:calc(52px * var(--fs) * var(--los));min-width:calc(250px * var(--los));padding:14px 22px;}
.lo-grid.n13 .lo-slot,.lo-grid.n14 .lo-slot,.lo-grid.n15 .lo-slot,.lo-grid.n16 .lo-slot,
.lo-grid.n17 .lo-slot,.lo-grid.n18 .lo-slot,.lo-grid.n19 .lo-slot,.lo-grid.n20 .lo-slot,
.lo-grid.n21 .lo-slot,.lo-grid.n22 .lo-slot,.lo-grid.n23 .lo-slot,.lo-grid.n24 .lo-slot{font-size:calc(44px * var(--fs) * var(--los));min-width:calc(210px * var(--los));padding:10px 16px;}
/* R220：抽奖自动排版（buildLottery 显式计算后内联下列变量；放在 .nN 档位之后，同特异性靠后者胜）
 * --loslotfs  槽位字号（按可用宽高反推，替代按 n 分档的固定字号）
 * --loslotpad 槽位内边距（按字号等比，小字号时不再被 22px/40px 固定padding 吃掉体积）
 * 列数/行高/gap 由 JS 写成内联 grid-template-columns / grid-auto-rows / gap。 */
.lo-grid.lo-auto{justify-content:center;align-content:center;width:auto;max-width:100%;}
.lo-grid.lo-auto .lo-slot{min-width:0;font-size:var(--loslotfs,80px);padding:var(--loslotpad,22px 40px);}
.lo-grid.lo-auto .lo-slot.lo-pslot{min-width:0;}
/* R185：名单墙是抽奖页优先级最低的一块，空间不足时先压缩它（flex:0 1 auto + min-height:0），
 * 保证标题与中奖槽位永远完整可见（此前超高时溢出被居中均分 → 上下同时被裁）。 */
/* R220：名单墙不再固定 210px 上限——改为「吃掉剩余高度」（.lo-head/.lo-main 都是 flex:0 0 auto，
 * 墙是唯一可压缩项，自然只拿剩余空间）；内容是否放得下由 buildLottery → loFitWall() 显式计算，
 * 放不下就缩字号/减少显示人数，绝不再靠 overflow:hidden 硬裁（用户反馈的「底部被裁」「整块消失」根因）。 */
.lo-wall{display:flex;flex-wrap:wrap;gap:8px 10px;justify-content:center;flex:0 1 auto;min-height:0;max-height:none;overflow:hidden;
  padding:0 40px;}
.lw-item{font-size:calc(var(--lws,24px) * var(--fs));padding:4px 14px;border-radius:999px;
  background:rgba(255,255,255,.09);border:1px solid rgba(255,255,255,.1);opacity:var(--lwo,.62);transition:background-color .16s,color .16s,border-color .16s,opacity .16s,transform .16s;}   /* R220：原来是 transition:.16s(=all)，font-size 也被过渡 → 自动缩字号的 scrollHeight 反馈永远读到动画中间态、无法收敛（实测 --lws 已 11px 而条目仍渲染 24px），故改为逐属性过渡 */
.lw-item.hot{background:var(--accent);color:#191203;opacity:1;transform:scale(1.14);font-weight:800;}
.lw-more{font-size:calc(var(--lws,24px) * var(--fs));opacity:.55;padding:4px 12px;}
.lo-empty,.ig-empty,.vd-empty,.tx-empty{font-size:calc(44px * var(--fs));opacity:.6;font-weight:600;text-align:center;}

/* ============ 图片 ============ */
.ig-wrap{position:relative;width:100%;height:100%;display:flex;flex-direction:column;gap:16px;}
.ig-title{font-size:calc(44px * var(--fs) * var(--igts,1));font-weight:var(--fw);text-align:center;
  text-shadow:0 3px 16px rgba(0,0,0,.5);}
.ig-view{position:relative;flex:1;border-radius:20px;overflow:hidden;background:rgba(0,0,0,.28);
  display:flex;align-items:center;justify-content:center;}
.ig-layer{position:absolute;inset:0;background-position:center;background-repeat:no-repeat;
  opacity:0;transition:opacity var(--igd,.9s) var(--ige,ease),transform var(--igd,.9s) var(--ige,ease),filter var(--igd,.9s) var(--ige,ease);}
.ig-view.fit-cover .ig-layer{background-size:cover;}
.ig-view.fit-contain .ig-layer{background-size:contain;}
.ig-layer.on{opacity:1;}
.ig-layer.anim-slide{transform:translateX(6%);}
.ig-layer.anim-slide.on{transform:translateX(0);}
.ig-layer.anim-zoom{transform:scale(1.12);}
.ig-layer.anim-zoom.on{transform:scale(1);}
/* R41：轮播新切换样式 —— blur 模糊浮现 / flip 3D 翻转 / slideup 垂直滑动 */
.ig-layer.anim-blur{filter:blur(18px);transform:scale(1.06);}
.ig-layer.anim-blur.on{filter:blur(0);transform:scale(1);}
.ig-layer.anim-flip{transform:perspective(1200px) rotateY(70deg);}
.ig-layer.anim-flip.on{transform:perspective(1200px) rotateY(0);}
.ig-layer.anim-slideup{transform:translateY(8%);}
.ig-layer.anim-slideup.on{transform:translateY(0);}
.ig-layer.anim-none{transition:none;}
.ig-layer.ken.on{animation:ken var(--igkd,14s) ease-out forwards;}
@keyframes ken{from{transform:scale(1);}to{transform:scale(var(--igks,1.11));}}
.ig-view.ig-shadow{box-shadow:0 30px 90px var(--igshc, rgba(0,0,0,.55));}
.ig-cap{min-height:1.2em;text-align:center;font-size:calc(26px * var(--fs));opacity:.75;}
.ig-dots{display:flex;gap:9px;justify-content:center;}
.ig-dots i{width:var(--igdot,11px);height:var(--igdot,11px);border-radius:50%;background:rgba(255,255,255,.32);transition:.2s;}
.ig-dots i.on{background:var(--igdc,var(--accent));transform:scale(1.35);}
/* R90 图片轮播「多图网格」模式 */
.ig-grid{position:relative;flex:1;display:grid;min-height:0;width:100%;}
.ig-cell{position:relative;overflow:hidden;background:rgba(0,0,0,.28);}
.ig-cell.ig-shadow{box-shadow:0 20px 60px var(--igshc, rgba(0,0,0,.45));}
.ig-grid-img{width:100%;height:100%;display:block;}
.ig-grid-img.ken{animation:ken var(--igkd,14s) ease-out forwards;}
/* R319：**大屏信息型文本不许被 ellipsis 裁**（观众无法悬停，裁掉＝永久看不到）。
 * 图片标题 / 照片墙名字 / 排名队名改为可换行、完整显示。 */
.ig-cap-grid{position:absolute;left:50%;max-width:92%;white-space:normal;overflow-wrap:anywhere;overflow:visible;text-overflow:clip;
  opacity:1;pointer-events:none;z-index:2;font-weight:700;}

/* ============ 视频 ============ */
.vd-wrap{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;}
.vd-el{width:100%;height:100%;background:#000;border-radius:16px;}
.vd-el.fit-cover{object-fit:cover;}
.vd-el.fit-contain{object-fit:contain;}
/* R66：视频叠加文字——底部居中，深浅背景都可读（描边+投影），不挡播放控件 */
.vd-cap{position:absolute;left:50%;bottom:calc(18px * var(--fs) * var(--cks, 1));transform:translateX(-50%);
  max-width:92%;text-align:center;font-weight:800;line-height:1.25;letter-spacing:.04em;
  color:var(--accent,#fff);text-shadow:0 2px 6px rgba(0,0,0,.85),0 0 2px rgba(0,0,0,.9),-1px 0 0 rgba(0,0,0,.5),1px 0 0 rgba(0,0,0,.5);
  pointer-events:none;z-index:2;white-space:pre-wrap;word-break:break-word;}

/* ============ 文字 ============ */
.tx-wrap{--txs:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:34px;width:100%;}
.tx-title{font-size:calc(46px * var(--fs) * var(--txts,1));font-weight:600;opacity:.85;letter-spacing:.1em;}
/* R41：文字页副标题（--txsubs 由 stage.js 按 subtitleScale 写入；无副标题时不渲染，零影响） */
.tx-subtitle{font-size:calc(26px * var(--fs) * var(--txsubs,1));font-weight:500;opacity:.62;letter-spacing:.06em;}
.tx-body{width:100%;text-align:center;}
.tx-line{font-size:calc(104px * var(--fs) * var(--txs));font-weight:var(--fw);line-height:var(--txlh,1.3);
  text-shadow:0 6px 28px rgba(0,0,0,.5);}
.tx-line.anim-fade{animation:fadein var(--txd,.8s) ease;}
.tx-line.anim-up{animation:upin var(--txd,.7s) cubic-bezier(.2,1,.3,1);}
.tx-line.anim-scale{animation:scalein var(--txd,.7s) cubic-bezier(.2,1.4,.4,1);}
.tx-line.typing::after{content:'';display:inline-block;width:.055em;height:.86em;margin-left:.08em;
  background:currentColor;vertical-align:-.06em;animation:txcaret .8s steps(1) infinite;}
@keyframes txcaret{0%,49%{opacity:1;}50%,100%{opacity:0;}}
@keyframes fadein{from{opacity:0;}to{opacity:1;}}
@keyframes upin{from{opacity:0;transform:translateY(46px);}to{opacity:1;transform:none;}}
@keyframes scalein{from{opacity:0;transform:scale(.82);}to{opacity:1;transform:scale(1);}}

/* ============ 欢迎 ============ */
.we-wrap{--wes:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:calc(26px * var(--welg,1));text-align:center;
  align-self:var(--weva,center);width:100%;}
/* R108 文字卡片底色（默认无，观感不变） */
.we-wrap.we-card{background:var(--wecb,rgba(0,0,0,.35));padding:calc(48px * var(--fs)) calc(72px * var(--fs));border:var(--webw,0) solid var(--webc,transparent);
  border-radius:28px;width:auto;align-self:var(--weva,center);}
.we-title{font-size:calc(150px * var(--fs) * var(--wes));font-weight:var(--wetw,900);line-height:1.06;
  letter-spacing:.03em;text-shadow:0 10px 40px rgba(0,0,0,.5);}
.we-sub{font-size:calc(58px * var(--fs) * var(--wes) * var(--wess,1));font-weight:600;color:var(--wsc,var(--accent));letter-spacing:.14em;}
.we-line3{font-size:calc(38px * var(--fs) * var(--wes) * var(--wel3,1));color:var(--wel3c,inherit);opacity:.8;letter-spacing:.1em;font-weight:var(--wel3w,600);}
/* R108 文字投影开关：默认关闭（继承 we-title 原有大投影） */
.we-wrap.we-shadow .we-title,.we-wrap.we-shadow .we-sub,.we-wrap.we-shadow .we-line3{text-shadow:var(--wesh, 0 4px 18px rgba(0,0,0,.9),0 2px 4px rgba(0,0,0,.6));}
.we-wrap.glow .we-title{animation:glow 3.2s ease-in-out infinite;}
@keyframes glow{
  0%,100%{text-shadow:0 0 calc(18px * var(--wegs,1)) rgba(255,255,255,.35),0 0 calc(60px * var(--wegs,1)) var(--accent);}
  50%{text-shadow:0 0 calc(34px * var(--wegs,1)) rgba(255,255,255,.6),0 0 calc(120px * var(--wegs,1)) var(--accent);}
}

/* ============ R54 文字场景（标题/副标题/正文静态排版） ============ */
.rt-wrap{--rts:1;--rtts:1;--rtss:1;--rtbs:1;--rtlh:1.5;--rttw:700;
  display:flex;flex-direction:column;align-items:center;width:100%;padding:4% 6%;
  text-align:center;word-break:break-word;}
.rt-wrap.rt-card{background:var(--rtcbg,rgba(10,14,25,.55));border:var(--rtbw,1px) solid var(--rtbc,rgba(255,255,255,.12));
  border-radius:var(--rtcr,28px);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
  max-width:88%;margin:auto;padding:56px 64px;box-shadow:0 18px 60px rgba(0,0,0,.4);}
.rt-title{font-size:calc(88px * var(--fs) * var(--rts) * var(--rtts));font-weight:var(--rttw);
  line-height:1.12;letter-spacing:.04em;text-shadow:0 10px 40px rgba(0,0,0,.5);color:var(--rttc,inherit);}
.rt-sub{font-size:calc(46px * var(--fs) * var(--rts) * var(--rtss));font-weight:var(--rtsw,600);
  letter-spacing:.1em;color:var(--rtsc,var(--accent));margin-top:22px;}
.rt-body{font-size:calc(34px * var(--fs) * var(--rts) * var(--rtbs));line-height:var(--rtlh);
  color:var(--rtbc,inherit);font-weight:var(--rtbdw,inherit);opacity:.94;margin-top:30px;white-space:pre-wrap;max-width:100%;}
.rt-wrap.rt-card .rt-body{margin-top:34px;}
.rt-empty{font-size:calc(34px * var(--fs));opacity:.55;letter-spacing:.08em;}

/* ============ R54 图片场景（单图全屏） ============ */
/* R64：铺满全屏改为可选——默认与其他场景一致使用 st-scene 通用留白（56/64px）在场景区域内展示；
 * 勾选「铺满全屏」（sg.full）时加 .st-sg-full 取消留白（R66 起泛化到所有场景类型，视频场景 vg.full 同用），
 * 图片铺满整个投影屏幕（R61 的无条件 padding:0 收回）。R64：blurFill 模糊背景填充整体删除。 */
.st-scene.st-sg-full{padding:0;}
.sg-wrap{position:relative;overflow:hidden;display:flex;align-items:center;justify-content:center;width:100%;height:100%;}
.sg-el{max-width:100%;max-height:100%;width:100%;height:100%;}
.sg-el.fit-cover{object-fit:cover;}
.sg-el.fit-contain{object-fit:contain;}
.sg-el.sg-shadow{box-shadow:0 18px 60px var(--sgshc, rgba(0,0,0,.45));}
/* R71 内容上方标题：有标题时 wrap 转纵向布局，媒体区 flex:1 自动下移；
 * 无标题时不加 has-title，渲染与旧版完全一致（扩面不变脸） */
.sg-wrap.has-title,.vd-wrap.has-title{flex-direction:column;justify-content:flex-start;
  gap:calc(20px * var(--fs) * var(--cks,1));}
/* R72 媒体区容器：标题存在时吃掉剩余高度（flex:1），媒体百分比尺寸以它为基准，
 * 避免媒体元素自身被 flex 拉伸成非预期比例（用户实测「设置标题后图片变方形」） */
.sg-stage,.vd-stage{position:relative;display:flex;align-items:center;justify-content:center;
  width:100%;height:100%;min-height:0;}
.sg-wrap.has-title .sg-stage,.vd-wrap.has-title .vd-stage{flex:1 1 0;}
.st-scene.st-sg-full .sg-wrap.has-title,.st-scene.st-sg-full .vd-wrap.has-title{
  padding:calc(22px * var(--fs) * var(--cks,1)) calc(30px * var(--fs) * var(--cks,1)) calc(30px * var(--fs) * var(--cks,1));}
/* R72：flex 只作用于媒体区容器（.sg-stage/.vd-stage），媒体元素自身保持百分比尺寸，
 * 否则 flex:1 1 0 会把图片/视频撑满容器宽度（实测 913×242 的扁条） */
.sg-title,.vd-title{flex:none;max-width:92%;text-align:center;font-weight:var(--sgtw,800);line-height:1.3;
  letter-spacing:.02em;word-break:break-word;text-shadow:var(--sgts,0 3px 14px rgba(0,0,0,.5));}
.sg-title.has-bg,.vd-title.has-bg{padding:.18em .55em;border-radius:var(--sgtr,16px);text-shadow:none;}
.sg-empty{font-size:calc(34px * var(--fs));opacity:.55;letter-spacing:.08em;}

/* ============ R82 价格牌/商品标价 ============ */
.pr-wrap{position:relative;overflow:hidden;display:flex;flex-direction:column;align-items:center;justify-content:center;
  width:100%;height:100%;gap:calc(22px * var(--fs) * var(--cks,1));--prs:1;}
.pr-title{flex:none;max-width:92%;text-align:center;font-weight:800;line-height:1.25;
  letter-spacing:.02em;word-break:break-word;text-shadow:0 3px 14px rgba(0,0,0,.5);}
.pr-title.has-bg{padding:.18em .55em;border-radius:16px;text-shadow:none;}
.pr-grid{display:grid;width:100%;height:100%;align-items:stretch;justify-items:stretch;
  padding:calc(8px * var(--fs) * var(--cks,1));box-sizing:border-box;}
.pr-multi{} /* R198：多商品标记；缩放由 --pras 控制 */
/* R209：多商品自动排版优化——卡片等高、图片不撑爆、名称/价格对齐统一 */
.pr-multi .pr-card{align-items:stretch;justify-content:flex-start;
  gap:calc(14px * var(--fs) * var(--cks,1) * var(--pras,1));
  padding:calc(22px * var(--fs) * var(--cks,1) * var(--pras,1));}
.pr-multi .pr-card .pr-img{flex:0 1 auto;min-height:0;width:auto;max-width:100%;
  max-height:calc(var(--prir,75) * 1%);object-fit:contain;display:block;margin:0 auto;}
.pr-multi .pr-card .pr-name{flex:0 0 auto;align-self:center;max-width:100%;}
.pr-multi .pr-card .pr-price{flex:0 0 auto;align-self:center;margin-top:auto;}
.pr-multi .pr-card .pr-empty{width:100%;height:100%;display:flex;align-items:center;justify-content:center;}
.pr-card{display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:calc(20px * var(--fs) * var(--cks,1) * var(--pras,1));padding:calc(30px * var(--fs) * var(--cks,1) * var(--pras,1));
  border-radius:calc(28px * var(--fs) * var(--cks,1) * var(--pras,1));width:100%;height:100%;min-width:0;min-height:0;
  background:rgba(255,255,255,.04);box-shadow:0 18px 70px rgba(0,0,0,.45);overflow:hidden;transform:scale(var(--prcs,1));}   /* R213 卡片大小自定义 */
.pr-img{max-width:100%;max-height:calc(var(--prir,75) * 1%);border-radius:calc(18px * var(--fs) * var(--cks,1) * var(--pras,1));}
.pr-img.fit-cover{object-fit:cover;}
.pr-img.fit-contain{object-fit:contain;}
.pr-name{flex:none;max-width:92%;text-align:center;font-weight:800;line-height:1.2;
  font-size:calc(64px * var(--fs) * var(--prs) * var(--cks,1) * var(--prns,1) * var(--pras,1));letter-spacing:.02em;
  word-break:break-word;text-shadow:0 4px 18px rgba(0,0,0,.5);}
.pr-price{flex:none;display:flex;align-items:baseline;justify-content:center;gap:.12em;
  font-weight:900;line-height:1;color:var(--accent);text-shadow:0 6px 26px rgba(0,0,0,.5);}
.pr-unit{font-size:calc(72px * var(--fs) * var(--prs) * var(--cks,1) * var(--prus,1) * var(--pras,1) * var(--prps,1));}
.pr-amount{font-size:calc(190px * var(--fs) * var(--prs) * var(--cks,1) * var(--pras,1) * var(--prps,1));font-variant-numeric:tabular-nums;
  font-feature-settings:"tnum" 1;}
.pr-empty{font-size:calc(34px * var(--fs));opacity:.55;letter-spacing:.08em;text-align:center;}

/* ============ R83 答题闯关 ============ */
.qz-wrap{position:relative;overflow:hidden;display:flex;flex-direction:column;align-items:center;justify-content:center;
  width:100%;height:100%;gap:calc(26px * var(--fs) * var(--cks,1));--qzs:1;--qzAcc:rgba(255,255,255,.14);
  padding:calc(24px * var(--fs) * var(--cks,1));box-sizing:border-box;}
.qz-title{flex:none;max-width:92%;text-align:center;font-weight:800;line-height:1.25;
  font-size:calc(58px * var(--fs) * var(--qzs) * var(--cks,1) * var(--qzts,1));letter-spacing:.02em;word-break:break-word;color:var(--qztc,inherit);text-shadow:0 3px 14px rgba(0,0,0,.5);}
/* R94：进度升级为胶囊徽章 + 分段进度点（已讲解填充强调色，当前题放大） */
.qz-progress{flex:none;display:inline-flex;align-items:center;gap:calc(14px * var(--fs));
  padding:calc(8px * var(--fs)) calc(22px * var(--fs));border-radius:999px;
  background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.16);
  font-size:calc(26px * var(--fs) * var(--qzs));letter-spacing:.06em;opacity:.9;font-weight:700;color:var(--qzpc,inherit);
  box-shadow:0 6px 20px rgba(0,0,0,.25);}
.qz-dots{display:inline-flex;align-items:center;gap:calc(8px * var(--fs));}
.qz-dot{width:calc(11px * var(--fs));height:calc(11px * var(--fs));border-radius:50%;
  background:rgba(255,255,255,.22);transition:background .2s,transform .2s,box-shadow .2s;}
.qz-dot.on{background:var(--accent);box-shadow:0 0 12px rgba(255,255,255,.35);}
.qz-dot.cur{transform:scale(1.45);background:#fff;}
.qz-dot.on.cur{background:var(--accent);}
/* R91：操作员后台「显示答案」后，大屏顶部的确认标签（R94：加入场微光动画） */
.qz-reveal-tag{flex:none;align-self:center;display:inline-flex;align-items:center;gap:.4em;margin-top:calc(6px * var(--fs));
  padding:calc(8px * var(--fs)) calc(22px * var(--fs));border-radius:999px;background:rgba(52,211,153,.16);
  border:1px solid rgba(52,211,153,.5);color:#7ff0c6;font-weight:800;font-size:calc(24px * var(--fs) * var(--qzs));
  letter-spacing:.04em;box-shadow:0 6px 20px rgba(0,0,0,.3);animation:qzTagIn .28s ease-out both;}
@keyframes qzTagIn{from{opacity:0;transform:translateY(-8px) scale(.94);}to{opacity:1;transform:none;}}
/* R94：题干下方渐变分隔线，强化「题目」视觉层级 */
.qz-q{flex:none;max-width:94%;text-align:center;font-weight:800;line-height:1.3;position:relative;
  font-size:calc(64px * var(--fs) * var(--qzs) * var(--cks,1) * var(--qzqs,1));word-break:break-word;color:var(--qzqc,inherit);text-shadow:0 4px 18px rgba(0,0,0,.5);
  margin-bottom:calc(6px * var(--fs));padding-bottom:calc(18px * var(--fs));}
.qz-q::after{content:'';position:absolute;left:50%;bottom:0;transform:translateX(-50%);
  width:calc(120px * var(--fs));height:calc(5px * var(--fs));border-radius:99px;
  background:linear-gradient(90deg,transparent,var(--accent),transparent);opacity:.85;}
.qz-opts{display:grid;grid-template-columns:repeat(2,minmax(260px,46%));gap:calc(20px * var(--fs) * var(--cks,1));
  width:100%;max-width:1100px;justify-content:center;}
/* R94：选项 ≥5 个时自动三列，避免两列过高被裁切 */
.qz-opts[data-n="5"],.qz-opts[data-n="6"],.qz-opts[data-n="7"],.qz-opts[data-n="8"]{grid-template-columns:repeat(3,minmax(230px,30%));}
/* R94：选项卡片玻璃质感（渐变底 + 内高光 + 投影），投屏层次更清晰 */
.qz-opt{position:relative;display:flex;flex-wrap:wrap;align-items:center;gap:calc(18px * var(--fs));
  padding:calc(22px * var(--fs) * var(--cks,1)) calc(26px * var(--fs) * var(--cks,1));
  border:2px solid rgba(255,255,255,.18);border-radius:calc(22px * var(--fs) * var(--cks,1));
  background:linear-gradient(135deg,rgba(255,255,255,.09),rgba(255,255,255,.035));
  box-shadow:inset 0 1px 0 rgba(255,255,255,.14),0 8px 24px rgba(0,0,0,.22);
  color:var(--qzoc,#eef4ff);font:700 calc(34px * var(--fs) * var(--qzs) * var(--cks,1) * var(--qzos,1))/1.25 system-ui,-apple-system,"Segoe UI","Microsoft YaHei",sans-serif;
  text-align:left;transition:transform .14s,border-color .14s,box-shadow .14s;}
.qz-opt:hover{transform:translateY(-3px);border-color:rgba(255,255,255,.4);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 14px 34px rgba(0,0,0,.32);}
.qz-opt .qz-key{flex:none;display:inline-flex;align-items:center;justify-content:center;width:calc(48px * var(--fs));height:calc(48px * var(--fs));
  border-radius:50%;background:var(--qzAcc);font-weight:800;font-size:calc(26px * var(--fs));
  box-shadow:inset 0 0 0 2px rgba(255,255,255,.18);}
.qz-opt .qz-txt{flex:1 1 auto;min-width:0;word-break:break-word;}
/* R94：正确项右上角 ✓ 徽标（伪元素实现，不污染 .qz-txt 文本） */
.qz-opt.right::after{content:'✓';position:absolute;top:calc(-12px * var(--fs));right:calc(-10px * var(--fs));
  width:calc(42px * var(--fs));height:calc(42px * var(--fs));border-radius:50%;
  display:flex;align-items:center;justify-content:center;background:var(--qzrc,#34d399);color:#06281c;
  font-size:calc(24px * var(--fs));font-weight:900;box-shadow:0 6px 18px rgba(52,211,153,.5);}
.qz-opt.right{border-color:var(--qzrc,#34d399);background:linear-gradient(135deg,rgba(52,211,153,.24),rgba(52,211,153,.1));
  box-shadow:0 0 0 3px rgba(52,211,153,.25),0 12px 34px rgba(0,0,0,.4);color:#eafff5;}
.qz-opt.dim{opacity:.4;filter:saturate(.55);}
.qz-opt.right .qz-key{background:var(--qzrc,#34d399);color:#06281c;box-shadow:none;}
/* R91：答案说明（操作员后台显示答案后随各选项展示） */
.qz-note{flex-basis:100%;width:100%;margin-top:calc(10px * var(--fs));padding-top:calc(10px * var(--fs));
  border-top:1px dashed rgba(255,255,255,.22);font-weight:500;
  font-size:calc(26px * var(--fs) * var(--qzs) * var(--cks,1) * var(--qzos,1));
  line-height:1.45;color:var(--qznc,rgba(238,244,255,.86));word-break:break-word;}
.qz-opt.right .qz-note{color:var(--qznc,#d8fff0);border-top-color:rgba(52,211,153,.4);}
.qz-next{margin-top:calc(8px * var(--fs));align-self:center;cursor:pointer;border:0;border-radius:999px;
  padding:calc(14px * var(--fs)) calc(34px * var(--fs));font-weight:800;font-size:calc(26px * var(--fs));
  background:linear-gradient(135deg,#4f8cff,#7c5cff);color:#fff;box-shadow:0 10px 30px rgba(79,140,255,.4);}
.qz-timer{flex:none;font-size:calc(24px * var(--fs) * var(--qzs));opacity:.7;letter-spacing:.04em;}
/* R108 限时进度条（timeBar）：默认不启用，走上面 .qz-timer 数字倒数 */
.qz-tbar{flex:none;width:min(560px,70%);height:calc(14px * var(--fs));border-radius:999px;
  background:rgba(255,255,255,.16);overflow:hidden;box-shadow:inset 0 1px 3px rgba(0,0,0,.35);}
.qz-tbar-fill{display:block;height:100%;border-radius:999px;background:linear-gradient(90deg,var(--accent),#ff8a5c);
  transition:width .9s linear;}
/* R94：完成页得分改渐变文字（@supports 保护——不支持 background-clip:text 时回退纯色，避免文字变透明不可见） */
.qz-score{flex:none;font-weight:900;font-size:calc(96px * var(--fs) * var(--qzs) * var(--cks,1));color:var(--accent);text-shadow:0 6px 26px rgba(0,0,0,.5);}
@supports ((-webkit-background-clip:text) or (background-clip:text)){
  .qz-score{background:linear-gradient(135deg,#fff,var(--accent));-webkit-background-clip:text;background-clip:text;
    -webkit-text-fill-color:transparent;text-shadow:none;filter:drop-shadow(0 8px 26px rgba(0,0,0,.5));}
}
.qz-done{flex:none;font-size:calc(34px * var(--fs) * var(--qzs));opacity:.85;letter-spacing:.06em;}
.qz-restart{margin-top:calc(14px * var(--fs));cursor:pointer;border:0;border-radius:999px;
  padding:calc(16px * var(--fs)) calc(40px * var(--fs));font-weight:800;font-size:calc(30px * var(--fs));
  background:linear-gradient(135deg,#4f8cff,#7c5cff);color:#fff;box-shadow:0 12px 36px rgba(79,140,255,.45);}
.qz-empty{font-size:calc(34px * var(--fs));opacity:.55;letter-spacing:.08em;text-align:center;}

/* ============ 计分板 ============ */
.sb-wrap{--sbs:1;--sba:#ff5c6c;--sbb:#5aa0ff;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:40px;width:100%;position:relative;}
.sb-title{font-size:calc(64px * var(--fs) * var(--sbs) * var(--sbtz,1));font-weight:var(--fw);letter-spacing:.06em;
  color:var(--accent);text-shadow:0 8px 30px rgba(0,0,0,.5);}
.sb-board{display:flex;align-items:stretch;justify-content:center;gap:var(--sbg,60px);width:100%;}
.sb-side{flex:1;max-width:640px;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:22px;padding:56px 40px;border-radius:var(--sbr,34px);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);}
.sb-a{background:rgba(79,140,255,.12);border:3px solid rgba(79,140,255,.5);
  background:linear-gradient(180deg,color-mix(in srgb,var(--sba) 20%,transparent),color-mix(in srgb,var(--sba) 5%,transparent));
  border:3px solid color-mix(in srgb,var(--sba) 60%,transparent);}
.sb-b{background:rgba(124,92,255,.12);border:3px solid rgba(124,92,255,.5);
  background:linear-gradient(180deg,color-mix(in srgb,var(--sbb) 20%,transparent),color-mix(in srgb,var(--sbb) 5%,transparent));
  border:3px solid color-mix(in srgb,var(--sbb) 60%,transparent);}
.sb-name{font-size:calc(56px * var(--fs) * var(--sbs) * var(--sbnz,1));font-weight:700;letter-spacing:.05em;opacity:.96;color:var(--sbn, inherit);display:var(--sbnh,block);}
.sb-num{font-size:calc(240px * var(--fs) * var(--sbs) * var(--sbd,1) * var(--sbdz,1));font-weight:900;line-height:1;font-variant-numeric:tabular-nums;
  animation:sbpop .4s cubic-bezier(.2,1.3,.4,1);}
.sb-a .sb-num{background:linear-gradient(180deg,#fff 15%,var(--sbnc,var(--sba)));-webkit-background-clip:text;background-clip:text;color:transparent;}
.sb-b .sb-num{background:linear-gradient(180deg,#fff 15%,var(--sbnc,var(--sbb)));-webkit-background-clip:text;background-clip:text;color:transparent;}
.sb-vs{align-self:center;font-size:calc(72px * var(--fs) * var(--sbs) * var(--sbvz,1));font-weight:900;opacity:.55;letter-spacing:.08em;color:var(--sbvc,inherit);}
@keyframes sbpop{0%{transform:scale(.6);opacity:.3}60%{transform:scale(1.08)}100%{transform:scale(1);opacity:1}}
.sb-side.win{border-color:var(--accent);box-shadow:0 0 0 4px rgba(255,209,102,.25),0 0 60px rgba(255,209,102,.45);animation:sbwin 1.1s ease-in-out infinite;}
/* R109 领先方高亮：与 .win（已达标/已标记获胜）区分——lead 是「此刻分最高」，平局时双方都不亮 */
.sb-side.lead,.sb-team.lead{border-color:rgba(255,255,255,.55);box-shadow:0 0 0 3px rgba(255,255,255,.18),0 10px 34px rgba(0,0,0,.38);}
.sb-side.lead .sb-num,.sb-team.lead .sb-num{text-shadow:0 0 calc(28px * var(--fs)) rgba(255,255,255,.35);}
.sb-side.win.lead,.sb-team.win.lead{border-color:var(--accent);}
@keyframes sbwin{0%,100%{box-shadow:0 0 0 4px rgba(255,209,102,.25),0 0 50px rgba(255,209,102,.4)}50%{box-shadow:0 0 0 6px rgba(255,209,102,.4),0 0 90px rgba(255,209,102,.65)}}
.sb-badge{font-size:calc(40px * var(--fs) * var(--sbs));font-weight:900;color:#1a1200;background:var(--accent);
  padding:6px 26px;border-radius:999px;letter-spacing:.12em;box-shadow:0 8px 26px rgba(0,0,0,.35);}
.sb-goal{font-size:calc(34px * var(--fs) * var(--sbs));opacity:.7;font-weight:600;letter-spacing:.08em;}
/* R22 进球进度条：默认不渲染（goalBar 关闭），开启后显示领先方相对目标的进度 */
.sb-goalbar{width:min(560px,82%);height:14px;border-radius:999px;background:rgba(255,255,255,.16);overflow:hidden;margin-top:6px;}
.sb-goalbar-fill{height:100%;border-radius:999px;background:linear-gradient(90deg,var(--sba,#ff5c6c),var(--sbb,#5aa0ff));transition:width .45s cubic-bezier(.2,.8,.2,1);box-shadow:0 4px 16px rgba(0,0,0,.3);}
/* 紧凑样式：数字更小、两侧并排适合多轮计分 */
.sb-wrap.style-compact .sb-board{gap:30px;}
.sb-wrap.style-compact .sb-side{padding:30px 24px;border-radius:24px;}
.sb-wrap.style-compact .sb-num{font-size:calc(150px * var(--fs) * var(--sbs));}

/* ============ 全屏时钟 ============ */
.ck-wrap{--cks:1;--ckc:var(--accent);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:34px;width:100%;}
.ck-title{font-size:calc(56px * var(--fs) * var(--cks));font-weight:var(--fw);letter-spacing:.06em;color:var(--ckttc, var(--ckc));display:var(--cktth, block);
  text-shadow:0 8px 30px rgba(0,0,0,.5);}
.ck-body{display:flex;align-items:center;justify-content:center;gap:var(--ckgap,70px);flex-wrap:wrap;}
.ck-digital{text-align:center;}
/* 注意：必须限定在 .ck-wrap 内。裸 .ck-time 会覆盖上方"角落实时时钟"的同名规则（P0） */
/* R52 防抖动：tabular-nums 在部分字体（CJK 回退/冒号窄于数字）下仍逐秒微变宽度，
   style-both 模式下 flex 布局每秒推动挂钟左右抖动。min-width:8ch 固定 HH:MM:SS 占位，
   text-align:center 保持居中不偏移；宽于 8ch 的时间串（如带 AM/PM）取实际宽且恒定。 */
.ck-wrap .ck-time{font-size:calc(200px * var(--fs) * var(--cks));font-weight:900;line-height:1;font-variant-numeric:tabular-nums;
  min-width:8ch;text-align:center;
  letter-spacing:.02em;background:linear-gradient(180deg,#fff 20%,var(--cktmc, var(--ckc)));-webkit-background-clip:text;background-clip:text;color:transparent;
  filter:drop-shadow(0 8px 34px rgba(0,0,0,.45));}
.ck-date{font-size:calc(44px * var(--fs) * var(--cks));font-weight:600;opacity:.85;letter-spacing:.1em;margin-top:14px;color:var(--ckdtc, inherit);display:var(--ckdth, block);}
.ck-analog{display:flex;align-items:center;justify-content:center;}
/* R47 经典挂钟重设计（对照用户参考图）：纯色塑料外框（可自定义 --ckframe，默认橙红）
   + 米白表盘 + 黑色阿拉伯数字 + 外缘分钟点刻度 + 黑色时针分针 + 红色细秒针带小配重
   + 黄铜色轴心 + QUARTZ 小字。DOM 结构与 --ckdial/--ckhw/--ckhl/--ckc 及 numR 等既有自定义全部兼容。 */
.ck-face{position:relative;width:calc(var(--ckdial,430px) * var(--fs) * var(--cks));height:calc(var(--ckdial,430px) * var(--fs) * var(--cks));
  border-radius:50%;
  /* R51：拆分 border 属性——自定义色非法时只回退默认橙红，外框永不消失（JS 端另有 validColor 校验双保险） */
  border-width:calc(24px * var(--fs) * var(--cks));
  border-style:solid;
  border-color:var(--ckframe, #e2601f);
  background:
    radial-gradient(circle at 50% 42%, #fbf9f2 0%, #f5f1e6 62%, #eae4d4 100%) padding-box,
    linear-gradient(160deg, rgba(255,255,255,.38), rgba(0,0,0,0) 42%, rgba(0,0,0,.16)) border-box;
  box-shadow:0 30px 80px rgba(0,0,0,.5),0 6px 18px rgba(0,0,0,.35),
    inset 0 3px 7px rgba(255,255,255,.45),
    inset 0 -5px 12px rgba(0,0,0,.22),
    0 2px 0 rgba(255,255,255,.12);}
/* 表盘内缘凹陷圈（外框与盘面之间的过渡） */
.ck-face::before{content:'';position:absolute;inset:calc(-2px * var(--fs) * var(--cks));border-radius:50%;z-index:1;pointer-events:none;
  box-shadow:inset 0 4px 10px rgba(0,0,0,.28),inset 0 -2px 6px rgba(255,255,255,.28);}
/* 玻璃反光层（覆于指针之上）。
 * R59：顶部椭圆高光减弱（.30→.20）——用户仍能看到 12 位置被亮弧圈住的「圆圈」。
 * R63：彻底删除顶部椭圆高光（radial-gradient at 50% -18% 整段移除）——减弱不够，
 * 米白表盘上 34% 半径的渐变边缘就是肉眼可见的圆圈（无痕窗口亦有，非缓存）。
 * 仅保留对角玻璃微反射（线性渐变不形成圆形轮廓，透明度再降一档）。 */
.ck-face::after{content:'';position:absolute;inset:0;border-radius:50%;z-index:9;pointer-events:none;
  background:linear-gradient(135deg, rgba(255,255,255,.10) 0%, rgba(255,255,255,.02) 26%, transparent 44%, transparent 76%, rgba(255,255,255,.05) 100%);}
/* 刻度：外缘时标 = 黑色小方块（R59 对照用户参考样式，取消此前的圆点观感），分标 = 黑色小圆点；
   实现仍为整半径旋转容器 + gradient 画最外端。12 位置与其他时标一致（R51 去该处分钟小点的决定维持）。 */
.ck-tick{position:absolute;left:calc(50% - 2.5px * var(--fs) * var(--cks));top:0;width:calc(5px * var(--fs) * var(--cks));height:50%;
  transform-origin:50% 100%;
  background:linear-gradient(to bottom, transparent 0 4.2%, #17181a 4.2% calc(4.2% + 5px * var(--fs) * var(--cks)), transparent 0);}
/* R70：修饰类 mini → ck-mini。原 `mini` 与 main.css 控制台小按钮 .mini 撞类名
 * （width:22px;height:22px;border;display:grid 泄漏到刻度上），把本该从圆心
 * 辐射到表缘的细长刻度条压成 22px 小药丸全挤在表缘——12 点位叠出「圆圈」、
 * 表盘分钟小点全部失效（用户截图实证）。ck- 前缀命名空间隔离。 */
.ck-tick.ck-mini{left:calc(50% - 1.5px * var(--fs) * var(--cks));width:calc(3px * var(--fs) * var(--cks));
  background:linear-gradient(to bottom, transparent 0 4.4%, #17181a 4.4% calc(4.4% + 3px * var(--fs) * var(--cks)), transparent 0);}
/* 数字：黑色细长几何体（经典挂钟字型） */
.ck-num{position:absolute;transform:translate(-50%,-50%);font-size:calc(56px * var(--fs) * var(--cks));
  font-weight:500;color:#17181a;line-height:1;letter-spacing:-.01em;}
/* 品牌小字（表盘 6 点位上方装饰） */
.ck-brand{position:absolute;left:50%;top:71.5%;transform:translateX(-50%);z-index:2;
  font-size:calc(13px * var(--fs) * var(--cks));letter-spacing:.24em;color:var(--ckbtc, #8a8578);font-weight:600;display:var(--ckbth, block);}
/* 指针：黑色扁平棒 + 尾翼；秒针红色细针 + 小配重段 */
.ck-hand{position:absolute;bottom:50%;transform-origin:50% 100%;border-radius:99px;box-shadow:0 3px 10px rgba(0,0,0,.28);}
.ck-hand::before{content:'';position:absolute;left:50%;top:calc(100% + 2px);transform:translateX(-50%);
  width:64%;height:13%;border-radius:99px;background:inherit;}
.ck-hour{width:calc(13px * var(--fs) * var(--cks) * var(--ckhw,1));height:calc(24% * var(--ckhl,1));left:calc(50% - 6.5px * var(--fs) * var(--cks) * var(--ckhw,1));
  background:linear-gradient(to right, #34363a, #17181a 60%, #0c0d0e);}
.ck-min{width:calc(9px * var(--fs) * var(--cks) * var(--ckhw,1));height:calc(36% * var(--ckhl,1));left:calc(50% - 4.5px * var(--fs) * var(--cks) * var(--ckhw,1));
  background:linear-gradient(to right, #34363a, #17181a 60%, #0c0d0e);}
.ck-sec{width:calc(3px * var(--fs) * var(--cks) * var(--ckhw,1));height:calc(44% * var(--ckhl,1));left:calc(50% - 1.5px * var(--fs) * var(--cks) * var(--ckhw,1));
  background:var(--cksec, #d92828);}
.ck-sec::after{content:'';position:absolute;left:50%;top:calc(100% + 7px * var(--fs) * var(--cks));transform:translateX(-50%);
  width:calc(3px * var(--fs) * var(--cks));height:calc(22px * var(--fs) * var(--cks));border-radius:99px;
  background:var(--cksec, #d92828);box-shadow:0 2px 6px rgba(0,0,0,.3);}
/* 轴心：黄铜色球面高光（图示金色销钉） */
.ck-pin{position:absolute;left:calc(50% - 11px * var(--fs) * var(--cks));top:calc(50% - 11px * var(--fs) * var(--cks));z-index:10;
  width:calc(22px * var(--fs) * var(--cks));height:calc(22px * var(--fs) * var(--cks));border-radius:50%;
  background:radial-gradient(circle at 35% 28%, #f7e8b0, #d9ae3c 46%, #9c7717 82%, #6d520d 100%);
  box-shadow:0 0 0 calc(2px * var(--fs) * var(--cks)) rgba(255,255,255,.55),0 2px 8px rgba(0,0,0,.4);}
.style-both .ck-body{gap:var(--ckgap,90px);}
/* 自定义：场景内时钟卡片底板（与全局角落时钟 card 视觉一致） */
.ck-wrap.ck-card{background:rgba(15,23,42,.45);border:1px solid rgba(255,255,255,.14);border-radius:clamp(20px,3vw,32px);
  padding:clamp(22px,4vw,52px);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);box-shadow:0 24px 70px rgba(0,0,0,.4);}
/* 自定义：冒号闪烁（仅数字时钟时间部分的冒号） */
.ck-wrap.ck-blink .ck-col{animation:ckblink 1s steps(1,end) infinite;}
@keyframes ckblink{50%{opacity:0;}}

/* ============ 转盘抽奖 ============ */
/* R185：转盘容器固定高度——此前高度由内容撑开，720px 盘面 + 标题 + 结果总高 894 > 可用 788，
 * justify-content:center 把溢出上下均分 → 标题顶部被裁（用户报的遮挡）。
 * 固定 height 后配合 .wh-stage 的可收缩正方，内容永远落在可视区内。 */
.wh-wrap{--whs:.9;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:18px;width:100%;height:100%;min-height:0;max-height:100%;position:relative;}
.wh-title{font-size:calc(56px * var(--fs) * var(--whs));font-weight:var(--fw);color:var(--accent);letter-spacing:.05em;text-shadow:0 8px 30px rgba(0,0,0,.5);}
/* R185：盘面改为「可收缩的正方」——aspect-ratio:1 + width:auto 让宽度随高度走（收缩后仍是正圆，
 * 不会变椭圆）；flex:0 1 auto + min-height:0 让它在空间不足时先让位给标题/结果。
 * 此前宽高都是固定 calc()，flex 只压高度不压宽度 → 盘面会被压成椭圆。 */
.wh-stage{position:relative;flex:0 1 auto;min-height:0;height:calc(720px * var(--fs) * var(--whs));width:auto;aspect-ratio:1/1;max-width:100%;max-height:100%;}
/* R102：盘面投影改由 .wh-shadow 类控制（whShadow 自定义，默认 true 与旧无条件投影一致；关掉可做扁平风） */
.wh-canvas{width:100%;height:100%;display:block;border-radius:50%;}
.wh-canvas.wh-shadow{filter:drop-shadow(0 20px 60px var(--whshc, rgba(0,0,0,.5)));}
.wh-pointer{position:absolute;top:-8px;left:50%;transform:translateX(-50%);width:0;height:0;z-index:2;
  border-left:24px solid transparent;border-right:24px solid transparent;border-top:46px solid var(--accent);
  filter:drop-shadow(0 4px 8px rgba(0,0,0,.45));}
.wh-result{font-size:calc(var(--whrs,64px) * var(--fs) * var(--whs));font-weight:900;min-height:1.2em;color:var(--accent);
  background:var(--whrb, transparent); color:var(--whrc, var(--accent));
  padding:.12em .45em; border-radius:.35em; display:inline-block;
  opacity:0;transform:translate(var(--whrx,0px),var(--whry,0px)) scale(.7);transition:transform .35s cubic-bezier(.2,1.3,.4,1),opacity .3s;letter-spacing:.04em;}
.wh-result.show{opacity:1;transform:translate(var(--whrx,0px),var(--whry,0px)) scale(1);}
.wh-empty{font-size:calc(40px * var(--fs));opacity:.6;font-weight:600;}
/* R113：转盘「中奖记录」常驻面板 */
.wh-records,.lo-records{display:flex;flex-direction:column;gap:5px;width:100%;max-width:560px;padding:9px 16px;background:rgba(255,255,255,.1);border:1px solid rgba(255,255,255,.16);border-radius:14px;max-height:30%;overflow:auto;box-shadow:0 8px 24px rgba(0,0,0,.18);}
/* R156：抽奖记录面板同样改为自适应滚动（与 .wh-records 同纪律）。
 * 位置下拉移除后 pos-side / pos-top 分支一并作废，故删除对应规则。 */
.lo-records{flex:0 1 auto;min-height:calc(96px * var(--fs));max-height:34%;overflow-y:auto;overscroll-behavior:contain;}
/* R155：转盘中奖记录改为「自适应滚动」——去掉「记录位置」下拉后，面板常驻底部：
 * 内容少时按内容自然高度，超出可用空间则面板内部滚动（不再有侧边绝对定位分支）。
 * min-height:0 让它在 flex 列中可收缩，否则内容多时会把转盘挤出可视区。 */
/* min-height 给一个随舞台缩放的下限（约 3 行）：只写 min-height:0 会让面板在转盘较高时被
 * flex 挤成十几像素，等于「自适应」变成「自适应没了」。 */
.wh-records{flex:0 1 auto;min-height:calc(96px * var(--fs));max-height:34%;overflow-y:auto;overscroll-behavior:contain;}
/* R214：开启中奖记录后自动左右排版 */
.wh-main-col{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:18px;flex:1 1 auto;min-width:0;min-height:0;height:100%;width:100%;}
.wh-wrap.wh-rec-side{flex-direction:row;align-items:center;justify-content:center;gap:calc(28px * var(--fs));padding:0 calc(24px * var(--fs));}
.wh-wrap.wh-rec-side .wh-main-col{height:92%;}
.wh-wrap.wh-rec-side .wh-stage{height:calc(760px * var(--fs) * var(--whs));max-height:100%;}
.wh-wrap.wh-rec-side .wh-records{width:320px;max-width:34%;height:92%;max-height:none;flex:0 0 auto;}
.wh-wrap.wh-rec-side .wh-records.wh-rec-scroll,
.wh-records.wh-rec-scroll{max-height:none;}
/* R218：抽奖记录面板「超出时滚动显示全部」——与转盘同纪律（.lo-wrap.rec-on 下 86% 上限仍生效，滚动发生在其内部，不会撑破大屏） */
.lo-records.lo-rec-scroll{max-height:none;}
/* R218：抽奖记录是并排(rec-on)常驻布局，.lo-wrap.rec-on .lo-records 的 86% 上限优先级更高（0,3,0）；
 * 这里用 (0,4,0) 在滚动模式下放宽到 96%，让「显示全部」真的能多显示几条（仍不撑破大屏）。 */
.lo-wrap.rec-on .lo-records.lo-rec-scroll{max-height:96%;}
/* R216：上角标时钟可见时（.stage.has-ck-top），并排「中奖记录」面板下移避让——
 * 用户截图：记录面板被「时间/日期」遮挡。--ckres 由 renderClock 按角标字号测算（默认约 150px）。
 * 选择器优先级(0,5,0) 高于上面的 .wh-rec-scroll{max-height:none}(0,4,0)，故滚动模式下也在该高度内滚动不溢出。 */
.stage.has-ck-top .wh-wrap.wh-rec-side .wh-records{align-self:flex-start;margin-top:var(--ckres,160px);max-height:calc(100% - var(--ckres,160px) - 26px);}
/* R216：中奖/抽奖记录面板隐藏滚动条（投影大屏观感）；是否滚动 / 仅显示最新 N 条仍由
 * 「超出时滚动显示全部」+「记录条数上限」两个控件控制。 */
.wh-records,.lo-records{scrollbar-width:none;-ms-overflow-style:none;}
.wh-records::-webkit-scrollbar,.lo-records::-webkit-scrollbar{width:0;height:0;display:none;}
/* R155/R156：转盘记录位置下拉（whRecPos/whRecW）已移除，记录面板统一「常驻底部 + 自适应滚动」，
 * 不再输出 pos-bottom/pos-right/rec-right 类，故对应规则一并作废。 */
.wh-records.pos-bottom,.wh-records.pos-right,.wh-wrap.rec-right{}
.wh-rec-empty{font-size:calc(20px * var(--fs));opacity:.7;font-weight:600;text-align:center;padding:6px 0;color:#fff;}
.wh-rec-item{display:flex;align-items:center;gap:10px;font-size:calc(22px * var(--fs));line-height:1.25;padding:2px 0;}
.wh-rec-rank{flex:0 0 auto;width:1.7em;height:1.7em;border-radius:50%;background:var(--accent);color:#fff;display:inline-flex;align-items:center;justify-content:center;font-size:.7em;font-weight:800;}
/* R319：转盘中奖记录里的人名同属信息型列 —— 长名不再被省略号吃掉。 */
.wh-rec-name{flex:1 1 auto;min-width:0;font-weight:700;color:#fff;white-space:normal;overflow-wrap:anywhere;overflow:visible;text-overflow:clip;}
.wh-rec-time{flex:0 0 auto;opacity:.7;font-size:.8em;font-variant-numeric:tabular-nums;color:#fff;}
.lo-records{margin-top:14px;align-self:center;}
/* R188：转盘记录面板标题与抽奖同款样式 */
.lo-rec-title,.wh-rec-title{font-weight:700;opacity:.92;margin-bottom:2px;font-size:calc(22px * var(--fs));}
/* R194：记分变动记录面板（投影窗 + 控制台预览共用）；默认绝对定位贴在记分板下方（无记录开关时兼容旧观感） */
.sb-records{position:absolute;left:50%;bottom:14px;transform:translateX(-50%);width:min(92%,620px);max-height:30%;overflow:auto;display:flex;flex-direction:column;gap:4px;padding:10px 18px;background:rgba(15,23,42,.62);border:1px solid rgba(255,255,255,.18);border-radius:16px;box-shadow:0 8px 24px rgba(0,0,0,.28);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);}
.sb-rec-title{font-weight:700;opacity:.92;margin-bottom:4px;font-size:calc(20px * var(--fs));letter-spacing:.02em;}
.sb-rec-item{display:flex;align-items:center;gap:10px;font-size:calc(20px * var(--fs));line-height:1.3;padding:6px 2px;border-bottom:1px solid rgba(255,255,255,.09);}
.sb-rec-item:last-child{border-bottom:none;}
/* R319：大屏记分记录的「动作」列是**信息承载列**（多队加分明细可能很长）—— 被 ellipsis 裁掉
 * 观众就读不到完整记录。改为换行完整显示；时间列仍单行（短值）。 */
.sb-rec-act{flex:1;min-width:0;white-space:normal;overflow-wrap:anywhere;overflow:visible;text-overflow:clip;}
.sb-rec-time{opacity:.7;font-variant-numeric:tabular-nums;flex:0 0 auto;}
.sb-rec-empty{opacity:.7;padding:6px 2px;}

/* R206：记分记录开关 + 「左比分 / 右记录」分栏布局（records 开启时 .sb-wrap.recOn） */
.sb-wrap.recOn{display:flex;flex-direction:row;align-items:center;justify-content:center;gap:calc(var(--sbg,60px) * .5);width:100%;height:100%;}
.sb-main{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:40px;width:100%;}
.sb-wrap.recOn .sb-records{
  position:relative;left:auto;right:auto;bottom:auto;top:auto;transform:none;
  width:clamp(280px,32%,440px);max-height:90%;flex:0 0 auto;overflow:hidden;align-self:center;
}
.sb-wrap.recOn .sb-records .sb-rec-item{font-size:calc(19px * var(--fs));padding:7px 2px;}
.wh-rec-prize{opacity:.85;font-size:.82em;margin-left:6px;}

/* ============ 照片墙 ============ */
.pw-wrap{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:24px;width:100%;height:100%;padding:24px;box-sizing:border-box;}
.pw-title{font-size:calc(52px * var(--fs) * var(--pwts,1));font-weight:var(--pwtw,var(--fw));color:var(--pwtc,var(--accent));letter-spacing:.05em;text-shadow:0 8px 30px rgba(0,0,0,.5);}
.pw-grid{display:grid;width:100%;max-width:1500px;flex:1;min-height:0;grid-auto-rows:1fr;}
.pw-cell{position:relative;overflow:hidden;border-radius:14px;background:var(--pwcb,rgba(255,255,255,.06));
  box-shadow:var(--pwsh,0 10px 30px var(--pwshc,rgba(0,0,0,.35)));border:var(--pwbw,1px) solid var(--pwbc,rgba(255,255,255,.12));}
.pw-img{width:100%;height:100%;object-fit:cover;display:block;}
.pw-img.ken{animation:pwken var(--pwkd,12s) ease-out forwards;}
@keyframes pwken{from{transform:scale(1);}to{transform:scale(1.08);}}
.pw-grid.anim-fade .pw-cell{animation:fadein ease;animation-duration:var(--pwpd,.45s);}
.pw-grid.anim-slide .pw-cell{animation:pwslide cubic-bezier(.2,.8,.2,1);animation-duration:var(--pwpd,.45s);}
@keyframes pwslide{from{opacity:0;transform:translateX(46px);}to{opacity:1;transform:none;}}
.pw-grid.anim-zoom .pw-cell{animation:scalein cubic-bezier(.2,1.4,.4,1);animation-duration:var(--pwpd,.45s);}
.pw-name{position:absolute;left:8px;bottom:8px;max-width:calc(100% - 16px);white-space:normal;overflow-wrap:anywhere;overflow:visible;text-overflow:clip;
  font-size:calc(18px * var(--fs));font-weight:600;color:#fff;background:rgba(0,0,0,.55);
  padding:4px 12px;border-radius:999px;pointer-events:none;}
.pw-dots{display:flex;gap:10px;justify-content:center;}
.pw-dots i{width:12px;height:12px;border-radius:50%;background:var(--pwdc,rgba(255,255,255,.28));transition:.2s;}
.pw-dots i.on{background:var(--accent);transform:scale(1.25);}
.pw-empty{font-size:calc(40px * var(--fs));opacity:.6;font-weight:600;}

/* ============ 抽奖结果总览 (R239b) ============
 * 只读聚合场景：卡片网格展示抽奖/转盘/记分记录，分页由 stage.js 控制。
 * .rs-wrap 用 --rss（rsSize 控件）整体缩放，transform-origin 居中以保持大屏居中。 */
/* ============ R316 结果总览版式重做（颁奖典礼风） ============
 * 现场需求：站在 10 米外一眼看清「谁中了什么奖 / 谁排第几」。层次收敛为三级：
 *   ① 姓名（最大最粗，带轻微发光） ② 奖项徽章（金/银/铜色阶，像奖牌） ③ 来源（角落小色点）
 * 与旧版的差别：姓名 46px→64px；奖项徽章改成带高光带的「奖牌」；排名榜加名次圆牌 + 名次条；
 * 卡片加顶部高光与更强投影，整页更像颁奖台而不是数据表。
 * 仍受 `--rss`（rsSize 整体缩放）控制，transform-origin 居中保持大屏居中。 */
.rs-wrap{--rss:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:30px;width:100%;height:100%;
  transform:scale(var(--rss));transform-origin:center center;}
/* 顶部标题：金色渐变文字 + 底部细金线，作为整页的「颁奖台横幅」 */
.rs-title{position:relative;font-size:calc(64px * var(--fs));font-weight:900;letter-spacing:.06em;line-height:1.1;
  background:linear-gradient(180deg,#fff6da 0%,#ffd166 55%,#e0a93b 100%);-webkit-background-clip:text;background-clip:text;
  color:transparent;-webkit-text-fill-color:transparent;filter:drop-shadow(0 8px 26px rgba(0,0,0,.5));padding-bottom:calc(10px * var(--fs));}
.rs-title::after{content:"";position:absolute;left:50%;bottom:0;transform:translateX(-50%);width:min(420px,60%);height:3px;border-radius:999px;
  background:linear-gradient(90deg,transparent,rgba(255,209,102,.9),transparent);}
/* 卡片网格：列宽下限调大以容纳更大的姓名；列间距略宽，远看更透气 */
/* R318：**按奖项分组的颁奖榜单** —— 取代 R239b 起沿用的「平铺小卡片网格」。
 * 组顺序 = rs.prizeOrder（默认 一/二/三等奖，用户可自定义）；组内是该奖项的领奖人卡片。
 * 视觉层次：组标题（奖牌徽章）> 姓名 > 来源角标；每组左侧色条按金/银/铜着色，
 * 10 米外一眼能分出「这块是一等奖」。 */
.rs-groups{display:flex;flex-direction:column;gap:calc(22px * var(--fs));width:100%;max-width:1560px;justify-content:center;}
.rs-group{position:relative;display:flex;flex-direction:column;gap:calc(12px * var(--fs));
  padding:calc(16px * var(--fs)) calc(20px * var(--fs)) calc(18px * var(--fs));border-radius:calc(20px * var(--fs));
  background:linear-gradient(160deg,rgba(255,255,255,.075),rgba(255,255,255,.025));
  border:1px solid rgba(255,255,255,.13);box-shadow:0 14px 38px rgba(0,0,0,.32);}
.rs-group::before{content:"";position:absolute;left:0;top:calc(16px * var(--fs));bottom:calc(16px * var(--fs));
  width:calc(6px * var(--fs));border-radius:0 999px 999px 0;background:rgba(255,255,255,.28);}
.rs-group.tier-gold::before{background:linear-gradient(180deg,#fff2c4,#e8a92f);}
.rs-group.tier-silver::before{background:linear-gradient(180deg,#ffffff,#a9bada);}
.rs-group.tier-bronze::before{background:linear-gradient(180deg,#ffe0bd,#bb7638);}
.rs-group-h{display:flex;align-items:center;gap:calc(12px * var(--fs));flex-wrap:wrap;}
.rs-group-badge{font-size:calc(30px * var(--fs));font-weight:900;line-height:1.2;letter-spacing:.04em;
  padding:calc(4px * var(--fs)) calc(20px * var(--fs));border-radius:999px;color:#241a04;
  background:linear-gradient(180deg,#fff2c4 0%,#ffd166 45%,#e8a92f 100%);border:1px solid rgba(0,0,0,.22);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.7),0 6px 18px rgba(0,0,0,.3);}
.rs-group-badge.pz-silver{color:#1c2333;background:linear-gradient(180deg,#ffffff 0%,#dfe8f8 45%,#a9bada 100%);}
.rs-group-badge.pz-bronze{color:#2a1509;background:linear-gradient(180deg,#ffe0bd 0%,#e3a86a 45%,#bb7638 100%);}
.rs-group-badge.pz-plain{color:#e8eefc;background:rgba(255,255,255,.16);border-color:rgba(255,255,255,.3);box-shadow:none;}
.rs-group-n{font-size:calc(22px * var(--fs));font-weight:700;opacity:.7;}
.rs-group-body{display:grid;grid-template-columns:repeat(auto-fill,minmax(calc(260px * var(--fs)),1fr));
  gap:calc(14px * var(--fs)) calc(18px * var(--fs));}
/* 卡片已在分组容器内 → 去掉自身的重投影与顶部高光带，避免「盒子套盒子」显脏 */
.rs-group .rs-card{padding:calc(14px * var(--fs)) calc(18px * var(--fs));border-radius:calc(14px * var(--fs));
  background:rgba(255,255,255,.07);box-shadow:none;overflow:visible;}
.rs-group .rs-card::after{display:none;}
.rs-group .rs-card::before{display:none;}
/* 中奖者卡片：顶部高光条 + 左侧来源色带 + 悬浮投影 */
.rs-card{position:relative;display:flex;flex-direction:column;gap:12px;padding:24px 28px 22px;border-radius:22px;min-width:0;overflow:hidden;
  background:linear-gradient(160deg,rgba(255,255,255,.16),rgba(255,255,255,.045) 55%,rgba(255,255,255,.02));
  border:1px solid rgba(255,255,255,.20);box-shadow:0 18px 46px rgba(0,0,0,.42),inset 0 1px 0 rgba(255,255,255,.22);}
/* 顶部高光带：模拟舞台灯打在奖台上 */
.rs-card::after{content:"";position:absolute;left:0;right:0;top:0;height:46%;pointer-events:none;
  background:linear-gradient(180deg,rgba(255,255,255,.16),rgba(255,255,255,0));}
.rs-card::before{content:"";position:absolute;left:0;top:16px;bottom:16px;width:6px;border-radius:0 5px 5px 0;background:var(--accent);z-index:1;}
.rs-card.src-wheel::before{background:#7dd3fc;}
.rs-card.src-score::before{background:#c4b5fd;}
/* 来源角标：小色点 + 文字，弱化到角落（观众看的是名字与奖项） */
.rs-src{align-self:flex-end;position:relative;z-index:1;font-size:calc(15px * var(--fs));font-weight:800;padding:3px 12px;border-radius:999px;letter-spacing:.06em;
  color:#0b1220;background:rgba(255,209,102,.92);box-shadow:0 4px 14px rgba(0,0,0,.3);}
.rs-src-lottery{background:rgba(255,209,102,.92);}
.rs-src-wheel{background:#7dd3fc;color:#06283d;}
.rs-src-score{background:#c4b5fd;color:#2a1063;}
/* 奖项徽章：做成「奖牌」——上缘高光 + 内阴影 + 轻投影；金/银/铜色阶一眼可辨 */
.rs-prize{align-self:flex-start;position:relative;z-index:1;font-size:calc(30px * var(--fs));font-weight:900;line-height:1.25;max-width:100%;
  padding:calc(4px * var(--fs)) calc(20px * var(--fs));border-radius:calc(999px);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;letter-spacing:.04em;
  color:#241a04;background:linear-gradient(180deg,#fff2c4 0%,#ffd166 45%,#e8a92f 100%);
  border:1px solid rgba(0,0,0,.22);box-shadow:inset 0 1px 0 rgba(255,255,255,.75),0 6px 18px rgba(0,0,0,.32);}
.rs-prize.pz-silver{color:#1c2333;background:linear-gradient(180deg,#ffffff 0%,#dfe8f8 45%,#a9bada 100%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.85),0 6px 18px rgba(0,0,0,.32);}
.rs-prize.pz-bronze{color:#2a1509;background:linear-gradient(180deg,#ffe0bd 0%,#e3a86a 45%,#bb7638 100%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.6),0 6px 18px rgba(0,0,0,.32);}
.rs-prize.pz-plain{color:#e8eefc;background:rgba(255,255,255,.16);border-color:rgba(255,255,255,.3);box-shadow:none;}
/* 姓名行：头像 + 巨字姓名（现场 10 米可读的关键） */
.rs-main{display:flex;align-items:center;gap:calc(16px * var(--fs));min-width:0;position:relative;z-index:1;}
.rs-ava{flex:0 0 auto;width:calc(76px * var(--fs));height:calc(76px * var(--fs));border-radius:50%;overflow:hidden;
  background:rgba(255,255,255,.16);border:3px solid rgba(255,255,255,.35);box-shadow:0 8px 22px rgba(0,0,0,.35);}
.rs-ava img{width:100%;height:100%;object-fit:cover;display:block;}
.rs-name{font-size:calc(64px * var(--fs));font-weight:900;line-height:1.08;letter-spacing:-.01em;
  word-break:break-word;overflow-wrap:anywhere;text-shadow:0 6px 26px rgba(0,0,0,.45);}
.rs-scene{position:relative;z-index:1;font-size:calc(20px * var(--fs));opacity:.72;font-weight:600;}
.rs-time{position:relative;z-index:1;font-size:calc(20px * var(--fs));opacity:.62;font-variant-numeric:tabular-nums;}
.rs-empty{font-size:calc(44px * var(--fs));opacity:.62;font-weight:600;text-align:center;}
.rs-foot{font-size:calc(22px * var(--fs));opacity:.62;font-weight:600;font-variant-numeric:tabular-nums;margin-top:4px;}
/* ---- 最终记分排名榜（R288 起有；R316 加名次牌与名次条） ---- */
.rs-stand{width:100%;max-width:980px;margin-top:8px;display:flex;flex-direction:column;gap:calc(8px * var(--fs));}
.rs-stand-t{font-size:calc(28px * var(--fs));font-weight:800;color:var(--accent,#ffd166);letter-spacing:.03em;}
.rs-stand-row{display:flex;align-items:center;gap:calc(14px * var(--fs));
  padding:calc(8px * var(--fs)) calc(16px * var(--fs));border-radius:calc(12px * var(--fs));
  background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.13);}
/* 名次圆牌：前三名金/银/铜，其余中性 */
.rs-stand-rk{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;
  width:calc(46px * var(--fs));height:calc(46px * var(--fs));border-radius:50%;
  font-size:calc(24px * var(--fs));font-weight:900;font-variant-numeric:tabular-nums;
  background:rgba(255,255,255,.14);color:var(--fg2,#a6b6d4);border:1px solid rgba(255,255,255,.16);}
.rs-stand-row.rk1 .rs-stand-rk{color:#241a04;background:linear-gradient(180deg,#fff2c4,#e8a92f);border-color:rgba(0,0,0,.2);box-shadow:0 4px 14px rgba(0,0,0,.3);}
.rs-stand-row.rk2 .rs-stand-rk{color:#1c2333;background:linear-gradient(180deg,#ffffff,#a9bada);border-color:rgba(0,0,0,.16);}
.rs-stand-row.rk3 .rs-stand-rk{color:#2a1509;background:linear-gradient(180deg,#ffe0bd,#bb7638);border-color:rgba(0,0,0,.16);}
.rs-stand-mid{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:calc(4px * var(--fs));}
.rs-stand-n{font-size:calc(30px * var(--fs));font-weight:700;white-space:normal;overflow-wrap:anywhere;overflow:visible;text-overflow:clip;}
/* 名次条：按「最高分归一」伸缩，一眼看出差距 */
.rs-stand-bar{height:calc(8px * var(--fs));border-radius:999px;background:rgba(255,255,255,.10);overflow:hidden;}
.rs-stand-fill{display:block;height:100%;border-radius:999px;background:linear-gradient(90deg,rgba(255,209,102,.55),var(--accent,#ffd166));}
.rs-stand-row.top{background:color-mix(in srgb,var(--accent,#ffd166) 20%,transparent);
  border-color:color-mix(in srgb,var(--accent,#ffd166) 55%,transparent);
  box-shadow:0 0 0 1px color-mix(in srgb,var(--accent,#ffd166) 35%,transparent),0 10px 30px rgba(0,0,0,.32);}
.rs-stand-v{flex:0 0 auto;font-size:calc(34px * var(--fs));font-weight:900;font-variant-numeric:tabular-nums;color:var(--accent,#ffd166);}
/* R307：锁定状态下大屏的按键提示（键盘被挡时短暂显示，2s 自动消隐）。
 * 放右下角、低透明度 —— 观众几乎看不到，操作员一眼明白「为什么键盘没反应」。
 * ⚠️ R316 版式重做时这块被「整段替换 .rs-* 区间」误删过（它原本夹在 .rs-foot 与 .rs-stand 之间），
 * 已恢复 —— 教训：整块替换前必须先把区间内的**异族**规则摘出来（同族规则才可整体重写）。 */
.lock-hint{position:fixed;right:14px;bottom:14px;z-index:60;max-width:min(420px,70vw);
  padding:10px 14px;border-radius:11px;font:700 15px/1.45 inherit;color:#ffe6c2;
  background:rgba(24,16,4,.92);border:1px solid rgba(245,158,11,.55);
  box-shadow:0 10px 26px rgba(0,0,0,.4);opacity:0;transform:translateY(6px);
  transition:opacity .18s ease,transform .18s ease;pointer-events:none;}
.lock-hint.show{opacity:.96;transform:none;}

/* ============ 现场投票 ============ */
.vp-wrap{--vps:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:30px;width:100%;max-width:1400px;}
.vp-title{font-size:calc(60px * var(--fs) * var(--vps,1) * var(--vpts,1));font-weight:var(--fw);color:var(--vptc,var(--accent));letter-spacing:.04em;text-shadow:0 8px 30px rgba(0,0,0,.5);}
.vp-rows{display:flex;flex-direction:column;gap:26px;width:100%;}
.vp-row{display:grid;grid-template-columns:minmax(160px,26%) 1fr minmax(150px,16%);align-items:center;gap:24px;}
.vp-label{font-size:calc(46px * var(--fs) * var(--vps,1));font-weight:800;text-align:right;line-height:1.15;color:var(--vplc,inherit);}
.vp-track{position:relative;height:calc(64px * var(--fs) * var(--vps,1));background:rgba(255,255,255,.10);border-radius:999px;overflow:hidden;}
.vp-bar{position:absolute;left:0;top:0;bottom:0;border-radius:999px;transition:width var(--vpFillMs,.6s) cubic-bezier(.2,.8,.2,1);box-shadow:0 6px 20px rgba(0,0,0,.3);}
.vp-num{font-size:calc(40px * var(--fs) * var(--vps,1));font-weight:800;font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--vpnc,inherit);}
.vp-row.lead .vp-label{color:var(--accent);}
.vp-row.lead .vp-bar{box-shadow:0 0 0 3px rgba(255,255,255,.25),0 8px 26px rgba(0,0,0,.4);}
.vp-row.lead .vp-num{color:var(--accent);}
.vp-total{font-size:calc(34px * var(--fs));opacity:.7;font-weight:600;color:var(--vptt,inherit);}
.vp-empty{font-size:calc(40px * var(--fs));opacity:.6;font-weight:600;}
/* R108 名次徽标（默认关闭）；选项/数值分别缩放 */
.vp-rank{display:inline-flex;align-items:center;justify-content:center;min-width:calc(52px * var(--fs) * var(--vps,1));
  height:calc(52px * var(--fs) * var(--vps,1));border-radius:999px;font-size:calc(28px * var(--fs) * var(--vps,1));
  font-weight:900;background:rgba(255,255,255,.16);color:var(--accent);margin-right:14px;flex:0 0 auto;}
.vp-row.lead .vp-rank{background:var(--accent);color:#1b1b1b;}
.vp-label{font-size:calc(46px * var(--fs) * var(--vps,1) * var(--vpls,1));}
.vp-num{font-size:calc(40px * var(--fs) * var(--vps,1) * var(--vpps,1));}
/* R207 垂直柱状样式：选项改为竖向列（标签上 / 柱中 / 数值下），柱自底部向上增长 */
.vp-wrap.style-col .vp-rows{display:flex;flex-direction:row;align-items:flex-start;justify-content:center;gap:calc(36px * var(--vps,1));width:100%;}
.vp-row.vp-col{display:flex;flex-direction:column;align-items:center;justify-content:flex-start;gap:16px;flex:1 1 0;min-width:0;max-width:360px;}
.vp-col .vp-label{text-align:center;font-size:calc(34px * var(--fs) * var(--vps,1) * var(--vpls,1));line-height:1.12;}
.vp-col .vp-ctrack{position:relative;width:100%;max-width:130px;flex:0 0 auto;height:calc(440px * var(--fs) * var(--vps,1) * var(--vpcolh,1));background:rgba(255,255,255,.10);border-radius:14px;overflow:hidden;}
.vp-cbar{position:absolute;left:0;right:0;bottom:0;width:100%;border-radius:12px;transition:height var(--vpFillMs,.6s) cubic-bezier(.2,.8,.2,1);box-shadow:0 6px 20px rgba(0,0,0,.3);}
.vp-col .vp-num{text-align:center;font-size:calc(32px * var(--fs) * var(--vps,1) * var(--vpps,1));line-height:1.1;}
.vp-row.lead .vp-cbar{box-shadow:0 0 0 3px rgba(255,255,255,.25),0 8px 26px rgba(0,0,0,.4);}

/* R222 投票图表美化：柱顶高光 / 柱面纹理 / 参考刻度线 / 柱内票数（全部默认关闭，零回归） */
.vp-sheen .vp-bar::after,.vp-sheen .vp-cbar::after{content:'';position:absolute;inset:0;border-radius:inherit;pointer-events:none;}
.vp-sheen .vp-cbar::after{background:linear-gradient(to top,rgba(255,255,255,0) 38%,rgba(255,255,255,.42));}
.vp-sheen .vp-bar::after{background:linear-gradient(180deg,rgba(255,255,255,.42),rgba(255,255,255,0) 62%);}
.vp-pat-stripes .vp-bar::before,.vp-pat-stripes .vp-cbar::before{content:'';position:absolute;inset:0;border-radius:inherit;pointer-events:none;background:repeating-linear-gradient(45deg,rgba(255,255,255,.20) 0 8px,rgba(255,255,255,0) 8px 16px);}
.vp-pat-band .vp-bar::before,.vp-pat-band .vp-cbar::before{content:'';position:absolute;inset:0;border-radius:inherit;pointer-events:none;background:linear-gradient(90deg,rgba(255,255,255,0) 16%,rgba(255,255,255,.34) 50%,rgba(255,255,255,0) 84%);}
.vp-pat-dots .vp-bar::before,.vp-pat-dots .vp-cbar::before{content:'';position:absolute;inset:0;border-radius:inherit;pointer-events:none;background-image:radial-gradient(rgba(255,255,255,.28) 2px,rgba(255,255,255,0) 2.4px);background-size:14px 14px;}
.vp-gline{position:absolute;background:rgba(255,255,255,.34);box-shadow:0 0 calc(3px * var(--fs)) rgba(0,0,0,.30);z-index:3;pointer-events:none;}
.vp-gline.vp-glh{left:0;right:0;height:calc(2.5px * var(--fs));}
.vp-gline.vp-glv{top:0;bottom:0;width:calc(2.5px * var(--fs));}
.vp-cnum{position:absolute;left:0;right:0;text-align:center;z-index:3;text-shadow:0 2px 10px rgba(0,0,0,.62),0 0 3px rgba(0,0,0,.5);}

/* ============ 计分板 · 多队 ============ */
.sb-multi{display:grid;gap:calc(var(--sbg,60px) * .433);width:100%;}
.sb-multi.n2{grid-template-columns:1fr 1fr;}
.sb-multi.n3{grid-template-columns:1fr 1fr 1fr;}
.sb-multi.n4{grid-template-columns:1fr 1fr 1fr 1fr;}
.sb-multi.n5,.sb-multi.n6{grid-template-columns:1fr 1fr 1fr;}
/* R43：多组对抗（多个双方 / 多个多队）——组纵向堆叠，双方多组两列网格并排 */
.sb-duel-grid{display:grid;grid-template-columns:1fr 1fr;gap:calc(var(--sbg,60px) * .6);width:100%;align-items:stretch;}
.sb-duel-grid .sb-board{gap:calc(var(--sbg,60px) * .5);}
.sb-duel-grid .sb-vs{font-size:calc(44px * var(--fs) * var(--sbs));}
.sb-duel-grid .sb-name{font-size:calc(34px * var(--fs) * var(--sbs));}
.sb-duel-grid .sb-num{font-size:calc(120px * var(--fs) * var(--sbs) * var(--sbd,1));}
/* R203：多组双方对抗（≥3 组）压缩尺寸，避免数字过大溢出、与底部记分记录重叠
 * 3 组 → 单行三列（平衡，避免孤组落第二行左列）；4 组 → 维持 2×2；尺寸整体收紧 */
.sb-duel-grid.n3{grid-template-columns:1fr 1fr 1fr;}
.sb-duel-grid.n3,.sb-duel-grid.n4{gap:calc(var(--sbg,60px) * .3);}
.sb-duel-grid.n3 .sb-board,.sb-duel-grid.n4 .sb-board{gap:calc(var(--sbg,60px) * .3);}
.sb-duel-grid.n3 .sb-side,.sb-duel-grid.n4 .sb-side{padding:22px 16px;border-radius:20px;}
.sb-duel-grid.n3 .sb-name,.sb-duel-grid.n4 .sb-name{font-size:calc(22px * var(--fs) * var(--sbs));}
.sb-duel-grid.n3 .sb-num,.sb-duel-grid.n4 .sb-num{font-size:calc(64px * var(--fs) * var(--sbs) * var(--sbd,1));}
.sb-duel-grid.n3 .sb-vs,.sb-duel-grid.n4 .sb-vs{font-size:calc(28px * var(--fs) * var(--sbs));}
.sb-duel-grid.n3 .sb-badge,.sb-duel-grid.n4 .sb-badge{font-size:calc(18px * var(--fs) * var(--sbs));padding:4px 12px;}
/* R206：记分记录已改为右侧栏（.sb-wrap.recOn .sb-records），不再贴底，
 * 故 R203 的「底部记录与高棋盘重叠」问题天然消失；下方 duelN3/duelN4 仅保留棋盘尺寸压缩，
 * 不再需要 padding-bottom 预留区与底部记录收窄（那是为贴底记录服务的旧规则）。 */
.sb-groups{display:flex;flex-direction:column;gap:calc(var(--sbg,60px) * .5);width:100%;}
.sb-group{display:flex;flex-direction:column;align-items:center;gap:18px;width:100%;}
.sb-group-name{font-size:calc(34px * var(--fs) * var(--sbs));font-weight:800;letter-spacing:.08em;opacity:.85;
  color:var(--accent);text-shadow:0 2px 12px rgba(0,0,0,.5);}
.sb-team{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;
  padding:40px 20px;border-radius:var(--sbr,24px);border:3px solid rgba(255,255,255,.3);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);
  transition:box-shadow .3s,transform .3s;}
.sb-team .sb-name{font-size:calc(44px * var(--fs) * var(--sbs,1) * var(--sbnz,1));font-weight:800;text-align:center;line-height:1.2;}
.sb-team .sb-num{font-size:calc(120px * var(--fs) * var(--sbs,1) * var(--sbd,1) * var(--sbdz,1));font-weight:900;line-height:1;font-variant-numeric:tabular-nums;color:var(--sbnc,inherit);}
.sb-team .sb-badge{font-size:calc(26px * var(--fs) * var(--sbs,1));}
.sb-team.win{border-color:var(--accent);box-shadow:0 0 0 3px rgba(255,209,102,.3),0 14px 40px rgba(0,0,0,.45);transform:translateY(-4px);}
/* R73：「布局样式=紧凑并排」此前只在双方模式（.sb-board）生效，多队模式下该选项是幽灵控件。
   这里补齐多队模式的紧凑规则，保证两种模式下设置都看得到效果。 */
.sb-wrap.style-compact .sb-multi{gap:calc(var(--sbg,60px) * .26);}
.sb-wrap.style-compact .sb-team{gap:8px;padding:22px 14px;}
.sb-wrap.style-compact .sb-team .sb-name{font-size:calc(32px * var(--fs) * var(--sbs,1));}
.sb-wrap.style-compact .sb-team .sb-num{font-size:calc(84px * var(--fs) * var(--sbs,1) * var(--sbd,1));}
.sb-wrap.style-compact .sb-team .sb-badge{font-size:calc(20px * var(--fs) * var(--sbs,1));padding:4px 16px;}
.sb-wrap.style-compact .sb-groups{gap:calc(var(--sbg,60px) * .3);}
.sb-wrap.style-compact .sb-duel-grid{gap:calc(var(--sbg,60px) * .34);}

/* ============ 文字轮播 · 卡片背景与分页点 ============ */
.tx-wrap.tx-card{container-type:inline-size;background:var(--txcb,rgba(10,14,28,.55));border:var(--txbw,1px) solid var(--txbc,rgba(255,255,255,.14));border-radius:var(--txcr,28px);
  padding:32px 36px;
  padding:clamp(28px,5cqw,56px) clamp(32px,6cqw,72px);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);box-shadow:0 24px 70px rgba(0,0,0,.45);}
/* R314：补齐 `has-card-img` 分支 —— R289 在 `applyCardImage` 的注释里写明了③
 * 「`has-card-img` 类供 CSS 做『有图时不重复画默认底色』等分支」，但**该分支从未实现**：
 * 内联 `background-image` 不会清掉样式表里的 `background-color`，于是**透明 PNG** 卡片底
 * 仍透出上面三条规则给的默认半透明底（`.35/.55` 黑）+ `backdrop-filter` 模糊，
 * 看起来「图片底下脏了一层」。这里用**自定义属性兜底**：用户显式设了底色（`--txcb/--wecb/--rtcbg`）
 * 就沿用，没设则透明；同时撤掉模糊（图已铺满，模糊只会让透明区域出现怪异的毛玻璃块）。 */
.tx-wrap.tx-card.has-card-img{background-color:var(--txcb,transparent);-webkit-backdrop-filter:none;backdrop-filter:none;}
.we-wrap.we-card.has-card-img{background-color:var(--wecb,transparent);-webkit-backdrop-filter:none;backdrop-filter:none;}
.rt-wrap.rt-card.has-card-img{background-color:var(--rtcbg,transparent);-webkit-backdrop-filter:none;backdrop-filter:none;}
.tx-dots{display:flex;gap:10px;justify-content:center;margin-top:20px;}
.tx-dots i{width:11px;height:11px;border-radius:50%;background:rgba(255,255,255,.28);transition:.2s;}
.tx-dots i.on{background:var(--accent);transform:scale(1.25);}
.tx-wrap .tx-line{white-space:pre-wrap;}

/* ============ 角落时钟 · 卡片与冒号闪烁 ============ */
.st-clock.card{background:rgba(8,12,26,.55);border:1px solid rgba(255,255,255,.14);border-radius:18px;
  padding:14px 22px;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);box-shadow:0 10px 30px rgba(0,0,0,.35);}
.st-clock .colon{font-style:normal;transition:opacity .2s;}
.st-clock .colon.dim{opacity:.25;}

@media (prefers-reduced-motion:reduce){
  /* 系统开启「减少动效」时，舞台内全部动画与过渡一律关闭（含此前漏覆盖的倒计时翻牌 cd-num.flip、文字入场 tx-line.*、走马灯点 ig/ pw/ tx-dots、弹窗 st-popup 过渡） */
  .stage *,.stage *::before,.stage *::after{animation:none !important;transition:none !important;}
}

/* 安心模式（操作员手动开启，独立于系统 prefers-reduced-motion）：关闭舞台内全部动画与过渡，隐藏光点与礼花画布 */
.stage.reduce-motion, .stage.reduce-motion *{animation:none !important;transition:none !important;}
.stage.reduce-motion .st-particles{display:none !important;}
.stage.reduce-motion .st-confetti{display:none !important;}

/* R346 场景渲染失败的可见降级态：宁可显示一行说明，也不留白屏让现场以为「卡死了」。
 * 刻意使用固定色值——不引入新的 var()，避免 CSS 变量闭合门禁( r323 )风险。 */
.st-err{max-width:min(760px,86vw);margin:6vh auto 0;padding:28px 30px;text-align:center;
  border-radius:16px;background:rgba(239,68,68,.10);border:1px solid rgba(239,68,68,.42);}
.st-err-ic{width:46px;height:46px;margin:0 auto 14px;border-radius:50%;display:grid;place-items:center;
  font-size:24px;font-weight:800;color:#fecaca;background:rgba(239,68,68,.22);border:1px solid rgba(239,68,68,.5);}
.st-err-t{font-size:clamp(18px,2.4vw,30px);font-weight:800;color:#fee2e2;line-height:1.35;}
.st-err-h{margin-top:10px;font-size:clamp(12px,1.25vw,16px);color:#fca5a5;line-height:1.7;opacity:.92;}
