/* hy.css — dboqo 统一样式表 · 设计系统 */

/* ------------------------------------------------------------------ */
/* 自托管字体 (variable woff2, latin; CJK 走系统字体回退)              */
/* ------------------------------------------------------------------ */
@font-face { font-family: 'Inter'; font-style: normal; font-weight: 100 900; font-display: swap; src: url("../fonts/inter.260c81a4759b.woff2") format('woff2'); }
@font-face { font-family: 'Space Grotesk'; font-style: normal; font-weight: 300 700; font-display: swap; src: url("../fonts/space-grotesk.87c506d88b9f.woff2") format('woff2'); }
@font-face { font-family: 'JetBrains Mono'; font-style: normal; font-weight: 100 800; font-display: swap; src: url("../fonts/jetbrains-mono.b058178d7f30.woff2") format('woff2'); }

/* ------------------------------------------------------------------ */
/* CSS Variables — dboqo 设计令牌                                       */
/* 纪律: ~90% 中性基底 + ~10% 薄荷强调; 强调色仅一个 (品牌薄荷)         */
/* ------------------------------------------------------------------ */
:root {
  /* 基底与表面 — 近黑冷调 */
  --bg-primary: #0B0E14;
  --bg-secondary: #11161F;
  --bg-tertiary: #1A212C;
  --bg-card: #11161F;
  --bg-hover: #1A212C;
  --bg-sidebar: #0B0E14;
  --bg-code: #0E1117;
  --text-code: #9BA6B4;
  --border: #232B36;
  --border-light: #1A212C;

  /* 文本 — 冷灰阶 */
  --text-primary: #E6EAF0;
  --text-secondary: #9BA6B4;
  --text-muted: #5E6675;
  --text-link: #34D399;

  /* 品牌强调 — 薄荷绿 (克制: CTA/链接/激活/焦点/关键数据) */
  --accent: #34D399;
  --accent-2: #10B981;
  --accent-weak: rgba(52, 211, 153, 0.12);
  /* 旧 --blue 语义并入品牌薄荷 (主按钮/焦点/信息全站统一一个强调色) */
  --blue: #34D399;
  --blue-bg: rgba(52, 211, 153, 0.12);
  --border-focus: #34D399;
  /* -rgb 分量 (供 rgba(var(--X-rgb), a) 用; 各页内联样式引用) */
  --accent-rgb: 52, 211, 153;
  --blue-rgb: 52, 211, 153;
  --green-rgb: 46, 189, 133;
  --red-rgb: 246, 70, 93;
  --yellow-rgb: 227, 160, 8;

  /* 交易语义 — 收敛不刺眼 */
  --green: #2EBD85;
  --green-bright: #34D399;
  --green-bg: rgba(46, 189, 133, 0.14);
  --up: #2EBD85;
  --red: #F6465D;
  --red-bright: #FF6B7A;
  --red-bg: rgba(246, 70, 93, 0.14);
  --down: #F6465D;
  --yellow: #E3A008;
  --yellow-bg: rgba(227, 160, 8, 0.14);
  --warn: #E3A008;

  /* 图表分类色 — 仅用于多系列数据, 与冷色基底协调 */
  --purple: #A78BFA;
  --purple-bg: rgba(167, 139, 250, 0.14);
  --cyan: #22D3EE;
  --cyan-bg: rgba(34, 211, 238, 0.14);
  --orange: #F59E42;
  --orange-bg: rgba(245, 158, 66, 0.14);

  --sidebar-width: 220px;
  --topbar-height: 56px;
  --font-display: 'Space Grotesk', 'Inter', system-ui, 'PingFang SC', 'Microsoft YaHei', sans-serif;
  --font-sans: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', Roboto, sans-serif;
  --font-mono: 'JetBrains Mono', 'SF Mono', 'Fira Code', 'Cascadia Code', ui-monospace, monospace;
  --radius: 6px;
  /* Logo 圆角比 52/240≈0.217; 前台按钮圆角与此同源 (仅 .site-public 使用, 不覆盖后台) */
  --radius-logo-ratio: 0.2167;
  --radius-btn: 8px;      /* ~36px 高按钮 */
  --radius-btn-sm: 7px;   /* ~30px 高 */
  --radius-btn-lg: 10px;  /* ~48px 高 */
  --transition: 0.15s ease;

  /* 排版阶 — 统一字号单一源（密度优先 / 缩小字号版，前后台+V3 对齐）
     html 基数 ≈15px (var(--text-md)); 禁止业务 CSS 写裸 rem/px。
     映射约定: ≤0.74→xs · 0.75–0.84→sm · 0.85–0.94→base · 0.95–1.04→md · 更大→lg+ */
  --text-xs: 0.625rem;    /* ~10px — 极小：徽标/标签/密表辅助 */
  --text-sm: 0.75rem;     /* ~12px — 小号：说明/次要元数据/密表正文 */
  --text-base: 0.875rem;  /* ~14px — 正文基准：面板/控件 */
  --text-md: 0.938rem;    /* ~15px — 中等：导航/按钮/标签 */
  --text-lg: 1.125rem;    /* ~18px — 小标题/卡片标题 */
  --text-xl: 1.25rem;     /* ~20px — 页面标题/KPI */
  --text-2xl: 1.5rem;     /* ~24px — Hero 数值 */
  --text-3xl: 2rem;       /* ~32px — 主标题/空状态 */
  /* V3 操作台移动端整体密度（只缩继承字号；显式 token rem 仍相对 html） */
  --hyv3-density: 0.84rem;        /* ≤760px shell */
  --hyv3-density-tight: 0.8rem;   /* ≤560px shell */

  /* 间距阶 — 4px 基数（新代码强制；存量分批替换） */
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-5: 24px;
  --space-6: 32px;
  --space-7: 40px;
  --space-8: 48px;
  --radius-pill: 999px;
}

[data-theme="light"] {
  --bg-primary: #FFFFFF;
  --bg-secondary: #F6F8FA;
  --bg-tertiary: #F0F2F5;
  --bg-card: #FFFFFF;
  --bg-hover: #EEF1F4;
  --bg-sidebar: #F6F8FA;
  --bg-code: #F0F2F5;
  --text-code: #475467;
  --border: #E4E9EF;
  --border-light: #EDF1F5;
  --text-primary: #0B0E14;
  --text-secondary: #5E6675;
  --text-muted: #8B95A3;
  /* 薄荷在白底降深, 保证文字/链接对比 (填充仍可用亮薄荷) */
  --text-link: #0F9D6B;
  --accent: #10B981;
  --accent-2: #0F9D6B;
  --accent-weak: rgba(16, 185, 129, 0.10);
  --blue: #10B981;
  --blue-bg: rgba(16, 185, 129, 0.10);
  --border-focus: #10B981;
  --accent-rgb: 16, 185, 129;
  --blue-rgb: 16, 185, 129;
  --green-rgb: 21, 160, 107;
  --red-rgb: 229, 72, 77;
  --yellow-rgb: 183, 121, 31;
  --green: #15A06B;
  --green-bright: #10B981;
  --green-bg: rgba(21, 160, 107, 0.12);
  --up: #15A06B;
  --red: #E5484D;
  --red-bright: #D93843;
  --red-bg: rgba(229, 72, 77, 0.10);
  --down: #E5484D;
  --yellow: #B7791F;
  --yellow-bg: rgba(183, 121, 31, 0.12);
  --warn: #B7791F;
  --purple: #7C5CFC;
  --purple-bg: rgba(124, 92, 252, 0.10);
  --cyan: #0E9BAA;
  --cyan-bg: rgba(14, 155, 170, 0.10);
  --orange: #C2620E;
  --orange-bg: rgba(194, 98, 14, 0.10);
}

/* ------------------------------------------------------------------ */
/* Reset & Base                                                        */
/* ------------------------------------------------------------------ */
*,
*::before,
*::after {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

/* a11y: 跳到主内容 (键盘焦点时才出现; 视觉走 .btn-primary) */
.skip-link { position: absolute; left: 8px; top: -60px; z-index: 200; transition: top 0.15s ease; }
.skip-link:focus { top: 8px; }

html { font-size: var(--text-md); }

/* 主题切换期间前台所有可视组件同一帧换色；两帧后 JS 移除该类，hover 动效恢复。 */
html.theme-switching .site-public,
html.theme-switching .site-public *,
html.theme-switching .site-public *::before,
html.theme-switching .site-public *::after {
  transition-duration: 0s !important;
  transition-delay: 0s !important;
}

body {
  font-family: var(--font-sans);
  background: var(--bg-primary);
  color: var(--text-primary);
  line-height: 1.5;
  min-height: 100vh;
  font-size: var(--text-md);
  overflow-x: hidden;
}

a { color: var(--text-link); text-decoration: none; }
a:hover { text-decoration: underline; }

/* ------------------------------------------------------------------ */
/* Topbar                                                              */
/* ------------------------------------------------------------------ */
.topbar {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: var(--topbar-height);
  background: var(--bg-secondary);
  border-bottom: 1px solid var(--border);
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 16px;
  z-index: 100;
  flex-wrap: nowrap;
  /* 不裁剪: 主题下拉菜单需溢出 topbar 显示 (高度已 fixed, 不会被内容撑大) */
  overflow: visible;
  gap: 6px;
}

.topbar-left {
  display: flex;
  align-items: center;
  gap: 16px;
  flex-wrap: nowrap;
  min-width: 0;
}

.topbar-logo {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  font-weight: 600;
  font-size: var(--text-xl);
  font-family: var(--font-display);
  color: var(--text-primary);
  letter-spacing: -0.3px;
}
.topbar-logo:hover {
  text-decoration: none;
  color: var(--text-link);
}

.topbar-badge {
  font-size: var(--text-xs);
  padding: 2px 10px;
  border-radius: 12px;
  background: rgba(52, 211, 153, 0.1);
  color: var(--blue);
  margin-left: 10px;
  font-weight: 500;
  letter-spacing: 0.02em;
  border: 1px solid rgba(52, 211, 153, 0.2);
}

.site-notice-banner {
  position: relative;
  z-index: 110;
  min-height: 44px;
  padding: 8px 56px 8px 18px;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #07140f;
  background: linear-gradient(90deg, var(--accent-2), var(--accent));
  border-bottom: 1px solid #6ee7b7;
  font-size: var(--text-sm);
}
.site-notice-banner--maintenance {
  color: #07140f;
  background: linear-gradient(90deg, #0f9d6b, var(--accent));
  border-bottom-color: #6ee7b7;
}
.site-notice-banner__content {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  min-width: 0;
}
.site-notice-banner__label { font-weight: 700; white-space: nowrap; }
.site-notice-banner__message { color: inherit; }
.site-notice-banner__link {
  text-decoration: underline;
  text-underline-offset: 3px;
  font-weight: 600;
}
.site-notice-banner__link:hover { color: #07140f; }
.site-notice-banner__time { font-family: var(--font-mono); white-space: nowrap; }
.site-notice-banner__close {
  position: absolute;
  top: 50%;
  right: 16px;
  width: 32px;
  height: 32px;
  transform: translateY(-50%);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 0;
  border-radius: 6px;
  color: inherit;
  background: transparent;
  font-size: var(--text-2xl);
  line-height: 1;
  cursor: pointer;
}
.site-notice-banner__close:hover,
.site-notice-banner__close:focus-visible { background: rgba(7, 20, 15, 0.12); outline: none; }
.site-public.has-site-notice .topbar {
  position: sticky;
  top: 0;
}
.site-public.has-site-notice .subtab-bar {
  position: sticky;
  top: var(--topbar-height);
}
.site-public.has-site-notice .main-content,
.site-public.has-site-notice.has-subtab .main-content {
  margin-top: 0;
}

/* 节点角色徽章 */
.node-badge {
  font-size: var(--text-xs);
  padding: 2px 10px;
  border-radius: 12px;
  margin-left: 8px;
  font-weight: 600;
  letter-spacing: 0.02em;
  white-space: nowrap;
}
.node-badge--trading   { background: var(--blue-bg);   color: var(--blue); }
.node-badge--warehouse { background: var(--cyan-bg);   color: var(--cyan); }
.node-badge--research  { background: var(--orange-bg); color: var(--orange); }
/* P2.3 兜底降级: 本端 market_data 正读 HZ 仓兜底 (本地采集降级) — 黄色告警态, 全 token */
.node-badge--fallback  { background: var(--yellow-bg); color: var(--yellow); }

.topbar-ticker {
  display: flex;
  gap: 16px;
  font-size: var(--text-base);
  flex-wrap: wrap;
  align-items: center;
}

.ticker-item {
  display: flex;
  gap: 4px;
  align-items: center;
}

.ticker-label {
  color: var(--text-muted);
  font-size: var(--text-sm);
  text-transform: uppercase;
}

.ticker-price {
  font-weight: 600;
  font-size: var(--text-md);
}

.ticker-change {
  font-weight: 600;
}


.topbar-actions {
  display: flex;
  gap: 8px;
}

.btn-icon {
  width: 32px; height: 32px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: transparent;
  color: var(--text-secondary);
  cursor: pointer;
  font-size: var(--text-lg);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background var(--transition);
}
.btn-icon:hover { background: var(--bg-hover); color: var(--text-primary); }

/* 主题三态分段控件 */
/* 主题切换: 单按钮触发 + 下拉菜单 (取代旧 3 段式; 移动端也显示) */
.theme-switch { position: relative; display: inline-flex; }
.theme-trigger {
  width: 40px; height: 40px; min-width: 40px; min-height: 40px; border: 1px solid var(--border); border-radius: var(--radius);
  background: var(--bg-secondary); color: var(--text-secondary); cursor: pointer; font-size: var(--text-md);
  display: flex; align-items: center; justify-content: center;
  transition: background var(--transition), color var(--transition);
  box-sizing: border-box;
}
.theme-trigger:hover { background: var(--bg-hover); color: var(--text-primary); }
.theme-menu {
  position: absolute; right: 0; top: calc(100% + 6px); z-index: 200;
  background: var(--bg-secondary); border: 1px solid var(--border); border-radius: var(--radius);
  box-shadow: 0 8px 24px rgba(0,0,0,0.35); padding: 4px; min-width: 132px;
  display: none; flex-direction: column; gap: 2px;
}
.theme-menu.open { display: flex; }
.theme-opt {
  display: flex; align-items: center; gap: 8px; width: 100%;
  padding: 6px 10px; border: none; border-radius: 5px; background: transparent;
  color: var(--text-secondary); cursor: pointer; font-size: var(--text-base); text-align: left; white-space: nowrap;
  transition: background var(--transition), color var(--transition);
}
.theme-trigger .ico { width: 17px; height: 17px; }
.theme-opt .theme-opt-ico { width: 15px; height: 15px; flex-shrink: 0; }
/* 仅精细指针设备应用 :hover，避免触屏点击后 sticky hover 导致多项同时高亮 */
@media (hover: hover) and (pointer: fine) {
  .theme-opt:hover { background: var(--bg-hover); color: var(--text-primary); }
  .theme-opt.active:hover { background: var(--accent-weak); color: var(--accent); }
}
.theme-opt:focus { outline: none; }
.theme-opt:focus-visible { background: var(--bg-hover); color: var(--text-primary); box-shadow: inset 0 0 0 1px var(--border); }
.theme-opt.active { background: var(--accent-weak); color: var(--accent); }
.theme-opt.active:focus-visible { background: var(--accent-weak); color: var(--accent); }

/* 语言切换 (复用 theme-menu 视觉, 独立定位) */
.lang-switch { position: relative; display: inline-flex; }
.lang-menu { min-width: 148px; }
.lang-menu .theme-opt {
  text-decoration: none;
  color: var(--text-secondary);
  box-sizing: border-box;
  background: transparent;
}
@media (hover: hover) and (pointer: fine) {
  .lang-menu .theme-opt:hover { background: var(--bg-hover); color: var(--text-primary); }
  .lang-menu .theme-opt.active:hover { background: var(--accent-weak); color: var(--accent); }
}
.lang-menu .theme-opt.active {
  background: var(--accent-weak);
  color: var(--accent);
  font-weight: 600;
}
.site-public .article-lang-note {
  margin-top: 4px;
  font-size: var(--text-sm);
  color: var(--text-muted);
}

/* ------------------------------------------------------------------ */
/* Sidebar                                                             */
/* ------------------------------------------------------------------ */
.sidebar {
  position: fixed;
  top: var(--topbar-height);
  left: 0;
  bottom: 0;
  width: var(--sidebar-width);
  background: var(--bg-sidebar);
  border-right: 1px solid var(--border);
  overflow-y: auto;
  overflow-x: hidden;
  z-index: 90;
  transition: transform 0.25s ease, width 0.22s ease;
  display: flex;
  flex-direction: column;
}

.sidebar-nav {
  list-style: none;
  padding: 8px 0;
  flex: 1 1 auto;
}

/* ── 侧边栏折叠 toggle 按钮 (桌面) ── */
.sidebar-toggle {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  width: 100%;
  padding: 7px 10px;
  background: transparent;
  border: none;
  border-bottom: 1px solid var(--border-light);
  color: var(--text-muted);
  cursor: pointer;
  transition: color var(--transition);
}
.sidebar-toggle:hover { color: var(--text-secondary); }
.sidebar-toggle-ico {
  width: 15px; height: 15px;
  stroke: currentColor; stroke-width: 2; fill: none;
  stroke-linecap: round; stroke-linejoin: round;
  transition: transform 0.22s ease;
}
.sidebar.mini .sidebar-toggle-ico { transform: rotate(180deg); }

/* ── 域标签 (研究域/模拟域/实盘域, 非交互固定分区) ── */
.nav-domain-label {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: var(--text-md);
  letter-spacing: 0.04em;
  font-weight: 600;
  padding: 13px 16px 6px;
  color: var(--text-muted);
}
.nav-domain-label /* domain 色点 (圆点) */
.nd-dot {
  width: 6px; height: 6px; border-radius: 50%;
  background: var(--text-muted); flex: none;
}
.dom-r-dot { background: var(--blue); }
.dom-s-dot { background: var(--green); }
.dom-l-dot { background: var(--yellow); }

/* ── 前台扁平分组标题 (小字阶 muted, 对齐域标签精致度; 替代旧 li 白粗体) ── */
.nav-section {
  list-style: none;
  font-size: var(--text-sm);
  font-weight: 600;
  letter-spacing: 0.04em;
  padding: 14px 16px 5px;
  color: var(--text-muted);
}
.nav-section:first-child { padding-top: 6px; }

/* ── 可折叠分组 ── */
.nav-group-hd {
  display: flex;
  align-items: center;
  width: 100%;
  padding: 9px 16px;
  background: transparent;
  border: none;
  color: var(--text-secondary);
  font-size: var(--text-md);
  font-weight: 400;
  cursor: pointer;
  gap: 11px;
  transition: all var(--transition);
  user-select: none;
}
.nav-group-hd:hover { background: var(--bg-hover); color: var(--text-primary); }
.nav-group-hd.open { color: var(--text-primary); }

/* Domain 型分组头：使用各自图标与域色，避免“色点 + 子项图标”重复。 */
.nav-group-hd--domain {
  font-size: var(--text-md);
  font-weight: 600;
  padding: 9px 16px;
  letter-spacing: 0.04em;
  margin-top: 2px;
  color: var(--text-secondary);
}
.nav-group.dom-s .nd-dot { background: var(--green); }
.nav-group.dom-l .nd-dot { background: var(--yellow); }
.nav-group.dom-s .nav-group-hd--domain > .nav-ico { color:var(--green); opacity:1; }
.nav-group.dom-l .nav-group-hd--domain > .nav-ico { color:var(--yellow); opacity:1; }

/* Chevron */
.nav-chevron {
  width: 12px; height: 12px;
  stroke: currentColor; stroke-width: 2.2; fill: none;
  stroke-linecap: round; stroke-linejoin: round;
  margin-left: auto; flex-shrink: 0; opacity: 0.5;
  transition: transform 0.2s ease;
}
.nav-group-hd.open .nav-chevron { transform: rotate(180deg); opacity: 0.7; }

/* 分组内容体（可折叠） */
.nav-group-body {
  list-style: none;
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.22s ease;
}
.nav-group-body.open { max-height: 400px; }
.nav-gate {
  margin: 9px 12px 3px;
  padding: 1px;
  border-top: 1px dashed var(--border);
}
.nav-gate-item {
  display: flex;
  align-items: center;
  gap: 11px;
  padding: 9px 16px 9px 14px;
  color: var(--text-secondary);
  text-decoration: none;
  font-size: var(--text-md);
  border-left: 2px solid transparent;
  transition: all var(--transition);
}
.nav-gate-item:hover { background: var(--bg-hover, rgba(255,255,255,0.04)); color: var(--text-primary); }
.nav-gate-item.active { background: rgba(52, 211, 153,0.08); color: var(--text-link); border-left-color: var(--blue); }
.nav-gate-item .ng-sub {
  font-size: var(--text-xs); color: var(--yellow); margin-left: auto;
  border: 1px solid rgba(202,162,78,0.4); border-radius: 4px; padding: 1px 7px; letter-spacing: 0;
}

.nav-item {
  display: flex;
  align-items: center;
  gap: 11px;
  padding: 9px 16px;
  color: var(--text-secondary);
  border-radius: 0;
  font-size: var(--text-md);
  transition: all var(--transition);
  border-left: 2px solid transparent;
}

.nav-item:hover {
  background: var(--bg-hover);
  color: var(--text-primary);
  text-decoration: none;
}

.nav-item.active {
  background: rgba(52, 211, 153, 0.08);
  color: var(--text-link);
  border-left-color: var(--blue);
}
/* 域上色选中态 (模拟绿 / 实盘黄) — 与固定分区色点呼应 */
.nav-item.dom-s.active { background: rgba(70,184,127,0.10); color: var(--text-primary); border-left-color: var(--green); }
.nav-item.dom-l.active { background: rgba(220,166,58,0.10); color: var(--text-primary); border-left-color: var(--yellow); }
.nav-item.dom-s.active .nav-ico { color: var(--green); opacity: 1; }
.nav-item.dom-l.active .nav-ico { color: var(--yellow); opacity: 1; }

.nav-item.sub { padding-left: 40px; }  /* 缩进区分层级; 字号与 .nav-item 统一(0.94rem) */

/* ── 移动侧边栏手风琴 (sidebar.html): 二级默认折叠, 仅当前板块(.open)展开, 点 caret 切换 ── */
.sidebar-group { list-style: none; }
.sidebar-ghead { display: flex; align-items: stretch; }
.sidebar-ghead > .nav-item { flex: 1 1 auto; min-width: 0; }
.sidebar-caret {
  flex: 0 0 46px;
  display: flex; align-items: center; justify-content: center;
  background: transparent; border: none; cursor: pointer;
  color: var(--text-muted); border-left: 1px solid var(--border-light);
  transition: color var(--transition);
}
.sidebar-caret:hover { color: var(--text-primary); }
.sidebar-caret svg {
  stroke: currentColor; stroke-width: 2; fill: none;
  stroke-linecap: round; stroke-linejoin: round;
  transition: transform 0.2s ease;
}
.sidebar-group.open > .sidebar-ghead > .sidebar-caret svg { transform: rotate(180deg); }
.sidebar-sub { list-style: none; overflow: hidden; max-height: 0; transition: max-height 0.28s ease; }
.sidebar-group.open > .sidebar-sub { max-height: 520px; }

.nav-icon { font-size: var(--text-lg); width: 18px; text-align: center; }
.nav-ico {
  width: 18px; height: 18px; flex-shrink: 0;
  stroke: currentColor; stroke-width: 1.8; fill: none;
  stroke-linecap: round; stroke-linejoin: round;
  opacity: 0.78;
}
/* 与总览叶节点统一：图标槽固定 18×18，避免分组/条目错位 */
.nav-item,
.nav-group-hd {
  display: flex;
  align-items: center;
  gap: 10px;
}
.nav-item .nav-ico,
.nav-group-hd .nav-ico {
  width: 18px;
  height: 18px;
  margin: 0;
}
.nav-item.active .nav-ico { opacity: 1; }
/* 分组头无图标时左侧与有图标叶节点文字对齐 */
.nav-group-hd { padding-left: 14px; }
.nav-item:not(.sub) { padding-left: 14px; }
.nav-item.sub { padding-left: 40px; }
.sidebar.mini .nav-group-hd { padding-left: 0; }
.sidebar.mini .nav-item:not(.sub),
.sidebar.mini .nav-item.sub { padding-left: 0; }

/* ════ 统一行内图标 (按钮/标签内, 单色描边, 跟随 currentColor) ════ */
.ico {
  width: 1em; height: 1em; flex-shrink: 0;
  stroke: currentColor; stroke-width: 1.9; fill: none;
  stroke-linecap: round; stroke-linejoin: round;
  vertical-align: -0.14em;
}
.ico-sm { width: 0.85em; height: 0.85em; vertical-align: -0.1em; }

/* 分区分隔细线 */
.nav-divider { height: 1px; background: var(--border-light, rgba(255,255,255,0.06)); margin: 9px 16px; list-style: none; }

.nav-bottom { margin-top: 16px; border-top: 1px solid var(--border); padding-top: 6px; }

/* ── 桌面 Mini 模式 (图标宽 54px) ── */
.sidebar.mini { width: 54px; }
.sidebar.mini .nav-label,
.sidebar.mini .nd-tag,
.sidebar.mini .ng-sub,
.sidebar.mini .nav-section-lbl,
.sidebar.mini .badge { display: none; }
.sidebar.mini .nav-domain-label { justify-content: center; padding: 10px 0 4px; }
/* Mini 折叠态: 隐藏分组头 → 只留叶节点唯一 icon；靠分隔线区分域 */
.sidebar.mini .nav-group-hd { display: none !important; }
/* 彻底隐藏历史状态点（侧栏不得再出现灰点/色点） */
.sidebar .nav-state-dot { display: none !important; }
.sidebar.mini .nav-divider { margin: 6px 14px; }
/* Mini 模式展开所有分组（无标签无需手动折叠） */
.sidebar.mini .nav-group-body { max-height: 400px; overflow: visible; }
.sidebar.mini .nav-item,
.sidebar.mini .nav-gate-item {
  padding: 8px 0;
  justify-content: center;
  gap: 0;
  border-left-color: transparent !important;
}
.sidebar.mini .nav-item.active {
  background: rgba(52, 211, 153, 0.1);
  border-left-color: var(--blue) !important;
}
.sidebar.mini .nav-item.sub { padding-left: 0; }
.sidebar.mini .nav-gate { margin: 6px 6px 2px; padding: 1px; }
.sidebar.mini .nav-gate-item { justify-content: center; gap: 0; padding: 8px 0; }
.sidebar.mini .nav-ico { opacity: 0.75; }
.sidebar.mini .nav-item.active .nav-ico { opacity: 1; }
/* Mini 内容区补偿 */
.sidebar.mini ~ .admin-container { margin-left: 54px; transition: margin-left 0.22s ease; }
.admin-container { transition: margin-left 0.22s ease; }

/* ------------------------------------------------------------------ */
/* Mobile hamburger button                                             */
/* ------------------------------------------------------------------ */
.hamburger-btn {
  display: none;
  width: 40px;
  height: 40px;
  min-width: 40px;
  min-height: 40px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: transparent;
  color: var(--text-secondary);
  cursor: pointer;
  font-size: var(--text-xl);
  align-items: center;
  justify-content: center;
  z-index: 110;
  box-sizing: border-box;
}

/* Sidebar overlay for mobile */
.sidebar-overlay {
  display: none;
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.5);
  z-index: 115;
}

/* ------------------------------------------------------------------ */
/* Main Content                                                        */
/* ------------------------------------------------------------------ */
.main-content {
  margin-left: var(--sidebar-width);
  margin-top: var(--topbar-height);
  padding: 24px;
  min-height: calc(100vh - var(--topbar-height));
}

.page-title {
  font-size: var(--text-3xl);
  font-weight: 700;
  color: var(--text-primary);
}

.page-subtitle {
  font-size: var(--text-sm);
  color: var(--text-secondary);
  margin-top: 4px;
  line-height: 1.45;
}

/* ------------------------------------------------------------------ */
/* Footer                                                              */
/* ------------------------------------------------------------------ */
.site-footer {
  margin-top: 40px;
  padding: 20px 0;
  border-top: 1px solid var(--border);
  color: var(--text-muted);
  font-size: var(--text-sm);
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex-wrap: wrap;
  gap: 12px;
}


.footer-links {
  display: flex;
  gap: 16px;
  flex-wrap: wrap;
  justify-content: flex-end;
  margin-left: auto;
}

.footer-links a {
  color: var(--text-muted);
  text-decoration: none;
}
.footer-links a:hover { color: var(--text-link); }
.footer-copy { flex: 0 1 auto; }

/* 法律页（隐私/用户协议/Cookie）
   选择器必须带 .site-public，否则会被后写的 .site-public .page-title（2xl）盖掉 */
.site-public .legal-page {
  max-width: 820px;
  margin: 0 auto;
  min-width: 0;
  width: 100%;
  box-sizing: border-box;
}
.site-public .legal-page .page-header {
  margin-bottom: 12px;
  min-width: 0;
}
.site-public .legal-page .page-title,
.site-public .legal-page h1.page-title {
  font-family: var(--font-display);
  font-size: var(--text-lg); /* 18px：低于全站 page-title 2xl */
  font-weight: 650;
  line-height: 1.25;
  letter-spacing: 0;
  overflow-wrap: anywhere;
  word-break: break-word;
}
.site-public .legal-page .page-subtitle {
  font-size: var(--text-xs);
  margin-top: 4px;
  line-height: 1.4;
  color: var(--text-muted);
}
.site-public .legal-page .public-panel,
.site-public .legal-page .panel {
  max-width: 100%;
  min-width: 0;
  overflow: hidden;
}
.site-public .legal-page .panel-body {
  padding: 14px 16px;
  max-width: 100%;
  box-sizing: border-box;
  overflow-x: hidden;
}
.site-public .legal-body {
  font-size: var(--text-sm); /* 12px 说明阶，长文可读 */
  line-height: 1.65;
  color: var(--text-secondary);
  min-width: 0;
  overflow-wrap: anywhere;
  word-break: break-word;
}
.site-public .legal-body h2 {
  margin: 1em 0 0.4em;
  font-size: var(--text-base); /* 14px */
  color: var(--text-primary);
  font-weight: 650;
  line-height: 1.35;
}
.site-public .legal-body p,
.site-public .legal-body li { margin: 0.35em 0; }
.site-public .legal-body ul {
  padding-left: 1.15em;
  margin: 0.35em 0 0.6em;
}
.site-public .legal-body a { color: var(--text-link); }
.site-public .legal-body strong {
  color: var(--text-primary);
  font-weight: 600;
}
.site-public .legal-table-wrap {
  width: 100%;
  max-width: 100%;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  margin: 8px 0 12px;
}
.site-public .legal-table {
  width: 100%;
  min-width: 0;
  border-collapse: collapse;
  font-size: var(--text-xs);
  line-height: 1.45;
  table-layout: fixed;
}
.site-public .legal-table th,
.site-public .legal-table td {
  border: 1px solid var(--border);
  padding: 6px 8px;
  text-align: left;
  vertical-align: top;
  overflow-wrap: anywhere;
  word-break: break-word;
}
.site-public .legal-table th {
  background: var(--bg-secondary);
  color: var(--text-primary);
  font-weight: 600;
}

/* Cookie 横幅 */
.cookie-banner {
  position: fixed;
  left: 0; right: 0; bottom: 0;
  z-index: 200;
  padding: 12px 16px calc(12px + env(safe-area-inset-bottom, 0px));
  background: var(--bg-secondary);
  border-top: 1px solid var(--border);
  box-shadow: 0 -6px 24px rgba(0,0,0,.18);
}
.cookie-banner[hidden] { display: none !important; }
.cookie-banner-inner {
  max-width: 1100px;
  margin: 0 auto;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px 16px;
  flex-wrap: wrap;
}
.cookie-banner-text {
  margin: 0;
  flex: 1 1 240px;
  font-size: var(--text-xs);
  line-height: 1.5;
  color: var(--text-secondary);
}
.cookie-banner-text a { color: var(--text-link); }
#cookie-banner-accept { flex: 0 0 auto; }
@media (max-width:768px) {
  /* 前台有底部 Tab：横幅抬到 Tab 上方，避免遮挡导航 */
  .site-public .cookie-banner { bottom: 56px; }
  .cookie-banner-inner { align-items: flex-start; }
}

/* 注册同意条款 */
.auth-agree {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  margin: 10px 0 4px;
  font-size: var(--text-xs);
  line-height: 1.45;
  color: var(--text-secondary);
  cursor: pointer;
}
.auth-agree-top {
  margin: 4px 0 8px;
  padding: 8px 10px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: var(--bg-secondary);
}
.auth-agree input {
  margin-top: 2px;
  flex: 0 0 auto;
}
.auth-agree a { color: var(--text-link); }
.auth-terms-hint {
  margin: 0 0 10px;
  font-size: var(--text-xs);
  color: var(--text-muted);
}
.auth-field-hint {
  margin: -4px 0 8px;
  font-size: var(--text-xs);
}
/* 蜜罐：视觉隐藏，仍可被简单机器人填写 */
.auth-hp {
  position: absolute !important;
  left: -10000px !important;
  top: auto !important;
  width: 1px !important;
  height: 1px !important;
  overflow: hidden !important;
  opacity: 0 !important;
  pointer-events: none !important;
}
.auth-google.is-disabled,
.auth-google[aria-disabled="true"] {
  opacity: .45;
  pointer-events: none;
  cursor: not-allowed;
  filter: grayscale(0.35);
}
.auth-google:not(.is-disabled):not([aria-disabled="true"]) {
  opacity: 1;
  pointer-events: auto;
  cursor: pointer;
  filter: none;
  color: var(--text-primary);
}

/* ------------------------------------------------------------------ */
/* Metric Cards Grid                                                   */
/* ------------------------------------------------------------------ */
.metric-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 12px;
  margin-bottom: 24px;
}

.metric-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 16px;
  transition: border-color var(--transition), transform var(--transition), box-shadow var(--transition);
}
/* 状态概览卡可点击进对应模块 → hover 抬升 + 高亮边框 (a 包裹卡片) */
a:hover > .metric-card { border-color: var(--text-link); transform: translateY(-2px); box-shadow: 0 4px 16px rgba(0,0,0,0.18); }

.metric-card .metric-label {
  font-size: var(--text-base);
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  margin-bottom: 6px;
}

.metric-card .metric-value {
  font-size: var(--text-2xl);
  font-weight: 700;
  font-family: var(--font-mono);
}

.metric-card .metric-change {
  font-size: var(--text-base);
  margin-top: 4px;
}

.metric-change.up { color: var(--green-bright); }
.metric-change.down { color: var(--red-bright); }
.metric-change.neutral { color: var(--text-secondary); }

.metric-card .metric-ts {
  font-size: var(--text-sm);
  color: var(--text-muted);
  font-family: var(--font-mono);
  margin-top: 6px;
}

/* ------------------------------------------------------------------ */
/* Panel / Card                                                        */
/* ------------------------------------------------------------------ */
.panel {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  margin-bottom: 20px;
}

.panel-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px 18px;
  border-bottom: 1px solid var(--border);
  font-weight: 600;
  font-size: var(--text-md);
  gap: 8px;
  min-width: 0;
}

.panel-header > span {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.param-stage-panel {
  overflow: hidden;
  min-width: 0;
}

/* ── 参数卡片 grid (替代内联 style) ── */
.param-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
  gap: 14px;
  margin-bottom: 18px;
}

.param-grid-fixed {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  gap: 10px;
  margin-bottom: 14px;
}

/* 可调卡: 中性卡 + 绿色左 accent 条 (替代整圈绿框, 去噪更精致) */
.param-card {
  background: var(--bg-secondary);
  border: 1px solid var(--border);
  border-left: 3px solid var(--green);
  border-radius: var(--radius);
  padding: 12px 14px;
  box-sizing: border-box;
  min-width: 0;
  max-width: 100%;
  word-break: break-word;
  overflow-wrap: break-word;
  transition: border-color .15s ease, box-shadow .15s ease;
}

.param-card:hover {
  border-color: var(--green);
  box-shadow: 0 3px 12px rgba(0, 0, 0, .10);
}

.param-card > label {
  display: block;
  font-size: var(--text-sm);
  color: var(--text-secondary);
  font-weight: 500;
  margin-bottom: 7px;
}

.param-card > label code,
.param-card .pc-key {
  font-size: var(--text-xs);
  color: var(--text-link);
  background: var(--bg-tertiary);
  padding: 1px 6px;
  border-radius: 4px;
  margin-left: 5px;
}

/* ── 输入控件: 统一外观 + focus 高亮环 ── */
.param-input {
  width: 100%;
  padding: 7px 10px;
  background: var(--bg-primary);
  color: var(--text-primary);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  font-family: var(--font-mono);
  font-size: var(--text-base);
  box-sizing: border-box;
  max-width: 100%;
  transition: border-color .15s ease, box-shadow .15s ease;
}

.param-input:focus {
  outline: none;
  border-color: var(--green);
  box-shadow: 0 0 0 3px var(--green-bg);
}

.param-card input,
.param-card select,
.param-card textarea {
  max-width: 100%;
  box-sizing: border-box;
}

.param-card code {
  word-break: break-all;
  overflow-wrap: anywhere;
}

.param-hint {
  font-size: var(--text-sm);
  color: var(--text-muted);
  margin-top: 7px;
  line-height: 1.55;
  word-break: break-word;
  overflow-wrap: break-word;
}

/* 固定卡: 中性虚线、淡化 (一眼区分"不可改") */
.param-card-fixed {
  background: var(--bg-tertiary);
  border: 1px dashed var(--border);
  border-radius: var(--radius);
  padding: 10px 12px;
  box-sizing: border-box;
  min-width: 0;
  max-width: 100%;
  word-break: break-word;
  overflow-wrap: break-word;
}

.param-card-fixed .pc-flabel {
  font-size: var(--text-sm);
  color: var(--text-muted);
  margin-bottom: 4px;
}

.param-card-fixed .pc-val {
  font-size: var(--text-base);
  color: var(--text-secondary);
  font-family: var(--font-mono);
}

/* 段落胶囊标签 (可调 / 固定) */
.param-section-tag {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: var(--text-sm);
  font-weight: 600;
  letter-spacing: .02em;
  padding: 3px 11px;
  border-radius: 999px;
  margin-bottom: 12px;
}

.param-section-tag.is-editable { color: var(--green-bright); background: var(--green-bg); }
.param-section-tag.is-fixed { color: var(--text-muted); background: var(--bg-tertiary); border: 1px solid var(--border-light); }

/* 阶段面板头部: 可点 hover 反馈 */
.param-stage-panel > .panel-header { cursor: pointer; transition: background .15s ease; }
.param-stage-panel > .panel-header:hover { background: var(--bg-tertiary); }

/* ── I/O 底部信息条 ── */
.param-io-footer {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px;
  font-size: var(--text-sm);
  padding: 8px 12px;
  background: var(--bg-tertiary);
  border: 1px solid var(--border);
  border-radius: 6px;
  word-break: break-word;
  overflow-wrap: break-word;
  min-width: 0;
}

.panel-body { padding: 18px; overflow: hidden; min-width: 0; }

/* ------------------------------------------------------------------ */
/* Tables                                                              */
/* ------------------------------------------------------------------ */
table.data-table {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--text-md);
}

.table-full { width: 100%; }

.data-table thead {
  position: sticky;
  top: 0;
  z-index: 1;
}

.data-table th {
  text-align: left;
  padding: 10px 14px;
  background: var(--bg-tertiary);
  color: var(--text-muted);
  font-weight: 600;
  font-size: var(--text-base);
  letter-spacing: 0.04em;
  border-bottom: 1px solid var(--border);
  white-space: nowrap;
}

.data-table th.num { text-align: right; }

.data-table td {
  padding: 8px 14px;
  border-bottom: 1px solid var(--border-light);
  font-family: var(--font-mono);
  font-size: var(--text-base);
  text-align: left;
}

.data-table td.num {
  text-align: right;
  font-feature-settings: "tnum";
  font-variant-numeric: tabular-nums;
}

.data-table td.ctr { text-align: center; }

.data-table tbody tr:hover { background: var(--bg-hover); }

.sortable-header {
  cursor: pointer;
  user-select: none;
}
.sortable-header:hover { color: var(--text-link); }
.sortable-header::after {
  content: ' ↕';
  opacity: 0.3;
  font-size: var(--text-xs);
}
.sortable-header.sort-asc::after { content: ' ▲'; font-size: var(--text-xs); opacity: 0.7; }
.sortable-header.sort-desc::after { content: ' ▼'; font-size: var(--text-xs); opacity: 0.7; }

.price-up { color: var(--green-bright) !important; }
.price-down { color: var(--red-bright) !important; }
.text-up { color: var(--green-bright); }
.text-down { color: var(--red-bright); }
.text-primary { color: var(--text-primary); }
.text-good { color: var(--green); }
.text-bad { color: var(--red); }
.hy-svg-sprite { position:absolute; }

/* ------------------------------------------------------------------ */
/* Chart Container                                                     */
/* ------------------------------------------------------------------ */
.chart-container {
  width: 100%;
  min-height: 400px;
  position: relative;
}
.chart-h-180 { height:180px; }
.chart-h-300 { height:300px; }
.chart-h-350 { height:350px; }
.chart-h-360 { height:360px; }
.chart-h-400 { height:400px; }
.chart-h-420 { height:420px; }
.chart-h-440 { height:440px; }
.chart-h-450 { height:450px; }
.chart-h-460 { height:460px; }
.chart-h-520 { height:520px; }
.chart-h-600 { height:600px; }
.chart-tip-head { font-size:var(--text-xs); color:var(--text-muted); margin-bottom:6px }
.chart-tip-head-lg { margin-bottom:8px }
.chart-tip-table { font-size:var(--text-xs); line-height:1.85 }
.chart-tip-label { color:var(--text-muted); padding-right:16px }
.chart-tip-value { color:var(--text-primary); font-family:var(--font-mono); font-weight:600; min-width:20px }
.chart-tip-up { color:var(--green) }
.chart-tip-down { color:var(--red) }
.chart-tip-btc { color:#F7931A }
.chart-tip-greed { color:#26A69A }
.chart-tip-fear { color:#EF5350 }
.chart-tip-neutral { color:#E3A008 }
.chart-tip-line { margin-top:4px; font-size:var(--text-xs); color:var(--text-muted) }
.chart-tip-section { margin-top:6px; font-size:var(--text-xs); color:var(--text-muted); border-top:1px solid var(--border); padding-top:6px }
.chart-tip-volume { font-size:var(--text-xs); line-height:1.55 }
.chart-tip-ma-1 { color:#34D399 }
.chart-tip-ma-2 { color:#FF5DA2 }
.chart-tip-ma-3 { color:#FFD740 }
.kline-ma-readout {
  position:absolute; z-index:4; top:7px; left:70px; right:14px;
  display:flex; align-items:center; justify-content:center; gap:14px; flex-wrap:wrap;
  pointer-events:none; font-family:var(--font-mono); font-size:var(--text-xs); line-height:1.4;
}
.kline-ma-readout-item { white-space:nowrap; font-weight:600; text-shadow:0 1px 2px var(--bg-primary) }
.chart-tip-series { display:flex; align-items:center; gap:8px; margin-top:4px }
.chart-tip-dot { display:inline-block; width:8px; height:8px; border-radius:50%; background:var(--text-muted); flex:none }
/* 骨架屏: 图表渲染前(容器为空)显示微光占位; ECharts 注入子节点后 :empty 失配自动消失 */
.chart-container:empty {
  border-radius: 8px;
  background: linear-gradient(100deg, var(--bg-secondary) 30%, var(--bg-hover) 50%, var(--bg-secondary) 70%);
  background-size: 200% 100%;
  animation: skeleton-shimmer 1.4s ease-in-out infinite;
}
@media (max-width:768px) {
  .kline-ma-readout { left:12px; right:8px; gap:10px; font-size: var(--text-xs)}
}
@keyframes skeleton-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
@media (prefers-reduced-motion: reduce) {
  .chart-container:empty { animation: none; }
}
/* 图表面板下方分析注释 (去冗余: 不与 panel-header / echarts 标题重复) */
.chart-panel > .chart-note {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  margin: 0;
  padding: 10px 14px 12px;
  border-top: 1px solid var(--border-light, var(--border));
  font-size: var(--text-xs);
  color: var(--text-muted);
  line-height: 1.55;
}
.chart-panel > .chart-note .note-i-mark {
  margin-top: 2px;
}
.site-public .chart-panel > .chart-note {
  background: var(--bg-secondary);
  font-size: var(--text-xs);
}

/* ------------------------------------------------------------------ */
/* Buttons & Controls                                                  */
/* ------------------------------------------------------------------ */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  padding: 8px 16px;
  min-height: 36px; /* 密度 UI 触控下限；字号仍走 token */
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--bg-card);
  color: var(--text-primary);
  font-size: var(--text-md);
  cursor: pointer;
  transition: all var(--transition);
  font-family: var(--font-sans);
  box-sizing: border-box;
}

.btn:hover { background: var(--bg-hover); border-color: var(--text-muted); }
.btn:active { transform: scale(0.98); }
.btn:disabled { opacity: 0.5; cursor: not-allowed; }
.btn-sm { padding: 4px 10px; font-size: var(--text-sm); min-height: 32px; }
/* 填充按钮 (主操作): 用 brightness 做 hover, 自适应主题 */
.btn-primary { background: var(--blue); border-color: var(--blue); color: #07140F; font-weight: 500; }
.btn-success { background: var(--green); border-color: var(--green); color: #07140F; font-weight: 500; }
.btn-danger-solid { background: var(--red); border-color: var(--red); color: #fff; }
.btn-warning { background: var(--yellow); border-color: var(--yellow); color: #2a2400; }
.btn-ghost { background: transparent; border-color: var(--border); color: var(--text-secondary); }
.btn-ghost:hover { background: var(--bg-hover); color: var(--text-primary); border-color: var(--text-muted); }

/* ════ 统一按钮基线 (设计标准) ════ */
/* 各页历史上各自定义按钮(pt-/pc-/tm-/lv-/a-/sl-/seg-), 圆角/字体/字重不一 → 视觉割裂。
   此层把它们的【形态】收敛到规范(同圆角/同字体/同字重/同过渡), 保留各自语义底色。
   仅统一外观, 不动模板结构; padding 由各页保留以适配密度。*/
.pt-btn, .pc-btn, .pc-btn-o, .tm-btn, .lv-btn, .abtn, .sl-mode-btn,
.seg-btn, .pt-preset, .pt-combo-btn {
  border-radius: var(--radius) !important;
  font-family: var(--font-sans) !important;
  font-weight: 500 !important;
  transition: all var(--transition) !important;
}
/* bespoke 按钮 hover (分型 —— 关键: 描边/中性按钮禁用 filter 压暗, 否则只把彩色文字压暗→发虚像消失) */
/* ① 实心彩色变体: 整体压暗(文字+底一起暗, 对比不变) */
.pt-btn-go:hover, .pt-btn-stop:hover, .pt-btn-flat:hover { filter: brightness(0.9); }
.pt-btn-go:active, .pt-btn-stop:active, .pt-btn-flat:active { filter: brightness(0.82); }
/* ② 描边/中性按钮: 加中性 hover 底, 文字色不动 → 永不变暗/消失 (abtn/sl-mode-btn 各有自带 hover, 不在此) */
.pc-btn:hover, .pc-btn-o:hover, .tm-btn:hover, .lv-btn:hover, .seg-btn:hover {
  background: var(--bg-hover);
}
.pt-btn-reset:hover { background: var(--bg-secondary); border-color: var(--text-muted); }
/* 实心彩色按钮 hover: 统一轻压暗(暗/亮模式皆耐看 —— 薄荷/绿不发荧光, 亮色不发白) */
.btn-primary:hover, .btn-success:hover, .btn-danger-solid:hover { filter: brightness(0.9); }
.btn-primary:active, .btn-success:active, .btn-danger-solid:active { filter: brightness(0.82); }
/* 保存按钮各自有渐变 hover; 明亮模式再压暗一档 */
[data-theme="light"] .btn-save-all:hover,
[data-theme="light"] .btn-save-stage:hover { filter: brightness(0.94); }
/* ── 内联彩色按钮兜底 (各页用 style="background:var(--X)..." 内联写的按钮) ──
   内联样式无法定义 :hover, 且会盖掉类的 hover 背景 → 这些按钮原本无 hover 反馈。
   用属性选择器统一补: ①压暗 hover ②薄荷/绿/黄底白字对比不足 → 改深色字。 */
button[style*="background:var(--green)"]:hover, a[style*="background:var(--green)"]:hover,
button[style*="background:var(--blue)"]:hover, a[style*="background:var(--blue)"]:hover,
button[style*="background:var(--accent)"]:hover, a[style*="background:var(--accent)"]:hover,
button[style*="background:var(--red)"]:hover, a[style*="background:var(--red)"]:hover,
button[style*="background:var(--yellow)"]:hover, a[style*="background:var(--yellow)"]:hover,
.btn[style*="background:var(--green)"]:hover, .btn[style*="background:var(--blue)"]:hover,
.btn[style*="background:var(--red)"]:hover, .btn[style*="background:var(--yellow)"]:hover {
  filter: brightness(0.9);
}
button[style*="background:var(--green)"]:active, a[style*="background:var(--green)"]:active,
button[style*="background:var(--blue)"]:active, a[style*="background:var(--blue)"]:active,
button[style*="background:var(--accent)"]:active, button[style*="background:var(--red)"]:active,
button[style*="background:var(--yellow)"]:active { filter: brightness(0.82); }
button[style*="background:var(--green)"], a[style*="background:var(--green)"],
button[style*="background:var(--blue)"], a[style*="background:var(--blue)"],
button[style*="background:var(--accent)"], a[style*="background:var(--accent)"],
button[style*="background:var(--yellow)"], a[style*="background:var(--yellow)"] {
  color: #07140F !important;
}
/* 中性内联按钮 (background:var(--bg-*)): 压暗/提亮在两模式相反 → 用 hover 高亮薄荷边框(暗/亮皆清晰) */
button[style*="background:var(--bg-primary)"]:hover, button[style*="background:var(--bg-secondary)"]:hover,
button[style*="background:var(--bg-tertiary)"]:hover, button[style*="background:var(--bg-card)"]:hover,
a[style*="background:var(--bg-primary)"]:hover, a[style*="background:var(--bg-secondary)"]:hover,
a[style*="background:var(--bg-tertiary)"]:hover, a[style*="background:var(--bg-card)"]:hover {
  border-color: var(--accent) !important;
  color: var(--text-primary) !important;
}
/* 描边按钮 (次操作) */
.btn-danger { border-color: var(--red); color: var(--red-bright); background: transparent; }
.btn-danger:hover { background: var(--red-bg); border-color: var(--red); }
.btn-warning { border-color: var(--yellow); color: var(--yellow); background: transparent; }
.btn-warning:hover { background: var(--yellow-bg); }

/* ── 保存按钮 (参数调整页) ── */
.btn-save-all {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 11px 36px;
  font-size: var(--text-lg);
  font-weight: 600;
  color: #07140F;
  background: linear-gradient(135deg, var(--accent) 0%, var(--accent-2) 100%);
  border: none;
  border-radius: 8px;
  cursor: pointer;
  letter-spacing: 0.02em;
  box-shadow: 0 2px 8px rgba(52, 211, 153, 0.25);
  transition: all 0.25s ease;
  font-family: var(--font-display);
}
.btn-save-all:hover {
  background: linear-gradient(135deg, var(--accent-2) 0%, #0E8C63 100%);
  box-shadow: 0 4px 16px rgba(52, 211, 153, 0.4);
  transform: translateY(-1px);
}
.btn-save-all:active {
  transform: translateY(0);
  box-shadow: 0 1px 4px rgba(52, 211, 153, 0.2);
}
.btn-save-all:disabled {
  opacity: 0.65;
  cursor: not-allowed;
  transform: none;
  box-shadow: none;
  filter: grayscale(30%);
}

.btn-save-stage {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 5px 14px;
  font-size: var(--text-base);
  font-weight: 500;
  color: #07140F;
  background: var(--accent);
  border: 1px solid transparent;
  border-radius: 5px;
  cursor: pointer;
  transition: all 0.2s ease;
  font-family: var(--font-sans);
}
.btn-save-stage:hover {
  background: var(--accent-2);
  border-color: transparent;
  box-shadow: 0 2px 8px rgba(52, 211, 153, 0.3);
}
.btn-save-stage:active { transform: scale(0.97); }
.btn-save-stage:disabled {
  opacity: 0.6;
  cursor: not-allowed;
  transform: none;
  box-shadow: none;
}

/* 保存按钮加载动画 */
@keyframes btn-save-pulse {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.5; }
}
.btn-saving { animation: btn-save-pulse 1s ease-in-out infinite; }

.btn-group { display: flex; gap: 6px; align-items: center; }
.watchdog-action-group { flex-direction: column; align-items: flex-start; gap: 12px; }
.watchdog-stop-btn { border-color: var(--red); }
.watchdog-result { margin-top: 12px; font-size: var(--text-base); padding: 6px 10px; border-radius: 4px; }
.watchdog-result.is-run { background: var(--blue-bg); color: var(--blue); border: 1px solid var(--blue); }
.watchdog-result.is-ok { background: var(--green-bg); color: var(--green-bright); border: 1px solid var(--green); }
.watchdog-result.is-err { background: var(--red-bg); color: var(--red-bright); border: 1px solid var(--red); }
.watchdog-help { font-size: var(--text-xs); color: var(--text-secondary); line-height: 1.6; }

select.btn, input.btn {
  font-family: var(--font-sans);
  appearance: none;
}

/* ------------------------------------------------------------------ */
/* Kline interval button group                                          */
/* ------------------------------------------------------------------ */
.kline-group-btn {
  padding: 5px 14px;
  font-size: var(--text-base);
  border-radius: 0;
}
.kline-group-btn:first-of-type { border-radius: 4px 0 0 4px; }
.kline-group-btn:last-of-type { border-radius: 0 4px 4px 0; }
.kline-group-btn + .kline-group-btn { margin-left: -1px; }

/* ------------------------------------------------------------------ */
/* Tabs                                                                */
/* ------------------------------------------------------------------ */
.tabs {
  display: flex;
  gap: 0;
  border-bottom: 1px solid var(--border);
  margin-bottom: 20px;
}

.tab-item {
  padding: 10px 20px;
  font-size: var(--text-base);
  color: var(--text-secondary);
  cursor: pointer;
  border-bottom: 2px solid transparent;
  transition: all var(--transition);
}

.tab-item:hover { color: var(--text-primary); }
.tab-item.active {
  color: var(--text-link);
  border-bottom-color: var(--blue);
}

.tabs-spacer { flex: 1; }
.article-filter-tabs { flex-wrap: wrap; gap: 4px 0; }

/* ------------------------------------------------------------------ */
/* Empty State                                                         */
/* ------------------------------------------------------------------ */
.empty-state {
  text-align: center;
  padding: 48px 24px;
  color: var(--text-muted);
}

.empty-state .empty-icon { font-size: var(--text-3xl); margin-bottom: 12px; }

.empty-svg {
  width: 40px;
  height: 40px;
  stroke: var(--text-muted);
  stroke-width: 1.5;
  fill: none;
  display: block;
  margin: 0 auto 10px;
  opacity: 0.5;
}

/* ------------------------------------------------------------------ */
/* Badges                                                              */
/* ------------------------------------------------------------------ */
.badge {
  display: inline-block;
  font-size: var(--text-xs);
  padding: 1px 8px;
  border-radius: 10px;
  font-weight: 600;
}

.badge-green { background: var(--green-bg); color: var(--green-bright); }
.badge-red { background: var(--red-bg); color: var(--red-bright); }
.badge-yellow { background: var(--yellow-bg); color: var(--yellow); }
.badge-blue { background: var(--blue-bg); color: var(--blue); }
.badge-purple { background: var(--purple-bg); color: var(--purple); }
.badge-cyan { background: var(--cyan-bg); color: var(--cyan); }
.badge-orange { background: var(--orange-bg); color: var(--orange); }
.badge-gray { background: var(--bg-elevated, rgba(128,128,128,.12)); color: var(--text-muted, #9aa0a6); }

/* Admin article and group lists */
.article-category-link { margin-right: 8px; }
.article-actions-col { min-width: 215px; }
.article-author { color: var(--text-muted); font-size: var(--text-base); }
.article-date { font-size: var(--text-sm); white-space: nowrap; }
.row-archived { opacity: .65; }
.row-archived .article-link { text-decoration: line-through; color: var(--text-muted); }
.row-removing { opacity: 0; transition: opacity .35s; }
.pin-svg {
  width: 13px;
  height: 13px;
  stroke: var(--yellow);
  stroke-width: 1.8;
  fill: none;
  vertical-align: -2px;
  margin-left: 4px;
}
.del-badge {
  display: inline-block;
  margin-left: 6px;
  font-size: var(--text-xs);
  padding: 1px 5px;
  border-radius: 3px;
  background: var(--red-bg);
  color: var(--red);
  font-variant-numeric: tabular-nums;
  vertical-align: middle;
}
.act-cell { white-space: nowrap; }
.abtn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 2px 7px;
  border-radius: 4px;
  font-size: var(--text-sm);
  font-weight: 500;
  border: 1px solid var(--border);
  background: var(--bg-card);
  color: var(--text-primary);
  cursor: pointer;
  text-decoration: none;
  line-height: 1.6;
  transition: background .12s, border-color .12s, color .12s;
  margin-right: 3px;
  white-space: nowrap;
}
.abtn:last-child { margin-right: 0; }
.abtn:hover { background: var(--bg-hover); border-color: var(--border-focus, var(--blue)); }
.abtn-edit { color: var(--text-muted); }
.abtn-edit:hover { color: var(--text-primary); }
.abtn-preview { color: var(--blue); border-color: rgba(74, 158, 255, .35); }
.abtn-preview:hover { background: var(--blue-bg); }
.abtn-pin { color: var(--yellow); border-color: rgba(227, 160, 8, .35); }
.abtn-pin:hover { background: var(--yellow-bg); }
.abtn-archive { color: var(--text-muted); }
.abtn-archive:hover { color: var(--blue); border-color: var(--blue); background: var(--blue-bg); }
.abtn-restore { color: var(--green); border-color: rgba(52, 211, 153, .35); }
.abtn-restore:hover { background: var(--green-bg); }
.abtn-del { color: var(--red); border-color: rgba(246, 70, 93, .3); }
.abtn-del:hover { background: var(--red-bg); }

.group-panel-spacing { margin-bottom: 18px; }
.group-desc-col { width: 50%; }
.group-name-link { font-weight: 600; }
.group-desc { color: var(--text-secondary); font-size: var(--text-base); }
.group-name-input { max-width: 300px; }
.group-help { color: var(--text-muted); font-size: var(--text-xs); margin-left: 8px; line-height: 1.45; }
.group-edit-link { margin-right: 4px; }
.group-edit-name-input { max-width: 400px; }
.group-role-note { margin-top: 8px; font-size: var(--text-xs); color: var(--text-secondary); line-height: 1.45; }
.group-scope-label { font-weight: 600; white-space: nowrap; }
.group-scope-items { color: var(--text-secondary); }
.group-save-btn { margin-top: 8px; }
.table-flush-bottom { margin-bottom: 0; }
.modal-help-text { color: var(--text-muted); font-size: var(--text-xs); line-height: 1.45; }
.modal-danger-text { color: var(--red); font-size: var(--text-xs); line-height: 1.45; }
.icon-align-text { vertical-align: -2px; }

/* Admin user management */
.user-create-panel { margin-bottom:16px }
.user-create-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr)); gap:14px }
.user-create-flags { display:flex; gap:18px; align-items:center; margin:6px 0 14px }
.user-create-flag { margin:0 }
.user-name-link { font-weight:600 }
.user-email { color:var(--text-secondary) }
.user-group-chip { font-size: var(--text-sm)}
.user-muted-small { color:var(--text-muted); font-size: var(--text-xs); line-height:1.4}
.user-status-disabled { color:var(--red) }
.user-login-time { font-family:var(--font-mono); font-size: var(--text-base)}
.user-edit-link { margin-right:4px }
.user-groups-panel { margin-top:18px }
.user-role-desc { color:var(--text-secondary); font-size: var(--text-base)}
.user-role-name { font-weight:600 }
.user-bootstrap-hint { margin-top:16px }
.user-bootstrap-label { font-size: var(--text-base); color:var(--text-muted) }
.user-bootstrap-code { display:block; padding:8px 12px; background:var(--bg-tertiary); border-radius:4px; font-family:var(--font-mono) }
.user-section-panel { margin-bottom:18px }
.user-metric-grid { margin-bottom:14px }
.user-metric-value { font-size: var(--text-lg)}
.user-metric-time { font-size: var(--text-md)}
.user-text-ok { color:var(--green) }
.user-text-bad { color:var(--red) }
.user-text-muted { color:var(--text-muted) }
.user-two-col { display:grid; grid-template-columns:1fr 1fr; gap:14px }
.user-group-select { height:120px; max-width:500px }
.user-perm-note { margin-bottom:12px }
.user-empty-perm { color:var(--text-muted) }

/* Admin profile and IP allowlist */
.metric-grid-flush { margin-bottom:0 }
.profile-section-panel { margin-bottom:18px }
.profile-metric-main { font-size: var(--text-lg)}
.profile-metric-sub { font-size: var(--text-md)}
.profile-two-col { display:grid; grid-template-columns:1fr 1fr; gap:14px }
.profile-password-current { max-width:340px }
.profile-password-grid { display:grid; grid-template-columns:1fr 1fr; gap:14px; max-width:480px }
.profile-timeout-select { width:200px }
.profile-timeout-submit { margin-bottom:16px }
.ip-status-row { margin-bottom:16px }
.ip-status-badge { font-size: var(--text-base)}
.ip-status-note { font-size: var(--text-xs); color:var(--text-muted); margin-left:8px; line-height:1.4 }
.ip-toggle-label { display:flex; align-items:center; gap:8px; cursor:pointer }
.ip-help-body { font-size: var(--text-base); color:var(--text-secondary); line-height:1.8 }
.ip-help-list { padding-left:18px; margin-top:8px }
.ip-help-foot { margin-top:12px; color:var(--text-muted) }
.ip-current-panel { margin-top:16px }
.ip-user-agent { font-size: var(--text-sm)}

/* Admin article edit and alert history */
.article-edit-form { max-width:860px }
.article-edit-panel { margin-bottom:18px }
.alert-history-panel { margin-bottom:16px }
.alert-count { color:var(--text-muted); font-size: var(--text-sm)}
.alert-table-wrap { overflow-x:auto }
.alert-table { width:100%; border-collapse:collapse; font-size: var(--text-base)}
.alert-table th { text-align:left; color:var(--text-muted); font-weight:600; font-size: var(--text-sm); padding:7px 10px; border-bottom:1px solid var(--border) }
.alert-table td { padding:7px 10px; border-bottom:1px solid var(--border); color:var(--text-primary); white-space:nowrap }
.alert-table td.msg { white-space:normal; max-width:360px; word-break:break-word }
.alert-table tr:hover { background:rgba(100,181,246,0.04) }
.al-pill { font-size: var(--text-sm); border-radius:4px; padding:1px 7px; font-weight:600 }
.al-pill.ok { background:rgba(100,255,218,0.12); color:var(--green); border:1px solid rgba(100,255,218,0.25) }
.al-pill.warn { background:rgba(255,193,7,0.12); color:#ffc107; border:1px solid rgba(255,193,7,0.3) }
.al-pill.err { background:rgba(255,82,82,0.12); color:#ff5252; border:1px solid rgba(255,82,82,0.3) }
.al-pill.muted { background:rgba(150,150,150,0.12); color:var(--text-muted); border:1px solid var(--border) }
.al-pill.crit { background:rgba(255,82,82,0.18); color:#ff5252; border:1px solid rgba(255,82,82,0.5); animation:pulse 2s infinite }
.alert-time { font-family:var(--font-mono); font-size: var(--text-sm)}
.alert-source { font-family:var(--font-mono); font-size: var(--text-sm); color:var(--text-muted) }
.alert-empty { padding:40px; text-align:center; color:var(--text-muted) }
@keyframes pulse { 0%,100% { opacity:1 } 50% { opacity:.6 } }
@media (max-width:768px) {
  .alert-table { min-width:580px }
}

/* Admin risk center */
.rc-banner {
  background:var(--bg-secondary); border:1px solid var(--border); border-left:3px solid var(--blue);
  border-radius:8px; padding:12px 16px; margin-bottom:16px; font-size: var(--text-base); color:var(--text-secondary); line-height:1.6;
}
.rc-banner b { color:var(--text-primary) }
.rc-layer {
  display:inline-block; background:rgba(100,181,246,0.12); color:var(--blue); border:1px solid rgba(100,181,246,0.3);
  border-radius:4px; padding:0 7px; font-size: var(--text-sm); font-weight:600; margin-right:6px;
}
.rc-edit { font-size: var(--text-sm); color:var(--text-link); text-decoration:none; border:1px solid var(--border); border-radius:5px; padding:2px 9px; white-space:nowrap }
.rc-edit:hover { border-color:var(--text-link) }
.rc-toggle-header { cursor:pointer }
.rc-caret { display:inline-block; width:1em; color:var(--text-muted) }
.rc-table { width:100%; border-collapse:collapse; font-size: var(--text-base)}
.rc-table th { text-align:left; color:var(--text-muted); font-weight:600; font-size: var(--text-sm); padding:7px 10px; border-bottom:1px solid var(--border) }
.rc-table td { padding:8px 10px; border-bottom:1px solid var(--border); color:var(--text-primary); overflow-wrap:break-word; word-break:break-word; max-width:360px }
.rc-table tr:last-child td { border-bottom:none }
.rc-pill { font-size: var(--text-sm); border-radius:4px; padding:1px 7px; font-weight:600 }
.rc-pill.ok { background:rgba(100,255,218,0.12); color:var(--green); border:1px solid rgba(100,255,218,0.25) }
.rc-pill.muted { background:rgba(150,150,150,0.12); color:var(--text-muted); border:1px solid var(--border) }
.rc-pill.warn { background:rgba(255,193,7,0.12); color:#ffc107; border:1px solid rgba(255,193,7,0.3) }
.rc-pill-small { font-size: var(--text-xs)}
.rc-mono { font-family:var(--font-mono) }
.rc-slug { color:var(--text-muted); font-size: var(--text-sm)}
.rc-save-status { font-size: var(--text-sm); color:var(--text-muted); margin-right:8px }
.rc-form { display:grid; grid-template-columns:repeat(auto-fill,minmax(220px,1fr)); gap:12px }
.rc-fld { display:flex; flex-direction:column; gap:4px }
.rc-fld span { font-size: var(--text-sm); color:var(--text-secondary) }
.rc-fld span em { font-style:normal; color:var(--text-muted); font-size: var(--text-base)}
.rc-fld input {
  background:var(--bg-primary); color:var(--text-primary); border:1px solid var(--border);
  border-radius:5px; padding:6px 9px; font-size: var(--text-base); font-family:var(--font-mono);
}
.rc-fld input:focus { border-color:var(--blue); outline:none }
.rc-fld input.dirty { border-color:#ffc107 }
.rc-risk-note {
  margin-top:.6rem; padding:.55rem .7rem; background:rgba(240,136,62,.08);
  border-left:3px solid var(--warn,#f0883e); border-radius:4px;
  font-size: var(--text-xs); line-height: 1.5; color: var(--text-secondary);
}
.rc-rule-note { color:var(--text-muted); font-style:normal; font-size: var(--text-xs); line-height:1.45}
.rc-rule-text { font-size: var(--text-xs); line-height:1.45}
.rc-head-flex .ph-text { flex:1 1 auto; min-width:0 }
.rc-head-flex .ph-actions { flex-shrink:0; display:flex; align-items:center; gap:8px }
.rc-head-flex .ph-actions .btn { white-space:nowrap }
@media (max-width:768px) {
  .rc-table { min-width:520px }
  .rc-table th,
  .rc-table td { white-space:nowrap; max-width:none }
  .rc-table td:first-child { white-space:normal; max-width:190px }
  .rc-head-flex { flex-wrap:wrap }
  .rc-head-flex .ph-text { flex:1 1 100% }
  .rc-head-flex .ph-actions { flex-wrap:wrap }
}

/* 策略"通过测试"徽标 (前台脱敏: 只显示已通过的, 绿色) */
.strat-badges { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 5px; }
.strat-badge { font-size: var(--text-xs); font-weight: 600; color: var(--green-bright); background: var(--green-bg); border-radius: 3px; padding: 1px 6px; white-space: nowrap; }

/* ---- data_overview column-detail ---- */
.column-detail { background: var(--bg-card); border-top: 1px solid var(--border-light); }
.column-detail table { margin: 0; border: none; }
.column-detail table th {
  font-size: var(--text-sm); color: var(--text-muted); font-weight: 600;
  white-space: nowrap;
}
.column-detail table td { font-size: var(--text-sm); padding: 4px 10px; vertical-align: top; white-space: nowrap; }
.column-detail table.data-table th { padding: 6px 10px; }
.column-detail .column-detail .column-meta-table th,
.column-detail .column-meta-table td {
  border: none; border-bottom: 1px solid var(--border-light); padding: 6px 10px;
}
.column-detail .column-meta-table th { border-bottom: 2px solid var(--border-light); }
.column-detail .column-meta-table tbody tr:last-child td { border-bottom: none; }
.column-detail .column-meta-table th .text-xs { font-weight: 400; }
.table-group-row td { vertical-align: middle; }
.toggle-columns { white-space: nowrap; cursor: pointer; }
.text-xs { font-size: var(--text-xs); }
.text-sm { font-size: var(--text-sm); }
.text-base { font-size: var(--text-base); }
.text-md { font-size: var(--text-md); }
.text-lg { font-size: var(--text-lg); }
.text-xl { font-size: var(--text-xl); }
.text-2xl { font-size: var(--text-2xl); }
.text-3xl { font-size: var(--text-3xl); }
.column-detail-row > td { border-top: none; }

/* Horizontal scroll wrappers for wide tables */
.table-scroll,
.table-wrap {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  max-width: 100%;
}
/* Tables inside scroll wrappers expand to content width */
.table-scroll .data-table,
.table-wrap .data-table {
  width: auto;
  min-width: 100%;
}

/* Public pages: keep numeric cards and long labels inside their containers. */
.metric-card,
.do-card,
.strat-card,
.article-item,
.home-item {
  min-width: 0;
}

.metric-card .metric-value,
.metric-card .metric-ts,
.do-price-val,
.do-price-foot,
.home-item-title,
.home-item-sub,
.strat-card-name,
.strat-card-desc,
.article-title-link,
.article-excerpt {
  overflow-wrap: anywhere;
}

.home-item-val,
.strat-card .badge,
.paper-kv,
.cap-val {
  max-width: 100%;
}

.public-empty-state {
  border: 1px dashed var(--border);
  border-radius: 8px;
  background: var(--bg-secondary);
}
.pagination-bar {
  display:flex;
  align-items:center;
  justify-content:center;
  gap:8px;
  padding:12px 0;
  flex-wrap:wrap;
}
.pagination-info {
  color:var(--text-muted);
  font-size: var(--text-base);
  min-width:120px;
  text-align:center;
}

/* paginated-table row highlight */
.paginated-table .table-group-row:hover { background: var(--bg-hover); }

/* ------------------------------------------------------------------ */
/* Article Feed                                                        */
/* ------------------------------------------------------------------ */
.article-list { list-style: none; }

.article-item {
  padding: 16px 0;
  border-bottom: 1px solid var(--border-light);
  display: flex;
  gap: 14px;
  align-items: flex-start;
}

.article-item:last-child { border-bottom: none; }

.article-meta {
  font-size: var(--text-sm);
  color: var(--text-muted);
  white-space: nowrap;
  min-width: 80px;
}

.article-title-link {
  font-size: var(--text-lg);
  font-weight: 600;
  color: var(--text-primary);
}

.article-excerpt {
  font-size: var(--text-base);
  color: var(--text-secondary);
  margin-top: 4px;
}

/* ------------------------------------------------------------------ */
/* Grid layouts                                                        */
/* ------------------------------------------------------------------ */
.grid-2 {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 16px;
}
/* grid 子项默认 min-width:auto 不会缩到内容以下 → nowrap 文本会撑破列宽溢出视口;
   置 0 让列可收缩, 子级 overflow:hidden/ellipsis 才生效 (首页研报/策略行截断) */
.grid-2 > * { min-width: 0; }

/* ------------------------------------------------------------------ */
/* Admin-specific                                                      */
/* ------------------------------------------------------------------ */
.admin-container {
  margin-left: var(--sidebar-width);
  margin-top: var(--topbar-height);
  padding: 24px;
  min-height: calc(100vh - var(--topbar-height));
  min-width: 0;
  overflow-x: hidden;
}

.admin-messages { margin-bottom: 16px; }

.admin-msg {
  padding: 10px 16px;
  border-radius: var(--radius);
  font-size: var(--text-base);
  margin-bottom: 8px;
}
.admin-msg.success { background: var(--green-bg); color: var(--green-bright); border: 1px solid var(--green); }
.admin-msg.error { background: var(--red-bg); color: var(--red-bright); border: 1px solid var(--red); }
.admin-msg.info { background: var(--blue-bg); color: var(--blue); border: 1px solid var(--blue); }
.admin-msg.compact { padding:6px 10px; border-radius:4px; }

.progress-bar-outer { background: var(--bg-tertiary); border-radius: 4px; height: 14px; overflow: hidden; margin: 6px 0; }
.progress-bar-inner { height: 100%; border-radius: 4px; transition: width 0.3s ease; }
.progress-bar-outer.thin { height:6px; }
.progress-bar-inner.blue { width:0; background:var(--blue); }
.progress-bar-inner.green { width:0; background:var(--green); }
.progress-bar-inner.is-complete { width:100%; }
.progress-bar-inner.is-reset { width:0; }

.summary-stat {
  display: inline-flex;
  align-items: baseline;
  gap: 4px;
  padding: 8px 16px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
}
.summary-stat .stat-num { font-size: var(--text-xl); font-weight: 700; font-family: var(--font-mono); }
.summary-stat .stat-unit { font-size: var(--text-sm); color: var(--text-muted); }

/* ------------------------------------------------------------------ */
/* Form styles                                                         */
/* ------------------------------------------------------------------ */
.form-group { margin-bottom: 16px; }

.form-group label {
  display: block;
  font-size: var(--text-base);
  color: var(--text-secondary);
  margin-bottom: 4px;
  font-weight: 600;
}

.form-control {
  width: 100%;
  padding: 8px 12px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  color: var(--text-primary);
  font-size: var(--text-md);
  font-family: var(--font-mono);
}
.form-control:focus { outline: none; border-color: var(--blue); }

textarea.form-control { min-height: 200px; font-family: var(--font-sans); line-height: 1.6; }

.form-control-sm { max-width: 400px; }
.is-hidden { display: none !important; }

/* Inline checkbox label */
.checkbox-label {
  display: flex;
  align-items: center;
  gap: 8px;
}

/* Inline form */
.form-inline {
  display: flex;
  gap: 12px;
  align-items: flex-end;
  flex-wrap: wrap;
}

.form-inline .form-group { margin-bottom: 0; }

.action-bar {
  margin-top: 20px;
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
}

/* ------------------------------------------------------------------ */
/* Login page                                                          */
/* ------------------------------------------------------------------ */
.login-body {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 100vh;
  background: radial-gradient(ellipse at 50% 30%, var(--bg-secondary) 0%, var(--bg-primary) 70%);
}

.login-wrapper { width: 100%; max-width: 400px; padding: 0 20px; }

.login-header { text-align: center; margin-bottom: 28px; }

.login-logo {
  font-size: var(--text-2xl);
  font-weight: 800;
  font-family: var(--font-mono);
  color: var(--text-primary);
  letter-spacing: -0.5px;
}

.login-brand-ico {
  vertical-align: -7px;
  margin-right: 8px;
}


.login-remember {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: var(--text-base);
  color: var(--text-secondary);
  margin-bottom: 14px;
  cursor: pointer;
}

.login-remember input { accent-color: var(--blue); }

.login-badge {
  display: inline-block;
  font-size: var(--text-xs);
  padding: 2px 10px;
  border-radius: 10px;
  background: rgba(52, 211, 153, 0.12);
  color: var(--blue);
  margin-top: 6px;
  border: 1px solid rgba(52, 211, 153, 0.2);
}

.login-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 28px 24px;
}

.login-card label {
  display: block;
  font-size: var(--text-sm);
  color: var(--text-secondary);
  margin-bottom: 5px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

.login-input {
  display: block;
  width: 100%;
  padding: 11px 14px;
  margin-bottom: 18px;
  background: var(--bg-tertiary);
  border: 1px solid var(--border);
  border-radius: 6px;
  color: var(--text-primary);
  font-size: var(--text-md);
  font-family: var(--font-mono);
  transition: border-color 0.15s, box-shadow 0.15s;
}
.login-input:focus { outline: none; border-color: var(--blue); box-shadow: 0 0 0 3px rgba(52, 211, 153, 0.15); }

.login-btn {
  display: block;
  width: 100%;
  padding: 12px;
  margin-top: 4px;
  background: var(--accent);
  color: #07140F;
  border: none;
  border-radius: 6px;
  font-size: var(--text-md);
  font-weight: 600;
  cursor: pointer;
  font-family: var(--font-sans);
  transition: background 0.15s, transform 0.1s;
}
.login-btn:hover { background: var(--accent-2); }
.login-btn:active { transform: scale(0.98); }

.login-msg {
  padding: 10px 14px;
  border-radius: 6px;
  font-size: var(--text-base);
  margin-bottom: 18px;
  line-height: 1.4;
}
.login-msg.error { background: rgba(246, 70, 93, 0.12); color: var(--red-bright); border: 1px solid rgba(246, 70, 93, 0.3); }
.login-msg.success { background: rgba(46, 189, 133, 0.12); color: var(--green-bright); border: 1px solid rgba(46, 189, 133, 0.3); }

.login-footer { text-align: center; margin-top: 20px; }
.login-footer a { font-size: var(--text-base); color: var(--text-muted); text-decoration: none; transition: color 0.15s; }
.login-footer a:hover { color: var(--text-link); }

@media (max-width: 768px) {
  .login-logo { font-size: var(--text-xl); }
}

/* ------------------------------------------------------------------ */
/* Error and lockout pages                                             */
/* ------------------------------------------------------------------ */
.error-page-body,
.lockout-body {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 100vh;
  background: radial-gradient(ellipse at 50% 30%, var(--bg-secondary) 0%, var(--bg-primary) 70%);
  color: var(--text-primary);
  line-height: 1.5;
}

.error-page-body .error-wrapper,
.lockout-body .error-wrapper {
  text-align: center;
  padding: 40px 24px;
  max-width: 480px;
}

.error-page-body .error-code,
.lockout-body .error-code {
  font-family: var(--font-mono);
  font-size: var(--text-3xl);
  font-weight: 800;
  line-height: 1;
}

.error-page-body .error-code {
  color: var(--green);
  margin-bottom: 12px;
}

.lockout-body .error-code {
  color: var(--yellow);
  margin-bottom: 8px;
}

.error-page-body .error-title,
.lockout-body .error-title {
  font-size: var(--text-2xl);
  font-weight: 700;
  margin-bottom: 8px;
}

.error-page-body .error-desc,
.lockout-body .error-desc {
  font-size: var(--text-base);
  color: var(--text-muted);
}

.error-page-body .error-desc { margin-bottom: 28px; }
.lockout-body .error-desc { margin-bottom: 20px; }
.error-page-body .error-desc span,
.lockout-body .error-desc span { display: block; margin-top: 4px; }

.error-page-body .btn-group,
.lockout-body .btn-group {
  display: flex;
  gap: 10px;
  justify-content: center;
  flex-wrap: wrap;
}

.error-page-body .btn-group { margin-bottom: 28px; }
.lockout-body .btn-group { margin-bottom: 24px; }

.error-page-body .btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 10px 24px;
  border-radius: 6px;
  font-size: var(--text-md);
  font-weight: 600;
  cursor: pointer;
  text-decoration: none;
  transition: filter 0.15s;
}

.error-page-body .btn-primary { background: var(--green); color: #07140F; border: none; }
.error-page-body .btn-primary:hover { filter: brightness(0.9); text-decoration: none; }
.error-page-body .btn-ghost { background: transparent; border: 1px solid var(--border); color: var(--text-muted); }
.error-page-body .btn-ghost:hover { background: var(--hover); color: var(--text-primary); filter: none; text-decoration: none; }
.error-page-body .btn svg { width: 16px; height: 16px; flex-shrink: 0; }
.error-page-body .btn-primary svg { stroke: #fff; }
.error-page-body .btn-ghost svg { stroke: var(--text-muted); }

.error-page-body .footer,
.lockout-body .footer { font-size: var(--text-sm); color: var(--text-secondary); }
.error-page-body .footer a,
.lockout-body .footer a { color: var(--green); text-decoration: none; }
.error-page-body .footer a:hover,
.lockout-body .footer a:hover { text-decoration: underline; }

.lockout-body .error-icon { font-size: var(--text-3xl); margin-bottom: 8px; }
.lockout-icon-svg { color: var(--yellow); }
.countdown-box {
  background: var(--yellow-bg);
  border: 1px solid var(--yellow);
  border-radius: 8px;
  padding: 16px 24px;
  margin-bottom: 24px;
  display: inline-block;
}
.countdown-label {
  font-size: var(--text-sm);
  color: var(--yellow);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  margin-bottom: 4px;
}
.countdown-time {
  font-family: var(--font-mono);
  font-size: var(--text-3xl);
  font-weight: 700;
  color: var(--yellow);
  letter-spacing: 0.05em;
}
.countdown-time.expired { color: var(--green); }
.retry-btn {
  display: inline-block;
  padding: 10px 28px;
  background: var(--green);
  color: #07140F;
  border: none;
  border-radius: 6px;
  font-size: var(--text-md);
  font-weight: 600;
  cursor: pointer;
  text-decoration: none;
  transition: filter 0.15s;
}
.retry-btn:hover { filter: brightness(0.9); text-decoration: none; }
.retry-btn.disabled {
  background: var(--hover);
  color: var(--text-secondary);
  cursor: not-allowed;
  pointer-events: none;
  border: 1px solid var(--border);
}
.retry-btn.home { background: transparent; border: 1px solid var(--border); color: var(--text-muted); }
.retry-btn.home:hover { background: var(--hover); color: var(--text-primary); filter: none; }
.attempts-note { font-size: var(--text-xs); color: var(--text-secondary); margin-top: 4px; line-height: 1.45; }

/* ------------------------------------------------------------------ */
/* Utility classes                                                     */
/* ------------------------------------------------------------------ */
.font-mono { font-family: var(--font-mono); }

.mt-12 { margin-top: 12px; }
.mt-16 { margin-top: 16px; }
.mt-20 { margin-top: 20px; }
.mt-8 { margin-top: 8px; }
.mb-12 { margin-bottom: 12px; }
.mb-16 { margin-bottom: 16px; }
.mb-20 { margin-bottom: 20px; }
.panel-gap { margin-bottom: 20px; }

.gap-6 { gap: 6px; }
.text-muted { color: var(--text-muted); }
.text-secondary { color: var(--text-secondary); }
.cfg-status-muted { color: var(--text-muted); }
.cfg-status-ok { color: var(--green); }
.cfg-status-warn { color: var(--yellow); }
.cfg-status-err { color: var(--red-bright); }
.cfg-banner { background:var(--bg-secondary); border:1px solid var(--border); border-left:3px solid var(--blue); border-radius:8px; padding:12px 16px; margin-bottom:16px; color:var(--text-secondary); line-height:1.55; font-size: var(--text-base)}
.cfg-tabs { display:flex; gap:8px; flex-wrap:wrap; margin:0 0 14px }
.cfg-tab { border:1px solid var(--border); background:var(--bg-secondary); color:var(--text-secondary); border-radius:6px; padding:7px 12px; cursor:pointer; font-size: var(--text-base)}
.cfg-tab.active { color:var(--green); border-color:rgba(100,255,218,.35); background:rgba(100,255,218,.08) }
.cfg-pane { display:none }
.cfg-pane.active { display:block }
.cfg-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(230px,1fr)); gap:12px }
.cfg-field { display:flex; flex-direction:column; gap:4px }
.cfg-field span { color:var(--text-primary); font-size: var(--text-xs)}
.cfg-field small { color:var(--text-muted); line-height:1.4; font-size: var(--text-xs) }
.cfg-field input, .cfg-field select, .cfg-field textarea { background:var(--bg-primary); color:var(--text-primary); border:1px solid var(--border); border-radius:5px; padding:7px 9px; font-size: var(--text-base); font-family:var(--font-mono) }
.cfg-field input:disabled, .cfg-field select:disabled { opacity:.62; cursor:not-allowed }
.cfg-field textarea { min-height:92px; resize:vertical }
.cfg-label { display:flex; align-items:center; gap:6px; min-width:0 }
.cfg-label code { color:var(--text-muted); font-size: var(--text-xs); overflow:hidden; text-overflow:ellipsis }
.cfg-info { display:inline-flex; align-items:center; justify-content:center; width:16px; height:16px; flex:0 0 16px; border:1px solid var(--border); border-radius:50%; color:var(--text-muted); font-size: var(--text-xs); font-family:var(--font-sans); cursor:help }
.cfg-info:hover { border-color:var(--text-link); color:var(--text-link) }
.cfg-table { width:100%; border-collapse:collapse; font-size: var(--text-base)}
.cfg-table th { text-align:left; color:var(--text-muted); font-size: var(--text-sm); padding:7px 10px; border-bottom:1px solid var(--border) }
.cfg-table td { padding:8px 10px; border-bottom:1px solid var(--border); vertical-align:top }
.cfg-actions { display:flex; align-items:center; gap:10px; flex-wrap:wrap }
.cfg-actions-mt { margin-top:10px }
.cfg-status { color:var(--text-muted); font-size: var(--text-sm)}
.cfg-field-actions { display:flex; align-items:center; gap:8px; min-height:28px; flex-wrap:wrap }
.cfg-field-actions .btn { padding:4px 10px; font-size: var(--text-sm)}
.cfg-field-status { color:var(--text-muted); font-size: var(--text-sm)}
.cfg-pill { display:inline-block; border:1px solid var(--border); border-radius:4px; padding:1px 7px; color:var(--text-secondary); font-size: var(--text-sm)}
.cfg-pill.ok { border-color:rgba(100,255,218,.25); color:var(--green); background:rgba(100,255,218,.1) }
.cfg-note { color:var(--text-muted); font-size: var(--text-xs); line-height:1.5 }
.cfg-note-mb { margin-bottom:10px }
.cfg-note-mt { margin-top:10px }
.cfg-note-mt-lg { margin-top:12px }
.cfg-muted { color:var(--text-muted) }
.cfg-slug { color:var(--text-muted); font-weight:400 }
.cfg-section { border:1px solid var(--border); border-radius:8px; margin-bottom:12px; background:var(--bg-secondary) }
.cfg-section summary { cursor:pointer; padding:10px 12px; color:var(--text-primary); font-weight:600; font-size: var(--text-sm) }
.cfg-section summary small { display:block; margin-top:3px; color:var(--text-muted); font-weight:400; line-height:1.4; font-size: var(--text-xs) }
.cfg-section .cfg-section-body { padding:0 12px 12px }
/* 配置中心：页头/分区说明压到 xs，与数据生产折叠说明密度一致 */
body.admin .cfg-pane .panel-header .ph-desc,
body.admin .cfg-pane .ph-desc,
body.admin #config-root .page-head .ph-desc,
body.admin .cfg-banner,
body.admin .cfg-release-note,
body.admin .cfg-pane .panel-body > p {
  font-size: var(--text-xs);
  line-height: 1.45;
}
.cfg-readonly { opacity:.72 }
@media (max-width:768px) {
  .cfg-table { min-width:760px }
  .panel-body { overflow-x:auto }
}

.inline-form { display: inline; }
.panel-body-flush { padding: 0; }
.table-compact-sm { font-size: var(--text-sm); }
.badge-md { font-size: var(--text-sm); }
.badge-sm { font-size: var(--text-sm); }
.badge-xs { font-size: var(--text-xs); }
.code-mini { font-size: var(--text-xs); }
.code-chip {
  font-size: var(--text-sm); padding:2px 6px; background:var(--panel-2,rgba(128,128,128,0.12));
  border-radius:4px;
}
.panel-header-actions { margin-left:auto; display:flex; gap:8px; align-items:center; flex-wrap:wrap; }
.info-box-gap-sm { margin-bottom:14px; }
.subset-row { margin-bottom:10px; display:flex; align-items:center; gap:8px; flex-wrap:wrap; }

.interval-row {
  display: flex;
  gap: 12px;
  align-items: center;
  margin-bottom: 16px;
  flex-wrap: wrap;
}

/* 表单辅助文本 */
.help-text { margin-left:12px; font-size:var(--text-xs) }


.change-display {
  font-weight: 600;
  font-size: var(--text-md);
}

/* ------------------------------------------------------------------ */
/* 页头 / 说明框 / 术语注释 (P8 复用组件)                                */
/* 标题/说明角色类全局生效：不依赖 .page-head 包裹（V3/准入等自定义头） */
/* ------------------------------------------------------------------ */
.page-head { display:flex; align-items:flex-start; gap:13px; margin-bottom:18px; padding-bottom:16px; border-bottom:1px solid var(--border); }
.page-head .ph-ico { width:26px; height:26px; flex-shrink:0; margin-top:2px; stroke:currentColor; stroke-width:1.7; fill:none; stroke-linecap:round; stroke-linejoin:round; color:var(--text-link); }
.page-head .ph-text { flex:1; min-width:0; }
/* 页头标题阶 — 密度版 text-xl */
.ph-title,
.page-head .ph-title,
.hy-approval-title {
  font-size: var(--text-xl);
  font-weight: 500;
  color: var(--text-primary);
  line-height: 1.2;
}
/* 页头说明阶 — 密度版 text-xs（与注释类一致，禁止 text-base/md） */
.ph-desc,
.page-head .ph-desc,
.hy-approval-desc {
  font-size: var(--text-xs);
  color: var(--text-muted);
  margin-top: 4px;
  line-height: 1.45;
}
.page-head .ph-actions { display:flex; gap:8px; align-items:center; flex-wrap:wrap; }

/* 说明框: 段落级注释 (蓝=信息, 黄=注意) — 与前台注释阶 --text-xs 对齐 */
.info-box { display:flex; gap:10px; align-items:flex-start; border-radius:8px; padding:10px 12px; font-size: var(--text-xs); line-height:1.5; margin-bottom:16px; }
.info-box .ib-ico { flex-shrink:0; width:16px; height:16px; margin-top:2px; }
.info-box.info { background:var(--blue-bg); border:1px solid transparent; color:var(--text-secondary); }
.info-box.info .ib-ico { color:var(--text-link); }
.info-box.warn { background:var(--yellow-bg); border:1px solid transparent; color:var(--text-secondary); }
.info-box.warn .ib-ico { color:var(--yellow); }
.info-box strong { color:var(--text-primary); font-weight:500; }
.info-box code { background:var(--bg-tertiary); border-radius:3px; padding:0 5px; font-family:var(--font-mono); font-size: var(--text-md); }

/* 术语注释: 虚线下划线 + 原生 tooltip (title), 不受 panel overflow 裁剪 */
.term { border-bottom:1px dotted var(--text-muted); cursor:help; }
.help { display:inline-flex; align-items:center; justify-content:center; width:14px; height:14px; border-radius:50%; border:1px solid var(--text-muted); color:var(--text-muted); font-size: var(--text-xs); font-weight:600; cursor:help; vertical-align:1px; margin-left:3px; line-height:1; }
.help:hover { border-color:var(--text-link); color:var(--text-link); }

/* ------------------------------------------------------------------ */
/* 卡片化布局组件 (全站复用)                                            */
/* ------------------------------------------------------------------ */
/* 分区小标题: 一组卡片上方的轻量分隔标签 */
.section-label { font-size: var(--text-xs); color:var(--text-muted); text-transform:uppercase; letter-spacing:0.06em; margin:0 0 9px; display:flex; align-items:center; gap:7px; }
.section-label .sl-hint { text-transform:none; letter-spacing:0; color:var(--text-link); font-size: var(--text-xs); }
.section-subnote { font-size: var(--text-xs); color:var(--text-muted); font-weight:400; text-transform:none; letter-spacing:0; line-height:1.45; }
.ico-inline { vertical-align:-2px; }
.metric-link { display:block; color:inherit; text-decoration:none; }
.metric-link:hover { text-decoration:none; }
.metric-value-compact { font-size: var(--text-md); overflow-wrap:anywhere; }
.metric-value-sm { font-size: var(--text-xl); }
.metric-value-ok { color:var(--green); }
.metric-value-warn { color:var(--yellow); }
.metric-value-bad { color:var(--red); }
.badge-flow { display:flex; flex-wrap:wrap; gap:8px; }
.badge-tight { font-size: var(--text-xs); }
.progress-meter { width:100%; height:14px; display:block; border:0; border-radius:4px; overflow:hidden; background:var(--bg-tertiary); margin:6px 0; }
.progress-meter::-webkit-progress-bar { background:var(--bg-tertiary); border-radius:4px; }
.progress-meter::-webkit-progress-value { background:var(--blue); border-radius:4px; transition:width .3s ease; }
.progress-meter::-moz-progress-bar { background:var(--blue); border-radius:4px; transition:width .3s ease; }
.progress-note { margin-top:6px; font-size: var(--text-xs); color:var(--text-muted); line-height:1.45; }
.panel-note { font-size: var(--text-xs); color:var(--text-muted); line-height:1.5; }
.panel-note-gap { margin-bottom:10px; }
.panel-body-flush { padding:0; }
.row-slug { color:var(--text-muted); font-family:var(--font-mono); font-size: var(--text-xs); margin-left:6px; }
.row-muted { font-size: var(--text-xs); color:var(--text-muted); line-height:1.4; }
.summary-stat-row { display:flex; flex-wrap:wrap; gap:12px; font-size: var(--text-xs); }
.summary-footnote { margin-top:8px; font-size: var(--text-xs); color:var(--text-muted); line-height:1.45; }
.tier-row { display:flex; flex-wrap:wrap; gap:8px; align-items:center; margin-top:10px; }
.tier-label { font-size: var(--text-xs); color:var(--text-muted); }

/* 状态徽标行 (网络/服务健康) */
.status-chips { display:flex; flex-wrap:wrap; gap:8px; margin-bottom:20px; }
.status-chips .chip { font-size: var(--text-sm); border-radius:20px; padding:4px 12px; display:inline-flex; align-items:center; gap:6px; border:1px solid var(--border); color:var(--text-secondary); text-decoration:none; }
.status-chips .chip-dot { width:7px; height:7px; border-radius:50%; background:var(--text-muted); flex-shrink:0; }
.status-chips .chip-ok { background:var(--green-bg); color:var(--green-bright); border-color:transparent; }
.status-chips .chip-ok .chip-dot { background:var(--green-bright); }
.status-chips .chip-bad { background:var(--red-bg); color:var(--red-bright); border-color:transparent; }
.status-chips .chip-bad .chip-dot { background:var(--red-bright); }
/* 三色徽标第三态: 本节点不必须且未运行 = 灰 (不告警) */
.status-chips .chip-idle { background:var(--bg-hover); color:var(--text-muted); border-color:transparent; }
.status-chips .chip-idle .chip-dot { background:var(--text-muted); }
.status-chips .chip-bad .chip-dot { background:var(--red-bright); }
a.chip:hover { filter:brightness(0.9); }

/* DevOps overview */
.devops-node-line { align-items:center; }
.devops-node-text { margin-left:4px; }
.devops-action-row { display:flex; gap:8px; align-items:center; flex-wrap:wrap; }
.devops-action-row.mb { margin-bottom:12px; }
.devops-separator { align-self:center; }
.devops-result { margin-bottom:8px; }
.devops-progress { margin-top:8px; }
.devops-progress-meta { display:flex; justify-content:space-between; font-size: var(--text-sm); color:var(--text-muted); margin-bottom:3px; }
.devops-log-box { margin-top:8px; background:var(--bg-code); border:1px solid var(--border); border-radius:6px; max-height:250px; overflow-y:auto; padding:8px; }
.devops-log-box.compact { margin-top:6px; max-height:200px; }
.devops-log-content { margin:0; white-space:pre-wrap; word-break:break-all; font-family:var(--font-mono); font-size: var(--text-sm); color:var(--text-code); }
.devops-v3-actions { display:flex; gap:6px; flex-wrap:wrap; }
.devops-maker-grid { display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:12px; }
.devops-maker-grid > div { display:grid; gap:4px; min-width:0; padding:10px 12px; border:1px solid var(--border); border-radius:6px; background:var(--bg-secondary); }
.devops-mono-break { min-width:0; max-width:100%; font-family:var(--font-mono); overflow-wrap:anywhere; word-break:break-all; font-size:var(--text-sm); line-height:1.45; }
.devops-maker-blockers { margin-top:12px; }
.devops-role-findings { display:grid; gap:1px; background:var(--border); border-bottom:1px solid var(--border); }
.devops-role-finding { display:grid; gap:3px; padding:10px 14px; background:var(--bg-secondary); font-size:var(--text-sm); }
.devops-role-finding span { color:var(--text-muted); font-size:var(--text-xs); }
.devops-role-finding--bad strong { color:var(--red); }
.devops-role-finding--warn strong { color:var(--yellow); }
.devops-table-scroll { overflow-x:auto; }
.devops-role-note { padding:10px 14px; margin:0; border-top:1px solid var(--border); }
.devops-btn-xs { font-size: var(--text-sm); }
.devops-btn-log { font-size: var(--text-sm); }
.devops-empty { padding:14px; }
.devops-footnote { margin-top:8px; }
.devops-ico-inline { vertical-align:-2px; }
.devops-label-spaced { margin-left:10px; }
.devops-mode-note { margin-bottom:12px; }
.devops-toggle-msg { margin-left:4px; }
.devops-task-grid { display:grid; gap:16px; }
.devops-task-section + .devops-task-section { border-top:1px solid var(--border); padding-top:14px; }
.devops-subhead { display:flex; align-items:center; justify-content:space-between; gap:10px; margin-bottom:10px; color:var(--text-primary); font-size:var(--text-sm); font-weight:600; }
.devops-scroll-sm { max-height:190px; overflow-y:auto; line-height:1.5; }
.devops-activity-item { padding:7px 0; border-bottom:1px solid var(--border-light); color:var(--text-secondary); overflow-wrap:anywhere; }
.devops-activity-item:last-child { border-bottom:0; }
.devops-field-label { display:block; margin-bottom:6px; }
.devops-backfill-controls { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:8px; align-items:center; }
.devops-select-full { width:100%; min-width:0; margin:0; padding:6px 10px; }
.devops-backfill-result { margin-top:8px; }
.devops-panel-gap { margin-bottom:18px; }
.devops-panel-warn { border:1px solid var(--yellow); }
.devops-header-warn { background:var(--yellow-bg); }
.devops-health-badges { display:flex; align-items:center; gap:7px; margin-left:auto; }
.devops-health-body { display:grid; gap:12px; }
.devops-health-summary { display:flex; align-items:center; justify-content:space-between; gap:12px; font-size:var(--text-sm); }
.devops-health-age { flex:none; color:var(--text-muted); font-family:var(--font-mono); font-size:var(--text-xs); }
.devops-disclosure { border-top:1px solid var(--border); border-bottom:1px solid var(--border); }
.devops-disclosure summary { padding:10px 0; color:var(--text-secondary); font-size:var(--text-xs); cursor:pointer; }
.devops-disclosure[open] summary { color:var(--text-primary); }
.devops-body-note { padding:12px 16px; font-size: var(--text-xs); color:var(--text-dim); line-height:1.55; }
.devops-disclosure .devops-body-note { padding:0 0 12px; }
.devops-fallback-controls { margin-top:10px; display:flex; gap:8px; align-items:center; flex-wrap:wrap; }
.devops-fallback-msg { font-size: var(--text-sm); }
.devops-field-section .devops-subhead { margin-bottom:6px; }
.devops-compact-ok { padding:8px 0 2px; color:var(--text-muted); font-size:var(--text-sm); }
.devops-link-cell { margin-left:auto; }
.devops-table-sm { font-size: var(--text-sm); }
.devops-field-footnote { padding:8px 14px; font-size: var(--text-xs); color:var(--text-muted); line-height:1.45; }
.devops-header-tools { display:flex; gap:8px; align-items:center; }
.devops-log-select { font-size: var(--text-sm); padding:3px 6px; background:var(--bg-tertiary); color:var(--text-primary); border:1px solid var(--border); border-radius:4px; }
.devops-auto-label { font-size: var(--text-sm); color:var(--text-muted); cursor:pointer; }
.devops-live-log { max-height:450px; overflow-y:auto; }
.devops-text-primary { color:var(--text-primary); }
.devops-text-dim { color:var(--text-dim); }
.devops-text-link { color:var(--text-link); }
.devops-text-warn { color:var(--yellow); }
.devops-text-bad { color:var(--red); }
.devops-text-ok { color:var(--green); }
.devops-msg-muted { color:var(--text-dim); }
.devops-msg-success { color:var(--green); }
.devops-msg-error { color:var(--red); }
.devops-modal-pre { white-space:pre-wrap; max-height:220px; overflow:auto; margin-top:8px; }
.devops-modal-title { margin-top:8px; }
.devops-modal-log { font-size: var(--text-sm); line-height:1.45; max-height:180px; overflow:auto; }
.devops-modal-error { color:var(--red); }
.devops-modal-impact { margin-top:6px; }
.devops-risk-intro { margin-bottom:12px; }
.devops-risk-box { padding:10px 12px; background:var(--yellow-bg); border-radius:4px; font-size: var(--text-base); line-height:1.6; }
.devops-section-nav {
  display:flex;
  align-items:center;
  gap:4px;
  overflow-x:auto;
  margin:0 0 14px;
  padding:6px;
  border:1px solid var(--border);
  border-radius:8px;
  background:var(--bg-secondary);
  scrollbar-width:thin;
  position:sticky;
  top:52px;
  z-index:5;
}
.devops-section-nav a {
  flex:none;
  padding:5px 10px;
  border:1px solid transparent;
  border-radius:6px;
  color:var(--text-secondary);
  font-size:var(--text-sm);
  text-decoration:none;
  white-space:nowrap;
}
.devops-section-nav a:hover {
  color:var(--text-link);
  border-color:var(--border);
  background:var(--bg-hover);
}
.devops-title-badge { margin-left:8px; vertical-align:middle; font-size:var(--text-xs); }
.devops-kpi-grid { margin-bottom:14px; }
.devops-panel-tight > .panel-header { padding:10px 14px; }
.devops-panel-tight > .panel-body { padding:12px 14px; }
.devops-panel-tight .panel-body-flush { padding:0; }
.devops-disclosure-pad { padding:0 14px; border-top:0; border-bottom:1px solid var(--border); }
.devops-pad-x { padding:8px 14px 12px; margin:0; }

/* Promotion center */
.pc-head { display:flex; align-items:center; gap:8px; margin-bottom:4px; }
.pc-sub { font-size: var(--text-sm); color:var(--text-secondary); margin-bottom:14px; }
.pc-strip { display:flex; align-items:stretch; gap:6px; margin-bottom:14px; font-size: var(--text-sm); }
.pc-dom { flex:1; background:var(--bg-secondary); border:1px solid var(--border); border-radius:6px; padding:8px 10px; }
.pc-dom .l { color:var(--text-secondary); margin-bottom:3px; }
.pc-arrow { display:flex; flex-direction:column; align-items:center; justify-content:center; min-width:60px; }
.pc-arrow span { font-size: var(--text-xs); color:var(--text-secondary); }
.mono { font-family:var(--font-mono); }
.pc-panel { background:var(--bg-card); border:1px solid var(--border); border-radius:8px; margin-bottom:12px; }
.pc-ph { padding:10px 14px; border-bottom:1px solid var(--border); display:flex; align-items:center; gap:7px; }
.pc-ph .t { font-size: var(--text-base); font-weight:600; }
.pc-ph .g { font-size: var(--text-sm); color:var(--text-secondary); }
.pc-pb { padding:12px 14px; }
.pc-warn { display:flex; align-items:center; gap:8px; background:var(--yellow-bg); border:1px solid rgba(210,153,34,.4); border-radius:6px; padding:8px 10px; margin-bottom:10px; font-size: var(--text-sm); color:var(--text-primary); }
.pc-btn { border-radius:6px; padding:7px 14px; font-size: var(--text-sm); font-weight:600; cursor:pointer; background:transparent; }
.pc-btn-g { background:var(--green-bg); color:var(--green-bright); border:1px solid var(--green); }
.pc-btn-r { background:var(--red-bg); color:var(--red); border:1px solid var(--red); padding:6px 13px; }
.pc-btn-o { color:var(--text-link); border:1px solid var(--border); padding:5px 11px; font-weight:400; font-size: var(--text-sm); }
.pc-row { background:var(--bg-secondary); border:1px solid var(--border); border-radius:6px; padding:9px 11px; margin-bottom:8px; }
.pc-rowh { display:flex; justify-content:space-between; align-items:center; }
.pc-chip { padding:2px 7px; border-radius:10px; font-size: var(--text-xs); margin-right:5px; display:inline-block; }
.pc-chip-g { background:var(--green-bg); color:var(--green-bright); }
.pc-chip-b { background:var(--blue-bg); color:var(--blue); }
.pc-chip-y { background:var(--yellow-bg); color:var(--yellow); }
.pc-cand { background:var(--bg-secondary); border:1px solid var(--yellow); border-radius:6px; padding:10px 11px; margin-bottom:8px; }
.pc-appr { border:1px solid var(--green); }
.pc-led { display:flex; justify-content:space-between; font-size: var(--text-sm); color:var(--text-secondary); padding:3px 0; }
.pc-mut { font-size: var(--text-sm); color:var(--text-muted); }
.pc-foot { display:flex; align-items:center; gap:6px; margin-top:11px; font-size: var(--text-sm); color:var(--text-secondary); flex-wrap:wrap; }
.pc-pin { display:inline-flex; align-items:center; gap:6px; padding:4px 11px; border-radius:14px; font-size: var(--text-sm); font-weight:600; cursor:pointer; transition:filter .15s, background .15s; background:transparent; line-height:1; }
.pc-pin.on { background:var(--green-bg); color:var(--green-bright); border:1px solid var(--green); }
.pc-pin.off { background:var(--yellow-bg); color:var(--yellow); border:1px solid rgba(210,153,34,.5); }
.pc-pin:hover { filter:brightness(0.9); }
.pc-pin-dot { width:7px; height:7px; border-radius:50%; background:currentColor; box-shadow:0 0 5px currentColor; flex:none; }
.pc-flow { display:flex; align-items:center; gap:7px; flex-wrap:wrap; margin-bottom:10px; }
.pc-step { display:flex; align-items:center; gap:5px; font-size: var(--text-sm); padding:5px 11px; border-radius:14px; border:1px solid var(--border); background:var(--bg-secondary); color:var(--text-muted); }
.pc-step .pc-step-n { font-weight:700; }
.pc-step.done { border-color:var(--green); color:var(--green-bright); background:var(--green-bg); }
.pc-step.cur { border-color:var(--yellow); color:var(--yellow); background:var(--yellow-bg); font-weight:600; }
.pc-step.wait { opacity:.6; }
.pc-step-arr { color:var(--text-muted); font-size: var(--text-base); }
.pc-next { display:flex; align-items:flex-start; gap:7px; font-size: var(--text-sm); color:var(--text-secondary); background:var(--blue-bg); border:1px solid rgba(52, 211, 153,.3); border-radius:6px; padding:9px 12px; margin-bottom:13px; line-height:1.55; }
.pc-next.ready { background:var(--green-bg); border-color:var(--green); }
.pc-next b { color:var(--text-primary); }
.pc-empty { font-size: var(--text-sm); color:var(--text-muted); background:var(--bg-secondary); border:1px dashed var(--border); border-radius:6px; padding:9px 12px; display:flex; align-items:center; gap:7px; }
.pc-head-icon { width:1.1em; height:1.1em; color:var(--blue); }
.pc-title { font-size: var(--text-lg); font-weight:600; }
.pc-text-warn { color:var(--yellow); }
.pc-text-muted { color:var(--text-muted); }
.pc-text-ok { color:var(--green-bright); }
.pc-text-bad { color:var(--red); }
.pc-text-link { color:var(--text-link); }
.pc-text-primary { color:var(--text-primary); }
.pc-text-secondary { color:var(--text-secondary); }
.pc-text-faded { opacity:.6; }
.pc-arrow-sim { color:var(--green-bright); }
.pc-arrow-live { color:var(--red); }
.pc-icon-ok { color:var(--green-bright); }
.pc-icon-warn { color:var(--yellow); }
.pc-icon-bad { color:var(--red); }
.pc-icon-flex { flex:none; }
.pc-pin-spacer { margin-left:auto; }
.pc-mut-gap { margin-bottom:10px; }
.pc-mut-tight { margin-bottom:6px; }
.pc-action-row { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.pc-promotion-history { margin-top:12px; border-top:1px solid var(--border-light); padding-top:9px; }
.pc-worktree-btn { margin-left:auto; flex:none; align-self:center; }
.pc-section-row { display:flex; align-items:center; gap:5px; margin-bottom:7px; }
.pc-run-title { font-size: var(--text-sm); }
.pc-run-leg-row { margin-top:6px; font-size: var(--text-sm); display:flex; align-items:center; gap:5px; flex-wrap:wrap; }
.pc-sha-row { margin-top:5px; display:flex; align-items:center; gap:5px; flex-wrap:wrap; }
.pc-section-title { margin:14px 0 7px; }
.pc-rowh-gap { margin-bottom:7px; }
.pc-rowh-tight { margin-bottom:6px; }
.pc-candidate-title { font-size: var(--text-base); font-weight:600; }
.pc-approved-title { font-size: var(--text-base); font-weight:600; color:var(--green-bright); }
.pc-id-row { margin-bottom:7px; }
.pc-meta-row { margin-bottom:9px; }
.pc-icon-text { vertical-align:-2px; margin-right:4px; }
.pc-icon-text-sm { vertical-align:-2px; margin-right:3px; }
.pc-empty-gate { color:var(--text-secondary); }
.pc-modal-note { color:var(--text-muted); font-size: var(--text-xs); line-height:1.45; }
.pc-modal-warn { color:var(--yellow); }
.pc-modal-bad { color:var(--red); }
.pc-modal-pre { white-space:pre-wrap; font-size: var(--text-sm); color:var(--text-muted); margin-top:8px; max-height:240px; overflow:auto; }
.pc-modal-next { margin-top:8px; color:var(--yellow); font-size: var(--text-sm); }
.pc-modal-lead { font-size: var(--text-sm); color:var(--text-muted); margin-bottom:10px; }
@media (max-width: 768px) {
  .pc-strip { flex-direction: column; }
  .pc-arrow { min-width: 0; flex-direction: row; justify-content: center; gap: 6px; padding: 2px 0; }
  .pc-led, .pc-rowh { flex-wrap: wrap; gap: 2px 8px; }
}

/* Pipeline list */
.pipeline-title-sub { font-size: var(--text-xs); color:var(--text-muted); font-weight:400; }
.pipeline-guidance { display:block; padding:0; }
.pipeline-guidance summary {
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:12px;
  padding:10px 13px;
  cursor:pointer;
  list-style:none;
}
.pipeline-guidance summary::-webkit-details-marker { display:none; }
.pipeline-guidance summary::after {
  content:"＋";
  color:var(--yellow);
  font-size: var(--text-md);
  line-height:1;
}
.pipeline-guidance[open] summary::after { content:"−"; }
.pipeline-guidance summary span {
  margin-left:auto;
  color:var(--text-muted);
  font-size:var(--text-sm);
  font-weight:400;
}
.pipeline-guidance-body {
  display:flex;
  gap:10px;
  padding:0 13px 12px;
  border-top:1px solid rgba(210,153,34,.18);
  font-size:var(--text-sm);
  line-height:1.65;
}
.pipeline-guidance-body .ib-ico { margin-top:4px; }
.pipeline-link { color:var(--text-link); }
.pipeline-control-panel { margin-bottom:16px; }
.pipeline-control-row { display:flex; gap:10px; flex-wrap:wrap; align-items:center; margin-bottom:10px; }
.pipeline-select-label { cursor:pointer; font-size: var(--text-base); color:var(--text-secondary); margin-left:8px; }
.pipeline-running { color:var(--text-muted); font-size: var(--text-base); margin-left:12px; }
.pipeline-running strong { color:var(--text-link); }
.pipeline-progress-area { margin-top:8px; }
.pipeline-progress-meta { display:flex; justify-content:space-between; font-size: var(--text-sm); color:var(--text-muted); margin-bottom:4px; }
.pipeline-progress-meter { height:8px; margin:6px 0; }
.pipeline-progress-green::-webkit-progress-value { background:var(--green); }
.pipeline-progress-green::-moz-progress-bar { background:var(--green); }
.pipeline-global-meter { margin-bottom:24px; }
.pipeline-global-meter .pipeline-progress-meter { height:14px; }
.pipeline-log-viewer { margin-top:10px; background:var(--bg-code); border:1px solid var(--border); border-radius:6px; max-height:400px; overflow-y:auto; font-family:var(--font-mono); font-size: var(--text-sm); padding:10px; }
.pipeline-stage-log { max-height:300px; }
.pipeline-log-head { display:flex; justify-content:space-between; align-items:center; margin-bottom:8px; }
.pipeline-log-title { color:var(--text-muted); font-size: var(--text-sm); }
.pipeline-btn-xs { font-size: var(--text-sm); }
.pipeline-log-content { margin:0; white-space:pre-wrap; word-break:break-all; color:var(--text-code); }
.stage-panel { margin-bottom:16px; border-left:4px solid var(--yellow); }
.stage-panel.stage-ready { border-left-color:var(--green); }
.stage-header { display:flex; justify-content:space-between; align-items:center; cursor:pointer; }
.stage-title-row { display:inline-flex; align-items:center; gap:9px; min-width:0; }
.stage-select { accent-color:var(--blue); flex-shrink:0; }
.stage-status { font-size: var(--text-lg); width:22px; text-align:center; flex-shrink:0; line-height:0; color:var(--yellow); }
.stage-status.stage-status-ready { color:var(--green); }
.stage-id { font-weight:500; flex-shrink:0; color:var(--text-muted); }
.stage-name { color:var(--text-secondary); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.stage-completed { font-size: var(--text-sm); color:var(--text-muted); margin-left:6px; }
.stage-desc { margin-bottom:8px; color:var(--text-secondary); font-size:var(--text-xs); line-height:1.5; }
/* 输入/输出同一块内紧凑排列，禁止 flex gap 在换行后撑出空行 */
.stage-io {
  display:flex;
  flex-direction:column;
  gap:4px;
  margin:0 0 10px;
  padding:0;
  font-size:var(--text-xs);
  color:var(--text-muted);
  line-height:1.4;
}
.stage-io > div { margin:0; padding:0; line-height:1.4; }
.stage-io strong { color:var(--text-muted); font-weight:600; }
.stage-io code { color:var(--text-link); font-size:var(--text-xs); word-break:break-all; }
.stage-caliber { margin-bottom:10px; border:1px solid var(--border); border-radius:6px; background:var(--bg-tertiary); padding:10px 12px; }
.stage-caliber-title { font-size: var(--text-xs); font-weight:600; color:var(--text-secondary); margin-bottom:8px; }
.stage-caliber-cols { display:flex; gap:12px; flex-wrap:wrap; }
.stage-caliber-col { flex:1; min-width:220px; border-left:3px solid var(--green); padding-left:9px; }
.stage-caliber-label { font-size: var(--text-xs); font-weight:600; color:var(--text-muted); margin-bottom:3px; }
.stage-caliber-body { font-size: var(--text-xs); color:var(--text-secondary); line-height:1.45; }
.stage-caliber-footer { font-size: var(--text-xs); color:var(--text-muted); margin-top:8px; line-height:1.45; }
.stage-progress-area { margin:10px 0; }
.stage-action-row { display:flex; gap:8px; align-items:center; margin-top:10px; flex-wrap:wrap; }
.stage-status-text { font-size: var(--text-sm); color:var(--text-muted); }
.stage-status-text.status-run { color:var(--green); }
.stage-status-text.status-warn { color:var(--yellow); }
.stage-status-text.status-error { color:var(--red); }
.stage-status-text.status-muted { color:var(--text-muted); }
.stage-params { margin-top:12px; }
.stage-param-title { color:var(--text-muted); font-size: var(--text-sm); }
.stage-param-row { display:flex; flex-wrap:wrap; gap:6px; margin-top:4px; }
.stage-param-badge { background:var(--bg-tertiary); border:1px solid var(--border); font-size: var(--text-sm); }
.stage-param-value { color:var(--text-link); }
.stage-param-hint { color:var(--text-muted); font-size: var(--text-sm); }

/* Portfolio Lab */
.pf-field{display:flex;flex-direction:column;gap:4px;font-size: var(--text-sm);color:var(--text-muted)}
.pf-field input,.pf-field select{background:var(--bg-tertiary);border:1px solid var(--border);border-radius:4px;padding:6px 8px;color:var(--text-primary);font-size: var(--text-base)}
.pf-pill{font-size: var(--text-sm);background:var(--bg-tertiary);color:var(--text-secondary);border:1px solid var(--border);border-radius:5px;padding:4px 12px;cursor:pointer;user-select:none;white-space:nowrap}
.pf-pill.active{background:var(--blue);color:#07140F;border-color:var(--blue)}
.pf-pill:not(.active):hover{border-color:var(--text-muted);color:var(--text-primary);background:var(--bg-hover)}
.pf-wbar{height:14px;width:100%;display:block;margin:0;border:0;border-radius:3px;overflow:hidden;background:var(--bg-tertiary)}
.pf-wbar::-webkit-progress-bar{background:var(--bg-tertiary);border-radius:3px}
.pf-wbar::-webkit-progress-value{background:var(--blue);border-radius:3px}
.pf-wbar::-moz-progress-bar{background:var(--blue);border-radius:3px}
.pf-chart-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.pf-chart-box{background:var(--bg-card);border:1px solid var(--border);border-radius:8px;padding:12px;min-width:0}
.pf-chart-box .cap{display:flex;flex-direction:row;align-items:center;font-size: var(--text-sm);color:var(--text-secondary);margin-bottom:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pf-chart-box canvas{display:block;width:100%;height:200px;max-height:200px}
.pf-basket-row td{padding:7px 10px;border-top:1px solid var(--border-light)}
.pf-collapse-body{display:none}
.pf-collapse.open .pf-collapse-body{display:block}
.pf-chev{transition:transform .2s}
.pf-collapse.open .pf-chev{transform:rotate(180deg)}
.pf-help-panel{margin-bottom:20px;background:var(--bg-secondary);border:1px solid var(--border);border-radius:8px}
.pf-help-summary{padding:12px 16px;cursor:pointer;user-select:none;font-weight:600;color:var(--text-link)}
.pf-help-body{padding:4px 18px 16px;font-size: var(--text-base);line-height:1.8;color:var(--text-secondary)}
.pf-help-lead{color:var(--text-muted);margin-bottom:8px}
.pf-help-steps{margin-left:18px;display:flex;flex-direction:column;gap:6px}
.pf-help-foot{color:var(--text-muted);margin-top:10px}
.pf-metric-grid{margin-bottom:20px}
.pf-metric-grid .metric-card{min-height:108px}
.pf-metric-grid .metric-value{overflow-wrap:anywhere}
.pf-components-sub{font-size: var(--text-xs);line-height:1.4;white-space:normal}
.pf-panel-gap{margin-bottom:20px}
.pf-basket-hd{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap}
.pf-mode-row{display:flex;gap:6px;align-items:center}
.pf-mode-label{font-size: var(--text-sm);color:var(--text-muted)}
.pf-mode-select{background:var(--bg-tertiary);border:1px solid var(--border);border-radius:4px;padding:3px 6px;color:var(--text-primary);font-size: var(--text-sm)}
.pf-save-btn{font-size: var(--text-sm);padding:3px 8px}
.pf-alloc-pills{display:flex;gap:6px;flex-wrap:wrap;margin-left:auto}
.pf-include-col{width:40px}
.pf-weight-col{width:120px}
.pf-preview-col{width:160px}
.pf-check-cell{text-align:center}
.pf-strategy-name{font-weight:500;color:var(--text-primary)}
.pf-strategy-desc{font-size: var(--text-sm);color:var(--text-muted)}
.pf-num-pos{color:var(--green-bright)}
.pf-num-neg{color:var(--red-bright)}
.pf-num-muted{color:var(--text-muted)}
.pf-wt-input{width:78px;min-height:30px;background:var(--bg-tertiary);border:1px solid var(--border);border-radius:4px;padding:4px 6px;color:var(--text-primary);font-size: var(--text-base);font-variant-numeric:tabular-nums}
.pf-wt-input:disabled{opacity:.72;cursor:not-allowed;background:var(--bg-secondary)}
.pf-wtxt{font-size: var(--text-sm);color:var(--text-muted)}
.pf-empty-banner{padding:18px;color:var(--text-muted);font-size: var(--text-base);text-align:center}
.pf-cfg-header{cursor:pointer;display:flex;justify-content:space-between;align-items:center}
.pf-cfg-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:14px}
.pf-cfg-note{margin-top:14px}
.pf-status-note{font-size: var(--text-xs);color:var(--text-muted);margin-left:10px;line-height:1.4}
.pf-run-row{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.pf-mode-field{max-width:240px}
.pf-run-btn{font-weight:600}
.pf-run-msg{font-size: var(--text-base);color:var(--text-muted)}
.pf-run-output{margin-top:14px;max-height:300px;overflow:auto;background:var(--bg-code);border:1px solid var(--border);border-radius:4px;padding:12px;font-size: var(--text-sm);color:var(--text-code);white-space:pre-wrap}
.pf-output-head{display:flex;justify-content:space-between;align-items:center}
.pf-output-file{font-family:var(--font-mono);font-size: var(--text-sm);color:var(--text-muted)}
.pf-output-status-ok{color:var(--green-bright)}
.pf-output-muted{color:var(--text-muted)}
.pf-table-scroll{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}
.pf-table-scroll .data-table{min-width:760px}
.pf-table-scroll .pf-output-table{width:100%;min-width:100%;table-layout:fixed}
.pf-output-table th:nth-child(1){width:12%}
.pf-output-table th:nth-child(2){width:38%}
.pf-output-table th:nth-child(3){width:12%}
.pf-output-table th:nth-child(4){width:14%}
.pf-output-table th:nth-child(5){width:24%}
.pf-output-table td{min-width:0;overflow-wrap:anywhere}
.pf-table-scroll .pf-basket-table{width:100%;table-layout:fixed}
.pf-basket-table th:nth-child(1){width:6%}
.pf-basket-table th:nth-child(2){width:29%}
.pf-basket-table th:nth-child(3),.pf-basket-table th:nth-child(4),.pf-basket-table th:nth-child(5){width:11%}
.pf-basket-table th:nth-child(6){width:14%}
.pf-basket-table th:nth-child(7){width:18%}
.pf-basket-table td{min-width:0;overflow-wrap:anywhere}
.pf-weight-actions{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:12px 14px;border-top:1px solid var(--border);background:var(--bg-tertiary);font-size: var(--text-sm)}
.pf-weight-actions>div{display:flex;align-items:center;gap:10px;flex-wrap:wrap;min-width:0}
.pf-weight-actions .pf-status-note{margin-left:0}
.pf-empty-banner{border:1px dashed var(--border);border-radius:8px;background:var(--bg-tertiary);line-height:1.6}
.pf-msg-ok{color:var(--green)}
.pf-msg-warn{color:var(--yellow)}
.pf-msg-err{color:var(--red)}
.pf-msg-muted{color:var(--text-muted)}
@media(max-width:820px){.pf-chart-grid{grid-template-columns:1fr}}
@media(max-width:768px){
  .pf-metric-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .pf-basket-hd{flex-wrap:wrap;gap:8px}
  .pf-basket-hd-t{flex:1 1 100%}
  .pf-mode-row{width:100%;display:grid;grid-template-columns:1fr 1fr;align-items:stretch}
  .pf-mode-label{grid-column:1/-1}
  .pf-mode-select,.pf-save-btn{width:100%}
  .pf-mode-row [data-pf-apply-auto]{width:100%}
  .pf-basket-hd #alloc-pills{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;max-width:100%;padding-bottom:2px}
  .pf-basket-hd #alloc-pills::-webkit-scrollbar{display:none}
  .pf-table-scroll .pf-basket-table{min-width:900px}
  .pf-table-scroll .pf-output-table{width:100%;min-width:760px}
  .pf-weight-actions{align-items:stretch;flex-direction:column}
  .pf-weight-actions .pf-save-btn{width:100%}
}
@media(max-width:520px){.pf-metric-grid{grid-template-columns:1fr}.pf-chart-box canvas{height:180px}}

/* Feature Store: KPI 字号与数字口径一致，长时间戳不挤压相邻卡片。 */
.fm-metric-grid .metric-value{font-variant-numeric:tabular-nums}
.fm-metric-grid .fm-status-card .metric-value{font-size: var(--text-3xl);line-height:1.15}
.fm-metric-grid .fm-update-value{font-size: var(--text-base);line-height:1.55}
.fm-metric-grid .fm-update-value strong{font-size: var(--text-md);font-weight:600}
@media(max-width:520px){.fm-metric-grid .fm-status-card .metric-value{font-size: var(--text-2xl)}.fm-metric-grid .fm-update-value{font-size: var(--text-sm)}}

/* 指标卡内嵌图标 (metric-label 前缀) */
.metric-card .metric-label .ml-ico { width:13px; height:13px; vertical-align:-2px; margin-right:5px; stroke:currentColor; stroke-width:1.8; fill:none; }

/* 快捷入口磁贴 */
.qa-grid { display:grid; grid-template-columns:repeat(auto-fit, minmax(180px, 1fr)); gap:10px; }
.qa-tile { display:block; background:var(--bg-secondary); border:1px solid var(--border); border-radius:8px; padding:12px 14px; transition:border-color 0.15s, background 0.15s; }
.qa-tile:hover { border-color:var(--blue); text-decoration:none; background:var(--blue-bg); }
.qa-tile .qa-name { font-size: var(--text-md); color:var(--text-primary); font-weight:500; display:flex; align-items:center; gap:7px; }
.qa-tile .qa-name .qa-ico { width:16px; height:16px; stroke:currentColor; stroke-width:1.7; fill:none; opacity:0.85; }
.qa-tile .qa-sub { font-size: var(--text-sm); color:var(--text-muted); margin-top:4px; }

/* ------------------------------------------------------------------ */
/* Responsive — tablets (≤1024px)                                      */
/* ------------------------------------------------------------------ */
@media (max-width: 1024px) {
  .grid-2 { grid-template-columns: 1fr; }
  .metric-grid { grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); }
}

/* ------------------------------------------------------------------ */
/* Responsive — mobile (≤768px)                                        */
/* ------------------------------------------------------------------ */
@media (max-width: 768px) {
  html { font-size: var(--text-md); }

  /* 移动端 topbar 收矮 48px (单一真源: 所有 var(--topbar-height) 随之对齐) */
  :root { --topbar-height: 48px; }

  /* ── Topbar ── */
  .topbar {
    height: var(--topbar-height);
    padding: 6px 12px;
    flex-wrap: nowrap;
    gap: 8px;
    overflow: visible;   /* 主题下拉需溢出显示 */
  }

  .topbar-logo { font-size: var(--text-lg); white-space: nowrap; flex-shrink: 0; }

  .topbar-left { gap: 8px; flex-wrap: nowrap; overflow: hidden; }

  /* 移动端顶栏收敛: "后台" 徽章 + 普通节点徽章隐藏 (节点角色各页正文另有标注),
     仅保留 fallback 降级告警 (截断+省略号, 全文走 title)。释放横向空间给 logo/操作区, 防折行错位。 */
  .topbar-badge { display: none; }
  .node-badge:not(.node-badge--fallback) { display: none; }
  .node-badge--fallback {
    margin-left: 6px;
    max-width: 38vw;
    overflow: hidden;
    text-overflow: ellipsis;
  }

  .topbar-ticker {
    gap: 6px;
    font-size: var(--text-sm);
    flex-wrap: nowrap;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    max-width: calc(100vw - 140px);
    scroll-snap-type: x mandatory;
    white-space: nowrap;
    flex-shrink: 1;
    flex: 1 1 auto;
  }
  .topbar-ticker::-webkit-scrollbar { display: none; }
  .ticker-item {
    flex-shrink: 0;
  }

  .ticker-label { display: none; }

  /* 移动端 topbar 右侧: 主题切换改单按钮+下拉, 移动端也显示 (不再隐藏); 收敛间距防溢出 */
  .theme-switch { display: inline-flex; }
  .topbar-actions { gap: 4px; flex-shrink: 0; }
  /* 返回前台按钮不折行 (窄屏被压缩时整体收缩, 而非把 "返回前台" 拆成多行) */
  .topbar-actions .btn { white-space: nowrap; }

  .site-notice-banner {
    min-height: 40px;
    padding: 7px 40px 7px 12px;
    align-items: flex-start;
    justify-content: flex-start;
    font-size: var(--text-sm);
    line-height: 1.4;
  }
  .site-notice-banner__content {
    width: 100%;
    display: grid;
    grid-template-columns: max-content minmax(0, 1fr);
    align-items: start;
    justify-content: flex-start;
    gap: 1px 8px;
  }
  .site-notice-banner__label {
    grid-row: 1 / span 2;
    padding-top: 1px;
  }
  .site-notice-banner__message {
    min-width: 0;
    overflow-wrap: anywhere;
  }
  .site-notice-banner__time {
    grid-column: 2;
    min-width: 0;
    font-size: var(--text-xs);
    line-height: 1.3;
    letter-spacing: -0.02em;
  }
  .site-notice-banner__close {
    right: 6px;
    width: 28px;
    height: 28px;
    font-size: var(--text-xl);
  }

  /* ── Hamburger ── */
  .hamburger-btn { display: flex; }

  /* ── Sidebar ── */
  .sidebar {
    transform: translateX(-100%);
    top: var(--topbar-height);
    z-index: 95;
    height: calc(100vh - var(--topbar-height));
    box-shadow: 2px 0 12px rgba(0,0,0,0.3);
    overflow-y: auto;
  }
  .sidebar.open { transform: translateX(0); }

  .sidebar-overlay.active { display: block; }

  /* ── Main content ── */
  .main-content {
    margin-left: 0;
    margin-top: var(--topbar-height);
    padding: 12px;
  }

  /* ── Admin ── */
  .admin-container {
    margin-left: 0;
    margin-top: var(--topbar-height);
    padding: 16px;
    overflow-x: hidden;
  }

  /* ── 全局移动端兜底 (覆盖所有后台页, 防溢出/比例失调) ── */
  .admin-container img,
  .admin-container video,
  .admin-container iframe { max-width: 100%; height: auto; }
  .admin-container canvas { max-width: 100%; }
  /* 行内/导航图标固定尺寸，禁止 max-width:100% 撑成整卡黑块 */
  .admin-container svg:not(.nav-ico):not(.nav-chevron):not(.hub-card-ico):not(.qa-ico):not(.ml-ico):not(.ph-ico):not(.ico):not(.ib-ico) {
    max-width: 100%;
  }
  .admin-container pre { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  /* 内联固定 min-width 的 flex 子项在窄屏放开, 防把整行撑破 (网格 minmax 不含 'min-width' 字串, 不受影响) */
  .admin-container [style*="min-width"] { min-width: 0 !important; }
  /* 卡片/面板/容器满宽不外溢 */
  .panel, .card, .pt-card { max-width: 100%; }


  /* ── Page header ── */
  .page-title { font-size: var(--text-xl); }

  /* ── Panels ── */
  .panel-header { padding: 10px 14px; font-size: var(--text-base); }
  .panel-body { padding: 14px; overflow-x: auto; -webkit-overflow-scrolling: touch; }
  /* 表格移动端横向滚动: 默认让表自身成可横滚块, 防撑破屏幕 (修 数据仓库/文章/对账等后台表) */
  .data-table {
    display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; white-space: nowrap; max-width: 100%;
  }
  /* 有滚动容器的表: 由容器负责横滚, 表恢复正常 table 布局 + min-width 撑开 */
  .panel-body .data-table,
  .table-wrap .data-table,
  .table-scroll .data-table { display: table; white-space: normal; min-width: max-content; width: 100%; }
  /* 模拟交易页 pt-tbl(风控/事件/持仓/成交/对账): 列多, 移动端横向滚动防溢出 */
  .pt-tbl { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; white-space: nowrap; max-width: 100%; }
  /* 监控检查项表 (分组/检查项/状态/详情): 状态页应一眼可读 → 不横滚, 整表适配视口, 详情列换行。
     必须 table-layout:fixed —— auto 布局会让详情(含长串)膨胀到上万 px 触发横滚。固定列宽 + 全列可换行。 */
  .pt-tbl--wrap { display: table; width: 100%; table-layout: fixed; white-space: normal; overflow-x: visible; }
  .pt-tbl--wrap th, .pt-tbl--wrap td { white-space: normal; word-break: break-word; overflow-wrap: anywhere; }
  .pt-tbl--wrap th:nth-child(1), .pt-tbl--wrap td:nth-child(1) { width: 15%; }
  .pt-tbl--wrap th:nth-child(2), .pt-tbl--wrap td:nth-child(2) { width: 30%; }
  .pt-tbl--wrap th:nth-child(3), .pt-tbl--wrap td:nth-child(3) { width: 17%; }
  .pt-tbl--wrap th:nth-child(4), .pt-tbl--wrap td:nth-child(4) { width: 38%; }
  .pt-row { flex-direction: column; }
  .pt-col { min-width: 0 !important; width: 100%; }
  /* 实时盘口深度表: 固定 3 列紧凑布局, 不走通用 pt-tbl 横滚 (display:block+nowrap 会破坏深度渐变条/列对齐) —— 保持正常 table 满宽, 数字过长截断不换行 */
  .pt-depth-tbl { display: table; table-layout: fixed; width: 100%; overflow: visible; }
  .pt-depth-tbl th, .pt-depth-tbl td { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  /* 盘口 wrapper 在窄屏占满整行 (桌面 290px 固定基在 <290 容器会溢出) */
  .pt-depth-wrap { flex-basis: 100% !important; max-width: 100%; }

  /* ── Metric cards ── */
  .metric-grid {
    grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
    gap: 8px;
  }

  .metric-card { padding: 12px; }
  .metric-card .metric-value { font-size: var(--text-xl); }

  /* ── Tables: scrollable ── */
  .data-table { font-size: var(--text-base); }
  .data-table th,
  .data-table td {
    padding: 6px 8px;
    font-size: var(--text-sm);
  }

  /* Wrapper to allow horizontal scroll on tables */
  .table-scroll,
  .table-wrap {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    max-width: 100%;
  }

  /* 前台移动端数据表保持表格结构，由外层容器横向滚动；不再拆成卡片。 */
  .site-public .main-content .table-wrap {
    overflow-x: auto;
    overflow-y: hidden;
    -webkit-overflow-scrolling: touch;
    touch-action: pan-x pan-y;
    scrollbar-width: thin;
  }

  /* 前台所有 table 元素兜底：没有 table-wrap 也保证不溢出屏幕 */
  .site-public .main-content table {
    max-width: 100%;
  }

  .site-public .main-content .table-wrap .data-table:has(td[data-label]) {
    display: table;
    table-layout: auto;
    width: 100%;
    white-space: nowrap;
  }

  .site-public .main-content .table-wrap .data-table:has(td[data-label]) thead {
    display: table-header-group;
  }

  .site-public .main-content .table-wrap .data-table:has(td[data-label]) tbody {
    display: table-row-group;
  }

  .site-public .main-content .table-wrap .data-table:has(td[data-label]) tr {
    display: table-row;
    background: transparent;
  }

  .site-public .main-content .table-wrap .data-table:has(td[data-label]) th,
  .site-public .main-content .table-wrap .data-table:has(td[data-label]) td {
    display: table-cell;
    width: auto;
    vertical-align: middle;
    white-space: nowrap;
  }

  .site-public .main-content .table-wrap .data-table:has(td[data-label]) td::before {
    content: none;
    display: none;
  }

  .site-public .main-content .table-wrap .data-table:has(td[data-label]) th,
  .site-public .main-content .table-wrap .data-table:has(td[data-label]) td {
    text-align: left;
  }

  .site-public .main-content .table-wrap .data-table:has(td[data-label]) th.num,
  .site-public .main-content .table-wrap .data-table:has(td[data-label]) td.num {
    text-align: right;
    font-feature-settings: "tnum";
    font-variant-numeric: tabular-nums;
  }

  .site-public .main-content .table-wrap .data-table:has(td[data-label]) th.ctr,
  .site-public .main-content .table-wrap .data-table:has(td[data-label]) td.ctr {
    text-align: center;
  }

  /* ── Grid ── */
  .grid-2 { grid-template-columns: 1fr; gap: 12px; }

  /* ── Summary stats ── */
  .summary-stat { padding: 6px 12px; }
  .summary-stat .stat-num { font-size: var(--text-lg); }

  /* ── Article feed ── */
  .article-item { flex-direction: column; gap: 4px; padding: 12px 0; }
  .article-meta { min-width: unset; }

  /* ── Charts ── */
  .chart-container { min-height: 350px; }

  /* ── Kline page mobile optimizations ── */
  .page-title { font-size: var(--text-lg) !important; }

  .kline-head-card {
    padding: 10px 12px !important;
    margin-bottom: 8px !important;
    border-radius: 10px;
  }
  .kline-head-main {
    align-items: center !important;
    gap: 10px !important;
  }
  .kline-head-card .page-title {
    font-size: var(--text-base) !important;
    line-height: 1.25 !important;
  }
  .kline-head-card .page-subtitle {
    font-size: var(--text-xs) !important;
    margin-top: 2px !important;
  }
  .kline-head-quote {
    align-items: flex-end !important;
    text-align: right !important;
  }
  #kline-info-close,
  .kline-head-quote .kline-close {
    font-size: var(--text-lg) !important;
    font-weight: 700;
    line-height: 1.1 !important;
  }
  #kline-info-chg,
  .kline-head-quote .kline-change {
    font-size: var(--text-xs) !important;
    margin-left: 0;
  }

  #kline-info-bar {
    flex-direction: column !important;
    align-items: flex-start !important;
    gap: 4px !important;
    margin-bottom: 10px !important;
  }

  #kline-info-time {
    font-size: var(--text-xs) !important;
  }

  #kline-info-ohlc {
    width: 100%;
    gap: 6px !important;
    font-size: var(--text-xs) !important;
  }

  #kline-info-ohlc div {
    font-size: var(--text-xs) !important;
    white-space: nowrap;
  }

  #kline-info-ohlc span {
    font-size: var(--text-xs) !important;
  }

  /* ── Interval row: compact on mobile ── */
  .interval-row {
    flex-wrap: wrap;
    gap: 4px 6px;
  }

  .interval-row .btn-group {
    flex-wrap: wrap;
    gap: 3px;
  }

  .kline-group-btn {
    padding: 3px 6px;
    font-size: var(--text-xs);
    min-height: 0;
    line-height: 1.2;
  }

  /* K 线工具条：周期/市场/指标标签与按钮整体再压一档（覆盖 .site-public .btn-sm） */
  .public-kline .interval-row {
    gap: 4px 6px;
    margin-bottom: 8px;
  }
  .public-kline .interval-row .btn-group {
    gap: 2px;
  }
  .public-kline .interval-row .kline-toolbar-label,
  .public-kline .interval-row .text-sm,
  .public-kline .interval-row .text-meta {
    font-size: var(--text-xs) !important;
    line-height: 1.2;
    margin-right: 2px;
  }
  .public-kline .interval-row .btn,
  .public-kline .interval-row .btn-sm,
  .public-kline .interval-row .kline-group-btn {
    font-size: var(--text-xs) !important;
    min-height: 26px !important;
    padding: 2px 6px !important;
    line-height: 1.2;
    border-radius: var(--radius-btn-sm, 6px);
  }
  .public-kline .interval-row .kline-group-btn {
    border-radius: 0;
  }
  .public-kline .interval-row .kline-group-btn:first-of-type {
    border-radius: 5px 0 0 5px;
  }
  .public-kline .interval-row .kline-group-btn:last-of-type {
    border-radius: 0 5px 5px 0;
  }
  .public-kline .interval-row .hy-i {
    width: 12px;
    height: 12px;
    font-size: var(--text-xs);
  }

  /* ── Table: compact on mobile ── */
  .data-table th,
  .data-table td {
    padding: 4px 6px;
    font-size: var(--text-xs);
  }

  .table-scroll {
    -webkit-overflow-scrolling: touch;
  }

  /* ── Login ── */
  .login-wrapper { padding: 0 12px; }
  .login-card { padding: 20px 16px; }

  /* ── Footer：版权 + 法律链接同一行，字号压小 ── */
  .site-public .site-footer {
    flex-direction: row;
    flex-wrap: nowrap;
    align-items: center;
    justify-content: space-between;
    gap: 6px 8px;
    margin-top: 20px;
    padding: 10px 0;
    font-size: var(--text-xs); /* 10px */
  }
  .site-public .footer-copy {
    flex: 0 1 auto;
    min-width: 0;
    white-space: nowrap;
    font-size: var(--text-xs);
    line-height: 1.3;
  }
  .site-public .footer-links {
    display: flex;
    flex: 0 1 auto;
    flex-wrap: nowrap;
    gap: 6px 8px;
    margin-left: auto;
    justify-content: flex-end;
    min-width: 0;
  }
  .site-public .footer-links a {
    font-size: var(--text-xs); /* 10px */
    line-height: 1.3;
    white-space: nowrap;
  }
  /* 后台页脚仍可纵向堆叠 */
  body.admin .site-footer {
    flex-direction: column;
    align-items: flex-start;
    gap: 8px;
  }

  /* ── Interval row ── */
  .interval-row { gap: 8px; }
  
  /* ── Form ── */
  .form-inline { flex-direction: column; align-items: stretch; }
  .form-control-sm { max-width: 100%; }

  /* ── Action bar ── */
  .action-bar { flex-direction: column; }

  /* ── Button group wrap ── */
  .btn-group {
    flex-wrap: wrap;
  }

  /* ── Panel overflow ── */
  .panel-body {
    overflow-x: auto;
    word-break: break-word;
    overflow-wrap: break-word;
    min-width: 0;
  }

  .param-stage-panel {
    overflow: hidden;
    min-width: 0;
  }

  .param-card {
    min-width: 0;
    max-width: 100%;
    word-break: break-word;
    overflow-wrap: break-word;
  }

  /* ── 参数 grid: 手机端单列布局 ── */
  .param-grid,
  .param-grid-fixed,
  .param-io-footer {
    grid-template-columns: 1fr !important;
    min-width: 0;
  }

  .param-io-footer > * {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
  }

  /* ── Data overview: force column detail overflow scroll ── */
  .column-detail-row td {
    padding: 0 !important;
  }

  .column-detail {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    padding: 4px;
  }

  .column-detail 
  .column-detail .column-meta-table th,
  .column-detail .column-meta-table td {
    font-size: var(--text-xs);
    padding: 4px 6px;
    white-space: nowrap;
  }

  .toggle-columns {
    font-size: var(--text-xs);
    padding: 3px 8px;
  }

  /* ── Table overview: reduce padding ── */
  .data-table#table-overview th,
  .data-table#table-overview td {
    padding: 6px 6px;
    font-size: var(--text-sm);
  }

  .data-table#table-overview .badge {
    font-size: var(--text-xs);
    padding: 1px 6px;
  }

  /* ── IP 白名单移动端适配 ── */
  .ip-whitelist-page .info-box.warn { font-size: var(--text-xs); }
  .ip-whitelist-page textarea.form-control { min-height: 120px; }
  .ip-whitelist-page .ip-help-body { font-size: var(--text-xs); }

}

/* ── Admin: Data quality & action buttons ── */
.action-btn-group { display:flex; gap:4px; flex-wrap:wrap; }
.action-btn-group .btn { font-size: var(--text-xs); padding: 2px 8px; }
.pct-bar { display: inline-flex; align-items: center; gap: 4px; }
.pct-bar 
.quality-badge {
  display: inline-flex; align-items: center; gap: 3px;
  padding: 2px 7px; border-radius: 4px; font-size: var(--text-xs); font-weight: 600;
}
.quality-badge.ok { background: var(--green-bg); color: var(--green-bright); }
.quality-badge.warn { background: var(--yellow-bg); color: var(--yellow); }
.quality-badge.error { background: var(--red-bg); color: var(--red); }

.log-viewer pre { margin:0; white-space:pre-wrap; font-family:var(--font-mono); font-size: var(--text-sm); line-height:1.6; }
.log-viewer { max-height:300px; overflow-y:auto; }

/* ─── 统一弹窗 modal (设计系统; 全站复用 hyModal/hyConfirm, 替代原生 alert/confirm) ─── */
.hy-modal-overlay { position:fixed; inset:0; background:rgba(0,0,0,0.6); backdrop-filter:blur(2px);
  z-index:9998; display:none; align-items:center; justify-content:center; padding:20px; }
.hy-modal-overlay.open { display:flex; }
.hy-modal { background:var(--bg-card); border:1px solid var(--border); border-radius:12px;
  max-width:min(560px,94vw); width:100%; max-height:88vh; overflow:auto;
  box-shadow:0 16px 48px rgba(0,0,0,0.5); animation:hyModalIn 0.15s ease; }
@keyframes hyModalIn { from{opacity:0;transform:translateY(8px) scale(0.98);} to{opacity:1;transform:none;} }
.hy-modal-head { display:flex; align-items:center; gap:8px; padding:14px 18px;
  border-bottom:1px solid var(--border); font-size: var(--text-md); font-weight:600; color:var(--text-primary); }
.hy-modal-x { margin-left:auto; cursor:pointer; color:var(--text-muted); font-size: var(--text-xl);
  line-height:1; background:none; border:none; padding:0 2px; }
.hy-modal-x:hover { color:var(--text-primary); }
.hy-modal-body { padding:16px 18px; font-size: var(--text-base); color:var(--text-secondary); line-height:1.6; }
.hy-modal-text { padding:8px 0; line-height:1.6; }
.hy-modal-foot { display:flex; justify-content:flex-end; gap:8px; padding:12px 18px; border-top:1px solid var(--border); }
.hy-mbtn { border-radius:7px; padding:7px 16px; font-size: var(--text-base); font-weight:600; cursor:pointer;
  border:1px solid var(--border); background:transparent; color:var(--text-secondary); }
.hy-mbtn:hover { background:var(--bg-hover, rgba(255,255,255,0.05)); color:var(--text-primary); }
.hy-mbtn-primary { background:var(--blue); border-color:var(--blue); color:#07140F; }
.hy-mbtn-primary:hover { filter:brightness(0.9); }
.hy-mbtn-danger { background:var(--red-bg); border-color:var(--red); color:var(--red); }
.hy-mbtn-danger:hover { filter:brightness(0.9); }
.hy-copy-flash { border-color:var(--green) !important; color:var(--green) !important; }
/* 宽屏弹窗 (台账/大数据表格等) */
.hy-modal--wide { max-width:min(1100px,94vw); }
/* 弹窗内报告链接 (策略研发历史等) */
.hy-report-link { display:inline-flex; align-items:center; gap:5px; margin-top:14px; padding:6px 14px;
  border:1px solid var(--blue); border-radius:6px; color:var(--text-link); font-size: var(--text-base); text-decoration:none; }
.hy-report-link:hover { background:var(--blue-bg, rgba(59,130,246,0.1)); }
/* modal 内 K-V 信息行 (查证据等结构化展示) */
.hy-kv { display:flex; justify-content:space-between; gap:14px; padding:7px 0;
  border-bottom:1px solid var(--border); font-size: var(--text-base); }
.hy-kv:last-child { border-bottom:none; }
.hy-kv .k { color:var(--text-muted); white-space:nowrap; }
.hy-kv .v { color:var(--text-primary); font-family:var(--font-mono); text-align:right; word-break:break-all; }
/* 可复制指纹 chip (SHA/hash 人类友好展示: 带标签 + 点击复制) */
.hy-sha { display:inline-flex; align-items:center; gap:4px; font-family:var(--font-mono); font-size: var(--text-sm);
  background:var(--bg-primary); border:1px solid var(--border); border-radius:5px; padding:1px 7px;
  cursor:pointer; color:var(--text-secondary); transition:border-color 0.12s, color 0.12s; vertical-align:1px; }
.hy-sha:hover { border-color:var(--blue); color:var(--blue); }
.hy-sha .hy-sha-l { color:var(--text-muted); font-family:inherit; font-size: var(--text-xs); }

/* ─── 栏目管理颜色选择器 (article_categories.html; 弹窗内复用) ─── */
.category-list-panel { margin-bottom:20px }
.category-form-panel { max-width:560px }
.category-form-grid { gap:12px; margin-bottom:12px }
.category-color-group { margin-bottom:12px }
.category-drag-col { width:40px }
.category-drag-cell { cursor:grab; text-align:center; color:var(--text-muted) }
.category-slug-code { font-size: var(--text-sm)}
.category-empty-cell { text-align:center; padding:20px }
.panel-body-flush { padding:0 }
.form-group-flush { margin-bottom:0 }
.color-picker { display:flex; gap:8px; flex-wrap:wrap; margin-top:4px; }
.color-chip {
  width:28px; height:28px; border-radius:50%; border:2px solid transparent;
  cursor:pointer; transition:transform .15s,border-color .15s;
}
.color-chip:hover { transform:scale(1.15); }
.color-chip.selected { border-color:var(--text-primary); transform:scale(1.1); }
.color-chip-blue    { background:var(--blue,#3b82f6); }
.color-chip-green   { background:var(--green,#22c55e); }
.color-chip-yellow  { background:var(--yellow,#eab308); }
.color-chip-red     { background:var(--red,#ef4444); }
.color-chip-purple  { background:var(--purple,#a855f7); }
.color-chip-cyan    { background:var(--cyan,#06b6d4); }
.color-chip-orange  { background:var(--orange,#f97316); }
.drag-handle:active { cursor:grabbing; }

/* ─── 文章正文排版（prose）─── */
/* 全局 reset 把 margin/padding 归零，article-body 需要独立恢复排版默认值 */
.article-body { overflow:hidden; }
.article-body p  { margin-bottom:1.2em; line-height:1.75; }
.article-body h1,.article-body h2,.article-body h3,
.article-body h4,.article-body h5,.article-body h6 {
  margin-top:1.8em; margin-bottom:0.6em; line-height:1.3; font-weight:600;
}
.article-body ul,.article-body ol { margin:0.8em 0 0.8em 1.6em; }
.article-body li  { margin-bottom:0.4em; line-height:1.7; }
.article-body blockquote { margin:1em 0; padding:0.5em 1em;
  border-left:3px solid var(--border); color:var(--text-secondary); }
.article-body table { width:100%; border-collapse:collapse; margin:1em 0; font-size: var(--text-base); }
.article-body th,.article-body td { padding:8px 12px; border:1px solid var(--border); text-align:left; }
.article-body th { background:var(--bg-secondary,rgba(255,255,255,0.05)); font-weight:600; }
.article-body hr { border:none; border-top:1px solid var(--border); margin:1.5em 0; }
/* 图片与 figure 约束 */
.article-body img { max-width:100%; height:auto; display:block; box-sizing:border-box; }
.article-body figure { max-width:100%; margin:1.5em 0; overflow:hidden; text-align:center; }
.article-body figcaption {
  max-width:100%; margin-top:8px; color:var(--text-muted);
  font-family:serif; font-size: var(--text-sm); line-height:1.5;
}
@media (min-width: 769px) {
  .article-body figure { max-width:820px; margin-left:auto; margin-right:auto; }
  .article-body figure img { margin-left:auto; margin-right:auto; }
}

.article-review-head { margin-bottom: 12px; }
.article-review-strip {
  display:flex; align-items:center; justify-content:space-between; gap:12px;
  margin-bottom:18px; padding:12px 14px; border:1px solid var(--border);
  border-radius:8px; background:var(--bg-card);
}
.article-review-strip > div { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.article-review-hash { color:var(--text-muted); font-size: var(--text-sm); }
.article-review-published { color:var(--green); font-size: var(--text-base); font-weight:600; }
.article-review-preview { max-width:820px; margin:0 auto 28px; }
.article-review-preview .page-header { text-align:center; margin-bottom:18px; }

@media (max-width: 640px) {
  .article-review-strip { align-items:stretch; flex-direction:column; }
  .article-review-strip .btn { width:100%; justify-content:center; }
  .article-review-preview .page-title { font-size: var(--text-2xl); }
}

/* ─── 文章摘要框 ─── */
.article-excerpt-box {
  position: relative;
  margin-bottom: 2em;
  padding: 1em 1.2em 1em 1.4em;
  border-left: 3px solid var(--accent);
  background: var(--bg-secondary, rgba(74,158,255,0.06));
  border-radius: 0 6px 6px 0;
}
.article-excerpt-label {
  display: inline-block;
  font-size: var(--text-sm);
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--accent);
  margin-bottom: 0.5em;
}
.article-excerpt-box p {
  margin: 0;
  line-height: 1.75;
  color: var(--text-secondary, inherit);
  font-size: var(--text-md);
}

/* ═══════════════ 交易面板组件层 (trade-panel) ═══════════════
   Binance 模拟盘 + 实盘共享。原 paper_trading.html 内联 <style>, 移入 hy.css
   供 demo/live 的 _trade_panel.html include 复用 (hy.css 唯一规范, 同 pc- 参数中心先例)。 */
.pt-kpi { background:var(--bg-secondary); border:1px solid var(--border); border-radius:8px; padding:14px 16px }
.pt-kpi .lbl { font-size: var(--text-sm); color:var(--text-muted); margin-bottom:6px }
.pt-kpi .val { font-size: var(--text-2xl); font-weight:600; font-family:var(--font-mono); color:var(--text-link) }
.pt-kpi .sub { font-size: var(--text-sm); color:var(--text-secondary); margin-top:4px }
.pt-grid4 { display:grid; grid-template-columns:repeat(4,1fr); gap:12px; margin:12px 0 }
.pt-row { display:flex; gap:12px; flex-wrap:wrap } .pt-col { flex:1; min-width:300px }
.pt-bar { display:flex; align-items:center; gap:12px; flex-wrap:wrap; background:var(--bg-secondary); border:1px solid var(--border); border-radius:8px; padding:10px 14px }
/* 右推占位 (把状态 chips 推到行尾); 移动端隐藏 → chips 左对齐自然换行, 不再右侧参差留白 */
.pt-spacer { flex:1 1 auto }
.pt-dot { width:9px; height:9px; border-radius:50%; display:inline-block; margin-right:5px }
.pt-dot.tm-text-ok { background:var(--green) }
.pt-dot.tm-text-warning { background:var(--yellow) }
.pt-dot.tm-text-critical { background:var(--red) }
.pt-dot.pt-mut { background:var(--text-muted) }
.tm-text-ok { color:var(--green) }
.tm-text-warning { color:var(--yellow) }
.tm-text-critical { color:var(--red) }
.tm-nowrap { white-space:nowrap }
.tm-overall-chip { margin-left:8px }
.tm-action-row { display:flex; gap:10px; align-items:center; margin-bottom:8px; flex-wrap:wrap }
.tm-updated { font-size: var(--text-sm)}
.tm-nav-link { text-decoration:none }
.tm-alerts-panel { border-color:var(--red) }
.tm-alert-title { color:var(--red) }
.tm-runinfo { font-weight:400 }
.tm-panel-link { float:right }
.pt-on { background:var(--green); box-shadow:0 0 6px var(--green) } .pt-off { background:var(--text-muted) }
.pt-ctl { background:var(--bg-secondary); border:1px solid var(--border); border-radius:8px; padding:14px 16px; margin-bottom:12px }
.pt-ctl label { font-size: var(--text-sm); color:var(--text-muted); margin-right:6px }
.pt-ctl input,.pt-ctl select { background:var(--bg-primary); color:var(--text-link); border:1px solid var(--border); border-radius:4px; padding:4px 8px; font-size: var(--text-base); font-family:var(--font-mono) }
.pt-btn { border:none; border-radius:5px; padding:6px 16px; font-size: var(--text-base); cursor:pointer; font-weight:600; min-height:32px; box-sizing:border-box; display:inline-flex; align-items:center; justify-content:center }
.pt-btn-go { background:var(--green); color:#04231c } .pt-btn-stop { background:var(--red); color:#fff }
.pt-btn-flat { background:var(--yellow); color:#2a2400 } .pt-btn-reset { background:var(--bg-hover); color:var(--text-secondary); border:1px solid var(--border) }
.pt-btn:disabled { opacity:0.4; cursor:not-allowed }
table.pt-tbl { width:100%; border-collapse:collapse; font-size: var(--text-sm); font-family:var(--font-mono) }
table.pt-tbl th { text-align:left; color:var(--text-muted); font-weight:600; padding:5px 8px; border-bottom:1px solid var(--border); font-size: var(--text-sm) }
table.pt-tbl td { padding:5px 8px; border-bottom:1px solid var(--border-light); color:var(--text-secondary); overflow-wrap:break-word; word-break:break-word }
.pt-table { width:100%; border-collapse:collapse; font-size:var(--text-sm); font-family:var(--font-mono) }
.pt-table th { text-align:left; color:var(--text-muted); font-weight:600; padding:5px 8px; border-bottom:1px solid var(--border); font-size:var(--text-sm) }
.pt-table td { padding:5px 8px; border-bottom:1px solid var(--border-light); color:var(--text-secondary); overflow-wrap:break-word; word-break:break-word }
.pt-tbl-scroll { overflow-x:auto; -webkit-overflow-scrolling:touch; max-width:100% }
.pt-tbl-scroll table.pt-tbl { display:table; min-width:max-content; word-break:normal; overflow-wrap:normal }
.pt-err-msg { max-width:320px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; cursor:help }
.pt-panel { background:var(--bg-secondary); border:1px solid var(--border); border-radius:8px; padding:14px 16px; margin-bottom:12px }
.pt-panel h4 { margin:0 0 10px; font-size: var(--text-base); color:var(--text-primary) }
.pos-long { color:var(--green) } .pos-short { color:var(--red) }
.pt-text-sm { font-size:var(--text-sm) }
.pt-font-normal { font-weight:400 }
.pt-panel-flush { margin-bottom:0 }
.pt-num-pos { color:var(--green) }
.pt-num-neg { color:var(--red) }
.pt-num-warn { color:#e0a82e }
.pt-num-muted { color:var(--text-muted) }
.pt-mono { font-family:var(--font-mono) }
.pt-strong { font-weight:600 }
.pt-svg-align { vertical-align:-2px }
.pt-row-funding { background:var(--bg-hover,#2a2a2a22) }
.pt-overflow-x { overflow-x:auto }
.pt-pager-compact { display:flex; align-items:center; gap:10px; margin-top:8px; font-size: var(--text-sm); color:var(--text-secondary) }
.lab-ledger-sum { margin-bottom:8px; font-size: var(--text-sm)}
.lab-qty-hint { font-size: var(--text-xs)}
.ev-CRITICAL,.ev-ERROR { color:var(--red) } .ev-WARNING { color:var(--yellow) } .ev-INFO { color:var(--text-muted) }
/* 次要/说明文字：密度阶 sm；勿用 base（会与正文抢层级） */
.pt-mut { color:var(--text-muted); font-size: var(--text-sm) }
.pt-exec-toggles { display:flex; gap:12px; flex-wrap:wrap; margin:0 0 10px }
.pt-exec-feat { flex:1; min-width:250px; padding:9px 12px; background:var(--bg-primary); border:1px solid var(--border); border-radius:6px }
.pt-exec-hd { display:flex; gap:8px; align-items:center }
.pt-exec-hd label { color:var(--text-primary); font-size: var(--text-base); font-weight:600 }
.pt-exec-badge { margin-left:auto; font-size: var(--text-sm); font-weight:600; padding:2px 9px; border-radius:10px; white-space:nowrap }
.pt-exec-explain { color:var(--text-muted); font-size: var(--text-sm); margin-top:6px; line-height:1.55 }
.pt-rt-head { font-size: var(--text-sm); font-weight:600; color:var(--text-secondary); margin:12px 0 6px }
.pt-rt-head span { font-weight:400; color:var(--text-muted); font-size: var(--text-xs) }
.pt-rt-brake { border-left:3px solid var(--yellow) } .pt-rt-throttle { border-left:3px solid var(--green) }
.pt-rt-row { display:flex; align-items:center; gap:7px; margin:8px 0 7px; flex-wrap:wrap }
.pt-num-input { width:58px; padding:3px 7px; font-size: var(--text-base); font-weight:600; text-align:center; background:var(--bg-primary); border:1px solid var(--border); border-radius:5px; color:var(--text-primary) }
.pt-num-input:focus { border-color:var(--text-link); outline:none }
.pt-apply { padding:4px 15px; font-size: var(--text-sm); font-weight:600; background:var(--text-link); color:#07140F; border:none; border-radius:5px; cursor:pointer }
.pt-apply:hover { filter:brightness(0.9) }
.pt-cur { background:var(--bg-hover); color:var(--text-secondary) }
.pt-tag { font-size: var(--text-xs); font-weight:700; padding:1px 6px; border-radius:8px; margin-left:5px }
.pt-tag-a { background:var(--yellow-bg); color:var(--yellow) } .pt-tag-b { background:var(--green-bg); color:var(--green) }
.pt-presets { display:inline-flex; gap:5px; flex-wrap:wrap }
.pt-preset { padding:2px 9px; font-size: var(--text-sm); border:1px solid var(--border); border-radius:11px; background:var(--bg-primary); color:var(--text-secondary); cursor:pointer }
.pt-preset:hover { border-color:var(--green); color:var(--green) }
.pt-preset-flat:hover { border-color:var(--red); color:var(--red) }
.pt-cards { display:grid; grid-template-columns:repeat(auto-fill,minmax(210px,1fr)); gap:10px }
.pt-scard { background:var(--bg-primary); border:1.5px solid var(--border); border-radius:8px; padding:9px 12px; cursor:pointer }
.pt-scard:hover { border-color:var(--text-link) }
.pt-scard.sel { border-color:var(--green); box-shadow:0 0 0 1px var(--green); background:var(--green-bg) }
.pt-scard .nm { font-size: var(--text-base); font-weight:600; color:var(--text-primary) } .pt-scard .ds { font-size: var(--text-sm); color:var(--text-muted); margin-top:3px }
.pt-scard .ck { float:right; color:var(--green); font-weight:700; display:none } .pt-scard.sel .ck { display:inline }
.pt-combo-btn { background:var(--bg-hover); border:1px solid var(--border); color:var(--text-secondary); border-radius:16px; padding:3px 13px; font-size: var(--text-sm); cursor:pointer; margin-right:6px }
.pt-combo-btn:hover { border-color:var(--green); color:var(--green) }
.pt-chip { display:inline-flex; align-items:center; gap:5px; background:var(--bg-primary); border:1px solid var(--border); border-radius:16px; padding:3px 11px; font-size: var(--text-sm) }
.pt-prov { display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-top:8px; padding:7px 14px; background:var(--bg-secondary); border:1px solid var(--border); border-left:3px solid var(--blue); border-radius:8px }
.pt-prov-lbl { font-size: var(--text-sm); color:var(--text-muted); letter-spacing:.04em; font-weight:600 }
.pt-prov .pt-chip { cursor:help }
.pt-prov-link { font-size: var(--text-sm); color:var(--text-link); text-decoration:none; white-space:nowrap }
.pv-ok { border-color:var(--green); color:var(--green) }
.pv-warn { border-color:var(--yellow); color:var(--yellow) }
.pv-bad { border-color:var(--red); color:var(--red) }
.pt-tab { padding:4px 13px; font-size: var(--text-sm); cursor:pointer; border:1px solid var(--border); border-radius:5px; background:var(--bg-primary); color:var(--text-secondary) }
.pt-tab.active { background:var(--green-bg); color:var(--green); border-color:var(--green) }
.pt-pager button { background:var(--bg-primary); border:1px solid var(--border); color:var(--text-link); border-radius:4px; padding:3px 10px; cursor:pointer; font-size: var(--text-sm) }
.pt-pager button:disabled { opacity:0.4 }
/* 主 tab (Binance Demo / 本地 Lab) */
.pt-maintabs { display:flex; gap:4px; border-bottom:1px solid var(--border); margin:6px 0 14px }
.pt-maintab { padding:8px 18px; font-size: var(--text-base); font-weight:600; cursor:pointer; border:1px solid transparent; border-bottom:none; border-radius:7px 7px 0 0; color:var(--text-muted); background:transparent; margin-bottom:-1px }
.pt-maintab.active { color:var(--text-link); background:var(--bg-secondary); border-color:var(--border); border-bottom:1px solid var(--bg-secondary) }
.pt-maintab .badge { font-size: var(--text-xs); padding:1px 7px; border-radius:10px; background:var(--bg-hover); color:var(--text-secondary); margin-left:6px }
.lab-scard { display:inline-block; padding:6px 12px; margin:3px; font-size: var(--text-sm); cursor:pointer; border:1px solid var(--border); border-radius:6px; background:var(--bg-primary); color:var(--text-secondary) }
.lab-scard.sel { background:var(--green-bg); color:var(--green); border-color:var(--green) }
/* 组合 (combo) 面板: 腿权重条 + 执行链路步骤 + 核账状态 */
.lab-combo-leg { font-size: var(--text-sm); padding:2px 0 }
.lab-combo-leg .nm { color:var(--text-muted) }
.lab-combo-leg .val { color:var(--text-link); font-weight:600; font-family:var(--font-mono) }
.lab-combo-tickstep { padding:4px 0; display:flex; align-items:baseline; gap:8px }
.lab-combo-tickstep .ico { min-width:16px; font-weight:600 }
.lab-combo-tickstep .ico.ok { color:var(--green) }
.lab-combo-tickstep .ico.warn { color:var(--yellow) }
.lab-combo-tickstep .ico.err { color:var(--red) }
.lab-combo-tickstep .lbl { font-weight:600; color:var(--text-primary) }
.lab-combo-tickstep .dtl { color:var(--text-muted); font-size: var(--text-sm) }

/* ── Lab 模式切换 + 策略网格 + 组合卡片 ── */
.lab-mode-bar { background:var(--bg-secondary); border:1px solid var(--border); border-radius:8px; padding:10px 14px; margin-bottom:10px; display:flex; align-items:center; gap:10px; flex-wrap:wrap; font-size: var(--text-sm) }
.lab-mode-bar > b { font-size: var(--text-base); font-weight:600; color:var(--text-primary) }
.lab-mode-toggle { display:flex; border-radius:7px; overflow:hidden; border:1px solid var(--border) }
.lab-mode-option { padding:6px 16px; cursor:pointer; background:var(--bg-primary); color:var(--text-secondary); font-size: var(--text-sm); transition:background .15s,color .15s; user-select:none }
.lab-mode-option:first-child { border-radius:6px 0 0 6px }
.lab-mode-option:last-child { border-radius:0 6px 6px 0 }
.lab-mode-option.active { background:var(--blue); color:#07140F; font-weight:600 }
.lab-mode-desc { font-size: var(--text-sm) }

.lab-strat-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(210px,1fr)); gap:8px; margin-bottom:10px }
.lab-strat-card { background:var(--bg-secondary); border:1px solid var(--border); border-radius:8px; padding:12px 14px; cursor:pointer; transition:border-color .15s,background .15s }
.lab-strat-card:hover { border-color:var(--text-link) }
.lab-strat-card.selected { border-color:var(--blue); background:rgba(52,211,153,.06) }
.lab-strat-card-hd { display:flex; align-items:center; gap:8px; font-weight:600; color:var(--text-primary); font-size: var(--text-base) }
.lab-strat-ck { opacity:0; transition:opacity .15s; color:var(--blue); font-weight:700 }
.lab-strat-card.selected .lab-strat-ck { opacity:1 }
.lab-strat-card-desc { font-size: var(--text-sm); color:var(--text-muted); margin-top:4px }
.lab-selcount { color:var(--green) }

.lab-ctl-row { display:flex; align-items:center; gap:12px; flex-wrap:wrap; margin-bottom:12px }
.lab-ctl-lbl { color:var(--text-muted); font-size: var(--text-sm); margin-right:-8px }
.lab-ctl-inp { width:90px; background:var(--bg-primary); color:var(--text-link); border:1px solid var(--border); border-radius:4px; padding:4px 8px; font-size: var(--text-base); font-family:var(--font-mono) }
.lab-ctl-sel { background:var(--bg-primary); color:var(--text-link); border:1px solid var(--border); border-radius:4px; padding:3px 6px; font-size: var(--text-sm) }
.lab-ctl-date { background:var(--bg-primary); color:var(--text-link); border:1px solid var(--border); border-radius:4px; padding:2px 5px; font-size: var(--text-sm) }

/* ── 组合卡片网格 ── */
.lab-combo-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(280px,1fr)); gap:10px; margin-bottom:10px }
.lab-combo-card { background:var(--bg-secondary); border:1px solid var(--border); border-radius:8px; padding:14px; cursor:pointer; transition:border-color .15s,box-shadow .15s }
.lab-combo-card:hover { border-color:var(--text-link); box-shadow:0 2px 8px rgba(0,0,0,.3) }
.lab-combo-card.running { border-left:3px solid var(--green) }
.lab-combo-card-hd { display:flex; justify-content:space-between; align-items:center; margin-bottom:6px }
.lab-combo-card-hd .combo-name { font-size: var(--text-base); font-weight:600; color:var(--text-primary) }
.lab-combo-card-meta { font-size: var(--text-sm); color:var(--text-muted); margin-bottom:8px }
.lab-combo-card-legs { display:flex; flex-direction:column; gap:3px; margin-bottom:10px }
.lab-combo-card-leg { display:flex; justify-content:space-between; font-size: var(--text-sm); color:var(--text-secondary); padding:2px 8px; background:var(--bg-primary); border-radius:4px }
.lab-combo-card-leg .leg-nm { color:var(--text-primary) }
.lab-combo-card-leg .leg-wt { color:var(--text-muted) }
.lab-combo-card-leg .leg-eq { font-family:var(--font-mono); font-weight:600 }
.lab-combo-card-acts { display:flex; gap:6px; flex-wrap:wrap; overflow-x:auto }
.card-acts { display:flex; gap:6px; flex-wrap:wrap; overflow-x:auto }
.lab-combo-badge { display:inline-block; font-size: var(--text-xs); padding:1px 7px; border-radius:4px; background:var(--bg-primary); color:var(--text-secondary) }
.lab-combo-badge.running { background:var(--green-bg); color:var(--green) }
.lab-combo-chip { display:inline-block; font-size: var(--text-sm); padding:1px 6px; border-radius:3px }
.lab-combo-chip.ok { background:var(--green-bg); color:var(--green) }
.lab-combo-chip.warn { background:rgba(210,153,34,.15); color:var(--yellow) }

/* 新建组合卡片 */
.lab-combo-card-new { border-style:dashed; border-color:var(--text-muted); display:flex; align-items:center; justify-content:center; flex-direction:column; gap:6px; min-height:150px; opacity:.7; cursor:pointer }
.lab-combo-card-new:hover { opacity:1; border-color:var(--blue) }
.lab-combo-card-new-icon { font-size: var(--text-2xl); color:var(--text-link); font-weight:300; line-height:1 }
.lab-combo-card-new-txt { font-size: var(--text-base); color:var(--text-primary); font-weight:600 }
.lab-combo-card-new-sub { font-size: var(--text-sm); color:var(--text-muted); text-align:center }

/* ── 创建组合弹窗 ── */
.co-section { margin-bottom:14px }
.co-label { display:block; font-weight:600; color:var(--text-primary); margin-bottom:5px; font-size: var(--text-sm) }
.co-name-inp { width:100%; box-sizing:border-box; padding:7px 10px; background:var(--bg-primary); color:var(--text-primary); border:1px solid var(--border); border-radius:5px; font-size: var(--text-base) }
.co-cap-inp { width:120px; margin-left:8px; padding:5px 8px; background:var(--bg-primary); color:var(--text-link); border:1px solid var(--border); border-radius:4px; font-family:var(--font-mono) }
.co-strat-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(180px,1fr)); gap:8px; margin-top:8px }
.co-strat-card { background:var(--bg-primary); border:1px solid var(--border); border-radius:7px; padding:11px; transition:border-color .15s,background .15s }
.co-strat-card:hover { border-color:var(--text-link) }
.co-strat-card.checked { border-color:var(--blue); background:rgba(52,211,153,.05) }
.co-strat-check { display:flex; align-items:center; gap:6px; font-size: var(--text-sm); color:var(--text-primary) }
.co-strat-check input[type="checkbox"] { accent-color:var(--blue) }
.co-weight-row { display:flex; align-items:center; gap:6px; margin-top:6px }
.co-weight-slider { flex:1; accent-color:var(--blue); height:4px }
.co-weight-val { font-family:var(--font-mono); font-size: var(--text-sm); color:var(--text-link); min-width:36px }
.co-norm-hint { margin-top:10px; font-size: var(--text-sm); color:var(--text-muted) }
.pt-depth-tbl td,.pt-depth-tbl th { height:19px; line-height:19px; padding:0 5px!important; border:none!important; box-sizing:border-box }
.pt-depth-tbl tr { height:19px }
/* 交易面板移动端适配 (≤680px) */
@media (max-width:680px) {
  .pt-grid4 { grid-template-columns:repeat(2,1fr); gap:8px; margin:8px 0 }
  .pt-row { gap:8px } .pt-col { min-width:0; flex-basis:100% }
  .pt-panel { padding:11px 12px; margin-bottom:9px }
  .pt-panel h4 { font-size: var(--text-base) }
  .pt-kpi { padding:11px 12px } .pt-kpi .val { font-size: var(--text-lg) } .pt-kpi .lbl { font-size: var(--text-xs) }
  .pt-ctl,.pt-bar { padding:10px 12px }
  .pt-spacer { display:none }
  .pt-maintab { padding:7px 11px; font-size: var(--text-sm) }
  table.pt-tbl { font-size: var(--text-sm) } table.pt-tbl th,table.pt-tbl td { padding:4px 6px }
  .pt-err-msg { max-width:150px }
  .pt-cards { grid-template-columns:repeat(auto-fill,minmax(150px,1fr)) }
  /* Chart + 盘口容器: 移动端竖排 */
  #lv-chart { min-width:300px; width:100% }
  .pt-depth-wrap { flex:1 1 auto; width:100% }
}
/* ── 实盘专属组件 (门禁链 / kill-switch / 真金警示) — 同 token, 归 hy.css 唯一规范 ── */
.lv-warn { background:var(--yellow-bg); border:1px solid rgba(210,153,34,.4); border-radius:8px; padding:9px 13px; margin-bottom:12px; color:var(--text-secondary); font-size: var(--text-base); display:flex; align-items:center; gap:8px }
.lv-warn .ico { color:var(--yellow); flex:none }
.lv-gate-list { display:flex; flex-direction:column; gap:6px }
.lv-gate-item { display:flex; align-items:center; gap:8px; font-size: var(--text-base); padding:7px 10px; background:var(--bg-secondary); border-radius:6px }
.lv-kill-row { display:flex; gap:10px; align-items:center; flex-wrap:wrap; margin:0 0 4px }
.lv-kill { background:var(--bg-hover); color:var(--text-secondary); border:1px solid var(--border); border-radius:6px; padding:7px 16px; font-size: var(--text-base); font-weight:600; cursor:pointer }
.lv-kill:hover { filter:brightness(0.95) }
.lv-kill:disabled { opacity:.5; cursor:not-allowed; filter:none }
.lv-kill.clear { background:var(--green); color:#04231c; border-color:var(--green) }
.lv-cockpit { margin-bottom:6px }

/* ── 实盘 Release 信息卡片 ── */
.lv-release-empty { text-align:center; padding:28px 16px }
.lv-release-empty-icon { font-size: var(--text-3xl); margin-bottom:8px }
.lv-release-empty-title { font-size: var(--text-md); font-weight:600; color:var(--text-primary); margin-bottom:6px }
.lv-release-empty-desc { font-size:var(--text-sm); color:var(--text-muted); line-height:1.7; margin-bottom:14px }
.lv-release-card { background:var(--bg-secondary); border:1px solid var(--border); border-radius:8px; padding:14px 16px }
.lv-release-card.combo { border-left:3px solid var(--blue) }
.lv-release-hd { display:flex; align-items:center; gap:10px; margin-bottom:10px; flex-wrap:wrap }
.lv-release-id { font-weight:700; color:var(--text-primary); font-size:var(--text-base) }
.lv-release-type { display:inline-block; font-size:var(--text-xs); padding:2px 8px; border-radius:4px; background:var(--bg-primary); color:var(--text-secondary) }
.lv-release-gate { display:inline-block; font-size:var(--text-xs); padding:2px 8px; border-radius:4px }
.lv-release-gate.lv-gate-ok { background:var(--green-bg); color:var(--green) }
.lv-release-gate.lv-gate-fail { background:rgba(246,70,93,.15); color:var(--red) }
.lv-rel-legs { margin-bottom:10px }
.lv-release-strats { display:flex; gap:6px; flex-wrap:wrap; margin-bottom:8px }
.lv-strat-chip { display:inline-flex; align-items:center; gap:5px; padding:5px 11px; background:var(--bg-primary); border:1px solid var(--border); border-radius:6px; cursor:pointer; font-size:var(--text-sm); color:var(--text-secondary); transition:border-color .15s,background .15s }
.lv-strat-chip:hover { border-color:var(--text-link) }
.lv-strat-chip.selected { border-color:var(--blue); background:rgba(52,211,153,.06); color:var(--text-primary) }
.lv-strat-chip-ck { opacity:0; color:var(--blue); font-weight:700; transition:opacity .15s }
.lv-strat-chip.selected .lv-strat-chip-ck { opacity:1 }
.lv-release-note { font-size:var(--text-xs); color:var(--text-muted); line-height:1.45 }
.lv-cockpit-sub { display:flex; align-items:center; gap:10px; flex-wrap:wrap; font-size: var(--text-sm); color:var(--text-secondary); padding:2px 4px 0; margin-bottom:14px }
.lv-kill-top { background:var(--red); color:#fff; box-shadow:inset 0 0 0 1px rgba(255,255,255,.18) }
.lv-kill-top:hover { filter:brightness(0.9) }
.lv-kill-top.clear { background:var(--green) }
.lv-start-inp { margin-top:6px; width:100%; box-sizing:border-box; background:var(--bg-primary); color:var(--text-link); border:1px solid var(--border); border-radius:5px; padding:7px 10px; font-size: var(--text-base)}
.pt-kpi.kpi-ok { background:var(--green-bg); border-color:var(--green) }
.pt-kpi.kpi-ok { background:var(--green-bg); border-color:var(--green) }
.pt-kpi.kpi-warn { background:var(--yellow-bg); border-color:var(--yellow) }
.pt-kpi.kpi-bad { background:var(--red-bg); border-color:var(--red) }
/* 主题色 KPI: 用品牌薄荷强调【正常但高关注】态 (如实盘真实交易开启) — 非告警, 故不用红 */
.pt-kpi.kpi-accent { background:var(--accent-weak); border-color:var(--accent) }

/* 盘口价差/中价 — 紧凑字号防溢出 */
.lv-spread-val { color:var(--text-primary); font-size: var(--text-sm)}
.lv-spread-pct { font-size: var(--text-xs); color:var(--text-muted) }

/* ------------------------------------------------------------------ */
/* 点击式信息注释 (单一真源 · 全后台通用) — 解释性说明用此, 点击弹出, 不用 hover/title          */
/*   用法: <span class="hy-i" data-t="标题(可选)" data-i="说明文本"></span>                       */
/*   行为/弹层由 main.js 统一处理 (委托点击 → 浮层, 再点/点外/Esc 关闭)。自绘 ⓘ, 不依赖图标字体。 */
/* ------------------------------------------------------------------ */
.hy-i { position:relative; display:inline-flex; align-items:center; justify-content:center; width:12px; height:12px; box-sizing:border-box;
  border:1px solid currentColor; border-radius:50%; color:var(--text-muted); font-size: var(--text-xs); font-weight:700; font-style:normal;
  line-height:1; cursor:pointer; vertical-align:middle; user-select:none; flex:none; transition:color .15s, border-color .15s }
.hy-i::before { content:"i" }
.hy-i:hover, .hy-i.on { color:var(--blue) }
/* 注释浮层：前后台统一 --text-xs（与前台 .site-public .hy-ipop 对齐） */
.hy-ipop { position:fixed; z-index:10020; box-sizing:border-box; width:max-content; max-width:min(320px,calc(100vw - 20px));
  min-width:min(220px,calc(100vw - 20px)); max-height:min(360px,calc(100vh - 20px)); overflow:auto; overflow-wrap:anywhere; word-break:break-word;
  background:var(--bg-card); border:1px solid var(--border);
  border-left:3px solid var(--blue); border-radius:7px; padding:8px 10px; font-size: var(--text-xs); line-height:1.5;
  color:var(--text-secondary); box-shadow:0 6px 22px rgba(0,0,0,.3); left:var(--hy-ipop-left,10px); top:var(--hy-ipop-top,10px); text-align:left }
.hy-ipop.hy-ipop-right { border-left-color:var(--blue) }
.hy-ipop b { display:block; margin-bottom:3px; color:var(--text-primary); font-size: var(--text-xs); font-weight:600 }
.hy-ipop span { display:block; min-width:0; white-space:normal }

/* ═══════════════ 操作控制台 (op-console) — 关键操作分步进度回放, demo/live 共用 ═══════════════ */
.admin-sprite { position:absolute; width:0; height:0; overflow:hidden }
.nav-version-badge { font-size: var(--text-xs); margin-left:4px; vertical-align:middle }

/* 右下角 dock: 危险操作 (停止/全平/对账/启动) 后流式显示逐步进度, 不挡主内容 (可同时看持仓表归零) */
.opc { position:fixed; right:18px; bottom:18px; width:min(440px,92vw); max-height:60vh; display:flex;
  flex-direction:column; background:var(--bg-secondary); border:1px solid var(--border); border-radius:10px;
  box-shadow:0 10px 34px rgba(0,0,0,.5); z-index:9997; overflow:hidden; font-size: var(--text-sm)}
.opc.is-hidden { display:none }
.opc-hd { display:flex; align-items:center; gap:8px; padding:10px 14px; border-bottom:1px solid var(--border);
  background:var(--bg-tertiary) }
.opc-ic { width:15px; height:15px; flex:none; color:var(--text-link) }
.opc-title { font-weight:600; color:var(--text-primary) }
.opc-state { margin-left:auto; font-size: var(--text-sm); padding:2px 9px; border-radius:10px; font-weight:600; border:1px solid var(--border); white-space:nowrap }
.opc-state.run { color:var(--text-link) }
.opc-state.ok { color:var(--green); border-color:var(--green) }
.opc-state.err { color:var(--red); border-color:var(--red) }
.opc-close { cursor:pointer; color:var(--text-muted); font-size: var(--text-lg); line-height:1; padding:0 2px }
.opc-close:hover { color:var(--text-primary) }
.opc-body { overflow-y:auto; padding:6px 0; font-family:var(--font-mono) }
.opc-step { display:flex; gap:8px; align-items:flex-start; padding:4px 14px; line-height:1.5 }
.opc-step .si { width:14px; height:14px; flex:none; margin-top:2px; color:var(--text-muted) }
.opc-step .st { color:var(--text-muted); font-size: var(--text-xs); flex:none; width:52px; margin-top:1px }
.opc-step .sm { color:var(--text-secondary); word-break:break-word }
.opc-step.run .si { color:var(--text-link) } .opc-step.run .sm { color:var(--text-link) }
.opc-step.ok .si { color:var(--green) }
.opc-step.err .si { color:var(--red) } .opc-step.err .sm { color:var(--red) }
.opc-step.warn .si { color:var(--yellow) } .opc-step.warn .sm { color:var(--yellow) }
.opc-spin { animation:opc-rot .9s linear infinite; transform-origin:center }
@keyframes opc-rot { to { transform:rotate(360deg) } }
@media (max-width:640px){ .opc { right:8px; left:8px; bottom:8px; width:auto; max-height:52vh } }

/* ═══════════════ 轻量全局提示 (toast) — 快速操作即时反馈, 全 admin 共用 (JS=hyToast) ═══════════════ */
.hy-toast-wrap { position:fixed; top:16px; right:16px; z-index:9998; display:flex; flex-direction:column; gap:8px; pointer-events:none }
.hy-toast { display:flex; align-items:center; gap:8px; background:var(--bg-secondary); border:1px solid var(--border);
  border-left:3px solid var(--text-muted); border-radius:8px; padding:9px 14px; font-size: var(--text-base); color:var(--text-secondary);
  box-shadow:0 6px 22px rgba(0,0,0,.4); opacity:0; transform:translateX(12px); transition:opacity .25s, transform .25s; max-width:min(360px,80vw) }
.hy-toast.show { opacity:1; transform:none }
.hy-toast .ico { width:15px; height:15px; flex:none }
.hy-toast.ok { border-left-color:var(--green) } .hy-toast.ok .ico { color:var(--green) }
.hy-toast.err { border-left-color:var(--red) } .hy-toast.err .ico { color:var(--red) }
.hy-toast.warn { border-left-color:var(--yellow) } .hy-toast.warn .ico { color:var(--yellow) }
.hy-toast.info .ico { color:var(--text-link) }
@media (max-width:640px){ .hy-toast-wrap { left:8px; right:8px; top:8px } .hy-toast { max-width:none } }

/* ═══════════════ 交易页去臃肿: 折叠区 + 次级面板 Tab (demo/live 共用) ═══════════════ */
.pt-fold { background:var(--bg-secondary); border:1px solid var(--border); border-radius:8px; margin-bottom:12px }
.pt-fold-hd { display:flex; align-items:center; gap:8px; padding:9px 14px; cursor:pointer; font-size: var(--text-base); color:var(--text-primary); user-select:none }
.pt-fold-hd:hover { color:var(--text-link) }
.pt-fold-hd .caret { width:12px; height:12px; flex:none; transition:transform .18s; color:var(--text-muted) }
.pt-fold.open .pt-fold-hd .caret { transform:rotate(90deg) }
.pt-fold-hd .sub { color:var(--text-muted); font-size: var(--text-sm); font-weight:400 }
.pt-fold-bd { display:none; padding:0 14px 12px }
.pt-fold.open .pt-fold-bd { display:block }
.pt-subtabs { display:flex; gap:4px; flex-wrap:wrap; border-bottom:1px solid var(--border); padding-bottom:10px; margin-bottom:12px }
.pt-subtab { font-size: var(--text-sm); color:var(--text-muted); padding:5px 12px; border-radius:6px; cursor:pointer; white-space:nowrap; border:1px solid transparent }
.pt-subtab:hover { color:var(--text-secondary); background:var(--bg-hover) }
.pt-subtab.active { color:var(--text-primary); background:var(--bg-hover); border-color:var(--border) }
.pt-subpane { display:none }
.pt-subpane.active { display:block }

/* ── Lab 详情面板 (点击策略/组合卡片展开) ── */
.lab-detail-panel { display:none; background:var(--bg-secondary); border:1px solid var(--border); border-radius:8px; padding:14px; margin-bottom:12px }
.lab-detail-panel.open { display:block }
.lab-detail-tabs { display:flex; gap:4px; flex-wrap:wrap; border-bottom:1px solid var(--border); padding-bottom:10px; margin-bottom:12px }
.lab-detail-tab { font-size: var(--text-sm); color:var(--text-muted); padding:5px 12px; border-radius:6px; cursor:pointer; white-space:nowrap; border:1px solid transparent }
.lab-detail-tab:hover { color:var(--text-secondary); background:var(--bg-hover) }
.lab-detail-tab.active { color:var(--text-primary); background:var(--bg-hover); border-color:var(--border) }
.lab-detail-body { font-size: var(--text-sm) }
.lab-detail-body .sub-hd { font-weight:600; padding:8px 0 4px; color:var(--text-primary); font-size:var(--text-sm); border-bottom:1px solid var(--border); margin-bottom:4px }
.lab-param-table { width:100%; border-collapse:collapse; font-size:var(--text-sm) }
.lab-param-table td { padding:3px 10px 3px 0; vertical-align:top }
.lab-param-table .lbl { color:var(--text-muted); white-space:nowrap; width:140px }

/* ── Lab 策略卡片 (新设计: 单策略+组合共用) ── */
.lab-card-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(240px,1fr)); gap:10px; margin-bottom:12px }
.lab-card { background:var(--bg-secondary); border:1px solid var(--border); border-radius:8px; padding:14px; cursor:pointer; transition:border-color .15s,box-shadow .15s }
.lab-card:hover { border-color:var(--text-link); box-shadow:0 2px 8px rgba(0,0,0,.3) }
.lab-card.selected { border-color:var(--blue); box-shadow:0 0 0 1px var(--blue) }
.lab-card.running { border-left:3px solid var(--green) }
.lab-card.stopped { opacity:.72 }
.lab-card .card-hd { display:flex; justify-content:space-between; align-items:center; margin-bottom:6px }
.lab-card .card-name { font-weight:600; font-size:var(--text-base); color:var(--text-primary) }
.lab-card .card-meta { font-size:var(--text-sm); color:var(--text-muted); margin-bottom:4px; line-height:1.5 }
.lab-card .card-legs { display:flex; flex-direction:column; gap:2px; margin:6px 0 }
.lab-card .card-leg { display:flex; justify-content:space-between; font-size:var(--text-sm); padding:3px 8px; background:var(--bg-primary); border-radius:4px }
.lab-card .card-leg .nm { color:var(--text-primary) }
.lab-card .card-leg .wt { color:var(--text-muted) }
.lab-card .card-leg .eq { font-family:var(--font-mono); font-weight:600 }
.lab-card .card-acts { display:flex; gap:6px; flex-wrap:wrap; margin-top:8px }
.lab-card .card-sel-hint { font-size:var(--text-xs); color:var(--text-muted); margin-top:6px; text-align:center }
.lab-card .card-sel-hint.selected { color:var(--blue) }
.lab-card .card-badge { display:inline-block; font-size:var(--text-xs); padding:1px 7px; border-radius:4px; background:var(--bg-primary); color:var(--text-secondary) }
.lab-card .card-badge.running { background:var(--green-bg); color:var(--green) }

/* ── 新增卡 (虚线占位) ── */
.lab-card-new { border-style:dashed; border-color:var(--text-muted); display:flex; align-items:center; justify-content:center; flex-direction:column; gap:6px; min-height:140px; opacity:.65; cursor:pointer }
.lab-card-new:hover { opacity:1; border-color:var(--blue) }
.lab-card-new-icon { font-size: var(--text-2xl); color:var(--text-link); font-weight:300; line-height:1 }
.lab-card-new-txt { font-weight:600; font-size:var(--text-base); color:var(--text-primary) }
.lab-card-new-sub { font-size:var(--text-sm); color:var(--text-muted); text-align:center }

/* ── Lab 双图并排 ── */
.lab-chart-row { display:grid; grid-template-columns:1fr 1fr; gap:14px; margin-bottom:14px }
.lab-chart-svg { width:100%; height:260px; background:var(--bg-primary); border-radius:6px }
.lab-legend { margin-top:6px; font-size: var(--text-xs) }
.lab-legend-item { margin-right:14px }
.lab-legend-swatch { width:10px; height:3px; display:inline-block; vertical-align:middle }
.lab-col-0 { background:var(--green) }
.lab-col-1 { background:var(--blue) }
.lab-col-2 { background:#b07cff }
.lab-col-3 { background:#f06292 }
.lab-col-4 { background:#4dd0e1 }
.lab-col-5 { background:#aed581 }
.lab-col-6 { background:#ff8a65 }
.lab-col-7 { background:#5c6bc0 }
.lab-section-hd { display:flex; align-items:baseline; flex-wrap:wrap; gap:6px 12px; margin-bottom:10px }
.lab-section-title { margin:0; font-size: var(--text-base); font-weight:600; color:var(--text-primary) }
@media (max-width:900px) { .lab-chart-row { grid-template-columns:1fr } }

/* V3 strategy approval — 页头复用全局 .ph-title/.ph-desc 阶 */
.hy-approval-head{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;margin-bottom:14px;flex-wrap:wrap}
.hy-approval-desc{max-width:860px}
.hy-approval-head-actions{display:flex;align-items:center;gap:10px;flex:0 0 auto}
.hy-approval-status{font-size: var(--text-sm);color:var(--text-muted);white-space:nowrap}
.hy-approval-grid{display:grid;grid-template-columns:minmax(0,.9fr) minmax(0,1.1fr);gap:14px}
.hy-approval-panel{min-width:0;overflow:hidden}
.hy-approval-panel-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:12px 14px 10px;border-bottom:1px solid var(--border)}
.hy-approval-panel-head h4{margin:0;color:var(--text-primary);font-size:var(--text-base);font-weight:600}
.hy-approval-panel-desc{display:block;color:var(--text-muted);font-size: var(--text-xs);line-height:1.4;margin-top:3px}
.hy-approval-count{display:inline-flex;align-items:center;justify-content:center;min-width:24px;height:24px;padding:0 7px;border-radius:999px;background:var(--bg-primary);color:var(--text-primary);font-family:var(--font-mono);font-size:var(--text-xs);font-weight:700}
.hy-approval-list-head,.hy-approval-row{display:grid;grid-template-columns:minmax(150px,1.2fr) minmax(130px,.85fr) minmax(180px,1.45fr) auto;gap:12px;align-items:center}
.hy-approval-list-head{padding:8px 14px;background:var(--bg-primary);color:var(--text-muted);font-size: var(--text-xs);font-weight:700;letter-spacing:.03em}
.hy-approval-row{padding:10px 14px;border-bottom:1px solid var(--border);font-size: var(--text-sm);min-width:0}
.hy-approval-row:last-child{border-bottom:0}
.hy-approval-identity,.hy-approval-type,.hy-approval-occupancy{min-width:0}
.hy-approval-name{color:var(--text-primary);font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hy-approval-slug{font-family:var(--font-mono);color:var(--accent);font-size: var(--text-xs);margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hy-approval-slug::-webkit-scrollbar,.hy-approval-name::-webkit-scrollbar{height:3px}
.hy-approval-slug::-webkit-scrollbar-thumb,.hy-approval-name::-webkit-scrollbar-thumb{background:rgba(148,163,184,.45);border-radius:3px}
.hy-approval-type{color:var(--text-primary);font-size: var(--text-sm)}
.hy-approval-stats{display:block;color:var(--text-muted);font-size: var(--text-xs);margin-top:4px;white-space:nowrap}
.hy-approval-occupancy{color:var(--text-muted);font-size: var(--text-xs);line-height:1.5;overflow-wrap:anywhere}
.hy-approval-occupancy-label{display:block;color:var(--text-secondary);font-weight:700;margin-bottom:2px}
.hy-approval-occupancy a{color:var(--text-link);text-decoration:none}
.hy-approval-occupancy a:hover{text-decoration:underline}
.hy-approval-empty{padding:10px;color:var(--text-muted);font-size: var(--text-sm)}
@media(max-width:900px){.hy-approval-grid{grid-template-columns:1fr}}
@media(max-width:640px){
  .hy-approval-list-head{display:none}
  .hy-approval-row{grid-template-columns:minmax(0,1fr) auto;gap:7px 10px;padding:10px 10px;font-size: var(--text-sm)}
  .hy-approval-type,.hy-approval-occupancy{grid-column:1/-1}
  .hy-approval-row .pt-btn{padding:4px 8px;font-size: var(--text-sm)}
}
.pt-statusbar { display:flex; align-items:center; gap:14px; flex-wrap:wrap }
.pt-statusbar .ops { display:flex; gap:6px; flex-wrap:wrap }

/* ═══════════════ 首页 · 市场快照仪表盘 (dboqo, 令牌驱动, 零内联) ═══════════════ */
.text-warn { color: var(--yellow) }

/* ── 前台专用: 文字角色 / 按钮弧度 (仅 .site-public, 不改后台 .btn 形态基线) ── */
.site-public {
  /* Logo rx/side=52/240; 前台按钮圆角与此同源 */
  --radius-btn: 8px;
  --radius-btn-sm: 7px;
  --radius-btn-lg: 10px;
}
.site-public .btn {
  border-radius: var(--radius-btn);
}
.site-public .btn-sm {
  border-radius: var(--radius-btn-sm);
}
/* 文字角色 (摘要/说明; 页面标题见各页 .page-title)
 * 注释阶统一 --text-xs，避免说明/元数据抢正文 */
.site-public .text-summary {
  font-size: var(--text-xs);
  color: var(--text-secondary);
  line-height: 1.45;
}
.site-public .text-meta {
  font-size: var(--text-xs);
  color: var(--text-muted);
}
.site-public .freshness-badge {
  font-family: var(--font-mono);
  font-size: var(--text-xs);
  color: var(--text-muted);
  white-space: nowrap;
}
.site-public .note-i {
  display: inline-flex;
  align-items: flex-start;
  gap: 6px;
  font-size: var(--text-xs);
  color: var(--text-muted);
  line-height: 1.45;
}
.site-public .note-i > span:last-child {
  min-width: 0;
}
.site-public .note-i-mark {
  flex: none;
  width: 1.1em;
  height: 1.1em;
  border-radius: 50%;
  border: 1px solid var(--border);
  background: var(--bg-tertiary);
  color: var(--accent);
  font-size: var(--text-xs);
  font-weight: 600;
  font-style: normal;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  line-height: 1;
}

/* Hero 动画区 (恒深 banner: 动画载体, 不随明暗主题变白) — 文案结构勿改 */
.hero { position:relative; height:180px; background:linear-gradient(120deg, var(--bg-tertiary), var(--bg-secondary)); border:1px solid var(--border); border-radius:12px; overflow:hidden }
.hero-canvas { position:absolute; inset:0; width:100%; height:100% }
.hero-copy { position:absolute; left:28px; top:50%; transform:translateY(-50%); z-index:2 }
.hero-title { font-family:var(--font-display); font-size: var(--text-2xl); font-weight:600; color:var(--text-primary); margin:0; letter-spacing:.3px }
.hero-sub { font-size: var(--text-base); color:var(--text-secondary); margin:8px 0 0 }

/* 首页作用域: 边距与面板微调 (不改模块顺序) */
.public-home { min-width: 0; }
.public-home .public-panel { overflow: hidden; }
.public-home .public-panel > .panel-header {
  display: flex;
  align-items: center;
  gap: 8px;
}
.public-home .panel-header-title {
  font-size: var(--text-md);
  font-weight: 600;
  color: var(--text-primary);
}

/* 市场快照: 行情卡 + 情绪胶囊 */
.snapshot { display:grid; grid-template-columns:minmax(220px,1fr) 2fr; gap:12px }
.snap-price {
  background:var(--bg-secondary);
  border:1px solid var(--border);
  border-radius:10px;
  padding:14px 16px;
  display:flex;
  flex-direction:column;
  justify-content:center;
  min-width: 0;
}
.snap-row { display:flex; align-items:center; justify-content:space-between; gap:8px; min-width: 0; }
.snap-name { font-size: var(--text-sm); color:var(--text-secondary); font-weight: 500; }
.snap-meta { font-size: var(--text-xs); color:var(--text-muted); font-family:var(--font-mono) }
.snap-val { font-size: var(--text-2xl); font-weight:700; font-family:var(--font-mono); line-height:1.2; margin:6px 0 4px; letter-spacing: -0.02em; }
.snap-foot { align-items:flex-end }
.snap-foot .font-mono { font-size: var(--text-base); font-weight:600 }

.caps { display:grid; grid-template-columns:repeat(3,1fr); gap:8px; min-width: 0; }
.cap {
  display:flex;
  flex-direction:column;
  gap:4px;
  justify-content:center;
  padding:10px 12px;
  background:var(--bg-secondary);
  border:1px solid var(--border);
  border-radius:10px;
  min-width: 0;
}
.cap-label { font-size: var(--text-sm); color:var(--text-muted) }
.cap-val { font-size: var(--text-md); font-weight:600; font-family:var(--font-mono); min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.cap-sub { font-size: var(--text-sm); font-weight:400 }
/* 行情卡 + 情绪胶囊 现可点击导航 → 链接化 + hover 高亮边框 */
/* 主题切换时文字会立即换色；卡片也必须同步到位，不做背景/边框渐变。 */
a.snap-price, a.cap { text-decoration:none; color:inherit; transition:none }
a.snap-price:hover, a.cap:hover { border-color:var(--accent); text-decoration: none; }
a.snap-price:focus-visible, a.cap:focus-visible {
  outline: none;
  border-color: var(--border-focus);
  box-shadow: 0 0 0 2px var(--accent-weak);
}

/* sparkline (行情 + 策略净值复用) */
.spark { width:120px; height:30px; display:block; flex: none; max-width: 100%; }
.spark-sm { width:58px; height:26px; flex:none }
.spark-line { fill:none; stroke:var(--accent); stroke-width:1.5 }
.spark-area { fill:var(--accent-weak); stroke:none }

/* panel 头部 "全部 →" */
.panel-more { margin-left:auto; font-size: var(--text-sm); color:var(--text-link); font-family:var(--font-mono); text-decoration:none }
.panel-more:hover { text-decoration: none; color: var(--accent); }

/* 首页统一列表行 (研报 + 策略 同构: 左导引 / 主体标题+副 / 右值; 仅链接 hover) */
.home-list { list-style:none; margin:0; padding:0 }
.home-item { display:flex; align-items:center; gap:11px; padding:12px 0; border-bottom:1px solid var(--border-light); min-width: 0; }
.home-item:last-child { border-bottom:none }
.home-item-lead { flex:none; width:58px; font-size: var(--text-sm); color:var(--text-muted); font-family:var(--font-mono); white-space:nowrap }
.home-item-body { flex:1; min-width:0 }
.home-item-title { font-size: var(--text-md); font-weight:600; color:var(--text-primary); line-height:1.35; display:block; overflow:hidden; text-overflow:ellipsis; white-space:nowrap }
a.home-item-title { transition:color .15s }
a.home-item-title:hover { color:var(--accent); text-decoration:none }
.home-item-sub { font-size: var(--text-sm); color:var(--text-muted); margin-top:2px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis }
.home-item-val { flex:none }
a.home-item-val { text-decoration:none; transition:filter .15s; border-radius: var(--radius-btn-sm, 7px); }
a.home-item-val:hover { text-decoration:none; filter:brightness(1.08) }

/* 模拟交易降权条 (必须保留模块; 圆角与 logo 比协调) */
.paper-strip {
  display:flex;
  align-items:center;
  gap:12px 14px;
  flex-wrap:wrap;
  background:var(--bg-secondary);
  border:1px solid var(--border);
  border-radius:10px;
  padding:10px 14px;
  border-left: 3px solid var(--accent);
  min-width: 0;
}
.paper-heading { display:flex; align-items:center; gap:8px; min-width:0; }
.paper-title { font-size: var(--text-sm); font-weight:600; color:var(--text-primary); line-height:1.3 }
.paper-heading > .badge {
  font-size: var(--text-xs);
  padding: 1px 6px;
  line-height: 1.25;
  flex-shrink: 0;
}
.paper-kv { font-size: var(--text-xs); color:var(--text-secondary); line-height:1.35; min-width:0 }
.paper-kv b {
  font-weight:600;
  color:var(--text-primary);
  margin-left:3px;
  font-size: inherit;
  overflow-wrap: anywhere;
}
.paper-meta {
  font-size: var(--text-xs);
  color:var(--text-muted);
  margin-left:auto;
  line-height:1.35;
  min-width:0;
}

/* 快捷操作 */
.quick-row { display:flex; align-items:center; gap:8px; flex-wrap:wrap }
.quick-label { font-size: var(--text-sm); color:var(--text-muted); margin-right:4px }
.public-home .quick-row .btn {
  border-radius: var(--radius-btn-sm);
}

/* ── 前台全站页面层 (仅 .site-public; 对齐 page-title/正文/摘要/说明/i注释) ── */
.site-public .page-header {
  margin-bottom: 18px;
  min-width: 0;
}
.site-public .page-title {
  font-family: var(--font-display);
  font-size: var(--text-2xl);
  font-weight: 600;
  letter-spacing: 0.01em;
  line-height: 1.25;
  color: var(--text-primary);
}
.site-public .page-subtitle {
  font-size: var(--text-sm);
  color: var(--text-secondary);
  margin-top: 6px;
  line-height: 1.45;
}
.site-public .page-header .badge {
  margin-bottom: 8px;
  border-radius: var(--radius-btn-sm);
}

/* 指标卡 / 入口卡 */
.site-public .metric-card {
  border-radius: 10px;
  min-width: 0;
}
.site-public .metric-card .metric-label {
  font-size: var(--text-xs);
  text-transform: none;
  letter-spacing: 0;
  font-weight: 500;
  color: var(--text-muted);
}
.site-public .metric-card .metric-value {
  font-size: var(--text-xl);
  letter-spacing: -0.02em;
}
.site-public .metric-card .metric-ts {
  font-size: var(--text-xs);
  color: var(--text-muted);
}
.site-public a.metric-card:hover,
.site-public a.do-card:hover {
  text-decoration: none;
}

/* 数据页 hero / 按钮芯片 */
.site-public .do-hero .btn,
.site-public .do-intervals .btn,
.site-public .tabs .tab-item,
.site-public .subtab {
  border-radius: var(--radius-btn-sm);
}
.site-public .do-price,
.site-public .regime-current,
.site-public .risk-hero,
.site-public .calendar-event {
  border-radius: 10px;
  min-width: 0;
}
.site-public .do-price-ts,
.site-public .do-price-name {
  min-width: 0;
}
.site-public .do-map-desc,
.site-public .regime-desc,
.site-public .regime-method,
.site-public .risk-note,
.site-public .strat-note {
  color: var(--text-secondary);
  font-size: var(--text-sm);
  line-height: 1.65;
}
.site-public .regime-method {
  color: var(--text-muted);
}

/* 研报列表 / 详情 */
.site-public .article-title-link {
  font-family: var(--font-display);
  font-weight: 600;
}
.site-public .article-excerpt,
.site-public .article-excerpt-box p {
  font-size: var(--text-sm);
  color: var(--text-secondary);
  line-height: 1.55;
}
.site-public .article-excerpt-label {
  display: inline-block;
  font-size: var(--text-xs);
  font-weight: 600;
  color: var(--accent);
  margin-bottom: 4px;
  letter-spacing: 0.04em;
}
.site-public .article-meta {
  font-size: var(--text-sm);
  color: var(--text-muted);
}
.site-public .article-toolbar .total,
.site-public .pager-info,
.site-public .pagination-info {
  font-size: var(--text-sm);
  color: var(--text-muted);
}
.site-public .article-search .form-control,
.site-public .form-control {
  border-radius: var(--radius-btn-sm);
}
.site-public .article-body {
  font-size: var(--text-base);
  line-height: 1.75;
  color: var(--text-primary);
  overflow-wrap: anywhere;
}
.site-public .article-nav {
  display: flex;
  justify-content: space-between;
  gap: 16px;
  margin-top: 16px;
  flex-wrap: wrap;
}
.site-public .article-nav a {
  max-width: min(100%, 420px);
  min-width: 0;
}

/* ── 研报详情社交分享 (dboqo: 中性底 + 薄荷强调; 克制) ── */
.site-public .article-share {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 10px 12px;
  margin-top: 14px;
  padding-top: 12px;
  border-top: 1px solid var(--border);
  min-width: 0;
}
.site-public .article-share-label {
  font-size: var(--text-sm);
  font-weight: 500;
  color: var(--text-muted);
  letter-spacing: 0.04em;
  flex: none;
}
.site-public .article-share-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  min-width: 0;
}
.site-public .article-share-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 12px;
  border: 1px solid var(--border);
  border-radius: var(--radius-btn-sm);
  background: var(--bg-secondary);
  color: var(--text-secondary);
  font-size: var(--text-sm);
  font-weight: 500;
  font-family: var(--font-sans);
  cursor: pointer;
  transition: border-color var(--transition), color var(--transition), background var(--transition);
  line-height: 1.2;
}
.site-public .article-share-btn:hover {
  border-color: var(--accent);
  color: var(--accent);
  background: var(--accent-weak);
}
.site-public .article-share-btn:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
}
.site-public .article-share-btn:active {
  transform: scale(0.98);
}
.site-public .article-share-ico {
  width: 15px;
  height: 15px;
  flex: none;
}
.site-public .article-share-txt {
  white-space: nowrap;
}
/* 仅图标按钮 (如 X logo 本身已自带字标, 不再重复文字) */
.site-public .article-share-btn--icon {
  padding: 6px 10px;
  min-width: 34px;
  justify-content: center;
}
.site-public .article-share-btn--icon .article-share-ico {
  width: 16px;
  height: 16px;
}

/* 分享弹层 (前台自包含, 不依赖 admin-core hyModal) */
.ashare-modal {
  position: fixed;
  inset: 0;
  z-index: 9990;
  display: none;
  align-items: center;
  justify-content: center;
  padding: 20px;
  background: rgba(0, 0, 0, 0.62);
  backdrop-filter: blur(2px);
}
.ashare-modal.is-open { display: flex; }
html.ashare-modal-open { overflow: hidden; }
.ashare-modal-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: 12px;
  width: 100%;
  max-width: min(420px, 94vw);
  max-height: 88vh;
  overflow: auto;
  box-shadow: 0 16px 48px rgba(0, 0, 0, 0.5);
  animation: ashareModalIn 0.15s ease;
}
.ashare-modal-card--poster { max-width: min(420px, 94vw); }
.ashare-modal-card--sm { max-width: min(360px, 94vw); }
@keyframes ashareModalIn {
  from { opacity: 0; transform: translateY(8px) scale(0.98); }
  to { opacity: 1; transform: none; }
}
.ashare-modal-head {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 14px 18px;
  border-bottom: 1px solid var(--border);
}
.ashare-modal-title {
  margin: 0;
  font-family: var(--font-display);
  font-size: var(--text-md);
  font-weight: 600;
  color: var(--text-primary);
}
.ashare-modal-x {
  margin-left: auto;
  cursor: pointer;
  color: var(--text-muted);
  font-size: var(--text-xl);
  line-height: 1;
  background: none;
  border: none;
  padding: 0 2px;
}
.ashare-modal-x:hover { color: var(--text-primary); }
.ashare-modal-body {
  padding: 18px;
  font-size: var(--text-base);
  color: var(--text-secondary);
  line-height: 1.6;
}
.ashare-wechat-body {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 12px;
}
.ashare-qr-frame {
  padding: 12px;
  background: #fff;
  border-radius: 10px;
  border: 1px solid var(--border);
  line-height: 0;
}
.ashare-qr-frame img {
  width: 180px;
  height: 180px;
  display: block;
}
.ashare-wechat-hint {
  margin: 0;
  color: var(--text-primary);
  font-size: var(--text-xs);
  font-weight: 500;
  line-height: 1.45;
}
.ashare-wechat-url {
  margin: 0;
  max-width: 100%;
  word-break: break-all;
  font-family: var(--font-mono);
  font-size: var(--text-sm);
}
.ashare-poster-body {
  display: flex;
  flex-direction: column;
  gap: 12px;
  align-items: stretch;
}
.ashare-poster-status {
  margin: 0;
  font-size: var(--text-sm);
  color: var(--text-muted);
  text-align: center;
}
.ashare-poster-status.is-error { color: var(--red); }
.ashare-poster-preview {
  display: flex;
  justify-content: center;
  background: var(--bg-primary);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 12px;
  min-height: 200px;
}
.ashare-poster-preview img {
  max-width: 100%;
  height: auto;
  border-radius: 6px;
  display: block;
  box-shadow: 0 8px 28px rgba(0, 0, 0, 0.35);
}
.ashare-poster-preview img.is-loading:not([src]),
.ashare-poster-preview img.is-loading[src=""] {
  display: none;
}
.ashare-poster-actions {
  display: flex;
  justify-content: center;
  gap: 8px;
  flex-wrap: wrap;
}
.ashare-poster-actions .btn[disabled] {
  opacity: 0.5;
  cursor: not-allowed;
}
/* 离屏 clipboard 代理 (无障碍/不占布局) */
.ashare-clipboard-proxy {
  position: fixed;
  top: 0;
  left: 0;
  width: 1px;
  height: 1px;
  opacity: 0;
  pointer-events: none;
}
/* 前台轻量 toast */
.ashare-toast-wrap {
  position: fixed;
  top: 16px;
  right: 16px;
  z-index: 9999;
  display: flex;
  flex-direction: column;
  gap: 8px;
  pointer-events: none;
}
.ashare-toast {
  background: var(--bg-secondary);
  border: 1px solid var(--border);
  border-left: 3px solid var(--text-muted);
  border-radius: 8px;
  padding: 9px 14px;
  font-size: var(--text-sm);
  color: var(--text-secondary);
  box-shadow: 0 6px 22px rgba(0, 0, 0, 0.4);
  opacity: 0;
  transform: translateX(12px);
  transition: opacity 0.25s, transform 0.25s;
  max-width: min(360px, 80vw);
}
.ashare-toast.is-show {
  opacity: 1;
  transform: none;
}
.ashare-toast--ok { border-left-color: var(--green); }
.ashare-toast--err { border-left-color: var(--red); color: var(--text-primary); }
.ashare-toast--warn { border-left-color: var(--yellow); }
@media (max-width: 640px) {
  .site-public .article-share-btn { padding: 6px 10px; }
  .ashare-toast-wrap { left: 8px; right: 8px; top: 8px; }
  .ashare-toast { max-width: none; }
}

/* 量化公开页 */
.site-public .strat-card {
  border-radius: 10px;
}
.site-public .strat-card-name {
  font-family: var(--font-display);
  font-weight: 600;
}
.site-public .strat-card-desc {
  font-size: var(--text-sm);
  color: var(--text-secondary);
  line-height: 1.5;
}
.site-public .strat-note {
  margin-top: 16px;
  padding: 12px 14px;
  border: 1px solid var(--border);
  border-radius: 10px;
  background: var(--bg-secondary);
  border-left: 3px solid var(--accent);
}
.site-public .sp-note-body p {
  font-size: var(--text-sm);
  color: var(--text-secondary);
}

/* 表格溢出: 前台统一包一层可横滑, 不撑破主栏 */
.site-public .main-content .table-wrap {
  max-width: 100%;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}
.site-public .main-content .panel {
  border-radius: 10px;
  min-width: 0;
}
.site-public .main-content .panel-body {
  min-width: 0;
}

/* 芯片/tab 与 logo 弧度一致 */
.site-public .tab-item {
  border-radius: var(--radius-btn-sm);
}
.site-public .badge {
  border-radius: var(--radius-btn-sm);
}

/* i 注释控件 (.hy-i 已有逻辑; 视觉与 note-i 对齐) */
.site-public .hy-i {
  border-radius: 50%;
  vertical-align: 0.1em;
  width: 12px;
  height: 12px;
  font-size: var(--text-xs);
}
/* 点击弹出的说明浮层：正文注释阶 */
.site-public .hy-ipop {
  font-size: var(--text-xs);
  line-height: 1.5;
  padding: 8px 10px;
}
.site-public .hy-ipop b {
  font-size: var(--text-xs);
}

/* 前台页根容器: 防止子块撑破主栏 */
.site-public .public-page {
  min-width: 0;
  max-width: 100%;
}

/* 周期行 / 工具条标签 (注释阶) */
.site-public .dc-period-label,
.site-public .kline-toolbar-label,
.site-public .do-intervals-lbl {
  font-size: var(--text-xs);
  color: var(--text-muted);
}

/* K 线信息条 / 指标快照: 令牌对齐 */
.site-public .kline-info-bar {
  border-radius: 10px;
  min-width: 0;
}
.site-public .kline-close {
  font-family: var(--font-mono);
  letter-spacing: -0.02em;
}
.site-public .indicator-snapshot {
  border-radius: 10px;
  min-width: 0;
}
.site-public .indicator-value {
  font-family: var(--font-mono);
  letter-spacing: -0.02em;
}
.site-public .indicator-ts,
.site-public .fg-now {
  font-family: var(--font-mono);
  font-size: var(--text-xs);
  color: var(--text-muted);
}

/* 日历 / 说明条 */
.site-public .calendar-title {
  font-family: var(--font-display);
  font-weight: 600;
}
.site-public .calendar-note,
.site-public .risk-note,
.site-public .strat-note {
  font-size: var(--text-xs);
  color: var(--text-secondary);
  line-height: 1.55;
}

/* 策略详情: 说明卡与返回 */
.site-public .sp-notes .panel {
  border-radius: 10px;
  min-width: 0;
}
.site-public .sp-back .btn {
  border-radius: var(--radius-btn-sm);
}

/* 区块小标题 (数据入口地图等) */
.site-public .section-label,
.site-public .do-section-label {
  font-size: var(--text-sm);
  font-weight: 600;
  color: var(--text-muted);
  letter-spacing: 0.02em;
  margin: 18px 0 10px;
}

/* 公开图表页: KPI 与图表面板 (清算地图 / 强平 / 订单簿等) */
.site-public .liqmap-kpi {
  margin-bottom: 14px;
}
.site-public .liqmap-kpi .metric-card {
  border-radius: 10px;
  min-width: 0;
}
.site-public .liqmap-kpi .metric-value.text-down { color: var(--red); }
.site-public .liqmap-kpi .metric-value.text-up { color: var(--green); }
.site-public .public-liqmap .panel,
.site-public .public-liquidation .panel,
.site-public .public-orderbook .panel {
  border-radius: 10px;
  overflow: hidden;
}
.site-public .public-liqmap .panel-header,
.site-public .public-liquidation .panel-header,
.site-public .public-orderbook .panel-header {
  font-size: var(--text-md);
  font-weight: 600;
}
.site-public .public-liqmap .chart-container,
.site-public .public-liquidation .chart-container,
.site-public .public-orderbook .chart-container {
  min-width: 0;
}

/* ── 市场状态摘要 (首页静态单行) ── */
.regime-summary {
  background:var(--bg-secondary);
  border:1px solid var(--border);
  border-radius:10px;
  overflow:hidden;
  transition:none;
}
.regime-summary:hover {
  background:var(--bg-card);
  border-color:rgba(var(--accent-rgb),.5);
}
.regime-summary:focus-within {
  border-color:var(--accent);
  box-shadow:0 0 0 2px var(--accent-weak);
}
.regime-summary-link {
  display:grid;
  grid-template-columns:minmax(160px,.85fr) minmax(420px,2.4fr) min-content;
  align-items:center;
  gap:14px;
  padding:9px 14px;
  color:inherit;
  text-decoration:none;
}
.regime-summary-link:hover { text-decoration:none; }
.regime-summary-heading {
  display:flex;
  align-items:center;
  gap:10px;
  min-width:0;
}
.regime-summary-mark {
  width:32px;
  height:32px;
  display:inline-flex;
  align-items:center;
  justify-content:center;
  flex:none;
  border-radius:8px;
  background:var(--accent-weak);
  color:var(--accent);
}
.regime-summary-icon {
  width:18px;
  height:18px;
  fill:none;
  stroke:currentColor;
  stroke-width:1.8;
}
.regime-summary-copy {
  display:flex;
  flex-direction:column;
  min-width:0;
}
.regime-summary-title {
  font-size:var(--text-md);
  font-weight:600;
  color:var(--text-primary);
  line-height:1.25;
}
.regime-summary-subtitle {
  margin-top:2px;
  font-size:var(--text-sm);
  color:var(--text-muted);
  white-space:nowrap;
}
.regime-summary-metrics {
  display:grid;
  grid-template-columns:repeat(4,minmax(88px,1fr));
  min-width:0;
}
.regime-summary-metric {
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  min-width:0;
  padding:0 12px;
  border-left:1px solid var(--border-light);
  white-space:nowrap;
}
.regime-summary-metric strong {
  font-family:var(--font-mono);
  font-size:var(--text-lg);
  font-weight:700;
  line-height:1.2;
  color:var(--text-primary);
}
.regime-summary-metric span {
  margin-top:2px;
  font-size:var(--text-sm);
  color:var(--text-muted);
}
.regime-summary-metric .hy-i { color:var(--text-secondary); margin-left:3px; }
.regime-summary-go {
  display:inline-flex;
  align-items:center;
  color:var(--text-secondary);
}
.regime-summary-go svg {
  width:14px;
  height:14px;
  fill:none;
  stroke:currentColor;
  stroke-width:2;
  stroke-linecap:round;
  stroke-linejoin:round;
}
.regime-summary:hover .regime-summary-go { color:var(--accent); }

/* 移动端 */
@media (max-width:768px){
  .hero { height:150px }
  .hero-copy { left:18px }
  .hero-title { font-size: var(--text-xl) }
  .hero-sub { font-size: var(--text-sm); margin-top:6px }
  .snapshot { grid-template-columns:1fr; gap:10px }
  .caps { grid-template-columns:repeat(2,1fr) }
  .regime-summary-link {
    grid-template-columns:1fr;
    gap:6px;
    padding:7px 10px;
  }
  .regime-summary-heading {
    gap:8px;
  }
  .regime-summary-mark {
    width:22px;
    height:22px;
  }
  .regime-summary-icon {
    width:14px;
    height:14px;
  }
  .regime-summary-subtitle {
    display:none;
  }
  .regime-summary-metrics {
    grid-column:1 / -1;
    grid-template-columns:repeat(2,1fr);
    row-gap:4px;
    padding-top:6px;
    border-top:1px solid var(--border-light);
  }
  .regime-summary-metric { padding:0 6px; }
  .regime-summary-metric:nth-child(odd) { border-left:none; }
  .regime-summary-metric strong { font-size:var(--text-sm); }
  .regime-summary-metric span { font-size:var(--text-xs, 11px); }
  .regime-summary-go {
    display:none;
  }
  .regime-summary { margin-top: 4px !important; }
  /* 首页模拟交易条: 紧凑双列, 字号下沉, 避免「大卡片」感 */
  .public-home .paper-strip.mt-16,
  .site-public .paper-strip.mt-16 { margin-top: 10px !important; }
  .paper-strip {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 5px 10px;
    padding: 8px 10px;
    align-items: baseline;
  }
  .paper-heading {
    grid-column:1 / -1;
    justify-content:space-between;
  }
  .paper-title { font-size: var(--text-xs); align-self: center; }
  .paper-heading > .badge {
    font-size: var(--text-xs);
    padding: 0 5px;
  }
  .paper-kv { font-size: var(--text-xs); }
  .paper-kv b { font-size: var(--text-xs); font-weight: 600; }
  .paper-meta {
    grid-column: 1 / -1;
    margin-left: 0;
    width: auto;
    font-size: var(--text-xs);
    opacity: 0.9;
  }
  .quick-row { gap:6px }
  .quick-label { font-size: var(--text-xs); }
  .public-home .quick-row .btn-sm {
    font-size: var(--text-xs);
    min-height: 32px;
    padding: 5px 9px;
  }
  /* 研报列表: 移动端标题完整显示 (最多 2 行, 不再单行省略) */
  .home-list-reports .home-item { align-items:flex-start }
  .home-list-reports .home-item-title { white-space:normal; overflow:visible; text-overflow:clip;
    display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical }
}

/* ═══════════════ 全站顶部混合导航 (一级 topnav + sub-tab + 移动底部 Tab) ═══════════════ */
.topbar-logo { display:flex; align-items:center; gap:7px; text-decoration:none }
.topbar-brand { font-family:var(--font-display); font-size: var(--text-lg); font-weight:600; color:var(--text-primary); white-space:nowrap }

/* 一级 nav (桌面) */
.topnav { display:flex; align-items:center; gap:2px; margin-left:20px }
.topnav-group { position:static; display:flex; align-items:center; height:var(--topbar-height) }
.topnav-item { padding:0 12px; height:var(--topbar-height); line-height:var(--topbar-height); font-size: var(--text-md); color:var(--text-secondary); text-decoration:none; border-bottom:2px solid transparent; white-space:nowrap }
.topnav-item:hover { color:var(--text-primary) }
.topnav-item.active { color:var(--text-primary); border-bottom-color:var(--accent) }
.topnav-submenu {
  position:absolute;
  top:100%;
  left:0;
  right:0;
  height:44px;
  padding:0 24px;
  display:flex;
  align-items:center;
  gap:4px;
  overflow-x:auto;
  overflow-y:hidden;
  color:var(--text-primary);
  background:var(--bg-primary);
  border-bottom:1px solid var(--border);
  opacity:0;
  visibility:hidden;
  pointer-events:none;
  transform:translateY(-4px);
  transition:opacity .14s ease, transform .14s ease, visibility 0s linear .14s;
  z-index:95;
}
.topnav-submenu-item {
  display:inline-flex;
  align-items:center;
  min-width:0;
  min-height:36px;
  padding:7px 12px;
  border-radius:7px;
  color:var(--text-secondary);
  font-size:var(--text-base);
  text-decoration:none;
  white-space:nowrap;
}
.topnav-submenu-item:hover,
.topnav-submenu-item:focus-visible {
  color:var(--text-primary);
  background:var(--bg-hover);
  outline:none;
  text-decoration:none;
}
.topnav-submenu-item.active {
  color:var(--accent);
  background:var(--accent-weak);
}
.topnav-group:hover > .topnav-submenu,
.topnav-group:focus-within > .topnav-submenu {
  opacity:1;
  visibility:visible;
  pointer-events:auto;
  transform:none;
  transition-delay:0s;
}

/* 二级 sub-tab (fixed, topbar 下) */
.subtab-bar { position:fixed; top:var(--topbar-height); left:0; right:0; height:44px; display:flex; align-items:center; gap:4px; padding:0 24px; background:var(--bg-primary); border-bottom:1px solid var(--border); z-index:90; overflow-x:auto }
.subtab { padding:6px 12px; border-radius:7px; font-size: var(--text-base); color:var(--text-secondary); text-decoration:none; white-space:nowrap }
.subtab:hover { color:var(--text-primary); background:var(--bg-hover) }
.subtab.active { color:var(--accent); background:var(--accent-weak) }

/* 主内容: 全宽居中, 取消侧栏留位 */
.main-content { margin-left:auto !important; margin-right:auto; max-width:1320px }
.has-subtab .main-content { margin-top:calc(var(--topbar-height) + 44px) }

/* 桌面: 隐藏汉堡/抽屉/底部Tab (前台用顶部 nav) */
.hamburger-btn { display:none }
.sidebar { display:none }
/* 后台(/dbmanage/)与前台共用 .sidebar 类, 但后台是固定侧栏导航 → 显式恢复(特异性高于上行,
   且不进 @media, 桌面常驻; 移动端由下方 @media .sidebar 抽屉规则接管) */
body.admin .sidebar { display:block }
.bottom-tab { display:none }

/* 移动底部 Tab 基样 */
.btab { flex:1; display:flex; flex-direction:column; align-items:center; gap:3px; padding:7px 0 5px; color:var(--text-muted); text-decoration:none; font-size: var(--text-xs) }
.btab-ico { width:20px; height:20px; stroke:currentColor; fill:none; stroke-width:1.7 }
.btab.active { color:var(--accent) }
.btab.active .btab-ico { color:var(--accent) }

/* ── 移动端 (≤768): 顶部 nav 收起, 汉堡抽屉 + 底部 Tab ── */
@media (max-width:768px){
  .topnav { display:none }
  .topbar-ticker { display:none }
  .hamburger-btn { display:inline-flex; position:relative; z-index:2; flex-shrink:0 }
  .topbar { position:fixed; }
  /* 仅前台: logo+站名相对视口居中（后台不要 absolute, 否则与徽章/长文案互相遮挡） */
  .site-public .topbar-left {
    position:absolute;
    left:50%;
    top:0;
    bottom:0;
    transform:translateX(-50%);
    margin:0;
    gap:0;
    width:max-content;
    max-width:min(56vw, 220px);
    pointer-events:none;
    z-index:1;
    display:flex;
    align-items:center;
    justify-content:center;
  }
  .site-public .topbar-left .topnav { display:none; }
  .site-public .topbar-left .topbar-logo {
    pointer-events:auto;
    display:inline-flex;
    align-items:center;
    justify-content:center;
    gap:6px;
  }
  .site-public .topbar-brand { font-size:var(--text-lg); }
  .site-public .topbar-actions { margin-left:auto; position:relative; z-index:2; flex-shrink:0 }
  /* 后台顶栏: 品牌相对视口居中，左右操作区保持独立。 */
  body.admin .topbar {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 6px 10px;
  }
  body.admin .topbar-left {
    position: absolute;
    left: 50%;
    top: 0;
    bottom: 0;
    transform: translateX(-50%);
    flex: none;
    min-width: 0;
    max-width: calc(100vw - 190px);
    width: max-content;
    margin: 0;
    gap: 6px;
    pointer-events: none;
    overflow: hidden;
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 1;
  }
  body.admin .topbar-logo {
    pointer-events: auto;
    gap: 6px;
    font-size: var(--text-lg);
    min-width: 0;
    max-width: 100%;
  }
  body.admin .topbar-logo .brand-mark {
    width: 26px;
    height: 26px;
    flex-shrink: 0;
  }
  body.admin .topbar-brand {
    font-size: var(--text-lg);
    font-weight: 600;
    letter-spacing: -0.02em;
  }
  body.admin .topbar-admin-mark {
    display: none;
  }
  body.admin .topbar-actions {
    margin-left: auto;
    flex-shrink: 0;
    gap: 4px;
    z-index: 2;
  }
  body.admin .topbar-front-full { display: none; }
  body.admin .topbar-front-short { display: inline; }
  body.admin .topbar-actions .btn-sm {
    font-size: var(--text-xs);
    min-height: 32px;
    padding: 4px 8px;
  }
  .theme-trigger { width:40px; height:40px; min-width:40px; min-height:40px }
  .subtab-bar { padding:0 12px; scrollbar-width:none; -webkit-overflow-scrolling:touch }
  .subtab-bar::-webkit-scrollbar { display:none }
  .subtab { display:inline-flex; align-items:center; min-height:36px; padding:7px 12px }
  .sidebar { display:flex; flex-direction:column; position:fixed; top:0; left:0; bottom:0; width:248px; background:var(--bg-sidebar); border-right:1px solid var(--border); transform:translateX(-100%); transition:transform .2s; z-index:120; overflow-y:auto; padding-top:10px }
  .sidebar.open { transform:none }
  .sidebar-account { margin-top:auto }
  .bottom-tab { display:flex; position:fixed; left:0; right:0; bottom:0; height:56px; background:var(--bg-secondary); border-top:1px solid var(--border); z-index:110 }
  .site-public .main-content { padding-bottom:68px }
  /* 后台无底部 Tab, 内容底边距略小 */
  body.admin .admin-container,
  body.admin .main-content { padding-bottom: 20px; }
}

/* 后台 Admin 标记 (桌面也显示, 与前台 brand 区分) */
.topbar-admin-mark {
  display: inline-block;
  font-family: var(--font-sans);
  font-size: var(--text-xs);
  font-weight: 600;
  color: var(--text-muted);
  border: 1px solid var(--border);
  border-radius: 4px;
  padding: 1px 6px;
  line-height: 1.35;
  margin-left: 2px;
  letter-spacing: 0.02em;
}
.topbar-front-short { display: none; }
.topbar-front-full { display: inline; }


/* ── 前台移动端字号阶（.site-public 覆盖 token，全站正文统一变清晰） ── */
@media (max-width:768px) {
  html { font-size: var(--text-md); } /* 移动端与桌面同基数，避免 rem 缩到难读 */
  .site-public {
    --text-xs: 0.6875rem;   /* 11px */
    --text-sm: 0.8125rem;   /* 13px */
    --text-base: 0.875rem;  /* 14px */
    --text-md: 0.9375rem;   /* 15px */
    --text-lg: 1.0625rem;   /* 17px */
    --text-xl: 1.1875rem;   /* 19px */
    --text-2xl: 1.375rem;   /* 22px */
  }
  .site-public .page-title { font-size: var(--text-xl); line-height: 1.25; }
  .site-public .page-subtitle { font-size: var(--text-xs); line-height: 1.4; }
  .site-public .data-table { font-size: var(--text-sm); }
  .site-public .data-table th { font-size: var(--text-xs); }
  .site-public .text-meta,
  .site-public .text-summary { font-size: var(--text-xs); }
  .site-public .text-sm { font-size: var(--text-sm); }
  .site-public .btn-sm { font-size: var(--text-sm); min-height: 34px; padding: 6px 10px; }
  .site-public .subtab { font-size: var(--text-sm); }
  .site-public .btab { font-size: var(--text-xs); }
  .site-public .metric-card { padding: 10px 12px; }
  .site-public .metric-card .metric-label { font-size: var(--text-xs); }
  .site-public .metric-card .metric-value { font-size: var(--text-xl); line-height: 1.2; }
  .site-public .metric-card .metric-change,
  .site-public .metric-card .metric-ts { font-size: var(--text-xs); }
  .site-public .panel-header { font-size: var(--text-sm); }
  /* 注释/说明类：移动端一律 --text-xs（图注、i 注、策略注、指标说明、脚注） */
  .site-public .chart-panel > .chart-note,
  .site-public .note-i,
  .site-public .risk-note,
  .site-public .strat-note,
  .site-public .calendar-note,
  .site-public .sp-note-body p,
  .site-public .pro-disclaimer,
  .site-public .pro-placeholder-desc,
  .site-public .auth-sub,
  .site-public .auth-footnote,
  .site-public .auth-label,
  .site-public .dc-period-label,
  .site-public .kline-toolbar-label,
  .site-public .do-intervals-lbl,
  .site-public .indicator-legend,
  .site-public .indicator-legend-label,
  .site-public .indicator-ts,
  .site-public .fg-now,
  .site-public .ashare-wechat-hint,
  .site-public .ashare-wechat-url,
  .site-public .article-meta,
  .site-public .bookmark-time,
  .site-public .account-card .text-meta,
  .site-public .hy-ipop,
  .site-public .hy-ipop b,
  .site-public .chart-tip-table,
  .site-public .chart-tip-line,
  .site-public .chart-tip-section,
  .site-public .chart-tip-volume,
  .site-public .freshness-badge { font-size: var(--text-xs) !important; line-height: 1.45; }
  .site-public .hy-i { width: 12px; height: 12px; font-size: var(--text-xs); }
  .site-public .home-item-title { font-size: var(--text-sm); }
  .site-public .home-item-sub { font-size: var(--text-xs); }
  .site-public .home-item-val { font-size: var(--text-xs); }
  /* 表格溢出: 主内容区任意 table 外层可横滑; 防页面级撑破 */
  .site-public .main-content { overflow-x: clip; }
  .site-public .main-content .table-wrap,
  .site-public .main-content .table-scroll {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    max-width: 100%;
  }
  .site-public .main-content table.data-table {
    min-width: 0;
  }
  .site-public .main-content table.data-table th,
  .site-public .main-content table.data-table td {
    padding: 6px 8px;
  }
  .site-public .kline-head-card { padding: 10px 12px; }
  .site-public .kline-head-card .page-title { font-size: var(--text-base) !important; }
  .site-public .kline-head-card .page-subtitle { font-size: var(--text-xs) !important; }
  .site-public .kline-close { font-size: var(--text-lg) !important; font-weight: 700; }
  .site-public .kline-change { font-size: var(--text-xs) !important; }
  .site-public .kline-time,
  .site-public #kline-info-ohlc,
  .site-public #kline-info-ohlc div,
  .site-public #kline-info-ohlc span { font-size: var(--text-xs) !important; }
  /* 覆盖 .site-public .btn-sm 的 34px/text-sm，避免工具条仍偏大 */
  .site-public .public-kline .interval-row .kline-toolbar-label,
  .site-public .public-kline .interval-row .text-sm,
  .site-public .public-kline .interval-row .text-meta {
    font-size: var(--text-xs) !important;
  }
  .site-public .public-kline .interval-row .btn,
  .site-public .public-kline .interval-row .btn-sm,
  .site-public .public-kline .interval-row .kline-group-btn {
    font-size: var(--text-xs) !important;
    min-height: 26px !important;
    padding: 2px 6px !important;
  }
  .site-public #kline-chart { min-height: 380px; }
  .site-public .public-kline .chart-container,
  .site-public .public-kline [id="kline-chart"] { height: 400px !important; max-height: 52vh; }
  /* 前台图表容器移动端略收高度，纵轴靠 charts.js 更小字号 */
  .site-public .chart-container { min-height: 280px; }
  .site-public .chart-panel .chart-container { max-height: 48vh; }
}

/* 法律页移动端密度：放在全站 token/page-title 覆盖之后，用更高优先级压住字号与内边距 */
@media (max-width: 768px) {
  .site-public .main-content:has(.legal-page) {
    padding: 12px 12px 72px; /* 底部给 bottom-tab + cookie 横幅留空 */
  }
  .site-public .legal-page .page-header {
    margin-bottom: 6px;
  }
  .site-public .legal-page .page-title,
  .site-public .legal-page h1.page-title {
    font-size: var(--text-base) !important; /* 密度优先标题 */
    line-height: 1.25 !important;
    letter-spacing: 0 !important;
  }
  .site-public .legal-page .page-subtitle {
    font-size: var(--text-xs) !important;
    margin-top: 2px !important;
    line-height: 1.35;
  }
  .site-public .legal-page .panel-body {
    padding: 9px 10px !important;
    overflow-x: hidden !important;
  }
  .site-public .legal-body {
    font-size: var(--text-xs) !important; /* 法律长文密度 */
    line-height: 1.5 !important;
  }
  .site-public .legal-body h2 {
    font-size: var(--text-sm) !important;
    margin: 0.75em 0 0.25em !important;
    line-height: 1.3 !important;
  }
  .site-public .legal-body p,
  .site-public .legal-body li {
    margin: 0.22em 0;
  }
  .site-public .legal-body ul {
    padding-left: 1.05em;
    margin: 0.25em 0 0.45em;
  }
  .site-public .legal-table-wrap {
    margin: 6px 0 10px;
    overflow-x: visible;
  }
  .site-public .legal-table {
    font-size: var(--text-xs) !important;
    min-width: 0 !important;
    width: 100% !important;
    table-layout: auto;
  }
  /* Cookie 表：窄屏改卡片行，避免三列挤爆 */
  .site-public .legal-table thead {
    display: none !important;
  }
  .site-public .legal-table,
  .site-public .legal-table tbody,
  .site-public .legal-table tr,
  .site-public .legal-table td {
    display: block;
    width: 100%;
    max-width: 100%;
    box-sizing: border-box;
  }
  .site-public .legal-table tr {
    border: 1px solid var(--border);
    border-radius: 8px;
    padding: 7px 8px;
    margin-bottom: 7px;
    background: var(--bg-secondary);
  }
  .site-public .legal-table td {
    border: 0 !important;
    padding: 2px 0 !important;
    display: grid;
    grid-template-columns: minmax(52px, 30%) minmax(0, 1fr);
    gap: 4px 6px;
    align-items: start;
  }
  .site-public .legal-table td::before {
    content: attr(data-label);
    color: var(--text-muted);
    font-size: var(--text-xs);
    line-height: 1.3;
    font-weight: 500;
  }
}

/* ── 后台移动端细节（body.admin；不大改布局: KPI/表/操作列/对齐） ── */
@media (max-width:768px) {
  body.admin {
    --text-xs: 0.6875rem;
    --text-sm: 0.8125rem;
    --text-base: 0.875rem;
    --text-md: 0.9375rem;
    --text-lg: 1.0625rem;
    --text-xl: 1.1875rem;
    --text-2xl: 1.375rem;
  }
  body.admin .main-content,
  body.admin .admin-container {
    overflow-x: clip;
    max-width: 100%;
    padding-left: 12px;
    padding-right: 12px;
  }
  body.admin .sidebar.mini ~ .admin-container {
    margin-left:0;
  }
  /* 移动端抽屉：禁止继承桌面 mini(54px 图标条)，否则只见图标不见文案 */
  body.admin .sidebar,
  body.admin .sidebar.mini {
    width: min(82vw, 280px) !important;
  }
  body.admin .sidebar.mini .nav-label,
  body.admin .sidebar.mini .badge,
  body.admin .sidebar.mini .nav-version-badge,
  body.admin .sidebar.mini .nd-tag,
  body.admin .sidebar.mini .ng-sub {
    display: inline !important;
  }
  body.admin .sidebar.mini .nav-group-hd {
    display: flex !important;
    padding-left: 14px !important;
  }
  body.admin .sidebar.mini .nav-item,
  body.admin .sidebar.mini .nav-item.sub,
  body.admin .sidebar.mini .nav-gate-item {
    justify-content: flex-start !important;
    gap: 10px !important;
    padding-left: 14px !important;
    border-left-color: transparent;
  }
  body.admin .sidebar.mini .nav-item.sub { padding-left: 40px !important; }
  body.admin .sidebar.mini .nav-item.active {
    background: rgba(52, 211, 153, 0.12);
  }
  body.admin .sidebar-toggle { display: none !important; }
  body.admin .sl-registry-head {
    flex-wrap:nowrap;
    gap:8px;
    padding:10px 12px;
  }
  body.admin .sl-registry-title {
    font-size:var(--text-sm);
  }
  body.admin .sl-panel-note {
    margin-left:0;
    font-size:var(--text-xs);
  }
  body.admin .table-wrap,
  body.admin .table-scroll,
  body.admin .pt-tbl-wrap {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    max-width: 100%;
  }
  /* 页头对齐与字号 */
  body.admin .page-header,
  body.admin .ph,
  body.admin .ph-head {
    min-width: 0;
  }
  body.admin .page-title,
  body.admin .ph-title,
  body.admin h1.page-title {
    font-size: var(--text-xl);
    line-height: 1.25;
    word-break: break-word;
  }
  body.admin .ph-desc,
  body.admin .hy-approval-desc,
  body.admin .hy-approval-panel-desc,
  body.admin .page-subtitle,
  body.admin .cfg-note,
  body.admin .help-text,
  body.admin .panel-note,
  body.admin .info-box,
  body.admin .section-subnote,
  body.admin .group-help,
  body.admin .group-role-note,
  body.admin .modal-help-text,
  body.admin .summary-footnote,
  body.admin .progress-note,
  body.admin .rc-risk-note,
  body.admin .rc-rule-note,
  body.admin .hy-ipop,
  body.admin .hy-ipop b,
  body.admin .devops-body-note,
  body.admin .devops-field-footnote,
  body.admin .lv-release-note {
    font-size: var(--text-xs) !important;
    line-height: 1.45;
  }
  body.admin .hy-i {
    width: 12px;
    height: 12px;
    font-size: var(--text-xs);
  }
  body.admin .pt-kpi {
    padding: 10px 11px;
  }
  body.admin .pt-kpi .val {
    font-size: var(--text-lg);
    line-height: 1.2;
    word-break: break-word;
  }
  body.admin .pt-kpi .lbl {
    font-size: var(--text-xs);
  }
  body.admin .pt-kpi .sub {
    font-size: var(--text-xs);
    margin-top: 2px;
  }
  body.admin table.data-table,
  body.admin table.pt-tbl {
    font-size: var(--text-sm);
  }
  body.admin table.data-table th,
  body.admin table.data-table td,
  body.admin table.pt-tbl th,
  body.admin table.pt-tbl td {
    padding: 5px 7px;
  }
  body.admin .act-cell,
  body.admin .article-actions-col {
    min-width: 0 !important;
    white-space: normal;
  }
  /* 表单控件: 满宽、字号一致 */
  body.admin input[type="text"],
  body.admin input[type="number"],
  body.admin input[type="password"],
  body.admin input[type="email"],
  body.admin input[type="search"],
  body.admin select,
  body.admin textarea {
    max-width: 100%;
    font-size: var(--text-sm);
  }
  body.admin .btn,
  body.admin .pt-btn,
  body.admin .pc-btn {
    font-size: var(--text-sm);
  }
  body.admin .btn-sm {
    font-size: var(--text-xs);
    min-height: 32px;
  }
  /* 侧栏抽屉：标题、分组、子项使用同一字阶与图标网格。 */
  body.admin .sidebar .nav-label,
  body.admin .sidebar .nav-section-lbl,
  body.admin .sidebar .nav-group-hd,
  body.admin .sidebar .nav-domain-label {
    font-size: var(--text-sm);
  }
  body.admin .sidebar .nav-item,
  body.admin .sidebar .nav-group-hd {
    min-height: 42px;
    gap:10px;
    padding-top:9px;
    padding-bottom:9px;
  }
  body.admin .sidebar .nav-domain-label {
    gap:10px;
    padding-top:11px;
    padding-bottom:5px;
  }
  body.admin .sidebar .nav-group-hd--domain {
    letter-spacing:0;
    font-weight:600;
  }
  body.admin .sidebar .nav-ico {
    width:17px;
    height:17px;
  }
  body.admin .sidebar .nav-item.sub {
    padding-left:43px;
  }
  body.admin .hyv3-statebar { gap: 6px; }
  body.admin .hyv3-statebar .pt-kpi .val { font-size: var(--text-md); }
  body.admin .hyv3-head {
    gap: 8px;
  }
  /* 面板标题 */
  body.admin .panel-header,
  body.admin .pt-panel h4,
  body.admin .card-title {
    font-size: var(--text-base);
    line-height: 1.3;
  }
}

/* ═══════════════ 恐惧贪婪 半圆 gauge + 分带图例 ═══════════════ */
.fg-hero { display:flex; align-items:center; gap:28px; flex-wrap:wrap; padding:14px 20px; margin-bottom:18px }
.fg-gauge { flex:1 1 320px; min-width:280px; height:200px }
.fg-side { flex:0 0 auto }
.fg-now { font-size: var(--text-xs); color:var(--text-muted); margin-bottom:10px }
.fg-zones { list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:7px; font-size: var(--text-base); color:var(--text-secondary) }
.fg-zones li { display:flex; align-items:center; gap:8px }
.fg-zones b { color:var(--text-primary); font-family:var(--font-mono); font-weight:600 }
/* 恐惧贪婪色谱(数据可视化域色, 与 gauge/图表一致) */
.fg-dot { width:10px; height:10px; border-radius:3px; flex:none }
.fg-z-ef { background:#EF5350 } .fg-z-f { background:#F0883E } .fg-z-n { background:#E3A008 } .fg-z-g { background:#34D399 } .fg-z-eg { background:#26A69A }
.fg-tbl-val { font-weight:600 }   /* 历史表数值列: 左对齐 + 按分区着色(见 text-up/down/warn) + 加粗 */

/* ═══════════════ KPI 卡 sparkline (稳定币 / 美股) ═══════════════ */
.sc-kpi-grid { display:grid; grid-template-columns:repeat(auto-fit, minmax(200px, 1fr)); gap:12px; margin-bottom:10px }
.sc-kpi-foot { display:flex; align-items:center; justify-content:space-between; gap:10px; margin-top:8px }
.spark-kpi { width:84px; height:26px; flex:none }
.sc-kpi-ts { font-size: var(--text-sm); color:var(--text-muted); margin-bottom:18px }
.cash-demand-chart-toolbar { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin:14px 0 4px; color:var(--text-secondary); font-size:var(--text-sm) }
.cash-demand-chart-toolbar label { color:var(--text-primary); font-weight:600 }
.cash-demand-chart-toolbar select { background:var(--bg-card); color:var(--text-primary); border:1px solid var(--border); border-radius:5px; padding:5px 28px 5px 9px; font-size:var(--text-sm) }
.cash-demand-chart-toolbar span { color:var(--text-muted) }
.cash-demand-page-title { display:flex; align-items:center; gap:7px }

/* ═══════════════ 量化策略 概览卡片网格 ═══════════════ */
.strat-toolbar { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin:14px 0 16px; font-size: var(--text-md); color:var(--text-secondary) }
.strat-sort { margin-left:auto; display:inline-flex; gap:6px }
.strat-grid { display:grid; grid-template-columns:repeat(auto-fill, minmax(280px, 1fr)); gap:14px }
/* 策略卡现可点进 WF 详情 → 链接化 + hover 高亮 + 显"查看详情" */
a.strat-card { display:block; background:var(--bg-card); border:1px solid var(--border); border-radius:var(--radius); padding:16px; min-width:0; text-decoration:none; color:inherit; transition:border-color .15s ease }
a.strat-card:hover { border-color:var(--accent) }
a.strat-card:hover .strat-card-go { color:var(--accent) }
.strat-card-hd { display:flex; align-items:flex-start; justify-content:space-between; gap:10px }
.strat-card-name { font-size: var(--text-md); font-weight:600; color:var(--text-primary); line-height:1.35 }
.strat-card-desc { font-size: var(--text-base); color:var(--text-secondary); margin:7px 0 0; line-height:1.6; min-height:2.5em }
.strat-card-spark { width:100%; height:34px; margin-top:10px }
.strat-card-go { display:block; margin-top:10px; font-size: var(--text-sm); color:var(--text-muted); font-family:var(--font-mono); transition:color .15s ease }
.strat-note { font-size: var(--text-xs); color:var(--text-muted); margin-top:16px; line-height:1.55 }

/* ── 公开策略详情页 ── */
.sp-back { margin:4px 0 10px }
.sp-badges { margin-top:14px }
.sp-notes { display:grid; grid-template-columns:repeat(auto-fit, minmax(280px, 1fr)); gap:14px }
.sp-note-body p { font-size: var(--text-xs); color:var(--text-secondary); line-height:1.6; margin:0 0 8px }
.site-public .sp-note-body p { font-size: var(--text-xs); }
.sp-note-body p:last-child { margin-bottom:0 }
.sp-note-body strong { color:var(--text-primary); font-weight:600 }

/* ═══════════════ 数据总览 dashboard (行情hero + 模块KPI卡) ═══════════════ */
.do-hero { display:flex; gap:14px; align-items:stretch; flex-wrap:wrap; margin-bottom:16px }
.do-price { flex:1 1 320px; min-width:280px; background:var(--bg-secondary); border:1px solid var(--border); border-radius:10px; padding:16px 18px; text-decoration:none; color:inherit; display:flex; flex-direction:column; justify-content:center; transition:border-color .15s ease }
.do-price:hover { border-color:var(--accent) }
.do-price-top { display:flex; justify-content:space-between; align-items:baseline; gap:10px; flex-wrap:wrap }
.do-price-name { font-size: var(--text-base); color:var(--text-secondary) }
.do-price-ts { font-size: var(--text-sm); color:var(--text-muted); font-family:var(--font-mono) }
.do-price-val { font-size: var(--text-3xl); font-weight:700; font-family:var(--font-mono); line-height:1.1; margin:6px 0 }
.do-price-foot { display:flex; gap:12px; align-items:baseline; font-size: var(--text-base); flex-wrap:wrap }
.do-intervals { flex:0 0 auto; display:flex; flex-direction:column; gap:8px; justify-content:center; align-items:flex-start; padding:2px 4px }
.do-intervals-lbl { font-size: var(--text-sm); color:var(--text-muted) }
.do-grid { display:grid; grid-template-columns:repeat(auto-fill, minmax(220px, 1fr)); gap:12px }
a.do-card { text-decoration:none; color:inherit; display:block; transition:border-color .15s ease }
a.do-card:hover { border-color:var(--accent) }
.do-card .do-mv { font-size: var(--text-lg); margin-top:4px }
.do-section-label{margin-top:20px}
.do-map-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:14px}
.do-map-card{margin:0}
.do-map-desc{margin:0 0 12px;color:var(--text-secondary);font-size:var(--text-sm);line-height:1.7}
.do-link-row{display:flex;gap:8px;flex-wrap:wrap}
.basis-summary{margin-bottom:16px}
.regime-hero{margin-bottom:16px;align-items:flex-start}
.regime-current{flex:1 1 320px;min-width:280px;background:var(--bg-secondary);border:1px solid var(--border);border-radius:10px;padding:16px 18px}
.regime-label{font-size:var(--text-3xl);font-weight:700;line-height:1.1;margin:8px 0;font-family:var(--font-mono)}
.regime-desc{margin:0;color:var(--text-secondary);line-height:1.65}
.regime-method{margin:8px 0 0;color:var(--text-muted);font-size:var(--text-sm);line-height:1.6}
.regime-summary{margin-bottom:16px}
/* ── 风险热力图 (语义热度: 绿冷 → 黄中 → 红热; 令牌驱动) ── */
.risk-hero{
  display:flex;
  flex-direction:column;
  gap:14px;
  background:var(--bg-secondary);
  border:1px solid var(--border);
  border-radius:10px;
  padding:16px 18px;
  margin-bottom:14px;
  position:relative;
  overflow:hidden;
  min-width:0;
}
.risk-hero::before{
  content:"";
  position:absolute;
  left:0; top:0; bottom:0;
  width:3px;
  background:var(--border);
}
.risk-hero.risk-heat-1::before,
.risk-hero.risk-heat-2::before{ background:var(--green); }
.risk-hero.risk-heat-3::before{ background:var(--yellow); }
.risk-hero.risk-heat-4::before,
.risk-hero.risk-heat-5::before{ background:var(--red); }
.risk-hero.risk-heat-4,
.risk-hero.risk-heat-5{
  background:
    linear-gradient(110deg, rgba(var(--red-rgb),.10) 0%, transparent 42%),
    var(--bg-secondary);
}
.risk-hero.risk-heat-3{
  background:
    linear-gradient(110deg, rgba(var(--yellow-rgb),.10) 0%, transparent 42%),
    var(--bg-secondary);
}
.risk-hero.risk-heat-1,
.risk-hero.risk-heat-2{
  background:
    linear-gradient(110deg, rgba(var(--green-rgb),.08) 0%, transparent 42%),
    var(--bg-secondary);
}
.risk-hero-main{ min-width:0; }
.risk-kicker{ font-size:var(--text-sm); color:var(--text-muted); margin:0; }
.risk-hero-scoreline{
  display:flex;
  align-items:center;
  gap:10px;
  flex-wrap:wrap;
  margin:4px 0 6px;
}
.risk-score{
  font-size:var(--text-3xl);
  font-weight:700;
  font-family:var(--font-mono);
  line-height:1.1;
  letter-spacing:-0.02em;
  color:var(--text-primary);
}
.risk-hero.risk-heat-4 .risk-score,
.risk-hero.risk-heat-5 .risk-score{ color:var(--red); }
.risk-hero.risk-heat-3 .risk-score{ color:var(--yellow); }
.risk-hero.risk-heat-1 .risk-score,
.risk-hero.risk-heat-2 .risk-score{ color:var(--green); }
.risk-desc{ margin:0; color:var(--text-secondary); line-height:1.55; max-width:52em; }

/* 综合条: 六维热度缩略 */
.risk-hero-strip{
  display:grid;
  grid-template-columns:repeat(6, minmax(0,1fr));
  gap:6px;
  min-width:0;
}
.risk-strip-cell{
  height:8px;
  border-radius:999px;
  background:var(--bg-tertiary);
  border:1px solid var(--border);
  min-width:0;
}
.risk-strip-cell.risk-heat-1{ background:rgba(var(--green-rgb),.28); border-color:rgba(var(--green-rgb),.35); }
.risk-strip-cell.risk-heat-2{ background:rgba(var(--green-rgb),.48); border-color:rgba(var(--green-rgb),.45); }
.risk-strip-cell.risk-heat-3{ background:rgba(var(--yellow-rgb),.50); border-color:rgba(var(--yellow-rgb),.45); }
.risk-strip-cell.risk-heat-4{ background:rgba(var(--red-rgb),.48); border-color:rgba(var(--red-rgb),.42); }
.risk-strip-cell.risk-heat-5{
  background:rgba(var(--red-rgb),.72);
  border-color:rgba(var(--red-rgb),.55);
  box-shadow:0 0 10px rgba(var(--red-rgb),.25);
}

.risk-badge{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  min-width:2em;
  border:1px solid var(--border);
  border-radius:999px;
  padding:2px 9px;
  font-size:var(--text-sm);
  font-weight:600;
  background:var(--bg-hover);
  color:var(--text-secondary);
  line-height:1.4;
}
.risk-badge-high{ color:var(--red); border-color:rgba(var(--red-rgb),.45); background:var(--red-bg); }
.risk-badge-medium{ color:var(--yellow); border-color:rgba(var(--yellow-rgb),.40); background:var(--yellow-bg); }
.risk-badge-low{ color:var(--green); border-color:rgba(var(--green-rgb),.35); background:var(--green-bg); }
.risk-badge-missing{ color:var(--text-muted); background:var(--bg-hover); }

/* 图例 */
.risk-legend{
  display:flex;
  align-items:center;
  gap:8px;
  flex-wrap:wrap;
  margin:0 0 12px;
  min-width:0;
}
.risk-legend-label{ margin-right:2px; }
.risk-legend-item{
  display:inline-flex;
  align-items:center;
  gap:5px;
  font-size:var(--text-sm);
  color:var(--text-muted);
}
.risk-legend-item i{
  width:14px;
  height:10px;
  border-radius:3px;
  display:inline-block;
  border:1px solid var(--border);
  background:var(--bg-tertiary);
}
.risk-legend-item.risk-heat-1 i{ background:rgba(var(--green-rgb),.30); border-color:rgba(var(--green-rgb),.35); }
.risk-legend-item.risk-heat-2 i{ background:rgba(var(--green-rgb),.55); border-color:rgba(var(--green-rgb),.40); }
.risk-legend-item.risk-heat-3 i{ background:rgba(var(--yellow-rgb),.55); border-color:rgba(var(--yellow-rgb),.40); }
.risk-legend-item.risk-heat-4 i{ background:rgba(var(--red-rgb),.50); border-color:rgba(var(--red-rgb),.40); }
.risk-legend-item.risk-heat-5 i{ background:rgba(var(--red-rgb),.75); border-color:rgba(var(--red-rgb),.50); }

/* 矩阵 */
.risk-map{ display:grid; gap:10px; margin-bottom:14px; min-width:0; }
.risk-map-row{
  display:grid;
  grid-template-columns:56px minmax(0,1fr);
  gap:10px;
  align-items:stretch;
  min-width:0;
}
.risk-axis{
  display:flex;
  align-items:center;
  justify-content:center;
  border:1px solid var(--border);
  border-radius:10px;
  background:var(--bg-secondary);
  color:var(--text-muted);
  font-size:var(--text-sm);
  font-weight:600;
  letter-spacing:.04em;
  writing-mode:horizontal-tb;
}
.risk-cells{
  display:grid;
  grid-template-columns:repeat(2, minmax(0,1fr));
  gap:10px;
  min-width:0;
}
.risk-cell{
  position:relative;
  display:flex;
  flex-direction:column;
  gap:4px;
  text-decoration:none;
  color:inherit;
  border:1px solid var(--border);
  border-radius:10px;
  background:var(--bg-secondary);
  padding:14px 14px 12px;
  overflow:hidden;
  min-width:0;
  transition:border-color .15s ease, transform .15s ease, box-shadow .15s ease;
}
.risk-cell:hover{
  text-decoration:none;
  transform:translateY(-1px);
  box-shadow:0 6px 18px rgba(0,0,0,.18);
}
.risk-cell:focus-visible{
  outline:none;
  border-color:var(--border-focus);
  box-shadow:0 0 0 2px var(--accent-weak);
}
.risk-cell-glow{
  position:absolute;
  inset:auto -20% -40% auto;
  width:55%;
  height:70%;
  border-radius:50%;
  pointer-events:none;
  opacity:.55;
  filter:blur(18px);
  background:transparent;
}
.risk-cell-top{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:8px;
  min-width:0;
  position:relative;
  z-index:1;
}
.risk-cell-title{
  font-size:var(--text-sm);
  font-weight:600;
  color:var(--text-secondary);
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.risk-cell-score{
  position:relative;
  z-index:1;
  font-size:var(--text-2xl);
  font-weight:700;
  font-family:var(--font-mono);
  line-height:1.15;
  letter-spacing:-0.02em;
  color:var(--text-primary);
}
.risk-cell-value,
.risk-cell-detail{
  position:relative;
  z-index:1;
  font-size:var(--text-sm);
  color:var(--text-muted);
  line-height:1.4;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.risk-cell-detail{ opacity:.9; }
.risk-cell-meter{
  position:relative;
  z-index:1;
  margin-top:8px;
  height:4px;
  border-radius:999px;
  background:var(--bg-tertiary);
  overflow:hidden;
  border:1px solid var(--border-light);
}
.risk-cell-meter-fill{
  display:block;
  height:100%;
  border-radius:inherit;
  width:20%;
  background:var(--border);
}
/* 热度档 → 色块 / 分数 / 底光 / 进度宽度 (宽度由档位 CSS 给定, 非前端算分) */
.risk-cell.risk-heat-1{
  background:linear-gradient(155deg, rgba(var(--green-rgb),.14) 0%, var(--bg-secondary) 58%);
  border-color:rgba(var(--green-rgb),.28);
}
.risk-cell.risk-heat-2{
  background:linear-gradient(155deg, rgba(var(--green-rgb),.22) 0%, var(--bg-secondary) 60%);
  border-color:rgba(var(--green-rgb),.38);
}
.risk-cell.risk-heat-3{
  background:linear-gradient(155deg, rgba(var(--yellow-rgb),.18) 0%, var(--bg-secondary) 58%);
  border-color:rgba(var(--yellow-rgb),.36);
}
.risk-cell.risk-heat-4{
  background:linear-gradient(155deg, rgba(var(--red-rgb),.18) 0%, var(--bg-secondary) 58%);
  border-color:rgba(var(--red-rgb),.40);
}
.risk-cell.risk-heat-5{
  background:linear-gradient(155deg, rgba(var(--red-rgb),.28) 0%, var(--bg-secondary) 55%);
  border-color:rgba(var(--red-rgb),.55);
  box-shadow:inset 0 0 0 1px rgba(var(--red-rgb),.12);
}
.risk-cell.risk-heat-1 .risk-cell-glow{ background:rgba(var(--green-rgb),.35); }
.risk-cell.risk-heat-2 .risk-cell-glow{ background:rgba(var(--green-rgb),.45); }
.risk-cell.risk-heat-3 .risk-cell-glow{ background:rgba(var(--yellow-rgb),.40); }
.risk-cell.risk-heat-4 .risk-cell-glow{ background:rgba(var(--red-rgb),.40); }
.risk-cell.risk-heat-5 .risk-cell-glow{ background:rgba(var(--red-rgb),.55); }
.risk-cell.risk-heat-1 .risk-cell-score,
.risk-cell.risk-heat-2 .risk-cell-score{ color:var(--green); }
.risk-cell.risk-heat-3 .risk-cell-score{ color:var(--yellow); }
.risk-cell.risk-heat-4 .risk-cell-score,
.risk-cell.risk-heat-5 .risk-cell-score{ color:var(--red); }
.risk-cell.risk-heat-1 .risk-cell-meter-fill{ width:20%; background:var(--green); }
.risk-cell.risk-heat-2 .risk-cell-meter-fill{ width:40%; background:var(--green); }
.risk-cell.risk-heat-3 .risk-cell-meter-fill{ width:60%; background:var(--yellow); }
.risk-cell.risk-heat-4 .risk-cell-meter-fill{ width:80%; background:var(--red); }
.risk-cell.risk-heat-5 .risk-cell-meter-fill{ width:100%; background:var(--red); }
.risk-cell.risk-heat-0,
.risk-cell.risk-level-missing{
  opacity:.72;
  background:var(--bg-secondary);
}
.risk-cell.risk-heat-0 .risk-cell-score{ color:var(--text-muted); }

.risk-cell:hover.risk-heat-1,
.risk-cell:hover.risk-heat-2{ border-color:rgba(var(--green-rgb),.55); }
.risk-cell:hover.risk-heat-3{ border-color:rgba(var(--yellow-rgb),.55); }
.risk-cell:hover.risk-heat-4,
.risk-cell:hover.risk-heat-5{ border-color:rgba(var(--red-rgb),.65); }

.risk-note{ margin:0; }
 /* 兼容旧 class, 本页已不再渲染 */
.calendar-summary{margin-bottom:16px}
.calendar-summary-card{min-height:100px}
.calendar-highlight{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px;margin-bottom:16px}
.calendar-event{display:flex;flex-direction:column;gap:7px;text-decoration:none;color:inherit;border:1px solid var(--border);border-left:3px solid var(--border);border-radius:8px;background:var(--bg-secondary);padding:14px 16px;transition:border-color .15s ease}
.calendar-event:hover{border-color:var(--accent)}
.calendar-event-top{display:flex;align-items:center;justify-content:space-between;gap:10px}
.calendar-badge{display:inline-flex;align-items:center;border:1px solid var(--border);border-radius:999px;padding:2px 8px;font-size:var(--text-sm);font-weight:600;background:var(--bg-hover);color:var(--text-secondary)}
.calendar-distance{font-size:var(--text-sm);color:var(--text-muted)}
.calendar-title{font-size:var(--text-lg);font-weight:700;color:var(--text-primary);line-height:1.35}
.calendar-time{font-family:var(--font-mono);font-size:var(--text-sm);color:var(--text-secondary)}
.calendar-detail{font-size:var(--text-sm);color:var(--text-muted);line-height:1.6}
.calendar-impact-high{border-left-color:rgba(var(--accent-rgb),.72)}
.calendar-impact-medium{border-left-color:rgba(var(--accent-rgb),.34)}
.calendar-impact-low{border-left-color:var(--border)}
.calendar-impact-text{font-weight:600;color:var(--text-secondary)}
.calendar-impact-text-high{color:var(--accent)}
.calendar-impact-text-medium{color:var(--text-primary)}
.calendar-impact-text-low{color:var(--text-muted)}
.calendar-note{margin:0;color:var(--text-secondary);line-height:1.75}
.dw-tabs{display:flex;gap:4px;margin:14px 0 6px;border-bottom:1px solid var(--border)}
.dw-ok{color:var(--green)}
.dw-bad{color:var(--red)}
.dw-warn{color:var(--yellow)}
.dw-muted{color:var(--text-muted)}
.dw-sync-value{font-size: var(--text-xl)}
.dw-freshness-panel{margin-bottom:20px}
.dw-freshness-head{display:flex;align-items:center;justify-content:space-between;gap:10px}
.dw-freshness-summary{color:var(--text-secondary);font-size: var(--text-base);margin-bottom:12px;line-height:1.55}
.dw-freshness-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px;margin-bottom:12px}
.dw-freshness-card{border:1px solid var(--border);border-radius:6px;background:var(--bg-tertiary);padding:10px 12px}
.dw-freshness-card.dw-freshness-ok{border-color:rgba(100,255,218,.22)}
.dw-freshness-card.dw-freshness-warn{border-color:rgba(255,205,86,.28)}
.dw-freshness-card.dw-freshness-bad{border-color:rgba(255,99,132,.3)}
.dw-freshness-label{font-size: var(--text-sm);color:var(--text-muted);margin-bottom:4px}
.dw-freshness-value{font-size: var(--text-lg);color:var(--text-primary);font-weight:700}
.dw-freshness-detail{font-size: var(--text-sm);color:var(--text-muted);margin-top:3px;line-height:1.45}
.dw-priority-title{font-size: var(--text-sm);color:var(--text-primary);font-weight:700;margin:8px 0}
.dw-priority-table{font-size: var(--text-sm)}
.dw-missing-panel{margin-bottom:20px;border:1px solid var(--yellow)}
.dw-missing-head{background:var(--yellow-bg)}
.dw-missing-body{padding:10px;overflow:hidden}
.dw-missing-scroll{display:flex;gap:12px;overflow-x:auto;white-space:nowrap;padding-bottom:6px;scroll-behavior:smooth}
.dw-missing-card{flex-shrink:0;min-width:280px;background:var(--bg-tertiary);border:1px solid var(--border);border-radius:6px;padding:10px 14px;font-size: var(--text-sm)}
.dw-missing-title{color:var(--text-link);font-weight:600;margin-bottom:4px}
.dw-missing-meta{display:flex;gap:16px;color:var(--text-secondary)}
.dw-missing-sub{margin-top:4px;font-size: var(--text-sm);color:var(--text-muted)}
.dw-pct{height:4px;width:100%;display:block;margin:6px 0 0;border:0;border-radius:3px;overflow:hidden;background:var(--bg-hover)}
.dw-pct::-webkit-progress-bar{background:var(--bg-hover);border-radius:3px}
.dw-pct::-webkit-progress-value{border-radius:3px}
.dw-pct::-moz-progress-bar{border-radius:3px}
.dw-pct-ok::-webkit-progress-value{background:var(--green)}
.dw-pct-warn::-webkit-progress-value{background:var(--yellow)}
.dw-pct-bad::-webkit-progress-value{background:var(--red)}
.dw-pct-ok::-moz-progress-bar{background:var(--green)}
.dw-pct-warn::-moz-progress-bar{background:var(--yellow)}
.dw-pct-bad::-moz-progress-bar{background:var(--red)}
.dw-scroll-actions{text-align:center;margin-top:4px}
.dw-small-btn{font-size: var(--text-sm)}
.dw-scroll-hint{font-size: var(--text-sm);color:var(--text-muted)}
.dw-recent-wrap{display:inline-block;margin-left:16px;overflow:hidden;white-space:nowrap;max-width:500px;vertical-align:middle}
.recent-missing-scroll{display:inline-block;padding-left:100%;animation:scroll-left 25s linear infinite;white-space:nowrap;font-size: var(--text-sm);color:var(--yellow)}
@keyframes scroll-left{0%{transform:translateX(0)}100%{transform:translateX(-50%)}}
.dw-table-en{margin-top:2px}
.dw-detail-btn{margin-left:4px}
.dw-detail-cell{padding:0}
.dw-column-detail{padding:12px}
.dw-detail-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.dw-detail-title{margin:0 0 8px;font-size: var(--text-base)}
.dw-field-table{font-size: var(--text-sm)}
.dw-pct-cell{display:flex;align-items:center;gap:6px}
.dw-pct-cell .dw-pct{margin:0}
.dw-empty-compact{padding:8px}
.dw-source-box{line-height:1.8}
.dw-gap-warn{margin-top:8px;color:var(--yellow)}
.dw-gap-ok{margin-top:8px;color:var(--green)}
.dw-source-note{margin-top:8px}
.dw-map-label{margin-top:10px}
.dw-map-sub{font-weight:400;color:var(--text-muted);font-size: var(--text-sm)}
.dw-map-section{margin-bottom:18px}
.dw-map-header{margin-bottom:8px}
.dw-map-schema{font-weight:600;color:var(--text-link)}
.dw-map-meta{color:var(--text-muted);font-size: var(--text-sm)}
.dw-map-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(225px,1fr));gap:10px}
.dw-map-unavailable{grid-column:1/-1;padding:14px}
.dbmap-card{background:var(--bg-secondary);border:1px solid var(--border);border-radius:8px;padding:11px 13px;cursor:pointer;transition:border-color .15s}
.dbmap-card:hover{border-color:var(--text-link)}
.dw-map-card-top{display:flex;justify-content:space-between;align-items:center;gap:8px}
.dw-map-card-name{font-weight:600;font-size: var(--text-base)}
.dw-map-card-tables{font-size: var(--text-sm);color:var(--text-secondary);margin-top:5px;line-height:1.55}
.dw-map-card-hint{font-size: var(--text-sm);color:var(--text-muted);font-family:var(--font-mono,monospace);margin-top:5px}
.dw-map-modal-table{font-size: var(--text-sm);width:100%}

/* Strategy Lab */
.sl-topbar { display:flex; gap:12px; flex-wrap:wrap; align-items:flex-end; margin-bottom:16px; padding:16px; background:var(--bg-secondary); border-radius:8px; border:1px solid var(--border) }
.sl-topbar label { font-size: var(--text-sm); color:var(--text-muted); display:block; margin-bottom:3px }
.sl-topbar select { background:var(--bg-primary); color:var(--text-primary); border:1px solid var(--border); border-radius:5px; padding:5px 10px; font-size: var(--text-base); min-width:140px }
.sl-topbar-actions { margin-left:auto; display:flex; gap:8px; align-items:flex-end }
.sl-card { background:var(--bg-secondary); border:1px solid var(--border); border-radius:8px; padding:14px 16px; margin-bottom:10px; cursor:pointer; transition:all 0.15s }
.sl-card:hover { border-color:var(--text-link) }
.sl-card.selected { border-color:var(--blue); box-shadow:0 0 0 1px var(--blue) }
.sl-registry-tabs { align-items:center }
.sl-registry-tabs .pt-tab { display:inline-flex; align-items:center; gap:6px }
.sl-card .card-header { display:flex; justify-content:space-between; align-items:center }
.sl-card .card-header h4 { color:var(--green); margin:0; font-size: var(--text-md)}
.sl-card .card-body { display:none; margin-top:10px; padding-top:10px; border-top:1px solid var(--border) }
.sl-card.expanded .card-body { display:block }
.sl-card .meta { display:flex; gap:12px; flex-wrap:wrap; font-size: var(--text-xs); color:var(--text-secondary) }
.sl-card .desc { color:var(--text-secondary); font-size: var(--text-xs); line-height:1.45; margin-top:4px;
  display:-webkit-box; -webkit-line-clamp:3; -webkit-box-orient:vertical; overflow:hidden; }
.sl-card.expanded .desc { display:block; -webkit-line-clamp:unset; overflow:visible; }
.sl-card .sl-card .params-grid { display:grid; grid-template-columns:repeat(auto-fit, minmax(280px, 1fr)); gap:6px }
.sl-card .param-row { display:flex; flex-direction:column; gap:3px; background:var(--bg-primary); border-radius:5px; padding:6px 10px; border:1px solid rgba(100,255,218,0.08) }
.sl-card .param-row .param-label-row { display:flex; align-items:center; gap:6px }
.sl-card .param-row label { font-size: var(--text-sm); color:var(--text-muted); min-width:90px; white-space:nowrap; font-weight:600 }
.sl-card .param-row input { background:var(--bg-secondary); color:var(--text-link); border:1px solid var(--border); border-radius:3px; padding:2px 6px; font-size: var(--text-sm); font-family:var(--font-mono); width:85px; flex-shrink:0 }
.sl-card .param-row input:focus { border-color:var(--blue); outline:none }
.sl-card .param-row input.dirty { border-color:var(--yellow) }
.sl-card .param-row select { background:var(--bg-secondary); color:var(--text-link); border:1px solid var(--border); border-radius:3px; padding:2px 6px; font-size: var(--text-sm); font-family:var(--font-mono); flex-shrink:0; cursor:pointer }
.sl-card .param-row select:focus { border-color:var(--blue); outline:none }
.sl-card .param-row select.dirty { border-color:var(--yellow) }
.sl-card .param-row .param-hint { font-size: var(--text-xs); color:var(--text-muted); line-height:1.35 }
.sl-card .param-row .pbo-optimal { display:inline-block; font-size: var(--text-xs); color:var(--green); background:rgba(100,255,218,0.08); border-radius:3px; padding:0 5px; margin-left:4px; white-space:nowrap }
.sl-card .card-actions { margin-top:8px; display:flex; gap:6px; align-items:center }
.toggle-icon { font-size: var(--text-sm); color:var(--text-muted); margin-left:6px }
.sl-card.expanded .toggle-icon { transform:rotate(180deg) }
.sl-modes { display:flex; flex-wrap:wrap; gap:18px; margin-bottom:14px; padding:14px 16px; background:var(--bg-secondary); border:1px solid var(--border); border-radius:8px }
.sl-mode-group { flex:1 1 220px; min-width:200px }
.sl-group-label { font-size: var(--text-sm); color:var(--text-muted); text-transform:uppercase; letter-spacing:0.05em; margin-bottom:7px; display:flex; align-items:center; gap:5px }
.sl-mode-grid { display:grid; grid-template-columns:repeat(auto-fit, minmax(118px, 1fr)); gap:8px }
.sl-mode-btn { background:var(--bg-primary); border:1px solid var(--border); border-radius:7px; padding:9px 11px; cursor:pointer; transition:all 0.15s }
.sl-mode-btn:hover { border-color:var(--text-link) }
.sl-mode-btn.active { border-color:var(--blue); box-shadow:0 0 0 1px var(--blue); background:rgba(52, 211, 153,0.07) }
.sl-mode-btn.is-disabled { opacity:0.42; cursor:not-allowed; pointer-events:none }
.sl-mode-btn .m-name { font-size: var(--text-base); color:var(--text-primary); display:flex; align-items:center; gap:5px; font-weight:500 }
.sl-mode-btn .m-sub { font-size: var(--text-xs); color:var(--text-muted); margin-top:2px; line-height:1.35 }
.sl-mode-btn .m-tag { display:inline-block; font-size: var(--text-xs); border-radius:3px; padding:0 6px; margin-top:6px; font-weight:600 }
.m-tag.is { background:rgba(255,170,64,0.15); color:var(--yellow) }
.m-tag.oos { background:rgba(100,255,218,0.15); color:var(--green) }
.m-tag.new { background:rgba(52, 211, 153,0.15); color:var(--blue) }
.sl-pin-btn, .sl-pub-btn { font-size: var(--text-sm); padding:2px 10px; flex-shrink:0 }
.sl-pin-btn.pinned { background:var(--green-bg); color:var(--green); border-color:transparent }
.sl-pub-btn.published { background:var(--blue-bg); color:var(--blue); border-color:transparent }
.sl-rbar { display:flex; flex-wrap:wrap; align-items:center; gap:7px 14px; padding:11px 14px; background:var(--bg-secondary); border:1px solid var(--border); border-left:3px solid var(--blue); border-radius:8px; font-size: var(--text-base); margin-bottom:10px }
.sl-rbar .rb-head { font-weight:600; color:var(--text-primary); display:flex; align-items:center; gap:6px }
.sl-rbar .rb-item { color:var(--text-muted); white-space:nowrap }
.sl-rbar .rb-item b { color:var(--text-primary); font-family:var(--font-mono); font-weight:600; margin-left:4px }
.sl-rbar .rb-grade { border-radius:4px; padding:1px 9px; font-weight:600; font-size: var(--text-sm); white-space:nowrap }
.sl-rbar .rb-grade.ok { background:var(--green-bg); color:var(--green) }
.sl-rbar .rb-grade.warn { background:rgba(210,153,34,0.16); color:var(--yellow) }
.sl-rbar .rb-grade.bad { background:rgba(246, 70, 93,0.15); color:var(--red) }
.sl-rbar .rb-time { margin-left:auto; color:var(--text-muted); font-size: var(--text-sm)}
.tbadges { display:flex; flex-wrap:wrap; gap:5px; margin-top:7px }
.tbadge { font-size: var(--text-xs); font-weight:600; border-radius:4px; padding:1px 8px; white-space:nowrap }
.tbadge.ok { background:var(--green-bg); color:var(--green) }
.tbadge.warn { background:rgba(210,153,34,0.16); color:var(--yellow) }
.tbadge.bad { background:rgba(246, 70, 93,0.15); color:var(--red) }
.sl-rdetail { margin-bottom:12px }
.sl-rdetail .data-table { margin-top:0 }
.sl-rnote { font-size: var(--text-xs); color:var(--text-muted); margin-top:8px; line-height:1.5 }
.sl-rec-grid { display:grid; grid-template-columns:repeat(auto-fill, minmax(300px, 1fr)); gap:12px }
.sl-rec-card { background:var(--bg-primary); border:1px solid var(--border); border-radius:8px; padding:11px 13px; display:flex; flex-direction:column }
.sl-rec-card .rec-head { display:flex; align-items:center; justify-content:space-between; margin-bottom:8px }
.sl-rec-card .rec-mode { font-size: var(--text-base); font-weight:600; color:var(--text-primary) }
.sl-rec-card .rec-list { display:flex; flex-direction:column; gap:4px }
.sl-rec-card .rec-row { display:grid; grid-template-columns:minmax(0,1fr) auto; grid-template-areas:"strat ts" "sum ts"; gap:0 8px; align-items:center; padding:5px 8px; border-radius:6px; cursor:pointer; background:var(--bg-secondary); border:1px solid transparent; transition:all 0.12s }
.sl-rec-card .rec-row:hover { border-color:var(--blue); background:rgba(52, 211, 153,0.07) }
.sl-rec-card .rec-strat { grid-area:strat; font-size: var(--text-sm); font-family:var(--font-mono); color:var(--text-link); white-space:nowrap; overflow:hidden; text-overflow:ellipsis }
.sl-rec-card .rec-sum { grid-area:sum; font-size: var(--text-sm); color:var(--text-secondary); white-space:nowrap; overflow:hidden; text-overflow:ellipsis }
.sl-rec-card .rec-ts { grid-area:ts; font-size: var(--text-xs); color:var(--text-muted); white-space:nowrap; text-align:right }
.sl-rec-card .rec-rep { font-size: var(--text-sm)}
.sl-rec-card .rec-empty { font-size: var(--text-sm); color:var(--text-muted); line-height:1.5; padding:6px 2px }
.sl-inline-tag { margin-top:0 }
.sl-grid-wrap { margin-bottom:14px }
.sl-grid-label { font-size: var(--text-sm); color:var(--text-muted); display:block; margin-bottom:4px }
.sl-grid-input { width:520px; max-width:100%; padding:7px; background:var(--bg-primary); border:1px solid var(--border); border-radius:6px; color:var(--text-primary); font-family:var(--font-mono); font-size: var(--text-sm)}
.sl-grid-help { font-size: var(--text-sm); color:var(--text-muted); margin-top:6px; line-height:1.7; max-width:680px }
.sl-code-link { color:var(--text-link) }
.sl-warn { color:var(--yellow) }
.sl-progress-area { margin-bottom:12px }
.sl-progress-head { display:flex; justify-content:space-between; font-size: var(--text-sm); color:var(--text-muted); margin-bottom:2px }
.sl-progress { height:6px; width:100%; display:block; border:0; border-radius:4px; overflow:hidden; background:var(--bg-tertiary) }
.sl-progress::-webkit-progress-bar { background:var(--bg-tertiary); border-radius:4px }
.sl-progress::-webkit-progress-value { background:var(--blue); border-radius:4px; transition:width .3s }
.sl-progress::-moz-progress-bar { background:var(--blue); border-radius:4px }
.sl-log-viewer { margin-bottom:12px; background:var(--bg-code); border:1px solid var(--border); border-radius:6px; max-height:300px; overflow-y:auto; font-family:var(--font-mono); font-size: var(--text-sm); padding:10px }
.sl-log-head { display:flex; justify-content:space-between; align-items:center; margin-bottom:6px }
.sl-log-title { color:var(--text-muted); font-size: var(--text-sm)}
.sl-log-hide { font-size: var(--text-xs)}
.sl-log-content { margin:0; white-space:pre-wrap; word-break:break-all; color:var(--text-code) }
.sl-pbo-cached { margin-bottom:12px; font-size: var(--text-sm); color:var(--text-secondary); display:flex; align-items:center; gap:8px; flex-wrap:wrap }
.sl-sep { color:var(--text-muted) }
.sl-lab-result { margin-bottom:12px }
.sl-panel-gap { margin-bottom:20px }
.sl-panel-note { font-size: var(--text-xs); color:var(--text-muted); line-height:1.35; font-weight:400; flex:0 0 auto; white-space:nowrap }
/* 策略注册表头：左标题+数量，右「点击展开」——移动端保持左右布局 */
.sl-registry-head {
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:10px;
  flex-wrap:nowrap;
}
.sl-registry-title {
  display:flex;
  align-items:center;
  gap:8px;
  min-width:0;
  flex:1 1 auto;
  font-weight:600;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.sl-registry-title .badge { flex:0 0 auto; }
.sl-card-actions { display:flex; align-items:center; gap:8px }
.sl-type-strong { color:var(--text-link) }
.sl-factor-code { color:var(--green); font-size: var(--text-sm)}
.sl-pbo-detail { font-size: var(--text-sm); color:var(--text-secondary); margin-top:4px; line-height:1.5 }
.sl-config-btn { padding:3px 12px; font-size: var(--text-sm)}
.sl-save-ok { color:var(--green); font-size: var(--text-sm)}
.sl-empty-small { color:var(--text-muted) }
.sl-empty-record { padding:18px; color:var(--text-muted) }
.sl-num-pos { color:var(--green) }
.sl-num-neg { color:var(--red) }
.sl-num-warn { color:var(--yellow) }
.sl-num-muted { color:var(--text-muted) }
.sl-row-highlight { background:var(--bg-hover) }
.sl-rank-config { font-size: var(--text-sm)}
.sl-apply-row { margin-top:8px; display:flex; align-items:center; gap:10px; flex-wrap:wrap }
.sl-apply-btn { padding:4px 12px; font-size: var(--text-sm)}
.sl-search-meta { font-size: var(--text-sm); color:var(--text-muted); margin-bottom:6px }
.sl-pbo-line { font-size: var(--text-sm); margin:2px 0 6px }
.sl-pbo-skip { font-size: var(--text-sm); color:var(--text-muted); margin:2px 0 6px }
.sl-rnote-inline { margin-top:0 }

/* Pipeline params */
.pp-last-saved { font-size: var(--text-sm); color:var(--text-muted) }
.pp-msg-panel { margin-bottom:16px; border:1px solid var(--green) }
.pp-msg { color:var(--green) }
.pp-msg-note { margin-top:8px; font-size: var(--text-base); color:var(--text-muted) }
.pp-code-link { color:var(--text-link) }
.pp-stage-panel { margin-bottom:20px }
.pp-collapse-icon { display:inline-block; width:1em; color:var(--text-muted); font-size: var(--text-base)}
.pp-stage-icon { font-size: var(--text-lg)}
.pp-stage-icon.green { color:var(--green) }
.pp-stage-icon.yellow { color:var(--yellow) }
.pp-stage-icon.blue { color:var(--blue) }
.pp-icon-align { vertical-align:-2px }
.pp-stage-actions { display:flex; gap:8px }
.pp-stage-desc { color:var(--text-secondary); margin-bottom:12px; font-size: var(--text-xs)}
.pp-knowledge-wrap { margin-bottom:16px }
.pp-knowledge-toggle { cursor:pointer; display:flex; align-items:center; gap:6px; font-size: var(--text-base); color:var(--text-link); user-select:none }
.pp-knowledge-body { margin-top:8px; padding:12px; background:var(--bg-tertiary); border:1px solid var(--border); border-radius:6px; font-size: var(--text-base); line-height:1.7; color:var(--text-secondary) }
.pp-checkbox-grid { display:flex; flex-wrap:wrap; gap:6px }
.pp-choice-label { display:flex; align-items:center; gap:4px; font-size: var(--text-sm); cursor:pointer; padding:4px 8px; border-radius:4px; border:1px solid var(--border); background:var(--bg-primary); margin:0 }
.pp-choice-input { width:auto; padding:0; accent-color:var(--green) }
.pp-choice-code { font-size: var(--text-xs)}
.pp-fixed-note { font-size: var(--text-xs); color:var(--text-muted); margin-left:8px; line-height:1.4 }
.pp-fixed-code { font-size: var(--text-xs); color:var(--text-secondary) }
.pp-io-footer { font-size: var(--text-sm); padding:8px 12px; background:var(--bg-tertiary); border:1px solid var(--border); border-radius:6px }
.pp-io-line { color:var(--text-muted) }
.pp-io-value { color:var(--text-secondary); margin-left:4px }
.pp-empty-stage { color:var(--text-muted); font-size: var(--text-base)}
.pp-save-status { margin-top:10px; font-size: var(--text-sm); color:var(--green) }
.pp-bottom-actions { text-align:right; padding:16px 0 }
.pp-config-btn { padding:10px 32px; font-size: var(--text-md)}
.ks-block { margin-bottom:10px; }
.ks-block-tight { margin-bottom:0; }
.ks-title-green { color:var(--green); }
.ks-title-yellow { color:var(--yellow); }
.ks-title-muted { color:var(--text-muted); }
.ks-title-link { color:var(--text-link); }
.ks-icon-align { vertical-align:-2px; }
.ks-icon-warn { color:var(--yellow); }
.ks-copy { margin:4px 0 8px; }
.ks-copy-sm { margin:4px 0 8px; font-size: var(--text-base); }
.ks-copy-tight { margin:4px 0 0; }
.ks-note { margin:4px 0 0; font-size: var(--text-xs); line-height:1.4; color:var(--text-muted); }
.ks-table { width:100%; margin-top:4px; border-collapse:collapse; font-size: var(--text-sm); }
.ks-row { border-bottom:1px solid var(--border); }
.ks-th { text-align:left; padding:4px 8px; color:var(--text-muted); }
.ks-td { padding:4px 8px; }
.dc-period-row { margin-bottom:16px; flex-wrap:wrap; gap:8px; }
.dc-period-label { font-size: var(--text-base); color:var(--text-muted); }
.dc-panel-spaced { margin-top:16px; }
.public-empty-state { margin:16px 0; }
.public-empty-title { color:var(--text-primary); font-weight:600; font-size:var(--text-lg); }
.public-empty-detail { max-width:620px; margin:8px auto 0; color:var(--text-secondary); line-height:1.7; }
.public-empty-actions { margin-top:14px; display:flex; justify-content:center; gap:8px; flex-wrap:wrap; }
.dc-muted-small { color:var(--text-muted); }
.dc-total-cell { font-weight:600; }
.text-danger-bright { color:var(--red-bright); }
.q-filter-form { margin-bottom:20px; }
.q-filter-label { font-size: var(--text-base); color:var(--text-secondary); }
.q-check-btn { display:flex; align-items:center; gap:4px; }
.q-panel-spaced { margin-top:16px; }
.q-result-pre { color:var(--text-secondary); font-size: var(--text-base); overflow-x:auto; }
.q-bottom-actions { margin-top:24px; }
.macro-hol-row > td { color:var(--text-muted); background:var(--bg-secondary); }
.macro-hol-row .badge-gray { font-size: var(--text-xs); margin-left:6px; vertical-align:1px; }
.chart-up-text { color:var(--green-bright); }
.chart-down-text { color:var(--red-bright); }
.chart-price-text { color:#F7931A; }
.indicator-snapshot {
  background:var(--bg-card); border:1px solid var(--border); border-radius:6px;
  padding:16px 20px; margin-bottom:20px; display:flex; gap:28px; align-items:center; flex-wrap:wrap;
}
.indicator-current { text-align:center; min-width:130px; }
.indicator-label { font-size: var(--text-sm); color:var(--text-muted); margin-bottom:4px; }
.indicator-value { font-size: var(--text-3xl); font-weight:700; font-family:var(--font-mono); line-height:1; }
.indicator-band-label { font-size: var(--text-base); font-weight:600; margin-top:4px; }
.indicator-ts { font-size: var(--text-sm); color:var(--text-muted); margin-top:2px; }
.indicator-legend { display:flex; gap:6px; font-size: var(--text-xs); flex-wrap:wrap; align-items:center; }
.indicator-legend-label { color:var(--text-muted); margin-right:4px; font-size: var(--text-xs); }
.indicator-band { font-weight:600; }
.indicator-band-green { color:var(--green); }
.indicator-band-yellow { color:var(--yellow); }
.indicator-band-red { color:var(--red); }
.indicator-band-blue { color:var(--blue); }
.indicator-band-muted { color:var(--text-muted); }
.indicator-sep { color:var(--border-light); }
.kline-page-header { margin-bottom:8px; }
/* 标题 + 最新价同卡：左标题、右报价 */
.kline-head-card {
  background:var(--bg-card);
  border:1px solid var(--border);
  border-radius:10px;
  padding:12px 14px;
  margin-bottom:10px;
}
.kline-head-main {
  display:flex;
  align-items:flex-start;
  justify-content:space-between;
  gap:12px;
  min-width:0;
}
.kline-head-titles { min-width:0; flex:1 1 auto; }
.kline-head-card .page-title {
  margin:0;
  font-size:var(--text-lg);
  line-height:1.25;
  font-weight:650;
}
.kline-head-card .page-subtitle {
  margin:3px 0 0;
  font-size:var(--text-xs);
  line-height:1.4;
  color:var(--text-muted);
}
.kline-head-quote {
  display:flex;
  flex-direction:column;
  align-items:flex-end;
  justify-content:center;
  gap:2px;
  flex:0 0 auto;
  text-align:right;
  min-width:0;
}
.kline-info-bar {
  display:flex; flex-direction:column; align-items:flex-start; gap:6px;
  min-height:0; margin-bottom:12px; flex-wrap:wrap;
}
.kline-price-row { display:flex; align-items:baseline; gap:8px; flex-wrap:wrap; }
.kline-close { font-size:var(--text-xl); font-weight:700; font-family:var(--font-mono); line-height:1.1; letter-spacing:-0.02em; }
.kline-change { font-weight:600; font-size:var(--text-sm); font-family:var(--font-mono); line-height:1.2; }
.kline-time { font-size:var(--text-xs); color:var(--text-muted); white-space:nowrap; }
.kline-ohlc-row { display:flex; gap:8px; font-size:var(--text-xs); color:var(--text-secondary); align-items:center; flex-wrap:wrap; }
.kline-ohlc-val { font-size:var(--text-xs); }
.kline-toolbar-group { margin-right:8px; align-items:center; flex-wrap:wrap; }
.kline-toolbar-label { margin-right:4px; font-size:var(--text-sm); color:var(--text-muted); white-space:nowrap; }
.fs-filter-form { margin-bottom:16px; }
.fs-filter-row { display:flex; flex-wrap:wrap; gap:8px; align-items:flex-end; }
.fs-field-label { font-size: var(--text-sm); color:var(--text-muted); margin-bottom:3px; }
.fs-factor-select {
  min-width:300px; height:auto; max-height:200px; overflow-y:auto; padding:4px; font-size: var(--text-base);
  background:var(--bg-card); border:1px solid var(--border); color:var(--text-primary);
  border-radius:4px; font-family:var(--font-mono);
}
.fs-option { padding:2px 6px; }
.fs-limit-input {
  width:80px; background:var(--bg-card); border:1px solid var(--border); color:var(--text-primary);
  padding:6px 8px; border-radius:4px; font-size: var(--text-base); font-family:var(--font-mono);
}
.fs-days-select {
  background:var(--bg-card); border:1px solid var(--border); color:var(--text-primary);
  padding:6px 8px; border-radius:4px; font-size: var(--text-base); font-family:var(--font-mono);
}
.fs-submit { height:auto; align-self:flex-end; }
.fm-update-note { font-weight:400; color:var(--text-muted); }
.fm-update-value { font-size: var(--text-sm); line-height:1.45; }
.fm-update-value strong{font-size: var(--text-base)}
.fm-metric-grid{grid-template-columns:repeat(4,minmax(0,1fr))}
.fm-metric-grid .metric-card{min-height:110px}
.fm-status-card .metric-value{font-size: var(--text-base);line-height:1.45}
.fm-table-scroll{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}
.fm-table-scroll .data-table{width:100%;min-width:720px}
.fm-icon-inline { vertical-align:-2px; }
.fm-icon-up { color:var(--green); }
.fm-icon-down { color:var(--red); }
.fm-seg { display:inline-flex; border:1px solid var(--border); border-radius:6px; overflow:hidden; }
.fm-seg .seg-btn { border:none; background:transparent; padding:5px 16px; font-size: var(--text-sm); color:var(--text-secondary); cursor:pointer; }
.fm-seg .seg-btn.active { background:var(--blue-bg); color:var(--text-link); font-weight:500; }
.fm-num-pos { color:var(--green); }
.fm-num-neg { color:var(--red); }
.fm-num-na { color:var(--text-muted); }
.fm-tabs { display:flex; gap:2px; flex-wrap:wrap; border-bottom:1px solid var(--border); margin:4px 0 16px; }
.fm-tab { border:none; background:transparent; padding:9px 15px; font-size: var(--text-base); color:var(--text-secondary); cursor:pointer; border-bottom:2px solid transparent; margin-bottom:-1px; white-space:nowrap; }
.fm-tab:hover { color:var(--text-primary); }
.fm-tab.active { color:var(--text-link); border-bottom-color:var(--text-link); font-weight:600; }
.fm-tab .cnt { font-size: var(--text-sm); color:var(--text-muted); margin-left:4px; }
.fm-tabpanel { display:none; }
.fm-tabpanel.active { display:block; }
.fm-en { font-size: var(--text-xs); color:var(--text-muted); font-family:var(--font-mono); }
.fm-panel-header-wrap { gap:10px; flex-wrap:wrap; }
.fm-count { margin-left:auto; font-size: var(--text-sm); color:var(--text-muted); }
.fm-pager { display:flex; justify-content:center; align-items:center; gap:12px; padding:10px; }
.fm-pager-indicator { color:var(--text-muted); font-size: var(--text-sm); }
.badge-xxs { font-size: var(--text-xs); }
.table-compact-md { font-size: var(--text-sm); }
.fm-rank-col { width:42px; }
.fm-empty-pad { padding:24px; }
.fm-footnote { padding:8px 14px; font-size: var(--text-xs); color:var(--text-muted); border-top:1px solid var(--border); line-height:1.45; }
.fm-category { border-bottom:1px solid var(--border); }
.fm-category-header { padding:8px 16px; cursor:pointer; display:flex; align-items:center; gap:8px; user-select:none; }
.fm-category-title { font-weight:600; font-size: var(--text-base); }
.fm-label-badge { margin-left:auto; }
.fm-category-body { padding:0 12px 10px; }
.fm-feature-name-col { width:150px; }
.fm-window-col { width:44px; }
.fm-score-col { width:52px; }
.fm-return-col { width:50px; }
.fm-mono-col { width:40px; }
.fm-desc-cell { max-width:180px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.fm-study-details { margin-bottom:16px; }
.fm-study-summary { padding:10px 16px; cursor:pointer; display:flex; align-items:center; gap:8px; user-select:none; background:var(--bg-secondary); border:1px solid var(--border); border-radius:6px; }
.fm-study-summary-title { font-size: var(--text-base); }
.fm-study-body { border:1px solid var(--border); border-top:none; border-radius:0 0 6px 6px; padding:16px; font-size: var(--text-base); line-height:1.7; color:var(--text-muted); }
.fm-study-heading { margin:0 0 8px; color:var(--text-primary); }
.fm-code-block { background:var(--bg-tertiary); padding:10px; border-radius:6px; margin:4px 0 10px; overflow-x:auto; font-family:var(--font-mono); font-size: var(--text-sm); }
.fm-code-block-last { margin-bottom:0; }
.fm-weight-table { font-size: var(--text-base); margin:0 0 12px; }
.fm-nowrap { white-space:nowrap; }
.fm-divider { border:none; border-top:1px solid var(--border); margin:14px 0; }
.fm-ordered-list { margin:4px 0 10px 20px; }
.fm-paragraph-gap { margin-bottom:10px; }
.fm-warning-callout { padding:10px 14px; background:var(--bg-warning); border-radius:6px; color:var(--text-warning); margin-bottom:12px; }
.fm-warning-code { display:block; margin-top:6px; padding:6px 10px; background:var(--bg-tertiary); border-radius:4px; }
.fm-output-note { margin-top:8px; }
@media(max-width:768px){
  .fm-tabs{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;border-bottom:0}
  .fm-tab{border:1px solid var(--border);border-radius:6px;margin:0;padding:8px 6px;text-align:center;white-space:normal;line-height:1.25;background:var(--bg-secondary)}
  .fm-tab.active{border-color:var(--text-link);background:var(--blue-bg)}
  .fm-metric-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .fm-category-header{padding:10px 12px;flex-wrap:wrap}
}
@media(max-width:520px){.fm-tabs,.fm-metric-grid{grid-template-columns:1fr}}
/* 移动端: 行情 hero 整列对齐 (price 占满宽 + 常用视图等宽分段, 去 min-width 防溢出错位) */
@media (max-width:640px){
  .do-hero { flex-direction:column; gap:10px }
  .do-price { flex:1 1 auto; width:100%; min-width:0; padding:14px 15px }
  .do-price-val { font-size: var(--text-2xl) }
  .do-price-foot { gap:8px 10px; font-size: var(--text-sm) }
  /* 常用视图 / 样本数量: 标签独占一行, 按钮三等分满宽 (避免 label+按钮同行乱换行) */
  .do-intervals {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    width: 100%;
    max-width: 100%;
    box-sizing: border-box;
    gap: 8px;
    padding: 10px 12px;
    margin: 0;
    background: var(--bg-secondary);
    border: 1px solid var(--border);
    border-radius: 10px;
    align-items: stretch;
    justify-content: stretch;
    flex: none;
  }
  .do-intervals-lbl {
    grid-column: 1 / -1;
    margin: 0;
    line-height: 1.3;
  }
  .do-intervals .btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    min-width: 0;
    min-height: 40px;
    padding: 8px 6px;
    text-align: center;
    white-space: nowrap;
    box-sizing: border-box;
  }
  .do-grid { grid-template-columns:repeat(2,1fr) }
  .do-map-grid { grid-template-columns:1fr; gap:12px }
  .do-map-card .panel-header { padding:12px 16px }
  .do-map-card > .panel-body { padding-left:16px; padding-right:16px }
  .do-map-desc { margin:0 0 12px; line-height:1.65 }
  .regime-current { flex:0 1 auto; width:100%; min-width:0; padding:14px 15px }
  .regime-label { font-size:var(--text-2xl) }
  .regime-desc { font-size:var(--text-base) }
  .risk-hero{ padding:14px 15px; gap:12px }
  .risk-score{ font-size:var(--text-2xl) }
  .risk-map-row{ grid-template-columns:1fr; gap:8px }
  .risk-axis{
    justify-content:flex-start;
    padding:8px 12px;
    min-height:0;
    border-radius:8px;
  }
  .risk-cells{ grid-template-columns:1fr; gap:8px }
  .risk-cell{ padding:12px 13px 11px }
  .risk-cell-score{ font-size:var(--text-xl) }
  .risk-cell-detail{ white-space:normal; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; }
  .risk-hero-strip{ gap:5px }
  .risk-legend{ gap:6px 10px }
}

/* 平板: 热力格保持双列 */
@media (min-width:641px) and (max-width:900px){
  .risk-cells{ grid-template-columns:repeat(2, minmax(0,1fr)); }
  .risk-map-row{ grid-template-columns:48px minmax(0,1fr); }
}

/* 极窄屏: 按钮文案略收, 避免 "1h K线" 挤爆 */
@media (max-width:360px){
  .do-intervals .btn {
    font-size: var(--text-xs);
    padding: 8px 4px;
    letter-spacing: -0.01em;
  }
}

/* ═══════════════ 研报 (搜索 + 总篇数 + 上下篇) ═══════════════ */
.article-toolbar { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin:14px 0 18px }
.article-toolbar .total { font-size: var(--text-sm); color:var(--text-muted); margin-left:auto }
.article-search { display:flex; gap:6px; align-items:center }
.article-search input { width:210px }
.article-rss { font-size: var(--text-sm); color:var(--text-muted); text-decoration:none }
.article-rss:hover { color:var(--accent) }
.pager { display:flex; align-items:center; justify-content:center; gap:14px; margin:22px 0 8px }
.pager-info { font-size: var(--text-base); color:var(--text-muted); font-family:var(--font-mono) }
.pager-disabled { opacity:0.4; pointer-events:none }
.article-detail { max-width:820px; margin:0 auto }
.article-nav { display:flex; justify-content:space-between; gap:12px; margin-top:24px; border-top:1px solid var(--border); padding-top:16px }
.article-nav a { max-width:46%; font-size: var(--text-base); color:var(--text-secondary); text-decoration:none }
.article-nav a:hover { color:var(--text-link) }
.article-nav .nav-dir { display:block; font-size: var(--text-sm); color:var(--text-muted); margin-bottom:3px }
.article-nav .nav-next { text-align:right; margin-left:auto }
@media (max-width:600px) {
  .site-public .article-nav {
    display:grid;
    grid-template-columns:minmax(0,1fr) minmax(0,1fr);
    align-items:start;
    gap:12px;
  }
  .site-public .article-nav a { width:100%; max-width:none; min-width:0; overflow-wrap:anywhere; }
  .site-public .article-nav .nav-prev { grid-column:1; text-align:left; }
  .site-public .article-nav .nav-next { grid-column:2; margin-left:0; text-align:right; }
  .site-public .article-nav .article-nav-placeholder { min-width:0; }
}


/* shared small trading buttons */
.pt-btn-sm { padding:2px 8px; font-size: var(--text-sm); border-radius:3px; cursor:pointer }

/* ═══════════════ 前台登录 / 账户 ═══════════════ */
.public-auth{display:flex;justify-content:center;padding:40px 16px 72px;min-height:min(70vh,640px);align-items:flex-start}
.auth-card{width:100%;max-width:420px;background:var(--bg-card);border:1px solid var(--border);border-radius:16px;padding:32px 28px;box-shadow:var(--shadow-sm)}
.auth-brand{display:flex;align-items:center;gap:12px;margin-bottom:4px}
.auth-brand-logo{width:40px;height:40px;border-radius:10px;flex-shrink:0;object-fit:cover;box-shadow:0 1px 4px rgba(0,0,0,.12)}
.auth-brand-text{display:flex;flex-direction:column;gap:2px;min-width:0}
.auth-brand-name{font-size: var(--text-sm);font-weight:650;letter-spacing:.04em;color:var(--accent);text-transform:lowercase}
.auth-title{font-size: var(--text-xl);margin:0;font-weight:650;letter-spacing:-.02em}
.auth-sub{margin:8px 0 22px;line-height:1.5}
.auth-form{display:flex;flex-direction:column;gap:10px}
.auth-label{font-size: var(--text-sm);font-weight:500;color:var(--text-secondary);margin-top:6px}
.auth-input{
  width:100%;
  height:auto;
  min-height:42px;
  max-height:none;
  padding:10px 12px;
  border-radius:10px;
  border:1px solid var(--border);
  background:var(--bg-primary);
  color:var(--text-primary);
  font-size:var(--text-base);
  line-height:1.35;
  box-sizing:border-box;
  transition:border-color var(--transition),box-shadow var(--transition);
  /* 防止被 flex 父级纵向拉高（移动端 otp 行曾出现 160px+ 空白输入框） */
  flex:0 0 auto;
  align-self:stretch;
}
.auth-input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-weak,rgba(52,211,153,.15))}
.auth-input[readonly],.auth-input:disabled{opacity:.72;cursor:not-allowed}
.auth-textarea{resize:vertical;min-height:80px;max-height:none;height:auto;font-family:inherit;line-height:1.5;padding:10px 12px}
select.auth-input{appearance:auto;cursor:pointer;min-height:42px}
.btn-block{width:100%;justify-content:center;display:inline-flex;align-items:center;margin-top:6px;min-height:42px}
.auth-google{background:var(--bg-primary);border:1px solid var(--border);color:var(--text-primary);text-decoration:none;padding:11px 14px;border-radius:10px;text-align:center;font-weight:550;display:flex;align-items:center;justify-content:center;gap:8px;transition:border-color var(--transition),color var(--transition),background var(--transition)}
.auth-google:hover{border-color:var(--accent);color:var(--accent);background:var(--accent-weak,rgba(52,211,153,.08))}
.auth-divider{display:flex;align-items:center;gap:12px;margin:18px 0;color:var(--text-muted);font-size: var(--text-sm);text-transform:uppercase;letter-spacing:.06em}
.auth-divider::before,.auth-divider::after{content:"";flex:1;height:1px;background:var(--border)}
.auth-footnote{margin:18px 0 0;font-size: var(--text-xs);line-height:1.5;color:var(--text-muted)}
.site-public .auth-sub{font-size:var(--text-xs);line-height:1.45;color:var(--text-muted)}
.auth-messages{list-style:none;padding:0;margin:0 0 14px}
.auth-msg{padding:9px 12px;border-radius:10px;font-size: var(--text-base);margin-bottom:6px;line-height:1.4}
.auth-msg-success,.auth-msg-info{background:var(--green-bg,rgba(46,189,133,.12));color:var(--green)}
.auth-msg-error{background:var(--red-bg,rgba(246,70,93,.12));color:var(--red)}
.auth-tabs{display:flex;gap:4px;margin:0 0 18px;padding:3px;background:var(--bg-primary);border:1px solid var(--border);border-radius:10px}
.auth-tab{flex:1;padding:8px 10px;border:none;border-radius:8px;background:transparent;color:var(--text-secondary);font-size: var(--text-base);font-weight:500;cursor:pointer;text-align:center;text-decoration:none;transition:background var(--transition),color var(--transition)}
.auth-tab:hover{color:var(--text-primary)}
.auth-tab.active{background:var(--bg-card);color:var(--text-primary);box-shadow:0 1px 3px rgba(0,0,0,.12)}
.auth-mono{font-family:var(--font-mono,ui-monospace,monospace);font-size: var(--text-base);word-break:break-all;padding:10px 12px;background:var(--bg-primary);border:1px dashed var(--border);border-radius:8px;user-select:all}
.break-all{word-break:break-all}

/* 账户布局 */
.public-account{max-width:1100px;margin:0 auto;padding-bottom:48px}
.account-layout{display:grid;grid-template-columns:240px 1fr;gap:20px;align-items:start}
.account-nav{position:sticky;top:72px;padding:16px;display:flex;flex-direction:column;gap:14px}
.account-nav-user{display:flex;align-items:center;gap:12px;padding-bottom:12px;border-bottom:1px solid var(--border)}
.account-avatar{width:48px;height:48px;border-radius:50%;background:var(--accent-weak,rgba(52,211,153,.15));color:var(--accent);display:flex;align-items:center;justify-content:center;overflow:hidden;flex-shrink:0;border:1px solid var(--border)}
.account-avatar img{width:100%;height:100%;object-fit:cover}
.account-nav-name{font-weight:600;font-size: var(--text-md);line-height:1.3}
.account-nav-email{font-size: var(--text-sm);margin-top:2px;max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.account-nav-links{display:flex;flex-direction:column;gap:2px}
.account-nav-links a{display:block;padding:9px 12px;border-radius:8px;color:var(--text-secondary);text-decoration:none;font-size: var(--text-base);font-weight:500;transition:background var(--transition),color var(--transition)}
.account-nav-links a:hover{background:var(--bg-hover);color:var(--text-primary)}
.account-nav-links a.active{background:var(--accent-weak,rgba(52,211,153,.12));color:var(--accent)}
.account-nav-logout{margin-top:4px;padding-top:10px;border-top:1px solid var(--border)}
.account-main{min-width:0}
.account-stack{display:flex;flex-direction:column;gap:16px}
.account-form .btn{margin-top:8px;align-self:flex-start}
.account-actions-row{display:flex;gap:8px;flex-wrap:wrap;margin-top:4px}
.account-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:14px}
.account-card{display:block;padding:18px 16px;background:var(--bg-card);border:1px solid var(--border);border-radius:12px;text-decoration:none;color:inherit;transition:border-color var(--transition),box-shadow var(--transition),transform .15s ease}
.account-card:hover{border-color:var(--accent);box-shadow:0 4px 16px rgba(0,0,0,.08);transform:translateY(-1px)}
.account-card h3{margin:0 0 6px;font-size: var(--text-md);font-weight:600;display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.account-card .text-meta{margin:0;font-size: var(--text-xs);line-height:1.4}
.account-card-pro{background:linear-gradient(145deg,var(--bg-card) 60%,var(--accent-weak,rgba(52,211,153,.08)))}
.account-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.account-bindings{display:flex;flex-direction:column;gap:0}
.account-bind-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 0;border-bottom:1px solid var(--border)}
.account-bind-row:last-child{border-bottom:none;padding-bottom:0}
.account-bind-row:first-child{padding-top:0}
.account-logout{margin-top:8px}
.bookmark-list{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:10px}
.bookmark-item{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px}
.bookmark-link{display:flex;flex-direction:column;gap:8px;text-decoration:none;color:inherit;min-width:0;flex:1}
.bookmark-meta-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.bookmark-cat{font-size: var(--text-sm);font-weight:600;letter-spacing:.02em;padding:2px 8px;border-radius:6px;line-height:1.4}
.bookmark-time{font-size: var(--text-sm)}
.bookmark-title{font-size: var(--text-md);font-weight:600;line-height:1.4;color:var(--text-primary)}
.bookmark-link:hover .bookmark-title{color:var(--accent)}
.bookmark-unstar{flex-shrink:0;margin:0}
.bookmark-unstar-btn{display:inline-flex;align-items:center;gap:5px;color:var(--text-secondary)}
.bookmark-unstar-btn .ico{color:var(--accent)}
.bookmark-unstar-btn:hover{color:var(--accent)}
.article-bookmark-btn.is-on{color:var(--accent);border-color:color-mix(in srgb,var(--accent) 40%,var(--border));background:var(--accent-weak,rgba(52,211,153,.1))}
.article-bookmark-form{display:inline-flex;margin:0}
.site-public .article-share--with-bookmark{gap:8px 10px}
.site-public .article-share-sep{width:1px;height:18px;background:var(--border);flex:none;margin:0 2px}
.article-header-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:10px}

/* 2026-07 mobile density pass: shared admin rhythm + page-specific semantic layouts */
@media (max-width:768px) {
  body.admin .admin-container { padding-top:12px; }
  body.admin .page-head {
    display:grid;
    grid-template-columns:22px minmax(0,1fr);
    gap:8px 10px;
    margin-bottom:12px;
    padding-bottom:12px;
  }
  body.admin .page-head .ph-ico {
    width:22px;
    height:22px;
    margin-top:1px;
  }
  body.admin .page-head .ph-actions {
    grid-column:1 / -1;
    display:grid;
    grid-template-columns:repeat(auto-fit,minmax(120px,1fr));
    width:100%;
    gap:6px;
  }
  body.admin .page-head .ph-actions .btn {
    justify-content:center;
    min-height:34px;
  }
  body.admin .page-head .ph-desc {
    margin-top:3px;
    font-size:var(--text-xs);
    line-height:1.4;
  }
  body.admin .info-box {
    gap:8px;
    padding:8px 10px;
    margin-bottom:12px;
    font-size:var(--text-xs);
    line-height:1.45;
  }
  body.admin .info-box .ib-ico {
    width:14px;
    height:14px;
  }
  body.admin .section-label {
    flex-wrap:wrap;
    gap:2px 6px;
    margin-bottom:7px;
    font-size:var(--text-xs);
    line-height:1.35;
  }
  body.admin .section-label .sl-hint {
    flex-basis:100%;
    font-size:var(--text-xs);
  }
  body.admin .metric-grid {
    grid-template-columns:repeat(2,minmax(0,1fr));
    gap:7px;
    margin-bottom:16px;
  }
  body.admin .metric-card {
    min-height:0;
    padding:9px 10px;
  }
  body.admin .metric-card .metric-label {
    margin-bottom:3px;
    font-size:var(--text-xs);
    letter-spacing:.025em;
  }
  body.admin .metric-card .metric-value {
    font-size:var(--text-lg);
    line-height:1.18;
  }
  body.admin .metric-card .metric-change {
    margin-top:3px;
    font-size:var(--text-xs);
    line-height:1.3;
  }

  /* 特征仓库：手机保持双列 KPI，取消旧规则造成的四张超高单列卡。 */
  body.admin .fm-metric-grid {
    grid-template-columns:repeat(2,minmax(0,1fr));
  }
  body.admin .fm-metric-grid .metric-card { min-height:82px; }
  body.admin .fm-metric-grid .fm-status-card .metric-value { font-size:var(--text-xl); }
  body.admin .fm-update-value,
  body.admin .fm-update-value strong { font-size:var(--text-xs); }
  body.admin .fm-update-value > div { white-space:nowrap; letter-spacing:-.02em; }
  body.admin .fm-metric-grid .metric-card:last-child .metric-change { display:none; }
  body.admin .fm-update-note { display:none; }

  /* 数据库地图：两列紧凑卡；说明独占一行，避免标题被挤成单字换行。 */
  body.admin .dw-map-label { align-items:flex-start; }
  body.admin .dw-map-sub {
    display:block;
    flex-basis:100%;
    font-size:var(--text-xs);
    line-height:1.4;
  }
  body.admin .dw-map-section { margin-bottom:14px; }
  body.admin .dw-map-header { margin-bottom:6px; line-height:1.4; }
  body.admin .dw-map-meta { font-size:var(--text-xs); }
  body.admin .dw-map-grid {
    grid-template-columns:repeat(2,minmax(0,1fr));
    gap:7px;
  }
  body.admin .dbmap-card { padding:8px 9px; }
  body.admin .dw-map-card-name { font-size:var(--text-sm); }
  body.admin .dw-map-card-tables {
    margin-top:3px;
    font-size:var(--text-xs);
    line-height:1.4;
  }
  body.admin .dw-map-card-hint {
    margin-top:3px;
    font-size: var(--text-xs);
    line-height:1.35;
  }

  /* 数据生产：长说明默认折叠，保留完整安全口径但不占首屏。 */
  body.admin .pipeline-title-sub { display:block; margin-top:2px; font-size: var(--text-xs); }
  body.admin .pipeline-guidance summary {
    padding:8px 10px;
    font-size:var(--text-sm);
  }
  body.admin .pipeline-guidance summary span { display:none; }
  body.admin .pipeline-guidance-body {
    padding:8px 10px 10px;
    font-size:var(--text-xs);
    line-height:1.55;
  }

  /* 研报管理：宽表在移动端改为语义卡片，不再把标题和操作挤成竖列。 */
  body.admin #article-table {
    display:block;
    width:100%;
    overflow:visible;
    white-space:normal;
  }
  body.admin #article-table thead { display:none; }
  body.admin #article-table tbody {
    display:grid;
    gap:8px;
  }
  body.admin #article-table tr {
    display:grid;
    grid-template-columns:repeat(2,minmax(0,1fr));
    gap:7px 12px;
    padding:10px 11px;
    border:1px solid var(--border);
    border-radius:8px;
    background:var(--bg-card);
  }
  body.admin #article-table td {
    display:flex;
    align-items:center;
    justify-content:flex-start;
    gap:7px;
    min-width:0;
    padding:0;
    border:0;
    white-space:normal;
  }
  body.admin #article-table td::before {
    content:attr(data-label);
    flex:none;
    min-width:3.5em;
    color:var(--text-muted);
    font-size:var(--text-xs);
  }
  body.admin #article-table .article-title-cell,
  body.admin #article-table .act-cell {
    grid-column:1 / -1;
  }
  body.admin #article-table .article-title-cell {
    align-items:flex-start;
    padding-bottom:8px;
    border-bottom:1px solid var(--border-light);
  }
  body.admin #article-table .article-title-cell .article-link {
    min-width:0;
    color:var(--text-primary);
    font-size:var(--text-sm);
    font-weight:600;
    line-height:1.4;
    overflow-wrap:anywhere;
  }
  body.admin #article-table .act-cell {
    display:grid;
    grid-template-columns:repeat(5,minmax(0,1fr));
    gap:5px;
    padding-top:2px;
  }
  body.admin #article-table .act-cell::before { display:none; }
  body.admin #article-table .abtn {
    display:inline-flex;
    align-items:center;
    justify-content:center;
    min-width:0;
    min-height:30px;
    padding:4px 3px;
    font-size:var(--text-xs);
  }

  /* 开发运维：先导航后状态，再动作/服务/数据/日志；控件在手机上等宽收紧。 */
  body.admin .devops-section-nav {
    margin:0 0 14px;
    padding:6px;
  }
  body.admin .devops-section-nav span { display:none; }
  body.admin .devops-section-nav a {
    padding:5px 8px;
    font-size:var(--text-xs);
  }
  body.admin .devops-action-row .btn { flex:1 1 135px; justify-content:center; }
  body.admin .devops-separator { display:none; }
  body.admin .devops-node-line { align-items:flex-start; }
  body.admin .devops-node-text { margin-left:0; }
  body.admin .devops-task-grid { gap:12px; }
  body.admin .devops-task-section + .devops-task-section { padding-top:12px; }
  body.admin .devops-backfill-controls { grid-template-columns:1fr; }
  body.admin .devops-backfill-controls .btn { width:100%; justify-content:center; }
  body.admin .devops-scroll-sm { max-height:220px; }
  body.admin .devops-activity-item { padding:8px 0; }
  body.admin .devops-health-summary { align-items:flex-start; flex-direction:column; gap:5px; }
  body.admin .devops-health-age { white-space:normal; }
  body.admin .devops-health-badges { gap:5px; }
  body.admin .devops-maker-grid { grid-template-columns:1fr; }
  body.admin .devops-fallback-controls { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); }
  body.admin .devops-fallback-controls .btn { min-width:0; padding-inline:5px; }
  body.admin .devops-fallback-msg { grid-column:1 / -1; }
  body.admin .devops-field-section .data-table { display:block; overflow-x:auto; }
  body.admin .devops-body-note { padding:9px 10px; font-size:var(--text-xs); line-height:1.55; }
  body.admin .devops-header-tools {
    width:100%;
    flex-wrap:wrap;
  }
  body.admin .devops-log-select { flex:1 1 180px; min-width:0; }
  body.admin .devops-live-log { max-height:260px; padding:10px; }

  /* 首页模拟交易摘要：五列、两行。第一列标题/状态，后四列指标名/数值。 */
  .site-public .paper-strip {
    grid-template-columns:minmax(62px,.8fr) repeat(4,minmax(0,1fr));
    gap:4px 6px;
    padding:7px 9px;
    align-items:start;
  }
  .site-public .paper-heading {
    grid-column:1;
    display:flex;
    flex-direction:column;
    align-items:flex-start;
    justify-content:flex-start;
    gap:3px;
  }
  .site-public .paper-title { align-self:auto; }
  .site-public .paper-heading > .badge { align-self:auto; }
  .site-public .paper-start,
  .site-public .paper-meta { display:none; }
  .site-public .paper-stat {
    min-width:0;
    font-size: var(--text-xs);
    line-height:1.25;
  }
  .site-public .paper-stat b {
    display:block;
    margin:2px 0 0;
    font-size:var(--text-xs);
    white-space:nowrap;
  }
}

@media (max-width:380px) {
  body.admin #article-table .act-cell { grid-template-columns:repeat(3,minmax(0,1fr)); }
  body.admin .dw-map-grid { grid-template-columns:1fr; }
  .site-public .paper-strip {
    grid-template-columns:minmax(50px,.72fr) repeat(4,minmax(0,1fr));
    gap:3px;
    padding:6px;
  }
  .site-public .paper-title,
  .site-public .paper-stat b { font-size: var(--text-xs); }
  .site-public .paper-stat { font-size: var(--text-xs); }
  .site-public .paper-heading > .badge { font-size: var(--text-xs); padding-inline:4px; }
}

/* Pro 内容 */
.public-pro{max-width:1000px;margin:0 auto;padding-bottom:48px}
.pro-disclaimer{margin-bottom:16px;font-size:var(--text-xs);color:var(--text-muted);line-height:1.5}
.pro-placeholder{display:flex;flex-direction:column;align-items:center;text-align:center;padding:48px 24px;min-height:220px;justify-content:center}
.pro-placeholder-icon{width:64px;height:64px;border-radius:16px;display:flex;align-items:center;justify-content:center;background:var(--accent-weak,rgba(52,211,153,.12));color:var(--accent);margin-bottom:14px}
.pro-placeholder-title{margin:0 0 8px;font-size: var(--text-xl);font-weight:650}
.pro-placeholder-desc{margin:0;max-width:420px;line-height:1.5;font-size:var(--text-xs);color:var(--text-muted)}
.signal-strategy-chips{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 4px}
.signal-chip{display:inline-flex;padding:4px 10px;border-radius:999px;border:1px solid var(--border);background:var(--bg-card);font-size: var(--text-sm);color:var(--text-secondary)}
.signal-table .signal-ts{white-space:nowrap;font-size: var(--text-base)}
.signal-action,.signal-side{display:inline-flex;align-items:center;padding:2px 8px;border-radius:6px;font-size: var(--text-sm);font-weight:550;line-height:1.4}
.signal-action-open,.signal-action-add{background:var(--green-bg,rgba(46,189,133,.12));color:var(--green)}
.signal-action-reduce,.signal-action-close{background:var(--yellow-bg,rgba(240,180,41,.14));color:var(--yellow,#d4a017)}
.signal-action-hold{background:var(--bg-primary);color:var(--text-secondary);border:1px solid var(--border)}
.signal-side-long{background:var(--green-bg,rgba(46,189,133,.12));color:var(--green)}
.signal-side-short{background:var(--red-bg,rgba(246,70,93,.12));color:var(--red)}
.signal-side-flat{background:var(--bg-primary);color:var(--text-muted);border:1px solid var(--border)}
.pro-signal-empty{display:flex;align-items:center;justify-content:center;min-height:120px;padding:24px;text-align:center;color:var(--text-muted)}
.pro-signal-empty p{margin:0}
.mt-16{margin-top:16px}

/* 移动侧栏账户区 */
.sidebar-account{margin-top:auto;padding:12px 10px 16px;border-top:1px solid var(--border)}
.sidebar-account-card{display:flex;align-items:center;gap:10px;padding:10px 10px;border-radius:10px;text-decoration:none;color:inherit;border:1px solid var(--border);background:var(--bg-card);transition:border-color var(--transition),background var(--transition)}
.sidebar-account-card:hover{border-color:var(--accent);background:var(--accent-weak,rgba(52,211,153,.08))}
.sidebar-account-card.is-auth{border-color:color-mix(in srgb,var(--accent) 35%,var(--border))}
.sidebar-account-avatar{width:36px;height:36px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:var(--accent-weak,rgba(52,211,153,.15));color:var(--accent);flex-shrink:0}
.sidebar-account-avatar .nav-ico{width:18px;height:18px}
.sidebar-account-meta{display:flex;flex-direction:column;gap:2px;min-width:0}
.sidebar-account-name{font-size: var(--text-base);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:160px}
.sidebar-account-sub{font-size: var(--text-sm);color:var(--text-muted)}
.sidebar-account-links{display:flex;flex-direction:column;margin-top:6px}
.sidebar-logout-form{margin:4px 0 0}
.sidebar-logout-btn{width:100%;border:none;background:transparent;cursor:pointer;text-align:left;color:var(--text-secondary);font:inherit}
.sidebar-logout-btn:hover{color:var(--red)}

/* 顶栏账户 icon（与语言/主题同规格） */
.topbar-account{position:relative;display:flex}
.topbar-account-btn{color:var(--text-secondary)}
.topbar-account-btn:hover{color:var(--text-primary)}
.topbar-account-btn.is-auth{color:var(--accent);border-color:color-mix(in srgb,var(--accent) 35%,var(--border))}
.topbar-account-btn.is-auth:hover{background:var(--accent-weak,rgba(52,211,153,.12));color:var(--accent)}
.account-menu{position:absolute;z-index:1300;top:calc(100% + 8px);right:0;width:min(240px,calc(100vw - 24px));padding:6px;background:var(--bg-card);border:1px solid var(--border);border-radius:12px;box-shadow:var(--shadow-lg,0 16px 40px rgba(0,0,0,.22))}
.account-menu[hidden]{display:none!important}
.account-menu-head{display:flex;flex-direction:column;gap:2px;padding:8px 10px 9px;border-bottom:1px solid var(--border);margin-bottom:4px;min-width:0}
.account-menu-head strong{font-size:var(--text-base);color:var(--text-primary);font-weight:650;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
.account-menu-head span{font-size:var(--text-sm);line-height:1.35;color:var(--text-muted)}
.account-menu-item{display:flex;width:100%;align-items:center;min-height:36px;padding:7px 10px;border:0;border-radius:8px;background:transparent;color:var(--text-secondary);font:inherit;font-size:var(--text-base);line-height:1.3;text-align:left;text-decoration:none;cursor:pointer;box-sizing:border-box}
.account-menu-item:hover,.account-menu-item:focus-visible{outline:none;background:var(--bg-hover);color:var(--text-primary)}
.account-menu-primary{color:var(--accent);font-weight:600}
.account-menu-logout{margin:4px 0 0;padding-top:4px;border-top:1px solid var(--border)}
.account-menu-danger:hover,.account-menu-danger:focus-visible{color:var(--red);background:var(--red-bg,rgba(246,70,93,.1))}

@media(max-width:800px){
  .public-account{padding:0 0 28px;max-width:100%}
  .public-account .page-header{margin-bottom:10px}
  .public-account .page-title{font-size:var(--text-lg);line-height:1.25}
  .public-account .page-subtitle{font-size:var(--text-sm);margin-top:2px}
  .account-layout{grid-template-columns:1fr;gap:12px}
  .account-nav{position:static;padding:12px;gap:10px;border-radius:12px}
  .account-nav-user{gap:10px;padding-bottom:0;border-bottom:none}
  .account-avatar{width:36px;height:36px}
  .account-avatar .ico,.account-avatar svg{width:20px;height:20px}
  .account-nav-name{font-size:var(--text-base)}
  .account-nav-email{max-width:min(200px,55vw);font-size:var(--text-sm)}
  .account-nav-links{
    flex-direction:row;flex-wrap:nowrap;gap:6px;
    overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;
    margin:0 -2px;padding:2px;
  }
  .account-nav-links::-webkit-scrollbar{display:none}
  .account-nav-links a{
    flex:0 0 auto;padding:6px 11px;font-size:var(--text-sm);min-height:32px;
    line-height:1.2;white-space:nowrap;border:1px solid var(--border);background:var(--bg-primary)
  }
  .account-nav-links a.active{border-color:color-mix(in srgb,var(--accent) 45%,var(--border))}
  .account-nav-logout{margin-top:2px;padding-top:8px}
  .account-nav-logout .btn{min-height:36px;font-size:var(--text-sm)}
  .account-main{min-width:0}
  .account-stack{gap:12px}
  .account-cards{grid-template-columns:1fr 1fr;gap:10px}
  .account-card{padding:12px 12px;border-radius:10px}
  .account-card h3{font-size:var(--text-base);margin:0 0 4px}
  .account-card .text-meta{font-size:var(--text-xs);line-height:1.35}
  .account-grid{grid-template-columns:1fr}
  .account-form .auth-label{margin-top:6px;font-size:var(--text-sm)}
  .account-form .auth-input{
    font-size:16px; /* iOS 避免聚焦自动放大 */
    min-height:40px;
    max-height:48px;
    height:40px;
    padding:8px 11px;
    line-height:1.3;
    flex:0 0 auto;
  }
  .account-form .auth-textarea{
    font-size:var(--text-base);
    min-height:72px;
    max-height:none;
    height:auto;
    padding:8px 11px;
  }
  .account-form .btn{width:100%;min-height:40px;margin-top:10px}
  .account-otp-row{
    flex-direction:column;
    align-items:stretch;
    gap:6px;
  }
  .account-otp-row .auth-input{
    flex:0 0 auto !important;
    width:100%;
    min-width:0;
    min-height:40px !important;
    max-height:48px !important;
    height:40px !important;
  }
  .account-otp-row .btn{width:100%;align-self:stretch;min-height:36px}
  .account-bind-row{flex-wrap:wrap;padding:12px 0;gap:8px}
  .bookmark-item{padding:12px;flex-wrap:wrap}
  .bookmark-title{font-size:var(--text-base)}
  .public-auth{padding:16px 12px 40px;min-height:0}
  .auth-card{
    padding:18px 14px;
    border-radius:12px;
    max-width:100%;
  }
  .auth-brand{gap:10px;margin-bottom:2px}
  .auth-brand-logo{width:32px;height:32px;border-radius:8px}
  .auth-title{font-size:var(--text-lg)}
  .auth-sub{margin:6px 0 14px;font-size:var(--text-sm)}
  .auth-form{gap:8px}
  .auth-label{margin-top:4px;font-size:var(--text-sm)}
  .auth-input{
    font-size:16px; /* iOS 避免聚焦自动放大 (功能性豁免, 勿改变量) */
    min-height:40px;
    max-height:48px;
    height:40px;
    padding:8px 11px;
    border-radius:8px;
    flex:0 0 auto;
  }
  .auth-tabs{margin:0 0 12px;padding:2px}
  .auth-tab{padding:7px 8px;font-size:var(--text-sm)}
  .auth-divider{margin:12px 0}
  .auth-google{padding:9px 12px;border-radius:8px;font-size:var(--text-sm)}
  .auth-footnote{margin:12px 0 0;font-size:var(--text-xs)}
  .btn-block{min-height:40px;margin-top:4px}
  /* 顶栏账户弹出：移动端更紧凑 */
  .account-menu{
    position:absolute;top:calc(100% + 4px);right:0;
    width:min(176px,calc(100vw - 16px));
    max-width:calc(100vw - 12px);
    padding:3px;border-radius:9px;
  }
  .account-menu-head{padding:5px 7px 6px;margin-bottom:1px;gap:0}
  .account-menu-head strong{font-size:var(--text-xs);font-weight:650}
  .account-menu-head span{font-size:var(--text-xs);line-height:1.25}
  .account-menu-item{
    min-height:30px;padding:5px 7px;font-size:var(--text-xs);border-radius:6px
  }
  .account-menu-logout{margin:1px 0 0;padding-top:1px}
}
@media(max-width:420px){
  .account-cards{grid-template-columns:1fr}
  .account-menu{width:min(168px,calc(100vw - 12px))}
  .account-menu-item{min-height:28px;padding:4px 6px}
}

/* ═══════════════ hy生产引擎 V3 操作台 ═══════════════ */
.hyv3-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:12px}
.hyv3-statebar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:12px}
.hyv3-statebar .pt-mut{margin-left:auto;font-size: var(--text-xs)}
.hyv3-tabs{margin-bottom:12px}
.hyv3-pane[hidden]{display:none!important}
.hyv3-empty{padding:14px;color:var(--text-secondary);background:var(--bg-primary);border-radius:6px}
.hyv3-actions{display:flex;gap:5px;flex-wrap:wrap}
.hyv3-pane .mono{font-family:var(--font-mono);font-size: var(--text-xs)}
.watchdog-page{max-width:1100px;margin:0 auto}
.watchdog-subtitle{color:var(--text-secondary);margin:0}
.watchdog-alert{border-radius:6px;padding:12px;margin:12px 0}
.watchdog-alert-danger{background:var(--red-bg, #fff0f0);border:1px solid var(--red)}
.watchdog-alert-danger strong{color:var(--red)}
.watchdog-alert-warning{background:var(--yellow-bg, #fff8e0);border:1px solid var(--yellow)}
.watchdog-alert-warning strong{color:var(--yellow)}
.watchdog-alert-info{background:var(--blue-bg, #e8f4fd);border:1px solid var(--blue)}
.watchdog-alert-item{margin-left:12px}
.watchdog-storm-label{color:var(--red);margin-left:8px}
.watchdog-section-title{margin-top:24px}
.watchdog-position-note{font-size: var(--text-xs);color:var(--text-secondary);margin-left:6px}
.watchdog-order-row{font-size: var(--text-sm)}
.watchdog-db-note{color:var(--text-secondary);font-size: var(--text-xs);margin-top:16px;line-height:1.45}
.hyv3-wd-empty{margin:8px 0}
.hyv3-wd-position-note{color:var(--text-secondary)}
@media(max-width:720px){
  .hyv3-head{align-items:stretch;flex-direction:column}
  .hyv3-statebar .pt-mut{width:100%;margin-left:0}
}

/* TOTP setup QR + step-up OTP */
.totp-setup{display:flex;flex-direction:column;gap:14px;align-items:flex-start}
.totp-qr-wrap{background:#fff;padding:14px;border-radius:12px;border:1px solid var(--border);box-shadow:0 2px 8px rgba(0,0,0,.08);line-height:0}
.totp-qr-img{width:180px;height:180px;display:block;image-rendering:pixelated}
.totp-manual{width:100%;max-width:420px;font-size: var(--text-base);color:var(--text-secondary)}
.totp-manual summary{cursor:pointer;user-select:none;padding:4px 0}
.totp-manual[open] summary{margin-bottom:8px}
.totp-secret{margin:8px 0;user-select:all}
.totp-actions{display:flex;flex-wrap:wrap;align-items:center;gap:12px;margin-top:12px}
.totp-actions .btn{margin-top:0}
.totp-confirm-form{width:100%;max-width:420px}
/* otp 行：横向伸展宽度，禁止把 160px 写进 flex-basis 主轴（纵排时会变成 160px 高度） */
.account-otp-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.account-otp-row .auth-input{
  flex:1 1 auto;
  min-width:min(160px,100%);
  width:auto;
  height:auto;
  min-height:42px;
  max-height:52px;
  align-self:center;
}
.account-otp-row .btn{flex:0 0 auto;align-self:center;white-space:nowrap}

/* ─── 后台 UI 提速: Drawer / 骨架 / 状态点 / ⌘K / context rail (2026-08-04) ─── */
.hy-drawer-overlay {
  position: fixed; inset: 0; background: rgba(0,0,0,0.45); backdrop-filter: blur(2px);
  z-index: 9997; display: none; justify-content: flex-end; align-items: stretch;
}
.hy-drawer-overlay.open { display: flex; }
.hy-drawer {
  width: min(480px, 100vw); max-width: 100vw; height: 100%;
  background: var(--bg-card); border-left: 1px solid var(--border);
  box-shadow: -12px 0 40px rgba(0,0,0,0.35); display: flex; flex-direction: column;
  animation: hyDrawerIn 0.16s ease;
}
.hy-drawer--lg { width: min(640px, 100vw); }
@keyframes hyDrawerIn { from { transform: translateX(12px); opacity: 0.6; } to { transform: none; opacity: 1; } }
.hy-drawer-head {
  display: flex; align-items: center; gap: 8px; padding: 14px 18px;
  border-bottom: 1px solid var(--border); font-size: var(--text-md); font-weight: 600; color: var(--text-primary);
  flex-shrink: 0;
}
.hy-drawer-x {
  margin-left: auto; cursor: pointer; color: var(--text-muted); font-size: var(--text-xl);
  line-height: 1; background: none; border: none; padding: 0 2px;
}
.hy-drawer-x:hover { color: var(--text-primary); }
.hy-drawer-body {
  flex: 1; overflow: auto; padding: 16px 18px; font-size: var(--text-base);
  color: var(--text-secondary); line-height: 1.6;
}
.hy-drawer-foot {
  display: flex; justify-content: flex-end; gap: 8px; padding: 12px 18px;
  border-top: 1px solid var(--border); flex-shrink: 0;
}

/* 骨架屏 */
.sk-block, .sk-row, .sk-kpi {
  background: linear-gradient(90deg, var(--bg-tertiary) 25%, var(--bg-hover) 50%, var(--bg-tertiary) 75%);
  background-size: 200% 100%; animation: skeleton-shimmer 1.4s ease-in-out infinite;
  border-radius: var(--radius);
}
.sk-block { height: 72px; margin-bottom: 10px; }
.sk-row { height: 14px; margin-bottom: 8px; width: 100%; }
.sk-row.w60 { width: 60%; }
.sk-row.w40 { width: 40%; }
.sk-kpi { height: 88px; }

/* 侧栏状态点 */
.nav-state-dot {
  width: 8px; height: 8px; border-radius: 50%; background: var(--text-muted);
  flex: none; margin-left: auto;
}
.nav-state-dot.dot-ok { background: var(--green); }
.nav-state-dot.dot-warn { background: var(--yellow); }
.nav-state-dot.dot-bad { background: var(--red); }
.nav-item.sub { display: flex; align-items: center; gap: 8px; }
.nav-version-badge { margin-left: 0; }

/* ⌘K 命令面板 */
.hy-cmdk-overlay {
  position: fixed; inset: 0; background: rgba(0,0,0,0.5); z-index: 10000;
  display: none; align-items: flex-start; justify-content: center; padding: 12vh 16px 16px;
}
.hy-cmdk-overlay.open { display: flex; }
.hy-cmdk {
  width: min(560px, 100%); background: var(--bg-card); border: 1px solid var(--border);
  border-radius: 12px; box-shadow: 0 20px 48px rgba(0,0,0,0.45); overflow: hidden;
}
.hy-cmdk-input {
  width: 100%; border: none; border-bottom: 1px solid var(--border); background: transparent;
  color: var(--text-primary); font-size: var(--text-md); padding: 14px 16px; outline: none;
  font-family: var(--font-sans);
}
.hy-cmdk-list { max-height: 360px; overflow: auto; padding: 6px; }
.hy-cmdk-item {
  display: flex; align-items: center; gap: 10px; padding: 10px 12px; border-radius: var(--radius);
  color: var(--text-secondary); cursor: pointer; font-size: var(--text-base); border: none;
  background: transparent; width: 100%; text-align: left;
}
.hy-cmdk-item:hover, .hy-cmdk-item.active { background: var(--bg-hover); color: var(--text-primary); }
.hy-cmdk-item .hy-cmdk-path { margin-left: auto; color: var(--text-muted); font-size: var(--text-sm); font-family: var(--font-mono); }
.hy-cmdk-empty { padding: 18px; color: var(--text-muted); font-size: var(--text-sm); text-align: center; }
.hy-cmdk-hint { padding: 8px 14px; border-top: 1px solid var(--border); color: var(--text-muted); font-size: var(--text-sm); }

/* 侧栏快速搜索入口 */
.nav-search-btn {
  display: flex; align-items: center; gap: 8px; width: calc(100% - 16px); margin: 8px 8px 4px;
  padding: 8px 10px; border: 1px solid var(--border); border-radius: var(--radius);
  background: var(--bg-secondary); color: var(--text-muted); font-size: var(--text-sm);
  cursor: pointer; text-align: left;
}
.nav-search-btn:hover { border-color: var(--accent); color: var(--text-secondary); }
.nav-search-btn kbd {
  margin-left: auto; font-family: var(--font-mono); font-size: var(--text-xs);
  border: 1px solid var(--border); border-radius: 4px; padding: 1px 5px; color: var(--text-muted);
}

/* L2-B context rail */
.page-with-rail {
  display: grid; grid-template-columns: minmax(0, 1fr) minmax(240px, 300px); gap: 16px; align-items: start;
}
.page-rail {
  position: sticky; top: calc(var(--topbar-height) + 12px);
  background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; padding: 14px;
}
.page-rail-title {
  font-size: var(--text-sm); color: var(--text-muted); text-transform: uppercase;
  letter-spacing: 0.04em; margin-bottom: 10px; font-weight: 600;
}
@media (max-width: 960px) {
  .page-with-rail { grid-template-columns: 1fr; }
  .page-rail { position: static; }
}

/* 总览枢纽捷径 */
.hub-search-wrap { margin: 8px 0 18px; }
.hub-search-btn {
  display: flex; align-items: center; gap: 10px; width: 100%; max-width: 640px;
  padding: 12px 14px; border: 1px solid var(--border); border-radius: 10px;
  background: var(--bg-card); color: var(--text-muted); font-size: var(--text-md); cursor: pointer;
}
.hub-search-btn:hover { border-color: var(--accent); color: var(--text-secondary); }
.hub-search-btn kbd {
  margin-left: auto; font-family: var(--font-mono); font-size: var(--text-sm);
  border: 1px solid var(--border); border-radius: 4px; padding: 2px 6px;
}
.hub-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; margin-bottom: 18px;
}
.hub-card {
  display: block; padding: 14px; border: 1px solid var(--border); border-radius: 8px;
  background: var(--bg-card); color: var(--text-primary); text-decoration: none; transition: border-color 0.12s;
}
.hub-card:hover { border-color: var(--accent); }
.hub-card-title {
  display: flex; align-items: center; gap: 8px;
  font-size: var(--text-md); font-weight: 600; margin-bottom: 4px;
}
.hub-card-ico {
  width: 18px !important;
  height: 18px !important;
  max-width: 18px !important;
  max-height: 18px !important;
  flex: 0 0 18px;
  overflow: hidden;
  display: inline-block;
  vertical-align: -0.2em;
  stroke: currentColor;
  stroke-width: 1.8;
  fill: none;
  stroke-linecap: round;
  stroke-linejoin: round;
  opacity: 0.85;
  color: var(--text-secondary);
}
.hub-card-ico use { pointer-events: none; }
.hub-card-desc { font-size: var(--text-sm); color: var(--text-muted); }
/* 最近访问：紧凑 chip 横滑，禁止大列表占首屏 */
.hub-recent--compact {
  display: flex; align-items: center; gap: var(--space-2);
  margin: 0 0 var(--space-4); min-height: 0;
}
.hub-recent--compact.is-hidden,
.hub-recent--compact[hidden] { display: none !important; }
.hub-recent-lbl {
  flex: none; font-size: var(--text-sm); color: var(--text-muted);
  font-weight: 600; letter-spacing: 0.02em;
}
.hub-recent-chips {
  display: flex; align-items: center; gap: var(--space-2);
  overflow-x: auto; -webkit-overflow-scrolling: touch;
  scrollbar-width: none; min-width: 0; flex: 1;
  padding-bottom: 2px;
}
.hub-recent-chips::-webkit-scrollbar { display: none; }
.hub-recent-chip {
  flex: none; display: inline-flex; align-items: center;
  max-width: 9.5em; height: 32px; padding: 0 10px;
  border: 1px solid var(--border); border-radius: var(--radius-pill);
  background: var(--bg-card); color: var(--text-secondary);
  font-size: var(--text-sm); text-decoration: none;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.hub-recent-chip:hover { border-color: var(--accent); color: var(--text-link); }

/* 中性侧栏: 取消固定域染色依赖 */
.nav-group.dom-s .nav-group-hd--domain > .nav-ico,
.nav-group.dom-l .nav-group-hd--domain > .nav-ico { color: var(--text-secondary); opacity: 0.9; }
.nav-item.active { background: var(--bg-hover); color: var(--text-primary); border-radius: 8px; }

/* 总览枢纽 · 移动端压缩 */
@media (max-width: 768px) {
  .hub-search-wrap { margin: var(--space-1) 0 var(--space-3); }
  .hub-search-btn { padding: 10px 12px; font-size: var(--text-base); }
  .hub-kbd, .hub-search-btn kbd { display: none; }
  .hub-recent--compact { margin-bottom: var(--space-3); }
  .hub-recent-chip { height: 30px; max-width: 7.5em; padding: 0 9px; }
  .hub-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--space-2);
    margin-bottom: var(--space-4);
  }
  .hub-card { padding: 10px 12px; }
  .hub-card-title { font-size: var(--text-base); }
  .hub-card-desc { display: none; }
  body.admin .status-chips {
    display: flex; flex-wrap: nowrap; overflow-x: auto; gap: 6px;
    -webkit-overflow-scrolling: touch; scrollbar-width: none;
    margin-bottom: var(--space-3);
  }
  body.admin .status-chips::-webkit-scrollbar { display: none; }
  body.admin .status-chips .chip { flex: none; white-space: nowrap; }
  .hy-drawer { width: 100vw; }
  .hy-cmdk-overlay { padding: 8vh 10px 10px; }
  .nav-search-btn kbd { display: none; }
}

/* 用户页 L2-B rail */
.user-preview-btn {
  background: none; border: none; padding: 0; margin: 0; cursor: pointer;
  color: var(--text-link); font: inherit; text-align: left;
}
.user-preview-btn:hover { text-decoration: underline; }
.user-rail-stats { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-2); margin-bottom: var(--space-4); }
.user-rail-stat {
  border: 1px solid var(--border); border-radius: var(--radius); padding: var(--space-2) var(--space-3);
  background: var(--bg-secondary);
}
.user-rail-stat .k { display: block; font-size: var(--text-sm); color: var(--text-muted); }
.user-rail-stat .v { font-size: var(--text-lg); font-weight: 600; font-family: var(--font-mono); color: var(--text-primary); }
.user-rail-groups { list-style: none; padding: 0; margin: 0 0 var(--space-3); }
.user-rail-groups li {
  display: flex; justify-content: space-between; gap: var(--space-2);
  padding: 8px 0; border-bottom: 1px solid var(--border); font-size: var(--text-sm);
}
.user-rail-groups a { color: var(--text-primary); text-decoration: none; }
.user-rail-groups a:hover { color: var(--text-link); }
.user-rail-manage { width: 100%; margin-bottom: var(--space-3); text-align: center; }
.user-rail-hint { font-size: var(--text-sm); color: var(--text-muted); margin: 0; line-height: 1.45; }
.user-rail-groups-hd { margin-top: var(--space-2); }
