/* 招财喵投资工作台 - 亮色苹果简洁风 */

:root{
  --bg:#ffffff;
  --bg-2:#f5f5f7;
  --bg-3:#fafafa;
  --text:#1d1d1f;
  --text-2:#6e6e73;
  --text-3:#a1a1a6;
  --border:rgba(0,0,0,.08);
  --border-2:rgba(0,0,0,.14);
  --accent:#e02424;          /* 财经红（涨 / 强调） */
  --accent-soft:#fdecea;     /* 浅红底 */
  --down:#0a9d5b;            /* 跌绿（A股/港股口径） */
  --down-soft:#e7f6ee;       /* 浅绿底 */
  --gold:#c9a227;            /* 金（品牌点缀） */
  --blue:#1a6fd6;            /* 蓝（高股息标记 / 买入操作） */
  --blue-soft:#e8f1fc;       /* 浅蓝底（买入徽标） */
  --radius:14px;
  --radius-sm:10px;
  --shadow:0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04);
}

*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{
  font-family:-apple-system,BlinkMacSystemFont,"SF Pro Text","SF Pro Display","PingFang SC","Microsoft YaHei","Segoe UI",sans-serif;
  color:var(--text);
  background:var(--bg-2);
  -webkit-font-smoothing:antialiased;
}

.app{
  display:grid;
  grid-template-columns:240px 1fr;
  height:100vh;
  height:100dvh; /* 动态视口：手机浏览器工具栏展开/收起时自动适配，避免底部被遮挡 */
  max-width:1280px;
  margin:0 auto;
  background:var(--bg);
}

