/* MOS 管理台样式。一个壳 + 视图模块，管理台自己的样式全住在这一份里——
 * 视图是 JS 模块没有自己的 <style>，样式漂移在结构上不可能发生。
 * 主题三态：跟随系统（默认）/ 强制亮 / 强制暗，由 <html data-theme> 决定。 */

/* 令牌与元素级原语住 design/tokens.css + design/base.css（D91，bi 共用同一份）——
 * index.html 先 <link> 那两份再 <link> 这份。这里只剩管理台自己的：壳、页面、组件变体。 */

/* ---- 壳：侧栏 + 顶栏 + 内容 ---- */
html,body{height:100%}
body{display:grid;grid-template-columns:200px 1fr;grid-template-rows:46px 1fr;
     grid-template-areas:"side top" "side main"}
#side{grid-area:side;background:var(--side);color:var(--side-fg);display:flex;flex-direction:column;
      padding:12px 9px;overflow-y:auto}
#side .logo{color:var(--side-on);font-weight:650;font-size:14px;letter-spacing:.02em;
            padding:4px 11px 14px;display:flex;align-items:center;gap:8px}
#side .logo .spark{width:8px;height:8px;border-radius:2px;background:var(--side-accent);flex:none}
#side .grp{font-size:10.5px;text-transform:uppercase;letter-spacing:.09em;color:var(--side-dim);
           padding:12px 11px 4px}
#side a.item{display:block;color:var(--side-fg);padding:6px 11px;border-radius:6px;font-size:13px;
             text-decoration:none;border-left:2px solid transparent}
#side a.item:hover{color:var(--side-on);background:var(--side-onbg);text-decoration:none}
#side a.item.on{color:var(--side-on);background:var(--side-onbg);border-left-color:var(--side-accent);
                font-weight:600}
#side a.item.sub{padding:4px 11px 4px 27px;font-size:12.5px;color:var(--side-dim)}
#side a.item.sub:hover{color:var(--side-on)}
#side a.item.sub.on{color:var(--side-on);background:var(--side-onbg);
                    border-left-color:var(--side-accent);font-weight:600}
#side .foot{margin-top:auto;padding:10px 11px 2px;font-size:11px;color:var(--side-dim)}
#top{grid-area:top;display:flex;align-items:center;gap:14px;padding:0 18px;
     background:var(--card);border-bottom:1px solid var(--line)}
#top .title{font-weight:650;font-size:14px}
#top .right{margin-left:auto;display:flex;align-items:center;gap:12px}
#health{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--dim)}
#health .dot{width:8px;height:8px}
#opchip{font-size:12px;color:var(--dim);display:inline-flex;align-items:center;gap:7px}
#opchip b{color:var(--fg);font-weight:600}
.iconbtn{font:inherit;font-size:12px;padding:3px 10px;border-radius:6px;border:1px solid var(--line);
         background:var(--card);color:var(--dim);cursor:pointer}
.iconbtn:hover{border-color:var(--accent);color:var(--accent)}
#view{grid-area:main;overflow-y:auto;padding:18px 22px}
#burger{display:none}
@media (max-width: 880px){
  body{grid-template-columns:1fr;grid-template-areas:"top" "main"}
  #side{position:fixed;inset:0 auto 0 0;width:220px;z-index:40;transform:translateX(-100%);
        transition:transform .16s ease}
  body.sideopen #side{transform:none;box-shadow:var(--shadow)}
  #burger{display:inline-flex}
}

/* ---- 基础组件 ---- */
section{margin-bottom:24px;max-width:1240px}
h2{font-size:13px;text-transform:uppercase;letter-spacing:.06em;color:var(--dim);
   margin:0 0 10px;font-weight:600;display:flex;align-items:baseline;gap:10px}
