/* 设计 token (颜色/字号/间距/圆角/z/焦点环/sticky 偏移) 已收口到 src/css/tokens.css —
   本文件只消费 var(--*), 不再定义 :root. 模板里 tokens.css 在 site.css 之前 <link>. */
* { box-sizing: border-box; }
body {
  margin: 0;
  font-family: var(--font-sans);
  color: var(--text-1);
  background: var(--bg);
  font-size: var(--fs-body);
  line-height: var(--lh-body);
  -webkit-font-smoothing: antialiased;
}
.wrap { padding: 20px 32px; max-width: 100%; margin: 0 auto; }
h1 { font-size: var(--fs-display); font-weight: 600; margin: 0 0 4px; color: var(--text-1); letter-spacing: 0.2px; font-family: var(--font-heading); }
.sub { color: var(--text-2); font-size: var(--fs-meta); margin-bottom: var(--sp-4); }
/* 2026-05-12 v2: 天气卡片放白话版顶部 (跟 .reading-md 对齐 720px, 比右上角版更大气) */
.quote-card {
  display: none; padding: 12px 4px;
  background: transparent; border: none; border-bottom: 1px dashed var(--border-soft); border-radius: 0;
  margin: 0 auto 20px; max-width: 720px;
}
.quote-card.ready { display: flex; flex-direction: column; }
.quote-card .w-quote-block {
  border-left: 3px solid var(--accent-orange);
  padding: 4px 14px;
}
.quote-card .w-quote {
  font-size: var(--fs-body); color: var(--text-1); font-style: italic; line-height: var(--lh-body);
}
.quote-card .w-quote-source {
  font-size: var(--fs-meta); color: var(--text-3); margin-top: 6px;
  font-family: var(--font-mono);
}

/* 一级视图切换 — sticky 顶部固定 (滚动正文时 view tabs 贴顶导航) */
.view-tabs {
  display: flex; gap: 0; margin-bottom: var(--sp-4);
  border-bottom: 1px solid var(--border);
  position: sticky; top: 0; z-index: 10;
  background: var(--bg);
  /* 微妙下方阴影增强浮动感 */
  box-shadow: 0 2px 4px -2px rgba(0, 0, 0, 0.04);
  /* 跟 .wrap padding 对齐, sticky 贴顶时左右铺满 */
  margin-left: -24px; margin-right: -24px; padding-left: var(--sp-5); padding-right: var(--sp-5);
}
.view-tab {
  padding: 9px 18px; background: transparent; border: 0; cursor: pointer;
  font-size: var(--fs-body); color: var(--text-2); font-family: inherit;
  border-bottom: 2px solid transparent; margin-bottom: -1px;
  transition: color 0.15s ease;
}
.view-tab:hover { color: var(--text-1); }
.view-tab.active { color: var(--text-1); border-bottom-color: var(--accent-orange); font-weight: 600; }
/* 2026-07-03: nav tab 可拖拽排序 (本地浏览器记住, main.js _bindNavTabDrag) */
.view-tab[draggable="true"] { cursor: grab; }
.view-tab.dragging { opacity: 0.4; cursor: grabbing; }
/* 2026-06-27 防越权 tab 闪现: 权限落定前 (applyTabPerms 加 .perms-ready) 先把整条导航隐藏,
   避免受限分组(如 A 组)进站瞬间看到全部 tab 再坍缩到权限内。用 visibility 而非 display: 保留
   sticky 单行高度 → 揭示时零布局抖动。boot() 内有 4s 兜底, /api/me 异常也会用最小档揭示, 不留空导航。 */
.view-tabs:not(.perms-ready) { visibility: hidden; }

.kpis { display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: var(--sp-2); margin-bottom: 14px; }
.kpi { background: var(--card); border: 1px solid var(--border); border-radius: var(--r-lg); padding: 12px 14px; }
.kpi .k { font-size: var(--fs-body); color: var(--text-3); letter-spacing: 0.3px; }
.kpi .v { font-size: var(--fs-display); font-weight: 600; margin-top: 3px; color: var(--text-1); }
.kpi .v.up { color: var(--up); }
.kpi .v.dn { color: var(--dn); }

/* 2026-05-29: 持仓分档面板 — 淡雅文本网格 (无边框/无衬色, 字重轻, 不用红绿, 与列表同色系) */
.kpi-tier-wrap { margin-bottom: 14px; }
.kpi-tier-grid {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 4px 20px;
}
@media (max-width: 900px) {
  .kpi-tier-grid {
    grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
    gap: 8px 16px;
  }
}
.kpi-tier-cell { padding: 2px 0; font-size: var(--fs-ui); line-height: var(--lh-snug); color: var(--text-2); }
.kpi-tier-cell .ktc-l1 { display: flex; justify-content: flex-start; align-items: baseline; gap: 8px; }
.kpi-tier-cell .ktc-name { font-weight: normal; color: var(--accent-orange, #d4824a); white-space: nowrap; }
.kpi-tier-cell .ktc-n { color: var(--text-3); font-size: var(--fs-micro); font-weight: 400; margin-left: 5px; }
.kpi-tier-cell .ktc-stat { font-variant-numeric: tabular-nums; white-space: nowrap; flex: none; color: var(--text-2); }
.kpi-tier-cell .ktc-avg { margin-left: 5px; color: var(--text-1); }
.kpi-tier-cell .ktc-l2 { display: flex; justify-content: space-between; gap: 10px; font-size: var(--fs-meta); white-space: nowrap; overflow: hidden; color: var(--text-3); }
.kpi-tier-cell .ktc-l2 > span { overflow: hidden; text-overflow: ellipsis; min-width: 0; }
.kpi-tier-cell .ktc-dim { color: var(--text-3); }
.kpi-tier-cell.kpi-tier-sel .ktc-name { font-weight: normal; text-decoration: underline; text-underline-offset: 3px; }

/* 2026-05-29: ai-calc 计算器输入框 — 透明底(融入页面)/无上下调数字 icon/统一宽度行对齐 */
.calc-input-td { padding: 4px 6px; text-align: right; vertical-align: middle; }
.calc-tbl-input {
  width: 58px; text-align: right; padding: 2px 4px; font-size: 13px;
  border: 1px solid var(--border-soft, var(--border)); border-radius: 4px;
  background: transparent; color: var(--text-1);
  -moz-appearance: textfield;            /* Firefox 去数字微调箭头 */
}
.calc-tbl-input:focus { outline: none; border-color: var(--border-soft, var(--border)); box-shadow: none; }
.calc-tbl-input::-webkit-outer-spin-button,
.calc-tbl-input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }   /* Chrome/Safari 去微调箭头 */

.tabs {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-4);
  margin-bottom: var(--sp-3);
  border-bottom: 1px solid var(--border-soft);
  padding-bottom: 0px;
}
.tab {
  padding: 6px 4px;
  background: transparent;
  border: 0;
  border-bottom: 2px solid transparent;
  border-radius: 0;
  cursor: pointer;
  font-size: var(--fs-body);
  color: var(--text-2);
  transition: all 0.15s ease;
  margin-bottom: -1px;
}
.tab:hover { color: var(--text-1); }
.tab.active { color: var(--text-1); border-bottom-color: var(--accent-orange); font-weight: 600; }
.tab.tab-empty { opacity: 0.5; color: var(--text-3); font-style: italic; }
.tab.tab-empty.active { opacity: 0.85; }
.tab .badge-winrate {
  margin-left: 6px; padding: 1px 6px; background: var(--color-winrate-bg); color: var(--color-winrate-fg);
  border-radius: var(--r-lg); font-size: var(--fs-body); font-weight: 500;
}
/* 2026-05-19 v2: 浮动胜率 (没有任何已结算) 用斜体 + 虚框, 提示数值含浮动 */
.tab .badge-winrate.badge-floating { background: var(--color-winrate-float-bg); color: var(--color-winrate-float-fg); font-style: italic; }

/* 档位 stats banner (切到具体档位时显示历史表现) */
.group-stats {
  display: none; gap: 14px 18px; flex-wrap: wrap;
  padding: 9px 14px; background: var(--card); border: 1px solid var(--border);
  border-radius: var(--r-lg); margin-bottom: var(--sp-3); font-size: var(--fs-body);
}
.group-stats .item { display: flex; align-items: baseline; gap: 5px; }
.group-stats .label { color: var(--text-3); font-size: var(--fs-body); }
.group-stats .value { font-weight: 600; color: var(--text-1); font-family: var(--font-mono); font-size: var(--fs-body); }
.group-stats .value.up { color: var(--up); }
.group-stats .value.dn { color: var(--dn); }
.group-stats .value.winrate { color: var(--color-winrate-fg); }
/* 2026-05-19 v2: 浮动胜率 — 紫色 + 斜体, 区分于已结算 (黄色) */
.group-stats .value.winrate-float { color: var(--color-winrate-float-fg); font-style: italic; }
.group-stats .value.status { font-weight: 400; color: var(--text-2); font-family: inherit; }
/* 2026-05-20: 夏普颜色梯度 (>1 强绿 / 0.5-1 弱绿 / 0-0.5 灰 / <0 红) */
.group-stats .value.sharpe-strong { color: var(--up); }
.group-stats .value.sharpe-mid { color: #6a9d4a; }
.group-stats .value.sharpe-weak { color: var(--text-2); }
.group-stats .value.sharpe-neg { color: var(--dn); }
/* 2026-05-20: 最大回撤始终红色 (回撤负面) */
.group-stats .value.mdd { color: var(--dn); }

.tools { display: flex; gap: var(--sp-2); align-items: center; margin-bottom: var(--sp-3); flex-wrap: wrap; }
.tools input, .tools button {
  padding: 6px 10px; border: 1px solid var(--border); border-radius: var(--r-md);
  font-size: var(--fs-meta); background: var(--card); color: var(--text-1); font-family: inherit;
}
.tools input { min-width: 160px; }
.tools input:focus { outline: none; border-color: var(--border); }
.tools button { cursor: pointer; color: var(--text-2); }
.tools button:hover { background: var(--row-hover); color: var(--text-1); }
.tools .spacer { flex: 1; }

/* table-card: 2026-05-14 改单层滚 (整页跟随). 去 border + max-height 减弱束缚感. overflow: visible 让横纵都走 body — 整页只有一对 scrollbar, 不再 card 内部独立滚动 */
.table-card { background: transparent; border: 0; border-radius: 0; overflow: visible; }
/* 关键: 强制 border-collapse: separate (collapse + sticky 在 Chrome/Firefox 有兼容问题), 配 border-spacing:0 视觉等同 collapse. */
.table-card table { border-collapse: separate !important; border-spacing: 0; }
/* 表头滚动钉顶 — 持仓 / 选股 / 击球 三表共用. top:38px 留出 .view-tabs (sticky top:0) 的高度. 强制不透明 bg 防 tbody 透出. */
.table-card thead th { position: sticky; top: var(--tabs-h); z-index: 5; background: var(--bg); }
/* 2026-05-12 v3: 4 大类节奏 行情(空) - 估值(浅灰) - 盈利(空) - 增长(浅灰), 大块对比简洁 */
/* 2026-05-16: 字号 fin-col 11px override 去掉, 跟 strike-table body 13px 统一 (用户要求字号一致). */
thead th.fin-col { color: var(--text-3); font-weight: 400; }
tbody td.fin-col { color: var(--text-2); }
/* 估值 + 增长: 浅灰; 盈利: 不设背景 (跟行情/基础融为一体, 保留 4 大类节奏)
   2026-05-14: thead 不再用半透明 bg (sticky 时 tbody 会透出来), 仅 tbody 保留分组浅灰; thead 用通用 row-hover 不透明色. */
tbody td.fin-valuation, tbody td.fin-growth { background: rgba(0, 0, 0, 0.028); }
/* fin-profit 不设背景 — 留空保留节奏感 */
/* 行 hover: 浅灰列略加深, 空列 (盈利/行情/基础) 由 var(--row-hover) 默认接管 */
tbody tr:hover td.fin-valuation, tbody tr:hover td.fin-growth { background: rgba(0, 0, 0, 0.046); }
/* yoy 涨跌色 — A 股惯例 红涨绿跌 (跟主表 var(--up)/var(--dn) 统一) */
tbody td.fin-col.up { color: var(--up); }
tbody td.fin-col.dn { color: var(--dn); }
tbody td.fin-col.flat { color: var(--text-3); }
/* 2026-05-12 加: 🧠 图谱视角 (modal sub-tab) — 11 个 Neo4j 决策场景的通俗卡片 */
.perspective-intro { margin-bottom: 14px; padding-bottom: 10px; border-bottom: 1px solid var(--border-soft); }
.perspective-intro h3 { margin: 0 0 6px; font-size: var(--fs-title); color: var(--text-1); font-weight: 600; letter-spacing: 0.2px; }
.perspective-sub { margin: 0; font-size: var(--fs-meta); color: var(--text-2); line-height: var(--lh-body); }
.perspective-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 10px; }
.perspective-card { background: var(--card); border: 1px solid var(--border-soft); border-radius: var(--r-lg); padding: 12px 14px 10px; transition: border-color 0.15s ease, box-shadow 0.15s ease; }
.perspective-card:hover { border-color: var(--border); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.04); }
.perspective-card .ps-head { display: flex; align-items: baseline; gap: 6px; margin-bottom: 7px; }
.perspective-card .ps-num { font-size: var(--fs-title); color: var(--accent); font-weight: 600; min-width: 16px; }
.perspective-card .ps-icon { font-size: var(--fs-title); }
.perspective-card .ps-title { font-size: var(--fs-ui); font-weight: 600; color: var(--text-1); letter-spacing: 0.2px; }
.perspective-card .ps-plain { font-size: var(--fs-meta); color: var(--text-2); line-height: var(--lh-body); margin-bottom: var(--sp-2); padding: 0 0 0 8px; border-left: 2px solid var(--border); }
.perspective-card .ps-data { font-size: var(--fs-meta); color: var(--text-1); line-height: var(--lh-body); padding: 8px 10px; background: rgba(0, 0, 0, 0.025); border-radius: 5px; margin-bottom: 7px; }
.perspective-card .ps-data.ps-none { color: var(--text-3); font-style: italic; background: transparent; padding: 4px 0; }
.perspective-card .ps-data .ps-link { display: inline-block; margin-top: var(--sp-1); font-size: var(--fs-meta); color: var(--text-3); }
.perspective-card .ps-data b { color: var(--text-1); font-weight: 600; }
.perspective-card .ps-insight { font-size: var(--fs-meta); color: var(--text-3); padding-top: 6px; border-top: 1px dashed var(--border-soft); line-height: var(--lh-snug); }
.perspective-card .ps-chip { display: inline-block; padding: 1px 8px; margin: 2px 3px 2px 0; background: rgba(0, 0, 0, 0.04); border-radius: 9px; font-size: var(--fs-meta); color: var(--text-2); }
.perspective-card .ps-mini { font-size: var(--fs-meta); color: var(--text-3); }
.perspective-card .ps-none { color: var(--text-3); font-style: italic; font-size: var(--fs-meta); }
/* 2026-05-12 v4: 用户要求 ps-tag 完全不加颜色, 极简清爽 (HTML 保留, CSS 隐藏) */
.ps-tag { display: none; }
/* 卡片头部 emoji 容器删, ps-tag 纵向居中 */
.perspective-card .ps-head { gap: var(--sp-1); align-items: center; }
.perspective-card .ps-icon { display: none; }  /* 旧 emoji 不显示, 用 ps-tag 替代 */
/* details 标题里 ps-tag 的 inline 显示 */
.graph-block summary .ps-tag { width: 18px; height: 5px; }
/* 2026-05-12 加: md 表格 + code block (ASCII 收益曲线图等) */
.md-table-wrap { overflow-x: auto; margin: 14px 0; border: 1px solid var(--border-soft); border-radius: var(--r-md); }
.md-table { border-collapse: collapse; width: 100%; font-size: var(--fs-body); font-family: var(--font-mono); }
.md-table th, .md-table td { border-bottom: 1px solid var(--border-soft); padding: 7px 12px; text-align: left; vertical-align: top; }
.md-table th { background: rgba(245, 240, 232, 0.55); color: var(--text-2); font-weight: 500; letter-spacing: 0.2px; border-bottom: 2px solid rgba(180, 165, 130, 0.35); }
.md-table tbody tr:nth-child(2n) td { background: rgba(245, 245, 245, 0.35); }
.md-table tbody tr:hover td { background: rgba(245, 240, 232, 0.4); }
/* 2026-05-13: 全部左对齐 (用户要求 th + td 对齐, 之前 td 右对齐导致标题错位) */
.md-table strong { color: var(--text-1); }
.other-md pre, .modal-body pre { background: #f7f7f4; border: 1px solid var(--border-soft); border-radius: var(--r-md); padding: 14px 16px; overflow-x: auto; font-family: var(--font-mono); font-size: var(--fs-meta); line-height: var(--lh-snug); white-space: pre; color: var(--text-1); margin: 12px 0; }
.other-md pre code, .modal-body pre code { background: transparent; padding: 0; font-size: inherit; color: inherit; }
.other-md p code, .modal-body p code, .other-md li code, .modal-body li code { background: rgba(245, 240, 232, 0.6); padding: 1px 5px; border-radius: 3px; font-size: var(--fs-meta); color: var(--text-1); }
.other-md blockquote, .modal-body blockquote { border-left: 3px solid rgba(180, 165, 130, 0.4); margin: 10px 0; padding: 4px 12px; color: var(--text-2); background: rgba(245, 240, 232, 0.25); }
.other-md hr, .modal-body hr { border: 0; border-top: 1px solid var(--border-soft); margin: 18px 0; }
.other-md h2, .modal-body h2 { font-size: var(--fs-body); margin: 18px 0 10px; color: var(--text-1); border-bottom: 1px solid var(--border-soft); padding-bottom: 6px; }
.other-md h3, .modal-body h3 { font-size: var(--fs-body); margin: 14px 0 8px; color: var(--text-1); }
table { width: 100%; border-collapse: collapse; font-size: var(--fs-ui); line-height: var(--lh-snug); font-variant-numeric: tabular-nums; }
thead th {
  background: var(--bg); padding: 8px 10px; text-align: left; font-weight: 500;
  color: var(--text-3); font-size: var(--fs-ui); letter-spacing: 0.3px;
  border-bottom: 1px solid var(--border); white-space: nowrap;
  user-select: none;
}
thead th.sortable { cursor: pointer; transition: color 0.15s ease; }
thead th.sortable:hover { color: var(--text-2); background: var(--row-hover); }
thead th.sorted { color: var(--accent); }
tbody td { padding: 6px 10px; border-bottom: 1px solid var(--border-soft); white-space: nowrap; }
tbody tr:hover { background: var(--row-hover); }
tbody tr:last-child td { border-bottom: 0; }
/* 2026-05-12 用户决策: 今日新选行不再用浅黄衬底, 只保留 code 列的 "新" 字 badge 标识 */

.code { font-family: var(--font-mono); color: var(--text-2); }
.meta { color: var(--text-3); font-family: var(--font-mono); }
.group-tag {
  display: inline-block; padding: 2px 8px; background: var(--tag-bg); color: var(--text-2);
  border-radius: 10px; font-size: var(--fs-meta);
}
.new-badge {
  display: inline-block; padding: 1px 6px; background: var(--color-winrate-bg); color: var(--color-winrate-fg);
  border-radius: var(--r-lg); font-size: var(--fs-meta); margin-left: 6px; vertical-align: middle;
}
/* 褐金强调字 — 与 .new-badge/.badge-winrate 同色系 (新选提示文字/confidence 数值), 2026-06-10 收口内联 hex */
.t-gold { color: var(--color-winrate-fg); }
.source-tag {
  display: inline-block; padding: 1px 8px; border-radius: 10px; font-size: var(--fs-meta);
  font-family: var(--font-mono);
}
.source-tag.self { background: var(--color-src-self-bg); color: var(--color-src-self-fg); }
.source-tag.aux { background: var(--tag-bg); color: var(--text-2); }
.source-tag.ml { background: var(--color-src-ml-bg); color: var(--color-src-ml-fg); }
.source-tag.redo { background: var(--color-src-redo-bg); color: var(--color-src-redo-fg); }
/* view 顶部数据时间徽章 (_setViewAsOf 动态插入) — 2026-06-10 从 JS cssText 收口到此 */
.view-asof-badge {
  padding: 4px 12px; background: var(--bg-2); border-bottom: 1px solid var(--border-soft);
  font-size: var(--fs-meta); color: var(--text-3); text-align: left; font-family: var(--font-mono);
}
.pct { font-family: var(--font-mono); font-weight: normal; text-align: right; white-space: nowrap; }
.up { color: var(--up); }
.dn { color: var(--dn); }
.flat { color: var(--flat); }
.loading { color: var(--text-3); font-size: var(--fs-meta); }
/* 2026-06-10: 块级加载/错误提示 — 收口各 view 散落的内联 style="color:#999;font-size:13px".
   .pulse 修饰 = 进行中 (载入中…) 微脉动; 空态/失败态不动. */
.loading-block { padding: 8px 0; color: var(--text-3); font-size: var(--fs-ui); }
.loading-block.err { color: var(--up); }
@keyframes loadPulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.55; } }
/* 纯加载态类共享微脉动 — prefers-reduced-motion 由 tokens.css 全局中和 */
.loading-block.pulse, .sidebar-loading, .kline-loading, .mini-graph-loading, .encoder-loading { animation: loadPulse 1.8s ease-in-out infinite; }
/* 2026-06-20: 规范化空态 / 错误态 (新代码用这两个; 旧 .*-empty / .loading-block.err 仍兼容保留).
   .empty-state = 中性占位; .error-state = 失败 (左红条 + 浅红底, 与 admin 错误风格统一). */
