/* styles.css — MarketPulse 手机版（移动优先 · TSP 暗色主题）
   原则：对齐 tick-stock-panel §6.0 设计语言——三层暗背景/电光蓝强调/等宽数字（与桌面端同一套 token 值）；动画只动 transform/opacity；数字全局 tabular-nums */
:root {
  color-scheme: dark;
  --bg: #0a0a0b;
  --surface: #18181b;
  --surface-2: #212126;
  --surface-raised: #212126;
  --line: #353539;
  --line-soft: #26262b;
  --ink: #fafafa;
  --muted: #a9a9b4;
  --teal: #3b82f6;
  /* 2026-09-10 色彩角色拆分(桌面同款):蓝=交互 / 紫=数据 / 青碧=正向 */
  --data-ink: #a78bfa; --data-soft: rgba(167, 139, 250, .09);
  --pos-ink: #2dd4bf; --pos-soft: rgba(45, 212, 191, .08);
  --teal-strong: #60a5fa;
  --teal-soft: rgba(59, 130, 246, 0.08);
  /* 填充态专用底色（白字徽章/主按钮）；--amber 亮琥珀只用于文字与浅底（暗底可读） */
  --fill-teal: #3b82f6;
  --fill-red: #f04438;
  --fill-amber: #b45309;
  --red: #f04438;
  --green: #12b76a;
  --amber: #f79009;
  --up-tint: rgba(240, 68, 56, 0.08);
  --down-tint: rgba(18, 183, 106, 0.08);
  --amber-tint: rgba(247, 144, 9, 0.08);
  --danger-tint: rgba(240, 68, 56, 0.08);
  --shadow-1: 0 1px 2px rgba(0, 0, 0, 0.40);
  --shadow-2: 0 8px 22px rgba(0, 0, 0, 0.50);
  --r-s: 4px; --r-m: 6px; --r-l: 8px;
  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
  --font-mono: "Cascadia Mono", "JetBrains Mono", "IBM Plex Mono", Consolas, ui-monospace, monospace;
  --safe-t: env(safe-area-inset-top, 0px);
  /* Android Chrome(standalone PWA 手势导航)下 env() 常报 0,12px 下限兜底:
     底部导航文字/抽屉按钮不再贴着手势条(误触发上滑回家/返回) */
  --safe-b: max(env(safe-area-inset-bottom, 0px), 12px);
  --fs: 14px;
}

/* ===== 浅色变体（TSP §6.0 亮色板：同一设计语言仅翻转色板；数据色沿用经典浅色的对比度调优值） ===== */
html[data-theme="light"] {
  color-scheme: light;
  --bg: #fafafa;
  --surface: #ffffff;
  --surface-2: #f4f4f5;
  --surface-raised: #f7f9fd;
  --line: #e4e4e7;
  --line-soft: #ededf0;
  --ink: #18181b;
  --muted: #52525b;
  --teal: #2563eb;
  --data-ink: #7c3aed; --data-soft: rgba(124, 58, 237, .05);
  --pos-ink: #0d9488; --pos-soft: rgba(13, 148, 136, .06);
  --teal-strong: #1d4ed8;
  --teal-soft: rgba(59, 130, 246, 0.06);
  --fill-teal: #2563eb;
  --fill-red: #d32027;
  --fill-amber: #96660a;
  --red: #d32027;
  --green: #007a3e;
  --amber: #a16207;
  --up-tint: rgba(211, 32, 39, 0.06);
  --down-tint: rgba(0, 122, 62, 0.06);
  --amber-tint: rgba(161, 98, 7, 0.06);
  --danger-tint: rgba(201, 48, 44, 0.06);
  --shadow-1: 0 1px 2px rgba(23, 43, 82, 0.10);
  --shadow-2: 0 8px 22px rgba(23, 43, 82, 0.18);
}
html[data-theme="light"] .sk::after { background: linear-gradient(90deg, transparent, rgba(23, 43, 82, 0.06), transparent); }
html[data-theme="light"] .bar-track { box-shadow: inset 0 1px 2px rgba(23, 43, 82, 0.10); }
/* 主题切换按钮：暗色显月亮（点击到亮色）、亮色显太阳 */
#themeBtn .ic-sun { display: none; }
html[data-theme="light"] #themeBtn .ic-sun { display: inline-block; }
html[data-theme="light"] #themeBtn .ic-moon { display: none; }

* { box-sizing: border-box; -webkit-tap-highlight-color: transparent; }
html, body { margin: 0; padding: 0; height: 100%; }
body {
  height: 100dvh; /* 键盘弹出时收矮;不支持 dvh 的老浏览器忽略本行回落 100% */
  display: flex; flex-direction: column;
  overflow: hidden; /* App 壳:文档级永不滚动,顶栏/底栏钉死,只有 main 滚(治「一动整页跟着动」) */
  background: var(--bg);
  color: var(--ink);
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
  font-size: var(--fs);
  line-height: 1.5;
  overscroll-behavior-y: contain;
}

/* ============================== 宇宙星空层（深空底+银河+噪声星海 · 桌面端同源方案,密度减半） ==============================
   真实天文结构:银河=银心端(左上,暖奶油色核球)→反银心端(右下,窄暗冷蓝)的方向性带,
   大裂隙尘埃通道切在带中线上,噪声 PNG 星海做底噪(幂律亮度+真实光谱色温)。
   面板 surface 不透明底色不透星:星只在卡片缝隙露出,数据区观感不受影响。
   App 壳 body 是固定视口(overflow hidden),星空天然钉死,无需 fixed 附加。
   浅色主题(白昼)整层隐藏。reduced-motion 由全局规则关闭动画。 */