h2 .note{text-transform:none;letter-spacing:0;font-weight:400;font-size:12px}
.scroll{overflow-x:auto}
td.sum{white-space:normal;color:var(--dim);font-size:12px;max-width:520px}
/* 运行状态 → pill 配色（.pill 本体在 base.css） */
.s-succeeded,.s-ok{background:var(--okbg);color:var(--ok)}
.s-failed,.s-timed_out,.s-bad{background:var(--badbg);color:var(--bad)}
.s-running,.s-run{background:var(--runbg);color:var(--run)}
.s-skipped,.s-warn{background:var(--warnbg);color:var(--warn)}
.flag{color:var(--warn);font-weight:600}
.dot{width:9px;height:9px;border-radius:50%;flex:none;background:var(--dim);display:inline-block}
.dot.ok{background:var(--ok)} .dot.warn{background:var(--warn)} .dot.bad{background:var(--bad)}
#toast{position:fixed;right:18px;bottom:18px;background:var(--card);border:1px solid var(--line);
       border-radius:var(--radius);padding:10px 14px;box-shadow:var(--shadow);display:none;z-index:60}
/* ---- 助手坞（D49）---- */
#assist{position:fixed;top:46px;right:0;bottom:0;width:min(420px,92vw);z-index:45;
        background:var(--card);border-left:1px solid var(--line);box-shadow:var(--shadow);
        display:flex;flex-direction:column}
#assist[hidden]{display:none}
.a-head{display:flex;align-items:center;gap:10px;padding:10px 14px;border-bottom:1px solid var(--line)}
#a-msgs{flex:1;overflow-y:auto;padding:12px 14px;display:flex;flex-direction:column;gap:8px}
.a-m{max-width:92%;padding:8px 12px;border-radius:10px;font-size:13px;white-space:pre-wrap;
     word-break:break-word;line-height:1.55}
.a-user{align-self:flex-end;background:var(--runbg);color:var(--fg)}
.a-bot{align-self:flex-start;background:var(--bg);border:1px solid var(--line)}
/* 气泡里的 markdown：紧凑版 */
.a-bot p{margin:4px 0}
.a-bot h1,.a-bot h2,.a-bot h3,.a-bot h4{font-size:13px;font-weight:650;margin:8px 0 3px}
.a-bot ul,.a-bot ol{margin:4px 0;padding-left:20px}
.a-bot li{margin:2px 0}
.a-bot code{background:var(--card);border:1px solid var(--line);padding:0 4px;border-radius:4px;font-size:12px}
.a-bot pre{background:var(--card);border:1px solid var(--line);border-radius:6px;padding:8px 10px;
           overflow-x:auto;margin:6px 0;font:12px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace}
.a-bot pre code{border:none;padding:0;background:none}
.a-bot table{margin:6px 0;font-size:12px;width:auto}
.a-bot td,.a-bot th{white-space:normal;padding:4px 8px}
.a-bot blockquote{margin:6px 0;padding:4px 10px;border-left:3px solid var(--line);color:var(--dim)}
.a-steps{align-self:flex-start;font:11px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace;
         color:var(--dim);padding:0 4px}
.a-inputrow{display:flex;gap:8px;padding:10px 12px;border-top:1px solid var(--line);position:relative}
#a-slash{position:absolute;left:12px;right:12px;bottom:calc(100% + 4px);background:var(--card);
         border:1px solid var(--line);border-radius:8px;box-shadow:var(--shadow);
         overflow:hidden;z-index:5}
#a-slash[hidden]{display:none}
.a-slash-item{display:flex;gap:10px;align-items:baseline;padding:7px 12px;cursor:pointer;
              border-bottom:1px solid var(--line);font-size:13px}
.a-slash-item:last-child{border-bottom:none}
.a-slash-item:hover{background:var(--bg)}
.a-slash-item b{font-weight:600;white-space:nowrap}
.a-slash-item span{color:var(--dim);font-size:12px;overflow:hidden;text-overflow:ellipsis;
                   white-space:nowrap}
.a-inputrow textarea{flex:1;font:inherit;font-size:13px;padding:7px 10px;resize:none;
        border:1px solid var(--line);border-radius:6px;background:var(--bg);color:var(--fg)}
.a-inputrow textarea:focus{outline:none;border-color:var(--accent)}
#login{position:fixed;inset:0;background:var(--bg);display:flex;align-items:center;
       justify-content:center;z-index:90}
