/* ★★ 产业研究视图的样式（P4 / T-5-03，2026-10-04）
   规矩：**只用 `--v3-*` 令牌**（没有硬编码颜色，深色/明亮两套自动跟随）。
   ★★ 2026-10-04 第二轮（用户：「只占视图的 2/3，和其他模块不一致，UI 风格要保持一致」）：
     **版面骨架不再自己起一套** —— 外层用外壳的 `v3q`（`flex:1` 撑满）、左栏用
     `v3side`＋`v3side-h`＋`v3tree`、右栏用 `v3body`（`flex:1` ＋ 同一套外边距）⇒
     与「数据查询」那一页**逐像素同一套间距与边框**。这一段只留"内容"的样式。
     同时**去掉正文的 900px 上限**（那正是"只占 2/3"的直接原因）。 */

/* ── 左侧清单：两个页签 + 搜索框 + 三块"常看的地方"（2026-10-07 · 用户第八轮 · 工作一）── */
.v3rv-tabs { display: flex; gap: 4px; padding: 8px 10px 0; }
.v3rv-tabs button {
  flex: 1; display: inline-flex; align-items: center; justify-content: center; gap: 5px;
  background: var(--v3-panel3); border: 1px solid var(--v3-line); border-bottom: none;
  border-radius: var(--v3-r) var(--v3-r) 0 0; color: var(--v3-fg3);
  padding: 7px 6px; font: inherit; font-size: 12.5px; cursor: pointer;
}
.v3rv-tabs button:hover { color: var(--v3-fg2); }
.v3rv-tabs button.on {
  background: var(--v3-panel2); color: var(--v3-fg); font-weight: 600;
  border-color: var(--v3-acc); box-shadow: inset 0 -2px 0 var(--v3-acc);
}
.v3rv-tabIc { font-size: 13px; line-height: 1; }
.v3rv-tabN { color: var(--v3-fg3); font-size: 10.5px; font-weight: 500;
  background: var(--v3-panel3); border-radius: 999px; padding: 0 6px; }
.v3rv-tabs button.on .v3rv-tabN { color: var(--v3-fg2); }
.v3rv-sideTop { padding: 8px 13px; border-bottom: 1px solid var(--v3-line); }
.v3rv-sideTop input { width: 100%; box-sizing: border-box; background: var(--v3-bg2);
  border: 1px solid var(--v3-line); border-radius: var(--v3-r); color: var(--v3-fg);
  padding: 5px 9px; font-size: 12px; font-family: inherit; }
.v3rv-sideTop input:focus { outline: none; border-color: var(--v3-acc); }

.v3rv-group { margin-top: 6px; }
.v3rv-groupT { display: flex; align-items: center; gap: 6px; color: var(--v3-fg3);
  font-size: 11.5px; font-weight: 600; padding: 6px 13px 4px; letter-spacing: .3px; }
.v3rv-groupN { background: var(--v3-panel3); color: var(--v3-fg2); border-radius: 999px;
  padding: 0 6px; font-size: 10.5px; font-weight: 500; }

.v3rv-row { display: flex; flex-direction: column; gap: 3px; width: 100%; text-align: left;
  background: transparent; border: 1px solid transparent; border-radius: var(--v3-r);
  color: var(--v3-fg); padding: 6px 12px; cursor: pointer; font: inherit; }
.v3rv-row:hover { background: var(--v3-panel2); }
.v3rv-row.on { background: var(--v3-panel2); border-color: var(--v3-acc); }
.v3rv-rowTop { display: flex; align-items: center; gap: 6px; }
.v3rv-rowTop b { font-size: 12.5px; font-weight: 600; }
/* ★ 一眼看出这条是看板还是报告：行首图标 + **加大的类型标签**（原来是 10.5px 灰字，等于没说） */
.v3rv-rowIc { font-size: 13px; line-height: 1; flex: 0 0 auto; }
.v3rv-rowType { font-size: 11.5px; font-weight: 600; border-radius: 999px; padding: 1px 8px;
  border: 1px solid var(--v3-line); color: var(--v3-fg2); background: var(--v3-panel3); flex: 0 0 auto; }
.v3rv-rowType.cockpit { color: var(--v3-acc); border-color: color-mix(in srgb, var(--v3-acc) 45%, transparent);
  background: color-mix(in srgb, var(--v3-acc) 14%, transparent); }
.v3rv-rowType.report { color: var(--v3-hi); border-color: color-mix(in srgb, var(--v3-hi) 40%, transparent);
  background: color-mix(in srgb, var(--v3-hi) 12%, transparent); }
