/* ============================================================
   LoomRoom · feature.css — v4「INK & LAMP」功能面板层
   ------------------------------------------------------------
   这里只放"新功能面板"的样式：会议信息条 / 发言队列 / 周看板 /
   协作拓扑 / 本场复盘 / 知识候选 / 知识质量。
   外壳（顶栏、宫格、发言流、操作坞、抽屉）在 base.css / zoom.css /
   room.css 里，不在这里叠加——这是 v3 最大的教训。

   与 v3 的区别：色相从全息青改为台灯琥珀；去掉了 HUD 括号、
   "//" 前缀、辉光与切角；等宽字体只留给数字，不再用于中文标题。
   ============================================================ */

/* ── 会议信息条：从"桌心"变成一条安静的信息栏 ───────────────── */
#table-hub {
  position: static;
  width: 100%; height: auto;
  display: flex; flex-direction: row; align-items: center; gap: 10px;
  padding: 10px 14px;
  border-radius: var(--r);
  background: var(--panel);
  border: 1px solid var(--line-soft);
  box-shadow: none;
  text-align: left;
}
#table-hub::before, #table-hub::after { content: none; }
#table-hub[data-status="running"] { border-color: var(--line); }
#table-hub .hub-topic { font-size: var(--fs-3); font-weight: 600; letter-spacing: 0; color: var(--text); }
#table-hub .hub-topic::before { content: none; }
#table-hub .hub-meta { font-size: var(--fs-2); color: var(--muted); }
#table-hub .hub-status { letter-spacing: 0; font-size: var(--fs-1); color: var(--muted); }
#table-hub[data-status="running"] .hub-status { color: var(--lamp-strong, var(--lamp)); }
#table-hub[data-status="paused"] .hub-status { color: var(--warn); }
.hub-timer[data-state="running"] { color: var(--lamp); }
.hub-conn[data-state="on"] { color: var(--ok); }
.hub-conn[data-state="mock"] { color: var(--warn); }
.hub-conn[data-state="off"] { color: var(--danger); }
.hub-view-btn { border-radius: 6px; }

/* ── 发言队列：安静的排班表 ─────────────────────────────────── */
.floor-queue {
  border-radius: var(--r);
  background: var(--panel);
  border: 1px solid var(--line-soft);
}
.fq-item { border-radius: 4px; }
.fq-item.fq-cur { color: var(--text); background: var(--panel-3); border-color: var(--line); box-shadow: none; }
.fq-item.fq-next { color: var(--text-2); background: transparent; border-color: var(--line-soft); }

/* ── 会中横幅 ───────────────────────────────────────────────── */
.meeting-banner {
  border-radius: var(--r);
  background: var(--panel-2);
  border-color: var(--line-soft);
}
.meeting-banner[data-kind="raise"] { border-color: var(--lamp-line); color: var(--lamp); }
.meeting-banner[data-kind="error"] { border-color: rgba(217, 113, 107, .4); }
.meeting-banner[data-kind="rec"] { color: var(--danger); }

/* ── 复盘 / 知识面板：去等宽标题、去 "//" ───────────────────── */
.review-title, .review-sec-title { font-family: var(--font); letter-spacing: .02em; }
.review-title { font-size: var(--fs-2); color: var(--text); }
.review-sec-title { font-size: var(--fs-1); color: var(--muted); }
.review-block { border-radius: var(--r); border-color: var(--line-soft); background: var(--panel); }
.kn-candidates, .kn-quality { border-radius: var(--r); }
.kn-quality summary { font-family: var(--font); letter-spacing: .02em; }

/* ════════════════════════════════════════════════════════════
   11. P0-2/P0-3/P1-4/P2-2 新增：贡献分 / 契约角标 / 周看板 / 协作拓扑
   ------------------------------------------------------------
   语言沿用 ORBIT：细线 + 等宽数据标签 + 3px 切角 + 全息青主色。
   本节全部为静态样式（不新增任何动画），所以不需要额外的
   prefers-reduced-motion 降级；动效纪律见文件末尾第 10 节。
   ════════════════════════════════════════════════════════════ */