.empty-state { padding: 16px 0; color: var(--text-3); font-size: var(--fs-ui); text-align: center; }
.error-state { padding: 10px 12px; color: var(--up); font-size: var(--fs-ui);
  border-left: 3px solid var(--up); background: rgba(198, 106, 100, 0.08); border-radius: var(--r-sm); }
.hint { color: var(--text-3); font-size: var(--fs-meta); margin-top: 10px; text-align: center; }

/* 点击进 modal 的列 */
.clickable { cursor: pointer; transition: color 0.15s ease; }
.clickable:hover { color: var(--accent); }
.clickable:hover .name-text { text-decoration: underline; text-underline-offset: 2px; }

/* Modal */
.modal-backdrop {
  position: fixed; inset: 0; background: rgba(58, 66, 80, 0.42);
  display: flex; align-items: flex-start; justify-content: center;
  z-index: 9998; padding: 32px 16px; overflow-y: auto;
  animation: fadeIn 0.12s ease;
}
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
.modal-card {
  background: var(--card); border-radius: var(--r-xl); max-width: 760px; width: 100%;
  box-shadow: 0 20px 60px rgba(58, 66, 80, 0.18);
  display: flex; flex-direction: column; max-height: calc(100vh - 64px);
}
.modal-header {
  display: flex; justify-content: space-between; align-items: flex-start;
  padding: 16px 22px; border-bottom: 1px solid var(--border); flex-shrink: 0;
}
.modal-header h2 { margin: 0; font-size: var(--fs-display); font-weight: 600; color: var(--text-1); }
.modal-sub-info { font-size: var(--fs-meta); color: var(--text-3); margin-top: var(--sp-1); font-family: var(--font-mono); }
.modal-close {
  background: transparent; border: 0; font-size: var(--fs-display); line-height: 1; padding: 0;
  cursor: pointer; color: var(--text-2);
  width: 30px; height: 30px; border-radius: var(--r-md);
  display: flex; align-items: center; justify-content: center;
}
.modal-close:hover { color: var(--text-1); background: var(--bg); }
/* modal sub-tabs (个股汇总 / 历史 / LLM 推理 / Neo4j) */
.modal-tabs {
  display: flex; gap: 0; padding: 0 22px; border-bottom: 1px solid var(--border);
  background: var(--card); flex-shrink: 0;
}
.modal-tabs button {
  padding: 9px 14px; background: transparent; border: 0; cursor: pointer;
  font-size: var(--fs-meta); color: var(--text-2); font-family: inherit;
  border-bottom: 2px solid transparent; margin-bottom: -1px;
}
.modal-tabs button:hover { color: var(--text-1); }
.modal-tabs button.active { color: var(--accent); border-bottom-color: var(--accent); font-weight: 600; }

.modal-source-tag {
  display: inline-block; padding: 3px 10px; border-radius: 10px;
  background: var(--tag-bg); color: var(--text-2); font-size: var(--fs-meta);
  margin: 4px 0 10px; font-family: var(--font-mono);
}
/* 历史日期切换 */
.history-dates {
  display: flex; flex-wrap: wrap; gap: var(--sp-1); margin: 4px 0 12px;
  padding-bottom: 10px; border-bottom: 1px dashed var(--border);
}
.history-dates button {
  padding: 3px 9px; border: 1px solid var(--border); background: var(--card);
  border-radius: var(--r-xl); cursor: pointer; font-size: var(--fs-meta); color: var(--text-2);
  font-family: var(--font-mono);
}
.history-dates button:hover { color: var(--text-1); background: var(--bg); }
.history-dates button.active { background: var(--text-1); color: #fff; border-color: var(--text-1); }
/* Neo4j 标签/事件/财务渲染 */
.tag-row {
  display: flex; flex-wrap: wrap; gap: var(--sp-2); margin: 6px 0 14px;
}
.tag-item {
  display: flex; align-items: center; gap: 6px; padding: 4px 11px;
  background: var(--card); border: 1px solid var(--border); border-radius: 14px;
  font-size: var(--fs-meta);
}
.tag-item .tag-k { color: var(--text-3); font-size: var(--fs-meta); }
.tag-item .tag-v { color: var(--text-1); font-weight: 500; }
.event-item {
  padding: 9px 12px; background: var(--bg); border-left: 3px solid var(--accent-orange);
  border-radius: var(--r-sm); margin: 6px 0; font-size: var(--fs-meta);
}
.event-meta { color: var(--text-3); font-size: var(--fs-meta); margin-bottom: var(--sp-1); font-family: var(--font-mono); }
.event-type {
  display: inline-block; padding: 0 6px; background: var(--tag-bg); color: var(--text-2);
  border-radius: var(--r-lg); font-size: var(--fs-meta);
}
.event-content { color: var(--text-1); line-height: var(--lh-body); }
.fin-table { width: auto; min-width: 280px; font-size: var(--fs-body); margin: 6px 0 14px; }
.fin-table td { padding: 4px 10px; border: 0; }
.fin-table .fin-k { color: var(--text-3); font-size: var(--fs-body); }
.fin-table .fin-v { color: var(--text-1); font-weight: 600; font-family: var(--font-mono); text-align: right; }
.modal-empty {
  padding: 28px 20px; text-align: center; color: var(--text-3); font-size: var(--fs-meta);
}

/* 图谱扩展折叠块 */
details.graph-block { margin-top: var(--sp-3); }
details.graph-block > summary {
  padding: 8px 12px; background: var(--bg); border: 1px solid var(--border);
  border-radius: var(--r-md); cursor: pointer; list-style: none;
  font-size: var(--fs-meta); font-weight: 600; color: var(--text-1);
  display: flex; align-items: center; gap: 6px;
}
details.graph-block > summary::-webkit-details-marker { display: none; }
details.graph-block > summary::before {
  content: '▶'; font-size: var(--fs-meta); color: var(--text-3); transition: transform 0.15s ease;
}
details.graph-block[open] > summary::before { transform: rotate(90deg); }
details.graph-block > summary:hover { background: var(--row-hover); }
details.graph-block > div, details.graph-block > details { padding: 10px 4px 4px; }

.peer-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 6px; padding: 10px 4px 4px;
}
.peer-item {
  padding: 8px 10px; background: var(--card); border: 1px solid var(--border);
  border-radius: var(--r-md); font-size: var(--fs-meta); cursor: pointer; transition: border-color 0.15s;
}
.peer-item:hover { border-color: var(--accent); background: var(--row-hover); }
.peer-item .peer-name { color: var(--text-1); font-weight: 500; }
.peer-item .peer-code { color: var(--text-3); font-size: var(--fs-meta); font-family: var(--font-mono); margin-top: 2px; }
.peer-item .peer-ret { font-size: var(--fs-meta); margin-top: 3px; font-family: var(--font-mono); font-weight: 500; }

.supply-grid {
  display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-3); padding: 10px 4px 4px;
}
.supply-side .supply-label {
  font-size: var(--fs-meta); color: var(--text-2); margin-bottom: 6px; font-weight: 500;
}
.supply-item {
  padding: 5px 9px; background: var(--card); border: 1px solid var(--border-soft);
  border-radius: var(--r-sm); font-size: var(--fs-meta); margin: 3px 0; cursor: pointer;
}
.supply-item:hover { background: var(--row-hover); border-color: var(--accent); }
.supply-item .peer-code { color: var(--text-3); font-size: var(--fs-meta); margin-right: 5px; }

.theme-block { margin: 10px 0; padding: 0 4px; }
.theme-block .theme-name { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; font-size: var(--fs-meta); margin-bottom: 6px; }
.peer-row { display: flex; gap: 5px; flex-wrap: wrap; }
.peer-chip {
  padding: 3px 9px; background: var(--card); border: 1px solid var(--border);
  border-radius: 11px; font-size: var(--fs-meta); color: var(--text-1); cursor: pointer;
}
.peer-chip:hover { border-color: var(--accent); background: var(--row-hover); }

.event-item .event-stats {
  margin-top: var(--sp-1); font-size: var(--fs-meta); color: var(--text-3); font-family: var(--font-mono);
}
.event-item .event-stats b { font-weight: 500; }

