/* ============================================================
   LoRA Studio v4 — GROUND STATION / Mission Control
   实证配色: Grafana dark 源码分层(palette.ts 真验) + SpaceX Dragon 单墨哲学
            + Apollo CRT 琥珀磷光 #ffb000 + NASA 官方告警红 #fc3d21
   零外发光 · 零假纹理渐变 · amber 单主墨 + cyan 次墨(克制) · 发丝网格 · tabular 数字
   字体: IBM Plex Sans/Mono (本地 woff2 离线, IBM 工业血统) · fallback Consolas
   材质: feTurbulence 真颗粒(soft-light) + 纯CSS 1px 发丝网格 (fixed 层防重绘)
   ============================================================ */

@font-face{font-family:"Plex Sans";src:url("fonts/IBMPlexSans-400.woff2") format("woff2");font-weight:400;font-display:swap}
@font-face{font-family:"Plex Sans";src:url("fonts/IBMPlexSans-500.woff2") format("woff2");font-weight:500;font-display:swap}
@font-face{font-family:"Plex Sans";src:url("fonts/IBMPlexSans-600.woff2") format("woff2");font-weight:600;font-display:swap}
@font-face{font-family:"Plex Mono";src:url("fonts/IBMPlexMono-400.woff2") format("woff2");font-weight:400;font-display:swap}
@font-face{font-family:"Plex Mono";src:url("fonts/IBMPlexMono-500.woff2") format("woff2");font-weight:500;font-display:swap}

:root{
  /* —— 底 / 分层 (Grafana 结构, 压暗半档贴 near-black 航天舱) —— */
  --bg:#0a0c10; --inset:#0d1015; --s1:#12151b; --s2:#1a1e26; --s3:#242a34;
  /* —— 边框: 透明叠加(非实色) — 发丝网格 / 分隔线同源 —— */
  --bd:rgba(200,210,225,.10); --bd-i:rgba(200,210,225,.16); --bd-strong:rgba(200,210,225,.26);
  --hair:rgba(180,200,220,.09);                          /* 蓝图网格线 — 提到看得见 */
  --dot:rgba(165,190,215,.07);                           /* 仪表穿孔点纹 (heropatterns/ooorganize 点阵) */
  --scan:rgba(0,0,0,.22);                                /* CRT 扫描线 (暗线乘色) */
  /* —— 文本: 冷白带蓝(非纯白, 克制关键). v5.1: --tx3 #5d6776→#7a8494 WCAG 3.4:1→4.5:1 AA —— */
  --tx:#ccd2de; --tx2:#8b96a6; --tx3:#7a8494; --faint:#3f4855; --ghost:#2a313c;
  /* —— 数据墨水: amber 主(Apollo 磷光) / cyan 副(Dragon) — 墨非光 —— */
  --acc:#ffb000; --acc-tx:#ffbf3d; --acc-dk:#b3800f;
  --acc-fill:rgba(255,176,0,.10); --acc-ring:rgba(255,176,0,.42);
  --ice:#2de2e6; --ice-tx:#5beef0; --ice-fill:rgba(45,226,230,.10);
  --ok:#30d158; --warn:#ffb300; --danger:#fc3d21;
  --r:5px; --r-sm:3px; --r-lg:8px;
  --hl:inset 0 1px 0 rgba(255,255,255,.05);            /* 顶边受光 (非发光) */
  --sh1:0 1px 2px rgba(0,0,0,.5);
  --sh2:0 2px 4px rgba(0,0,0,.5), 0 18px 40px -16px rgba(0,0,0,.7);  /* 柔黑 ambient */
  --fz-disp:"Plex Sans","Bahnschrift","Segoe UI",sans-serif;
  --fz-body:"Plex Sans","Segoe UI",system-ui,sans-serif;
  --fz-mono:"Plex Mono","Cascadia Code","Consolas",ui-monospace,monospace;
  --ease:cubic-bezier(.16,1,.3,1);
}