/* ── P0-2：发言气泡脚上的贡献分角标（新意 / 抗压 / 复读） ── */
.b-score {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 1px 8px;
  border-radius: 2px;
  border: 1px solid rgba(200,68,42, .22);
  background: rgba(200,68,42, .06);
  color: var(--cool);
  font-family: var(--font);
  font-size: var(--fs-1);
  letter-spacing: .04em;
  white-space: nowrap;
  cursor: help;
}
/* 只有"复读 / 模板化附和 / 零新意"才用警示色：满屏警示色等于没有警示 */
.b-score.warn {
  color: var(--warn);
  border-color: rgba(166,106,31, .4);
  background: rgba(166,106,31, .08);
}

/* ── P1-4：发言气泡头上的席位契约角标（命中 stance + deliver.slot） ── */
.b-contract {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 0 7px;
  border-radius: 2px;
  font-family: var(--font);
  font-size: var(--fs-1);
  letter-spacing: .06em;
  white-space: nowrap;
  cursor: help;
}
.b-contract.hit {
  color: var(--text);
  border: 1px solid rgba(200,68,42, .38);
  background: rgba(200,68,42, .09);
}
/* 缺失 = 如实标记，不是错误（契约失败不阻断交付），所以用虚线而不是红色 */
.b-contract.missing {
  color: var(--warn, var(--warn));
  border: 1px dashed rgba(166,106,31, .42);
  background: rgba(166,106,31, .06);
}

/* ── P0-3：周看板（北极星 v0） ── */
#panel-weekly .drawer-body { display: flex; flex-direction: column; gap: 13px; }
.weekly-stats {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 10px;
}
.weekly-card {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: 12px 13px 11px;
  border-radius: 3px;
  border: 1px solid rgba(200,68,42, .14);
  background:
    linear-gradient(180deg, rgba(200,68,42, .05), rgba(200,68,42, 0) 55%),
    var(--panel);
}
/* 左上角小 HUD 括号：和抽屉/身份卡同一种"被框住的数据"语言 */
.weekly-card::before {
  content: "";
  position: absolute;
  left: 6px;
  top: 6px;
  width: 9px;
  height: 9px;
  border-left: 1px solid rgba(200,68,42, .5);
  border-top: 1px solid rgba(200,68,42, .5);
  pointer-events: none;
}
.weekly-k {
  font-family: var(--font);
  font-size: var(--fs-1);
  letter-spacing: .02em;
  color: var(--muted);
}
.weekly-v {
  font-family: var(--font);
  font-size: var(--fs-7);
  line-height: 1.1;
  font-weight: 600;
  color: var(--text);
  letter-spacing: .02em;
}
.weekly-sub {
  font-family: var(--font);
  font-size: var(--fs-1);
  color: var(--faint);
  letter-spacing: .02em;
}
.weekly-note {
  font-family: var(--font);
  font-size: var(--fs-1);
  color: var(--muted);
  letter-spacing: .03em;
  line-height: 1.7;
}
/*
 * 周看板空态提示：一屏里多数卡是「—」时补一句"怎么点亮它们"。
 * 与 .weekly-note 同级但更醒目一点点（有左边条），因为它要回答的是"这页是不是没做完"。
 */