html:not([data-theme="light"]) body {
  background-color: #04060b;
  background-image:
    /* 银河带:银心端(左上 14%)最宽最亮暖奶油 → 反银心端(右下 86%)窄暗冷蓝 */
    radial-gradient(340px 160px at 14% 12%, rgba(255, 233, 196, .13), transparent 70%),
    radial-gradient(280px 130px at 38% 32%, rgba(148, 163, 234, .09), transparent 72%),
    radial-gradient(300px 130px at 58% 52%, rgba(129, 148, 220, .08), transparent 72%),
    radial-gradient(200px 100px at 82% 82%, rgba(148, 163, 234, .05), transparent 70%),
    /* 大裂隙:沿带中线的暗尘埃通道(比夜空底更黑) */
    radial-gradient(190px 44px at 32% 28%, rgba(2, 3, 6, .5), transparent 75%),
    radial-gradient(210px 46px at 52% 48%, rgba(2, 3, 6, .44), transparent 75%),
    radial-gradient(160px 40px at 72% 68%, rgba(2, 3, 6, .38), transparent 75%),
    /* HII 电离氢区(粉红)+反射星云(蓝白)——深空照片签名细节 */
    radial-gradient(30px 22px at 44% 36%, rgba(255, 138, 158, .10), transparent 70%),
    radial-gradient(24px 17px at 66% 30%, rgba(148, 178, 255, .09), transparent 70%),
    /* CSS 星点:真实色温谱(A 白主力/B 蓝白次之/K 红巨星 1 颗)——密度为桌面约一半 */
    radial-gradient(1.2px 1.2px at 60px 90px, rgba(202, 215, 255, .8) 50%, transparent 51%),
    radial-gradient(1.2px 1.2px at 300px 220px, rgba(202, 215, 255, .75) 50%, transparent 51%),
    radial-gradient(1.3px 1.3px at 170px 480px, rgba(202, 215, 255, .82) 50%, transparent 51%),
    radial-gradient(1.3px 1.3px at 40px 620px, rgba(170, 191, 255, .78) 50%, transparent 51%),
    radial-gradient(1.1px 1.1px at 250px 130px, rgba(170, 191, 255, .6) 50%, transparent 51%),
    radial-gradient(1.1px 1.1px at 100px 350px, rgba(240, 242, 255, .55) 50%, transparent 51%),
    radial-gradient(1.2px 1.2px at 330px 560px, rgba(248, 247, 255, .6) 50%, transparent 51%),
    radial-gradient(1.4px 1.4px at 200px 700px, rgba(255, 181, 108, .75) 50%, transparent 51%),
    /* 幂律暗星层(三层递减) */
    radial-gradient(1px 1px at 180px 160px, rgba(240, 242, 255, .45) 50%, transparent 51%),
    radial-gradient(1px 1px at 350px 400px, rgba(235, 238, 255, .3) 50%, transparent 51%),
    radial-gradient(1px 1px at 90px 540px, rgba(240, 242, 255, .2) 50%, transparent 51%),
    /* 底噪星海:与桌面端同源噪声 PNG(单层=密度减半) */
    url("data:image/png;base64,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");
  background-size:
    100% 100%, 100% 100%, 100% 100%, 100% 100%,
    100% 100%, 100% 100%, 100% 100%,
    100% 100%, 100% 100%,
    100% 100%,
    700px 560px, 700px 560px, 700px 560px, 700px 560px,
    560px 480px, 560px 480px, 560px 480px, 840px 720px,
    560px 640px, 640px 720px, 480px 800px,
    480px 480px;
}

/* 2) 顶栏星带:深空底+星云+少量星点。顶栏 position:static→relative 建层叠上下文,
   ::before 承载星层,行内容 z-index:1 压其上。 */
html:not([data-theme="light"]) .topbar {
  position: relative;
  background-color: #05070d;
  background-image:
    radial-gradient(140px 60px at 24% -20%, rgba(59, 130, 246, .16), transparent 70%),
    radial-gradient(120px 55px at 82% 120%, rgba(96, 165, 250, .10), transparent 70%),
    radial-gradient(1px 1px at 34px 24px, rgba(202, 215, 255, .8) 50%, transparent 51%),
    radial-gradient(1px 1px at 160px 40px, rgba(170, 191, 255, .6) 50%, transparent 51%),
    radial-gradient(1px 1px at 230px 14px, rgba(240, 242, 255, .5) 50%, transparent 51%),
    radial-gradient(1.1px 1.1px at 100px 56px, rgba(255, 181, 108, .6) 50%, transparent 51%);
  background-size: 100% 100%, 100% 100%, 260px 64px, 340px 64px, 200px 64px, 420px 64px;
}
html:not([data-theme="light"]) .topbar-row,
html:not([data-theme="light"]) .topbar .status-strip { position: relative; z-index: 1; }

/* 2026-09-11 一屏到底批:底部导航星带已随导航整删 */

/* 4) 浅色主题:白昼无星空,顶栏/底栏恢复 surface */
html[data-theme="light"] body { background: var(--bg); }
html[data-theme="light"] .topbar { background: var(--surface); }
button { font-family: inherit; cursor: pointer; }
.hide { display: none !important; }

/* ===== 顶部状态条（TSP 暗色 surface 顶栏） ===== */
.topbar {
  position: static; z-index: 20; /* App 壳内钉死(原 sticky 依赖文档滚动,已废) */
  flex: none;
  padding: calc(var(--safe-t) + 8px) 0 0;
  background: var(--surface);
  border-bottom: 1px solid var(--line);
}
.topbar-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 0 12px; }
.topbar .brand { display: flex; align-items: center; gap: 8px; font-weight: 800; font-size: 15px; letter-spacing: 0.3px; color: var(--ink); }
.brand .dot {
  width: 10px; height: 10px; border-radius: 3px; display: inline-block;
  background: var(--teal);
  box-shadow: 0 0 8px rgba(59, 130, 246, 0.55);
}
.topbar .date { color: var(--muted); font-size: 12px; font-variant-numeric: tabular-nums; white-space: nowrap; flex: none; }
/* 2026-09-12 合并批:更新时间并入日期区(失败红/快照琥珀/正常灰) */
.topbar .date .fresh-at { font-weight: 400; font-variant-numeric: tabular-nums; }
.topbar .date .fresh-at.bad { color: var(--red); }
.topbar .date .fresh-at.stale { color: var(--amber); }
/* 品牌区不收缩——星脉+徽标整体保持一行,日期不被挤竖排 */
.topbar .brand { flex: none; }
.topbar .phase-badge {
  background: var(--teal-soft); color: var(--teal); border: 1px solid transparent;
}
/* 2026-09-10 阶段徽标分色(桌面 phase-badge 同款语义):绿=主升类/黄=分歧观望/红=退潮冰点 */
.topbar .phase-badge.ok { background: rgba(59, 130, 246, 0.13); color: var(--pos-ink); }
.topbar .phase-badge.warn { background: var(--amber-tint); color: var(--amber); }
.topbar .phase-badge.bad { background: var(--danger-tint); color: var(--red); }
/* 纯图标按钮:无框无底,与左侧 ☰ 对称;旋转动画转内层 .ic,见 app.js spinStart */
.topbar .refresh-btn {
  border: 0; background: none; color: var(--ink);
  width: 44px; height: 38px; font-size: 17px;
  transition: transform 0.1s var(--ease-out);
}
.topbar .refresh-btn:active { transform: scale(0.92); opacity: .7; }
@keyframes spin { to { transform: rotate(360deg); } }