.v3rv-star { margin-left: auto; color: var(--v3-fg3); font-size: 13px; line-height: 1;
  padding: 0 2px; cursor: pointer; flex: 0 0 auto; }
.v3rv-star:hover, .v3rv-star.on { color: var(--v3-warn); }
.v3rv-badge { background: color-mix(in srgb, var(--v3-warn) 22%, transparent);
  color: var(--v3-warn); border-radius: 999px; padding: 0 7px; font-size: 10.5px; font-weight: 600;
  flex: 0 0 auto; }
.v3rv-star + .v3rv-badge, .v3rv-rowType + .v3rv-badge { margin-left: 0; }
.v3rv-rowSub { color: var(--v3-fg3); font-size: 11px; }

/* ───────── 报告行的「观点」（2026-10-08 · 内容方变更单）─────────
   用户反馈「列表名字太单薄」⇒ 报告行第二行放内容侧给的一句话观点（`viewpoint`）。
   规矩：**单行、次要色、超出省略**（截断只发生在这里，数据一个字没改）；
   悬停显示完整标题（`title` 属性，见 rowHTML）—— 省略了也看得到全的。
   ★ 看板行没有这一格（内容里没有观点），样式与行距**不受影响**：这一条只作用于 `.v3rv-row.hasVp`。 */