.weekly-howto {
  grid-column: 1 / -1;
  margin-top: 4px;
  padding: 9px 12px;
  border-left: 2px solid var(--lamp-soft-strong, var(--line));
  background: var(--tint, rgba(0, 0, 0, .03));
  border-radius: 4px;
  font-family: var(--font);
  font-size: var(--fs-1);
  line-height: 1.7;
  color: var(--muted);
}
.weekly-loading,
.weekly-error {
  padding: 12px 13px;
  border-radius: 3px;
  border: 1px dashed rgba(200,68,42, .2);
  color: var(--muted);
  font-size: var(--fs-2);
}
.weekly-error { border-color: rgba(255, 77, 109, .4); color: var(--danger); }
.weekly-error-hint { margin-top: 6px; font-size: var(--fs-1); color: var(--faint); }
/* ── I6 分层效果（P1-10）：与周看板同一抽屉，单列更易读 ── */
.layers-stats { grid-template-columns: 1fr; }
.layers-card .weekly-v { font-size: var(--fs-6); }
/*
 * ── C2：提前收束率卡片（I2 验收缺口） ──
 * 后端没有已结束的会议时 earlyEndRate = null，这里显示「—」。给"没数据"一个略灰的样式，
 * 让它和"0%"在视觉上也能区分（0% 是个结论，"—"是还没有结论）。
 */
.weekly-card.is-empty .weekly-v { color: var(--faint); }
/*
 * E4：周环比。颜色只表达"好/坏"，不表达"涨/跌" —— 断档 P50 下降是好事，
 * 所以箭头方向由 JS 决定（weekOverWeek 纯函数），CSS 只管三档色调。
 * 持平/缺数据都要"没有颜色"，否则一眼看上去像是变好了。
 */
.weekly-wow { font-size: var(--fs-1); margin-top: 2px; white-space: nowrap; }
.weekly-wow.good { color: var(--ok); }
.weekly-wow.bad { color: var(--danger); }
.weekly-wow.none { color: var(--faint); }
/*
 * ── C3：建会面板的"本场分层" ──
 * 与出席专家同一块：level 的正常来源就是参会者身上的 level，手改只是例外。
 */