*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{
  font-family:var(--fz-body); color:var(--tx); background:var(--bg);
  font-size:13px; line-height:1.5; overflow:hidden; isolation:isolate;
  -webkit-font-smoothing:antialiased; text-rendering:optimizeLegibility;
}
/* v5.1: film grain (body::after fractalNoise) 撤 — tribunal D-32 visionOS 方向纯化 */
/* 全屏 1px 发丝网格 (纯CSS, 实证 Stefan Judis) + 极淡扫描线 — 固定层 */
.grid-layer{
  position:fixed; inset:0; z-index:0; pointer-events:none;
  background-image:
    linear-gradient(90deg, var(--hair) 1px, transparent 1px),
    linear-gradient(var(--hair) 1px, transparent 1px),
    repeating-linear-gradient(to bottom, rgba(140,170,200,.018) 0 1px, transparent 1px 3px);
  background-size:34px 34px, 34px 34px, 100% 3px;
  -webkit-mask-image:radial-gradient(120% 100% at 50% 0%, #000 55%, transparent 100%);
  mask-image:radial-gradient(120% 100% at 50% 0%, #000 55%, transparent 100%);
}
.vignette{position:fixed; inset:0; z-index:0; pointer-events:none;
  background:radial-gradient(135% 100% at 50% 22%, transparent 58%, rgba(0,0,0,.5) 100%);}

::selection{background:var(--acc-fill); color:var(--acc-tx)}
*::-webkit-scrollbar{width:9px;height:9px}
*::-webkit-scrollbar-thumb{background:var(--s3);border-radius:9px;border:2px solid transparent;background-clip:padding-box}
*::-webkit-scrollbar-thumb:hover{background:#313a47}

/* ============ 布局骨架 ============ */
.app{position:relative; z-index:2; display:flex; flex-direction:column; height:100vh}

/* —— 站台条 STATION BAR —— */
header.topbar{
  display:flex; align-items:center; gap:14px; padding:0 18px;
  height:54px; flex:none;
  background:linear-gradient(180deg, var(--s1), var(--inset));
  border-bottom:1px solid var(--bd); box-shadow:var(--hl), 0 1px 0 rgba(0,0,0,.4);
  position:relative; z-index:5;
}
.mark{width:24px;height:24px;color:var(--acc);flex:none}
.wordmark{display:flex;flex-direction:column;gap:1px;line-height:1.05}
.wordmark .t{font-family:var(--fz-mono);font-weight:500;font-size:15px;letter-spacing:.14em;color:var(--tx)}
.wordmark .t .sep{color:var(--acc);margin:0 1px}
.wordmark .s{font-family:var(--fz-mono);font-size:9.5px;letter-spacing:.22em;color:var(--tx3);text-transform:uppercase}
.spacer{flex:1}

.readout{display:flex;flex-direction:column;align-items:flex-end;gap:2px;padding:0 13px;border-left:1px solid var(--hair);height:30px;justify-content:center}
.readout .k{font-family:var(--fz-mono);font-size:8.5px;letter-spacing:.18em;color:var(--tx3);text-transform:uppercase}
.readout .v{font-family:var(--fz-mono);font-size:12px;font-weight:500;color:var(--tx);font-variant-numeric:tabular-nums}
.readout.clock .v{color:var(--acc-tx);font-size:13px}

.pill{display:inline-flex;align-items:center;gap:7px;height:28px;padding:0 11px;border-radius:var(--r);
  background:var(--s2);border:1px solid var(--bd);font-family:var(--fz-mono);font-size:11px;letter-spacing:.04em;color:var(--tx2);
  font-variant-numeric:tabular-nums;white-space:nowrap}
.pill .dot{width:7px;height:7px;border-radius:50%;background:var(--tx3);flex:none;box-shadow:0 0 0 3px rgba(255,255,255,.03)}
.pill[data-phase="idle"] .dot{background:var(--tx3)}
.pill[data-phase="preprocess"],.pill[data-phase="upload"],.pill[data-phase="fetch"]{color:var(--ice-tx);border-color:rgba(45,226,230,.28)}
.pill[data-phase="preprocess"] .dot,.pill[data-phase="upload"] .dot,.pill[data-phase="fetch"] .dot{background:var(--ice);animation:beat 1.4s var(--ease) infinite}
.pill[data-phase="train"]{color:var(--acc-tx);border-color:var(--acc-ring)}
.pill[data-phase="train"] .dot{background:var(--acc);animation:beat 1.1s var(--ease) infinite}
.pill[data-phase="awaiting_confirm"]{color:var(--warn);border-color:rgba(255,179,0,.36)}
.pill[data-phase="awaiting_confirm"] .dot{background:var(--warn);animation:beat .8s steps(2,jump-none) infinite}
.pill[data-phase="done"]{color:var(--ok);border-color:rgba(48,209,88,.32)}
.pill[data-phase="done"] .dot{background:var(--ok)}
.pill[data-phase="error"],.pill[data-phase="aborted"]{color:var(--danger);border-color:rgba(252,61,33,.38)}
.pill[data-phase="error"] .dot,.pill[data-phase="aborted"] .dot{background:var(--danger)}
@keyframes beat{0%,100%{opacity:1}50%{opacity:.35}}

/* —— 主体 3 栏 —— */
.main{flex:1;display:grid;grid-template-columns:minmax(330px,1.05fr) 1.55fr minmax(290px,.95fr);min-height:0}
.col{display:flex;flex-direction:column;min-height:0;min-width:0;background:var(--bg);border-right:1px solid var(--bd);position:relative}
.col.right{border-right:none}
.col.center{background:var(--inset)}

.col-head{display:flex;align-items:center;gap:8px;height:36px;flex:none;padding:0 15px;
  font-family:var(--fz-mono);font-size:11px;font-weight:500;letter-spacing:.16em;color:var(--tx);text-transform:uppercase;
  border-bottom:1px solid var(--bd);background:linear-gradient(180deg,rgba(255,255,255,.018),transparent)}
.col-head .en{font-size:9px;letter-spacing:.2em;color:var(--tx3)}
.col-head .tick{width:5px;height:5px;border-radius:1px;background:var(--acc);flex:none;box-shadow:0 0 0 2px var(--acc-fill)}
.col-head .tick.ice{background:var(--ice);box-shadow:0 0 0 2px var(--ice-fill)}
.col-head .asst-state{margin-left:auto}

.scroll{flex:1;overflow-y:auto;padding:14px 15px 6px}

/* —— 配置块: 发丝线分组(非堆卡片) —— */
.block{padding:0 0 15px;margin-bottom:15px;border-bottom:1px solid var(--hair)}
.block:last-child{border-bottom:none;margin-bottom:0}
.lbl{display:flex;align-items:center;gap:8px;margin-bottom:11px;
  font-family:var(--fz-mono);font-size:10.5px;font-weight:500;letter-spacing:.14em;color:var(--tx2);text-transform:uppercase}
.lbl .ix{font-size:9.5px;color:var(--bg);background:var(--acc-dk);padding:2px 5px;border-radius:var(--r-sm);letter-spacing:.05em;font-weight:600}
.lbl .ic-lbl{width:14px;height:14px;color:var(--acc-tx);opacity:.92;flex:none}
.lbl .en{margin-left:auto;font-size:8.5px;letter-spacing:.2em;color:var(--tx3)}

.field{display:flex;flex-direction:column;gap:5px;margin-bottom:9px}
.field>label{font-family:var(--fz-mono);font-size:9.5px;letter-spacing:.06em;color:var(--tx3);text-transform:uppercase}
.row2{display:grid;grid-template-columns:1fr 1fr;gap:9px}
.row3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:9px}
.hint{font-size:10.5px;color:var(--tx3);line-height:1.45}

/* v5.1: input 平边 — 撤双层 inset 凹陷井 (v4.1 metal-skin 遗留, tribunal D-28) */
input[type=text],input[type=password],input[type=number],select,textarea{
  width:100%;font-family:var(--fz-body);font-size:12.5px;color:var(--tx);
  background:var(--inset);border:1px solid var(--bd);border-radius:var(--r);
  padding:7px 9px;outline:none;transition:border-color .14s var(--ease),box-shadow .14s var(--ease);
  box-shadow:none}
input::placeholder,textarea::placeholder{color:var(--faint)}
input:hover,select:hover,textarea:hover{border-color:var(--bd-i)}
input:focus,select:focus,textarea:focus{border-color:var(--acc);box-shadow:0 0 0 1px var(--acc-ring)}
input[type=number]{font-family:var(--fz-mono);font-variant-numeric:tabular-nums}
/* #30 原生目录 picker: 路径输入 + 📁 浏览按钮 */
.pick-row{display:flex;gap:6px;align-items:stretch}
.pick-row input{flex:1 1 auto;width:auto;min-width:0}
.pick-btn{flex:0 0 auto;padding:0 11px;font-size:14px;line-height:1;color:var(--tx);
  background:#0b0e13;border:1px solid rgba(0,0,0,.5);border-top-color:rgba(0,0,0,.65);border-radius:var(--r);
  box-shadow:inset 0 2px 4px rgba(0,0,0,.45), inset 0 -1px 0 rgba(255,255,255,.04);transition:border-color .16s var(--ease)}
.pick-btn:hover{border-color:var(--acc-ring)}
.pick-btn:active{box-shadow:inset 0 3px 6px rgba(0,0,0,.6)}
.pick-btn:disabled{opacity:.55;cursor:default}
textarea{resize:vertical;min-height:34px;max-height:120px;line-height:1.5}
select{appearance:none;cursor:pointer;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%235d6776' stroke-width='2.5' stroke-linecap='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 9px center;padding-right:26px}

/* —— 开关 toggle —— */
.toggle{display:flex;align-items:center;gap:9px;cursor:pointer;padding:6px 0;user-select:none}
.toggle input{display:none}
.toggle .tk{width:34px;height:18px;border-radius:9px;background:var(--s2);border:1px solid var(--bd);position:relative;flex:none;transition:.18s var(--ease);box-shadow:var(--hl)}
.toggle .tk::after{content:"";position:absolute;top:2px;left:2px;width:12px;height:12px;border-radius:50%;background:var(--tx3);transition:.18s var(--ease)}
.toggle input:checked+.tk{background:var(--acc-fill);border-color:var(--acc-ring)}
.toggle input:checked+.tk::after{transform:translateX(16px);background:var(--acc)}
.toggle .txt{font-size:12px;color:var(--tx2)}
.toggle:hover .txt{color:var(--tx)}

/* —— 按钮 —— */
button{font-family:var(--fz-body);cursor:pointer;border:none;background:none;color:inherit}
.ghost{display:inline-flex;align-items:center;justify-content:center;gap:7px;
  height:34px;padding:0 13px;border-radius:var(--r);background:var(--s2);border:1px solid var(--bd);
  color:var(--tx2);font-size:12px;font-weight:500;letter-spacing:.02em;
  transition:.16s var(--ease);box-shadow:var(--hl)}
.ghost .en{font-family:var(--fz-mono);font-size:9px;letter-spacing:.16em;color:var(--tx3)}
.ghost:hover{border-color:var(--bd-i);color:var(--tx);background:var(--s3)}
.ghost:active{transform:translateY(1px)}
.ghost.wide{width:100%;margin-top:3px}
.ghost.mini{height:24px;padding:0 9px;font-family:var(--fz-mono);font-size:10px;letter-spacing:.08em}
.ic16{width:15px;height:15px;flex:none}

.primary{display:inline-flex;align-items:center;justify-content:center;gap:8px;
  height:40px;padding:0 16px;border-radius:var(--r);
  background:linear-gradient(180deg,#ffbf2e,var(--acc));color:#1a1205;
  font-weight:600;font-size:13px;letter-spacing:.02em;
  border:1px solid var(--acc-dk);box-shadow:var(--hl),var(--sh1);transition:.16s var(--ease)}
.primary .en{font-family:var(--fz-mono);font-size:9.5px;letter-spacing:.16em;color:rgba(26,18,5,.6)}
.primary:hover{background:linear-gradient(180deg,#ffc94a,#ffb81a)}
.primary:active{transform:translateY(1px);box-shadow:var(--hl)}
.primary:disabled{background:var(--s2);color:var(--tx3);border-color:var(--bd);box-shadow:var(--hl);cursor:not-allowed}
.primary:disabled .en{color:var(--faint)}
.danger{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 11px;border-radius:var(--r);
  background:rgba(252,61,33,.1);border:1px solid rgba(252,61,33,.38);color:#ff7059;
  font-size:11.5px;font-weight:600;letter-spacing:.04em;transition:.16s var(--ease)}
.danger:hover{background:rgba(252,61,33,.18)}
.danger:active{transform:translateY(1px)}

.left-foot{flex:none;padding:12px 15px;border-top:1px solid var(--bd);background:linear-gradient(180deg,transparent,rgba(0,0,0,.2))}
.block-btn{width:100%}

.btn-msg{font-family:var(--fz-mono);font-size:10.5px;margin-top:6px;min-height:14px;letter-spacing:.02em;color:var(--tx3)}
.btn-msg.ok{color:var(--ok)}
.btn-msg.err{color:#ff7059}

/* —— 参数预览读数表 —— */
.params-preview{margin-top:10px;display:grid;grid-template-columns:auto 1fr;gap:1px;
  background:var(--bd);border:1px solid var(--bd);border-radius:var(--r);overflow:hidden}
.params-preview .k{font-family:var(--fz-mono);font-size:10px;letter-spacing:.04em;color:var(--tx3);
  background:var(--s1);padding:5px 9px;text-transform:uppercase}
.params-preview .v{font-family:var(--fz-mono);font-size:11.5px;color:var(--acc-tx);font-weight:500;
  background:var(--s1);padding:5px 9px;text-align:right;font-variant-numeric:tabular-nums}

/* ============ 中栏: 序列轨 + 遥测日志 ============ */
.stepper{flex:none;padding:11px 14px;display:flex;flex-wrap:wrap;gap:5px 6px;border-bottom:1px solid var(--bd);
  background:linear-gradient(180deg,rgba(255,255,255,.015),transparent)}
.step{display:inline-flex;align-items:center;gap:6px;height:23px;padding:0 9px 0 7px;border-radius:var(--r-sm);
  font-family:var(--fz-mono);font-size:10.5px;letter-spacing:.03em;
  background:var(--s1);border:1px solid var(--bd);color:var(--tx3);transition:.2s var(--ease)}
.step .ic{width:6px;height:6px;border-radius:50%;background:var(--ghost);flex:none;transition:.2s var(--ease)}
.step[data-st="pending"]{opacity:.6}
.step[data-st="done"]{color:var(--tx2);border-color:rgba(45,226,230,.2)}
.step[data-st="done"] .ic{background:var(--ice)}
.step[data-st="running"]{color:#1a1205;background:var(--acc);border-color:var(--acc-dk);font-weight:600}
.step[data-st="running"] .ic{background:#1a1205;animation:beat 1s var(--ease) infinite}

/* 日志面板: 深凹陷下沉屏 (强纵深) + margin 归零无缝贴合相邻面板 (程令) + 流动光边当能量 lip */
.console-wrap{flex:1;display:flex;flex-direction:column;min-height:0;margin:0;
  background:#05070a;border:none;border-radius:0;overflow:hidden;
  box-shadow:
    inset 0 8px 18px -4px rgba(0,0,0,.92),
    inset 0 3px 5px rgba(0,0,0,.85),
    inset 5px 0 16px -8px rgba(0,0,0,.72),
    inset -5px 0 16px -8px rgba(0,0,0,.72),
    inset 0 -6px 16px -6px rgba(0,0,0,.6),
    inset 0 0 26px rgba(45,226,230,.07),
    inset 0 -1px 0 rgba(255,255,255,.045)}
.console-head{display:flex;align-items:center;justify-content:space-between;height:30px;padding:0 11px;flex:none;
  background:rgba(255,255,255,.022);border-bottom:1px solid rgba(255,255,255,.05)}
.console-head .t{display:inline-flex;align-items:center;gap:7px;font-family:var(--fz-mono);font-size:10.5px;
  font-weight:500;letter-spacing:.12em;color:var(--tx2);text-transform:uppercase}
.console-head .t .en{font-size:8.5px;letter-spacing:.18em;color:var(--tx3)}
.console{flex:1;overflow-y:auto;padding:10px 12px;font-family:var(--fz-mono);font-size:11.5px;line-height:1.65}
.logline{display:flex;gap:8px;padding:1px 0;color:var(--tx2);white-space:pre-wrap;word-break:break-word;
  animation:lineIn .22s var(--ease)}
@keyframes lineIn{from{opacity:0;transform:translateY(2px)}to{opacity:1;transform:none}}
.logline .seq{color:var(--faint);flex:none;font-variant-numeric:tabular-nums;user-select:none}
.logline .ts{color:var(--tx3);flex:none;font-variant-numeric:tabular-nums}
.logline .stg{color:var(--ice-tx);flex:none}
.logline.warn{color:var(--warn)}
.logline.error{color:#ff7059}
.logline.success,.logline.ok{color:var(--ok)}

/* —— 组合空态 —— */
.empty{height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:7px;
  text-align:center;color:var(--tx3);padding:24px}
.ic-empty{width:34px;height:34px;color:var(--faint);margin-bottom:4px}
.empty .e-t{font-family:var(--fz-mono);font-size:11px;letter-spacing:.14em;color:var(--tx2);text-transform:uppercase}
.empty .e-s{font-size:11.5px;color:var(--tx3);max-width:30ch;line-height:1.5}

/* ============ 右栏: DeepSeek 助手 ============ */
.asst-state{display:inline-flex;align-items:center}
.asst-state .d{width:7px;height:7px;border-radius:50%;background:var(--tx3)}
.asst-state[data-st="off"] .d{background:var(--tx3)}
.asst-state[data-st="busy"] .d{background:var(--ice);animation:beat 1s var(--ease) infinite}
.asst-ctl{display:flex;align-items:center;gap:7px;padding:10px 15px;border-bottom:1px solid var(--bd);flex-wrap:wrap}
.seg{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 11px;border-radius:var(--r);
  background:var(--s2);border:1px solid var(--bd);color:var(--tx3);font-size:11.5px;transition:.16s var(--ease);box-shadow:var(--hl)}
.seg:hover{color:var(--tx2);border-color:var(--bd-i)}
.seg[data-on="1"]{color:var(--ice-tx);border-color:rgba(45,226,230,.34);background:var(--ice-fill)}
.seg:active{transform:translateY(1px)}
.perm{margin-left:auto;font-family:var(--fz-mono);font-size:9px;letter-spacing:.1em;color:var(--tx3);
  border:1px dashed var(--bd-i);padding:4px 7px;border-radius:var(--r-sm);text-transform:uppercase}

.chat{flex:1;overflow-y:auto;padding:14px 15px;display:flex;flex-direction:column;gap:10px}
.msg{max-width:88%;padding:8px 11px;border-radius:var(--r);font-size:12.5px;line-height:1.55;white-space:pre-wrap;word-break:break-word}
.msg.user{align-self:flex-end;background:var(--acc-fill);border:1px solid var(--acc-ring);color:var(--tx)}
.msg.asst{align-self:flex-start;background:var(--s2);border:1px solid var(--bd);color:var(--tx2)}
.asst-empty{margin:auto 0;align-items:center;display:flex;flex-direction:column;gap:7px}
.asst-empty .ds-mark{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:var(--r);
  background:var(--s2);border:1px solid var(--ice-fill);color:var(--ice-tx);font-family:var(--fz-mono);font-weight:600;font-size:14px;letter-spacing:.05em;margin-bottom:4px}
.asst-empty .ttl{font-family:var(--fz-mono);font-size:11px;letter-spacing:.12em;color:var(--tx2);text-transform:uppercase}
.asst-empty p{font-size:11.5px;color:var(--tx3);max-width:30ch;line-height:1.55;text-align:center}

.chat-input{flex:none;display:flex;gap:8px;align-items:flex-end;padding:11px 15px;border-top:1px solid var(--bd);background:linear-gradient(180deg,transparent,rgba(0,0,0,.2))}
.chat-input textarea{flex:1;min-height:36px;max-height:140px;font-size:12.5px;border-radius:var(--r)}
.send{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;flex:none;border-radius:var(--r);
  background:var(--ice-fill);border:1px solid rgba(45,226,230,.3);color:var(--ice-tx);transition:.16s var(--ease)}
.send:hover:not(:disabled){background:rgba(45,226,230,.18)}
.send:active:not(:disabled){transform:translateY(1px)}
.send:disabled{background:var(--s2);border-color:var(--bd);color:var(--faint);cursor:not-allowed}

/* ============ Checkpoint 弹层 ============ */
.overlay{position:fixed;inset:0;z-index:1000;display:none;align-items:center;justify-content:center;padding:36px;
  /* v5.0.8: 撤 blur, 改实色高 opacity */
  background:rgba(4,6,9,.78)}
.overlay.show{display:flex;animation:fade .2s var(--ease)}
@keyframes fade{from{opacity:0}to{opacity:1}}
.modal{width:min(880px,94vw);max-height:88vh;display:flex;flex-direction:column;
  background:var(--s1);border:1px solid var(--bd-i);border-radius:var(--r-lg);box-shadow:var(--sh2);overflow:hidden;
  animation:rise .26s var(--ease)}
@keyframes rise{from{opacity:0;transform:translateY(10px) scale(.99)}to{opacity:1;transform:none}}
.m-head{display:flex;align-items:center;gap:12px;padding:15px 18px;border-bottom:1px solid var(--bd);background:linear-gradient(180deg,var(--s2),var(--s1))}
.m-head .mark{width:26px;height:26px;color:var(--warn)}
.m-head .t{font-family:var(--fz-mono);font-size:13px;font-weight:500;letter-spacing:.1em;color:var(--tx);text-transform:uppercase}
.m-head .t .en{font-size:9px;letter-spacing:.2em;color:var(--warn);margin-left:6px}
.m-head .sub{font-size:11.5px;color:var(--tx3);margin-top:2px}
#reportFrame{flex:1;width:100%;min-height:320px;border:none;background:#fff}
.m-foot{display:flex;align-items:center;gap:10px;padding:13px 18px;border-top:1px solid var(--bd);background:var(--inset)}
.m-foot .note{flex:1;font-size:11px;color:var(--tx3);line-height:1.45}

/* ============ Toast ============ */
.toast{position:fixed;left:50%;bottom:28px;transform:translateX(-50%) translateY(20px);z-index:2000;
  padding:10px 16px;border-radius:var(--r);background:var(--s3);border:1px solid var(--bd-i);box-shadow:var(--sh2);
  font-family:var(--fz-mono);font-size:12px;letter-spacing:.02em;color:var(--tx);opacity:0;pointer-events:none;transition:.26s var(--ease)}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
.toast.err{border-color:rgba(252,61,33,.4);color:#ff7059}

/* ============================================================
   v4.1 — 真钛金属质感 + 光泽 + 动效 (程立令)
   光泽 = 镜面高光带 + 斜扫 sheen (物理反光, 非 neon 发光)
   拉丝 = 超细竖纹 (brushed titanium, 非碳纤维斜织)
   阳极氧化钛 = 极淡 青→琥珀 虹彩描边 (titanium oxide heat-tint)
   倒角 = inset 顶高光 + 底暗 (raised metal panel)
   动效 = 斜扫光泽 / CRT 扫描线漂移 / 开机序列 / 状态呼吸
   ============================================================ */

/* —— 材质: 侧栏 = 拉丝钛面 + 穿孔点纹; 中栏 = 蓝图网格 (看得见) —— */
.col.left, .col.right{
  background-color:#0e1117;
  background-image:
    radial-gradient(var(--dot) 1px, transparent 1.6px),
    repeating-linear-gradient(90deg, rgba(255,255,255,.009) 0 1px, transparent 1px 2px),
    linear-gradient(180deg, rgba(255,255,255,.03), transparent 26%, rgba(0,0,0,.16));
  background-size:15px 15px, 2px 2px, 100% 100%;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.05);
}
.col.center{
  background-color:var(--inset);
  background-image:
    linear-gradient(var(--hair) 1px, transparent 1px),
    linear-gradient(90deg, var(--hair) 1px, transparent 1px);
  background-size:30px 30px;
}

/* —— 钛金属面: 镜面渐变 + 拉丝竖纹 + 阳极虹彩 + 倒角 —— */
header.topbar, .col-head, .m-head, .left-foot, .chat-input, .asst-ctl, .stepper{
  background-color:#242b37;
  background-image:
    linear-gradient(180deg, rgba(255,255,255,.12), rgba(255,255,255,0) 46%, rgba(0,0,0,.34)),
    repeating-linear-gradient(90deg, rgba(255,255,255,.024) 0 1px, transparent 1px 2px),
    linear-gradient(102deg, transparent 36%, rgba(45,226,230,.05) 48%, rgba(255,176,0,.045) 55%, transparent 70%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.17), inset 0 -1px 0 rgba(0,0,0,.6);
}
header.topbar{position:relative;overflow:hidden;z-index:5}

/* —— 顶栏: 静态金属 —— */
header.topbar>*{position:relative;z-index:2}

/* —— 钛金属键: ghost / seg 倒角微反光 —— */
.ghost, .seg, .send, .danger{
  background-image:linear-gradient(180deg, rgba(255,255,255,.05), transparent 48%, rgba(0,0,0,.16));
  box-shadow:inset 0 1px 0 rgba(255,255,255,.07), inset 0 -1px 0 rgba(0,0,0,.3), var(--sh1);
}
.ghost:active, .seg:active, .send:active, .danger:active{box-shadow:inset 0 2px 4px rgba(0,0,0,.4)}

/* v5.1: LAUNCH sheen 5.5s infinite 撤 — tribunal D-26 idle 无故动效 */
.primary{position:relative}
.primary>*{position:relative}

/* v5.1: console CRT 扫描线 + amber bracket 撤 — tribunal D-9/D-32 visionOS 方向纯化 */
.console-wrap{position:relative}
.console-head{position:relative}

/* ============================================================
   纵深系统 (impeccable: 光从上 / 层间真投影 / 亮度落差拉开)
   层级: 金属条(最亮 #242b37) > 侧栏台(#1b212c) > 中栏沟槽(#06080c) > 遥测井(#030508)
   product.md: 撤开机序列动画 (反模式); 动效只留传达状态的
   ============================================================ */
/* 抬升: 侧栏 = 抬起金属台 (更亮 + 顶高光 + 向中间沟槽投影) */
.col.left, .col.right{
  background-color:#1b212c;
  background-image:
    radial-gradient(var(--dot) 1px, transparent 1.6px),
    repeating-linear-gradient(90deg, rgba(255,255,255,.011) 0 1px, transparent 1px 2px),
    linear-gradient(180deg, rgba(255,255,255,.08), transparent 18%, rgba(0,0,0,.26));
  background-size:15px 15px, 2px 2px, 100% 100%;
  z-index:3;
}
.col.left{box-shadow:inset 0 1px 0 rgba(255,255,255,.14), 9px 0 24px -10px rgba(0,0,0,.92)}
.col.right{box-shadow:inset 0 1px 0 rgba(255,255,255,.14), -9px 0 24px -10px rgba(0,0,0,.92)}
/* 下沉: 中栏 = 沟槽 (明显更暗, 被左右台压在底下) */
.col.center{
  background-color:#06080c;
  background-image:
    linear-gradient(var(--hair) 1px, transparent 1px),
    linear-gradient(90deg, var(--hair) 1px, transparent 1px);
  background-size:30px 30px;
  z-index:1;
}
/* 抬起 strips 向下真投影 (压在沟槽/内容上方) */
header.topbar{z-index:8; box-shadow:inset 0 1px 0 rgba(255,255,255,.18), inset 0 -1px 0 rgba(0,0,0,.6), 0 10px 26px -8px rgba(0,0,0,.88)}
.col-head{position:relative; z-index:4; box-shadow:inset 0 1px 0 rgba(255,255,255,.12), 0 7px 16px -8px rgba(0,0,0,.72)}
.stepper{position:relative; z-index:3; box-shadow:inset 0 1px 0 rgba(255,255,255,.11), 0 9px 18px -8px rgba(0,0,0,.78)}
.left-foot{position:relative; z-index:3; box-shadow:inset 0 1px 0 rgba(255,255,255,.11), 0 -9px 18px -10px rgba(0,0,0,.6)}
/* 最深: 遥测井 = 沟槽里再挖一层 (背景压到最黑) + 静态青色能量边框 (非流光) */
.console-wrap{background:#030508; border:1px solid rgba(45,226,230,.16)}

/* ============ 按键纵高: 物理凸起键 (程令) ============
   实色侧壁 (0 Npx 0 color) = 键身高度; 顶高光 = 键帽受光; 软投影 = 离面;
   :active → translateY 下压 + 侧壁塌陷 = 真按下行程 */
.ghost, .seg, .danger, .send{
  box-shadow:inset 0 1px 0 rgba(255,255,255,.12), 0 2px 0 rgba(0,0,0,.55), 0 5px 9px -3px rgba(0,0,0,.55) !important;
}
.ghost:active, .seg:active, .danger:active, .send:active:not(:disabled){
  transform:translateY(2px) !important;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.06), 0 0 0 rgba(0,0,0,.55), 0 1px 3px rgba(0,0,0,.55) !important;
}
.send:disabled{box-shadow:inset 0 1px 0 rgba(255,255,255,.04), 0 2px 0 rgba(0,0,0,.4), 0 3px 6px -3px rgba(0,0,0,.45) !important}
/* LAUNCH 主键: 最高键身 (3px 琥珀侧壁) */
.primary{
  box-shadow:inset 0 1px 0 rgba(255,255,255,.4), 0 3px 0 #835a09, 0 7px 13px -3px rgba(0,0,0,.6) !important;
}
.primary:active{
  transform:translateY(3px) !important;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.28), 0 0 0 #835a09, 0 2px 5px rgba(0,0,0,.6) !important;
}
.primary:disabled{
  box-shadow:inset 0 1px 0 rgba(255,255,255,.05), 0 2px 0 rgba(0,0,0,.45), 0 3px 7px -3px rgba(0,0,0,.45) !important;
}

/* —— 无障碍: 尊重 reduce-motion —— */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important}
}

/* ============ 窄屏兜底 (桌面应用, 仅防极端缩窄) ============ */
@media (max-width:1080px){
  .main{grid-template-columns:1fr 1.3fr}
  .col.right{display:none}
}

/* ============================================================
   v4.2 — LoRA 测试页 (换页 · 代办#12)
   航天舱同源: amber 主墨 + cyan 副 + 拉丝钛金属 + 凹陷画布井
   ============================================================ */
/* —— 顶栏页面导航 (segmented) —— */
.pagenav{display:inline-flex;gap:4px;padding:3px;border-radius:var(--r);background:rgba(0,0,0,.28);
  border:1px solid var(--bd);box-shadow:inset 0 1px 3px rgba(0,0,0,.5)}
.pgbtn{display:inline-flex;align-items:center;gap:7px;height:28px;padding:0 13px;border-radius:var(--r-sm);
  font-family:var(--fz-mono);font-size:11.5px;font-weight:500;letter-spacing:.06em;color:var(--tx3);
  background:transparent;transition:.16s var(--ease)}
.pgbtn .en{font-size:8.5px;letter-spacing:.18em;color:var(--faint)}
.pgbtn .ic16{width:14px;height:14px}
.pgbtn:hover{color:var(--tx2)}
.pgbtn.on{color:#1a1205;background:linear-gradient(180deg,#ffbf2e,var(--acc));
  box-shadow:inset 0 1px 0 rgba(255,255,255,.35),0 1px 2px rgba(0,0,0,.4)}
.pgbtn.on .en{color:rgba(26,18,5,.55)}

.page[hidden]{display:none!important}

/* —— 测试页布局: 左控制台 + 右画布 —— */
.labmain{flex:1;display:grid;grid-template-columns:minmax(350px,.9fr) 1.7fr;min-height:0}
.labout{display:flex;flex-direction:column;min-height:0}

/* —— 环境状态行 —— */
.env-row{display:flex;align-items:center;gap:9px;height:30px;padding:0 11px;border-radius:var(--r);
  background:var(--s1);border:1px solid var(--bd);box-shadow:inset 0 1px 3px rgba(0,0,0,.4)}
.env-dot{width:8px;height:8px;border-radius:50%;background:var(--tx3);flex:none;box-shadow:0 0 0 3px rgba(255,255,255,.03)}
.env-dot[data-up="1"]{background:var(--ok);box-shadow:0 0 0 3px rgba(48,209,88,.12);animation:beat 2.2s var(--ease) infinite}
.env-txt{font-family:var(--fz-mono);font-size:11px;letter-spacing:.02em;color:var(--tx2)}

/* —— 强度滑块 (凹陷金属轨 + 琥珀帽) —— */
input[type=range]{-webkit-appearance:none;appearance:none;width:100%;height:5px;border-radius:3px;padding:0;cursor:pointer;
  background:#0b0e13;border:1px solid rgba(0,0,0,.5);box-shadow:inset 0 1px 3px rgba(0,0,0,.6)}
input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:15px;height:15px;border-radius:50%;
  background:linear-gradient(180deg,#ffbf2e,var(--acc));border:1px solid var(--acc-dk);
  box-shadow:0 1px 3px rgba(0,0,0,.55),inset 0 1px 0 rgba(255,255,255,.4)}
input[type=range]::-moz-range-thumb{width:14px;height:14px;border-radius:50%;border:1px solid var(--acc-dk);
  background:var(--acc);box-shadow:0 1px 3px rgba(0,0,0,.55)}
.rng-v{font-family:var(--fz-mono);font-size:10px;color:var(--acc-tx);background:var(--s1);
  padding:1px 6px;border-radius:var(--r-sm);margin-left:5px;font-variant-numeric:tabular-nums}

/* —— 画布井: 凹陷下沉, 居中保形 —— */
.lab-stage{flex:1;min-height:0;display:flex;align-items:center;justify-content:center;padding:20px;position:relative;
  background:#030508;
  box-shadow:inset 0 8px 18px -4px rgba(0,0,0,.9),inset 0 0 26px rgba(45,226,230,.05),inset 0 -1px 0 rgba(255,255,255,.04)}
.lab-img{max-width:100%;max-height:100%;object-fit:contain;border-radius:var(--r);
  border:1px solid var(--bd-i);box-shadow:0 10px 34px -10px rgba(0,0,0,.85),0 0 0 1px rgba(0,0,0,.4)}
/* 骨架 (shimmer, 非 spinner — 程令硬指标) */
.skel{height:100%;width:auto;aspect-ratio:1;max-width:100%;border-radius:var(--r);position:relative;
  display:flex;align-items:flex-end;justify-content:center;padding:12px;
  background:linear-gradient(110deg,#0c1118 8%,#161c26 20%,#0c1118 34%);background-size:220% 100%;
  border:1px solid var(--bd);animation:shimmer 1.5s linear infinite}
@keyframes shimmer{to{background-position:-220% 0}}
.skel-tag{font-family:var(--fz-mono);font-size:10px;letter-spacing:.08em;color:var(--ice-tx);
  background:rgba(0,0,0,.5);padding:4px 9px;border-radius:var(--r-sm);border:1px solid rgba(45,226,230,.2)}
.lab-err{display:flex;flex-direction:column;align-items:center;gap:6px;text-align:center;padding:24px;
  border:1px dashed rgba(252,61,33,.35);border-radius:var(--r);background:rgba(252,61,33,.04);max-width:60ch}
.lab-err .e-t{font-family:var(--fz-mono);font-size:12px;letter-spacing:.1em;color:#ff7059;text-transform:uppercase}
.lab-err .e-s{font-size:11.5px;color:var(--tx3);line-height:1.5}
.lab-meta{margin-left:auto;font-family:var(--fz-mono);font-size:10px;letter-spacing:.03em;color:var(--tx3);
  font-variant-numeric:tabular-nums;text-transform:none}

/* —— 历史缩略条 —— */
.lab-hist-wrap{flex:none;border-top:1px solid var(--bd);background:linear-gradient(180deg,rgba(255,255,255,.02),transparent)}
.lab-hist-head{display:flex;align-items:center;gap:7px;height:28px;padding:0 13px;
  font-family:var(--fz-mono);font-size:10px;font-weight:500;letter-spacing:.14em;color:var(--tx2);text-transform:uppercase}
.lab-hist-head .en{font-size:8px;letter-spacing:.18em;color:var(--tx3)}
.lab-hist{display:flex;gap:8px;padding:10px 13px;overflow-x:auto;min-height:78px;align-items:center}
.hist-empty{font-size:11px;color:var(--tx3);font-family:var(--fz-mono);letter-spacing:.04em}
.hist-thumb{flex:none;width:62px;height:62px;border-radius:var(--r);overflow:hidden;padding:0;
  border:1px solid var(--bd);background:var(--s1);box-shadow:var(--sh1);transition:.16s var(--ease);cursor:pointer}
.hist-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.hist-thumb:hover{border-color:var(--acc-ring);transform:translateY(-2px);box-shadow:0 6px 14px -4px rgba(0,0,0,.6)}
.hist-thumb:active{transform:translateY(0)}

/* ============================================================
   v4.6 — 配音 TTS 页 (换页 · #43 · Style-Bert-VITS2 声音炼丹)
   航天舱同源: 复用全套 token + lab 画布井/骨架/错误占位/历史条;
   音频回显四件套: 合成中骨架 / <audio> 播放器(代后端代理 HF 回灌) / 错误占位 / 下载
   ============================================================ */
.ttsmain{flex:1;display:grid;grid-template-columns:minmax(350px,.9fr) 1.7fr;min-height:0}
.ttsout{display:flex;flex-direction:column;min-height:0}

/* 训练进度 (复用 .qbar/.qfill 队列进度条) */
.tts-prog{margin-top:10px;padding:9px 10px;border-radius:var(--r);background:var(--s1);
  border:1px solid var(--bd);box-shadow:inset 0 1px 3px rgba(0,0,0,.4)}
.tts-prog .bh{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;
  font-family:var(--fz-mono);font-size:10.5px;letter-spacing:.04em;color:var(--tx2)}
.tts-prog .bh .ice{color:var(--ice-tx);font-variant-numeric:tabular-nums}

/* 试听播放器 (代后端 /api/tts/audio 代理, HF 持久回灌) */
.tts-player{display:flex;flex-direction:column;align-items:center;gap:14px;width:100%;max-width:560px}
.tts-audio{width:100%;height:42px;border-radius:var(--r);outline:none;
  filter:saturate(.85) brightness(.96);box-shadow:0 6px 20px -8px rgba(0,0,0,.7)}
.tts-dl{display:inline-flex;align-items:center;gap:6px;text-decoration:none}
.tts-dl .ic16{width:13px;height:13px}

/* 历史条: 无缩略图, 用声波/播放 icon 方块 (复用 .hist-thumb 尺寸/交互) */
.tts-hthumb{display:flex;align-items:center;justify-content:center;color:var(--ice-tx);
  background:linear-gradient(180deg,var(--s2),var(--s1))}
.tts-hthumb svg{width:24px;height:24px}
.tts-hthumb:hover{color:var(--acc-tx)}

/* ============================================================
   v4.3 — 人脸质量分包页 (换页 · #39)
   航天舱同源: 复用全套 token; 桶色 = ok绿(高质量)/ice青(低质量)/danger红(废片)
   缩略图栅格复用 .skel 骨架 + object-fit 保形 + onerror 占位 (图片硬指标)
   ============================================================ */
.sortmain{flex:1;display:grid;grid-template-columns:minmax(350px,.9fr) 1.7fr;min-height:0}
.sortout{display:flex;flex-direction:column;min-height:0}

/* —— 桶计数读数 (三联) —— */
.sort-counts{display:grid;grid-template-columns:1fr 1fr 1fr;gap:7px;margin-top:12px}
.sort-counts .sc{display:flex;flex-direction:column;align-items:center;gap:3px;padding:9px 6px;border-radius:var(--r);
  background:var(--s1);border:1px solid var(--bd);box-shadow:inset 0 1px 3px rgba(0,0,0,.4)}
.sort-counts .sc .n{font-family:var(--fz-mono);font-size:19px;font-weight:600;font-variant-numeric:tabular-nums;color:var(--tx)}
.sort-counts .sc .l{font-family:var(--fz-mono);font-size:8px;letter-spacing:.06em;color:var(--tx3);text-transform:uppercase}
.sort-counts .sc.hq{border-color:rgba(48,209,88,.28)} .sort-counts .sc.hq .n{color:var(--ok)}
.sort-counts .sc.lq{border-color:rgba(45,226,230,.28)} .sort-counts .sc.lq .n{color:var(--ice-tx)}
.sort-counts .sc.jk{border-color:rgba(252,61,33,.3)} .sort-counts .sc.jk .n{color:#ff7059}

/* —— 审阈值画布: 可滚动凹陷井 —— */
.sort-stage{flex:1;min-height:0;overflow-y:auto;padding:16px 18px;position:relative;
  background:#06080c;box-shadow:inset 0 8px 18px -4px rgba(0,0,0,.9),inset 0 0 26px rgba(45,226,230,.04),inset 0 -1px 0 rgba(255,255,255,.04)}
.sort-stage .empty{height:100%}

/* —— 桶分区 —— */
.sort-sec{margin-bottom:20px}
.sort-sec:last-child{margin-bottom:0}
.sort-sec-h{display:flex;align-items:center;gap:8px;margin-bottom:9px;padding-bottom:6px;border-bottom:1px solid var(--hair);
  font-family:var(--fz-mono);font-size:11px;font-weight:500;letter-spacing:.12em;color:var(--tx2);text-transform:uppercase}
.sort-sec-h .dot{width:7px;height:7px;border-radius:2px;flex:none}
.sort-sec-h.hq .dot{background:var(--ok)} .sort-sec-h.lq .dot{background:var(--ice)} .sort-sec-h.jk .dot{background:var(--danger)}
.sort-sec-h .cnt{margin-left:auto;font-size:9.5px;color:var(--tx3);letter-spacing:.04em;text-transform:none}

/* —— 缩略图栅格 (auto-fill, 保形, 骨架, 占位) —— */
.sort-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(116px,1fr));gap:10px}
.sort-cell{border-radius:var(--r);overflow:hidden;background:var(--s1);border:1px solid var(--bd);box-shadow:var(--sh1);transition:.16s var(--ease)}
.sort-cell:hover{border-color:var(--bd-i);transform:translateY(-2px);box-shadow:0 6px 14px -4px rgba(0,0,0,.6)}
.sort-cell .ph{height:116px;display:flex;align-items:center;justify-content:center;background:#030508;position:relative;overflow:hidden}
.sort-cell .ph img{width:100%;height:100%;object-fit:cover;display:block}
.sort-cell .cap{padding:5px 7px;font-family:var(--fz-mono);font-size:9.5px;line-height:1.4;color:var(--tx3);
  display:flex;justify-content:space-between;align-items:center;gap:4px}
.sort-cell .cap .lap{color:var(--acc-tx);font-variant-numeric:tabular-nums}
.sort-cell .cap .bk{font-size:8px;padding:1px 5px;border-radius:var(--r-sm);flex:none}
.sort-cell .cap .bk.hq{color:var(--ok);background:rgba(48,209,88,.12)}
.sort-cell .cap .bk.lq{color:var(--ice-tx);background:var(--ice-fill)}
.sort-cell .cap .bk.jk{color:#ff7059;background:rgba(252,61,33,.1)}
/* #39-9 遮挡度 UI */
.occl-toggle{display:flex;align-items:center;gap:7px;margin-top:9px;cursor:pointer;font-size:11px;color:var(--tx3);user-select:none}
.occl-toggle input{position:absolute;opacity:0;width:0;height:0}
.occl-toggle .ot-box{width:32px;height:18px;border-radius:9px;background:var(--s1);border:1px solid var(--bd);position:relative;flex:none;transition:.18s var(--ease)}
.occl-toggle .ot-box::after{content:"";position:absolute;top:2px;left:2px;width:12px;height:12px;border-radius:50%;background:var(--faint);transition:.18s var(--ease)}
.occl-toggle input:checked + .ot-box{background:var(--ice-fill);border-color:var(--ice-tx)}
.occl-toggle input:checked + .ot-box::after{transform:translateX(14px);background:var(--ice-tx)}
.occl-toggle .ot-txt{font-weight:500}
.occl-tip{font-size:9.5px;color:var(--faint);line-height:1.5;margin-top:5px;letter-spacing:.01em}
.occl-field{margin-top:2px}
.sort-cell .cap{flex-wrap:wrap}
.sort-cell .cap .occl-badge{font-size:8px;padding:1px 5px;border-radius:var(--r-sm);flex:none;color:var(--ice-tx);background:var(--ice-fill);font-variant-numeric:tabular-nums}
.sort-cell .cap .occl-badge.sev{color:#ff7059;background:rgba(252,61,33,.14)}
.sort-cell .cap .yaw-badge{font-size:8px;padding:1px 5px;border-radius:var(--r-sm);flex:none;color:var(--tx3);background:var(--s1);font-variant-numeric:tabular-nums}
.sort-cell .cap .dup-badge{font-size:8px;padding:1px 5px;border-radius:var(--r-sm);flex:none;color:#ffb74d;background:rgba(255,167,38,.15)}
.sort-cell.is-dup{opacity:.45}
.dedup-row{margin-top:9px;padding-top:9px;border-top:1px solid var(--bd)}
.yaw-field{margin-top:2px}
.sort-cell .ph .skel{position:absolute;inset:0;width:100%;height:100%;aspect-ratio:auto;border:none;border-radius:0;padding:0}
.sort-cell .ph .noimg{font-family:var(--fz-mono);font-size:9px;color:var(--faint);letter-spacing:.05em}
/* 全幅扫描骨架 (评分中占位) */
.sort-stage .scan-skel{height:200px;border-radius:var(--r)}

/* ===== #42 训练队列页专属组件 — 全部复用真版 token, 同源航天舱语言 ===== */
.qwrap{flex:1;display:flex;flex-direction:column;min-height:0}
.qscroll{flex:1;overflow-y:auto;padding:12px 14px;display:flex;flex-direction:column;gap:10px;min-height:0}
.qsum{display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-family:var(--fz-mono);font-size:9.5px;
  letter-spacing:.05em;color:var(--tx3);text-transform:uppercase}
.qsum b{color:var(--acc-tx);font-variant-numeric:tabular-nums}
.qlist{display:flex;flex-direction:column;gap:10px}
/* 作业卡 = 抬起金属台 浮在中栏深沟槽上, 左侧状态色侧壁 */
.qjob{position:relative;background:var(--s1);border:1px solid var(--bd);border-radius:var(--r);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.05), var(--sh1);overflow:hidden;flex:none}
.qjob::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--tx3)}
.qjob.run::before{background:var(--acc)}
.qjob.queued::before{background:var(--ice)}
.qjob.done::before{background:var(--ok)}
.qjob.done{opacity:.72}
.qjob.run{box-shadow:inset 0 1px 0 rgba(255,255,255,.06), 0 0 0 1px var(--acc-fill), 0 8px 20px -10px rgba(0,0,0,.7)}
.qj-top{display:flex;align-items:center;gap:9px;padding:9px 11px 7px}
.qj-grip{display:flex;flex-direction:column;gap:2px;color:var(--faint);cursor:grab;flex:none}
.qj-grip i{width:10px;height:1.5px;background:currentColor;border-radius:1px;display:block}
.qj-name{font-family:var(--fz-body);font-weight:600;font-size:12.5px;color:var(--tx);letter-spacing:.01em}
.qj-name .sub{font-family:var(--fz-mono);font-size:9px;color:var(--tx3);margin-left:6px;letter-spacing:.06em;text-transform:uppercase}
.qj-badge{font-family:var(--fz-mono);font-size:8.5px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;
  padding:3px 7px;border-radius:var(--r-sm);flex:none}
.qj-badge.run{color:#1a1205;background:var(--acc)}
.qj-badge.queued{color:var(--ice-tx);background:var(--ice-fill);border:1px solid rgba(45,226,230,.3)}
.qj-badge.done{color:var(--ok);background:rgba(48,209,88,.1);border:1px solid rgba(48,209,88,.26)}
.qj-sp{flex:1}
.qj-act{display:flex;gap:4px}
.qj-ic{width:23px;height:23px;border-radius:var(--r-sm);background:var(--s2);border:1px solid var(--bd);
  color:var(--tx3);display:grid;place-items:center;cursor:pointer;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.06), 0 1px 0 rgba(0,0,0,.4)}
.qj-ic svg{width:12px;height:12px}
.qj-ic:hover{color:var(--acc-tx);border-color:var(--bd-i)}
.qj-chips{display:flex;flex-wrap:wrap;gap:5px;padding:0 11px 8px}
.qchip{font-family:var(--fz-mono);font-size:9px;letter-spacing:.03em;color:var(--tx3);
  background:#0b0e13;border:1px solid var(--bd);border-radius:var(--r-sm);padding:2px 6px;
  box-shadow:inset 0 1px 2px rgba(0,0,0,.4);font-variant-numeric:tabular-nums}
.qchip b{color:var(--acc-tx)} .qchip.ice b{color:var(--ice-tx)}
.qj-prog{padding:0 11px 10px}
.qbar{height:6px;border-radius:3px;background:#0b0e13;border:1px solid rgba(0,0,0,.5);overflow:hidden;
  box-shadow:inset 0 1px 3px rgba(0,0,0,.6)}
.qfill{height:100%;background:linear-gradient(90deg,var(--acc-dk),var(--acc))}
.qfill.idle{background:var(--s3)}
.qmeta{display:flex;justify-content:space-between;font-family:var(--fz-mono);font-size:9.5px;color:var(--tx3);
  margin-top:6px;font-variant-numeric:tabular-nums}
.qmeta .eta{color:var(--ice-tx)} .qmeta .lv{color:var(--acc-tx)}
.qmini{margin:0 11px 10px;border:1px solid var(--bd);border-left:2px solid rgba(45,226,230,.3);border-radius:var(--r-sm);
  background:#05070a;font-family:var(--fz-mono);font-size:9.5px;color:#8fb0c0;padding:6px 9px;
  box-shadow:inset 0 2px 5px rgba(0,0,0,.7)}
.qmini .ok{color:var(--ok)} .qmini .w{color:var(--warn)}
/* 尾区: 入队邀请 (填满空洞) */
.qtail{flex:1;min-height:64px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;
  border:1px dashed var(--bd-i);border-radius:var(--r);color:var(--tx3);
  background:repeating-linear-gradient(135deg,transparent 0 9px,rgba(255,255,255,.013) 9px 10px)}
.qtail svg{width:18px;height:18px;color:var(--faint)}
.qtail .t{font-family:var(--fz-mono);font-size:9.5px;letter-spacing:.12em;text-transform:uppercase}
/* 批次总览底栏 (锚底, 平衡中栏头重脚轻) */
.qfoot{flex:none;display:flex;align-items:center;gap:0;padding:9px 14px;border-top:1px solid var(--bd);
  background:linear-gradient(180deg,rgba(255,255,255,.02),transparent)}
.qfoot .rd{display:flex;flex-direction:column;gap:2px;padding:0 14px;border-left:1px solid var(--hair)}
.qfoot .rd:first-child{padding-left:0;border-left:none}
.qfoot .rd .k{font-family:var(--fz-mono);font-size:8px;letter-spacing:.16em;color:var(--tx3);text-transform:uppercase}
.qfoot .rd .v{font-family:var(--fz-mono);font-size:12px;color:var(--tx);font-variant-numeric:tabular-nums}
.qfoot .rd .v.acc{color:var(--acc-tx)} .qfoot .rd .v.ice{color:var(--ice-tx)}
.qfoot .bsp{flex:1}
/* 右栏 批次进度 + 控制 */
.bbatch{display:flex;flex-direction:column;gap:6px;padding:9px 11px;border-radius:var(--r);
  background:var(--s1);border:1px solid var(--bd);box-shadow:inset 0 1px 3px rgba(0,0,0,.4)}
.bbatch .bh{display:flex;justify-content:space-between;font-family:var(--fz-mono);font-size:9px;letter-spacing:.08em;
  color:var(--tx3);text-transform:uppercase}
.bbatch .bh b{color:var(--acc-tx);font-variant-numeric:tabular-nums}
.qctl-grp{display:flex;flex-direction:column;gap:9px;padding:12px 13px}
.mini-console{flex:1;min-height:0;background:#030508;border-top:1px solid var(--bd);
  box-shadow:inset 0 8px 16px -6px rgba(0,0,0,.9);overflow-y:auto;padding:10px 12px;
  font-family:var(--fz-mono);font-size:10px;line-height:1.6;color:var(--tx2)}
.mini-console .ts{color:var(--tx3)} .mini-console .ok{color:var(--ok)} .mini-console .w{color:var(--warn)}

/* ============================================================
   v4.7 — Pod GPU 悬浮监视 (#45 · 跨页常驻 · 半透明可展开/收缩)
   固定右下角浮于所有 .page 之上 (在 .app 外); backdrop-blur 半透明; data-state exp/col 切展开收缩
   ============================================================ */
/* 哑光克制版 (程 2026-06-02): 零脉动/零外发光/零渐变高光 — 半透玻璃 + 平色仪表 + 中性描边; 放大 ~20%; pm-bar 可鼠标拖动 */
.podmon{position:fixed;right:16px;bottom:16px;z-index:200;width:300px;
  font-family:var(--fz-mono);color:var(--tx);
  /* v5.0.8: 撤 backdrop-filter blur, scroll 时每帧重合成是 wheel 卡死元凶 */
  background:rgba(15,18,24,.94);
  border:1px solid var(--bd-strong);border-radius:var(--r-lg);overflow:hidden;
  box-shadow:0 14px 36px -16px rgba(0,0,0,.62);transition:width .2s var(--ease),border-color .2s var(--ease)}
.podmon:hover{border-color:rgba(200,210,225,.30)}
.podmon[data-state="col"]{width:228px}
.podmon.dragging{transition:none}
.pm-bar{display:flex;align-items:center;gap:9px;height:36px;padding:0 6px 0 14px;cursor:grab;
  border-bottom:1px solid var(--hair);touch-action:none;user-select:none}
.podmon.dragging .pm-bar{cursor:grabbing}
.podmon[data-state="exp"] .pm-bar{border-bottom:1px solid var(--hair)}
.podmon[data-state="col"] .pm-bar{border-bottom:none}
.pm-dot{width:8px;height:8px;border-radius:50%;background:var(--tx3);flex:none}
.pm-dot[data-up="1"]{background:var(--ok)}
.pm-dot[data-up="err"]{background:var(--danger)}
.pm-title{font-size:11px;font-weight:600;letter-spacing:.1em;color:var(--tx2)}
.pm-title .pm-g{color:var(--ice-tx)}
.pm-mini{margin-left:auto;font-size:11px;color:var(--acc-tx);font-variant-numeric:tabular-nums;letter-spacing:.02em}
.podmon[data-state="exp"] .pm-mini{display:none}
.pm-toggle{flex:none;width:26px;height:26px;display:grid;place-items:center;padding:0;margin-left:4px;
  background:transparent;border:none;color:var(--tx3);cursor:pointer;border-radius:var(--r-sm)}
.podmon[data-state="exp"] .pm-toggle{margin-left:auto}
.pm-toggle:hover{color:var(--acc-tx);background:rgba(255,255,255,.05)}
.pm-chev{width:16px;height:16px;transition:transform .2s var(--ease)}
.podmon[data-state="exp"] .pm-chev{transform:rotate(180deg)}
.pm-body{padding:12px 14px 11px}
.podmon[data-state="col"] .pm-body{display:none}
.pm-idle{font-size:11px;color:var(--tx3);letter-spacing:.02em;padding:6px 2px;line-height:1.55}
.pm-card{margin-bottom:11px}
.pm-card:last-child{margin-bottom:0}
.pm-name{display:flex;justify-content:space-between;align-items:baseline;font-size:11px;color:var(--tx2);margin-bottom:5px}
.pm-name .pm-tp{color:var(--tx3);font-size:10px;font-variant-numeric:tabular-nums}
.pm-meter{margin:6px 0}
.pm-meter .ml{display:flex;justify-content:space-between;font-size:10px;color:var(--tx3);margin-bottom:4px;letter-spacing:.04em}
.pm-meter .ml b{color:var(--tx);font-variant-numeric:tabular-nums}
.pm-bar2{height:6px;border-radius:3px;background:#0b0e13;border:1px solid rgba(0,0,0,.5);
  box-shadow:inset 0 1px 2px rgba(0,0,0,.6);overflow:hidden}
.pm-fill{height:100%;border-radius:3px;background:var(--acc);transition:width .4s var(--ease)}
.pm-fill.ice{background:var(--ice)}
.pm-fill.hot{background:var(--danger)}
.pm-foot{display:flex;justify-content:space-between;align-items:center;margin-top:9px;padding-top:8px;
  border-top:1px solid var(--hair);font-size:10px;color:var(--tx3);letter-spacing:.03em}
.pm-foot .pm-disk b{color:var(--tx2)}
.pm-ts{font-variant-numeric:tabular-nums}
@media (max-width:640px){.podmon{display:none}}

/* ===== Checkpoint 仓库 (LAB block 02 · 起环境同步, 跟 .block 模板一致) ===== */
.ck-stat-bar{display:flex;gap:6px;flex-wrap:wrap;margin-top:2px}
.ck-pill{
  font:600 10px/1 var(--fz-mono);padding:4px 9px;border-radius:999px;letter-spacing:.04em;
  border:1px solid var(--bd);color:var(--tx2);background:var(--inset);
  font-variant-numeric:tabular-nums;white-space:nowrap
}
.ck-pill.ok{color:var(--ok);border-color:rgba(48,209,88,.42);background:rgba(48,209,88,.08)}
.ck-pill.amber{color:var(--acc-tx);border-color:var(--acc-ring);background:var(--acc-fill)}
.ck-pill.ice{color:var(--ice-tx);border-color:rgba(45,226,230,.42);background:rgba(45,226,230,.08)}
.ck-pill.warn{color:var(--warn);border-color:rgba(255,179,0,.45);background:rgba(255,179,0,.10)}
.ck-pill.tiny{font-size:9px;padding:2px 6px;letter-spacing:.05em;border-radius:3px}

.ck-list{
  margin-top:9px;border:1px solid var(--bd);border-radius:var(--r-sm);background:var(--inset);
  max-height:360px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--s3) var(--inset);
  padding:4px 0
}
.ck-list::-webkit-scrollbar{width:8px}
.ck-list::-webkit-scrollbar-track{background:var(--inset)}
.ck-list::-webkit-scrollbar-thumb{background:var(--s3);border-radius:4px;border:2px solid var(--inset)}
.ck-list::-webkit-scrollbar-thumb:hover{background:var(--steel,#4a4f57)}

.ck-grp{margin:6px 0 4px}
.ck-grp:first-child{margin-top:2px}
.ck-grp-h{
  font:600 9.5px/1 var(--fz-disp);color:var(--acc-dk);letter-spacing:.20em;text-transform:uppercase;
  padding:5px 10px 5px;margin:0 6px 4px;border-bottom:1px solid var(--hair);
  display:flex;align-items:center;gap:7px
}
.ck-grp-h .ct{
  font:500 9px/1 var(--fz-mono);color:var(--tx3);letter-spacing:.08em;
  background:var(--s1);padding:1px 5px;border-radius:2px;border:1px solid var(--bd)
}

.ck-row{
  display:flex;align-items:center;gap:8px;padding:5px 10px;margin:1px 5px;
  border-radius:var(--r-sm);cursor:pointer;font-size:11px;color:var(--tx);
  border:1px solid transparent;
  transition:background .12s var(--ease),border-color .12s var(--ease),transform .08s var(--ease)
}
.ck-row:hover{background:rgba(255,176,0,.045);border-color:var(--bd-i)}
.ck-row:active{transform:translateY(1px)}
.ck-row.on{background:var(--acc-fill);border-color:var(--acc-ring)}
.ck-row.on .ck-lbl{color:var(--tx)}
.ck-row input[type=checkbox]{
  margin:0;width:13px;height:13px;cursor:pointer;accent-color:var(--acc);flex-shrink:0
}
.ck-lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--tx)}
.ck-sz{
  font:600 10px var(--fz-mono);color:var(--acc-tx);min-width:48px;text-align:right;
  font-variant-numeric:tabular-nums;flex-shrink:0
}
.ck-row.inst .ck-lbl{color:var(--tx2)}
.ck-row.todo .ck-lbl{color:var(--tx2)}
.ck-row.dis{opacity:.40;cursor:not-allowed}
.ck-row.dis:hover{background:transparent;border-color:transparent;transform:none}
.ck-row.dis .ck-lbl{text-decoration:line-through;color:var(--tx3)}
.ck-row.dis input[type=checkbox]{cursor:not-allowed}

/* skeleton loader (无 spinner; pulse shimmer) */
.ck-skel{padding:7px 6px}
.ck-skel-row{
  height:24px;margin:3px 4px;border-radius:3px;
  background:linear-gradient(90deg,var(--s1) 0%,var(--s2) 40%,var(--s3) 50%,var(--s2) 60%,var(--s1) 100%);
  background-size:200% 100%;
  animation:ckShimmer 1.4s linear infinite;
  opacity:.7
}
@keyframes ckShimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}

/* empty / error */
.ck-empty{
  display:flex;flex-direction:column;align-items:center;gap:6px;
  padding:22px 14px;text-align:center;color:var(--tx3);font-size:11px;line-height:1.5
}
.ck-empty .ic-empty{width:28px;height:28px;opacity:.55;color:var(--tx3)}
.ck-empty.err{color:var(--warn)}
.ck-empty.err .ic-empty{color:var(--warn);opacity:.7}

/* ============================================================ */
/* v5.0 TITLEBAR — frameless 一体化 (覆盖 v4.1 拉丝钛/镜面/film) */
/* visionOS 半透 + Apollo amber/cyan 保留 · Win11 Mica 透下来   */
/* 设计来源: workflow wnw43tia1 Agent B (合体一行 56px)         */
/* ============================================================ */

/* 整窗 12px 圆角 + 隐溢 — 配合 launcher.py DWMWCP_ROUND.
   v5.0.4: 撤 body transparent (程否了 Mica 透壁纸), pywebview 整窗实色 */
html, body {
  border-radius: 12px;
  overflow: hidden;
}
/* fallback msedge --app 模式: 实色 bg, 撤圆角 (Win chrome 黑顶覆盖), 隐 Win 控制按钮 */
body:not(.has-pywebview) .tb-wins { display: none !important; }
body:not(.has-pywebview) { background: var(--bg) !important; border-radius: 0 !important; }

/* ── topbar v5 整段重写 (data-frameless="1" 选中, 不污染 v4.1 旧 .topbar) ── */
.topbar[data-frameless="1"] {
  /* 撤所有 v4.1 拉丝钛/镜面渐变/film grain bg */
  /* v5.0.2 hotfix: 撤半透 Mica, 程实地看 pywebview 反馈银灰要黑 */
  background: var(--bg) !important;
  background-image: none !important;
  /* 单条一体, 不堆双层 */
  height: 56px !important;
  min-height: 56px !important;
  padding: 0 0 0 14px !important;   /* 右侧 0, Win 按钮自己贴边 */
  display: flex !important;
  align-items: center !important;
  gap: 14px !important;
  /* 底边一根 Apollo amber 极淡分割 */
  border-bottom: 1px solid var(--bd) !important;
  box-shadow: inset 0 -1px 0 rgba(255, 176, 0, 0.04) !important;
  position: relative !important;
  /* 整条作为 OS drag 区 */
  -webkit-app-region: drag;
          app-region: drag;
}
/* 干掉 v4.1 .topbar::before/::after (film grain + 镜面斜扫) */
.topbar[data-frameless="1"]::before,
.topbar[data-frameless="1"]::after {
  content: none !important;
}

/* ── drag region 反选: 交互件全部 no-drag ─────────── */
.topbar[data-frameless="1"] .pagenav,
.topbar[data-frameless="1"] .pagenav .pgbtn,
.topbar[data-frameless="1"] .pill,
.topbar[data-frameless="1"] .danger,
.topbar[data-frameless="1"] .tb-wins,
.topbar[data-frameless="1"] .tb-wins .tb-btn {
  -webkit-app-region: no-drag;
          app-region: no-drag;
}
/* 兜底: 所有 button/input 都 no-drag, 防新加交互件漏标 */
.topbar[data-frameless="1"] button,
.topbar[data-frameless="1"] input,
.topbar[data-frameless="1"] select {
  -webkit-app-region: no-drag !important;
          app-region: no-drag !important;
}
/* v5.0.6: 撤 .main no-drag — pywebview easy_drag 不读 CSS app-region, 这条 CSS 是无用的; 改走 JS topbar mousedown listener 限定范围 */

/* ── 品牌 mark/wordmark (drag, 沿用 v4.1 色 token) ─── */
.topbar[data-frameless="1"] .mark { width: 24px; height: 24px; flex: 0 0 auto; }
.topbar[data-frameless="1"] .wordmark { display: flex; flex-direction: column; line-height: 1.05; }
.topbar[data-frameless="1"] .wordmark .t {
  font: 600 13.5px/1 'IBM Plex Mono', 'Plex Mono', ui-monospace, monospace;
  letter-spacing: .08em; color: var(--tx);
}
.topbar[data-frameless="1"] .wordmark .t .sep { color: var(--acc-tx); margin: 0 .12em; }
.topbar[data-frameless="1"] .wordmark .s {
  font: 500 10px/1.2 'IBM Plex Mono', 'Plex Mono', monospace;
  letter-spacing: .14em; color: var(--tx3); margin-top: 2px;
}

/* ── pagenav 5 按钮 — 撤拉丝, 走 visionOS 半透 ─────── */
.topbar[data-frameless="1"] .pagenav {
  display: flex; gap: 4px; margin-left: 8px;
  background: transparent !important; border: none !important;
  box-shadow: none !important; padding: 0 !important;
}
.topbar[data-frameless="1"] .pgbtn {
  display: inline-flex !important; align-items: center !important; gap: 6px !important;
  height: 32px !important; padding: 0 10px !important;
  background: transparent !important; border: 1px solid transparent !important;
  border-radius: var(--r) !important; color: var(--tx2) !important; cursor: pointer;
  font: 500 12px/1 'IBM Plex Sans', 'Plex Sans', system-ui !important;
  letter-spacing: 0 !important; text-transform: none !important;
  box-shadow: none !important;
}
.topbar[data-frameless="1"] .pgbtn:hover {
  background: rgba(255,255,255,.04) !important;
  color: var(--tx) !important;
  border-color: var(--bd) !important;
}
/* v5.1: .pgbtn.on 旧 gradient 死规则删 — 已被 v5.0.1 P0 #3 软化版 (L1033-1043) 覆盖 */
.topbar[data-frameless="1"] .pgbtn .en {
  font: 500 9.5px/1 'IBM Plex Mono', 'Plex Mono', monospace !important;
  letter-spacing: .1em !important; opacity: .7;
}
.topbar[data-frameless="1"] .pgbtn .ic16,
.topbar[data-frameless="1"] .pgbtn svg { width: 14px !important; height: 14px !important; }

/* ── readout (drag, 仅展示, 文本不响应 click) ─────── */
.topbar[data-frameless="1"] .spacer { flex: 1 1 auto; }
.topbar[data-frameless="1"] .readout {
  display: flex; flex-direction: column; line-height: 1.05; text-align: right;
  padding: 0 13px; border-left: 1px solid var(--hair); height: 30px; justify-content: center;
}
.topbar[data-frameless="1"] .readout .k {
  font: 500 9px/1 'IBM Plex Mono', 'Plex Mono', monospace;
  letter-spacing: .14em; color: var(--tx3); text-transform: uppercase;
}
.topbar[data-frameless="1"] .readout .v {
  font: 600 12px/1.2 'IBM Plex Mono', 'Plex Mono', monospace;
  letter-spacing: .04em; color: var(--ice-tx); margin-top: 3px;
}
.topbar[data-frameless="1"] .readout.clock .v { color: var(--acc-tx); }

/* ════════════════════════════════════════════════════════ */
/* Win 控制按钮组 .tb-wins · 标准 Win11 46x32 · 最低存在感 */
/* ════════════════════════════════════════════════════════ */
.tb-wins {
  display: flex; align-items: stretch;
  margin-left: 6px;
  height: 56px;            /* 撑满 titlebar 高, hover 区到顶 */
}
.tb-btn {
  width: 46px; height: 56px;
  display: inline-flex; align-items: center; justify-content: center;
  background: transparent; border: 0; padding: 0; margin: 0;
  color: var(--tx2); cursor: pointer;
  transition: background 80ms linear, color 80ms linear;
  border-radius: 0;        /* Win11 控制按钮无圆角, 顶到窗角 */
  box-shadow: none !important;
}
.tb-btn svg { width: 12px; height: 12px; display: block; }
.tb-btn:hover { background: rgba(255, 255, 255, 0.06); color: var(--tx); }
.tb-btn:active { background: rgba(255, 255, 255, 0.10); transform: none !important; }

/* close 单独红 hover, Win11 标准 #e81123 */
.tb-btn.tb-close:hover { background: #e81123; color: #fff; }
.tb-btn.tb-close:active { background: #f1707a; color: #fff; }

/* ============================================================ */
/* v5.0.1 — tribunal Phase 3 P0 fixes (9 项)                    */
/* 设计来源: tribunal wj2gdp30t 4-agent 91 critique → Iva 综合  */
/* 共识修法: logo / clock-idle / pgbtn-on 软化 / .en 隐 /       */
/* focus-visible / wordmark-sub / readout WCAG / drag hairline  */
/* ============================================================ */

/* 1. drag region 视觉提示 + visionOS inset top hairline (双效, U-07 critical + D-01) */
.topbar[data-frameless="1"]::before {
  content: "" !important;
  position: absolute !important;
  top: 0; left: 0; right: 0;
  height: 1px; pointer-events: none;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,.08) 18%, rgba(255,255,255,.08) 82%, transparent) !important;
  z-index: 1;
}
.topbar[data-frameless="1"] .spacer { cursor: grab; }
.topbar[data-frameless="1"] .spacer:active { cursor: grabbing; }

/* 2. wordmark 副标 11px + .08em (撤 .14em 字距太宽难辨, U-02) */
.topbar[data-frameless="1"] .wordmark .s {
  font-size: 11px !important;
  letter-spacing: .08em !important;
}

/* 3. pgbtn.on amber 软化 (撤 linear-gradient 100% 实心, 改 14% bg + 2px 底 border, U-03 + D-21) */
.topbar[data-frameless="1"] .pgbtn.on {
  background: rgba(255, 176, 0, 0.14) !important;
  color: var(--acc-tx) !important;
  border-color: rgba(255, 176, 0, 0.22) !important;
  box-shadow: inset 0 -2px 0 var(--acc), inset 0 1px 0 rgba(255,255,255,.04) !important;
  font-weight: 600 !important;
}
.topbar[data-frameless="1"] .pgbtn.on .en {
  color: var(--acc-dk) !important;
  opacity: .85 !important;
}

/* 4. pgbtn inactive 隐 .en (D-02 critical, 中英冗余去半边) */
.topbar[data-frameless="1"] .pgbtn:not(.on) .en {
  display: none !important;
}

/* 5. focus-visible 全覆盖 (a11y, U-21 + H-28) */
.topbar[data-frameless="1"] .pgbtn:focus-visible,
.tb-btn:focus-visible {
  outline: 2px solid var(--ice-tx) !important;
  outline-offset: 2px !important;
}

/* 6. readout label/value 字号对比拉开 + WCAG --tx3 局部提亮 (U-05 + H-10) */
.topbar[data-frameless="1"] .readout .k {
  font-size: 8.5px !important;
  color: #7a8494 !important;        /* WCAG L 提至 ~0.19, 半透 bg 上接近 4:1 AA */
  letter-spacing: .12em !important;
}
.topbar[data-frameless="1"] .readout .v {
  font-size: 13px !important;
  font-weight: 600 !important;
}

/* 7. mission clock idle 态灰 (--:--:--), running 才 amber (U-01 + D-23) */
.topbar[data-frameless="1"] .readout.clock .v.idle {
  color: var(--tx3) !important;
  font-weight: 500 !important;
  letter-spacing: .04em !important;
}

/* 8. pagenav inactive pgbtn 文字提亮 var(--tx2) → var(--tx) 一档 (U-13 对比度) */
.topbar[data-frameless="1"] .pgbtn:not(.on) {
  color: var(--tx) !important;        /* #ccd2de, 比 --tx2 更明 */
  opacity: .82;
}
.topbar[data-frameless="1"] .pgbtn:not(.on):hover {
  opacity: 1 !important;
  background: rgba(255,255,255,.08) !important;  /* hover bg 从 .04 提到 .08 (U-09) */
}

/* 9. pgbtn :active 按下态反馈 (U-10) */
.topbar[data-frameless="1"] .pgbtn:active {
  background: rgba(255,255,255,.12) !important;
  transform: translateY(0.5px) !important;
}

/* ============================================================ */
/* v5.1 — tribunal v2 Tier S 实施 (program 拍板 8 项)             */
/* 设计源: workflow ws8v37527 4-agent 104 critique → Iva 综合     */
/* 实施: 撤装饰 D-32/9/26 / --tx3 提亮 / input 平边 / podmon hide / 死规则删 / launcher dead code 删 */
/* ============================================================ */

/* podmon 未连 pod 整窗 hide (tribunal U-10 pain=7) */
.podmon[data-up="0"] {
  display: none !important;
}