#login[hidden]{display:none}
.logincard{background:var(--card);border:1px solid var(--line);border-radius:12px;
           padding:26px 28px;width:min(360px,92vw);box-shadow:var(--shadow)}
.logincard .logo{font-weight:650;font-size:15px;display:flex;align-items:center;gap:8px;
                 margin-bottom:16px}
.logincard .logo .spark{width:8px;height:8px;border-radius:2px;background:var(--accent)}
.logincard label{display:block;font-size:12px;color:var(--dim);margin:12px 0 4px}
.logincard input{width:100%;background:var(--bg)}
.logincard .hint{font-size:11px;color:var(--dim);margin-top:12px}
.dlg{padding:18px 20px}
.dlg h3{margin:0 0 14px;font-size:14px}
.dlg label{display:block;font-size:12px;color:var(--dim);margin:10px 0 3px}
.dlg input,.dlg select{width:100%;padding:6px 9px;background:var(--bg)}
.dlg .row{display:flex;gap:8px;justify-content:flex-end;margin-top:16px}
.dlg .chk{display:flex;align-items:center;gap:7px;margin-top:12px;font-size:13px;color:var(--fg)}
.dlg .chk input{width:auto}

/* ---- 总览 ---- */
.verdict{display:flex;align-items:center;gap:14px;background:var(--card);border:1px solid var(--line);
         border-radius:var(--radius);padding:14px 18px;margin-bottom:12px}
.verdict .dot{width:11px;height:11px}
.vtext{font-size:15px;font-weight:650}
.strip{margin-left:auto;display:flex;gap:2px;align-items:flex-end}
.strip i{width:5px;height:16px;border-radius:1px;background:var(--dim);opacity:.35}
.strip i.succeeded{background:var(--ok);opacity:1}
.strip i.failed,.strip i.timed_out{background:var(--bad);opacity:1}
.strip i.running{background:var(--run);opacity:1}
.tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(138px,1fr));gap:10px}
.tile{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:11px 14px}
a.tile{color:inherit;display:block}
a.tile:hover{text-decoration:none;border-color:var(--accent)}
.tile b{display:block;font-size:20px;font-weight:650;line-height:1.3;font-variant-numeric:tabular-nums}
.tile span{font-size:12px;color:var(--dim)}
.tile.alert b{color:var(--bad)}
.hostbar{margin-top:10px;display:flex;gap:18px;flex-wrap:wrap;font-size:12px;color:var(--dim)}
.svc{display:inline-flex;align-items:center;gap:5px}
.svc .dot{width:7px;height:7px}
.counts{font:12px/1.45 ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--dim);
        white-space:normal;max-width:400px}
.trigs{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.trig{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);
      border-radius:999px;padding:2px 6px 2px 9px;font-size:12px}
.trig.off{opacity:.5}
.trig b{font-weight:600}
.trig code{font-size:11px;color:var(--dim)}
.trig .hit{cursor:pointer}
.trig .hit:hover{color:var(--accent)}
.x{cursor:pointer;color:var(--dim);padding:0 3px;border:none;background:none;font-size:13px}
.x:hover{color:var(--bad)}

/* ---- 运行详情 ---- */
.tl{padding:4px 0}
.step{display:grid;grid-template-columns:34px 92px 1fr auto;gap:10px;align-items:baseline;
      padding:8px 16px;border-bottom:1px solid var(--line)}
.step:last-child{border-bottom:none}
.step .n{color:var(--dim);font:11px ui-monospace,monospace;text-align:right}
.step .k{font-size:12px;font-weight:600}
.k-model{color:var(--run)} .k-tool{color:var(--ok)} .k-denied{color:var(--bad)}
.step.denied{background:var(--badbg)}
.step .d{color:var(--dim);font-size:12px;overflow:hidden;text-overflow:ellipsis}
.step .r{font:11px ui-monospace,monospace;color:var(--dim);white-space:nowrap}

