/* 徐柴数字 · AI 中控台 — 工业控制台风 · 移动端自适应 */
:root{
  --bg:#0e1116; --bg2:#151a22; --bg3:#1c222c;
  --line:#28303d; --line2:#39445a;
  --tx:#e8edf5; --tx2:#9aa7bd; --tx3:#67748c;
  --pri:#5b8cff; --ok:#2fd48f; --warn:#f5a524; --err:#ff5f56;
  --r:12px;
}
*{box-sizing:border-box;margin:0;padding:0}
html{-webkit-text-size-adjust:100%}
body{
  background:var(--bg); color:var(--tx);
  font:400 14px/1.6 -apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
  padding-bottom:60px;
}
h1,h2,h3{font-weight:500}
button,input,select{font-family:inherit;font-size:14px;color:inherit}

/* 顶栏 */
.topbar{
  display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;
  padding:16px 20px;background:linear-gradient(180deg,#161c26,#11151c);
  border-bottom:1px solid var(--line);position:sticky;top:0;z-index:20;
}
.brand{display:flex;align-items:center;gap:12px;min-width:0}
.logo{
  width:40px;height:40px;flex:0 0 40px;border-radius:10px;
  background:linear-gradient(135deg,var(--pri),#8b5cf6);
  display:flex;align-items:center;justify-content:center;
  font-size:20px;font-weight:500;color:#fff;
}
.brand-txt{min-width:0}
.brand-txt h1{font-size:17px;letter-spacing:.3px;white-space:nowrap}
.brand-txt p{font-size:12px;color:var(--tx3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.topstat{display:flex;gap:8px;flex-wrap:wrap}
.tstat{
  background:var(--bg2);border:1px solid var(--line);border-radius:10px;
  padding:6px 12px;text-align:center;min-width:62px;
}
.tstat b{display:block;font-size:18px;font-weight:500;line-height:1.2}
.tstat span{font-size:11px;color:var(--tx3)}

/* Tabs */
.tabs{
  display:flex;gap:4px;padding:10px 20px;background:var(--bg2);
  border-bottom:1px solid var(--line);position:sticky;top:73px;z-index:19;
  overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;
}
.tabs::-webkit-scrollbar{display:none}
.tab{
  flex:0 0 auto;background:transparent;border:1px solid transparent;color:var(--tx2);
  padding:7px 15px;border-radius:8px;cursor:pointer;transition:.15s;
}
.tab:hover{background:var(--bg3);color:var(--tx)}
.tab.on{background:var(--pri);border-color:var(--pri);color:#fff}

main{padding:18px 20px;max-width:1400px;margin:0 auto}
.view{display:none;animation:fade .22s}
.view.on{display:block}
@keyframes fade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}

/* 卡片 */
.card{
  background:var(--bg2);border:1px solid var(--line);border-radius:var(--r);
  padding:16px;margin-bottom:14px;
}
.card h3{
  font-size:14px;margin-bottom:12px;display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;
}
.card h3 .sub{font-size:12px;color:var(--tx3);font-weight:400}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:14px}

/* KPI */
.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:14px}
.kpi{
  background:var(--bg2);border:1px solid var(--line);border-radius:var(--r);
  padding:14px 16px;position:relative;overflow:hidden;
}
.kpi::after{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--pri)}
.kpi.ok::after{background:var(--ok)} .kpi.warn::after{background:var(--warn)} .kpi.err::after{background:var(--err)}
.kpi b{display:block;font-size:26px;font-weight:500;line-height:1.25}
.kpi span{font-size:12px;color:var(--tx2)}
.kpi em{font-style:normal;font-size:11px;color:var(--tx3);display:block;margin-top:2px}

/* 徽标 */
.badge{
  display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:20px;
  font-size:11px;font-weight:400;border:1px solid;
}
.b-live{color:var(--ok);border-color:#1d6b4c;background:#0d2a20}
.b-iter{color:var(--pri);border-color:#2c4694;background:#101a35}
.b-dev {color:#c084fc;border-color:#5b3483;background:#1e1330}
.b-block{color:var(--err);border-color:#7a2b28;background:#2c1312}
.b-prep{color:var(--tx2);border-color:var(--line2);background:var(--bg3)}

/* 模式 / 负载条 */
.mode{
  display:flex;gap:10px;align-items:flex-start;padding:10px 0;border-bottom:1px dashed var(--line);
}
.mode:last-child{border-bottom:0}
.mn{font-size:12px;color:var(--pri);font-weight:500;flex:0 0 24px}
.mode .mt{font-size:13px}
.mode .md{font-size:12px;color:var(--tx3)}
.bar{height:6px;background:var(--bg3);border-radius:4px;overflow:hidden;margin-top:5px}
.bar i{display:block;height:100%;border-radius:4px;background:var(--pri);transition:width .3s}
.loadrow{display:flex;align-items:center;gap:10px;padding:7px 0}
.loadrow .ln{flex:0 0 72px;font-size:13px}
.loadrow .lb{flex:1}
.loadrow .lv{flex:0 0 44px;text-align:right;font-size:12px;color:var(--tx2)}

/* 阻塞项 */
.blk{
  display:flex;gap:10px;align-items:flex-start;padding:10px 12px;margin-bottom:8px;
  background:#2c1312;border:1px solid #7a2b28;border-radius:10px;
}
.blk .bi{flex:0 0 auto;color:var(--err);font-size:13px;margin-top:1px}
.blk .bn{font-size:13px;font-weight:500;margin-bottom:2px}
.blk .bt{font-size:12px;color:#f0a9a5}

/* 筛选 */
.filters{display:flex;flex-direction:column;gap:10px;margin-bottom:14px}
#pjSearch{
  background:var(--bg2);border:1px solid var(--line);border-radius:10px;
  padding:10px 14px;width:100%;
}
#pjSearch:focus{outline:none;border-color:var(--pri)}
.chips{display:flex;gap:6px;flex-wrap:wrap}
.chip{
  background:var(--bg2);border:1px solid var(--line);color:var(--tx2);
  padding:5px 12px;border-radius:20px;cursor:pointer;font-size:12px;transition:.15s;
}
.chip:hover{border-color:var(--line2);color:var(--tx)}
.chip.on{background:var(--pri);border-color:var(--pri);color:#fff}

/* 项目墙 */
.projwall{display:grid;grid-template-columns:repeat(auto-fill,minmax(268px,1fr));gap:12px}
.pcard{
  background:var(--bg2);border:1px solid var(--line);border-radius:var(--r);
  padding:14px;transition:.16s;cursor:pointer;
}
.pcard:hover{border-color:var(--line2);transform:translateY(-2px)}
.pcard.hi{border-color:var(--pri)}
.pc-h{display:flex;justify-content:space-between;align-items:flex-start;gap:8px;margin-bottom:6px}
.pc-h h4{font-size:14px;font-weight:500;line-height:1.4}
.pc-id{font-size:11px;color:var(--tx3);flex:0 0 auto}
.pc-meta{font-size:12px;color:var(--tx2);margin-bottom:8px;display:flex;gap:6px;flex-wrap:wrap}
.pc-note{font-size:12px;color:var(--tx3);line-height:1.55;margin-bottom:10px;
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.pc-hp{display:flex;align-items:center;gap:8px}
.pc-hp .bar{flex:1;margin:0}
.pc-hp .pct{font-size:11px;color:var(--tx2);flex:0 0 32px;text-align:right}
.pc-url{font-size:11px;color:var(--pri);margin-top:8px;word-break:break-all}
.pc-blk{
  margin-top:8px;padding:7px 9px;background:#2c1312;border:1px solid #7a2b28;
  border-radius:8px;font-size:11px;color:#f0a9a5;
}
.pc-next{margin-top:8px;font-size:11px;color:var(--ok)}

/* 主控卡 */
.mastercard{
  background:linear-gradient(135deg,#1b2440,#1a1636);border:1px solid #33417a;
  border-radius:14px;padding:18px;margin-bottom:14px;display:flex;
  align-items:center;gap:16px;flex-wrap:wrap;
}
.mc-icon{
  width:48px;height:48px;flex:0 0 48px;border-radius:12px;
  background:linear-gradient(135deg,var(--pri),#8b5cf6);
  display:flex;align-items:center;justify-content:center;font-size:20px;
}
.mc-txt{flex:1;min-width:180px}
.mc-txt h3{font-size:16px;margin-bottom:3px}
.mc-txt p{font-size:12px;color:#a9b6d8}
.mc-guard{font-size:11px;color:#ffd28a;background:#3a2a10;border:1px solid #6b4d1c;
  padding:6px 10px;border-radius:8px;display:inline-block;margin-top:8px}

/* Agent 卡 */
.agents{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px;margin-bottom:14px}
.acard{
  background:var(--bg2);border:1px solid var(--line);border-radius:var(--r);
  padding:14px;border-left:3px solid var(--ac);
}
.acard h4{font-size:14px;font-weight:500;margin-bottom:4px}
.acard .aid{font-size:11px;color:var(--tx3);margin-bottom:8px}
.acard .ad{font-size:12px;color:var(--tx2);line-height:1.55;margin-bottom:8px}
.acard .ao{font-size:11px;color:var(--ac);padding-top:8px;border-top:1px dashed var(--line)}
.acard .ag{font-size:11px;color:#ffd28a;margin-top:6px}

/* 规则 */
.rule{display:flex;gap:10px;padding:9px 0;border-bottom:1px dashed var(--line);align-items:flex-start}
.rule:last-child{border-bottom:0}
.lv{flex:0 0 46px;font-size:11px;padding:2px 6px;border-radius:6px;text-align:center;margin-top:1px}
.lv.block{background:#2c1312;color:var(--err);border:1px solid #7a2b28}
.lv.warn{background:#33280f;color:var(--warn);border:1px solid #6b4d1c}
.rule .rn{font-size:13px;font-weight:500;margin-bottom:2px}
.rule .rd{font-size:12px;color:var(--tx3)}
.rule .rh{font-size:11px;color:#f0a9a5;margin-top:2px}

/* 调度台 */
.orch{display:grid;grid-template-columns:340px 1fr;gap:14px;align-items:start}
.fld{display:block;margin-bottom:10px;font-size:12px;color:var(--tx2)}
.fld input,.fld select{
  display:block;width:100%;margin-top:5px;background:var(--bg3);
  border:1px solid var(--line);border-radius:9px;padding:9px 12px;color:var(--tx);
}
.fld input:focus,.fld select:focus{outline:none;border-color:var(--pri)}
.btns{display:flex;gap:8px;margin-top:12px;flex-wrap:wrap}
.btn{
  flex:1;min-width:110px;background:var(--bg3);border:1px solid var(--line2);color:var(--tx);
  padding:10px 14px;border-radius:9px;cursor:pointer;transition:.15s;
}
.btn:hover{background:var(--line)}
.btn.primary{background:var(--pri);border-color:var(--pri);color:#fff}
.btn.primary:hover{filter:brightness(1.1)}
.btn:disabled{opacity:.45;cursor:not-allowed}
.tip{font-size:11px;color:var(--tx3);margin-top:12px;line-height:1.6}

/* 流水线 */
.flow{display:flex;flex-direction:column;gap:9px}
.frow{
  display:flex;align-items:center;gap:10px;padding:10px 12px;
  background:var(--bg3);border:1px solid var(--line);border-radius:10px;transition:.2s;
}
.frow.pending{opacity:.5}
.frow.running{border-color:var(--pri);background:#101a35}
.frow.done{border-color:#1d6b4c}
.frow.manual{border-color:#7a2b28;background:#221110}
.fdot{width:9px;height:9px;border-radius:50%;background:var(--tx3);flex:0 0 9px}
.frow.running .fdot{background:var(--pri);animation:pulse 1s infinite}
.frow.done .fdot{background:var(--ok)}
.frow.manual .fdot{background:var(--err)}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.3}}
.fbody{flex:1;min-width:0}
.fb1{font-size:13px;margin-bottom:2px}
.fb1 em{font-style:normal;font-size:11px;color:var(--tx3);margin-left:6px}
.fb2{font-size:11px;color:var(--tx3)}
.fdeps{font-size:10px;color:var(--tx3);margin-top:2px}
.rtag{font-size:11px;padding:2px 7px;border-radius:20px;background:#33280f;color:var(--warn);
  border:1px solid #6b4d1c;flex:0 0 auto}
.stag{font-size:11px;padding:2px 7px;border-radius:20px;flex:0 0 auto;
  background:var(--bg);color:var(--tx3);border:1px solid var(--line2)}
.stag.ok{background:#0d2a20;color:var(--ok);border-color:#1d6b4c}
.stag.bad{background:#2c1312;color:var(--err);border-color:#7a2b28}

/* 日志 */
.log{max-height:280px;overflow-y:auto;font:400 12px/1.7 ui-monospace,Menlo,Consolas,monospace}
.lrow{display:flex;gap:10px;padding:3px 0;border-bottom:1px solid #1a202a}
.lrow .lt{color:var(--tx3);flex:0 0 58px}
.lrow .lm{flex:0 0 60px}
.lrow .lx{flex:1;color:var(--tx2);word-break:break-all}
.lm.master{color:var(--pri)} .lm.dispatch{color:#c084fc}
.lm.qa{color:var(--ok)} .lm.retry{color:var(--warn)} .lm.error{color:var(--err)}

/* 质检报告 */
.qar{
  display:flex;gap:11px;padding:11px 0;border-bottom:1px dashed var(--line);align-items:flex-start;
}
.qar:last-child{border-bottom:0}
.qav{flex:0 0 auto;font-size:11px;padding:3px 9px;border-radius:20px;margin-top:1px}
.qav.ok{background:#0d2a20;color:var(--ok);border:1px solid #1d6b4c}
.qav.no{background:#2c1312;color:var(--err);border:1px solid #7a2b28}
.qat{font-size:13px;font-weight:500}
.qad{font-size:12px;color:var(--tx3);margin-top:3px}
.qahit{font-size:11px;color:#f0a9a5;margin-top:3px}
.empty{text-align:center;color:var(--tx3);font-size:13px;padding:28px 12px}

/* 知识库 */
.kbi{
  padding:11px 0;border-bottom:1px dashed var(--line);display:flex;gap:11px;align-items:flex-start;
}
.kbi:last-child{border-bottom:0}
.ktag{
  flex:0 0 auto;font-size:11px;padding:3px 9px;border-radius:6px;
  background:#101a35;color:var(--pri);border:1px solid #2c4694;
}
.kti{flex:1;min-width:0}
.kti h4{font-size:13px;font-weight:500;margin-bottom:3px}
.kti p{font-size:12px;color:var(--tx3);line-height:1.6}
.kuse{flex:0 0 auto;font-size:11px;color:var(--tx3);white-space:nowrap}

/* Toast */
.toast{
  position:fixed;left:50%;bottom:26px;transform:translateX(-50%) translateY(90px);
  background:var(--bg3);border:1px solid var(--line2);border-radius:10px;
  padding:10px 18px;font-size:13px;opacity:0;transition:.28s;pointer-events:none;z-index:99;
  max-width:90vw;text-align:center;
}
.toast.on{opacity:1;transform:translateX(-50%)}

/* ---------- LLM 接入 ---------- */
.llmstat{padding:6px 12px;min-width:62px;text-align:center;
  background:var(--bg2);border:1px solid var(--line);border-radius:10px}
.llmstat b{display:block;font-size:18px;font-weight:500;line-height:1.2}
.llmstat span{font-size:11px;color:var(--tx3)}
.llmstat.on{border-color:#1d6b4c;background:#0d2a20}
.llmstat.on b{color:var(--ok);font-size:13px;padding:3px 0}
.llmstat.off{border-color:#7a2b28;background:#2c1312}
.llmstat.off b{color:var(--err);font-size:13px;padding:3px 0}
.llmstat.checking{border-color:#6b4d1c}
.llmrow{display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap}
.llmfld{flex:1;min-width:220px;margin-bottom:0}
.llmfld input code{font-family:ui-monospace,Consolas,monospace}
.llmbtns{display:flex;gap:8px;flex-wrap:wrap}
.llmbtns .btn{min-width:130px}
.llmres{margin-top:12px;padding:11px 13px;border-radius:10px;font-size:12px;line-height:1.6}
.llmres.ok{background:#0d2a20;border:1px solid #1d6b4c;color:var(--ok)}
.llmres.bad{background:#2c1312;border:1px solid #7a2b28;color:var(--err)}
.llmres.wait{background:#33280f;border:1px solid #6b4d1c;color:var(--warn)}
.llmres .lrk{font-family:ui-monospace,Consolas,monospace;font-size:11px;opacity:.9;display:block;margin-top:4px}
code{background:var(--bg3);padding:1px 6px;border-radius:4px;
  font-family:ui-monospace,Consolas,monospace;font-size:12px}

/* ---------- 智能体检 ---------- */
#insText{
  width:100%;background:var(--bg3);border:1px solid var(--line);border-radius:10px;
  padding:12px 14px;color:var(--tx);font:400 13px/1.65 inherit;resize:vertical;
}
#insText:focus{outline:none;border-color:var(--pri)}
.insbtns{display:flex;gap:8px;margin:12px 0;flex-wrap:wrap}
.insverdict{
  padding:14px 16px;border-radius:12px;margin-bottom:12px;
  display:flex;align-items:center;gap:12px;flex-wrap:wrap;
}
.insverdict.pass{background:#0d2a20;border:1px solid #1d6b4c}
.insverdict.fail{background:#2c1312;border:1px solid #7a2b28}
.insverdict .ivt{font-size:16px;font-weight:500}
.insverdict.pass .ivt{color:var(--ok)} .insverdict.fail .ivt{color:var(--err)}
.insverdict .ivs{font-size:12px;color:var(--tx2)}
.insstat{display:flex;gap:8px;flex-wrap:wrap}
.ivs-pill{
  font-size:11px;padding:3px 10px;border-radius:20px;
  background:#0d2a20;border:1px solid #1d6b4c;color:var(--ok);
}
.ivs-pill.bad{background:#2c1312;border:1px solid #7a2b28;color:var(--err)}
.ivs-pill.mid{background:#33280f;border:1px solid #6b4d1c;color:var(--warn)}
.inshit{
  padding:10px 12px;margin-bottom:8px;border-radius:10px;
  display:flex;gap:10px;align-items:flex-start;
}
.inshit.bad{background:#221110;border:1px solid #7a2b28}
.inshit.mid{background:#241d0d;border:1px solid #6b4d1c}
.inshit .ihn{flex:1;min-width:0}
.inshit .iht{font-size:13px;font-weight:500;margin-bottom:2px}
.inshit .ihd{font-size:12px;color:var(--tx3);line-height:1.55}
.inshit .ihk{font-size:11px;color:var(--tx3);margin-top:3px;font-family:ui-monospace,Consolas,monospace}
.rmatrix{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:8px}
.rcell{
  background:var(--bg3);border:1px solid var(--line);border-radius:10px;padding:10px 12px;
}
.rcell .rn{font-size:13px;font-weight:500;margin-bottom:3px;display:flex;align-items:center;gap:6px}
.rcell .rd{font-size:11px;color:var(--tx3);line-height:1.5}
.rcell .rr{font-size:11px;color:var(--tx2);margin-top:5px;font-family:ui-monospace,Consolas,monospace}
.rmark{width:7px;height:7px;border-radius:50%;flex:0 0 7px}
.rmark.block{background:var(--err)} .rmark.warn{background:var(--warn)}

/* ---------- 语义检索 ---------- */
.searchwrap{display:flex;gap:8px;flex-wrap:wrap}
#kbQuery{
  flex:1;min-width:220px;background:var(--bg3);border:1px solid var(--line);
  border-radius:9px;padding:10px 14px;color:var(--tx);
}
#kbQuery:focus{outline:none;border-color:var(--pri)}
.examples{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin-top:10px;font-size:11px;color:var(--tx3)}
.ex{
  padding:3px 10px;border-radius:20px;background:var(--bg3);
  border:1px solid var(--line2);cursor:pointer;transition:.15s;
}
.ex:hover{border-color:var(--pri);color:var(--tx)}
.kbhit{
  padding:12px 14px;margin-bottom:9px;border-radius:10px;
  background:var(--bg3);border:1px solid var(--line);
  display:flex;gap:12px;align-items:flex-start;
}
.kbhit.top{border-color:var(--pri);background:#101a35}
.kbhit .ksc{
  flex:0 0 auto;font-size:13px;font-weight:500;color:var(--pri);
  min-width:52px;text-align:center;padding:3px 6px;
  background:#0b1428;border:1px solid #2c4696;border-radius:8px;
}
.kbhit .kbb{flex:1;min-width:0}
.kbhit .kbb h4{font-size:13px;font-weight:500;margin-bottom:3px}
.kbhit .kbb p{font-size:12px;color:var(--tx3);line-height:1.6}
.noresult{text-align:center;color:var(--tx3);font-size:13px;padding:22px}

::-webkit-scrollbar{width:8px;height:8px}
::-webkit-scrollbar-track{background:var(--bg2)}
::-webkit-scrollbar-thumb{background:var(--line2);border-radius:4px}

/* 移动端自适应 */
@media (max-width:900px){
  .orch{grid-template-columns:1fr}
  .grid2{grid-template-columns:1fr}
  .kpis{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:640px){
  body{padding-bottom:40px}
  .topbar{padding:12px 14px}
  .logo{width:34px;height:34px;flex-basis:34px;font-size:17px}
  .brand-txt h1{font-size:15px}
  .brand-txt p{font-size:11px}
  .tstat{padding:5px 9px;min-width:52px}
  .tstat b{font-size:16px}
  .tabs{top:0;position:sticky;padding:8px 14px}
  main{padding:14px}
  .kpis{grid-template-columns:repeat(2,1fr);gap:10px}
  .kpi{padding:12px}
  .kpi b{font-size:22px}
  .card{padding:13px}
  .projwall{grid-template-columns:1fr}
  .agents{grid-template-columns:1fr}
  .btn{min-width:100%}
  .pc-note{-webkit-line-clamp:2}
  .mastercard{padding:14px;gap:12px}
  .mc-icon{width:40px;height:40px;flex-basis:40px;font-size:17px}
  .lv{flex-basis:42px}
}
@media (max-width:380px){
  .topstat{gap:5px}
  .tstat{min-width:46px;padding:4px 7px}
  .tstat b{font-size:14px}
}