.v3rv-rowVp { color: var(--v3-fg2); font-size: 11.5px; line-height: 1.5;
  display: block; max-width: 100%;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.v3rv-row.hasVp { padding-top: 7px; padding-bottom: 7px; }
.v3rv-row.hasVp .v3rv-rowSub { margin-top: 1px; }

/* 顶部三块：最近更新 / 最近看过 / 我的收藏（都是"本类里"的，没有就不占地方） */
.v3rv-block { margin: 8px 13px 2px; }
.v3rv-blockT { display: flex; align-items: center; gap: 6px; color: var(--v3-fg3);
  font-size: 11px; font-weight: 600; letter-spacing: .3px; margin-bottom: 4px; }
.v3rv-blockAct { margin-left: auto; color: var(--v3-fg3); font-weight: 500; cursor: pointer;
  text-decoration: underline dotted; }
.v3rv-blockAct:hover { color: var(--v3-fg2); }
.v3rv-chips { display: flex; flex-wrap: wrap; gap: 5px; }
.v3rv-chip { display: inline-flex; align-items: center; gap: 5px; max-width: 100%;
  background: var(--v3-panel3); border: 1px solid var(--v3-line); border-radius: 999px;
  color: var(--v3-fg2); padding: 3px 9px; font: inherit; font-size: 11.5px; cursor: pointer; }
.v3rv-chip:hover { border-color: var(--v3-acc2); color: var(--v3-fg); }
.v3rv-chip.fav { border-color: color-mix(in srgb, var(--v3-warn) 42%, transparent); }
.v3rv-chipIc { font-size: 12px; line-height: 1; }
.v3rv-chipT { color: var(--v3-fg3); font-size: 10.5px; }
.v3rv-chipW { color: var(--v3-fg3); font-size: 10.5px; font-variant-numeric: tabular-nums; }

/* 还没进列表的品种：只报名单与原因 */
.v3rv-pend { margin: 14px 13px 4px; border-top: 1px dashed var(--v3-line); padding-top: 10px; }
.v3rv-pend .v3rv-groupT { padding-left: 0; }
.v3rv-pendNote { color: var(--v3-fg3); font-size: 11px; line-height: 1.55; margin: 2px 0 8px; }
.v3rv-pendRow { color: var(--v3-fg2); font-size: 11px; line-height: 1.6; padding: 2px 0; }
.v3rv-pendRow b { color: var(--v3-fg); margin-right: 6px; }

/* ── 右侧正文（外框由外壳的 `v3body` 负责：`flex:1` ＋ `margin:10px 16px 16px`）── */
.v3rv-empty { display: flex; align-items: center; justify-content: center; height: 100%;
  color: var(--v3-fg3); font-size: 13px; }
/* ★ 不再限宽：这一页要像别的模块一样**用满**整个视图（用户点名的那条） */
.v3rv-doc { max-width: none; }
.v3rv-head { max-width: none; padding: 4px 0 10px; border-bottom: 1px solid var(--v3-line);
  margin-bottom: 14px; }
.v3rv-h1 { font-size: 19px; font-weight: 700; color: var(--v3-fg); }
.v3rv-h2 { color: var(--v3-fg2); font-size: 12.5px; margin-top: 6px; }
.v3rv-h3 { color: var(--v3-fg3); font-size: 11.5px; margin-top: 8px; line-height: 1.6; }

.v3rv-h2blk { font-size: 14.5px; font-weight: 650; color: var(--v3-fg);
  margin: 20px 0 8px; padding-left: 9px; border-left: 3px solid var(--v3-acc); line-height: 1.5; }
.v3rv-p { color: var(--v3-fg2); font-size: 13px; line-height: 1.85; margin: 8px 0;
  white-space: pre-wrap; }
.v3rv-ul { margin: 8px 0 8px 4px; padding-left: 18px; color: var(--v3-fg2);
  font-size: 13px; line-height: 1.85; }
.v3rv-ul li { margin: 4px 0; }
.v3rv-dim { color: var(--v3-fg3); }
.v3rv-a { color: var(--v3-acc2); text-decoration: none; border-bottom: 1px dotted var(--v3-acc2); }

/* 图卡：**就地画图**（2026-10-04 第二轮：对方实测后要求图必须画出来）
   —— 折线 + 均值线 + 最新点；多序列多条线 + 图例；结构图横向条形。 */
.v3rv-fig { margin: 14px 0; padding: 11px 13px; background: var(--v3-panel2);
  border: 1px solid var(--v3-line2); border-radius: var(--v3-r2); }
.v3rv-figHead { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; }
.v3rv-grow { flex: 1 1 auto; }
.v3rv-figT { font-size: 13px; font-weight: 600; color: var(--v3-fg); }
.v3rv-figM { color: var(--v3-fg3); font-size: 11px; }
/* ★ 图区：宽度由 JS 按**实测栏宽**定（`v3_research.js` 的 rvMeasure/rvPaint），
   所以这里**不许**再给 svg 写 `width:100%` —— 那正是「图内文字被缩放」的病根。
   窄栏（<360px）时 SVG 比栏宽 ⇒ 让这一层横向滚动，**不缩字**。 */
.v3rv-figBody { margin-top: 8px; overflow-x: auto; overflow-y: hidden; }
.v3rv-figSum { color: var(--v3-fg2); font-size: 11.5px; margin-top: 7px; }
.v3rv-figSub { color: var(--v3-fg3); font-size: 11px; margin-top: 6px; }
.v3rv-figNote { color: var(--v3-warn); font-size: 11px; margin-top: 5px; line-height: 1.6; }
.v3rv-cap { color: var(--v3-fg3); font-size: 11.5px; line-height: 1.65; margin-top: 7px;
  padding-top: 7px; border-top: 1px dashed var(--v3-line); }
.v3rv-btn { background: var(--v3-panel3); border: 1px solid var(--v3-line2);
  color: var(--v3-fg); border-radius: var(--v3-r); padding: 4px 10px; font-size: 11.5px;
  cursor: pointer; font-family: inherit; }
.v3rv-btn:hover { border-color: var(--v3-acc); color: var(--v3-acc2); }
.v3rv-btn.sm { padding: 2px 7px; font-size: 10.5px; }
.v3rv-tileActs { display: flex; gap: 6px; margin-top: 7px; }

/* ── 就地画的图（SVG）────────────────────────────────────────────────────────
   ★★ 2026-10-07（用户第六条迭代 · 第 1 点）：**尺寸归 SVG 自己的属性管，CSS 一律不参与缩放**。
     旧写法 `width:100%; height:210px` + viewBox 760×210 + preserveAspectRatio="none"
     ⇒ x 方向被拉 1.58 倍、y 方向不拉 ⇒ 图上文字与数字被**横向拉宽**（用户说的"被缩放了"）。
     现在 viewBox / width / height 三处同一对数（JS 里 `svgOpen()` 写死），缩放系数恒为 1；
     这一行只负责"居中"（封顶 1180px 之后，宽屏两侧留白对齐，不是甩在左边）。 */
.v3rv-sv { display: block; margin: 0 auto; }
.v3rv-sv-grid { stroke: var(--v3-line2); stroke-width: 1; }
.v3rv-sv-zero { stroke: var(--v3-line); stroke-width: 1.2; stroke-dasharray: 2 3; }
.v3rv-sv-mean { stroke: var(--v3-fg3); stroke-width: 1; stroke-dasharray: 5 4; }
.v3rv-sv-line { fill: none; stroke: var(--v3-acc); stroke-width: 1.6;
  stroke-linejoin: round; stroke-linecap: round; vector-effect: non-scaling-stroke; }
.v3rv-sv-dot { fill: var(--v3-acc2); stroke: var(--v3-panel2); stroke-width: 1.2; }
.v3rv-sv-tick { fill: var(--v3-fg3); font-size: 10px; }
.v3rv-sv-latest { fill: var(--v3-acc2); font-size: 10.5px; font-weight: 600; }
.v3rv-sv-barlab { fill: var(--v3-fg2); font-size: 11px; }
.v3rv-sv-barval { fill: var(--v3-fg2); font-size: 11px; }
.v3rv-sv-bar { fill: var(--v3-acc); }
.v3rv-sv-bar.neg { fill: var(--v3-bad); }
/* 多序列配色（都用令牌，深浅两套自动跟） */
.v3rv-sv-c1 { stroke: var(--v3-acc); }
.v3rv-sv-c2 { stroke: var(--v3-acc2); }
.v3rv-sv-c3 { stroke: var(--v3-ok); }
.v3rv-sv-c4 { stroke: var(--v3-warn); }
.v3rv-sv-c5 { stroke: var(--v3-hi); }
.v3rv-sv-lgrow { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 8px;
  color: var(--v3-fg2); font-size: 11.5px; }
.v3rv-sv-lg { display: inline-flex; align-items: center; gap: 5px; }
.v3rv-sv-sw { width: 12px; height: 3px; border-radius: 2px; display: inline-block;
  background: var(--v3-acc); }
.v3rv-sv-sw.v3rv-sv-line { width: 12px; }
.v3rv-sv-sw.v3rv-sv-c1 { background: var(--v3-acc); }
.v3rv-sv-sw.v3rv-sv-c2 { background: var(--v3-acc2); }
.v3rv-sv-sw.v3rv-sv-c3 { background: var(--v3-ok); }
.v3rv-sv-sw.v3rv-sv-c4 { background: var(--v3-warn); }
.v3rv-sv-sw.v3rv-sv-c5 { background: var(--v3-hi); }

/* ── 看板：指标砖（最新值 / 环比 / 区间 / 均值 + 迷你走势）── */
.v3rv-secN { margin-left: 8px; color: var(--v3-fg3); font-size: 11px; font-weight: 400; }
.v3rv-tiles { display: grid; grid-template-columns: repeat(auto-fill, minmax(232px, 1fr));
  gap: 10px; margin: 4px 0 6px; }
.v3rv-tile { background: var(--v3-panel2); border: 1px solid var(--v3-line2);
  border-radius: var(--v3-r2); padding: 9px 11px; min-width: 0; }
/* 指标砖里那层 `v3rv-fig`（迷你走势的壳）：**把图卡的外观全抹掉**，只留"这里有一张图"的语义与选择器 */
.v3rv-tile .v3rv-fig { display: inline-flex; margin: 0; padding: 0; background: none;
  border: 0; border-radius: 0; }
/* ★ 2026-10-07 用户口径：删掉 `.v3rv-tile.stale` / `.v3rv-staleChip` / `.v3rv-stale`（停更/年频
   那些"数据健康"话术不上消费侧）。砖上只留一个**时间标签**（内容侧下发的 `period`）。 */
.v3rv-tileTop { display: flex; align-items: center; gap: 6px; min-width: 0; }
.v3rv-tileTop b { font-size: 12px; color: var(--v3-fg); white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; }
.v3rv-freq { color: var(--v3-fg3); font-size: 10.5px; border: 1px solid var(--v3-line2);
  border-radius: 999px; padding: 0 6px; }
.v3rv-tileMid { display: flex; align-items: flex-end; gap: 5px; margin-top: 6px; }
.v3rv-tileV { font-size: 17px; font-weight: 650; color: var(--v3-num); line-height: 1.1; }
.v3rv-tileU { color: var(--v3-fg3); font-size: 10.5px; padding-bottom: 2px; }
.v3rv-spk { width: 132px; height: 34px; flex: 0 0 132px; }
.v3rv-spk-line { fill: none; stroke: var(--v3-acc); stroke-width: 1.4;
  stroke-linejoin: round; vector-effect: non-scaling-stroke; }
.v3rv-tileFoot { display: flex; align-items: center; gap: 8px; margin-top: 6px;
  color: var(--v3-fg3); font-size: 10.5px; flex-wrap: wrap; }
/* 「这个数是什么时候的」—— 用户口径：由时间标签**自答**，不要任何提醒/警告文案 */
.v3rv-period { color: var(--v3-fg2); font-size: 10.5px; font-variant-numeric: tabular-nums; }
.v3rv-tileFoot2 { color: var(--v3-fg3); font-size: 10.5px; margin-top: 2px; }
.v3rv-mom.up { color: var(--v3-ok); }
.v3rv-mom.dn { color: var(--v3-bad); }

/* 未开通 / 打不开 */
.v3rv-deny { max-width: 640px; margin: 40px auto; padding: 18px 20px;
  background: var(--v3-panel2); border: 1px solid var(--v3-line2);
  border-left: 3px solid var(--v3-warn); border-radius: var(--v3-r2); }
.v3rv-denyT { font-size: 14px; font-weight: 600; color: var(--v3-warn); }
.v3rv-denyW { color: var(--v3-fg2); font-size: 12.5px; line-height: 1.75; margin-top: 8px; }
.v3rv-hintline { color: var(--v3-fg3); font-size: 11.5px; line-height: 1.7; margin-top: 8px; }

/* ★★ 2026-10-11：**这一页的数据时点**（用户报「看板的图不跟系统数据更新走」⇒
   「止于哪一天」必须一眼看见，而不是藏在一行小字里）。超过一周（`is-old`）换成醒目配色。 */
.v3rv-asof { display: inline-flex; align-items: center; gap: 6px; margin-top: 7px; padding: 2px 10px;
  border-radius: 999px; border: 1px solid var(--v3-line2); color: var(--v3-fg2);
  background: var(--v3-panel2); font-size: 11.5px; line-height: 1.7; font-variant-numeric: tabular-nums; }
.v3rv-asof.is-old { border-color: color-mix(in srgb, var(--v3-warn) 45%, transparent); color: var(--v3-warn); }

/* ★★ 2026-10-12（内容方收口单）：砖自带的**中文层级身份**要显示出来 ——
   `列名`（这个数取自哪一列）挨着数字；产业链/行业环节/品种/指标进 tooltip。 */
.v3rv-col { display: inline-block; margin-left: 6px; padding: 0 5px; border-radius: 4px;
  border: 1px solid var(--v3-line2); color: var(--v3-fg3); font-size: 10.5px; line-height: 15px; }
/* 派生卡：算式一行（定宽省略，悬停看全） */
.v3rv-tileFoot3 { margin-top: 3px; color: var(--v3-fg3); font-size: 10.5px; line-height: 1.5;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* 算不出来的派生卡：照渲染理由与建议（不许留空、不许顶替） */
.v3rv-tileNA { border-style: dashed; }
.v3rv-naWhy { margin-top: 6px; color: var(--v3-fg2); font-size: 11.5px; line-height: 1.55; }
.v3rv-naTip { margin-top: 3px; color: var(--v3-fg3); font-size: 11px; line-height: 1.5; }
.v3rv-naFx { margin-top: 3px; color: var(--v3-fg3); font-size: 10.5px; line-height: 1.5; }

/* ★★ 2026-10-12：**本机编辑版**标记 —— 读者必须一眼看出"这不是交付原文"（管理员改过文字）。 */
.v3rv-edited { display: inline-flex; align-items: center; margin-top: 6px; padding: 1px 9px;
  border-radius: 999px; border: 1px solid color-mix(in srgb, var(--v3-warn) 55%, transparent);
  color: var(--v3-warn); font-size: 11px; line-height: 17px; }
.v3rv-err { max-width: 640px; margin: 40px auto; padding: 16px 18px; color: var(--v3-bad);
  background: var(--v3-panel2); border: 1px solid var(--v3-line2);
  border-left: 3px solid var(--v3-bad); border-radius: var(--v3-r2); font-size: 12.5px; }

/* 载入占位（骨架条，与首页同一套观感） */
.v3rv-skel { height: 120px; margin: 12px; border-radius: var(--v3-r2);
  background: linear-gradient(90deg, var(--v3-panel2), var(--v3-panel3), var(--v3-panel2));
  background-size: 200% 100%; animation: v3rv-wave 1.4s linear infinite; }
@keyframes v3rv-wave { from { background-position: 0 0; } to { background-position: -200% 0; } }

/* ★ 标题区的**收藏**入口（2026-10-06 · 复盘 §3.3 ⑤「收藏跨源」）：
   报告与驾驶舱都能收藏 ⇒ 首页「我的收藏」才跨得了源（指标/数据集/报告/驾驶舱/专题）。 */
.v3rv-h4 { margin: 6px 0 2px; }
.v3rv-fav { background: var(--v3-panel3); border: 1px solid var(--v3-line); color: var(--v3-fg2);
            border-radius: var(--v3-r3); padding: 4px 10px; font: inherit; font-size: 12px;
            cursor: pointer; }
.v3rv-fav:hover { border-color: var(--v3-acc); color: var(--v3-fg); }

/* ══════════ 研究报告：按**标准研报**排版（A4 纸 + 居中 + 标题/正文/字体/分段/换行规范）══════════
   ★★ 2026-10-07（用户第八轮 · 工作一 b）用户口径（原话）：「研究报告现在是铺满右侧界面…
      我们还是要把研究报告的排版按照**标准研究报告的格式**来进行（**A4 大小，空间上居中**，
      标准研报的**标题/正文/字体和分段/换行规范**）」。

   ★ 下面每个数都有出处（不是我随手挑的）：
     · 纸：A4 = **210mm × 297mm**（96dpi 下 ≈ 794×1123px）；页边距**上下 22mm、左右 20mm**
       （Word 默认 2.54cm 对研报偏大，业内多用 2cm 上下）；
     · 正文：**15px ≈ 11pt（五号 10.5pt 与小四 12pt 之间）**、行距 **1.8**
       （中文正文的舒适区 1.6–1.9；行距太挤就是用户说的"换行不规范"）；
     · 段落：**首行缩进 2 字符**（`text-indent:2em`）、段间距 .55em、**两端对齐**
       （`text-align:justify` + `text-justify:inter-ideograph` 才是中文的对齐方式），
       并禁掉"一段只剩一个字/标题落单"（`orphans`/`widows`/`break-after:avoid`）；
     · 字体：标题走**黑体系**（思源黑体/微软雅黑/苹方），正文走**宋体系**（思源宋体/宋体）
       —— 中文研报的两条主线；数字沿用所在字体的等宽数字特性；
     · 图：**不超过正文栏宽**（`max-width:100%`，SVG 由 JS 按实测栏宽画）、图注在其下、小一号；
     · 长串换行：`overflow-wrap:break-word` + `line-break:strict`（不让长串把版面顶宽）。

   ★ 实现上**不改任何已有选择器**：全部收在 `.v3rv-paper` 里覆盖。
     **产业看板不套这张纸**（它是工作屏，指标砖网格吃满宽度更好用）——只有研究报告是一份文档。 */
.v3rv-paper {
  --rv-h: "Source Han Sans SC", "Noto Sans CJK SC", "Microsoft YaHei", "PingFang SC",
          "Hiragino Sans GB", system-ui, sans-serif;
  --rv-b: "Source Han Serif SC", "Noto Serif CJK SC", "Songti SC", SimSun, Georgia, serif;
  width: 210mm; max-width: 100%; box-sizing: border-box; margin: 0 auto;
  padding: 22mm 20mm 20mm; background: var(--v3-panel); border: 1px solid var(--v3-line);
  border-radius: 2px; box-shadow: 0 4px 22px rgba(0, 0, 0, .26);
}
.v3rv-masthead { display: flex; align-items: center; gap: 10px; padding-bottom: 7px;
  margin-bottom: 18px; border-bottom: 1px solid var(--v3-line); color: var(--v3-fg3);
  font-size: 11.5px; font-family: var(--rv-h); }
.v3rv-masthead b { color: var(--v3-fg2); font-weight: 600; letter-spacing: 1.2px; }
.v3rv-paper .v3rv-head { padding: 0 0 14px; margin-bottom: 18px; text-align: center;
  border-bottom: 1px solid var(--v3-line); }
.v3rv-paper .v3rv-h1 { font-family: var(--rv-h); font-size: 23px; line-height: 1.42;
  font-weight: 700; letter-spacing: .5px; }
.v3rv-paper .v3rv-h2 { font-family: var(--rv-h); font-size: 12.5px; margin-top: 9px; }
.v3rv-paper .v3rv-h4 { margin: 10px 0 0; }
.v3rv-paper .v3rv-h3 { display: none; }        /* 那行"怎么用"的话移到落款，不占正文 */
.v3rv-paper .v3rv-doc { max-width: none; font-family: var(--rv-b); color: var(--v3-fg); }
.v3rv-paper .v3rv-p {
  font-size: 15px; line-height: 1.8; margin: 0 0 .55em; text-indent: 2em;
  text-align: justify; text-justify: inter-ideograph; overflow-wrap: break-word;
  word-break: normal; line-break: strict; orphans: 2; widows: 2;
}
.v3rv-paper .v3rv-p.v3rv-dim { text-indent: 0; color: var(--v3-fg3); font-size: 13px; }
.v3rv-paper .v3rv-h2blk {
  font-family: var(--rv-h); font-size: 17px; line-height: 1.5; font-weight: 700;
  margin: 1.5em 0 .6em; padding: 0 0 .18em; border-bottom: 1px solid var(--v3-line2);
  break-after: avoid; page-break-after: avoid;
}
.v3rv-paper .v3rv-ul { font-family: var(--rv-b); font-size: 15px; line-height: 1.8;
  margin: .3em 0 .8em; padding-left: 1.6em; color: var(--v3-fg); }
.v3rv-paper .v3rv-ul li { margin: .18em 0; }
.v3rv-paper .v3rv-fig {
  margin: 1.2em 0; padding: 9px 11px; background: var(--v3-panel2);
  break-inside: avoid; page-break-inside: avoid;
}
.v3rv-paper .v3rv-figBody { max-width: 100%; }
.v3rv-paper .v3rv-cap { font-family: var(--rv-b); font-size: 12px; line-height: 1.7;
  text-align: center; }
.v3rv-paper .v3rv-figSum, .v3rv-paper .v3rv-figSub, .v3rv-paper .v3rv-figNote {
  font-family: var(--rv-b); line-height: 1.7; }
.v3rv-colophon { margin-top: 20px; padding-top: 11px; border-top: 1px solid var(--v3-line);
  color: var(--v3-fg3); font-size: 11.5px; line-height: 1.8; font-family: var(--rv-h); }

/* 打印：A4 出纸、去掉左列与外壳、纸不留阴影（研报是要能打出来的） */
@media print {
  @page { size: A4; margin: 22mm 20mm; }
  .v3side, .v3side-h, .v3rv-tabs, .v3rv-sideTop, #rvEmpty, .v3rv-fav,
  .v3rv-btn, .v3rv-tileActs { display: none !important; }
  body, .v3body { background: #fff !important; }
  .v3body { margin: 0 !important; overflow: visible !important; }
  .v3rv-paper { width: auto; margin: 0; padding: 0; border: 0; box-shadow: none; }
  .v3rv-paper, .v3rv-paper * { background: #fff !important; color: #111 !important;
    border-color: #bbb !important; }
  .v3rv-paper .v3rv-sv-line, .v3rv-paper .v3rv-spk-line { stroke: #222 !important; }
  .v3rv-paper .v3rv-sv-grid, .v3rv-paper .v3rv-sv-zero, .v3rv-paper .v3rv-sv-mean {
    stroke: #bbb !important; }
  .v3rv-paper .v3rv-sv-tick, .v3rv-paper .v3rv-sv-latest { fill: #333 !important; }
  .v3rv-paper .v3rv-sv-bar { fill: #555 !important; }
}


/* ═══════════════════════════════════════════════════════════════════════════
   ★★★ 2026-10-18（用户口径 · M9-65）**入口页改造**：左侧目录树撤掉，改成
   「上方品种按钮 ＋ 下方内容」。这一整段都是**新增选择器**，不改上面任何一条。
   ═══════════════════════════════════════════════════════════════════════════ */
#rvView { display: flex; flex-direction: column; flex: 1; min-height: 0; min-width: 0; }
.v3rv-top {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 9px 16px; border-bottom: 1px solid var(--v3-line);
}
.v3rv-top > b { font-size: 13.5px; color: var(--v3-fg); }
.v3rv-top .v3rv-tabs { padding: 0; flex: 0 0 auto; }
/* ★★ 2026-10-18（用户报）：加了「报告数量」以后页签**换行、把标签撑高**（图标/名字/数字各占一行）。
   根因是 .v3rv-tabs button{flex:1} 让它随容器压缩、又没有 nowrap ⇒ 文字被折行。
   ⇒ 顶栏里这两个按钮**不参与拉伸、不折行**，高度压回一行。 */
.v3rv-top .v3rv-tabs button {
  flex: 0 0 auto; white-space: nowrap;
  padding: 5px 11px; border-radius: 999px; border-bottom: 1px solid var(--v3-line);
}
.v3rv-top .v3rv-tabs button.on { box-shadow: none; }
.v3rv-top .v3rv-tabs .v3rv-tabN { white-space: nowrap; }
.v3rv-count { color: var(--v3-fg3); font-size: 11.5px; }
.v3rv-vars {
  display: flex; flex-wrap: wrap; gap: 6px;
  padding: 10px 16px; border-bottom: 1px solid var(--v3-line);
  max-height: 132px; overflow: auto;
}
.v3rv-var {
  display: inline-flex; align-items: center; gap: 6px;
  background: var(--v3-bg2); color: var(--v3-fg2);
  border: 1px solid var(--v3-line); border-radius: 999px;
  padding: 4px 12px; font-size: 12.5px; cursor: pointer; white-space: nowrap;
}
.v3rv-var:hover { border-color: var(--v3-acc2); color: var(--v3-fg); }
.v3rv-var.on {
  background: color-mix(in srgb, var(--v3-acc) 16%, transparent);
  border-color: var(--v3-acc); color: var(--v3-fg); font-weight: 600;
}
.v3rv-varsRow {
  display: flex; align-items: flex-start; gap: 10px;
  padding: 10px 16px; border-bottom: 1px solid var(--v3-line);
}
.v3rv-varsRow .v3rv-vars { padding: 0; border-bottom: 0; flex: 1; min-width: 0; }
.v3rv-q {
  flex: 0 0 auto; width: 200px; box-sizing: border-box;
  background: var(--v3-bg2); color: var(--v3-fg);
  border: 1px solid var(--v3-line); border-radius: 999px;
  padding: 5px 12px; font-size: 12.5px;
}
.v3rv-q:focus { outline: none; border-color: var(--v3-acc); }
.v3rv-varN { color: var(--v3-fg3); font-size: 10.5px; }
.v3rv-var.on .v3rv-varN { color: var(--v3-fg2); }
.v3rv-stage { flex: 1; min-height: 0; overflow: auto; padding: 14px 16px 20px; }
.v3rv-cards {
  display: grid; gap: 10px;
  grid-template-columns: repeat(auto-fill, minmax(330px, 1fr));
  align-content: start;
}
.v3rv-card {
  display: flex; flex-direction: column; gap: 7px; text-align: left;
  background: var(--v3-panel2); border: 1px solid var(--v3-line);
  border-radius: 10px; padding: 12px 14px; cursor: pointer;
}
.v3rv-card:hover { border-color: var(--v3-acc2); background: var(--v3-panel3); }
.v3rv-cardT {
  display: flex; align-items: baseline; gap: 6px; flex-wrap: wrap;
  font-size: 13.5px; font-weight: 600; line-height: 1.5; color: var(--v3-fg);
}
.v3rv-cardT .v3rv-badge { margin-left: 0; }
.v3rv-cardT .v3rv-star { margin-left: auto; }
.v3rv-cardM {
  display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
  color: var(--v3-fg3); font-size: 11.5px;
}
.v3rv-cardSep { opacity: .5; }
.v3rv-cardVp {
  color: var(--v3-fg2); font-size: 12.5px; line-height: 1.6;
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
}
.v3rv-main { min-height: 0; }
.v3rv-back { margin: 0 0 12px; }
@media (max-width: 720px) { .v3rv-cards { grid-template-columns: 1fr; } }

/* 2026-10-25：看板指标卡在窄屏降为两列（原来 3 列挤成 230px） */
@media (max-width: 900px) { .v3rv-tiles { grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); } }
@media (max-width: 640px) { .v3rv-tiles { grid-template-columns: 1fr; } }

/* ═══════════════════════════════════════════════════════════════════
   2026-10-25 UI 体检修复（v2 精修）：卡片长文本收敛
   问题：复合长单位（最长 25 字）在卡片里换行 2~4 行，middle 行 34px → 69px，
        整卡 170 → 204px，一屏能看到的卡片数掉一截。
   策略（业界通行：**图表可缩，标签不截**；只有实在放不下才省略 + 悬停看全文）：
     1) 单位/列名：单行 nowrap；优先保完整，`title` 给全文；
     2) 迷你走势图：`viewBox` 等比缩放（flex 可缩、最低 72px），先让位；
     3) 多行块（理由/建议/口径）：-webkit-line-clamp 截 2~3 行，同样给 `title`。
   配套：内容侧已把 14 种复合单位规范为短单位 + `unitFull` 全文（发布链 ③c）。
   ═══════════════════════════════════════════════════════════════════ */
.v3rv-tileMid { min-width: 0; }
.v3rv-tileV { flex: 0 0 auto; }
.v3rv-tileU { flex: 0 0 auto; min-width: 0; max-width: 46%; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; }
.v3rv-grow { flex: 0 1 0; min-width: 0; }
.v3rv-tileMid .v3rv-fig { flex: 1 1 auto; min-width: 56px; max-width: 132px; overflow: hidden; }
.v3rv-tileMid .v3rv-spk { width: 100%; height: 34px; }
.v3rv-col { max-width: 46%; vertical-align: bottom; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; }
.v3rv-naWhy, .v3rv-naTip, .v3rv-naFx { display: -webkit-box; -webkit-box-orient: vertical;
  overflow: hidden; word-break: break-word; }
.v3rv-naWhy { -webkit-line-clamp: 3; }
.v3rv-naTip, .v3rv-naFx { -webkit-line-clamp: 2; }
