:root {
    --bg: #0d1117; --card: #161b22; --elev: #1c2230; --border: #2a3140;
    --t1: #e6edf3; --t2: #9aa6b2; --t3: #6b7684;
    --up: #ef4444; --down: #16a34a; --accent: #e84c3d; --warn: #f59e0b; --good: #22c55e;
  }
  * { box-sizing: border-box; }
  body { margin: 0; background: var(--bg); color: var(--t1);
    font-family: -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif; }
  .wrap { max-width: 1600px; margin: 0 auto; padding: 16px; }
  header { display: flex; align-items: baseline; gap: 12px; margin-bottom: 14px; }
  header h1 { font-size: 20px; margin: 0; }
  header .sub { color: var(--t3); font-size: 12px; }
  .tabs { display: flex; gap: 8px; margin-bottom: 14px; flex-wrap: wrap; }
  .tab { padding: 7px 14px; border-radius: 8px; border: 1px solid var(--border);
    background: var(--card); color: var(--t2); cursor: pointer; font-size: 14px; }
  .tab.on { background: var(--elev); color: var(--t1); border-color: var(--accent); }
  .tab .code { color: var(--t3); font-size: 11px; margin-left: 6px; }
  .grid { display: grid; grid-template-columns: 1fr 380px; gap: 14px; }
  @media (max-width: 900px) { .grid { grid-template-columns: 1fr; } }
  .card { background: var(--card); border: 1px solid var(--border); border-radius: 12px; padding: 14px; }
  .card h3 { margin: 0 0 10px; font-size: 14px; color: var(--t2); font-weight: 600; }
  .ctrls { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin-bottom: 10px;
    font-size: 13px; color: var(--t2); }
  .ctrls label { display: flex; align-items: center; gap: 7px; }
  .ctrls input[type=range] { width: 130px; accent-color: var(--accent); }
  .ctrls .val { color: var(--accent); font-weight: 600; min-width: 28px; }
  .ctrls input[type=number] { width: 52px; background: var(--elev); border: 1px solid var(--border);
    color: var(--t1); border-radius: 6px; padding: 3px 6px; }
  .chart-box { width: 100%; height: 440px; }
  .legend { display: flex; gap: 14px; font-size: 12px; color: var(--t3); margin-top: 8px; flex-wrap: wrap; }
  .legend i { display: inline-block; width: 14px; height: 3px; vertical-align: middle; margin-right: 4px; border-radius: 2px; }
  .badge { display: inline-block; padding: 2px 10px; border-radius: 999px; font-size: 13px; font-weight: 700; }
  .badge.long { background: rgba(239,68,68,.15); color: #ff7a6b; }
  .badge.short { background: rgba(22,163,74,.15); color: #4ade80; }
  .badge.wait { background: rgba(148,163,184,.15); color: #cbd5e1; }
  button.gen { background: var(--accent); color: #fff; border: 0; border-radius: 8px;
    padding: 8px 14px; font-size: 13px; cursor: pointer; }
  button.gen:disabled { opacity: .5; cursor: default; }
  .copy-btn { background: var(--elev); border: 1px solid var(--border); color: var(--t2);
    border-radius: 8px; padding: 7px 12px; font-size: 12px; cursor: pointer;
    font-family: inherit; font-weight: 600; transition: all .15s; }
  .copy-btn:hover { border-color: var(--accent); color: var(--t1); }
  .copy-btn.ok { background: rgba(34,197,94,.15); border-color: rgba(34,197,94,.4); color: #86efac; }
  .copy-btn.err { background: rgba(239,68,68,.18); border-color: rgba(239,68,68,.4); color: #ff7a6b; }
  .report { font-size: 13.5px; line-height: 1.7; color: var(--t1); max-height: 520px; overflow-y: auto; }
  .report h2 { font-size: 15px; color: var(--accent); margin: 16px 0 6px; border-bottom: 1px solid var(--border); padding-bottom: 4px; }
  .report ul { padding-left: 18px; margin: 6px 0; }
  .report p { margin: 6px 0; }
  .report strong { color: #ffd; }
  .muted { color: var(--t3); font-size: 12px; }
  .err { color: var(--up); font-size: 13px; }

  /* ── 研报 v2 · chip 系统 ── */
  .chip { display: inline-block; padding: 2px 8px; border-radius: 999px; font-size: 11px;
    font-weight: 600; line-height: 1.4; }
  .chip.usable-no { background: rgba(239,68,68,.2); color: #ff7a6b; }
  .chip.stock-type { background: rgba(99,102,241,.18); color: #a5b4fc; }
  .chip.status-tracking { background: rgba(99,102,241,.18); color: #a5b4fc; }
  .chip.status-challenged { background: rgba(245,158,11,.22); color: #fbbf24; }
  .chip.status-confirmed { background: rgba(34,197,94,.18); color: #86efac; }
  .chip.status-invalidated, .chip.status-superseded, .chip.status-not_evaluable {
    background: rgba(148,163,184,.18); color: #cbd5e1; }
  .chip.logic-fundamental { background: rgba(34,197,94,.15); color: #86efac; }
  .chip.logic-mixed { background: rgba(245,158,11,.18); color: #fbbf24; }
  .chip.logic-narrative { background: rgba(239,68,68,.18); color: #ff7a6b; }
  .chip.vmode-value { background: rgba(34,197,94,.15); color: #86efac; }
  .chip.vmode-expectations { background: rgba(245,158,11,.2); color: #fbbf24; }
  .chip.vmode-mixed { background: rgba(148,163,184,.18); color: #cbd5e1; }
  .chip.audit-pass { background: rgba(34,197,94,.15); color: #86efac; cursor: pointer; }
  .chip.audit-fail { background: rgba(239,68,68,.22); color: #ff7a6b; cursor: pointer; }

  .section h4 { margin: 0 0 8px; font-size: 11.5px; color: var(--accent);
    font-weight: 700; letter-spacing: .5px; text-transform: uppercase; }
  .kv { display: grid; grid-template-columns: 110px 1fr; gap: 4px 12px;
    font-size: 12.5px; margin: 0; }
  .kv dt { color: var(--t3); }
  .kv dd { margin: 0; color: var(--t1); line-height: 1.5; }
  .thesis { font-size: 14.5px; line-height: 1.6; color: #ffe9c2; padding: 10px 12px;
    background: var(--elev); border-left: 3px solid var(--accent); border-radius: 6px;
    margin: 0; }
  .variant { font-size: 13px; line-height: 1.6; color: var(--t1); padding: 10px 12px;
    background: rgba(99,102,241,.10); border-left: 3px solid #818cf8; border-radius: 6px; }
  .variant .vk { display: block; font-size: 11px; font-weight: 700; color: #a5b4fc;
    margin-bottom: 4px; letter-spacing: .04em; }
  .price-check { font-size: 12px; color: var(--t3); padding: 6px 10px; background: var(--elev);
    border-radius: 6px; line-height: 1.5; }
  .price-check.bad { color: #fbbf24; background: rgba(245,158,11,.12); }

  .scenarios { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px; }
  @media (max-width: 640px) { .scenarios { grid-template-columns: 1fr; } }
  /* 右下研报卡展开区宽度有限，三情景改单列（container query 按 mr-full 宽度触发） */
  .mr-full { container-type: inline-size; container-name: mrfull; }
  @container mrfull (max-width: 520px) {
    .scenarios { grid-template-columns: 1fr; }
  }
  .sc { background: var(--elev); border: 1px solid var(--border); border-radius: 8px;
    padding: 10px 12px; position: relative; }
  .sc.opt { border-top: 3px solid var(--up); }
  .sc.neu { border-top: 3px solid var(--t2); }
  .sc.pes { border-top: 3px solid var(--down); }
  .sc .head { display: flex; justify-content: space-between; align-items: baseline; }
  .sc .name { font-size: 13.5px; font-weight: 700; color: var(--t1); }
  .sc .prob { color: var(--accent); font-weight: 700; font-size: 16px; }
  .sc .formula { color: var(--t2); font-size: 11.5px; margin: 6px 0 8px;
    font-family: ui-monospace, "SF Mono", Menlo, monospace; }
  .sc .price { font-size: 14.5px; font-weight: 700; color: #ffd; padding: 6px 0;
    border-top: 1px dashed var(--border); border-bottom: 1px dashed var(--border); }
  .sc .cond { color: var(--t2); font-size: 11.5px; line-height: 1.45; margin-top: 8px; }

  .risks { list-style: none; padding: 0; margin: 0; }
  .risks li { padding: 6px 0 6px 20px; position: relative; font-size: 13px;
    color: var(--t1); border-bottom: 1px dashed var(--border); line-height: 1.55; }
  .risks li::before { content: "⚠"; color: var(--warn); position: absolute; left: 0; top: 6px; }
  .risks li:last-child { border-bottom: 0; }

  .trade-frame { font-size: 12.5px; color: var(--t1); padding: 10px 12px;
    background: var(--elev); border-radius: 6px; line-height: 1.7; }
  .trade-frame strong { color: #ffd; }
  .trade-frame .disc { color: var(--t3); font-size: 11px; margin-top: 8px;
    display: block; font-style: italic; }

  .fold { background: var(--elev); border: 1px solid var(--border); border-radius: 6px; }
  .fold > summary { padding: 8px 12px; cursor: pointer; font-size: 12px; color: var(--t2);
    list-style: none; user-select: none; }
  .fold > summary::-webkit-details-marker { display: none; }
  .fold > summary::before { content: "▶ "; color: var(--accent); }
  .fold[open] > summary::before { content: "▼ "; }
  .fold .body { padding: 4px 12px 12px; }

  .audit-drawer { background: rgba(0,0,0,.35); border: 1px solid var(--border);
    border-radius: 8px; padding: 8px 12px; font-size: 12.5px; flex-basis: 100%; margin-top: 6px; }
  .audit-drawer .issue { padding: 6px 0; border-bottom: 1px dashed var(--border); }
  .audit-drawer .issue:last-child { border-bottom: 0; }
  .audit-drawer .sev { display: inline-block; padding: 1px 6px; border-radius: 4px;
    font-size: 10.5px; font-weight: 700; margin-right: 8px; vertical-align: middle; }
  .audit-drawer .sev.high { background: rgba(239,68,68,.25); color: #ff7a6b; }
  .audit-drawer .sev.medium { background: rgba(245,158,11,.22); color: #fbbf24; }
  .audit-drawer .sev.low { background: rgba(148,163,184,.22); color: #cbd5e1; }
  .audit-drawer .tag { color: var(--accent); font-weight: 600; }
  .audit-drawer .note { color: var(--t2); margin-left: 6px; }
  .audit-drawer .empty { color: var(--t3); font-style: italic; }

  .flags { font-size: 11.5px; color: #fbbf24; }
  .flags .label { color: var(--t3); margin-right: 4px; }

  /* ── 自选表格化 + 持有区（批次四） ── */
  .wrap-list { max-width: 1160px; }  /* 自选列表视图整列收窄居中（.wrap 自带 margin:auto），治超宽屏右侧大片空 */
  .stk-list { display: flex; flex-direction: column; gap: 3px; }
  .stk-row { display: flex; align-items: center; gap: 12px; padding: 8px 12px; border-radius: 8px;
    cursor: pointer; border: 1px solid transparent; }
  .stk-row:hover { background: var(--elev); border-color: var(--border); }
  .stk-row.act { background: rgba(232,76,61,0.07); border-color: rgba(232,76,61,0.25); }
  .stk-row.held { background: rgba(232,76,61,0.05); }
  .stk-nm { display: flex; flex-direction: column; min-width: 120px; flex: 0 1 auto; }
  .stk-nm .n { font-size: 14px; color: var(--t1); font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .stk-nm .c { font-size: 11px; color: var(--t3); font-family: ui-monospace, monospace; }
  .stk-nm .held-line { font-size: 11px; color: var(--t2); margin-top: 2px; white-space: nowrap; }
  .stk-badges { display: flex; gap: 5px; flex-wrap: wrap; justify-content: flex-start; flex: 1 1 auto; }
  .stk-b { font-size: 11px; padding: 1px 7px; border-radius: 999px; white-space: nowrap; line-height: 1.5; }
  .stk-b.act { background: rgba(232,76,61,0.18); color: #ff9b8f; }
  .stk-b.watch { background: rgba(245,158,11,0.16); color: #fbbf24; }
  .stk-b.track { background: var(--elev); color: var(--t3); }
  .stk-b.warn { background: rgba(245,158,11,0.16); color: #fbbf24; }
  .stk-b.dir-long { background: rgba(239,68,68,0.16); color: #f87171; }
  .stk-b.dir-short { background: rgba(22,163,74,0.18); color: #4ade80; }
  .stk-b.dir-wait { background: var(--elev); color: var(--t2); }
  .stk-px { text-align: right; min-width: 92px; margin-left: auto; display: flex; flex-direction: column; line-height: 1.35; }
  .stk-px .p { font-size: 14px; color: var(--t1); font-variant-numeric: tabular-nums; }
  .stk-px .chg { font-size: 11px; font-variant-numeric: tabular-nums; }
  .stk-act { display: flex; gap: 4px; flex-shrink: 0; }
  .stk-iconbtn { background: none; border: 1px solid var(--border); color: var(--t3); border-radius: 6px;
    width: 26px; height: 26px; font-size: 13px; cursor: pointer; display: flex; align-items: center; justify-content: center; }
  .stk-iconbtn:hover { color: var(--t1); border-color: var(--border-strong); }
  .stk-iconbtn.on { color: var(--accent); border-color: var(--accent); }
  .stk-pnl.up { color: var(--up); } .stk-pnl.down { color: var(--down); }
  .stk-sechead { display: flex; align-items: center; gap: 8px; padding: 10px 4px 4px; }
  .stk-sechead .t { font-size: 13px; font-weight: 600; color: var(--t1); }
  .stk-sechead .h { font-size: 11px; color: var(--t3); }
  .stk-sechead .n { margin-left: auto; font-size: 11px; color: var(--t3); }
  .stk-sort { display: flex; gap: 6px; align-items: center; margin: 6px 0 2px; }
  .stk-sort .lb { font-size: 11px; color: var(--t3); }
  .stk-sort button { font-size: 11px; padding: 2px 9px; border-radius: 999px; border: 1px solid var(--border);
    background: none; color: var(--t2); cursor: pointer; }
  .stk-sort button.on { border-color: var(--accent); color: var(--accent); }

  /* ── 价格区间自检警示（批次一：区间未过几何自检时顶在大白话之上） ── */
  .range-warning { padding: 9px 12px; border-radius: 8px; border-left: 3px solid var(--warn);
    background: rgba(245,158,11,.10); color: var(--t1); font-size: 12.5px; line-height: 1.6;
    font-weight: 500; margin-bottom: 2px; }

  /* ── 大白话主体（v2.6，前端只渲染 plain_language；技术细节折叠） ── */
  .plain { display: flex; flex-direction: column; gap: 12px; }
  .plain .pl-block { padding: 10px 12px; background: var(--elev); border-radius: 8px;
    border-left: 3px solid var(--accent); line-height: 1.65; font-size: 13.5px; color: var(--t1); }
  .plain .pl-block.warn { border-left-color: var(--warn); background: rgba(245,158,11,.08); }
  .plain .pl-block.risk { border-left-color: var(--down); background: rgba(239,68,68,.06);
    color: var(--t2); font-size: 12.5px; }
  .plain .pl-label { display: block; font-size: 11px; font-weight: 700;
    color: var(--accent); letter-spacing: .06em; margin-bottom: 4px; }
  .plain .pl-block.warn .pl-label { color: #fbbf24; }
  .plain .pl-block.risk .pl-label { color: #ff9b8f; }
  .plain .pl-pros-cons { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
  @container report (max-width: 520px) { .plain .pl-pros-cons { grid-template-columns: 1fr; } }
  @media (max-width: 640px) { .plain .pl-pros-cons { grid-template-columns: 1fr; } }
  .plain .pl-list { margin: 0; padding: 0; list-style: none; }
  .plain .pl-list li { padding: 4px 0 4px 18px; position: relative; font-size: 13px;
    line-height: 1.55; border-bottom: 1px dashed var(--border); }
  .plain .pl-list li:last-child { border-bottom: 0; }
  .plain .pl-list.pros li::before { content: "✓"; color: var(--up);
    position: absolute; left: 0; top: 4px; font-weight: 700; }
  .plain .pl-list.cons li::before { content: "✕"; color: var(--down);
    position: absolute; left: 0; top: 4px; font-weight: 700; }
  .plain .pl-scen { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 8px; }
  @container report (max-width: 520px) { .plain .pl-scen { grid-template-columns: 1fr; } }
  @media (max-width: 640px) { .plain .pl-scen { grid-template-columns: 1fr; } }
  .plain .pl-scen .cell { padding: 8px 10px; background: var(--elev); border-radius: 6px;
    font-size: 12.5px; line-height: 1.55; border-top: 3px solid var(--border); }
  .plain .pl-scen .cell.up { border-top-color: var(--up); }
  .plain .pl-scen .cell.base { border-top-color: var(--t2); }
  .plain .pl-scen .cell.down { border-top-color: var(--down); }
  .plain .pl-scen .cell .k { display: block; font-size: 11px; font-weight: 700;
    color: var(--t3); letter-spacing: .04em; margin-bottom: 4px; }
  .plain .pl-empty { color: var(--t3); font-style: italic; padding: 12px;
    text-align: center; background: var(--elev); border-radius: 6px; font-size: 13px; }
  /* ── 叙事量化件（嵌进对应大白话段落，不再独立成卡） ── */
  /* ① 故事占比进度条 → 值多少钱 */
  .plain .pl-story { margin-top: 8px; padding: 8px 10px; background: rgba(232,76,61,0.06);
    border-left: 3px solid var(--accent); border-radius: 6px; }
  .plain .pl-story-head { font-size: 12.5px; color: var(--t2); }
  .plain .pl-story-head b { color: var(--accent); font-size: 15px; font-weight: 700;
    margin-right: 4px; }
  .plain .pl-story-bar { display: flex; height: 10px; border-radius: 4px;
    overflow: hidden; margin: 7px 0 4px; }
  .plain .pl-story-bar .core { background: var(--t3); }
  .plain .pl-story-bar .prem { background: var(--accent); }
  .plain .pl-story-legend { display: flex; justify-content: space-between;
    font-size: 11.5px; color: var(--t2); }
  .plain .pl-story-legend .prem { color: var(--accent); font-weight: 600; }
  /* ② 订单跟踪 → 能买的理由 */
  .plain .pl-order { margin-top: 8px; padding: 8px 10px; background: var(--card);
    border: 1px solid var(--border); border-radius: 6px; font-size: 12.5px; }
  .plain .pl-order-head { color: var(--t1); }
  .plain .pl-order-head b { font-weight: 700; }
  .plain .pl-order-head .pl-order-strength { font-size: 11px; margin-left: 6px; }
  .plain .pl-order-row { display: flex; justify-content: space-between; gap: 8px;
    margin-top: 4px; color: var(--t2); }
  .plain .pl-order-row .pl-order-val b.up { color: var(--up); }
  .plain .pl-order-row .pl-order-val b.down { color: var(--down); }
  .plain .pl-order-note { font-size: 11px; color: var(--t3); margin-top: 4px;
    line-height: 1.5; }
  /* ③ 翻车线 / 了断时点 / 基本面地板 → 什么情况证明看错了 */
  .plain .pl-crash { margin-top: 6px; font-size: 12.5px; color: var(--t1);
    line-height: 1.55; }
  .plain .pl-crash b { font-weight: 700; }
  .plain .pl-crash .down { color: var(--down); }
  /* ④ 新故事雷达 chips → 市场为什么炒它 */
  .plain .pl-radar { margin-top: 8px; display: flex; flex-wrap: wrap;
    gap: 6px; align-items: center; }
  .plain .pl-radar-k { font-size: 11px; color: var(--t3); margin-right: 4px; }
  .plain .pl-radar-chip { font-size: 11px; padding: 2px 8px;
    background: var(--card); border: 1px solid var(--border); border-radius: 6px;
    color: var(--t2); }

  /* ── 列表视图（仿期智 dash） ── */
  /* align-items:start：卡片按自身内容高度排，不强制等高——避免字段少的卡片（缺中性区间/叙事）被拉伸后中间留空洞 */
  .dash { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; align-items: start; }
  /* 自选增删 */
  .manage-bar { display: flex; gap: 8px; align-items: center; margin-bottom: 14px; flex-wrap: wrap; }
  .manage-bar .add-code { width: 160px; background: var(--elev); border: 1px solid var(--border);
    color: var(--t1); border-radius: 8px; padding: 7px 10px; font-size: 13px; font-family: inherit; }
  .manage-bar .add-cycle { background: var(--elev); border: 1px solid var(--border); color: var(--t1);
    border-radius: 8px; padding: 7px 10px; font-size: 13px; font-family: inherit; }
  .manage-bar .add-btn { background: var(--accent); color: #fff; border: 0; border-radius: 8px;
    padding: 8px 14px; font-size: 13px; cursor: pointer; font-family: inherit; }
  .manage-bar .add-btn:disabled { opacity: .5; cursor: default; }
  .dash-card .card-del { background: transparent; border: 1px solid var(--border); color: var(--t3);
    border-radius: 6px; width: 24px; height: 24px; line-height: 1; cursor: pointer; font-size: 12px;
    padding: 0; font-family: inherit; transition: all .15s; }
  .dash-card .card-del:hover { border-color: var(--down); color: var(--down); }
  @media (max-width: 1100px) { .dash { grid-template-columns: repeat(2, 1fr); } }
  @media (max-width: 720px) { .dash { grid-template-columns: 1fr; gap: 12px; } }
  .dash-card {
    background: var(--card); border: 1px solid var(--border); border-radius: 12px;
    padding: 18px; cursor: pointer; display: flex; flex-direction: column; gap: 14px;
    transition: border-color 150ms ease, transform 150ms ease;
  }
  .dash-card:hover { border-color: var(--accent); transform: translateY(-1px); }
  .dash-card .head { display: flex; justify-content: space-between; align-items: flex-start; }
  .dash-card .name { font-size: 22px; font-weight: 700; line-height: 1.2; color: var(--t1); }
  .dash-card .code { font-size: 12px; color: var(--t3); margin-top: 4px;
    font-family: ui-monospace, "SF Mono", Menlo, monospace; }
  .dash-card .thesis { font-size: 13px; color: var(--t2); line-height: 1.6; margin: 0;
    display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical;
    overflow: hidden; max-height: 4.8em; }  /* 4.8em = 1.6 行高 × 3：硬截，避免 line-clamp 漏出第 4 行残条 */
  .dash-card .label { font-size: 11px; color: var(--t3);
    letter-spacing: 0.08em; text-transform: uppercase; }
  .dash-card .range { font-size: 18px; color: var(--t1); font-weight: 600; margin-top: 2px;
    font-family: ui-monospace, "SF Mono", Menlo, monospace; }
  .dash-card .price-row {
    padding-top: 12px; border-top: 1px solid var(--border);
    display: flex; align-items: flex-end; justify-content: space-between;
  }
  .dash-card .price { font-size: 20px; font-weight: 700; color: var(--t1);
    font-family: ui-monospace, "SF Mono", Menlo, monospace; }
  .dash-card .chg { margin-left: 8px; font-size: 14px; font-weight: 600; }
  .dash-card .chg.up { color: var(--up); }
  .dash-card .chg.down { color: var(--down); }
  .dash-card .chg.flat { color: var(--t3); }
  .dash-card .themes { font-size: 11px; color: #fbbf24; }
  .dash-card .as-of { font-size: 11px; color: var(--t3);
    font-family: ui-monospace, "SF Mono", Menlo, monospace; }

  .dash-empty {
    padding: 40px 20px; text-align: center; color: var(--t3);
    font-size: 14px; background: var(--card); border: 1px dashed var(--border);
    border-radius: 12px;
  }

  /* ── 列表分区（出手/观望/追踪） ── */
  .zone { margin-bottom: 24px; }
  .zone-head { display: flex; align-items: center; gap: 10px; margin-bottom: 12px;
    padding-bottom: 7px; border-bottom: 1px solid var(--border); }
  .zone-name { font-size: 15px; font-weight: 700; }
  .zone-hint { font-size: 12px; color: var(--t3); }
  .zone-count { margin-left: auto; font-size: 12px; color: var(--t3);
    font-family: ui-monospace, "SF Mono", Menlo, monospace; }
  .zone-empty { font-size: 13px; color: var(--t3); padding: 4px 2px 2px; }
  .zone.z-act .zone-name { color: var(--accent); }
  .zone.z-watch .zone-name { color: #fbbf24; }
  .zone.z-track .zone-name { color: var(--t2); }
  .dash-card.act { border-color: var(--accent); border-width: 2px; padding: 17px; }
  .dash-card .sig { font-size: 12px; font-weight: 600; line-height: 1.4; }
  .dash-card .sig.sig-act { color: var(--accent); }
  .dash-card .sig.sig-watch { color: #fbbf24; }
  .dash-card .sig.sig-track { color: var(--t3); font-weight: 400; }

  /* ── 板块视图（自选池按申万L3聚合 + 真β/伪β） ── */
  .sector-legend { font-size: 12px; color: var(--t2); margin-bottom: 14px; line-height: 2.1; }
  .sector-legend .bt { margin: 0 4px; display: inline-block; }
  .sector-card { background: var(--card); border: 1px solid var(--border); border-radius: 12px;
    padding: 14px; margin-bottom: 14px; }
  .sector-head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
  .sector-name { font-size: 17px; font-weight: 700; color: var(--t1); }
  .sector-code { font-size: 12px; color: var(--t3); }
  .sector-metric { font-size: 13px; color: var(--t2); }
  .sector-metric b { color: var(--t1); font-size: 15px; }
  .sector-metric.chg.up { color: var(--up); }
  .sector-metric.chg.down { color: var(--down); }
  .sector-metric.chg.flat { color: var(--t3); }
  .sector-heatbar { height: 4px; background: var(--elev); border-radius: 3px; margin: 10px 0 12px; overflow: hidden; }
  .sector-heatbar > div { height: 100%; background: linear-gradient(90deg, var(--warn), var(--accent)); }
  .sector-members { display: flex; flex-direction: column; gap: 6px; }
  .smember { display: flex; align-items: center; gap: 12px; padding: 8px 10px; border-radius: 8px;
    background: var(--bg); border: 1px solid var(--border); cursor: pointer; transition: border-color 120ms; }
  .smember:hover { border-color: var(--accent); }
  .sm-name { font-size: 15px; font-weight: 600; color: var(--t1); min-width: 130px; }
  .sm-code { font-size: 11px; color: var(--t3); margin-left: 8px; font-weight: 400; }
  .sm-temps { display: flex; align-items: center; gap: 8px; flex: 1; font-size: 12px; color: var(--t2); }
  .sm-temps b { color: var(--t1); font-size: 14px; }
  .sm-vs { color: var(--t3); }
  .sm-alpha { color: #2dd4bf; font-size: 11px; white-space: nowrap; }
  .bt { font-size: 11px; font-weight: 700; padding: 3px 9px; border-radius: 999px; white-space: nowrap; }
  .bt-true { background: rgba(34,197,94,0.16); color: var(--good); border: 1px solid rgba(34,197,94,0.4); }
  .bt-alpha { background: rgba(45,212,191,0.18); color: #2dd4bf; border: 1px solid rgba(45,212,191,0.55); }
  .bt-fake { background: rgba(245,158,11,0.16); color: var(--warn); border: 1px solid rgba(245,158,11,0.5); }
  .bt-head { background: rgba(107,118,132,0.14); color: var(--t2); border: 1px solid var(--border); }
  .bt-neu  { background: transparent; color: var(--t3); border: 1px solid var(--border); }
  .bt-unk  { background: transparent; color: var(--t3); border: 1px dashed var(--border); }
  /* 双击 = 顺风+α↑，最稀缺，金色实心 */
  .bt-double { background: rgba(250,204,21,0.18); color: #facc15; border: 1px solid rgba(250,204,21,0.6); }
  /* 搭便车 = 顺风但α↓，板块一冷就裸泳，空心绿 */
  .bt-ride { background: transparent; color: var(--good); border: 1px dashed rgba(34,197,94,0.5); }
  /* α 徽章（与 β 标签并列的第二轴，始终显示） */
  .ab { font-size: 11px; font-weight: 700; padding: 3px 8px; border-radius: 999px; white-space: nowrap; }
  .ab-up { background: rgba(45,212,191,0.18); color: #2dd4bf; border: 1px solid rgba(45,212,191,0.55); }
  .ab-down { background: rgba(245,158,11,0.14); color: var(--warn); border: 1px solid rgba(245,158,11,0.45); }
  .ab-neu { background: transparent; color: var(--t3); border: 1px solid var(--border); }
  .ab-pending { background: transparent; color: var(--t3); border: 1px dashed var(--border); }
  .sm-diverge { color: var(--warn); font-size: 11px; white-space: nowrap; }
  .sm-tags { display: inline-flex; align-items: center; gap: 6px; }
  .lg-axis { color: var(--t3); font-weight: 700; margin-right: 2px; }
  .sector-legend .ab { margin: 0 4px; display: inline-block; }
  .lg-sep { color: var(--border); margin: 0 6px; }
  @media (max-width: 720px) { .sm-name { min-width: 90px; } .smember { flex-wrap: wrap; gap: 6px; } }

  /* ── 全市场L2作战地图（网格 + 热度梯度） ── */
  .sector-build { margin-bottom: 14px; }
  .sector-progress { height: 6px; background: var(--elev); border-radius: 3px; overflow: hidden; margin-top: 6px; }
  .sector-progress > div { height: 100%; background: linear-gradient(90deg, var(--warn), var(--accent)); transition: width 400ms; }
  .sector-heatlegend { display: flex; align-items: center; gap: 8px; margin-bottom: 12px;
    font-size: 11px; color: var(--t3); flex-wrap: wrap; }
  .sector-heatlegend .hl-cap { color: var(--t2); }
  .sector-heatlegend .hl-bar { width: 160px; height: 9px; border-radius: 5px;
    background: linear-gradient(90deg, rgba(22,163,74,0.95), rgba(22,163,74,0.12),
      rgba(120,128,140,0.18), rgba(239,68,68,0.12), rgba(239,68,68,0.95)); }
  .sector-heatlegend .hl-end.up { color: var(--up); }
  .sector-heatlegend .hl-end.down { color: var(--down); }
  .sector-heatlegend .hl-hold { margin-left: 6px; color: var(--accent); }

  /* ── 作战简报（板块视图顶部三行：大盘状态/焦点板块/主线解读）── */
  .briefing { background: var(--card); border: 1px solid var(--border); border-radius: 12px;
    padding: 14px 16px; margin-bottom: 14px; }
  .briefing-head { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; font-size: 12px; color: var(--t3); }
  .briefing-head .cap { font-size: 15px; font-weight: 700; color: var(--t1); }
  .briefing-head .date { color: var(--t2); }
  .briefing-head .regen-btn { margin-left: auto; background: transparent; border: 1px solid var(--border);
    color: var(--t2); border-radius: 6px; padding: 3px 10px; font-size: 12px; cursor: pointer; }
  .briefing-head .regen-btn:hover:not(:disabled) { border-color: var(--accent); color: var(--accent); }
  .briefing-head .regen-btn:disabled { opacity: .5; cursor: not-allowed; }
  .briefing-row { display: flex; gap: 10px; padding: 8px 0; align-items: flex-start;
    border-top: 1px solid var(--border); }
  .briefing-row:first-of-type { border-top: none; padding-top: 4px; }
  .br-tag { flex: 0 0 auto; font-size: 11px; font-weight: 700; padding: 3px 10px; border-radius: 999px;
    white-space: nowrap; align-self: flex-start; margin-top: 2px; }
  .br-tag.phase-attack  { background: rgba(239,68,68,0.16); color: #ef4444; border: 1px solid rgba(239,68,68,0.5); }
  .br-tag.phase-defense { background: rgba(22,163,74,0.16); color: #16a34a; border: 1px solid rgba(22,163,74,0.5); }
  .br-tag.phase-neutral { background: transparent; color: var(--t2); border: 1px solid var(--border); }
  .br-tag.role-focus   { background: rgba(45,212,191,0.18); color: #2dd4bf; border: 1px solid rgba(45,212,191,0.55); }
  .br-tag.role-empty   { background: transparent; color: var(--t3); border: 1px dashed var(--border); }
  .br-tag.role-theme   { background: rgba(250,204,21,0.18); color: #facc15; border: 1px solid rgba(250,204,21,0.6); }
  .br-tag.role-err     { background: rgba(245,158,11,0.14); color: var(--warn); border: 1px solid rgba(245,158,11,0.45); }
  .br-body { flex: 1; font-size: 13px; color: var(--t1); line-height: 1.6; min-width: 0; }
  .br-body .sub { color: var(--t3); font-size: 12px; }
  .br-body .err { color: var(--warn); }
  .br-focus-list { display: flex; flex-direction: column; gap: 4px; margin-top: 2px; }
  .br-focus-item { font-size: 13px; }
  .br-focus-item b { color: var(--t1); }
  .br-focus-item .meta { color: var(--t3); margin-left: 6px; font-size: 12px; }
  .br-focus-toggle { align-self: flex-start; background: transparent; border: none;
    color: var(--accent); font-size: 12px; padding: 2px 0; cursor: pointer; margin-top: 4px; }
  .br-focus-toggle:hover { text-decoration: underline; }
  .br-theme { border-left: 2px solid var(--border); padding: 6px 0 6px 12px; margin: 8px 0; }
  .br-theme:first-child { margin-top: 0; }
  .br-theme.mat-done { border-left-color: #2dd4bf; }
  .br-theme.mat-half { border-left-color: #facc15; }
  .br-theme.mat-hype { border-left-color: var(--warn); }
  .br-theme-text { font-size: 13px; color: var(--t1); line-height: 1.65;
    white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word;
    max-width: 100%; }
  .br-theme .evidence { margin-top: 6px; color: var(--t3); font-size: 11px; }
  .br-data-hint { margin-top: 10px; padding-top: 8px; border-top: 1px dashed var(--border); }
  .br-data-panel { margin-top: 8px; padding: 10px 12px; background: var(--bg); border-radius: 8px;
    border: 1px solid var(--border); }
  .br-data-block { padding: 6px 0; border-top: 1px solid var(--border); }
  .br-data-block:first-child { padding-top: 0; border-top: none; }
  .br-data-head { display: flex; flex-wrap: wrap; gap: 8px; align-items: baseline; margin-bottom: 4px; }
  .br-data-head b { font-size: 13px; color: var(--t1); }
  .br-data-head .meta { color: var(--t3); font-size: 11px; }
  .br-data-line { font-size: 11px; color: var(--t2); line-height: 1.6; margin-top: 2px; }
  .br-data-news { margin: 2px 0 0 0; padding-left: 14px; }
  .br-data-news li { font-size: 11px; color: var(--t3); line-height: 1.55; }

  .sector-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 10px; }
  .sector-tile { background: var(--card); border: 1px solid var(--border); border-left: 4px solid var(--border);
    border-radius: 10px; padding: 11px 12px; cursor: pointer; transition: box-shadow 120ms, transform 80ms; }
  .sector-tile:hover { transform: translateY(-1px); }
  .sector-tile.has-holding { box-shadow: inset 0 0 0 2px rgba(232,76,61,0.7); }
  .st-head { display: flex; align-items: center; gap: 8px; }
  .st-name { font-size: 15px; font-weight: 700; color: var(--t1); flex: 1; }
  .st-hold { font-size: 11px; font-weight: 700; color: #fff; background: var(--accent);
    border-radius: 6px; padding: 2px 7px; white-space: nowrap; }
  .st-metrics { display: flex; align-items: baseline; gap: 10px; margin-top: 6px; }
  .st-chg3 { display: flex; align-items: baseline; gap: 10px; margin-top: 6px; flex-wrap: wrap; }
  .st-c3 { display: inline-flex; align-items: baseline; gap: 3px; font-size: 14px; font-weight: 700;
    font-family: ui-monospace, "SF Mono", Menlo, monospace; }
  .st-c3 em { font-style: normal; font-size: 10px; font-weight: 600; color: var(--t3); letter-spacing: 0; }
  .st-c3.up { color: var(--up); } .st-c3.down { color: var(--down); } .st-c3.flat { color: var(--t3); }
  .st-pe { font-size: 12px; color: var(--t3); }
  .st-trough { color: #b8860b; font-weight: 700; background: rgba(184,134,11,0.14);
    border: 1px solid rgba(184,134,11,0.45); border-radius: 6px; padding: 1px 6px; cursor: help; }
  .st-mf { display: flex; align-items: baseline; gap: 9px; margin-top: 5px; flex-wrap: wrap; }
  .st-mf .mf-cap { font-size: 10px; font-weight: 600; color: var(--t3); }
  .st-mf .mf-v { display: inline-flex; align-items: baseline; gap: 3px; font-size: 12px; font-weight: 700;
    font-family: ui-monospace, "SF Mono", Menlo, monospace; }
  .st-mf .mf-v em { font-style: normal; font-size: 10px; font-weight: 600; color: var(--t3); }
  .st-mf .mf-v.up { color: var(--up); } .st-mf .mf-v.down { color: var(--down); } .st-mf .mf-v.flat { color: var(--t3); }
  .st-mf .mf-div { font-size: 11px; font-weight: 700; color: #c2410c; background: rgba(194,65,12,0.13);
    border: 1px solid rgba(194,65,12,0.45); border-radius: 6px; padding: 0 5px; cursor: help; }
  .mf-sortbtn { margin-left: auto; font-size: 12px; padding: 4px 10px; }
  .mf-sortbtn.active { border-color: var(--accent); color: var(--accent); font-weight: 700; }
  .st-holds { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 9px;
    padding-top: 9px; border-top: 1px dashed var(--border); }
  .st-chip { display: inline-flex; align-items: center; gap: 5px; font-size: 12px; font-weight: 600;
    color: var(--t1); background: var(--bg); border: 1px solid var(--border); border-radius: 7px; padding: 2px 6px; }
  .st-chip:hover { border-color: var(--accent); }
  .st-chip .bt { font-size: 10px; padding: 1px 6px; }
  .smember.held { border-color: var(--accent); background: rgba(232,76,61,0.07); }
  .sm-star { color: var(--accent); margin-right: 4px; }

  /* ── 列表筛选条（搜索 + 方向 chip） ── */
  .dash-filter { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; flex-wrap: wrap; }
  .dash-search { background: var(--elev); border: 1px solid var(--border); color: var(--t1);
    border-radius: 8px; padding: 7px 11px; font-size: 13px; min-width: 200px; flex: 1 1 220px;
    max-width: 320px; outline: none; transition: border-color 150ms; }
  .dash-search:focus { border-color: var(--accent); }
  .dash-search::placeholder { color: var(--t3); }
  .dash-chips { display: flex; gap: 6px; flex-wrap: wrap; }
  .dash-chip { background: transparent; border: 1px solid var(--border); color: var(--t3);
    border-radius: 999px; padding: 4px 11px; font-size: 12px; cursor: pointer;
    transition: border-color 150ms, color 150ms, background 150ms; }
  .dash-chip:hover { color: var(--t2); border-color: var(--t3); }
  .dash-chip.on { color: var(--t1); border-color: var(--accent); background: rgba(232,76,61,0.12); }
  .dash-summary { margin-left: auto; font-size: 12px; color: var(--t3);
    font-family: ui-monospace, "SF Mono", Menlo, monospace; }

  /* 可折叠 zone-head（追踪区） */
  .zone-head.collapsible { cursor: pointer; user-select: none; }
  .zone-head.collapsible:hover .zone-name { color: var(--t1); }
  .zone-toggle { font-size: 11px; color: var(--t3); margin-left: 8px; }


  /* ── 详情视图顶 ── */
  /* ── 三栏工作台（自选页默认布局，仿 TradingView） ── */
  /* 左：K线图 / 右上：自选列表 / 右下：大白话研报卡；一屏内完成"看信号→看走势→看结论"
     两条可拖分隔：横（左右）+ 竖（右栏内），fr 值走 CSS 变量、React 状态直接改。 */
  .ws-grid { display: grid;
    grid-template-columns: minmax(400px, var(--ws-lw, 55fr)) 10px minmax(340px, var(--ws-rw, 45fr));
    height: calc(100vh - 150px); min-height: 620px; }
  .ws-left { min-width: 0; display: flex; flex-direction: column; }
  .ws-left .card { flex: 1; display: flex; flex-direction: column; padding: 12px; }
  .ws-left .ws-empty { align-items: center; justify-content: center; color: var(--t3);
    font-size: 14px; }
  /* 右栏：上=自选列表 · 下=大白话研报卡（就地展开完整数据）
     用 grid 给两行明确尺寸，避免 flex-basis:auto + 内部 flex:1 1 0 的经典塌陷
     （父容器按内容测尺寸时，scroll 子只贡献 0 → 整个上格塌成 manage-bar 高度）。
     10px 中间为竖向拖条，fr 值走 CSS 变量。 */
  .ws-right { display: grid;
    grid-template-rows: minmax(70px, var(--ws-th, 45fr)) 10px minmax(160px, var(--ws-bh, 55fr));
    min-width: 0; min-height: 0; }
  .ws-right-top { min-height: 0; display: flex; flex-direction: column;
    background: var(--card); border: 1px solid var(--border); border-radius: 12px; padding: 12px; }
  .ws-right-top .manage-bar { margin-bottom: 10px; }
  .ws-right-top .dash-filter { margin-bottom: 10px; }
  .ws-right-top .ws-list-scroll { flex: 1 1 0; min-height: 0; overflow-y: auto;
    overscroll-behavior: contain; margin: 0 -4px; padding: 0 4px; }
  .ws-right-bottom { min-height: 0; display: flex; flex-direction: column;
    background: var(--card); border: 1px solid var(--border); border-radius: 12px; overflow: hidden; }
  .ws-right-bottom:has(.core-evidence) { overflow-y:auto; display:block; }

  /* ── 可拖分隔条（仿 TradingView，肉眼可见 + hover 高亮 + 中间抓手） ── */
  .ws-resizer-h, .ws-resizer-v { position: relative; background: transparent; z-index: 5;
    transition: background 120ms; }
  .ws-resizer-h { cursor: col-resize; }
  .ws-resizer-v { cursor: row-resize; }
  /* 抓手（默认淡灰色小竖/横条，hover/dragging 变亮变粗） */
  .ws-resizer-h::before, .ws-resizer-v::before { content: ""; position: absolute;
    top: 50%; left: 50%; transform: translate(-50%, -50%);
    background: var(--t3); border-radius: 2px;
    transition: background 120ms, width 120ms, height 120ms; }
  .ws-resizer-h::before { width: 3px; height: 34px; }
  .ws-resizer-v::before { width: 34px; height: 3px; }
  .ws-resizer-h:hover, .ws-resizer-v:hover,
  .ws-resizer-h.dragging, .ws-resizer-v.dragging { background: rgba(232,76,61,0.18); }
  .ws-resizer-h:hover::before, .ws-resizer-v:hover::before,
  .ws-resizer-h.dragging::before, .ws-resizer-v.dragging::before { background: var(--accent); }
  .ws-resizer-h:hover::before, .ws-resizer-h.dragging::before { height: 46px; width: 4px; }
  .ws-resizer-v:hover::before, .ws-resizer-v.dragging::before { width: 46px; height: 4px; }
  /* 拖动中：整页禁用文本选择 + 强制光标（否则光标移出手柄区就变回箭头） */
  body.ws-drag-h, body.ws-drag-h * { cursor: col-resize !important; user-select: none !important; }
  body.ws-drag-v, body.ws-drag-v * { cursor: row-resize !important; user-select: none !important; }

  /* 紧凑行（工作台自选列表用） */
  .ws-row { display: flex; align-items: center; gap: 8px; padding: 8px 10px;
    border-radius: 8px; cursor: pointer; border: 1px solid transparent;
    transition: background 120ms, border-color 120ms; margin-bottom: 4px; }
  .ws-row:hover { background: var(--elev); }
  .ws-row.active { background: var(--elev); border-color: var(--accent); }
  .ws-row .r-nm { min-width: 0; flex: 1 1 auto; }
  .ws-row .r-name { font-size: 14px; font-weight: 700; color: var(--t1);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .ws-row .r-code { font-size: 10.5px; color: var(--t3); margin-top: 1px;
    font-family: ui-monospace, "SF Mono", Menlo, monospace; }
  .ws-row .r-sig { font-size: 10.5px; font-weight: 600; padding: 2px 6px;
    border-radius: 4px; white-space: nowrap; flex-shrink: 0; }
  .ws-row .r-sig.sig-act { color: var(--accent); background: rgba(232,76,61,.14); }
  .ws-row .r-sig.sig-watch { color: #fbbf24; background: rgba(245,158,11,.14); }
  .ws-row .r-sig.sig-track { color: var(--t3); }
  .ws-row .r-px { text-align: right; font-family: ui-monospace, "SF Mono", Menlo, monospace;
    flex-shrink: 0; }
  .ws-row .r-price { font-size: 13px; font-weight: 700; color: var(--t1); }
  .ws-row .r-chg { font-size: 11px; font-weight: 600; margin-top: 1px; }
  .ws-row .r-chg.up { color: var(--up); } .ws-row .r-chg.down { color: var(--down); }
  .ws-row .r-chg.flat { color: var(--t3); }
  .ws-row .r-del { background: transparent; border: 0; color: var(--t3); cursor: pointer;
    font-size: 12px; padding: 2px 4px; opacity: 0; transition: opacity 120ms, color 120ms; }
  .ws-row:hover .r-del { opacity: 1; }
  .ws-row .r-del:hover { color: var(--down); }
  /* 持有票（批次四）：整行浅底 + name 前缀💼 + 成本/浮盈/止损行 */
  .ws-row.held { background: rgba(232,76,61,0.05); }
  .ws-row .r-held { font-size: 10.5px; color: var(--t2); margin-top: 2px;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .ws-row .r-held b { font-weight: 700; }
  .ws-row .r-held b.up { color: var(--up); }
  .ws-row .r-held b.down { color: var(--down); }
  /* 区间存疑徽章（复用 r-sig 槽） */
  .ws-row .r-sig.warn { color: #fbbf24; background: rgba(245,158,11,.14); }
  /* 持有开关（○/●）：hover 时才亮，已持有票常驻 */
  .ws-row .r-hold { background: transparent; border: 0; color: var(--t3); cursor: pointer;
    font-size: 13px; padding: 2px 4px; opacity: 0; transition: opacity 120ms, color 120ms; }
  .ws-row:hover .r-hold, .ws-row .r-hold.on { opacity: 1; }
  .ws-row .r-hold.on { color: var(--accent); }
  .ws-row .r-hold:hover { color: var(--t1); }
  /* rowsOf 容器：兼容旧 .stk-list 语义，三栏用 .ws-list */
  .ws-list { display: flex; flex-direction: column; }
  .ws-zone-head { display: flex; align-items: center; gap: 8px; padding: 6px 4px 4px;
    font-size: 11.5px; }
  .ws-zone-head.collapsible { cursor: pointer; user-select: none; }
  .ws-zone-head .z-name { font-weight: 700; }
  .ws-zone-head .z-hint { color: var(--t3); font-size: 10.5px; }
  .ws-zone-head .z-count { margin-left: auto; color: var(--t3); font-size: 10.5px;
    font-family: ui-monospace, "SF Mono", Menlo, monospace; }
  .ws-zone-head .z-toggle { color: var(--t3); font-size: 10.5px; }
  .ws-zone.z-act .z-name { color: var(--accent); }
  .ws-zone.z-watch .z-name { color: #fbbf24; }
  .ws-zone.z-track .z-name { color: var(--t2); }
  .ws-zone-empty { font-size: 11.5px; color: var(--t3); padding: 4px 10px 8px; }

  /* 大白话研报卡（右下） */
  .mini-report { display: flex; flex-direction: column; height: 100%; }
  .mini-report .mr-head { display: flex; align-items: center; gap: 8px;
    padding: 12px 14px; border-bottom: 1px solid var(--border); flex-shrink: 0; }
  .mini-report .mr-head .mr-title { font-size: 13px; font-weight: 600; color: var(--t1);
    margin-right: auto; }
  .mini-report .mr-nums { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px;
    padding: 12px 14px; border-bottom: 1px solid var(--border); flex-shrink: 0; }
  .mini-report .mr-num { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
  .mini-report .mr-num .k { font-size: 10.5px; color: var(--t3); letter-spacing: .04em; }
  .mini-report .mr-num .v { font-size: 14px; font-weight: 700; color: var(--t1);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .mini-report .mr-num .v.up { color: var(--up); }
  .mini-report .mr-num .v.down { color: var(--down); }
  .mini-report .mr-num .v .dev { font-size: 11px; font-weight: 600; margin-left: 4px; }
  .mini-report .mr-num .v .dev.up { color: var(--up); }
  .mini-report .mr-num .v .dev.down { color: var(--down); }
  .mini-report .mr-body { flex: 1; overflow-y: auto; overscroll-behavior: contain;
    padding: 12px 14px; }
  .mini-report .mr-foot { padding: 10px 14px; border-top: 1px solid var(--border);
    flex-shrink: 0; display: flex; gap: 8px; align-items: center; }
  .mini-report .mr-open { flex: 1; background: var(--elev); border: 1px solid var(--border);
    color: var(--t1); border-radius: 8px; padding: 8px 12px; font-size: 12.5px;
    cursor: pointer; font-family: inherit; transition: border-color 120ms, color 120ms; }
  .mini-report .mr-open:hover { border-color: var(--accent); color: var(--accent); }
  .mini-report .mr-empty { flex: 1; display: flex; flex-direction: column; align-items: center;
    justify-content: center; gap: 12px; color: var(--t3); font-size: 13px; padding: 20px; text-align: center; }
  .mini-report .mr-empty .gen { padding: 10px 22px; }
  /* 就地展开完整数据（替代原独立详情页）：与大白话之间一条分隔线 + gap，全部技术区块内联渲染。 */
  .mr-full { border-top: 1px dashed var(--border); margin-top: 14px; padding-top: 14px;
    display: flex; flex-direction: column; gap: 14px; }
  .mr-meta-bar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
    font-size: 11px; color: var(--t3); }
  .mr-meta-time { font-family: ui-monospace, "SF Mono", Menlo, monospace; }
  .mr-mini-btn { background: var(--elev); border: 1px solid var(--border); color: var(--t2);
    border-radius: 6px; padding: 3px 8px; font-size: 12px; cursor: pointer; font-family: inherit;
    transition: border-color 120ms, color 120ms; }
  .mr-mini-btn:hover { border-color: var(--accent); color: var(--t1); }
  .mr-mini-btn:disabled { opacity: .5; cursor: not-allowed; }
  .mr-mini-btn.ok { color: var(--good); border-color: var(--good); }
  .mr-mini-btn.err { color: var(--down); border-color: var(--down); }

  /* 中等宽度：55/45 fr 比例保持，只把最小值放宽（右栏 340px 兜底、K线让位） */
  @media (max-width: 1280px) {
    .ws-grid { grid-template-columns:
      minmax(360px, var(--ws-lw, 55fr)) 10px minmax(320px, var(--ws-rw, 45fr)); }
  }

  /* ── 手机端：三栏 grid 堆叠成单列，隐藏拖条，K线固定高度 ── */
  @media (max-width: 768px) {
    .wrap { padding: 12px; }
    .chart-box { height: 280px !important; }
    .card { padding: 12px; }
    .scenarios { grid-template-columns: 1fr; }
    .kv { grid-template-columns: 90px 1fr; font-size: 12px; }
    .ws-grid { grid-template-columns: 1fr; height: auto; min-height: 0; gap: 12px; }
    .ws-right { grid-template-rows: auto auto; gap: 12px; }
    .ws-right-top { max-height: none; }
    .ws-right-bottom { min-height: 0; }
    .ws-resizer-h, .ws-resizer-v { display: none; }
    .ws-mobile-report { margin-top: 12px; }
  }

  /* ── 恐慌贪婪指数 chip + 弹层（环境层，只做标注不做信号）── */
  .fg-chip { display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px;
    border-radius: 12px; font-size: 12px; font-weight: 600; cursor: pointer;
    border: 1px solid var(--border); background: var(--card); color: var(--t2);
    transition: filter 120ms; }
  .fg-chip:hover { filter: brightness(1.15); }
  .fg-chip.fear { background: rgba(22,163,74,.18); color: #a7e8b7; border-color: #16a34a; }
  .fg-chip.efear { background: rgba(22,163,74,.32); color: #d1f7d9; border-color: #16a34a; }
  .fg-chip.greed { background: rgba(239,68,68,.18); color: #ffb4b4; border-color: #ef4444; }
  .fg-chip.egreed { background: rgba(239,68,68,.32); color: #ffdada; border-color: #ef4444; }
  .fg-chip.neutral { background: var(--elev); color: var(--t2); }
  .fg-chip.insufficient { background: rgba(245,158,11,.18); color: #ffd68f; border-color: #f59e0b; }
  .fg-modal { position: fixed; inset: 0; z-index: 200; background: rgba(0,0,0,.5);
    display: flex; align-items: center; justify-content: center; padding: 20px; }
  .fg-modal-card { background: var(--card); border: 1px solid var(--border); border-radius: 12px;
    padding: 18px; max-width: 520px; width: 100%; max-height: 88vh; overflow-y: auto; }
  .fg-modal-head { display: flex; align-items: baseline; gap: 10px; margin-bottom: 10px; }
  .fg-modal-head .score { font-size: 32px; font-weight: 800; color: var(--t1); }
  .fg-modal-head .mood  { font-size: 15px; font-weight: 700; }
  .fg-modal-head .date  { flex: 1; text-align: right; font-size: 11px; color: var(--t3);
    font-family: ui-monospace, "SF Mono", Menlo, monospace; }
  .fg-note { font-size: 12px; color: var(--t3); margin-bottom: 12px; line-height: 1.6; }
  .fg-sub { border-top: 1px solid var(--border); padding-top: 10px; }
  .fg-sub-row { display: grid; grid-template-columns: 96px 1fr 44px; gap: 10px;
    align-items: center; padding: 5px 0; font-size: 13px; }
  .fg-sub-row .lbl { color: var(--t2); }
  .fg-sub-row .bar { height: 6px; background: var(--elev); border-radius: 3px; overflow: hidden; }
  .fg-sub-row .bar > div { height: 100%; }
  .fg-sub-row .val { text-align: right; color: var(--t1); font-weight: 600;
    font-family: ui-monospace, "SF Mono", Menlo, monospace; }
  .fg-spark { margin-top: 14px; padding-top: 10px; border-top: 1px solid var(--border); }
  .fg-spark-title { font-size: 12px; color: var(--t2); margin-bottom: 6px; }
  .fg-close { background: var(--elev); border: 1px solid var(--border); color: var(--t2);
    border-radius: 6px; padding: 6px 12px; cursor: pointer; font-size: 12px; margin-top: 12px; }

  /* ── 登录页 ── */
  .login-overlay { position: fixed; inset: 0; background: var(--bg);
    display: flex; align-items: center; justify-content: center; padding: 20px;
    overflow-y: auto; }
  .login-overlay > .login-box { margin: auto; flex-shrink: 0; }
  .login-box { background: var(--card); border: 1px solid var(--border);
    border-radius: 12px; padding: 28px 28px 24px;
    width: 100%; max-width: 360px;
    display: flex; flex-direction: column; gap: 14px; }
  .login-box h2 { margin: 0; font-size: 22px; color: var(--t1); text-align: center; }
  .login-box .sub { font-size: 12px; color: var(--t3); text-align: center; margin-top: -6px; }
  .login-box input { padding: 10px 12px; border-radius: 8px;
    background: var(--elev); border: 1px solid var(--border);
    color: var(--t1); font-size: 14px; outline: none;
    font-family: inherit; }
  .login-box input:focus { border-color: var(--accent); }
  .login-box button { padding: 10px 18px; border-radius: 8px;
    background: linear-gradient(135deg, var(--accent), #f59e0b);
    color: #fff; border: 0; font-size: 14px; font-weight: 700;
    cursor: pointer; font-family: inherit; }
  .login-box button:disabled { opacity: 0.5; cursor: default; }
  .login-err { font-size: 12.5px; color: var(--up); text-align: center; }
  .login-switch { background: transparent !important; color: var(--accent) !important;
    padding: 2px !important; font-size: 12px !important; font-weight: 500 !important; }
  .login-terms { display: flex; gap: 8px; align-items: flex-start; color: var(--t3);
    font-size: 11.5px; line-height: 1.5; }
  .login-terms input { margin-top: 2px; accent-color: var(--accent); }
  .login-terms a { color: var(--accent); }
  .login-notice { margin: 0; color: var(--t3); font-size: 11.5px; line-height: 1.5; }
  .account-chip { color: var(--t2); border: 1px solid var(--border); background: var(--elev);
    border-radius: 999px; padding: 3px 9px; font-size: 11px; white-space: nowrap; }
  .research-note { color: var(--t3); font-size: 11.5px; line-height: 1.55;
    border-left: 2px solid var(--accent); padding-left: 9px; }
  .lock-banner { margin: 8px 0; padding: 9px 11px; border: 1px solid rgba(245,158,11,.35);
    background: rgba(245,158,11,.09); color: #ffd38a; border-radius: 8px; font-size: 12px; }
  .pricing { max-width: 980px; margin: 0 auto; }
  .pricing-hero { text-align: center; padding: 36px 12px 24px; }
  .pricing-hero h2 { font-size: 28px; margin: 0 0 8px; }
  .pricing-hero p { color: var(--t3); margin: 0; }
  .price-grid { display: grid; grid-template-columns: repeat(3,minmax(0,1fr)); gap: 14px; }
  .price-card { background: var(--card); border: 1px solid var(--border); border-radius: 14px;
    padding: 20px; display: flex; flex-direction: column; gap: 12px; }
  .price-card.hot { border-color: var(--accent); box-shadow: 0 0 0 1px rgba(245,158,11,.2); }
  .price-card h3 { margin: 0; font-size: 17px; }.price-num { font-size: 30px; font-weight: 800; }
  .price-num small { color: var(--t3); font-size: 12px; font-weight: 500; }
  .price-features { margin: 0; padding-left: 18px; color: var(--t2); font-size: 13px; flex: 1; }
  .price-btn { border: 0; border-radius: 8px; padding: 10px 12px; background: var(--accent);
    color: white; font-weight: 700; cursor: pointer; }.price-btn:disabled { opacity:.5;cursor:default; }
  .price-note { margin-top: 16px; color: var(--t3); font-size: 12px; text-align: center; }
  @media(max-width:720px){.price-grid{grid-template-columns:1fr}.pricing-hero{padding-top:20px}}
  .logout-btn { background: transparent; border: 1px solid var(--border);
    color: var(--t3); padding: 4px 10px; border-radius: 6px; cursor: pointer;
    font-size: 11px; font-family: inherit; transition: all 150ms; }
  .logout-btn:hover { color: var(--up); border-color: var(--up); }
  .full-core-review summary { cursor: pointer; }
  .full-core-review input, .full-core-review .review-stock-button {
    color: var(--t1); background: var(--elev); border: 1px solid var(--border);
    border-radius: 6px; padding: 8px 10px; font: inherit;
  }
  .full-core-review .review-stock-button { cursor: pointer; }
  .full-core-review .review-stock-button[aria-expanded="true"] { border-color: var(--accent); }
  .full-core-review a, .core-evidence a { color: #8bc8ff; text-underline-offset: 3px; }
  .full-core-review td, .full-core-review th { padding: 6px 4px; border-bottom: 1px solid var(--border); }
  .full-core-review :focus-visible { outline: 2px solid #8bc8ff; outline-offset: 2px; }