/* K 线 */
.kline-toolbar {
  display: flex; gap: var(--sp-1); align-items: center; flex-wrap: wrap;
  padding: 0 0 10px; border-bottom: 1px solid var(--border-soft); margin-bottom: var(--sp-2);
}
.kline-period {
  padding: 4px 11px; border: 1px solid var(--border); background: var(--card);
  border-radius: var(--r-sm); font-size: var(--fs-meta); cursor: pointer; color: var(--text-2); font-family: inherit;
}
.kline-period.active { background: var(--text-1); color: #fff; border-color: var(--text-1); }
.kline-period:hover { background: var(--row-hover); }
.kline-fqt {
  padding: 3px 8px; border: 1px solid var(--border); border-radius: var(--r-sm);
  font-size: var(--fs-meta); background: var(--card); color: var(--text-1); font-family: inherit;
}
.kline-spacer { flex: 1; }
.kline-meta { font-size: var(--fs-meta); color: var(--text-3); font-family: var(--font-mono); }
.kline-meta .meta-up { color: var(--up); }
.kline-meta .meta-dn { color: var(--dn); }
.kline-container { width: 100%; min-height: 360px; position: relative; }
.kline-loading {
  position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
  background: rgba(255,255,255,0.7); color: var(--text-3); font-size: var(--fs-meta);
}

/* mini 图 (modal 内嵌, 1 跳邻居可视化) */
.mini-graph-wrapper {
  position: relative; height: 320px; background: #fafbfc;
  border: 1px solid var(--border); border-radius: var(--r-lg); margin-bottom: 14px;
  overflow: hidden;
}
.mini-graph-hint {
  position: absolute; top: 6px; right: 8px; font-size: var(--fs-meta); color: var(--text-3);
  background: rgba(255,255,255,0.85); padding: 2px 6px; border-radius: var(--r-sm);
  pointer-events: none; z-index: 1;
}
.mini-graph-legend {
  position: absolute; bottom: 6px; left: 8px; display: flex; gap: var(--sp-2); flex-wrap: wrap;
  font-size: var(--fs-meta); pointer-events: none; z-index: 1;
}
.mini-graph-legend .leg {
  background: rgba(255,255,255,0.85); padding: 1px 6px; border-radius: var(--r-sm); color: var(--text-2);
  display: flex; align-items: center; gap: var(--sp-1);
}
.mini-graph-legend .leg::before {
  content: ''; width: 8px; height: 8px; border-radius: 50%; display: inline-block;
}
.mini-graph-legend .leg.self::before { background: #6c8ec4; }
.mini-graph-legend .leg.peer::before { background: #d0d4da; }
.mini-graph-legend .leg.theme::before { background: #c5a8ca; border-radius: 2px; }
.mini-graph-legend .leg.concept::before { background: #e8be8a; border-radius: 2px; }
.mini-graph-legend .leg.archetype::before { background: #a4c79a; border-radius: 2px; }
.mini-graph-loading {
  position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
  color: var(--text-3); font-size: var(--fs-meta);
}

/* ========== 「白话版」view: 全宽阅读区 (Notion 风) ========== */
/* 2026-05-20: 双栏布局 — 左主 (最新白话版) + 右 sidebar (历史时间线) */
.white-layout {
  display: grid; grid-template-columns: minmax(0, 1fr) 540px; gap: var(--sp-6);
  align-items: start;
}
.white-content {
  min-width: 0;  /* allow grid item to shrink below content width */
}
.white-sidebar {
  position: sticky; top: 58px;
  max-height: calc(100vh - 110px); overflow-y: auto;
  padding: var(--sp-1);
  background: transparent;
  border: 0; border-radius: 0;
  font-size: var(--fs-meta);
  -ms-overflow-style: none;  /* IE and Edge */
  scrollbar-width: none;  /* Firefox */
}
.white-sidebar::-webkit-scrollbar {
  display: none; /* Chrome, Safari, Opera */
}
.white-sidebar-title {
  padding: 6px 8px 12px;
  font-size: var(--fs-meta); color: var(--text-3); letter-spacing: 0.5px;
  font-weight: 600;
  text-transform: uppercase;
}
.white-sidebar-item {
  margin: 8px 0 12px;
  border: none;
  background: transparent;
  border-radius: var(--r-md);
  overflow: hidden;
  border-left: 3px solid transparent;
  transition: all 0.15s ease;
  /* 2026-05-21: CSS Containment — 视口外条目跳过布局/绘制, 亚洲加载优化 */
  content-visibility: auto;
  contain-intrinsic-size: auto 80px;
}
.white-sidebar-item:hover {
  border-left-color: rgba(212, 130, 74, 0.35);
  background: rgba(212, 130, 74, 0.015);
}
.white-sidebar-item.active {
  border-left-color: var(--accent-orange);
  background: rgba(212, 130, 74, 0.04);
}
.white-sidebar-item-head {
  padding: 8px 12px;
  cursor: pointer;
  display: flex; flex-direction: column; gap: var(--sp-1);
}
.white-sidebar-item-date {
  font-size: var(--fs-meta); color: var(--accent-orange);
  font-family: var(--font-mono);
  font-weight: 600;
}
.white-sidebar-item-headline {
  font-size: var(--fs-ui); color: var(--text-1); line-height: var(--lh-snug);
  font-weight: 500;
}
.white-sidebar-item-poem {
  font-size: var(--fs-ui); color: var(--text-1); line-height: var(--lh-snug);
  font-style: normal;
  border-left: 2px solid var(--border-soft);
  padding-left: var(--sp-2); margin-top: var(--sp-1);
}
.white-sidebar-item-body {
  display: none;
  padding: 4px 12px 12px;
  border-top: none;
  font-size: var(--fs-ui); color: var(--text-2); line-height: var(--lh-body);
  white-space: pre-wrap;
}
.white-sidebar-item.open .white-sidebar-item-body { display: block; }
.white-sidebar-item.open .white-sidebar-item-head { background: transparent; }

/* 移动端: 单栏堆叠, sidebar 移到下面 */
@media (max-width: 900px) {
  .white-layout { grid-template-columns: 1fr; }
  .white-sidebar { position: static; max-height: none; }
}

/* 2026-05-20: 白话版激活时，隐藏主页面滚动条，保持页面无边界感 */
body.view-white {
  scrollbar-width: none;
  -ms-overflow-style: none;
}
body.view-white::-webkit-scrollbar {
  display: none;
}

.white-meta {
  max-width: 720px; margin: 0 auto 14px; padding: 8px 4px;
  background: transparent; border: none; border-bottom: 1px dashed var(--border-soft); border-radius: 0;
  font-size: var(--fs-meta); color: var(--text-2); display: flex; gap: 14px; flex-wrap: wrap;
}
.white-meta strong { color: var(--text-1); font-weight: 500; }
.reading-md {
  max-width: 720px; margin: 0 auto;
  padding: 12px 4px 28px;
  background: transparent; border: 0; border-radius: 0;
  color: var(--text-1); font-size: var(--fs-body); line-height: var(--lh-body);
  letter-spacing: 0.1px;
}
.reading-md h1 {
  font-size: var(--fs-display); font-weight: 700; margin: 12px 0 20px;
  color: var(--text-1); line-height: var(--lh-tight);
  padding-bottom: var(--sp-2); border-bottom: 2px solid var(--accent-orange);
}
.reading-md h2 {
  font-size: var(--fs-title); font-weight: 600; margin: 26px 0 12px;
  color: var(--text-1); line-height: var(--lh-tight);
  padding-left: 10px; border-left: 3px solid var(--accent-orange);
}
.reading-md h3 { font-size: var(--fs-body); font-weight: 600; margin: 20px 0 8px; color: var(--text-1); }
.reading-md p { margin: 12px 0; color: var(--text-1); }
.reading-md strong { color: var(--text-1); font-weight: 600; }
.reading-md em { color: var(--text-2); font-style: italic; }
.reading-md blockquote {
  border-left: 3px solid var(--accent-orange); padding: 12px 18px; margin: 18px 0;
  background: rgba(212, 130, 74, 0.04); color: var(--text-1); border-radius: var(--r-sm);
  font-style: italic; font-size: var(--fs-ui); line-height: var(--lh-loose);
}
#white-content blockquote.white-poem-inline {
  border-left: none;
  background: transparent;
  border-radius: 0;
  padding: 0;
  margin: 36px 0 18px;
  color: var(--text-1);
  font-style: italic;
  font-size: var(--fs-body);
  line-height: var(--lh-body);
}
.reading-md hr { border: 0; border-top: 1px solid var(--border-soft); margin: 24px 0; }
.reading-md code {
  font-family: var(--font-mono);
  background: var(--tag-bg); padding: 1px 6px; border-radius: 3px;
  font-size: var(--fs-ui); color: var(--text-1);
}
.reading-md ul, .reading-md ol { padding-left: 26px; margin: 10px 0; }
.reading-md li { margin: 5px 0; }
.reading-md table { width: 100%; border-collapse: collapse; margin: 14px 0; font-size: var(--fs-ui); }
.reading-md th, .reading-md td { padding: 6px 10px; border-bottom: 1px solid var(--border-soft); text-align: left; }
.reading-md th { color: var(--text-2); font-weight: 500; background: var(--bg); }

/* ========== 「其他」view: 左右分栏 ========== */
.other-layout {
  display: grid; grid-template-columns: 220px 1fr; gap: var(--sp-4);
  min-height: 500px;
}
.other-sidebar {
  background: var(--card); border: 1px solid var(--border); border-radius: var(--r-lg);
  padding: 12px 0; overflow-y: auto; max-height: calc(100vh - 180px); position: sticky; top: 16px;
}
.sidebar-loading { padding: 12px 16px; color: var(--text-3); font-size: var(--fs-meta); }
.sidebar-category {
  padding: 8px 16px 4px; font-size: var(--fs-meta); color: var(--text-3); letter-spacing: 0.3px;
  font-weight: 500; user-select: none; cursor: pointer;
  display: flex; align-items: center; gap: 6px;
}
.sidebar-category:hover { color: var(--text-2); }
.sidebar-category .arrow { font-size: var(--fs-meta); transition: transform 0.15s ease; }
.sidebar-category.collapsed .arrow { transform: rotate(-90deg); }
.sidebar-category .icon { font-size: var(--fs-ui); }
.sidebar-cat-items { display: block; }
.sidebar-category.collapsed + .sidebar-cat-items { display: none; }
.sidebar-item {
  padding: 7px 16px; font-size: var(--fs-ui); color: var(--text-2);
  cursor: pointer; transition: all 0.12s ease; border-left: 3px solid transparent;
  display: flex; align-items: center; gap: 6px;
}
.sidebar-item:hover { background: var(--row-hover); color: var(--text-1); }
.sidebar-item.active {
  color: var(--text-1); font-weight: 600;
  border-left-color: var(--accent); background: var(--row-hover);
}
.sidebar-item .dot { display: none; }  /* dot 隐藏 */
/* 2026-05-13 v4: 所有 sidebar item 同等地位 — 默认 3px 透明 border-left, active 时变 --accent 橙色 (line 497-506 默认逻辑生效) */
.sidebar-category .icon { display: none; }  /* 不显示 emoji */

.other-content {
  background: var(--card); border: 1px solid var(--border); border-radius: var(--r-lg);
  padding: 22px 28px; min-height: 500px;
  overflow-y: auto; max-height: calc(100vh - 180px);
}
.other-content-meta {
  display: flex; gap: 14px; align-items: center; flex-wrap: wrap;
  padding-bottom: var(--sp-3); margin-bottom: var(--sp-4); border-bottom: 1px solid var(--border-soft);
  font-size: var(--fs-meta); color: var(--text-3);
}
.other-content-meta .title { color: var(--text-1); font-weight: 600; font-size: var(--fs-title); }
.other-content-meta .badge {
  background: var(--tag-bg); color: var(--text-2); padding: 1px 8px;
  border-radius: 10px; font-size: var(--fs-meta);
}
.other-empty {
  padding: 60px 20px; text-align: center; color: var(--text-3); font-size: var(--fs-ui);
}
.other-md {
  line-height: var(--lh-loose); color: var(--text-1); font-size: var(--fs-ui);
}
.other-md h1 { font-size: var(--fs-display); font-weight: 600; margin: 16px 0 10px; padding-bottom: 6px; border-bottom: 1px solid var(--border-soft); }
.other-md h2 { font-size: var(--fs-title); font-weight: 600; margin: 22px 0 8px; padding-left: var(--sp-2); border-left: 3px solid var(--accent-orange); }
.other-md h3 { font-size: var(--fs-ui); font-weight: 600; margin: 16px 0 6px; color: var(--text-1); }
.other-md p { margin: 8px 0; }
.other-md strong { color: var(--text-1); font-weight: 600; }
.other-md em { color: var(--text-2); }
.other-md blockquote { border-left: 3px solid var(--border); padding: 6px 12px; margin: 10px 0; color: var(--text-2); background: var(--bg); border-radius: var(--r-sm); }
.other-md hr { border: 0; border-top: 1px solid var(--border-soft); margin: 18px 0; }
.other-md code { font-family: var(--font-mono); background: var(--tag-bg); padding: 1px 5px; border-radius: 3px; font-size: var(--fs-meta); }
.other-md ul, .other-md ol { padding-left: 22px; margin: 6px 0; }
.other-md li { margin: 3px 0; }
.other-md table { width: 100%; border-collapse: collapse; margin: 10px 0; font-size: var(--fs-meta); }
.other-md th, .other-md td { padding: 5px 8px; border-bottom: 1px solid var(--border-soft); text-align: left; }
.other-md th { background: var(--bg); color: var(--text-2); font-weight: 500; }

/* ========== 「主题」view: 轻阅读 demo ========== */
.theme-layout {
  display: grid; grid-template-columns: 180px minmax(0, 1fr); gap: 18px;
  align-items: start;
}
.theme-sidebar {
  position: sticky; top: 58px;
  padding: var(--sp-2);
  background: rgba(255,255,255,0.72);
  border: 1px solid var(--border-soft);
  border-radius: var(--r-lg);
}
.theme-sidebar-title {
  padding: 6px 8px 9px;
  font-size: var(--fs-meta); color: var(--text-3); letter-spacing: 0.4px;
}
.theme-sidebar-item {
  width: 100%; display: block; text-align: left;
  padding: 8px 10px; margin: 2px 0;
  border: 1px solid transparent; border-radius: var(--r-md);
  background: transparent; color: var(--text-2);
  font-size: var(--fs-ui); font-family: inherit; cursor: pointer;
  transition: background 0.14s ease, color 0.14s ease, border-color 0.14s ease;
}
.theme-sidebar-item:hover {
  color: var(--text-1);
  background: rgba(248,250,252,0.88);
}
.theme-sidebar-item.active {
  color: var(--text-1); font-weight: 600;
  background: rgba(240,196,204,0.18);
  border-color: rgba(240,196,204,0.45);
}
.theme-content {
  max-width: 980px;
  background: rgba(255,255,255,0.82);
  border: 1px solid var(--border-soft);
  border-radius: var(--r-lg);
  padding: 26px 34px 34px;
  min-height: 520px;
}
/* demo (bucket view) 用满屏宽, 去掉框 — 对齐击球/持仓/选股 */
.theme-content.demo-fullwidth {
  max-width: none;
  background: transparent;
  border: 0;
  border-radius: 0;
  padding: 0;
  min-height: 0;
}
.theme-content .other-content-meta {
  margin-bottom: 20px;
  border-bottom-color: rgba(232,235,239,0.72);
}
.theme-content .other-content-meta .badge {
  background: rgba(200,184,224,0.18);
  color: var(--text-2);
}
.theme-content .other-md {
  max-width: 900px;
  line-height: var(--lh-loose);
}
.theme-content .other-md.theme-md h1 {
  font-size: var(--fs-display);
  margin: 4px 0 18px;
  border-bottom: 0;
}
.theme-content .other-md.theme-md h2 {
  margin-top: 26px;
  border-bottom-color: rgba(232,235,239,0.7);
}
.theme-content .other-md.theme-md p,
.theme-content .other-md.theme-md li {
  font-size: var(--fs-ui);
}
.theme-content .md-table-wrap {
  background: rgba(255,255,255,0.65);
}
.theme-content .theme-card {
  background: rgba(255,255,255,0.58);
  border-color: rgba(232,235,239,0.82);
  padding: 9px 12px;
  box-shadow: none;
}
.theme-content .theme-card-head {
  border-bottom-color: rgba(232,235,239,0.68);
}

/* ====== 情绪 (mood-view) tab: 20 日滚动 rank 标准化图 + Encoder 相似日 ====== */
.mood-chart-wrap { margin: 8px 0 24px; max-width: 1200px; }
.mood-chart-head { margin-bottom: var(--sp-3); }
.mood-chart-title { font-size: var(--fs-body); font-weight: 600; color: var(--text-1); }
.mood-chart-sub { font-size: var(--fs-meta); color: var(--text-3); margin-top: 2px; }
.mood-chart-svg { width: 100%; height: auto; display: block; }
.mood-chart-grid { stroke: var(--border-soft); stroke-width: 1; stroke-dasharray: 2,3; }
.mood-chart-axis { stroke: var(--border); stroke-width: 1; }
.mood-chart-axis-text { font-size: var(--fs-micro); fill: var(--text-3); font-family: var(--font-mono); }
.mood-chart-threshold { stroke: var(--text-3); stroke-width: 1; stroke-dasharray: 4,3; opacity: 0.55; }
.mood-chart-threshold-text { font-size: var(--fs-micro); fill: var(--text-3); }
.mood-chart-line { fill: none; stroke: #c4615e; stroke-width: 1.8; opacity: 0.95; }
.mood-chart-dot { fill: #c4615e; }
.mood-chart-dot.latest { fill: #d4824a; }
/* 强信号日光环, 套在实际值点位外, 颜色随预测方向内联指定(红涨/绿跌), 不改动原点含义 (2026-07-01) */
.mood-chart-dot-strong { fill: none; stroke-width: 1.6; opacity: 0.8; }
/* 预测中线降为次要参考 — 离散度由误差带承载, 不由中线振幅承载 (2026-06-23) */
.mood-chart-pred-line { fill: none; stroke: var(--text-3); stroke-width: 1; stroke-dasharray: 3,4; opacity: 0.32; }
.mood-chart-pred-dot { fill: var(--text-3); opacity: 0.7; }
.mood-chart-pred { fill: var(--text-3); opacity: 0.7; }
.mood-chart-legend { font-size: var(--fs-meta); color: var(--text-2); display: flex; flex-wrap: wrap; gap: 18px; margin-top: 10px; }
.mood-chart-legend .lg-item { display: inline-flex; align-items: center; gap: 6px; }
.mood-chart-legend .lg-swatch { width: 14px; height: 2px; background: #c4615e; display: inline-block; }
.mood-chart-legend .lg-swatch.threshold { background: var(--text-3); height: 0; border-top: 1px dashed var(--text-3); width: 14px; }
.mood-chart-legend .lg-swatch.pred-hist { background: transparent; height: 0; border-top: 1.5px dashed var(--text-3); width: 14px; opacity: 0.45; }
.mood-chart-legend .lg-swatch.pred { width: 8px; height: 8px; background: var(--text-3); border-radius: 50%; opacity: 0.85; }
.mood-chart-legend .lg-swatch.strong-ring { width: 10px; height: 10px; background: transparent; border-radius: 50%; border: 1.6px solid var(--text-3); opacity: 0.8; }
.mood-info-card {
  margin-top: var(--sp-4); padding: 12px 16px;
  background: rgba(252,253,254,0.65); border: 1px solid var(--border-soft); border-radius: var(--r-sm);
}
.mood-info-meta { font-size: var(--fs-meta); color: var(--text-3); margin-bottom: 10px; padding-bottom: var(--sp-2); border-bottom: 1px dashed var(--border-soft); }
.mood-info-meta strong { color: var(--text-2); font-family: var(--font-mono); font-weight: 600; }
.mood-info-section { margin-top: 10px; }
.mood-info-section:first-of-type { margin-top: 0; }
.mood-info-title { font-size: var(--fs-ui); font-weight: 600; color: var(--text-1); margin-bottom: var(--sp-1); letter-spacing: 0.3px; }
.mood-info-body { font-size: var(--fs-ui); color: var(--text-2); line-height: var(--lh-body); }
.mood-info-body strong { color: var(--text-1); font-family: var(--font-mono); font-weight: 600; }

.mood-chart-stats {
  margin-top: 14px; padding: 10px 14px;
  background: rgba(252,253,254,0.6); border: 1px solid var(--border-soft); border-radius: var(--r-sm);
  font-size: var(--fs-ui); color: var(--text-2); display: flex; gap: var(--sp-5); flex-wrap: wrap;
}
.mood-chart-stats .mc-block { display: flex; flex-direction: column; gap: 2px; }
.mood-chart-stats .mc-k { font-size: var(--fs-meta); color: var(--text-3); }
.mood-chart-stats .mc-v { font-family: var(--font-mono); color: var(--text-1); font-size: var(--fs-ui); font-weight: 600; }
.mood-encoder-wrap { margin-top: 18px; padding-top: 18px; border-top: 1px solid var(--border-soft); max-width: 1200px; }

/* ====== 大盘 (topview) tab: 美股复盘 + ^TNX + A 股 ERP (2026-05-18) ====== */
/* 2026-05-18 二轮: max-width 1200 → 1600px, 用户屏幕宽, 表格也跟着展开 */
.topview-section { margin: 0 0 32px; max-width: 1600px; }
.topview-section:first-child { margin-top: var(--sp-2); }
.topview-section .topview-h3 {
  font-size: var(--fs-body); font-weight: 600; color: var(--text-1);
  margin: 0 0 10px; padding-bottom: 6px;
  border-bottom: 1px solid var(--border-soft);
  display: flex; align-items: baseline; gap: var(--sp-3);
}
.topview-section .topview-date,
.topview-section .topview-meta {
  font-size: var(--fs-meta); font-weight: 400; color: var(--text-3);
  font-family: var(--font-mono);
}
.topview-md-wrap { max-width: 1600px; }
/* topview 内 reading-md 对齐"实时持仓/今日选股"风格: 无边框/无衬底/开放表格 */
.topview-md-wrap .reading-md {
  background: transparent; border: 0; border-radius: 0;
  padding: 0; max-width: 100%; margin: 0;
}
/* renderMarkdown 包表格成 .md-table-wrap > .md-table; 重写它对齐主表风格 */
.topview-md-wrap .md-table-wrap {
  overflow-x: visible; border: 0; border-radius: 0; margin: 14px 0;
}
.topview-md-wrap .md-table {
  border-collapse: collapse; width: 100%;
  font-size: var(--fs-ui); font-family: inherit; table-layout: auto;
}
.topview-md-wrap .md-table th {
  background: transparent !important; padding: 9px 10px; text-align: left;
  font-weight: 500; color: var(--text-3); font-size: var(--fs-meta); letter-spacing: 0.3px;
  border-bottom: 1px solid var(--border); white-space: nowrap;
}
.topview-md-wrap .md-table td {
  padding: 8px 10px; border-bottom: 1px solid var(--border-soft);
  white-space: normal; vertical-align: top; word-break: break-word;
  font-family: inherit; color: var(--text-1);
}
.topview-md-wrap .md-table tbody tr:nth-child(2n) td { background: transparent; }
.topview-md-wrap .md-table tbody tr:hover td { background: transparent; }
.topview-md-wrap .md-table tr:last-child td { border-bottom: 0; }
.topview-md-wrap .reading-md blockquote {
  background: transparent; border-radius: 0; padding: 4px 14px;
  border-left: 3px solid var(--border); color: var(--text-2); font-style: normal;
}
/* topview 美股复盘 — 文字部分对齐图谱信息 (stock 页 sc-block) 视觉规则:
   2026-05-18 加: h1 隐藏 (date 已在 topview-h3 头部), h2 = source-tag (橙下划线),
   h3 = sc-title (13px dark bold), 段首 **xxx** = accent, 字号 14, 列表 22px disc, blockquote 软化 */
.topview-md-wrap .reading-md { font-size: var(--fs-body); line-height: var(--lh-loose);
                                color: var(--text-1); letter-spacing: 0; }
.topview-md-wrap .reading-md h1 { display: none; }
.topview-md-wrap .reading-md h2 {
  font-size: var(--fs-ui); font-weight: 600; color: var(--accent);
  margin: 22px 0 8px; padding: 0 0 4px; line-height: var(--lh-snug);
  border-left: 0; border-bottom: 1px solid var(--border-soft);
  letter-spacing: 0.2px;
}
.topview-md-wrap .reading-md h2:first-child { margin-top: var(--sp-1); }
.topview-md-wrap .reading-md h3 {
  font-size: var(--fs-ui); font-weight: 600; color: var(--text-1);
  margin: 14px 0 4px;
}
.topview-md-wrap .reading-md p { margin: 4px 0 8px; line-height: var(--lh-loose); font-size: var(--fs-body); }
.topview-md-wrap .reading-md ul,
.topview-md-wrap .reading-md ol { padding-left: 22px; margin: 4px 0 10px; }
.topview-md-wrap .reading-md li { margin: 3px 0; line-height: var(--lh-body); font-size: var(--fs-body); }
.topview-md-wrap .reading-md ol > li::marker { color: var(--accent); font-weight: 600; }
.topview-md-wrap .reading-md strong { color: var(--text-1); font-weight: 600; }
.topview-md-wrap .reading-md li > strong:first-child,
.topview-md-wrap .reading-md p > strong:first-child { color: var(--accent); font-weight: 600; }
.topview-md-wrap .reading-md em { font-style: normal; color: var(--text-2); }
/* 2026-05-18 三轮: 「*   **label**：value」这种 bullet+bold-label 列表 (e.g. 驱动事件/受益板块/A股映射
   /A股板块建议/A股风险提示等), label 不需要橙色加粗、ul 也不需要圆点 — 跟正文一致即可.
   用 :has() 精准匹配 "li 首子是 strong" 的 ul, 不影响其他无 label 的普通列表. */
.topview-md-wrap .reading-md ul:has(> li > strong:first-child) {
  list-style: none;
  padding-left: 0;
  margin: 4px 0 10px;
}
.topview-md-wrap .reading-md ul:has(> li > strong:first-child) > li {
  padding-left: 0;
  margin: 4px 0;
}
.topview-md-wrap .reading-md ul:has(> li > strong:first-child) > li > strong:first-child {
  font-weight: normal;
  color: var(--text-1);
}
.topview-empty {
  padding: 20px; text-align: center; color: var(--text-3);
  font-size: var(--fs-ui); border: 1px dashed var(--border-soft); border-radius: var(--r-sm);
}
/* topview chart grid — 比橙色主线更细更稀, 视觉退到底层 (2026-05-19 收细: 1px→0.5, 虚线 3,4→2,5) */
.topview-chart-svg .mood-chart-grid {
  stroke: rgba(0, 0, 0, 0.18);
  stroke-width: 0.5;
  stroke-dasharray: 2, 5;
  opacity: 1;
}
/* 2026-05-18 二轮: topview 内的 mood-chart-wrap 跟 topview-section 同宽 1600 (/mood 页不动) */
.topview-section .mood-chart-wrap { max-width: 1600px; }

/* ====== RWA tab (rwa-view) (2026-06-13) ====== */
.rwa-dashboard-container {
  display: flex;
  gap: var(--sp-4);
  align-items: flex-start;
  margin-top: var(--sp-2);
  margin-bottom: var(--sp-6);
  width: 100%;
  max-width: none;
}
@media (max-width: 900px) {
  .rwa-dashboard-container { flex-direction: column; align-items: stretch; }
}

.rwa-sidebar-list {
  width: 280px;
  min-width: 260px;
  background: var(--bg-1);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  max-height: 700px;
  overflow-y: auto;
  padding: var(--sp-3);
  display: flex;
  flex-direction: column;
  gap: 6px;
  -ms-overflow-style: none;  /* IE and Edge */
  scrollbar-width: none;  /* Firefox */
}
.rwa-sidebar-list::-webkit-scrollbar {
  display: none;             /* Chrome, Safari and Opera */
}
@media (max-width: 900px) {
  .rwa-sidebar-list { width: auto; max-height: 220px; flex-direction: row; overflow-x: auto; overflow-y: hidden; }
}

.rwa-sidebar-item {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 10px 12px;
  border-radius: var(--r-md);
  cursor: pointer;
  transition: all 0.15s ease-in-out;
  border: 1px solid transparent;
  background: transparent;
}
@media (max-width: 900px) {
  .rwa-sidebar-item { min-width: 150px; flex-shrink: 0; }
}
.rwa-sidebar-item:hover {
  background: var(--row-hover);
  border-color: var(--border-soft);
}
.rwa-sidebar-item.active {
  background: rgba(212, 130, 74, 0.04);
  border-color: var(--accent);
  box-shadow: 0 0 0 1px var(--accent);
}

.rwa-sidebar-info {
  display: flex;
  flex-direction: column;
}
.rwa-sidebar-symbol-wrap {
  display: flex;
  align-items: center;
  gap: 6px;
}
.rwa-sidebar-symbol {
  font-family: var(--font-mono);
  font-size: var(--fs-ui);
  font-weight: 700;
  color: var(--text-0);
}
.rwa-sidebar-badge {
  font-size: var(--fs-micro);
  font-weight: 700;
  padding: 0px 3px;
  border-radius: 2px;
}
.rwa-sidebar-badge.badge-crypto { background: rgba(110, 168, 254, 0.12); color: #588ed8; }
.rwa-sidebar-badge.badge-rwa { background: rgba(212, 130, 74, 0.12); color: var(--accent); }
.rwa-sidebar-badge.badge-fx { background: rgba(120, 180, 120, 0.14); color: #4f9d5d; }
.rwa-sidebar-name {
  font-size: var(--fs-meta);
  color: var(--text-3);
  margin-top: 2px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 130px;
}

.rwa-sidebar-price-wrap {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
}
.rwa-sidebar-price {
  font-family: var(--font-mono);
  font-size: var(--fs-ui);
  font-weight: 700;
  color: var(--text-1);
}
.rwa-sidebar-change {
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  font-weight: 600;
  margin-top: 1px;
}

.rwa-main-detail {
  flex: 1;
  display: flex;
  flex-direction: column;
  gap: var(--sp-4);
  min-width: 0;
}

.rwa-chart-panel {
  background: var(--bg-1);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  padding: var(--sp-4);
}

.rwa-panel-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: var(--sp-4);
  flex-wrap: wrap;
  gap: var(--sp-3);
}
.rwa-instrument-title {
  display: flex;
  align-items: baseline;
  gap: var(--sp-3);
}
.rwa-inst-name {
  font-family: var(--font-heading);
  font-size: var(--fs-display);
  font-weight: 700;
  color: var(--text-0);
}
.rwa-inst-price {
  font-family: var(--font-mono);
  font-size: var(--fs-title);
  font-weight: 700;
  color: var(--text-1);
}
.rwa-inst-change {
  font-family: var(--font-mono);
  font-size: var(--fs-ui);
  font-weight: 600;
}

.rwa-controls {
  display: flex;
  gap: var(--sp-3);
}
.rwa-control-btn {
  background: var(--bg-1);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  padding: 4px 8px;
  font-size: var(--fs-meta);
  font-family: inherit;
  color: var(--text-2);
  cursor: pointer;
  transition: all 0.1s;
}
.rwa-control-btn:hover {
  border-color: var(--border-strong);
  color: var(--text-1);
}
.rwa-control-btn.active {
  background: var(--accent);
  border-color: var(--accent);
  color: #fff;
}

.rwa-chart-container {
  height: 380px;
  position: relative;
  border-radius: var(--r-sm);
  margin-bottom: var(--sp-2);
}

/* K 线图状态条: 当前粒度 + 最新 K 线时间 + 刷新时刻 (2026-06-17) */
.rwa-chart-status {
  font-size: var(--fs-meta);
  color: var(--text-3);
  font-family: var(--font-mono);
  margin: 2px 0 var(--sp-2);
  min-height: 1.2em;
}
.rwa-chart-status .rwa-status-gran {
  display: inline-block;
  background: var(--accent);
  color: #fff;
  font-weight: 700;
  border-radius: var(--r-sm);
  padding: 0 6px;
  margin-right: 4px;
}
.rwa-chart-status b { color: var(--text-1); font-weight: 700; }

.rwa-bottom-split {
  display: flex;
  gap: var(--sp-4);
  align-items: flex-start;
}
@media (max-width: 1200px) {
  .rwa-bottom-split { flex-direction: column; align-items: stretch; }
}

.rwa-bottom-ob-panel {
  flex: 0.7;
  background: var(--bg-1);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  padding: var(--sp-4);
  min-width: 300px;
}

.rwa-bottom-news-panel {
  flex: 2.5;
  background: var(--bg-1);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  padding: var(--sp-4);
  min-width: 450px;
}
@media (max-width: 640px) {
  .rwa-bottom-news-panel { min-width: 0; }
}

.rwa-metrics-news-grid {
  display: grid;
  grid-template-columns: 200px 1fr;
  gap: var(--sp-4);
}
@media (max-width: 768px) {
  .rwa-metrics-news-grid { grid-template-columns: 1fr; }
}

.rwa-section-title {
  font-size: var(--fs-ui);
  font-weight: 600;
  color: var(--accent);
  margin-bottom: var(--sp-3);
  padding-bottom: 4px;
  border-bottom: 1px solid var(--border-soft);
}

.rwa-orderbook {
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
}
.rwa-ob-row {
  display: flex;
  justify-content: space-between;
  padding: 4px var(--sp-1);
  position: relative;
  line-height: var(--lh-tight);
}
.rwa-ob-bar {
  position: absolute;
  top: 0;
  bottom: 0;
  right: 0;
  z-index: 1;
  opacity: 0.08;
  pointer-events: none;
}
.rwa-ob-row.ask .rwa-ob-bar { background-color: var(--up); }
.rwa-ob-row.bid .rwa-ob-bar { background-color: var(--dn); }
.rwa-ob-px { z-index: 2; }
.rwa-ob-row.ask .rwa-ob-px { color: var(--up); }
.rwa-ob-row.bid .rwa-ob-px { color: var(--dn); }
.rwa-ob-sz { z-index: 2; color: var(--text-2); }
.rwa-ob-spread {
  text-align: center;
  font-size: var(--fs-micro);
  color: var(--text-3);
  padding: 6px 0;
  border-top: 1px solid var(--border-soft);
  border-bottom: 1px solid var(--border-soft);
  margin: 4px 0;
  background: var(--bg-2);
  border-radius: 2px;
}

.rwa-stats-grid {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.rwa-stat-row {
  display: flex;
  justify-content: space-between;
  font-size: var(--fs-meta);
  padding-bottom: var(--sp-1);
  border-bottom: 1px dashed var(--border-soft);
}
.rwa-stat-lbl { color: var(--text-2); }
.rwa-stat-val {
  font-family: var(--font-mono);
  color: var(--text-1);
  font-weight: 600;
}

/* 实时资讯样式 */
.rwa-news-feed {
  display: flex;
  flex-direction: column;
  gap: 8px;
  max-height: 280px;
  overflow-y: auto;
  -ms-overflow-style: none;  /* IE and Edge */
  scrollbar-width: none;  /* Firefox */
}
.rwa-news-feed::-webkit-scrollbar {
  display: none;             /* Chrome, Safari and Opera */
}
.rwa-news-item {
  display: flex;
  flex-direction: column;
  gap: 3px;
  padding: 6px 0;
  border-bottom: 1px solid var(--border-soft);
}
.rwa-news-item:last-child {
  border-bottom: 0;
}
.rwa-news-title {
  font-size: var(--fs-ui);
  font-weight: 600;
  color: var(--text-1);
  text-decoration: none;
  display: block;
  line-height: var(--lh-tight);
}
.rwa-news-title:hover {
  color: var(--accent);
  text-decoration: underline;
}
.rwa-news-meta {
  font-size: var(--fs-micro);
  color: var(--text-3);
}

/* ====== 机器学习 (ml-view): XGB / GRU 原理 + pipeline 场景, 全静态教学 (2026-05-19) ======
   延续 topview 美股复盘 / 个股页图谱信息的视觉规则: source-tag 橙下划线分组 + sc-title 子标题 + 14px 正文.
   防蒸馏: 不暴露具体特征/超参/IC数字/模型清单, 全部用比喻 SVG. */
.ml-view-wrap { max-width: 1200px; margin: 0 auto; padding: 8px 0 40px; }
.ml-content { font-size: var(--fs-body); line-height: var(--lh-loose); color: var(--text-1); }
.ml-section { margin: 0 0 32px; }
.ml-section:first-child { margin-top: var(--sp-1); }
.ml-section-h2 {
  font-size: var(--fs-ui); font-weight: 600; color: var(--accent);
  margin: 22px 0 10px; padding: 0 0 4px; line-height: var(--lh-snug);
  border-bottom: 1px solid var(--border-soft); letter-spacing: 0.2px;
}
.ml-section-h2:first-child, .ml-section:first-child .ml-section-h2 { margin-top: var(--sp-1); }
.ml-card { margin: 14px 0 22px; }
.ml-card-title { font-size: var(--fs-ui); font-weight: 600; color: var(--text-1); margin: 0 0 6px; }
.ml-card-hint { font-size: var(--fs-ui); color: var(--text-3); line-height: var(--lh-body); margin: 0 0 10px; }
.ml-card-body { font-size: var(--fs-body); line-height: var(--lh-loose); color: var(--text-1); margin: 0 0 6px; }
.ml-card-body p { margin: 6px 0; }
.ml-card-body strong { color: var(--text-1); font-weight: 600; }
.ml-card-body .accent { color: var(--accent); font-weight: 600; }
.ml-svg { width: 100%; max-width: 880px; height: auto; display: block; margin: 8px 0 4px; }
.ml-svg text { font-family: var(--font-sans); }
/* SVG 内通用色 (复用 root) */
.ml-svg .ml-stroke { stroke: var(--text-2); }
.ml-svg .ml-fill-soft { fill: rgba(212,130,74,0.10); }
.ml-svg .ml-fill-soft-2 { fill: rgba(212,130,74,0.20); }
.ml-svg .ml-fill-cool { fill: rgba(100,140,200,0.10); }
.ml-svg .ml-accent { fill: var(--accent); }
.ml-svg .ml-text-1 { fill: var(--text-1); }
.ml-svg .ml-text-2 { fill: var(--text-2); }
.ml-svg .ml-text-3 { fill: var(--text-3); }
.ml-svg .ml-line { stroke: var(--text-2); fill: none; stroke-width: 1.2; }
.ml-svg .ml-line-accent { stroke: var(--accent); fill: none; stroke-width: 1.8; }
.ml-svg .ml-line-dash { stroke: var(--text-3); fill: none; stroke-width: 1; stroke-dasharray: 3, 3; }
.ml-svg .ml-box { fill: var(--bg-2); stroke: var(--border-soft); stroke-width: 1; }
.ml-svg .ml-box-accent { fill: rgba(212,130,74,0.08); stroke: var(--accent); stroke-width: 1; }
.ml-grid-2col { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; margin: 8px 0; }
.ml-grid-2col > .ml-card { margin: 0; }
@media (max-width: 900px) {
  .ml-grid-2col { grid-template-columns: 1fr; }
}

/* ====== 公司卡 tab (card-view): 居中搜索框 + 结果列表 ====== */
.card-search-wrap { max-width: 720px; margin: 24px auto 12px; padding: 0 8px; }

/* 2026-05-24: 搜索框 + 检索源/参数 横向并列 (concept tab); 建议条目直接挂在搜索框正下方 */
.card-search-row {
  max-width: 1280px; margin: 24px auto 12px; padding: 0 16px;
  display: flex; flex-wrap: wrap; gap: var(--sp-5); align-items: flex-start;
}
.card-search-row .card-search-wrap {
  flex: 1 1 360px; min-width: 280px; max-width: 520px;
  margin: 0; padding: 0;
}
.card-search-row .card-search-controls {
  flex: 1 1 520px; display: flex; flex-direction: column; gap: 6px;
  padding-top: 2px;
}
.card-search-row .search-mode-bar,
.card-search-row .search-params-bar {
  max-width: none; margin: 0; padding: 0;
}
/* 建议条目直接挂在搜索框下方 (不再居中, 跟左列宽度对齐) */
.card-search-row #concept-search-results {
  max-width: none; margin: 6px 0 0; padding: 0;
}
.card-search-input {
  width: 100%; padding: 12px 16px; font-size: var(--fs-title); font-family: inherit;
  border: 1px solid var(--border); border-radius: var(--r-lg); background: var(--bg-1);
  color: var(--text-1); outline: none; transition: border-color 0.15s;
}
.card-search-input:focus { border-color: var(--border); }
.card-search-stat { margin-top: 6px; font-size: var(--fs-meta); color: var(--text-3); text-align: right; }
.card-search-results { max-width: 720px; margin: 0 auto; padding: 0 8px 24px; }
.card-search-item {
  display: flex; align-items: center; gap: 14px; padding: 10px 14px;
  border-bottom: 1px solid var(--border-soft); cursor: pointer;
  transition: background 0.1s;
}
.card-search-item:hover { background: var(--row-hover); }
.card-search-item .csi-code {
  font-family: var(--font-mono); color: var(--text-3);
  font-size: var(--fs-ui); min-width: 90px;
}
.card-search-item .csi-name { color: var(--text-1); font-size: var(--fs-ui); flex: 1; }
.card-search-item .csi-py { color: var(--text-3); font-size: var(--fs-meta); font-family: var(--font-mono); }
.card-search-empty { padding: 40px 20px; text-align: center; color: var(--text-3); font-size: var(--fs-ui); }

/* ====== 热点 (concept) tab — 主题/概念查询 → rocket 风格表 ====== */
.card-search-item .csi-tag {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 22px; padding: 2px 6px; font-size: var(--fs-meta); font-weight: 600;
  border-radius: var(--r-sm); letter-spacing: 0.5px;
}
.card-search-item .csi-tag.tag-theme { background: rgba(239,184,138,0.18); color: var(--accent-orange); }
.card-search-item .csi-tag.tag-concept { background: rgba(110,168,254,0.18); color: #6ea8fe; }
.card-search-item .csi-tag.tag-both { background: rgba(168,140,210,0.22); color: #b08bd6; min-width: 32px; }
.card-search-item .csi-tag.tag-fulltext { background: rgba(140,168,210,0.22); color: #8ca8d2; min-width: 60px; font-size: var(--fs-micro); }
.card-search-item .csi-count {
  color: var(--text-3); font-size: var(--fs-meta);
  font-family: var(--font-mono); min-width: 50px; text-align: right;
}
.concept-meta-card {
  max-width: 1100px; margin: 8px auto 12px; padding: 10px 16px;
  background: var(--bg-1); border: 1px solid var(--border); border-radius: var(--r-lg);
  display: flex; flex-wrap: wrap; align-items: center; gap: 14px;
  font-size: var(--fs-ui); color: var(--text-2);
}
.concept-meta-card .cmc-title { font-size: var(--fs-body); font-weight: 600; color: var(--text-1); }
.concept-meta-card .cmc-kv { display: inline-flex; gap: var(--sp-1); }
.concept-meta-card .cmc-kv .k { color: var(--text-3); }
.concept-meta-card .cmc-kv .v { color: var(--text-1); font-family: var(--font-mono); }
/* 2026-05-28: 搜索域 code 字段 chip 样式 (与 v 文字风格协调, 但带轻底色突出字段名) */
.concept-meta-card .cmc-kv .v code {
  font-family: inherit; padding: 1px 5px; border-radius: 3px;
  background: var(--bg-2); color: var(--text-1); font-size: var(--fs-meta);
}
#concept-stock-table { padding: 0 8px; }

/* 2026-05-24: 公司名前面的来源标签 (BM25 / Dense / RRF 双命中) */
.src-badge {
  display: inline-block; font-size: var(--fs-micro); font-weight: 700;
  padding: 1px 5px; margin-right: 6px; border-radius: 3px;
  vertical-align: middle; letter-spacing: 0.3px;
}
.src-badge.src-bm25  { background: rgba(110,168,254,0.18); color: #6ea8fe; }
.src-badge.src-dense { background: rgba(168,140,210,0.22); color: #b08bd6; }
.src-badge.src-rrf   { background: linear-gradient(90deg, rgba(110,168,254,0.22), rgba(168,140,210,0.28)); color: #c89a52; border: 1px solid rgba(200,154,82,0.4); }

/* 2026-05-24 v2: 主题卡事实导向排序 — 名称列旁的 fact-chip (🎯主业/🏷️概念/👑龙头/🆕新催化) */
.fact-chips { display: inline-flex; gap: 3px; margin-left: 6px; vertical-align: middle; flex-wrap: wrap; }
.fact-chip {
  display: inline-block; font-size: var(--fs-micro); font-weight: 600;
  padding: 1px 5px; border-radius: 3px; letter-spacing: 0.2px; line-height: var(--lh-tight);
}
.fact-chip.fact-main      { background: rgba(239,184,138,0.28); color: #d8895c; }    /* 主业, 橙红 */
.fact-chip.fact-concept   { background: rgba(110,168,254,0.18); color: #6ea8fe; }    /* 概念归属, 蓝 */
.fact-chip.fact-leader    { background: rgba(220,180,90,0.28);  color: #c89a52; border: 1px solid rgba(200,154,82,0.35); }  /* 龙头, 金 */
.fact-chip.fact-large     { background: rgba(168,140,210,0.20); color: #b08bd6; }    /* 大盘, 紫 */
.fact-chip.fact-fresh     { background: rgba(120,200,140,0.22); color: #6dbb83; }    /* ≤7 日新催化, 绿 */
.fact-chip.fact-fresh-mid { background: rgba(120,200,140,0.10); color: #8aaa90; }    /* ≤30 日催化, 浅绿 */

/* 2026-05-24 P5.9 v3: 主题卡 2 (涌现方向) — 双栏布局 (参考 /strike) */
/* 修 #1 行被 sticky thead 遮挡: emergent 上面有 sub-tabs + summary,
   thead sticky top:38px 跟第一行重合时盖住. 取消 emergent 表格 thead sticky. */
/* 2026-05-25 fix: thead 必须 static (默认 strike-table 给的 sticky top:38px + z-index:5 会叠到 #1 row 上覆盖内容,
   用户看到的"列表缺 #1"就是 thead sticky 把第一行盖住的视觉假象). 用 !important 强制 override, 因为
   strike-table 规则定义在本规则之后, 同 specificity 后者胜出 */
table.emergent-left-table thead th,
table.emergent-right-table thead th {
  position: static !important;
  top: auto !important;
  z-index: auto !important;
}
/* 左栏: 主题列表 — 极简 CSS (2026-05-24 v7), 避免任何潜在 bug 让 #1 row 隐藏 */
/* 2026-07-05: 定宽 = colgroup 总和(26+128+72+36+56+104=422px) + table-layout:fixed, 列宽才真正按 colgroup
   生效(紧凑), 不再被拉伸出大片空白列。!important 同上面 thead 的理由: table.strike-table 的 width:100%
   规则定义在本规则之后, 同 specificity 后者胜出, 必须强制 override */
table.emergent-left-table { width: 422px !important; table-layout: fixed; }
/* 类型 chip 定宽列里可能比列窄更长(如"半导体设备"5字) — 截断省略号, 不再视觉溢出到 hit 列 */
table.emergent-left-table .em-chip-known,
table.emergent-left-table .em-chip-new {
  max-width: 48px; overflow: hidden; text-overflow: ellipsis; vertical-align: bottom;
}
table.emergent-left-table tbody tr.em-theme-row { cursor: pointer; }
table.emergent-left-table tbody tr.em-theme-row:hover { background: var(--row-hover); }
table.emergent-left-table tbody tr.em-theme-row.selected td {
  background: rgba(212,130,74,0.11);
  color: var(--text-1);
  font-weight: 600;
  border-left: 3px solid transparent;
}
table.emergent-left-table tbody tr.em-theme-row.selected td:first-child {
  border-left-color: var(--accent-orange);
}
table.emergent-left-table tbody td { font-size: var(--fs-ui); }
table.emergent-left-table .em-name {
  font-size: var(--fs-ui); font-weight: 600; color: var(--text-0); letter-spacing: 0.2px;
}

/* 右栏: 主题详情 + 成员股表 (橙色统一标识系统, 2026-05-24) */
.em-detail-head {
  margin-bottom: 10px;
  padding: 8px 0;
}
.em-detail-title {
  display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap;
  margin-bottom: 6px;
}
.em-detail-rank {
  font-size: var(--fs-meta); font-weight: 700; color: var(--text-3);
  background: rgba(120,120,130,0.15); padding: 2px 6px; border-radius: 3px;
}
.em-detail-name {
  font-size: var(--fs-display); font-weight: 600; color: var(--text-0); letter-spacing: 0.5px;
}
.em-detail-interp {
  font-size: var(--fs-ui); line-height: var(--lh-body); color: var(--text-1);
  margin-bottom: 6px;
}
.em-detail-kws {
  display: flex; flex-wrap: wrap; gap: var(--sp-1); align-items: center;
  font-size: var(--fs-meta); color: var(--text-3);
}
.em-detail-subs {
  display: flex; flex-direction: column; gap: var(--sp-1);
  font-size: var(--fs-meta); color: var(--text-3); margin-top: var(--sp-1);
}
.em-sub-event {
  padding: 2px 0;
  line-height: var(--lh-snug);
}

/* 2026-05-25 v3: 主题详情块挪到左栏 (主题列表下方), 加显眼标题 + 顶部 dashed border 与表格清晰分隔 */
/* 旧版只 margin-top:16px, 加上橙色背景跟 selected 行融合, 用户误以为 #1 列表缺失 */
.em-theme-detail-block {
  margin-top: 28px;
  padding-top: 6px;
  position: relative;
}
.em-theme-detail-block::before {
  content: '▼ 当前选中主题详情';
  display: block;
  margin-bottom: var(--sp-2);
  font-size: var(--fs-meta);
  font-weight: 600;
  color: var(--text-2);
  letter-spacing: 0.3px;
  padding-bottom: 6px;
  border-bottom: 1px dashed var(--border);
}
.em-theme-detail-block .em-detail-title { gap: 6px; }
.em-theme-detail-block .em-detail-name { font-size: var(--fs-title); }
.em-theme-detail-block .em-detail-interp { font-size: var(--fs-ui); line-height: var(--lh-body); }

/* emergent 底部方法描述 — 灰色小字, 双 mode 都列, inactive 更淡 */
#emergent-method-desc { padding: 14px 0 8px; }
.em-method-line {
  font-size: var(--fs-meta); color: var(--text-3); line-height: var(--lh-body);
  padding: 2px 0;
}
.em-method-line.em-method-mute { color: var(--text-3); opacity: 0.55; }
.em-method-line b { color: var(--text-2); font-weight: 600; }

/* (旧自定义 #emergent-sub-tabs 删除, 现共享 #strike-sub-tabs 样式) */

/* 主题事件日提示行 (event_hit mode 右栏顶部) — 区分主题事件日 vs 股票自身 catalyst 日 */
.em-event-date {
  font-size: var(--fs-meta); color: var(--text-2);
  margin-top: 6px; padding: 4px 8px;
  background: rgba(255,200,100,0.06);
  border-left: 2px solid rgba(255,200,100,0.4);
  border-radius: 3px; line-height: var(--lh-snug);
}
.em-event-date b { color: var(--text-1); font-weight: 600; }

/* 公司近催化日视觉降级 (2026-05-24): 距今 >30/>90/>180 天颜色阶梯式淡化 */
.em-cd-fresh {}                                /* ≤30 天: 正常 */
.em-cd-mid    { opacity: 0.75; }               /* 30-90 天: 略淡 */
.em-cd-old    { opacity: 0.55; font-style: italic; }   /* 90-180 天: 老旧, 斜体 */
.em-cd-stale  { opacity: 0.40; font-style: italic; }   /* >180 天: 陈旧, 极淡 */

table.emergent-right-table { width: 100%; }
table.emergent-right-table tbody tr.em-member-row { cursor: pointer; }
table.emergent-right-table tbody tr.em-member-row:hover { background: var(--row-hover); }
table.emergent-right-table .em-interp-cell {
  font-size: var(--fs-ui); line-height: var(--lh-snug); color: var(--text-1);
  max-width: 320px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
table.emergent-right-table .em-summary-cell {
  font-size: var(--fs-ui); line-height: var(--lh-snug); color: var(--text-1);
  max-width: 380px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
table.emergent-right-table .em-summary-cell:hover {
  white-space: normal;  /* hover 展开 multi-line */
}
.em-stat {
  font-size: var(--fs-meta); color: var(--accent-orange);
  background: rgba(239,184,138,0.10); padding: 1px 6px; border-radius: 3px;
}

/* 关键词 chip (catalyst_type / c-TF-IDF kw) 统一橙色 */
.em-kw {
  font-size: var(--fs-micro); color: var(--accent-orange);
  background: rgba(239,184,138,0.10); padding: 1px 5px; border-radius: 3px; white-space: nowrap;
}

/* chip 样式 (2026-05-24 v4: 统一橙色标识系统, 全 emergent 视觉一致) */
.em-chip {
  display: inline-block; font-size: var(--fs-micro); font-weight: 600;
  padding: 1px 6px; border-radius: 3px; letter-spacing: 0.2px; white-space: nowrap;
}
.em-chip-known   { background: rgba(239,184,138,0.18); color: var(--accent-orange); }
.em-chip-new     { background: rgba(220,180,90,0.28); color: #c89a52; border: 1px solid rgba(200,154,82,0.45); }
.em-chip-strong  { background: rgba(239,184,138,0.32); color: var(--accent-orange); }
.em-chip-mid     { background: rgba(239,184,138,0.22); color: var(--accent-orange); }
.em-chip-weak    { background: rgba(239,184,138,0.12); color: var(--accent-orange); opacity: 0.85; }

/* 行内代表股 */
.em-stock-inline {
  display: inline-block; cursor: pointer;
  margin-right: 6px; padding: 1px 4px; border-radius: 3px;
  color: var(--text-1); font-weight: 500;
}
.em-stock-inline:hover { background: rgba(110,168,254,0.10); color: var(--accent); }
.em-mv { font-size: var(--fs-micro); color: var(--text-3); margin-left: 2px; }
.em-more-inline {
  display: inline-block; cursor: pointer;
  font-size: var(--fs-meta); color: #6ea8fe; padding: 1px 4px;
}
.em-more-inline:hover { color: #8ec0ff; text-decoration: underline; }

/* 展开子表 (点击主行展开完整成员股) */
table.emergent-table tr.em-expand td { padding: 0; background: rgba(110,168,254,0.04); }
.em-expand-wrap { padding: 8px 12px 12px 36px; }
.em-expand-head {
  font-size: var(--fs-meta); color: var(--text-3); margin-bottom: 6px; letter-spacing: 0.3px;
}
table.em-member-table {
  width: 100%; font-size: var(--fs-ui); background: transparent; border: 0;
  border-collapse: collapse; line-height: var(--lh-snug);
}
table.em-member-table thead th {
  font-size: var(--fs-micro); color: var(--text-3); font-weight: 500;
  padding: 4px 8px; border-bottom: 1px solid var(--border-soft);
  text-align: left;
}
table.em-member-table tbody td {
  padding: 4px 8px; border-bottom: 1px dashed rgba(120,120,130,0.10);
}
table.em-member-table tbody tr:last-child td { border-bottom: 0; }
table.em-member-table tbody tr:hover { background: rgba(110,168,254,0.06); }

/* 2026-05-24: 检索源多选切换 (BM25 / Dense 各自可点, 两个都点 = RRF 并集). 统一橙色 */
.search-mode-bar {
  max-width: 720px; margin: 4px auto 14px; padding: 0 8px;
  display: flex; flex-wrap: wrap; gap: var(--sp-2); align-items: center;
}
.search-mode-label {
  font-size: var(--fs-meta); color: var(--text-3); margin-right: 2px; letter-spacing: 0.3px;
}
.search-mode-hint {
  font-size: var(--fs-meta); color: var(--text-3); margin-left: var(--sp-1); font-style: italic;
}
.search-mode-btn {
  display: inline-flex; align-items: center; gap: var(--sp-1);
  padding: 4px 10px; font-size: var(--fs-meta); font-weight: 500;
  background: var(--bg-2, rgba(255,255,255,0.04));
  color: var(--text-2); border: 1px solid var(--border, rgba(255,255,255,0.08));
  border-radius: 14px; cursor: pointer; user-select: none;
  transition: background 0.15s, border-color 0.15s, color 0.15s;
}
.search-mode-btn:hover {
  background: rgba(239,184,138,0.08); border-color: rgba(239,184,138,0.3); color: var(--text-1);
}
.search-mode-btn.active {
  background: rgba(239,184,138,0.18); border-color: var(--accent-orange, #efb88a);
  color: var(--accent-orange, #efb88a); font-weight: 600;
}
.search-mode-btn .mode-icon { font-size: var(--fs-meta); }

/* 2026-05-24: 检索参数 (topK / min_score / model / RRF k) */
.search-params-bar {
  max-width: 720px; margin: -6px auto 14px; padding: 0 8px;
  display: flex; flex-wrap: wrap; gap: 10px; align-items: center;
}
.search-params-bar .param-item {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: var(--fs-meta); color: var(--text-3); letter-spacing: 0.2px;
}
.search-params-bar .param-item input[type="number"],
.search-params-bar .param-item input[type="text"] {
  width: 72px; padding: 3px 6px; font-size: var(--fs-meta);
  font-family: var(--font-mono); color: var(--text-1);
  background: var(--bg-2, rgba(255,255,255,0.04));
  border: 1px solid var(--border, rgba(255,255,255,0.08));
  border-radius: var(--r-sm); outline: none;
  transition: border-color 0.15s;
}
.search-params-bar .param-item input[type="text"] { width: 168px; }
.search-params-bar .param-item input:focus { border-color: var(--accent-orange, #efb88a); }
.search-params-bar .param-item input[readonly] {
  color: var(--text-3); cursor: not-allowed; background: rgba(255,255,255,0.02);
}

/* ====== 主题 tab — 完全对齐生产 strike-table 风格 ====== */
/* 主题表/个股表全部继承 .strike-table 默认: header 11px-text-2-600 / body 13px / hover row-hover. */
/* 唯一自定义: 选中行橙色矩形 (用户要求) + 数字列右对齐 monospace + 个股表催化 cell 双行 */
.theme-list-tbl tr.theme-list-row { cursor: pointer; }
.theme-list-tbl tr.theme-list-row.selected {
  background: rgba(239,184,138,0.13);
  box-shadow: inset 3px 0 0 0 var(--accent-orange);
}
.theme-list-tbl tr.theme-list-row.selected:hover { background: rgba(239,184,138,0.22); }
.theme-list-tbl .theme-num-cell  { text-align: right; font-family: var(--font-mono); }
.theme-stk-pane { margin-top: var(--sp-2); }
.theme-stk-pane .st-catalyst-cell { white-space: normal; max-width: 280px; line-height: var(--lh-snug); }
.theme-stk-pane .st-catalyst-prev { color: var(--text-3); display: block; margin-top: 2px; }
/* 2026-05-18: theme tab Neo4j 摘要列加宽 (用户删 6 列后, 让摘要吃剩余空间) */
/* 2026-05-22 用户要求: 单行截断 + ellipsis, hover 看全文 (title attr 已有) */
.theme-stk-pane .st-neo4j-cell { color: var(--text-2); max-width: 560px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.theme-method-hint {
  font-size: var(--fs-meta); color: var(--text-3); line-height: var(--lh-body);
  margin: 18px 0 0; padding-top: var(--sp-3); border-top: 1px dashed var(--border-soft);
}
.theme-method-hint p { margin: 0; }
.theme-method-hint code { font-family: var(--font-mono); color: var(--text-3); }
.theme-method-hint .lbl { color: var(--text-2); margin-right: var(--sp-1); }

.theme-demo-suite {
  margin: 0 0 22px;
  padding: 14px;
  border: 1px solid rgba(232,235,239,0.82);
  border-radius: var(--r-lg);
  background: linear-gradient(180deg, rgba(255,255,255,0.72), rgba(250,251,252,0.56));
}
.theme-demo-head {
  display: flex; justify-content: space-between; gap: 10px; align-items: baseline;
  margin-bottom: 10px;
}
.theme-demo-title { font-size: var(--fs-ui); font-weight: 600; color: var(--text-1); }
.theme-demo-note { font-size: var(--fs-meta); color: var(--text-3); }
.theme-bucket-tabs {
  display: flex; gap: 6px; flex-wrap: wrap;
  margin: 0 0 12px;
}
.theme-bucket-tab {
  border: 1px solid var(--border-soft);
  border-radius: 14px;
  background: rgba(255,255,255,0.7);
  color: var(--text-2);
  padding: 5px 11px;
  font-size: var(--fs-ui);
  font-family: inherit;
  cursor: pointer;
}
.theme-bucket-tab:hover { color: var(--text-1); background: rgba(250,251,252,0.95); }
.theme-bucket-tab.active {
  color: var(--text-1);
  font-weight: 600;
  border-color: rgba(240,196,204,0.65);
  background: rgba(240,196,204,0.20);
}
.theme-demo-grid {
  display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(280px, 0.95fr);
  gap: var(--sp-3);
}
.theme-demo-card {
  border: 1px solid var(--border-soft);
  border-radius: var(--r-lg);
  background: rgba(255,255,255,0.68);
  padding: var(--sp-3);
  overflow: hidden;
}
.theme-demo-card h3 {
  margin: 0 0 9px;
  font-size: var(--fs-ui); color: var(--text-2); font-weight: 600;
}
.theme-map-scroll { overflow-x: auto; }
.theme-map-svg {
  display: block;
  min-width: 760px;
  width: 100%;
  height: auto;
}
.theme-map-edge { fill: none; stroke: rgba(200,184,224,0.72); stroke-width: 1.2; }
.theme-map-edge.stock { stroke: rgba(184,216,200,0.72); }
.theme-map-node { fill: #fff; stroke: rgba(232,235,239,0.95); stroke-width: 1; }
.theme-map-node.primary { fill: rgba(200,184,224,0.22); stroke: rgba(200,184,224,0.62); }
.theme-map-node.theme { fill: rgba(240,196,204,0.17); stroke: rgba(240,196,204,0.58); }
.theme-map-node.stock { fill: rgba(184,216,200,0.18); stroke: rgba(184,216,200,0.58); }
.theme-map-label { fill: var(--text-1); font-size: var(--fs-ui); font-family: var(--font-sans); }
.theme-map-label.sub { fill: var(--text-3); font-size: var(--fs-micro); }
.theme-edge-table {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--fs-ui);
}
.theme-edge-table th, .theme-edge-table td {
  border-bottom: 1px solid var(--border-soft);
  text-align: left;
  vertical-align: top;
}
.theme-edge-table th {
  color: var(--text-3);
  font-size: var(--fs-meta);
  font-weight: 500;
  background: transparent;
}
.theme-edge-table td { color: var(--text-2); }
.theme-edge-table td.up, .theme-edge-table .up { color: var(--up); font-weight: 600; }
.theme-edge-table td.dn, .theme-edge-table .dn { color: var(--dn); font-weight: 600; }
.theme-stock-table th, .theme-stock-table td { white-space: nowrap; }
.theme-stock-table .st-concept-cell {
  max-width: 110px; overflow: hidden; text-overflow: ellipsis;
}
.theme-stock-table .st-catalyst-cell {
  max-width: 220px; overflow: hidden; text-overflow: ellipsis;
}
.theme-link-btn {
  border: 0; background: transparent; padding: 0;
  color: var(--text-1); font: inherit; cursor: pointer;
  border-bottom: 1px dotted var(--text-3);
}
.theme-link-btn:hover { color: var(--accent); border-bottom-color: var(--accent); }
.theme-mini-list {
  display: flex; flex-direction: column; gap: 7px;
  max-height: 360px; overflow: auto;
}
.theme-mini-item {
  padding: 8px 9px;
  border: 1px solid var(--border-soft);
  border-radius: 7px;
  background: rgba(250,251,252,0.72);
}
.theme-mini-line {
  display: flex; gap: var(--sp-2); align-items: baseline; flex-wrap: wrap;
  font-size: var(--fs-ui);
}
.theme-mini-name { color: var(--text-1); font-weight: 600; }
.theme-mini-meta { color: var(--text-3); font-size: var(--fs-meta); font-family: var(--font-mono); }
.theme-mini-stocks { margin-top: 5px; color: var(--text-2); font-size: var(--fs-meta); line-height: var(--lh-body); }
@media (max-width: 900px) {
  .theme-demo-grid { grid-template-columns: 1fr; }
}
@media (max-width: 640px) {
  .theme-layout { grid-template-columns: 1fr; gap: 10px; }
  .theme-sidebar {
    position: static; display: flex; gap: 6px; overflow-x: auto;
    padding: 7px; white-space: nowrap;
  }
  .theme-sidebar-title { display: none; }
  .theme-sidebar-item { width: auto; flex: 0 0 auto; }
  .theme-content { padding: 18px 16px 24px; min-height: 420px; }
}

/* Encoder view 上证 K 线对比 */
.encoder-card {
  margin-bottom: 18px; padding: 14px 16px;
  background: var(--bg); border: 1px solid var(--border-soft); border-radius: var(--r-lg);
}
.encoder-card-header {
  font-size: var(--fs-ui); color: var(--text-1); margin-bottom: 6px; font-weight: 600;
}
.encoder-card-header .corr { color: var(--accent); font-size: var(--fs-meta); margin-left: var(--sp-2); font-weight: 500; }
.encoder-card-sub { font-size: var(--fs-meta); color: var(--text-3); margin-bottom: 10px; }
.encoder-mini-chart {
  width: 100%; height: 220px; background: #fff; border: 1px solid var(--border-soft); border-radius: var(--r-md);
  position: relative;
}
.encoder-loading {
  position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
  color: var(--text-3); font-size: var(--fs-meta);
}

/* Sentiment PNG */
.sentiment-grid {
  display: flex; flex-direction: column; gap: var(--sp-4);
}
.sentiment-item { display: flex; flex-direction: column; gap: var(--sp-2); }
.sentiment-item .label {
  font-size: var(--fs-meta); color: var(--text-2); padding-left: var(--sp-1);
}
.sentiment-item img {
  width: 100%; max-width: 880px; height: auto; display: block;
  border: 1px solid var(--border); border-radius: var(--r-lg); background: #fff;
}

@media (max-width: 640px) {
  .supply-grid { grid-template-columns: 1fr; }
  .peer-grid { grid-template-columns: repeat(auto-fill, minmax(130px, 1fr)); }
  .reading-md { padding: 18px 20px; font-size: var(--fs-title); }
  .other-layout { grid-template-columns: 1fr; }
  .other-sidebar { position: static; max-height: none; }
  .other-content { padding: 16px 18px; }
}

.modal-body {
  padding: 14px 22px 18px; overflow-y: auto;
  font-size: var(--fs-ui); line-height: var(--lh-body); color: var(--text-1);
}
.modal-body h2 { font-size: var(--fs-title); font-weight: 600; margin: 18px 0 6px; color: var(--text-1); border-left: 3px solid var(--accent-orange); padding-left: var(--sp-2); }
.modal-body h3 { font-size: var(--fs-ui); font-weight: 600; margin: 14px 0 4px; color: var(--text-1); }
.modal-body p { margin: 6px 0; }
.modal-body strong { color: var(--text-1); font-weight: 600; }
.modal-body em { color: var(--text-2); font-style: italic; }
.modal-body ul, .modal-body ol { padding-left: 22px; margin: 6px 0; }
.modal-body li { margin: 3px 0; }
.modal-body code {
  font-family: var(--font-mono); background: var(--tag-bg);
  padding: 1px 5px; border-radius: 3px; font-size: var(--fs-meta); color: var(--text-1);
}
.modal-body blockquote {
  border-left: 3px solid var(--border); padding: 6px 12px; margin: 10px 0;
  color: var(--text-2); background: var(--bg); border-radius: var(--r-sm);
}
.modal-body hr { display: none; }

.picks-header {
  display: flex; gap: 14px; align-items: center; flex-wrap: wrap;
  padding: 10px 14px; background: var(--card); border: 1px solid var(--border);
  border-radius: var(--r-lg); margin-bottom: var(--sp-3); font-size: var(--fs-meta); color: var(--text-2);
}
.picks-header .badge {
  display: inline-block; padding: 2px 10px; background: var(--tag-bg);
  color: var(--text-1); border-radius: 10px; font-size: var(--fs-meta); font-weight: 500;
}
.picks-empty {
  padding: 30px 20px; text-align: center; color: var(--text-3); font-size: var(--fs-ui);
  background: var(--card); border: 1px dashed var(--border); border-radius: var(--r-lg);
}
/* 2026-07-03: 两次选股 (dualpicks) — 同一档下 daily/incremental 左右并列迷你表 */
.dualpicks-row { display: flex; gap: var(--sp-3); align-items: flex-start; margin-bottom: var(--sp-3); }
.dualpicks-row .dualpicks-side { flex: 1 1 0; min-width: 0; margin-top: 0; }
.dualpicks-side-h { font-size: var(--fs-meta); color: var(--text-3); padding: var(--sp-1) 0; }
@media (max-width: 640px) { .dualpicks-row { flex-direction: column; } }

/* 审批门 */
.gate {
  position: fixed; inset: 0; background: rgba(246, 247, 249, 0.96);
  display: flex; align-items: center; justify-content: center; z-index: 9999; padding: var(--sp-4);
}
.gate-box {
  background: var(--card); border: 1px solid var(--border); border-radius: 10px;
  padding: 28px 26px; width: min(420px, 100%);
  box-shadow: 0 4px 24px rgba(58, 66, 80, 0.06);
}
.gate-box h3 { margin: 0 0 6px; font-size: var(--fs-title); font-weight: 600; color: var(--text-1); }
.gate-box .gate-sub { color: var(--text-2); font-size: var(--fs-meta); margin-bottom: 14px; line-height: var(--lh-body); }
.gate-box label { display: block; font-size: var(--fs-meta); color: var(--text-2); margin: 12px 0 6px; letter-spacing: 0.2px; }
.gate-box input, .gate-box textarea {
  width: 100%; padding: 9px 11px; border: 1px solid var(--border); border-radius: var(--r-md);
  font-size: var(--fs-ui); font-family: inherit; color: var(--text-1); background: var(--card);
}
.gate-box input:focus, .gate-box textarea:focus { outline: none; border-color: var(--accent); }
.gate-box textarea { min-height: 60px; resize: vertical; }
.gate-box .primary {
  width: 100%; margin-top: var(--sp-4); padding: 10px; background: var(--primary-bg);
  color: #fff; border: 0; border-radius: var(--r-md); font-size: var(--fs-ui); cursor: pointer;
  font-family: inherit; transition: background 0.15s ease;
}
.gate-box .primary:hover { background: var(--primary-bg-hover); }
.gate-box .link {
  background: transparent; color: var(--accent); padding: 8px 0 0; border: 0;
  cursor: pointer; font-size: var(--fs-meta); font-family: inherit;
}
.gate-box .link:hover { text-decoration: underline; }
.gate-box .err { color: var(--up); font-size: var(--fs-meta); margin-top: var(--sp-2); min-height: 16px; }
.gate-box .reqid {
  font-family: var(--font-mono); font-size: var(--fs-meta);
  word-break: break-all; background: var(--bg); padding: 8px 10px;
  border-radius: var(--r-sm); margin: 6px 0 12px; color: var(--text-2);
}
.gate-box .pending-hint { color: var(--text-2); font-size: var(--fs-meta); margin: 8px 0; line-height: var(--lh-body); }

@media (max-width: 640px) {
  .wrap { padding: 14px 10px; }
  thead th, tbody td { padding: 6px 8px; }
  .kpi { padding: 10px 12px; }
  .kpi .v { font-size: var(--fs-title); }
  /* 2026-06-10: 数据表 (持仓/选股/纯量价) 手机上卡内横滚, 防整页横向溢出.
     已知取舍: ≤640 时 thead sticky 钉顶失效 (滚动容器内 sticky top 不再相对视口); 桌面不受影响. */
  .table-card { overflow-x: auto; }
  /* 2026-06-20: 横滚时首列 (代码/名称) 粘附左侧 — 看右侧数据列时仍对得上是哪只股 (sticky-left).
     仅作用 .table-card 内表 (持仓/选股/纯量价/rocket/strike 等); thead 首列叠加最高 z 防被盖. */
  .table-card table td:first-child,
  .table-card table th:first-child {
    position: sticky; left: 0; z-index: 2;
    background: var(--card);
    box-shadow: 1px 0 0 var(--border);
  }
  .table-card thead th:first-child { z-index: 6; background: var(--bg); }
}

/* ============ 信息流 view (Phase 1) ============ */
.feed-subtabs { display: flex; gap: var(--sp-1); margin: 4px 0 14px; border-bottom: 1px solid var(--border-soft); overflow-x: auto; }
.feed-subtab { background: transparent; border: 0; padding: 8px 16px; cursor: pointer; color: var(--text-3); font-size: var(--fs-ui); font-weight: 500; border-bottom: 2px solid transparent; margin-bottom: -1px; white-space: nowrap; flex: 0 0 auto; }
.feed-subtab:hover:not(:disabled) { color: var(--text-1); }
.feed-subtab.active { color: var(--accent); border-bottom-color: var(--accent); }
.feed-subtab:disabled { opacity: 0.4; cursor: not-allowed; }
.feed-tools { display: flex; align-items: center; gap: 10px; margin-bottom: var(--sp-3); }
.feed-tools input { flex: 1; max-width: 380px; padding: 7px 12px; border: 1px solid var(--border-soft); border-radius: var(--r-md); font-size: var(--fs-ui); background: var(--bg-1); color: var(--text-1); }
.feed-stats { font-size: var(--fs-meta); color: var(--text-3); font-family: var(--font-mono); }
.feed-empty { padding: 40px 20px; text-align: center; color: var(--text-3); font-size: var(--fs-ui); }
.feed-card { padding: 12px 14px; margin-bottom: 10px; background: var(--bg-1); border: 1px solid var(--border-soft); border-radius: var(--r-lg); font-size: var(--fs-ui); line-height: var(--lh-snug); }
.feed-card:hover { border-color: var(--border-strong); }
.feed-card .fc-head { display: flex; align-items: center; gap: var(--sp-2); margin-bottom: 6px; font-size: var(--fs-meta); color: var(--text-3); font-family: var(--font-mono); flex-wrap: wrap; }
.feed-card .fc-date { font-weight: 600; color: var(--text-2); }
.feed-card .fc-author { color: var(--text-3); }
.feed-card .fc-quality { margin-left: auto; }
.feed-card .fc-catalyst { color: var(--text-1); margin: 6px 0 4px; font-weight: 500; }
.feed-card .fc-catalyst.empty { color: var(--text-3); font-style: italic; font-weight: normal; }
.feed-card .fc-themes { display: flex; flex-wrap: wrap; gap: var(--sp-1); margin-top: 6px; }
.feed-card .fc-theme { padding: 1px 7px; border-radius: 10px; background: rgba(100,140,200,0.12); color: #3a5a8a; font-size: var(--fs-meta); }
.feed-card .fc-meta { display: flex; flex-wrap: wrap; gap: var(--sp-3); margin-top: 6px; font-size: var(--fs-meta); color: var(--text-3); }
.feed-card .fc-meta b { color: var(--text-2); font-weight: 600; }
.feed-card .sent-pos { color: #2e8540; font-weight: 600; }
.feed-card .sent-neu { color: #8a7530; font-weight: 600; }
.feed-card .sent-neg { color: #b03030; font-weight: 600; }
.feed-card .fc-emo-fear { color: #b03030; }
.feed-card .fc-emo-greed { color: #2e8540; }
/* Phase 2: 实时 sub-tab + 增强字段. 持仓股只显示徽章, 不影响背景 */
.feed-card .fc-hold-badge { color: #6b3d18; background: var(--candy-orange); padding: 1px 7px; border-radius: 3px; font-weight: 600; font-size: var(--fs-meta); letter-spacing: 0.4px; }
.fc-action-badge { color: #fff; background: var(--accent); padding: 1px 7px; border-radius: 3px; font-weight: 600; font-size: var(--fs-meta); letter-spacing: 0.4px; }
.fc-pattern-badge { color: #6b3d18; background: var(--candy-amber); padding: 1px 7px; border-radius: 3px; font-weight: 600; font-size: var(--fs-meta); letter-spacing: 0.4px; }
/* 高信号衬底 — action >= 0.7 OR 历史回测高 (T+5 ≥ 5% 且胜率 ≥ 60% 且 n ≥ 3) */
.feed-card.high-signal { background: rgba(239,184,138,0.13); border-color: rgba(212,130,74,0.42); }
/* T+5/T+10 红涨绿跌 (A 股惯例) */
.fc-pct-up { color: var(--up); font-weight: 600; }
.fc-pct-dn { color: var(--dn); font-weight: 600; }
.fc-pct-neutral { color: var(--text-3); }
/* 来源标识 (中性灰, 不用颜色区分) */
.feed-card .fc-source { background: rgba(120,120,120,0.10); color: var(--text-2); padding: 1px 7px; border-radius: 3px; font-size: var(--fs-meta); }
/* 新卡片闪烁动画 (3s, 实时滚动时新事件首次出现) */
.feed-card.is-new { animation: feedNewFlash 3s ease-out forwards; }
@keyframes feedNewFlash {
  0%   { background: rgba(212,130,74,0.32); border-color: var(--accent); box-shadow: 0 0 0 4px rgba(212,130,74,0.22); }
  60%  { background: rgba(212,130,74,0.12); border-color: var(--accent); box-shadow: 0 0 0 0 rgba(212,130,74,0); }
  100% { background: var(--bg-1); border-color: var(--border-soft); box-shadow: none; }
}
/* 撤销 XGB 信号衬底色 — 整体保持素雅, 由 action-strong 单独负责唯一衬底色 */
/* 新内容提示横幅 (顶部 sticky, 点击 fade) */
.feed-new-banner { position: sticky; top: 0; z-index: 5; padding: 8px 14px; background: var(--candy-orange); color: #6b3d18; border-radius: 5px; font-size: var(--fs-meta); cursor: pointer; margin-bottom: 10px; text-align: center; font-weight: 500; animation: feedBannerFlash 1.2s ease-in-out infinite; }
@keyframes feedBannerFlash {
  0%, 100% { box-shadow: 0 0 0 0 rgba(212,130,74,0); }
  50%      { box-shadow: 0 0 0 6px rgba(212,130,74,0.30); }
}
.feed-card .fc-codes { display: flex; flex-wrap: wrap; gap: var(--sp-1); margin-top: 6px; }
.feed-card .fc-code { padding: 1px 7px; border-radius: 3px; background: rgba(120,140,170,0.12); color: var(--text-2); font-size: var(--fs-meta); font-family: var(--font-mono); cursor: pointer; transition: color 0.12s, background 0.12s; }
.feed-card .fc-code:hover { background: rgba(212,130,74,0.18); color: var(--accent); text-decoration: underline; }
.feed-card .fc-code.in-hold { background: rgba(212,130,74,0.18); color: #6b3d18; font-weight: 600; }
/* 击球股池 chip (teal/cyan, 区别于持仓的橙色) — in-hold 优先级更高, 同时命中时 in-hold 覆盖 */
.feed-card .fc-code-more { color: var(--text-3); font-size: var(--fs-meta); padding: 2px; }
/* "展开原文"按钮 + lazy-loaded raw content */
.feed-card .fc-expand-btn { margin-top: var(--sp-2); padding: 3px 10px; border: 1px solid var(--border-soft); background: var(--bg-1); color: var(--text-3); border-radius: var(--r-sm); cursor: pointer; font-size: var(--fs-meta); }
.feed-card .fc-expand-btn:hover { color: var(--text-1); border-color: var(--text-3); }
.feed-card .fc-expand-btn.loading { opacity: 0.5; cursor: wait; }
.feed-card .fc-raw-content { margin-top: var(--sp-2); padding: 8px 10px; background: rgba(120,120,120,0.05); border-left: 2px solid var(--border-soft); border-radius: 0 4px 4px 0; font-size: var(--fs-meta); line-height: var(--lh-body); color: var(--text-2); white-space: pre-wrap; word-break: break-word; max-height: 360px; overflow-y: auto; }
.feed-card .fc-raw-content .fc-raw-trunc { color: var(--text-3); font-size: var(--fs-meta); font-style: italic; margin-top: 6px; }
.feed-card .fc-raw-content .fc-raw-miss { color: var(--text-3); font-style: italic; }
.feed-card .fc-xgb { margin-top: 6px; padding: 6px 8px; background: rgba(80,100,140,0.06); border-radius: var(--r-sm); font-size: var(--fs-meta); line-height: var(--lh-body); }
.feed-card .fc-xgb b { color: var(--text-2); margin-right: 3px; }
.feed-card .fc-pattern { margin-top: var(--sp-1); padding: 6px 8px; background: rgba(180,140,90,0.07); border-radius: var(--r-sm); font-size: var(--fs-meta); line-height: var(--lh-body); color: var(--text-2); }
.feed-card .fc-pattern b { color: var(--text-1); }
.feed-card .fc-pattern .ps-mini { font-size: var(--fs-meta); color: var(--text-3); }
/* 实时 sub-tab 过滤栏 + 控制 */
.feed-realtime-tools { display: flex; align-items: center; gap: 10px; margin-bottom: var(--sp-3); flex-wrap: wrap; }
.feed-realtime-tools input { padding: 6px 10px; border: 1px solid var(--border-soft); border-radius: var(--r-sm); font-size: var(--fs-meta); background: var(--bg-1); color: var(--text-1); max-width: 220px; }
.feed-realtime-tools select { padding: 6px 10px; border: 1px solid var(--border-soft); border-radius: var(--r-sm); font-size: var(--fs-meta); background: var(--bg-1); color: var(--text-1); }
.feed-realtime-tools button { padding: 6px 12px; border: 1px solid var(--border-soft); background: var(--bg-1); color: var(--text-2); border-radius: var(--r-sm); cursor: pointer; font-size: var(--fs-meta); }
.feed-realtime-tools button.active { background: var(--accent); color: #fff; border-color: var(--accent); }
.feed-realtime-tools button:hover { color: var(--text-1); }
.feed-realtime-tools .rt-status { margin-left: auto; font-size: var(--fs-meta); color: var(--text-3); font-family: var(--font-mono); }
.feed-realtime-tools .rt-status.fresh { color: var(--accent); }
/* 健康度小字栏 */
.feed-health { display: flex; flex-wrap: wrap; gap: 14px; font-size: var(--fs-meta); color: var(--text-3); padding: 4px 0 8px; border-bottom: 1px dashed var(--border-soft); margin-bottom: 10px; }
.feed-health .hl-item { display: inline-flex; align-items: center; gap: 5px; }
.feed-health .hl-dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; flex-shrink: 0; }
.feed-health .hl-ok .hl-dot { background: #6b9472; }
.feed-health .hl-warn .hl-dot { background: #d4824a; }
.feed-health .hl-down .hl-dot { background: #c66a64; }
.feed-health .hl-disabled .hl-dot { background: #a3aab6; }
.feed-health .hl-name { color: var(--text-2); }
.feed-health .hl-detail { color: var(--text-3); font-family: var(--font-mono); }

/* ============ 月度收益追踪 chart (SVG, 替代 ASCII art) ============ */
/* 2026-05-13 清新版: 软色调 + 平滑曲线 + 极简 chrome + 滚轮缩放/拖拽 */
:root {
  --pc-up-soft: #c48b7e;       /* 暖珊瑚 (代替刺眼的 A 股红) */
  --pc-dn-soft: #88a890;       /* 雾松绿 (代替深绿) */
  --pc-neutral: #b8c1cc;
  --pc-grid: rgba(140,150,165,0.13);
  --pc-zero: rgba(140,150,165,0.35);
  --pc-axis-text: #9aa3ad;
  --pc-title: #2c3138;
  --pc-stats: #adb3bd;
  --pc-tooltip-bg: rgba(44,49,56,0.92);
}
.perf-chart { margin: 18px 0 24px; padding: 6px 4px 0; background: transparent; position: relative; }
.perf-chart .pc-head { display: flex; align-items: baseline; gap: var(--sp-3); padding: 0 8px 6px; font-size: var(--fs-ui); }
.perf-chart .pc-title { font-weight: 500; color: var(--pc-title); letter-spacing: 0.2px; }
.perf-chart .pc-final { font-family: var(--font-mono); font-weight: 600; font-size: var(--fs-ui); letter-spacing: 0.3px; }
.perf-chart .pc-final.up { color: var(--pc-up-soft); }
.perf-chart .pc-final.dn { color: var(--pc-dn-soft); }
.perf-chart .pc-stats { color: var(--pc-stats); font-size: var(--fs-meta); margin-left: auto; font-family: var(--font-mono); font-weight: 400; }
.perf-chart .pc-hint { color: var(--pc-stats); font-size: var(--fs-meta); opacity: 0; transition: opacity 0.2s; padding-right: var(--sp-1); }
.perf-chart:hover .pc-hint { opacity: 1; }
.perf-chart svg { display: block; width: 100%; height: auto; touch-action: none; user-select: none; cursor: grab; }
.perf-chart svg.dragging { cursor: grabbing; }
.perf-chart .pc-grid { stroke: var(--pc-grid); stroke-width: 1; }
.perf-chart .pc-axis { stroke: transparent; }
.perf-chart .pc-axis-text { font-size: var(--fs-meta); fill: var(--pc-axis-text); font-family: var(--font-sans); font-weight: 400; }
.perf-chart .pc-line { fill: none; stroke-width: 1.6; stroke-linejoin: round; stroke-linecap: round; }
.perf-chart .pc-line.up { stroke: var(--pc-up-soft); }
.perf-chart .pc-line.dn { stroke: var(--pc-dn-soft); }
.perf-chart .pc-area.up { fill: url(#pc-grad-up); }
.perf-chart .pc-area.dn { fill: url(#pc-grad-dn); }
.perf-chart .pc-dot { r: 2; opacity: 0; transition: opacity 0.15s, r 0.15s; pointer-events: all; }
.perf-chart .pc-dot:hover, .perf-chart .pc-dot.active { opacity: 1; r: 4; }
.perf-chart .pc-dot.up { fill: var(--pc-up-soft); }
.perf-chart .pc-dot.dn { fill: var(--pc-dn-soft); }
.perf-chart .pc-dot.float { stroke: currentColor; stroke-width: 1.4; fill: var(--bg-1); }
.perf-chart .pc-zero-line { stroke: var(--pc-zero); stroke-dasharray: 2 4; stroke-width: 1; }
.perf-chart .pc-hover-line { stroke: var(--pc-zero); stroke-width: 1; opacity: 0; pointer-events: none; }
.perf-chart .pc-tooltip { position: absolute; top: 28px; padding: 6px 10px; background: var(--pc-tooltip-bg); color: #fff; border-radius: 5px; font-size: var(--fs-meta); font-family: var(--font-mono); pointer-events: none; opacity: 0; transition: opacity 0.12s; white-space: nowrap; z-index: 10; box-shadow: 0 2px 8px rgba(0,0,0,0.15); }
.perf-chart .pc-tooltip.visible { opacity: 1; }
.perf-chart .pc-empty { padding: 20px; text-align: center; color: var(--pc-stats); font-size: var(--fs-meta); }

/* ============ 主题骨架/分析 文档清新化 (2026-05-13) ============ */
/* 用现有 CSS vars + 上面定义的 pc-* 软色; 不引入新色, 仅整理结构. */
.other-md .theme-card {
  margin: 10px 0;
  padding: 10px 14px;
  background: var(--bg-1);
  border: 1px solid var(--border-soft);
  border-radius: var(--r-md);
  font-size: var(--fs-ui);
  line-height: var(--lh-snug);
}
.other-md .theme-card-head {
  display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap;
  margin-bottom: 6px; padding-bottom: 6px; border-bottom: 1px dashed var(--border-soft);
}
.other-md .tc-id {
  font-family: var(--font-mono);
  font-size: var(--fs-meta); color: var(--text-3); font-weight: 600; letter-spacing: 0.4px;
}
.other-md .tc-name {
  font-size: var(--fs-title); font-weight: 600; color: var(--text-1); margin-right: 2px;
}
.other-md .tc-type {
  font-size: var(--fs-meta); padding: 1px 6px; border-radius: 3px;
  background: rgba(120,140,170,0.10); color: var(--text-3); font-weight: 500; letter-spacing: 0.2px;
}
.other-md .tc-status {
  font-size: var(--fs-meta); padding: 1px 7px; border-radius: 3px; font-weight: 500; letter-spacing: 0.2px;
}
.other-md .tc-status.status-erupt { background: rgba(196,139,126,0.14); color: var(--pc-up-soft); }
.other-md .tc-status.status-ferment { background: rgba(150,140,180,0.13); color: #7d6b9a; }
.other-md .tc-status.status-climax { background: rgba(200,160,80,0.14); color: #a07520; }
.other-md .tc-status.status-initial { background: rgba(136,168,144,0.13); color: var(--pc-dn-soft); }
.other-md .tc-status.status-decay { background: rgba(180,180,180,0.13); color: var(--text-3); }
.other-md .tc-stat {
  font-size: var(--fs-meta); color: var(--text-3); font-family: var(--font-mono);
}
.other-md .tc-stat b { color: var(--text-2); font-weight: 600; }
.other-md .tc-stat.tc-daily.up { color: var(--pc-up-soft); }
.other-md .tc-stat.tc-daily.dn { color: var(--pc-dn-soft); }
.other-md .tc-row {
  display: flex; align-items: baseline; gap: 10px; padding: 3px 0;
  font-size: var(--fs-ui); color: var(--text-2);
}
.other-md .tc-row-label {
  flex-shrink: 0; width: 70px;
  font-size: var(--fs-meta); color: var(--text-3); letter-spacing: 0.3px;
}
.other-md .tc-row-content { flex: 1; word-break: break-word; }
.other-md .tc-code {
  display: inline-block; padding: 0 4px; margin: 0 2px 2px 0;
  font-family: var(--font-mono); font-size: var(--fs-meta);
  color: var(--text-2); cursor: pointer; border-bottom: 1px dotted var(--text-3);
}
.other-md .tc-code:hover { color: var(--accent); border-bottom-color: var(--accent); }
.other-md .tc-mini { color: var(--text-3); font-size: var(--fs-meta); font-family: var(--font-mono); }
.other-md .tc-sep { color: var(--text-3); margin: 0 4px; }
.other-md .tc-arrow { color: var(--text-3); margin: 0 6px; }
.other-md .tc-suggest { color: var(--text-1); font-weight: 600; }

/* 主题文档 — 各种 quote / heading 调淡 */
.other-md.theme-md h1 { font-size: var(--fs-display); font-weight: 600; color: var(--text-1); margin: 8px 0 16px; letter-spacing: 0.3px; }
.other-md.theme-md h2 { font-size: var(--fs-title); font-weight: 600; color: var(--text-1); margin: 22px 0 10px; padding-bottom: 6px; border-bottom: 1px solid var(--border-soft); }
.other-md.theme-md h3 { font-size: var(--fs-ui); font-weight: 600; color: var(--text-2); margin: 16px 0 8px; }
.other-md.theme-md blockquote { border-left: 2px solid var(--border-soft); background: transparent; padding: 4px 12px; color: var(--text-3); font-size: var(--fs-meta); margin: 8px 0; }
.other-md.theme-md table { font-size: var(--fs-ui); }
.other-md.theme-md hr { margin: 18px 0; }
.other-md.theme-md ul { padding-left: 20px; }
.other-md.theme-md li { margin: 3px 0; }
.other-md.theme-md p { line-height: var(--lh-body); }

/* ============ 2026-05-20: 击球 view sub-tab (候选股池 / 底层模型回测) ============ */
.strike-sub-pane { animation: fadeIn 0.15s ease-out; }
@keyframes fadeIn { from { opacity: 0.5; } to { opacity: 1; } }

/* 2026-05-24: emergent 与 strike 共享 sub-tabs 样式 (橙色底部横线选中) */
#strike-sub-tabs,
#emergent-sub-tabs {
  display: flex;
  gap: 0;
  border-bottom: 1px solid var(--border);
  margin-bottom: var(--sp-4);
  padding-bottom: 0;
}
#strike-sub-tabs .strike-pill,
#emergent-sub-tabs .strike-pill {
  padding: 9px 18px;
  background: transparent;
  border: 0;
  border-radius: 0;
  cursor: pointer;
  font-size: var(--fs-body);
  color: var(--text-2);
  font-family: inherit;
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  margin-right: 0;
  transition: color 0.15s ease, border-bottom-color 0.15s ease;
}
#strike-sub-tabs .strike-pill:hover,
#emergent-sub-tabs .strike-pill:hover {
  color: var(--accent-orange);
}
#strike-sub-tabs .strike-pill.active,
#emergent-sub-tabs .strike-pill.active {
  color: var(--accent-orange);
  background: transparent;
  border-bottom-color: var(--accent-orange);
  font-weight: 600;
}

/* ============ 2026-05-21: 击球 view 重做 — 模型指标表格化 ============ */
.strike-model-summary {
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--sp-3);
  padding: 6px 0 10px 0;
  margin-top: 10px;
  margin-bottom: var(--sp-2);
  border-bottom: 1px solid var(--border-soft);
  font-size: var(--fs-ui);
}
.strike-model-summary .sms-info {
  display: flex;
  align-items: baseline;
  gap: var(--sp-3);
}
.strike-model-summary .sms-title {
  font-size: var(--fs-body);
  font-weight: 600;
  color: var(--text-1);
}
.strike-model-summary .sms-desc {
  font-size: var(--fs-meta);
  color: var(--text-3);
}
.strike-model-summary .sms-kpis {
  display: flex;
  align-items: center;
  gap: 20px;
}
.strike-model-summary .sms-kpi-item {
  font-size: var(--fs-meta);
  color: var(--text-2);
}
.strike-model-summary .sms-kpi-item .lbl {
  color: var(--text-3);
  margin-right: var(--sp-1);
}
.strike-model-summary .sms-kpi-item .val {
  font-size: var(--fs-ui);
  font-weight: 600;
  font-family: var(--font-mono);
}
.strike-model-summary .sms-kpi-item .sub {
  font-size: var(--fs-micro);
  color: var(--text-3);
  margin-left: 2px;
}

/* 2026-05-22: 实时持仓 group-stats 下方的公式说明 (灰字小号, paper theme) */
.metrics-formula {
  margin-top: 18px;
  padding: 12px 16px;
  background: var(--tag-bg);
  border: 1px solid var(--border-soft);
  border-radius: var(--r-sm);
  font-size: var(--fs-meta);
  color: var(--text-3);
  line-height: var(--lh-body);
}
.metrics-formula .mf-title {
  font-size: var(--fs-ui);
  font-weight: 600;
  color: var(--text-2);
  margin-bottom: 6px;
  font-family: var(--font-heading);
}
.metrics-formula .mf-intro { margin-bottom: var(--sp-2); color: var(--text-3); }
.metrics-formula .mf-list {
  margin: 0; padding-left: var(--sp-4);
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 4px 20px;
}
.metrics-formula .mf-list li { font-size: var(--fs-meta); color: var(--text-3); line-height: var(--lh-body); }
.metrics-formula .mf-list b { color: var(--text-2); font-weight: 600; }
.metrics-formula .mf-list sub,
.metrics-formula .mf-list sup { font-size: var(--fs-micro); color: var(--text-3); }
.metrics-formula .mf-list code {
  background: var(--bg); padding: 0 3px; border-radius: 2px;
  font-size: var(--fs-micro); color: var(--accent);
}
@media (max-width: 640px) {
  .metrics-formula .mf-list { grid-template-columns: 1fr; }
}

.strike-split-container {
  display: flex;
  /* 2026-05-22 用户反馈"太挤", gap 20→28, top 12→20 给"模型列表 ↔ 个股表"留呼吸 */
  gap: 28px;
  align-items: flex-start;
  margin-top: 20px;
}
/* emergent / strike: 上下布局 (2026-05-26 合并 event_hit + leader; 2026-07-03 strike 模型列表+个股表 也改上下, 用户反馈并列太挤) */
#emergent-view .strike-split-container,
#strike-view .strike-split-container {
  flex-direction: column;
  gap: 0;
}
#emergent-view .strike-model-selector,
#emergent-view .strike-model-detail,
#strike-view .strike-model-selector,
#strike-view .strike-model-detail {
  flex: none;
  width: 100%;
  min-width: 0;
}
@media (max-width: 900px) {
  .strike-split-container {
    flex-direction: column;
  }
}
.strike-model-selector {
  /* 2026-05-22 fix: 26→38 让 8 列模型表 (模型/周期/类别/累计/胜率/夏普/回撤/超额) 容得下 nowrap
     避免溢出覆盖到右栏个股表 (用户截图 bug) */
  flex: 38;
  min-width: 0;
  margin-bottom: 0;
  overflow-x: auto;  /* 兜底: 真挤就左栏内横向滚, 不撑出 */
}
@media (max-width: 900px) {
  .strike-model-selector {
    flex: 1 1 100%;
    width: 100%;
  }
}
.strike-table-wrapper {
  overflow: visible;
  border: 0;
  border-radius: 0;
  background: transparent;
  margin-bottom: var(--sp-4);
}
@media (max-width: 900px) {
  .strike-table-wrapper {
    overflow-x: auto;
  }
}
.strike-models-table {
  width: 100%;
  border-collapse: separate !important;
  border-spacing: 0;
  font-size: var(--fs-ui);
  text-align: left;
}
.strike-models-table th,
.strike-models-table td {
  white-space: nowrap;
}
.strike-models-table thead th {
  position: sticky;
  top: var(--tabs-h);
  z-index: 5;
  background: var(--bg);
  padding: 8px 10px;
  border-bottom: 1px solid var(--border-soft);
  font-weight: 600;
  color: var(--text-2);
  font-size: var(--fs-meta);
}
.strike-models-table tbody td {
  padding: 6px 10px;
  border-bottom: 1px solid var(--border-soft);
  color: var(--text-1);
}
.strike-models-table tbody tr:last-child td {
  border-bottom: 0;
}
.strike-model-row {
  cursor: pointer;
  transition: background-color 0.15s ease;
}
.strike-model-row:hover {
  background-color: var(--row-hover);
}
.strike-model-row.active {
  background-color: rgba(212, 130, 74, 0.08) !important;
}
.strike-model-row.active td {
  color: var(--text-1);
}
.strike-model-row .font-mono {
  font-family: var(--font-mono);
}
.strike-model-row .num {
  text-align: right;
}
.strike-models-table thead th.num {
  text-align: right;
}

/* Sharpe Ratio indicator classes */
.strike-model-row .sml-sharpe-strong { color: var(--up); font-weight: 600; }
.strike-model-row .sml-sharpe-mid { color: #6a9d4a; }
.strike-model-row .sml-sharpe-weak { color: var(--text-2); }
.strike-model-row .sml-sharpe-neg { color: var(--dn); }

/* Excess Return indicator classes */
.strike-model-row .sml-excess-up { color: var(--up); font-weight: 600; }
.strike-model-row .sml-excess-dn { color: var(--dn); }
.strike-model-row .sml-excess-flat { color: var(--text-3); }

/* 2026-05-28 v4: 指标解读改 inline 页脚灰色小字 (移到 strike-downloads 底部, 用户淡化要求)
   旧 .ic-explainer / .ic-explainer-grid / .iee-h / .iee-b 已废 (HTML 不再生成), CSS 仅保留新 footnote 样式. */
.ic-explainer-footnote {
  max-width: 1100px; margin: 16px auto 8px; padding: 8px 14px 0;
  font-size: var(--fs-meta); color: var(--text-3); line-height: var(--lh-body);
  border-top: 1px dashed var(--border-soft);
}
.ic-explainer-footnote .iee-fnseg {
  display: block; margin-bottom: var(--sp-1);
}
.ic-explainer-footnote b {
  color: var(--text-2); font-weight: 600;
}

/* 2026-05-28: IC + IC趋势 列 配色 */
.strike-model-row .sml-ic-strong { color: var(--up); font-weight: 600; }       /* ≥0.05 强 */
.strike-model-row .sml-ic-mid    { color: #6a9d4a; }                            /* 0.02~0.05 中 */
.strike-model-row .sml-ic-weak   { color: var(--text-2); }                      /* 0~0.02 弱正 */
.strike-model-row .sml-ic-neg    { color: var(--dn); }                          /* <0 反向 */
.strike-model-row .sml-ic-na     { color: var(--text-3); font-style: italic; }  /* 缺失/样本不足 */

.strike-model-row .sml-trend-up   { color: var(--up); font-weight: 600; }       /* 近5日 > 20日 +0.02 */
.strike-model-row .sml-trend-dn   { color: var(--dn); }                         /* 近5日 < 20日 -0.02 */
.strike-model-row .sml-trend-flat { color: var(--text-2); }                     /* 持平 */
.strike-model-row .sml-trend-na   { color: var(--text-3); font-style: italic; } /* 缺失 */


.strike-model-detail {
  /* 2026-05-22 fix: 74→62 配对左栏 38 */
  flex: 62;
  min-width: 0;
  overflow-x: auto;  /* 兜底: 个股表 13 列 + 财务列, 也单栏内 scroll 不撑出 */
  margin-top: 0;
}
@media (max-width: 900px) {
  .strike-model-detail {
    flex: 1 1 100%;
    width: 100%;
  }
}
.strike-detail-header {
  padding: 0 0 10px 0;
  border: 0;
  border-radius: 0;
  background: transparent;
}
.strike-detail-header .sdh-title { font-size: var(--fs-title); font-weight: 600; color: var(--text-1); }
.strike-detail-header .sdh-meta { font-size: var(--fs-meta); color: var(--text-3); margin-top: var(--sp-1); }
.strike-detail-kpi {
  display: flex;
  flex-wrap: wrap;
  gap: 12px 24px;
  border: 0;
  border-radius: 0;
  padding: 8px 0;
  margin-bottom: var(--sp-3);
  background: transparent;
}
.strike-detail-kpi .sdk-card {
  flex: none;
  padding: 0;
  border-right: 0;
}
.strike-detail-kpi .sdk-label { font-size: var(--fs-meta); color: var(--text-3); }
.strike-detail-kpi .sdk-value { font-size: var(--fs-display); font-weight: 600; margin: 2px 0; font-family: var(--font-mono); }
.strike-detail-kpi .sdk-sub { font-size: var(--fs-meta); color: var(--text-3); }
.strike-detail-table {
  width: 100%;
  border-collapse: separate !important;
  border-spacing: 0;
  font-size: var(--fs-ui);
  border: 0;
  border-radius: 0;
}
.strike-detail-table thead th {
  position: sticky;
  top: var(--tabs-h);
  z-index: 5;
  background: var(--bg);
  padding: 8px 10px;
  border-bottom: 1px solid var(--border-soft);
  font-size: var(--fs-meta);
  font-weight: 600;
  color: var(--text-2);
}
.strike-detail-table tbody td {
  padding: 6px 10px;
  border-bottom: 1px solid var(--border-soft);
}
.strike-detail-table tbody tr:last-child td { border-bottom: 0; }
.strike-detail-table tbody tr:hover { background: var(--row-hover); }

/* ============ 击球 view (底层模型预测) ============ */
.strike-toolbar { display: flex; align-items: center; gap: 10px; margin-bottom: var(--sp-3); flex-wrap: wrap; font-size: var(--fs-body); }
.strike-toolbar label { color: var(--text-3); font-size: var(--fs-body); }
.strike-toolbar select { padding: 5px 9px; border: 1px solid var(--border-soft); border-radius: var(--r-sm); font-size: var(--fs-body); background: var(--bg-1); color: var(--text-1); }
.strike-toolbar .strike-stat { margin-left: auto; color: var(--text-3); font-family: var(--font-mono); font-size: var(--fs-body); }
.strike-section-title { font-size: var(--fs-body); color: var(--text-2); font-weight: 600; margin: 18px 0 8px; padding-bottom: var(--sp-1); border-bottom: 1px solid var(--border-soft); }
.strike-section-title .strike-hint { color: var(--text-3); font-weight: normal; font-size: var(--fs-body); margin-left: var(--sp-2); }
.strike-pill { display: inline-block; padding: 3px 10px; margin-right: var(--sp-1); margin-bottom: var(--sp-1); border: 1px solid var(--border-soft); border-radius: 14px; cursor: pointer; font-size: var(--fs-body); color: var(--text-2); background: var(--bg-1); }
.strike-pill:hover { color: var(--text-1); border-color: var(--text-3); }
.strike-pill.active { background: var(--accent); color: #fff; border-color: var(--accent); }
.strike-pill-row { margin: 6px 0; display: flex; flex-wrap: wrap; gap: 2px; }
.strike-pill-row .strike-group-label { color: var(--text-3); font-size: var(--fs-body); align-self: center; margin-right: 6px; min-width: 36px; }
table.strike-table { width: 100%; font-size: var(--fs-body); background: transparent; border: 0; line-height: var(--lh-snug); }
table.strike-table thead th { position: sticky; top: var(--tabs-h); z-index: 5; background: var(--bg); text-align: left; font-weight: 500; font-size: var(--fs-ui); color: var(--text-3); border-bottom: 1px solid var(--border); padding: 8px 10px; }
table.strike-table tbody td { border-bottom: 1px solid var(--border-soft); font-family: inherit; padding: 6px 10px; }
table.strike-table tbody tr:last-child td { border-bottom: 0; }
table.strike-table tbody tr:hover { background: var(--row-hover); }
table.strike-table .st-rank { color: var(--text-3); font-family: var(--font-mono); width: 40px; }
table.strike-table .st-code { font-family: var(--font-mono); color: var(--text-2); cursor: pointer; }
table.strike-table .st-code:hover { color: var(--accent); text-decoration: underline; }
table.strike-table .st-name { color: var(--text-1); cursor: pointer; }
table.strike-table .st-name:hover { color: var(--accent); text-decoration: underline; }
table.strike-table .st-holds-cell { color: var(--text-3); max-width: 160px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
table.strike-table .st-pred { font-family: var(--font-mono); text-align: right; }
table.strike-table .st-pred.pos { color: var(--up); font-weight: 600; }
table.strike-table .st-pred.neg { color: var(--dn); font-weight: 600; }
table.strike-table .st-rank-cell { font-family: var(--font-mono); color: var(--text-3); text-align: right; }
table.strike-table .st-pe-cell { font-family: var(--font-mono); color: var(--text-2); text-align: right; }
table.strike-table .st-rank-model { color: var(--text-3); margin-left: var(--sp-1); font-family: inherit; opacity: 0.7; }
table.strike-table thead th.st-th { cursor: pointer; user-select: none; transition: color 0.15s, background-color 0.15s; }
table.strike-table thead th.st-th:hover { color: var(--text-2); background: var(--row-hover); }
table.strike-table thead th.st-th.sorted { color: var(--accent); }
table.strike-table .st-theme-cell { color: var(--text-1); max-width: 160px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
table.strike-table .st-concept-cell {
  color: var(--text-2);
  /* 2026-05-22 用户要求: 列窄, 只留 1 个概念的显示空间 (~5-6 个中文字), hover title 看全集 */
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  width: 110px;
  max-width: 110px;
  min-width: 90px;
}
table.strike-table .st-catalyst-cell { color: var(--text-2); max-width: 240px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
table.strike-table .st-source { color: var(--text-3); font-family: var(--font-mono); max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
table.strike-table .st-signals { color: var(--text-3); font-family: var(--font-mono); }
/* 2026-05-18: rocket-table 专属列宽 — Neo4j 摘要吃剩余空间, 其他列收紧贴内容. */
table.strike-table.rocket-table {
  table-layout: fixed;
}
table.strike-table.rocket-table .st-name { max-width: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
table.strike-table.rocket-table .st-theme-cell { max-width: none; }
table.strike-table.rocket-table .st-neo4j-cell { color: var(--text-2); }
table.strike-table.rocket-table .st-source {
  width: 58px;
  max-width: 58px;
  min-width: 58px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  text-align: center;
}
/* 2026-06-05: 模型列填 hit 命中数(等宽数字居中). 数字色: 1日灰 / 5日及以上浅橙(不加粗);
   双类共识(XGB∩GRU)填浅橙底. */
table.strike-table.rocket-table .st-hit {
  width: 58px;
  max-width: 58px;
  min-width: 58px;
  text-align: center;
  font-variant-numeric: tabular-nums;
}
table.strike-table.rocket-table .st-hit-h1 { color: var(--hold-1d); }  /* 1日: 灰 */
table.strike-table.rocket-table .st-hit-h5 { color: var(--hold-5d); }  /* 5日及以上: 浅橙 */
table.strike-table.rocket-table .st-hit.st-hit-dual { background: var(--hit-dual-bg); }
/* 2026-06-07: 正交共识填底 — 按 source_models 里 distinct 模型种类数 (XGB/GRU/TRANSFORMER). 2 类淡黄, 3 类淡橙 */
table.strike-table.rocket-table .st-hit.st-hit-2class { background: #ffe3bc; }
table.strike-table.rocket-table .st-hit.st-hit-3class { background: #ffd9a8; }
/* 2026-06-07: 上面规则 scope 到 .rocket-table, 但 今日选股(picks)/纯量价(purevol) 表无此类 →
   加通用版让模型格 宽度/数字色/正交共识衬底 三处统一生效 (.st-hit 仅模型命中格用, 通用安全) */
.st-hit { width: 58px; max-width: 58px; min-width: 58px; text-align: center; font-variant-numeric: tabular-nums; }
.st-hit.st-hit-h1 { color: var(--hold-1d); }
.st-hit.st-hit-h5 { color: var(--hold-5d); }
.st-hit.st-hit-dual { background: var(--hit-dual-bg); }
.st-hit.st-hit-2class { background: #ffe3bc; }
.st-hit.st-hit-3class { background: #ffd9a8; }
table.strike-table.rocket-table th.st-th[data-sort^="source_models"] {
  text-align: center;
}
/* 2026-07-03: 正交汇总列 (2026-07-05 拆 5 日/10 日两列) — 模型命中的聚合视图 (最高正交类数 + 迷你趋势条),
   排序锚 ortho_score5 / ortho_score, 让"哪些票被多模型持续交叉确认"一键排到最前, 不用逐列数. */
.st-ortho { width: 74px; max-width: 74px; min-width: 74px; text-align: center; }
.st-ortho-label {
  display: inline-block;
  font-size: 11px;
  font-weight: 700;
  padding: 0 4px;
  border-radius: 3px;
  font-variant-numeric: tabular-nums;
}
.st-ortho-label.st-ortho-3 { background: #ffd9a8; color: #9a5a1a; }
.st-ortho-label.st-ortho-2 { background: #ffe3bc; color: #a8703a; }
.st-ortho-dots { display: flex; gap: 1px; justify-content: center; margin-top: 2px; }
.ortho-dot { width: 5px; height: 5px; border-radius: 1px; display: inline-block; background: var(--border); }
/* 2026-07-05: 无正交的天 (未入选/仅1类) 留透明空位, 不涂灰 (灰格易被误读成信号) */
.ortho-dot.ortho-dot-blank { background: transparent; }
.ortho-dot.ortho-dot-2 { background: #ffe3bc; }
.ortho-dot.ortho-dot-3 { background: #ffd9a8; }
table.strike-table.calc-table .calc-segment-cell {
  color: var(--text-2);
  max-width: none;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
body.view-ai_calc .wrap {
  max-width: min(2200px, 98vw);
}
.ai-calc-detail {
  max-width: none;
}
.ai-calc-table-card {
  /* 2026-06-26: 表头固定 — 卡片改成定高滚动窗 (横向/纵向都在窗内滚动), thead 钉窗顶.
     原来只 overflow-x:auto 是横滚容器, 会让 strike-table 继承的 sticky 失效 (表头随整页滚走);
     改 overflow:auto + max-height 后, 下方 calc-table 的 thead sticky(top:0) 正常钉在窗口顶部. */
  overflow: auto;
  max-height: calc(100vh - 120px);
}
/* calc 表头钉在滚动窗顶部: 覆盖 strike-table 默认 top:var(--tabs-h)(那是相对视口的全局 tab 偏移,
   在滚动窗内会留 38px 空隙错位); z-index 抬高确保盖住下方输入框/单元格, 不被滚上来的内容透出. */
table.strike-table.calc-table thead th {
  top: 0;
  z-index: 6;
}
table.strike-table.calc-table {
  /* 2026-06-25: +8 实时持仓同款财务列 (ROE/毛利/净利/单季yoy×4/FY+1预期) → 加宽 */
  min-width: 2520px;
  width: 100%;
}
table.strike-table.calc-table .calc-col-code { width: 84px; }
table.strike-table.calc-table .calc-col-name { width: 170px; }
table.strike-table.calc-table .calc-col-segment { width: 160px; }
table.strike-table.calc-table .calc-col-day { width: 68px; }
table.strike-table.calc-table .calc-col-ret5,
table.strike-table.calc-table .calc-col-ret10,
table.strike-table.calc-table .calc-col-ret30 { width: 64px; }
table.strike-table.calc-table .calc-col-pe0,
table.strike-table.calc-table .calc-col-pe1,
table.strike-table.calc-table .calc-col-pe2,
table.strike-table.calc-table .calc-col-pe3 { width: 64px; }
/* 2026-06-25: 实时持仓同款财务列宽度 (盈利组 + 增长组单季yoy + FY+1预期) */
table.strike-table.calc-table .calc-col-roe,
table.strike-table.calc-table .calc-col-gm,
table.strike-table.calc-table .calc-col-nm { width: 60px; }
table.strike-table.calc-table .calc-col-q1r,
table.strike-table.calc-table .calc-col-q1n,
table.strike-table.calc-table .calc-col-q2r,
table.strike-table.calc-table .calc-col-q2n { width: 90px; }
table.strike-table.calc-table .calc-col-consyoy { width: 78px; }
table.strike-table.calc-table .calc-col-tam,
table.strike-table.calc-table .calc-col-share,
table.strike-table.calc-table .calc-col-np,
table.strike-table.calc-table .calc-col-np26,
table.strike-table.calc-table .calc-col-petrad { width: 72px; }
table.strike-table.calc-table .calc-col-mv { width: 78px; }
table.strike-table.calc-table .calc-col-np2030,
table.strike-table.calc-table .calc-col-pe { width: 84px; }
table.strike-table.calc-table .calc-col-neo4j { width: auto; }
table.strike-table.calc-table td:nth-child(2),
table.strike-table.calc-table td:nth-child(3),
/* 2026-06-25: Neo4j摘要列因 +8 财务列从第 20 列移到第 28 列 */
table.strike-table.calc-table td:nth-child(28) {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
table.strike-table.calc-table .st-neo4j-cell {
  max-width: none;
  min-width: 420px;
}
table.strike-table .st-neo4j-cell {
  color: var(--text-2);
  /* 2026-05-22 用户要求: 单行截断, 行高统一; 鼠标 hover 通过 td.title 看全文 */
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 800px;
}
.strike-empty { padding: 36px 20px; text-align: center; color: var(--text-3); font-size: var(--fs-ui); }
.strike-downloads { margin: 24px 0 8px; padding: 12px 0; border: 0; border-radius: 0; background: transparent; }
.strike-downloads:empty { display: none; }
.strike-downloads .sd-title { font-size: var(--fs-ui); color: var(--text-2); font-weight: 600; margin-bottom: var(--sp-1); }
.strike-downloads .sd-hint { font-size: var(--fs-meta); color: var(--text-3); margin-bottom: 10px; }
.strike-downloads .sd-list { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
.strike-downloads .sd-item { display: inline-flex; align-items: center; gap: 6px; padding: 5px 11px; border: 1px solid var(--border-soft); border-radius: 14px; font-size: var(--fs-ui); color: var(--text-1); background: var(--bg-1); text-decoration: none; font-family: var(--font-mono); transition: border-color 0.15s, color 0.15s; }
.strike-downloads .sd-item:hover { color: var(--accent); border-color: var(--accent); text-decoration: none; }
.strike-downloads .sd-item.latest { border-color: var(--accent); color: var(--accent); }
.strike-downloads .sd-item .sd-tag { font-size: var(--fs-micro); color: var(--text-3); }
.strike-downloads .sd-empty { font-size: var(--fs-ui); color: var(--text-3); }
.strike-theme-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-3); }
@media (max-width: 640px) { .strike-theme-grid { grid-template-columns: 1fr; } }
.strike-theme-col h4 { font-size: var(--fs-meta); color: var(--text-2); margin: 0 0 8px; font-weight: 600; }
.strike-theme-list { font-size: var(--fs-meta); }
.strike-theme-list .st-row { display: flex; align-items: center; gap: var(--sp-2); padding: 4px 8px; border-bottom: 1px solid var(--border-soft); }
.strike-theme-list .st-row:last-child { border-bottom: 0; }
.strike-theme-list .st-rank { width: 28px; color: var(--text-3); font-family: var(--font-mono); font-size: var(--fs-meta); }
.strike-theme-list .st-theme { flex: 1; color: var(--text-1); }
.strike-theme-list .st-score { font-family: var(--font-mono); font-size: var(--fs-meta); }
.strike-theme-list .st-score.pos { color: var(--up); font-weight: 600; }
.strike-theme-list .st-score.neg { color: var(--dn); font-weight: 600; }
.strike-theme-list .st-meta { font-size: var(--fs-meta); color: var(--text-3); font-family: var(--font-mono); margin-left: 6px; }

/* ── 标题层级收敛 (2026-05-29 修 Bug#1): markdown / 区块 section 标题统一 title 档 ── */
.other-md h2, .modal-body h2,
.ml-section-h2 { font-size: var(--fs-title); }

/* Form inputs in data/search views keep the neutral paper border on focus. */
.tools input:focus,
.tools input:focus-visible,
.card-search-input:focus,
.card-search-input:focus-visible {
  border-color: var(--border);
  box-shadow: none;
}
#strike-search-container .card-search-input,
#strike-search-container .card-search-input:focus,
#strike-search-container .card-search-input:focus-visible,
#strike-pool-search-input,
#strike-pool-search-input:focus,
#strike-pool-search-input:focus-visible {
  border-color: var(--border);
  box-shadow: none;
  outline: none;
}
.calc-tbl-input:focus,
.calc-tbl-input:focus-visible,
.feed-tools input:focus,
.feed-tools input:focus-visible,
.feed-realtime-tools input:focus,
.feed-realtime-tools input:focus-visible {
  border-color: var(--border-soft);
  box-shadow: none;
}