/* 2026-09-12 打磨:4 chip 平分整行(原 9 chip 滚动布局退役)——overflow-x/滚动条隐藏规则删,chip 改弹性撑满+内容居中 */
.status-strip {
  display: flex; gap: 6px; margin: 8px -12px 0; padding: 0 12px 8px;
  background: var(--surface);
}
.chip {
  flex: 1 1 auto; background: var(--surface-2); border: 0;
  border-radius: var(--r-s); padding: 6px 10px; display: flex; flex-direction: column;
  align-items: center; text-align: center; min-width: 54px;
}
.chip span { color: var(--muted); font-size: 10px; }
.chip strong { font-size: 15px; font-variant-numeric: tabular-nums; }
.chip.sent { background: var(--data-soft); }
.chip.sent strong { color: var(--data-ink); }
.chip.risk-mid { background: var(--amber-tint); }
.chip.risk-mid strong { color: var(--amber); }

.phase-badge {
  display: inline-block; font-size: 11px; padding: 2px 9px; border-radius: var(--r-s);
  background: var(--teal-soft); color: var(--teal); font-weight: 700; margin-left: 6px;
}

/* 汉堡菜单 / 侧滑面板 */
/* 2026-09-11 减法批:汉堡/侧滑菜单(hamburger/menu-scrim/menu-panel/starTwinkle)整块删除——
   菜单唯一独占入口是交易与持仓,已随本批砍除;.ic 通用规则保留 */
.ic { display: inline-block; vertical-align: -2px; flex: none; }

/* ===== 主区域 ===== */
main {
  position: relative; /* PTR 绝对定位锚(2026-09-12 检查批) */
  flex: 1 1 auto;
  min-height: 0; /* 关键:flex 子项默认 min-height:auto 会撑爆壳,必须 0 才能让 overflow-y 生效 */
  overflow-y: auto;
  overflow-x: hidden; /* 2026-09-10:锁横向,整页不许左右跑(内容全 grid 无宽表,锁死无副作用) */
  overscroll-behavior-y: contain; /* 新滚动容器承接原 body 的防链/禁原生下拉语义 */
  -webkit-overflow-scrolling: touch;
  padding: 10px 10px calc(var(--safe-b) + 14px); /* 2026-09-11:导航已删 */
}
.view { display: none; }
.view.active { display: block; animation: viewin 0.18s var(--ease-out); }
@keyframes viewin {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: none; }
}

.sec-title { display: flex; align-items: baseline; justify-content: space-between; margin: 16px 2px 8px; }
.sec-title h2 { font-size: 15px; margin: 0; letter-spacing: 0.3px; }
.sec-title .hint { color: var(--muted); font-size: 11px; font-variant-numeric: tabular-nums; }

/* 工具栏（2026-09-10 减法批:.search/.seg/.subtab 已随涨停池搜索/排序/过滤控件删除,仅留复盘页在用的 .toolbar） */
.toolbar { display: flex; gap: 8px; margin: 8px 2px; }

/* ===== 股票卡片 ===== */
/* B2:content-visibility 下沉到卡片级——滚动容器(.list)永远部分在视口,声明在容器上无效;
   卡片级才让视口外的单卡跳过渲染(300+ 卡长列表滚动帧率) */
