/* 模块工作台样式:与 v2 工作台同一套主题 token(四色:算蓝 / 搬橙 / 传青绿 / 存紫),类名一律 mw- 前缀。 */
:root {
  --c-comp: #2a78d6; --c-mem: #eb6834; --c-net: #1baf7a; --c-store: #4a3aa7; --c-warn: #d23b2e; --c-ok: #1d8a4e;
  --c-comp-t: #256ec7; --c-mem-t: #c94c18; --c-net-t: #0d7f51; --c-store-t: #4a3aa7; --c-ok-t: #1a7f47; --c-warn-t: #d23b2e;
  --on-accent: #ffffff;
  --bg: #f4f6f9; --bg-panel: #ffffff; --bg-sub: #eaedf2; --bg-code: #f6f7fa; --bg-hl: #fff3c9;
  --fg: #1c2430; --fg-dim: #5a6472; --fg-faint: #98a1ad; --border: #d7dde5;
  --tip-bg: #202836; --tip-fg: #f3f6fa; --shadow: 0 1px 3px rgba(20, 28, 40, .08);
  --top-h: 52px; --code-w: min(46vw, 760px);
  --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --c-comp: #3987e5; --c-mem: #d95926; --c-net: #199e70; --c-store: #9085e9; --c-warn: #e25a4e; --c-ok: #2ea56a;
    --c-comp-t: #4d95ec; --c-mem-t: #ea6d38; --c-net-t: #1fae7c; --c-store-t: #9a90ec; --c-ok-t: #2ea56a; --c-warn-t: #ea6a60;
    --on-accent: #12161c;
    --bg: #12161c; --bg-panel: #1a212b; --bg-sub: #232c38; --bg-code: #151b23; --bg-hl: #3a3420;
    --fg: #e6eaf0; --fg-dim: #a8b1bd; --fg-faint: #6b7583; --border: #303a47;
    --tip-bg: #e6eaf0; --tip-fg: #12161c; --shadow: 0 1px 3px rgba(0, 0, 0, .4);
  }
}
:root[data-theme="dark"] {
  --c-comp: #3987e5; --c-mem: #d95926; --c-net: #199e70; --c-store: #9085e9; --c-warn: #e25a4e; --c-ok: #2ea56a;
  --c-comp-t: #4d95ec; --c-mem-t: #ea6d38; --c-net-t: #1fae7c; --c-store-t: #9a90ec; --c-ok-t: #2ea56a; --c-warn-t: #ea6a60;
  --on-accent: #12161c;
  --bg: #12161c; --bg-panel: #1a212b; --bg-sub: #232c38; --bg-code: #151b23; --bg-hl: #3a3420;
  --fg: #e6eaf0; --fg-dim: #a8b1bd; --fg-faint: #6b7583; --border: #303a47;
  --tip-bg: #e6eaf0; --tip-fg: #12161c; --shadow: 0 1px 3px rgba(0, 0, 0, .4);
}

* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
body { background: var(--bg); color: var(--fg); font: 14px/1.55 "PingFang SC", "Microsoft YaHei", "Noto Sans CJK SC", system-ui, sans-serif; }
h1, h2, h3 { margin: 0; font-weight: 600; }
:focus-visible { outline: 2px solid var(--c-comp); outline-offset: 2px; }
.mw-mono, .mw-nm, .mw-f, .mw-expr { font-family: var(--mono); }
.mw-dim { color: var(--fg-dim); }
.mw-nw { white-space: nowrap; }
.mw-num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.mw-ok { color: var(--c-ok-t); font-weight: 600; }
.mw-bad { color: var(--c-warn-t); font-weight: 600; }
.mw-warn { color: var(--c-warn-t); font-size: 12.5px; margin: 2px 0 6px; }
.mw-hint { color: var(--fg-dim); font-size: 12.5px; margin: 8px 0 0; }

/* ── 顶栏 ── */
.mw-top { position: sticky; top: 0; z-index: 30; height: var(--top-h); display: flex; align-items: center; gap: 12px;
  padding: 0 18px; background: var(--bg-panel); border-bottom: 1px solid var(--border); }