/* ---- 知识库 ---- */
.k-constraint{background:var(--badbg);color:var(--bad)}
.k-procedure{background:var(--runbg);color:var(--run)}
.k-environment{background:var(--warnbg);color:var(--warn)}
.k-fact,.k-rationale{background:var(--bg);color:var(--dim)}
.budget{display:flex;gap:22px;flex-wrap:wrap;padding:12px 14px;background:var(--card);
        border:1px solid var(--line);border-radius:var(--radius);margin-bottom:10px}
.budget div b{display:block;font-size:19px;font-weight:650;font-variant-numeric:tabular-nums}
.budget div span{font-size:12px;color:var(--dim)}
.doc{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:22px 26px}
.doc h1{font-size:20px;margin:0 0 4px}
.doc h2{font-size:15px;text-transform:none;letter-spacing:0;color:var(--fg);
        margin:22px 0 8px;font-weight:650;display:block}
.doc h3{font-size:13px;margin:16px 0 6px}
.doc p,.doc li{margin:8px 0}
.doc table{margin:12px 0;width:auto}
.doc td,.doc th{white-space:normal}
.doc pre{background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:11px 13px;
         overflow-x:auto;font:12px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace}
.doc code{background:var(--bg);padding:1px 5px;border-radius:4px}
.doc pre code{background:none;padding:0}
.doc blockquote{margin:12px 0;padding:8px 14px;border-left:3px solid var(--line);color:var(--dim)}
.doc blockquote.danger{border-color:var(--bad);background:var(--badbg);color:var(--fg)}
.doc blockquote.warn{border-color:var(--warn);background:var(--warnbg);color:var(--fg)}
.meta{display:flex;gap:14px;flex-wrap:wrap;font-size:12px;color:var(--dim);
      padding-bottom:14px;border-bottom:1px solid var(--line);margin-bottom:6px}

/* ---- 数据 ---- */
.tabs{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin-bottom:12px}
.tabs .grp{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--dim);
           margin-left:10px;margin-right:2px}
.tabs .grp:first-child{margin-left:0}
.tab{font:inherit;font-size:13px;padding:4px 12px;border-radius:999px;border:1px solid var(--line);
     background:var(--card);color:var(--fg);cursor:pointer}
.tab.on{background:var(--runbg);color:var(--run);border-color:var(--run);font-weight:600}
.viewnote{margin:0 0 10px;color:var(--dim);font-size:12px}
.bar{display:flex;gap:10px;align-items:center;margin:10px 0;flex-wrap:wrap;font-size:12px;color:var(--dim)}
#tbl th{cursor:pointer;user-select:none}
#tbl th .dir{color:var(--accent)}
tr.filters td{padding:4px 6px;background:var(--bg)}
tr.filters input{width:100%;min-width:72px;font:12px/1.4 inherit;padding:3px 7px;
                 border:1px solid var(--line);border-radius:5px;background:var(--card);color:var(--fg)}
#tbl tbody tr{cursor:pointer}
td .null{color:var(--dim);opacity:.6}
td.wide{white-space:normal;min-width:220px;max-width:420px;font-size:12px}
#drawer{position:fixed;top:0;right:0;bottom:0;width:min(560px,90vw);background:var(--card);
        border-left:1px solid var(--line);box-shadow:var(--shadow);
        transform:translateX(100%);transition:transform .15s ease;overflow-y:auto;z-index:50}
#drawer.open{transform:none}
#drawer .head{position:sticky;top:0;background:var(--card);display:flex;gap:10px;align-items:center;
              padding:14px 18px;border-bottom:1px solid var(--line)}
#drawer .body{padding:14px 18px}
#drawer dl{margin:0;display:grid;grid-template-columns:max-content 1fr;gap:6px 14px;font-size:13px}
#drawer dt{color:var(--dim);font-size:12px;padding-top:2px}
#drawer dd{margin:0;word-break:break-all}
#drawer pre{background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:10px 12px;
            overflow-x:auto;font:12px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace;
            white-space:pre-wrap;word-break:break-all}
/* 对象存储浏览器（D72 附二） */
.folder{font-size:13px}
.fgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px;margin:8px 0 16px}
.fcard{display:block;border:1px solid var(--line);border-radius:8px;overflow:hidden;
       background:var(--card);text-decoration:none;color:inherit;transition:border-color .12s}
