/* 阶段2:整体布局骨架(侧边导航/顶栏/快讯栏)+ 登录卡 + 各页空状态。视觉对齐 docs/ui-preview.html。 */
* { margin: 0; padding: 0; box-sizing: border-box; }

body {
  background: var(--bg-base);
  color: var(--text-1);
  font: var(--fs-body)/1.5 var(--sans);
  min-height: 100vh;
}

.num { font-family: var(--mono); font-variant-numeric: tabular-nums; }
.up { color: var(--up); } .down { color: var(--down); } .flat { color: var(--flat); }
.hidden { display: none !important; }

/* ===== 通用控件 ===== */
.btn {
  background: var(--bg-hover);
  border: 1px solid var(--border);
  color: var(--text-2);
  border-radius: 6px;
  padding: 3px 10px;
  font-size: var(--fs-label);
  cursor: pointer;
  font-family: inherit;
}
.btn:hover { color: var(--text-1); border-color: var(--text-3); }
.btn.primary { background: var(--accent); border-color: var(--accent); color: #fff; }
.btn.primary:hover { color: #fff; opacity: .92; }
.btn:disabled { opacity: .5; cursor: default; }

.field { display: flex; flex-direction: column; gap: 4px; }
.field label { font-size: var(--fs-label); color: var(--text-2); }
.input {
  background: var(--bg-hover);
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 10px 12px;
  color: var(--text-1);
  font-size: var(--fs-body);
  font-family: inherit;
  outline: none;
  width: 100%;
}
.input:focus { border-color: var(--accent); }
.spacer { flex: 1; }

.msg { font-size: var(--fs-label); min-height: 16px; }
.msg.error { color: var(--danger); }
.msg.ok { color: var(--down); }

/* ===== 登录 / 改密卡片 ===== */
.auth-wrap {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px;
}
.auth-card {
  width: 340px;
  max-width: 100%;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: 12px;
  padding: 28px 24px;
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.auth-card .logo { font-weight: 800; font-size: 24px; color: var(--accent); letter-spacing: -1px; }
.auth-card .subtitle { color: var(--text-3); font-size: var(--fs-label); margin-top: -10px; }
.auth-card form { display: flex; flex-direction: column; gap: 12px; }
.auth-card .btn.primary { padding: 10px; font-size: var(--fs-body); }
.auth-card .btn { padding: 8px; }

/* ===== 应用主壳 ===== */
/* grid-template-rows: minmax(0,1fr) 把行高绑定到 100vh(而非按内容自增),
   配合各列 min-height:0,让快讯栏/内容区内部滚动、不撑高整页(否则"设置"会被推到长页底部)。 */
.shell { display: grid; grid-template-columns: 64px 1fr 320px; grid-template-rows: minmax(0, 1fr); height: 100vh; }
.shell > * { min-height: 0; }

/* 侧边导航 */
.nav {
  border-right: 1px solid var(--border);
  display: flex; flex-direction: column; align-items: center;
  padding: 12px 0; gap: 4px; overflow-y: auto;
}
.nav .logo { font-weight: 800; font-size: 18px; color: var(--accent); margin-bottom: 12px; letter-spacing: -1px; }
.nav-item {
  width: 44px; height: 44px; border-radius: 8px;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  cursor: pointer; color: var(--text-2); font-size: 10px; gap: 2px; position: relative;
}
.nav-item svg { width: 18px; height: 18px; stroke: currentColor; fill: none; stroke-width: 1.6; }
.nav-item:hover { background: var(--bg-hover); color: var(--text-1); }
.nav-item.active { background: var(--bg-hover); color: var(--accent); }
.nav-item.active::before { content: ""; position: absolute; left: -10px; top: 10px; bottom: 10px; width: 2px; background: var(--accent); border-radius: 2px; }
.nav-item.disabled { opacity: .35; cursor: default; }
.nav-item.disabled:hover { background: none; color: var(--text-2); }
.nav-sep { width: 32px; border-top: 1px solid var(--border); margin: 8px 0; }
.nav-bottom { margin-top: auto; }

/* 主区 + 顶栏 */
.main { display: flex; flex-direction: column; min-width: 0; overflow: hidden; }
.topbar {
  height: 44px; border-bottom: 1px solid var(--border);
  display: flex; align-items: center; padding: 0 20px; gap: 12px; flex-shrink: 0;
}
.topbar h1 { font-size: 14px; font-weight: 600; white-space: nowrap; }
.topbar-sub { color: var(--text-3); font-size: var(--fs-caption); white-space: nowrap; padding-left: 2px; border-left: 1px solid var(--border); margin-left: 2px; padding-left: 10px; }
.updated { color: var(--text-3); font-size: var(--fs-caption); white-space: nowrap; }
.user-chip { display: flex; align-items: center; gap: 6px; color: var(--text-2); font-size: var(--fs-label); }
.avatar {
  width: 22px; height: 22px; border-radius: 50%;
  background: linear-gradient(135deg, var(--accent), #8b5bee);
  display: flex; align-items: center; justify-content: center;
  font-size: 10px; color: #fff; font-weight: 700;
}
.rail-toggle { display: none; } /* 仅窄屏出现 */

.content { flex: 1; overflow-y: auto; padding: 16px 20px; }
.page { display: none; }
.page.active { display: block; }

/* 快讯栏 */
.rail { border-left: 1px solid var(--border); display: flex; flex-direction: column; min-width: 0; }
.rail-head {
  height: 44px; border-bottom: 1px solid var(--border);
  display: flex; align-items: center; padding: 0 16px; gap: 8px; flex-shrink: 0;
}
.rail-head h2 { font-size: 13px; font-weight: 600; }
.rail-head .count { color: var(--text-3); font-size: var(--fs-caption); }
.rail-body { flex: 1; overflow-y: auto; padding: 12px 16px; }
.rail-overlay { display: none; }

/* 快讯栏隐藏(设置项,仅桌面宽屏生效) */
.shell.rail-hidden { grid-template-columns: 64px 1fr; }
.shell.rail-hidden .rail { display: none; }

/* ===== AsyncBox:加载 / 空 / 错误 ===== */
.async-empty {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  padding: 80px 20px; color: var(--text-3); gap: 8px; text-align: center;
}
.async-empty svg { stroke: currentColor; fill: none; stroke-width: 1.4; opacity: .8; }
.async-empty .big { font-size: 15px; color: var(--text-2); }
.async-empty .desc { max-width: 420px; line-height: 1.6; }

.async-error {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  padding: 64px 20px; gap: 10px; text-align: center;
}
.async-error .big { font-size: 14px; color: var(--danger); }
.async-error .reason {
  max-width: 460px; color: var(--text-2); font-size: var(--fs-label);
  background: var(--bg-card); border: 1px solid var(--border); border-radius: 6px; padding: 8px 12px;
}

.async-loading { padding: 8px 0; display: flex; flex-direction: column; gap: 10px; }
.skeleton {
  background: linear-gradient(90deg, var(--bg-card) 25%, var(--bg-hover) 37%, var(--bg-card) 63%);
  background-size: 400% 100%; border-radius: 6px; height: 16px;
  animation: shimmer 1.3s ease infinite;
}
.skeleton.block { height: 72px; }
@keyframes shimmer { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } }

/* ===== 宏观:Regime 横幅 ===== */
.regime {
  display: flex; align-items: center; gap: 18px;
  background: var(--bg-card); border: 1px solid var(--border);
  border-left: 3px solid var(--warn); border-radius: 8px;
  padding: 10px 16px; margin-bottom: 14px; flex-wrap: wrap;
}
.regime.risk-off { border-left-color: var(--danger); }
.regime-tag {
  font-family: var(--mono); font-weight: 700; font-size: 13px;
  color: var(--warn); background: rgba(217, 161, 59, .12);
  padding: 2px 10px; border-radius: 20px;
}
.regime-tag.off { color: var(--danger); background: rgba(240, 72, 62, .12); }
.regime-kv { display: flex; gap: 5px; font-size: var(--fs-label); }
.regime-kv b { color: var(--text-1); font-weight: 600; }
.regime-kv span { color: var(--text-3); }
.regime-date { margin-left: auto; color: var(--text-3); font-size: var(--fs-caption); }

/* ===== 宏观:指标网格 ===== */
.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.group { background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; padding: 14px 16px; }
.group h3 {
  font-size: var(--fs-label); color: var(--text-2); font-weight: 600;
  margin-bottom: 10px; display: flex; align-items: center;
}
.group h3 .src { margin-left: auto; color: var(--text-3); font-weight: 400; font-size: var(--fs-caption); }
.metrics { display: grid; grid-template-columns: repeat(auto-fill, minmax(118px, 1fr)); gap: 12px 16px; }
.metric .lbl { color: var(--text-3); font-size: var(--fs-caption); margin-bottom: 2px; }
.metric .val { font-family: var(--mono); font-size: 19px; font-weight: 600; font-variant-numeric: tabular-nums; }
.metric svg { display: block; margin-top: 3px; width: 100%; height: 22px; }
.spark { stroke-width: 1.5; fill: none; opacity: .9; }
.spark-fill { opacity: .12; }

.macro-note { margin-top: 12px; color: var(--text-3); font-size: var(--fs-caption); line-height: 1.6; }
.macro-note.warn { color: var(--warn); }

/* ===== A股:策略 chips ===== */
.chips { display: flex; gap: 8px; margin-bottom: 12px; flex-wrap: wrap; align-items: center; }
.chip {
  background: var(--bg-card); border: 1px solid var(--border); border-radius: 20px;
  padding: 4px 14px; font-size: var(--fs-label); color: var(--text-2); cursor: pointer;
  display: inline-flex; align-items: center; gap: 6px;
}
.chip:hover { border-color: var(--text-3); color: var(--text-1); }
.chip.on { background: rgba(91, 141, 238, .14); border-color: var(--accent); color: var(--accent); font-weight: 600; }
.chip.ghost { border-style: dashed; }
.chip-x { color: var(--text-3); font-size: 13px; line-height: 1; }
.chip-x:hover { color: var(--danger); }
.chips .meta { margin-left: auto; color: var(--text-3); font-size: var(--fs-caption); }

.subbar { display: flex; gap: 8px; align-items: center; margin-bottom: 12px; flex-wrap: wrap; }
.input.mini { padding: 5px 8px; border-radius: 6px; font-size: var(--fs-label); width: auto; }
select.input.mini { cursor: pointer; }

/* 筛选表单 */
.filter-form { background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; padding: 14px 16px; margin-bottom: 12px; }
.ff-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px 16px; }
.ff-field { display: flex; flex-direction: column; gap: 4px; font-size: var(--fs-caption); color: var(--text-3); }
.ff-field.checkbox { flex-direction: row; align-items: center; gap: 6px; color: var(--text-2); }
.ff-range { display: flex; align-items: center; gap: 4px; }
.ff-range i { color: var(--text-3); }
.ff-range .input { width: 100%; }
.ff-actions { display: flex; gap: 8px; margin-top: 14px; }

/* 结果表格 */
/* 桌面自适应;窄屏表格在盒内横向滚动(页面本身不横滚),含 iOS 惯性滚动 */
.tablewrap {
  background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px;
  overflow-x: auto; overflow-y: hidden; -webkit-overflow-scrolling: touch;
}
.tablewrap table { min-width: 620px; }
table { width: 100%; border-collapse: collapse; }
th {
  font-size: var(--fs-caption); color: var(--text-3); font-weight: 500; text-align: right;
  padding: 8px 12px; border-bottom: 1px solid var(--border); cursor: pointer; white-space: nowrap; user-select: none;
}
th.name-col, th:first-child { text-align: left; }
th.sorted { color: var(--accent); }
td { padding: 9px 12px; text-align: right; font-size: var(--fs-num); border-bottom: 1px solid rgba(35, 43, 54, .5); white-space: nowrap; }
td:first-child { text-align: left; }
tr.stock-row { cursor: pointer; }
tr.stock-row:hover td { background: var(--bg-hover); }
tr.stock-row.expanded td { background: var(--bg-hover); }
.stock .name { font-weight: 600; font-size: 13px; }
.stock .code { color: var(--text-3); font-size: var(--fs-caption); font-family: var(--mono); margin-left: 6px; }

.expand-row td { background: var(--bg-base); padding: 12px 16px; }
.expand-inner { display: flex; align-items: center; gap: 20px; flex-wrap: wrap; }
.k-spark svg { width: 220px; height: 40px; display: block; }
.k-list { color: var(--text-2); font-size: var(--fs-label); }
.k5 { margin-left: 10px; font-family: var(--mono); }
.k5 b { color: var(--text-1); }

/* ===== 快讯条目 ===== */
.news { padding: 10px 0; border-bottom: 1px solid rgba(35, 43, 54, .5); cursor: pointer; }
.news:last-child { border-bottom: none; }
.news .meta { display: flex; gap: 8px; align-items: center; color: var(--text-3); font-size: var(--fs-caption); margin-bottom: 3px; }
.dir { font-size: 10px; padding: 1px 8px; border-radius: 10px; font-weight: 600; margin-left: auto; }
.dir.pos { color: var(--up); background: rgba(240, 72, 62, .1); }
.dir.neg { color: var(--down); background: rgba(38, 162, 105, .12); }
.dir.neu { color: var(--flat); background: var(--bg-hover); }
.dir.pending { color: var(--text-3); background: var(--bg-hover); font-weight: 400; }
.news .title { font-size: 13px; font-weight: 600; line-height: 1.4; }
.news .title a { color: inherit; text-decoration: none; }
.news .title a:hover { color: var(--accent); }
.news .sum { color: var(--text-2); font-size: var(--fs-label); margin-top: 3px; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.news .news-detail { color: var(--text-2); font-size: var(--fs-label); margin-top: 6px; padding: 8px 10px; background: var(--bg-base); border-left: 2px solid var(--accent); border-radius: 0 6px 6px 0; line-height: 1.6; }
.news .link-stocks { display: flex; gap: 4px; margin-top: 5px; flex-wrap: wrap; }
.mini { font-size: 10px; color: var(--text-2); background: var(--bg-hover); padding: 1px 7px; border-radius: 9px; font-family: var(--mono); }
.rail-head .btn.on { color: var(--accent); border-color: var(--accent); }

/* ===== 加密卡片 ===== */
.cryptos { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.ccard { background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; padding: 14px 16px; }
.ccard .row1 { display: flex; align-items: baseline; gap: 10px; }
.ccard .sym { font-family: var(--mono); font-weight: 700; font-size: 15px; }
.ccard .score { font-family: var(--mono); color: var(--accent); font-size: var(--fs-label); }
.ccard .cc-ind { color: var(--text-3); font-size: var(--fs-caption); margin-top: 6px; }
.ccard .oneline { color: var(--text-2); font-size: var(--fs-label); margin-top: 6px; }
.ccard .cc-detail { color: var(--text-2); font-size: var(--fs-label); margin-top: 8px; line-height: 1.6; padding: 8px 10px; background: var(--bg-base); border-radius: 6px; }
.ccard .expand { color: var(--text-3); font-size: var(--fs-caption); margin-top: 8px; cursor: pointer; }
.ccard .expand:hover { color: var(--accent); }

/* ===== 知识库页 ===== */
.kb-search { display: flex; gap: 8px; margin-bottom: 14px; }
.kb-search .input { flex: 1; }
.kb-hit { background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; padding: 12px 16px; margin-bottom: 10px; }
.kb-hit .r1 { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.kb-hit .kname { font-weight: 700; font-size: 14px; }
.kb-hit .kcode { color: var(--text-3); font-family: var(--mono); font-size: var(--fs-caption); }
.str { font-size: 10px; padding: 1px 9px; border-radius: 10px; font-weight: 600; }
.str.strong { color: #fff; background: var(--up); }
.str.medium { color: #1a1300; background: var(--warn); }
.str.weak, .str.unverified { color: var(--text-2); background: var(--bg-hover); border: 1px solid var(--border); }
.kb-hit .rel { color: var(--text-2); font-size: var(--fs-label); margin-left: auto; }
.evid { margin-top: 7px; padding: 7px 10px; background: var(--bg-base); border-left: 2px solid var(--accent); border-radius: 0 6px 6px 0; font-size: var(--fs-label); color: var(--text-2); line-height: 1.6; }
.evid .src { color: var(--text-3); font-size: var(--fs-caption); margin-top: 3px; }
.evid .src a { color: var(--accent); text-decoration: none; }
.kb-fin { display: flex; gap: 14px; margin-top: 7px; color: var(--text-3); font-size: var(--fs-caption); font-family: var(--mono); flex-wrap: wrap; }
.kb-hit .kname[data-code] { cursor: pointer; }
.kb-hit .kname[data-code]:hover { color: var(--accent); }

/* 公司全景 */
.kb-company .kc-head { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; flex-wrap: wrap; }
.kb-company .kc-head .kname { font-weight: 700; font-size: 16px; }
.kb-company .kc-head .kcode { color: var(--text-3); font-family: var(--mono); font-size: var(--fs-label); }
.kc-exch { font-size: 10px; padding: 1px 8px; border-radius: 10px; background: var(--bg-hover); color: var(--text-2); }
.kc-profile { color: var(--text-2); font-size: var(--fs-body); line-height: 1.7; background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; padding: 12px 16px; }
.kb-company .section-title { font-size: var(--fs-label); color: var(--text-2); font-weight: 600; margin: 16px 0 8px; }
.kb-company td { text-align: left; }
.kb-company td.num { text-align: right; }
.kc-empty { color: var(--text-3); font-size: var(--fs-label); padding: 8px 2px; }
.kc-rels { display: flex; flex-direction: column; gap: 10px; }
.kc-relgroup { display: flex; gap: 10px; align-items: baseline; flex-wrap: wrap; }
.kc-rellabel { font-size: var(--fs-caption); color: var(--text-3); min-width: 64px; }
.kc-nodes { display: flex; gap: 6px; flex-wrap: wrap; }
.kc-node { font-size: 11px; padding: 3px 10px; border-radius: 12px; border: 1px solid var(--border); color: var(--text-1); background: var(--bg-card); }
.kc-node i { color: var(--text-3); font-style: normal; margin-left: 5px; font-size: 10px; }
.kc-node.anon { border-style: dashed; color: var(--text-2); }
.kc-node em { color: var(--warn); font-style: normal; margin-left: 5px; font-size: 10px; }
.kc-plan { background: var(--bg-card); border: 1px solid var(--border); border-left: 2px solid var(--accent); border-radius: 0 6px 6px 0; padding: 8px 12px; margin-bottom: 8px; }
.kc-plan-title { font-weight: 600; font-size: 13px; }
.kc-plan-meta { color: var(--text-3); font-size: var(--fs-caption); margin-top: 3px; }

/* ===== 管理后台(独立 shell) ===== */
.admin-shell { display: grid; grid-template-columns: 170px 1fr; height: 100vh; }
.anav { border-right: 1px solid var(--border); padding: 14px 10px; display: flex; flex-direction: column; gap: 2px; }
.anav .back { color: var(--text-3); font-size: var(--fs-caption); padding: 6px 10px; cursor: pointer; }
.anav .back:hover { color: var(--accent); }
.anav h2 { font-size: 13px; font-weight: 700; padding: 4px 10px 12px; }
.anav h2 .role { font-size: 10px; color: var(--warn); background: rgba(217, 161, 59, .12); border-radius: 8px; padding: 1px 7px; margin-left: 6px; font-weight: 600; }
.aitem { padding: 7px 10px; border-radius: 7px; color: var(--text-2); font-size: 13px; cursor: pointer; display: flex; align-items: center; gap: 8px; }
.aitem:hover { background: var(--bg-hover); color: var(--text-1); }
.aitem.active { background: rgba(91, 141, 238, .13); color: var(--accent); font-weight: 600; }
.apage { display: none; }
.apage.active { display: block; }

/* 后台表格默认左对齐(覆盖 A股 表格的右对齐);.r 仍右对齐 */
.admin-shell th, .admin-shell td { text-align: left; }
.admin-shell th.r, .admin-shell td.r { text-align: right; }

/* 配置中心 */
.cfgtabs { display: flex; gap: 8px; margin-bottom: 12px; align-items: center; flex-wrap: wrap; }
.cfginput { background: var(--bg-base); border: 1px solid var(--border); border-radius: 6px; color: var(--text-1); padding: 3px 9px; font-size: var(--fs-label); font-family: var(--mono); width: 240px; max-width: 100%; }
.cfginput.narrow { width: 90px; }
.cfginput:focus { border-color: var(--accent); outline: none; }
.cfginput.dirty { border-color: var(--warn); }
.cfginput.bad-border { border-color: var(--danger); }
.cfgrow td.cfgk { font-family: var(--mono); color: var(--text-2); }
.admin-shell .desc { color: var(--text-3); font-size: var(--fs-caption); white-space: normal; }
.pill { font-size: 10px; padding: 1px 8px; border-radius: 10px; font-weight: 600; }
.pill.set, .pill.ok { color: var(--down); background: rgba(38, 162, 105, .12); }
.pill.unset, .pill.fail { color: var(--up); background: rgba(240, 72, 62, .1); }
.pill.pend { color: var(--warn); background: rgba(217, 161, 59, .12); }
.pill.skip { color: var(--text-3); background: var(--bg-hover); }

/* 用户与审计 */
.btn.sm { padding: 1px 8px; font-size: var(--fs-caption); }
.btn.danger { color: var(--up); border-color: rgba(240, 72, 62, .5); }
.admin-shell .group h3 { font-size: var(--fs-label); color: var(--text-2); font-weight: 600; margin-bottom: 10px; display: flex; align-items: center; }
.admin-shell .group h3 .src { margin-left: auto; color: var(--text-3); font-weight: 400; font-size: var(--fs-caption); }
.users-notice { display: none; }
.users-notice.ok, .users-notice.bad { display: block; padding: 8px 12px; border-radius: 6px; font-size: var(--fs-label); margin-bottom: 12px; }
.users-notice.ok { background: rgba(38, 162, 105, .12); color: var(--text-1); border: 1px solid rgba(38, 162, 105, .4); }
.users-notice.bad { background: rgba(240, 72, 62, .1); color: var(--danger); border: 1px solid rgba(240, 72, 62, .4); }
.lock-banner { font-size: var(--fs-caption); color: var(--text-2); margin-bottom: 8px; }
.lock-banner a { color: var(--accent); cursor: pointer; text-decoration: none; }
.admin-shell .grid2 { margin-bottom: 14px; }
.cfg-msg { font-size: var(--fs-caption); }
.cfg-msg.ok { color: var(--down); }
.cfg-msg.bad { color: var(--danger); }
.btn.ok { color: var(--down); border-color: rgba(38, 162, 105, .5); }
.admin-shell .num { font-family: var(--mono); font-variant-numeric: tabular-nums; }
.aitem .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--up); margin-left: auto; }

/* 汇总条 */
.sumbar { display: flex; gap: 26px; background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; padding: 12px 18px; margin-bottom: 14px; flex-wrap: wrap; }
.sum .lbl { color: var(--text-3); font-size: var(--fs-caption); }
.sum .val { font-family: var(--mono); font-size: 19px; font-weight: 600; }
.sum .sub { color: var(--text-3); font-size: var(--fs-caption); }

/* 任务卡 */
.taskgrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 10px; margin-bottom: 16px; }
.task { background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; padding: 11px 13px; }
.task.fail { border-color: rgba(240, 72, 62, .55); }
.task .r1 { display: flex; align-items: center; gap: 7px; font-weight: 600; font-size: 13px; }
.st { width: 7px; height: 7px; border-radius: 50%; background: var(--text-3); flex-shrink: 0; }
.st.ok { background: var(--down); } .st.fail { background: var(--up); }
.task .r2 { color: var(--text-3); font-size: var(--fs-caption); margin-top: 4px; }
.task .err { color: var(--up); font-size: var(--fs-caption); margin-top: 4px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.task .r3 { margin-top: 8px; display: flex; gap: 6px; }

/* 抽取审核 split */
.split { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; height: calc(100vh - 190px); min-height: 380px; }
.pane { background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; display: flex; flex-direction: column; overflow: hidden; }
.pane h3 { font-size: var(--fs-label); color: var(--text-2); font-weight: 600; padding: 10px 14px; border-bottom: 1px solid var(--border); display: flex; gap: 8px; align-items: center; }
.pane .body { flex: 1; overflow-y: auto; padding: 12px 14px; font-size: var(--fs-label); color: var(--text-2); line-height: 1.7; }
.pane .body mark { background: rgba(91, 141, 238, .2); color: var(--text-1); border-radius: 2px; padding: 0 2px; }
.rev-sec { margin-top: 10px; } .rev-sec > b { color: var(--text-1); font-size: var(--fs-label); }
.rev-sec ul { margin: 4px 0 0 16px; } .rev-sec li { margin-bottom: 4px; }

/* 关注池行业圈选 */
.ind { display: flex; align-items: center; gap: 8px; padding: 6px 4px; border-bottom: 1px solid rgba(35, 43, 54, .4); font-size: var(--fs-label); cursor: pointer; }
.ind:last-child { border-bottom: none; }
.ind input { accent-color: var(--accent); }
.ind .cnt { margin-left: auto; color: var(--text-3); font-family: var(--mono); font-size: var(--fs-caption); }
.ind-tree { max-height: 340px; overflow-y: auto; }
/* 池外安全网 */
.safety-list { max-height: 380px; overflow-y: auto; }
.safety { display: flex; align-items: center; gap: 10px; padding: 8px 0; border-bottom: 1px solid rgba(35, 43, 54, .4); font-size: var(--fs-label); }
.safety:last-child { border-bottom: none; }
.safety .t { color: var(--text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; }
.safety .d { color: var(--text-3); font-size: var(--fs-caption); font-family: var(--mono); }

/* review-bar / prog */
.review-bar { display: flex; gap: 8px; align-items: center; margin-bottom: 10px; flex-wrap: wrap; }
.review-bar .prog { color: var(--text-3); font-size: var(--fs-caption); margin-left: auto; font-family: var(--mono); }
.ch-text { white-space: pre-wrap; font-size: 12px; line-height: 1.75; color: var(--text-2); margin-top: 4px; }
.ch-wrap .rev-sec + .rev-sec { margin-top: 14px; }
.cpt { padding: 5px 0; border-bottom: 1px solid rgba(35, 43, 54, .4); font-size: var(--fs-label); }
.cpt:last-child { border-bottom: none; }
pre.json { font-family: var(--mono); font-size: 11.5px; line-height: 1.6; color: var(--text-2); white-space: pre-wrap; word-break: break-word; margin-top: 4px; }

/* A股表:概念关联色块 + 迷你走势 */
td.concepts { white-space: nowrap; }
.ctag { display: inline-block; font-size: 10px; padding: 1px 6px; border-radius: 8px; margin-right: 4px; font-weight: 600; }
.ctag.cs3 { color: var(--up); background: rgba(240, 72, 62, .12); }
.ctag.cs2 { color: var(--warn); background: rgba(217, 161, 59, .12); }
.ctag.cs1 { color: var(--text-3); background: var(--bg-hover); }
td.spark-cell { width: 96px; }
.spk { display: inline-flex; align-items: center; height: 22px; }

/* 三期:技术信号 chips + 结果行信号标签 */
.sig-chips { margin-top: 6px; }
.sig-lbl { color: var(--text-3); font-size: var(--fs-caption); align-self: center; margin-right: 2px; }
.chip.sig .sig-stat { color: var(--text-3); font-size: 10px; margin-left: 6px; font-family: var(--mono); }
.chip.sig.on .sig-stat { color: inherit; opacity: .85; }
.sigtags { display: block; margin-top: 2px; }
.sigtag { display: inline-block; font-style: normal; font-size: 10px; padding: 0 5px; border-radius: 7px;
  margin-right: 3px; color: var(--accent); background: rgba(91, 141, 238, .12); font-weight: 600; }
.sigtag.warn { color: var(--warn); background: rgba(217, 161, 59, .12); }

/* 二期阶段4:风向页 wcard(对照 ui-preview) */
.wcard { background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; padding: 12px 16px; margin-bottom: 10px; cursor: pointer; }
.wcard:hover { border-color: var(--text-3); }
.wcard .r1 { display: flex; align-items: baseline; gap: 12px; }
.wcard .wname { font-weight: 700; font-size: 15px; }
.wcard .wscore { font-family: var(--mono); font-size: 20px; font-weight: 700; color: var(--accent); }
.crowd { margin-left: auto; font-size: var(--fs-caption); font-family: var(--mono); color: var(--text-3); }
.crowd.hot { color: var(--warn); } .crowd.veryhot { color: var(--up); font-weight: 700; }
.crowd.na { color: var(--text-3); }
.wcard .r2 { display: flex; gap: 14px; color: var(--text-2); font-size: var(--fs-label); margin-top: 4px; flex-wrap: wrap; }
.wcard .r2 b { color: var(--text-1); font-family: var(--mono); font-weight: 600; }
.wcard .r3 { color: var(--text-3); font-size: var(--fs-caption); margin-top: 4px; }
.wcard .chain { margin-top: 8px; display: flex; gap: 6px; flex-wrap: wrap; }
.wcard .node { font-size: var(--fs-caption); border: 1px solid var(--border); border-radius: 6px; padding: 2px 8px; color: var(--text-2); }
.wcard .node.s { border-color: rgba(240, 72, 62, .5); } .wcard .node.m { border-color: rgba(217, 161, 59, .5); }
.wcard .node em { font-style: normal; color: var(--text-3); font-size: 10px; margin-left: 4px; }

/* 三期阶段4:K线详情浮层 */
.kd-overlay { position: fixed; inset: 0; background: rgba(0, 0, 0, .6); z-index: 50;
  display: flex; align-items: center; justify-content: center; }
.kd-overlay.hidden { display: none; }
.kd-panel { width: min(1100px, 94vw); height: min(720px, 90vh); background: var(--bg-card);
  border: 1px solid var(--border); border-radius: 10px; display: flex; flex-direction: column; overflow: hidden; }
.kd-head { display: flex; align-items: center; gap: 12px; padding: 10px 16px;
  border-bottom: 1px solid var(--border); font-size: var(--fs-label); flex-wrap: wrap; }
.kd-legend { display: flex; gap: 10px; flex-wrap: wrap; }
.kd-leg { color: var(--text-2); font-size: var(--fs-caption); display: inline-flex; align-items: center; gap: 4px; cursor: pointer; }
.kd-leg:hover { color: var(--text-1); }
.kd-sig-line { display: block; width: 100%; }
.kd-leg i { color: var(--text-3); font-style: normal; font-family: var(--mono); font-size: 10px; }
.kd-dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
.kd-chart { flex: 1; min-height: 0; overflow: hidden; }
.kd-info { padding: 8px 16px; border-top: 1px solid var(--border); font-size: var(--fs-label);
  color: var(--text-2); min-height: 34px; max-height: 132px; overflow-y: auto;
  background: var(--bg-card); flex-shrink: 0; }
.kd-info .kd-sig-line { padding: 2px 0; }

@media (max-width: 900px) {
  .admin-shell { grid-template-columns: 1fr; grid-template-rows: auto 1fr; }
  .anav { flex-direction: row; overflow-x: auto; border-right: none; border-bottom: 1px solid var(--border); gap: 6px; align-items: center; padding: 8px 10px; }
  .anav h2, .anav .back { white-space: nowrap; }
  .split { grid-template-columns: 1fr; height: auto; }
}

/* ===== 设置抽屉 ===== */
.drawer-overlay {
  position: fixed; inset: 0; background: rgba(0, 0, 0, .5); z-index: 40;
}
.drawer {
  position: fixed; top: 0; right: 0; bottom: 0; width: 320px; max-width: 90vw; z-index: 41;
  background: var(--bg-card); border-left: 1px solid var(--border);
  display: flex; flex-direction: column;
}
.drawer-head {
  height: 44px; border-bottom: 1px solid var(--border);
  display: flex; align-items: center; padding: 0 16px;
}
.drawer-head h2 { font-size: 14px; font-weight: 600; flex: 1; }
.drawer-body { padding: 16px; display: flex; flex-direction: column; gap: 24px; }
.setting-group { display: flex; flex-direction: column; gap: 8px; }
.setting-label { font-size: var(--fs-label); color: var(--text-2); font-weight: 600; }
.setting-hint { font-size: var(--fs-caption); color: var(--text-3); line-height: 1.5; }
.seg { display: inline-flex; border: 1px solid var(--border); border-radius: 8px; overflow: hidden; width: fit-content; }
.seg-btn {
  background: var(--bg-base); border: none; color: var(--text-2);
  padding: 7px 16px; font-size: var(--fs-label); cursor: pointer; font-family: inherit;
}
.seg-btn + .seg-btn { border-left: 1px solid var(--border); }
.seg-btn.on { background: rgba(91, 141, 238, .14); color: var(--accent); font-weight: 600; }

/* ===== 响应式 ===== */
/* ≤1280px:快讯栏折叠为顶栏按钮,点击滑出为浮层 */
@media (max-width: 1280px) {
  .shell, .shell.rail-hidden { grid-template-columns: 64px 1fr; }
  .rail-toggle { display: inline-block; }
  .rail {
    position: fixed; top: 0; right: 0; bottom: 0; width: 320px; max-width: 90vw;
    background: var(--bg-card); z-index: 31; transform: translateX(100%);
    transition: transform .2s ease; display: flex;
  }
  .shell.rail-open .rail { transform: translateX(0); }
  .shell.rail-open .rail-overlay { display: block; position: fixed; inset: 0; background: rgba(0, 0, 0, .5); z-index: 30; }
}

/* ≤768px:侧边导航变底部 TabBar,主内容单列 */
@media (max-width: 768px) {
  .shell, .shell.rail-hidden { grid-template-columns: 1fr; grid-template-rows: 1fr 56px; }
  .nav {
    flex-direction: row; border-right: none; border-top: 1px solid var(--border);
    order: 2; padding: 0 8px; justify-content: space-around; align-items: center;
  }
  .nav .logo, .nav-sep, .nav-bottom { display: none; }
  .nav-item.active::before { display: none; }
  .main { order: 1; }
  .content { padding: 12px; }
  .grid2, .cryptos { grid-template-columns: 1fr; }
  .regime { gap: 10px; }
  .regime-date { margin-left: 0; }
  .topbar { padding: 0 12px; gap: 8px; }
  .topbar .updated { display: none; }
}

/* 四期阶段3:盘中页情绪条(对照 ui-preview) */
.emotion { display: flex; align-items: center; gap: 16px; background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; padding: 12px 16px; margin-bottom: 12px; flex-wrap: wrap; }
.gauge { position: relative; width: 170px; height: 10px; border-radius: 6px; background: linear-gradient(90deg,#2e5aa0,#26a269,#d9a13b,#f0483e); }
.gauge .pin { position: absolute; top: -4px; width: 3px; height: 18px; background: #fff; border-radius: 2px; }
.emotion .escore { font-family: var(--mono); font-size: 22px; font-weight: 700; color: var(--warn); }
.emotion .ekv { font-size: var(--fs-label); color: var(--text-2); }
.emotion .ekv b { color: var(--text-1); font-family: var(--mono); }
.trig { display: flex; align-items: center; gap: 10px; padding: 9px 0; border-bottom: 1px solid rgba(35,43,54,.5); font-size: var(--fs-label); }
.trig .tt { font-family: var(--mono); color: var(--text-3); font-size: var(--fs-caption); width: 40px; }
.trig .dist { margin-left: auto; font-family: var(--mono); color: var(--text-2); font-size: var(--fs-caption); }
