/* ===========================================================
   个人情报中枢 · 前端样式
   设计体系对齐 Ant Design 5 Token（中文大厂企业级 UI 标杆）
   主色 #1677ff / 圆角 2·4·6·8 / 阴影两级 / 间距 8px 基准 / 系统字体栈
   =========================================================== */
:root {
  --primary: #1677ff;
  --primary-hover: #4096ff;
  --primary-active: #0958d9;
  --success: #52c41a;
  --warning: #faad14;
  --error: #ff4d4f;
  --text: rgba(0, 0, 0, 0.88);
  --text-secondary: rgba(0, 0, 0, 0.65);
  --text-tertiary: rgba(0, 0, 0, 0.45);
  --border: #d9d9d9;
  --border-secondary: #f0f0f0;
  --bg-layout: #f5f5f5;
  --bg-container: #ffffff;
  --bg-elevated: #ffffff;
  --radius-sm: 4px;
  --radius: 6px;
  --radius-lg: 8px;
  --shadow-1: 0 1px 2px 0 rgba(0, 0, 0, 0.06), 0 1px 6px -1px rgba(0, 0, 0, 0.04);
  --shadow-2: 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12);
  --sider: #001529;
  --sider-selected: #1677ff;
  --font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue",
    Arial, "PingFang SC", "Microsoft YaHei", "Noto Sans", sans-serif;
  --font-mono: "SFMono-Regular", "JetBrains Mono", "Roboto Mono", Menlo, Consolas,
    "Liberation Mono", monospace;
  --sp: 8px;
  /* 间距刻度（4pt 基准，hallmark 纪律：禁裸写 px，统一走令牌） */
  --sp-1: 4px; --sp-2: 8px; --sp-3: 12px; --sp-4: 16px; --sp-5: 24px; --sp-6: 32px; --sp-7: 48px; --sp-8: 64px;
  /* 字阶（Ant Design 同款 14 基准，禁散写字号） */
  --fs-xs: 12px; --fs-sm: 13px; --fs-base: 14px; --fs-md: 15px; --fs-lg: 16px;
  --fs-xl: 18px; --fs-2xl: 20px; --fs-3xl: 24px; --fs-4xl: 30px;
  --lh-tight: 1.4; --lh-base: 1.5715; --lh-relaxed: 1.8;
  /* z-index 命名层级（禁裸数字；hallmark gate） */
  --z-base: 1; --z-raised: 10; --z-bottomnav: 60; --z-toast: 999; --z-modal: 1000; --z-overlay: 9999;
  /* 动效令牌（3 档时长 + 缓动；taste 纪律） */
  --dur-fast: 0.15s; --dur: 0.2s; --dur-slow: 0.24s;
  --ease: cubic-bezier(0.4, 0, 0.2, 1); --ease-out: cubic-bezier(0, 0, 0.2, 1);
  /* 表面语义别名（修复历史遗留 --bg 悬空引用） */
  --bg: var(--bg-container);
  --surface-input: var(--bg-layout);
  /* 图表分类配色（单一事实源：JS 经 getComputedStyle 读取，暗色自动增亮；缺失回退既有值） */
  --chart-1: #1677ff; --chart-2: #52c41a; --chart-3: #faad14; --chart-4: #ff4d4f; --chart-5: #722ed1;
  --chart-6: #13c2c2; --chart-7: #eb2f96; --chart-8: #fa8c16; --chart-9: #2f54eb; --chart-10: #a0d911;
  --chart-line: var(--primary);
  --chart-grad-1: #e6f4ff; --chart-grad-2: #69b1ff; --chart-grad-3: #1677ff; --chart-grad-4: #003eb3;
  /* 信任等级语义色（替代 JS 硬编码，随主题统一切换） */
  --trust-high: #52c41a; --trust-mid: #1677ff; --trust-low: #ff4d4f; --trust-unknown: #faad14;
}

