/* =========================================================
   价值的港湾 ValueHarbor — 设计系统
   浅色主题 / 移动优先 / 中国市场配色（红涨绿跌）
   ========================================================= */

:root{
  /* 基础色 —— 明亮、层次细腻、红涨绿跌（中国习惯）；v191 整体提亮 + 海蓝体系 */
  --ink:        #15243f;   /* 更深 navy，正文更清晰 */
  --ink-2:      #34466a;
  --ink-3:      #5d6c86;
  --ink-4:      #8a96ab;
  --line:       #e6e9f0;
  --line-2:     #f1f3f8;
  --paper:      #ffffff;
  --paper-2:    #f6f8fc;
  --card:       #ffffff;
  --bg:         #f3f5f9;   /* v305：更中性的冷灰底色（对标雪球/东财的干净层次） */
  --gold:       #c08a2e;   /* 更明亮的金 */
  --gold-soft:  #fbf3e2;
  --navy-soft:  #eaf1fb;
  --sea:        #0f6fb3;   /* 海蓝（选中行高亮） */
  --sea-soft:   #e7f1fa;
  --xq:         #1e5dbd;   /* 雪球蓝（v315：在 v314 #143E7E 基础上增加 50% 亮度 → #1E5DBD，股票名 / 会员开通按钮） */
  --blue:       #2f80c4;   /* 链接蓝（较浅，避免与海蓝撞色） */
  --sky-blue:   #fdeaea;   /* v326 #7：选中指标数值高亮底色 天空蓝→淡红（与 --up-soft 同值） */
  --sky-blue-bd: #e29a9a;   /* v326 #7：选中单元格描边 蓝→淡红描边 */

  /* 涨跌（中国习惯：红涨绿跌） */
  --up:         #e23b3b;
  --up-soft:    #fdeaea;
  --down:       #12a06a;
  --down-soft:  #e6f6ee;
  --warn:       #d98a13;
  --warn-soft:  #fdf3e1;

  /* 强调色（模块点缀，提升丰富度但保持统一，v191） */
  --accent-teal:   #1aa3a3;
  --accent-purple: #7b5bd6;
  --accent-orange: #e8833a;
  --accent-pink:   #d6577f;

  --radius:     14px;
  --radius-sm:  10px;
  --shadow:     0 1px 2px rgba(16,24,40,.04), 0 4px 14px rgba(16,24,40,.05);   /* v305：更轻更收敛 */
  --shadow-lg:  0 14px 44px rgba(18,26,42,.14);

  --tab-h:      58px;
  --top-h:      54px;
  --maxw:       1200px;    /* v191：宽屏内容居中，避免拉得太开、整体美观 */
  --app-w:      100%;        /* 整体外壳最大宽度（全宽） */

  --font: -apple-system, BlinkMacSystemFont, "PingFang SC", "HarmonyOS Sans SC", "MiSans",
          "Hiragino Sans GB", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", sans-serif;
  --mono: "SF Mono", "JetBrains Mono", Menlo, Consolas, monospace;
}

*{ box-sizing:border-box; -webkit-tap-highlight-color:transparent; }
html,body{ margin:0; padding:0; }
html{ -webkit-text-size-adjust:100%; }
body{
  font-family:var(--font);
  background:var(--paper);
  color:var(--ink);
  font-size:15px;
  line-height:1.65;
  overscroll-behavior-y:none;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
  font-variant-numeric:tabular-nums;   /* v305：全站数字等宽，表格/行情列对齐 */
}
button,input,select,textarea{ font-family:inherit; font-size:inherit; color:inherit; }
button{ cursor:pointer; border:none; background:none; padding:0; }
a{ color:inherit; text-decoration:none; }
h1,h2,h3,h4{ margin:0; font-weight:700; letter-spacing:-.01em; }
p{ margin:0 0 .7em; }
p:last-child{ margin-bottom:0; }

::-webkit-scrollbar{ width:6px; height:6px; }
::-webkit-scrollbar-thumb{ background:#c6cdd9; border-radius:3px; }
::-webkit-scrollbar-track{ background:transparent; }

/* ============ 布局骨架 ============ */
#app-shell{
  max-width:var(--app-w);
  margin:0 auto;
  width:100%;
  height:100vh; height:100dvh;
  background:var(--paper);
  position:relative;
  display:flex;
  flex-direction:column;
  align-items:stretch;
  overflow:hidden;
  box-shadow:0 0 0 1px var(--line-2);
}
/* #1 v194：顶部栏下方主体（左栏 + 主页面 + 右栏），三栏顶端齐平 */
#app-body{
  flex:1 1 auto; min-height:0;
  display:flex; flex-direction:row; align-items:stretch;
  overflow:hidden;
}

#topbar{
  position:relative; z-index:60;
  flex:0 0 auto;
  /* v206 #1：高度改为 auto + min-height（单排=原 54px；中屏/手机转双排时自动撑高，
     不再因固定高度把第二行菜单/品牌裁切到 #app-body 内容之上造成重叠；主内容顶部与固定栏底部间距恒定（.view-wrap padding-top=14px） */
  height:auto; min-height:calc(var(--top-h) + env(safe-area-inset-top));
  padding-top:env(safe-area-inset-top);
  background:rgba(255,255,255,.88);
  backdrop-filter:blur(16px) saturate(1.5);
  -webkit-backdrop-filter:blur(16px) saturate(1.5);
  border-bottom:1px solid var(--line);
  box-shadow:0 1px 2px rgba(16,24,40,.03);
  display:flex; align-items:center; justify-content:flex-start; gap:8px;   /* v318：10→8px */
  padding-left:14px; padding-right:14px;
}
/* v197 #1/#2：桌面端（>980px，左右常驻侧栏）品牌块右移对齐主页面左缘，搜索框右缘让出右栏对齐主页面右缘；
   窄屏（≤980px 侧栏转抽屉、主页面满宽）保持左右 14px 内边距
   v319 #7 曾移除内移；v320 #3 按用户要求恢复到调整前位置 */
@media(min-width:981px){
  /* v320 #3：恢复到「调整前」的内移位置——品牌名左对齐主区左缘（左栏宽 212px）、搜索框右缘对齐主区右缘（右栏宽 278px） */
  #topbar{ padding-left:108px; padding-right:278px; }
}
.tb-menu{
  display:none; width:30px; height:30px; border-radius:9px; flex:0 0 auto;
  align-items:center; justify-content:center; color:#d6453f;
  /* #2 v202：v201 曾将菜单与返回按钮一并右移 110px；本次仅保留「返回按钮 50px」（#3 v202），
     菜单（窄屏抽屉开关）恢复至左缘自然位置，避免与品牌块 60px 错位 */
}
.tb-menu:active{ background:rgba(214,69,63,.12); }
/* v206 #2：左簇改为可收缩（flex:0 1 auto），长时间副标题时品牌块收窄、副标题 ellipsis，避免把搜索框挤到下一行 */
.tb-left{ display:flex; align-items:center; gap:8px; min-width:0; flex:0 1 auto; }
/* v203 #1/#2：左簇（品牌 + 功能按钮 menu/rsb + 返回）整体右移
   首页等无返回按钮页：logo+网站名+副标题 + 功能模块 右移 60px；
   详情页（含返回按钮）：返回按钮 + 功能模块 右移 50px
   v319 #7 曾移除；v320 #3 恢复到调整前位置 */
