/* ★★ 首页（`#/home`）模块样式 —— 2026-10-02 · P2
 *
 * 类名一律 `v3h-` 前缀：外壳那张表里已经有 `v3t-*`（顶栏）、`v3ds-*`（两个集成视图）、
 * `pm-*`（专题），这张再加一族不会互相踩（首页草案轮就因为类名撞车把某块染成了橙底）。
 * 颜色全部走 `--v3-*` token ⇒ 深色/明亮两套主题自动一致。
 *
 * 版面纪律（沿用首页草案轮量出来的那几条，都是"看起来潦草"的真根因）：
 *   · 字号**只有阶梯值**（11.5/12/13/14/15/19）；
 *   · 卡片头统一 42px；卡片圆角/描边统一；
 *   · 严格 12 列（`repeat(12, minmax(0,1fr))`）；
 *   · 网格**轨道数必须等于子元素数**（少一条就会把某个格子塞进隐式窄列、折行）；
 *   · 任何一格**不许换行**；单位在一组里**只说一次**。
 */

/* ★★ 首页的滚动（2026-10-02 你报的问题：「控制台没有整体下拉条，被框死了，展开某个模块下面的内容翻不到」）
   两个真原因（都是量出来的）：
     ① `.v3hv` 虽然是 `overflow:auto`，但在 Windows/Chrome 默认是**覆盖式滚动条**（实测
        `offsetWidth - clientWidth == 0`）⇒ 看不出"这里能滚"，用户以为被框死了；
     ② `.v3h-feedBody` 自己又套了一个 `max-height:46vh + overflow:auto` 的**内层滚动区**：
        鼠标停在更新流上滚滚轮，滚的是**那一块**，整页不动 —— 这就是"翻不到下面"的直接原因。
   修法：**只留一层滚动**（整页滚），并把滚动条显式画出来（见 `v3_app.css` 的全局滚动条那一段）。
   `.v3h-feedBody` 不再限高 ⇒ 展开多少，整页就长多少，滚下去看得见。 */
.v3hv { padding: 12px 16px 26px; overflow-y: auto; overflow-x: hidden;
        flex: 1 1 auto; min-height: 0; scrollbar-gutter: stable; }
.v3h-grid { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: 12px; }
.v3h-c12 { grid-column: span 12; }
.v3h-c8 { grid-column: span 8; }
.v3h-c4 { grid-column: span 4; }
.v3h-c6 { grid-column: span 6; }

.v3h-card { background: var(--v3-panel); border: 1px solid var(--v3-line); border-radius: var(--v3-r2);
            min-width: 0; display: flex; flex-direction: column; }
.v3h-card > header { display: flex; align-items: center; gap: 8px; height: 42px; padding: 0 14px;
            border-bottom: 1px solid var(--v3-line2); }
.v3h-card > header svg { width: 15px; height: 15px; color: var(--v3-fg3); flex: none; }
.v3h-ttl { font-size: 14px; font-weight: 600; color: var(--v3-fg); white-space: nowrap; }
.v3h-hint { font-size: 11.5px; color: var(--v3-fg3); overflow: hidden; text-overflow: ellipsis;
            white-space: nowrap; }
.v3h-grow { flex: 1 1 auto; min-width: 0; }
.v3h-act { font-size: 12px; color: var(--v3-acc); cursor: pointer; white-space: nowrap;
           background: none; border: 0; font: inherit; font-size: 12px; }
.v3h-act:hover { color: var(--v3-acc2); }
.v3h-body { padding: 12px 14px; min-width: 0; }

/* ⓪ KPI 读数带 */
.v3h-kpis { display: grid; grid-template-columns: repeat(4, 1fr); background: var(--v3-panel3);
            border: 1px solid var(--v3-line); border-radius: var(--v3-r2); overflow: hidden; }
.v3h-kpi { padding: 9px 14px; border-left: 1px solid var(--v3-line2); min-width: 0; }
.v3h-kpi:first-child { border-left: 0; }
.v3h-kpi .v3h-k { font-size: 11.5px; color: var(--v3-fg3); white-space: nowrap; }
.v3h-kpi .v3h-v { font-size: 19px; font-weight: 600; color: var(--v3-fg); line-height: 1.35;
                  font-family: var(--v3-num-font, ui-monospace, Consolas, monospace); }
.v3h-kpi .v3h-v small { font-size: 11.5px; color: var(--v3-fg3); margin-left: 4px;
                        font-family: inherit; font-weight: 400; }

/* ① Agent 主位 */
.v3h-hero { border-left: 3px solid var(--v3-acc);
            background: linear-gradient(180deg, rgba(61, 139, 253, .10), rgba(61, 139, 253, 0)); }