.mw-brand { display: flex; align-items: baseline; gap: 10px; flex: 1; min-width: 0; }
.mw-brand b { font-size: 17px; }
.mw-brand span { color: var(--fg-dim); font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mw-top-actions { display: flex; gap: 8px; }
.mw-brand .mw-switch { margin-left: 12px; font-size: 12.5px; color: var(--c-comp-t); text-decoration: none; white-space: nowrap; border: 1px solid var(--border); border-radius: 12px; padding: 1px 9px; }
.mw-brand .mw-switch:hover { background: var(--bg-sub); }
.mw-segs { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
.mw-seg-l { font-size: 12.5px; color: var(--fg-dim); margin-right: 2px; }
.mw-btn { height: 32px; padding: 0 12px; border-radius: 16px; border: 1px solid var(--border); background: var(--bg-sub);
  color: var(--fg); font: inherit; font-size: 13px; cursor: pointer; white-space: nowrap; }
.mw-btn:hover { background: var(--bg-panel); }
.mw-btn.mw-sm { height: 26px; padding: 0 10px; font-size: 12.5px; }
.mw-theme { width: 32px; padding: 0; }

/* ── 布局 ── */
.mw-layout { display: grid; grid-template-columns: 300px minmax(0, 1fr); gap: 14px; padding: 14px; max-width: 1680px; margin: 0 auto; }
body.mw-code-open .mw-layout { margin-right: var(--code-w); max-width: none; }
/* 源码面板打开时:宽屏把主区让出面板宽度;不到 1900 px 时侧栏先让位(读代码时用不到负载 / 硬件配置,关面板即恢复) */
@media (max-width: 1900px) { body.mw-code-open .mw-layout { grid-template-columns: minmax(0, 1fr); } body.mw-code-open .mw-side { display: none; } }
@media (max-width: 1100px) { body.mw-code-open .mw-layout { margin-right: 0; } }
@media (max-width: 960px) { .mw-layout { grid-template-columns: minmax(0, 1fr); } :root { --code-w: 100vw; } }

/* ── 侧栏 ── */
.mw-side { align-self: start; position: sticky; top: calc(var(--top-h) + 14px); max-height: calc(100vh - var(--top-h) - 28px);
  overflow: auto; background: var(--bg-panel); border: 1px solid var(--border); border-radius: 10px; padding: 6px 12px 12px; box-shadow: var(--shadow); }
@media (max-width: 960px) { .mw-side { position: static; max-height: none; } }
.mw-sec { border-bottom: 1px solid var(--border); padding: 6px 0; }
.mw-sec > summary { cursor: pointer; display: flex; align-items: baseline; gap: 8px; padding: 4px 0; list-style: none; }
.mw-sec > summary::-webkit-details-marker { display: none; }
.mw-sec > summary::before { content: "▸"; color: var(--fg-faint); width: 10px; }
.mw-sec[open] > summary::before { content: "▾"; }
.mw-sec-t { font-weight: 600; }
.mw-sec-sum { margin-left: auto; color: var(--fg-dim); font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 170px; }
.mw-sec-body { padding: 4px 0 2px; }
.mw-sub { margin: 6px 0; }
.mw-sub > summary { cursor: pointer; color: var(--fg-dim); font-size: 13px; }
.mw-field { display: flex; align-items: center; gap: 8px; margin: 5px 0; }
.mw-flabel { flex: 0 0 118px; color: var(--fg-dim); font-size: 13px; }
.mw-flabel[data-tip] { text-decoration: underline dotted var(--fg-faint); text-underline-offset: 3px; cursor: help; }
.mw-field input[type=number], .mw-field select { flex: 1; min-width: 0; height: 28px; padding: 0 8px; border: 1px solid var(--border);
  border-radius: 6px; background: var(--bg-sub); color: var(--fg); font: inherit; font-size: 13px; }
.mw-field input:disabled { opacity: .55; }
/* 需要引起注意的输入(片上 L2 为 0:注意力的 K / V 全从显存搬) */
.mw-field-bad .mw-flabel { color: var(--c-warn-t); font-weight: 600; }
.mw-field-bad input[type=number] { border-color: var(--c-warn); color: var(--c-warn-t); background: color-mix(in srgb, var(--c-warn) 10%, var(--bg-sub)); }
.mw-field.mw-wide { flex-wrap: wrap; }
.mw-field.mw-wide .mw-flabel { flex-basis: 100%; }
.mw-check input { margin: 0; }
.mw-echo { font-size: 12.5px; color: var(--fg-dim); margin: 6px 0; line-height: 1.6; }
.mw-echo b { color: var(--fg); }
.mw-echo .mw-bad { color: var(--c-warn-t); }   /* 回显里的告警(片上 L2 为 0)压过上面的 b 颜色 */
.mw-side-note { font-size: 12.5px; color: var(--fg-dim); background: var(--bg-sub); border-radius: 8px; padding: 8px 10px; margin: 10px 0 0; }
.mw-subhead { margin: 10px 0 2px; padding-top: 8px; border-top: 1px dashed var(--border); font-size: 12.5px; font-weight: 600; color: var(--fg-dim); }
/* 未运行的模块(无参考素材时的视频 VAE 编码):虚线框、弱化数值 */
.mw-pc.mw-idle { background: var(--bg-sub); border-style: dashed; box-shadow: none; }
.mw-pc.mw-idle .mw-pc-t { color: var(--fg-faint); }
.mw-b-idle { color: var(--fg-faint); }

/* ── 流水线条 ── */
.mw-pipe { display: flex; align-items: stretch; gap: 8px; overflow-x: auto; padding-bottom: 4px; }
.mw-flow { align-self: center; color: var(--fg-faint); font-size: 18px; }
.mw-pc { flex: 1 1 0; min-width: 190px; display: flex; flex-direction: column; gap: 3px; text-align: left; padding: 10px 12px;
  background: var(--bg-panel); border: 1px solid var(--border); border-radius: 10px; color: var(--fg); font: inherit; cursor: pointer; box-shadow: var(--shadow); }
.mw-pc.mw-on { border-color: var(--c-comp); box-shadow: 0 0 0 2px color-mix(in srgb, var(--c-comp) 30%, transparent); }
.mw-pc.mw-total { cursor: default; background: var(--bg-sub); }
.mw-pc-h { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 2px 8px; font-size: 13px; }
.mw-pc-h b { white-space: nowrap; }   /* 模块名不折行;运行说明长时整体换到下一行 */
.mw-pc-h span { color: var(--fg-dim); font-size: 12px; }
.mw-pc-t { font-size: 20px; font-weight: 600; font-variant-numeric: tabular-nums; }
.mw-pc-t .mw-dim { font-size: 12.5px; font-weight: 400; }
.mw-pc-l, .mw-pc-c { font-size: 12px; color: var(--fg-dim); }
.mw-bar { display: block; height: 4px; background: var(--bg-sub); border-radius: 2px; overflow: hidden; }
.mw-bar i { display: block; height: 100%; background: var(--c-comp); }
.mw-pc-b { align-self: flex-start; font-size: 11.5px; padding: 1px 7px; border-radius: 9px; background: var(--bg-sub); color: var(--fg-dim); }
.mw-b-comp { color: var(--c-comp-t); background: color-mix(in srgb, var(--c-comp) 12%, transparent); }
.mw-b-mem { color: var(--c-mem-t); background: color-mix(in srgb, var(--c-mem) 12%, transparent); }
.mw-b-net { color: var(--c-net-t); background: color-mix(in srgb, var(--c-net) 12%, transparent); }
.mw-b-ok { color: var(--c-ok-t); background: color-mix(in srgb, var(--c-ok) 12%, transparent); }
.mw-b-bad { color: var(--c-warn-t); background: color-mix(in srgb, var(--c-warn) 12%, transparent); }
.mw-pc-bs { display: flex; flex-wrap: wrap; gap: 4px; }   /* 流式总卡:实时 / 显存两枚徽章并排 */
.mw-params td:first-child { white-space: nowrap; }       /* 模型超参表:符号列不折行 */
.mw-params td:nth-child(3) { white-space: nowrap; }

/* ── 页签 / 分段 ── */
.mw-tabs { display: flex; gap: 6px; margin: 12px 0 10px; border-bottom: 1px solid var(--border); position: sticky; top: var(--top-h); z-index: 20; background: var(--bg); padding-top: 6px; }
.mw-tab { border: none; background: none; font: inherit; padding: 7px 12px; color: var(--fg-dim); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px; }
.mw-tab.mw-on { color: var(--fg); border-bottom-color: var(--c-comp); font-weight: 600; }
.mw-mhead { display: flex; justify-content: space-between; align-items: flex-end; gap: 12px; flex-wrap: wrap; margin: 2px 0 10px; }
.mw-mhead h1 { font-size: 20px; }
.mw-mhead h1 .mw-dim { font-size: 13px; font-weight: 400; font-family: var(--mono); }
.mw-mhead p { margin: 4px 0 0; font-size: 13px; }
.mw-seg { display: inline-flex; border: 1px solid var(--border); border-radius: 8px; overflow: hidden; background: var(--bg-panel); }
.mw-seg button { border: none; background: none; font: inherit; font-size: 13px; padding: 6px 12px; color: var(--fg-dim); cursor: pointer; }
.mw-seg button.mw-on { background: var(--c-comp); color: var(--on-accent); }
.mw-link { border: none; background: none; padding: 0; font: inherit; color: var(--c-comp-t); cursor: pointer; font-weight: 600; }

/* ── 卡片 / tile ── */
.mw-card { background: var(--bg-panel); border: 1px solid var(--border); border-radius: 10px; padding: 12px 14px; margin: 0 0 12px; box-shadow: var(--shadow); }
.mw-card-h { font-size: 15px; margin-bottom: 8px; display: flex; gap: 8px; align-items: baseline; }
.mw-card-x { margin-left: auto; font-weight: 400; font-size: 12.5px; }
.mw-h3 { font-size: 13.5px; margin: 12px 0 6px; }
.mw-tiles { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; margin: 0 0 12px; }
.mw-tile { background: var(--bg-panel); border: 1px solid var(--border); border-radius: 10px; padding: 10px 12px; box-shadow: var(--shadow); }
.mw-card .mw-tile { box-shadow: none; background: var(--bg-sub); }
.mw-tile-l { font-size: 12.5px; color: var(--fg-dim); }
.mw-tile-v { font-size: 19px; font-weight: 600; font-variant-numeric: tabular-nums; }
.mw-tile-s { font-size: 12px; color: var(--fg-dim); }
.mw-t-bad .mw-tile-v { color: var(--c-warn-t); }

/* ── 表格 ── */
.mw-scroll { overflow-x: auto; }
.mw-tbl { width: 100%; border-collapse: collapse; font-size: 13px; }
.mw-tbl th { text-align: left; font-weight: 600; color: var(--fg-dim); font-size: 12.5px; padding: 6px 8px; border-bottom: 1px solid var(--border); background: var(--bg-panel); }
.mw-tbl td { padding: 6px 8px; border-bottom: 1px solid var(--border); vertical-align: top; }
.mw-tbl tr.mw-sect td { background: var(--bg-sub); font-weight: 600; font-size: 12.5px; color: var(--fg-dim); padding: 4px 8px; }
.mw-expr { font-size: 12.5px; word-break: break-word; }
.mw-chain td:nth-child(2) { font-family: var(--mono); font-size: 12.5px; min-width: 220px; }
.mw-c-lhs { white-space: nowrap; }
.mw-c-rhs { font-family: var(--mono); font-size: 12.5px; }
.mw-c-val { white-space: nowrap; text-align: right; font-variant-numeric: tabular-nums; }
.mw-c-note { color: var(--fg-dim); font-size: 12.5px; }
.mw-steps td:nth-child(1) { white-space: nowrap; }
.mw-steps td:nth-child(2) { width: 22%; font-size: 12.5px; }

/* ── 逐层表 ── */
.mw-tools { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin: 0 0 8px; }
.mw-inline { font-size: 12.5px; color: var(--fg-dim); display: inline-flex; align-items: center; gap: 4px; margin-left: 6px; }
.mw-inline-cfg { max-width: 360px; margin: 4px 0 8px; }
/* 逐层表按最长的符号给足列宽(text_config.num_attention_heads 这类),比视口宽时走横向滚动,长表的滚动条悬浮在视口底部 */
.mw-tree { table-layout: fixed; min-width: 1960px; }
.mw-tree col.w-name { width: 290px; } .mw-tree col.w-code { width: 140px; } .mw-tree col.w-shape { width: 12%; }
.mw-tree col.w-q { width: 13.5%; } .mw-tree col.w-ci { width: 8.5%; } .mw-tree col.w-share { width: 5%; }
/* 兜底:逐层表格子里再长的符号也在格内折行(overflow-wrap: anywhere),不压到相邻列;其余表格的符号保持不折行 */
.mw-tree .mw-sym { white-space: normal; }
.mw-tree td { overflow-wrap: anywhere; }
/* 左右滑动时冻结前两列(层 / 调用、代码),看得出是哪一层;冻结格用不透明底色,滑过去的内容不透出来 */
.mw-tree th:nth-child(-n+2), .mw-tree td.mw-c-name, .mw-tree td.mw-c-code { position: sticky; z-index: 2; background: var(--bg-panel); }
.mw-tree th:nth-child(1), .mw-tree td.mw-c-name { left: 0; }
/* 第二列贴在第一列右边:--mw-c1 = 第一列实际渲染宽度(mod_app 每次重画 / 改窗口时量;固定布局会把余量摊进各列,不能写死 290px) */
.mw-tree th:nth-child(2), .mw-tree td.mw-c-code { left: var(--mw-c1, 290px); box-shadow: inset -1px 0 0 var(--border); }
.mw-scroll.mw-sx .mw-tree th:nth-child(2), .mw-scroll.mw-sx .mw-tree td.mw-c-code { box-shadow: inset -1px 0 0 var(--border), 8px 0 8px -6px rgba(20, 28, 40, .25); }
.mw-tree .mw-row.mw-g > td.mw-c-name, .mw-tree .mw-row.mw-g > td.mw-c-code { background: color-mix(in srgb, var(--bg-sub) 55%, var(--bg-panel)); }
.mw-tree .mw-row.mw-sel > td.mw-c-name, .mw-tree .mw-row.mw-sel > td.mw-c-code { background: color-mix(in srgb, var(--c-comp) 12%, var(--bg-panel)); }
/* 横向滚动条:表内的加粗一点;悬浮条贴视口底边,左右与当前表格对齐、与它同步滚动 */
.mw-scroll, .mw-hfloat { scrollbar-width: auto; scrollbar-color: var(--fg-faint) transparent; }
.mw-scroll::-webkit-scrollbar, .mw-hfloat::-webkit-scrollbar { height: 12px; }
.mw-scroll::-webkit-scrollbar-thumb, .mw-hfloat::-webkit-scrollbar-thumb { background: var(--fg-faint); border-radius: 6px; border: 3px solid transparent; background-clip: content-box; }
.mw-hfloat { position: fixed; bottom: 0; z-index: 24; height: 16px; overflow-x: auto; overflow-y: hidden;
  background: color-mix(in srgb, var(--bg-panel) 92%, transparent); border-top: 1px solid var(--border); box-shadow: 0 -2px 8px rgba(20, 28, 40, .08); }
.mw-hfloat[hidden] { display: none; }
.mw-hfloat-in { height: 1px; }
.mw-row.mw-g > td { background: color-mix(in srgb, var(--bg-sub) 55%, transparent); }
.mw-row.mw-sel > td { background: color-mix(in srgb, var(--c-comp) 12%, var(--bg-panel)); }
.mw-row.mw-flash > td { animation: mwflash 1.6s ease; }
@keyframes mwflash { from { background: var(--bg-hl); } }   /* 淡回格子自己的底色(冻结列不透明,不能淡到透明) */
.mw-nwrap { position: relative; }
.mw-tg { width: 18px; height: 18px; border: none; background: none; color: var(--fg-dim); cursor: pointer; padding: 0; font-size: 12px; vertical-align: 1px; }
.mw-tg-leaf { display: inline-block; }
.mw-kind { display: inline-block; font-size: 10.5px; padding: 0 5px; margin-right: 5px; border-radius: 4px; background: var(--bg-sub); color: var(--fg-dim); vertical-align: 1px; }
.mw-k-linear, .mw-k-conv { color: var(--c-comp-t); } .mw-k-attn { color: var(--c-comp-t); font-weight: 600; }
.mw-k-stack, .mw-k-loop { color: var(--c-store-t); }
.mw-nm { font-size: 13px; font-weight: 600; word-break: break-all; }
.mw-rep { display: inline-block; margin-left: 6px; font-size: 12px; color: var(--c-store-t); font-family: var(--mono); }
.mw-zh { font-size: 12px; color: var(--fg-dim); padding-left: 18px; }
.mw-code-chip { display: inline-block; margin: 0 4px 3px 0; padding: 1px 6px; border-radius: 5px; border: 1px solid var(--border); background: var(--bg-code);
  color: var(--c-comp-t); font: 11.5px/1.5 var(--mono); cursor: pointer; white-space: normal; word-break: break-all; text-align: left; max-width: 100%; }
.mw-code-chip:hover { border-color: var(--c-comp); }
.mw-c-shape { font-size: 12px; }
.mw-ten { font-family: var(--mono); word-break: break-word; }
.mw-ten + .mw-ten { margin-top: 5px; }
.mw-tv { font-variant-numeric: tabular-nums; font-weight: 600; color: var(--fg); }   /* 数值尺寸是主内容 */
.mw-tsym { color: var(--fg-dim); font-size: 11px; line-height: 1.4; }            /* 变量名 + 符号维度作小字备注 */
.mw-tn { color: var(--fg-faint); }
.mw-c-ci { white-space: nowrap; }
.mw-ci { cursor: help; border-bottom: 1px dotted var(--fg-faint); }
.mw-ci-mem { color: var(--c-mem-t); }     /* 计算强度低于硬件 ridge:带宽先到顶 */
.mw-ci-comp { color: var(--c-comp-t); }   /* 高于 ridge:算力先到顶 */
.mw-kvrd { margin-top: 4px; color: var(--c-mem-t); }
.mw-arrow { color: var(--fg-faint); font-size: 11px; line-height: 1.1; }
.mw-v { font-variant-numeric: tabular-nums; font-weight: 600; }
.mw-f { font-size: 11.5px; color: var(--fg-dim); word-break: break-word; line-height: 1.45; }
.mw-empty { color: var(--fg-faint); }
.mw-excl, .mw-row-excl .mw-v { color: var(--fg-faint); }
.mw-badge { font: 11px/1.4 inherit; padding: 0 5px; border-radius: 8px; background: var(--bg-sub); color: var(--fg-dim); cursor: help; font-family: inherit; font-weight: 400; }
.mw-zero { font-size: 11.5px; color: var(--fg-faint); cursor: help; border-bottom: 1px dotted var(--fg-faint); }
.mw-info { color: var(--fg-faint); cursor: help; font-size: 11.5px; }
.mw-c-share { white-space: nowrap; font-size: 11.5px; }
.mw-sh { display: block; height: 6px; background: var(--bg-sub); border-radius: 3px; overflow: hidden; margin: 4px 0 2px; }
.mw-sh i { display: block; height: 100%; background: var(--c-comp); }
.mw-sh.mw-sh-x i { background: var(--fg-faint); }

/* ── 符号 ── */
.mw-sym { cursor: help; border-bottom: 1px dotted currentColor; white-space: nowrap; }
.mw-s-q { color: var(--c-comp-t); }
.mw-s-param { color: var(--c-store-t); }
.mw-s-input, .mw-s-geo { color: var(--c-net-t); }
.mw-sym[data-goto] { cursor: pointer; }
.mw-symname { font-family: var(--mono); font-weight: 600; }
.mw-fn { color: var(--fg-dim); }
/* ui_format.exprHtml(部署公式)产出的类 */
.sym { border-bottom: 1px dotted var(--fg-faint); cursor: help; }
.sym-unknown { color: var(--fg-faint); }
.lit { color: var(--c-mem-t); }
.fn { color: var(--fg-dim); }

/* ── 部署 ── */
.mw-cfg { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 4px 18px; }
.mw-cfg-g h3 { font-size: 13px; color: var(--fg-dim); margin: 4px 0; }
/* 部署配置卡:理论量 / 部署两个视图共用,可折叠(折叠状态记在 secOpen) */
.mw-cfgcard { padding: 0; }
.mw-cfgcard > summary { list-style: none; cursor: pointer; padding: 10px 14px; display: flex; flex-wrap: wrap; gap: 2px 10px; align-items: baseline; }
.mw-cfgcard > summary::-webkit-details-marker { display: none; }
.mw-cfgcard > summary::before { content: "▸"; color: var(--fg-dim); font-size: 12px; }
.mw-cfgcard[open] > summary::before { content: "▾"; }
.mw-cfgcard > summary .mw-card-h { margin: 0; }
.mw-cfg-sum { font-size: 12px; color: var(--fg-dim); font-family: var(--mono); }
.mw-cfgcard > .mw-cfg-body { padding: 0 14px 12px; }
.mw-cfg-body > .mw-hint { margin: 6px 0 0; }
.mw-fa-line { font-size: 13px; line-height: 1.7; margin: 0 0 8px; }
.mw-fa td.mw-num, .mw-fa th.mw-num { white-space: nowrap; }
.mw-lat td { vertical-align: middle; }
.mw-barcell { width: 24%; }
.mw-hbar { display: block; height: 10px; background: var(--bg-sub); border-radius: 5px; overflow: hidden; }
.mw-hbar i { display: block; height: 100%; }
.mw-d-comp i { background: var(--c-comp); } .mw-d-mem i { background: var(--c-mem); } .mw-d-net i { background: var(--c-net); }
.mw-bn { color: var(--c-warn-t); font-size: 12px; }

/* ── 可折叠卡片(理论量 / 部署两个视图的每一块)+ 符号链分段折叠 + 算子融合 ── */
.mw-fold { padding: 0; }
.mw-fold > summary { list-style: none; cursor: pointer; padding: 10px 14px; display: flex; flex-wrap: wrap; gap: 2px 10px; align-items: baseline; }
.mw-fold > summary::-webkit-details-marker { display: none; }
.mw-fold > summary::before { content: "▸"; color: var(--fg-dim); font-size: 12px; }
.mw-fold[open] > summary::before { content: "▾"; }
.mw-fold > summary .mw-card-h { margin: 0; flex: 1; }
.mw-fold-sum { font-size: 12px; color: var(--fg-dim); font-family: var(--mono); }
.mw-fold[open] > summary .mw-fold-sum { display: none; }   /* 摘要只在收起时显示 */
.mw-fold > .mw-fold-body { padding: 0 14px 12px; }
.mw-fold-btn { border: none; background: none; padding: 0; font: inherit; font-weight: 600; font-size: 12.5px; color: var(--fg-dim); cursor: pointer; text-align: left; }
.mw-fold-btn:hover { color: var(--fg); }
.mw-fsel { width: 14px; height: 14px; margin: 0 4px 0 0; vertical-align: -2px; cursor: pointer; }
.mw-row.mw-fsel-on > td { background: color-mix(in srgb, var(--c-store) 10%, var(--bg-panel)); }
.mw-row.mw-fsel-on > td.mw-c-name, .mw-row.mw-fsel-on > td.mw-c-code { background: color-mix(in srgb, var(--c-store) 10%, var(--bg-panel)); }
.mw-fuse { font-size: 11.5px; color: var(--c-store-t); cursor: help; border-bottom: 1px dotted var(--c-store-t); white-space: nowrap; }
.mw-fuse-d { font-size: 11.5px; color: var(--c-store-t); }
.mw-fuse-tag { display: inline-flex; align-items: center; gap: 2px; margin-left: 6px; padding: 0 6px; border-radius: 8px; font-size: 11px; font-weight: 600;
  color: var(--on-accent); background: var(--fg-dim); cursor: help; vertical-align: 1px; }
.mw-fuse-x { border: none; background: none; color: inherit; font: inherit; font-size: 12px; line-height: 1; padding: 0 0 0 2px; cursor: pointer; opacity: .8; }
.mw-fuse-x:hover { opacity: 1; }
.mw-fg0 .mw-fuse-tag, .mw-fuse-tag.mw-fg0, li.mw-fg0 b { background: var(--c-store); }
.mw-fg1 .mw-fuse-tag, .mw-fuse-tag.mw-fg1, li.mw-fg1 b { background: var(--c-net); }
.mw-fg2 .mw-fuse-tag, .mw-fuse-tag.mw-fg2, li.mw-fg2 b { background: var(--c-mem); }
.mw-fg3 .mw-fuse-tag, .mw-fuse-tag.mw-fg3, li.mw-fg3 b { background: var(--c-comp); }
.mw-row.mw-fused > td.mw-c-name { box-shadow: inset 3px 0 0 var(--c-store); }
.mw-row.mw-fused.mw-fg1 > td.mw-c-name { box-shadow: inset 3px 0 0 var(--c-net); }
.mw-row.mw-fused.mw-fg2 > td.mw-c-name { box-shadow: inset 3px 0 0 var(--c-mem); }
.mw-row.mw-fused.mw-fg3 > td.mw-c-name { box-shadow: inset 3px 0 0 var(--c-comp); }
.mw-fuse-bar { flex-direction: column; align-items: stretch; gap: 6px; }
.mw-fuse-bar > .mw-merge, .mw-fuse-bar > .mw-btn, .mw-fuse-bar > .mw-inline { align-self: flex-start; }
.mw-fuse-bar > .mw-btn:not(:first-child) { margin-left: 6px; }
.mw-fuse-bar .mw-merge[disabled] { opacity: .5; cursor: not-allowed; }
.mw-fuse-list { margin: 0; padding: 0; list-style: none; display: flex; flex-wrap: wrap; gap: 4px 14px; font-size: 12.5px; }
.mw-fuse-list li b { color: var(--on-accent); padding: 0 5px; border-radius: 7px; font-size: 11px; margin-right: 4px; }
.mw-fuse-list .mw-fuse-x { color: var(--fg-dim); }

/* ── 源码面板 ── */
.mw-code { position: fixed; top: var(--top-h); right: 0; bottom: 0; width: var(--code-w); z-index: 25; display: flex; flex-direction: column;
  background: var(--bg-code); border-left: 1px solid var(--border); box-shadow: -4px 0 16px rgba(0, 0, 0, .08); }
.mw-code[hidden] { display: none; }
.mw-code-h { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; padding: 8px 10px; border-bottom: 1px solid var(--border); background: var(--bg-panel); }
.mw-code-h select { flex: 1; min-width: 0; height: 28px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg-sub); color: var(--fg); font: 12.5px var(--mono); }
.mw-code-p { flex-basis: 100%; font: 11.5px/1.4 var(--mono); color: var(--fg-dim); word-break: break-all; }
.mw-code-b { flex: 1; overflow: auto; font: 12.5px/1.55 var(--mono); padding: 6px 0 40px; }
.mw-ln { display: flex; white-space: pre; min-width: max-content; }
.mw-ln.mw-hl { background: var(--bg-hl); }
.mw-no { flex: 0 0 44px; text-align: right; padding-right: 10px; color: var(--fg-faint); user-select: none; }
.mw-tx { padding-right: 16px; }
.mw-anc, .mw-anc-sp { flex: 0 0 16px; width: 16px; }
.mw-anc { border: none; background: none; padding: 0; color: var(--c-comp); cursor: pointer; font-size: 9px; line-height: 1.9; }
.mw-gap { color: var(--fg-faint); font-size: 11.5px; padding: 4px 0 4px 64px; border-top: 1px dashed var(--border); border-bottom: 1px dashed var(--border); margin: 4px 0; }
.mw-tx i { font-style: normal; }
.mw-tx .k { color: var(--c-comp-t); font-weight: 600; } .mw-tx .s { color: var(--c-net-t); }
.mw-tx .c { color: var(--fg-faint); font-style: italic; } .mw-tx .n { color: var(--c-mem-t); }
.mw-tx .f, .mw-tx .C { color: var(--c-store-t); font-weight: 600; } .mw-tx .d { color: var(--c-mem-t); }
.mw-tx .b { color: var(--c-comp-t); } .mw-tx .S { color: var(--c-store-t); } .mw-tx .p { color: var(--fg); } .mw-tx .a { color: var(--fg); }

/* ── 悬浮说明 ── */
.mw-tip { position: fixed; z-index: 60; max-width: min(560px, 92vw); padding: 8px 10px; border-radius: 8px; background: var(--tip-bg); color: var(--tip-fg);
  font: 12.5px/1.55 var(--mono); white-space: pre-wrap; word-break: break-word; box-shadow: 0 4px 16px rgba(0, 0, 0, .25); pointer-events: none; }
.mw-tip[hidden] { display: none; }

/* Shared model switcher and IR-backed family workbench. */
#mw-model { font-family: inherit; font-size: 16px; font-weight: 600; color: var(--fg); background: var(--bg-panel); border: 1px solid var(--border); border-radius: 6px; padding: 5px 26px 5px 9px; max-width: 100%; }
.mw-family-workbench .mw-tabs { flex-wrap: wrap; padding-bottom: 8px; }
.wb-active { border-color: var(--c-comp); color: var(--c-comp-t); }
.wb-field { display: flex; flex-direction: column; gap: 5px; margin-bottom: 14px; }
.wb-field input, .wb-field select { width: 100%; font: inherit; color: var(--fg); background: var(--bg-panel); border: 1px solid var(--border); padding: 6px 8px; border-radius: 5px; min-width: 0; }
.wb-tiles { display: grid; grid-template-columns: repeat(auto-fit,minmax(170px,1fr)); gap: 12px; }
.wb-tile { display: flex; flex-direction: column; gap: 7px; padding: 12px; background: var(--bg-sub); border-radius: 6px; min-width: 0; }
.wb-tile strong { font-size: 23px; font-weight: 600; font-variant-numeric: tabular-nums; }
.wb-tile small { color: var(--fg-dim); overflow-wrap: anywhere; }
.wb-scroll { overflow-x: auto; }
.wb-table { width: 100%; border-collapse: collapse; font-variant-numeric: tabular-nums; }
.wb-table th, .wb-table td { text-align: left; padding: 10px; border-bottom: 1px solid var(--border); vertical-align: top; }
.wb-table th { font-weight: 600; background: var(--bg-sub); white-space: nowrap; }
.wb-table td { min-width: 90px; }
.wb-table td:first-child { min-width: 210px; }
.wb-details { margin: 14px 0; padding-top: 12px; border-top: 1px solid var(--border); }
.mw-family-workbench summary { cursor: pointer; padding: 7px 0; }
.mw-family-workbench pre { white-space: pre-wrap; overflow-wrap: anywhere; max-width: 900px; font: 13px/1.7 var(--mono); background: var(--bg-code); padding: 12px; }
.wb-charts { display: grid; grid-template-columns: 1fr; }
.wb-chart { border-bottom: 1px solid var(--border); padding: 18px 0; }
.wb-chart:last-child { border: 0; }
.wb-chart h3 { font-size: 18px; }
.wb-chart svg { display: block; width: 100%; max-height: 350px; }
.wb-chart text { fill: var(--fg-dim); font-size: 14px; }
.wb-grid { stroke: var(--border); }
.wb-config { display: grid; grid-template-columns: repeat(auto-fit,minmax(150px,1fr)); gap: 10px 16px; }
.wb-code-line { display: flex; min-width: max-content; white-space: pre; }
.wb-code-line span { width: 55px; padding-right: 10px; text-align: right; color: var(--fg-faint); user-select: none; }
.wb-code-line code { padding-right: 16px; }
.wb-code-selected { background: var(--bg-hl); }
.mw-family-workbench a { color: var(--c-comp-t); }
.mw-family-workbench p { overflow-wrap: anywhere; }
@media(max-width:800px) {
 .mw-top .mw-brand span { display: none; }
 #mw-model { font-size: 13px; max-width: 220px; }
 .mw-top-actions .mw-switch { display: none; }
 .wb-tile strong { font-size: 19px; }
}