body:not(.has-back) .tb-left{ margin-left:60px; }
body.has-back .tb-left{ margin-left:50px; }
.tb-back{
  width:30px; height:30px; border-radius:9px; display:none;
  align-items:center; justify-content:center; color:#d6453f;
  flex:0 0 auto;
  /* v203 #2：返回按钮右移交由 body.has-back .tb-left{ margin-left:50px } 统一处理 */
}
.tb-back:active{ background:rgba(214,69,63,.12); }
body.has-back .tb-back{ display:flex; }
.tb-brand{ display:flex; align-items:center; gap:8px; min-width:0; }   /* #2 v201/v203：logo+名+副标题整体右移交由 body:not(.has-back) .tb-left{ margin-left:60px } 统一处理 */
.tb-right{ display:flex; align-items:center; gap:8px; margin-left:auto; flex:0 0 auto; position:relative; }
.tb-rsb{
  display:none; width:30px; height:30px; border-radius:9px; flex:0 0 auto;
  align-items:center; justify-content:center; color:#d6453f;
}
.tb-rsb:active{ background:rgba(214,69,63,.12); }
.tb-logo{ display:flex; flex:0 0 auto; background:transparent; border-radius:0; padding:0; box-shadow:none; align-items:center; }
.tb-logo img{ height:46px; width:auto; display:block; }
/* 顶部搜索框（#6）：浅红底色上的清爽白底胶囊输入框 */
.tb-search{
  display:flex; align-items:center; gap:6px;
  width:210px; max-width:42vw; height:34px; padding:0 12px;   /* v319 #7：148→210px，「搜A股/港股/美股」占位文字完整可见 */
  background:#f2f5f9; border:1px solid transparent;
  border-radius:99px; box-shadow:none;
  transition:border-color .16s,box-shadow .16s;
}
.tb-search:focus-within{ background:#fff; border-color:rgba(214,69,63,.45); box-shadow:0 1px 6px rgba(214,69,63,.14); }
.tb-search-ic{ width:16px; height:16px; color:#d6453f; flex:0 0 auto; }
.tb-search-in{
  flex:1 1 auto; min-width:0; border:none; outline:none; background:transparent;
  font-size:13px; color:var(--ink); letter-spacing:.02em;
}
.tb-search-in::placeholder{ color:var(--ink); }
/* 顶部搜索下拉结果 */
.tb-search-box{
  position:absolute; top:42px; right:0; z-index:80;
  width:min(86vw,300px); max-height:60vh; overflow-y:auto;
  background:var(--paper); border:1px solid var(--line); border-radius:14px;
  box-shadow:0 10px 30px rgba(40,20,20,.16); padding:6px; display:none;
}
.tb-search-box .ts-item{
  display:flex; align-items:center; gap:8px; padding:6px 8px; border-radius:10px;
}
.tb-search-box .ts-item:hover,.tb-search-box .ts-item:active{ background:var(--line-2); }
.tb-search-box .ts-link{
  flex:1 1 auto; min-width:0; display:flex; align-items:center; gap:8px;
  text-decoration:none; color:var(--ink-1);
}
.tb-search-box .ts-item b{ font-size:13.5px; }
.tb-search-box .ts-item em{ font-size:11.5px; color:var(--ink); font-style:normal; margin-left:2px; }
.tb-search-box .ts-star{
  flex:0 0 auto; width:30px; height:30px; border-radius:9px; border:1px solid var(--line);
  font-size:17px; line-height:1; color:var(--xq); background:var(--card);
  display:flex; align-items:center; justify-content:center; cursor:pointer;
}
.tb-search-box .ts-star.on{ background:var(--gold); border-color:var(--gold); color:#fff; }
.tb-search-box .ts-m{
  flex:0 0 auto; font-size:10px; padding:2px 6px; border-radius:6px; color:#fff; background:var(--ink-4);
}
.tb-search-box .ts-m.hk{ background:#e8a33d; }
.tb-search-box .ts-m.us{ background:#5b8def; }
body.has-back .tb-logo{ display:flex; }   /* v383：品牌 logo 始终显示 */
.tb-title{ min-width:0; }
.tb-title-row{ display:flex; align-items:baseline; gap:9px; min-width:0; }
/* 品牌名「万芷计算机」：v305 改为现代无衬线深红实色（去书法体/去红光晕，对标一线站 wordmark） */
.tb-title strong.brand{
  display:inline-block;   /* v385：品牌文字（价值的港湾）作为粗体 wordmark 渲染，对标东方财富网 */
  flex:0 0 auto; font-size:20px; line-height:1.18; letter-spacing:.01em;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  font-weight:900; transform:translateY(0);   /* v385：加粗(900)并取消下移，与灯塔图标垂直居中 */
  font-family:var(--font);
  color:#cf352e; text-shadow:none;
}
/* v304：站名由 4 字改为 5 字「万芷计算机」——窄屏下缩字号避免 nowrap 截断 */
@media (max-width:420px){ .tb-title strong.brand{ font-size:18px; } }
@media (max-width:340px){ .tb-title strong.brand{ font-size:16px; } }
/* 页面标题（如「价值学院」）：v191 改为实色深蓝，去掉渐变文字以确保顶栏可读性 */
.tb-title .tb-page-title{
  flex:1 1 auto; min-width:0;
  font-size:13px; font-weight:700; letter-spacing:.03em;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  color:var(--ink-2);
  -webkit-text-fill-color:var(--ink-2);
}
/* v206 #2 → v319 #8：副标题过长时自动换行分行显示（不再 ellipsis 单行截断），
   避免与居中菜单栏重叠；max-width 保留上限防止把搜索框挤走 */
.tb-title small{
  display:block; font-size:10.5px; color:var(--ink); line-height:1.35;
  letter-spacing:.08em; white-space:normal; overflow:visible; text-overflow:clip;
  max-width:min(30vw,320px);
  margin-top:6px; /* #2 v198：副标题下移 6px */
}
/* v385：英文站名 valueharbor.cn 作为粗体 wordmark 副标（对标东方财富网英文名粗度） */
.tb-title small.brand-sub{
  display:block; font-size:11.5px; font-weight:700; letter-spacing:.01em;
  color:#0a6ebd; line-height:1.3; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  max-width:none; margin-top:1px;
}

.level-chip{
  display:flex; align-items:center; gap:3px; flex:0 0 auto;
  padding:5px 9px 5px 11px; border-radius:99px;
  background:var(--navy-soft); color:var(--ink-2);
  font-size:12px; font-weight:600; letter-spacing:.03em;
  border:1px solid #d9e2f0;
}
.level-chip:active{ transform:scale(.96); }

#view{
  flex:1; width:100%;
  overflow-y:auto; overflow-x:hidden;
  outline:none;
  background:var(--bg);   /* v105：内容区浅灰，卡片浮起（雪球/东财式层次） */
  animation:viewIn .28s cubic-bezier(.22,.9,.3,1);
}
.view-wrap{ max-width:var(--maxw); margin:0 auto; padding:14px 14px 30px; width:100%; box-sizing:border-box; }

/* ============ 首页两栏布局（主区 + 右侧自选股公告栏） ============ */
.home-layout{ display:grid; grid-template-columns:1fr 280px; gap:14px; align-items:start; }
.home-aside{ position:sticky; top:14px; }
.home-aside .card{ max-height:calc(100vh - 28px); overflow-y:auto; }
.ha-item{ display:flex; gap:8px; padding:6px 0; border-bottom:1px solid var(--line-2); }
.ha-item:last-child{ border-bottom:none; }
.ha-d{ flex:0 0 auto; font-family:var(--mono); font-size:11px; color:var(--ink); padding-top:1px; }
.ha-t{ flex:1; min-width:0; font-size:12px; line-height:1.4; color:var(--ink-2); cursor:pointer; }   /* #4 v201：自选公告标题可点击链接到公告 */
.ha-name{ color:var(--xq); font-weight:700; margin-right:4px; }   /* v315 #2：右侧公告股票名与左侧侧边栏同色（--xq 雪球蓝） */   /* #7 v199：自选公告公司名对齐侧栏「我的自选」公司名色 */
/* v187 #4：公告来源市场徽标 + 标题可点击打开原文 */
.ha-mk{ display:inline-block; flex:0 0 auto; font-size:10px; line-height:1; padding:2px 4px; border-radius:5px; margin-right:5px; vertical-align:1px; }
.ha-mk.a{ background:#eaf1fb; color:#1a5fb4; }
.ha-mk.hk{ background:#eef3ea; color:#4a6b32; }
.ha-mk.us{ background:#f3eef7; color:#5c4276; }
.ha-link{ color:var(--ink-2); text-decoration:none; border-bottom:1px solid var(--line); }
.ha-link:hover{ color:var(--blue); border-bottom-color:var(--blue); }
@media (max-width: 860px){
  .home-layout{ grid-template-columns:1fr; }
  .home-aside{ position:static; }
  .home-aside .card{ max-height:none; }
}
/* v304：首页底部 ICP 备案号（工信部官网链接） */
.vc-icp{ text-align:center; padding:2px 0 8px; }
.vc-icp a{ font-size:11px; color:var(--ink-4,#9aa1ad); text-decoration:none; letter-spacing:.02em; }
.vc-icp a:hover{ color:var(--blue); text-decoration:underline; }
/* ============ 全站页脚（隐私 / 协议 / 免责 / 数据来源 / 备案） ============ */
#siteFooter{ flex:0 0 auto; background:var(--paper-2); border-top:1px solid var(--line); }
.sf-inner{ max-width:var(--maxw); margin:0 auto; padding:14px 14px 18px; text-align:center; }
.sf-links{ font-size:12.5px; }
.sf-links a{ color:var(--ink-2); text-decoration:none; }
.sf-links a:hover{ color:var(--blue); text-decoration:underline; }
.sf-links span{ color:var(--ink-4,#9aa1ad); margin:0 8px; }
.sf-src{ font-size:11px; color:var(--ink-4,#9aa1ad); margin-top:8px; line-height:1.7; }
.sf-beian{ font-size:11px; color:var(--ink-4,#9aa1ad); margin-top:6px; }
.sf-beian a{ color:var(--ink-4,#9aa1ad); text-decoration:none; }
.sf-beian a:hover{ color:var(--blue); text-decoration:underline; }
.sf-gongan{ margin-left:12px; }
.sf-copy{ font-size:11px; color:var(--ink-4,#9aa1ad); margin-top:6px; }
/* ============ 合规文档页（隐私 / 协议 / 免责） ============ */
.doc-page{ max-width:760px; margin:0 auto; padding:6px 2px 12px; line-height:1.75; color:var(--ink-2); }
.doc-h1{ font-size:17.6px; color:var(--ink); margin:6px 0 4px; }   /* v491：标题字号缩至原 22px 的 80% */
.doc-updated{ font-size:12px; color:var(--ink-4,#9aa1ad); margin:0 0 14px; }
.doc-lead{ font-size:14px; color:var(--ink-2); margin:0 0 16px; }
.doc-h2{ font-size:16px; color:var(--ink); margin:20px 0 8px; }
.doc-p{ font-size:14px; margin:0 0 10px; }
.doc-ul{ margin:0 0 12px; padding-left:20px; }
.doc-ul li{ font-size:14px; margin:6px 0; }
.doc-note{ font-size:13px; color:var(--ink-3); background:var(--paper-2); border-left:3px solid var(--blue); padding:10px 12px; border-radius:6px; margin-top:18px; }
@keyframes viewIn{ from{ opacity:0; transform:translateY(7px);} to{ opacity:1; transform:none;} }

#tabbar{
  position:relative; z-index:60;
  flex:0 0 auto;
  height:calc(var(--tab-h) + env(safe-area-inset-bottom));
  padding-bottom:env(safe-area-inset-bottom);
  background:rgba(255,255,255,.94);
  backdrop-filter:saturate(180%) blur(14px);
  -webkit-backdrop-filter:saturate(180%) blur(14px);
  border-top:1px solid var(--line);
  display:grid; grid-template-columns:repeat(5,1fr);
}
.tab{
  display:flex; flex-direction:column; align-items:center; justify-content:center; gap:2px;
  color:var(--ink); font-size:10.5px; letter-spacing:.04em; transition:color .16s;
}
.tab svg{ width:22px; height:22px; }
.tab.on{ color:var(--ink); font-weight:600; }
.tab.on svg{ color:#d6453f; }   /* v305：与顶栏红色品牌基因统一 */

/* ============ 顶部导航（品牌左侧 · 菜单居中 · 搜索右侧，#2 v191） ============ */
/* v205：改为 flex 流内居中（flex:1 + justify-content:center），彻底消除中屏因「绝对居中」与品牌/搜索重叠的问题。
   v318：间距收敛（tab padding 15→10px、gap 2.2vw/30px→1.2vw/18px、搜索框 172→148px、品牌字号 20.4→19.2px）
   且单行断点 1319px→1250px——
   13.3" 笔记本（1280px）上「首页/学院/公司/模型/我的」单行排在网站名与搜索框之间，不再折到第二行；
   ≤1249px（含侧栏转抽屉的 ≤980 区间、网页缩小一半、手机）菜单自动落到第二行，绝不重叠 */
#topnav{
  flex:1 1 auto; min-width:0;
  display:flex; flex-direction:row; align-items:center; justify-content:center;
  gap:clamp(10px,1.8vw,36px);   /* v321 #2：1.2vw/18px→1.8vw/36px，宽屏更舒展、笔记本仍单行余量充足 */
  background:transparent; border-bottom:none; box-shadow:none;
}
#topnav .tab{
  flex:0 0 auto; flex-direction:row; gap:5px;
  padding:8px 10px; font-size:14px; color:var(--ink); font-weight:700;   /* v326 #3：菜单名黑色加粗（原灰 --ink-3） */
}
#topnav .tab svg{ width:22px; height:22px; }
#topnav .tab.on{ color:#d6453f; font-weight:700; }
#topnav .tab.on svg{ color:#d6453f; }
/* v205→v318：中屏 / 窄屏响应式顶栏——菜单栏落到第二行，与品牌+搜索分两行，杜绝重叠 */
@media (max-width:1249px){
  #topbar{ flex-wrap:wrap; }
  .tb-left{ flex:0 1 auto; min-width:0; }   /* v206 #2：双排时左簇仍可收缩，副标题 ellipsis 不挤掉搜索框 */
  .tb-right{ margin-left:auto; }
  #topnav{ flex-basis:100%; order:2; justify-content:space-around; gap:0;
    border-top:1px solid var(--line-2); margin-top:4px; padding-top:4px; }
  #topnav .tab{ flex:1 1 0; justify-content:center; }
}
/* v321 #2：宽屏菜单项内距同步放宽，与大间距匹配 */
@media (min-width:1500px){
  #topnav .tab{ padding:8px 14px; }
}
@media (max-width:760px){
  #topbar{ padding-left:10px; padding-right:10px; gap:6px; }
  .tb-left{ flex:1 1 auto; min-width:0; }
  body:not(.has-back) .tb-left{ margin-left:8px; }
  body.has-back .tb-left{ margin-left:8px; }
  .tb-right{ margin-left:auto; }
  .tb-search{ width:min(42vw,170px); height:32px; }
  #topnav .tab{ padding:9px 2px; font-size:13px; gap:5px; }
  #topnav .tab svg{ width:20px; height:20px; }
  .tb-title strong.brand{ font-size:16.8px; }   /* v226 #3：站点名移动端同步放大到 1.05 倍（16 × 1.05） */
  .tb-logo img{ height:40px; }
}
/* 顶部「我的」：未登录「登录/注册」按钮 / 登录后圆形头像 */
#tbMeTab{ cursor:pointer; }
.tb-me-login{
  font-size:12.5px; font-weight:700; color:#d6453f;
  padding:4px 9px; border:1px solid rgba(214,69,63,.4); border-radius:99px;
  background:rgba(214,69,63,.06); white-space:nowrap;
}
.tb-me-av{ width:24px; height:24px; border-radius:50%; overflow:hidden; display:block;
  box-shadow:0 0 0 2px rgba(255,255,255,.9),0 1px 3px rgba(0,0,0,.18); }
.tb-me-av img{ width:100%; height:100%; object-fit:cover; display:block; }
/* v281：空白头像占位 SVG（无上传时）需在 24×24 圆框内居中显示 */
.tb-me-av svg{ width:100%; height:100%; display:block; }

/* ============ 我的页 · 登录模块内嵌头像（v189 #2：头像框在「注册账号」右侧，框内可点击上传） ============ */
.vc-member.vc-login{ display:block; }
.vc-member-body{ flex:1 1 auto; min-width:0; }
/* 「注册账号」行与头像并排：账号信息在左，头像框在右 */
.vc-acct-row{ display:flex; align-items:center; justify-content:space-between; gap:12px; }
.vc-avatar{
  flex:0 0 auto; display:flex; flex-direction:column; align-items:center; gap:4px;
  width:64px; cursor:pointer; user-select:none;
}
.vc-avatar-img{
  width:56px; height:56px; border-radius:50%; overflow:hidden; flex:0 0 auto;
  background:var(--line-2); display:flex; align-items:center; justify-content:center;
  color:#d6453f; box-shadow:0 0 0 3px #fff,0 2px 8px rgba(214,69,63,.2);
  transition:box-shadow .16s;
}
.vc-avatar:hover .vc-avatar-img{ box-shadow:0 0 0 3px #fff,0 2px 12px rgba(214,69,63,.34); }
.vc-avatar-img img{ width:100%; height:100%; object-fit:cover; display:block; }
.vc-avatar-img svg{ width:30px; height:30px; }
/* 头像框内「上传头像 / 点击更换」小字提示 */
.vc-avatar-hint{ font-size:10.5px; line-height:1.25; color:var(--ink); text-align:center; }

/* ============ 主区容器 ============ */
#main{
  flex:1; min-width:0; min-height:0;
  display:flex; flex-direction:column;
  background:var(--paper);
  overflow:hidden;
}

/* ============ 左侧自选股侧边栏 ============ */
/* v299：178px→250px，为「公司/股价/市盈率TTM」三列表格留足列宽；
   v318：250px→206px——13.3" 笔记本（1280×800）上给「我的公司」指标表让位，保证 21 列指标全部显示 */
/* v319 #4：206px→186px——「市盈率TTM」表头改两行（市盈率/TTM）后列宽需求更小，
   左栏收窄到刚好容纳三列内容，把宽度让给主区指标表 */
/* v322 #1：212→170px（用户要求「缩短到目前的 80%」）；同步把侧栏列表左右内边距 8→4px，
   让三列在 170px 下仍能放下四字公司名与「市盈率/TTM」两行表头
   v323 #1：170→204px（用户要求「增加到目前的 1.2 倍」）；#2 第三列由「市盈率TTM」改「市值」 */
#sidebar{
  flex:0 0 204px; width:204px;   /* v323 #1：170→204px（= 170 的 1.2 倍） */
  background:var(--paper-2);
  border-right:1px solid var(--line);
  display:flex; flex-direction:column;
  overflow:hidden;
}
.sb-head{
  flex:0 0 auto;
  display:flex; align-items:center; justify-content:center; gap:10px;   /* v326 #8：抬头居中 */
  padding:16px 14px 10px;
}
.sb-title{
  font-size:14px; font-weight:700; letter-spacing:.02em;
  color:var(--ink);
}
.sb-search{
  margin-left:auto;
  width:30px; height:30px; border-radius:9px;
  display:flex; align-items:center; justify-content:center;
  color:var(--ink); font-size:15px; line-height:1;
  border:1px solid var(--line); background:var(--card);
}
.sb-search:hover{ background:var(--line-2); }
.sb-search:active{ transform:scale(.96); }
.sb-close{
  display:none; width:30px; height:30px; border-radius:9px;
  align-items:center; justify-content:center; color:var(--ink);
}
.sb-close:active{ background:var(--line-2); }
.sb-scroll{
  flex:1; min-height:0; display:flex; flex-direction:column; overflow:hidden;
  padding-bottom:8px;
}
/* v125: 侧边栏「自选股」:「常用网站」高度比 = 7:3（flex-grow 7/3，basis 0 按占比分配） */
.sb-list{
  flex:7 1 0%; min-height:0; overflow-y:auto; overflow-x:hidden;
  padding:2px 4px 4px;   /* v322 #1：左右 8→4px，侧栏收窄到 170px 后保证三列不裁切 */
}
/* v191：侧边栏行上下留白加大（与最小 48px 行高配合），两行文字不再贴在一起
   v298：改为「公司 / 股价 / 市值」三列表格，表头与内容全部居中对齐
   v393 #3：显示格式回退到三列样式（用户未要求改动，撤销 v381 #6 的上下两行改版） */
.sb-thead{
  display:grid; grid-template-columns:1.2fr 1fr 1fr; justify-items:center; column-gap:12px;   /* v320 #1：三列拉开间距 */
  padding:2px 4px 6px; font-size:11px; font-weight:600; color:var(--ink);   /* v322 #1：左右 8→4px 配合 170px 侧栏 */
}
.sb-thead span{ white-space:nowrap; }
.sb-item{
  display:grid; grid-template-columns:1.2fr 1fr 1fr; column-gap:12px;   /* v320 #1：三列拉开间距 */
  justify-items:center; align-items:center; text-align:center;
  width:100%;
  padding:6px 4px; border-radius:11px; margin-bottom:2px;   /* v322 #1：左右 8→4px 配合 170px 侧栏 */
  border:1px solid transparent; box-sizing:border-box;
}
.sb-item:hover{ background:var(--line-2); }
.sb-item.on{ background:var(--navy-soft); border-color:#d9e2f0; }
/* v125→v191：侧边栏公司名海蓝；v313：股票名改雪球蓝（--xq）。v298 三列各为上下两行的纵向居中列 */
.sb-c1, .sb-c2, .sb-c3{ display:flex; flex-direction:column; align-items:center; gap:3px; min-width:0; }
.sb-nm{ font-size:12px; font-weight:600; color:var(--xq); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; max-width:100%; }   /* v319 #2：12.5→12px */
/* v313 #5：股价/涨跌幅/市值 统一等宽字体与字号（12.5px），三列数字观感一致 */
.sb-px{ font-family:var(--mono); font-size:12.5px; font-weight:600; white-space:nowrap; }
.sb-cd{ font-size:11px; color:var(--ink); font-family:var(--mono); white-space:nowrap; }
.sb-chg{ font-family:var(--mono); font-size:12.5px; font-weight:500; white-space:nowrap; }
.sb-mv{ font-family:var(--mono); font-size:12.5px; font-weight:600; color:var(--ink); white-space:nowrap; }
.sb-px.up, .sb-chg.up{ color:var(--up); }
.sb-px.down, .sb-chg.down{ color:var(--down); }
.sb-empty{ padding:24px 16px; text-align:center; color:var(--ink); font-size:13px; line-height:1.7; }
.sb-empty a{ color:var(--xq); }

/* 抽屉遮罩（仅窄屏抽屉态使用） */
.sb-mask{ display:none; }

@media (max-width: 980px){
  #sidebar{
    position:absolute; top:0; bottom:0; left:0; z-index:80;
    width:250px; max-width:82vw;
    transform:translateX(-100%);
    transition:transform .26s cubic-bezier(.22,.9,.3,1);
    box-shadow:var(--shadow-lg);
  }
  body.sb-open #sidebar{ transform:none; }
  body.sb-open .sb-mask{
    display:block; position:absolute; inset:0; z-index:79;
    background:rgba(16,23,40,.36);
  }
  .sb-close{ display:flex; }
  /* 窄屏显示菜单按钮（宽屏侧边栏常驻，无需按钮） */
  .tb-menu{ display:flex; }
}

/* v321 #3：笔记本上「我的公司」表溢出时，由 JS 给 body 加 .sb-auto——
   侧边栏自动收起为抽屉（与 ≤980px 同款交互），点顶栏菜单按钮再弹出显示；
   窗口加宽到能完整容纳表格（>1420px）时 JS 移除 .sb-auto，侧栏恢复常驻 */
body.sb-auto #sidebar{
  position:absolute; top:0; bottom:0; left:0; z-index:80;
  width:250px; max-width:82vw;
  transform:translateX(-100%);
  transition:transform .26s cubic-bezier(.22,.9,.3,1);
  box-shadow:var(--shadow-lg);
}
body.sb-auto.sb-open #sidebar{ transform:none; }
body.sb-auto .sb-mask{ position:absolute; inset:0; z-index:79; background:rgba(16,23,40,.36); }
body.sb-auto.sb-open .sb-mask{ display:block; }
body.sb-auto .sb-close{ display:flex; }
body.sb-auto .tb-menu{ display:flex; }

/* ============ 右侧自选公告侧边栏（每页常驻，与左侧自选对称，#1 v193） ============ */
#rsb{
  flex:0 0 278px; width:278px;   /* v319 #4：232→278px（1.2 倍），公告标题一屏读起来更完整 */
  background:var(--paper-2);
  border-left:1px solid var(--line);
  display:flex; flex-direction:column;
  overflow:hidden;
}
.rsb-head{
  flex:0 0 auto;
  display:flex; align-items:center; justify-content:center; gap:10px;   /* v326 #8：抬头居中 */
  padding:16px 14px 10px;
}
.rsb-title{
  font-size:14px; font-weight:700; letter-spacing:.02em; color:var(--ink);
}
.rsb-close{
  display:none; width:30px; height:30px; border-radius:9px; margin-left:auto;
  align-items:center; justify-content:center; color:var(--ink);
}
.rsb-close:active{ background:var(--line-2); }
.rsb-scroll{
  flex:1; min-height:0; overflow-y:auto; overflow-x:hidden;
  padding:0 12px 14px;
}
.rsb-mask{ display:none; }
/* 公告条目（原首页 .home-aside，#4 v193 提升为全局 #rsb） */
.ha-empty{ padding:24px 14px; text-align:center; color:var(--ink); font-size:12.5px; line-height:1.7; }
.ha-empty a{ color:var(--xq); }
.ha-item{ display:flex; align-items:flex-start; gap:8px; padding:9px 4px; border-bottom:1px solid var(--line-2); text-decoration:none; color:var(--ink-2); }
.ha-item:last-child{ border-bottom:none; }
/* #8 v195：公告标题不再链接，移除 hover 变蓝的「可点击」暗示 */
.ha-t{ flex:1; min-width:0; font-size:12px; line-height:1.4; color:var(--ink-2); cursor:pointer; }   /* #4 v201：自选公告标题可点击链接到公告 */
.ha-name{ color:var(--xq); font-weight:700; margin-right:4px; }   /* v315 #2：右侧公告股票名与左侧侧边栏同色（--xq 雪球蓝） */   /* #7 v199：自选公告公司名对齐侧栏「我的自选」公司名色 */
.ha-d{ flex:0 0 auto; font-family:var(--mono); font-size:11px; color:var(--ink); padding-top:1px; white-space:nowrap; }
.ha-mk{ flex:0 0 auto; font-size:10px; line-height:1; padding:2px 4px; border-radius:5px; margin-top:1px; }
.ha-mk.a{ background:#eaf1fb; color:#1a5fb4; }
.ha-mk.hk{ background:#eef3ea; color:#4a6b32; }
.ha-mk.us{ background:#f3eef7; color:#5c4276; }
@media (max-width: 980px){
  #rsb{
    position:absolute; top:0; bottom:0; right:0; z-index:80;
    width:300px; max-width:86vw;
    transform:translateX(100%);
    transition:transform .26s cubic-bezier(.22,.9,.3,1);
    box-shadow:var(--shadow-lg);
  }
  body.rsb-open #rsb{ transform:none; }
  body.rsb-open .rsb-mask{
    display:block; position:absolute; inset:0; z-index:79;
    background:rgba(16,23,40,.36);
  }
  .rsb-close{ display:flex; }
  .tb-rsb{ display:flex; }
}


/* ============ 通用组件 ============ */
.card{
  background:var(--card); border:1px solid var(--line);
  border-radius:var(--radius); padding:15px;
  box-shadow:var(--shadow); margin-bottom:12px;
  transition:box-shadow .18s, transform .18s;
}
.card.flat{ box-shadow:none; }
.card.tight{ padding:12px; }

.sec-title{
  display:flex; align-items:baseline; gap:8px;
  margin:20px 2px 10px;
}
.sec-title::before{
  content:""; align-self:center; width:3.5px; height:15px; border-radius:2px;
  background:#d6453f; flex:0 0 auto;   /* v305：单色品牌红，去三色渐变 */
}
.sec-title h2{ font-size:16.5px; letter-spacing:.01em; color:var(--ink); }
.sec-title span{ font-size:11.5px; color:var(--ink); letter-spacing:.05em; }
.sec-title .more{ margin-left:auto; font-size:12px; color:var(--sea); font-weight:600; }

.eyebrow{
  font-size:10.5px; font-weight:700; letter-spacing:.16em;
  color:var(--xq); text-transform:uppercase; margin-bottom:6px;
}
.eyebrow.head-lg{ font-size:21px; letter-spacing:.04em; }
/* 标题字号放大至 1.5 倍（10.5px → 15.75px），!important 压过页面级 .ph-page/.ph-cpd 覆盖 */
.eyebrow.t15{ font-size:15.75px !important; letter-spacing:.08em !important; line-height:1.3 !important; }
/* 标题字号缩小至 80%（10.5px → 8.4px） */
.eyebrow.t08{ font-size:8.4px !important; letter-spacing:.13em !important; line-height:1.3 !important; }
/* 标题字号放大至 1.2 倍（10.5px → 12.6px） */
.eyebrow.t12{ font-size:12.6px !important; letter-spacing:.1em !important; line-height:1.3 !important; }
.muted{ color:var(--ink); }
.tiny{ font-size:11.5px; line-height:1.55; color:var(--ink); }
.small{ font-size:12.5px; line-height:1.6; color:var(--ink); }
.num{ font-family:var(--mono); font-variant-numeric:tabular-nums; }
.up{ color:var(--up); } .down{ color:var(--down); }
.b{ font-weight:700; }
.center{ text-align:center; }

.btn{
  display:inline-flex; align-items:center; justify-content:center; gap:6px;
  padding:10px 16px; border-radius:10px; font-size:14px; font-weight:600;
  background:var(--ink); color:#fff; transition:transform .12s, opacity .12s, box-shadow .18s;
}
.btn:active{ transform:scale(.975); opacity:.9; }
.btn.ghost{ background:var(--card); color:var(--ink); border:1px solid var(--line); box-shadow:0 1px 2px rgba(18,26,42,.04); }
/* v313 #2：开通会员类按钮底色由土黄渐变改为雪球蓝（--xq，取自雪球官方 logo） */
.btn.gold{
  background:var(--xq);
  color:#fff; box-shadow:0 3px 10px rgba(30,93,189,.28);
}
.btn.sm{ padding:7px 12px; font-size:12.5px; border-radius:8px; }
.btn.block{ display:flex; width:100%; }
/* v319 #5：蓝底白字（.gold）按钮去掉通栏拉伸——底色框宽度收敛到与文字内容同宽，块级使用时水平居中 */
.btn.gold.block{ display:flex; width:fit-content; margin-left:auto; margin-right:auto; }
.btn:disabled{ opacity:.45; cursor:not-allowed; }
/* v434：删除类按钮——红底白字，与开通/奖励（蓝/金）区分，提示不可逆操作 */
.btn.danger{ background:#d64545; color:#fff; border:1px solid #d64545; box-shadow:0 3px 10px rgba(214,69,69,.28); }
.btn.danger:hover{ background:#c23a3a; }

.pill{
  display:inline-block; padding:2.5px 8px; border-radius:99px;
  font-size:11px; font-weight:600; letter-spacing:.03em;
  background:var(--line-2); color:var(--ink);
}
.pill.gold{ background:var(--gold-soft); color:var(--xq); }
.pill.up{ background:var(--up-soft); color:var(--up); }
.pill.down{ background:var(--down-soft); color:var(--down); }
.pill.warn{ background:var(--warn-soft); color:var(--warn); }
.pill.navy{ background:var(--navy-soft); color:var(--ink-2); }

.divider{ height:1px; background:var(--line); margin:13px -15px; }
.divider.inset{ margin-left:0; margin-right:0; }

/* 数据行 */
.kv{ display:flex; align-items:baseline; justify-content:space-between; gap:10px; padding:7px 0; }
.kv + .kv{ border-top:1px dashed var(--line-2); }
.kv dt{ font-size:13px; color:var(--ink); flex:0 0 auto; }
.kv dd{ margin:0; font-size:14px; font-weight:650; font-family:var(--mono); font-variant-numeric:tabular-nums; text-align:right; }

/* 指标格 */
.metrics{ display:grid; grid-template-columns:repeat(3,1fr); gap:1px; background:var(--line-2); border-radius:var(--radius-sm); overflow:hidden; }
.metrics .m{ background:var(--card); padding:11px 8px; text-align:center; }
.metrics .m b{ display:block; font-size:17px; font-family:var(--mono); font-variant-numeric:tabular-nums; letter-spacing:-.02em; }
.metrics .m span{ display:block; font-size:10.5px; color:var(--ink); margin-top:2px; letter-spacing:.03em; }
.metrics.c2{ grid-template-columns:repeat(2,1fr); }
.metrics.c4{ grid-template-columns:repeat(4,1fr); }
/* #4：核心指标模块高度减半（紧凑版） */
.metrics.m-compact .m{ padding:3px 5px; }
.metrics.m-compact .m b{ font-size:12px; }
.metrics.m-compact .m span{ font-size:8px; margin-top:0; }
/* #4：核心指标模块字体扩大约 2 倍（相对紧凑版） */
.metrics.m-big2 .m{ padding:9px 7px; }
.metrics.m-big2 .m b{ font-size:22px; }
.metrics.m-big2 .m span{ font-size:14px; margin-top:2px; }
/* 核心指标模块字体扩大 1.5 倍（相对紧凑版） */
.metrics.m-big15 .m{ padding:6px 6px; }
.metrics.m-big15 .m b{ font-size:18px; }
.metrics.m-big15 .m span{ font-size:12px; margin-top:1px; }
/* 核心指标模块字体扩大 2 倍（相对紧凑版，即 m-big15 的 2 倍） */
.metrics.m-big3 .m{ padding:8px 6px; }
.metrics.m-big3 .m b{ font-size:34px; }
.metrics.m-big3 .m span{ font-size:22px; margin-top:2px; }

/* 表单 */
.field{ margin-bottom:12px; }
.field label{ display:block; font-size:12.5px; color:var(--ink); margin-bottom:5px; font-weight:600; }
.field label em{ font-style:normal; color:var(--ink); font-weight:400; }
.input, select.input, textarea.input{
  width:100%; padding:9px 11px; border-radius:9px;
  border:1px solid var(--line); background:var(--paper-2);   /* v313 #1：回滚 v312 #5，输入底色恢复 --paper-2 */
  font-family:var(--mono); font-size:14px; outline:none; transition:border-color .15s, background .15s;
}
textarea.input{ font-family:var(--font); line-height:1.6; resize:vertical; min-height:78px; }
select.input{ font-family:var(--font); appearance:none; background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M6 9l6 6 6-6' fill='none' stroke='%235b6b84' stroke-width='2.2' stroke-linecap='round'/></svg>"); background-repeat:no-repeat; background-position:right 9px center; background-size:15px; padding-right:30px; }
.input:focus{ border-color:var(--gold); background:#fff; }

/* 滑块 */
.slider-row{ margin-bottom:14px; }
.slider-row .sl-top{ display:flex; align-items:baseline; justify-content:space-between; margin-bottom:3px; }
.slider-row .sl-top label{ font-size:12.5px; color:var(--ink); font-weight:600; }
.slider-row .sl-top b{ font-family:var(--mono); font-size:14px; color:var(--ink); }
input[type=range]{
  -webkit-appearance:none; appearance:none; width:100%; height:22px; background:transparent; margin:0;
}
input[type=range]::-webkit-slider-runnable-track{ height:4px; border-radius:2px; background:linear-gradient(90deg,var(--gold) var(--pct,50%), #e0ddd5 var(--pct,50%)); }
input[type=range]::-webkit-slider-thumb{
  -webkit-appearance:none; width:19px; height:19px; border-radius:50%;
  background:#fff; border:2px solid var(--gold); margin-top:-7.5px;
  box-shadow:0 1px 4px rgba(0,0,0,.16);
}
input[type=range]::-moz-range-track{ height:4px; border-radius:2px; background:#e0ddd5; }
input[type=range]::-moz-range-progress{ height:4px; border-radius:2px; background:var(--gold); }
input[type=range]::-moz-range-thumb{ width:16px; height:16px; border-radius:50%; background:#fff; border:2px solid var(--gold); }

/* 列表项 */
.row{
  display:flex; align-items:center; gap:11px; padding:12px 0;
  border-bottom:1px solid var(--line-2);
}
.row:last-child{ border-bottom:none; }
.row .rw-ico{
  width:36px; height:36px; border-radius:10px; flex:0 0 auto;
  display:flex; align-items:center; justify-content:center;
  background:var(--navy-soft); color:var(--ink-2);
}
.row .rw-ico svg{ width:19px; height:19px; }
.row .rw-body{ flex:1; min-width:0; }
.row .rw-body b{ display:block; font-size:14px; font-weight:650; }
.row .rw-body span{ display:block; font-size:11.5px; color:var(--ink); line-height:1.45; margin-top:1px; }
.row .rw-arrow{ color:var(--ink); flex:0 0 auto; }

/* 引文 */
blockquote.quote{
  margin:0; padding:12px 14px; border-left:3px solid var(--gold);
  background:var(--gold-soft); border-radius:0 10px 10px 0;
  font-size:14px; line-height:1.68; color:#5c4a20;
}
blockquote.quote cite{ display:block; margin-top:6px; font-style:normal; font-size:11.5px; color:#8a7443; letter-spacing:.03em; }

/* 提示条 */
.note{
  display:flex; gap:8px; padding:10px 12px; border-radius:10px;
  font-size:12.5px; line-height:1.6; background:var(--navy-soft); color:var(--ink-2);
}
.note.warn{ background:var(--warn-soft); color:#7d5310; }
.note.danger{ background:var(--up-soft); color:#8e2020; }
.note.ok{ background:var(--down-soft); color:#0b6340; }
.note b{ font-weight:700; }
.note .ni{ flex:0 0 auto; font-size:14px; line-height:1.45; }

/* 折叠 */
.acc{ border:1px solid var(--line); border-radius:var(--radius-sm); overflow:hidden; margin-bottom:9px; background:var(--card); }
.acc-h{ display:flex; align-items:center; gap:9px; padding:12px 13px; width:100%; text-align:left; }
.acc-h b{ flex:1; font-size:14px; font-weight:650; }
.acc-h .chev{ transition:transform .22s; color:var(--ink); flex:0 0 auto; }
.acc.open .acc-h .chev{ transform:rotate(180deg); }
.acc-c{ display:none; padding:0 13px 14px; font-size:13.5px; line-height:1.72; color:var(--ink-2); }
.acc.open .acc-c{ display:block; animation:viewIn .22s ease; }
.acc-n{ width:22px; height:22px; border-radius:6px; background:var(--ink); color:#fff; font-size:11px; font-weight:700; display:flex; align-items:center; justify-content:center; flex:0 0 auto; font-family:var(--mono); }

/* 网格入口 */
.grid2{ display:grid; grid-template-columns:1fr 1fr; gap:11px; }
/* v488 #1：首页「全部功能」八大模块宽屏每行 4 个；窄屏回落 2 列（与 grid2 一致） */
@media(min-width:981px){
  .hm-entries{ grid-template-columns:repeat(4,minmax(0,1fr)); gap:10px; }
  .hm-entries .entry{ padding:13px 11px; }
  .hm-entries .entry span{ font-size:11px; }
}
/* v489 #1：手机横屏（矮宽视口）同样每行 4 个，紧凑间距 */
@media(max-width:980px) and (orientation:landscape) and (max-height:500px){
  .hm-entries{ grid-template-columns:repeat(4,minmax(0,1fr)); gap:8px; }
  .hm-entries .entry{ padding:10px 9px; }
  .hm-entries .entry .en-ico{ width:28px; height:28px; border-radius:8px; margin-bottom:6px; }
  .hm-entries .entry .en-ico svg{ width:16px; height:16px; }
  .hm-entries .entry b{ font-size:12px; }
  .hm-entries .entry span{ font-size:10px; }
}
.grid3{ display:grid; grid-template-columns:repeat(3,1fr); gap:9px; }
.entry{
  background:var(--card); border:1px solid var(--line); border-radius:var(--radius);
  padding:14px 13px; box-shadow:var(--shadow); position:relative; overflow:hidden;
  display:block; transition:transform .14s;
}
.entry:active{ transform:scale(.985); }
.entry .en-ico{ width:34px; height:34px; border-radius:10px; display:flex; align-items:center; justify-content:center; margin-bottom:9px; }
.entry .en-ico svg{ width:19px; height:19px; }
.entry b{ display:block; font-size:14.5px; }
.entry span{ display:block; font-size:11.5px; color:var(--ink); line-height:1.5; margin-top:3px; }

/* 选择题 */
.opt{
  display:flex; align-items:flex-start; gap:9px; padding:11px 12px;
  border:1px solid var(--line); border-radius:10px; margin-bottom:8px;
  background:var(--card); font-size:13.5px; line-height:1.55; text-align:left; width:100%;
  transition:border-color .14s, background .14s;
}
.opt .ok-box{
  width:19px; height:19px; border-radius:6px; border:1.6px solid var(--line);
  flex:0 0 auto; margin-top:1px; display:flex; align-items:center; justify-content:center;
  font-size:11px; font-weight:700; color:transparent; background:var(--paper-2);
}
.opt.sel{ border-color:var(--gold); background:var(--gold-soft); }
.opt.sel .ok-box{ background:var(--gold); border-color:var(--gold); color:#fff; }
.opt.right{ border-color:var(--down); background:var(--down-soft); }
.opt.right .ok-box{ background:var(--down); border-color:var(--down); color:#fff; }
.opt.wrong{ border-color:var(--up); background:var(--up-soft); }
.opt.wrong .ok-box{ background:var(--up); border-color:var(--up); color:#fff; }

/* 进度条 */
.bar{ height:6px; border-radius:3px; background:var(--line-2); overflow:hidden; }
.bar i{ display:block; height:100%; border-radius:3px; background:var(--gold); transition:width .5s cubic-bezier(.2,.8,.3,1); }
.bar.thin{ height:4px; }

/* 标签切换 */
.segs{ display:flex; gap:4px; padding:3px; background:var(--line-2); border-radius:10px; margin-bottom:13px; }
.segs button{ flex:1; padding:7px 4px; border-radius:8px; font-size:12.5px; font-weight:600; color:var(--ink); transition:.16s; white-space:nowrap; }
.segs button.on{ background:var(--card); color:var(--ink); box-shadow:0 1px 3px rgba(0,0,0,.07); }

.chips{ display:flex; gap:7px; overflow-x:auto; padding-bottom:3px; margin-bottom:12px; scrollbar-width:none; }
.chips::-webkit-scrollbar{ display:none; }
.chips button{
  padding:6px 13px; border-radius:99px; font-size:12.5px; font-weight:600; white-space:nowrap;
  background:var(--card); border:1px solid var(--line); color:var(--ink);
}
.chips button.on{ background:var(--ink); border-color:var(--ink); color:#fff; }
.chips a{
  padding:6px 13px; border-radius:99px; font-size:12.5px; font-weight:600; white-space:nowrap;
  background:var(--card); border:1px solid var(--line); color:var(--ink); text-decoration:none; display:inline-block;
}
.chips a.on{ background:var(--ink); border-color:var(--ink); color:#fff; }

/* 表格 */
.tbl{ width:100%; border-collapse:collapse; font-size:12.5px; }
.tbl th, .tbl td{ padding:8px 6px; text-align:right; border-bottom:1px solid var(--line-2); }
.tbl th{ font-size:11px; color:var(--ink); font-weight:600; letter-spacing:.03em; }
.tbl th:first-child, .tbl td:first-child{ text-align:left; }
.tbl td{ font-family:var(--mono); font-variant-numeric:tabular-nums; }
.tbl td:first-child{ font-family:var(--font); color:var(--ink-2); }
.tbl tr:last-child td{ border-bottom:none; }
.scroll-x{ overflow-x:auto; margin:0 -15px; padding:0 15px; }

/* 弹层 */
.sheet{ position:fixed; inset:0; z-index:200; }
.sheet-mask{ position:absolute; inset:0; background:rgba(16,24,38,.42); animation:fadeIn .2s; }
@keyframes fadeIn{ from{opacity:0}to{opacity:1} }
.sheet-body{
  position:absolute; left:50%; transform:translateX(-50%); bottom:0;
  width:100%; max-width:var(--maxw); background:var(--paper);
  border-radius:18px 18px 0 0; max-height:86vh; display:flex; flex-direction:column;
  box-shadow:var(--shadow-lg); animation:sheetUp .3s cubic-bezier(.2,.9,.3,1);
  padding-bottom:env(safe-area-inset-bottom);
}
@keyframes sheetUp{ from{ transform:translate(-50%,100%);} to{ transform:translate(-50%,0);} }
.sheet-head{ display:flex; align-items:center; padding:15px 16px 11px; border-bottom:1px solid var(--line); }
.sheet-head h3{ flex:1; font-size:16px; }
.sheet-x{ width:28px; height:28px; border-radius:8px; display:flex; align-items:center; justify-content:center; color:var(--ink); background:var(--line-2); }
.sheet-content{ overflow-y:auto; padding:15px 16px 22px; -webkit-overflow-scrolling:touch; }
/* v360 #4：登录弹窗收窄为紧凑居中卡片（微信左、短信右，默认微信） */
.sheet-body:has(.vc-login){ max-width:392px; }


/* Toast */
.toast{
  position:fixed; left:50%; bottom:calc(env(safe-area-inset-bottom) + 18px); transform:translateX(-50%);
  background:rgba(22,35,58,.94); color:#fff; padding:9px 17px; border-radius:99px;
  font-size:13px; z-index:300; animation:viewIn .2s; box-shadow:var(--shadow-lg); max-width:82%;
}

/* 空态 */
.empty{ text-align:center; padding:34px 16px; color:var(--ink); }
.empty svg{ width:46px; height:46px; opacity:.35; margin-bottom:9px; }
.empty p{ font-size:13px; }

/* Hero */
.hero{
  border-radius:16px; padding:19px 17px; margin-bottom:14px; position:relative; overflow:hidden;
  background:linear-gradient(140deg,#1b2b47 0%,#24395c 52%,#31496f 100%);
  color:#fff; box-shadow:0 8px 26px rgba(22,35,58,.24);
}
.hero::after{
  content:""; position:absolute; right:-46px; top:-52px; width:190px; height:190px; border-radius:50%;
  background:radial-gradient(circle,rgba(200,164,92,.32),transparent 66%);
}
.hero::before{
  content:""; position:absolute; right:14px; bottom:-30px; width:120px; height:120px; border-radius:50%;
  border:1px dashed rgba(255,255,255,.14);
}
.hero h1{ font-size:20px; line-height:1.35; margin-bottom:6px; position:relative; letter-spacing:.01em; }
.hero p{ font-size:12.8px; opacity:.82; line-height:1.62; position:relative; }
.hero .hero-tag{
  display:inline-block; padding:3px 9px; border-radius:99px; font-size:10.5px; font-weight:700;
  background:rgba(200,164,92,.2); color:#e5c887; letter-spacing:.1em; margin-bottom:9px; position:relative;
}

/* 紧凑型 Hero：高度约为默认的三分之一（仅保留标签 + 标题，隐藏描述段） */
.hero.compact{ padding:9px 14px; margin-bottom:12px; }
.hero.compact .hero-tag{ margin-bottom:5px; }
.hero.compact h1{ font-size:15px; line-height:1.2; margin-bottom:0; }
.hero.compact p{ display:none; }

/* 阶梯路径 */
.ladder{ position:relative; padding-left:26px; }
.ladder::before{ content:""; position:absolute; left:8px; top:8px; bottom:12px; width:1.5px; background:var(--line); }
.lad-item{ position:relative; margin-bottom:11px; }
.lad-item::before{
  content:""; position:absolute; left:-22px; top:15px; width:11px; height:11px; border-radius:50%;
  background:var(--card); border:2.2px solid var(--line);
}
.lad-item.on::before{ border-color:var(--gold); background:var(--gold); box-shadow:0 0 0 3.5px var(--gold-soft); }
.lad-item.done::before{ border-color:var(--down); background:var(--down); }

/* 评分环 */
.score-ring{ display:flex; align-items:center; gap:15px; }
.score-ring .sr-txt{ flex:1; min-width:0; }
.score-ring .sr-txt h3{ font-size:16px; margin-bottom:3px; }

/* 打分条组 */
.scale{ display:flex; gap:5px; }
.scale button{
  flex:1; height:34px; border-radius:8px; border:1px solid var(--line); background:var(--card);
  font-size:13px; font-weight:600; font-family:var(--mono); color:var(--ink);
}
.scale button.on{ background:var(--ink); border-color:var(--ink); color:#fff; }

/* checklist */
.chk{ display:flex; gap:10px; align-items:flex-start; padding:10px 0; border-bottom:1px dashed var(--line-2); width:100%; text-align:left; }
.chk:last-child{ border-bottom:none; }
.chk .cb{
  width:20px; height:20px; border-radius:6px; border:1.6px solid var(--line); flex:0 0 auto; margin-top:1px;
  display:flex; align-items:center; justify-content:center; color:transparent; font-size:12px; font-weight:800;
}
.chk.on .cb{ background:var(--down); border-color:var(--down); color:#fff; }
.chk .ct{ flex:1; font-size:13.5px; line-height:1.55; }
.chk .ct em{ display:block; font-style:normal; font-size:11.5px; color:var(--ink); margin-top:2px; line-height:1.5; }
.chk.on .ct{ color:var(--ink); }

/* v465（需求1）：买入决策清单——手机横屏 / 笔记本电脑 / 宽屏电脑 / 宽屏半屏时，每组问题两列排布。
   断点沿用既有「半屏两列」口径：≥640px 覆盖笔记本/宽屏/宽屏半屏（1366÷2≈683、1440÷2=720）；
   另以 (max-width:900px) and (orientation:landscape) and (max-height:500px) 兜底小尺寸横屏手机。
   分隔线改置顶（第 2 行起）——任意奇偶条数下每排都只有一条干净分隔线，末行不留悬空边框。 */
@media (min-width:640px), (max-width:900px) and (orientation:landscape) and (max-height:500px){
  .chk-grid{ display:grid; grid-template-columns:1fr 1fr; column-gap:22px; }
  .chk-grid > .chk{ border-bottom:none; border-top:1px dashed var(--line-2); }
  .chk-grid > .chk:nth-child(-n+2){ border-top:none; }
}

@media (max-width:360px){
  body{ font-size:14px; }
  .metrics .m b{ font-size:15.5px; }
  .grid3{ grid-template-columns:repeat(2,1fr); }
}
@media (min-width:721px){
  body{ background:var(--paper); }
  #app-shell{ min-height:100vh; box-shadow:0 0 60px rgba(22,35,58,.08); }
}

/* =========================================================
   交互式估值图表
   ========================================================= */
.vchart{ position:relative; margin:2px -4px 0; touch-action:pan-y; }
.vchart svg{ overflow:visible; }
.vchart .vc-hit{ cursor:crosshair; }
.vchart .vc-tip{
  display:none; position:absolute; top:-36px; z-index:6; pointer-events:none;
  background:rgba(22,35,58,.95); color:#fff; border-radius:9px; padding:7px 10px;
  font-size:11px; line-height:1.75; white-space:nowrap; box-shadow:0 6px 20px rgba(22,35,58,.25);
}
.vchart .vc-tip b{ display:block; font-size:11px; font-weight:700; opacity:1; margin-bottom:2px;
  font-family:var(--mono); letter-spacing:.02em; }
.vc-tip i{ display:inline-block; width:7px; height:7px; border-radius:2px; margin-right:5px; vertical-align:1px; }
.vc-tip i.nb{ background:transparent; border:1px dashed rgba(255,255,255,.5); }
.vc-tip em{ font-style:normal; font-family:var(--mono); font-weight:700; margin-left:6px; }
.vc-tip br{ line-height:0; }
/* 估值走势 hover 时在图正中央显示「指标值 + 估值百分位」 */
.vchart .vc-mid{
  display:none; position:absolute; left:50%; top:50%; transform:translate(-50%,-50%);
  z-index:7; pointer-events:none; align-items:center; gap:7px; white-space:nowrap;
  background:rgba(22,35,58,.92); color:#fff; border-radius:12px; padding:9px 16px;
  box-shadow:0 8px 26px rgba(22,35,58,.30); font-family:var(--mono);
}
.vchart .vc-mid .vm-k{ font-size:11px; opacity:.72; font-family:inherit; }
.vchart .vc-mid .vm-v{ font-size:15px; font-weight:700; margin-left:6px; }
.vchart .vc-mid .vm-v.hot{ color:#ff8a8a; }
.vchart .vc-mid .vm-v.cold{ color:#5fd39b; }
.vchart .vc-mid .vm-sep{ width:1px; height:20px; background:rgba(255,255,255,.22); margin:0 7px; }
.vc-empty{
  padding:26px 12px; text-align:center; font-size:12.5px; color:var(--ink);
  background:var(--paper-2); border:1px dashed var(--line); border-radius:var(--radius-sm);
}
.chart-legend{ display:flex; flex-wrap:wrap; gap:10px; margin-top:7px; font-size:10.5px; color:var(--ink); }
.chart-legend span{ display:inline-flex; align-items:center; gap:4px; }
.chart-legend i{ width:11px; height:2.5px; border-radius:2px; display:inline-block; }
.chart-hint{ font-size:10.5px; color:var(--ink); margin-top:6px; display:flex; align-items:center; gap:4px; }

/* v128+: 财报体检·五维雷达 左图右文
   v210 #2：AI 财报问答已移出本卡，整块恢复为「左半 = 五维雷达」/「右半 = 五维解读」，各占一半 */
.fr-radar-card .fr-radar-grid{ display:flex; gap:18px; align-items:flex-start; }
.fr-radar-card .fr-radar-main{ flex:1 1 auto; max-width:100%; min-width:0; display:flex; gap:18px; align-items:flex-start; }
.fr-radar-card .fr-radar-left{ flex:0 0 auto; width:280px; max-width:48%; }   /* v211：200→280，AI 模块移走后雷达图放大、标签由 ~7.5px 提到 ~10.5px */
.fr-radar-card .fr-radar-right{ flex:1 1 auto; min-width:0; }
.fr-radar-card .fr-radar-right .eyebrow{ margin:0 0 6px; }
.fr-interp-total{ font-size:13px; line-height:1.62; color:var(--ink-1); margin:0 0 2px; }
.fr-interp-total b{ font-weight:700; color:var(--ink-1); }
.fr-interp-total i{ font-style:normal; font-family:var(--mono); color:var(--xq); }
.fr-interp-desc{ font-size:12px; line-height:1.6; color:var(--ink); margin:0 0 9px; text-indent:0; }   /* #5 v215：五维解读综合评分下解读内容改为顶格（原 text-indent:2em 空两格） */
/* v323 #4：五维打分内容改横排排列——五个维度块一行放不下自动换行（flex-wrap + flex-basis 128px），
   每块为「维度名+打分 / 能力结论」小卡片；手机竖屏窄栏自动降到 2 列 / 1 列，五维全部可见 */
.fr-interp-dims{ list-style:none; margin:0; padding:0; display:flex; flex-wrap:wrap; gap:8px; }
.fr-interp-dims li{ display:block; flex:1 1 128px; min-width:128px; max-width:100%; box-sizing:border-box;
  font-size:12.5px; line-height:1.5;
  background:var(--paper-2); border:1px solid var(--line-2); border-radius:9px; padding:7px 10px; }
.fr-ri-k{ display:block; font-weight:700; color:var(--ink-1); }
.fr-ri-k i{ font-style:normal; font-family:var(--mono); color:var(--xq); }
.fr-ri-v{ display:block; color:var(--ink); margin-top:1px; }
.fr-trend-review{ font-size:12px; line-height:1.62; color:var(--ink); margin:2px 0 8px; text-indent:2em; }   /* #4 v203：五维评分走势下解读内容起始句空两格 */
.fr-mda-change{ font-size:12.5px; line-height:1.7; color:var(--ink-2); margin:6px 0 0; }
.fr-mda{ font-size:12.5px; line-height:1.85; color:var(--ink-2); margin:6px 0 0; white-space:pre-wrap; word-break:break-word; max-height:420px; overflow:auto; padding-right:4px; }
.fr-src{ font-size:11px; color:var(--ink); font-weight:400; margin-left:4px; white-space:nowrap; }   /* v402 #1：手机竖屏下报告期（YYYY年X报）保持单行不折行 */
/* 指标变动说明表格：首行目录 + 分行指标 */
.fr-change-scroll{ max-height:340px; overflow-y:auto; overflow-x:hidden; margin:6px 0 0; border:1px solid var(--line-2); border-radius:6px; }
.fr-change-tbl{ width:100%; border-collapse:collapse; margin:0; font-size:11.5px; line-height:1.5; }
.fr-change-tbl th, .fr-change-tbl td{ border:1px solid var(--line-2); padding:5px 7px; text-align:left; vertical-align:top; }
.fr-change-tbl th{ background:var(--paper-2); font-weight:700; color:var(--ink); white-space:nowrap; text-align:center; }
.fr-change-tbl td.fr-ct-subj{ font-weight:600; color:var(--ink); white-space:nowrap; text-align:left; }
.fr-change-tbl td.fr-ct-num{ text-align:center; font-family:var(--mono); font-variant-numeric:tabular-nums; white-space:nowrap; }
.fr-change-tbl td.fr-ct-reason{ color:var(--ink); line-height:1.45; text-align:left; }
.fr-change-tbl td.up{ color:var(--up); font-weight:600; }
.fr-change-tbl td.down{ color:var(--down); font-weight:600; }
.fr-change-tbl td.fr-ct-group{ background:var(--paper-3); font-weight:700; color:var(--ink-1); text-align:center; font-size:11.5px; letter-spacing:0.5px; }
/* 公司简介模块：公司亮点 / 基本简介 / 按产品·按地区主营构成 */
.fr-prof-block{ margin-top:10px; }
.fr-prof-block:first-child{ margin-top:2px; }
.fr-prof-h{ font-size:12.5px; font-weight:700; color:var(--ink-1); margin-bottom:4px; }
.fr-prof-txt{ font-size:12.5px; line-height:1.75; color:var(--ink-2); margin:0; text-indent:2em; }
.fr-prof-tbl{ width:100%; border-collapse:collapse; margin:2px 0 0; font-size:11.5px; line-height:1.5; }
.fr-prof-tbl th, .fr-prof-tbl td{ border:1px solid var(--line-2); padding:5px 7px; text-align:left; vertical-align:top; }
.fr-prof-tbl th{ background:var(--paper-2); font-weight:700; color:var(--ink); white-space:nowrap; }
/* 五维评分走势：2 列网格，窄屏单列 */
.fr-score-grid{ display:grid; grid-template-columns:1fr 1fr; gap:14px 18px; }
.fr-score-cell{ min-width:0; }
.fr-score-t{ font-size:12.5px; font-weight:600; color:var(--ink-1); margin:0 0 2px; }
@media (max-width:560px){
  .fr-radar-card .fr-radar-grid{ flex-direction:column; }
  .fr-radar-card .fr-radar-left{ width:100%; max-width:100%; }
  .fr-score-grid{ grid-template-columns:1fr; }
}
/* 窄屏放不下「各占一半」时，五维解读整体下移到雷达图下方。
   v323 #4：.fr-radar-main 同步转纵向——此前仅 .fr-radar-grid 转列、main 仍为 row，
   ≤560px 时 .fr-radar-left 又被置为 width:100%，把右侧五维解读挤成一条竖排窄缝
   （一行只容 2~3 字），手机竖屏看不到五维打分内容；转列后雷达与解读各占整行，全部可见 */
@media (max-width:1100px){
  .fr-radar-card .fr-radar-grid{ flex-direction:column; }
  .fr-radar-card .fr-radar-main{ flex:1 1 auto; width:100%; max-width:100%; flex-direction:column; }
}

/* 公司要闻模块 */
.fr-news-list{ list-style:none; margin:6px 0 0; padding:0; }
.fr-news-item{ display:flex; align-items:baseline; gap:8px; padding:5px 0; border-bottom:1px solid var(--line, #eee); font-size:12.5px; line-height:1.5; }
.fr-news-item:last-child{ border-bottom:none; }
.fr-news-date{ flex:0 0 auto; color:var(--ink-3, #999); font-variant-numeric:tabular-nums; }
.fr-news-tag{ flex:0 0 auto; color:var(--xq); font-size:11px; padding:0 5px; border:1px solid var(--gold, #c08a2d); border-radius:3px; white-space:nowrap; }
.fr-news-title{ flex:1 1 auto; min-width:0; color:var(--ink-1, #222); text-decoration:none; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
a.fr-news-title:hover{ color:var(--xq); text-decoration:underline; }

/* v208：财报体检页公告模块：限高 + 上下拉动条（细滚动条，风格对齐 .wl-wrap） */
.fr-ann-box{ max-height:320px; overflow-y:auto; overflow-x:hidden; -webkit-overflow-scrolling:touch; margin-top:2px; }
.fr-ann-box::-webkit-scrollbar{ width:6px; height:6px; }
.fr-ann-box::-webkit-scrollbar-thumb{ background:var(--line, #eee); border-radius:3px; }
.fr-ann-box::-webkit-scrollbar-track{ background:transparent; }
.fr-ann-box .ha-item{ align-items:flex-start; }
.fr-ann-box .ha-t:hover{ color:var(--sea, #0a6ebd); }

/* v209 #1b：一句话公司简介（首行空两格由 .fr-prof-txt 的 text-indent:2em 提供）
   v210 #2：独立成「公司简介」卡片，不再挂在主营构成下方，故去掉上外边距 */
.fr-prof-intro{ margin-top:0; color:var(--ink-2); }
/* v215 #4（v217 #1 改名）：主要财务指标模块外壳——回报率/增长率/利润率/费用率/资产率/负债率/现金流/现金比 整体成组 */
.fr-kpi-card{ padding:13px 14px 14px; }
.fr-kpi-card > .eyebrow{ margin:0 0 10px; }
/* v216 #4：主要财务指标模块内 8 个指标名（.eyebrow）改为黑色
   v217 #1：作用域收敛到内层 .card，模块大标题「主要财务指标」回落 .eyebrow 默认金色，
            与「公告」等模块名同色（此前 .fr-kpi-card .eyebrow 会把大标题也染黑） */
.fr-kpi-card .card .eyebrow{ color:var(--ink-1); }
.fr-kpi-card > .card{ margin-bottom:11px; }
.fr-kpi-card > .card:last-child{ margin-bottom:0; }
.fr-kpi-card .grid2{ margin-bottom:11px; }
.fr-kpi-card .grid2:last-child{ margin-bottom:0; }
.fr-kpi-card .grid2 > .card{ margin-bottom:0; }
/* 内层图表卡去阴影 + 淡化边框，避免「卡中卡」视觉过重 */
.fr-kpi-card .card{ box-shadow:none; border-color:var(--line-2); padding:11px 12px; }
/* v210 #3：盈利预测模块——数据表 / 目标价说明行
   v215 #3：删除原 .fr-fc-src「数据来源…」脚注（不再渲染），统计口径说明已移至标题右侧 .fr-src */
.fr-fc-note{ margin:0 0 7px; font-size:11.5px; line-height:1.6; color:var(--ink); }
.fr-fc-note b{ color:var(--ink-1); font-family:var(--mono); }
.fr-fc-tbl{ width:100%; border-collapse:collapse; margin:0 0 8px; font-size:12px; line-height:1.5; }
.fr-fc-tbl th, .fr-fc-tbl td{ border:1px solid var(--line-2); padding:6px 9px; text-align:center; }
.fr-fc-tbl th{ background:var(--paper-2); font-weight:700; color:var(--ink); white-space:nowrap; }
.fr-fc-tbl td{ color:var(--ink-2); font-variant-numeric:tabular-nums; }
/* v224 #4：港美股「评级 + 目标价」卡片 */
.fr-fc-rating{ margin:0 0 8px; }
.fr-fc-rating-sum{ display:flex; flex-wrap:wrap; gap:18px; margin:2px 0 9px; }
.fr-fc-rs{ display:flex; flex-direction:column; gap:1px; }
.fr-fc-rs .lbl{ font-size:11.5px; color:var(--ink); }
.fr-fc-rs b{ font-size:13.6px; line-height:1.2; color:var(--up); font-family:var(--mono); }   /* v228：港美股盈利预测「综合评级/目标价」红色数值字号缩小到 80%（17→13.6） */
.fr-fc-rs .sub{ font-size:11px; color:var(--ink); }
.fr-fc-dist{ display:flex; flex-wrap:wrap; gap:8px; margin:0 0 9px; }
.fr-fc-dist-item{ font-size:11.5px; color:var(--ink-2); background:var(--paper-2);
  border:1px solid var(--line-2); border-radius:6px; padding:2px 8px; }

/* v217 #2（v220 #1 改名 + 居中）：主要财务指标说明——最新报告期「指标变动说明」，
   表头 主要财务指标 / 本报告期 / 同比增减 / 说明；
   表内按 资产负债表 / 利润表 / 现金流量表 分三组（分组行跨 4 列通栏）。
   v220 #1：本报告期、同比增减两列数据居中；三组表名（资产负债表/利润表/现金流量表）居中。 */
.fr-cn-tbl{ width:100%; table-layout:fixed; border-collapse:collapse; margin:2px 0 0; font-size:11.5px; line-height:1.6; }
.fr-cn-tbl th, .fr-cn-tbl td{ border:1px solid var(--line-2); padding:5px 8px; vertical-align:top; }
.fr-cn-tbl thead th{ background:var(--paper-2); font-weight:700; color:var(--ink); white-space:nowrap; text-align:center; }
.fr-cn-tbl td{ color:var(--ink-2); }
.fr-cn-tbl .fr-cn-name{ width:22%; text-align:left; white-space:normal; word-break:break-all; color:var(--ink-1); }
/* v220 #1：数值两列由右对齐改为居中（表头本就居中，数据与表头对齐）
   v221 #3：指标名、本报告期、同比增减三列垂直居中（说明列文字较长，仍顶部对齐） */
.fr-cn-tbl .fr-cn-num{ width:13%; text-align:center; white-space:nowrap; font-variant-numeric:tabular-nums; vertical-align:middle; }
.fr-cn-tbl .fr-cn-name{ vertical-align:middle; }
.fr-cn-tbl .fr-cn-reason{ text-align:left; white-space:normal; color:var(--ink-2); }
/* 分组通栏行（资产负债表 / 利润表 / 现金流量表）——v220 #1 居中 */
.fr-cn-tbl tr.fr-cn-grp td{
  background:var(--paper-2); font-weight:700; color:var(--ink);
  text-align:center; padding:4px 8px; white-space:nowrap;
}
/* 主要财务指标的说明：内容区上下拉动条（表格行数多时滚动查看） */
.fr-cn-box{ max-height:340px; overflow-y:auto; overflow-x:hidden; -webkit-overflow-scrolling:touch; margin-top:2px; }
.fr-cn-box::-webkit-scrollbar{ width:6px; height:6px; }
.fr-cn-box::-webkit-scrollbar-thumb{ background:var(--line, #eee); border-radius:3px; }
.fr-cn-box::-webkit-scrollbar-track{ background:transparent; }

/* v219 #2：AI 财报问答模块已整体下线，问答区相关样式全部移除 */

/* v239：财报体检页占位容器彻底去灰条——用户明确「灰色横条不能容忍」。
   缓存未命中时模块只留一个空容器，仅按模块给最小高度防止布局跳动；
   数据到位后由 refresh* 原位填充内容（闪显），全程无任何「加载中」指示。 */
.fr-skel{ display:block; }
.fr-skel-intro{ min-height:44px; }   /* 公司简介：一句话正文 */
.fr-skel-prof{ min-height:96px; }    /* 主营构成：表头 + 若干行 */
.fr-skel-kpi{ min-height:120px; }    /* 主要指标：八图区 */
.fr-skel-fc{ min-height:56px; }      /* 盈利预测：表格行 */
.fr-skel-irm{ min-height:48px; }     /* 投资者互动：问答行 */
.fr-skel-ann{ min-height:48px; }     /* 公告：列表行 */
.fr-skel-cn{ min-height:56px; }      /* 主要指标说明：表格行 */

/* v219 #3：财报体检页模块锚点菜单栏（置于「公司简介」上方，滚动时吸顶）。
   横向单行排列九个模块名，超出宽度横向滚动（隐藏滚动条）；选中项金底白字。
   吸顶依赖 #view 作为滚动容器（position:sticky top:0）。 */
.fr-nav{
  position:sticky; top:0; z-index:6;
  margin:0 0 12px; padding:6px 0 7px;
  background:var(--bg);
  /* v221 #1：菜单栏整体水平居中（内层 .fr-nav-inner 收窄为内容宽度，溢出时仍可横向滚动） */
  display:flex; justify-content:center;
}
.fr-nav::after{
  content:''; position:absolute; left:0; right:0; bottom:0; height:1px; background:var(--line);
}
.fr-nav-inner{
  display:flex; align-items:center; justify-content:center;
  /* v222 #2：整条菜单栏作为一个整体呈现——十项菜单不再各自带一个胶囊块，
     由 .fr-nav-inner 统一承载边框 / 底色 / 圆角，菜单项退化为栏内的一段文字。 */
  gap:2px;
  /* v221 #1：配合 .fr-nav 居中——收窄到内容宽度且不超出父容器，菜单过多时可横向滚动 */
  flex:0 1 auto; max-width:100%;
  overflow-x:auto; overflow-y:hidden;
  -webkit-overflow-scrolling:touch;
  scrollbar-width:none; -ms-overflow-style:none;
  padding:3px 5px;
  border:1px solid var(--line); border-radius:10px; background:var(--card);
}
.fr-nav-inner::-webkit-scrollbar{ display:none; }
/* v220 #5：菜单名字体改为红色（--up 为站内统一的红）；选中态同步走红色块，避免与金色混搭。 */
.fr-nav-item{
  flex:0 0 auto;
  /* v222 #2：不再各自成块——无边框、无底色、无胶囊圆角，只保留文字与内边距 */
  border:0; background:transparent;
  color:var(--xq);   /* v223 #1：与模块名「公司简介」同为金色；红色仅在选中态使用 */
  /* v224 #1：字号与页面内模块标题（.eyebrow.t12）严格一致为 12.6px，
     字重/字距/行高保持原有观感；颜色保持金色（与模块名「公司简介」一致） */
  font-size:12.6px; font-weight:700; letter-spacing:.1em; line-height:1.35; font-family:inherit;
  padding:5px 12px; border-radius:7px;
  white-space:nowrap; cursor:pointer;
  transition:background .15s ease, color .15s ease;
}
.fr-nav-item:hover{ color:var(--up); background:var(--up-soft); }
.fr-nav-item:active{ transform:scale(.97); }
.fr-nav-item.on{
  background:var(--up); border-color:var(--up); color:#fff; font-weight:700;
}
@media(max-width:560px){
  /* v221 #1：不再覆盖 font-size，字号统一跟随模块标题（v222 #2 起为 1.2 倍）；
     v222 #2：仅收紧内边距与间距，保持「整栏一体」的观感不变 */
  .fr-nav-item{ padding:4px 9px; letter-spacing:.06em; }
  .fr-nav-inner{ gap:1px; padding:3px 4px; }
}

/* v220 #2：投资者互动模块（盈利预测下方 / 公告上方，近一年交易所互动平台问答）
   原「投资者问答（问董秘）」样式复用，问答块最大高度放宽到 300px。 */
.fr-irm-box{ max-height:300px; overflow-y:auto; -webkit-overflow-scrolling:touch; }
.fr-irm-txt.fr-irm-none{ color:var(--ink); }   /* 公司暂未回复：弱化显示 */
.fr-irm-box::-webkit-scrollbar{ width:6px; }
.fr-irm-box::-webkit-scrollbar-thumb{ background:var(--line, #eee); border-radius:3px; }
.fr-irm-list{ list-style:none; margin:6px 0 0; padding:0; }
.fr-irm-item{ padding:8px 0; border-bottom:1px solid var(--line-2, #f0f0f0); }
.fr-irm-item:last-child{ border-bottom:none; }
.fr-irm-qa{ display:flex; gap:6px; align-items:flex-start; margin:3px 0; }
/* v223 #5：问 蓝底 / 答 红底（贴近站内涨跌色，更直观） */
.fr-irm-tag{ flex:0 0 auto; width:18px; height:18px; border-radius:5px; display:flex; align-items:center; justify-content:center; font-size:11px; font-weight:700; color:#fff; background:#2c6fd6; }
.fr-irm-tag.ans{ background:var(--up); }
.fr-irm-txt{ flex:1; min-width:0; font-size:12px; line-height:1.5; color:var(--ink-2, #4a4a4a); }
.fr-irm-q{ font-weight:700; }   /* v223 #5：问 字后面的问题加粗显示 */
.fr-irm-date{ font-size:10px; color:var(--ink-4, #999); text-align:right; margin-top:2px; }

/* 会员中心 */
.member-grid{ display:grid; grid-template-columns:repeat(2,1fr); gap:12px; }
.member-card{ border:1px solid var(--line, #eee); border-radius:12px; padding:14px 12px; text-align:center; background:#fff; }
.member-name{ font-size:15px; font-weight:700; color:var(--ink-1, #222); }
.member-price{ margin:6px 0 4px; color:var(--ink-2, #555); font-size:13px; }
.member-price b{ font-size:22px; color:var(--xq); }
.member-desc{ font-size:11.5px; color:var(--ink-3, #999); min-height:30px; margin-bottom:10px; }
.member-qr{ border:2px dashed var(--gold, #c08a2d); border-radius:12px; padding:22px 12px; color:var(--xq);
  font-size:13px; font-weight:600; background:var(--gold-soft, #fbf3e2); margin-bottom:4px; }
@media (max-width:560px){ .member-grid{ grid-template-columns:1fr; } }

/* =========================================================
   搜索 / 自选股
   ========================================================= */
.searchbar{ display:flex; gap:8px; align-items:center; margin-bottom:12px; }
.searchbar .sb-in{
  flex:1; min-width:0; height:42px; border-radius:11px; border:1px solid var(--line);
  background:var(--card); padding:0 13px; font-size:14.5px; outline:none;
  box-shadow:var(--shadow);
}
.searchbar .sb-in:focus{ border-color:var(--gold); box-shadow:0 0 0 3px var(--gold-soft); }
.searchbar .sb-btn{
  height:42px; padding:0 16px; border-radius:11px; background:var(--ink); color:#fff;
  font-size:14px; font-weight:600; flex:0 0 auto;
}
.sres{ display:block; width:100%; text-align:left; padding:11px 2px; border-bottom:1px solid var(--line-2);
  display:flex; align-items:center; gap:10px; }
.sres:last-child{ border-bottom:none; }
.sres .sr-m{
  flex:0 0 auto; font-size:10px; font-weight:700; padding:2px 6px; border-radius:5px;
  background:var(--navy-soft); color:var(--ink-2);
}
.sres .sr-m.hk{ background:#eef3ea; color:#4a6b32; }
.sres .sr-m.us{ background:#f3eef7; color:#5c4276; }
.sres .sr-b{ flex:1; min-width:0; }
.sres .sr-b b{ font-size:14.5px; font-weight:650; }
.sres .sr-b em{ display:block; font-style:normal; font-size:11px; color:var(--ink); font-family:var(--mono); }
.sres .sr-add{
  flex:0 0 auto; width:30px; height:30px; border-radius:9px; border:1px solid var(--line);
  font-size:17px; line-height:1; color:var(--xq); background:var(--card);
}
.sres .sr-add.on{ background:var(--gold); border-color:var(--gold); color:#fff; }

/* 自选股表：容器高度随视口自适应，下沿贴近底部固定菜单栏（--tab-h:58px）
   自选股页：顶部仅搜索框+标题；首页：顶部还有今日一课，故再低一档 */
.wl-wrap{ margin:0 -14px; height:calc(100vh - 163px); min-height:300px; max-height:820px; overflow-x:auto; overflow-y:auto; -webkit-overflow-scrolling:touch; }   /* v320 #2：列宽增大后若不能完整显示，模块底部出现左右拉动条 */
.wl-home .wl-wrap{ height:calc(100vh - 282px); min-height:260px; max-height:720px; }
.wl-wrap::-webkit-scrollbar{ width:6px; height:6px; }
.wl-wrap::-webkit-scrollbar-thumb{ background:var(--line); border-radius:3px; }
/* v318：table-layout fixed→auto——等宽列在 13.3" 笔记本上必裁 5~7 位数值；
   改为按内容自适应（td nowrap 撑开列宽），21 列指标在收窄后的主区内刚好全部放下 */
/* v320 #2：表格尽量占满容器（width:100%），公司列固定四字宽不可再被压缩；
   若各列最小宽度之和超过容器，表格自然溢出，由 .wl-wrap 的 overflow-x:auto 给出左右拉动条 */
table.wl{ border-collapse:separate; border-spacing:0; width:100%; table-layout:auto; font-size:11px; }
table.wl th, table.wl td{ padding:8px 3px; text-align:center; overflow:hidden; }
/* v123: 持续跟踪每行自选股间距缩小到 50%（td 垂直 padding 8px → 4px；表头 th 保持 8px） */
/* v125: 持续跟踪行高（line-height）压缩至当前约 80%（1.62 → 1.25），整行高度约 46px → 37px */
/* v318: 水平 padding 4px→2px：13.3" 笔记本上 21 列指标全部可见 */
table.wl td{ padding:4px 1.5px; line-height:1.25; }
/* v325 #1：全部表头加粗黑体（黑体字族 + 700 加粗），颜色加深保证黑字观感 */
table.wl th{
  font-size:11.55px; font-weight:700; color:var(--ink-2);
  font-family:"PingFang SC","Hiragino Sans GB","Microsoft YaHei","Heiti SC","SimHei",sans-serif;
  background:var(--paper-2);
  border-bottom:1px solid var(--line); position:sticky; top:0; line-height:1.2; z-index:3;
  word-break:break-word; padding:5px 2px;
}
table.wl th small{ display:block; font-size:9.45px; font-weight:400; opacity:.8; }
table.wl td{ font-family:var(--mono); font-weight:600; white-space:nowrap; }
/* v94: 指标数据字体放大至 1.5×（11px→16.5px）；公司名列(.c1)字号由子元素显式设定故不受影响，表头 th 保持 11px */
/* v95: 我的自选股页「持续跟踪」指标数据字体改回目前的 70%（16.5px × 0.7 = 11.55px）。
   去除首页「我的自选」模块后，table.wl 仅存于自选股页，故该全局规则即精确命中此模块。 */
table.wl td:not(.c1){ font-size:11px; }   /* v318：11.55→11px，配合左右侧栏收窄，13.3" 笔记本全列可见 */
table.wl tr:last-child td{ border-bottom:none; }
/* #9 v195：持续跟踪表——点击某指标单元格 → 该单元格「所在行 + 所在列」高亮（中度蓝）；
   取消鼠标悬停整行高亮（v194 #5 的大海蓝 hover 整行已移除） */
table.wl td.hl-col, table.wl th.hl-col{ background:var(--sky-blue)!important; color:var(--ink)!important; }
table.wl tbody tr.hl-row td{ background:var(--sky-blue)!important; color:var(--ink)!important; }   /* #3 v200：加 !important 防任何背景规则覆盖，确保整行高亮稳定可见 */
table.wl tbody tr.hl-row td.c1{ background:var(--sky-blue)!important; color:var(--ink)!important; }
table.wl td.wl-sel{ box-shadow:inset 0 0 0 2px var(--sky-blue-bd); }
/* #5 v194：移除「点击选中整行高亮」功能（tr.sel 规则删除） */
table.wl th{ letter-spacing:.02em; border-bottom:1.5px solid var(--line); }
/* v320 #2：公司名固定 4em（四字宽，1em=一个汉字），超过四字自动换行；列宽随之固定 */
/* v321 #1：公司列宽度扩到原 1.2 倍（4em→4.8em，四字名单行更宽松）；超四字仍换行 */
table.wl .c1{ text-align:center; position:sticky; left:0; background:var(--card); z-index:2; width:68px; white-space:normal;   /* v320：56px（四字宽）；v321：×1.2→68px */
  box-shadow:1px 0 0 var(--line-2); }
table.wl th.c1{ background:var(--paper-2); z-index:3; }
table.wl .c1 b{ display:block; width:4.8em; margin:0 auto; font-family:var(--font); font-size:12.15px; font-weight:650; color:var(--xq); line-height:1.25; word-break:break-all; }   /* v313 #3：公司名雪球蓝；v320 #2 固定四字宽；v321 #1 ×1.2→4.8em */
/* v124: 持续跟踪行内公司信息间距缩小到 50%（公司名 .c1 b 与代码 .c1 em 之间 3px → 1.5px；字号不变） */
table.wl .c1 b{ margin-bottom:-1.5px; }
table.wl .c1 em{ font-style:normal; font-size:10px; color:var(--ink); }
table.wl .c1 .mk{ font-size:9px; padding:1px 4px; border-radius:4px; background:var(--navy-soft);
  color:var(--ink-2); margin-left:4px; font-family:var(--font); }
table.wl .c1 .mk.hk{ background:#eef3ea; color:#4a6b32; }
table.wl .c1 .mk.us{ background:#f3eef7; color:#5c4276; }
table.wl td.up{ color:var(--up); } table.wl td.down{ color:var(--down); }
table.wl td.err{ color:var(--up); font-family:var(--font); font-weight:500; font-size:11px; }
table.wl tr.load td{ color:var(--ink); font-weight:400; font-family:var(--font); }
/* v121: ✕ 放大一倍（15 → 30px），行高由 line-height:1 收住避免撑行 */
/* v122: ✕ 减小 40%（30 → 18px） */
.wl-del{ color:var(--ink); font-size:14.4px; line-height:1; padding:0 3px; }
/* v325 #1：「移除」表头取消 -4px 平移，与其他表头同行同列居中对齐 */
table.wl .wl-del-hdr{ display:inline; }   /* v326 #6：inline-block 基线偏移致「移除」低于「换位/收现比」5px，改 inline 同行对齐 */
/* v187 #6：「换位」表头文字居中，与下方居中的 ↑↓ 对齐；v325 #1 改名换位 */
table.wl th.wl-ord-hdr, table.wl th.wl-del-col{ text-align:center; vertical-align:middle; }
/* v119: 排序箭头放大一倍（原继承表格 ~11.5px → 22px） */
.wl-mv{ font-size:17.6px; line-height:1; padding:2px 0; background:none; border:none; cursor:pointer; color:var(--ink); }
.wl-mv:hover{ color:var(--blue); }
/* v120: ↑对齐「排」字左沿、↓对齐「序」字右沿——容器绝对定位钉死右沿 = td 内容右沿 = 序右沿；两个箭头再各按容器左右沿绝对定位，避免 flex 在内容溢出时把末项推出容器 */
/* v121: ↑↓ 字形间距拉开（原重叠 -4.5px → 容器 22→30px，字形间距 +3.5px；↑ 相应左移，↓ 仍钉序右沿） */
/* v122: ↑↓ 间距 ×0.8（容器 30 → 29.3px，字形间距 3.5 → 2.8px） */
table.wl .wl-ord{ position:relative; width:30px; min-width:30px; }   /* v318：auto 布局下↑↓绝对定位不参与列宽，需显式给宽防裁切 */
/* v187 #6：↑↓ 在「排序」表头下居中（容器水平居中，两箭头各自贴容器左右沿，整体与表头「排序」二字对齐） */
table.wl .wl-ord-in{ position:absolute; left:50%; top:50%; transform:translate(-50%,-50%); width:23.4px; height:26px; }
table.wl .wl-ord-in .wl-mv[data-dir="-1"]{ position:absolute; left:0; top:0; }
table.wl .wl-ord-in .wl-mv[data-dir="1"]{ position:absolute; right:0; top:0; }
/* v120: 移除列与排序列距离缩为一半（原 4+4=8px → 4+0=4px，保留排序列右 padding 4 以维持 ↓ 对齐基准） */
/* v121: ✕ 由列内右对齐改为居中 → ↓ 到 ✕ 视觉距离约减半（原 ~33px → ~20px）；✕ 放大一倍（15 → 30px） */
table.wl .wl-ord + td{ padding-left:0; text-align:center; }
/* 持续跟踪表：指标名可点击排序 */
/* v136: 持续跟踪——指标单元格可点击排序（#5 v194 移除「点击选中整行高亮」） */
table.wl td[data-f]{ cursor:pointer; }
table.wl th[data-sort]{ cursor:pointer; user-select:none; }
table.wl th[data-sort]:hover{ color:var(--blue); }
table.wl th.sort-asc::after{ content:"▲"; font-size:8px; margin-left:3px; color:var(--blue); }
table.wl th.sort-desc::after{ content:"▼"; font-size:8px; margin-left:3px; color:var(--blue); }
/* 首页持续跟踪：拖拽排序手柄 + 移除列 */
table.wl .c1 .hw-grip{ display:inline-block; margin-right:5px; color:var(--ink); cursor:grab; font-size:12px; line-height:1; user-select:none; touch-action:none; }
table.wl .c1.dragging{ opacity:.5; }
table.wl tr.dragging{ background:var(--gold-soft,#f0e2c0); }
table.wl tr.drag-over-top td{ box-shadow:inset 0 2px 0 0 var(--gold,#b8860b); }
table.wl tr.drag-over-bottom td{ box-shadow:inset 0 -2px 0 0 var(--gold,#b8860b); }
table.wl th.c-rm, table.wl td.c-rm{ width:54px; text-align:center; padding-left:2px; padding-right:2px; }
table.wl .hw-rm{ font-size:11px; color:var(--ink); background:var(--paper-2); border:1px solid var(--line); border-radius:7px; padding:3px 6px; cursor:pointer; white-space:nowrap; }
table.wl .hw-rm:hover{ color:var(--down); border-color:var(--down); }

/* ===== 批量导入自选股弹层（v116） ===== */
.wl-import-mask{ display:none; position:fixed; inset:0; z-index:200;
  align-items:center; justify-content:center; background:rgba(16,24,38,.5); padding:18px; }
.wl-import-box{ width:min(520px,94vw); max-height:90vh; overflow-y:auto;
  background:var(--card); border-radius:14px; padding:18px 18px 16px; box-shadow:0 20px 60px rgba(0,0,0,.35); }
.wl-ib-head{ display:flex; align-items:center; justify-content:space-between;
  font-size:16px; font-weight:700; color:var(--ink); margin-bottom:6px; }
.wl-ib-x{ width:30px; height:30px; border:0; border-radius:50%; background:var(--paper-2);
  color:var(--ink); font-size:20px; line-height:1; cursor:pointer; }
.wl-ib-x:hover{ background:var(--line); }
.wl-ib-tip{ font-size:12px; line-height:1.6; color:var(--ink); margin:0 0 10px; }
.wl-ib-tip b{ color:var(--ink-2); }
.wl-ib-ta{ width:100%; min-height:150px; resize:vertical; box-sizing:border-box;
  border:1px solid var(--line); border-radius:10px; padding:10px 12px; font-size:13px; line-height:1.7;
  font-family:var(--mono); color:var(--ink); background:var(--paper); }
.wl-ib-ta:focus{ outline:none; border-color:var(--gold); }
.wl-ib-file{ display:flex; align-items:center; gap:10px; margin:10px 0; }
.wl-ib-fn{ font-size:12px; color:var(--ink); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.wl-ib-actions{ display:flex; gap:9px; margin-top:4px; }
.wl-ib-actions .btn{ flex:1; }
.wl-ib-result{ margin-top:12px; font-size:12.5px; line-height:1.6; }
.wl-ib-result .ok{ color:var(--up); font-weight:600; }
.wl-ib-result .skip{ color:var(--ink); }
.wl-ib-result .fail{ color:var(--down); }
.wl-ib-result .nf{ display:inline-block; margin-top:3px; color:var(--ink); font-family:var(--mono); font-size:11.5px; }

.mini-tabs{ display:flex; gap:6px; background:var(--paper-2); padding:3px; border-radius:10px; margin-bottom:12px; }
.mini-tabs button{ flex:1; height:30px; border-radius:8px; font-size:12.5px; font-weight:600; color:var(--ink); }
.mini-tabs button.on{ background:var(--card); color:var(--ink); box-shadow:var(--shadow); }
.val-range{ margin-left:auto; font-size:12.5px; font-weight:600; color:var(--ink-2); background:var(--paper-2);
  border:1px solid var(--line); border-radius:8px; padding:4px 26px 4px 8px; max-width:46%; cursor:pointer;
  -webkit-appearance:none; appearance:none; position:relative; z-index:2;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6'><path d='M0 0l5 6 5-6z' fill='%238b98ad'/></svg>");
  background-repeat:no-repeat; background-position:right 9px center; }

/* 估值页：市盈率一对 / 市净率一对 左右并排对比，一屏一组 */
.val-pair{ display:flex; flex-direction:row; gap:14px; margin-bottom:18px; align-items:stretch; }
.val-cell{ min-width:0; flex:1; display:flex; flex-direction:column; }
.val-cell .sec-title{ flex-wrap:wrap; }
.val-cell .card{ flex:1 1 auto; height:100%; }

.valbox{ display:grid; grid-template-columns:repeat(4,1fr); gap:8px; margin:10px 0 2px; }
.valbox div{ background:var(--paper-2); border-radius:9px; padding:7px 4px; text-align:center; }
.valbox div span{ display:block; font-size:9.5px; color:var(--ink); }
.valbox div b{ font-size:13px; font-family:var(--mono); }

/* 估值序列加载骨架：进入页面立即铺底，真实数据到位后覆盖 */
.val-skeleton{ padding:6px 2px; }
/* v239：估值页骨架彻底去灰条——不再渲染灰色 shimmer 横条与「加载中」文字（用户不能容忍）。
   空容器仅保留图表高度防止布局跳动，序列到位后 drawBody 原位重绘成完整图表（闪显）。 */
.vs-chart{ height:150px; position:relative; margin-bottom:14px; }

/* =========================================================
   价值投资理念页：模块与字体舒展放大，内容撑满到底部菜单上方
   （仅 .ph-page 作用域，不影响其他页面）
   ========================================================= */
.ph-page .segs{ margin-bottom:10px; padding:3px; border-radius:10px; overflow-x:auto; scrollbar-width:none; }
.ph-page .segs::-webkit-scrollbar{ display:none; }
.ph-page .segs button{ padding:8px 12px; font-size:13px; flex:0 0 auto; }
.ph-page #phBody > p.small{ font-size:13px; margin-bottom:10px; line-height:1.65; }
/* 投资大师说 */
.ms-card{ padding:13px 14px; }
.ms-card .quote{ margin-top:6px; }
.ms-head{ display:flex; align-items:center; justify-content:space-between; margin-bottom:4px; }
.ms-master{ font-size:12px; font-weight:700; color:var(--xq); }
.ms-title{ font-size:14px; line-height:1.5; display:block; }
.ms-sec{ margin:10px 2px 7px; font-size:12.5px; font-weight:700; color:var(--ink); display:flex; align-items:center; gap:8px; }
.ms-sec::after{ content:''; flex:1; height:1px; background:var(--line-2); }
.ms-doc{ display:flex; align-items:center; justify-content:space-between; gap:10px; padding:10px 0; border-top:1px solid var(--line-2); font-size:13.5px; color:var(--ink); text-decoration:none; }
.ms-doc:first-child{ border-top:none; }
.ms-doc .mk{ color:var(--ink); font-size:12px; }
.ph-page .acc{ margin-bottom:8px; border-radius:10px; }
.ph-page .acc-h{ padding:12px 13px; gap:10px; }
.ph-page .acc-h b{ font-size:14px; }
.ph-page .acc-h em{ font-size:11px !important; margin-top:1px; }
.ph-page .acc-n{ width:24px; height:24px; font-size:11px; border-radius:6px; }
.ph-page .acc-c{ padding:0 14px 15px; font-size:14px; line-height:1.75; }
.ph-page .acc-c p{ font-size:14px; }
.ph-page .acc-c .quote{ margin-top:12px; }
.ph-page .quote{ font-size:14px; line-height:1.75; }
.ph-page .card{ padding:15px 14px; }
.ph-page .card h3{ font-size:16px !important; margin-bottom:5px; }
.ph-page .card h3 + p.small{ margin-bottom:9px; font-size:13px; }
.ph-page .eyebrow{ font-size:11px; }
.ph-page .note{ padding:11px 12px; font-size:13px; line-height:1.65; }
.ph-page .divider{ margin:12px -14px; }
.ph-page .slider-row{ margin-bottom:13px; }
.ph-page .slider-row .sl-top label{ font-size:13px; }
.ph-page .slider-row .sl-top b{ font-size:14.5px; }
.ph-page .btn{ font-size:13px; }
.ph-page #cpChart{ margin-top:4px; }
.ph-page #phBody .metrics{ margin-top:12px; }
.ph-page #mmBoard .mm-row{ padding:11px 12px; }

/* 复利演示卡（ph-cpd）：定向压缩，整页内容刚好落在底部菜单栏上方 */
.ph-page .ph-cpd{ padding:12px 13px; }
.ph-page .ph-cpd h3{ font-size:15px !important; margin-bottom:4px; }
.ph-page .ph-cpd h3 + p.small{ font-size:12.5px; margin-bottom:7px; }
.ph-page .ph-cpd .eyebrow{ font-size:10.5px; }
.ph-page .ph-cpd .divider{ margin:9px -13px; }
.ph-page .ph-cpd .slider-row{ margin-bottom:8px; }
.ph-page .ph-cpd .slider-row .sl-top label{ font-size:12px; }
.ph-page .ph-cpd .slider-row .sl-top b{ font-size:13.5px; }
.ph-page .ph-cpd #cpChart{ margin-top:3px; }
.ph-page .ph-cpd #cpResult .metrics{ margin-top:8px; }
.ph-page .ph-cpd .note{ padding:9px 10px; font-size:12.5px; margin-top:9px; line-height:1.6; }

/* 投机 vs 投资（ph-cmp）：定向压缩，最后一屏内落在底部菜单栏上方 */
.ph-page .ph-cmp .note{ padding:9px 10px; font-size:12.5px; margin-bottom:9px; line-height:1.6; }
.ph-page .ph-cmp .card{ padding:12px 13px; }
.ph-page .ph-cmp .quote{ font-size:13px; margin:0; line-height:1.7; }
.ph-page .ph-cmp .small{ font-size:12.5px; }
.ph-page .ph-cmp .btn{ font-size:13px; margin-top:4px; }

/* 复利演示卡：进一步微调，保证最后一行提示在底部菜单栏上方 */
.ph-page .ph-cpd .slider-row{ margin-bottom:7px; }
.ph-page .ph-cpd #cpChart{ margin-top:2px; }
.ph-page .ph-cpd .note{ padding:8px 10px; margin-top:8px; }

/* =========================================================
   头部中间指标（估值分析 / 财报体检：股票名与股价之间）
   ========================================================= */
.val-mid{ flex:1; min-width:0; display:flex; justify-content:center; align-items:stretch; gap:2px; padding:0 6px; }
.val-mid > div{ background:var(--paper-2); border-radius:8px; padding:4px 7px; text-align:center; min-width:0; }
.val-mid > div span{ display:block; font-size:9.5px; color:var(--ink); white-space:nowrap; }
.val-mid > div b{ display:block; font-size:12.5px; font-family:var(--mono); font-weight:700; white-space:nowrap; }
#valHead .metrics, #frHead .metrics{ background:transparent; gap:2px; border-radius:8px; }
#valHead .metrics .m, #frHead .metrics .m{ padding:5px 4px; background:var(--paper-2); border-radius:8px; }
#valHead .metrics .m b, #frHead .metrics .m b{ font-size:13px; }
#valHead .metrics .m span, #frHead .metrics .m span{ font-size:9.5px; }
@media (max-width:560px){
  .val-pair{ flex-direction:column; }
  .val-mid{ padding:0 3px; }
  .val-mid > div{ padding:3px 4px; }
  .val-mid > div b{ font-size:11px; }
  .val-mid > div span{ font-size:8.5px; }
  #valHead .metrics .m, #frHead .metrics .m{ padding:4px 3px; }
  #valHead .metrics .m b, #frHead .metrics .m b{ font-size:11.5px; }
  #valHead .metrics .m span, #frHead .metrics .m span{ font-size:8.5px; }
}

/* ---------- 首页登录卡片（req2） ---------- */
.sec-login{ margin-bottom:14px; }
.login-hero{ text-align:center; padding:22px 18px; }
.login-hero .lh-ico{ width:52px;height:52px;border-radius:14px;margin:0 auto 12px;
  display:flex;align-items:center;justify-content:center;
  background:var(--gold-soft,#f0e2c0);color:var(--xq); }
.login-hero .lh-t{ font-size:16px;margin:0 0 6px; }
.login-hero .lh-d{ margin:0 0 14px;line-height:1.6; }
.login-hero .btn{ max-width:240px;margin:0 auto; }

/* 会员卡 / 登录表单在首页直接渲染时复用弹层样式（避免仅在弹层注入导致首页无样式） */
.vc-login{ font-size:14px; }
.vc-tabs{ display:flex;gap:6px;margin-bottom:14px;background:var(--navy-soft,#eef1f6);border-radius:10px;padding:4px; }
.vc-tab{ flex:1;border:0;background:transparent;padding:9px 0;border-radius:8px;font-size:13.5px;color:var(--ink-3,#6b7280);cursor:pointer; }
.vc-tab.on{ background:#fff;color:var(--ink-1,#1f2430);font-weight:600;box-shadow:0 1px 3px rgba(0,0,0,.06); }
.vc-code-row{ display:flex;gap:8px;align-items:center; }
.vc-code-row .input{ flex:1; }
.vc-devhint{ margin:4px 0 10px;padding:8px 10px;background:#fff7e6;border:1px solid #ffe0a3;border-radius:8px;font-size:12.5px;color:#8a5a00; }
.vc-tip{ text-align:center;color:var(--ink-3,#6b7280);margin:10px 0 0; }
.vc-qr{ display:flex;justify-content:center;padding:8px 0 4px; }
.vc-qr-ph{ color:var(--ink-3,#6b7280); }
/* v303：微信内网页授权一键登录面板 */
.vc-wxmp-hero{ display:flex;flex-direction:column;align-items:center;padding:22px 0 4px;color:#1a7f37; }
/* v302：短信验证码登录表单（登录弹层内，手机端默认展示） */
.vc-sms-form{ padding:6px 2px 0; }
.vc-sms-input{ width:100%; box-sizing:border-box; padding:11px 12px; margin-bottom:10px;
  border:1px solid var(--line,#e5e7eb); border-radius:10px; font-size:15px;
  background:#fff; color:var(--ink,#1f2430); outline:none; }
.vc-sms-input:focus{ border-color:var(--gold); }
.vc-sms-row{ display:flex; gap:8px; align-items:stretch; }
.vc-sms-row .vc-sms-input{ flex:1; margin-bottom:10px; }
.vc-sms-row .btn{ flex:0 0 auto; white-space:nowrap; font-size:13px; }
.vc-member{ padding:14px;border:1px solid var(--gold-soft,#f0e2c0) !important;background:linear-gradient(180deg,#fffdf7,#fff) !important; }
/* v361 #4：我的页个人资料(会员卡)取消登录弹窗 360px 限制，与我的笔记模块等宽；登录弹窗内仍约束 */
.vc-member.vc-login{ max-width:none; width:100%; margin:0; }
.sheet-body .vc-member.vc-login{ max-width:360px; margin:0 auto; }
.vc-member-top{ display:flex;align-items:center;gap:8px;margin-bottom:10px; }
.vc-member-top b{ font-size:15px; }
.vc-badge{ display:inline-flex;align-items:center;padding:2px 9px;border-radius:999px;background:var(--gold,#c9a227);color:#fff;font-size:12px;font-weight:700; }
.vc-badge.ghost{ background:var(--navy-soft,#eef1f6);color:var(--ink-3,#6b7280); }
.vc-member-row{ display:flex;justify-content:space-between;padding:7px 0;border-bottom:1px solid var(--line-2,#eee);font-size:13.5px; }
.vc-member-row span{ color:#000; }
/* v366 #3：左列值(一凡/让投资回归常识)向左靠拢标签(注册账号/简介)50px；右列标签(注册时间/风险偏好)向右靠拢值(2026-08-17/稳健型)50px */
.vc-member-grid .vc-member-row:nth-child(odd) b{ margin-right:250px; }
.vc-member-grid .vc-member-row:nth-child(even) span{ margin-left:250px; }
.vc-member-grid{ display:grid; grid-template-columns:1fr 1fr; gap:0 8px; }
.vc-member-grid .vc-member-row{ border-bottom:1px solid var(--line-2,#eee); }
.vc-member.vc-guest p{ margin:8px 0 0; }
/* v359 #4：编辑资料 / 退出登录同一行，居中且两者留较大间距 */
.vc-member-actions{ display:flex; justify-content:center; gap:48px; margin-top:12px; }
.vc-member-actions .btn{ flex:0 0 auto; min-width:120px; }

/* =========================================================
   v105 投资大师说 —— 哔哩哔哩式视频卡片 / 微信读书式书籍卡片
   ========================================================= */
/* 视频卡片：封面在上（16:9），标题/清晰度在下 */
.ms-video-card{ position:relative; padding:10px; overflow:visible; }
.ms-video-box{
  position:relative; width:100%; aspect-ratio:16/9; border-radius:11px; overflow:hidden;
  background:linear-gradient(150deg,#1b2b47,#2b3f66 60%,#3c537f);
  display:block;
}
.ms-video-box img, .ms-video-box .ms-live{ width:100%; height:100%; object-fit:cover; display:block; }
.ms-video-box .ms-live{ position:absolute; inset:0; background:#0c0f16; }
/* 折叠封面（点击播放）；展开后隐藏。v126：封面文字改为通用三角形播放图标 */
.ms-video-box .ms-cover{
  position:absolute; inset:0; z-index:3; cursor:pointer;
  display:flex; align-items:center; justify-content:center;
  background:linear-gradient(180deg,rgba(12,18,32,.10) 30%,rgba(12,18,32,.62) 100%);
}
.ms-video-box .ms-cover .ms-tri{
  width:54px; height:54px; fill:#fff;
  filter:drop-shadow(0 2px 6px rgba(0,0,0,.45));
}
.ms-video-card.is-open .ms-cover{ display:none; }
/* 收起按钮（仅展开时显示，位于右上角，不遮挡底部原生控制条） */
.ms-video-box .ms-vclose{
  position:absolute; top:8px; right:8px; z-index:4; display:none;
  font-family:inherit; font-size:12px; font-weight:700; color:#fff;
  background:rgba(10,14,24,.62); border:0; padding:4px 10px; border-radius:99px; cursor:pointer;
}
.ms-video-card.is-open .ms-vclose{ display:block; }
.ms-video-info{ display:flex; align-items:center; gap:8px; margin-top:9px; padding:0 2px; }
.ms-video-info b{ flex:1; min-width:0; font-size:14px; line-height:1.45; }
/* 展开（播放中）：原地占满整行，封面即播放器（视频本身），原生控件负责
   播放/暂停/全屏/拖动进度条续播（v114：卡片与视频盒均无 data-act，原生控件永不被拦截） */
.ms-video-card.is-open .ms-video-box{ aspect-ratio:16/9; max-width:900px; margin:0 auto; }
.ms-video-card.is-open .ms-live{ object-fit:contain; background:#000; }
/* v115 自定义控制条（替代原生控件，确保所有浏览器/设备 seek→续播一致、确定可控） */
.ms-video-box{ position:relative; }
.ms-ctrl{
  position:absolute; left:0; right:0; bottom:0; z-index:5;
  display:none; align-items:center; gap:9px;
  padding:18px 10px 8px;
  background:linear-gradient(0deg, rgba(0,0,0,.82) 0%, rgba(0,0,0,0) 100%);
  color:#fff;
}
.ms-video-card.is-open .ms-ctrl{ display:flex; }
.ms-ctrl button{ background:none; border:0; color:#fff; cursor:pointer; padding:0; line-height:0; }
.ms-ctrl svg{ width:20px; height:20px; fill:#fff; display:block; }
.ms-ctrl .ms-prog{
  flex:1; min-width:0; height:4px; margin:0; cursor:pointer;
  -webkit-appearance:none; appearance:none; background:transparent;
}
.ms-ctrl .ms-prog::-webkit-slider-runnable-track{ height:4px; border-radius:99px; background:rgba(255,255,255,.32); }
.ms-ctrl .ms-prog::-moz-range-track{ height:4px; border-radius:99px; background:rgba(255,255,255,.32); }
.ms-ctrl .ms-prog::-webkit-slider-thumb{ -webkit-appearance:none; appearance:none; width:13px; height:13px; margin-top:-4.5px; border-radius:50%; background:#fff; }
.ms-ctrl .ms-prog::-moz-range-thumb{ width:13px; height:13px; border:0; border-radius:50%; background:#fff; }
/* v127: 音量滑块（调节音量大小） */
.ms-ctrl .ms-vol{
  flex:0 0 auto; width:64px; height:4px; margin:0; cursor:pointer;
  -webkit-appearance:none; appearance:none; background:transparent;
}
.ms-ctrl .ms-vol::-webkit-slider-runnable-track{ height:4px; border-radius:99px; background:rgba(255,255,255,.32); }
.ms-ctrl .ms-vol::-moz-range-track{ height:4px; border-radius:99px; background:rgba(255,255,255,.32); }
.ms-ctrl .ms-vol::-webkit-slider-thumb{ -webkit-appearance:none; appearance:none; width:12px; height:12px; margin-top:-4px; border-radius:50%; background:#fff; }
.ms-ctrl .ms-vol::-moz-range-thumb{ width:12px; height:12px; border:0; border-radius:50%; background:#fff; }
.ms-ctrl .ms-time{ font-size:12px; font-variant-numeric:tabular-nums; white-space:nowrap; opacity:.92; }
.ms-ctrl .i-pause, .ms-ctrl .i-mut{ display:none; }
.ms-video-card.is-open.playing .ms-ctrl .i-play{ display:none; }
.ms-video-card.is-open.playing .ms-ctrl .i-pause{ display:block; }
.ms-video-card.is-open.muted .ms-ctrl .i-vol{ display:none; }
.ms-video-card.is-open.muted .ms-ctrl .i-mut{ display:block; }
/* 播放器（点击封面后展开） */
.ms-player-wrap{ display:none; margin-top:10px; }
.ms-player-wrap.open{ display:block; }
.ms-player{
  position:relative; width:100%; max-width:660px; margin:0 auto;
  aspect-ratio:16/9; background:#0c0f16; border-radius:12px; overflow:hidden;
  box-shadow:0 10px 30px rgba(12,15,22,.35);
}
.ms-player video{ width:100%; height:100%; display:block; object-fit:contain; }
.ms-player-sub{ margin-top:8px; display:flex; align-items:center; justify-content:space-between; gap:8px; }
.ms-player-sub b{ font-size:14.5px; }
.ms-player-sub .ms-pbtns{ display:flex; gap:6px; align-items:center; }
.ms-player-sub .ms-pbtn{
  font-size:11.5px; font-weight:600; padding:4px 11px; border-radius:99px;
  border:1px solid var(--line); background:var(--card); color:var(--ink);
}
.ms-player-sub .ms-pbtn.on{ background:var(--ink); color:#fff; border-color:var(--ink); }
/* 书籍卡片：微信读书式（封面小图 + 书名 + 大师） */
.ms-book-card{ display:flex; gap:12px; align-items:center; padding:11px 13px; }
.ms-book-cov{
  flex:0 0 auto; width:58px; height:80px; border-radius:7px; overflow:hidden;
  display:flex; align-items:center; justify-content:center;
  font-size:13px; font-weight:800; color:#fff; letter-spacing:.04em; text-align:center;
  box-shadow:0 3px 10px rgba(18,26,42,.18); position:relative;
}
.ms-book-cov .ms-bcov-t{ padding:0 5px; line-height:1.35; }
.ms-book-cov::after{
  content:""; position:absolute; left:0; right:0; top:0; height:3px;
  background:linear-gradient(90deg,rgba(255,255,255,.35),rgba(255,255,255,.05));
}
.ms-book-body{ flex:1; min-width:0; }
.ms-book-body b{ display:block; font-size:14px; line-height:1.45; }
.ms-book-body span{ display:block; font-size:11.5px; color:var(--ink); margin-top:3px; letter-spacing:.03em; }
.ms-book-body .ms-read{
  display:inline-flex; align-items:center; gap:3px; margin-top:7px;
  font-size:12px; font-weight:700; color:var(--xq);
}

/* =========================================================
   v106 投资大师说 —— 网格化封面（书籍 8 本/行 · 视频 5 个/行）
   ========================================================= */
/* 书籍网格：封面取电子书本身封面，8 本/行，按书名排序 */
.ms-bk-grid{ display:grid; grid-template-columns:repeat(8,1fr); gap:13px 9px; }
.ms-bk{ display:flex; flex-direction:column; gap:5px; cursor:pointer; }
.ms-bk-cover{
  position:relative; width:100%; aspect-ratio:3/4; border-radius:7px; overflow:hidden;
  background:linear-gradient(150deg,#24395c,#3c537f);
  box-shadow:0 3px 10px rgba(18,26,42,.18);
}
.ms-bk-cover .ms-bk-ph{
  position:absolute; inset:0; display:flex; align-items:center; justify-content:center;
  font-size:22px; font-weight:800; color:#fff; padding:0 6px; text-align:center; line-height:1.3;
}
.ms-bk-cover, .ms-bk-name{ transition:transform .16s, box-shadow .16s, color .16s; }
.ms-bk:hover .ms-bk-cover{ box-shadow:0 6px 18px rgba(18,26,42,.30); transform:translateY(-2px); }
.ms-bk-name{
  border:0; background:none; padding:0; margin:0; cursor:pointer; font-family:inherit;
  font-size:11.5px; line-height:1.35; color:var(--ink-2); text-align:center;
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
}
.ms-bk-name:hover{ color:var(--xq); }
.ms-sub{ font-size:11.5px; color:var(--ink); margin:6px 0 9px; }
@media (max-width:680px){ .ms-bk-grid{ grid-template-columns:repeat(4,1fr); } }
@media (max-width:420px){ .ms-bk-grid{ grid-template-columns:repeat(3,1fr); } }
/* v459 经典品读：书封网格（封面取纸书真封）
   v467：每行 8 本（v464 的 5 本 → 8 本，与基础 .ms-bk-grid 的 8 列一致）。
   实测 8 列封面宽 =（容器宽 − 7×11）/8：≥681px 视口均 ≥72px
   （1920/1680→137、1440/1366→107、1280→96、768→83、683→72），可读性足够；
   窄屏逐级回退：≤680px 4 本、≤480px 5 本（手机竖屏封面每行 5 张，断点 480px 与全站「手机竖屏」一致）。
   ⚠️ 本段必须留在 .ms-bk-grid 的媒体查询之后（同特异性靠源码顺序覆盖）。 */
.ms-deep-grid{ grid-template-columns:repeat(8,minmax(0,1fr)); gap:14px 11px; }
.ms-deep-grid .ms-bk-name{ font-size:11.5px; line-height:1.35; margin-top:6px; }
@media (max-width:680px){ .ms-deep-grid{ grid-template-columns:repeat(4,minmax(0,1fr)); } }
/* v478 手机竖屏（≤480px）：经典品读每行列 5 本封面 */
@media (max-width:480px){ .ms-deep-grid{ grid-template-columns:repeat(5,minmax(0,1fr)); } }

/* 视频网格：封面取视频帧，5 个/行，按视频名排序；点击同位置展开播放器 */
.ms-video-grid{ display:grid; grid-template-columns:repeat(5,1fr); gap:13px 11px; }
.ms-video-grid .ms-video-card{ padding:8px; }
.ms-video-grid .ms-video-info{ margin-top:7px; }
.ms-video-grid .ms-video-info b{ font-size:13px; }
/* 展开时该卡占满整行、播放器放大，仍“同位置”（内联、无新页面） */
.ms-video-grid .ms-video-card.is-open{ grid-column:1 / -1; }
.ms-video-grid .ms-video-card.is-open .ms-player{ max-width:760px; }
.ms-video-grid .ms-poster{
  position:absolute; inset:0; width:100%; height:100%; object-fit:cover; display:block;
}
@media (max-width:900px){ .ms-video-grid{ grid-template-columns:repeat(3,1fr); } }
@media (max-width:560px){ .ms-video-grid{ grid-template-columns:repeat(2,1fr); } }

/* 阅读器：DOCX 整体缩放容器 */
#docxWrap{ transform-origin:top left; }
/* =========================================================
   v288 公司挑选（picker）
   ========================================================= */
.picker-page .mini-tabs button[disabled]{ opacity:.45; cursor:not-allowed; }
.picker-grid{ display:grid; grid-template-columns:272px 1fr; gap:14px; align-items:start; }   /* v319 #6：340→272px（80%） */
/* v449：1fr = minmax(auto,1fr)，track 的 auto 下限会被宽表的内容 min-content 撑爆——
   卡片随 track 一起变宽（宽过屏幕），表格在卡内不溢出 → 横滑容器失效、
   滑动条自动隐藏、整页被撑出横向裁切。改 minmax(0,1fr) 把 track 钉在容器宽内，
   宽表改为在卡内横向滚动（配 .fr-hsb 滑动条）；.picker-right 补 min-width:0。 */
@media (max-width:880px){ .picker-grid{ grid-template-columns:minmax(0,1fr); } .picker-right{ min-width:0; } }
/* v293：左栏恢复常规布局（去掉 v292 的内部滚动条） */
.picker-left{ padding:14px; position:sticky; top:0; }
/* v301：单列布局必须去掉左栏 sticky——否则条件卡片吸附在滚动容器顶部，
   整块悬浮压在下方结果清单上（实测 elementFromPoint 命中 .picker-left），
   手机竖屏 / 横屏滚动时永远只看到挑选条件、看不到结果表。
   注意必须放在 .picker-left 同权重规则之后才能覆盖生效 */
@media (max-width:880px){ .picker-left{ position:static; } }
.picker-title{ font-size:14.5px; font-weight:700; color:var(--ink); margin-bottom:10px; }
/* v322 #2：港/美股条件区顶部说明（该市场相对 A 股缺少哪些条件、为什么） */
.picker-mkt-note{ font-size:11.5px; line-height:1.7; color:var(--ink); background:var(--paper-2);
  border:1px dashed var(--line); border-radius:10px; padding:8px 10px; margin-bottom:10px; }
.picker-group{ border-top:1px dashed var(--line); padding:8px 0; }
.picker-group:first-of-type{ border-top:none; padding-top:0; }
.picker-group-h{ font-size:12px; font-weight:700; color:var(--ink); margin:6px 0 4px; }
.picker-empty{ font-size:11.5px; color:var(--ink); padding:8px 4px; }
.picker-industries{ display:flex; flex-wrap:wrap; gap:5px; max-height:200px; overflow-y:auto; padding-right:2px; }
.picker-ind-chip{ display:inline-flex; align-items:center; gap:4px; padding:4px 8px; border:1px solid var(--line); border-radius:14px; font-size:12px; color:var(--ink); cursor:pointer; background:var(--card); transition:all .15s; }
.picker-ind-chip input{ display:none; }
.picker-ind-chip.on{ background:var(--ink); color:#fff; border-color:var(--ink); }
/* v291：主要指标行横向并列（一行放不下自动换行），子分类标题独占一行，选中项独占一行展开控件 */
.picker-flow{ display:flex; flex-wrap:wrap; gap:0 16px; align-items:flex-start; }
.picker-flow .picker-sub-h{ flex-basis:100%; }
.picker-flow .picker-row{ display:inline-flex; align-items:center; }
.picker-flow .picker-row.on{ display:block; flex-basis:100%; }
.picker-row{ padding:5px 0; border-bottom:1px dashed transparent; }
.picker-row.on{ background:rgba(201,162,39,.04); border-radius:6px; padding:5px 6px; margin:2px -6px; }
.picker-row-label{ display:flex; align-items:center; gap:6px; cursor:pointer; }
.picker-row-label input{ margin:0; }
.picker-row-name{ font-size:12.5px; color:var(--ink); }
.picker-row-ctrl{ display:flex; align-items:center; gap:6px; flex-wrap:wrap; margin:5px 0 3px 22px; }
.picker-row-ctrl select, .picker-row-ctrl input[type=number]{ font-size:12px; padding:3px 6px; border:1px solid var(--line); border-radius:6px; background:var(--card); color:var(--ink); }
.picker-row-ctrl select{ min-width:110px; }
.picker-row-ctrl input[type=number]{ width:88px; }
/* v325 #2：阈值输入与单位同容器 nowrap——亿/% 等单位不再另起一行 */
.picker-val-wrap{ display:inline-flex; align-items:center; white-space:nowrap; }
.picker-unit{ font-size:11px; color:var(--ink); }
.picker-actions{ display:flex; gap:9px; margin-top:14px; padding-top:10px; border-top:1px solid var(--line); }
.picker-actions .btn{ flex:1; }
.picker-summary{ margin-bottom:10px; min-height:24px; }
.picker-chips{ display:flex; flex-wrap:wrap; gap:6px; margin-bottom:6px; }
.picker-chips span{ display:inline-block; padding:3px 9px; background:var(--paper-2); border:1px solid var(--line); border-radius:11px; font-size:11.5px; color:var(--ink-2); }
.picker-chips em{ font-style:normal; }
.picker-status{ font-size:11.5px; color:var(--ink); }
.picker-results{ min-height:80px; }
.picker-empty-result{ text-align:center; padding:24px 12px; color:var(--ink); font-size:13px; }
.picker-tbl{ width:100%; border-collapse:collapse; font-size:12.5px; }
.picker-tbl th, .picker-tbl td{ padding:7px 6px; border-bottom:1px solid var(--line); text-align:center; }
.picker-tbl th small{ display:block; font-weight:400; font-size:10px; color:var(--ink); margin-top:2px; }
.picker-tbl td code{ font-size:11.5px; color:var(--ink); }
.picker-tbl td a{ color:var(--xq); font-weight:600; }   /* v313 #3：挑选结果公司名雪球蓝（--xq，取自雪球官方 logo） */
.picker-tbl td a:hover{ text-decoration:underline; }
.picker-tbl td small{ color:var(--ink); font-size:10px; margin-left:1px; }
.picker-tbl tr:hover td{ background:var(--paper-2); }
.picker-tbl td.up{ color:var(--up); font-weight:600; }
.picker-tbl td.down{ color:var(--down); font-weight:600; }
/* v293：结果表最右五角星列（复用搜索结果 ts-star 视觉） */
.picker-tbl th.picker-star-col{ width:40px; }
.picker-tbl td.picker-star-col{ text-align:center; }
.picker-tbl .ts-star{
  display:inline-flex; align-items:center; justify-content:center;
  width:28px; height:28px; border-radius:8px; border:1px solid var(--line);
  font-size:15px; line-height:1; color:var(--xq); background:var(--card); cursor:pointer;
}
.picker-tbl .ts-star.on{ background:var(--gold); border-color:var(--gold); color:#fff; }
.picker-foot-note{ margin-top:8px; font-size:11.5px; color:var(--ink); padding:4px 0; }
.picker-hint{ font-size:12.5px; line-height:1.7; color:var(--ink); }
.picker-hint b{ color:var(--ink); }

/* v288 picker 即将上线项 */
.picker-row.coming{ opacity:.55; }
.picker-row.coming .picker-row-name{ cursor:default; }
.picker-soon{ font-size:10px; font-style:normal; padding:1px 6px; border-radius:8px; background:var(--line); color:var(--ink); margin-left:6px; white-space:nowrap; }

/* v290：主要指标组内子分类小标题（回报率/增长率/利润率/…） */
.picker-sub-h{ font-size:11px; color:var(--ink); margin:9px 0 2px; padding-left:1px; display:flex; align-items:center; gap:6px; }
.picker-sub-h::after{ content:''; flex:1; height:1px; background:var(--line); }

/* v296：五维评分会员专属引导卡（挑选条件左栏内） */
.picker-vip-lock{ margin:8px 0 4px; padding:12px 14px; border:1px dashed var(--line); border-radius:10px; background:var(--paper-2); }
.picker-vip-lock b{ display:block; font-size:13px; color:var(--ink); margin-bottom:4px; }
.picker-vip-lock p{ margin:0 0 8px; font-size:12px; line-height:1.7; color:var(--ink); }
.picker-vip-lock a{ font-size:12.5px; font-weight:600; color:var(--xq); text-decoration:none; }

/* =========================================================
   v305 视觉升级打磨层 —— 对标雪球/东财/小红书的观感细节
   （克制阴影已全局收敛；此处：微交互 / 焦点可达性 / 选区配色）
   ========================================================= */
::selection{ background:#cfe4f7; color:var(--ink); }
:focus-visible{ outline:2px solid #7db4e8; outline-offset:2px; border-radius:6px; }
button:focus:not(:focus-visible){ outline:none; }

/* 桌面悬停微交互（hover 设备才生效，不影响触屏 :active 缩放反馈） */
@media (hover:hover){
  .entry:hover{ transform:translateY(-2px); border-color:#dde5f0; box-shadow:0 10px 26px rgba(16,24,40,.09); }
  .row[data-act]:hover{ background:#f7f9fc; }
  .acc-h:hover{ background:#f7f9fc; }
  .btn.ghost:hover{ border-color:#c9d4e5; box-shadow:0 2px 8px rgba(16,24,40,.06); }
  .btn:not(.ghost):not(:disabled):hover{ filter:brightness(1.06); }
  .tab:hover{ color:var(--ink-2); }
}

/* ---- v326 #2 页中副标题 → v333 高端品牌化重设计：不再用大号加粗红字，改走世界高端品牌站排版——
   小字号、细字重、宽字距、墨色文字，两侧配金色渐隐发丝线（如爱马仕/劳力士页首小标） ---- */
.page-sub{
  display:flex; align-items:center; justify-content:center; gap:16px;
  font-size:13.775px; font-weight:500; line-height:1.9;
  color:#3d434c; letter-spacing:.34em;
  font-family:"Kaiti SC","STKaiti","KaiTi","楷体",serif;
  padding:22px 8px 4px; white-space:normal;
}
/* 两侧金色发丝线：向文字方向渐显，营造「居中徽章」的仪式感 */
.page-sub::before,.page-sub::after{
  content:''; flex:0 0 44px; height:1px;
  background:linear-gradient(90deg, rgba(192,138,46,0), rgba(192,138,46,.8));
}
.page-sub::after{ background:linear-gradient(90deg, rgba(192,138,46,.8), rgba(192,138,46,0)); }
.page-sub:empty::before,.page-sub:empty::after{ display:none; }   /* 副标题为空时不渲染两侧线 */
@media (max-width:640px){   /* 窄屏：略收字距，保证长引文两行内放下 */
  .page-sub{ font-size:12.35px; letter-spacing:.2em; gap:10px; }
  .page-sub::before,.page-sub::after{ flex-basis:24px; }
}
.tb-title small{ display:none; }   /* v326 #2：顶栏品牌名下方的旧副标题移除（内容迁移至 .page-sub） */

/* =========================================================
   v334 —— 全站「静奢」质感层（对标世界高端品牌站：爱马仕 / 劳力士 / Aesop）
   原则：不加花、不加色块，只做四件事——暖纸底、衬线标题、金色发丝、克制阴影。
   本层统一追加在文件末尾靠级联覆盖生效，不改动上方既有规则（保住全部门禁断言）。
   ========================================================= */
:root{
  --serif:"Songti SC","Noto Serif SC","STSong","STZhongsong","SimSun",serif;   /* 中文衬线：标题 / 品牌名专用 */
  --hairline:#e9e3d3;        /* 暖调发丝线（替代冷灰分隔） */
  --lux-shadow:0 1px 2px rgba(35,30,18,.03), 0 6px 22px rgba(35,30,18,.05);   /* 带一丝暖调的收敛阴影 */
}

/* ① 画布：纯白 → 微暖纸感（Aesop 式），卡片保持纯白浮起，层次更「印刷品」 */
#app-shell{ background:#fcfbf7; }

/* ② 卡片：圆角略放大、描边转暖、阴影更轻更远（浮得安静） */
.card{ border-radius:16px; border-color:#edeae0; box-shadow:var(--lux-shadow); }

/* ③ 字形：标题换中文衬线 + 正字距（中文负字距显局促） */
h1,h2,h3,h4{ letter-spacing:.02em; }
.tb-title strong.brand{ font-family:var(--font); font-weight:900; letter-spacing:.01em; }
.sec-title h2{ font-family:var(--serif); font-weight:600; letter-spacing:.08em; }

/* ④ 模块标题装饰条：品牌红 → 品牌金渐变（与页中副标题金线同一语言） */
.sec-title::before{ background:linear-gradient(180deg,#d9ab52,#b9852d); }

/* ⑤ 顶栏：底边换暖发丝线，毛玻璃保留 */
#topbar{ border-bottom:1px solid var(--hairline); box-shadow:none; }

/* ⑥ 页面级金色小标（.eyebrow）：藏蓝 → 深金，衬线大标加宽字距 */
.eyebrow{ color:#8f7434; }
.eyebrow.head-lg{ font-family:var(--serif); font-weight:600; letter-spacing:.07em; }

/* ⑦ 按钮：字距微收、阴影更「印刷」；幽灵按钮悬停转金描边 */
.btn{ letter-spacing:.05em; box-shadow:0 2px 10px rgba(35,30,18,.10); }
.btn.ghost{ transition:border-color .18s, box-shadow .18s; }
.btn.ghost:hover{ border-color:#d8cba6; box-shadow:0 3px 12px rgba(35,30,18,.07); }

/* ⑧ 焦点 / 选中 / 滚动条：全套转金 */
:focus-visible{ outline:2px solid rgba(192,138,46,.55); outline-offset:2px; border-radius:4px; }
::selection{ background:#f3e8cf; }
::-webkit-scrollbar{ width:5px; height:5px; }
::-webkit-scrollbar-thumb{ background:#d9d2c0; border-radius:99px; }
::-webkit-scrollbar-thumb:hover{ background:#c8bfa8; }

/* ⑨ 动效曲线统一：更缓更「贵」 */
.card,.btn,.tab,.pill{ transition-timing-function:cubic-bezier(.22,.61,.21,1); }

/* ⑩ 手机端：画布同暖、卡片圆角略收 */
@media (max-width:640px){
  #app-shell{ background:#fcfbf7; }
  .card{ border-radius:14px; }
}

/* ============================================================
   v335 H5：手机端整体改造（≤760px）
   形态目标：顶部栏只留品牌+搜索，主导航转为底部固定 Tab 栏
  （毛玻璃 + 安全区），触屏交互细节（去点按高亮、16px 输入防 iOS 缩放）。
   追加式层级：仅在此覆盖，不动上方任何既有规则。
   ============================================================ */
@media (max-width:760px){

  /* —— 触屏基础 —— */
  html{ -webkit-text-size-adjust:100%; text-size-adjust:100%; }
  body{ -webkit-tap-highlight-color:transparent; }
  #topnav .tab:active{ opacity:.62; }

  /* —— 底部 Tab 栏（原顶部第二行导航改固定底栏） —— */
  #topnav{
    position:fixed; left:0; right:0; bottom:0; z-index:70;
    flex:0 0 auto;
    height:calc(56px + env(safe-area-inset-bottom));
    padding-bottom:env(safe-area-inset-bottom);
    background:rgba(252,251,247,.94);
    backdrop-filter:saturate(180%) blur(16px);
    -webkit-backdrop-filter:saturate(180%) blur(16px);
    border-top:1px solid var(--hairline);
    box-shadow:0 -1px 0 rgba(16,24,40,.02);
    gap:0;
  }
  #topnav .tab{
    flex:1 1 0; flex-direction:column; justify-content:center; gap:2px;
    padding:4px 0 0; font-size:10.5px; font-weight:600; letter-spacing:.05em;
  }
  #topnav .tab svg{ width:22px; height:22px; }
  #topnav .tab.on{ font-weight:700; }
  /* 未登录时「我的」位显示的登录胶囊，在底栏内收小居中 */
  #topnav .tab .tb-me-login{ font-size:11px; padding:3px 9px; }

  /* —— 主内容给底栏让位（#view 是滚动容器） —— */
  .view-wrap{ padding-bottom:calc(78px + env(safe-area-inset-bottom)); }

  /* —— 顶部栏：品牌行更紧凑（第二行导航已移走） ——
     关键：#topbar 的 backdrop-filter 会让其内 position:fixed 的 #topnav 以顶栏为
     包含块（底栏被钉进顶栏）。手机端改实色底、去 blur，让底栏真正落到视口底部。 */
  #topbar{
    gap:6px;
    backdrop-filter:none; -webkit-backdrop-filter:none;
    background:#fcfbf7;
  }
  .tb-title small{ display:none; }   /* 副标语让位给 H5 极简头部 */

  /* —— iOS 聚焦防缩放：可输入元素 ≥16px —— */
  #topSearch, input[type="search"], input[type="text"], input[type="password"], input[type="number"], input[type="tel"]{ font-size:16px !important; }
}

/* ============================================================
   v336：五项打磨
   #2 侧栏头靠左（我的公司/公司公告/常用网站抬头不再居中）
   #3 每页副标题字号缩至 95%
   #1 手机深度交互：表格横滑+粘性首列；挑选条件抽屉化（底部弹层）
   ============================================================ */

/* —— #2 侧栏头靠左（全局生效；关闭按钮推到最右） —— */
.sb-head{ justify-content:flex-start; }   /* 覆盖 v326 #8 的居中 */
.sb-close{ margin-left:auto; }
.rsb-head{ justify-content:flex-start; }

/* —— #3 副标题字号 95%（14.5→13.78；窄屏 13→12.35） —— */
.page-sub{ font-size:13.091px; }
@media (max-width:640px){
  .page-sub{ font-size:11.733px; }   /* 级联在后，覆盖上方 v333 的 13px 断点规则 */
}

/* —— #1 手机端：筛选抽屉（桌面不渲染可见元素） —— */
.picker-flt-fab{ display:none; }
.picker-flt-mask{ display:none; }

@media (max-width:760px){
  /* 挑选条件 → 底部弹层抽屉 */
  .picker-left{
    position:fixed; left:0; right:0; bottom:0; top:auto; z-index:85;
    max-height:72vh; overflow-y:auto; overflow-x:hidden;
    margin:0; border-radius:18px 18px 0 0;
    transform:translateY(105%);
    transition:transform .28s cubic-bezier(.22,.9,.3,1);
    box-shadow:0 -8px 30px rgba(16,24,40,.16);
    padding-bottom:calc(14px + env(safe-area-inset-bottom));
  }
  body.picker-flt-open .picker-left{ transform:none; }
  .picker-flt-mask{
    display:block; position:fixed; inset:0; z-index:84;
    background:rgba(16,23,40,.36);
  }
  body:not(.picker-flt-open) .picker-flt-mask{ display:none; }
  /* 悬浮「筛选」按钮（底栏 Tab 之上） */
  .picker-flt-fab{
    display:flex; align-items:center; justify-content:center; gap:6px;
    position:fixed; right:14px; bottom:calc(72px + env(safe-area-inset-bottom)); z-index:71;
    height:40px; padding:0 18px; border:none; border-radius:99px;
    background:#d6453f; color:#fff; font-size:13px; font-weight:700; letter-spacing:.04em;
    box-shadow:0 4px 14px rgba(214,69,63,.35); cursor:pointer;
  }
  .picker-flt-fab:active{ opacity:.85; }
  .picker-flt-fab svg{ width:16px; height:16px; }

  /* 横滑表格：我的公司表高度给底栏让位 */
  .wl-wrap{ height:calc(100vh - 163px - 56px - env(safe-area-inset-bottom)); }
  .wl-home .wl-wrap{ height:calc(100vh - 282px - 56px - env(safe-area-inset-bottom)); }

  /* 卡片承载横向滚动（财报体检各表 / 挑选结果在窄屏超出即左右滑） */
  .card{ overflow-x:auto; -webkit-overflow-scrolling:touch; }
  .fr-change-scroll{ overflow-x:auto; }

  /* 粘性首列：左右滑动时公司名/指标名钉在左侧 */
  table.wl th:first-child, table.wl td:first-child,
  .picker-tbl th:first-child, .picker-tbl td:first-child,
  .fr-change-tbl th:first-child, .fr-change-tbl td:first-child,
  .fr-prof-tbl th:first-child, .fr-prof-tbl td:first-child,
  .fr-fc-tbl th:first-child, .fr-fc-tbl td:first-child,
  .fr-cn-tbl th:first-child, .fr-cn-tbl td:first-child{
    position:sticky; left:0; z-index:2;
    background:#fff;
    box-shadow:2px 0 0 rgba(233,227,211,.9);   /* 暖发丝分隔线（v334 lux） */
  }
  table.wl th:first-child{ background:#faf9f5; }   /* 表头底色略深一档 */
}

/* ============================================================
   v337：两处微调
   #1 常用网站抬头靠左 + 抬头/网站名间距美化——v336 #2 只覆盖了 .sb-head/.rsb-head，
      漏掉独立 class .sb-sites-head（仍居中）；本轮直接改进上方基础规则（487 行区）：
      抬头 justify-content:flex-start、抬头下内边距 4→12px、行距 2→8px、列距 6→12px、
      胶囊内边距 3px 5px→4px 9px。
   #2 每页副标题字号再缩至当前 95%（13.78→13.09px；窄屏 12.35→11.73px）。
   ============================================================ */
.page-sub{ font-size:12.436px; }
@media (max-width:640px){
  .page-sub{ font-size:11.144px; }   /* 级联在后，覆盖 v336 的 12.35px 断点 */
}

/* ============ 积分体系（消耗版 v2）· 我的积分页 ============ */
.pts-balance-card{ display:flex; align-items:center; gap:14px; padding:18px 16px; }
.pts-balance{ flex:0 0 auto; text-align:center; min-width:120px; }
/* v351 #3：总积分缩至原来的 80%（38→30.4px） */
.pts-balance-num{ font-size:30.4px; font-weight:700; line-height:1; color:var(--xq); font-variant-numeric:tabular-nums; }
/* v345：未登录 / 服务未就绪时不要用 38px 的「—」（会渲染成一根粗蓝条，像加载失败） */
.pts-balance-num.is-hint{ font-size:15px; font-weight:500; letter-spacing:.02em; color:var(--ink-2); }
/* v351 #3：「价值积分」放大到 1.5 倍（12→18px）并加粗 */
.pts-balance-lab{ font-size:18px; font-weight:700; color:var(--ink-2); margin-top:6px; }
.pts-balance-side{ flex:1; display:flex; flex-direction:column; gap:10px; align-items:stretch; }
.pts-level-name{ font-size:14px; font-weight:600; color:var(--ink); text-align:center; }
.pts-level-wrap{ }
.pts-levelbar{ margin:2px 0 4px; }
.pts-levelbar-track{ height:7px; background:var(--line-2); border-radius:6px; overflow:hidden; }
.pts-levelbar-fill{ height:100%; background:linear-gradient(90deg,#d9a441,var(--gold)); border-radius:6px; }
.pts-levelbar-tip{ font-size:12px; color:var(--ink-2); margin-top:6px; text-align:center; }
.pts-perk{ display:flex; align-items:center; justify-content:space-between; gap:10px; padding:12px 14px; border-bottom:1px solid var(--line-2); }
.pts-perk:last-child{ border-bottom:none; }
.pts-perk-main{ display:flex; flex-direction:column; gap:2px; min-width:0; }
.pts-perk-main b{ font-size:14px; color:var(--ink); }
.pts-perk-main span{ font-size:12px; color:var(--ink-2); }
.pts-perk-act{ flex:0 0 auto; }
.pts-perk-lock{ font-size:12px; color:var(--ink-2); }
.pts-perk-done{ font-size:12px; color:var(--ink-2); }
.pts-perk.on .pts-perk-main b{ color:var(--xq); }
.pts-row{ display:flex; align-items:center; justify-content:space-between; gap:10px; padding:10px 14px; border-bottom:1px solid var(--line-2); }
.pts-row:last-child{ border-bottom:none; }
.pts-row-main{ display:flex; flex-direction:column; gap:2px; min-width:0; }
.pts-row-main b{ font-size:13px; color:var(--ink); }
.pts-row-main span{ font-size:11px; color:var(--ink-2); max-width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pts-row-right{ flex:0 0 auto; text-align:right; display:flex; flex-direction:column; gap:2px; }
.pts-plus{ font-size:15px; font-weight:700; color:#c0392b; font-variant-numeric:tabular-nums; }   /* 获取=红（涨） */
.pts-minus{ font-size:15px; font-weight:700; color:var(--ink-2); font-variant-numeric:tabular-nums; } /* 消耗=灰 */
.pts-row-right em{ font-size:11px; color:var(--ink-2); font-style:normal; }


/* ============================================================
   v346 —— 六项改动配套样式
   #3 每页正中副标题字号放大到当前的 1.2 倍
      （v337 层现值：桌面 13.09px / 窄屏 11.73px → 15.71px / 14.08px）
   #2 估值分析页「统一时间区间」工具条
   #6 我的页内联「我的积分 / 我的笔记」+ 积分流水上下滚动条
   ============================================================ */
.page-sub{ font-size:14.923px; }                 /* 12.436 × 1.2 */
@media (max-width:640px){
  .page-sub{ font-size:13.373px; }               /* 11.144 × 1.2（级联在后覆盖 v337 断点） */
}

/* #2 估值分析：单一时间区间工具条（四张图同步） */
.val-rangetoolbar{ padding:11px 14px; }
.val-range-inner{ display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
.val-range-lab{ font-size:13px; font-weight:600; color:var(--ink); letter-spacing:.04em; }
.val-range-note{ font-size:11.5px; color:var(--ink-2); }
.val-range-inner .val-range{ min-width:150px; }

/* #6 我的页：内联模块容器（与独立页同一套内部样式，仅去掉多余外边距） */
.me-inline-blk{ margin-top:2px; }
.me-inline-blk .sec-title{ margin-top:8px; }
/* v361 #3：我的笔记模块整体白底，历史记录完全融入 */
.vc-notes-module{ background:#fff; border-radius:14px; padding:14px; }
/* #6 积分流水上下拉动条：固定高度 + 纵向滚动 */
.pts-ledger-scroll{ max-height:320px; overflow-y:auto; overscroll-behavior:contain; -webkit-overflow-scrolling:touch; }
.pts-ledger-scroll::-webkit-scrollbar{ width:8px; }
.pts-ledger-scroll::-webkit-scrollbar-thumb{ background:var(--hairline,#e0d9c6); border-radius:4px; }
.pts-ledger-scroll::-webkit-scrollbar-thumb:hover{ background:var(--gold,#c08a2e); }
@media (max-width:640px){
  .pts-ledger-scroll{ max-height:260px; }
}

/* ============================================================
   v347 —— 五项改动配套样式
   #1 主要指标说明：表头吸附（上下拉动条下拉时表头固定不动）
   #2 五维雷达：宽屏全屏 / 宽屏半屏 / 笔记本 / 手机 多终端协调布局
   #3 估值分析：时间区间下拉靠最左，且紧贴第一屏（市盈率 TTM 走势）
   #4 挑选公司：「挑选/XX积分」按钮单行显示
   #5 我的页：积分流水模块已移除（无对应样式需求）
   ============================================================ */

/* ---- #1 表头吸附 ---- */
.fr-cn-tbl thead th{ position:sticky; top:0; z-index:3; background:var(--paper-2); }
/* 表头 × 首列的交叉单元格：同时吸顶 + 吸左，层级最高 */
.fr-cn-tbl thead th:first-child{ position:sticky; left:0; top:0; z-index:4; background:var(--paper-2); }

/* ---- #2 五维雷达：多终端协调布局 ----
   现状问题：卡片很宽但雷达栏恒为 280px、且雷达图形只占 viewBox 的 52%，
   四周留白明显；右侧解读文字又被拉成超长行。此处按终端分档重排。 */
.fr-radar-card .fr-radar-grid{ align-items:center; }
.fr-radar-card .fr-radar-main{ align-items:center; justify-content:center; gap:26px; }
.fr-radar-card .fr-radar-left{ flex:0 0 auto; width:380px; max-width:46%; }
.fr-radar-card .fr-radar-right{ flex:0 1 auto; min-width:280px; max-width:700px; }
/* 宽屏半屏 / 笔记本：左栏逐档收窄，避免两侧留白 */
@media (max-width:1500px){
  .fr-radar-card .fr-radar-main{ gap:20px; }
  .fr-radar-card .fr-radar-left{ width:336px; }
}
@media (max-width:1300px){
  .fr-radar-card .fr-radar-main{ gap:16px; }
  .fr-radar-card .fr-radar-left{ width:292px; }
}
/* 窄屏（笔记本窄窗 / 平板竖屏）：转纵向，雷达居中、解读整行 */
@media (max-width:1100px){
  .fr-radar-card .fr-radar-grid{ flex-direction:column; }
  .fr-radar-card .fr-radar-main{ flex-direction:column; width:100%; max-width:100%; align-items:stretch; gap:6px; }
  .fr-radar-card .fr-radar-left{ width:100%; max-width:100%; display:flex; justify-content:center; }
  .fr-radar-card .fr-radar-left svg{ max-width:340px; }
  .fr-radar-card .fr-radar-right{ max-width:100%; min-width:0; }
}
/* 手机：雷达再收小、字号略降、间距收紧 */
@media (max-width:640px){
  .fr-radar-card .fr-radar-left svg{ max-width:250px; }
  .fr-radar-card .fr-radar-right{ font-size:12.5px; line-height:1.62; }
  .fr-radar-card .fr-radar-main{ gap:2px; }
  .fr-radar-card .fr-radar-right .eyebrow{ margin:0 0 4px; }
  .fr-radar-card .fr-radar-left{ display:block; }
  .fr-radar-card .fr-radar-left .eyebrow{ display:block; }
}

/* ---- #3 估值分析：区间控件行（置于第一屏卡片内顶部，靠最左） ---- */
.val-range-row{ display:flex; align-items:center; justify-content:flex-start; gap:8px; margin:20px 0 9px; }   /* v350 #1：整体下移 20px */
.val-range-row .val-range{ min-width:150px; }

/* ---- #4 挑选公司：按钮文案「挑选/XX积分」不换行 ---- */
button[data-act="pickerRun"]{ white-space:nowrap; }

/* ==================== v348 #3：五维雷达间距减半 ====================
   宽屏：雷达图到模块底部距离减半（卡片下内边距 9→4px，见 finreport.js 内联样式）；
   宽屏雷达到解读 gap 26→13；半宽 20→10；笔记本 16→8；转列 6→3；手机 2→1。 */
.fr-radar-card .fr-radar-grid{ gap:9px; }
.fr-radar-card .fr-radar-main{ gap:13px; }
@media (max-width:1500px){
  .fr-radar-card .fr-radar-main{ gap:10px; }
}
@media (max-width:1300px){
  .fr-radar-card .fr-radar-main{ gap:8px; }
}
@media (max-width:1100px){
  .fr-radar-card .fr-radar-main{ gap:3px; }
}
@media (max-width:640px){
  .fr-radar-card .fr-radar-main{ gap:1px; }
}

/* ==================== v348 #7b/#9/#11：我的积分（徽章 / 成就行 / 链接 / 问卷） ==================== */
.pts-level-name{ display:flex; align-items:center; justify-content:center; gap:6px; }
.pts-level-name svg{ flex:0 0 auto; }
.pts-ach{ display:flex; align-items:center; gap:10px; padding:11px 14px; border-bottom:1px solid var(--line-2); }
.pts-ach:last-child{ border-bottom:none; }
.pts-ach-ico{ flex:0 0 auto; width:20px; height:20px; border-radius:50%; display:flex; align-items:center; justify-content:center;
  font-size:11px; font-weight:700; background:var(--line-2); color:var(--ink); }
.pts-ach.done .pts-ach-ico{ background:var(--down-soft,#e8f3ea); color:#1a7f37; }
.pts-ach-main{ flex:1; min-width:0; }
.pts-ach-main b{ display:block; font-size:13.5px; }
.pts-ach-main span{ display:block; font-size:12px; color:var(--ink-2); margin-top:1px; }
.pts-ach-reward{ flex:0 0 auto; font-size:12px; color:var(--xq); font-weight:600; }
.pts-survey-opts{ display:flex; flex-wrap:wrap; gap:8px; }
.pts-survey-opt{ display:inline-flex; align-items:center; gap:5px; padding:5px 10px; border:1px solid var(--line-2);
  border-radius:999px; font-size:12.5px; cursor:pointer; }
.pts-survey-opt input{ margin:0; }

/* =========================================================
   v350 #1：估值分析页四张图（市盈率TTM走势 / PE Band / 市净率LF走势 / PB Band）
   模块内字体整体缩小到原 80%（SVG 图内文字由 charts.js font:0.8 系数缩放，
   此处覆盖 HTML 文本：模块标题 / 统计盒 / 图例 / 提示 / 结论）。 */
.val-cell{ font-size:80%; }
.val-cell .sec-title h2{ font-size:13.2px; }
.val-cell .sec-title span{ font-size:9.2px; }
.val-cell .valbox div span{ font-size:7.6px; }
.val-cell .valbox div b{ font-size:10.4px; }
.val-cell .chart-legend{ font-size:8.4px; }
.val-cell .chart-hint{ font-size:8.4px; }

/* ============================================================
   v351 —— 我的积分配套样式
   #3 字号改动已直改上方基础规则（30.4px / 18px 加粗）
   #5/#6 成就行内嵌分享 / 邀请超链接
   #4  积分兑换会员 2×2 网格按钮
   ============================================================ */
.pts-ach-link{ color:var(--xq); text-decoration:underline; text-underline-offset:2px; text-decoration-thickness:1px; }
.pts-ach-link:active{ opacity:.75; }
.pts-redeem{ display:grid; grid-template-columns:repeat(4,1fr); gap:9px; max-width:600px; margin:0 auto; }
@media (max-width:480px){ .pts-redeem{ grid-template-columns:repeat(2,1fr); } }
.pts-redeem-btn{ display:flex; flex-direction:column; align-items:center; justify-content:center; gap:4px;
  padding:13px 10px; border:1px solid var(--line-2); border-radius:12px; background:var(--paper-2,#faf9f5);
  cursor:pointer; transition:border-color .15s, box-shadow .15s; }
.pts-redeem-btn:hover{ border-color:var(--gold); box-shadow:0 1px 6px rgba(201,162,39,.14); }
.pts-redeem-btn:disabled{ opacity:.6; cursor:default; }
.pts-redeem-cost{ font-size:8.96px; font-weight:700; color:var(--xq); font-variant-numeric:tabular-nums; }
.pts-redeem-desc{ font-size:9.6px; color:var(--ink-2); text-align:center; }

/* ============================================================
   v352 —— 我的页配套样式
   #1  积分兑换并入「我的积分」余额卡（余额行 + 兑换网格同卡）
   #5  成就行奖励列双行：单次奖励 + 累计奖励
   ============================================================ */
.pts-balance-top{ display:flex; align-items:center; gap:14px; }
/* v361–v376：曾用「左列奖励 -550px / 右列图标 +100px、奖励 +40px」像素 hack 让两列
   「类别↔奖励」间距靠拢；但该 hack 只适配极宽桌面，在 601–900px（宽屏半屏、手机横屏）
   两列档下，列宽骤减导致左列类别被撑满、右列类别被压到 26–143px，两列类别/奖励宽度
   严重不对称（Playwright 实测）。v401 已在 ≥1600px 清零、v400 在 901–1599px 转单列、
   v600 在 ≤600px 转单列；仅 601–900px 两列档残留 hack。
   v406：移除这 4 条 hack，两列回到同一结构（图标 | 类别 flex:1 | 奖励右对齐），列间自然对称，
   覆盖宽屏半屏与手机横屏两列档；≥1600 / 901–1599 / ≤600 各档行为不变。 */
.pts-ach-reward em{ display:block; font-style:normal; font-weight:500; font-size:11px; color:var(--ink-3,#6b7280); margin-top:2px; }
.pts-ach-grid{ display:grid; grid-template-columns:1fr 1fr; gap:0 8px; }

/* ============================================================
   v354 —— 积分兑换模块风格升级（#3：美观 · 和谐 · 高端）
   置顶「兑换生效中」横幅 + 四档按钮升级为金调卡片
   ============================================================ */
.pts-redeem-vip{ display:block; width:fit-content; margin:0 auto 10px; padding:4px 10px; border-radius:10px;
  background:linear-gradient(135deg,#fdf6e3,#faf0d7);
  border:1px solid #e8d9ae; font-size:13px; font-weight:600; color:#7a5c12;
  letter-spacing:.02em; }
.pts-redeem-vip-dot{ display:inline-block; vertical-align:middle; width:7px; height:7px; border-radius:50%; background:#c9a227;
  box-shadow:0 0 0 3px rgba(201,162,39,.18); margin-right:6px; }
.pts-redeem-vip-none{ background:linear-gradient(135deg,#f3f4f6,#eceef1); border-color:#dfe2e7; color:var(--ink-2,#6b7280); }
.pts-redeem-vip-none .pts-redeem-vip-dot{ background:#9aa3af; box-shadow:0 0 0 3px rgba(154,163,175,.18); }
/* v359 #1：宽屏下兑换横幅 + 四档按钮居中（基础规则已居中，此处保留最大宽度克制） */
@media (min-width:900px){
  .pts-redeem-vip{ margin-left:auto; margin-right:auto; }
  .pts-redeem{ max-width:600px; }
}
.pts-redeem{ gap:10px; }
.pts-redeem-btn{ position:relative; overflow:hidden;
  padding:15px 10px 13px; border-radius:14px; border:1px solid #ecdfc2;
  background:linear-gradient(180deg,#fffdf7 0%,#faf4e4 100%);
  box-shadow:0 1px 2px rgba(60,45,10,.05); transition:transform .16s ease, box-shadow .16s ease, border-color .16s ease; }
.pts-redeem-btn::after{ content:''; position:absolute; inset:0 0 auto 0; height:2px;
  background:linear-gradient(90deg,transparent,rgba(201,162,39,.5),transparent); opacity:.7; }
.pts-redeem-btn:hover{ transform:translateY(-2px); border-color:#d9c288;
  box-shadow:0 6px 16px rgba(160,124,21,.14); }
.pts-redeem-btn:disabled{ transform:none; opacity:.6; cursor:default; }
.pts-redeem-name{ font-size:11.2px; font-weight:700; color:var(--ink); letter-spacing:.04em; }
.pts-redeem-cost{ font-size:10.4px; margin-top:1px; }
.pts-redeem-desc{ font-size:11.5px; color:var(--ink-2); letter-spacing:.01em; }

/* v366 #1：我的积分 VIP 名 + 四个会员模块整体右移 100px */
.pts-redeem-box{ margin-left:150px; font-size:0.8; }
.pts-redeem-box .pts-redeem-vip{ margin:-10px auto 10px; }
.pts-redeem-box .pts-redeem{ margin-left:0; margin-right:auto; max-width:600px; }
/* v364 #1：XX会员 字体扩至当前 1.1 倍（13.312px -> 14.6432px）+ 向下移 10px（margin-top -20px->-10px）+ 底色框紧贴文字(框大小与字数一致) */
.pts-vip-name{ font-size:11.71456px; font-weight:700; letter-spacing:.02em; }



/* ============================================================
   v381 #7/#8：竖屏手机 / 窄屏响应式
   #8 财报体检 / 估值分析 首行公司名行：窄屏下 metrics 指标列换行至独立整行
   #7 我的页：积分成就两列 + 个人资料两列 → 单列，去掉极端负向 margin（防横向溢出/重叠）
       余额卡竖排，避免 30px 积分数字与签到按钮挤一行 */
@media (max-width:560px){
  .fr-head-row, .val-head-row{ flex-wrap:wrap; }
  .fr-head-row .metrics.c4, .val-head-row .metrics.c4{ flex-basis:100% !important; order:3; margin:8px 0 0 !important; }
}
@media (max-width:600px){
  /* 积分成就：两列 → 单列，清掉 c1/c2 的 -550/-100px 类偏移 */
  .pts-ach-grid{ grid-template-columns:1fr; }
  .pts-ach-c1 .pts-ach-reward{ margin-left:0; }
  .pts-ach-c2 .pts-ach-ico{ margin-left:0; }
  .pts-ach-c2 .pts-ach-reward{ margin-left:0; }
  /* 个人资料卡：两列 → 单列，清掉 row 的 250px 偏移 */
  .vc-member-grid{ grid-template-columns:1fr; }
  .vc-member-grid .vc-member-row:nth-child(odd) b{ margin-right:0; }
  .vc-member-grid .vc-member-row:nth-child(even) span{ margin-left:0; }
  /* 余额卡竖排 */
  .pts-balance-card{ flex-direction:column; align-items:stretch; gap:10px; }
  .pts-balance{ text-align:left; }
  .pts-balance-side{ align-items:stretch; }
}

/* ============================================================
   v389 —— #1 每页正中副标题字号缩至当前 95%
   （v346 层现值：桌面 14.923px / 窄屏 13.373px → 14.177px / 12.704px）
   ============================================================ */
.page-sub{ font-size:14.177px; }                 /* 14.923 × 0.95 */
@media (max-width:640px){
  .page-sub{ font-size:12.704px; }               /* 13.373 × 0.95（级联在后覆盖 v346 断点） */
}

/* ============================================================
   v390 —— #1 我的积分 · 四档会员卡片加宽防换行
   根因：v366 的 .pts-redeem-box{ margin-left:150px } 桌面右移规则
        在手机竖屏/横屏同样生效，挤压兑换网格致「兑换 XX 积分」换行。
   方案：≤900px 去掉右移并居中、网格放宽到 680px；
        三行文字 white-space:nowrap 兜底（配合加宽后宽度充足）。
   ============================================================ */
@media (max-width:900px){
  .pts-redeem-box{ margin-left:0; }
  .pts-redeem-box .pts-redeem{ margin-left:auto; margin-right:auto; max-width:680px; }
}
.pts-redeem-name,.pts-redeem-cost,.pts-redeem-desc{ white-space:nowrap; }

/* ============================================================
   v391 —— #1 手机横屏：我的积分 VIP 横幅（当前为xx会员，有效期至xxxx）
          + 四档会员模块整体右移 50px
   （v390 层在 ≤900px 已置 margin-left:0，本层以
     横屏 + 机型高度≤500px 精确圈定手机横屏，级联在后覆盖）
   ============================================================ */
@media (max-width:900px) and (orientation:landscape) and (max-height:500px){
  .pts-redeem-box{ margin-left:50px; }
}

/* ============================================================
   v392 —— #1 手机上「今日签到」按钮（#ptsCheckin）上移 20px、右移 10px
   横竖屏均生效：竖屏 ≤480px / 手机横屏（≤900px + 高度≤500px，
   与 v391 手机横屏圈定口径一致，排除平板与桌面）
   ============================================================ */
@media (max-width:480px), (max-width:900px) and (orientation:landscape) and (max-height:500px){
  #ptsCheckin{ transform:translate(10px,-20px); }
}

/* ============================================================
   v393 —— #1 手机：「价值积分」标签竖屏右移 5px；签到按钮横竖屏下移 10px
           （v392 为 translate(10px,-20px)，下移 10px → translate(10px,-10px)）
   #2 笔记本宽度防折行：金色块按钮文字恒单行；余额/签到侧不被压缩，
      兑换区弹性占满剩余宽度（四档卡不再被挤窄）
   ============================================================ */
@media (max-width:480px){
  .pts-balance-lab{ transform:translateX(5px); }   /* 仅手机竖屏：价值积分 右移 5px */
}
@media (max-width:480px), (max-width:900px) and (orientation:landscape) and (max-height:500px){
  #ptsCheckin{ transform:translate(10px,-10px); }  /* 手机横竖屏：签到按钮较 v392 下移 10px */
}
.btn{ white-space:nowrap; }                        /* #2：按钮文字不折行（签到/问卷/兑换等） */
.pts-balance{ flex:0 0 auto; }
.pts-balance-side{ flex:0 0 auto; }
#ptsRedeemWrap{ flex:1 1 auto; min-width:0; }      /* 兑换区吃掉剩余宽度，替代被压 */

/* ============================================================
   v394 —— 我的积分模块桌面细分 + 副标题字号
   #1 笔记本/宽屏：#ptsCheckin 右移 5px
   #2 宽屏（≥1600px）：VIP 横幅（当前为XX会员，有效期至XXXX）左移 20px
   #3 笔记本（901–1599px）：四档会员卡内容被裁 —— 收窄卡片内边距使内容完整
   #4 笔记本（901–1599px）：四档会员 + VIP 横幅整体左移 50px（150→100）
   #5 副标题字号：桌面（≥641px）×1.1 = 15.595px；手机 ×0.9 = 11.434px
   ============================================================ */
@media (min-width:901px){
  #ptsCheckin{ transform:translateX(5px); }              /* #1 签到按钮右移 5px */
}
@media (min-width:1600px){
  .pts-redeem-vip{ transform:translateX(-20px); }       /* #2 宽屏 VIP 横幅左移 20px */
}
@media (min-width:901px) and (max-width:1599px){
  .pts-redeem-box{ margin-left:100px; }                 /* #4 整体左移 50px（150→100） */
  .pts-redeem-btn{ padding:13px 6px 11px; }             /* #3 内容完整显示 */
  .pts-redeem{ gap:8px; }                               /* #3 列间距略收，卡片更宽 */
}
@media (min-width:641px){
  .page-sub{ font-size:15.595px; }                      /* #5 桌面 ×1.1 */
}
@media (max-width:640px), (max-width:900px) and (orientation:landscape) and (max-height:500px){
  .page-sub{ font-size:11.434px; }                      /* #5 手机 ×0.9 */
}

/* ============================================================
   v395 —— #1 手机竖屏：顶部搜索框占位文字「搜A股/港股/美股」完整显示
   根因：≤760px 时搜索框仅 42vw（375px 屏约 157px），去掉内距/图标/gap 后
        留给文字约 111px，而 13px 下 9 个字需约 117px → 尾部被截断。
   方案：手机端收窄内距与图标、去掉字距，并下调字号使占位文字完整；
        超窄屏（≤360px）再降一档。桌面字号不变。
   ============================================================ */
@media (max-width:760px){
  /* iOS/Safari 对 type=text/search 输入框强制 16px 最小字号（CSS 缩不掉），
     故手机竖屏同时加宽胶囊：42vw(170px 上限) → 52vw(190px 上限)，双保险 */
  /* 注意：基础规则的 max-width:42vw 必须一并解除，否则加宽不生效 */
  .tb-search{ width:min(58vw,200px); max-width:none; padding:0 9px; gap:4px; }
  .tb-search-ic{ width:15px; height:15px; }
  .tb-search-in{ font-size:11.5px; letter-spacing:0; -webkit-appearance:none; appearance:none; }
  #topSearch::-webkit-search-decoration,#topSearch::-webkit-search-cancel-button,
  #topSearch::-webkit-search-results-button{ -webkit-appearance:none; display:none; }
}
@media (max-width:360px){
  .tb-search-in{ font-size:10.5px; }
}

/* ============================================================
   v396 —— 我的积分 · 桌面两档位移 + 笔记本四档卡片加宽
   #1 宽屏（≥1600px）：VIP 横幅（当前为XX会员，有效期至XXXX）左移 50px
      （v394 为 -20px，本层覆盖为 -50px）
   #2 笔记本（901–1599px）：四档会员 + VIP 横幅整体再左移 50px（100→50）
   #3 笔记本：每张会员卡宽度 ×1.1（144px → 158.4px）、卡片间隔 10px
      → 网格内容宽 = 4×158.4 + 3×10 = 663.6px
   ============================================================ */
@media (min-width:1600px){
  .pts-redeem-vip{ transform:translateX(-50px); }              /* #1 宽屏 VIP 横幅左移 50px */
}
@media (min-width:901px) and (max-width:1599px){
  .pts-redeem-box{ margin-left:50px; }                          /* #2 整体左移（100→50） */
  .pts-redeem-box .pts-redeem{ max-width:663.6px; gap:10px; }   /* #3 卡片 ×1.1 + 间隔 10px */
}

/* ============================================================
   v397 —— 顶栏三调
   #1 两排顶栏（笔记本窄排 901–1249px / 手机横屏）上下留白对称：
      品牌行与菜单行各自在所属空间垂直居中（单排顶栏本已居中，不动）
   #2/#3 logo 左缘对齐内容区金色短竖条：--tb-align-x 由 app.js 实测
      .view-wrap 左缘+16px 注入（宽屏内容列居中，x 随视口变化，不能写死）。
      ≥981px（笔记本+宽屏）logo 对齐；两排菜单档（981–1249px）首页小房子
      图标左缘同步对齐（单排档菜单居中且左移会与品牌名重叠，故不动）。
      回退值 168/220px = 现状位置，JS 未运行时外观不变。
   ============================================================ */
@media (min-width:761px) and (max-width:1249px){
  /* 精确居中解：#topbar 的 gap:8px 在换行布局中是行间距，加上 nav 的 margin-top 4px +
     border 1px + padding 4px，实测推出 上内距 12px / 下内距 0 时两行各自恰好居中。
     v405 #1：覆盖范围 901–1249 → 761–1249——两排顶栏实际从 761px 开始（≤760px 菜单栏
     转 fixed 底栏、顶栏回单排），原 901 下限使 761–900px 半屏档品牌行贴顶（上 0 下 12）。
     原 (max-width:900px)+landscape 选择器一并移除：宽 ≤760 的横屏手机顶栏已是单排，
     12/0 内距反把品牌行压偏，且其 #topnav padding-bottom:4px 会覆盖底栏 safe-area 内距。 */
  #topbar{ padding-top:calc(12px + env(safe-area-inset-top)); padding-bottom:0; }
  #topnav{ padding-bottom:4px; }
}
@media (min-width:981px){
  body:not(.has-back) .tb-left{ margin-left:calc(var(--tb-align-x, 168px) - 108px); }
}
@media (min-width:981px) and (max-width:1249px){
  #topnav{ justify-content:flex-start; gap:clamp(10px,1.8vw,36px); padding-left:calc(var(--tb-align-x, 220px) - 118px); }
  #topnav .tab{ flex:0 0 auto; }
}

/* ============================================================
   v398 —— #1 宽屏（≥1600px）：我的积分 VIP 横幅
          （当前为XX会员，有效期至XXXX）在 v396 的 -50px 基础上再左移 50px
          → 合计 translateX(-100px)（覆盖 v396 层的 -50px）
   ============================================================ */
@media (min-width:1600px){
  .pts-redeem-vip{ transform:translateX(-100px); }
}

/* ============================================================
   v399 —— #1 宽屏（≥1600px）：VIP 横幅在 v398 的 -100px 基础上右移 30px
          → 合计 translateX(-70px)（覆盖 v398 层）
   #2 笔记本（981–1249px 两排菜单档）：菜单栏在正文列正上方居中——
      以 .view-wrap 左缘（JS 实测写入 --tb-nav-pad，回退值=侧栏宽 204px）
      作为 #topnav 左内距，五个菜单项在「正文列横向范围」内均匀分布，
      视觉中心恰好落在正文列中心正上方。恢复 v321 的均匀分布样式。
   ============================================================ */
@media (min-width:1600px){
  .pts-redeem-vip{ transform:translateX(-70px); }
}
@media (min-width:981px) and (max-width:1249px){
  #topnav{ justify-content:space-around; gap:0; padding-left:var(--tb-nav-pad, 96px); }
  #topnav .tab{ flex:1 1 0; justify-content:center; }
}

/* ============================================================
   v400 —— #1 笔记本（901–1599px）：积分成就 两列 → 单列，
          清 c1/c2 偏移，标题/状态/奖励文字恒单行（不再折行）
   #2 笔记本：个人资料 两列 → 单列，清 250px 偏移，
          标签/值恒单行（注册时间/简介/风险偏好等整行显示）
   （≤600px 手机档已有同款单列回退，本层把笔记本档纳入同一形态）
   ============================================================ */
@media (min-width:901px) and (max-width:1599px){
  .pts-ach-grid{ grid-template-columns:1fr; }
  .pts-ach-c1 .pts-ach-reward{ margin-left:0; }
  .pts-ach-c2 .pts-ach-ico{ margin-left:0; }
  .pts-ach-c2 .pts-ach-reward{ margin-left:0; }
  .pts-ach-main b, .pts-ach-main span, .pts-ach-reward, .pts-ach-reward em{ white-space:nowrap; }
  .vc-member-grid{ grid-template-columns:1fr; }
  .vc-member-grid .vc-member-row:nth-child(odd) b{ margin-right:0; }
  .vc-member-grid .vc-member-row:nth-child(even) span{ margin-left:0; }
  .vc-member-row span, .vc-member-row b{ white-space:nowrap; }
}

/* ============================================================
   v401 —— #1 宽屏（≥1600px）：积分成就两列内部对称
   根因：v361 的两列定位 hack（c1 奖励 margin-left:-550px 左拉、
   c2 图标 margin-left:100px / 奖励 margin-left:40px 右推）让左右两列
   的「类别↔奖励」间距各不相同。宽屏档全部清零，两列回到同一结构：
   图标 | 类别（弹性伸展）| 奖励（右对齐），列间自然对称。
   ============================================================ */
@media (min-width:1600px){
  .pts-ach-c1 .pts-ach-reward{ margin-left:0; text-align:right; }
  .pts-ach-c2 .pts-ach-ico{ margin-left:0; }
  .pts-ach-c2 .pts-ach-main{ margin-left:0; }
  .pts-ach-c2 .pts-ach-reward{ margin-left:0; text-align:right; }
}

/* ============ v417：笔记本三栏同屏 ============ */
/* 笔记本（981-1420px）上左自选栏 204px + 右公告栏 278px = 482px，把「我的公司」21 列
   指标表挤到溢出，触发 v321 的 body.sb-auto 把左栏收起为抽屉（左右栏无法同屏）。
   收窄两栏给主区让位：左栏 204→170px（v322 已验证三列不裁列的宽度）、
   右栏 278→200px，使 1280-1420px 笔记本上左栏/主区/右栏三块同时呈现。 */
@media (min-width:981px) and (max-width:1420px){
  #sidebar{ flex:0 0 187px; width:187px; }   /* v418：170→187px（×1.1，用户要求） */
  #rsb{ flex:0 0 220px; width:220px; }       /* v418：200→220px（×1.1，用户要求） */
  .rsb-scroll{ padding:0 8px 14px; }
}

/* ============ v419：笔记本左栏公司名超四字两行显示 ============ */
/* 笔记本（981-1420px）左自选栏 187px 下，公司名超过四个字不再省略号截断，
   改为在四字宽度处折为两行（居中显示），保证全名可读 */
@media (min-width:981px) and (max-width:1420px){
  .sb-nm{ white-space:normal; word-break:break-all; line-height:1.3; max-width:4.1em; }
}

/* ============ v421：侧边栏公司行间隔减半（全端） ============ */
/* 行内边距 6→2px（配合 app.js v421 行高改内容自适应），行与行间隔约为原来的一半；
   内容仍完整呈现（两行名公司行高自适应加大） */
.sb-item{ padding:2px 4px; margin-bottom:2px; }

/* ============ v422：两侧边栏行间隔再压缩（全端） ============ */
/* #1 左栏公司行间隔 → 目前的 80%：行内边距 2→1.5px、行距 2→1.8px
   （配合 app.js 行高下限 44→42px） */
.sb-item{ padding:1.5px 4px; margin-bottom:1.4px; }   /* v423：行距 1.8→1.4px，实测间隔精确到原 80% */
/* #2 右栏公告行间隔 → 目前的 50%：行内边距 9→4.25px（上下各），分隔线保留 */
.ha-item{ padding:4.25px 4px; }

/* ============ v424：左栏行内两行间隔与行间间隔各减半（全端） ============ */
/* #1 行内：公司名/股价 与 代码/涨跌幅 两行之间 gap 3→1.5px（.sb-c1/.sb-c2/.sb-c3） */
.sb-c1, .sb-c2, .sb-c3{ gap:1.5px; }
/* #2 行间：桌面行内边距 1.5→1.25px、行距 1.4→0.7px；配合 app.js 行高改为内容自适应
   （下限 32px，不再有拉伸富余），行间间隔 = 上下内边距 + 行距，恰为原间隔的一半 */
.sb-item{ padding:1.25px 4px; margin-bottom:0.7px; }
/* 手机（含手机横屏抽屉态）：文字更大、行更高，原间隔更小，按同比例取半 */
@media (max-width:980px){
  .sb-item{ padding:0.75px 4px; }
}

/* ============ v425：左栏行内/行间间隔精确减半（收尾） ============ */
/* 关键：12.5px 等宽数字的默认行盒高约 20.6px，把行高撑到内容之上，
   行间空隙大半来自这一行盒富余（而非内边距）。行盒收紧到 1.2 后，
   行间间隔只剩「内边距+行距」，v424 的取值即可精确落在原间隔的 50% */
.sb-px, .sb-chg, .sb-mv, .sb-cd{ line-height:1.2; }
/* 手机：行盒收紧后原值偏小，内边距 0.75→1.1px 使间隔回到原 50% */
@media (max-width:980px){
  .sb-item{ padding:1.1px 4px; }
}

/* ============ v426：行间隔微调至精确 50% ============ */
.sb-item{ padding:1.15px 4px; margin-bottom:0.7px; }   /* 桌面：实测 52%→50% */
@media (max-width:980px){
  .sb-item{ padding:1.75px 4px; }                      /* 手机：实测 39%→50% */
}

/* ============ v426：行间隔微调至精确 50% ============ */
.sb-item{ padding:1.15px 4px; margin-bottom:0.7px; }   /* 桌面：实测 52%→50% */
@media (max-width:980px){
  .sb-item{ padding:1.75px 4px; }                      /* 手机：实测 39%→50% */
}

/* ============ v428：宽屏行间隔补齐到 50% ============ */
/* 宽屏（≥1421px）字形行盒更高，实测间隔 5.0px（40%），内边距 1.15→1.75px 补到 6.2px（50%） */
@media (min-width:1421px){
  .sb-item{ padding:1.75px 4px; }
}

/* ============ v428：宽屏行间隔补齐到 50% ============ */
/* 宽屏（≥1421px）字形行盒更高，实测间隔 5.0px（40%），内边距 1.15→1.75px 补到 6.2px（50%） */
@media (min-width:1421px){
  .sb-item{ padding:1.75px 4px; }
}

/* ============ v429：我的公司表（table.wl）行上下间距减半 ============ */
/* 行与行的上下间距由 td 垂直内边距决定（参照 v123 同口径：8px→4px 即 50%）。
   本次 4px→2px，行间净间距 8px→4px，恰为目前的 50%；表头 th 不变，
   行高仍为内容自适应（公司名两行 + 代码），不裁切。 */
table.wl td{ padding:1.85px 1.5px; }   /* v430：实测行间净距 4.40px / 原 8.71px = 精确 50%（三端一致） */

/* ============================================================
   v431
   #1 模型页「四大模型」：一行并列两个、分两行（.mo-grid 两列网格）
   #2 财报体检页锚点菜单栏：笔记本电脑上一行容纳全部菜单（不左右拖动），
      窗口再窄时自动换行居中，任何情况下都不出现横向拖动条
   #3 核心信条（#/philosophy 八条）：笔记本 / 宽屏 / 手机横屏两列，
      一行两条且行内对齐（stretch 等高）；手机竖屏保持单列
   #4 韭菜指数（#/risk 题目）：同上条件下两列、一行两个题目、行内对齐
   #5 笔记本（901-1599px）积分成就：单列 → 两列（列宽不足 330px 时
      自动回落单列，避免 v400 的 nowrap 文案被裁切）
   ============================================================ */

/* ---------- #1 模型页四大模型两列 ---------- */
.mo-grid{ display:grid; grid-template-columns:1fr 1fr; gap:11px; align-items:stretch; }
.mo-grid .entry{ height:100%; margin-bottom:0 !important; }
@media (max-width:560px){
  .mo-grid{ gap:9px; }
  .mo-grid .entry{ padding:12px 10px; }
  .mo-grid .entry b{ font-size:13.5px; }
  .mo-grid .entry span{ font-size:11px; line-height:1.45; }
}

/* ---------- #2 财报体检页菜单栏：笔记本上一行显示全部菜单 ---------- */
@media (min-width:981px) and (max-width:1420px){
  .fr-nav-inner{
    flex-wrap:wrap; overflow-x:visible; row-gap:3px;   /* 换行兜底，替代横向拖动 */
    justify-content:center;
  }
  .fr-nav-item{ font-size:11.6px; letter-spacing:.04em; padding:4px 9px; }
}

/* ---------- #3 / #4 两列网格（信条 / 韭菜指数） ---------- */
/* v435：断点 901→640，使「宽屏电脑半屏」(典型 1280/1366/1440 显示器对半分窗 ≈ 640–720px)
   即进入两列；手机竖屏(≤430px)仍单列。核心信条与韭菜指数共用同一断点。 */
@media (min-width:640px), (max-width:900px) and (orientation:landscape) and (max-height:500px){
  .ph-acc-grid, .rk-quiz-grid{
    display:grid; grid-template-columns:1fr 1fr; gap:10px; align-items:stretch;
  }
  .ph-page .ph-acc-grid > .acc{ margin-bottom:0; height:100%; }
  .rk-quiz-grid > .card{ margin-bottom:0; height:100%; }
  .rk-quiz-grid > .card .opt:last-of-type{ margin-bottom:0; }
}

/* ---------- #5 笔记本（901-1599px）积分成就两列 ---------- */
/* v400 曾把该档改为单列（防 nowrap 文案折行）；本次按要求恢复两列：
   用 auto-fit + 330px 最小列宽——列宽足够时两列并排，过窄时自动回落单列，
   既满足「两列显示」，又保证每条成就的标题/状态/奖励不被裁切。 */
@media (min-width:901px) and (max-width:1599px){
  .pts-ach-grid{ grid-template-columns:repeat(auto-fit, minmax(330px, 1fr)); }
}

/* ============================================================
   v432 韭菜指数题目：同一行两张卡片的「题目 → 选项①②③④」逐行对齐
   问题：v431 两列网格里卡片等高（stretch），但卡内是普通流——
        当两个题目的题干行数不同（一个 1 行、一个 2 行）时，
        右边卡片整块选项上移一行（实测偏高 19px，即一行行高）。
   做法：把每张卡改成 subgrid，占用父网格的 5 条行轨道（题干 + 4 个选项），
        两张卡片共享同一组行轨道 → 题干 / 每个选项的上下边精确落在同一条线。
        父网格行距 10px 保留在卡片行之间；卡内间距改由 row-gap 8px 统管
        （原来靠 margin-bottom: 10/8px，subgrid 下行盒间距需显式给 gap）。
   生效条件与 v431 一致：笔记本 / 宽屏 / 手机横屏两列时；手机竖屏单列不受影响。
   浏览器不支持 subgrid 时回落为普通网格（与 v431 表现相同，不会错位重叠）。
   ============================================================ */
/* v435：与上方两列断点对齐(640px)——半屏宽度下韭菜指数题目也启用 subgrid 逐行对齐 */
@media (min-width:640px), (max-width:900px) and (orientation:landscape) and (max-height:500px){
  .rk-quiz-grid > .card{
    grid-row: span 5;                 /* 题干 + 4 个选项共 5 行轨道 */
    height:auto;                      /* 高度由轨道决定，不再 100% 拉伸 */
    display:grid;
    grid-template-rows:auto repeat(4, auto);   /* 回落：不支持 subgrid 时按内容排 */
    grid-template-rows:subgrid;                /* 对齐关键：复用父网格行轨道 */
    row-gap:8px;
  }
  .rk-quiz-grid > .card > *{ margin-bottom:0 !important; }   /* 间距交给 row-gap，避免轨道内错位 */
  .rk-quiz-grid > .card > div:first-child{ padding-bottom:2px; }  /* 题干与首选项间距维持原来的 10px */
}

/* ============================================================
   v443 财报体检页两处表格列宽调整
   #1 主营构成表（.fr-prof-tbl）：产品/地区列设 min-width:4em，
      保证产品名一行至少呈现 4 个字（4em=46px，11.5px 字号下）
   #2 主要指标说明表（.fr-cn-tbl）：关键发现——该表是 table-layout:fixed，
      列宽由表头行决定，历史 CSS 挂在数据行上的 22%/13% 从未生效，
      线上实际四列一直各占 25%。本版配合 changeNoteHtml 新增 <colgroup>
      （.fr-cn-cnam/.fr-cn-cnum）让列宽真正可控：
      ≥761px 时前三列 25%→12.5%（各减半），说明列 25%→62.5%（增大 1.5 倍）；
      手机竖屏（≤760px）数值列再减半会放不下“1,234.56”，维持原四等分。
   ============================================================ */
.fr-prof-tbl th:first-child, .fr-prof-tbl td:first-child{ min-width:calc(4em + 16px); }
.fr-cn-cnam{ width:12.5%; }
.fr-cn-cnum{ width:12.5%; }

/* v444 手机竖屏补齐：v443 两处列宽仅对 ≥761px 生效，本版让 ≤760px 同比例生效——
   ① 产品列：v443 的 min-width:4em 是含内边距的盒宽（7px×2 内边距后内容只剩 32px≈2.7 字），
      改 calc(4em + 16px) 后内容区恰 4 字（375px 实测 46px=4 字，各屏宽一致）；
   ② 指标说明表：手机上若仍按视口宽 100% 铺开，前三列 12.5% 只剩 40px 放不下「1,234.56」，
      故给表设 min-width:560px——前三列各 70px（数值零裁切）、说明列 349px，
      超出部分沿用既有模式在卡片内左右滑动（首列已粘性固定）；表头允许换行
      （「报告期值（亿）」折两行），避免 nowrap 表头在 70px 列里横向溢出。 */
@media (max-width:760px){
  .fr-cn-tbl{ min-width:560px; }
  .fr-cn-tbl thead th{ white-space:normal; }
}

/* ============================================================
   v445 手机竖屏：财报体检页两表再调整
   #1 主营构成产品列一行至少 6 字：min-width 由 calc(4em+16px) 加深到
      calc(6em+16px)（内容区 69px=6 字，仅 ≤760px 覆盖，电脑端不变）；
      表设 min-width:300px 让毛利率/收入/占比三列保有约 5 字宽，数值不折行。
   #2 主要指标说明表「主要指标」列呈现 6 字：12.5%→16.5%（560px 下 92.4px，
      去内边距后内容 76.4px≈6.6 字）。
   #3 自定义左右滑动条（.fr-hsb，配合 finreport.js 的注入逻辑）：
      轨道 4px 圆角灰底 + 雪球蓝滑块，sticky left:0 常驻卡片可视区左下，
      拖滑块/拖轨道横移表格；不可横滑时自动隐藏。
   ============================================================ */
@media (max-width:760px){
  .fr-prof-tbl{ min-width:300px; }
  .fr-prof-tbl th:first-child, .fr-prof-tbl td:first-child{ min-width:calc(6em + 16px); }
  .fr-cn-cnam{ width:16.5%; }
  .fr-hsb{ position:sticky; left:0; width:100%; padding:6px 0 2px; touch-action:none; -webkit-user-select:none; user-select:none; cursor:pointer; }
  .fr-hsb-track{ position:relative; height:4px; border-radius:2px; background:rgba(31,41,58,.10); }
  .fr-hsb-thumb{ position:absolute; top:0; left:0; height:100%; border-radius:2px; background:rgba(25,78,158,.5); }
}

/* ============================================================
   v446 修正主要指标说明表「看不到说明列全部内容」
   根因：说明表的真实横滑容器是内层 .fr-cn-box（原 overflow-x:hidden），
        直接把 560px 宽的表格右侧裁掉且无法横移；外层 .card 宽度与内容等宽
        并不滚动 → v445 的滑动条判定「不可横滑」自动隐藏，等于没有滑动条。
   做法：① ≤760px 时 .fr-cn-box 放开横向滚动（overflow-x:auto）；
        ② 滑动条改挂在内层 .fr-cn-box 上，并 sticky bottom:0 + left:0
           双向吸附——盒子纵向滚动时也常驻底部可见；
        ③ 滑动条本体 pointer-events:none，仅 4px 轨道可拖动/点按，
           不遮挡说明文字的点选；轨道加一层暖白底避免压在表格线上看不清。
   ============================================================ */
@media (max-width:760px){
  .fr-cn-box{ overflow-x:auto; }
  .fr-cn-box .fr-hsb{ position:sticky; left:0; bottom:0; pointer-events:none; }
  .fr-hsb-track{ pointer-events:auto; background:rgba(31,41,58,.12); box-shadow:0 0 0 3px rgba(255,255,255,.92); }
  /* 说明列改定宽（不再随百分比漂移），并让表宽正好等于三列固定列 + 说明列，
     这样横滑到最右时说明列能整列落在可视区内，逐行读得完整；
     320px 级窄屏再把说明列收到 260px，确保仍能整列读完。 */
  .fr-cn-tbl{ min-width:536px; }
  .fr-cn-cnam{ width:92px; }
  .fr-cn-cnum{ width:72px; }
  .fr-cn-tbl colgroup col:last-child{ width:300px; }
}
@media (max-width:360px){
  .fr-cn-tbl{ min-width:496px; }
  .fr-cn-tbl colgroup col:last-child{ width:260px; }
}

@media (max-width:760px){
  /* v446：滑块不接收指针事件，统一点击/拖拽都由轨道处理（否则按在滑块上起拖会落空） */
  .fr-hsb-thumb{ pointer-events:none; }
  /* v446：滑动条层级提到表格粘性首列（td z-index:2 / thead 4）之上——
     否则左段被钉住的「主要指标」列盖住，既看不见也点不到 */
  .fr-cn-box .fr-hsb{ z-index:6; }
}

/* ============================================================
   v447 手机竖屏：挑选公司页挑选结果表
   #1 表头 / 公司名列（第1列）/ 行业列（第3列）每行最多呈现 4 个字，
      超出自动换行（word-break:break-all；表头的「·报告期」小字同样换行），
      其余列（代码/指标值/收藏列）不受影响；
   #2 常驻左右滑动条：复用财报体检页的 .fr-hsb（picker.js 注入逻辑同构），
      并把 .fr-hsb 的 z-index 统一提到表格粘性首列（z2/z4）之上——
      否则滑动条左段会被钉住的首列盖住（v446 同一教训）。
   ============================================================ */
@media (max-width:760px){
  /* 表格改按内容收缩（width:auto）：所有表头与公司/行业列被钉在恰好 4 字/行
     （4em 内容 + 6px×2 内边距 + 1px×2 边框 = 64px），不随屏幕富余被拉伸；
     列宽总和超出卡片 → 卡片横滑 + 常驻滑动条看全内容。
     （不用 table-layout:fixed——那会把数值列挤到 24px 且表格永不溢出） */
  .picker-tbl{ width:max-content; }   /* 严格按列内容宽排：既不被压缩（表头 4 字/行）也不因屏幕富余被拉伸 */
  .picker-tbl th{ max-width:calc(4em + 14px); white-space:normal; word-break:break-all; }
  .picker-tbl th.picker-star-col{ max-width:none; }
  .picker-tbl th small{ word-break:break-all; }
  .picker-tbl td:first-child, .picker-tbl td:nth-child(3){ min-width:calc(4em + 14px); max-width:calc(4em + 14px); word-break:break-all; }
  .fr-hsb{ z-index:6; }
}

/* ============================================================
   v448 手机竖屏：挑选公司页挑选结果表表头放宽
   #1 表头行由 v447 的每行 4 个字放宽到每行 5 个字（超出自动换行）——
      列宽由表头撑开，公司名/行业列随列同步加宽，表头换行明显减少；
   #2 左右滑动条沿用 v447 已注入的 .fr-hsb（无需改动）。
   仅覆盖表头 max-width，其余 v447 规则（width:max-content、
   word-break:break-all、公司名/行业列 min/max、滑动条 z-index）全部保留。
   ============================================================ */
@media (max-width:760px){
  .picker-tbl th{ max-width:calc(5em + 14px); }
}

/* ============================================================
   v449 修正挑选公司页滑动条「看不到」
   根因：v447 的滑动条插在卡片内部、表格之后——结果表一长就被顶到
        卡片最底部（首屏之外），且卡片自身纵向不滚（overflow-x:auto
        的盒子 sticky 无法钉住视口），sticky bottom 救不了。
   做法：滑动条改挂结果容器 #pickerResults（卡片父级，picker.js 已改），
        .fr-hsb-page 用 position:sticky 钉在 #view 滚动视口底部、
        底部固定导航（56px + safe-area）之上，页面纵滚全程常驻。
        横滑驱动逻辑不变（仍驱动卡片 scrollLeft）。
   ============================================================ */
@media (max-width:760px){
  .fr-hsb-page{
    position:sticky; left:0;
    bottom:calc(62px + env(safe-area-inset-bottom));
    z-index:30;
    width:100%;
    background:rgba(252,251,247,.96);
    border-radius:9px;
    box-shadow:0 1px 8px rgba(16,24,40,.12), 0 0 0 1px rgba(16,24,40,.05);
  }
  .fr-hsb-page .fr-hsb-track{ background:rgba(31,41,58,.16); box-shadow:0 0 0 3px rgba(252,251,247,.96); }
}

/* ============================================================
   v452 经典书籍精读页：深度精读改网格 + 迁移「投资大师说」
   #1 深度精读由单列整宽卡改为网格（minmax(0,1fr) 防止长内容把列撑爆）。
      「每行几本」此后由 v468 接管（v452 的两列 → v468 的四列）。
   #2 移除「框架卡」模块（bookshelf.js 已删渲染段 + 孤儿 bookCard action）。
   #3 「投资大师说」自价值投资理念页迁至此处（独立 masters.js 模块，
      随 bookshelf 一起渲染于深度精读下方；ms-* 全局样式沿用，无需改 CSS）。
   ============================================================ */
.bs-deep .bs-deep-card{ height:100%; }

/* ============================================================
   v468 深度精读：每行 4 本（1 需求）；v479 笔记本（1071–1279px）由 3 列改 4 列（2 需求）
   #1 .bs-deep 由 v452 的每行 2 本改为每行 4 本。列数阶梯按「容器实际宽度」实测确定。
   v468 起初的阶梯按「容器实际宽度」实测确定（列宽 =（容器宽 − (N−1)×11）/ N）。
   ⚠️ 容器宽**不随视口单调**：本项目 ≤980px 侧栏转抽屉，内容区反而变宽
   （视口 980 → 容器 952；视口 1100 → 容器仅 665）。故阶梯按「侧栏可见 / 已收起」两段写：
        ≥1071px        → 4 列（容器 664–1172，卡 158–285）侧栏可见（v479：笔记本段由 3 改 4）
        981–1070px     → 3 列（容器 546–610，卡 128–144）⚠️ 4 列卡内宽仅 102–118，
                         书名（13px 收敛后 104px）都放不下，仍保留 3 列
        821–980px      → 4 列（容器 793–952，卡 190–230）侧栏已收起
        ≤820px         → 2 列（容器 ≤792，卡 ≤391）  手机 / 竖屏平板
   以 820 为界：4 列档每列卡宽 ≥158px；不足 169px 的两段（821–880、1071–1247）
   由下方 #3 的窄卡字号收敛兜住（v479：收敛区间随笔记本 4 列段同步扩到 1279；
   1265 实测 15.5px 下最长书名+标签 172≈内宽 173 贴边折行，故整段 1071–1279 统一收敛），
   故全视口下「书名 + 标签」均同行（实测见 .verify-v468-layout.js）。
   #2 卡片内部改为**纵向**（封面在上 → 书名/标签 → 作者 → 介绍，文案自卡片
      最左缘起排），即把 v454 手机竖屏的做法上提为全部列数下的默认。
      原因：4 列下卡宽仅 180–285px，v452 的「封面左 + 文案右」并排只给文案
      留 60–190px → 书名/标签折行、介绍被压成 5–10 行、卡高一列高可达 446px。
      纵向排布在任意列数下文案都取满卡宽，观感统一。
      卡片内层容器由 bookshelf.js 的内联 style 改为类 .bsd-row（下方规则接管）。
   ============================================================ */
.bs-deep{ display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:12px 11px; }
.bs-deep-card .bsd-row{ display:flex; flex-direction:column; align-items:stretch; gap:9px; }
@media (min-width:981px) and (max-width:1070px){ .bs-deep{ grid-template-columns:repeat(3,minmax(0,1fr)); } }
@media (max-width:820px){ .bs-deep{ grid-template-columns:repeat(2,minmax(0,1fr)); } }
@media (max-width:760px){ .bs-deep{ gap:10px 9px; } }

/* v468 #3 窄卡字号收敛：卡片内宽 < ~169px 时「书名 + 标签」总宽会超出
   （实测：书名 15.5px 下最长 8 字 =124px + 间距 6 + 标签 11px =38.7 → 需 168.7px），
   标签被 flex-wrap 挤到第二行。处置与 v455 手机竖屏一致：书名 13px、
   标签 10px → 总宽约 140px，在内宽 ≥143px 的窄卡内保持同行。
   命中区间＝「窄卡」各段：821–880px（4 列，卡 190–205px）与
   1071–1279px（v479：笔记本 4 列段，卡 158–202px，内宽 132–176，实测 1265 处贴边折行故整段收敛）；
   981–1070px 仍为 3 列（4 列卡内宽 102–118 连 13px 书名都放不下，不适用）；
   其余档位内宽 ≥169px，无需收敛（已实测标签均与书名同行）。 */
@media (max-width:880px) and (min-width:821px), (min-width:981px) and (max-width:1279px){
  .bs-deep-card .bsd-head b{ font-size:13px !important; }
  .bs-deep-card .bsd-head .pill.gold{ font-size:10px; padding:2px 5px; }
}

/* ============================================================
   v454 深度精读卡（手机竖屏）：介绍内容从最左侧起排
   #1 窄屏下卡内「封面 + 文案」原为左右并排，介绍段落被封面挤到右侧、
      每行仅剩约 4 字宽；手机竖屏改为纵向排列（封面在上、标题/作者/介绍在下），
      文案整体从卡片最左侧起排，阅读更顺。
   #2 仅 ≤760px 生效；桌面（>760px）保持封面左、文案右的并排布局不变。
   ⚠️ v468 起：该「封面在上」的纵向排布已**上提为全部列数下的默认**
      （见上方 v468 的 .bsd-row 规则），v452 的「桌面并排」不再存在，
      故本段的 flex-direction / gap / align-items 覆盖整段删除；
      ≤760px 只保留下方 v455 的内距与字号微调。
   ============================================================ */

/* ============================================================
   v455 深度精读卡（手机竖屏）：标签与书名同行，不另起一行
   #1 窄屏双列卡内容宽仅 ~137px，「书名 + 标签(实战/周期…)」整体超宽，
      标签被 flex-wrap 挤到下一行；手机竖屏收窄内边距、缩小书名与标签字号、
      收紧间距，使书名与标签保持同一行（如「巴菲特致股东的信 实战」）。
   #2 仅 ≤480px 生效（该宽度下双列卡已窄到会折行）；>480px 卡片够宽，保持原样。
   ============================================================ */
@media (max-width:480px){
  .bs-deep .bs-deep-card{ padding:13px; }
  .bs-deep-card .bsd-head{ gap:3px !important; }
  .bs-deep-card .bsd-head b{ font-size:13px !important; }
  .bs-deep-card .bsd-head .pill.gold{ font-size:10px; padding:2px 5px; }
}

/* ===================== 批次 B（v484）：搜索增强 / 站点地图 / 面包屑 ===================== */
/* 顶栏「全部模块」按钮 */
.tb-allmods{
  display:flex; align-items:center; justify-content:center;
  width:32px; height:32px; margin-right:2px; flex:0 0 auto;
  border:none; background:transparent; border-radius:9px; color:#d6453f; cursor:pointer;
}
.tb-allmods:active{ background:rgba(214,69,63,.12); }
.tb-allmods svg{ width:19px; height:19px; }

/* 顶部搜索下拉：模块 / 术语 分组 */
.tb-search-box .ts-sec{
  padding:7px 8px 3px; font-size:11px; letter-spacing:.08em; color:var(--ink);
  font-weight:600;
}
.tb-search-box .ts-link.ts-mod,
.tb-search-box .ts-link.ts-term{
  display:flex; align-items:center; gap:8px; padding:6px 8px; border-radius:10px;
  text-decoration:none; color:var(--ink-1);
}
.tb-search-box .ts-link.ts-mod:hover,
.tb-search-box .ts-link.ts-term:hover,
.tb-search-box .ts-link.ts-mod:active,
.tb-search-box .ts-link.ts-term:active{ background:var(--line-2); }
.tb-search-box .ts-m.mod{ background:#2f9e8f; }
.tb-search-box .ts-m.term{ background:#7a5cc4; }
.tb-search-box .ts-d{ font-size:11px; color:var(--ink); font-style:normal; margin-left:4px; }

/* 面包屑（页面顶部，副标题之上） */
.page-crumb{
  display:flex; align-items:center; flex-wrap:wrap; gap:6px;
  padding:6px 2px 2px; font-size:12px; color:var(--ink); max-width:100%;
}
.crumb-link{ color:var(--ink-1); text-decoration:none; }
.crumb-link:hover{ color:#d6453f; text-decoration:underline; }
.crumb-sep{ color:var(--ink); opacity:.5; }
.crumb-cur{ color:var(--ink-1); font-weight:600; }

/* 站点地图（sheet 内四区 + 最近访问） */
.sm-sec{ margin-bottom:14px; }
.sm-h{
  font-size:12px; font-weight:700; letter-spacing:.06em; color:var(--ink);
  padding:2px 2px 8px; border-bottom:1px solid var(--line); margin-bottom:9px;
}
.sm-grid{ display:grid; grid-template-columns:repeat(auto-fill, minmax(140px, 1fr)); gap:8px; }
.sm-item{
  display:flex; flex-direction:column; gap:2px; padding:9px 11px; border-radius:11px;
  background:var(--card); border:1px solid var(--line); text-decoration:none; color:var(--ink-1);
  transition:border-color .15s, background .15s, transform .15s;
}
.sm-item:hover{ border-color:rgba(214,69,63,.5); background:var(--line-2); transform:translateY(-1px); }
.sm-item b{ font-size:13.5px; font-weight:600; }
.sm-item em{ font-size:11px; color:var(--ink); font-style:normal; }

/* ===================== 批次 B（v484）：搜索增强 / 站点地图 / 面包屑 ===================== */
/* 顶栏「全部模块」按钮 */
.tb-allmods{
  display:flex; align-items:center; justify-content:center;
  width:32px; height:32px; margin-right:2px; flex:0 0 auto;
  border:none; background:transparent; border-radius:9px; color:#d6453f; cursor:pointer;
}
.tb-allmods:active{ background:rgba(214,69,63,.12); }
.tb-allmods svg{ width:19px; height:19px; }

/* 顶部搜索下拉：模块 / 术语 分组 */
.tb-search-box .ts-sec{
  padding:7px 8px 3px; font-size:11px; letter-spacing:.08em; color:var(--ink);
  font-weight:600;
}
.tb-search-box .ts-link.ts-mod,
.tb-search-box .ts-link.ts-term{
  display:flex; align-items:center; gap:8px; padding:6px 8px; border-radius:10px;
  text-decoration:none; color:var(--ink-1);
}
.tb-search-box .ts-link.ts-mod:hover,
.tb-search-box .ts-link.ts-term:hover,
.tb-search-box .ts-link.ts-mod:active,
.tb-search-box .ts-link.ts-term:active{ background:var(--line-2); }
.tb-search-box .ts-m.mod{ background:#2f9e8f; }
.tb-search-box .ts-m.term{ background:#7a5cc4; }
.tb-search-box .ts-d{ font-size:11px; color:var(--ink); font-style:normal; margin-left:4px; }

/* 面包屑（页面顶部，副标题之上） */
.page-crumb{
  display:flex; align-items:center; flex-wrap:wrap; gap:6px;
  padding:6px 2px 2px; font-size:12px; color:var(--ink); max-width:100%;
}
.crumb-link{ color:var(--ink-1); text-decoration:none; }
.crumb-link:hover{ color:#d6453f; text-decoration:underline; }
.crumb-sep{ color:var(--ink); opacity:.5; }
.crumb-cur{ color:var(--ink-1); font-weight:600; }

/* 站点地图（sheet 内四区 + 最近访问） */
.sm-sec{ margin-bottom:14px; }
.sm-h{
  font-size:12px; font-weight:700; letter-spacing:.06em; color:var(--ink);
  padding:2px 2px 8px; border-bottom:1px solid var(--line); margin-bottom:9px;
}
.sm-grid{ display:grid; grid-template-columns:repeat(auto-fill, minmax(140px, 1fr)); gap:8px; }
.sm-item{
  display:flex; flex-direction:column; gap:2px; padding:9px 11px; border-radius:11px;
  background:var(--card); border:1px solid var(--line); text-decoration:none; color:var(--ink-1);
  transition:border-color .15s, background .15s, transform .15s;
}
.sm-item:hover{ border-color:rgba(214,69,63,.5); background:var(--line-2); transform:translateY(-1px); }
.sm-item b{ font-size:13.5px; font-weight:600; }
.sm-item em{ font-size:11px; color:var(--ink); font-style:normal; }

/* v485 批次C·⑪：新内容标记「新」徽标（近 14 天新增 / 更新内容） */
.new-badge{
  display:inline-block; vertical-align:middle; margin-left:5px;
  font-size:10px; line-height:1; font-weight:700; letter-spacing:.02em;
  color:#fff; background:#d6453f; border-radius:5px; padding:2px 4px;
  transform:translateY(-1px);
}
/* 书封网格书名旁的「新」——与书名基线对齐，避免撑高行 */
.ms-bk-name .new-badge{ margin-left:4px; transform:none; }

/* v492：成长里程碑成就墙（.pts-ms-*）与「导出我的数据」入口已整块下线，相关样式删除 */
/* v493：签到按钮下方「连续 N 天」标签（.pts-streak）已整块下线，相关样式删除 */

/* v486 批次D·⑫ 评分模型回测公开 */
.bt-demo{ background:rgba(214,69,63,.1); border:1px solid rgba(214,69,63,.4); color:#a3362f;
  border-radius:9px; padding:9px 12px; font-size:12px; line-height:1.55; margin-bottom:14px; }
.bt-card{ padding:14px; margin-bottom:14px; }
.bt-h{ font-size:14.5px; font-weight:700; color:var(--ink); margin-bottom:8px; }
.bt-dims{ display:grid; grid-template-columns:1fr; gap:8px; }
.bt-dim{ display:grid; grid-template-columns:120px 64px 1fr; gap:8px; align-items:baseline;
  padding:8px 10px; background:var(--card,#fff); border:1px solid var(--line,#eee); border-radius:9px; }
.bt-dim-name{ font-weight:600; font-size:13px; color:var(--ink); }
.bt-dim-w{ font-size:12px; color:var(--gold,#a8853f); font-weight:600; }
.bt-dim-c{ font-size:11.5px; color:var(--ink); line-height:1.5; }
.bt-grade{ margin-top:10px; font-size:12px; color:var(--ink); background:rgba(198,162,39,.12);
  border-radius:8px; padding:7px 10px; }
.bt-tags{ display:flex; flex-wrap:wrap; gap:8px; margin:8px 0; }
.bt-tag{ font-size:12px; padding:4px 10px; border-radius:20px; background:var(--navy-soft,#eaeff7);
  color:var(--ink-3,#5b6b84); font-weight:600; }
.bt-ol{ margin:8px 0 6px; padding-left:22px; }
.bt-ol li{ font-size:12.5px; line-height:1.7; color:var(--ink); margin-bottom:4px; }
.bt-legend{ display:flex; align-items:center; gap:6px; font-size:12px; color:var(--ink); margin-top:8px; }
.bt-dot{ display:inline-block; width:11px; height:11px; border-radius:3px; margin-right:2px; }
.bt-dot.gold{ background:#a8853f; }
.bt-dot.navy{ background:#2c3e5c; }
.bt-limit{ background:rgba(214,69,63,.05); }
.bt-limit .bt-h{ color:#a3362f; }
.bt-ul{ margin:6px 0 0; padding-left:20px; }
.bt-ul li{ font-size:12px; line-height:1.65; color:var(--ink); margin-bottom:5px; }
.bt-compliance{ font-size:11.5px; color:var(--ink); text-align:center; padding:14px 6px 4px; line-height:1.6; }

/* v486 批次D·⑭ 精华墙（谨慎社区·只读） */
.cm-banner,.ex-banner{ background:rgba(44,62,92,.08); border:1px solid rgba(44,62,92,.25);
  color:var(--ink-3,#5b6b84); border-radius:9px; padding:9px 12px; font-size:12px; line-height:1.55; margin-bottom:14px; }
.cm-list,.ex-list{ display:grid; grid-template-columns:1fr; gap:12px; }
.cm-card,.ex-card{ padding:13px 14px; }
.cm-top,.ex-top{ display:flex; align-items:center; gap:8px; margin-bottom:7px; flex-wrap:wrap; }
.cm-type{ font-size:11px; font-weight:700; color:#fff; background:var(--gold,#a8853f); border-radius:6px; padding:2px 8px; }
.ex-kind{ font-size:11px; font-weight:700; color:#fff; background:var(--navy,#2c3e5c); border-radius:6px; padding:2px 8px; }
.cm-src{ font-size:11.5px; color:var(--ink); }
.cm-date,.ex-date{ font-size:11.5px; color:var(--ink); margin-left:auto; }
.cm-title,.ex-title{ font-size:15px; font-weight:700; color:var(--ink); line-height:1.4; }
.cm-excerpt,.ex-summary{ font-size:12.5px; color:var(--ink); line-height:1.65; margin-top:5px; }