.list { display: flex; flex-direction: column; gap: 8px; }
.card {
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-m);
  padding: 10px 12px; display: flex; align-items: center; gap: 10px;
  box-shadow: var(--shadow-1);
  transition: transform 0.08s var(--ease-out);
  content-visibility: auto; contain-intrinsic-size: auto 74px;
}
.card:active { transform: scale(0.985); }
.card .name { font-weight: 700; font-size: 15px; }
.card .code { color: var(--muted); font-size: 11px; }
.card .sub { color: var(--muted); font-size: 11px; margin-top: 2px; }
.card .right { margin-left: auto; text-align: right; }
.card .price { font-weight: 800; font-size: 17px; font-variant-numeric: tabular-nums; }
.card .pct { font-size: 12px; font-variant-numeric: tabular-nums; }
.card .meta { color: var(--muted); font-size: 11px; text-align: right; margin-top: 2px; }
.up-c { color: var(--red); }
.down-c { color: var(--green); }
.flat-c { color: var(--muted); }
.boards-tag {
  flex: 0 0 auto; min-width: 34px; height: 34px; border-radius: var(--r-m);
  background: var(--teal-soft);
  color: var(--teal); font-weight: 800;
  display: flex; align-items: center; justify-content: center; font-size: 13px;
  font-variant-numeric: tabular-nums;
}
.boards-tag.b1 { background: var(--surface-2); color: var(--muted); }
.boards-tag.hi { background: var(--fill-red); color: #fff; }
.star { color: var(--amber); }

/* 折叠区 */
.fold { margin-top: 12px; border: 1px solid var(--line); border-radius: var(--r-m); overflow: hidden; background: var(--surface); box-shadow: var(--shadow-1); }
.fold > summary {
  list-style: none; padding: 11px 12px; font-weight: 700; display: flex; justify-content: space-between; align-items: center; cursor: pointer;
}
.fold > summary::-webkit-details-marker { display: none; }
.fold > summary::before { content: "▸"; color: var(--muted); font-size: 12px; margin-right: 8px; transition: transform 0.15s var(--ease-out); }
.fold[open] > summary::before { transform: rotate(90deg); }
.fold > summary .fold-title { flex: 1; }
.fold[open] > :not(summary) { animation: viewin 0.18s ease-out; } /* 展开内容淡入,代替原生 details 硬跳 */
.fold .body { padding: 0 12px 10px; }

/* 梯队 */
/* 2026-09-11 拆解融合批:纵向 bar-row 随梯队独立 section 删——改横向板位条(涨停池头部) */
.lad-strip { display: flex; gap: 6px; overflow-x: auto; padding: 2px 0 8px; scrollbar-width: none; }
.lad-strip::-webkit-scrollbar { display: none; }
.lad-cell {
  flex: 0 0 auto; display: flex; flex-direction: column; align-items: center; gap: 1px;
  min-width: 52px; padding: 6px 8px; border: 1px solid var(--line); border-radius: var(--r-s);
  background: var(--surface); color: inherit; font-family: inherit; cursor: pointer;
  transition: transform 0.08s var(--ease-out), border-color 0.15s var(--ease-out);
}
.lad-cell b { font-size: 11px; color: var(--muted); font-weight: 700; }
.lad-cell span { font-size: 15px; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--data-ink); }
.lad-cell:active { transform: scale(0.94); border-color: var(--teal); }
.card.flash { animation: ladFlash 1.2s ease-out; }
@keyframes ladFlash { 0%, 40% { border-color: var(--teal); box-shadow: 0 0 0 3px var(--teal-soft); } 100% { box-shadow: none; } }
/* 雷达顶操作风格行(驾驶舱 advice 落位) */
.radar-style { display: flex; align-items: baseline; gap: 8px; margin-bottom: 10px; padding: 8px 10px; background: var(--surface-2); border-radius: var(--r-s); }
.radar-style span { color: var(--muted); font-size: 11px; }
.radar-style b { font-size: 13px; color: var(--teal); }
/* 横幅涨/跌/炸三合一 chip */
.chip.triple strong { display: flex; align-items: baseline; gap: 1px; }
.chip.triple strong b { font-size: 15px; font-variant-numeric: tabular-nums; }
/* 2026-09-12 检查批:.chip.up/.down/.broken/.risk-high 四组色类已删(9-chip 时代孤儿,现存=.sent/.risk-mid/.triple) */
.chip.triple strong b.down-c { color: var(--green); }
.chip.triple strong b.up-c { color: var(--red); }
.chip.chip-emo { cursor: pointer; }
.chip.chip-emo strong::after { content: ''; }

/* 题材排行 */
.rank-row { display: flex; align-items: center; gap: 10px; padding: 9px 2px; border-bottom: 1px solid var(--line-soft); }
.rank-row:last-child { border-bottom: 0; }
.rank-row .idx { width: 20px; color: var(--muted); font-size: 13px; font-variant-numeric: tabular-nums; }
.rank-row .nm { font-weight: 600; }
.rank-row .cnt { margin-left: auto; color: var(--data-ink); font-weight: 700; font-variant-numeric: tabular-nums; }
.rank-row .chg { min-width: 38px; text-align: right; font-weight: 700; font-size: 12px; font-variant-numeric: tabular-nums; }