.nm-level-row { margin-top: 10px; display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.nm-level-field { display: inline-flex; align-items: center; gap: 8px; }
.nm-level-field .input { width: auto; min-width: 190px; padding: 5px 8px; font-size: var(--fs-2); }
#nm-level-hint { margin-top: 0; flex: 1 1 100%; }
/* 推导值 = pro 时给一点提醒色（pro 意味着这些专家不会拿到支架） */
#nm-level[data-level="pro"] { border-color: rgba(200,68,42, .45); }

.weekly-foot-hint,
.topology-foot-hint {
  margin: 2px 0 0;
  font-size: var(--fs-1);
  color: var(--faint);
  line-height: 1.6;
}

/* ── P2-2：协作拓扑 HUD ── */
#panel-topology { width: min(720px, 96vw); }
#panel-topology .drawer-body { display: flex; flex-direction: column; gap: 11px; }
.topology-legend {
  display: flex;
  flex-wrap: wrap;
  gap: 6px 12px;
  font-family: var(--font);
  font-size: var(--fs-1);
  color: var(--muted);
  letter-spacing: .04em;
}
.topo-legend-item { display: inline-flex; align-items: center; gap: 6px; }
.topo-swatch {
  display: inline-block;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: var(--panel);
  border: 1px solid rgba(200,68,42, .5);
}
.topo-swatch.self { border-color: rgba(122, 140, 255, .8); }
.topo-swatch.fact { border-color: rgba(167, 139, 250, .75); border-radius: 2px; }
.topo-swatch.source { border-color: rgba(156, 184, 174, .7); width: 7px; height: 7px; }
/* 边图例：点/回应用"线"而不是块，才能和节点图例区分 */
.topo-swatch.mention { border-radius: 0; width: 14px; height: 0; border: 0; border-top: 1px dashed rgba(200,68,42, .6); }
.topo-swatch.reply { border-radius: 0; width: 14px; height: 0; border: 0; border-top: 1px solid rgba(122, 140, 255, .85); }
.topology-canvas {
  position: relative;
  min-height: 300px;
  border-radius: 3px;
  border: 1px solid rgba(200,68,42, .14);
  background:
    radial-gradient(90% 90% at 50% 50%, rgba(200,68,42, .05), transparent 70%),
    repeating-linear-gradient(0deg, rgba(200,68,42, .03) 0 1px, transparent 1px 26px),
    repeating-linear-gradient(90deg, rgba(200,68,42, .03) 0 1px, transparent 1px 26px),
    var(--panel);
  overflow: hidden;
}
.topology-svg { display: block; width: 100%; height: auto; }
.topology-empty {
  margin: 0;
  padding: 40px 18px;
  text-align: center;
  color: var(--muted);
  font-size: var(--fs-2);
  line-height: 1.7;
}
.topology-note {
  font-family: var(--font);
  font-size: var(--fs-1);
  color: var(--muted);
  letter-spacing: .03em;
  line-height: 1.7;
}
/* 参考环：纯装饰，让"内圈参会者 / 外圈事实与来源"有空间感 */
.topo-ring { fill: none; stroke: rgba(200,68,42, .1); stroke-width: 1; stroke-dasharray: 2 7; }
.topo-ring.outer { stroke: rgba(200,68,42, .06); }
/* 有向边：点名=虚线 / 回应=实线 / 贡献事实=紫 / 来源=薄荷点线 */
.topo-edge { fill: none; stroke-width: 1.2; }
.topo-edge.mention { stroke: rgba(200,68,42, .42); stroke-dasharray: 3 4; }
.topo-edge.reply { stroke: rgba(122, 140, 255, .6); }
.topo-edge.fact { stroke: rgba(167, 139, 250, .45); }
.topo-edge.source { stroke: rgba(156, 184, 174, .4); stroke-dasharray: 1 4; }
.topo-edge.dim { opacity: .12; }
/* 节点 */
.topo-node { cursor: pointer; outline: none; }
.topo-node.dim { opacity: .18; }
.topo-node .topo-dot { fill: #081a2c; stroke-width: 1.4; }
.topo-node.topo-agent .topo-dot { stroke: rgba(200,68,42, .7); }
.topo-node.topo-self .topo-dot { fill: rgba(122, 140, 255, .18); stroke: rgba(122, 140, 255, .8); }
.topo-node.topo-fact .topo-dot { stroke: rgba(167, 139, 250, .8); }
.topo-node.topo-evidence .topo-dot { stroke: rgba(156, 184, 174, .7); }
.topo-node.topo-source .topo-dot { fill: rgba(156, 184, 174, .2); stroke: rgba(156, 184, 174, .6); }
.topo-node:hover .topo-dot,
.topo-node:focus-visible .topo-dot { fill: rgba(200,68,42, .18); }
.topo-node:focus-visible .topo-dot { stroke-width: 2.2; }
.topo-host-ring { fill: none; stroke: rgba(166,106,31, .45); stroke-width: 1; stroke-dasharray: 2 3; }
.topo-label {
  fill: var(--text);
  font-family: var(--font);
  font-size: var(--fs-1);
  letter-spacing: .04em;
  pointer-events: none;
}
.topo-sub {
  fill: var(--faint);
  font-family: var(--font);
  font-size: var(--fs-1);
  letter-spacing: .02em;
  pointer-events: none;
}
.topo-sat-label {
  fill: #9fbfd6;
  font-family: var(--font);
  font-size: var(--fs-1);
  pointer-events: none;
}

@media (max-width: 760px) {
  .weekly-stats { grid-template-columns: 1fr; }
  #panel-topology { width: 100vw; }
  .topo-label { font-size: var(--fs-1); }
  .topo-sat-label { font-size: var(--fs-1); }
}

/* ════════════════════════════════════════════════════════════
   11b. 本场复盘（会议纪要抽屉底部，默认折叠）
   ------------------------------------------------------------
   只读 minutes.meta：为什么停 / 红队意见 / 席位契约 / 轮末目标核对。
   语言沿用 ORBIT：细线 + 等宽数据标签 + 3px 切角 + 全息青主色。
   纯静态样式（无动画），reduced-motion 不需要额外降级。
   ════════════════════════════════════════════════════════════ */

.review-block {
  margin-top: 14px;
  border: 1px solid rgba(200,68,42, .14);
  border-radius: 3px;
  background: var(--panel);
  font-size: var(--fs-2);
  color: var(--text-2);
}
.review-summary {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
  padding: 10px 12px;
  cursor: pointer;
  list-style: none;
  user-select: none;
}
.review-summary::-webkit-details-marker { display: none; }
/* 折叠指示：只用字符，不做旋转动画（静态不触发 reduced-motion 规则） */
.review-summary::before {
  content: "▸";
  color: var(--lamp);
  font-family: var(--font);
  font-size: var(--fs-1);
  line-height: 1;
}
.review-block[open] > .review-summary::before { content: "▾"; }
.review-summary:hover { background: rgba(200,68,42, .04); }
.review-summary:focus-visible {
  outline: 1px solid rgba(200,68,42, .5);
  outline-offset: -1px;
}
.review-title {
  font-family: var(--font);
  font-size: var(--fs-1);
  letter-spacing: .02em;
  color: var(--text);
}
.review-title::before {
  content: none;
  margin-right: 6px;
  color: var(--lamp);
  letter-spacing: 0;
}
.review-chips { display: inline-flex; flex-wrap: wrap; gap: 5px; }
.review-chip {
  display: inline-flex;
  align-items: center;
  padding: 0 7px;
  border-radius: 2px;
  border: 1px solid rgba(200,68,42, .24);
  background: rgba(200,68,42, .07);
  color: var(--cool);
  font-family: var(--font);
  font-size: var(--fs-1);
  letter-spacing: .04em;
  white-space: nowrap;
}
.review-chip.warn {
  color: var(--warn);
  border-color: rgba(166,106,31, .4);
  background: rgba(166,106,31, .08);
}
.review-chip.ok {
  color: #b9ffe4;
  border-color: rgba(156, 184, 174, .35);
  background: rgba(156, 184, 174, .07);
}
.review-hint {
  margin-left: auto;
  color: var(--faint);
  font-family: var(--font);
  font-size: var(--fs-1);
  letter-spacing: .03em;
}
.review-body {
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding: 2px 12px 12px;
  border-top: 1px dashed rgba(200,68,42, .12);
}
.review-sec { padding-top: 10px; }
.review-sec + .review-sec { border-top: 1px solid rgba(200,68,42, .08); }
.review-sec-title {
  margin: 0 0 6px;
  font-family: var(--font);
  font-size: var(--fs-1);
  font-weight: 600;
  letter-spacing: .02em;
  color: var(--muted);
}
.review-sec-title::before {
  content: none;
  margin-right: 6px;
  color: var(--lamp);
  letter-spacing: 0;
}
.review-line {
  margin: 0;
  font-size: var(--fs-2);
  line-height: 1.7;
  color: var(--text-2);
  word-break: break-word;
}
.review-line + .review-line { margin-top: 4px; }
.review-line.warn { color: var(--warn); }
.review-line.muted { color: var(--faint); }
.review-findings {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin: 6px 0 0;
  padding: 0;
  list-style: none;
}
.review-finding {
  padding: 7px 9px;
  border-radius: 2px;
  border: 1px solid rgba(200,68,42, .1);
  border-left: 2px solid rgba(200,68,42, .3);
  background: var(--panel);
}
.review-finding[data-severity="blocker"] { border-left-color: rgba(255, 77, 109, .85); }
.review-finding[data-severity="major"] { border-left-color: rgba(166,106,31, .8); }
.review-finding[data-severity="minor"] { border-left-color: rgba(200,68,42, .35); }
.review-finding-head {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 6px;
  margin-bottom: 3px;
  font-family: var(--font);
  font-size: var(--fs-1);
  letter-spacing: .04em;
}
.review-sev {
  padding: 0 6px;
  border-radius: 2px;
  border: 1px solid rgba(200,68,42, .28);
  color: var(--cool);
}
.review-sev.blocker { color: var(--danger); border-color: rgba(255, 77, 109, .5); background: rgba(255, 77, 109, .08); }
.review-sev.major { color: var(--warn); border-color: rgba(166,106,31, .45); background: rgba(166,106,31, .07); }
.review-sev.minor { color: var(--cool); border-color: rgba(200,68,42, .25); }
.review-dim { color: #8fb0c8; }
.review-loc { color: var(--faint); }
.review-quote {
  margin: 0;
  font-size: var(--fs-2);
  line-height: 1.65;
  color: var(--text-2);
  word-break: break-word;
}
.review-fix, .review-impact {
  margin: 3px 0 0;
  font-size: var(--fs-1);
  line-height: 1.6;
  color: var(--text-2);
  word-break: break-word;
}
.review-fix b { color: var(--cool); font-weight: 600; }
.review-impact b { color: var(--warn, var(--warn)); font-weight: 600; }

@media (max-width: 760px) {
  .review-summary { padding: 9px 10px; }
  .review-hint { display: none; }
  .review-body { padding: 2px 10px 10px; }
}

/* ═══════════════════════════════════════════════════════════════════
 * 11c. P1 知识候选（人审通过后才进 prompt）
 * ═══════════════════════════════════════════════════════════════════ */
.kn-candidates {
  margin: 4px 0 12px;
  padding: 10px;
  border: 1px solid rgba(166,106,31, .32);
  border-radius: var(--radius-sm, 6px);
  background:
    linear-gradient(180deg, rgba(166,106,31, .05), transparent 42%),
    var(--panel);
}
.kn-cand-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 10px;
  flex-wrap: wrap;
  margin-bottom: 8px;
}
.kn-cand-head .kn-section-title { margin: 0; }
.kn-cand-count {
  font-family: var(--mono, ui-monospace, monospace);
  font-size: var(--fs-1);
  letter-spacing: .04em;
  color: var(--warn);
}
.kn-cand-list { display: flex; flex-direction: column; gap: 8px; }
.kn-cand {
  padding: 8px 10px;
  border: 1px solid rgba(200,68,42, .16);
  border-left: 2px solid rgba(166,106,31, .7);
  border-radius: 3px;
  background: var(--panel);
}
.kn-cand-top { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.kn-cand-title {
  font-size: var(--fs-2);
  font-weight: 600;
  color: var(--pale, #eaf7ff);
  word-break: break-word;
}
.kn-cand-agent {
  margin-left: auto;
  font-size: var(--fs-1);
  letter-spacing: .04em;
  color: var(--faint);
}
.kn-cand-body {
  margin: 5px 0 0;
  font-size: var(--fs-2);
  line-height: 1.6;
  color: var(--text-2);
  white-space: pre-wrap;
  word-break: break-word;
}
.kn-cand-ev {
  margin-top: 6px;
  padding-top: 5px;
  border-top: 1px dashed rgba(200,68,42, .16);
}
.kn-cand-evline {
  font-size: var(--fs-1);
  line-height: 1.55;
  color: #8fb0c8;
  word-break: break-all;
}
.kn-cand-foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  margin-top: 7px;
  flex-wrap: wrap;
}
.kn-cand-ttl { font-size: var(--fs-1); color: var(--faint); }
.kn-cand-actions { display: flex; gap: 6px; }
.kn-cand-actions .primary-btn,
.kn-cand-actions .ghost-btn { padding: 3px 10px; font-size: var(--fs-1); }
.kn-cand-actions button:disabled { opacity: .55; cursor: wait; }

.kn-cand-group-title {
  margin: 8px 0 4px;
  font-size: var(--fs-1);
  letter-spacing: .04em;
  color: var(--faint);
}
.kn-cand-group-title.warn { color: var(--warn); }
.kn-cand-ttl.warn { color: var(--warn); }

@media (max-width: 760px) {
  .kn-candidates { padding: 8px; }
  .kn-cand-agent { margin-left: 0; }
  .kn-cand-foot { align-items: flex-start; }
}

/* ═══════════════════════════════════════════════════════════════════
 * 11d. P2 知识质量报表（只读：使用次数 × QC/反馈 × 新鲜度）
 * ═══════════════════════════════════════════════════════════════════ */
.kn-quality {
  margin: 0 0 12px;
  padding: 8px 10px;
  border: 1px solid rgba(200,68,42, .18);
  border-radius: var(--radius-sm, 6px);
  background: var(--panel);
}
.kn-quality summary {
  cursor: pointer;
  list-style: none;

  .kn-cand-agent { margin-left: 0; }
  .kn-cand-foot { align-items: flex-start; }
}

/* ═══════════════════════════════════════════════════════════════════
 * 11d. P2 知识质量报表（只读：使用次数 × QC/反馈 × 新鲜度）
 * ═══════════════════════════════════════════════════════════════════ */
.kn-quality {
  margin: 0 0 12px;
  padding: 8px 10px;
  border: 1px solid rgba(200,68,42, .18);
  border-radius: var(--r-sm);
  background: var(--panel);
}
.kn-quality summary {
  cursor: pointer;
  list-style: none;
  font-family: var(--mono, ui-monospace, monospace);
  font-size: var(--fs-1);
  letter-spacing: .03em;
  color: var(--cool);
}
.kn-quality summary::-webkit-details-marker { display: none; }
.kn-quality summary::before { content: '▸ '; color: var(--lamp, var(--lamp)); }
.kn-quality[open] summary::before { content: '▾ '; }
.kn-quality-body { margin-top: 8px; }
.kn-quality-title {
  margin: 8px 0 4px;
  font-size: var(--fs-1);
  letter-spacing: .05em;
  color: var(--faint);
}
.kn-quality-list { display: flex; flex-direction: column; gap: 3px; }
.kn-quality-row {
  display: flex;
  align-items: baseline;
  gap: 8px;
  font-size: var(--fs-1);
  line-height: 1.55;
  color: var(--text-2);
  word-break: break-word;
}
.kn-quality-used {
  min-width: 40px;
  font-family: var(--mono, ui-monospace, monospace);
  color: var(--mint, var(--cool));
}
.kn-quality-label { flex: 1; }
.kn-quality-agent {
  font-family: var(--mono, ui-monospace, monospace);
  font-size: var(--fs-1);
  color: var(--faint);
}
.kn-quality-tag {
  min-width: 54px;
  padding: 1px 5px;
  border: 1px solid rgba(200,68,42, .25);
  border-radius: 2px;
  font-family: var(--mono, ui-monospace, monospace);
  font-size: var(--fs-1);
  text-align: center;
  color: var(--cool);
}
.kn-quality-tag[data-suggestion="demote"] { color: var(--danger); border-color: rgba(255, 77, 109, .45); }
.kn-quality-tag[data-suggestion="refresh"] { color: var(--warn); border-color: rgba(166,106,31, .45); }
.kn-quality-tag[data-suggestion="review"] { color: var(--violet); border-color: rgba(167, 139, 250, .4); }
.kn-quality-empty, .kn-quality-hint {
  font-size: var(--fs-1);
  line-height: 1.6;
  color: var(--faint);
}
.kn-quality-hint { margin-top: 7px; }

/* ── 兼容：v3 里分散在别处、仍被 HTML/JS 使用的小规则 ── */
.ghost-btn .ico, .icon-btn .ico { filter: grayscale(1) brightness(1.12); }
.settings-block, .set-row { border-color: var(--line-soft); }
.kn-quality summary::before { color: var(--lamp); }

/* 数字才用等宽；中文标签一律用无衬线（v4 纪律） */
.weekly-v, .b-score, .weekly-sub .num { font-family: var(--mono); font-variant-numeric: tabular-nums; }

/* ── 按轮次分叉（纪要抽屉底部） ─────────────────────────────────────
   复用 .review-block 的折叠外壳；这里只加"一行一个轮末 + 分叉按钮"。
   按钮不抢主行动：细线 + 青色文字，hover 才亮。 */
.fork-block { border-color: rgba(86, 214, 214, .18); }
.fork-body { padding: 0; }
.fork-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 9px 12px;
  border-top: 1px solid var(--line-soft);
}
.fork-row:first-child { border-top: 0; }
.fork-meta {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 8px;
  min-width: 0;
}
.fork-round { color: var(--text); font-size: var(--fs-2); }
.fork-time, .fork-count {
  color: var(--faint);
  font-family: var(--mono);
  font-size: var(--fs-1);
  font-variant-numeric: tabular-nums;
}
.fork-btn {
  flex: none;
  padding: 4px 10px;
  border: 1px solid rgba(86, 214, 214, .38);
  border-radius: 2px;
  background: transparent;
  color: var(--cool);
  font-family: var(--font);
  font-size: var(--fs-1);
  cursor: pointer;
}
.fork-btn:hover:not(:disabled) { background: rgba(86, 214, 214, .1); border-color: var(--cool); }
.fork-btn:focus-visible { outline: 1px solid var(--cool); outline-offset: 1px; }
.fork-btn:disabled { opacity: .45; cursor: not-allowed; }

/* ── 2026-10-25：Agent / 知识库成熟度雷达 ─────────────────────────── */
.maturity-block {
  margin: 14px 0 4px;
  padding: 12px;
  border: 1px solid var(--line-soft);
  border-radius: 3px;
  background: var(--panel);
  font-size: var(--fs-2);
  color: var(--text-2);
}
.maturity-head {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 8px;
  margin-bottom: 6px;
}
.maturity-title {
  font-family: var(--font);
  font-size: var(--fs-2);
  color: var(--text);
  letter-spacing: .02em;
}
.maturity-hint { color: var(--faint); font-size: var(--fs-1); }
.maturity-sub {
  margin: 10px 0 4px;
  color: var(--text);
  font-size: var(--fs-1);
  letter-spacing: .02em;
}
.maturity-radar-wrap { position: relative; }
.maturity-radar { display: block; width: 100%; max-width: 380px; height: auto; margin: 0 auto; overflow: visible; }
.maturity-note { margin: 2px 0 0; color: var(--faint); font-size: var(--fs-1); text-align: center; }
.maturity-radar-empty { text-align: center; padding: 4px 0; }
.maturity-kb { margin-top: 8px; }
.maturity-kb-row {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 3px 0;
  border-top: 1px solid rgba(148, 163, 184, .08);
}
.maturity-kb-row:first-of-type { border-top: 0; }
.maturity-kb-label { flex: none; width: 64px; color: var(--text-2); font-size: var(--fs-1); }
.maturity-kb-score { flex: none; min-width: 74px; text-align: right; color: var(--cool); font-family: var(--mono); font-size: var(--fs-1); }
.maturity-bar {
  flex: 1;
  height: 5px;
  border-radius: 2px;
  background: rgba(148, 163, 184, .16);
  overflow: hidden;
}
.maturity-bar > span { display: block; height: 100%; background: var(--cool); opacity: .7; }
.maturity-alerts { margin-top: 10px; display: grid; gap: 4px; }
.maturity-alert {
  display: flex;
  gap: 8px;
  align-items: baseline;
  padding: 4px 6px;
  border-left: 2px solid var(--line-soft);
  font-size: var(--fs-1);
  color: var(--text-2);
}
.maturity-alert.warn { border-left-color: var(--warn); }
.maturity-alert.info { border-left-color: var(--cool); }
.maturity-alert-code { flex: none; color: var(--faint); font-family: var(--mono); }
.maturity-foot {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-top: 10px;
  flex-wrap: wrap;
  font-size: var(--fs-1);
}