.v3h-hero > header { height: 46px; }
.v3h-ava { width: 26px; height: 26px; border-radius: var(--v3-r3); background: var(--v3-acc);
           color: #fff; display: flex; align-items: center; justify-content: center; flex: none; }
.v3h-ava svg { width: 15px; height: 15px; color: #fff; }
.v3h-hero > header .v3h-ttl-lg { font-size: 15px; }
.v3h-ask { display: flex; gap: 8px; max-width: 780px; }
.v3h-ask input { flex: 1 1 auto; min-width: 0; height: 44px; padding: 0 13px; font-size: 13.5px;
                 border-radius: var(--v3-r3); border: 1px solid var(--v3-line);
                 background: var(--v3-panel3); color: var(--v3-fg); font-family: inherit; }
.v3h-ask input::placeholder { color: var(--v3-fg3); }
.v3h-ask input:focus { outline: none; border-color: var(--v3-acc);
                       box-shadow: 0 0 0 3px rgba(61, 139, 253, .18); }
.v3h-ask button { flex: none; width: 96px; height: 44px; padding: 0; border: 0;
                  border-radius: var(--v3-r3); background: var(--v3-acc); color: #fff;
                  font: inherit; font-size: 13px; font-weight: 600; cursor: pointer;
                  white-space: nowrap; }
.v3h-ask button:hover { background: var(--v3-acc2); }
/* 卡片底部：速览在左、入口在右，一行收口（原来各占一行，整块显得散） */
.v3h-herofoot { margin-top: 12px; padding-top: 9px; border-top: 1px dashed var(--v3-line2);
                display: flex; align-items: center; gap: 10px; min-width: 0; }
.v3h-herofoot .v3h-brief { margin-top: 0; flex: 1 1 auto; min-width: 0; }
.v3h-cap { margin-top: 9px; display: flex; flex-wrap: wrap; gap: 6px 10px; font-size: 11.5px;
           color: var(--v3-fg2); }
.v3h-cap .v3h-cap-i { color: var(--v3-fg3); }
.v3h-brief { margin-top: 10px; padding: 8px 10px; border-radius: var(--v3-r3);
             background: var(--v3-panel3); border: 1px solid var(--v3-line2);
             font-size: 12px; color: var(--v3-fg2); line-height: 1.6;
             display: flex; align-items: baseline; gap: 7px; min-width: 0; }
.v3h-brief .v3h-brief-t { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v3h-heroact { margin-top: 10px; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.v3h-btn-pri { height: 34px; padding: 0 14px; border: 0; border-radius: var(--v3-r3);
               background: linear-gradient(180deg, var(--v3-acc), var(--v3-acc2)); color: #fff;
               font: inherit; font-size: 12.5px; font-weight: 600; cursor: pointer; }
.v3h-btn-pri[disabled] { opacity: .6; cursor: default; }
.v3h-heroact .v3h-hint { white-space: normal; }
.v3h-research { margin-top: 10px; padding-top: 9px; border-top: 1px dashed var(--v3-line2); }
.v3h-rs { display: flex; align-items: baseline; gap: 8px; font-size: 12px; color: var(--v3-fg2); }
.v3h-rs .v3h-rs-d { width: 5px; height: 5px; border-radius: 50%; background: var(--v3-acc);
                    flex: none; transform: translateY(-2px); }
.v3h-rs .v3h-rs-t { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v3h-rs .v3h-rs-a { margin-left: auto; color: var(--v3-fg3); font-size: 11.5px; white-space: nowrap; }
.v3h-empty2 { color: var(--v3-fg3); font-size: 11.5px; line-height: 1.7; }
.v3h-chips { margin-top: 10px; display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.v3h-chips button { height: 26px; padding: 0 10px; border-radius: 999px; font: inherit;
                    font-size: 12px; cursor: pointer; border: 1px solid var(--v3-line);
                    background: var(--v3-panel2); color: var(--v3-fg2); }
.v3h-chips button:hover { border-color: var(--v3-acc); color: var(--v3-fg); }
.v3h-goto { margin-top: 8px; font-size: 11.5px; color: var(--v3-fg3); }

/* ①.1 快速问数的结果（2026-10-21 加）
   为什么单独一族 `v3a-*`：结果区是"会变长的一块"，不能靠 inline style 拼 ——
   拼出来的东西字号/间距/圆角都对不上首页其它卡片，一眼就"潦草"。
   纪律沿用本文件开头那几条：字号只用阶梯值、圆角与描边统一、图不许撑破卡片。 */
.v3a-res { margin-top: 12px; }
.v3a-meta { display: flex; align-items: center; gap: 8px; font-size: 11.5px;
            color: var(--v3-fg3); margin-bottom: 8px; }
.v3a-meta b { color: var(--v3-fg2); font-weight: 600; }
.v3a-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
@media (max-width: 980px) { .v3a-grid { grid-template-columns: 1fr; } }
.v3a-card { border: 1px solid #1d2840; border-radius: 10px; background: #0b111c;
            padding: 10px 11px 11px; min-width: 0; }
.v3a-card:hover { border-color: #2a3549; }
.v3a-h { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
.v3a-h b { font-size: 13px; font-weight: 600; color: #e6ecf5;
           white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.v3a-h span { margin-left: auto; font-size: 11.5px; color: #8b98ad; white-space: nowrap; }
.v3a-o { margin: 5px 0 8px; font-size: 12px; line-height: 1.65; color: #c2ccdb; }
.v3a-chart { display: block; width: 100%; height: auto; border-radius: 6px;
             background: transparent; min-height: 120px; }
.v3a-state { padding: 14px 2px; font-size: 12px; color: var(--v3-fg3); }
.v3a-state.err { color: #b26a00; }
.v3a-bar { height: 2px; width: 34%; border-radius: 2px; background: var(--v3-acc);
           animation: v3a-run 1.1s ease-in-out infinite; }
@keyframes v3a-run { 0%, 100% { margin-left: 0; } 50% { margin-left: 66%; } }

/* ② 今日更新流（★ 产业链行 = 5 个子元素 ⇒ 5 条轨道；指标行 = 点｜名字｜时间） */
.v3h-feedTop { display: flex; align-items: center; gap: 10px; font-size: 12px; color: var(--v3-fg3);
               padding-bottom: 8px; }
.v3h-feedTop b { color: var(--v3-fg2); font-weight: 600; }
/* ★ 2026-10-08：**年鉴/年刊类**那一句 —— 换行、用次要色，并且**不跟"更新"混在一行**读
   （用户口径：这类数据按年更新，被批量入库的日期写上了，不算"今天更新"）。 */
.v3h-ann { flex-basis: 100%; color: var(--v3-fg3); font-size: 11.5px; line-height: 1.7;
           padding-top: 2px; }
.v3h-ann b { color: var(--v3-fg2); }
.v3h-feedTop { flex-wrap: wrap; }
/* ★★★ 2026-10-08（第十一轮 · 用户口径）：「今日更新」改成「**最近更新**」，
   产业链展开**去掉**，更新内容**进这一列滚动**。
   ⚠ 这一条**修订**了上面 D-34-1 那句"`.v3h-feedBody` 不再限高、只留整页一层滚动"：
     那次是治"首页被框死、整页滚不动"；现在**整页照样滚**（`html,body` 那一段没动），
     只是**这一列自己也有一个滚动区** —— 因为现在它是一个可能上百条的流水，
     铺开会把下面几张卡推到很远。**两层滚动是这里的取舍，不是回退**：
     外层仍在（整页可滚），内层只服务这一列。 */
.v3h-feedBody { margin: 0 -14px; padding: 0 14px;
                max-height: 52vh; overflow-y: auto; overscroll-behavior: contain; }
.v3h-feedmore { display: flex; justify-content: flex-end; padding-top: 8px; }

/* ── ★★★ 2026-10-09（第十二轮 · 用户口径④）：数据日历 ──────────────────────
   用户原话：「『最近更新』这一栏占的空间**太大了**，干脆做个**数据日历**…也**别把具体条目展开了**」。
   ⇒ 日历一格一格（周一开头），有更新的日子亮起来并标条数；下面只列"点中的那一天"。 */
.v3h-cal { margin: 2px 0 8px; }
.v3h-cal-h { display: flex; align-items: center; gap: 10px; font-size: 12.5px; font-weight: 600;
             color: var(--v3-fg2); padding-bottom: 6px; }
.v3h-cal-w { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; padding-bottom: 4px; }
.v3h-cal-w span { font-size: 11px; color: var(--v3-fg3); text-align: center; }
.v3h-cal-g { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; }
.v3h-cal-c { position: relative; height: 40px; border-radius: var(--v3-r2);
             border: 1px solid var(--v3-line2); background: var(--v3-panel3);
             display: flex; flex-direction: column; align-items: center; justify-content: center;
             font-size: 12px; color: var(--v3-fg3); }
.v3h-cal-c i { font-style: normal; }
.v3h-cal-c b { font-size: 10.5px; font-weight: 600; color: var(--v3-acc); line-height: 1.1; }
/* 有更新的日子：亮起来、可点 */
.v3h-cal-has { cursor: pointer; color: var(--v3-fg); border-color: var(--v3-acc);
               background: color-mix(in srgb, var(--v3-acc) 14%, var(--v3-panel3)); }
.v3h-cal-has:hover { filter: brightness(1.15); }
/* 选中的那一天：描边加粗一点（与"有更新"区分得开） */
.v3h-cal-on { outline: 2px solid var(--v3-acc); outline-offset: -1px; }
.v3h-cal-blank { border: 0; background: transparent; }

/* ── ★★★ 2026-10-09（第十二轮 · 用户口径①②）：产业研究「几个品种的图」＋「研究报告」
     两条**横向滚动**的带子（用户原话：「取几个品种的图做一下**滚动**」「研究报告**同理**」）。
   ★ 为什么横向滚：首页要**一眼看到好几条**，竖着排会把页面拉得很长 —— 而这一轮的目标正是"别占太大空间"。*/
.v3h-strip { display: flex; gap: 10px; overflow-x: auto; overflow-y: hidden;
             padding: 8px 2px 10px; overscroll-behavior-x: contain; }
.v3h-fig { flex: 0 0 auto; width: 168px; border: 1px solid var(--v3-line2);
           border-radius: var(--v3-r); background: var(--v3-panel3); padding: 8px 10px; }
.v3h-fig:hover { border-color: var(--v3-acc); }
.v3h-fig-t { font-size: 12.5px; font-weight: 600; color: var(--v3-fg); overflow: hidden;
             text-overflow: ellipsis; white-space: nowrap; }
.v3h-fig-s { height: 44px; display: flex; align-items: center; }
.v3h-spark { display: block; }
.v3h-fig-m { font-size: 11px; color: var(--v3-fg3); }
/* 报告那一带：每条给"品种＋类型＋期次"和一句话观点（内容侧的 `viewpoint`，不截断不改写） */
.v3h-strip-rep { align-items: stretch; }
.v3h-rep { flex: 0 0 auto; width: 224px; border: 1px solid var(--v3-line2);
           border-radius: var(--v3-r); background: var(--v3-panel3); padding: 8px 10px; cursor: pointer; }
.v3h-rep:hover { border-color: var(--v3-acc); }
.v3h-rep-h { display: flex; align-items: center; gap: 6px; }
.v3h-rep-v { font-size: 12.5px; font-weight: 600; color: var(--v3-fg); }
.v3h-rep-vp { font-size: 12px; color: var(--v3-fg2); margin-top: 4px; line-height: 1.5;
              display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical;
              overflow: hidden; }
.v3h-rep-f { font-size: 11px; color: var(--v3-fg3); margin-top: 6px; }
.v3h-ind { border-top: 1px solid var(--v3-line2); }
.v3h-ind:first-child { border-top: 0; }
.v3h-ind > .v3h-h { display: grid; grid-template-columns: 14px minmax(0, 1fr) 88px 74px 84px;
                    align-items: center; gap: 12px; height: 34px; cursor: pointer;
                    border-radius: var(--v3-r3); }
.v3h-ind > .v3h-h:hover { background: var(--v3-panel2); }
.v3h-ind .v3h-car { color: var(--v3-fg3); display: flex; transition: transform .14s ease; }
.v3h-ind .v3h-car svg { width: 12px; height: 12px; }
.v3h-ind.v3h-open .v3h-car { transform: rotate(90deg); color: var(--v3-acc); }
.v3h-ind .v3h-nm { font-size: 13px; font-weight: 600; color: var(--v3-fg); overflow: hidden;
                   text-overflow: ellipsis; white-space: nowrap; }
.v3h-ind .v3h-bar { height: 6px; border-radius: 999px; background: var(--v3-panel2); overflow: hidden; }
.v3h-ind .v3h-bar i { display: block; height: 100%;
                      background: linear-gradient(90deg, var(--v3-acc2), var(--v3-acc)); }
.v3h-ind .v3h-cnt { font-size: 12px; color: var(--v3-fg2); text-align: right; white-space: nowrap; }
.v3h-ind .v3h-tm { font-size: 12px; color: var(--v3-fg3); text-align: right; white-space: nowrap;
                   font-variant-numeric: tabular-nums; }
.v3h-ind .v3h-det { display: none; padding: 1px 0 10px 26px; margin-left: 6px;
                    border-left: 1px solid var(--v3-line2); }
.v3h-ind.v3h-open .v3h-det { display: block; }
.v3h-grp { display: grid; grid-template-columns: minmax(0, 1fr) 92px 84px; gap: 12px;
           align-items: baseline; padding: 4px 0 2px; font-size: 12px; color: var(--v3-fg2); }
.v3h-grp .v3h-g-n { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v3h-grp .v3h-g-u { color: var(--v3-fg3); font-weight: 400; font-size: 11.5px; margin-left: 6px; }
.v3h-grp .v3h-g-c { text-align: right; color: var(--v3-fg3); white-space: nowrap; }
.v3h-grp .v3h-g-t { text-align: right; color: var(--v3-fg3); white-space: nowrap;
                    font-variant-numeric: tabular-nums; }
.v3h-met { display: grid; grid-template-columns: 10px minmax(0, 1fr) 84px; gap: 12px;
           align-items: baseline; padding: 2px 0; font-size: 12px; color: var(--v3-fg2);
           cursor: pointer; border-radius: var(--v3-r3); }
.v3h-met:hover { background: var(--v3-panel2); }
.v3h-met::before { content: ""; width: 4px; height: 4px; border-radius: 999px;
                   background: var(--v3-line); margin-top: 7px; justify-self: center; }
.v3h-met .v3h-m-n { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--v3-fg); }
.v3h-met .v3h-m-t { color: var(--v3-fg3); text-align: right; white-space: nowrap;
                    font-variant-numeric: tabular-nums; }
.v3h-met.v3h-more { color: var(--v3-fg3); cursor: default; }
.v3h-met.v3h-more::before { background: transparent; }

/* ③ 更新节奏 */
.v3h-bars { display: flex; flex-direction: column; gap: 7px; }
.v3h-brow { display: grid; grid-template-columns: 78px minmax(0, 1fr) 58px; gap: 8px;
            align-items: center; font-size: 12px; }
.v3h-brow .v3h-d { color: var(--v3-fg3); white-space: nowrap; }
.v3h-brow .v3h-t { height: 8px; background: var(--v3-panel2); border-radius: 999px; overflow: hidden; }
.v3h-brow .v3h-t i { display: block; height: 100%;
                     background: linear-gradient(90deg, var(--v3-acc2), var(--v3-acc)); }
.v3h-brow .v3h-n { text-align: right; color: var(--v3-fg2); white-space: nowrap; }
.v3h-kv2 { margin-top: 12px; padding-top: 10px; border-top: 1px solid var(--v3-line2);
           display: grid; grid-template-columns: 1fr auto; gap: 5px 8px; font-size: 12px; }
.v3h-kv2 .v3h-k { color: var(--v3-fg3); }
.v3h-kv2 .v3h-v { color: var(--v3-fg2); text-align: right; }

/* ④ 数据集卡（一行 4 张、等高、简介 2 行截断）
   ★★★ 2026-10-09（第十二轮 · 真缺陷）：卡片宽度**不能写死 4 列**。
     这一轮按你的口径把「专题数据集」从整行（c12）挪到了半行（c4，与"数据日历"并排），
     容器只剩 481px ⇒ 4 列一列 **111px**，而卡片页脚一行（徽标＋收藏＋分析＋更新）
     有 **244px** —— 页脚**溢出到卡片外面**，正好钻到右边那张卡（和下面那张卡）**底下**。
     后果不是"难看"而是**点不到**：`elementFromPoint` 在按钮中心点上命中的是**隔壁卡的徽标**，
     `_集成门.py:956` 点首页那张「📈 分析」**30 秒超时**（真浏览器、真用户一样点不动）。
     ⇒ 改成**按容器自适应**：一列最小 **220px**（不够就少一列、再不够就 1 列），
        `min(100%, 220px)` 保证容器再窄也不溢出（宽度可以缩，**点击目标不能被盖**）。
     半行 481px 时是 **2 列 × 234px**（实测）。
     ★ 为什么最小是 220 而不是 300：页脚那一行（徽标 64 ＋ 收藏 15 ＋ 分析 59 ＋ 更新 100 ＋ 3 个 8px 间距）
       ＝ **244px**，卡片左右内边距 12+12 ⇒ 卡宽要 **≥268px** 页脚才一点都不挤；
       220px 时页脚**不溢出卡片**（实测 `scrollWidth == clientWidth`），只是"更新…"那段自己换行；
       而 300px 在半行宽下只剩 **1 列**（8 张竖着堆 1300px），那才是真难看。
     ★★ 还有一处**连带**（不在这个文件里，但决定这张卡排到哪）：`index.html` 里
       「数据日历」的 section 必须写在「专题数据集」**前面** —— 网格自动放置**按源码顺序**走，
       写反了这两张卡会**上下叠在同一列**（详见 `index.html` 那段注释与 `docs\M7-13…` §7.2b）。 */
.v3h-dsGrid { display: grid;
              grid-template-columns: repeat(auto-fit, minmax(min(100%, 220px), 1fr));
              gap: 12px;
              /* ★ 同一处修正的另一半：列数少了，8 张卡就**竖着堆**（少到 1 列 ⇒ 1300px），
                 而它旁边那张「数据日历」会被拉到一样高 —— 半行宽的卡**不是**用来摊开 8 张的。
                 原先写死 4 列时这里是 `max-height:340px; overflow:auto`（4×2 塞得下，不用滚）。
                 ⇒ 现在按"**看得到 8 张、卡片高度不许失控**"办：给个上限，超了自己出滚动条。
                    ★★ 上限取 **720px**：① 它与「数据日历」并排在同一行（日历约 960px 高），
                      所以这一栏**本来就有这么高**，不必为了省高度把卡片截断；
                      ② 2 列 × 8 张 = 4 行 × 152px ＋ 3 个 12px 间距 ≈ **680px**，720 够装，
                      **8 张一次看完、不出滚动条**（实测 620 时还差 67px 要滚，720 时不滚）；
                      ③ 1 列（更窄的窗口）时内容 1300px 仍然会有滚动条 —— 那时**该滚**。 */
              max-height: 720px; overflow-y: auto;
              padding-right: 2px;   /* 滚动条别压着卡片边框 */ }
.v3h-ds { border: 1px solid var(--v3-line); border-radius: var(--v3-r2); padding: 10px 12px;
          background: var(--v3-panel2); min-height: 152px; display: flex; flex-direction: column;
          gap: 6px; cursor: pointer; transition: transform .12s ease, border-color .12s ease; }
.v3h-ds:hover { transform: translateY(-1px); border-color: var(--v3-acc); }
.v3h-ds .v3h-t { font-size: 13px; font-weight: 600; color: var(--v3-fg); overflow: hidden;
                 text-overflow: ellipsis; white-space: nowrap; }
.v3h-ds .v3h-meta { font-size: 11.5px; color: var(--v3-fg3); overflow: hidden;
                    text-overflow: ellipsis; white-space: nowrap; }
.v3h-ds .v3h-note { font-size: 11.5px; color: var(--v3-fg2); line-height: 1.6;
                    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
                    overflow: hidden; }
.v3h-ds .v3h-foot { margin-top: auto; display: flex; align-items: center; gap: 4px 8px; font-size: 11.5px;
                    color: var(--v3-fg3);
                    /* ★ 2026-10-09（第十二轮 · 与上面 `auto-fit` 配套）：卡窄了以后，
                       "徽标＋收藏＋分析＋更新 2026-10-09"这一行**放不下就得能折行** ——
                       原来 `flex-wrap: nowrap` ＋ `white-space: nowrap` 会把它**横向挤出去**
                       （实测 234px 卡宽时页脚要 261px ⇒ 溢出 27px）。折行的只有"更新…"那一段
                       （它不可点），三个可点的（收藏/分析）**永远在第一行**、位置不变。 */
                    flex-wrap: wrap; row-gap: 4px; }
.v3h-ds .v3h-foot .v3h-num { margin-left: auto; white-space: normal; overflow-wrap: anywhere; }
.v3h-fav { border: 0; background: none; color: var(--v3-fg3); cursor: pointer; font: inherit;
           font-size: 13px; padding: 0 2px; line-height: 1; }
.v3h-fav:hover { color: var(--v3-warn); }
/* 数据集 → 图表工作台（T-5-08）：时序给「📈 分析」，非时序禁用并写「不适用」。
   禁用态**必须看得出是禁用**（灰掉 + 不可点），不许看着能点其实是死的。 */
.v3h-wb { border: 1px solid var(--v3-line2); background: var(--v3-panel3); color: var(--v3-acc);
          cursor: pointer; font: inherit; font-size: 11.5px; padding: 2px 8px; border-radius: 999px;
          white-space: nowrap; }
.v3h-wb:hover:not(:disabled) { border-color: var(--v3-acc); background: rgba(61, 139, 253, .12); }
.v3h-wb:disabled { color: var(--v3-fg3); border-color: var(--v3-line); background: none;
                   cursor: not-allowed; opacity: .75; }
.v3h-badge { display: inline-flex; align-items: center; gap: 5px; height: 20px; padding: 0 8px;
             border-radius: 999px; border: 1px solid var(--v3-line); font-size: 11.5px;
             white-space: nowrap; }
.v3h-badge::before { content: ""; width: 6px; height: 6px; border-radius: 999px;
                     background: currentColor; }
.v3h-badge.v3h-on { color: var(--v3-ok); border-color: rgba(53, 192, 122, .35);
                    background: rgba(53, 192, 122, .08); }
.v3h-badge.v3h-off { color: var(--v3-warn); border-color: rgba(230, 162, 60, .35);
                     background: rgba(230, 162, 60, .08); }
.v3h-badge.v3h-wait { color: var(--v3-fg3); }

/* ⑤ 产业研究（骨架卡：布局已定、内容待接） */
.v3h-sk { border: 1px solid var(--v3-line); border-radius: var(--v3-r2); padding: 10px 12px;
          background: var(--v3-panel2); min-height: 152px; display: flex; flex-direction: column;
          gap: 8px; }
.v3h-sk .v3h-skb { height: 10px; border-radius: 999px; background: var(--v3-line2); }
.v3h-sk .v3h-skb.w60 { width: 60%; } .v3h-sk .v3h-skb.w80 { width: 80%; }
.v3h-sk .v3h-skb.w40 { width: 40%; }
.v3h-sk .v3h-skb.t { height: 13px; width: 55%; }

/* ⑥ 我的收藏 + 权限摘要 */
.v3h-favRow { display: flex; align-items: baseline; gap: 8px; font-size: 12px; color: var(--v3-fg2);
              padding: 3px 0; }
.v3h-favRow .v3h-t { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v3h-favRow .v3h-a { margin-left: auto; color: var(--v3-fg3); font-size: 11.5px; white-space: nowrap; }
.v3h-favRow .v3h-x { color: var(--v3-fg3); cursor: pointer; background: none; border: 0;
                     font: inherit; font-size: 11.5px; }
.v3h-favRow .v3h-x:hover { color: var(--v3-bad); }
.v3h-scope { margin-top: 10px; padding-top: 9px; border-top: 1px solid var(--v3-line2);
             font-size: 11.5px; color: var(--v3-fg3); line-height: 1.8; }
.v3h-scope b { color: var(--v3-fg2); font-weight: 600; }
.v3h-note2 { margin-top: 10px; font-size: 11.5px; color: var(--v3-fg3); line-height: 1.7; }
.v3h-empty { padding: 18px 4px; color: var(--v3-fg3); font-size: 12px; }
.v3h-err { padding: 10px 12px; border: 1px solid rgba(230, 92, 79, .35); border-radius: var(--v3-r3);
           background: rgba(230, 92, 79, .07); color: var(--v3-fg2); font-size: 12px; line-height: 1.7; }

/* 窄窗口：数据集卡交给上面那条 `auto-fit` 自己降列（这里不再写死 2 列 ——
   写死 2 列在窄窗口会把卡压到 200px 出头、页脚又溢出去）；更新流把强度条让掉，别让时间折行 */
@media (max-width: 1240px) {
  .v3h-ind > .v3h-h { grid-template-columns: 14px minmax(0, 1fr) 74px 84px; }
  .v3h-ind .v3h-bar { display: none; }
  .v3h-c8, .v3h-c4 { grid-column: span 12; }
  .v3h-kpis { grid-template-columns: repeat(2, 1fr); }
  .v3h-kpi:nth-child(3) { border-left: 0; }
}

/* ★ 农业资讯 · 今日热点（2026-10-05 · P3）—— 只用 `--v3-*` 令牌 */
.v3h-ah { display: flex; flex-direction: column; gap: 8px; }
.v3h-ahHotBox { display: flex; flex-direction: column; gap: 4px;
  border-left: 3px solid var(--v3-acc); padding-left: 10px; }
.v3h-ahHot { display: flex; align-items: center; gap: 8px; color: var(--v3-fg);
  text-decoration: none; font-size: 13px; line-height: 1.5; padding: 2px 0; }
.v3h-ahHot:hover { color: var(--v3-acc2); }
.v3h-ahRank { flex: 0 0 auto; min-width: 18px; height: 18px; border-radius: 4px;
  background: var(--v3-panel3); color: var(--v3-fg2); font-size: 11px;
  display: inline-flex; align-items: center; justify-content: center; }
.v3h-ahSrc { flex: 0 0 auto; color: var(--v3-fg3); font-size: 11px; }
.v3h-ahList { display: flex; flex-direction: column; gap: 3px; margin-top: 4px;
  border-top: 1px solid var(--v3-line); padding-top: 8px; }
.v3h-ahRow { display: grid; grid-template-columns: 66px 1fr 92px; gap: 8px;
  align-items: center; color: var(--v3-fg2); text-decoration: none; font-size: 12px;
  line-height: 1.5; padding: 2px 0; }
.v3h-ahRow:hover .v3h-ahT { color: var(--v3-acc2); }
.v3h-ahCat { color: var(--v3-fg3); font-size: 11px; overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap; }
.v3h-ahT { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v3h-ahS { color: var(--v3-fg3); font-size: 11px; text-align: right; overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap; }

/* ══════════ 跨源更新（四源齐，2026-10-06 · 复盘 §3.3 ⑤）══════════
   一行一类：徽标（种类）+ 标题 + 来源小字 + 时间。四行高度固定，窄窗口不换行。 */
.v3h-src { display: flex; flex-direction: column; }
.v3h-srcRow { display: grid; grid-template-columns: 54px minmax(0, 1fr) 260px 92px;
              gap: 10px; align-items: center; padding: 7px 0; cursor: pointer;
              border-bottom: 1px solid var(--v3-line2); font-size: 12.5px; }
.v3h-srcRow:last-child { border-bottom: 0; }
.v3h-srcRow:hover { background: var(--v3-panel3); }
.v3h-srcRow .v3h-t { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v3h-srcRow .v3h-a { color: var(--v3-fg3); font-size: 11.5px; overflow: hidden;
                     text-overflow: ellipsis; white-space: nowrap; }
.v3h-srcRow .v3h-num { color: var(--v3-fg3); font-size: 11.5px; text-align: right; }
@media (max-width: 1240px) {
  .v3h-srcRow { grid-template-columns: 54px minmax(0, 1fr) 92px; }
  .v3h-srcRow .v3h-a { display: none; }        /* 窄窗口先让位：来源小字省掉 */
}

/* ★ 今日更新那张卡里的两段小标题（2026-10-06：最近更新的 / 按产业链展开） */
.v3h-sub-h { margin: 2px 0 6px; font-size: 11.5px; color: var(--v3-fg3); letter-spacing: .02em; }
.v3h-sub-h + .v3h-src { margin-bottom: 10px; }

/* ★★★ 2026-10-09：「最近有更新的日子」一行小胶囊（日历只画一个月 ⇒ 跨月的日子靠它点得到） */
.v3h-cal-days { display: flex; flex-wrap: wrap; gap: 6px; padding: 8px 0 2px; }
.v3h-cal-chip { font: inherit; font-size: 12px; cursor: pointer; padding: 3px 10px;
                border-radius: 999px; border: 1px solid var(--v3-line);
                background: var(--v3-panel3); color: var(--v3-fg2); }
.v3h-cal-chip:hover { border-color: var(--v3-acc); color: var(--v3-fg); }
.v3h-cal-chip.v3h-cal-on { border-color: var(--v3-acc); background: var(--v3-panel2);
                           color: var(--v3-fg); font-weight: 600; }

/* ── Agent 助理页（2026-10-21）：两个页签 + 问数面板 ───────────────────────
   用户口径：首页只提问，**结果来这一页看**；图用工作台观感、并能交给工作台。 */
.v3ag-tabs { display: flex; gap: 4px; margin-left: 10px; }
.v3ag-tabs button { height: 26px; padding: 0 12px; border-radius: 999px; border: 1px solid transparent;
                    background: none; color: var(--v3-fg3); font: inherit; font-size: 12.5px; cursor: pointer; }
.v3ag-tabs button.on { background: var(--v3-panel2); border-color: var(--v3-line);
                       color: var(--v3-fg); font-weight: 600; }
.v3ag-tabs button:hover { color: var(--v3-fg); }
.v3ag-pane { flex: 1 1 auto; min-height: 0; overflow: auto; padding: 16px 18px 26px; }
.v3ag-inner { max-width: 1180px; margin: 0 auto; }
.v3a-foot { display: flex; align-items: center; gap: 8px; margin-top: 8px; padding-top: 8px;
            border-top: 1px dashed #1d2840; }
.v3a-src { font-size: 11.5px; color: #7d8aa0; overflow: hidden;
           text-overflow: ellipsis; white-space: nowrap; }
.v3a-grow { flex: 1 1 auto; }
.v3a-wb { height: 26px; padding: 0 10px; border-radius: var(--v3-r3); border: 1px solid #2a3549;
          background: #131b28; color: #78a9ff; font: inherit; font-size: 12px;
          cursor: pointer; white-space: nowrap; }
.v3a-wb:hover { border-color: var(--v3-acc); }
/* ================= 2026-10-25 unified：首页卡片窄屏整行 ================= */
@media (max-width: 1280px) { .v3h-grid > * { grid-column: span 6 !important; } }
@media (max-width: 900px)  { .v3h-grid > * { grid-column: span 12 !important; } }