.fcard:hover{border-color:var(--accent)}
.fcard img{width:100%;height:130px;object-fit:contain;background:var(--bg);display:block}
.fcard .fname{font-size:12px;padding:6px 8px 0;word-break:break-all;line-height:1.35}
.fcard .fmeta{font-size:11px;color:var(--dim);padding:2px 8px 8px}
/* 行动作（D71）：注册表声明的按钮与泛型表单 */
#drawer .actbar{margin:0 0 12px;padding-bottom:12px;border-bottom:1px solid var(--line)}
.actform label{display:block;font-size:12px;color:var(--dim);margin:10px 0 3px}
.actform input{width:100%;background:var(--bg)}
.actform .bar{margin-top:14px}

/* ---- 目录 / 设置 ---- */
.c-system{background:var(--runbg);color:var(--run)}
.c-domain{background:var(--warnbg);color:var(--warn)}
td code{background:var(--bg);padding:1px 5px;border-radius:4px}
.formcard{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:18px 20px}
.formcard label{display:block;font-size:12px;color:var(--dim);margin:14px 0 4px}
.formcard label:first-child{margin-top:0}
.formcard input,.formcard select{width:100%;background:var(--bg)}
.formcard .row{display:flex;gap:10px;margin-top:18px;align-items:center}
.note-box{border-left:3px solid var(--warn);background:var(--warnbg);padding:10px 14px;
          border-radius:0 6px 6px 0;font-size:13px;margin-top:14px}
.note-box.danger{border-color:var(--bad);background:var(--badbg)}
.result{margin-top:16px;padding:12px 14px;border-radius:6px;font-size:13px;display:none}
.result.ok{background:var(--okbg);color:var(--ok);display:block}
.result.bad{background:var(--badbg);color:var(--bad);display:block}

/* ---- 数据卡（D52）：助手回复里的数据集引用，点开在主区解引用 ---- */
.dscard{display:inline-flex;align-items:center;gap:6px;padding:2px 10px;margin:2px 0;
  border:1px solid var(--line2);border-radius:999px;background:var(--card);
  text-decoration:none;color:var(--accent);font-weight:600;font-size:.93em;line-height:1.5}
.dscard:hover{border-color:var(--accent)}

/* 上下文水位（D58）：坞头的会话行，跨过软线变黄、满了变红 */
#a-who.warnish{color:var(--warn)}
#a-who.err{color:var(--bad);font-weight:600}

/* 平台自检页（D87）。判定条 + 两栏清单：框架层常态全绿，业务层是队列。 */
.verdict { padding: 12px 16px; border-radius: var(--radius); border: 1px solid; font-weight: 600; }
.verdict.ok  { color: var(--ok);  border-color: var(--ok);  background: var(--okbg); }
.verdict.bad { color: var(--bad); border-color: var(--bad); background: var(--badbg); }
.ok-line { color: var(--ok); font-weight: 600; }
ul.lint { margin: 0; padding-left: 18px; }
ul.lint li { margin: 4px 0; line-height: 1.55; }
ul.lint li.bad  { color: var(--bad); }
ul.lint li.warn { color: var(--warn); }

button.mini { margin-left: 4px; }

/* 列级语义的小标签（语义页，164）。角色用色区分：度量 / 维度 / 标识 / 文本（.tag 本体在 base.css） */
.tag-measure{border-color:var(--accent);color:var(--accent)}
.tag-dim{border-color:var(--ok);color:var(--ok)}
.tag-id{border-color:var(--warn);color:var(--warn)}

/* ---- 业务流程图（190）。管理台第一个业务形状的面。
   上色全走 CSS 类（不是 SVG 属性），所以亮/暗主题自动跟随；
   位置有含义：横轴生命周期、纵轴部门泳道——换泳道就是换手。 ---- */
