:root{
  --bg:#0e1116; --panel:#161b22; --panel2:#1c2330; --line:#2a3341;
  --fg:#e6edf3; --dim:#8b98a8; --accent:#3b82f6; --accent2:#22c55e;
  --warn:#f59e0b; --bad:#ef4444; --radius:12px;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0;background:var(--bg);color:var(--fg);
  font:14px/1.55 -apple-system,"Segoe UI","Microsoft YaHei",system-ui,sans-serif}
a{color:var(--accent);text-decoration:none}
.wrap{max-width:1400px;margin:0 auto;padding:18px 16px 80px}
h1{font-size:20px;margin:0 0 4px;letter-spacing:.5px}
h1 small{color:var(--dim);font-weight:400;font-size:12px;margin-left:8px}
.sub{color:var(--dim);font-size:12px;margin-bottom:16px}
.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:14px;margin-bottom:14px}
.card h2{font-size:14px;margin:0 0 10px;color:var(--dim);font-weight:600;letter-spacing:.4px;text-transform:none}
.row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.dm-credential-row{display:grid;grid-template-columns:130px 220px max-content minmax(0,1fr);align-items:center;gap:8px}
.dm-credential-row>input{width:220px;max-width:100%;text-align:left}
.dm-credential-row>.hint{min-width:0}
@media(max-width:700px){.dm-credential-row{grid-template-columns:1fr;justify-items:start}.dm-credential-row>input{width:min(100%,320px)}}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.overview-grid{align-items:stretch}
.hdrow{position:relative;display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
.desktop-head-actions{display:flex;align-items:center;gap:10px;flex:0 0 auto}
.desktop-theme-toggle{position:static;flex:0 0 auto;padding:8px 14px;font-weight:700;box-shadow:0 4px 18px rgba(0,0,0,.25)}
.desktop-shutdown{position:static;flex:0 0 auto;padding:8px 14px;font-weight:700!important;border-color:#dc2626!important;color:#fecaca!important;background:rgba(220,38,38,.12)!important}
.desktop-shutdown:hover{background:#dc2626!important;color:#fff!important;border-color:#dc2626!important}
html[data-theme="light"] button.ghost.desktop-shutdown{background:#fff1f2!important;border-color:#b91c1c!important;color:#991b1b!important}
html[data-theme="light"] button.ghost.desktop-shutdown:hover{background:#b91c1c!important;border-color:#991b1b!important;color:#fff!important}
.shutdown-screen{min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:24px;text-align:center;background:var(--bg);color:var(--fg)}
.shutdown-screen h1{font-size:26px}.shutdown-screen p{color:var(--dim)}
@media(min-width:861px){.overview-grid>.card{height:640px;min-height:640px;max-height:640px;overflow:auto;scrollbar-gutter:stable}}
@media(max-width:860px){.overview-grid{align-items:start}.hdrow{align-items:center}}
.grid1{display:grid;grid-template-columns:1fr;gap:14px}
.grid2>*,.grid1>*{min-width:0}
@media(max-width:860px){.grid2{grid-template-columns:1fr}}
input,select,textarea,button{font:inherit;color:var(--fg);background:var(--panel2);max-width:100%;
  border:1px solid var(--line);border-radius:9px;padding:8px 10px;outline:none}
input:focus,select:focus,textarea:focus{border-color:var(--accent)}
button{cursor:pointer;transition:.15s}
button:hover{border-color:var(--accent);background:#222b3a}
button.primary{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:600}
button.primary:hover{background:#2f74e0}
button.danger{background:#dc2626;border-color:#dc2626;color:#fff;font-weight:600}
button.danger:hover{background:#b91c1c;border-color:#b91c1c}
.share-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 8px}
.share-actions button{white-space:nowrap}
.share-actions #shareState{flex:1 1 220px;min-width:0;overflow-wrap:anywhere}
.adv-toggle{display:inline-flex;align-items:center;gap:8px;min-height:42px;padding:8px 14px;
  border:1px solid var(--accent);border-radius:10px;background:rgba(59,130,246,.16);
  color:#bfdbfe;font-weight:700;cursor:pointer;list-style:none;user-select:none}
.adv-toggle::-webkit-details-marker{display:none}
.adv-toggle::after{content:"展开 ▾";font-size:12px;margin-left:10px;color:#93c5fd}
details[open]>.adv-toggle::after{content:"收起 ▴"}
.adv-toggle:hover{background:rgba(59,130,246,.26)}
html[data-theme="light"] .adv-toggle{color:#1d4ed8;background:#dbeafe}
button.good{background:var(--accent2);border-color:var(--accent2);color:#04210f;font-weight:600}
button.ghost{background:rgba(71,85,105,.18);border-color:#52627a;color:#dbe7f6;box-shadow:0 1px 0 rgba(255,255,255,.03) inset}
button.ghost:hover{background:rgba(59,130,246,.18);border-color:#60a5fa;color:#fff}
button.ghost:focus-visible{border-color:#60a5fa;box-shadow:0 0 0 2px rgba(59,130,246,.3)}
button:disabled{opacity:.45;cursor:not-allowed}
.pill{display:inline-block;padding:2px 8px;border-radius:999px;font-size:11px;border:1px solid var(--line);color:var(--dim)}
.pill.on{background:rgba(34,197,94,.15);border-color:rgba(34,197,94,.5);color:#7ee2a8}
.pill.off{background:rgba(239,68,68,.12);border-color:rgba(239,68,68,.45);color:#fca5a5}
.kv{display:grid;grid-template-columns:auto 1fr;column-gap:12px;row-gap:3px;font-size:13px;align-items:center}
.kv b{color:var(--dim);font-weight:500}
.kv>b,.kv>span{min-height:28px;display:flex;align-items:center;line-height:1.4}
.room-code-row{display:flex;align-items:center;gap:10px;min-width:0}
.room-code-text{display:inline-flex;align-items:center;font:700 15px/1.4 Consolas,monospace;color:var(--fg)}
.room-code-row button{padding:3px 10px}
.credential-status-line{margin:0 0 8px;min-height:28px;display:flex;align-items:center;gap:6px;white-space:nowrap;overflow-x:auto;overflow-y:hidden;font-size:12px}
.credential-status-line .pinnow{display:inline-flex !important;align-items:center;gap:6px;margin:0 !important;flex:0 0 auto;flex-wrap:nowrap !important}
.custom-domain-hint{margin:-2px 0 9px 138px;line-height:1.6;color:var(--dim)}
@media(max-width:700px){.custom-domain-hint{margin-left:0}}
.qr-entry-list{display:flex;flex-direction:column;gap:7px;margin:0 0 10px}
.qr-entry-row{display:flex;align-items:center;gap:12px;min-height:46px;padding:7px 9px;border:1px solid #35445a;border-radius:10px;background:rgba(15,23,42,.34)}
.qr-entry-copy{display:flex;align-items:center;gap:9px;flex:1 1 auto;min-width:0}
.qr-entry-copy>b{flex:0 0 132px;color:#dbe7f6;font-size:12.5px}
.qr-entry-copy .hint{flex:1 1 auto;min-width:0}
.qr-open-btn{flex:0 0 auto;white-space:nowrap;font-weight:600}
.link-qr-modal{position:fixed;inset:0;z-index:10070;display:flex;align-items:center;justify-content:center;padding:18px;background:rgba(3,6,12,.8)}
.link-qr-dialog{position:relative;width:min(390px,94vw);padding:18px;background:#111827;border:1px solid #52627a;border-radius:14px;text-align:center;box-shadow:0 24px 70px rgba(0,0,0,.6)}
.link-qr-title{font-size:16px;font-weight:700;margin:0 30px 5px}
.link-qr-note{margin-bottom:10px}
.link-qr-close{position:absolute;right:8px;top:7px;width:34px;height:34px;padding:0;border-color:#52627a;background:#1e293b;color:#cbd5e1}
.link-qr-image{display:block;width:max-content;margin:0 auto 10px}
.link-qr-image img{width:min(260px,70vw);height:min(260px,70vw)}
.link-qr-url{max-height:72px;overflow:auto;text-align:left;margin-bottom:10px}
.link-qr-actions{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.link-qr-actions button{width:100%;min-width:0}
@media(max-width:700px){.qr-entry-copy{align-items:flex-start;flex-direction:column;gap:2px}.qr-entry-copy>b{flex:auto}.qr-entry-row{align-items:center}}
.code{font:13px/1.4 Consolas,monospace;background:#0b0f14;border:1px dashed var(--line);
  border-radius:8px;padding:6px 8px;word-break:break-all}
.urlbox{font:12px/1.45 Consolas,monospace;background:#0b0f14;border:1px solid var(--line);
  border-radius:8px;padding:7px 9px;word-break:break-all;color:#9fd0ff;cursor:copy}
.stages{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:8px}
.stage{display:flex;align-items:center;gap:8px;background:var(--panel2);border:1px solid var(--line);
  border-radius:9px;padding:8px 10px;font-size:13px}
.stage .n{flex:0 0 26px;color:var(--dim);font:12px/1 Consolas,monospace}
.stage .t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.stage.done{opacity:.55}
.stage.cur{border-color:var(--accent);box-shadow:0 0 0 1px rgba(59,130,246,.35) inset}
.stage.lock{opacity:.35}
/* ★S9.25：没轮到的行按钮直接点不动（爷爷：没轮到的节点要「无法选中点击」） */
.stage.lock button{pointer-events:none;cursor:not-allowed}
.stage.lock button:disabled{opacity:1}
.stage button{flex:0 0 auto;padding:4px 10px;font-size:12px;border-radius:7px}
.players{display:flex;flex-direction:column;gap:6px}
.pl{display:flex;align-items:center;gap:8px;font-size:13px;background:var(--panel2);
  border:1px solid var(--line);border-radius:8px;padding:7px 9px}
/* ★S9.07②：名字优先吃宽度（下拉框已缩半），角色/书名放不下就省略号 */
.pl .nm{flex:1 1 auto;min-width:76px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pl .rl{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pl .rl{color:var(--dim);font-size:12px}
.dot{width:7px;height:7px;border-radius:50%;background:var(--accent2);flex:0 0 auto}
.dot.off{background:#475569}
/* ★S9.06⑧b：心测逐题详情弹层 */
.psy-list{display:flex;flex-direction:column;gap:10px}
.psy-q{background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:10px 12px}
.psy-qt{font-size:13px;font-weight:600;margin-bottom:6px;color:#dbe6f5}
.psy-opt{font-size:12.5px;line-height:1.6;color:var(--dim);padding:2px 0}
.psy-opt.on{color:#e6edf3;font-weight:600}
.psy-opt .psy-sc{color:#8b98a8;font-weight:400}
.psy-opt.on .psy-sc{color:#7ee2a8}
/* ② 当前房间卡片里的事件流（S9.06⑥ 从独立卡片搬进来） */
#log{font:12px/1.5 Consolas,monospace;background:#0b0f14;border:1px solid var(--line);
  border-radius:8px;padding:8px;height:360px;min-height:360px;max-height:360px;flex:none;overflow:auto;white-space:pre-wrap;color:#8ff0b0}
.qr{background:#fff;border-radius:10px;padding:8px;display:inline-block}
.qr img{display:block;width:190px;height:190px;image-rendering:pixelated}
.hint{color:var(--dim);font-size:12px;overflow-wrap:anywhere}
.warnbox{background:rgba(245,158,11,.1);border:1px solid rgba(245,158,11,.4);color:#fcd34d;
  border-radius:9px;padding:9px 11px;font-size:12px;margin-top:10px}
.toast{position:fixed;left:50%;bottom:26px;transform:translateX(-50%) translateY(6px);background:#0b1220;
  border:1px solid var(--line);border-radius:10px;padding:10px 16px;font-size:13.5px;font-weight:600;color:#e8eefc;
  opacity:0;transition:.18s ease;pointer-events:none;z-index:10060;box-shadow:0 10px 30px rgba(0,0,0,.55)}
.toast.on{opacity:1;transform:translateX(-50%) translateY(0)}
.toast.ok{background:#062e1b;border-color:#22c55e;color:#86efac}
.toast.err{background:#3a0d0d;border-color:#ef4444;color:#fca5a5}
/* ---- ⑥ 音频管理 / ⑨ 视频管理 ---- */
.audiobar { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin:6px 0 4px; }
.audiobar input[type=range] { height: 18px; }
.audiolist { max-height: 420px; overflow:auto; border:1px solid #23304a; border-radius:10px; margin-top:8px; }
.audiorow { display:flex; align-items:center; gap:10px; padding:6px 10px; border-bottom:1px solid #1b2437; font-size:13px; }
.audiorow:last-child { border-bottom:none; }
.audiorow.cur { background:#12233d; }
.audiorow .id { width:34px; color:#7f8ea6; font-variant-numeric: tabular-nums; }
.audiorow .ttl { flex:1; color:#dbe6f5; }
.audiorow .tag { font-size:11px; padding:1px 6px; border-radius:999px; border:1px solid #3a4b66; color:#9fb3cf; }
.audiorow .tag.once { border-color:#7f5a1d; color:#e0b265; }
.audiorow .tag.off { border-color:#6b2a2a; color:#e08585; }
.audiorow button { padding:3px 10px; font-size:12px; }
.videolist { display:flex; gap:12px; flex-wrap:wrap; margin-top:8px; }
.videocard { width:300px; border:1px solid #23304a; border-radius:10px; overflow:hidden; background:#0f1523; }
.videocard img { width:100%; display:block; }
.videocard .vb { padding:8px 10px; }
.videocard .vt { font-size:14px; color:#e6eefb; }
.videocard .vd { font-size:12px; color:#90a2ba; margin:2px 0 6px; }
.vidmodal { position:fixed; inset:0; background:rgba(3,6,12,.82); display:none; align-items:center; justify-content:center; z-index:50; }
.vidmodal.on { display:flex; }
.vidbox { width:min(880px,92vw); background:#0d1220; border:1px solid #24304a; border-radius:12px; padding:12px; }
.vidbox video { width:100%; max-height:70vh; background:#000; border-radius:8px; }
.faqtab { margin:8px 0; }
.faqtab h4 { margin:0 0 4px; font-size:13px; color:#9fc2ff; }
.faqtab .qa { font-size:12.5px; color:#c6d3e6; margin:2px 0 2px 8px; }
.faqtab .an { color:#8fa0b8; margin-left:8px; }

/* S8.48 玩家行 + 心测评分（roleScores 原值） */
.plwrap{display:flex;flex-direction:column;gap:4px}
.pl .plbtns{display:flex;align-items:center;gap:8px;flex:0 0 auto;min-width:0}
.pl-scores{display:flex;flex-wrap:wrap;gap:4px;align-items:center;padding:0 4px 2px 24px}
.pl-scores .sc-hint{color:var(--dim);font-size:11px}
.pl-scores .chip{font-size:11px;line-height:1.7;padding:0 7px;border-radius:999px;border:1px solid var(--line);background:#0f1620;color:var(--dim)}
.pl-scores .chip b{color:#cbd5e1;font-weight:600}
.pl-scores .chip.top{border-color:#4ade80;background:rgba(74,222,128,.12);color:#4ade80}
.pl-scores .chip.top b{color:#4ade80}
.pl-scores .rec{font-size:11px;color:#fbbf24}


/* ★S9.05：自绘 range 进度/音量条
   原生 input[type=range] 的轨道两端各留了「半个滑块」的内边距，所以 value=0 时滑块不贴最左端
   （爷爷图1 反馈的那段空隙）。这里改成自绘：滑块贴左端，蓝色已播长度 = 滑块中心位置（--fill 由 JS 按像素写入）。 */
.audiobar input[type=range]{
  -webkit-appearance:none; appearance:none;
  --fill:0px; --track:#2c3a52;
  height:18px; padding:0; border:none; background:transparent;
}
.audiobar input[type=range]::-webkit-slider-runnable-track{
  height:8px; border-radius:999px;
  background:linear-gradient(90deg, var(--accent,#2f7cf6) 0 var(--fill,0px), var(--track,#2c3a52) var(--fill,0px) 100%);
}
.audiobar input[type=range]::-webkit-slider-thumb{
  -webkit-appearance:none; appearance:none;
  width:12px; height:12px; border:2px solid #0b1220; border-radius:50%;
  background:var(--accent,#2f7cf6); margin-top:-2px;
}
.audiobar input[type=range]:focus{ outline:none; }
.audiobar input[type=range]::-moz-range-track{ height:8px; border-radius:999px; background:var(--track,#2c3a52); }
.audiobar input[type=range]::-moz-range-progress{ height:8px; border-radius:999px; background:var(--accent,#2f7cf6); }
.audiobar input[type=range]::-moz-range-thumb{ width:12px; height:12px; border:2px solid #0b1220; border-radius:50%; background:var(--accent,#2f7cf6); }

/* ★S9.07①：② 当前房间 与 ③ 扫码进房 左右等高；左栏事件流自动撑满留白（右边展开「高级」时跟着变高） */
.grid2 > .card{display:flex;flex-direction:column;min-height:0}

/* ★S9.13 卡片标题右侧动作按钮（② 当前房间 · 结束房间） */
.card h2.h2act{display:flex;align-items:center;justify-content:space-between;gap:10px}
.card h2.h2act>span{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.card h2.h2act .btn-sm{flex:0 0 auto;padding:3px 10px;font-size:12px;line-height:1.15;height:26px;
  border-radius:7px;border-color:#7f1d1d;color:#fca5a5;background:transparent;margin:0}
.card h2.h2act .btn-sm:hover{background:rgba(239,68,68,.12);border-color:#b91c1c}
/* ★S9.36：所有「刷新」按钮统一绿色（爷爷指定）。深色主题亮绿，浅色主题深绿（保证对比度）。 */
button.btn-refresh{color:#4ade80;border-color:rgba(34,197,94,.5);background:rgba(34,197,94,.1);font-weight:600}
button.btn-refresh:hover{border-color:#22c55e;background:rgba(34,197,94,.2);color:#86efac}
button.btn-refresh:disabled{opacity:.55;cursor:default}
/* ★S9.37：h2act 里的「结束房间」是红色 .btn-sm（权重 0,3,1），必须用更高权重把刷新按钮压成绿色 */
.card h2.h2act .btn-sm.btn-refresh{border-color:rgba(34,197,94,.5);color:#4ade80;background:rgba(34,197,94,.1)}
.card h2.h2act .btn-sm.btn-refresh:hover{background:rgba(34,197,94,.2);border-color:#22c55e;color:#86efac}
html[data-theme="light"] button.btn-refresh{color:#15803d;border-color:rgba(21,128,61,.45);background:rgba(34,197,94,.12)}
html[data-theme="light"] button.btn-refresh:hover{background:rgba(34,197,94,.24);border-color:#15803d;color:#14532d}
html[data-theme="light"] .card h2.h2act .btn-sm.btn-refresh{border-color:rgba(21,128,61,.45);color:#15803d;background:rgba(34,197,94,.12)}
html[data-theme="light"] .card h2.h2act .btn-sm.btn-refresh:hover{background:rgba(34,197,94,.24);border-color:#15803d;color:#14532d}

/* ★S9.13 ⑦ 线索库：一级=流程阶段（左栏），二级=角色（右上 chips），内容=正文+线索 */
.libwrap{display:grid;grid-template-columns:280px 1fr;gap:10px;margin-top:10px;align-items:start}
.libstages{max-height:520px;overflow:auto;border:1px solid #2c3a52;border-radius:9px;background:#0e1626}
.libstage{display:grid;grid-template-columns:26px 1fr;gap:6px;padding:7px 9px;cursor:pointer;border-bottom:1px solid #1b2740}
.libstage:hover{background:#16233a}
.libstage.sel{background:#1d3050;box-shadow:inset 3px 0 0 #2f7cf6}
.libstage.cur .no{color:#4ade80}
.libstage .no{color:#7b8ba6;font:600 12px/1.5 ui-monospace,Consolas,monospace;padding-top:1px}
.libstage .tt{font-size:12.5px;line-height:1.45;color:#dbe6f7;word-break:break-all}
.libstage .bd{grid-column:2;font-size:11px;color:#7b8ba6;display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.libstage .bd i{font-style:normal;border-radius:5px;padding:0 5px;line-height:16px;font-size:10.5px}
.libstage .bd .tagapp{background:#243b2a;color:#86efac}
.libstage .bd .tagcl{background:#3a2a12;color:#fcd34d}
.libstage .bd .tagcur{background:#1e3a5f;color:#93c5fd}
.libmain{min-width:0;border:1px solid #2c3a52;border-radius:9px;background:#0e1626;display:flex;flex-direction:column;min-height:300px}
.libroles{display:flex;flex-wrap:wrap;gap:6px;padding:8px 9px;border-bottom:1px solid #1b2740;position:sticky;top:0;background:#0e1626;z-index:2}
.libbody{max-height:470px;overflow:auto;padding:10px 12px}
.rchip{cursor:pointer;font-size:12px;line-height:1;padding:5px 9px;border-radius:999px;border:1px solid #33415c;background:#131f33;color:#c2d0e6;display:inline-flex;gap:5px;align-items:center}
.rchip i{font-style:normal;font-size:10px;color:#7b8ba6}
.rchip.on{background:#1d3050;border-color:#2f7cf6;color:#e8f1ff}
.rchip.on i{color:#93c5fd}
.chips{display:flex;flex-wrap:wrap;gap:5px;align-items:center;min-width:120px}
.chips .rchip{padding:4px 8px;font-size:11.5px}
.librole{border-left:2px solid #22334e;padding:2px 0 6px 10px;margin-bottom:10px}
.librole h4{margin:2px 0 8px;font-size:13px;color:#e6eefb}
.librole h4 small{font-weight:400;font-size:11px;color:#7b8ba6}
.libblock,.libclue{background:#111c2e;border:1px solid #22304a;border-radius:8px;padding:8px 10px;margin-bottom:8px}
.libclue{border-color:#4a3a16;background:#1a1508}
.libblock .srch,.libclue .srch,.libmedia .srch{font-size:10.5px;color:#7b8ba6;letter-spacing:.4px;margin-bottom:4px}
.libblock .txt,.libclue .txt{font-size:12.5px;line-height:1.7;color:#cfdcef;word-break:break-word;white-space:normal}
.libclue b{display:block;font-size:12.5px;color:#fcd34d;margin-bottom:4px}
.libmedia{background:#101b2b;border:1px solid #22304a;border-radius:8px;padding:8px 10px;margin-bottom:10px}
.libmedia .mline{font-size:12.5px;line-height:1.7;color:#cfdcef}
.mut{color:#7b8ba6}

/* ★S9.13 线索库 全局搜索结果里的「阶段」小标题 */
.libgh{display:flex;gap:6px;align-items:baseline;font-size:12px;color:#93c5fd;background:#132441;
  border:1px solid #24406b;border-radius:7px;padding:5px 8px;margin:10px 0 8px}
.libgh .no{font:600 11px/1 ui-monospace,Consolas,monospace;color:#60a5fa}
/* ================= ★S9.16 ================= */

/* 第 10 阶段：魂纹卡直接进入对应角色正文；点击图片仍可放大。 */
.lib-mirror-figure{display:flex;align-items:center;gap:12px;margin:0 0 10px;padding:10px;
  border:1px solid #31507a;border-radius:10px;background:#101d31}
.lib-mirror-card{width:132px;height:132px;object-fit:cover;flex:0 0 132px;background:#fff;border-radius:10px;display:block;cursor:zoom-in}
.lib-mirror-figure figcaption{display:flex;flex-direction:column;gap:5px;min-width:0}
.lib-mirror-figure figcaption b{font-size:14px;color:#e6eefb}
.lib-mirror-figure figcaption span{font-size:12px;color:#93a4bd}

/* ⑧ 搜索结果：与搜索词相同的字标红 */
mark.hl{background:transparent;color:#f87171;font-weight:700;padding:0 1px}

/* ★S9.17 线索库正文区里的「视频」行 = 可点击播放 */
.libmedia .mline.vid{display:block;width:100%;text-align:left;cursor:pointer;background:#0f1a2b;border:1px solid #2a3f5f;
  color:#cfe0f5;border-radius:8px;padding:7px 10px;margin:4px 0;font:inherit;font-size:12.5px;line-height:1.5}
.libmedia .mline.vid:hover{background:#152740;border-color:#3b82f6}
.libmedia .mline.vid b{color:#93c5fd;font-weight:600}

/* ★S9.17 音频行里的「循环/单次」徽章 = 可点击切换 */
.audiorow .tag.lt{cursor:pointer;background:transparent;font:inherit;font-size:11px;padding:1px 6px;border-radius:999px;
  border:1px solid #3a4b66;color:#9fb3cf;line-height:1.4;transition:.15s}
.audiorow .tag.lt:hover{background:#1b2a41;border-color:#3b82f6;color:#dbeafe}
.audiorow .tag.lt.once{border-color:#7f5a1d;color:#e0b265}
.audiorow .tag.lt.once:hover{background:#2a2011;border-color:#e0b265}

/* ================= ★S9.18 ================= */

/* ① ⑧ 线索库：把内容拉长填满整张卡（与 ⑨ 等高后留下的留白） */
@media(min-width:1101px){
  .lib-section > .card{display:flex;flex-direction:column;min-height:0}
  .lib-section > .card > .libwrap{flex:1 1 auto;min-height:0;align-items:stretch}
  .lib-section .libstages{max-height:none;height:auto}
  .lib-section .libmain{min-height:420px}
  .lib-section .libbody{max-height:none;flex:1 1 auto;min-height:0}
  .lib-section > .card > .row,.lib-section > .card > h2,.lib-section > .card > #voteBox{flex:0 0 auto}
}
/* ⑧ 线索库高度受控，内容再长也在模块内部滚动。 */
@media(min-width:1101px){
  .lib-section.wzcap{align-items:stretch}
  /* ＊S9.31①：在 S9.29 的「一屏 - 96px」基础上再增加 1/4（96×1.25=120，520×1.25=650） */
  .lib-section.wzcap > .card{height:max(650px, calc(125vh - 120px));overflow:hidden}
  .lib-section.wzcap .libwrap{min-height:0}
  .lib-section.wzcap .libstages{max-height:none;min-height:0;overflow:auto}
  .lib-section.wzcap .libmain{min-height:0}
  .lib-section.wzcap .libbody{max-height:none;min-height:0;overflow:auto}
}

/* ⑦a 音频：正在播放的那一行 —— 明显标识（左侧蓝条 + 蓝底 + 播放中徽章） */
.audiorow.cur{background:#132a4d;box-shadow:inset 4px 0 0 #3b82f6}
.audiorow.cur .ttl{color:#eaf3ff;font-weight:600}
.audiorow .tag.now{background:rgba(59,130,246,.18);border-color:#3b82f6;color:#bfdbfe;font-weight:600}
.audiorow .tag.now::before{content:""}
@keyframes wzpulse{0%,100%{opacity:1}50%{opacity:.55}}
.audiorow.cur .tag.now{animation:wzpulse 1.6s ease-in-out infinite}

/* ⑧ 线索库阶段列表顶部的小图例 */
.liblegend{display:flex;align-items:center;gap:6px;font-size:11.5px;color:#8b98a8;margin:0 0 8px;line-height:1.6;flex-wrap:wrap}
.liblegend i.tagapp{font-style:normal;border-radius:5px;padding:0 5px;line-height:16px;font-size:10.5px;background:#243b2a;color:#86efac}

/* ================= ★S9.18⑥ 浅色模式（明亮环境） =================
   一键切换：html[data-theme="light"]；深色仍是默认（不设属性）。 */
/* ★S9.24⑨：点图片放大（wzZoom）—— 电脑点任意处 / 手机点任意处关闭，Esc 也行 */
.wzzoom{position:fixed;inset:0;background:rgba(6,10,16,.9);display:none;align-items:center;justify-content:center;z-index:99999;cursor:zoom-out;padding:16px}
.wzzoom.on{display:flex}
.wzzoom img{max-width:94vw;max-height:86vh;width:auto;height:auto;background:#fff;border-radius:12px;padding:6px;box-shadow:0 20px 70px rgba(0,0,0,.55)}
.wzzoom-tip{position:absolute;left:0;right:0;bottom:calc(14px + env(safe-area-inset-bottom));text-align:center;color:#cbd5e1;font-size:13px;pointer-events:none}
#libBody img.lib-mirror-card,#qrBox img,#dmMobileQr img,#videoList .videocard img{cursor:zoom-in}

/* ★S9.20⑬：控制台里显示「当前口令」用的高亮块 */
.pinnowv{font-size:15px;letter-spacing:1px;background:#0b1a33;color:#7dd3fc;padding:2px 8px;border-radius:5px;user-select:all;border:1px solid #1e3a8a}
html[data-theme="light"] .pinnowv{background:#e0f2fe;color:#0369a1;border-color:#bae6fd}
html[data-theme="light"]{
  --bg:#eef1f6; --panel:#ffffff; --panel2:#f1f4f9; --line:#d5dce8;
  --fg:#16202e; --dim:#5b6b80; --accent:#2563eb; --accent2:#16a34a;
  --warn:#d97706; --bad:#dc2626;
}
html[data-theme="light"] .card{box-shadow:0 1px 2px rgba(15,23,42,.05)}
html[data-theme="light"] .card h2{color:#475569}
.room-list-table th{color:#c7d8f2;background:#26354b;border-bottom:2px solid #5b8de7;height:38px !important;font-weight:700;font-size:12px;letter-spacing:.25px}
.room-list-table .room-list-row td{background:var(--panel);border-top:1px solid var(--line)}
.room-list-table .room-list-row.is-current td{background:#16281c}
.room-list-table .room-list-row.is-selected td{background:#1b2b45;box-shadow:inset 3px 0 0 #2f7cf6}
.room-list-table .room-list-row td b{color:var(--fg)}
.room-list-table .room-current-label{color:#7dd3a0}
html[data-theme="light"] .room-list-table .room-list-row.is-current td{background:#e8f7ed;color:#17472b;border-top-color:#b7dec5}
html[data-theme="light"] .room-list-table .room-list-row.is-selected td{background:#e7f0ff;color:#173e81;border-top-color:#b6cdf9}
html[data-theme="light"] .room-list-table .room-current-label{color:#146c38}
html[data-theme="light"] .room-list-table th{color:#17345e;background:#dce9fa;border-bottom-color:#7aa6ea}
html[data-theme="light"] button:hover{background:#e6edf9}
html[data-theme="light"] button.ghost{background:#f8fafc;border-color:#94a3b8;color:#243247;box-shadow:0 1px 2px rgba(15,23,42,.06)}
html[data-theme="light"] button.ghost:hover{background:#e0ecff;border-color:#2563eb;color:#1e3a8a}
html[data-theme="light"] .qr-entry-row{background:#f8fafc;border-color:#cbd5e1}
html[data-theme="light"] .qr-entry-copy>b{color:#243247}
html[data-theme="light"] .link-qr-dialog{background:#fff;border-color:#94a3b8}
html[data-theme="light"] button.primary:hover{background:#1d4ed8}
html[data-theme="light"] .code,
html[data-theme="light"] .urlbox{background:#f4f7fc;color:#1d4ed8}
html[data-theme="light"] #log{background:#f7fafc;border-color:#d5dce8;color:#0f5132}
html[data-theme="light"] .pill.on{background:rgba(22,163,74,.12);border-color:rgba(22,163,74,.45);color:#15803d}
html[data-theme="light"] .pill.off{background:rgba(220,38,38,.1);border-color:rgba(220,38,38,.4);color:#b91c1c}
html[data-theme="light"] .stage{background:#f7f9fd}
html[data-theme="light"] .stage.cur{border-color:var(--accent);box-shadow:0 0 0 1px rgba(37,99,235,.25) inset}
html[data-theme="light"] .stage button{background:#fff}
/* ★S9.21⑥：上面这条会把「推送」主按钮的蓝底压成白底 → 白字看不见；这里把主按钮的颜色抢回来 */
html[data-theme="light"] .stage button.primary{background:var(--accent);border-color:var(--accent);color:#fff}
html[data-theme="light"] .pl{background:#f7f9fd}
html[data-theme="light"] .pl-scores .chip{background:#f1f4f9;color:#5b6b80}
html[data-theme="light"] .pl-scores .chip b{color:#1f2937}
html[data-theme="light"] .psy-q{background:#f7f9fd}
html[data-theme="light"] .psy-qt{color:#1f2937}
html[data-theme="light"] .psy-opt.on{color:#0f172a}
html[data-theme="light"] .warnbox{background:#fff7e6;border-color:#f0c36d;color:#8a5a00}
/* ⑧ 线索库 */
html[data-theme="light"] .libstages,
html[data-theme="light"] .libmain{background:#f8fafd;border-color:#dae1ec}
html[data-theme="light"] .libroles{background:#f8fafd;border-bottom-color:#e3e9f2}
html[data-theme="light"] .libstage{border-bottom-color:#e6ebf3}
html[data-theme="light"] .libstage:hover{background:#eef3fb}
html[data-theme="light"] .libstage.sel{background:#dbeafe;box-shadow:inset 3px 0 0 #2563eb}
html[data-theme="light"] .libstage .tt{color:#1f2937}
html[data-theme="light"] .libstage .bd,
html[data-theme="light"] .libstage .no{color:#64748b}
html[data-theme="light"] .libstage.cur .no{color:#15803d}
html[data-theme="light"] .libstage .bd .tagapp{background:#dcfce7;color:#15803d}
html[data-theme="light"] .libstage .bd .tagcl{background:#fef3c7;color:#92400e}
html[data-theme="light"] .libstage .bd .tagcur{background:#dbeafe;color:#1d4ed8}
html[data-theme="light"] .rchip{background:#eef2f8;border-color:#cfd8e6;color:#334155}
html[data-theme="light"] .rchip i{color:#64748b}
html[data-theme="light"] .rchip.on{background:#dbeafe;border-color:#2563eb;color:#1e3a8a}
html[data-theme="light"] .rchip.on i{color:#1d4ed8}
html[data-theme="light"] .librole{border-left-color:#c7d5ea}
html[data-theme="light"] .librole h4{color:#0f172a}
html[data-theme="light"] .librole h4 small{color:#64748b}
html[data-theme="light"] .libblock{background:#fff;border-color:#dbe3ef}
html[data-theme="light"] .libclue{background:#fffbeb;border-color:#f0d9a8}
html[data-theme="light"] .libblock .srch,
html[data-theme="light"] .libclue .srch,
html[data-theme="light"] .libmedia .srch{color:#64748b}
html[data-theme="light"] .libblock .txt,
html[data-theme="light"] .libclue .txt,
html[data-theme="light"] .libmedia .mline{color:#25313f}
html[data-theme="light"] .libclue b{color:#92400e}
html[data-theme="light"] .libmedia{background:#f4f8ff;border-color:#d7e3f5}
html[data-theme="light"] .lib-mirror-figure{background:#eef4ff;border-color:#9bb9e2}
html[data-theme="light"] .lib-mirror-figure figcaption b{color:#172033}
html[data-theme="light"] .lib-mirror-figure figcaption span{color:#52647d}
html[data-theme="light"] .libmedia .mline.vid{background:#eef4ff;border-color:#c7d9f7;color:#1e3a8a}
html[data-theme="light"] .libmedia .mline.vid b{color:#1d4ed8}
html[data-theme="light"] .libgh{background:#e8f1ff;border-color:#c7d9f7;color:#1d4ed8}
html[data-theme="light"] .libgh .no{color:#2563eb}
html[data-theme="light"] .mut{color:#64748b}
/* ⑥ 音频 */
html[data-theme="light"] .audiorow{border-bottom-color:#e6ebf3}
html[data-theme="light"] .audiorow .id{color:#64748b}
html[data-theme="light"] .audiorow .ttl{color:#1f2937}
html[data-theme="light"] .audiorow.cur{background:#dbeafe;box-shadow:inset 4px 0 0 #2563eb}
html[data-theme="light"] .audiorow.cur .ttl{color:#1e3a8a}
html[data-theme="light"] .audiorow .tag{border-color:#cbd5e1;color:#475569}
html[data-theme="light"] .audiorow .tag.once{border-color:#d0a24a;color:#92610e}
html[data-theme="light"] .audiorow .tag.off{border-color:#e3a3a3;color:#b91c1c}
html[data-theme="light"] .audiorow .tag.now{background:#dbeafe;border-color:#2563eb;color:#1d4ed8}
html[data-theme="light"] .audiorow .tag.lt:hover{background:#e2eaf7;border-color:#2563eb;color:#1d4ed8}
html[data-theme="light"] .audiorow button{background:#fff}
html[data-theme="light"] .audiobar input[type=range]::-webkit-slider-thumb{border-color:#fff}
/* ⑨ 视频 */
html[data-theme="light"] .videocard{background:#fff;border-color:#dbe3ef}
html[data-theme="light"] .videocard .vt{color:#0f172a}
html[data-theme="light"] .videocard .vd{color:#5b6b80}
html[data-theme="light"] .vidbox{background:#fff;border-color:#dbe3ef}
html[data-theme="light"] .toast{background:#fff;border-color:#d5dce8;color:#16202e;box-shadow:0 10px 30px rgba(15,23,42,.18)}
html[data-theme="light"] .toast.ok{background:#e8f8ef;border-color:#16a34a;color:#15803d}
html[data-theme="light"] .toast.err{background:#fdecec;border-color:#dc2626;color:#b91c1c}
/* 手机端（/m/dm） */
html[data-theme="light"] .m-head{background:#fff;border-bottom-color:#dbe3ef}
html[data-theme="light"] .m-title{color:#16202e}
html[data-theme="light"] .m-hsub{color:#334155}
html[data-theme="light"] .m-hsub #mRoom{color:#1d4ed8}
html[data-theme="light"] .m-hsub #mStage,
html[data-theme="light"] .m-hsub2{color:#64748b}
html[data-theme="light"] .m-tabs{background:#fff;border-top-color:#dbe3ef}
html[data-theme="light"] .m-tabbtn{color:#64748b}
html[data-theme="light"] .m-tabbtn.on{color:#1d4ed8;background:linear-gradient(180deg,rgba(37,99,235,.12),transparent)}
html[data-theme="light"] .m-tabbtn:active{background:#eef2f8}
html[data-theme="light"] .m-subtabs{background:#fff;border-top-color:#dbe3ef}
html[data-theme="light"] .m-subbtn{color:#64748b}
html[data-theme="light"] .m-subbtn.on{color:#1d4ed8;background:rgba(37,99,235,.1)}
html[data-theme="light"] .m-segbtn{background:#eef2f8;border-color:#d5dce8;color:#475569}
html[data-theme="light"] .m-segbtn.on{background:#dbeafe;border-color:#2563eb;color:#1e3a8a}
html[data-theme="light"] .m-selfurl{background:#f4f7fc;border-color:#d5dce8;color:#1d4ed8}
html[data-theme="light"] .m-pill{background:#eef2f8;border-color:#cfd8e6;color:#1d4ed8}
html[data-theme="light"] .m-lbl{color:#5b6b80}
html[data-theme="light"] .m-hr{border-top-color:#e3e9f2}
html[data-theme="light"] .m-pinrow{background:#f4f7fc;border-color:#dbe3ef}
html[data-theme="light"] .m-roomcard{background:#f7f9fd;border-color:#dbe3ef}
html[data-theme="light"] .m-roomcard.cur{background:#eafaf0;border-color:#8fce9f}
html[data-theme="light"] .m-roomcard.sel{background:#e8f1ff;border-color:#2563eb}
html[data-theme="light"] .m-rcode{color:#16202e}
html[data-theme="light"] .m-rpl{color:#1d4ed8}
html[data-theme="light"] .m-rline{color:#25313f}
html[data-theme="light"] .m-rline i{color:#64748b}
html[data-theme="light"] .m-chkall{color:#334155}
html[data-theme="light"] .pin-gate{background:radial-gradient(120% 80% at 50% 0%,#e8effc 0%,#eef1f6 60%)}
html[data-theme="light"] .pin-card{background:#fff;border-color:#dbe3ef}
html[data-theme="light"] .pin-input{background:#f4f7fc;border-color:#d5dce8;color:#16202e}
html[data-theme="light"] .pin-sub,
html[data-theme="light"] .pin-foot{color:#64748b}
html[data-theme="light"] .m-boot{background:#eef1f6}
html[data-theme="light"] .m-boottxt{color:#5b6b80}
html[data-theme="light"] .m-foldhead{background:#f1f4f9;border-color:#d5dce8;color:#16202e}
