/* ===========================================================================
   涌现雷达 · 共享品牌样式表 (brand.css)
   涌现资本 · AI 产业与甜蜜资产雷达
   配色: 铜金 #c2903f / 柔铜 #e7c074 · 石墨黑 #0b0d11 / #15181e
        单一强调=铜金(青绿已退役) · 边框 #2a2f3a · 弱文字 #9aa3b2
   说明: 小而扁平·可被各页面 <link> 共享·新组件优先用这里的类。
   ========================================================================= */

:root {
  --brand-graphite:#0b0d11;
  --brand-graphite-2:#15181e;
  --brand-copper:#c2903f;
  --brand-copper-soft:#e7c074;
  /* 交互强调统一 --brand-copper(青绿信号 token 已于 R98R3 删除) */
  --brand-border:#2a2f3a;
  --brand-muted:#9aa3b2;
  --brand-ink:#e7e9ee;
}

/* ── 品牌字标锁定 (罗盘 + 文字) ───────────────────────────────────────── */
.brand-lockup { display:inline-flex; align-items:center; gap:9px; line-height:1.1; }
.brand-lockup svg { display:block; flex:none; }
.brand-name {
  font-weight:800; letter-spacing:.5px;
  background:linear-gradient(120deg, var(--brand-copper-soft) 0%, var(--brand-copper) 55%, #a7752c 100%);
  -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent;
}
.brand-tagline { color:var(--brand-muted); font-size:12px; line-height:1.5; }
.brand-org {
  color:var(--brand-copper); font-size:11px; font-weight:700;
  letter-spacing:.16em; text-transform:uppercase;
}

/* ── 统一品牌锁定 (纯图标 PNG + 网页文字标题/slogan) ─────────────────────
   全站统一: 左=纯雷达罗盘图标(无文字), 右=上下两行网页文字。
   图片只用 radar-logo-symbol.png(纯图标·无文字), 杜绝深色背景下文字伪影。 */
.radar-brand-lockup {
  display:inline-flex; align-items:center; gap:12px;
  text-decoration:none; line-height:1.05; min-width:0; max-width:100%;
}
.radar-brand-lockup:focus-visible {
  outline:none; border-radius:10px;
  box-shadow:0 0 0 3px rgba(194,144,63,.32);
}
.radar-brand-symbol {
  height:50px; width:50px; flex:none; display:block;
  object-fit:contain; object-position:center;
}
/* copy 列宽 = 标题宽(width:max-content),slogan stretch 到同宽后 justify 撑满 → 与"涌现雷达"同宽 */
.radar-brand-copy { display:flex; flex-direction:column; align-items:stretch; min-width:0; width:max-content; gap:2px; }
.radar-brand-title {
  font-family:"Songti SC","STSong","Noto Serif SC","Source Han Serif SC",serif;
  font-size:23px; font-weight:700; letter-spacing:.06em; white-space:nowrap;
  color:var(--brand-copper-soft);
}
/* slogan 字号小于标题→自然宽窄于标题;text-align-last:justify 把字间距撑到与标题等宽 */
.radar-brand-slogan {
  font-size:9.5px; font-weight:600; white-space:normal; word-break:keep-all;
  text-align:justify; text-align-last:justify;
  color:var(--brand-copper); opacity:.82;
}
/* 抽屉头部稍小 */
.radar-brand-lockup--drawer .radar-brand-symbol { height:40px; width:40px; }
.radar-brand-lockup--drawer .radar-brand-title { font-size:19px; }
.radar-brand-lockup--drawer .radar-brand-slogan { font-size:8.5px; }
/* 移动端: 整组 logo 比桌面略小但放大到可读(2026-06-23 用户要求 +20%·slogan 小字看清) */
@media (max-width:639px) {
  .radar-brand-lockup { gap:11px; }
  .radar-brand-symbol { height:48px; width:48px; }
  .radar-brand-title { font-size:23px; letter-spacing:.04em; }
  .radar-brand-slogan { font-size:10px; }
}

/* ===========================================================================
   全站统一页眉(.site-bar)· 频道页与首页页眉完全一致
   品牌锁定 + pill 导航(雷达/持仓体检/投资框架/Serenity/研报中心),pill 值对齐首页。
   研报中心(暖纸主题·跳出整站)永远放最后一个。
   ========================================================================= */
.site-bar { position:sticky; top:0; z-index:30; border-bottom:1px solid var(--surface-border); background:rgba(17,19,24,.82); backdrop-filter:blur(8px); -webkit-backdrop-filter:blur(8px); }
.site-bar-inner { max-width:80rem; margin:0 auto; padding:10px 16px; display:flex; align-items:center; justify-content:space-between; gap:10px; }
.site-bar-left { display:flex; align-items:center; gap:12px; min-width:0; flex:1; overflow-x:auto; scrollbar-width:none; }
.site-bar-left::-webkit-scrollbar { display:none; }
.site-bar .radar-brand-lockup { flex:none; }
.site-nav { display:flex; align-items:center; gap:4px; flex:none; }
.site-nav-pill {
  display:inline-flex; align-items:center; gap:6px; padding:6px 10px; border-radius:8px;
  font-size:12px; font-weight:600; white-space:nowrap; text-decoration:none; flex:none;
  border:1px solid var(--brand-border); background:var(--brand-graphite-2); color:var(--brand-copper-soft);
  transition:filter .15s, border-color .15s;
}
.site-nav-pill:hover { filter:brightness(1.12); }
.site-nav-pill .dot { width:6px; height:6px; border-radius:50%; background:var(--brand-copper); flex:none; }
.site-nav-pill.is-active { border-color:var(--brand-copper); background:rgba(194,144,63,.14); font-weight:700; cursor:default; }
.site-bar-right { display:flex; align-items:center; gap:8px; flex:none; }
.site-bar-link {
  display:inline-flex; align-items:center; gap:6px; padding:6px 10px; border-radius:8px;
  font-size:12px; font-weight:600; white-space:nowrap; text-decoration:none; flex:none;
  border:1px solid var(--brand-border); background:var(--brand-graphite-2); color:var(--brand-copper-soft);
  transition:filter .15s, border-color .15s;
}
.site-bar-link:hover { filter:brightness(1.12); border-color:var(--brand-copper); }
.site-bar-link svg { width:14px; height:14px; flex:none; }

/* ── 卡片面板 ──────────────────────────────────────────────────────────── */
.brand-card {
  background:linear-gradient(180deg, var(--brand-graphite-2), var(--brand-graphite));
  border:1px solid var(--brand-border);
  border-radius:8px;
  box-shadow:none;
}

/* ── 按钮 ──────────────────────────────────────────────────────────────── */
.brand-btn {
  display:inline-flex; align-items:center; justify-content:center; gap:6px;
  background:#1c222b; color:var(--brand-copper-soft); border:1px solid var(--brand-copper); border-radius:8px;
  padding:12px 18px; font-size:15px; font-weight:700; cursor:pointer;
  transition:background .15s, border-color .15s, color .15s; font-family:inherit;
}
.brand-btn:hover:not(:disabled) { background:#232a35; border-color:var(--brand-copper-soft); color:#fff; }
.brand-btn:active:not(:disabled) { transform:translateY(0); }
.brand-btn:disabled { opacity:.5; cursor:not-allowed; }

.brand-btn-ghost {
  display:inline-flex; align-items:center; justify-content:center; gap:6px;
  background:var(--brand-graphite-2); color:var(--brand-copper-soft);
  border:1px solid var(--brand-border); border-radius:8px;
  padding:11px 18px; font-size:14px; font-weight:600; cursor:pointer;
  transition:border-color .15s, color .15s, background .15s; font-family:inherit;
}
.brand-btn-ghost:hover:not(:disabled) { border-color:var(--brand-copper); color:#fff; }

/* ── 芯片 / 徽标 (统一圆角·内距·字重) ──────────────────────────────────── */
.brand-chip, .brand-badge {
  display:inline-block;
  background:var(--brand-graphite-2);
  color:var(--brand-muted);
  border:1px solid var(--brand-border);
  border-radius:9px;
  padding:3px 10px;
  font-size:11.5px;
  font-weight:600;
  letter-spacing:.02em;
  white-space:nowrap;
}
.brand-chip.is-active {
  background:rgba(194,144,63,.16);
  color:var(--brand-copper-soft);
  border-color:var(--brand-copper);
}

/* ── 分隔线 / 强调文字 / 信号 ──────────────────────────────────────────── */
.brand-hairline { border:none; border-top:1px solid var(--brand-copper); opacity:.35; margin:16px 0; }
.brand-accent { color:var(--brand-copper); }
.signal { color:var(--brand-copper); }

/* ── 输入聚焦: 青绿信号环 ──────────────────────────────────────────────── */
.brand-input:focus {
  outline:none;
  border-color:var(--brand-copper);
  box-shadow:0 0 0 3px rgba(194,144,63,.20);
}

/* ── v2 Design Tokens (2026-06-22) ──────────────────────────────────────── */
/* Warm graphite — replaces pure black for work-surface bg */
:root {
  --surface-bg: #111318;          /* warm graphite, not pure black */
  --surface-1: #1a1e27;           /* card/panel layer 1 */
  --surface-2: #212633;           /* card/panel layer 2 */
  --surface-border: #2d3340;      /* unified border */

  /* Report reading paper */
  --paper-bg: #f5f0e8;            /* ivory warm */
  --paper-surface: #faf7f2;       /* card on paper */
  --paper-border: #e0d5c4;        /* warm border on paper */
  --paper-ink: #1e2730;           /* primary text on paper */
  --paper-ink-muted: #5a6470;     /* secondary text on paper */

  /* Status tokens — the ONLY colors allowed for semantic states */
  --status-bull: #3fb37f;         /* green: opportunity/positive (金融语义·非品牌装饰) */
  --status-bull-bg: rgba(63,179,127,.12);
  --status-bull-border: rgba(63,179,127,.30);
  --status-bear: #d64f44;         /* warm red: risk/danger */
  --status-bear-bg: rgba(214,79,68,.10);
  --status-bear-border: rgba(214,79,68,.28);
  --status-caution: #c2903f;      /* copper: caution/watch */
  --status-caution-bg: rgba(194,144,63,.10);
  --status-caution-border: rgba(194,144,63,.28);
  --status-neutral: #3d4759;      /* neutral state */

  /* Brand accent — copper, but scoped to brand/selection only */
  --accent: #c2903f;
  --accent-soft: #e7c074;

  /* Menu surface — slightly lifted from bg */
  --menu-surface: #181c24;
  --menu-hover: #20263380;
  --menu-item-border: #2a2f3a;
}

/* ── Unified button system ──────────────────────────────────────────────── */
.btn-primary {
  display:inline-flex; align-items:center; justify-content:center; gap:6px;
  background:#1c222b; color:var(--brand-copper-soft); border:1px solid var(--brand-copper); border-radius:6px;
  padding:8px 16px; font-size:13px; font-weight:700; cursor:pointer;
  transition:background .15s, border-color .15s, color .15s; font-family:inherit; white-space:nowrap;
}
.btn-primary:hover:not(:disabled) { background:#232a35; border-color:var(--brand-copper-soft); color:#fff; }
.btn-primary:active:not(:disabled) { transform:translateY(0); }
.btn-primary:disabled { opacity:.45; cursor:not-allowed; }

.btn-secondary {
  display:inline-flex; align-items:center; justify-content:center; gap:6px;
  background:transparent; color:var(--accent-soft);
  border:1px solid var(--surface-border); border-radius:8px;
  padding:7px 14px; font-size:13px; font-weight:600; cursor:pointer;
  transition:border-color .15s, color .15s, background .15s; font-family:inherit; white-space:nowrap;
}
.btn-secondary:hover:not(:disabled) { border-color:var(--accent); color:#fff; background:rgba(194,144,63,.08); }

.btn-ghost {
  display:inline-flex; align-items:center; justify-content:center; gap:5px;
  background:transparent; color:var(--brand-muted);
  border:1px solid var(--surface-border); border-radius:8px;
  padding:6px 12px; font-size:12px; font-weight:600; cursor:pointer;
  transition:border-color .15s, color .15s; font-family:inherit; white-space:nowrap;
}
.btn-ghost:hover:not(:disabled) { border-color:#4d5568; color:var(--brand-ink); }

.btn-danger {
  display:inline-flex; align-items:center; justify-content:center; gap:5px;
  background:transparent; color:#e87070;
  border:1px solid rgba(214,79,68,.35); border-radius:8px;
  padding:6px 12px; font-size:12px; font-weight:600; cursor:pointer;
  transition:border-color .15s, color .15s, background .15s; font-family:inherit; white-space:nowrap;
}
.btn-danger:hover:not(:disabled) { background:rgba(214,79,68,.12); border-color:rgba(214,79,68,.6); color:#ff8a7a; }

/* ── Menu drawer items — unified, no rainbow ───────────────────────────── */
.menu-item {
  width:100%; display:flex; align-items:center; gap:12px; text-align:left;
  padding:10px 12px; min-height:52px; border-radius:8px;
  border:1px solid var(--menu-item-border);
  background:transparent; color:var(--brand-ink);
  cursor:pointer; text-decoration:none;
  transition:background .15s, border-color .15s;
}
.menu-item:hover, .menu-item:active { background:var(--menu-hover); border-color:#3d4759; }
.menu-item .mi-icon {
  flex:none; width:36px; height:36px; border-radius:8px;
  display:flex; align-items:center; justify-content:center;
  background:rgba(194,144,63,.10); color:var(--accent-soft);
}
.menu-item .mi-label { font-size:14.5px; font-weight:600; color:var(--brand-ink); }
.menu-item .mi-desc { font-size:11.5px; color:var(--brand-muted); margin-top:2px; }
.menu-item .mi-arrow { margin-left:auto; color:#4d5568; flex:none; }
.menu-item.is-accent { border-color:rgba(194,144,63,.22); }
.menu-item.is-accent .mi-icon { background:rgba(194,144,63,.14); color:var(--accent-soft); }

/* Status: bull/bear/caution for detail panel */
.status-bull { background:var(--status-bull-bg); border:1px solid var(--status-bull-border); border-radius:8px; }
.status-bear { background:var(--status-bear-bg); border:1px solid var(--status-bear-border); border-radius:8px; }
.status-caution { background:var(--status-caution-bg); border:1px solid var(--status-caution-border); border-radius:8px; }

/* ── Report paper reading styles (shared, loaded by report pages) ──────── */
.rp-body { background:var(--paper-bg); color:var(--paper-ink); }
.rp-wrap { background:var(--paper-surface); box-shadow:0 0 32px rgba(0,0,0,.07); }
.rp-actbar {
  background:#1a1e27; display:flex; align-items:center; gap:8px;
  padding:9px 14px; border-bottom:1px solid #2a2f3a; flex-wrap:wrap;
}
.rp-hero {
  background:linear-gradient(155deg,#1a1e27 0%,#212633 60%,#241a0e 100%);
  color:#fff; padding:28px 22px 24px;
  border-bottom:3px solid rgba(194,144,63,.30);
}
.rp-h2 {
  font-size:19px; color:var(--paper-ink); margin:28px 0 14px;
  padding:0 0 8px; border-bottom:2px solid var(--paper-border);
  font-weight:700;
}
.rp-h2-accent {
  font-size:19px; color:var(--paper-ink); margin:28px 0 14px;
  padding:8px 0 8px 14px; border-left:4px solid var(--accent);
  font-weight:700; border-bottom:1px solid var(--paper-border);
}

/* ===========================================================================
   R98 Round 4 — 统一暗色工作台壳层 (app-shell)
   所有暗色产品页(login/register/index/score/framework/serenity/stats/admin)
   共用同一套 warm-graphite 外观。研报 warm-paper 系统 (.rp-*) 不受影响。
   ========================================================================= */
.app-shell {
  background:
    radial-gradient(1100px 520px at 50% -160px, rgba(194,144,63,.06), transparent 70%),
    var(--surface-bg);
  color:var(--brand-ink);
  min-height:100vh;
  font-family:"PingFang SC","Hiragino Sans GB","Microsoft YaHei",system-ui,-apple-system,sans-serif;
  -webkit-text-size-adjust:100%;
}
.app-page { max-width:1080px; margin:0 auto; padding:18px 16px 48px; }
.app-page.narrow { max-width:600px; }
.app-center { min-height:100vh; display:flex; align-items:center; justify-content:center; padding:24px 16px; }

/* 顶栏: 品牌锁定 + 标题 + 返回/导航 */
.app-topbar {
  position:sticky; top:0; z-index:30;
  background:rgba(17,19,24,.88); backdrop-filter:blur(10px); -webkit-backdrop-filter:blur(10px);
  border-bottom:1px solid var(--surface-border);
  display:flex; align-items:center; gap:12px; padding:10px 16px;
}
.app-topbar .tb-title { font-size:15px; font-weight:800; color:var(--brand-ink); line-height:1.2; }
.app-topbar .tb-sub { font-size:11.5px; color:var(--brand-muted); margin-top:1px; }
.app-topbar .tb-spacer { flex:1 1 auto; }
.app-back { color:var(--accent-soft); text-decoration:none; font-size:13px; font-weight:600; white-space:nowrap; }
.app-back:hover { color:#fff; }

/* 面板 / 卡片 / KPI */
.app-panel { background:var(--surface-1); border:1px solid var(--surface-border); border-radius:8px; padding:18px; }
.app-card  { background:var(--surface-2); border:1px solid var(--surface-border); border-radius:8px; padding:14px; }
.app-kpi   { background:var(--surface-2); border:1px solid var(--surface-border); border-radius:8px; padding:14px 16px; }
.app-kpi .v { font-size:26px; font-weight:800; color:var(--brand-ink); line-height:1.1; }
.app-kpi .l { font-size:12px; color:var(--brand-muted); margin-top:4px; }

/* 芯片 / 分段 */
.app-chip {
  display:inline-flex; align-items:center; gap:6px;
  background:var(--surface-2); color:var(--brand-muted);
  border:1px solid var(--surface-border); border-radius:999px;
  padding:5px 12px; font-size:12.5px; font-weight:600; white-space:nowrap;
  cursor:pointer; transition:border-color .15s, color .15s, background .15s; font-family:inherit;
}
.app-chip:hover { border-color:#4d5568; color:var(--brand-ink); }
.app-chip.is-active { background:var(--status-caution-bg); color:var(--accent-soft); border-color:var(--status-caution-border); }

/* 表单 */
.app-input {
  width:100%; background:#0f1217; border:1px solid var(--surface-border); border-radius:8px;
  color:var(--brand-ink); padding:11px 14px; font-size:15px; font-family:inherit;
  outline:none; transition:border-color .15s, box-shadow .15s;
}
.app-input:focus { border-color:var(--accent); box-shadow:0 0 0 3px rgba(194,144,63,.22); }
.app-input::placeholder { color:#5a6678; }
.app-label { display:block; font-size:12px; font-weight:600; color:var(--brand-muted); margin-bottom:6px; letter-spacing:.02em; }

/* 空状态 */
.app-empty {
  text-align:center; color:var(--brand-muted); padding:40px 20px;
  border:1px dashed var(--surface-border); border-radius:8px; background:rgba(255,255,255,.012);
}
.app-empty .ae-mark {
  width:40px; height:40px; margin:0 auto 12px; border-radius:11px;
  display:flex; align-items:center; justify-content:center;
  background:rgba(194,144,63,.10); color:var(--accent-soft);
}
.app-empty .ae-title { font-size:14.5px; font-weight:700; color:var(--brand-ink); }
.app-empty .ae-desc { font-size:12.5px; margin-top:5px; line-height:1.55; }

/* 状态徽章 (文字标签·克制语义色·替代 emoji) */
.app-badge {
  display:inline-flex; align-items:center; gap:5px;
  font-size:11.5px; font-weight:700; border-radius:7px; padding:2px 9px;
  border:1px solid var(--surface-border); background:var(--surface-2); color:var(--brand-muted); white-space:nowrap;
}
.app-badge.is-bull { background:var(--status-bull-bg); border-color:var(--status-bull-border); color:var(--status-bull); }
.app-badge.is-bear { background:var(--status-bear-bg); border-color:var(--status-bear-border); color:#e87a70; }
.app-badge.is-caution { background:var(--status-caution-bg); border-color:var(--status-caution-border); color:var(--accent-soft); }
/* 小型 CSS 状态点 (替代 emoji 圆点) */
.app-dot { display:inline-block; width:7px; height:7px; border-radius:50%; background:var(--brand-muted); flex:none; }
.app-dot.bull { background:var(--status-bull); } .app-dot.bear { background:var(--status-bear); }
.app-dot.caution { background:var(--status-caution); }

/* 按钮别名 (与 .btn-* 同义·满足 app-* 命名一致性) */
.app-btn-primary {
  display:inline-flex; align-items:center; justify-content:center; gap:6px; white-space:nowrap;
  background:#1c222b; color:var(--accent-soft);
  border:1px solid var(--accent); border-radius:6px; padding:9px 16px; font-size:14px; font-weight:700;
  cursor:pointer; transition:background .15s, border-color .15s, color .15s; font-family:inherit;
}
.app-btn-primary:hover:not(:disabled) { background:#232a35; border-color:var(--accent-soft); color:#fff; }
.app-btn-primary:disabled { opacity:.45; cursor:not-allowed; }
.app-btn-secondary {
  display:inline-flex; align-items:center; justify-content:center; gap:6px; white-space:nowrap;
  background:transparent; color:var(--accent-soft);
  border:1px solid var(--surface-border); border-radius:8px; padding:8px 14px; font-size:13px; font-weight:600;
  cursor:pointer; transition:border-color .15s, color .15s, background .15s; font-family:inherit;
}
.app-btn-secondary:hover:not(:disabled) { border-color:var(--accent); color:#fff; background:rgba(194,144,63,.08); }
.app-btn-danger {
  display:inline-flex; align-items:center; justify-content:center; gap:6px; white-space:nowrap;
  background:transparent; color:#e87070;
  border:1px solid rgba(214,79,68,.35); border-radius:8px; padding:8px 14px; font-size:13px; font-weight:600;
  cursor:pointer; transition:border-color .15s, color .15s, background .15s; font-family:inherit;
}
.app-btn-danger:hover:not(:disabled) { background:rgba(214,79,68,.12); border-color:rgba(214,79,68,.6); color:#ff8a7a; }

/* ===========================================================================
   R98 Workspace — design-token foundation (Private Investment Intelligence)
   单一来源·颜色不再散落到各页面。深色工作台 + 暖纸研报双主题结构。
   参考密度: Koyfin / TradingView。克制·细分割线替代阴影·单一铜金强调色。
   ========================================================================= */
:root {
  /* 间距系统 (8px 基) */
  --sp-1:4px; --sp-2:8px; --sp-3:12px; --sp-4:16px; --sp-5:20px; --sp-6:24px; --sp-8:32px; --sp-10:40px;
  /* 圆角 (克制·不要过大圆角) */
  --r-xs:4px; --r-sm:6px; --r-md:8px; --r-lg:10px; --r-xl:12px;  /* R98R2: 主 UI 收敛到 4/6/8·lg/xl 仅 modal/drawer */
  /* 文本层级 */
  --text-1:#e7e9ee;        /* 主文本/数字 */
  --text-2:#aab2c0;        /* 次文本 */
  --text-3:#7a8494;        /* 标签/弱文本 */
  --text-faint:#5a6474;    /* 最弱/占位 */
  /* 细分割线 (替代大量阴影) */
  --hairline:#23282f;
  /* 数据表 (Koyfin/TradingView 密度) */
  --table-head:#161a22;
  --table-row-alt:rgba(255,255,255,.014);
  --table-row-hover:rgba(194,144,63,.06);
  --table-row-selected:rgba(194,144,63,.12);
  --table-divider:#23282f;
  /* 语义涨跌/风险 — 仅用于数据·绝不做装饰 */
  --pos:#3fb37f; --pos-soft:#7fd9ac;
  --neg:#e0655b; --neg-soft:#f0938b;
  --warn:#d99a3a;
  /* 焦点环 (键盘可达性·青绿信号) */
  --focus-ring:0 0 0 3px rgba(194,144,63,.32);  /* 铜金·非青绿 */
}
/* 浅色主题结构 hook (研报已用 --paper-*; 工作台默认深色·预留切换) */
[data-theme="light"] {
  --surface-bg:#f5f0e8; --surface-1:#ffffff; --surface-2:#faf7f2; --surface-border:#e0d5c4;
  --text-1:#1e2730; --text-2:#46505c; --text-3:#6a7480; --hairline:#e6ddcd;
  --table-head:#f0ebe0; --table-row-hover:rgba(194,144,63,.08); --table-row-selected:rgba(194,144,63,.14);
}

/* 等宽数字 — 表格/价格/估值对齐 */
.tabular, .num, .price, td.num { font-variant-numeric:tabular-nums; font-feature-settings:"tnum" 1; }
/* 细分割线工具类 */
.hairline-t { border-top:1px solid var(--hairline); }
.hairline-b { border-bottom:1px solid var(--hairline); }
/* 涨跌/风险语义文字 */
.v-pos { color:var(--pos); } .v-neg { color:var(--neg); } .v-warn { color:var(--warn); }

/* 统一键盘焦点环 (渐进披露·可达性) */
.app-input:focus-visible, .app-chip:focus-visible, .app-btn-primary:focus-visible,
.app-btn-secondary:focus-visible, .app-btn-danger:focus-visible,
.btn-primary:focus-visible, .btn-secondary:focus-visible, .btn-ghost:focus-visible {
  outline:none; box-shadow:var(--focus-ring);
}

/* ── Koyfin 风格数据表 (紧凑·列对齐·hover/selected/focus 明确) ───────────── */
.kf-table { width:100%; border-collapse:collapse; font-variant-numeric:tabular-nums; }
.kf-table thead th {
  position:sticky; top:0; z-index:1; background:var(--table-head); color:var(--text-3);
  font-size:11px; font-weight:700; letter-spacing:.04em; text-transform:uppercase; text-align:left;
  padding:8px 12px; border-bottom:1px solid var(--table-divider); white-space:nowrap;
}
.kf-table thead th.r, .kf-table tbody td.r { text-align:right; }
.kf-table tbody td { padding:9px 12px; border-bottom:1px solid var(--table-divider); color:var(--text-1); font-size:13px; vertical-align:middle; }
.kf-table tbody tr { cursor:pointer; transition:background .12s; }
.kf-table tbody tr:nth-child(even) { background:var(--table-row-alt); }
.kf-table tbody tr:hover { background:var(--table-row-hover); }
.kf-table tbody tr.is-selected { background:var(--table-row-selected); box-shadow:inset 2px 0 0 var(--accent); }
.kf-table tbody tr:focus-visible { outline:none; background:var(--table-row-hover); box-shadow:inset 0 0 0 1px var(--accent); }

/* ── 命令/工具条 (顶部命令区·细线分隔·非卡片) ──────────────────────────── */
.cmdbar { display:flex; align-items:center; gap:var(--sp-2); padding:var(--sp-2) var(--sp-4); border-bottom:1px solid var(--hairline); background:rgba(17,19,24,.7); }
.cmdbar .seg { flex:1 1 auto; }

/* ── 风险条 (组合体检·解释力·不卡通) ───────────────────────────────────── */
.riskbar { height:6px; border-radius:3px; background:var(--surface-2); overflow:hidden; }
.riskbar > span { display:block; height:100%; border-radius:3px; transition:width .25s; }

/* ── 统一状态: loading / empty / error ─────────────────────────────────── */
.state-loading { display:inline-flex; align-items:center; gap:8px; color:var(--text-3); font-size:13px; }
.spinner { width:16px; height:16px; border:2px solid var(--surface-border); border-top-color:var(--accent); border-radius:50%; animation:spin .8s linear infinite; flex:none; }
@keyframes spin { to { transform:rotate(360deg); } }
.state-error { color:var(--neg); font-size:13px; }