/* ---------- 访问令牌输入覆盖层 ---------- */
.token-overlay-backdrop {
  position: fixed; inset: 0; z-index: var(--z-overlay);
  background: rgba(0, 0, 0, 0.45);
  display: flex; align-items: center; justify-content: center;
  backdrop-filter: blur(2px);
}
.token-overlay-card {
  background: var(--bg-container); color: var(--text);
  border-radius: var(--radius-lg); box-shadow: var(--shadow-2);
  padding: calc(var(--sp) * 4); width: min(92vw, 420px);
  border: 1px solid var(--border);
}
.token-overlay-card h2 { margin: 0 0 calc(var(--sp) * 2); font-size: 18px; }
.token-overlay-card p { margin: 0 0 calc(var(--sp) * 2); color: var(--text-secondary); line-height: 1.6; }
.token-overlay-card input {
  width: 100%; box-sizing: border-box; padding: 10px 12px;
  border: 1px solid var(--border); border-radius: var(--radius);
  font-size: 14px; font-family: var(--font); margin-bottom: calc(var(--sp) * 2);
  background: var(--bg-container); color: var(--text);
}
.token-overlay-card input:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 2px rgba(22,119,255,0.2); }
.token-overlay-actions { display: flex; gap: calc(var(--sp) * 1.5); }
.token-overlay-actions button { flex: 1; padding: 9px 0; border-radius: var(--radius); border: none; cursor: pointer; font-size: 14px; }
.token-overlay-actions .btn-primary { background: var(--primary); color: #fff; }
.token-overlay-actions .btn-primary:hover { background: var(--primary-hover); }
.token-overlay-actions .btn-secondary { background: var(--bg-layout); color: var(--text); border: 1px solid var(--border); }
.token-overlay-actions .btn-secondary:hover { border-color: var(--primary); color: var(--primary); }
.token-overlay-hint { margin-top: calc(var(--sp) * 2) !important; font-size: 12px; color: var(--text-tertiary) !important; }
.token-overlay-hint code { background: var(--bg-layout); padding: 1px 4px; border-radius: var(--radius-sm); }

/* ---------- 暗色模式：data-theme="dark" 变量覆盖（Antd dark 同款 token）---------- */
html[data-theme="dark"] {
  --text: rgba(255, 255, 255, 0.88);
  --text-secondary: rgba(255, 255, 255, 0.65);
  --text-tertiary: rgba(255, 255, 255, 0.45);
  --border: #424242;
  --border-secondary: #303030;
  --bg-layout: #141414;
  --bg-container: #1f1f1f;
  --bg-elevated: #262626;
  --sider: #000000;
  --shadow-1: 0 1px 2px 0 rgba(0, 0, 0, 0.45);
  --shadow-2: 0 6px 16px 0 rgba(0, 0, 0, 0.55);
  /* 暗色下图表配色增亮、渐变翻转，保证可读性 */
  --chart-1: #4096ff; --chart-2: #73d13d; --chart-3: #ffc53d; --chart-4: #ff7875; --chart-5: #9254de;
  --chart-6: #36cfc9; --chart-7: #f759ab; --chart-8: #ffa940; --chart-9: #597ef7; --chart-10: #bae637;
  --chart-line: var(--primary-hover);
  --chart-grad-1: #0a1a2f; --chart-grad-2: #0d2847; --chart-grad-3: #1677ff; --chart-grad-4: #69b1ff;
  --trust-high: #73d13d; --trust-mid: #4096ff; --trust-low: #ff7875; --trust-unknown: #ffc53d;
}
html[data-theme="dark"] .tag.blue,
html[data-theme="dark"] .badge.heur { background: #111a2c; border-color: #15325b; }
html[data-theme="dark"] .tag.green { background: #162312; border-color: #274916; }
html[data-theme="dark"] .tag.red { background: #2a1215; border-color: #58181c; }
html[data-theme="dark"] .tag.orange,
html[data-theme="dark"] .badge.trust-media,
html[data-theme="dark"] .badge.stale { background: #2b1d11; border-color: #593b14; }
html[data-theme="dark"] .tag.purple,
html[data-theme="dark"] .badge.ai,
html[data-theme="dark"] .badge.llm,
html[data-theme="dark"] .badge.trust-ugc { background: #1a1325; border-color: #301c4d; }
html[data-theme="dark"] .badge.trust-official { background: #0e2a2b; border-color: #14555a; }
html[data-theme="dark"] .src-card.warn { background: #2a1215; border-color: #58181c; }
html[data-theme="dark"] .markdown-body blockquote { border-color: #424242; }

* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; height: 100%; }
body {
  font-family: var(--font);
  font-size: 14px;
  line-height: 1.5715;
  color: var(--text);
  background: var(--bg-layout);
}
a { color: var(--primary); text-decoration: none; }
a:hover { color: var(--primary-hover); }
.boot { padding: 48px; text-align: center; color: var(--text-tertiary); }

/* ---------- 布局 ---------- */
.app { display: flex; height: 100vh; height: 100dvh; overflow: hidden; }
.sider {
  width: 220px; flex: 0 0 220px; background: var(--sider);
  display: flex; flex-direction: column; color: rgba(255, 255, 255, 0.65);
}
.sider .logo {
  height: 56px; display: flex; align-items: center; gap: 10px;
  padding: 0 20px; color: #fff; font-weight: 600; font-size: 16px;
  border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.sider .logo .dot { width: 12px; height: 12px; border-radius: 50%; background: var(--primary); box-shadow: 0 0 8px var(--primary); }
.menu { padding: 8px 0; flex: 1; overflow-y: auto; }
.menu-item {
  display: flex; align-items: center; gap: 10px; height: 44px; padding: 0 24px;
  cursor: pointer; color: rgba(255, 255, 255, 0.65); font-size: 14px; user-select: none;
}
.menu-item:hover { color: #fff; background: rgba(255, 255, 255, 0.06); }
.menu-item.active { color: #fff; background: var(--sider-selected); }
.menu-item .ic { width: 16px; text-align: center; }
/* 5 大功能体系：组头 + 子菜单 */
.menu-group { }
.menu-group .group { font-weight: 600; }
.menu-group .group .chev { margin-left: auto; margin-right: 4px; font-size: 11px; color: rgba(255,255,255,0.4); }
.menu-group.open .group { color: #fff; }
.menu-sub { display: none; }
.menu-group.open .menu-sub { display: block; }
.menu-item.sub { height: 38px; padding-left: 52px; font-size: 13px; font-weight: 400; }
.menu-item.sub.active { background: rgba(22, 119, 255, 0.35); }
.sider .foot { padding: 12px 24px; font-size: 12px; color: rgba(255, 255, 255, 0.35); border-top: 1px solid rgba(255,255,255,0.08); }

.main { flex: 1; display: flex; flex-direction: column; overflow: hidden; }
.header {
  height: 56px; flex: 0 0 56px; background: var(--bg-container);
  border-bottom: 1px solid var(--border-secondary); display: flex; align-items: center;
  padding: 0 24px; gap: 16px;
}
.header .title { font-size: 16px; font-weight: 600; }
.header .sub { color: var(--text-tertiary); font-size: 12px; }
.header .spacer { flex: 1; }
.content { flex: 1; overflow-y: auto; padding: 24px; }

/* ---------- 按钮 ---------- */
.btn {
  height: 32px; padding: 0 15px; border-radius: var(--radius); border: 1px solid var(--border);
  background: var(--bg-container); color: var(--text); cursor: pointer; font-size: 14px; font-family: var(--font);
  display: inline-flex; align-items: center; gap: 6px; transition: all 0.2s;
}
.btn:hover { color: var(--primary); border-color: var(--primary); }
.btn.primary { background: var(--primary); border-color: var(--primary); color: #fff; }
.btn.primary:hover { background: var(--primary-hover); border-color: var(--primary-hover); color: #fff; }
.btn.danger:hover { color: var(--error); border-color: var(--error); }
.btn:disabled { opacity: 0.6; cursor: not-allowed; }
.btn.sm { height: 26px; padding: 0 10px; font-size: 12px; }

/* ---------- 卡片 ---------- */
.card {
  background: var(--bg-container); border-radius: var(--radius-lg);
  box-shadow: var(--shadow-1); padding: 20px; border: 1px solid var(--border-secondary);
}
.card .card-title { font-size: 15px; font-weight: 600; margin-bottom: 14px; display: flex; align-items: center; gap: 8px; }
.grid { display: grid; gap: 16px; }
.grid-2 { grid-template-columns: repeat(2, 1fr); }
.grid-4 { grid-template-columns: repeat(4, 1fr); }
.row { display: flex; gap: 16px; }
.wrap { flex-wrap: wrap; }
.mt { margin-top: 16px; }
.mb { margin-bottom: 16px; }

/* ---------- 统计卡 ---------- */
.stat { background: var(--bg-container); border-radius: var(--radius-lg); box-shadow: var(--shadow-1); padding: 20px; border: 1px solid var(--border-secondary); }
.stat .label { color: var(--text-tertiary); font-size: 13px; }
.stat .value { font-size: 30px; font-weight: 600; line-height: 1.2; margin-top: 6px; }
.stat .value.primary { color: var(--primary); }
.stat .value.success { color: var(--success); }
.stat .value.warning { color: var(--warning); }

/* ---------- Tag ---------- */
.tag {
  display: inline-flex; align-items: center; height: 22px; padding: 0 8px;
  border-radius: var(--radius-sm); font-size: 12px; line-height: 20px;
  border: 1px solid; background: var(--bg-elevated);
}
.tag.blue { color: var(--primary); background: #e6f4ff; border-color: #91caff; }
.tag.sub { color: var(--text-tertiary); background: var(--bg-layout); border-color: var(--border-secondary); }
.tag.green { color: var(--success); background: #f6ffed; border-color: #b7eb8f; }
.tag.orange { color: #d46b08; background: #fff7e6; border-color: #ffd591; }
.tag.red { color: var(--error); background: #fff1f0; border-color: #ffccc7; }
.tag.gray { color: var(--text-secondary); background: #fafafa; border-color: var(--border); }
.tag.purple { color: #531dab; background: #f9f0ff; border-color: #d3adf7; }

/* ---------- 随记（模块③：个人速记）---------- */
.notes-wrap { max-width: 920px; margin: 0 auto; }
.note-form { margin-bottom: 8px; }
.notes-ta { width: 100%; min-height: 84px; box-sizing: border-box; padding: 10px 12px;
  border: 1px solid var(--border); border-radius: var(--radius); background: var(--bg-container);
  color: var(--text); font-family: var(--font); font-size: 14px; resize: vertical; line-height: 1.6; }
.notes-ta:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 2px rgba(22,119,255,0.15); }
.note-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 12px; }
.note-card { padding: 14px; display: flex; flex-direction: column; gap: 8px; }
.note-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.note-time { color: var(--text-tertiary); font-size: 12px; }
.note-body { white-space: pre-wrap; word-break: break-word; line-height: 1.6; font-size: 14px; }
.note-tags { display: flex; flex-wrap: wrap; gap: 6px; }
.note-actions { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 2px; }
.chk { display: inline-flex; align-items: center; gap: 4px; color: var(--text-secondary); font-size: 13px; }

/* ---------- 领域归纳视图 ---------- */
.domain-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 280px), 1fr)); gap: 14px; margin-top: 12px; }
.domain-card { background: var(--bg-container); border: 1px solid var(--border-secondary); border-radius: var(--radius-lg); padding: 15px; box-shadow: var(--shadow-1); }
.domain-card .dc-head { display: flex; align-items: center; gap: 8px; font-weight: 600; font-size: 15px; }
.domain-card .dc-ic { font-size: 20px; }
.domain-card .dc-count { margin-left: auto; color: var(--text-tertiary); font-size: 12px; font-weight: 400; }
.domain-card .dc-sum { margin: 10px 0; color: var(--text-secondary); line-height: 1.65; font-size: 13px; }
.domain-card .dc-top { margin: 8px 0 4px; border-top: 1px dashed var(--border-secondary); padding-top: 8px; }
.domain-card .dc-item { display: flex; justify-content: space-between; gap: 8px; font-size: 12px; padding: 3px 0; }
.domain-card .dc-item a { color: var(--text); text-decoration: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.domain-card .dc-item a:hover { color: var(--primary); }
.domain-card .dc-item .src { color: var(--text-tertiary); white-space: nowrap; }

/* ---------- 信源信任评估「点名」面板 ---------- */
.trust-list { display: flex; flex-direction: column; gap: 8px; }
.trust-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 8px 10px; border-radius: var(--radius-sm); background: var(--bg-layout); font-size: 13px; }
.trust-row.low { border-left: 3px solid #ff4d4f; }
.trust-row.pend { border-left: 3px solid #faad14; }
.trust-row .reason { color: var(--text-secondary); }
.trust-row .muted { word-break: break-all; }

/* ---------- 情报条目卡 ---------- */
.feed-item { background: var(--bg-container); border: 1px solid var(--border-secondary); border-radius: var(--radius-lg); padding: 16px 18px; box-shadow: var(--shadow-1); transition: box-shadow 0.2s; cursor: pointer; }
.feed-item:hover { box-shadow: var(--shadow-2); }
.feed-item.read { opacity: 0.62; }
.feed-item .meta { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--text-tertiary); margin-bottom: 8px; flex-wrap: wrap; }
.feed-item .meta .src { color: var(--text-secondary); }
.feed-item .title { font-size: 15px; font-weight: 600; margin: 0 0 6px; line-height: 1.4; }
.feed-item .title a { color: var(--text); }
.feed-item .title a:hover { color: var(--primary); }
.feed-item .summary { color: var(--text-secondary); font-size: 13px; line-height: 1.6; margin-bottom: 10px; }
.feed-item .actions { display: flex; gap: 8px; align-items: center; }
.score-badge { display: inline-flex; align-items: center; justify-content: center; min-width: 26px; height: 20px; padding: 0 6px; border-radius: 10px; font-size: 12px; font-weight: 600; color: #fff; }
.score-badge.hi { background: var(--error); }
.score-badge.mid { background: var(--warning); }
.score-badge.lo { background: #bfbfbf; }

/* ---------- 筛选栏 ---------- */
.toolbar { display: flex; gap: 12px; align-items: center; margin-bottom: 16px; flex-wrap: wrap; }
.input, .select {
  height: 32px; border: 1px solid var(--border); border-radius: var(--radius);
  padding: 0 11px; font-size: 14px; font-family: var(--font); color: var(--text);
  background: var(--bg-container); outline: none;
}
.input:focus, .select:focus { border-color: var(--primary); box-shadow: 0 0 0 2px rgba(22,119,255,0.1); }
.input { min-width: 240px; }

/* ---------- 信源网格 ---------- */
.src-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 260px), 1fr)); gap: 16px; }
.src-card { background: var(--bg-container); border: 1px solid var(--border-secondary); border-radius: var(--radius-lg); padding: 16px; box-shadow: var(--shadow-1); }
.src-card .name { font-weight: 600; font-size: 14px; display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.src-card .url { color: var(--text-tertiary); font-size: 12px; margin: 8px 0; word-break: break-all; }
.src-card .info { display: flex; gap: 8px; align-items: center; font-size: 12px; color: var(--text-secondary); }
.muted { color: var(--text-tertiary); font-size: 12px; }
.status-dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
.status-dot.on { background: var(--success); }
.status-dot.off { background: #bfbfbf; }

/* ---------- 表单 ---------- */
.form { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px; align-items: end; }
.form .field { display: flex; flex-direction: column; gap: 6px; }
.form label { font-size: 12px; color: var(--text-tertiary); }

/* ---------- 图表 ---------- */
.chart { width: 100%; height: 300px; }
.chart.tall { height: 340px; }

/* ---------- 简报 ---------- */
.markdown-body { font-size: 14px; line-height: 1.8; color: var(--text); }
.markdown-body h1 { font-size: 20px; }
.markdown-body h2 { font-size: 16px; border-left: 3px solid var(--primary); padding-left: 10px; margin-top: 20px; }
.markdown-body a { color: var(--primary); }
.markdown-body blockquote { border-left: 3px solid var(--border); padding-left: 12px; color: var(--text-tertiary); margin: 12px 0; }

/* ---------- 杂项 ---------- */
.empty { text-align: center; color: var(--text-tertiary); padding: 60px 0; }
.pager { display: flex; gap: 8px; align-items: center; justify-content: center; margin-top: 20px; }
.toast {
  position: fixed; top: 16px; left: 50%; transform: translateX(-50%);
  background: rgba(0,0,0,0.85); color: #fff; padding: 8px 16px; border-radius: var(--radius);
  font-size: 13px; z-index: var(--z-toast); opacity: 0; transition: opacity 0.3s;
}
.toast.show { opacity: 1; }
.loading { text-align:center; padding: 40px; color: var(--text-tertiary); }

/* ---------- 徽标 / 紧急度 / 告警卡 ---------- */
.badge { display: inline-flex; align-items: center; height: 22px; padding: 0 8px; border-radius: var(--radius-sm); font-size: 12px; line-height: 20px; border: 1px solid var(--border-secondary); background: var(--bg-elevated); }
.badge.ai { color: #531dab; background: #f9f0ff; border-color: #d3adf7; }
.badge.stale { color: #d46b08; background: #fff7e6; border-color: #ffd591; }
.urgency { font-size: 12px; line-height: 1; }
.src-card.warn { border-color: #ffccc7; background: #fff1f0; }
.src-card.warn .name { color: var(--error); }

/* ---------- 新增：标签 / 设置 / 复选 ---------- */
.tag .x, .badge .x { cursor: pointer; border: none; background: transparent; color: inherit; font-size: 13px; padding: 0 2px; opacity: 0.6; }
.tag .x:hover, .badge .x:hover { opacity: 1; }
.danger { color: var(--error); }
.chk { display: inline-flex; align-items: center; gap: 4px; font-size: 13px; cursor: pointer; }
.chk input { width: 15px; height: 15px; }

/* ---------- 新增：评分模式 / 信源信任 徽标 ---------- */
.badge.llm { color: #531dab; background: #f9f0ff; border-color: #d3adf7; }
.badge.heur { color: #0958d9; background: #e6f4ff; border-color: #91caff; }
.badge.cached { color: #595959; background: var(--bg-elevated); border-color: var(--border); }
html[data-theme="dark"] .badge.cached { color: rgba(255,255,255,0.65); }
.badge.trust-official { color: #08979c; background: #e6fffb; border-color: #87e8de; }
.badge.trust-media { color: #d46b08; background: #fff7e6; border-color: #ffd591; }
.badge.trust-ugc { color: #531dab; background: #f9f0ff; border-color: #d3adf7; }
.badge.hi { color: #fff; background: var(--error); border-color: var(--error); }

/* ---------- 新增：键盘流聚焦 ---------- */
.feed-item.focused { outline: 2px solid var(--primary); outline-offset: 1px; }

/* ---------- 新增：采集进度条（SSE）---------- */
.collect-bar {
  position: fixed; bottom: 16px; left: 50%; transform: translateX(-50%);
  width: min(420px, 90vw); background: rgba(0,0,0,0.82); color: #fff;
  border-radius: var(--radius); padding: 10px 14px; z-index: var(--z-toast);
  display: flex; align-items: center; gap: 10px; box-shadow: var(--shadow-2);
}
/* 弹窗内嵌模式（采集状态墙）：取消 fixed 定位，变普通块 */
.collect-bar.inline {
  position: static; transform: none; width: 100%; margin-bottom: 14px;
  background: var(--bg-layout); color: var(--text);
}
.collect-bar .collect-fill { height: 6px; width: 0%; background: var(--primary); border-radius: 3px; transition: width 0.3s; }
.collect-bar .collect-txt { font-size: 12px; white-space: nowrap; }

/* ---------- 新增：表格 / 热力图 ---------- */
.tbl-wrap { overflow-x: auto; }
.tbl { border-collapse: collapse; width: 100%; font-size: 13px; }
.tbl th, .tbl td { border: 1px solid var(--border-secondary); padding: 8px 10px; text-align: left; }
.tbl th { background: var(--bg-layout); font-weight: 600; color: var(--text-secondary); white-space: nowrap; }
.tbl td.ok { color: var(--success); font-weight: 600; }
.tbl td.warn { color: var(--warning); font-weight: 600; }
.tbl td.bad { color: var(--error); font-weight: 600; }
.heat-scroll { overflow-x: auto; }
.tbl.heat th, .tbl.heat td { padding: 6px 8px; text-align: center; }
.tbl.heat .hm-src { text-align: left; white-space: nowrap; position: sticky; left: 0; background: var(--bg-container); }
.tbl.heat .hm-date { font-size: 11px; white-space: nowrap; }
.hm-cell { min-width: 34px; }

/* ---------- 新增：热点事件卡 ---------- */
.event-card .members { display: flex; flex-direction: column; gap: 4px; }
.ev-link { color: var(--text-secondary); font-size: 13px; }

/* ---------- 新增：Modal / Drawer（命令面板、详情抽屉、向导、状态墙共用）---------- */
.modal-mask, .drawer-mask {
  position: fixed; inset: 0; background: rgba(0, 0, 0, 0.45); z-index: var(--z-modal);
  display: flex; align-items: flex-start; justify-content: center;
  animation: fadeIn 0.18s ease;
}
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes slideUp { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: none; } }
.modal {
  background: var(--bg-elevated); border-radius: var(--radius-lg); box-shadow: var(--shadow-2);
  width: 92vw; margin-top: 9vh; max-height: 82vh; display: flex; flex-direction: column;
  animation: slideUp 0.2s ease;
}
.modal-head, .drawer-head {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 14px 20px; border-bottom: 1px solid var(--border-secondary);
}
.modal-title, .drawer-title { font-weight: 600; font-size: 15px; }
.modal-x {
  border: none; background: transparent; color: var(--text-tertiary); font-size: 18px;
  cursor: pointer; line-height: 1; padding: 2px 6px; border-radius: var(--radius-sm);
}
.modal-x:hover { color: var(--text); background: var(--bg-layout); }
.modal-body { padding: 18px 20px; overflow-y: auto; }
.drawer-mask { align-items: stretch; justify-content: flex-end; }
.drawer {
  background: var(--bg-elevated); height: 100%; box-shadow: var(--shadow-2);
  display: flex; flex-direction: column;
  transform: translateX(100%); transition: transform 0.24s ease;
}
.drawer-mask.open .drawer { transform: none; }
.drawer-body { padding: 18px 20px; overflow-y: auto; flex: 1; }

/* ---------- 详情抽屉内容 ---------- */
.dw-title { font-size: 17px; line-height: 1.5; margin: 0 0 10px; }
.dw-title a { color: var(--text); }
.dw-title a:hover { color: var(--primary); }
.dw-sec { font-size: 13px; font-weight: 600; color: var(--text-secondary); margin: 14px 0 6px; }
.dw-summary { color: var(--text-secondary); font-size: 13px; line-height: 1.7; }
.dw-full {
  color: var(--text); font-size: 13px; line-height: 1.9; white-space: pre-wrap; word-break: break-word;
  background: var(--bg-layout); border: 1px solid var(--border-secondary);
  border-radius: var(--radius); padding: 14px; max-height: 46vh; overflow-y: auto;
}

/* ---------- 命令面板 ---------- */
.palette-list { margin-top: 10px; max-height: 46vh; overflow-y: auto; }
.palette-item {
  padding: 9px 12px; border-radius: var(--radius); cursor: pointer; font-size: 14px;
  color: var(--text-secondary);
}
.palette-item:hover { background: var(--bg-layout); }
.palette-item.sel { background: var(--primary); color: #fff; }

/* ---------- kbd / 撤销 toast ---------- */
kbd {
  display: inline-block; padding: 1px 6px; border: 1px solid var(--border);
  border-bottom-width: 2px; border-radius: var(--radius-sm); font-size: 12px;
  font-family: var(--font); background: var(--bg-layout); color: var(--text-secondary);
}
.toast-undo {
  border: 1px solid rgba(255,255,255,0.55); background: transparent; color: #fff;
  border-radius: var(--radius-sm); font-size: 12px; padding: 2px 10px; margin-left: 10px;
  cursor: pointer;
}
.toast-undo:hover { background: rgba(255,255,255,0.18); }

/* ---------- 迷你趋势线（统计卡）---------- */
.spark { display: block; margin-top: 8px; opacity: 0.9; }

/* ---------- 采集状态墙 ---------- */
.status-wall { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 8px; }
.wall-cell {
  display: flex; align-items: center; gap: 8px; padding: 8px 10px; font-size: 12px;
  border: 1px solid var(--border-secondary); border-radius: var(--radius);
  color: var(--text-secondary); background: var(--bg-layout);
  overflow: hidden; white-space: nowrap; text-overflow: ellipsis;
}
.wall-dot { width: 9px; height: 9px; border-radius: 50%; flex: 0 0 auto; background: #bfbfbf; }
.wall-cell.wait .wall-dot { animation: pulse 1.2s infinite; background: var(--warning); }
.wall-cell.ok { border-color: rgba(82, 196, 26, 0.5); }
.wall-cell.ok .wall-dot { background: var(--success); }
.wall-cell.fail { border-color: rgba(255, 77, 79, 0.55); background: rgba(255, 77, 79, 0.08); }
.wall-cell.fail .wall-dot { background: var(--error); }
@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.25; } }

/* ---------- 健康时间线 ---------- */
.tl-row { display: flex; align-items: center; gap: 10px; padding: 6px 0; }
.tl-name {
  flex: 0 0 150px; font-size: 12px; color: var(--text-secondary);
  overflow: hidden; white-space: nowrap; text-overflow: ellipsis;
}
.tl-cells { display: flex; gap: 3px; flex-wrap: wrap; }
.tl-cell { width: 11px; height: 11px; border-radius: 2px; display: inline-block; }
.tl-cell.ok { background: var(--success); opacity: 0.85; }
.tl-cell.fail { background: var(--error); }

/* ---------- 信源向导 ---------- */
.wz-steps { display: flex; gap: 8px; margin-bottom: 18px; }
.wz-step {
  flex: 1; text-align: center; font-size: 12px; padding: 6px 0; border-radius: var(--radius-sm);
  background: var(--bg-layout); color: var(--text-tertiary); border: 1px solid var(--border-secondary);
}
.wz-step.on { background: var(--primary); color: #fff; border-color: var(--primary); }
.wz-types { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
.wz-type {
  display: flex; flex-direction: column; align-items: center; gap: 4px; text-align: center;
  border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 18px 10px;
  cursor: pointer; transition: all 0.15s; font-size: 12px; color: var(--text-tertiary);
}
.wz-type:hover { border-color: var(--primary); }
.wz-type.sel { border-color: var(--primary); background: rgba(22, 119, 255, 0.08); box-shadow: 0 0 0 2px rgba(22,119,255,0.15); }
.wz-type .wz-ic { font-size: 26px; }
.wz-type b { font-size: 13px; color: var(--text); }
.wz-sample { font-size: 13px; color: var(--text-secondary); padding: 4px 0; border-bottom: 1px dashed var(--border-secondary); }

/* ---------- 移动端补充 ---------- */
@media (max-width: 768px) {
  .modal { margin-top: 4vh; }
  .wz-types { grid-template-columns: 1fr; }
  .tl-name { flex-basis: 100px; }
}
.bottomnav { display: none; }
@media (max-width: 768px) {
  .app { flex-direction: column; }
  .sider { display: none; }
  .main { padding-bottom: calc(60px + env(safe-area-inset-bottom)); }
  .header { padding: 0 14px; gap: 10px; }
  .header .title { font-size: 15px; }
  .content { padding: 14px; }
  .grid-2, .grid-4 { grid-template-columns: 1fr; }
  .bottomnav {
    display: flex; position: fixed; bottom: 0; left: 0; right: 0; z-index: var(--z-bottomnav);
    background: var(--bg-container); border-top: 1px solid var(--border);
    padding-bottom: env(safe-area-inset-bottom);
    overflow-x: auto; -webkit-overflow-scrolling: touch;
  }
  .bottomnav .bn-item {
    flex: 0 0 auto; display: flex; flex-direction: column; align-items: center;
    gap: 2px; padding: 6px 12px; font-size: 11px; color: var(--text-tertiary);
    cursor: pointer; user-select: none;
  }
  .bottomnav .bn-item .ic { font-size: 16px; }
  .bottomnav .bn-item.active { color: var(--primary); }
}

/* ===== 规划模块（第12轮） ===== */
.plan-wrap { display:flex; flex-direction:column; gap:12px; }
.plan-bar { display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
.plan-bar .hint { color:var(--text-tertiary); font-size:12px; }
.bmc-grid { display:grid; grid-template-columns:repeat(3,1fr); gap:10px; }
.bmc-cell { background:var(--bg-container); border:1px solid var(--border); border-radius:10px; padding:10px; display:flex; flex-direction:column; gap:6px; }
.bmc-head { font-weight:600; display:flex; justify-content:space-between; align-items:center; }
.bmc-key { font-size:11px; color:var(--text-tertiary); background:var(--bg-elevated); padding:1px 6px; border-radius:6px; }
.bmc-desc { font-size:11px; color:var(--text-tertiary); }
.bmc-ta { width:100%; min-height:90px; resize:vertical; border:1px solid var(--border); border-radius:8px; padding:8px; background:var(--bg); color:var(--text); font-family:inherit; font-size:13px; }
.eval-box { margin-top:8px; }
.eval-card { background:var(--bg-container); border:1px solid var(--border); border-radius:10px; padding:10px 12px; margin-top:8px; }
.eval-scores { display:flex; gap:14px; align-items:center; flex-wrap:wrap; font-size:13px; }
.eval-verdict { margin-left:auto; font-weight:600; }
.eval-note { font-size:12px; color:var(--text-secondary); margin-top:6px; }
.eval-gaps { font-size:12px; margin-top:6px; }
.eval-gaps ul { margin:4px 0 0; padding-left:18px; }
.mm-layout { display:grid; grid-template-columns:1fr 340px; gap:14px; align-items:start; }
.mm-canvas { background:var(--bg-container); border:1px solid var(--border); border-radius:10px; padding:8px; overflow:auto; min-height:320px; }
.mm-svg { display:block; }
.mm-node rect { fill:var(--bg-elevated); stroke:var(--border); }
.mm-node.func rect { stroke:#1677ff; }
.mm-node.user rect { stroke:#fa8c16; }
.mm-node.selected rect { stroke-width:2; }
.mm-label { font-size:13px; fill:var(--text); font-weight:600; }
.mm-sub { font-size:11px; fill:var(--text-tertiary); }
.mm-link { fill:none; stroke:var(--border); stroke-width:1.5; }
.mm-detail { background:var(--bg-container); border:1px solid var(--border); border-radius:10px; padding:12px; }
.mm-empty { color:var(--text-tertiary); font-size:13px; padding:20px 0; text-align:center; }
.mm-form { display:flex; flex-direction:column; gap:8px; }
.mm-form-title { font-weight:600; margin-bottom:4px; }
.mm-form label { display:flex; flex-direction:column; gap:4px; font-size:12px; color:var(--text-secondary); }
.mm-form input, .mm-form select, .mm-form textarea { border:1px solid var(--border); border-radius:8px; padding:8px; background:var(--bg); color:var(--text); font-family:inherit; font-size:13px; }
.mm-form textarea { min-height:80px; resize:vertical; }
.mm-actions { display:flex; gap:8px; flex-wrap:wrap; margin-top:4px; }
.btn.danger { color: var(--error); border-color: var(--error); }
.import-tabs { display:flex; gap:8px; }
.import-tabs .tab { padding:6px 14px; border:1px solid var(--border); background:var(--bg-container); color:var(--text-secondary); border-radius:8px; cursor:pointer; }
.import-tabs .tab.active { background:var(--primary); color:#fff; border-color:var(--primary); }
.import-ta { width:100%; min-height:220px; resize:vertical; border:1px solid var(--border); border-radius:8px; padding:10px; background:var(--bg); color:var(--text); font-family:monospace; font-size:13px; }
#importBody .btn { margin-top:8px; }

/* ===========================================================
   无障碍基础层（对齐 5 设计集合反 slop 门禁 · a11y 红线）
   =========================================================== */
:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.btn:focus-visible, .input:focus-visible, .select:focus-visible,
.menu-item:focus-visible, .bn-item:focus-visible, .modal-x:focus-visible,
.wz-type:focus-visible, .tab:focus-visible, .chk input:focus-visible {
  outline: 2px solid var(--primary); outline-offset: 2px;
}
.skip-link {
  position: fixed; top: 10px; left: 10px; z-index: var(--z-overlay);
  transform: translateY(-160%); transition: transform var(--dur) var(--ease);
  background: var(--primary); color: #fff; padding: 8px 14px; border-radius: var(--radius);
  font-size: var(--fs-sm); box-shadow: var(--shadow-2); text-decoration: none;
}
.skip-link:focus { transform: translateY(0); color: #fff; }
.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
}
/* 动效尊让：reduced-motion 全量降级（taste-skill 红线，必尊） */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.001ms !important; animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important; scroll-behavior: auto !important;
  }
}
/* 高对比偏好：发丝线提亮 + 焦点加粗（hallmark gate） */
@media (prefers-contrast: more) {
  :root { --border: #8c8c8c; --border-secondary: #bfbfbf; --text-secondary: rgba(0,0,0,0.8); }
  html[data-theme="dark"] { --text-secondary: rgba(255,255,255,0.82); }
  :focus-visible { outline-width: 3px; }
}
/* 触屏去除点击高亮，移动端更干净 */
* { -webkit-tap-highlight-color: transparent; }

/* ===========================================================
   响应式深度（内容驱动断点 · 平板/极窄手机 · 防溢出）
   既有 768 断点已处理侧栏收起与单列；此处补齐平板与超小屏。
   =========================================================== */
@media (max-width: 1024px) {
  .bmc-grid { grid-template-columns: repeat(2, 1fr); }
  .mm-layout { grid-template-columns: 1fr; }
  .mm-detail { margin-top: 12px; }
  .wz-sample { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
}
@media (max-width: 430px) {
  .header .title { font-size: var(--fs-lg); }
  .stat .value { font-size: var(--fs-3xl); }
  .wz-steps { flex-wrap: wrap; }
  .eval-scores { gap: 10px; }
  .bmc-grid { grid-template-columns: 1fr; }
  .toolbar { gap: 8px; }
  .input, .select { min-width: 0; width: 100%; }
  .plan-bar { gap: 8px; }
}
@media (max-width: 360px) {
  .content { padding: 12px; }
  .card, .stat, .domain-card, .src-card { padding: 12px; }
  .header { padding: 0 12px; }
  .header .spacer { gap: 8px; }
}

/* ---------- R1.5：分类树 ---------- */
.cat-tree { padding: 8px 12px; }
.cat-tree-head {
  display: flex; align-items: center; gap: 8px; cursor: pointer;
  font-weight: 600; font-size: var(--fs-sm, 13px);
}
.cat-tree-head .chev { color: var(--muted, #999); transition: transform .15s; }
.cat-tree-body { margin-top: 8px; max-height: 260px; overflow: auto; }
.tree-branch { margin: 4px 0; }
.tree-subs { display: flex; flex-direction: column; gap: 2px; padding-left: 14px; }
.tree-node {
  display: inline-block; border: 1px solid var(--border, #e5e6eb);
  background: var(--bg-2, #fafafa); color: inherit; border-radius: 6px;
  padding: 2px 8px; margin: 2px 4px 2px 0; font-size: 12px; cursor: pointer;
  text-align: left; white-space: nowrap;
}
.tree-node:hover { border-color: var(--primary, #1677ff); color: var(--primary, #1677ff); }
.tree-node.active { background: var(--primary, #1677ff); border-color: var(--primary, #1677ff); color: #fff; }
.tree-node.muted { color: var(--muted, #999); }

/* ---------- Hermes 对话 ---------- */
.hm { margin: 8px 0; max-width: 86%; }
.hm.user { margin-left: auto; }
.hm-role { font-size: 11px; color: var(--muted, #999); margin-bottom: 2px; }
.hm-body { border-radius: 8px; padding: 8px 10px; font-size: 13px; white-space: pre-wrap; word-break: break-word; }
.hm.user .hm-body { background: var(--primary, #1677ff); color: #fff; }
.hm.assistant .hm-body { background: var(--bg-2, #f5f5f5); border: 1px solid var(--border, #e5e6eb); }
html[data-theme="dark"] .hm.assistant .hm-body { background: #1f1f1f; }

/* ---------- 操作来源徽章 + 操作轨迹（人机协同可观测性） ---------- */
.actor-badge { display: inline-block; padding: 1px 9px; border-radius: 999px; font-size: 12px; font-weight: 600; line-height: 1.7; white-space: nowrap; }
.actor-user { background: #e6f4ea; color: #137333; }
.actor-hermes { background: #e8eaf6; color: #3949ab; }
.actor-scheduled { background: #fff4e5; color: #b26a00; }
.actor-system { background: #eceff1; color: #546e7a; }
html[data-theme="dark"] .actor-user { background: #193024; color: #7ee2a0; }
html[data-theme="dark"] .actor-hermes { background: #1e2340; color: #9aa6f0; }
html[data-theme="dark"] .actor-scheduled { background: #33290f; color: #f0b860; }
html[data-theme="dark"] .actor-system { background: #2a2f33; color: #aab4ba; }
.trace-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.trace-table th, .trace-table td { padding: 8px 10px; text-align: left; border-bottom: 1px solid var(--border, #eee); }
.trace-table th { color: var(--muted, #888); font-weight: 600; background: var(--bg-2, #fafafa); position: sticky; top: 0; }
.trace-table .mono { font-family: ui-monospace, Menlo, Consolas, monospace; color: var(--muted, #888); white-space: nowrap; }
.trace-table tr:hover td { background: var(--bg-2, #fafafa); }

/* ---------- 协同模式开关 ---------- */
.switch { position: relative; display: inline-block; width: 42px; height: 22px; vertical-align: middle; }
.switch input { opacity: 0; width: 0; height: 0; }
.switch .slider { position: absolute; inset: 0; background: #c5c5c5; border-radius: 999px; transition: .2s; cursor: pointer; }
.switch .slider:before { content: ""; position: absolute; height: 16px; width: 16px; left: 3px; top: 3px; background: #fff; border-radius: 50%; transition: .2s; box-shadow: 0 1px 2px rgba(0,0,0,.2); }
.switch input:checked + .slider { background: var(--primary, #1677ff); }
.switch input:checked + .slider:before { transform: translateX(20px); }
html[data-theme="dark"] .switch .slider { background: #4a4f55; }