.fbar{display:flex;flex-wrap:wrap;gap:18px;align-items:center;margin-bottom:9px}
.fbargrp{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.fbargrp b{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--dim);font-weight:600}
.flowwrap{display:grid;grid-template-columns:1fr 340px;gap:16px;align-items:start}
@media (max-width:1100px){.flowwrap{grid-template-columns:1fr}}
.flowcanvas{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:8px;overflow:auto;min-height:220px}
/* 边：默认只有一条中性主链；选中业务线时才画那条线自己的路径（跳过的步会成一条长边） */
.edge{fill:none;stroke:var(--line2);stroke-width:1.6}
.edge.spine{stroke:var(--line2)}
.edge.f-dropship{stroke:var(--run);stroke-width:2}
.edge.f-ecom{stroke:var(--ok);stroke-width:2}
.edge.f-wholesale{stroke:var(--warn);stroke-width:2}
.edge.f-pos{stroke:var(--accent);stroke-width:2}
/* X6 的节点：body 是 rect.node-box，文本是 text.nm/.sub/.use。
   只设 class 不设 fill/stroke——表现属性优先级低于样式表，所以主题切换自动跟随 */
.node-box{fill:var(--card);stroke:var(--line2);stroke-width:1.5;cursor:pointer}
.node-box.t0{fill:var(--bg);stroke:var(--dim);stroke-dasharray:5 4}
.node-box.t1{fill:var(--warnbg);stroke:var(--warn)}
.node-box.t2{fill:var(--runbg);stroke:var(--run)}
.node-box.t3{fill:var(--okbg);stroke:var(--ok);stroke-width:2.5}
/* 已被人圈全的节点加一道实边——审核进度也是图上的信息 */
.node-box.ok{stroke-width:3}
.node-box.sel{stroke:var(--accent);stroke-width:3}
.node-box.dim{opacity:.3}
.x6-node text.nm{fill:var(--fg);font:600 13px/1 ui-sans-serif,system-ui;pointer-events:none}
.x6-node text.sub{fill:var(--dim);font:11px/1 ui-sans-serif,system-ui;pointer-events:none}
.x6-node text.use{fill:var(--dim);font:600 11.5px/1 ui-monospace,monospace;pointer-events:none}
.x6-node text.dim{opacity:.35}
.x6-graph-svg{display:block}
.fdot.off{fill:none;stroke:var(--line2);stroke-width:1.2}
.fdot.on.f-dropship{fill:var(--run)} .fdot.on.f-ecom{fill:var(--ok)} .fdot.on.f-wholesale{fill:var(--warn)} .fdot.on.f-pos{fill:var(--accent)}
.fdetail{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:14px 16px;font-size:13px}
.fdetail h3{margin:0 0 12px;font-size:15px;display:flex;align-items:center;gap:8px}
.fdetail h4{margin:16px 0 8px;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--dim)}
.frow{display:grid;grid-template-columns:78px 1fr;gap:8px;padding:5px 0;border-top:1px solid var(--line);line-height:1.55}
.frow>span{color:var(--dim);font-size:11.5px}
.frow input{width:100%;padding:3px 7px;font-size:12.5px}
.fstep{padding:8px 0;border-top:1px solid var(--line)}
.fstep label{display:flex;align-items:center;gap:7px;cursor:pointer}
.fstep .muted,.fstep .hint{margin-left:22px}
/* 详情面板的三个页签（192）：详情＝人审可改，结构树＝看形状，JSON＝给工程师和 Agent 的原样 */
.ftabs{display:flex;gap:6px;margin:0 0 10px}
.ftree details{margin:2px 0}
.ftree summary{cursor:pointer;font-size:12px;font-weight:600;color:var(--dim);
               letter-spacing:.04em;padding:3px 0;list-style:none}