/* 空状态 / 加载 */
.empty { text-align: center; color: var(--muted); padding: 30px 14px; font-size: 13px; line-height: 1.7; }
/* TSP §6.0.5 空状态：图示 + 文案引导 */
.empty::before { content: ''; display: block; width: 36px; height: 36px; margin: 0 auto 10px; opacity: .8; background: no-repeat center / contain url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23a9a9b4' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 7h16v13H4z'/%3E%3Cpath d='M4 7l2-3h12l2 3'/%3E%3Cpath d='M4 12h5a3 3 0 0 0 6 0h5'/%3E%3C/svg%3E"); }
.all-empty { display: grid; min-height: 140px; place-items: center; color: var(--muted); font-size: 13px; text-align: center; padding: 0 12px; }

/* TSP 遮罩毛玻璃：抽屉/底部弹层打开时背景轻微虚化 */
.scrim { backdrop-filter: blur(2px); } /* 2026-09-11:menu-scrim 选择器已随菜单删 */

/* 板块徽章（创/科/北 · TSP stock-table 同款：彩字 + 12% 底 + 25% 描边，两主题通用） */
.btag { display: inline-block; padding: 0 4px; border-radius: 3px; font-size: 10px; font-weight: 700; font-style: normal; line-height: 13px; vertical-align: 1px; }
.btag-cy { color: #fb923c; background: rgba(249, 115, 22, 0.12); border: 1px solid rgba(249, 115, 22, 0.25); }
.btag-kc { color: #22d3ee; background: rgba(34, 211, 238, 0.12); border: 1px solid rgba(34, 211, 238, 0.25); }
.btag-bj { color: #c084fc; background: rgba(192, 132, 252, 0.12); border: 1px solid rgba(192, 132, 252, 0.25); }
/* 浅色变体：亮底彩字加深保对比（同桌面 2026-09-07 补齐） */
html[data-theme="light"] .btag-cy { color: #c2600d; background: rgba(194, 96, 13, 0.10); border-color: rgba(194, 96, 13, 0.28); }
html[data-theme="light"] .btag-kc { color: #0e7490; background: rgba(14, 116, 144, 0.10); border-color: rgba(14, 116, 144, 0.28); }
html[data-theme="light"] .btag-bj { color: #7c3aed; background: rgba(124, 58, 237, 0.10); border-color: rgba(124, 58, 237, 0.28); }
.muted { color: var(--muted); font-size: 12px; }

/* 骨架屏（首屏加载占位） */
.sk-card {
  background: var(--surface); border: 0; border-radius: var(--r-m);
  padding: 12px; display: flex; gap: 10px; align-items: center;
}
.sk { display: block; height: 12px; border-radius: 6px; background: var(--surface-2); position: relative; overflow: hidden; }
.sk::after {
  content: ''; position: absolute; inset: 0; transform: translateX(-100%);
  background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.06), transparent);
  animation: shimmer 1.3s infinite;
}
@keyframes shimmer { to { transform: translateX(100%); } }
.sq { width: 34px; height: 34px; border-radius: 10px; flex: 0 0 auto; }
.sk-lines { flex: 1; display: flex; flex-direction: column; gap: 7px; }
.sk-col { display: flex; flex-direction: column; gap: 7px; align-items: flex-end; }
.w24 { width: 24%; } .w28 { width: 28%; } .w32 { width: 32%; } .w36 { width: 36%; }
.w40 { width: 40%; } .w44 { width: 44%; } .w48 { width: 48%; } .w56 { width: 56%; } .w60 { width: 60%; }

/* 2026-09-11 一屏到底批:底部导航整块删除——单视图 app,main 直达底 */
  flex: 1; border: 0; background: transparent; color: var(--muted);
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px;
  font-size: 11px; border-radius: var(--r-m);
  transition: background 0.15s var(--ease-out), color 0.15s var(--ease-out);
}

/* ===== 详情底部抽屉 ===== */
.scrim {
  position: fixed; inset: 0; background: rgba(0, 0, 0, 0.55); z-index: 40; opacity: 0;
  pointer-events: none; transition: opacity 0.2s var(--ease-out);
}
.scrim.show { opacity: 1; pointer-events: auto; }
.sheet {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 41;
  background: var(--surface); border-top-left-radius: var(--r-l); border-top-right-radius: var(--r-l);
  box-shadow: var(--shadow-2);
  padding: 8px 16px calc(20px + var(--safe-b)); transform: translateY(100%);
  transition: transform 0.28s var(--ease-out); max-height: 82vh; overflow-y: auto; overscroll-behavior: contain;
}
.sheet.show { transform: translateY(0); }
.sheet .grip { width: 48px; height: 5px; background: var(--line); border-radius: 999px; margin: 6px auto 10px; }
/* 2026-09-11 拖拽热区禁原生滚动:从 grip/头部下拉只动抽屉,不再与内容滚动双位移 */
.sheet .grip, .sheet .s-head { touch-action: none; }
.sheet .s-head { display: flex; align-items: baseline; gap: 8px; }
.sheet .s-name { font-size: 20px; font-weight: 800; }
.sheet .s-code { color: var(--muted); font-size: 12px; }
.sheet .s-price { margin-left: auto; text-align: right; }
.sheet .s-price b { font-size: 21px; font-variant-numeric: tabular-nums; }
.sheet .s-price small { display: block; color: var(--muted); font-size: 11px; }
.kv-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; margin-top: 14px; }
.kv { background: var(--surface-2); border-radius: 10px; padding: 8px 10px; }
.kv span { color: var(--muted); font-size: 11px; display: block; }
.kv strong { font-size: 15px; font-variant-numeric: tabular-nums; }
.s-actions { display: flex; gap: 10px; margin-top: 16px; }
.btn {
  flex: 1; border: 0; background: var(--surface-2); color: var(--ink);
  border-radius: 10px; height: 42px; font-size: 14px; font-weight: 700;
  transition: transform 0.08s var(--ease-out), filter 0.15s var(--ease-out);
}
.btn:active { transform: scale(0.97); filter: brightness(0.92); }
.btn.primary {
  background: var(--fill-teal);
  color: #fff;
  box-shadow: 0 3px 10px var(--teal-soft);
}

/* 2026-09-11 一屏到底批:设置页 CSS(.set-row/.about)已整删 */

/* 下拉刷新(2026-09-12 检查批重写:绝对定位在 main 顶部——PTR 仅在 scrollTop=0 时出现,
   absolute top:0 恒等于可视顶部;隐藏态 opacity:0+pointer-events:none 双保险。
   上一版负 margin+translateY(-100%) 想「藏进 header 底下」但 header 无层叠上下文,
   z-index:6 的隐藏态盖住状态条并拦截点击——移入 main 后此几何不可能再发生) */
.ptr {
  position: absolute; top: 0; left: 0; right: 0; height: 40px; z-index: 6;
  background: var(--surface-2);
  border-radius: 0 0 var(--r-m) var(--r-m); box-shadow: var(--shadow-1);
  text-align: center; color: var(--teal); font-size: 12px;
  display: flex; align-items: center; justify-content: center; gap: 6px;
  transform: translateY(-40px); opacity: 0; pointer-events: none;
  transition: transform 0.2s var(--ease-out), opacity 0.2s var(--ease-out);
}
.ptr.show { transform: translateY(0); opacity: 1; }
.ptr .spin { display: inline-block; animation: spin 0.8s linear infinite; }

/* toast */
.toast {
  position: fixed; left: 50%; bottom: calc(var(--safe-b) + 16px);
  transform: translateX(-50%) translateY(20px); z-index: 50;
  background: rgba(24, 24, 27, 0.94); color: #fff; padding: 9px 16px; border-radius: var(--r-m);
  font-size: 13px; opacity: 0; transition: opacity 0.25s var(--ease-out), transform 0.25s var(--ease-out); pointer-events: none; max-width: 86vw; text-align: center;
}
.toast.show { opacity: 1; transform: translateX(-50%) translateY(0); }

.banner {
  background: var(--teal-soft); color: var(--teal);
  border-radius: 10px; padding: 8px 12px; font-size: 12px; margin: 2px 2px 0;
}

/* ===== 情绪指标明细(2026-09-11 拆解融合批:驾驶舱 hero 已删,本组样式由情绪 chip 点开的 sheet 续用) ===== */
.emo-indicators { display: grid; grid-template-columns: repeat(2, 1fr); gap: 6px; margin-top: 12px; }
.ind {
  background: var(--surface); border: 1px solid var(--line-soft); border-radius: 9px; padding: 7px 9px;
  display: flex; align-items: center; gap: 8px;
}
.ind .dot { width: 8px; height: 8px; border-radius: 50%; flex: 0 0 auto; }
.ind.green .dot { background: var(--green); box-shadow: 0 0 6px var(--down-tint); }
.ind.yellow .dot { background: var(--amber); }
.ind.red .dot { background: var(--red); animation: pulse 1.4s ease-in-out infinite; }
.ind.unavailable .dot { background: var(--muted); opacity: 0.4; }
.ind .k { color: var(--muted); font-size: 11px; }
.ind .v { margin-left: auto; font-weight: 700; font-variant-numeric: tabular-nums; }
@keyframes pulse { 50% { opacity: 0.45; } }
.emo-reasons { margin-top: 10px; font-size: 12px; color: var(--muted); }
.emo-reasons span { display: inline-block; background: var(--surface-2); border-radius: 6px; padding: 2px 8px; margin: 3px 4px 0 0; }

/* ===== 评级 / 信号 ===== */
.tier-badge {
  display: inline-flex; align-items: center; justify-content: center; min-width: 22px; height: 22px; padding: 0 6px;
  border-radius: 7px; font-weight: 800; font-size: 12px; flex: 0 0 auto;
}
/* TSP 色彩纪律：梯队徽章彩字+透明底（替代实底白字），浅色变体加深文字 */
.tier-badge.S { color: #f04438; background: rgba(240, 68, 56, 0.13); border: 1px solid rgba(240, 68, 56, 0.28); }
.tier-badge.A { color: #f59e0b; background: rgba(245, 158, 11, 0.13); border: 1px solid rgba(245, 158, 11, 0.28); }
.tier-badge.B { color: #3b82f6; background: rgba(59, 130, 246, 0.13); border: 1px solid rgba(59, 130, 246, 0.28); }
.tier-badge.淘汰 { background: var(--surface-2); color: var(--muted); }
html[data-theme="light"] .tier-badge.S { color: #d32027; }
html[data-theme="light"] .tier-badge.A { color: #b45309; }
html[data-theme="light"] .tier-badge.B { color: #2563eb; }
/* 市场行方向色迁移到涨幅（价格保持中性——颜色=信号，TSP 纪律） */
.market-row .amt.up-c { color: var(--red); }
.market-row .amt.down-c { color: var(--green); }
.signal-tag { font-size: 11px; font-weight: 700; padding: 2px 7px; border-radius: var(--r-s); flex: 0 0 auto; }
.signal-tag.可打 { background: var(--down-tint); color: var(--green); }
.signal-tag.待触发 { background: var(--amber-tint); color: var(--amber); }
.signal-tag.观察 { background: var(--surface-2); color: var(--muted); }
.signal-tag.禁打 { background: var(--danger-tint); color: var(--red); }

/* ===== 机会分层 ===== */
.tier-block { margin: 12px 0; }
.tier-head { display: flex; align-items: center; gap: 8px; margin: 8px 2px; }
.tier-head .t { font-size: 15px; font-weight: 800; }
.tier-head .c { color: var(--muted); font-size: 12px; }
.opp-card {
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-m);
  padding: 10px 12px; margin-bottom: 8px; box-shadow: var(--shadow-1); transition: transform 0.08s var(--ease-out);
  content-visibility: auto; contain-intrinsic-size: auto 74px; /* 2026-09-11 修下拉卡顿:与 .card 同款,屏外卡免布局 */
}
.opp-card:active { transform: scale(0.985); }
.opp-card .row1 { display: flex; align-items: center; gap: 8px; }
.opp-card .nm { font-weight: 700; font-size: 15px; }
.opp-card .row1 .right { margin-left: auto; display: flex; align-items: center; gap: 6px; }
.opp-card .score { font-weight: 800; font-size: 15px; font-variant-numeric: tabular-nums; color: var(--data-ink); } /* 2026-09-10 对齐桌面:评分=数据紫 */
.opp-card .sub { color: var(--muted); font-size: 11px; margin-top: 2px; }
.opp-card .reasons { margin-top: 6px; display: flex; flex-wrap: wrap; gap: 4px; }
.opp-card .reasons .plus { color: var(--pos-ink); } /* 2026-09-10:绿→青碧,利多项避开A股跌绿雷区(与桌面统一) */
.opp-card .reasons .minus { color: var(--red); }
.opp-card .reasons span { font-size: 11px; }

/* 预案 / 风险雷达 / 报告类卡片 */
.risk-card, .report-card, .review-card, .leader-card, .market-row, .tree-branch {
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-m);
  padding: 12px; margin: 8px 0; box-shadow: var(--shadow-1);
}
.leader-card, .market-row, .review-card { transition: transform 0.08s var(--ease-out); }
.leader-card:active, .market-row:active, .review-card:active { transform: scale(0.985); }
.plan-verdict { font-weight: 800; font-size: 15px; margin-bottom: 6px; }
.plan-rules { list-style: none; padding: 0; margin: 0; }
.plan-rules li { font-size: 12px; color: var(--muted); padding: 3px 0; border-bottom: 1px dashed var(--line-soft); }
.plan-rules li:last-child { border-bottom: 0; }

.risk-item { padding: 8px 0; border-bottom: 1px dashed var(--line-soft); }
.risk-item:last-child { border-bottom: 0; }
.risk-item .top { display: flex; align-items: center; gap: 8px; }
.risk-item .lab { font-weight: 700; }
.risk-item .lv { font-size: 11px; padding: 1px 7px; border-radius: var(--r-s); font-variant-numeric: tabular-nums; }
.risk-item .lv.red { background: var(--danger-tint); color: var(--red); }
.risk-item .lv.orange { background: var(--amber-tint); color: var(--amber); }
.risk-item .lv.yellow { background: var(--amber-tint); color: var(--amber); }
.risk-item .lv.green { background: var(--down-tint); color: var(--green); }
.risk-item .lv.gray { background: var(--surface-2); color: var(--muted); }
.risk-item .score { margin-left: auto; font-weight: 800; font-variant-numeric: tabular-nums; }
.risk-item .action { font-size: 12px; color: var(--muted); margin-top: 3px; }
.risk-item .reasons { font-size: 11px; color: var(--muted); margin-top: 2px; }
.stars { letter-spacing: 1px; color: var(--amber); }
.cannot-do { margin-top: 10px; }
.cannot-do .ci { display: inline-block; background: var(--danger-tint); color: var(--red); border-radius: 6px; padding: 3px 8px; margin: 3px 4px 0 0; font-size: 12px; }

/* 结构树 */
.tree-main { border-left: 3px solid var(--red); }
.tree-branch { border-left: 3px solid var(--data-ink); }
.tree-head { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.tree-head .tn { font-weight: 800; font-size: 15px; }
.tree-head .ts { color: var(--muted); font-size: 12px; }
.tree-members { margin-top: 6px; display: flex; flex-direction: column; gap: 4px; }
.tree-members .m { display: flex; gap: 8px; font-size: 13px; padding: 3px 0; }
.tree-members .m .b { color: var(--data-ink); font-weight: 700; min-width: 30px; font-variant-numeric: tabular-nums; }
.tree-members .m .r { color: var(--muted); font-size: 11px; margin-left: auto; font-variant-numeric: tabular-nums; }

/* 龙头卡 */
.leader-card .row1 { display: flex; align-items: center; gap: 8px; }
.leader-card .nm { font-weight: 700; font-size: 15px; }
.leader-card .role { font-size: 11px; color: var(--amber); }
.leader-card .right { margin-left: auto; text-align: right; }
.leader-card .sc { font-weight: 800; font-variant-numeric: tabular-nums; color: var(--data-ink); } /* 2026-09-10 分数=数据紫(角色系统) */
.leader-card .sub .bd-tag { display: inline-block; margin-right: 4px; color: var(--data-ink); font-weight: 800; }
.leader-card .sub { color: var(--muted); font-size: 11px; margin-top: 2px; }
.leader-card .bd { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px; }
.leader-card .bd span { font-size: 10px; color: var(--data-ink); background: var(--data-soft); border-radius: 5px; padding: 1px 6px; } /* 2026-09-10 归因条=紫底紫字 */

/* ===== 交易 / 复盘 ===== */
.ledger-row { display: flex; align-items: center; gap: 8px; padding: 9px 0; border-bottom: 1px solid var(--line-soft); }
.ledger-row:last-child { border-bottom: 0; }
.ledger-row .nm { font-weight: 700; }
.ledger-row .meta { color: var(--muted); font-size: 11px; }
.ledger-row .pnl { margin-left: auto; font-weight: 800; font-variant-numeric: tabular-nums; }
.trade-del { color: var(--red); font-size: 12px; background: none; border: 0; padding: 10px 8px; transition: transform 0.08s var(--ease-out); }
.trade-del:active { transform: scale(0.9); }

.pill {
  display: inline-block; font-size: 10px; padding: 1px 6px; border-radius: 6px;
  background: var(--surface-2); color: var(--muted); margin-left: 4px;
}
.report-section { margin: 6px 0; }
.report-section b { font-size: 12px; color: var(--muted); }
.report-section div { margin-top: 3px; }
.report-section span { display: inline-block; background: var(--surface-2); border-radius: 6px; padding: 2px 8px; margin: 3px 4px 0 0; font-size: 12px; }
.report-head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin-bottom: 6px; }
.report-head span { color: var(--muted); font-size: 11px; }
.copilot-card { margin: 8px 0; }
.copilot-questions { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0; }
.copilot-question {
  border: 0; background: var(--surface-2); color: var(--ink);
  border-radius: var(--r-s); padding: 10px 13px; font-size: 12px;
  transition: background 0.15s var(--ease-out), transform 0.08s var(--ease-out);
}
.copilot-question.on { background: var(--fill-teal); color: #fff; }
.copilot-question:active { transform: scale(0.94); }
.copilot-verdict { font-size: 14px; margin: 4px 0; }
.copilot-input-row { display: flex; gap: 8px; margin: 8px 0; }
.copilot-input-row input { flex: 1; min-width: 0; background: var(--surface-2); color: var(--ink); border: 1px solid var(--line); border-radius: 9px; padding: 10px 12px; font-size: 13px; font-family: inherit; transition: border-color 0.15s var(--ease-out); }
.copilot-input-row input::placeholder { color: var(--muted); }
.copilot-input-row input:focus { outline: none; border-color: var(--teal); }
.copilot-input-row .btn { flex: 0 0 auto; padding: 0 16px; height: 40px; }
.all-empty { display: grid; min-height: 140px; place-items: center; color: var(--muted); font-size: 13px; text-align: center; padding: 0 12px; }
.review-card .rv-head { display: flex; align-items: baseline; justify-content: space-between; }
.review-card .rv-body { font-size: 12px; color: var(--muted); margin-top: 6px; white-space: pre-wrap; }
.review-card .rv-body.note { color: var(--ink); font-size: 13px; }

/* 全市场 */
.market-row { display: flex; align-items: center; gap: 8px; padding: 9px 12px; margin-bottom: 6px; content-visibility: auto; contain-intrinsic-size: auto 54px; }
.market-row .nm { font-weight: 700; font-size: 14px; }
.market-row .code { color: var(--muted); font-size: 11px; }
.market-row .right { margin-left: auto; text-align: right; }
.market-row .price { font-weight: 800; font-size: 15px; font-variant-numeric: tabular-nums; }
.market-row .amt { color: var(--muted); font-size: 11px; font-variant-numeric: tabular-nums; }
.pager { display: flex; align-items: center; justify-content: center; gap: 14px; margin: 10px 0; }
.pager button {
  border: 0; background: var(--surface-2); color: var(--ink);
  border-radius: var(--r-s); padding: 10px 16px; transition: transform 0.08s var(--ease-out), background 0.15s var(--ease-out);
}
.pager button:active { transform: scale(0.94); }
.pager .pg { color: var(--muted); font-size: 12px; font-variant-numeric: tabular-nums; }

/* 详情抽屉内增强 */
.s-signal { margin-top: 8px; }
.s-signal .st { font-weight: 800; font-size: 15px; }

/* 键盘聚焦可见性（触屏无影响，键盘/读屏用户可达） */
:focus-visible { outline: 2px solid var(--teal); outline-offset: 2px; }

/* ===== 交易体系规则引擎：晋级徽标 / 八维检查表 ===== */
.promo-badge { display: inline-block; padding: 2px 7px; border-radius: var(--r-s); font-size: 10px; font-weight: 800; line-height: 1.4; vertical-align: middle; }
.promo-badge.pass { background: var(--down-tint); color: var(--green); }
.promo-badge.warn { background: var(--amber-tint); color: var(--amber); }
.promo-badge.fail { background: var(--danger-tint); color: var(--red); }
/* 2026-09-12 折叠版批:抽屉两层——结论行(10秒层) + 检查表/竞价/相似/明细折叠组;
   评分构成条 CSS 已随砍(bd-*) */
.s-verdict { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 10px; padding: 8px 10px; background: var(--surface-2); border-radius: var(--r-m); }
.s-verdict .sv-line b { font-size: 14px; }
.s-verdict .sv-fail { flex-basis: 100%; color: var(--red); font-size: 12px; font-weight: 700; }
.s-verdict .sp-verdict { margin-bottom: 0; }
#sheetKvEss .kv-grid { margin-top: 10px; }
.s-promo { margin: 0; }
.sp-verdict { display: flex; align-items: baseline; gap: 8px; font-size: 14px; margin-bottom: 6px; }
.sp-verdict.verdict-pass b { color: var(--green); }
.sp-verdict.verdict-warn b { color: var(--amber); }
.sp-verdict.verdict-fail b { color: var(--red); }
.sp-verdict span { color: var(--muted); font-size: 11px; }
.promo-row { display: flex; gap: 8px; align-items: baseline; padding: 6px 0; border-bottom: 1px dashed var(--line-soft); font-size: 12px; }
.promo-row:last-of-type { border-bottom: 0; }
.promo-row i { flex: 0 0 auto; width: 17px; height: 17px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-style: normal; font-size: 10px; font-weight: 800; }
.promo-row.status-pass i { background: var(--down-tint); color: var(--green); }
.promo-row.status-warn i { background: var(--amber-tint); color: var(--amber); }
.promo-row.status-fail i { background: var(--danger-tint); color: var(--red); }
.promo-row.status-na i { background: var(--surface-2); color: var(--muted); }
.promo-row .k { flex: 0 0 58px; font-weight: 700; }
.promo-row em { font-style: normal; color: var(--muted); }

/* 决策助手三层输出（事实 / 推断 / 建议） */
.copilot-layer { margin: 8px 0; border-left: 3px solid var(--line); padding: 4px 10px; }
.copilot-layer .cl-label { font-size: 11px; font-weight: 800; color: var(--muted); letter-spacing: 0.04em; }
.copilot-layer .cl-body { margin-top: 3px; font-size: 13px; line-height: 1.5; }
.copilot-layer .cl-body span { display: inline-block; background: var(--surface-2); border-radius: 6px; padding: 2px 8px; margin: 3px 4px 0 0; font-size: 12px; }
.copilot-layer.fact { border-left-color: var(--data-ink); }
.copilot-layer.infer { border-left-color: var(--amber); }
.copilot-layer.advise { border-left-color: var(--green); }

/* 详情抽屉：个股相似案例（对齐桌面 G24） */
.s-similar { margin-top: 12px; border-top: 1px dashed var(--line); padding-top: 10px; }
/* 2026-09-13 精简批:相似案例只留「后续表现」一行;sim-card/sf-* 等研究卡样式已随砍 */
.sim-outcome { display: flex; align-items: baseline; gap: 8px; font-size: 13px; flex-wrap: wrap; }
.sim-outcome span { color: var(--muted); font-size: 12px; }
.sim-outcome b { font-variant-numeric: tabular-nums; font-weight: 800; }

/* 2026-09-13 精简批:抽屉竞价区样式已整删(卡片竞价行 .card .auc 保留) */

/* 涨停池卡片：竞价行 */
.card .auc { font-size: 11px; color: var(--muted); margin-top: 2px; }
.card .auc b { font-weight: 700; font-variant-numeric: tabular-nums; }
.card .auc em { font-style: normal; font-size: 10px; margin-left: 3px; }

/* ===== TSP 等宽数字：核心数值走 mono 栈（CJK 回落主栈） ===== */
.chip strong, .card .price, .card .pct, .market-row .price, .sheet .s-price b,
.emo-index, .opp-card .score, .leader-card .sc, .stat .v, .kv strong, .card .auc b {
  font-family: var(--font-mono);
}

/* ===== 减弱动态效果：系统开启时关闭全部动画/过渡 ===== */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}

/* ===== 边跳按钮（直达顶部/底部；离边超 500px 才现身，全用主题 token 双态自动适配） ===== */
/* 容器 pointer-events:none(否则按钮隐藏时 40×88px 固定区整块吞点击,右下角卡片/PTR 触点死区);按钮 visibility 移出无障碍树与焦点序(opacity 不够,TalkBack 会激活隐形按钮) */
.edge-jump { position: fixed; right: 12px; bottom: calc(var(--safe-b) + 16px); z-index: 29; display: flex; flex-direction: column; gap: 8px; pointer-events: none; }
.edge-btn {
  width: 40px; height: 40px; border-radius: 50%; border: 1px solid var(--line);
  background: var(--surface-raised); color: var(--muted);
  display: flex; align-items: center; justify-content: center;
  box-shadow: var(--shadow-1);
  opacity: 0; visibility: hidden; transform: translateY(6px); pointer-events: none;
  transition: opacity 0.18s var(--ease-out), transform 0.18s var(--ease-out), color 0.15s var(--ease-out), visibility 0s 0.18s;
}
.edge-btn.show { opacity: 1; visibility: visible; transform: none; pointer-events: auto; transition-delay: 0s; }
.edge-btn:active { transform: scale(0.92); }
