/* ===== 365Lab Event Screen - App UI ===== */
:root{
  --bg:#070b16;--card:#111a2e;--card2:#16203a;
  --line:rgba(255,255,255,.1);--line2:rgba(255,255,255,.18);
  --fg:#e8eefc;--fg2:#a6b6d4;--fg3:#9fb0cc;
  --pri:#4f8cff;--pri2:#7c5cff;--ok:#22c55e;--warn:#f59e0b;--danger:#ef4444;--accent:#ffd166;
  --r:12px;--r2:16px;
  --panelW:400px;
  color-scheme:dark;
}
*{box-sizing:border-box;}
/* R344 美化：平滑滚动 + 锚点避开 sticky 顶栏 + 选中色（reduce-motion 下由文末规则中和） */
html{scroll-behavior:smooth;}
[id]{scroll-margin-top:78px;}
::selection{background:rgba(79,140,255,.38);color:#fff;}
[hidden]{display:none !important;}
html,body{margin:0;padding:0;}
body{
  background:radial-gradient(1200px 800px at 12% -10%,#16224a 0%,transparent 60%),
             radial-gradient(1000px 700px at 100% 0%,#2a1148 0%,transparent 55%),var(--bg);
  color:var(--fg);
  font:400 14px/1.5 system-ui,-apple-system,"Segoe UI",Roboto,"PingFang SC","Microsoft YaHei",sans-serif;
  min-height:100vh;-webkit-font-smoothing:antialiased;
}
a{color:#8ab4ff;text-decoration:none;}
/* R339：按需求移除全局 a:hover 下划线/变色（特异性会压过 .lg-cta 等按钮类）；hover 反馈由各组件自带 */
h1,h2,h3{margin:0;font-weight:700;}
/* 统一键盘焦点环：深色 UI 下浏览器默认 outline 对比不可控 */
:focus-visible{outline:2px solid var(--pri);outline-offset:2px;border-radius:6px;}
.btn:focus-visible,.cbtn:focus-visible,.mini:focus-visible,.sb-btn:focus-visible,.sb-arrow:focus-visible,
.ed-tab:focus-visible,.tab:focus-visible,.lang-btn:focus-visible,.dm-chip:focus-visible,.pz-del:focus-visible,
.rec-x:focus-visible,.th-x:focus-visible,.pw-thumb-x:focus-visible,.modal-close:focus-visible{
  outline:2px solid var(--pri);outline-offset:2px;}
/* 仅供屏幕阅读器/键盘使用的隐藏（替代 hidden，使控件仍在 tab 序列内） */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;}
label.file-btn:focus-within{outline:2px solid var(--pri);outline-offset:2px;border-radius:10px;}
::placeholder{color:var(--fg3);opacity:1;}
kbd{background:rgba(255,255,255,.12);border:1px solid var(--line2);border-bottom-width:2px;
  border-radius:5px;padding:1px 6px;font:600 12px/1.4 ui-monospace,Consolas,monospace;}
.skip-link{position:absolute;left:-9999px;}
.skip-link:focus{left:12px;top:12px;z-index:99;background:var(--pri);color:#fff;padding:8px 14px;border-radius:8px;}

/* ---------- topbar ---------- */
.topbar{position:sticky;top:0;z-index:30;display:flex;align-items:center;justify-content:space-between;
  gap:12px;padding:10px 16px;background:rgba(7,11,22,.82);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);
  border-bottom:1px solid var(--line);flex-wrap:wrap;}
.brand{display:flex;align-items:center;gap:10px;min-width:0;}
.brand-logo{display:grid;place-items:center;width:38px;height:38px;border-radius:11px;color:#fff;
  background:linear-gradient(135deg,var(--pri),var(--pri2));flex:none;}
.brand-text{display:flex;flex-direction:column;line-height:1.15;min-width:0;}
.brand-text strong,.brand-text h1{font-size:16px;letter-spacing:.01em;margin:0;}
.brand-text small{color:var(--fg3);font-size:11.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.topbar-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
/* 顶栏主导航（R341/R347）：首页 + 打开工具 + 使用教程 / 常见问题 / 关于我们；窄屏隐藏（页脚有全量入口） */
.topnav{display:flex;align-items:center;gap:6px;}
.topnav a,.topnav-home{color:var(--fg2);text-decoration:none;font-size:14px;white-space:nowrap;padding:6px 11px;border-radius:9px;
  transition:color .15s,background .15s;}
.topnav a:hover,.topnav-home:hover{color:var(--fg);background:rgba(255,255,255,.07);}
.topnav-home[aria-current="page"]{color:var(--fg);background:rgba(255,255,255,.06);}
@media (max-width:760px){.topnav,.topnav-home{display:none;}}
/* R27：展示窗口在线状态指示（ping/pong 探测） */
.sync-dot{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:#9aa7bd;white-space:nowrap;}
.sync-dot::before{content:'';width:8px;height:8px;border-radius:50%;background:#8a93a6;flex:none;}
.sync-dot.ok{color:#7ee2a8;}
.sync-dot.ok::before{background:#22c55e;box-shadow:0 0 6px rgba(34,197,94,.8);}
.sync-dot.lost{color:#fbbf24;}
.sync-dot.lost::before{background:#f59e0b;}
.sync-dot.none{opacity:.75;}

.btn{cursor:pointer;border:1px solid var(--line2);background:var(--card2);color:var(--fg);
  border-radius:10px;padding:8px 14px;font:600 13.5px/1 inherit;transition:.16s;white-space:nowrap;}
.btn:hover{border-color:#5c7cff;background:#1c2949;transform:translateY(-1px);}
.btn:active{transform:none;}
.btn-primary{background:linear-gradient(135deg,var(--pri),var(--pri2));border-color:transparent;color:#fff;}
.btn-primary:hover{filter:brightness(1.08);background:linear-gradient(135deg,var(--pri),var(--pri2));}
.btn-ghost{background:transparent;}
.btn-danger{background:rgba(239,68,68,.14);border-color:rgba(239,68,68,.5);color:#ffb4b4;}
.btn-danger:hover{background:rgba(239,68,68,.24);border-color:#ef4444;}
.btn-sm{padding:6px 11px;font-size:12.5px;border-radius:9px;}
.btn-xs{padding:5px 9px;font-size:12px;border-radius:8px;}
/* R88 主题皮肤预设：按钮内联渐变/纯色预览块 + 名称 */
.skin-btn{display:inline-flex;align-items:center;gap:7px;}
.skin-swatch{flex:0 0 auto;width:16px;height:16px;border-radius:5px;box-shadow:inset 0 0 0 1px rgba(255,255,255,.28);}
.skin-btn .skin-name{white-space:nowrap;}
.file-btn{position:relative;display:inline-flex;align-items:center;}

.lang-switch{display:inline-flex;border:1px solid var(--line2);border-radius:10px;overflow:hidden;}
.lang-btn{cursor:pointer;border:0;background:transparent;color:var(--fg2);padding:7px 11px;font:600 12.5px/1 inherit;}
.lang-btn+.lang-btn{border-left:1px solid var(--line);}
.lang-btn:hover{background:rgba(255,255,255,.07);color:var(--fg);}
.lang-btn.active{background:linear-gradient(135deg,var(--pri),var(--pri2));color:#fff;}

/* ---------- layout ---------- */
.workspace{display:grid;grid-template-columns:var(--panelW) 1fr;gap:14px;
  padding:14px;align-items:start;}
@media (max-width:1080px){
  /* R255：窄屏（≤1080px）下控制台字段极多，原单列布局把实时预览挤到视口外。
   * 改为 flex 列并把预览区置顶，操作员进页面即见实时预览；stage-host 钉在顶栏下、
   * 高度受限（fit() 按高缩放），滚动设置时预览常驻可见，且不再纵向溢出视口。 */
  .workspace{display:flex;flex-direction:column;align-items:stretch;}
  .preview-area{order:1;}
  .stage-host{
    position:sticky;top:62px;z-index:20;
    height:min(40vh,330px);aspect-ratio:auto;max-height:none;
  }
  .stage-host.fs-host{position:fixed;inset:0;z-index:80;height:100dvh;}
}

/* ---------- panel ---------- */
.panel{background:linear-gradient(180deg,var(--card),#0e1729);border:1px solid var(--line);
  border-radius:var(--r2);overflow:hidden;position:sticky;top:70px;
  max-height:calc(100vh - 86px);display:flex;flex-direction:column;}
@media (max-width:1080px){.panel{position:static;max-height:none;order:2;min-width:0;}}
.tabs{display:flex;border-bottom:1px solid var(--line);background:rgba(255,255,255,.02);flex:none;}
.tab{flex:1;cursor:pointer;border:0;background:transparent;color:var(--fg3);padding:12px 6px;
  font:700 13px/1 inherit;border-bottom:2px solid transparent;transition:.16s;}
.tab:hover{color:var(--fg);background:rgba(255,255,255,.04);}
.tab.active{color:#fff;border-bottom-color:var(--pri);background:rgba(79,140,255,.1);}
.tabpane{display:none;overflow-y:auto;padding:12px;gap:12px;flex-direction:column;}
.tabpane.active{display:flex;}
.tabpane::-webkit-scrollbar{width:9px;}
.tabpane::-webkit-scrollbar-thumb{background:rgba(255,255,255,.14);border-radius:9px;}

.block{background:rgba(255,255,255,.035);border:1px solid var(--line);border-radius:var(--r);padding:12px;}
.block-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:10px;flex-wrap:wrap;}
.block-head h2{font-size:13.5px;letter-spacing:.02em;}
.hint{color:var(--fg3);font-size:11.8px;margin:6px 0 0;line-height:1.5;}
/* R287：空态/异常提示要醒目（走马灯「已开启但文字为空 → 不显示」即用此） */
.hint.warn{color:var(--warn);font-weight:600;}
.form-group{display:flex;flex-direction:column;gap:12px;}

.field{display:flex;flex-direction:column;gap:5px;margin-bottom:10px;}
.field>span{font-size:12px;color:var(--fg2);font-weight:600;display:flex;justify-content:space-between;gap:8px;}
.field>span output{color:var(--pri);font-variant-numeric:tabular-nums;}
/* min-width:0 让 flex 子项可收缩到固有宽度以下，避免窄屏横向溢出 */
.field.grow{flex:1;min-width:0;}
.w110{width:110px;flex:none;}
.w90{width:90px;flex:none;}
.input{width:100%;min-width:0;background:#0a1120;border:1px solid var(--line2);color:var(--fg);
  border-radius:9px;padding:8px 10px;font:500 13px/1.35 inherit;transition:border-color .15s,box-shadow .15s;}
/* 键盘焦点必须可见：仅靠 box-shadow 在强制颜色模式下会消失，这里补一层 outline 兜底 */
a:focus-visible,button:focus-visible,select:focus-visible,summary:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--pri,#4f8cff);outline-offset:2px;}
@media (forced-colors: active){.input:focus,a:focus-visible,button:focus-visible{outline:2px solid Highlight;}}
.input:focus{outline:0;border-color:var(--pri);box-shadow:0 0 0 3px rgba(79,140,255,.18);}
.input.auto{width:auto;flex:1;min-width:120px;}
.input.mono{font-family:ui-monospace,Consolas,monospace;font-size:12.5px;resize:vertical;}
textarea.input{resize:vertical;}
select.input{appearance:none;background-image:linear-gradient(45deg,transparent 49%,var(--fg2) 50%),linear-gradient(-45deg,transparent 49%,var(--fg2) 50%);
  background-position:calc(100% - 15px) 55%,calc(100% - 10px) 55%;background-size:5px 5px;background-repeat:no-repeat;padding-right:28px;}
input[type=color]{width:56px;height:32px;padding:2px;border:1px solid var(--line2);border-radius:8px;background:#0a1120;cursor:pointer;}
input[type=color][hidden]{display:none;}  /* R58：色板自定义 picker 默认隐藏（防后续样式覆盖 [hidden]） */
/* R78：文本颜色输入旁加可点击色板；select 色板旁加当前色预览色板 */
.color-wrap{display:flex;align-items:center;gap:6px;}
.color-wrap .input{flex:1;min-width:0;}
.color-pick{
  width:28px;height:28px;padding:0;border:1px solid var(--line2);border-radius:8px;
  background:#0a1120;cursor:pointer;flex:none;overflow:hidden;}
.color-pick::-webkit-color-swatch-wrapper{padding:0;margin:0;}
.color-pick::-webkit-color-swatch{border:none;border-radius:6px;}
.color-pick--sel{width:22px;height:22px;}
input[type=range]{width:100%;accent-color:var(--pri);height:20px;}
.chk{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--fg2);cursor:pointer;user-select:none;}
.chk-field{justify-content:flex-end;padding-bottom:12px;}
.chk input{accent-color:var(--pri);width:15px;height:15px;}
.chk:hover{color:var(--fg);}
/* R317：`.chk` 是 inline-flex，文本项没有 min-width:0 —— 长文案（尤其含英文/数字长串，
 * 如场景名「抽奖区 · 抽奖页」或英文说明）会撑破面板宽度、把内容推出可视区。
 * 起因：汇总页「数据来源（按场景）」与「有新结果时自动刷新」的说明文字较长。 */
.chk>span{min-width:0;overflow-wrap:anywhere;}

/* R318：结果总览设置区的「获奖名单与奖项」模块 —— 原在控制台底部的「逐条明细」
 *（用户诉求：搬到左侧设置区，并支持增删奖项 / 调整奖项顺序 / 手动补录人员）。 */
.rsm-box{display:flex;flex-direction:column;gap:7px;}
.rsm-prize{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:6px 8px;border-radius:9px;
  background:rgba(255,255,255,.06);border:1px solid var(--line);}
.rsm-badge{font-size:12px;font-weight:800;padding:2px 10px;border-radius:999px;color:#241a04;
  background:linear-gradient(180deg,#ffe08a,#f2b34a);max-width:100%;overflow-wrap:anywhere;}
.rsm-badge.pz-silver{color:#1c2333;background:linear-gradient(180deg,#eaf1ff,#b9c8e6);}
.rsm-badge.pz-bronze{color:#2a1509;background:linear-gradient(180deg,#f0c9a3,#c98b52);}
.rsm-badge.pz-plain{color:var(--fg2);background:rgba(255,255,255,.16);}
.rsm-cnt{font-size:11.5px;color:var(--fg3);font-variant-numeric:tabular-nums;}
.rsm-acts{margin-left:auto;display:flex;gap:4px;flex:0 0 auto;}
.rsm-man{display:flex;align-items:center;gap:7px;padding:3px 8px 3px 4px;border-radius:7px;font-size:12.5px;min-width:0;}
.rsm-man:hover{background:var(--card2);}
.rsm-man input{flex:0 0 auto;width:15px;height:15px;accent-color:var(--pri);}
.rsm-name{flex:1 1 auto;min-width:0;font-weight:600;overflow-wrap:anywhere;}
.rsm-src{flex:0 0 auto;font-size:11px;color:var(--fg3);padding:1px 8px;border-radius:999px;background:var(--card2);}
.rsm-add{margin-left:16px;align-self:flex-start;}
.rsm-addprize{margin-top:6px;align-self:flex-start;}

.row{display:flex;align-items:flex-end;}
.row.wrap{flex-wrap:wrap;align-items:center;}
.gap6{gap:6px;} .gap10{gap:10px;} .mt6{margin-top:6px;} .mt10{margin-top:10px;}

/* scene list */
.scene-list{list-style:none;margin:0 0 10px;padding:0;display:flex;flex-direction:column;gap:6px;}
.scene-item{display:flex;align-items:center;gap:8px;padding:8px 9px;border-radius:10px;cursor:pointer;
  background:rgba(255,255,255,.04);border:1px solid var(--line);transition:.14s;}
.scene-item:hover{background:rgba(255,255,255,.08);border-color:var(--line2);}
.scene-item.editing{border-color:var(--pri);background:rgba(79,140,255,.12);}
.scene-item.live{box-shadow:inset 3px 0 0 var(--ok);}
.si-idx{width:18px;text-align:center;color:var(--fg3);font-size:11px;font-weight:700;flex:none;}
.si-icon{flex:none;font-size:15px;}
.si-name{flex:1;min-width:0;font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.si-type{font-size:10.5px;color:var(--fg3);background:rgba(255,255,255,.07);padding:2px 6px;border-radius:6px;flex:none;}
.si-badge{flex:none;font-size:10.5px;font-weight:700;color:var(--ok);background:rgba(46,204,113,.16);padding:2px 6px;border-radius:6px;}
/* R98：名单为空的警示徽标（同尺寸，改用警告色与正常徽标区分） */
.si-badge.warn{color:var(--warn);background:rgba(245,158,11,.18);}
.si-actions{display:flex;gap:3px;flex:none;}
.mini{cursor:pointer;border:1px solid var(--line);background:rgba(255,255,255,.05);color:var(--fg2);
  border-radius:6px;width:22px;height:22px;font-size:11px;line-height:1;display:grid;place-items:center;padding:0;}
.mini:hover{background:var(--pri);color:#fff;border-color:transparent;}
.scene-item.live .mini[data-act="live"]{background:var(--ok);color:#04240f;border-color:transparent;}
/* R96：列表项 ✕ 删除——破坏性操作，hover 用危险色与「上移/下移/复制」区分，避免手滑 */
.mini-del:hover{background:var(--danger);color:#fff;border-color:transparent;}

.kbd-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px;font-size:12.3px;color:var(--fg2);}
.kbd-list li{display:flex;align-items:center;gap:8px;}

/* thumbs（R45 统一美化：图片轮播 + 照片墙共用一套缩略图视觉——序号左上、操作组右上低调常显 hover 提亮、删除钮深色圆底 hover 红） */
.thumbs{list-style:none;display:grid;grid-template-columns:repeat(auto-fill,minmax(72px,1fr));gap:8px;
  margin:10px 0;padding:0;}
.thumb,.pw-thumb{position:relative;aspect-ratio:1;border-radius:10px;background:#0a1120 center/cover no-repeat;
  border:1px solid var(--line);overflow:hidden;transition:transform .15s,box-shadow .15s,border-color .15s;}
.thumb{aspect-ratio:16/10;cursor:grab;}
.thumb:hover,.pw-thumb:hover{transform:translateY(-2px);border-color:rgba(255,255,255,.35);box-shadow:0 6px 18px rgba(0,0,0,.45);}
.thumb.over{outline:2px solid var(--pri);}
.thumb img,.pw-thumb img{width:100%;height:100%;object-fit:cover;display:block;}
/* 左上序号徽章（两处统一） */
.th-idx,.pw-idx{position:absolute;left:4px;top:4px;background:rgba(0,0,0,.62);border:1px solid rgba(255,255,255,.16);
  border-radius:999px;font-size:10px;padding:1px 6px;font-weight:700;color:#fff;backdrop-filter:blur(4px);}
/* 右上操作组：低调常显，容器 hover 提亮（触屏下仍可见可点） */
.thumb .th-tools{position:absolute;right:4px;top:4px;left:auto;display:flex;gap:3px;opacity:.6;transition:.15s;}
.thumb:hover .th-tools{opacity:1;}
.thumb .th-tools .mini{width:18px;height:18px;font-size:11px;line-height:1;padding:0;background:rgba(10,14,24,.66);color:#fff;
  border:1px solid rgba(255,255,255,.18);border-radius:50%;cursor:pointer;display:grid;place-items:center;transition:.15s;}
.thumb .th-tools .mini:hover{background:var(--pri);color:#fff;border-color:transparent;}
/* 删除按钮：与 .pw-thumb-x 完全一致——在工具组内回归文档流，深色圆底 hover 红 */
.thumb .th-x{position:static;width:18px;height:18px;border:1px solid rgba(255,255,255,.18);border-radius:50%;cursor:pointer;
  background:rgba(10,14,24,.66);color:#fff;font-size:11px;line-height:1;display:grid;place-items:center;padding:0;transition:.15s;}
.thumb:hover .th-x{opacity:1;}
.thumb .th-x:hover{background:#e05656;border-color:transparent;}
.pw-thumb-x{position:absolute;right:4px;top:4px;width:18px;height:18px;border:1px solid rgba(255,255,255,.18);border-radius:50%;
  background:rgba(10,14,24,.66);color:#fff;font-size:11px;cursor:pointer;display:grid;place-items:center;padding:0;line-height:1;
  opacity:.75;transition:.15s;backdrop-filter:blur(4px);}
.pw-thumb:hover .pw-thumb-x,.pw-thumb-x:focus-visible{opacity:1;}
.pw-thumb-x:hover{background:#e05656;border-color:transparent;opacity:1;}
.thumb-empty{grid-column:1/-1;color:var(--fg3);font-size:12px;text-align:center;padding:14px;
  border:1px dashed var(--line2);border-radius:10px;}

/* records */
.records{display:flex;flex-direction:column;gap:9px;max-height:210px;overflow-y:auto;margin-bottom:10px;}
.rec-group{background:rgba(255,255,255,.04);border:1px solid var(--line);border-radius:9px;padding:8px;}
.rec-title{font-size:12px;font-weight:700;color:var(--warn);margin-bottom:6px;}
.rec-names{display:flex;flex-wrap:wrap;gap:5px;}
.rec-name{display:inline-flex;align-items:center;gap:3px;background:rgba(255,255,255,.08);
  border-radius:999px;padding:3px 5px 3px 10px;font-size:12px;max-width:100%;}
.rec-name>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;}
/* R103 中奖记录头像缩略图 */
.rec-ava{width:20px;height:20px;border-radius:50%;object-fit:cover;border:1px solid var(--line2);background:rgba(255,255,255,.08);flex:none;}
.rec-x{border:0;background:rgba(255,255,255,.12);color:var(--fg2);width:16px;height:16px;border-radius:50%;
  cursor:pointer;font-size:11px;line-height:1;display:grid;place-items:center;padding:0;}
.rec-x:hover{background:var(--danger);color:#fff;}

/* R101 抽奖照片名单缩略图 */
.lo-photos{display:flex;flex-wrap:wrap;gap:10px;margin:10px 0 4px;}
.lo-photo{position:relative;display:flex;flex-direction:column;align-items:center;gap:3px;width:64px;}
.lo-photo img{width:56px;height:56px;border-radius:10px;object-fit:cover;border:1px solid var(--line2);background:rgba(255,255,255,.06);}
.lo-photo-name{font-size:11px;color:var(--fg2);max-width:64px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;}
.lo-photo-name:hover{color:var(--pri);}
.lo-photo-x{position:absolute;top:-6px;right:-2px;border:0;background:var(--danger);color:#fff;width:18px;height:18px;border-radius:50%;cursor:pointer;font-size:11px;line-height:1;display:grid;place-items:center;padding:0;}
.lo-photo-x:hover{filter:brightness(1.15);}

/* ---------- preview ---------- */
.preview-area{display:flex;flex-direction:column;gap:10px;min-width:0;}
.scene-bar{display:flex;gap:7px;flex-wrap:wrap;align-items:center;}
.sb-btn{cursor:pointer;display:inline-flex;align-items:center;gap:7px;border:1px solid var(--line2);
  background:var(--card);color:var(--fg2);border-radius:999px;padding:7px 14px;font:600 12.8px/1 inherit;transition:.15s;}
.sb-btn:hover{border-color:var(--pri);color:var(--fg);}
.sb-btn.on{background:linear-gradient(135deg,var(--pri),var(--pri2));border-color:transparent;color:#fff;
  box-shadow:0 5px 16px rgba(79,140,255,.35);}
.sb-btn b{font-size:14px;}
.sb-nav{display:inline-flex;gap:5px;margin-left:auto;}
.sb-arrow{cursor:pointer;border:1px solid var(--line2);background:var(--card);color:var(--fg2);
  width:30px;height:30px;border-radius:9px;font-size:16px;line-height:1;padding:0;}
.sb-arrow:hover{background:var(--pri);color:#fff;border-color:transparent;}

.stage-host{position:relative;width:100%;aspect-ratio:16/9;background:#000;border:1px solid var(--line2);
  border-radius:var(--r2);overflow:hidden;display:flex;align-items:center;justify-content:center;
  box-shadow:0 22px 60px rgba(0,0,0,.5);}
.stage-host.fs-host{border-radius:0;border:0;aspect-ratio:auto;width:100vw;height:100vh;height:100dvh;}
.stage-fs-btn{position:absolute;right:10px;bottom:10px;z-index:60;cursor:pointer;border:1px solid var(--line2);
  background:rgba(8,12,22,.72);color:#dce6ff;border-radius:9px;width:34px;height:34px;font-size:15px;
  -webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);opacity:.35;transition:.18s;padding:0;}
.stage-host:hover .stage-fs-btn{opacity:1;}
.stage-host.fs-host .stage-fs-btn{right:18px;bottom:18px;}

.console{display:flex;align-items:center;gap:8px;flex-wrap:wrap;background:var(--card);
  border:1px solid var(--line);border-radius:var(--r);padding:9px 10px;}
.console-main{display:flex;gap:7px;flex-wrap:wrap;align-items:center;}
.vp-opt-ctrl{display:inline-flex;gap:0;align-items:center;}
.vp-opt-ctrl .cbtn{border-radius:0;}
.vp-opt-ctrl .cbtn:first-child{border-radius:9px 0 0 9px;}
.vp-opt-ctrl .cbtn:last-child{border-radius:0 9px 9px 0;}
.vp-opt-ctrl .cbtn.ghost{padding:9px 13px;}
.cbtn{cursor:pointer;border:1px solid var(--line2);background:var(--card2);color:var(--fg);
  border-radius:9px;padding:9px 16px;font:700 13.5px/1 inherit;transition:.15s;white-space:nowrap;}
.cbtn:hover{border-color:var(--pri);background:#1c2949;}
.cbtn.primary{background:linear-gradient(135deg,var(--pri),var(--pri2));border-color:transparent;color:#fff;
  min-width:120px;box-shadow:0 5px 16px rgba(79,140,255,.32);}
.cbtn.primary.hot{background:linear-gradient(135deg,#ff5f6d,#ff2d55);box-shadow:0 5px 18px rgba(255,45,85,.4);
  animation:hotpulse 1.1s ease-in-out infinite;}
@keyframes hotpulse{0%,100%{transform:scale(1);}50%{transform:scale(1.045);}}
.cbtn.ghost{background:transparent;color:var(--fg2);}
/* R91：答题闯关控制台——当前题号/总题数信息徽标 */
.console-info{display:inline-flex;align-items:center;align-self:center;padding:9px 14px;border-radius:9px;
  background:var(--card2);border:1px solid var(--line2);color:var(--fg);font-weight:700;font-size:13px;white-space:nowrap;}
.console-side{display:flex;gap:6px;align-items:center;margin-left:auto;min-width:220px;flex:1;max-width:360px;}
.console-side .input{flex:1;}
.console-presets{display:flex;gap:5px;flex-wrap:wrap;width:100%;overflow-x:hidden;}
.dm-chip{cursor:pointer;border:1px solid var(--line);background:rgba(255,255,255,.05);color:var(--fg2);
  border-radius:999px;padding:4px 11px;font:500 12px/1.3 inherit;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.dm-chip:hover{background:var(--pri);color:#fff;border-color:transparent;}
.dm-chip.grp{border-color:var(--pri);color:var(--pri);background:rgba(122,162,255,.10);font-weight:700;}
.dm-chip.grp:hover{background:var(--pri);color:#fff;}
/* 奖项清单编辑器 */
.prize-list{display:flex;flex-direction:column;gap:6px;margin:6px 0 8px;}
.prize-row{display:grid;grid-template-columns:1fr 52px 52px 1fr 30px;gap:6px;align-items:center;}
/* R189：转盘奖项 2 列（name + ×） */
.prize-row.wh-row{grid-template-columns:1fr 64px 40px 30px;gap:6px;align-items:center;}
.prize-row .pz-count{text-align:center;}
.prize-row .pz-perDraw{text-align:center;}
.prize-row .pz-weight{text-align:center;}
.prize-row .pz-color{width:38px;height:30px;padding:2px;border:1px solid var(--line);border-radius:8px;background:transparent;cursor:pointer;}
.pz-del{width:30px;height:30px;border-radius:8px;border:1px solid var(--line);background:rgba(255,255,255,.05);color:var(--fg2);cursor:pointer;font-size:16px;line-height:1;}
.pz-del:hover{background:#e05656;color:#fff;border-color:transparent;}
.prize-empty{color:var(--fg3);font-size:12px;padding:8px;border:1px dashed var(--line);border-radius:8px;text-align:center;}
.prize-total-hint{color:var(--fg3);font-size:12px;text-align:right;margin-top:2px;font-variant-numeric:tabular-nums;}
/* 投票选项编辑 */
.poll-opts{display:flex;flex-direction:column;gap:6px;margin:6px 0 8px;}
.poll-opt-row{display:grid;grid-template-columns:1fr 44px 30px;gap:6px;align-items:center;}
.vp-opt-count{font-size:12px;color:var(--fg3);text-align:center;font-variant-numeric:tabular-nums;}
/* 备用方案 */
.plan-list{display:flex;flex-direction:column;gap:6px;margin-top:8px;}
.plan-row{display:flex;align-items:center;justify-content:space-between;gap:8px;background:rgba(255,255,255,.04);border:1px solid var(--line);border-radius:10px;padding:8px 10px;}
.plan-info{display:flex;flex-direction:column;gap:2px;min-width:0;}
.plan-info b{font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.plan-info span{font-size:11.5px;color:var(--fg3);}
.plan-acts{display:flex;gap:6px;flex:none;}
.plan-empty{color:var(--fg3);font-size:12px;padding:8px;border:1px dashed var(--line);border-radius:8px;text-align:center;}
/* 照片墙缩略图 */
.pw-thumbs{display:grid;grid-template-columns:repeat(auto-fill,minmax(72px,1fr));gap:8px;margin-top:10px;}
.pw-thumb{position:relative;aspect-ratio:1;border-radius:10px;overflow:hidden;border:1px solid var(--line);background:#0a1120;}
.pw-thumb img{width:100%;height:100%;object-fit:cover;display:block;}
/* 编辑器子标签 */
/* R50 P0 修复：#edTabs 处于 flex column 滚动面板内且自身 overflow-x:auto → 自动最小尺寸归零，
   编辑器内容超高时被子项压缩算法挤到 ~10px（标签条文字不可见，用户找不到「抽奖设置」等子标签）。
   flex-shrink:0 禁止压缩；[hidden] 显式恢复 display:none（display:flex 会覆盖 hidden 的 UA 样式）。 */
/* R60：编辑器分组标签行一行排不下自动换行（此前溢出触发父容器横向滚动条） */
.ed-tabs{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px;flex-shrink:0;}
.ed-tabs[hidden]{display:none;}
/* R52b：file:// 直开检测横幅（tool.html 用本样式；display.html 在页内内联同款） */
.proto-banner{position:fixed;top:0;left:0;right:0;z-index:300;display:flex;gap:8px;align-items:flex-start;
  background:#4a1d1d;color:#ffd9d9;border-bottom:1px solid #b04848;padding:10px 16px;
  font:500 13px/1.5 system-ui,-apple-system,"Segoe UI","Microsoft YaHei",sans-serif;
  box-shadow:0 4px 16px rgba(0,0,0,.35);}
.proto-banner[hidden]{display:none;}
.proto-banner .proto-ico{flex:none;font-size:15px;line-height:1.4;}
.ed-tab{flex:1;padding:9px;border:1px solid var(--line);background:rgba(255,255,255,.04);color:var(--fg2);border-radius:10px;font-weight:600;cursor:pointer;font-size:13px;transition:.15s;white-space:nowrap;}  /* R60：nowrap 防换行后按钮内文字折成两行 */
.ed-tab:hover{color:var(--fg);}
.ed-tab.active{background:linear-gradient(135deg,var(--pri),var(--pri2));color:#fff;border-color:transparent;}
/* 主题/全局子标签 */
.g-tabs{flex-wrap:wrap;}
.g-tabs .ed-tab{flex:0 0 auto;padding:8px 13px;}
[data-pane="global"] .block[data-gtab]{display:none;}
[data-pane="global"][data-gtab="bg"] .block[data-gtab="bg"],
[data-pane="global"][data-gtab="rotate"] .block[data-gtab="rotate"],
[data-pane="global"][data-gtab="font"] .block[data-gtab="font"],
[data-pane="global"][data-gtab="clock"] .block[data-gtab="clock"],
[data-pane="global"][data-gtab="marquee"] .block[data-gtab="marquee"],
[data-pane="global"][data-gtab="danmaku"] .block[data-gtab="danmaku"],
[data-pane="global"][data-gtab="sound"] .block[data-gtab="sound"],
[data-pane="global"][data-gtab="bgm"] .block[data-gtab="bgm"]{display:block;}
.preview-hint{color:var(--fg3);font-size:12px;margin:0;line-height:1.6;}

/* ---------- SEO content ---------- */
/* R226：落地页改版为 .lg-* 体系后，这 10 条 .seo 规则再也匹配不到任何元素，已删除。
 * 但 @media print 里的 .seo 规则不能一删了事 —— 它当时在承担「把渐变裁字还原成深色文字」
 * 的职责，删掉但不补位就会让标题打印时整条消失（详见下方 @media print 注释）。 */
.site-footer{border-top:1px solid var(--line);margin-top:20px;background:linear-gradient(180deg,rgba(255,255,255,.02),transparent);
  text-align:center;color:var(--fg3);font-size:12.5px;padding:28px 14px 34px;line-height:1.9;}
.site-footer a{color:var(--fg2);text-decoration:none;}
.footer-nav{display:flex;flex-wrap:wrap;gap:8px 18px;justify-content:center;margin:0 0 12px;padding:0;list-style:none;}
.footer-nav a{color:var(--fg2);text-decoration:none;font-size:13px;padding:2px 0;border-bottom:1px solid transparent;transition:color .15s,border-color .15s;}
.footer-nav a:hover{color:var(--fg);}

/* ---------- info pages (R338: guide/faq/about/terms/privacy) ---------- */
.info-main{max-width:880px;margin:0 auto;padding:clamp(28px,5vw,56px) 20px 60px;}
.info-main h1{font-size:clamp(24px,4vw,34px);margin:0 0 6px;font-weight:800;background:linear-gradient(120deg,#fff 30%,#ffd166 95%);-webkit-background-clip:text;background-clip:text;color:transparent;}
.info-main .lead{color:var(--fg2);font-size:15.5px;line-height:1.8;margin:0 0 28px;}
.info-main h2{font-size:20px;margin:34px 0 12px;padding:20px 0 0 16px;position:relative;border-top:1px solid var(--line);}
.info-main h2:first-of-type{border-top:0;padding-top:0;}
/* 章节标题左侧渐变色条（纯装饰） */
.info-main h2::before{content:"";position:absolute;left:0;top:calc(50% + 4px);transform:translateY(-50%);
  width:4px;height:19px;border-radius:2px;background:linear-gradient(180deg,var(--pri),var(--pri2));}
.info-main h2:first-of-type::before{top:11px;transform:none;}
.info-main p{color:var(--fg2);line-height:1.85;font-size:15px;margin:0 0 14px;}
.info-main ul,.info-main ol{color:var(--fg2);line-height:1.85;font-size:15px;padding-left:22px;margin:0 0 14px;}
.info-main li{margin:0 0 8px;}
.info-main a.inline{color:var(--pri);text-decoration:none;}
.info-main a.inline:hover{border-color:var(--pri);}
.info-main .info-card{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:20px 22px;margin:0 0 18px;
  transition:border-color .18s ease,transform .18s ease,background .18s ease;}
.info-main .info-card:hover{border-color:rgba(122,162,255,.5);background:#141f38;transform:translateY(-2px);}
.info-main .info-card h3{margin:0 0 8px;font-size:16px;color:var(--fg);letter-spacing:.01em;}
/* 章节目录（guide 页） */
.info-toc{background:rgba(79,140,255,.06);border:1px solid rgba(122,162,255,.22);border-radius:12px;padding:14px 18px;margin:0 0 8px;}
.info-toc b{display:block;color:var(--fg);font-size:13.5px;margin-bottom:6px;letter-spacing:.04em;}
.info-toc ol{margin:0;padding-left:20px;}
.info-toc li{margin:2px 0;}
/* 返回顶部（信息页长文用） */
.to-top{position:fixed;right:16px;bottom:16px;z-index:60;display:inline-grid;place-items:center;width:42px;height:42px;
  border-radius:50%;border:1px solid var(--line2);background:rgba(17,26,46,.92);color:var(--fg2);font-size:18px;line-height:1;
  text-decoration:none;box-shadow:0 8px 24px rgba(0,0,0,.4);transition:color .15s,border-color .15s,transform .15s;}
.to-top:hover{color:#fff;border-color:var(--pri);transform:translateY(-2px);}
.info-back{display:inline-flex;align-items:center;gap:6px;margin:0 0 18px;color:var(--pri);text-decoration:none;font-size:14px;}
.info-back:hover{color:var(--fg);}
/* about page: 365lab.top new-window link + click-to-copy email */
.info-site-link{display:inline-flex;align-items:center;gap:8px;background:var(--card2);border:1px solid var(--line2);border-radius:10px;padding:10px 14px;color:var(--fg);font-size:15px;font-weight:600;text-decoration:none;transition:border-color .15s,background .15s;}
.info-site-link:hover{border-color:var(--pri);background:#1c2949;}
.info-site-link .ic{font-size:16px;opacity:.8;}
.email-copy{display:inline-flex;align-items:center;gap:8px;cursor:pointer;user-select:text;background:var(--card2);border:1px solid var(--line2);border-radius:10px;padding:10px 14px;color:var(--fg);font-size:15px;font-weight:600;transition:border-color .15s,background .15s;}
.email-copy:hover{border-color:var(--pri);background:#1c2949;}
.email-copy .ic{font-size:16px;opacity:.8;}
.email-hint{color:var(--fg3);font-size:13px;margin:8px 0 0;line-height:1.6;}
/* toast (轻量，符合 CSP 内联脚本允许) */
.toast{position:fixed;left:50%;bottom:32px;transform:translateX(-50%) translateY(20px);background:rgba(20,30,52,.96);border:1px solid var(--line2);color:var(--fg);padding:12px 20px;border-radius:12px;font-size:14px;box-shadow:0 16px 44px rgba(0,0,0,.5);opacity:0;pointer-events:none;transition:opacity .25s,transform .25s;z-index:200;}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0);}
.toast.ok{border-color:rgba(34,197,94,.6);}
.toast.fail{border-color:rgba(239,68,68,.6);}
@media (prefers-reduced-motion:reduce){.toast{transition:none;}}

/* ---------- modal ---------- */
.modal{position:fixed;inset:0;z-index:80;background:rgba(4,7,14,.72);-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);
  display:flex;align-items:center;justify-content:center;padding:18px;}
.modal[hidden]{display:none !important;}
.modal-card{position:relative;max-width:560px;width:100%;max-height:82vh;overflow-y:auto;
  background:linear-gradient(180deg,var(--card),#0d1526);border:1px solid var(--line2);
  border-radius:var(--r2);padding:24px 24px 20px;box-shadow:0 30px 80px rgba(0,0,0,.6);}
.modal-card h2{font-size:19px;margin-bottom:12px;}
.modal-card ol{padding-left:22px;line-height:1.9;font-size:13.8px;color:#c9d6ee;}
.modal-card p{font-size:13px;color:var(--fg2);line-height:1.7;}
.modal-close{position:absolute;right:12px;top:10px;cursor:pointer;border:0;background:transparent;
  color:var(--fg2);font-size:26px;line-height:1;padding:2px 6px;border-radius:8px;}
.modal-close:hover{background:rgba(255,255,255,.1);color:#fff;}

/* ---------- unified confirm/prompt dialog ---------- */
.dlg-card{max-width:400px;text-align:center;padding:26px 24px 20px;animation:dlgIn .18s ease;}
@keyframes dlgIn{from{opacity:0;transform:translateY(10px) scale(.97);}to{opacity:1;transform:none;}}
.dlg-icon{width:46px;height:46px;margin:0 auto 12px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;font-size:22px;
  background:rgba(255,255,255,.06);border:1px solid var(--line2);}
.dlg-icon.warn{color:#ffb454;background:rgba(255,180,84,.08);border-color:rgba(255,180,84,.35);}
.dlg-icon.danger{color:#ff7a7a;background:rgba(255,90,90,.08);border-color:rgba(255,90,90,.35);}
.dlg-icon.edit{color:var(--accent);background:rgba(255,255,255,.06);}
.dlg-title{font-size:15.5px;font-weight:600;color:var(--fg);line-height:1.65;margin-bottom:16px;}
.dlg-input{width:100%;text-align:left;margin:-4px 0 16px;font-size:16px;}
.dlg-btns{display:flex;gap:10px;}
.dlg-btn{flex:1;min-height:40px;font-size:14px;}

/* ---------- mobile ---------- */
@media (max-width:720px){
  .topbar{padding:9px 11px;gap:8px;}
  .brand-text small{display:none;}
  .btn{padding:7px 11px;font-size:12.5px;}
  .workspace{padding:10px;gap:11px;}
  .console-side{margin-left:0;max-width:none;}
  .cbtn{padding:9px 13px;font-size:13px;}
  .cbtn.primary{min-width:100px;}
  .stage-fs-btn{opacity:1;}
  /* iOS：文本类控件 ≥16px，避免聚焦自动缩放 */
  .input,select.input,textarea.input,#dmInput,#newSceneType,
  input[type=text],input[type=number],input[type=datetime-local]{font-size:16px;}
  /* 触控目标 ≥40px，方便手指操作 */
  .mini{min-width:40px;min-height:40px;}
  .btn-sm{min-height:40px;padding:9px 13px;}
  .lang-btn{min-height:40px;display:inline-flex;align-items:center;padding:0 14px;}
  .ed-tab{min-height:40px;}
  .topbar .btn,.topbar-actions .btn{min-height:42px;}
  .cbtn{min-height:42px;}
  .sb-btn{min-height:40px;}
  .sb-arrow{min-width:40px;min-height:40px;}
  .dm-chip{min-height:40px;padding:9px 14px;}
  .btnStageFs,.stage-fs-btn{min-width:40px;min-height:40px;}
}
@media (max-width:420px){
  .topbar-actions{width:100%;justify-content:space-between;}
  .lang-switch{order:3;}
}
/* 极窄屏：双列输入行改为换行，避免横向溢出（阈值上移至 560px，覆盖 480–560 窄带内多固定宽控件挤出的横向滚动） */
@media (max-width:560px){
  .row:not(.wrap){flex-wrap:wrap;align-items:center;}
  .row:not(.wrap)>.field.grow{flex-basis:calc(50% - 6px);}
  /* R171：窄屏触控按钮放大到 40px 会使场景列表行横向溢出、被 .panel{overflow:hidden} 裁切；
     允许操作按钮换行到独立行，所有控件保持可见且不裁切（桌面端不受影响） */
  .scene-item{flex-wrap:wrap;gap:6px 8px;}
  .si-actions{order:5;flex:1 1 100%;justify-content:flex-end;margin-top:2px;}
}

/* ---------- 多队计分：队伍列表 ---------- */
.team-list{display:flex;flex-direction:column;gap:6px;margin-top:6px;}
.team-row{display:flex;align-items:center;gap:8px;}
.team-row .team-name{flex:1;min-width:0;}
.team-score{flex:none;min-width:46px;text-align:center;font-variant-numeric:tabular-nums;
  background:rgba(255,255,255,.06);border:1px solid var(--line);border-radius:8px;
  padding:6px 8px;font-size:12.5px;font-weight:700;color:var(--fg2);}
/* R43：计分板多组对抗编辑器 */
.team-tag{flex:none;min-width:52px;text-align:center;font-size:12px;font-weight:800;color:var(--accent);
  background:rgba(255,255,255,.05);border:1px solid var(--line);border-radius:8px;padding:6px 8px;}
.team-vs{flex:none;font-size:11px;font-weight:800;opacity:.6;}
.team-row .group-name{flex:1.4;min-width:0;}
.group-card{display:flex;flex-direction:column;gap:6px;padding:10px;border:1px solid var(--line);border-radius:12px;
  background:rgba(255,255,255,.03);margin-top:6px;}
/* R44：自动保存状态徽标（顶栏） */
.save-dot{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;border-radius:999px;border:1px solid var(--line);
  background:rgba(255,255,255,.04);font-size:12px;color:var(--fg2);white-space:nowrap;}
.save-dot .sd-ico{flex:none;width:8px;height:8px;border-radius:50%;background:#4ade80;box-shadow:0 0 8px rgba(74,222,128,.7);}
.save-dot.idle{opacity:.72;}
.save-dot.busy .sd-ico{background:#fbbf24;box-shadow:0 0 8px rgba(251,191,36,.7);animation:sdPulse 1s ease-in-out infinite;}
.save-dot.err{border-color:rgba(248,113,113,.5);}
.save-dot.err .sd-ico{background:#f87171;box-shadow:0 0 8px rgba(248,113,113,.7);}
@keyframes sdPulse{0%,100%{opacity:1}50%{opacity:.35}}
@media (max-width:900px){.save-dot{padding:5px 8px}.save-dot #saveDotText{display:none}}

/* ---------- 降低动效偏好 ---------- */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001ms !important;animation-iteration-count:1 !important;
    transition-duration:.001ms !important;scroll-behavior:auto !important;}
}

/* ---------- 打印 / 存 PDF ---------- */
/* R256：打印专用浮层，屏幕态完全不占空间（不影响控制台布局）。打印态的显示/样式见下方 @media print。 */
#printChecklist{display:none;}
@media print{
  :root{color-scheme:light;}
  body{background:#fff !important;color:#111 !important;}
  .topbar,.workspace,.site-footer,.modal,.console,.scene-bar,.skip-link,.preview-area{display:none !important;}
  /* R226：原规则只针对 .seo —— 落地页改成 .lg-* 体系后它不再匹配，于是主标题仍是
   * 「渐变背景裁字 + color:transparent + -webkit-text-fill-color:transparent」，
   * 打印/存 PDF 时白底白字整条消失；副文案 #a6b6d4 在白纸上对比度也只有约 2:1。
   * 这里改用**元素选择器**（section）而不是类名：旧写法绑死在具体类名上，
   * 一次页面改版就能让它静默失效 —— 这正是本次 bug 的根因。 */
  section, section *, section::before, section::after{
    background:none !important;background-image:none !important;box-shadow:none !important;
    text-shadow:none !important;-webkit-background-clip:border-box !important;
    background-clip:border-box !important;-webkit-text-fill-color:#111 !important;color:#111 !important;}
  a[href]::after{content:" (" attr(href) ")";font-size:11px;color:#555;}

  /* R256：核对清单浏览器打印 —— 清单埋在 .workspace（被上面的 display:none 整段隐藏），
   * 故用 #printChecklist 浮层承载：打印态显示、且强制深色文字 + 实线边框，在白纸上清晰可读
   * （暗色主题下的 --fg/--line 等变量在白纸上几乎不可见，必须逐项覆盖）。 */
  #printChecklist{display:block !important;padding:0;margin:0;color:#111 !important;}
  #printChecklist *{color:#111 !important;background:none !important;box-shadow:none !important;text-shadow:none !important;}
  #printChecklist h2{font-size:18px;font-weight:800;margin:0 0 4px;}
  #printChecklist p{font-size:12px;margin:0 0 12px;}
  #printChecklist .stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:10px;}
  #printChecklist .stat-card{background:#fff !important;border:1px solid #bbb !important;border-radius:8px;padding:9px 11px;}
  #printChecklist .stat-card-t{color:#b00 !important;font-weight:700;font-size:12px;margin-bottom:7px;}
  #printChecklist .stat-row{border-top:1px dashed #ddd !important;}
  #printChecklist .stat-row:first-child{border-top:0 !important;}
  #printChecklist .stat-k{color:#333 !important;}
  #printChecklist .stat-v{color:#111 !important;font-weight:700;}
  #printChecklist .stat-v.warn{color:#b00 !important;}
  #printChecklist .stat-tbl-head,#printChecklist .stat-tbl-row{border-color:#ccc !important;color:#111 !important;}
  #printChecklist .stat-tbl-row.done .st-name{color:#888 !important;}
}

/* ===== R4B 无障碍补丁 ===== */
/* 触控目标 >= 40px：删除/关闭类图标按钮原本只有 16~30px */
.btn-xs, .pz-del, .th-x, .rec-x, .pw-thumb-x, .modal-close {
  min-width: 40px; min-height: 40px;
  display: inline-flex; align-items: center; justify-content: center;
}
.modal-close { width: 40px; height: 40px; }
/* 编辑器子标签窄屏可横向滚动，避免按钮挤成一团（只作用于 #edTabs，不影响 #gTabs 换行） */
#edTabs { overflow-x: auto; overflow-y: hidden; scrollbar-width: thin; -webkit-overflow-scrolling: touch; }
#edTabs .ed-tab { flex: 0 0 auto; }
/* 禁用态：控件/按钮统一降级视觉，给出不可操作的 affordance */
.btn:disabled, .input:disabled, .ed-tab:disabled, .tab:disabled, .mini:disabled, button:disabled {
  opacity: .45; cursor: not-allowed; filter: grayscale(.3);
}

/* ===== R11 / 美化：消除桌面端 1280×720 视口的纵向滚动条 + 锁定横幅 =====
 * 控制台预览只是「预览」，大屏交给 display.html；这里把 stage-host 收紧到适合控制台的紧凑尺寸，
 * 让 1280×720、1366×768 等常见桌面视口不再出现「滑动窗口」。 */
@media (min-width: 1081px) {
  .workspace { padding: 12px 12px 10px; }
  .preview-area { gap: 8px; }
  .scene-bar { gap: 6px; }
  .stage-host {
    max-height: calc(100vh - 340px);
  }
  .preview-hint { margin: 4px 0 0; font-size: 11.8px; }
}
/* 锁定横幅：theme.lock=true 时显示；点击横幅解锁，提供唯一的「逃生通道」 */
.lock-banner {
  display: none;
  position: fixed; left: 50%; top: 14px; transform: translateX(-50%);
  z-index: 70;
  background: linear-gradient(135deg, rgba(245,158,11,.95), rgba(239,68,68,.92));
  color: #fff; font: 700 13px/1.2 system-ui, -apple-system, "Microsoft YaHei", sans-serif;
  padding: 9px 16px; border-radius: 999px;
  box-shadow: 0 10px 28px rgba(239,68,68,.32);
  cursor: pointer; user-select: none;
  border: 1px solid rgba(255,255,255,.22);
  align-items: center; gap: 8px;
}
body[data-lock="1"] .lock-banner { display: inline-flex; }
body[data-lock="1"] .lock-banner kbd {
  background: rgba(0,0,0,.28); border: 0; padding: 1px 6px; border-radius: 4px;
  font: 700 12px ui-monospace, Consolas, monospace;
}
/* 锁定态：控制台与场景条降透明度且不可点击（防止现场误触） */
body[data-lock="1"] .console,
body[data-lock="1"] #sceneBar { opacity: .55; pointer-events: none; }

/* ============ R198 价格牌商品清单 / 子分组 ============ */
.sub-block{margin-top:calc(12px * var(--fs,1));padding:calc(10px * var(--fs,1)) calc(12px * var(--fs,1));
  border:1px solid rgba(255,255,255,.08);border-radius:12px;background:rgba(255,255,255,.03);}
.sub-head{font-weight:800;font-size:calc(14px * var(--fs,1));letter-spacing:.04em;opacity:.8;
  margin-bottom:calc(8px * var(--fs,1));color:var(--accent);}
.field.inline{display:inline-flex;flex-direction:column;gap:4px;margin:0;}
.field.inline .input{width:96px;}

.pr-products{display:flex;flex-direction:column;gap:calc(8px * var(--fs,1));margin:calc(6px * var(--fs,1)) 0;}
.pr-product-row{display:flex;align-items:center;gap:calc(6px * var(--fs,1));flex-wrap:wrap;}
.pr-product-row .input{flex:1 1 120px;min-width:0;}
.pr-row-name,.pr-row-price{flex:1 1 120px;min-width:0;}
.pr-row-fname{flex:0 0 auto;font-size:calc(12px * var(--fs,1));opacity:.7;max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.pr-row-del{flex:0 0 auto;width:28px;padding:0;line-height:1;font-size:16px;}

/* ---------- R217 抽奖 / 转盘「数据核对」 ---------- */
.stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(148px,1fr));gap:10px;}
.stat-card{background:rgba(255,255,255,.04);border:1px solid var(--line);border-radius:10px;padding:9px 11px;min-width:0;}
/* R218：含表格的卡片独占整行——表格 3~4 个数值列是固定宽，窄栏里 1fr 名称列会被挤成 0（奖项名称看不见） */
.stat-card.is-tbl{grid-column:1/-1;}
.stat-card-t{font-size:12px;font-weight:700;color:var(--warn);margin-bottom:7px;}
.stat-row{display:flex;align-items:baseline;justify-content:space-between;gap:10px;padding:3px 0;font-size:12.5px;}
.stat-row+.stat-row{border-top:1px dashed rgba(255,255,255,.07);}
.stat-k{color:var(--fg3);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.stat-v{font-weight:700;color:var(--fg);font-variant-numeric:tabular-nums;flex:none;}
.stat-v.big{font-size:15px;color:var(--pri);}
.stat-v.warn{color:var(--warn);}
.stat-tbl-head,.stat-tbl-row{display:grid;grid-template-columns:minmax(64px,1fr) 42px 42px 42px;gap:6px;align-items:center;font-size:12px;}
.stat-tbl-head.two,.stat-tbl-row.two{grid-template-columns:minmax(64px,1fr) 68px;}
.stat-tbl-head{color:var(--fg3);font-size:11px;padding-bottom:5px;border-bottom:1px solid var(--line);margin-bottom:3px;}
.stat-tbl-head span:not(:first-child),.stat-tbl-row span:not(:first-child){text-align:right;font-variant-numeric:tabular-nums;}
.stat-tbl-row{padding:4px 0;border-bottom:1px dashed rgba(255,255,255,.06);}
.stat-tbl-row:last-child{border-bottom:0;}
/* R319：名字列是主信息 —— 允许换行完整显示（原来强制单行 + 省略号，长奖项名/队名会被吃掉） */
.stat-tbl-row .st-name{white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere;}
.stat-tbl-row.done .st-name{color:var(--fg3);}
.st-left{color:var(--ok);}
.st-full{color:var(--fg3);}
/* R219：核对清单明细表的列变体——.three = 名称 + 两个数值列（投票：选项/票数/占比）；
 * .idx = 序号 + 名称 + 两个数值列（记录：序号/名称/奖项/时间）；数值列按内容自适应并右对齐 */
.stat-tbl-head.three,.stat-tbl-row.three{grid-template-columns:minmax(64px,1fr) auto auto;}
.stat-tbl-head.idx,.stat-tbl-row.idx{grid-template-columns:30px minmax(56px,1fr) auto auto;}
/* R247：操作流水表以「时间」为第一列，不能用 .idx（.idx 第一列是 30px 序号）。
 * 场景核对面板里的操作流水 4 列：时间/操作/内容/状态。
 * 历史 tab 的「全部操作历史」5 列：时间/场景/操作/内容/状态。 */
.stat-tbl-head.log,.stat-tbl-row.log{grid-template-columns:minmax(120px,auto) auto 1fr auto;}
.stat-tbl-head.hist,.stat-tbl-row.hist{grid-template-columns:minmax(120px,auto) minmax(60px,auto) auto 1fr auto;}
.stat-tbl-row span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
/* R319：**内容列不许被裁**（`.log` 第 3 列 / `.hist` 第 4 列是 1fr 自适应列）。
 * 其余列（时间/操作/状态/计数）仍是短值，保持上面的单行省略 —— 截断无信息损失。
 * 兜底：JS 侧 statTableCard 已给**每个单元格**补完整值 title（悬停可见）。 */
.stat-tbl-row.log span:nth-child(3),.stat-tbl-row.hist span:nth-child(4),
.stat-tbl-head.log span:nth-child(3),.stat-tbl-head.hist span:nth-child(4){
  white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere;}
/* R247：可撤销操作列表一行内信息过多，时间被挤成 "202..."。
 * 改为两行式网格：操作名 + 撤销按钮在上，场景名+完整时间在下独占整行。 */
.hist-row{display:grid;grid-template-columns:1fr auto;gap:3px 10px;align-items:baseline;padding:6px 0;border-bottom:1px dashed rgba(255,255,255,.06);}
.hist-row:last-child{border-bottom:0;}
.hist-row b{grid-column:1;grid-row:1;font-weight:700;min-width:0;white-space:normal;overflow-wrap:anywhere;overflow:visible;text-overflow:clip;}
.hist-row .hint{grid-column:1/-1;grid-row:2;font-size:11.5px;color:var(--fg3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;}
.hist-row .btn{grid-column:2;grid-row:1;align-self:start;}
/* R219：核对面板底部「导出核对清单」操作条 */
/* R219：核对面板容器本身是普通块——tool.html 里它带 class="stat-grid"，若不显式覆盖，
 * 面板内的「提示文字 + 导出操作条」会成为外层网格的网格项被挤进 148px 一列（栏变宽才暴露）。
 * 真正的网格交给 JS 生成的内层 .stat-grid。 */
#loStats,#whStats,#sbStats,#vpStats{display:block;}
.stat-acts{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:10px;}
.console-stat{width:100%;font-size:12px;color:var(--fg2);background:rgba(79,140,255,.10);border:1px solid rgba(79,140,255,.28);
  border-radius:9px;padding:6px 10px;margin-top:8px;letter-spacing:.01em;font-variant-numeric:tabular-nums;}
/* R251：空态/不可用场景的「为什么不能操作」常驻可见提示（替代 disabled 按钮上被浏览器抑制的 title 悬浮窗）。
 * 用琥珀色区别于蓝色 console-stat，明确传达「需要先补充素材」。 */
.console-hint{width:100%;font-size:12.5px;line-height:1.5;color:#ffd089;background:rgba(255,184,77,.10);
  border:1px solid rgba(255,184,77,.30);border-left:3px solid rgba(255,184,77,.6);border-radius:9px;
  padding:7px 11px;margin-top:8px;}
/* R291：控制台内联 select（汇总跳转延时）。不与表单 .input.auto 争宽度：控制台是 flex-wrap 行，
 * 用固定宽度避免把后面的场景导航按钮挤到下一行。 */
.console-sel{flex:0 0 auto;width:auto;min-width:0;font-size:12.5px;padding:7px 26px 7px 10px;}
/* R304 首访提示条：**非阻塞**（自身只占一行，绝不做全屏遮罩）。
 * 背景：首访原来自动弹 `.modal`（position:fixed;inset:0;z-index:80），而每换一个预览链接就是新 origin、
 * localStorage 必为空 → 弹窗盖住整个控制台 → 用户此时点任何按钮都「没反应」。改成这条提示条后不再遮挡操作。 */
.firstrun-tip{position:fixed;left:12px;bottom:12px;z-index:60;max-width:min(420px,72vw);
  display:flex;align-items:center;gap:10px;padding:9px 10px 9px 12px;border-radius:11px;
  font:600 12.5px/1.5 inherit;color:#dbeeff;background:rgba(16,26,44,.96);
  border:1px solid rgba(79,140,255,.45);box-shadow:0 10px 26px rgba(0,0,0,.42);}
.firstrun-tip .fr-txt{flex:1;min-width:0;}
.firstrun-tip .fr-x{flex:0 0 auto;cursor:pointer;border:0;border-radius:7px;padding:2px 7px;
  font:700 14px/1 inherit;color:#dbeeff;background:rgba(255,255,255,.10);}
.firstrun-tip .fr-x:hover{background:rgba(255,255,255,.2);color:#fff;}
/* 「?」按钮上的首次使用小圆点 */
.has-tip{position:relative;}
.has-tip::after{content:'';position:absolute;top:2px;right:2px;width:7px;height:7px;border-radius:50%;
  background:#ff9f1c;box-shadow:0 0 0 2px rgba(16,26,44,.9);}
@media print{.firstrun-tip{display:none !important;}}
/* R239b：抽奖结果总览——控制台逐条「隐藏/显示」滚动列表 */
/* R314：原实现引用 `--bg2` / `--bg3`，但**这两个自定义属性从未定义**（调色板只有
 * `--bg` / `--card` / `--card2` / `--line` / `--line2` / `--fg*` …）→ `var()` 解析失败使整条声明
 * 静默失效：列表没有底色、hover 不亮、小标签没有胶囊底、行分隔线不显示（全都「看起来像没做过」）。
 * 现改用**既有 token**（不自创新变量）：凹陷容器 `--bg`、抬起行/小标签 `--card2`、细线 `--line`。 */
.rs-toggle-list{display:flex;flex-direction:column;gap:2px;max-height:200px;overflow:auto;margin:8px 0;padding:6px;
  border:1px solid var(--line);border-radius:10px;background:var(--bg);}
.rs-toggle-row{display:flex;align-items:center;gap:8px;padding:5px 6px;border-radius:7px;font-size:12.5px;min-width:0;}
.rs-toggle-row:hover{background:var(--card2);}
.rs-toggle-row input{flex:0 0 auto;width:15px;height:15px;accent-color:var(--pri);}
.rs-toggle-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--fg);}
.rs-toggle-src{flex:0 0 auto;font-size:11px;color:var(--fg3);padding:1px 8px;border-radius:999px;background:var(--card2);}
/* R305：结果总览的「逐条明细」列表 —— 姓名加粗便于扫读、行间细分隔线、行内两个按钮收紧，
 * 一屏能多看几条（现场核对中奖名单是高频动作）。 */
.rs-toggle-name{font-weight:600;}
.rs-toggle-row + .rs-toggle-row{border-top:1px solid var(--line);}
.rs-toggle-row .cbtn{padding:5px 9px;font-size:11.5px;}
.rs-toggle-row .rs-toggle-src{margin-left:auto;}
/* R305：结果总览**设置区**改成两列紧凑布局。
 * 原来是一列长表单（顶部标题 / 汇总来源 / 卡片显示 / 排序方式 / 每页条数 / 自动翻页间隔 /
 * 奖项标签 / 奖项标签颜色 / 字体与缩放…），把「当前页设置」整块拉得很长、要不停滚动才能看到下面的控件
 *（用户反馈「抽奖结果总览设置遮挡其他内容」）。短字段两列并排后高度约降 40%，不改任何字段语义。
 * ⚠️ 网格容器是 `.block` 而不是 `.form-group` —— 字段都在 `.block` 里面。 */
[data-form="result"] > .block{display:grid;grid-template-columns:repeat(auto-fit,minmax(236px,1fr));gap:10px 16px;align-items:start;}
[data-form="result"] > .block > .block-head,
[data-form="result"] > .block > .hint{grid-column:1/-1;}
/* ===================== R230：编辑面板的字段分组小标题 =====================
 * 原先 19 处逐字重复同一段内联 style，既冗长又让「加 data-i18n」变得难写难查。
 * 抽成类后：tool.html 每处只剩 class + data-i18n，样式集中一处。 */
.field-group-title{font-size:.9em;opacity:.7;margin-top:10px;
  border-top:1px solid rgba(255,255,255,.1);padding-top:8px;}

/* ===================== R224：控制台「设置搜索」 =====================
 * 纯增量：结果列表 + 跳转后闪烁，绝不隐藏/挪动既有控件（场景表单有
 * form-group / btab / gtab 三重显隐规则，就地过滤会与之打架并留下脏状态）。 */
.search-box{position:relative;display:flex;align-items:center;gap:6px;flex:none;
  padding:8px 10px;border-bottom:1px solid var(--line);background:rgba(255,255,255,.015);}
.search-box .search-ico{position:absolute;left:20px;top:50%;transform:translateY(-50%);
  display:flex;color:var(--fg3);pointer-events:none;}
.search-input{flex:1;min-width:0;padding-left:30px;padding-right:10px;}
.search-input::-webkit-search-cancel-button{-webkit-appearance:none;appearance:none;}
.search-clear{flex:none;line-height:1;padding:5px 8px;}
.search-stat{flex:none;font-size:11.5px;color:var(--fg3);white-space:nowrap;}
/* R225：改为绝对定位浮层。此前它是 .panel 的 flex 子项（flex:none + max-height:38vh），
 * 在 914px 高的面板上吃掉 380px（42%）流式高度，把 editor 可视区压到 0 —— 用户搜到并
 * 跳过去后反而看不见目标字段。浮层化后完全不参与布局计算，面板高度恒等于未搜索状态。
 * 配套行为见 panel.js：跳转即收起（否则浮层会盖住刚落点的字段），点外部收起、聚焦/输入/↓ 恢复。 */
.search-results{position:absolute;top:100%;left:0;right:0;z-index:55;
  max-height:min(46vh,440px);overflow-y:auto;list-style:none;margin:0;padding:6px;
  background:var(--card);border:1px solid var(--line2);border-top:0;
  border-radius:0 0 var(--r2) var(--r2);box-shadow:0 18px 36px rgba(0,0,0,.5);
  overscroll-behavior:contain;}
.search-results[hidden]{display:none;}
.search-results li{margin:0;}
.sr-item{display:flex;align-items:baseline;gap:8px;width:100%;text-align:left;cursor:pointer;
  border:0;background:transparent;color:var(--fg);padding:7px 8px;border-radius:calc(var(--r) - 2px);
  font:600 12.5px/1.35 inherit;}
.sr-item:hover,.sr-item:focus-visible{background:rgba(79,140,255,.16);}
.sr-label{flex:1 1 auto;min-width:0;white-space:normal;overflow-wrap:anywhere;overflow:visible;text-overflow:clip;}
.sr-path{flex:0 0 auto;max-width:46%;font-size:11px;font-weight:600;color:var(--fg3);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
/* 跳转后的落点提示：只在目标字段外圈闪一圈，不改动任何布局属性 */
.set-flash{animation:setFlash 1.6s ease-out 1;border-radius:var(--r);}
@keyframes setFlash{
  0%{box-shadow:0 0 0 0 rgba(79,140,255,0);background:rgba(79,140,255,0);}
  12%{box-shadow:0 0 0 3px rgba(79,140,255,.55);background:rgba(79,140,255,.24);}
  100%{box-shadow:0 0 0 3px rgba(79,140,255,0);background:rgba(79,140,255,0);}
}
/* 系统开启「减少动效」：.set-flash 闪圈收敛为近乎瞬时。
 * 控制台/落地页的「全部动画与过渡」broad 覆盖由 main.css 顶部 prefers-reduced-motion 块（*,*::before,*::after）
 * 统一处理，与 stage.css:941 舞台端一致。display.html 不加载 main.css，仅影响控制台(index/tool)。 */
@media (prefers-reduced-motion:reduce){
  .set-flash{animation-duration:.01s;}
}
/* R344 美化补充：降低动效偏好下关掉平滑滚动与位移，保持无障碍一致 */
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto;}
  .info-main .info-card:hover,.to-top:hover,.email-copy:hover,.info-site-link:hover{transform:none;}
}