/* ---------- 侧边栏（桌面） ---------- */
.sidebar{
  background:var(--bg);
  border-right:1px solid var(--border);
  display:flex;
  flex-direction:column;
  padding:22px 14px;
}
.brand{display:flex;flex-direction:column;align-items:center;gap:10px;padding:6px 8px 20px}
.brand-mark{
  width:60px;height:60px;border-radius:50%;
  overflow:hidden;flex:none;background:transparent;
  box-shadow:0 2px 6px rgba(0,0,0,.14);
}
.brand-mark img{width:100%;height:100%;object-fit:cover;display:block}
.brand-text{display:flex;align-items:center;gap:6px;min-width:0;flex-wrap:wrap}
.brand-url{flex-basis:100%;font-size:10.5px;font-weight:400;color:var(--text-3);letter-spacing:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:1px}
.brand-url{text-decoration:none}
.brand-url:hover{color:var(--text-2)}
.brand-name{font-size:16px;font-weight:600;letter-spacing:.3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.brand-ver{
  font-size:11px;font-weight:600;line-height:1;
  color:var(--gold);background:rgba(201,162,39,.12);
  border:1px solid rgba(201,162,39,.4);
  padding:2px 7px;border-radius:999px;flex:none;
}

.nav{display:flex;flex-direction:column;gap:4px;flex:1}
.nav-item{
  display:flex;align-items:center;gap:12px;
  padding:11px 12px;border:none;background:transparent;
  color:var(--text-2);font-size:15px;font-family:inherit;
  cursor:pointer;border-radius:var(--radius-sm);
  text-align:left;transition:background .15s,color .15s;
}
.nav-item svg{width:21px;height:21px;flex:none}
.nav-item:hover{background:var(--bg-2)}
.nav-item.active{background:var(--accent-soft);color:var(--accent);font-weight:500}
.side-stats{font-size:11px;color:var(--text-3);padding:10px 8px 0;text-align:center;line-height:1.5}
.sidebar-foot{font-size:11px;color:var(--text-3);padding:10px 8px;display:flex;flex-direction:column;align-items:center;gap:2px;line-height:1.5;text-align:center}
.sidebar-foot a{color:inherit;text-decoration:none}
.sidebar-foot a:hover{color:var(--text-2)}

/* ---------- 顶栏（手机） ---------- */
.topbar{
  display:none;align-items:center;gap:10px;padding:14px 18px;
  background:var(--bg);border-bottom:1px solid var(--border);
  position:sticky;top:0;z-index:5;
}
.topbar-avatar{
  width:28px;height:28px;border-radius:50%;
  object-fit:cover;display:block;flex:none;
  box-shadow:0 1px 2px rgba(0,0,0,.15);
}
.topbar-title{font-size:17px;font-weight:600}

/* ---------- 内容区 ---------- */
.content{padding:28px 32px;overflow:auto}
.module{display:none}
.module.active{display:block;animation:fade .2s ease}
@keyframes fade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
.module-head h1{font-size:24px;font-weight:600}
.module-head .sub{color:var(--text-2);font-size:14px;margin-top:4px}

.placeholder{
  margin-top:40px;min-height:48vh;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:10px;color:var(--text-3);
}
.ph-icon{
  width:64px;height:64px;border-radius:18px;
  background:var(--bg-2);display:flex;align-items:center;justify-content:center;
  color:var(--text-3);
}
.ph-icon svg{width:32px;height:32px}
.ph-title{font-size:17px;color:var(--text-2);font-weight:500}
.ph-sub{font-size:13px}

/* ---------- 底部 Tab（手机） ---------- */
.tabbar{
  display:none;
  /* 自动均分列，不用写死数量：以后再加模块不必回来改这里（原为 repeat(5,1fr)） */
  grid-auto-flow:column;grid-auto-columns:1fr;
  background:var(--bg);border-top:1px solid var(--border);
  padding:8px 0 calc(12px + env(safe-area-inset-bottom));
}
.tab{
  display:flex;flex-direction:column;align-items:center;gap:3px;
  border:none;background:transparent;color:var(--text-3);
  font-family:inherit;font-size:11px;cursor:pointer;padding:6px 0;
}
.tab svg{width:22px;height:22px}
.tab.active{color:var(--accent)}

/* ---------- 自选股票模块 ---------- */
/* 自选股票顶部信息行：左「共 N 只」（JS 写入）+ 右「数据基准日」（固定文案，品牌金色）同一行显示。
   margin 由行容器统一给（原挂 .wl-count 上），两个 span 都退回行内 —— 由 flex 负责排布。 */
.wl-meta-row{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;margin:14px 0 4px}
.wl-count{font-size:13px;color:var(--text-3)}
.wl-asof{font-size:13px;color:var(--gold)}

.wl-grid{
  margin-top:18px;display:flex;flex-direction:column;gap:14px;
}
.wl-card{
  position:relative;text-align:left;
  background:var(--bg);border:1px solid var(--border);border-radius:var(--radius);
  padding:16px 16px 14px;font-family:inherit;color:var(--text);
  box-shadow:var(--shadow);transition:border-color .15s,box-shadow .15s;
}
.wl-card:hover{border-color:var(--border-2)}
/* 卡头 = 卡片里"永远可见"的那一整块（角标 / 简称 / 行业 / 概括 / 性质）—— 它整体就是开关：
   与「资料大全」研究报告卡片同款交互，点卡片任意处即下拉折叠，右上角只留「展开 ▾ / 收起 ▴」文案提示。 */
.wl-card-head{display:flex;flex-direction:column;gap:7px;cursor:pointer}
.wl-card:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.wl-badge{
  display:inline-block;font-size:11px;font-weight:600;line-height:1;
  padding:3px 8px;border-radius:999px;
}
.badge-a{color:#e02424;background:var(--accent-soft)}
.badge-hk{color:#c9a227;background:rgba(201,162,39,.12)}
.badge-us{color:#2563eb;background:rgba(37,99,235,.1)}
/* 行业排名徽标：全球/国内榜单名次（紫，区别于市场/持仓色） */
.badge-rank{color:#7c3aed;background:rgba(124,58,237,.1)}
/* 持仓状态徽标：已建仓=红 / 观察中=蓝（后续与「我的持仓」模块联动） */
.wl-status{
  display:inline-block;font-size:11px;font-weight:600;line-height:1;
  padding:3px 8px;border-radius:999px;
}
.status-held{color:#e02424;background:var(--accent-soft)}
.status-watch{color:#2563eb;background:rgba(37,99,235,.1)}
/* 卡头首行：左=徽标组，右=「展开」提示（窄屏允许换行，徽标不会被挤出屏幕） */
.wl-card-top{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap}
.wl-card-badges{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
/* 证券简称 + 代码同行显示（父级已是 flex 纵向列，块间距统一交给父级 gap；这里只做 2px 微调） */
.wl-name-row{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;margin-top:2px}
.wl-name{font-size:17px;font-weight:600}
.wl-code{font-size:13px;color:var(--text-2);font-variant-numeric:tabular-nums}
.wl-industry{font-size:12px;color:var(--text-3)}
.wl-biz{font-size:12px;color:var(--text-2);line-height:1.7}
.wl-nature{font-size:11px;color:var(--gold)}
/* 右上角「展开 ▾ / 收起 ▴」：只是文案提示，不带边框 —— 点击热区是整个卡头（见 .wl-card-head） */
.wl-toggle{
  flex:none;display:inline-flex;align-items:center;gap:4px;
  font-size:11.5px;font-weight:500;color:var(--text-3);white-space:nowrap;
}
.wl-chevron{width:13px;height:13px;flex:none;transition:transform .2s ease}
.wl-card.expanded .wl-toggle{color:var(--accent)}
.wl-card.expanded .wl-chevron{transform:rotate(180deg)}

/* 详情展开区（"下拉"出来的那部分）：默认不进布局，展开时整体淡入下滑。
   ⚠️ 不用 max-height 过渡：详情字段有 17 行、每行都会折行，写死的上限迟早把内容截断
   （.wl-detail 是 overflow:hidden，超限的部分会**静默消失**）。任意高度安全的做法只有 display 切换。 */
.wl-detail{display:none}
.wl-card.expanded .wl-detail{display:block;animation:wlUnfold .2s ease-out}
@keyframes wlUnfold{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
.wl-detail-inner{margin-top:14px;padding-top:14px;border-top:1px solid var(--border)}
.wl-detail-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px 24px}
.wl-detail-row{display:flex;flex-direction:column;gap:3px}
.wl-detail-label{font-size:11px;color:var(--text-3)}
.wl-detail-val{font-size:13px;color:var(--text);line-height:1.5;word-break:break-word}

.wl-empty{
  margin-top:48px;min-height:36vh;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;
  color:var(--text-3);text-align:center;
}
.wl-empty-icon{width:56px;height:56px;border-radius:16px;background:var(--bg-2);
  display:flex;align-items:center;justify-content:center;color:var(--text-3)}
.wl-empty-icon svg{width:28px;height:28px}
.wl-empty-title{font-size:17px;color:var(--text-2);font-weight:500}
.wl-empty-sub{font-size:13px;max-width:420px;line-height:1.6}

/* ---------- 实时行情模块 ---------- */
.qt-bar{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:14px 0 4px;flex-wrap:wrap}
.qt-meta{font-size:13px;color:var(--text-3);line-height:1.5}
/* 行情条实时时钟 + 固定来源标注 */
.qt-clock{font-variant-numeric:tabular-nums;color:var(--text-2);font-weight:700}
.qt-src::before{content:"·";margin:0 6px;color:var(--text-3)}
.qt-actions{display:flex;align-items:center;gap:8px;flex:none;margin-left:auto}
/* 自动刷新状态灯 + 倒计时（纯展示，不可点击） */
.qt-live{
  display:inline-flex;align-items:center;gap:7px;flex:none;
  color:var(--text-3);font-size:12.5px;font-weight:500;
  padding:7px 2px;white-space:nowrap;font-variant-numeric:tabular-nums;
}
.qt-live-dot{width:7px;height:7px;border-radius:50%;background:var(--text-3);flex:none;transition:background .15s}
.qt-live.live{color:var(--accent)}
.qt-live.live .qt-live-dot{background:var(--accent);animation:qt-pulse 1.6s ease-in-out infinite}
@keyframes qt-pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.3;transform:scale(.75)}}
.qt-refresh{
  display:inline-flex;align-items:center;gap:6px;flex:none;
  border:1px solid var(--border-2);background:var(--bg);
  color:var(--text-2);font-family:inherit;font-size:13px;font-weight:500;
  padding:7px 13px;border-radius:999px;cursor:pointer;min-height:36px;
  transition:background .15s,color .15s;
}
.qt-refresh:hover{background:var(--bg-2);color:var(--text)}
.qt-refresh svg{width:15px;height:15px}
.qt-refresh.spin svg{animation:qt-spin .7s linear infinite}
@keyframes qt-spin{to{transform:rotate(360deg)}}

.qt-grid{margin-top:18px;display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:14px}
.qt-card{
  background:var(--bg);border:1px solid var(--border);border-radius:var(--radius);
  padding:18px 18px 16px;box-shadow:var(--shadow);transition:border-color .15s;
}
.qt-card:hover{border-color:var(--border-2)}
.qt-head{display:flex;align-items:center;justify-content:space-between;gap:8px}
.qt-name{font-size:16px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.qt-code{font-size:12px;color:var(--text-3);font-variant-numeric:tabular-nums;letter-spacing:.4px;margin-top:2px}
.qt-price{font-size:36px;font-weight:700;line-height:1.1;letter-spacing:-.5px;margin:12px 0 6px;font-variant-numeric:tabular-nums}
.qt-chg{display:flex;align-items:baseline;gap:12px;font-size:14px;font-weight:600;font-variant-numeric:tabular-nums}
.qt-turn{
  margin-top:14px;padding-top:12px;border-top:1px solid var(--border);
  display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:13px;
}
.qt-turn-label{color:var(--text-3)}
.qt-turn-val{color:var(--text);font-weight:600;font-variant-numeric:tabular-nums}
/* 涨红跌绿 */
.qt-price.up,.qt-chg.up{color:var(--accent)}
.qt-price.down,.qt-chg.down{color:var(--down)}
.qt-price.flat,.qt-chg.flat{color:var(--text-2)}

/* ---------- 我的持仓模块 ---------- */
.hd-bar{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:14px 0 4px;flex-wrap:wrap}
.hd-meta{font-size:13px;color:var(--text-3);line-height:1.5}
#vl-meta{color:var(--gold)}   /* 估值笔记顶部只显示数据基准日，用品牌金色突出 */

/* 汇总卡：总市值 / 总浮动盈亏（金额与百分比同一行；明细栏已去掉，不再有 hd-sum-item-slim / hd-sum-row） */
.hd-sum{margin-top:16px}
.hd-sum-card{
  display:grid;grid-template-columns:1fr 1fr;gap:18px;
  background:var(--bg);border:1px solid var(--border);border-radius:var(--radius);
  padding:18px;box-shadow:var(--shadow);
}
.hd-sum-item{min-width:0}
.hd-sum-item + .hd-sum-item{border-left:1px solid var(--border);padding-left:18px}
.hd-sum-k{font-size:12px;color:var(--text-3);margin-bottom:6px}
.hd-sum-v{font-size:28px;font-weight:700;line-height:1.15;letter-spacing:-.5px;font-variant-numeric:tabular-nums}
.hd-sum-unit{font-size:13px;font-weight:500;color:var(--text-3);margin-left:5px;letter-spacing:0}
/* 金额与百分比同一行：flex 基线对齐（28px 与 14px 的基线仍然对齐）；放不下时自动折到第二行，不会撑破卡片 */
.hd-sum-valrow{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.hd-sum-sub{font-size:14px;font-weight:600;font-variant-numeric:tabular-nums}
.hd-sum-note{margin-top:10px;font-size:12px;color:var(--text-3)}
/* 涨红跌绿（与行情模块同一口径） */
.hd-sum-v.up,.hd-sum-sub.up{color:var(--accent)}
.hd-sum-v.down,.hd-sum-sub.down{color:var(--down)}
.hd-sum-v.flat,.hd-sum-sub.flat{color:var(--text-2)}

/* 持仓列表：一行一只，四列对齐 */
.hd-body{margin-top:18px;display:flex;flex-direction:column;gap:12px}
.hd-head{
  display:grid;grid-template-columns:1.5fr 1fr 1fr 1.1fr;gap:14px;
  /* ⚠️ 左右是 19px 而不是 18px：.hd-row 还有 1px 边框，表头没有 ——
     不补这 1px，两边的 content 盒就差 2px，fr 轨道按比例一摊，4 列的右边缘全都错开约 0.6px */
  padding:0 19px;font-size:12px;color:var(--text-3);
}
.hd-head-r{text-align:right}
.hd-row{
  display:grid;grid-template-columns:1.5fr 1fr 1fr 1.1fr;gap:14px;align-items:center;
  background:var(--bg);border:1px solid var(--border);border-radius:var(--radius);
  padding:16px 18px;box-shadow:var(--shadow);transition:border-color .15s;
}
.hd-row:hover{border-color:var(--border-2)}
.hd-cell{min-width:0}
.hd-title{display:flex;align-items:center;gap:8px;min-width:0}
.hd-name{font-size:16px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 市值行：名称下方的市值（市场徽标与渠道徽标已于 2026-09-21 按用户要求去掉） */
.hd-mvrow{display:flex;align-items:center;gap:8px;margin-top:5px;min-width:0}
.hd-mv{font-size:15px;color:var(--text-2);font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 列标签：桌面端与手机端都由 .hd-head 表头承担（手机端表头保留、字号压到 10.5px） */
.hd-k{display:none;font-size:11px;color:var(--text-3);margin-bottom:3px}
.hd-v{font-size:15px;font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap}
.hd-slash{color:var(--text-3);font-weight:400;margin:0 3px}
.hd-cell-pnl{text-align:right}
.hd-pct{font-size:13px;font-weight:600;margin-top:2px;font-variant-numeric:tabular-nums}
.hd-v.up,.hd-pct.up,.hd-name.up{color:var(--accent)}
.hd-v.down,.hd-pct.down,.hd-name.down{color:var(--down)}
.hd-mv.up{color:var(--accent)}
.hd-mv.down{color:var(--down)}
.hd-mv.flat{color:var(--text-2)}
.hd-v.flat,.hd-pct.flat{color:var(--text-2)}

/* ---------- 估值分析 ---------- */
/* 配色语义：「估值温度」而非涨跌 —— 低估=绿(便宜) / 合理=金 / 偏高=红(贵)，
   与行情模块的"涨红跌绿"是两套语义，故在模块副标题里显式声明，避免误读 */
.vl-grid{margin-top:18px;display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:14px}
.vl-card{
  background:var(--bg);border:1px solid var(--border);border-radius:var(--radius);
  padding:18px;box-shadow:var(--shadow);display:flex;flex-direction:column;gap:13px;
  transition:border-color .15s;
}
.vl-card:hover{border-color:var(--border-2)}
.vl-top{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
.vl-id{display:flex;flex-direction:column;gap:3px;min-width:0}
.vl-name-row{display:flex;align-items:center;gap:8px;min-width:0}
.vl-name{font-size:17px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.vl-code{font-size:12px;color:var(--text-3);font-variant-numeric:tabular-nums;letter-spacing:.4px}
/* 结论徽标 */
.vl-verdict{
  display:inline-flex;align-items:center;gap:6px;flex:none;
  font-size:13px;font-weight:700;padding:5px 11px;border-radius:999px;white-space:nowrap;
}
.vl-verdict::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor;flex:none}
.vd-cheap{color:var(--down);background:var(--down-soft)}
.vd-fair{color:#8a6d1a;background:#fbf4de}
.vd-rich{color:var(--accent);background:var(--accent-soft)}
.vd-none{color:var(--text-3);background:var(--bg-2)}
/* 价格 + 市值 */
.vl-price-row{display:flex;align-items:baseline;justify-content:space-between;gap:12px;flex-wrap:wrap}
.vl-price{font-size:30px;font-weight:700;line-height:1.1;letter-spacing:-.5px;font-variant-numeric:tabular-nums}
.vl-chg{font-size:14px;font-weight:600;margin-left:8px;font-variant-numeric:tabular-nums}
.vl-price.up,.vl-chg.up{color:var(--accent)}
.vl-price.down,.vl-chg.down{color:var(--down)}
.vl-price.flat,.vl-chg.flat{color:var(--text-2)}
.vl-cap{font-size:11px;color:var(--text-3);text-align:right;line-height:1.5;font-variant-numeric:tabular-nums}
.vl-cap b{display:block;font-size:14px;color:var(--text-2);font-weight:600}
/* 三项估值指标（客观数值） */
.vl-metrics{
  display:grid;grid-template-columns:repeat(3,1fr);gap:10px 8px;
  padding:12px 0;border-top:1px solid var(--border);border-bottom:1px solid var(--border);
}
.vl-metric{min-width:0}
.vl-metric-k{font-size:11px;color:var(--text-3);margin-bottom:4px;white-space:nowrap}
.vl-metric-v{font-size:16px;font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap}
/* 股息率条件着色（客观分档，非买卖建议）：≥5% 蓝 / ≤3% 红 / 3%~5% 默认灰 */
.vl-metric-v.dy-high{color:var(--blue)}
.vl-metric-v.dy-low{color:var(--accent)}
.vl-metric-src{font-size:10px;color:var(--text-3);margin-top:3px}
/* 近十年分位进度条（客观展示数值位置，无判档着色，规避风险提示）。
   2026-09-23 用户指定：分位**百分比数值**与 0%/50%/100% **刻度**一并改为品牌金色，
   与本来就金色的 `.vl-pct-label` 统一（条形填充的金色渐变保持不变）。 */
.vl-pcts{padding-top:12px;display:flex;flex-direction:column;gap:12px}
.vl-pct-row{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:10px}
.vl-pct-label{font-size:11px;color:var(--gold);white-space:nowrap}
.vl-pct-track{position:relative;height:8px;border-radius:5px;background:var(--bg-2);overflow:hidden}
.vl-pct-fill{
  position:absolute;left:0;top:0;height:100%;border-radius:5px;
  background:linear-gradient(90deg,#c9a227,#e6c068);min-width:4px;transition:width .45s ease;
}
.vl-pct-num{font-size:13px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--gold);white-space:nowrap;min-width:56px;text-align:right}
.vl-pct-scale{display:flex;justify-content:space-between;font-size:10px;color:var(--gold);font-variant-numeric:tabular-nums;padding:0 2px}
/* 锚定指标 + 合理区间 + 依据 */
.vl-fair{
  display:flex;gap:8px;font-size:12.5px;line-height:1.6;color:var(--text-2);
  background:var(--bg-3);border-radius:var(--radius-sm);padding:10px 12px;
}
.vl-fair-k{color:var(--text-3);flex:none}
.vl-note{font-size:12px;line-height:1.7;color:var(--text-2)}

/* ---------- 响应式：手机 / 竖屏 ---------- */
@media (max-width:820px){
  .wl-detail-grid{grid-template-columns:1fr;gap:10px}
  /* .wl-toggle 原是 44px 触摸目标 —— 点击热区已扩大为整个 .wl-card-head，不再需要 */
  .qt-refresh{min-height:44px}
  .qt-grid{grid-template-columns:1fr;gap:12px}
  .qt-price{font-size:34px}
  /* 汇总卡：改单列，分隔线由左侧改为上边（只剩两块） */
  .hd-sum-card{grid-template-columns:1fr;gap:14px;padding:16px}
  .hd-sum-item + .hd-sum-item{border-left:none;padding-left:0;border-top:1px solid var(--border);padding-top:14px}
  .hd-sum-v{font-size:26px}
  .hd-sum-valrow{gap:8px}
  /* 持仓行：**一行一只** —— 手机端也是 4 列网格，表头保留（由它说明列义），格内标签隐藏。
     ⚠️ 轨道必须写 minmax(0,Xfr)，裸 Xfr 的最小值是"网格项最小内容宽"，
        而 .hd-v / .hd-mv 都是 nowrap（港股 "HK$426.200"），会把轨道撑宽 → 整行溢出屏幕。 */
  .hd-head{
    display:grid;grid-template-columns:minmax(0,1.6fr) minmax(0,.7fr) minmax(0,1.05fr) minmax(0,1.05fr);
    gap:8px;padding:0 15px;font-size:10.5px;   /* 15 = .hd-row 的 14px + 1px 边框，列才对得齐 */
  }
  .hd-k{display:none}
  .hd-row{
    grid-template-columns:minmax(0,1.6fr) minmax(0,.7fr) minmax(0,1.05fr) minmax(0,1.05fr);
    gap:8px;padding:11px 14px;
  }
  .hd-cell-name{grid-column:auto}
  .hd-cell-pnl{text-align:right}
  .hd-name{font-size:13px}
  .hd-title{gap:5px}
  .hd-mvrow{gap:5px;margin-top:3px}
  .hd-mv{font-size:10.5px}
  .hd-v{font-size:11.5px;overflow:hidden}
  .hd-pct{font-size:10px;margin-top:1px}
  /* 「现价/成本」列放不下一行（港股 "HK$426.800/HK$471.993" 需 196px，这列只有 ~65px），
     会把整行撑宽、把成本最后一位推出屏幕。让「/」变成零高块 → 现价与成本各占一行
     （列头本来就写着「现价/成本」）。⚠️ 光靠 minmax(0,Xfr) 治不好：轨道能缩，nowrap 文本仍会溢出格子。 */
  .hd-cell-price .hd-slash{display:block;height:0;overflow:hidden}
}
@media (max-width:820px){
  .app{
    grid-template-columns:1fr;
    grid-template-rows:auto 1fr auto;
    height:100vh;
    height:100dvh; /* 同步修复：避免手机底部工具栏遮挡 Tab 栏 */
  }
  .sidebar{display:none}
  .topbar{display:flex}
  .content{padding:18px 16px}
  .tabbar{display:grid}
}

/* ---------- 轻提示：自选库改动后自动同步 ---------- */
/* 纯展示，不拦截任何交互；手机避让底部 Tab 栏与 iPhone 安全区 */
.zcm-toast{
  position:fixed;left:50%;bottom:calc(80px + env(safe-area-inset-bottom));
  transform:translate(-50%,10px);
  background:rgba(28,28,30,.92);color:#fff;
  font-size:13px;font-weight:500;line-height:1.45;
  padding:10px 16px;border-radius:999px;
  box-shadow:0 8px 24px rgba(0,0,0,.18);
  opacity:0;pointer-events:none;z-index:9999;
  max-width:calc(100% - 32px);text-align:center;
  transition:opacity .22s ease,transform .22s ease;
}
.zcm-toast.show{opacity:1;transform:translate(-50%,0)}
@media (min-width:821px){
  .zcm-toast{bottom:28px}
}

/* ---------- 估值分析：手机端 ---------- */
@media (max-width:820px){
  .vl-grid{grid-template-columns:1fr;gap:12px}
  .vl-card{padding:16px;gap:12px}
  .vl-price{font-size:27px}
  .vl-cap{text-align:left}
  .vl-metric-v{font-size:15px}
}

/* ---------- 每日复盘 ---------- */
/* 查看日期：下拉式年月日选择器（2026-09-22 二次改造）。
   位置在「今日操作」功能区的**标题栏右侧**（原先是功能区之外的一条独立下拉）。
   结构 = 触发器 .rv-dp-trigger + 弹出面板 .rv-dp-panel（« / 年下拉 + 月下拉 / » / 日网格 / 说明）；
   红点 .rv-dp-day-dot = 当天有实盘操作；面板内容由 paintDpPanel() 重建，不要写静态日子。 */
.rv-dp{margin-left:auto;align-self:center;position:relative}
.rv-dp-trigger{
  display:inline-flex;align-items:center;gap:8px;
  border:1px solid var(--border-2);background:var(--bg);color:var(--text);
  font-family:inherit;font-size:12.5px;font-weight:500;
  padding:6px 12px;border-radius:999px;cursor:pointer;min-height:32px;
  font-variant-numeric:tabular-nums;transition:background .15s,border-color .15s;
}
.rv-dp-trigger:hover{background:var(--bg-2)}
.rv-dp-trigger:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.rv-dp.is-open .rv-dp-trigger{background:var(--bg-2)}
.rv-dp-cal,.rv-dp-caret{width:14px;height:14px;flex:none}
.rv-dp-cal{color:var(--accent)}
.rv-dp-caret{color:var(--text-3);transition:transform .15s}
.rv-dp.is-open .rv-dp-caret{transform:rotate(180deg)}
.rv-dp-label{white-space:nowrap;font-variant-numeric:tabular-nums}
/* 面板：绝对定位。⚠️ 靠 .rv-sec 取消裁切才能溢出到下面的「今日复盘」框上 */
.rv-dp-panel{
  display:none;position:absolute;top:calc(100% + 8px);right:0;z-index:40;
  width:292px;max-width:calc(100vw - 32px);padding:12px;
  background:var(--bg);border:1px solid var(--border-2);border-radius:14px;
  box-shadow:0 14px 36px rgba(0,0,0,.16),0 2px 6px rgba(0,0,0,.06);
}
.rv-dp-panel.is-open{display:block}
.rv-dp-nav{display:flex;align-items:center;justify-content:space-between;gap:6px;margin-bottom:8px}
.rv-dp-step{
  display:inline-flex;align-items:center;justify-content:center;flex:none;
  width:28px;height:28px;border:0;border-radius:8px;background:transparent;
  color:var(--text-2);cursor:pointer;transition:background .12s;
}
.rv-dp-step svg{width:14px;height:14px}
.rv-dp-step:hover{background:var(--bg-2)}
.rv-dp-step:focus-visible{outline:2px solid var(--accent);outline-offset:1px}
.rv-dp-step:disabled{opacity:.28;cursor:default;background:transparent}
.rv-dp-ym{display:flex;align-items:center;gap:2px;min-width:0}
.rv-dp-sel{
  appearance:none;-webkit-appearance:none;
  border:1px solid transparent;background:transparent;color:var(--text);
  font-family:inherit;font-size:13px;font-weight:600;cursor:pointer;
  padding:4px 6px;border-radius:8px;font-variant-numeric:tabular-nums;
  transition:background .12s;
}
.rv-dp-sel:hover{background:var(--bg-2)}
.rv-dp-sel:focus-visible{outline:2px solid var(--accent);outline-offset:1px}
.rv-dp-week,.rv-dp-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.rv-dp-week span{text-align:center;font-size:10.5px;color:var(--text-3);padding:2px 0 6px}
.rv-dp-day{
  position:relative;display:flex;align-items:center;justify-content:center;
  height:32px;border:0;border-radius:9px;background:transparent;color:var(--text);
  font-family:inherit;font-size:12.5px;font-weight:500;cursor:pointer;
  font-variant-numeric:tabular-nums;transition:background .12s;
}
.rv-dp-day.is-blank{cursor:default}
.rv-dp-day:not(.is-blank):hover{background:var(--bg-2)}
.rv-dp-day:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}
.rv-dp-day.is-future .rv-dp-day-n{color:var(--text-3);opacity:.6}
.rv-dp-day.is-today{box-shadow:inset 0 0 0 1.5px var(--border-2)}
.rv-dp-day.is-sel,.rv-dp-day.is-sel:hover{background:var(--accent);color:#fff;font-weight:600}
.rv-dp-day.is-sel.is-today{box-shadow:none}
/* 红点：有实盘操作的日期（自动补记的「无操作」不打点，否则几乎天天有点、等于没点） */
.rv-dp-day-dot{position:absolute;left:50%;bottom:2px;margin-left:-2px;width:4px;height:4px;border-radius:50%;background:var(--accent)}
.rv-dp-day.is-sel .rv-dp-day-dot{background:#fff}
.rv-dp-foot{
  display:flex;align-items:center;gap:6px;margin-top:8px;padding-top:9px;
  border-top:1px solid var(--border);font-size:11px;line-height:1.4;color:var(--text-3);
}
.rv-dp-foot-dot{flex:none;width:5px;height:5px;border-radius:50%;background:var(--accent)}

/* ---------- 两个功能区「显示框」：今日操作 / 今日复盘（2026-09-22 用户指定） ----------
   每个功能区 = 外框 .rv-sec + 标题栏 .rv-sec-head + 内容 .rv-sec-body；
   框内原卡片一律「去壳」（见下方 #m-review 作用域覆盖），避免形成双层边框。 */
.rv-sec{
  margin-top:14px;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius);
  box-shadow:var(--shadow);
  /* ⚠️ 规则体内**不能**再出现 overflow:hidden：标题栏里的年月日选择器面板必须能溢到
     「今日复盘」框上。标题栏的浅灰底改成自己收圆角（否则顶角会被撑成直角）。 */
}
.rv-sec-head{
  display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;
  padding:12px 20px;background:var(--bg-2);border-bottom:1px solid var(--border);
  border-radius:calc(var(--radius) - 1px) calc(var(--radius) - 1px) 0 0;
}
.rv-sec-title{font-size:15px;font-weight:600;color:var(--text);letter-spacing:-.1px}
.rv-sec-note{font-size:11.5px;color:var(--text-3)}
.rv-sec-body{padding:18px 20px}

/* 框内卡片去壳：.rv-doc 在功能区内不再自带边框/阴影/内边距（外框与 .rv-sec-body 已提供）。
   ⚠️ 必须用 #m-review 作用域：.rv-doc 的默认卡片样式要留给别处复用。 */
#m-review .rv-sec-body .rv-doc{
  margin-top:0;padding:0;background:transparent;border:0;border-radius:0;box-shadow:none;
}

/* 报告正文卡：整篇文档一张卡（复盘是"读"的内容，不宜碎成多张小卡） */
.rv-doc{
  margin-top:14px;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius);
  padding:24px 26px;box-shadow:var(--shadow);
}
.rv-head{border-bottom:1px solid var(--border);padding-bottom:14px;margin-bottom:16px}
.rv-title{font-size:21px;font-weight:700;line-height:1.35;letter-spacing:-.2px}
.rv-metarow{
  display:flex;flex-wrap:wrap;gap:6px 14px;margin-top:8px;
  font-size:12px;color:var(--text-3);font-variant-numeric:tabular-nums;
}
.rv-chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}
.rv-chip{
  font-size:11px;font-weight:600;line-height:1;padding:4px 9px;border-radius:999px;
  color:var(--text-2);background:var(--bg-2);
}
.rv-chip-mood{color:var(--gold);background:rgba(201,162,39,.12)}
/* 一句话总结：左侧红条强调，作为"看这一句就够了"的入口 */
.rv-summary{
  font-size:13.5px;line-height:1.75;color:var(--text);
  background:var(--bg-3);border-left:3px solid var(--accent);
  border-radius:var(--radius-sm);padding:12px 14px;margin-bottom:18px;
}
/* 正文：Markdown 渲染出的 HTML（p / h3 / ul / ol / blockquote / table） */
.rv-content{font-size:14px;line-height:1.85;color:var(--text-2);word-break:break-word}
.rv-content p{margin:0 0 12px}
.rv-content strong{color:var(--text);font-weight:600}
.rv-content code{
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;
  background:var(--bg-2);padding:1px 5px;border-radius:4px;color:var(--text);
}
.rv-h{
  position:relative;font-size:16px;font-weight:700;color:var(--text);
  margin:22px 0 10px;padding-left:11px;
}
.rv-content > .rv-h:first-child{margin-top:0}
.rv-h::before{content:"";position:absolute;left:0;top:4px;bottom:4px;width:3px;border-radius:2px;background:var(--accent)}
.rv-h-sub{font-size:14.5px;margin:18px 0 8px}
.rv-h-sub::before{background:var(--gold)}
.rv-ul,.rv-ol{margin:0 0 12px;padding-left:20px}
.rv-ul{list-style:disc}
.rv-ol{list-style:decimal}
.rv-ul li,.rv-ol li{margin-bottom:6px}
.rv-quote{
  margin:0 0 12px;padding:10px 14px;border-left:3px solid var(--border-2);
  background:var(--bg-3);border-radius:var(--radius-sm);font-size:13px;color:var(--text-2);
}
.rv-quote p:last-child{margin-bottom:0}
/* 表格：手机端横向滚动，避免挤压变形 */
.rv-tw{overflow-x:auto;margin:0 0 14px;-webkit-overflow-scrolling:touch}
.rv-table{width:100%;border-collapse:collapse;font-size:13px;font-variant-numeric:tabular-nums}
.rv-table th,.rv-table td{padding:8px 10px;text-align:left;border-bottom:1px solid var(--border);white-space:nowrap}
.rv-table th{font-size:11.5px;font-weight:600;color:var(--text-3);background:var(--bg-3)}
.rv-table td{color:var(--text-2)}
.rv-table tbody tr:last-child td{border-bottom:none}
.rv-foot{
  margin-top:18px;padding-top:12px;border-top:1px solid var(--border);
  font-size:11.5px;line-height:1.6;color:var(--text-3);
}

/* ---------- 今日操作（复盘页内的功能区，不是独立模块） ----------
   2026-09-22：右上角「已同步/未同步持仓」状态条已删；同日再删「同步到持仓」按钮与 ?apply=1 调用
   —— 页面**不再有任何同步入口**，同步改为人工执行（用户或我在对话里调接口），
   页面只留一行 .rv-ops-applied 的客观记录（该日已同步 + 时间）。
   ⚠️ 旧 `.rv-ops{…}` 是**死选择器**：HTML 里只有 `<div id="rv-ops">`、没有 class，样式从未生效过
   —— 这就是「今日操作」区块原先没有显示框的原因。外框现统一交给 .rv-sec（见上）。 */
/* 无操作日：这是"有信息量"的状态（不操作也是一种决策），不做成空态灰字，给一个实心标记。
   2026-09-23 用户指定：无操作徽标 + 当日无操作提示文字**统一蓝色**（原为深灰 --text-2）。
   蓝色取品牌 --blue（#1a6fd6，与"买入"徽标同色系）/ --blue-soft 浅蓝底，边框用同色 30% 透明保持 1px 几何不变。 */
.rv-ops-noop{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  background:var(--bg-3);border-radius:var(--radius-sm);padding:12px 14px;
}
.rv-ops-noop-mark{
  flex:none;font-size:12px;font-weight:600;line-height:1;
  padding:5px 11px;border-radius:999px;
  color:var(--blue);background:var(--blue-soft);border:1px solid rgba(26,111,214,.30);
}
.rv-ops-noop-text{font-size:13px;line-height:1.6;color:var(--blue)}
/* 2026-09-23 用户指定：无操作日的「记录来源」小字行已删除，其样式一并移除（不留孤儿规则） */
.rv-ops-sum{margin-top:12px;font-size:13px;line-height:1.7;color:var(--text)}

/* 分红统计区块（持仓模块内，历年到账） */
.hd-div{margin-top:18px;padding-top:16px;border-top:1px solid var(--border-2)}
.hd-div-head{font-size:14px;font-weight:700;color:var(--text);margin-bottom:12px}
.hd-div-sum{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:16px}
.hd-div-sum-item{background:var(--bg-2);border-radius:var(--radius-sm);padding:10px 12px}
.hd-div-sum-k{font-size:11px;color:var(--text-3);margin-bottom:4px}
.hd-div-sum-v{font-size:15px;font-weight:700;color:var(--gold);font-variant-numeric:tabular-nums}
.hd-div-sub{font-size:12px;font-weight:600;color:var(--text-2);margin:14px 0 8px}
.hd-div-yr{margin-bottom:12px}
.hd-div-yr-head{display:flex;align-items:center;gap:10px;margin-bottom:6px}
.hd-div-yr-y{font-size:13px;font-weight:700;color:var(--text)}
.hd-div-yr-cny{font-size:14px;font-weight:700;color:var(--gold);font-variant-numeric:tabular-nums}
.hd-div-yr-yoy{font-size:11px;font-weight:600}
.hd-div-yr-yoy.up{color:var(--accent)}
.hd-div-yr-yoy.down{color:var(--blue)}
.hd-div-yr-items{display:flex;flex-direction:column;gap:4px;padding-left:2px}
.hd-div-item{display:flex;justify-content:space-between;font-size:12px;line-height:1.6}
.hd-div-item-name{color:var(--text-2)}
.hd-div-item-amt{color:var(--text);font-variant-numeric:tabular-nums}
.hd-div-bycode{margin-top:8px}
.hd-div-cd{display:flex;align-items:center;gap:10px;font-size:12px;line-height:1.9}
.hd-div-cd-name{color:var(--text-2);flex:1}
.hd-div-cd-cny{font-weight:700;color:var(--gold);font-variant-numeric:tabular-nums}
.hd-div-cd-yrs{color:var(--text-3);font-size:11px}
/* 今日操作分红展示 */
.rv-op-row-div{background:var(--bg-3);border-radius:var(--radius-sm);padding:8px 10px}
.rv-op-side.div{color:var(--gold);background:var(--bg);border:1px solid rgba(201,162,39,.35)}
.rv-op-div-text{font-size:13px;line-height:1.65;font-weight:600;color:var(--gold)}
/* 移动端：分红汇总卡两列 */
@media (max-width:560px){.hd-div-sum{grid-template-columns:repeat(2,1fr)}}

.hd-t{margin-top:18px;padding-top:16px;border-top:1px solid var(--border-2)}
.hd-t-head{font-size:14px;font-weight:700;color:var(--text);margin-bottom:12px}
.hd-t-sum{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:16px}
.hd-t-sum-item{background:var(--bg-2);border-radius:var(--radius-sm);padding:10px 12px}
.hd-t-sum-k{font-size:11px;color:var(--text-3);margin-bottom:4px}
.hd-t-sum-v{font-size:15px;font-weight:700;color:var(--gold);font-variant-numeric:tabular-nums}
.hd-t-sub{font-size:12px;font-weight:600;color:var(--text-2);margin:14px 0 8px}
.hd-t-yr{margin-bottom:12px}
.hd-t-yr-head{display:flex;align-items:center;gap:10px;margin-bottom:6px}
.hd-t-yr-y{font-size:13px;font-weight:700;color:var(--text)}
.hd-t-yr-cny{font-size:14px;font-weight:700;color:var(--gold);font-variant-numeric:tabular-nums}
.hd-t-yr-cnt{font-size:11px;color:var(--text-3)}
.hd-t-yr-yoy{font-size:11px;font-weight:600}
.hd-t-yr-yoy.up{color:var(--accent)}
.hd-t-yr-yoy.down{color:var(--blue)}
.hd-t-yr-items{display:flex;flex-direction:column;gap:4px;padding-left:2px}
.hd-t-item{display:flex;justify-content:space-between;font-size:12px;line-height:1.6}
.hd-t-item-name{color:var(--text-2)}
.hd-t-item-amt{font-variant-numeric:tabular-nums}
.hd-t-item-amt.pos{color:var(--accent)}
.hd-t-item-amt.neg{color:var(--blue)}
.hd-t-bycode{margin-top:8px}
.hd-t-cd{display:flex;align-items:center;gap:10px;font-size:12px;line-height:1.9}
.hd-t-cd-name{color:var(--text-2);flex:1}
.hd-t-cd-cny{font-weight:700;font-variant-numeric:tabular-nums}
.hd-t-cd-cny.pos{color:var(--accent)}
.hd-t-cd-cny.neg{color:var(--blue)}
.hd-t-cd-yrs{color:var(--text-3);font-size:11px}
.hd-t-detail{margin-top:8px}
.hd-t-detail-row{display:flex;align-items:center;gap:8px;font-size:12px;line-height:1.7;padding:3px 0;border-bottom:1px dashed var(--border-2)}
.hd-t-detail-dt{color:var(--text-3);font-variant-numeric:tabular-nums;white-space:nowrap}
.hd-t-detail-name{color:var(--text);font-weight:600;flex:1}
.hd-t-detail-info{color:var(--text-2);white-space:nowrap}
.hd-t-detail-amt{font-weight:700;font-variant-numeric:tabular-nums;white-space:nowrap}
.hd-t-detail-amt.pos{color:var(--accent)}
.hd-t-detail-amt.neg{color:var(--blue)}
.hd-t-detail-empty{font-size:12px;color:var(--text-3)}
.rv-op-row-t{background:var(--bg-3);border-radius:var(--radius-sm);padding:8px 10px}
.rv-op-side.t{color:var(--gold);background:var(--bg);border:1px solid rgba(201,162,39,.35)}
.rv-op-t-text{font-size:13px;line-height:1.65;font-weight:600;color:var(--gold)}
@media (max-width:560px){.hd-t-sum{grid-template-columns:repeat(2,1fr)}}
.rv-ops-empty{font-size:13px;line-height:1.7;color:var(--text-2)}
.rv-ops-hint{display:block;margin-top:6px;font-size:11.5px;line-height:1.6;color:var(--text-3)}

/* 操作明细：一条一笔 —— 方向徽标 + 一句「操作详情」（2026-09-22 用户指定句式，整句金色加粗） */
.rv-ops-list{list-style:none;display:flex;flex-direction:column;gap:8px}
.rv-op-row{
  display:flex;align-items:flex-start;gap:4px 10px;
  background:var(--bg-3);border-radius:var(--radius-sm);padding:10px 12px;
  font-size:13px;font-variant-numeric:tabular-nums;
}
.rv-op-side{
  flex:none;min-width:52px;margin-top:1px;font-size:11.5px;font-weight:600;line-height:1;text-align:center;
  padding:5px 0;border-radius:6px;
}
/* 2026-09-22 用户指定：**卖出=红、买入=蓝**（本区块按此口径，不与全站"涨红跌绿"混用） */
.rv-op-side.sell{color:var(--accent);background:var(--accent-soft)}
.rv-op-side.buy{color:var(--blue);background:var(--blue-soft)}
.rv-op-detail{flex:1 1 auto;min-width:0;display:flex;flex-wrap:wrap;align-items:baseline;gap:2px 8px}
/* 操作详情整句：金色 + 加粗（用户要求"全部金色字体显示"），长句自动折行 */
.rv-op-text{font-size:13px;line-height:1.65;font-weight:700;color:var(--gold)}
/* 代码是元信息、不属于"操作详情"那句话本身，保持灰色小字附在句尾 */
.rv-op-code{font-size:11.5px;font-weight:400;color:var(--text-3)}
/* 备注原文：配对成功时不显示（句子已覆盖），配对不到时才作为补充说明、单独占一行 */
.rv-op-note{flex-basis:100%;font-size:12px;line-height:1.6;color:var(--text-3)}

/* 同步到持仓：按钮与 ?apply=1 调用已于 2026-09-22 从页面移除（改为人工同步），
   下面这行只是「该日已同步 + 时间」的客观记录，仍右对齐、仍与上方明细用一条细线隔开。 */
.rv-ops-applied{
  margin-top:14px;padding-top:12px;border-top:1px solid var(--border);
  font-size:11.5px;color:var(--text-3);text-align:right;
}

/* 底部 Tab 文字不折行（6 个模块要挤在一行里） */
.tab span{white-space:nowrap}

@media (max-width:820px){
  .rv-doc{padding:18px 16px}
  .rv-title{font-size:18px}
  .rv-content{font-size:13.5px}
  /* 选择器：窄屏占满标题栏一整行（触发器 44px 触控高度），面板跟着拉满宽度 */
  .rv-dp{margin-left:0;width:100%;align-self:stretch}
  .rv-dp-trigger{width:100%;justify-content:space-between;min-height:44px;font-size:13px}
  .rv-dp-panel{left:0;right:0;width:auto;max-width:none}
  .rv-dp-day{height:38px}
  .rv-dp-sel{font-size:14px}
  .tab{font-size:10.5px}
  /* 实盘操作：窄屏同用默认布局（徽标 + 操作详情整句），只把字号与徽标宽度收一点 */
  .rv-sec-body{padding:16px 14px}
  .rv-sec-head{padding:11px 15px}
  .rv-op-text{font-size:12.5px}
  .rv-op-side{min-width:46px}
}

/* ---------- 资料大全 ---------- */
/* 三个分区用**分段控件**（不是胶囊）：复盘那边是"选日期"，这里是"换分区"，
   两种交互必须一眼能分开，否则用户会把分区切换当成日期选择 */
.dc-tabs{
  display:flex;gap:4px;margin:14px 0 0;padding:4px;
  background:var(--bg-2);border:1px solid var(--border);border-radius:12px;
}
.dc-tab{
  flex:1;display:inline-flex;align-items:center;justify-content:center;gap:7px;
  border:0;background:transparent;color:var(--text-2);font-family:inherit;
  font-size:13.5px;font-weight:500;padding:9px 12px;border-radius:9px;cursor:pointer;
  min-height:38px;white-space:nowrap;transition:background .15s,color .15s;
}
.dc-tab:hover{color:var(--text)}
.dc-tab.active{background:var(--bg);color:var(--text);font-weight:600;box-shadow:var(--shadow)}
.dc-tab-n{font-style:normal;font-size:11px;font-weight:600;color:var(--text-3);font-variant-numeric:tabular-nums}
.dc-tab-n:empty{display:none}
.dc-tab.active .dc-tab-n{color:var(--accent)}

/* 标的切换条 */
.dc-stockbar{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  margin-top:16px;padding:12px 14px;background:var(--bg-2);
  border:1px solid var(--border);border-radius:var(--radius-sm);
}
.dc-lb{font-size:12px;color:var(--text-3);white-space:nowrap}
.dc-sel{
  font-family:inherit;font-size:14px;font-weight:600;color:var(--text);
  border:1px solid var(--border-2);background:var(--bg);border-radius:9px;
  padding:7px 10px;min-height:36px;cursor:pointer;max-width:100%;
}
.dc-hint{font-size:11.5px;color:var(--text-3);margin-left:auto}
.dc-hot{font-style:normal;color:var(--accent);font-weight:600}
.dc-cold{font-style:normal;color:var(--down);font-weight:600}

/* 透视表：指标 × 报告期。年份多，必须横向滚动；首列粘住，滑到右边也知道在看哪个指标。
   注意 border-collapse 必须是 separate，否则 sticky 单元格的背景/边框会漏 */
.dc-tw{
  margin-top:14px;overflow-x:auto;border:1px solid var(--border);
  border-radius:var(--radius);background:var(--bg);box-shadow:var(--shadow);
  -webkit-overflow-scrolling:touch;
}
.dc-table{border-collapse:separate;border-spacing:0;width:100%;font-size:13px}
.dc-table th,.dc-table td{
  padding:11px 14px;text-align:right;white-space:nowrap;
  border-bottom:1px solid var(--border);font-variant-numeric:tabular-nums;
}
.dc-table thead th{
  position:sticky;top:0;z-index:2;background:var(--bg-3);
  font-size:12px;font-weight:600;color:var(--text-2);
}
.dc-table tbody tr:last-child th,.dc-table tbody tr:last-child td{border-bottom:0}
.dc-table tbody tr:hover td,.dc-table tbody tr:hover th{background:var(--bg-3)}
.dc-th-m,.dc-td-m{
  position:sticky;left:0;z-index:1;text-align:left;background:var(--bg);
  font-weight:500;color:var(--text);border-right:1px solid var(--border);
  min-width:132px;white-space:normal;
}
.dc-table thead .dc-th-m{z-index:3;background:var(--bg-3)}
.dc-v{display:block;font-weight:600;color:var(--text)}
.dc-v-nil{color:var(--text-3);font-weight:400}
/* 同比子行：**涨红跌绿**（A 股口径；注意与估值模块的"温度色"语义相反） */
.dc-yoy{
  display:block;font-size:11px;font-style:normal;margin-top:2px;
  color:var(--text-3);font-weight:500;
}
.dc-yoy.up{color:var(--accent)}
.dc-yoy.down{color:var(--down)}
.dc-note{margin-top:12px;font-size:11.5px;line-height:1.7;color:var(--text-3)}

/* 研究报告 / 其他资料：筛选框 + 分组卡片 */
.dc-search{margin-top:16px}
.dc-inp{
  width:100%;font-family:inherit;font-size:14px;color:var(--text);
  border:1px solid var(--border-2);background:var(--bg);border-radius:var(--radius-sm);
  padding:10px 14px;min-height:40px;
}
.dc-inp:focus{outline:none;border-color:var(--accent)}
.dc-none{
  margin-top:20px;padding:26px;text-align:center;font-size:13px;color:var(--text-3);
  background:var(--bg-2);border:1px dashed var(--border-2);border-radius:var(--radius);
}
.dc-group{margin-top:22px}
.dc-group-head{
  display:flex;align-items:baseline;justify-content:space-between;gap:10px;
  padding-bottom:8px;border-bottom:1px solid var(--border);
}
.dc-group-name{font-size:14px;font-weight:600}
.dc-group-n{font-size:11.5px;color:var(--text-3);font-variant-numeric:tabular-nums}
/* 卡片 = 手风琴的一节，**单列全宽**。
   为什么不做多列网格：grid 里同一行的卡片行高一致，一张卡展开会把它所在的那一整行撑高，
   同行的别的卡片就留下大片空白 —— 既难看，也没有"下拉展开"的感觉。 */
/* ⚠️ 轨道必须写 minmax(0,1fr)，**不能**写 1fr：
   `1fr` 等价于 `minmax(auto,1fr)`，那个 auto 最小值 = 网格项的**最小内容宽**。
   正文里经 rvMd 渲染的 <table> 最小内容宽可达 535px，于是轨道被撑到 569、卡片比手机视口还宽，
   整个 .content 出现横向滚动 —— 卡头右上角那个「收起」被推到屏幕外，吸顶了也点不到。
   改 minmax(0,1fr) 后卡片 = 容器宽；表格由自己的 .rv-tw{overflow-x:auto} 横向滚动（设计意图）。
   2026-09-21 真浏览器实测：390 视口下 585 → 390。 */
.dc-cards{margin-top:12px;display:grid;gap:10px;grid-template-columns:minmax(0,1fr)}
.dc-card{
  display:block;text-align:left;overflow:hidden;
  background:var(--bg);border:1px solid var(--border);border-radius:var(--radius);
  box-shadow:var(--shadow);color:var(--text);transition:border-color .15s;
}
.dc-card:hover{border-color:var(--border-2)}
.dc-card.open{border-color:var(--border-2)}
/* ⚠️ 展开态**必须**放开 overflow:hidden —— 否则 .dc-card 自己成了滚动容器，
   而 position:sticky 只认"最近的滚动祖先"：卡头会静默退化成普通定位，永远不吸顶。
   放开后没有任何视觉副作用：卡头/正文的底色都是 var(--bg)，与卡片同色，方角看不出来。 */
.dc-card.open{overflow:visible}
.dc-card:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
/* 卡头（标题 / 摘要 / 标签）—— 展开时**这一块完全不动**：展开区只是它下面的兄弟节点 */
.dc-card-head{display:flex;flex-direction:column;gap:7px;padding:15px 16px;cursor:pointer}
/* 展开后卡头**吸附在内容区顶部**（2026-09-21）：正文几千字滚到哪一格，标题栏都在最上面，
   想收回随时点得到，不用先滚回文章开头。三条不能省：
     · background 必须不透（var(--bg)）—— 否则正文文字会从卡头底下穿过去；
     · 不能给 border-radius —— 圆角处透明，正文会从两个上角透上来；
     · z-index 抬一层（z-index:3）—— 压住 rv 正文里的 sticky 表头（.dc-table thead th 是 2）。
   top:0 两端通用：桌面端 topbar 隐藏、手机端 topbar 是网格的一行不在 .content 内，
   所以卡头都贴 .content 的顶边，不必写媒体查询。 */
.dc-card.open .dc-card-head{
  position:sticky;top:0;z-index:3;background:var(--bg);
  border-bottom:1px solid var(--border);
  box-shadow:0 10px 14px -12px rgba(0,0,0,.28);
}
/* **只有真钉住**时才补的上沿遮罩（.stuck 由 dcSyncStuck() 打）：
   滚动容器 .content 有 padding-top（桌面 28 / 手机 18），卡头钉在内容盒顶边，
   于是它上方留出一道缝，正文从缝里露出**半行被截断的字** —— 看着像卡头漏了一块。
   缝只在钉住时存在；没钉住时卡头上方是上一张卡的底部 / 分组标题，常驻遮罩会把它们盖掉，
   所以必须靠 .stuck 区分。60px 足够盖住任何断点的 padding（多出来的部分本来就在视口外）。 */
.dc-card.open.stuck .dc-card-head::before{
  content:'';position:absolute;left:0;right:0;bottom:100%;height:60px;
  background:var(--bg);pointer-events:none;
}
.dc-card-top{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
.dc-card-title{font-size:14.5px;font-weight:600;line-height:1.4}
/* 右上角「展开 ▾ / 收起 ▴」：文案切换 + 箭头旋转变向，不换图标 */
.dc-toggle{
  flex:none;display:inline-flex;align-items:center;gap:4px;
  font-size:11.5px;font-weight:500;color:var(--text-3);white-space:nowrap;
}
.dc-toggle svg{width:13px;height:13px;transition:transform .2s ease}
.dc-card.open .dc-toggle{color:var(--accent)}
.dc-card.open .dc-toggle svg{transform:rotate(180deg)}
.dc-card-meta{
  display:flex;align-items:center;flex-wrap:wrap;gap:8px;
  font-size:11.5px;color:var(--text-3);font-variant-numeric:tabular-nums;
}
/* 元信息行首的小胶囊：有主题显示主题（其他资料），否则显示类型（文本 / 图表 / 外链 / 附件） */
.dc-pill{
  font-style:normal;font-size:10.5px;font-weight:600;color:var(--accent);
  background:var(--bg-2);border:1px solid var(--border);border-radius:6px;padding:2px 7px;
}
.dc-card-sum{
  font-size:12.5px;line-height:1.6;color:var(--text-2);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
.dc-card-tags{display:flex;flex-wrap:wrap;gap:6px}
.dc-card-tags i{font-style:normal;font-size:11px;color:var(--text-3)}
/* 展开区（"下拉"出来的那部分）。正文长度不定（可能几千字），所以**不用 max-height 过渡**
   —— 要么写死一个够大的值、要么动画中途被截断；改用一个短促的淡入下滑，任意高度都安全。 */
.dc-card-body{display:none;border-top:1px solid var(--border);background:var(--bg)}
/* 分隔线只留卡头那一条（吸顶时它负责"接下来是正文"），正文自己的 border-top 去掉免双线 */
.dc-card.open .dc-card-body{border-top:0;display:block;animation:dcUnfold .2s ease-out}
@keyframes dcUnfold{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
.dc-body-in{padding:14px 16px 16px}
.dc-load{display:flex;align-items:center;gap:8px;margin:0;font-size:12.5px;color:var(--text-3)}
.dc-load-err{color:var(--accent)}
/* 加载中的小转圈（纯 CSS，不引图标库） */
.dc-spin{
  flex:none;width:12px;height:12px;border-radius:50%;
  border:2px solid var(--border-2);border-top-color:var(--accent);
  animation:dcSpin .7s linear infinite;
}
@keyframes dcSpin{to{transform:rotate(360deg)}}

/* 展开区正文复用复盘那套 .rv-content / .rv-h / .rv-table 排版 —— 观感与复盘完全一致。
   2026-09-21：独立阅读页（.dc-reader / .dc-back）已移除，正文改为卡片内联展开。 */
.dc-src{
  margin-top:16px;padding-top:12px;border-top:1px solid var(--border);
  font-size:11.5px;line-height:1.6;color:var(--text-3);word-break:break-all;
}
.dc-src a{color:var(--accent);text-decoration:none}
.dc-src a:hover{text-decoration:underline}
.dc-figs{margin-top:16px;display:grid;gap:12px}
.dc-fig{margin:0}
.dc-fig img{width:100%;height:auto;display:block;border:1px solid var(--border);border-radius:var(--radius-sm)}
.dc-fig figcaption{margin-top:6px;font-size:11.5px;color:var(--text-3);text-align:center}

/* ---------- 资料大全：手机端 ---------- */
@media (max-width:820px){
  /* 三个分区标签保持一行：缩字号与内边距，别再折成竖排（竖排会占掉半屏） */
  .dc-tab{font-size:12.5px;padding:8px 6px;gap:5px}
  .dc-hint{display:none}
  .dc-cards{grid-template-columns:minmax(0,1fr)}   /* 同上：1fr 会被正文表格的最小内容宽撑开 */
  .dc-table th,.dc-table td{padding:10px 12px}
  .dc-th-m,.dc-td-m{min-width:104px;font-size:12.5px}
  .dc-stockbar{padding:10px 12px}
}

/* 资料大全：全文检索 —— 搜索范围提示 / 结果计数条 / 正文命中片段 / 关键词高亮 */
.dc-search-hint{display:block;margin-top:6px;font-size:11px;color:var(--text-3)}
.dc-hitbar{margin-top:16px;display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text-3)}
.dc-hitbar b{color:var(--text);font-weight:600;font-variant-numeric:tabular-nums}
.dc-hit-wait{color:var(--accent)}
.dc-cards-flat{margin-top:12px}
/* 正文命中片段：左侧竖线 + 背景，和摘要区分开，让人一眼看出"这是正文里的原话" */
.dc-card-snip{
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;
  font-size:12.5px;line-height:1.65;color:var(--text-2);
  background:var(--bg-2);border-left:2px solid var(--border-2);
  border-radius:0 6px 6px 0;padding:8px 10px;
}
.dc-hit{
  display:inline-block;margin-right:6px;vertical-align:1px;
  font-style:normal;font-size:10.5px;font-weight:600;white-space:nowrap;
  color:var(--text-2);background:var(--bg);border:1px solid var(--border);
  border-radius:5px;padding:1px 6px;
}
.dc-hit-content{color:var(--accent);border-color:var(--accent)}
.dc-card mark{background:rgba(255,193,7,.42);color:inherit;border-radius:3px;padding:0 1px}
@media (max-width:820px){
  .dc-cards-flat{grid-template-columns:minmax(0,1fr)}   /* 同上（检索态的扁平列表） */
}

/* ===== 合规：全局风险提示条 / 模块非建议注 / 侧栏身份注（2026-09-22） ===== */
.disclaimer-bar{display:flex;align-items:flex-start;gap:8px;margin:0 0 14px;padding:10px 12px;
  background:rgba(255,247,237,.85);border:1px solid rgba(200,140,0,.30);border-radius:var(--radius-sm);
  font-size:12.5px;line-height:1.55;color:var(--text-2)}
.disclaimer-bar .db-ico{flex-shrink:0;color:#c8881f;font-size:14px;line-height:1.4}
.disclaimer-bar .db-text{flex:1;min-width:0}
.module-note{margin:0 0 12px;padding:8px 10px;background:var(--bg-2);border-left:3px solid rgba(200,140,0,.45);
  border-radius:var(--radius-sm);font-size:12px;line-height:1.6;color:var(--text-3)}
/* 估值笔记 / 每日复盘 / 资料大全：免责说明已上移到模块头部下方，需自带顶部间距（原 14px 由 .hd-bar 的 margin-top 提供）。
   这三个模块顶部的「汇总条 / 状态灯 / 刷新按钮」整行都已去掉，模块头下方直接就是这条免责说明。 */
#m-valuation .module-note{margin:16px 0 0}
#m-review .module-note{margin-top:16px}
#m-docs .module-note{margin-top:16px}
.sidebar-note{margin:0 0 8px;padding:0 10px;font-size:10.5px;line-height:1.45;color:var(--text-3);text-align:center}