.ftree summary::-webkit-details-marker{display:none}
.ftree summary::before{content:'▸';display:inline-block;width:12px;color:var(--line2);transition:transform .12s}
.ftree details[open]>summary::before{transform:rotate(90deg)}
.ftree summary i{font-style:normal;font-weight:400;color:var(--line2);margin-left:4px}
.ftree ul{margin:0 0 6px;padding-left:20px;list-style:none;border-left:1px solid var(--line)}
.ftree li{padding:3px 0 3px 8px;font-size:12.5px;line-height:1.55}
.ftree li b{color:var(--dim);font-weight:500;margin-right:5px}
.ftree .okmark{color:var(--ok);font-weight:600}
.fjson-bar{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:7px}
.fjson pre{margin:0;background:var(--bg);border:1px solid var(--line);border-radius:6px;
           padding:10px;font:11.5px/1.5 ui-monospace,monospace;max-height:52vh;overflow:auto;white-space:pre}
.ffind{padding:7px 0;border-top:1px solid var(--line);font-size:12.5px}
/* 证据条（193）：只分三档，用【填充深浅】不用第三套颜色——档位已经占了颜色。
   空心越多，这个节点的证据越弱，越该先看。 */
.prov{stroke:var(--line2);stroke-width:1}
.prov.strong{fill:var(--dim)}
.prov.mid{fill:var(--dim);fill-opacity:.42}
.prov.weak{fill:none}
.prov.na{fill:none;stroke:none}
.provlegend{display:inline-flex;align-items:center;gap:4px;font-size:11.5px;color:var(--dim)}
.provlegend i{width:9px;height:8px;border-radius:2px;border:1px solid var(--line2);display:inline-block}
.provlegend i.strong{background:var(--dim)}
.provlegend i.mid{background:var(--dim);opacity:.45}
.provlegend i.weak{background:transparent}
.ftree em.pv{font-style:normal;font-size:10.5px;margin-left:6px;padding:0 5px;border-radius:3px;
             border:1px solid var(--line2);color:var(--dim)}

/* ── 实体图（203–207）─────────────────────────────────────────────────────
   列＝口径宇宙，所以【跨列的边】是这张图最要紧的一条信息：连得上不等于加得起。
   它必须和同宇宙的边长得不一样，否则「不可相加」这条口径又退回成一句要人记住的话。 */
.x6-node text.uni{fill:var(--dim);font:600 11px/1 ui-sans-serif,system-ui;
                  letter-spacing:.08em;text-transform:uppercase;pointer-events:none}
.edge.cross{stroke:var(--warn);stroke-width:1.8;stroke-dasharray:6 4}
.x6-edge text.cardlbl{fill:var(--dim);font:600 10.5px/1 ui-monospace,monospace}
.x6-edge rect.cardbg{fill:var(--card);stroke:var(--line);rx:3;ry:3}
/* 审计标记：这两个不会让任何东西报错，只会让依赖它们的推导静静地少东西——
   所以要在结构树里显眼，不能只当成一个字段 */
.warnpill{display:inline-block;font-size:10.5px;padding:0 6px;border-radius:3px;margin-left:5px;
          background:var(--warnbg);color:var(--warn);border:1px solid var(--warn);white-space:nowrap}
/* 附加口径的影子节点（212）：同一实体在另一个口径里的投影。虚线 + 弱填充，
   一眼就看出「这不是一个独立实体，是本体的另一半口径」。分裂边用 accent 虚线，
   和跨口径的红虚线（不可相加）区分开——这条说的是「同一个东西」不是「不能相加」 */
.node-box.ghost{fill:var(--bg);stroke:var(--accent);stroke-width:1.4;stroke-dasharray:5 3;opacity:.85}
.edge.split{stroke:var(--accent);stroke-width:1.5;stroke-dasharray:3 3}

/* 部署检测横幅：固定在底部居中，不挡内容。accent 描边＝「这是平台在跟你说话」，
   和业务告警的红/黄分开——它不是故障，是一次友好的提醒 */
.updatebar{position:fixed;left:50%;bottom:22px;transform:translateX(-50%);z-index:60;
  display:flex;align-items:center;gap:10px;padding:9px 14px;border-radius:9px;
  background:var(--card);border:1px solid var(--accent);
  box-shadow:0 6px 22px rgba(0,0,0,.20);font-size:13px;color:var(--fg)}
.updatebar .tab{margin:0}
.ftree em.pv.strong{border-color:var(--dim);color:var(--fg)}
.ftree em.pv.weak{border-style:dashed}
