/* ============================================================================
   财智检企业财务健康检测平台 —— 统一样式表（app.css）
   ----------------------------------------------------------------------------
   本文件由 index.html 内嵌 <style> 块【逐字节原样外置】而来（唯一内容级改动：

   字体：IBM Plex Sans（css/font.woff2，Google Fonts 分发，SIL OFL 1.1）
     · 数字 / 拉丁符号统一使用 IBM Plex Sans（latin 可变字重 100–700）；
     · 中文字符自动回退 PingFang SC、Microsoft YaHei、Helvetica Neue 等；
     · body 与各组件均经 :root 的 var(--font) 引用，此一处即全站生效；
     · 代码 / 数字列使用的等宽字体（'Consolas','Monaco' 等）不受影响。
   ============================================================================ */

@font-face {
  font-family: "IBM Plex Sans";
  src: url("font.woff2") format("woff2");
  font-weight: 100 700;
  font-display: swap;
}

    :root {
      /* 优化后的配色方案 - 仅使用4种核心颜色 */
      /* ---- 主题令牌 · RGB 通道（供 rgba(基色三通道, α) 引用，同一基色 + 各自透明度保留层次；
             深色为默认值，浅色由 [data-theme=light] 覆盖） ---- */
      --c-r: 17;  --c-g: 38;  --c-b: 77;    /* 面板卡基色 */
      --k-r: 22;  --k-g: 46;  --k-b: 92;    /* KPI / 健康卡基色 */
      --h-r: 20;  --h-g: 44;  --h-b: 88;    /* 顶部头部基色 */
      --p-r: 21;  --p-g: 45;  --p-b: 90;    /* 面板/按钮基色 */
      --i-r: 10;  --i-g: 20;  --i-b: 40;    /* 输入框/更浅面板基色 */
      --d-r: 13;  --d-g: 28;  --d-b: 58;    /* 深层面板基色 */
      --d2-r: 12; --d2-g: 28; --d2-b: 58;   /* 更深层面板基色 */
      --t-r: 123; --t-g: 158; --t-b: 196;   /* 次级文字/描边基色 */
      --t2-r: 90; --t2-g: 115;--t2-b: 153;  /* 次级文字状态基色 */
      /* ---- 主题令牌 · 背景（hex / 渐变） ---- */
      --body-bg: #040a18;                        /* body / html 背景 */
      --vp-bg-1: #123063; --vp-bg-2: #0d1f42; --vp-bg-3: #091530; /* 主视口径向渐变 */
      --dw-bg-1: #0e2040; --dw-bg-2: #0a1830;    /* 抽屉/控制菜单 渐变 */
      --lic-bg-1: #0d1f42; --lic-bg-2: #091530;  /* 授权抽屉 渐变 */
      --th-bg-1: #1a3a70; --th-bg-2: #152d5a;    /* 表格表头 渐变 */
      --opt-bg: #0b1b33;                         /* select option 背景 */
      --sel-bg: #0d1b33;                         /* select option 背景(备) */
      /* ---- 区域维度控件 / 模态弹层 · 色值令牌（★ 2026-09-12 去内联色值 · 令牌化）----
             护栏 tools/verify-dimregion-l1l2.js 的 C2 要求「区域样式段零硬编码色值」，
             故令牌定义必须落在区域样式段之前；原色值双主题共用，此处取值与替换前逐字一致。 ---- */
      --de-dim-rg-accent-bd: rgba(0, 212, 255, 0.35);     /* 区域/部门/产品 控件常态描边 */
      --de-dim-rg-accent-bd-hi: rgba(0, 212, 255, 0.6);   /* 同上 悬停态描边 */
      --de-modal-mask: rgba(0, 0, 0, 0.6);                /* 模态遮罩底 */
      --de-modal-shadow: rgba(0, 0, 0, 0.5);              /* 模态投影色 */
      --de-modal-close-hover: rgba(255, 255, 255, 0.1);   /* 模态关闭键 悬停底 */
      --bg1: #0a1630; --bg2: #0d1b33;
      --card: rgba(var(--c-r), var(--c-g), var(--c-b), 0.72);
      --line: #1e3a63; --line2: rgba(76, 130, 255, 0.22);
      /* 核心色1：蓝色系 - 主数据、增长、正向指标 */
      --primary: #00d4ff; --primary-dark: #3b82f6;
      /* 核心色2：金色 - 警示、次要数据 */
      --warning: #ffa94d;
      /* 核心色3：绿色 - 健康、优秀指标 */
      --success: #10b981;
      /* 核心色4：红色 - 风险、下降指标 */
      --danger: #ff6b6b;
      /* ---- 语义色 · 文字墨色（*-ink）★ 2026-09-13 新增（走查阻塞项 B-2 落地）----
         分工：填充 / 描边 / 图表 / 进度条 继续用上面的 --success / --warning / --danger；
               凡是「文字」一律改用 *-ink。
         为什么必须分开：语义色块值在浅色主题面板上作为**文字**不足 AA
         （实测 #10b981 2.82:1、#ffa94d 1.6:1、#ff6b6b 2.5:1），而浅色主题原先用一条
         `color:#1c2b45` 的笼统覆盖去压状态类 —— 该规则权重 (0,3,1) 高于
         `.health-card .h-score.excellent` (0,3,0)，结果把 8 张健康卡 + 综合分 +
         仪表值的红黄绿四态整体压成同一个深灰蓝，**红黄绿预警这一核心卖点在浅色下静默消失**。
         深色取值 = 原语义色原值（深色主题视觉零变化）；浅色分支见
         html[data-theme="light"] 同名块。 */
      --success-ink: #10b981;              /* 深色：即原 --success */
      --warning-ink: #ffa94d;              /* 深色：即原 --warning */
      --danger-ink: #ff6b6b;               /* 深色：即原 --danger */
      --primary-ink: var(--primary);        /* 深色：即原 --primary（供告警「提示」徽标 .lv.b 等文字用） */
      --info-ink: #ffc107;                  /* 深色：即原告警「黄色/提示」级内联文字色 #ffc107 */
      /* 焦点环色（键盘可达 · 阻塞项 B-1）。深色沿用品牌青；浅色分支必须压深，
         品牌青 #00d4ff 在浅色面板上仅 1.71:1，不满足 WCAG 1.4.11 的非文本对比 3:1。 */
      --focus-ring: var(--primary);
      /* 文本颜色 */
      --txt: #d6e4ff; --txt2: #7f9bc4; --txt3: #8ba6cc;
      /* 兼容旧变量 */
      --blue: var(--primary-dark); --cyan: var(--primary);
      --gold: var(--warning); --gold2: var(--warning);
      --red: var(--danger); --green: var(--success);
      --orange: var(--warning); --purple: var(--primary-dark);
      /* 正向/负向颜色规范：正向（上升、增加）绿色，负向（下降、减少）红色 */
      --rise: var(--success); --fall: var(--danger);
      /* 经营诊断 .odi-* 命名空间专用：warn（关注）状态的**文字**色。
         深色沿用 --warning；浅色在 html[data-theme=light] 覆盖为深琥珀 #b45309 以满足 AA 对比度。
         ⚠ 仅本命名空间；不改全站语义色 --warning 的定义值（浅色 warn 色块/边框/图例仍用 --warning）。 */
      --odi-warn-ink: var(--warning);
      /* 2026-09-11 UI/UX 优化：再补 3 个本命名空间内令牌（沿用 --odi-warn-ink 的做法，只加不改）。
         --odi-link-ink：链接/CTA/激活态**文字**色。品牌主色 --primary(#00d4ff) 在浅色面板上仅 1.71:1，
           不可作正文；该令牌深色提亮一档(≈9:1)、浅色压深(≈5.3:1)，**只改文字、边框仍保留 var(--primary)**。
         --odi-ink3：三级小字文字色。原 --txt3 双主题均 <3:1（浅 2.97 / 深 2.94），
           却被 5 类 10.5–11.8px 小字使用；该令牌深色 ≈4.6:1、浅色 ≈5.0:1，满足 AA 正文 4.5:1。
         --odi-track：刻度条 / 安全垫条的**轨道底**（图形件，仅需 3:1），与面板底同族但略深。
         ⚠ 三个令牌均只作用于 .odi-*，不覆盖 --primary / --txt3 / --warning 的全站定义。 */
      --odi-link-ink: #4fd8f5;
      --odi-ink3: #8ba6cc;
      --odi-track: rgba(21, 45, 90, 0.60);
      --font: "IBM Plex Sans", "PingFang SC", "Microsoft YaHei", "Helvetica Neue", sans-serif;
      /* 输入框统一样式变量 */
      --input-padding: 8px 12px;
      --input-font-size: 13px;
      --input-bg: rgba(var(--i-r), var(--i-g), var(--i-b), 0.6);
      --input-border: var(--line);
      --input-focus-border: var(--cyan);
      --input-focus-shadow: 0 0 8px rgba(0, 212, 255, 0.2);
      --input-radius: 4px;
      /* ---- 数据录入深度优化命名空间（.de-*）主题变量：深色为默认值，浅色由 [data-theme=light] 覆盖 ---- */
      --de-cell-bg: rgba(var(--i-r), var(--i-g), var(--i-b), 0.6);
      --de-cell-border: var(--line2);
      --de-cell-border-focus: var(--primary);
      --de-cat-bg: rgba(0, 212, 255, 0.08);
      --de-zebra: rgba(255, 255, 255, 0.022);
      --de-colitem-bg: rgba(var(--i-r), var(--i-g), var(--i-b), 0.98);
      --de-summary-bg: rgba(var(--i-r), var(--i-g), var(--i-b), 0.85);
      --de-fill: rgba(0, 212, 255, 0.12);
      --de-primary-soft: rgba(0, 212, 255, 0.18);
      /* ---- P0-1 墨色令牌：深色取值 = 原 var(--primary)，深色主题零变化 ---- */
      --de-ink-accent: #00d4ff;            /* 分类序号 / 折叠三角 */
      --de-ink-sum: #00d4ff;               /* 分类行 12 月合计 */
      --de-tab-ink-on: #00d4ff;            /* 激活页签文字 */
      --de-tab-ink-off: #7b93b8;           /* 非激活页签文字：页签底 #0f2142 上 5.10:1 */
      --de-unit-ink: #8ea6cd;              /* 表头「（万元）」：col-item 底 #183465 上 4.94:1 */
      --de-note-ink: #8ea6cd;              /* 跨模块次级说明墨色（提示行 / 删除按钮）；
                                              与 --de-dim-ink-3 同值但语义通用，供非维度模块复用 */
      /* ---- P0-3 空库 / 旧版引导横幅 ---- */
      --de-seed-ink: #bfe9ff;
      --de-seed-ink-warn: #ffe1c4;
      --de-seed-bd: rgba(0, 212, 255, 0.42);
      --de-seed-bd-warn: rgba(255, 169, 77, 0.55);
      --de-seed-bg-1: rgba(0, 212, 255, 0.16);
      --de-seed-bg-2: rgba(59, 130, 246, 0.10);
      --de-seed-bg-warn-1: rgba(255, 169, 77, 0.18);
      --de-seed-bg-warn-2: rgba(255, 107, 107, 0.12);
      /* ---- 尺度（两主题共用） ---- */
      --de-touch: 32px;                    /* 触控下限（项目约定，非 44px）；按钮 / chip / 搜索框用 */
      --de-cell-h: 30px;                   /* 网格单元格输入框（账龄 / 维度）：行高 = 30 + 2×1px padding = 32px。
                                              原与 --de-touch 同为 32px → 行高 38px，同屏可见行被压到 18/120。
                                              30px 仍高于 WCAG 2.5.8(AA) 的 24px 触控下限，换取 +22% 同屏行数。 */
      --de-chrome-h: 143px;                /* 页头 65 + 页签 60 + 内边距 18 */
      --de-ag-scroll-h: clamp(280px, calc(100vh - 372px), 760px);  /* 账龄台账表格滚动容器（P0-2 U-2）。
                                              取值推导（1920×1080 实测）：#dwBody 可用 1015−18−26=971，
                                              表格以上 chrome 184 + 表格以下 79 → 容器 708；再留 12px 余量防外层滚动。 */
      --de-dim-scroll-h: clamp(260px, calc(100vh - 420px), 700px); /* 维度数据表格滚动容器（P0-2 U-2）。
                                              维度页表格以上 chrome 227 + 以下 80（F5 收回 131px 后）→ 容器 664，留余量。 */
      /* ---- U-10 录入状态胶囊 ---- */
      --de-chip-bg: rgba(0, 212, 255, 0.10);
      --de-chip-bd: rgba(120, 150, 200, 0.28);
      --de-chip-ink: #9db4d8;
      --de-ok-bg: rgba(16, 185, 129, 0.12);
      --de-ok-bd: rgba(16, 185, 129, 0.40);
      --de-ok-ink: #10b981;
      --de-bad-bg: rgba(255, 107, 107, 0.12);
      --de-bad-bd: rgba(255, 107, 107, 0.40);
      --de-bad-ink: #ff6b6b;
      /* ---- U-2 维度数据 TAB（管理维度）----
         与既有 --de-ok-* / --de-bad-* / --input-bg / --line 复用配合，
         故只新增「墨色」与「提示条底色」两类共 7 枚。 */
      --de-dim-ink: #e6f0ff;               /* 卡内标题 / 汇总金额 */
      --de-dim-ink-2: #dbe7fb;             /* 表格正文 / 提示条正文 */
      --de-dim-ink-3: #8ea6cd;             /* 次级说明（表头副标题 / 日期脚注）；表头浅底上 4.81:1 */
      --de-dim-gold: #fbbf24;              /* 强调：结构行 / 关键约束 */
      --de-dim-accent: #9bd0ff;            /* 已录行数计数 */
      --de-dim-tip-bg: rgba(245, 158, 11, 0.07);
      /* ---- P1-4 预算目标 TAB 工具条 / 口径标签（原为内联硬编码，浅色不可读）---- */
      --de-bud-bar-bg: rgba(24, 40, 70, 0.5);
      --de-bud-bar-bd: rgba(120, 150, 200, 0.15);
      --de-bud-fill-bg: rgba(13, 28, 58, 0.9);
      --de-bud-fill-bd: rgba(120, 150, 200, 0.3);
      --de-bud-fill-ink: #d6e4ff;
      --de-bud-hint-ink: #f5c451;
      --de-bud-hint-bd: rgba(245, 196, 81, 0.45);
      --de-bud-hint-bg: rgba(245, 196, 81, 0.1);
      /* ---- U-13 主按钮渐变（深色主题为亮青渐变 → 墨字而非白字） ---- */
      --de-btn-primary-a: #00d4ff;
      --de-btn-primary-b: #0098ff;
      --de-btn-primary-ink: #062634;   /* 亮青渐变均值 #00b6ff 上 6.85:1（白字仅 2.3:1） */
      /* ---- 收入双口径对账（--de-recon-* · 2026-09-11 P0-3；展示层，不接入评分） ---- */
      --de-recon-ok-bg: rgba(16, 185, 129, 0.12);
      --de-recon-ok-bd: rgba(16, 185, 129, 0.42);
      --de-recon-ok-ink: #34d399;
      --de-recon-warn-bg: rgba(245, 158, 11, 0.12);
      --de-recon-warn-bd: rgba(245, 158, 11, 0.42);
      --de-recon-warn-ink: #fbbf24;
      --de-recon-mut-bg: rgba(120, 150, 200, 0.10);
      --de-recon-mut-bd: rgba(120, 150, 200, 0.30);
      --de-recon-mut-ink: #9db4d8;
      --de-recon-ink: #e6f0ff;
      --de-recon-ink-2: #dbe7fb;
      --de-recon-ink-3: #8ea6cd;
      /* ---- U-1 账龄台账录入网格（--de-ag-*）· 深色分支 = 原渲染层内联硬编码值，逐一相同
              → 由内联色值迁移而来的令牌在深色主题零变化；浅色分支见 html[data-theme="light"] 同名块 ---- */
      --de-ag-input-bg: rgba(15, 25, 45, 0.7);      /* 客户名输入框底（原内联 rgba(15,25,45,.7)） */
      --de-ag-input-bd: rgba(120, 150, 200, 0.28);  /* 输入框描边（原内联 rgba(120,150,200,.28)） */
      --de-ag-input-ink: #e6f0ff;                   /* 输入框文字（原内联 #e6f0ff） */
      --de-ag-total-ink: #9bd0ff;                   /* 行合计（原内联 #9bd0ff；浅底仅 1.56:1 → P0-1） */
      --de-ag-del-bg: rgba(239, 68, 68, 0.12);      /* 删除按钮底（原内联） */
      --de-ag-del-bd: rgba(239, 68, 68, 0.4);       /* 删除按钮描边（原内联） */
      --de-ag-del-ink: #f87171;                     /* 删除按钮文字（原内联） */
      --de-ag-rate-ink: #a8bdd9;                    /* 表头计提比例小字：原走 --aa-faint #8494ab → 深底仅 4.34:1 */
      --de-ag-badge-ink: #e6f0ff;
      --de-ag-msg-ok: #7ee2a8;                      /* 成功消息（原内联 #7ee2a8，深色零变化） */
      --de-ag-msg-bad: #ff8f8f;                     /* 错误消息（原内联 #ff8f8f） */
      --de-ag-msg-info: #7f9bc4;                    /* 提示消息（原内联 #7f9bc4） */
      --de-ag-badge-ink: #e6f0ff;                   /* 未录入状态徽标文字 */
      /* ---- U-1/U-4/U-5/U-7/U-12 录入网格通用令牌（--de-grid-*，账龄台账与维度数据共用） ---- */
      --de-grid-input-bg: rgba(15, 25, 45, 0.7);
      --de-grid-input-bd: rgba(120, 150, 200, 0.28);
      --de-grid-input-ink: #e6f0ff;
      --de-grid-tools-bg: rgba(24, 40, 70, 0.45);
      --de-grid-hit-bg: rgba(0, 212, 255, 0.10);
      --de-grid-tfoot-bg: #16243d;
      --de-grid-head-bg: #16243d;                   /* 冻结表头不透明底（原半透明 → 滚动时透字） */
      --de-grid-stick-bg: #16243d;                  /* 冻结首列不透明底 */
      /* ---- U-1 次级按钮（.de-btn-ghost-primary）墨色令牌 ----
         原实现 color/border-color: var(--primary)（#00d4ff）——浅色分支刻意不覆盖语义色，
         故浅色白底上仅 1.69:1。深色取值 = 原 var(--primary)，深色零变化；禁改 --primary 本身。 */
      --de-btn-ghost-primary-ink: #00d4ff;
      --de-btn-ghost-primary-bd: #00d4ff;
      /* ---- 维度提示条描边：原引用**未定义**令牌 --de-dim-tip-bd → 该 border 声明整条失效、边框从不渲染 ---- */
      --de-dim-tip-bd: rgba(245, 158, 11, 0.28);
      /* ---- U-1 范围扩展：账龄台账「月度推进 / 坏账核销 / 推进日志」子面板（--de-ag-* 续）
         · 深色分支 = 原渲染层内联硬编码值，逐一相同 → 深色像素零变化
         · 浅色分支为新增（原内联值为深色主题色，浅底上仅 1.19~2.9:1） ---- */
      --de-ag-ink-1: #dbe7fb;                       /* 面板标题 / 表体主文字（原内联 #dbe7fb） */
      --de-ag-ink-2: #c3d4ef;                       /* 标签 / 小节标题 / 关闭按钮（原内联 #c3d4ef） */
      --de-ag-ink-3: #9db4d8;                       /* 备注文字（原内联 #9db4d8） */
      --de-ag-ink-mut: #94a3b8;                     /* 中性/持平态（原内联 #94a3b8；原 #64748b 深底仅 2.7:1 → 统一到本取值） */
      --de-ag-link-ink: #7fb0ff;                    /* 蓝色按钮文字（原内联 #7fb0ff） */
      --de-ag-ok-ink: #4ade80;                      /* 绿色按钮文字（原内联 #4ade80） */
      --de-ag-ok-bd: #22c55e;                       /* 绿色按钮描边（原内联 #22c55e） */
      --de-ag-ok-bd-2: rgba(34, 197, 94, 0.3);      /* 绿色卡片描边（原内联） */
      --de-ag-ok-bd-3: rgba(126, 226, 168, 0.5);    /* 收回徽标描边（原内联） */
      --de-ag-ok-bg: rgba(34, 197, 94, 0.12);       /* 绿色按钮底（原内联） */
      --de-ag-ok-fill: #15824e;                     /* 绿色实心按钮底：原 rgba(34,197,94,.85) 叠深底配白字仅 2.93:1 → 改不透明深绿 4.84:1（第三轮 P2-1，消费点仅 app.js:9058） */
      --de-ag-warn-ink: #fbbf24;                    /* 警示黄（原内联 #fbbf24 / #fcd34d） */
      --de-ag-warn-ink-2: #f59e0b;                  /* 警示橙（原内联 #f59e0b） */
      --de-ag-warn-bd: rgba(245, 158, 11, 0.4);     /* 警告条描边（原内联） */
      --de-ag-bad-ink-2: #ffb4b4;                   /* 核销小节标题（原内联 #ffb4b4） */
      --de-ag-bad-bd-2: rgba(239, 68, 68, 0.3);     /* 红色卡片描边（原内联） */
      --de-ag-bad-bd-3: rgba(248, 113, 113, 0.5);   /* 核销徽标描边（原内联） */
      --de-ag-bad-fill: rgba(239, 68, 68, 0.8);     /* 红色实心按钮底（原内联） */
      --de-ag-fill-ink: #ffffff;                    /* 实心按钮上的文字（原内联 #fff） */
      --de-ag-input-bg-2: rgba(15, 25, 45, 0.6);    /* 「推进到」日期输入底（原内联） */
      --de-ag-input-bg-3: rgba(10, 18, 34, 0.7);    /* 坏账下拉/数字/备注输入底（原内联） */
      --de-ag-input-bg-mut: rgba(15, 25, 45, 0.35); /* 只读客户名输入底（原内联） */
      --de-ag-bar-bg: rgba(15, 25, 45, 0.45);       /* 坏账录入行条底（原内联） */
      --de-ag-card-bg: rgba(24, 40, 70, 0.55);      /* 坏账指标卡底（原内联） */
      --de-ag-card-bg-2: rgba(24, 40, 70, 0.5);     /* 预演结果卡底（原内联） */
      --de-ag-thead-bg: rgba(59, 123, 255, 0.12);   /* 子面板表头底（原内联） */
      --de-ag-blue-bg: rgba(59, 123, 255, 0.18);    /* 蓝色按钮底（原内联） */
      --de-ag-blue-bd: #3b7bff;                     /* 蓝色按钮描边（原内联） */
      --de-ag-btn-ghost-bg: rgba(255, 255, 255, 0.05); /* 幽灵按钮底（原内联） */
      --de-ag-bd-1: rgba(120, 150, 200, 0.12);      /* 表格行分隔线（原内联） */
      --de-ag-bd-2: rgba(120, 150, 200, 0.18);      /* 面板上边线 / 卡片描边（原内联） */
      --de-ag-bd-3: rgba(120, 150, 200, 0.2);       /* 滚动区描边（原内联） */
      --de-ag-bd-4: rgba(120, 150, 200, 0.3);       /* 输入框描边（原内联） */
      --de-ag-bd-5: rgba(120, 150, 200, 0.35);      /* 幽灵按钮描边（原内联） */
      /* ---- 数据录入 · 维度数据「区域维度」（T01–T05 · 2026-09-11）令牌 · 深色分支 ----
         区域目录 = 结构（只读现算）；金额由「客户」二级归属汇总得出 → 区域行金额不可填。 ---- */
      --de-dim-rg-panel-bg: rgba(24, 40, 70, 0.55);      /* 候选面板底 */
      --de-dim-rg-panel-bd: rgba(120, 150, 200, 0.28);   /* 候选面板描边 */
      --de-dim-rg-item-bg: rgba(15, 25, 45, 0.7);        /* 候选标签 / 选择框底 */
      --de-dim-rg-item-bd: rgba(120, 150, 200, 0.28);    /* 候选标签 / 选择框描边 */
      --de-dim-rg-item-hover-bg: rgba(0, 212, 255, 0.10);/* 候选标签悬停底 */
      --de-dim-rg-item-ink: #e6f0ff;                     /* 候选标签 / 选择框文字 */
      --de-dim-rg-unassigned-bg: rgba(120, 150, 200, 0.10);/* 未分配虚拟行底 */
      --de-dim-rg-unassigned-bd: rgba(120, 150, 200, 0.30);/* 未分配虚拟行描边 */
      --de-dim-rg-unassigned-ink: #9db4d8;               /* 未分配虚拟行文字 */
      --de-dim-rg-badge-bg: rgba(0, 212, 255, 0.10);     /* 来源徽章底 */
      --de-dim-rg-badge-bd: rgba(0, 212, 255, 0.42);     /* 来源徽章描边 */
      --de-dim-rg-badge-ink: #bfe9ff;                    /* 来源徽章文字 */
      --de-dim-rg-baseline-bg: rgba(24, 40, 70, 0.5);    /* 迁移前基线折叠区底 */
      --de-dim-rg-baseline-bd: rgba(120, 150, 200, 0.30);/* 迁移前基线描边 */
      --de-dim-rg-baseline-ink: #dbe7fb;                 /* 迁移前基线正文 */
      --de-dim-rg-note-ink: #8ea6cd;                     /* 次级说明墨色 */
      --de-dim-rg-mig-bg: rgba(24, 40, 70, 0.55);        /* 迁移向导底 */
      --de-dim-rg-mig-bd: rgba(245, 158, 11, 0.4);       /* 迁移向导描边（警示黄） */
      --de-dim-rg-mig-head-ink: #fbbf24;                 /* 迁移向导标题墨色 */
      --de-dim-rg-ro-ink: #8ea6cd;                       /* 只读单元格文字 */
      --de-dim-rg-ro-bg: rgba(15, 25, 45, 0.35);         /* 只读单元格底 */
      /* ---- 2026-09-12 诉求⑤：浮层 / 模态投影与遮罩（深浅双赋值，禁内联色值） ---- */
      --de-dim-rg-pop-shadow: 0 18px 48px rgba(0, 0, 0, 0.42);     /* 操作说明浮层投影 */
      --de-dim-rg-pop-shadow-lg: 0 24px 64px rgba(0, 0, 0, 0.45);  /* 候选面板模态投影 */
      --de-dim-rg-mask-bg: rgba(4, 10, 22, 0.55);                  /* 模态遮罩底 */
      /* ---- 批次② 覆盖率提示条（T09 · 橙=未覆盖 / 绿=全覆盖） ---- */
      --de-dim-cov-warn-bg: rgba(251, 191, 36, 0.14);
      --de-dim-cov-warn-bd: rgba(251, 191, 36, 0.42);
      --de-dim-cov-warn-ink: #fbbf24;
      --de-dim-cov-ok-bg: rgba(52, 211, 153, 0.14);
      --de-dim-cov-ok-bd: rgba(52, 211, 153, 0.42);
      --de-dim-cov-ok-ink: #34d399;
      /* ---- 批次③ T11/T12/T15：只读占比 / 累计占比 / 上年同期列墨色 + 批量面板令牌 ---- */
      --de-dim-share-ink: #e6f0ff;                       /* 占比 / 累计占比 / 上年同期 列文字 */
      --de-dim-batch-bg: rgba(24, 40, 70, 0.55);         /* 批量改上级 / 分摊面板底 */
      --de-dim-batch-bd: rgba(120, 150, 200, 0.28);      /* 批量面板描边 */
      --de-dim-batch-head-ink: #bfe9ff;                  /* 批量面板标题墨色 */
      /* ---- 数据体检 .hc-* 深色令牌（深底浅字）---- */
      --hc-bg: rgba(15, 26, 48, 0.45);                  /* 卡片底色 */
      --hc-ink: #e6f0ff;                                /* 主文字 */
      --hc-ink-2: #c3d4ef;                              /* 次级文字 */
      --hc-ink-3: #7f9bc4;                              /* 提示文字 */
      --hc-title: #e6f0ff;                              /* 标题文字 */
      --hc-pass-ink: #7ee2a8;                           /* 通过状态 */
      --hc-pass-bg: rgba(34, 197, 94, 0.08);
      --hc-pass-bd: rgba(34, 197, 94, 0.25);
      --hc-warn-ink: #fbbf24;                           /* 存疑状态 */
      --hc-warn-bg: rgba(245, 158, 11, 0.08);
      --hc-warn-bd: rgba(245, 158, 11, 0.3);
      --hc-error-ink: #ff9b9b;                          /* 错误状态 */
      --hc-error-bg: rgba(239, 68, 68, 0.07);
      --hc-error-bd: rgba(239, 68, 68, 0.28);
      --hc-mut-ink: #94a3b8;                            /* 中性状态 */
      --hc-mut-bg: rgba(148, 163, 184, 0.08);
      --hc-mut-bd: rgba(148, 163, 184, 0.2);
      --hc-line: rgba(120, 150, 200, 0.14);            /* 分隔线 */
      /* ---- 第三轮 P0-1 / P2-1 令牌（深色分支 = 原值，深色像素零变化） ---- */
      --de-ag-policy-card-bg: rgba(15, 26, 48, 0.45);    /* 计提政策卡内衬底（= 原 .aging-policy-card-inner 内联值，深色不动） */
      --de-btn-danger-ink: #ff6b6b;                      /* 危险按钮墨色（= 原 var(--danger)，深色不动） */
      /* ---- 杜邦分析 .dup-* 命名空间（T14=D-P1-3 主题化：深色为默认值，浅色由 [data-theme=light] 覆盖） ---- */
      --dup-bg: rgba(24, 40, 70, 0.55);            /* 主卡底 */
      --dup-bg-2: rgba(24, 40, 70, 0.5);           /* 三因子/五因子卡底 */
      --dup-bg-inset: rgba(24, 40, 70, 0.4);       /* SVG 瀑布/图内嵌底 */
      --dup-bg-soft: rgba(21, 45, 90, 0.35);       /* 行业基准单元底 */
      --dup-bg-soft2: rgba(21, 45, 90, 0.5);       /* 次级强调单元底 */
      --dup-bg-note: rgba(15, 25, 45, 0.45);       /* 输入/下拉底 */
      --dup-ink: #e6f0ff;                          /* 主数值文字 */
      --dup-ink-2: #c3d4ef;                        /* 卡标题文字 */
      --dup-ink-3: #9db4d8;                        /* 研判/正文次级 */
      --dup-mut: #7f9bc4;                          /* 次级文字/说明 */
      --dup-faint: var(--txt3);                    /* 弱说明（公式/脚注）★ B-3 补遗：原 #5a7399 是旧版 --txt3 的副本，归一 */
      --dup-red-ink: #ffb4b4;                      /* 危险红字 */
      --dup-line: rgba(120, 150, 200, 0.18);       /* 卡描边 */
      --dup-line-2: rgba(120, 150, 200, 0.15);     /* 细分描边 */
      --dup-line-soft: rgba(120, 150, 200, 0.14);  /* 更弱描边 */
      --dup-line-mid: rgba(120, 150, 200, 0.3);    /* 下拉/分隔 */
      --dup-line-softd: rgba(120, 150, 200, 0.4);  /* 图轴线 */
      --dup-rise: #7ee2a8;                         /* 正向（绿） */
      --dup-rise-2: #34d399;                       /* 瀑布正柱 */
      --dup-fall: #ff8f8f;                         /* 负向（红） */
      --dup-fall-2: #f87171;                       /* 瀑布负柱 */
      --dup-blue: #9bd0ff;                         /* 周转率强调 */
      --dup-blue-2: #a7c8ff;                       /* 当年 ROE 标签 */
      --dup-roe: #4f8cff;                          /* 当年 ROE 柱/描边 */
      --dup-purple: #c89bff;                       /* 权益乘数强调 */
      --dup-gold: #e8a13a;                         /* 注资金额强调 */
      --dup-gold-ink: #ffb36b;                     /* 注资/桥标题色 */
      --dup-gold-bg: rgba(233, 183, 102, 0.07);    /* 注资/桥提示底 */
      --dup-gold-line: rgba(233, 183, 102, 0.35);  /* 注资/桥描边 */
      --dup-green-bg: rgba(120, 200, 170, 0.07);   /* 行动卡底 */
      --dup-green-line: rgba(120, 200, 170, 0.35); /* 行动卡描边 */
      --dup-danger-bg: rgba(248, 113, 113, 0.08);  /* 净资产为负/风险卡底 */
      --dup-blue-line: rgba(120, 150, 200, 0.18);  /* 通用描边 */
      --dup-badge-good: #10b981;
      --dup-badge-mid: #3b82f6;
      --dup-badge-warn: #f59e0b;
      --dup-badge-bad: #ef4444;
      --dup-badge-na: #64748b;
      --dup-badge-ink: #ffffff;                    /* 彩色底（档位徽标 / 主按钮 / 选中页签）上的文字色 —— P2-G，明暗双主题同值 */
      --dup-btn-bg: #1a5fd0;                       /* 主按钮蓝 */
      --dup-tree-line: rgba(120, 150, 200, 0.34);  /* 杜邦树连线（T01 新增） */
      --dup-bench-track: rgba(24, 40, 70, 0.55);   /* 白话卡位置条轨道（T01 新增） */
      /* ---- 账龄分析 .aa-* 命名空间（2026-09-09 优化：历史趋势/迁移矩阵/准备金/到期预测） ---- */
      --aa-bg: rgba(24, 40, 70, 0.55);             /* 区块卡底 */
      --aa-bg-2: rgba(24, 40, 70, 0.5);            /* 次级底 */
      --aa-bg-soft: rgba(15, 25, 45, 0.45);        /* 表格/注记底 */
      --aa-ink: #dbe7fb;                           /* 主正文 */
      --aa-ink-2: #c3d4ef;                         /* 区块标题 */
      --aa-mut: #7f9bc4;                           /* 说明文字 */
      --aa-faint: #a8bdd9;                         /* 弱说明：原 #8494ab 与浅色同值 → 深底仅 4.34:1（两主题均不达标，修正） */
      --aa-head: #9bd0ff;                          /* 表头字 */
      --aa-head-bg: rgba(59, 123, 255, 0.12);      /* 表头底 */
      --aa-line: rgba(120, 150, 200, 0.2);         /* 区块描边 */
      --aa-line-2: rgba(120, 150, 200, 0.14);      /* 表内细分描边 */
      --aa-line-soft: rgba(120, 150, 200, 0.12);   /* 更弱描边 */
      --aa-diag: rgba(59, 123, 255, 0.18);         /* 迁移矩阵对角线（同档） */
      --aa-back: rgba(34, 197, 94, 0.1);           /* 迁移矩阵回退格 */
      --aa-fwd: rgba(245, 158, 11, 0.1);           /* 迁移矩阵滚入更老档格 */
      --aa-rowsum: rgba(120, 150, 200, 0.14);      /* 行/列合计底 */
      --aa-num-wo: #ff8f8f;                        /* 核销数字 */
      --aa-num-re: #7ee2a8;                        /* 收回数字 */
      --aa-rise: #10b981;                          /* 正向/改善 */
      --aa-fall: #ef4444;                          /* 负向/恶化 */
      --aa-gold: #fcd34d;                          /* 关注/逾期 */
      --aa-blue: #9bd0ff;                          /* 强调蓝 */
      --aa-wo-bg: rgba(239, 68, 68, 0.1);          /* 核销徽章底 */
      --aa-re-bg: rgba(34, 197, 94, 0.1);          /* 收回徽章底 */
      /* ---- 账龄分析容器级令牌（2026-09-11 UI/UX 优化 A1/C1：把 JS 内联硬编码墨色收编为语义令牌） ---- */
      --aa-card-bg: rgba(24, 40, 70, 0.55);        /* 指标卡 / 横幅 / 圆角块底 */
      --aa-card-bd: rgba(120, 150, 200, 0.18);     /* 卡片描边 */
      --aa-panel-bg: rgba(24, 40, 70, 0.4);        /* 容器 / 工具条底 */
      --aa-panel-bd: rgba(120, 150, 200, 0.16);    /* 容器描边 */
      --aa-soft-bg: rgba(24, 40, 70, 0.35);        /* 表头工具条 / 次级底 */
      --aa-input-bg: rgba(10, 18, 34, 0.65);       /* 输入框 / 下拉底 */
      --aa-input-bd: rgba(120, 150, 200, 0.3);     /* 输入框描边 */
      --aa-btn-bg: rgba(255, 255, 255, 0.05);      /* 次按钮底 */
      --aa-btn-bd: rgba(120, 150, 200, 0.35);      /* 次按钮描边 */
      --aa-primary-bd: #3b7bff;                    /* 主色描边 */
      --aa-primary-bg: rgba(59, 123, 255, 0.16);   /* 主色浅底 */
      --aa-primary-ink: #7fb0ff;                   /* 主色链接字 */
      --aa-ink-strong: #e6f0ff;                    /* 关键数字 / 强调字 */
      --aa-sub: #9db4d8;                           /* 次级正文 */
      --aa-track: rgba(120, 150, 200, 0.28);       /* 集中度条灰段 */
      --aa-table-stick-bg: #16243d;                /* 表格冻结列不透明底（遮住横滚内容） */
      --aa-ok-bg: rgba(34, 197, 94, 0.12);         /* 自洽 / 正常底 */
      --aa-ok-bd: rgba(34, 197, 94, 0.45);
      --aa-ok-line: #22c55e;
      --aa-ok-ink: #4ade80;
      --aa-warn-bg: rgba(245, 158, 11, 0.12);
      --aa-warn-bd: rgba(245, 158, 11, 0.5);
      --aa-warn-line: #f59e0b;
      --aa-warn-ink: #fbbf24;
      --aa-bad-bg: rgba(239, 68, 68, 0.12);
      --aa-bad-bd: rgba(239, 68, 68, 0.5);
      --aa-bad-line: #ef4444;
      --aa-bad-ink: #f87171;
      --aa-neutral-bg: rgba(148, 163, 184, 0.1);
      --aa-neutral-bd: rgba(120, 150, 200, 0.25);
      --aa-drawer-w: 1280px;                       /* 抽屉目标宽（窄屏由 min() 降级） */
      --aa-primary-fill: #1a5fd0;                  /* 主按钮填充（白字 ≥4.5:1） */
      --aa-fill-ink: #ffffff;                      /* 主按钮文字 */
      --aa-blue-2: #38bdf8;                        /* 次级强调（集中度 Top2-5 / 图例） */
      /* 字号 6 级（C1：收敛 10/10.5/11/11.5/12/12.5/13/16/17/21 十种为六级） */
      --aa-fs-1: 10.5px;
      --aa-fs-2: 11.5px;
      --aa-fs-3: 12.5px;
      --aa-fs-4: 13px;
      --aa-fs-5: 17px;
      --aa-fs-6: 21px;
      /* U-9 字号阶梯：多维分析页（含 JS 内联样式）只允许这 5 档 —— 原实现并存
         10.5/11/11.5/12/12.5/13/13.5/17/18 共 9 档，实际视觉差异不可辨、只增加不一致。 */
      --dim-fs-1: 11px;    /* 说明 · 脚注 · 表头 · 徽标 */
      --dim-fs-2: 12.5px;  /* 正文 · 表格 · 条内文字 */
      --dim-fs-3: 14px;    /* 区块标题 · 胶囊 · 结论条 */
      --dim-fs-4: 17px;    /* 数值位 */
      --dim-fs-5: 44px;    /* 空态图标（图形化字符，非正文） */
      /* ---- 多维分析 .dim-* 命名空间（2026-09-10 增量 P0-5/P2-5：13 区块主题化；深色=现内联色） ---- */
      --dim-bg: rgba(15, 26, 48, .45);             /* 区块主卡底（帕累托/双曲线/明细/监控/CTA） */
      --dim-bg-2: rgba(24, 40, 70, .5);            /* stat 卡/洞察灰卡底 */
      --dim-bg-soft: rgba(24, 40, 70, .4);         /* 内嵌次级灰底 */
      --dim-track: rgba(15, 26, 48, .6);           /* 条形图轨道 */
      --dim-ink: #e6f0ff;                          /* 主数值/区块标题 */
      --dim-ink-2: #c3d4ef;                        /* 次级正文/表头字 */
      --dim-ink-3: #9db4d8;                        /* 徽章/维度名 */
      --dim-mut: #7f9bc4;                          /* 说明文字 */
      --dim-faint: #94a3b8;                        /* 排名序号/弱说明 */
      --dim-faint-2: #7b93b8;                      /* SVG 刻度文字 / 占位 —：暗底 5.48:1 ✓（原 #5a7399 仅 3.55:1） */
      --dim-line: rgba(120, 150, 200, .15);        /* 卡描边 */
      --dim-line-2: rgba(120, 150, 200, .25);      /* 按钮/较强描边 */
      --dim-line-3: rgba(120, 150, 200, .08);      /* 表格行分隔 */
      --dim-rise: #7ee2a8;                         /* 正向字/绿字 */
      --dim-rise-2: #22c55e;                       /* 正向强调（reach80/勾选绿） */
      --dim-fall: #ff8f8f;                         /* 负向字 */
      --dim-fall-2: #f87171;                       /* 亏损/红色徽章 */
      --dim-fall-ink: #fca5a5;                     /* 红底块内红字 */
      --dim-blue: #7fb0ff;                         /* 蓝强调字（新进/CTA/资金占用） */
      --dim-blue-deep: #3b82f6;                    /* 蓝描边/条形主填充/按钮 */
      --dim-blue-bg: rgba(59, 123, 255, .18);      /* 激活蓝底/按钮底 */
      --dim-blue-line: rgba(59, 123, 255, .4);     /* 激活蓝描边 */
      --dim-gold: #fbbf24;                         /* 琥珀文字（跑输/累积%列） */
      --dim-gold-2: #f59e0b;                       /* 深琥珀（high 档） */
      --dim-gold-3: #fcd34d;                       /* 亮琥珀（激活档字） */
      --dim-amber-bg: rgba(245, 158, 11, .08);     /* 琥珀卡底/黄条底 */
      --dim-amber-line: rgba(245, 158, 11, .28);   /* 琥珀描边 */
      --dim-green-bg: rgba(34, 197, 94, .08);      /* 绿卡底 */
      --dim-green-line: rgba(34, 197, 94, .22);    /* 绿描边 */
      --dim-red-bg: rgba(239, 68, 68, .09);        /* 红卡底/亏损区 */
      --dim-red-line: rgba(239, 68, 68, .32);      /* 红描边 */
      --dim-sticky-bg: rgba(13, 23, 42, .94);      /* U-2 sticky 结论条底（半透明+模糊） */
      --dim-sticky-line: rgba(120, 150, 200, .22); /* U-2 sticky 分隔线 */
      --dim-th-bg: #0d1b34;                       /* U-7 表头/冻结列底（不透明，避免横向滚动时透字） */
      /* ---- 预算达成 .bud-* 命名空间（2026-09-11 UI/UX 优化 P0-1 令牌化；深色分支 = 原渲染层内联硬编码值，
              改令牌后深色主题视觉必须零变化。浅色分支见 html[data-theme="light"] 内同名块） ---- */
      --bud-bg: rgba(24, 40, 70, .5);              /* 区块主卡底（原内联 rgba(24,40,70,.5) ×16） */
      --bud-bg-2: rgba(15, 26, 48, .45);           /* 内嵌次级底 */
      --bud-bg-soft: rgba(24, 40, 70, .4);         /* 更弱底（胶囊/标签） */
      --bud-track: rgba(120, 150, 200, .16);       /* 进度条轨道 */
      --bud-line: rgba(120, 150, 200, .15);        /* 卡描边（原 rgba(120,150,200,.15)） */
      --bud-line-2: rgba(120, 150, 200, .25);      /* 较强描边（胶囊/按钮） */
      --bud-line-3: rgba(120, 150, 200, .18);      /* 表头与行分隔 */
      --bud-line-4: rgba(120, 150, 200, .14);      /* 脚注上边框 */
      --bud-ink: #e6f0ff;                          /* 一级墨色（原 #e6f0ff ×6） */
      --bud-ink-2: #dbe7fb;                        /* 二级墨色（原 #dbe7fb ×28） */
      --bud-ink-3: #c3d4ef;                        /* 三级墨色（原 #c3d4ef ×8） */
      --bud-mut: #7f9bc4;                          /* 说明文字（原 #7f9bc4 ×81） */
      --bud-faint: #94a3b8;                        /* 最弱/占位「—」：卡底 rgb(18,34,63) 上 6.22:1 ✓（原 #64748b 仅 3.33:1） */
      --bud-rise: #7ee2a8;                         /* 正向字（原 #7ee2a8 ×18） */
      --bud-fall: #ff8f8f;                         /* 负向字（原 #ff8f8f ×7） */
      --bud-gold: #f5c451;                         /* 警示琥珀字（原 #f5c451 ×1） */
      /* 语义四态 → 「令牌对」：条/描边走 *-bar（非文本，≥3:1）；卡面字色走 *-ink（≥4.5:1） */
      --bud-ok-bar: #22c55e;
      --bud-norm-bar: #3b82f6;
      --bud-warn-bar: #f59e0b;
      --bud-bad-bar: #ef4444;
      --bud-ok-ink: #7ee2a8;
      --bud-norm-ink: #7fb0ff;
      --bud-warn-ink: #fbbf24;
      --bud-bad-ink: #ff8f8f;
      /* KPI 卡两主题均为深蓝渐变底（品牌刻意保留），故 *-kpi-* 四色两主题同值、互不覆盖 */
      --bud-kpi-ok: #7ee2a8;
      --bud-kpi-norm: #8ab8ff;                     /* 原 #3b82f6 在中灰底上仅 4.31:1 → 提亮至 ≥5.1:1 */
      --bud-kpi-warn: #fbbf24;
      --bud-kpi-bad: #ff8f8f;
      --bud-kpi-bg-1: rgba(22, 46, 92, .9);        /* KPI 卡渐变起（原内联值） */
      --bud-kpi-bg-2: rgba(13, 28, 58, .9);        /* KPI 卡渐变止（原内联值） */
      --bud-kpi-ink: #93a9c9;                      /* KPI 卡内次级墨（原 #7f9bc4 浅色底仅 3.97:1） */
      --bud-kpi-line: rgba(120, 150, 200, .18);    /* KPI 卡中性描边 */
      --bud-sticky-bg: rgba(13, 23, 42, .94);      /* 吸顶风险条底 */
      --bud-sticky-line: rgba(120, 150, 200, .22);
      --bud-th-bg: #0d1b34;                        /* 表头 / 冻结列底（不透明，横向滚动时不透字） */
      --bud-focus: #7fb0ff;                        /* 焦点环 */
      --bud-touch: 32px;                           /* 触控下限（项目约定 32px，非 44px） */
      /* 字号收敛 6 档（P2-2：原 8 档 10/10.5/11/11.5/12/12.5/13/26；下限 12px → DOM <12px 元素归零） */
      --bud-fs-1: 12px;    /* 脚注 · 表头 · 徽标 · 次级说明 */
      --bud-fs-2: 13px;    /* 正文 · 表格单元格 */
      --bud-fs-3: 14px;    /* 区块标题 · 胶囊 */
      --bud-fs-4: 16px;    /* 强调数值 */
      --bud-fs-5: 20px;    /* 中数值 */
      --bud-fs-6: 26px;    /* KPI 主值 */
      --dim-btn: #1a5fd0;                          /* 主按钮底 */
    }

    /* ==========================================================================
     * 浅色主题（html[data-theme="light"]）
     * 由系统设置「界面主题」切换，localStorage 持久化。
     * 通过覆盖主题令牌变量实现全系统浅色；个别深色硬编码元素在下方补覆盖。
     * 语义色（--primary/--warning/--success/--danger）两主题共用，保持不变。
     * ========================================================================== */
    html[data-theme="light"] {
      /* 涨跌色 → 浅色主题直接复用语义墨色（单一真源）。
         ★ 2026-09-13（走查阻塞项 B-3 补遗）：原各自硬编码 #059669 / #dc2626，
         在 10px 涨跌小字（.structure-metric-change / .expense-metric-change / .metric .v）上
         仅 3.41:1 / 4.38:1，均低于正文门槛 4.5:1。深色分支本就是 --rise: var(--success)/
         --fall: var(--danger) 的委托写法，浅色分支现与之对称。 */
      --rise: var(--success-ink);
      --fall: var(--danger-ink);
      /* 经营诊断 .odi-* warn 文字色：浅色主题专用深琥珀（白底对比度 ≈5.0:1 ≥ AA 4.5:1）；
         ⚠ 仅覆盖本命名空间令牌，不动全站语义色 --warning（#ffa94d，色块/边框仍沿用）。 */
      --odi-warn-ink: #b45309;
      /* 经营诊断 .odi-* 2026-09-11 补令牌（浅色分支）：CTA 文字 ≈5.3:1 / 三级小字 ≈5.0:1，
         均在浅色面板底 #f8fbff 上满足 AA 正文 4.5:1；轨道底取半透明浅色以便与面板区分。 */
      --odi-link-ink: #0b6ba8;
      --odi-ink3: #5f6f88;
      --odi-track: rgba(246, 250, 255, 0.85);
      /* 文字 → 深色（浅色背景必需）
         ★ 2026-09-13（走查阻塞项 B-3）：--txt3 由 #8494ab（面板上仅 2.97:1）调深至 #5a6c85。
         全站 83 处 var(--txt3) 中绝大多数是 10.5–12px 提示小字，小字无大字号豁免，
         原值连 3:1 都不到；调深后浅色面板 ≈4.9:1，语义仍是「三级弱化字」——改的是可读性，不是层次。 */
      --txt: #1c2b45; --txt2: #55657f; --txt3: #5a6c85;
      /* 语义色 · 文字墨色（浅色分支）：均过 AA 4.5:1
         ★ 2026-09-13（走查阻塞项 B-2 补遗）：--success-ink 由 #047857 再调深至 #036e4f —
         原值在「同色系 12% 底」的芯片上（.oh-level-chip.excellent，底 rgb(212,236,235)）仅 4.44:1，
         差 0.06 未过线；调深后 5.08:1，且在纯面板底上由 4.93 → 5.64:1。
         新增 --primary-ink / --info-ink，补齐 --*-ink 词族的第 4、5 档：
         浅色值取项目既有深色强调色同一族（#0b63c4 同 --focus-ring / --de-ink-accent；#8f5600 为深琥珀）。
         ⚠ 禁止用「统一改成中性色」的方式回避对比度 —— 那等于取消红黄绿语义（走查规范项 F-3）。 */
      --success-ink: #036e4f;
      --warning-ink: #8a5300;
      --danger-ink: #b91c1c;
      --primary-ink: #0b63c4;
      --info-ink: #8f5600;
      --focus-ring: #0b63c4;
      /* 边框 */
      --line: #d8e1ef; --line2: rgba(90, 130, 220, 0.26);
      /* 背景令牌 → 浅色 */
      --body-bg: #eaf0f8;
      --vp-bg-1: #e7eef8; --vp-bg-2: #dce6f3; --vp-bg-3: #d1dcec;
      --dw-bg-1: #ffffff; --dw-bg-2: #f1f6fc;
      --lic-bg-1: #ffffff; --lic-bg-2: #f1f6fc;
      --th-bg-1: #e9f0fa; --th-bg-2: #dce7f4;
      --opt-bg: #ffffff; --sel-bg: #ffffff;
      --bg1: #e7eef8; --bg2: #dce6f3;
      /* RGB 通道 → 浅色面板基色 */
      --c-r: 250; --c-g: 252; --c-b: 255;
      --k-r: 252; --k-g: 254; --k-b: 255;
      --h-r: 255; --h-g: 255; --h-b: 255;
      --p-r: 246; --p-g: 250; --p-b: 255;
      --i-r: 255; --i-g: 255; --i-b: 255;
      --d-r: 234; --d-g: 240; --d-b: 250;
      --d2-r: 232; --d2-g: 238; --d2-b: 248;
      --t-r: 150; --t-g: 160; --t-b: 180;
      --t2-r: 140; --t2-g: 150; --t2-b: 170;
      /* 输入框 */
      --input-bg: #ffffff;
      /* 全屏遮罩在浅色下更浅 */
      /* 数据录入 .de-* 浅色覆盖 */
      --de-cell-bg: #ffffff;
      --de-cell-border: var(--line);
      --de-cell-border-focus: var(--primary);
      --de-cat-bg: rgba(0, 150, 255, 0.08);
      --de-zebra: rgba(0, 0, 0, 0.022);
      --de-colitem-bg: #ffffff;
      --de-summary-bg: rgba(0, 0, 0, 0.03);
      --de-fill: rgba(0, 150, 255, 0.12);
      --de-primary-soft: rgba(0, 150, 255, 0.18);
      --de-ink-accent: #0b63c4;            /* 分类序号：分类行底 4.82:1 */
      --de-ink-sum: #0b63c4;               /* 分类行合计：月合计底 5.22:1 */
      --de-tab-ink-on: #0b63c4;            /* 激活页签：页签底 5.57:1 */
      --de-tab-ink-off: #55657f;           /* 非激活页签：5.64:1 */
      --de-unit-ink: #55657f;              /* 表头「（万元）」：col-item 底 #e3ecf7 上 4.95:1 */
      --de-note-ink: #55657f;              /* 跨模块次级说明墨色：白底 4.95:1 / 琥珀淡底 5.03:1 */
      --de-seed-ink: #0b4f86;              /* 空态正文：7.24:1 */
      --de-seed-ink-warn: #7a4006;         /* 升级态正文：6.95:1 */
      --de-seed-bd: rgba(0, 120, 210, 0.38);
      --de-seed-bd-warn: rgba(196, 110, 20, 0.45);
      --de-seed-bg-1: rgba(0, 120, 210, 0.10);
      --de-seed-bg-2: rgba(59, 130, 246, 0.06);
      --de-seed-bg-warn-1: rgba(255, 169, 77, 0.16);
      --de-seed-bg-warn-2: rgba(255, 107, 107, 0.08);
      --de-chip-bg: rgba(0, 120, 210, 0.07);
      --de-chip-bd: rgba(120, 150, 200, 0.42);
      --de-chip-ink: #4a5a75;              /* 约 7:1 */
      --de-ok-bg: rgba(10, 107, 61, 0.08);
      --de-ok-bd: rgba(10, 107, 61, 0.35);
      --de-ok-ink: #0f7a4a;                /* 6.4:1 */
      --de-bad-bg: rgba(198, 40, 40, 0.08);
      --de-bad-bd: rgba(198, 40, 40, 0.32);
      --de-bad-ink: #c62828;               /* 6.3:1 */
      /* ---- U-2 维度数据 TAB（管理维度）浅色覆盖 ---- */
      --de-dim-ink: #1c2b45;               /* 卡内标题 / 汇总金额：15.2:1 */
      --de-dim-ink-2: #243352;             /* 表格正文：12.9:1 */
      --de-dim-ink-3: #55657f;             /* 次级说明：5.6:1 */
      --de-dim-gold: #8a5300;              /* 强调：5.9:1 */
      --de-dim-accent: #0b63c4;            /* 已录计数：5.7:1 */
      --de-dim-tip-bg: #fff8ec;
      /* ---- P1-4 预算目标 TAB 工具条 浅色覆盖 ---- */
      --de-bud-bar-bg: #f2f7ff;
      --de-bud-bar-bd: #d5e2f5;
      --de-bud-fill-bg: #ffffff;
      --de-bud-fill-bd: #c3d4ef;
      --de-bud-fill-ink: #1c2b45;              /* 14.2:1 */
      --de-bud-hint-ink: #8a5300;              /* 6.0:1 */
      --de-bud-hint-bd: #f0cf9a;
      --de-bud-hint-bg: #fff8ec;
      --de-btn-primary-a: #1259ad;
      --de-btn-primary-b: #0b63c4;
      --de-btn-primary-ink: #ffffff;   /* 渐变均值 #0e5eb8 上白字 6.33:1 */
      /* ---- 收入双口径对账 浅色覆盖 ---- */
      --de-recon-ok-bg: rgba(10, 107, 61, 0.08);
      --de-recon-ok-bd: rgba(10, 107, 61, 0.35);
      --de-recon-ok-ink: #0f7a4a;
      --de-recon-warn-bg: rgba(180, 83, 9, 0.08);
      --de-recon-warn-bd: rgba(180, 83, 9, 0.34);
      --de-recon-warn-ink: #8a5300;
      --de-recon-mut-bg: rgba(90, 130, 220, 0.07);
      --de-recon-mut-bd: rgba(120, 150, 200, 0.42);
      --de-recon-mut-ink: #55657f;
      --de-recon-ink: #1c2b45;
      --de-recon-ink-2: #243352;
      --de-recon-ink-3: #55657f;
      /* ---- U-1 账龄台账录入网格 浅色覆盖（白底深字，正文 ≥4.5:1） ---- */
      --de-ag-input-bg: #ffffff;
      --de-ag-input-bd: #c3d4ef;
      --de-ag-input-ink: #1c2b45;                  /* 15.2:1 */
      --de-ag-total-ink: #0b63c4;                  /* 行合计：白底 5.84:1 / 合计底 #eef3fb 5.24:1（原 #9bd0ff 仅 1.56:1） */
      --de-ag-del-bg: rgba(198, 40, 40, 0.08);
      --de-ag-del-bd: rgba(198, 40, 40, 0.32);
      --de-ag-del-ink: #c62828;                    /* 6.3:1 */
      --de-ag-rate-ink: #55657f;                   /* 表头底 #eaf1fc 上 5.20:1（原 #8494ab 仅 2.72:1） */
      --de-ag-badge-ink: #1c2b45;
      --de-ag-msg-ok: #0f7a4a;                      /* 白底 5.0:1（原 #7ee2a8 仅 1.6:1） */
      --de-ag-msg-bad: #c62828;                     /* 白底 6.3:1（原 #ff8f8f 仅 2.2:1） */
      --de-ag-msg-info: #55657f;                    /* 白底 5.4:1（原 #7f9bc4 仅 2.9:1） */
      /* ---- U-1/U-4/U-5/U-7/U-12 录入网格通用令牌 浅色覆盖 ---- */
      --de-grid-input-bg: #ffffff;
      --de-grid-input-bd: #c3d4ef;
      --de-grid-input-ink: #1c2b45;
      --de-grid-tools-bg: #f2f7ff;
      --de-grid-hit-bg: rgba(0, 120, 210, 0.10);
      --de-grid-tfoot-bg: #eef3fb;
      --de-grid-head-bg: #eaf1fc;
      --de-grid-stick-bg: #ffffff;
      /* ---- U-1 次级按钮墨色 浅色覆盖 ---- */
      --de-btn-ghost-primary-ink: #0b63c4;         /* 白底 5.84:1（原 var(--primary) #00d4ff 仅 1.69:1） */
      --de-btn-ghost-primary-bd: #0b63c4;
      /* ---- 维度提示条描边 浅色覆盖 ---- */
      --de-dim-tip-bd: #f0cf9a;
      /* ---- U-1 范围扩展：账龄子面板浅色分支（白底 ≥4.5:1；原内联深色主题色仅 1.19~2.9:1） ---- */
      --de-ag-ink-1: #1b2b45;                       /* 15.1:1 */
      --de-ag-ink-2: #33456b;                       /* 10.1:1 */
      --de-ag-ink-3: #4a5a72;                       /* 7.4:1 */
      --de-ag-ink-mut: #64748b;                     /* 4.76:1 */
      --de-ag-link-ink: #0b63c4;                    /* 5.84:1 */
      --de-ag-ok-ink: #0f7a4a;                      /* 5.0:1 */
      --de-ag-ok-bd: #1a8c47;                       /* 4.1:1（描边非文字，按 3:1 图形阈值取） */
      --de-ag-ok-bd-2: rgba(15, 122, 74, 0.28);
      --de-ag-ok-bd-3: rgba(15, 122, 74, 0.35);
      --de-ag-ok-bg: rgba(15, 122, 74, 0.08);
      --de-ag-ok-fill: #157f4d;                     /* 实心按钮底，配 --de-ag-fill-ink 白字 5.0:1 */
      --de-ag-warn-ink: #9a6700;                    /* 5.0:1 */
      --de-ag-warn-ink-2: #b45309;                  /* 4.6:1 */
      --de-ag-warn-bd: #f0cf9a;
      --de-ag-bad-ink-2: #c62828;                   /* 6.3:1 */
      --de-ag-bad-bd-2: rgba(198, 40, 40, 0.28);
      --de-ag-bad-bd-3: rgba(198, 40, 40, 0.35);
      --de-ag-bad-fill: #c62828;                    /* 实心按钮底，配 --de-ag-fill-ink 白字 6.3:1 */
      --de-ag-fill-ink: #ffffff;
      --de-ag-input-bg-2: #ffffff;
      --de-ag-input-bg-3: #ffffff;
      --de-ag-input-bg-mut: #f7faff;
      --de-ag-bar-bg: #f4f8ff;
      --de-ag-card-bg: #f7faff;
      --de-ag-card-bg-2: #ffffff;
      --de-ag-thead-bg: #eaf1fc;
      --de-ag-blue-bg: rgba(11, 99, 196, 0.10);
      --de-ag-blue-bd: #0b63c4;
      --de-ag-btn-ghost-bg: #ffffff;
      --de-ag-bd-1: #e6ecf7;
      --de-ag-bd-2: #dfe7f6;
      --de-ag-bd-3: #dbe5f5;
      --de-ag-bd-4: #c7d4e8;
      --de-ag-bd-5: #c3d4ef;
      /* ---- 数据录入 · 维度数据「区域维度」浅色覆盖（白底深字，正文 ≥4.5:1） ---- */
      --de-dim-rg-panel-bg: #f7faff;
      --de-dim-rg-panel-bd: #c3d4ef;
      --de-dim-rg-item-bg: #ffffff;
      --de-dim-rg-item-bd: #c3d4ef;
      --de-dim-rg-item-hover-bg: rgba(0, 120, 210, 0.10);
      --de-dim-rg-item-ink: #1c2b45;                     /* 15.2:1 */
      --de-dim-rg-unassigned-bg: rgba(90, 130, 220, 0.07);
      --de-dim-rg-unassigned-bd: rgba(120, 150, 200, 0.42);
      --de-dim-rg-unassigned-ink: #55657f;               /* 5.6:1 */
      --de-dim-rg-badge-bg: rgba(0, 120, 210, 0.07);
      --de-dim-rg-badge-bd: rgba(0, 120, 210, 0.38);
      --de-dim-rg-badge-ink: #0b4f86;                    /* 7.2:1 */
      --de-dim-rg-baseline-bg: #f7faff;
      --de-dim-rg-baseline-bd: #d5e2f5;
      --de-dim-rg-baseline-ink: #243352;                 /* 12.9:1 */
      --de-dim-rg-note-ink: #55657f;                     /* 5.6:1 */
      --de-dim-rg-mig-bg: #fff8ec;
      --de-dim-rg-mig-bd: #f0cf9a;
      --de-dim-rg-mig-head-ink: #8a5300;                 /* 6.0:1 */
      --de-dim-rg-ro-ink: #55657f;                       /* 5.6:1 */
      /* ★ 2026-09-12：区域/部门/产品 控件描边令牌的浅色侧（A2 要求 --de-dim-rg-* 深浅双向同集）。
         浅底改用深蓝 0,120,210（与浅色区既有 --de-dim-rg-badge-bd 同源）—— 原青色 #00d4ff
         叠白底近乎不可见（约 1.3:1），属可读性缺陷，故浅色侧不复用深色取值。 */
      --de-dim-rg-accent-bd: rgba(0, 120, 210, 0.35);
      --de-dim-rg-accent-bd-hi: rgba(0, 120, 210, 0.6);
      --de-dim-rg-ro-bg: #f2f7ff;
      --de-dim-rg-pop-shadow: 0 18px 48px rgba(15, 23, 42, 0.16);
      --de-dim-rg-pop-shadow-lg: 0 24px 64px rgba(15, 23, 42, 0.20);
      --de-dim-rg-mask-bg: rgba(15, 23, 42, 0.32);
      --de-dim-cov-warn-bg: #fff7e6;
      --de-dim-cov-warn-bd: #f0c36d;
      --de-dim-cov-warn-ink: #8a5300;   /* 6.0:1 on #fff7e6 */
      --de-dim-cov-ok-bg: #eafaf1;
      --de-dim-cov-ok-bd: #7fd0a5;
      --de-dim-cov-ok-ink: #0b6b3a;     /* 5.9:1 on #eafaf1 */
      --de-dim-share-ink: #1c2b45;      /* 15.2:1 */
      --de-dim-batch-bg: #ffffff;
      --de-dim-batch-bd: #c3d4ef;
      --de-dim-batch-head-ink: #0b4f86; /* 7.2:1 */
      /* ---- 第三轮 P0-1 / P2-1 令牌 浅色覆盖 ----
         P0-1 原 rgba(15,26,48,.45) 叠浅底合成中灰 rgb(138,146,160) → 卡内 24 处不达标（最低 1.14:1）
         P2-1 原 var(--danger) #ff6b6b 叠浅粉底 rgb(255,233,233) 仅 2.39:1 ---- */
      --de-ag-policy-card-bg: #ffffff;                   /* 不透明白：aa-mut 5.91 / ink-2 11.18 / num-wo 5.69 / primary-ink 6.70 全达标 */
      --de-btn-danger-ink: #b3261e;                      /* 浅粉底 5.63:1（hover 底 5.07:1） */
      /* ---- 杜邦 .dup-* 浅色覆盖（浅底深字，对比度达标） ---- */
      --dup-bg: #ffffff;
      --dup-bg-2: #f6f9fd;
      --dup-bg-inset: #f6f9fd;
      --dup-bg-soft: #eef3fb;
      --dup-bg-soft2: #e3ebf7;
      --dup-bg-note: #f6f8fc;
      --dup-ink: #1c2b45;
      --dup-ink-2: #2f3b55;
      --dup-ink-3: #44506b;
      --dup-mut: #55657f;
      --dup-faint: var(--txt3);                    /* ★ B-3 补遗：原 #8494ab 是旧版 --txt3 的副本，归一 */
      --dup-red-ink: #cf3b4a;
      --dup-line: #d8e1ef;
      --dup-line-2: #e3e9f2;
      --dup-line-soft: #e8eef6;
      --dup-line-mid: #c7d4e8;
      --dup-line-softd: #cbd8ea;
      --dup-rise: #0a7d60;
      --dup-rise-2: #059669;
      --dup-fall: #cf3b4a;
      --dup-fall-2: #dc2626;
      --dup-blue: #1d4ed8;
      --dup-blue-2: #1e40af;
      --dup-roe: #2563eb;
      --dup-purple: #7c3aed;
      --dup-gold: #9a6700;
      --dup-gold-ink: #b7791f;
      --dup-gold-bg: #fdf6e9;
      --dup-gold-line: #ead9ab;
      --dup-green-bg: #eef9f4;
      --dup-green-line: #b3dccb;
      --dup-danger-bg: #fdf1f1;
      --dup-blue-line: #d6e1f2;
      --dup-btn-bg: #1a5fd0;
      --dup-tree-line: #c7d4e8;                    /* 杜邦树连线（浅色，T01 新增） */
      --dup-bench-track: #eef3fb;                  /* 白话卡位置条轨道（浅色，T01 新增） */
      --dup-badge-ink: #ffffff;                    /* 彩色底上文字色（浅色主题同深色：徽标底色两套未分化 —— P2-G） */
      --aa-bg: #ffffff;
      --aa-bg-2: #f6f9fd;
      --aa-bg-soft: #f6f8fc;
      --aa-ink: #1c2b45;
      --aa-ink-2: #2f3b55;
      --aa-mut: #55657f;
      --aa-faint: #5b6b82;                         /* 弱说明：原 #8494ab 浅底 3.4:1 → 现白底 5.42:1 / #eaf1fc 上 4.78:1 */
      --aa-head: #1d4ed8;
      --aa-head-bg: #eaf1fc;
      --aa-line: #d8e1ef;
      --aa-line-2: #e3e9f2;
      --aa-line-soft: #e8eef6;
      --aa-diag: #dbe7fa;
      --aa-back: #e8f6ee;
      --aa-fwd: #fdf3e4;
      --aa-rowsum: #eef3fb;
      --aa-num-wo: #bf2f3d;                          /* 浅底深红：对 #fdf1f1 ≈ 5.2:1 */
      --aa-num-re: #0a7d60;
      --aa-rise: #047857;                          /* 浅底深绿：对 #fff ≈ 5.1:1（原 #059669 仅 3.6:1） */
      --aa-fall: #dc2626;
      --aa-gold: #9a6700;
      --aa-blue: #1d4ed8;
      --aa-wo-bg: #fdf1f1;
      --aa-re-bg: #eef9f4;
      /* ---- 账龄分析容器级令牌 · 浅色覆盖（2026-09-11 A1：白底深字，正文 ≥4.5:1） ---- */
      --aa-card-bg: #ffffff;
      --aa-card-bd: #d8e1ef;
      --aa-panel-bg: #f7fafd;
      --aa-panel-bd: #dbe4f0;
      --aa-soft-bg: #f1f5fb;
      --aa-input-bg: #ffffff;
      --aa-input-bd: #c7d4e8;
      --aa-btn-bg: #f4f7fc;
      --aa-btn-bd: #cbd8ea;
      --aa-primary-bd: #1d4ed8;
      --aa-primary-bg: #e8f0fe;
      --aa-primary-ink: #1d4ed8;
      --aa-primary-fill: #1d4ed8;
      --aa-fill-ink: #ffffff;
      --aa-blue-2: #0284c7;
      --aa-ink-strong: #101d33;
      --aa-sub: #46566f;
      --aa-track: #dde5f0;
      --aa-table-stick-bg: #ffffff;
      --aa-ok-bg: #e9f8ef;
      --aa-ok-bd: #a9dcbc;
      --aa-ok-line: #0a7d50;
      --aa-ok-ink: #0a7d50;
      --aa-warn-bg: #fdf5e6;
      --aa-warn-bd: #e8c98a;
      --aa-warn-line: #9a6700;
      --aa-warn-ink: #8a5a00;
      --aa-bad-bg: #fdeeee;
      --aa-bad-bd: #eeb0b0;
      --aa-bad-line: #b3261e;
      --aa-bad-ink: #b3261e;
      --aa-neutral-bg: #f1f5fa;
      --aa-neutral-bd: #d3dcea;
      /* ---- 多维分析 .dim-* 浅色覆盖（浅底深字，正文对比度 ≥ #55657f on #fff） ---- */
      --dim-bg: #ffffff;
      --dim-bg-2: #f6f9fd;
      --dim-bg-soft: #f6f9fd;
      --dim-track: #e6edf7;
      --dim-ink: #1c2b45;
      --dim-ink-2: #2f3b55;
      --dim-ink-3: #44506b;
      --dim-mut: #55657f;
      --dim-faint: #5b6b82;                        /* 辅助文字：白底 5.42:1 ✓（原 #8494ab 仅 3.09:1，命中 145 元素） */
      --dim-faint-2: #64748b;                      /* SVG 刻度/占位 —：白底 4.76:1 ✓（原 #8494ab 3.09:1） */
      --dim-line: #d8e1ef;
      --dim-line-2: #c7d4e8;
      /* ---- 数据体检 .hc-* 浅色覆盖（浅底深字，正文 ≥4.5:1）---- */
      --hc-bg: #ffffff;                               /* 卡片底色：浅色主题用白色 */
      --hc-ink: #1c2b45;                              /* 主文字：白底 15.2:1 */
      --hc-ink-2: #243352;                            /* 次级文字：白底 12.9:1 */
      --hc-ink-3: #55657f;                            /* 提示文字：白底 5.6:1 */
      --hc-title: #1c2b45;                            /* 标题文字：白底 15.2:1 */
      --hc-pass-ink: #0f7a4a;                         /* 通过状态：白底 5.0:1 */
      --hc-pass-bg: rgba(34, 197, 94, 0.08);
      --hc-pass-bd: rgba(34, 197, 94, 0.25);
      --hc-warn-ink: #b45309;                         /* 存疑状态：白底 4.6:1 */
      --hc-warn-bg: rgba(245, 158, 11, 0.08);
      --hc-warn-bd: rgba(245, 158, 11, 0.3);
      --hc-error-ink: #b91c1c;                        /* 错误状态：白底 5.3:1 */
      --hc-error-bg: rgba(239, 68, 68, 0.07);
      --hc-error-bd: rgba(239, 68, 68, 0.28);
      --hc-mut-ink: #55657f;                          /* 中性状态：白底 5.6:1 */
      --hc-mut-bg: rgba(148, 163, 184, 0.08);
      --hc-mut-bd: rgba(148, 163, 184, 0.2);
      --hc-line: rgba(120, 150, 200, 0.14);          /* 分隔线 */
      --dim-line-3: #e3e9f2;
      --dim-rise: #0a7d60;
      --dim-rise-2: #059669;
      --dim-fall: #c62f3f;                         /* 负向字：在 #fdf1f1 亏损区 4.91:1 ✓（原 #cf3b4a 仅 4.35:1，仅当存在亏损条目时才显形） */
      --dim-fall-2: #dc2626;
      --dim-fall-ink: #b3261e;
      --dim-blue: #1d4ed8;
      --dim-blue-deep: #1a5fd0;
      --dim-blue-bg: #eaf1fd;
      --dim-blue-line: #c5dbf7;
      --dim-gold: #8a5c00;                        /* 琥珀主字：在 #f6f9fd 承托卡上 5.2:1 ✓（原 #9a6700 实测 4.45:1 未过 AA） */
      --dim-gold-2: #96650a;                       /* 琥珀徽标文字：白底 5.05:1 ✓（原 #b7791f 3.64:1） */
      --dim-gold-3: #8a5205;                       /* 激活档字：在琥珀激活底上 5.15:1 ✓（原 #a16207 实测 3.99:1） */
      --dim-amber-bg: #fdf6e9;
      --dim-amber-line: #ead9ab;
      --dim-green-bg: #eef9f4;
      --dim-green-line: #b3dccb;
      --dim-red-bg: #fdf1f1;
      --dim-red-line: #f0c4c4;
      --dim-btn: #1a5fd0;
      --dim-sticky-bg: rgba(255, 255, 255, .95);   /* U-2 sticky 结论条底 */
      --dim-sticky-line: #dde5f0;                  /* U-2 sticky 分隔线 */
      /* ---- 预算达成 .bud-* 浅色覆盖（浅底深字，正文对比度 ≥4.5:1。
              KPI 渐变卡两主题均深底，其 *-kpi-* 令牌刻意不在本块覆盖） ---- */
      --bud-bg: #ffffff;                           /* 浅色卡底取不透明白：消除半透明混色导致的不确定中灰 */
      --bud-bg-2: #f6f9fd;
      --bud-bg-soft: #f6f9fd;
      --bud-track: #dde5f0;
      --bud-line: #d8e1ef;
      --bud-line-2: #c7d4e8;
      --bud-line-3: #e3e9f2;
      --bud-line-4: #e8eef6;
      --bud-ink: #1c2b45;
      --bud-ink-2: #2f3b55;
      --bud-ink-3: #44506b;
      --bud-mut: #55657f;                          /* 白底 6.34:1 ✓（原 #7f9bc4 白底仅 2.36:1） */
      --bud-faint: #5b6b82;                        /* 白底 5.42:1 ✓ */
      --bud-rise: #0a7d50;                         /* 白底 5.17:1 ✓ */
      --bud-fall: #b3261e;                         /* 白底 6.53:1 ✓ */
      --bud-gold: #8a5a00;                         /* 白底 5.93:1 ✓ */
      --bud-ok-bar: #059669;
      --bud-norm-bar: #2563eb;
      --bud-warn-bar: #d97706;
      --bud-bad-bar: #dc2626;
      --bud-ok-ink: #0a7d50;
      --bud-norm-ink: #1d4ed8;                     /* 白底 6.64:1 ✓ */
      --bud-warn-ink: #8a5a00;
      --bud-bad-ink: #b3261e;
      --bud-kpi-ink: #93a9c9;                      /* KPI 深底卡专用：亮底合成 rgb(41,58,93) 上 4.71:1 ✓ */
      --bud-sticky-bg: rgba(255, 255, 255, .96);
      --bud-sticky-line: #dde5f0;
      --bud-th-bg: #ffffff;
      --bud-focus: #1d4ed8;
      --dim-th-bg: #ffffff;                        /* U-7 表头/冻结列底 */
    }
    html[data-theme="light"] #mask {
      background: rgba(20, 32, 54, 0.42);
    }
    /* 浅色下强调文字（KPI 数值 / 面板标题 / 大标题）由深色白字转为深色 */
    /* ★ 2026-09-13：原列表中还有 .health-card .h-score 与 .oh-score 两项，已移除。
       它们把「四态档位色」一并压成中性深灰蓝（本段权重 0,3,1 > 状态类 0,3,0），
       是阻塞项 B-2 的直接成因。移除后中性色由两条基规则显式声明 var(--txt) 承担，
       状态类则走 --*-ink 令牌。 */
    html[data-theme="light"] .kpi .v,
    html[data-theme="light"] .metric .v,
    html[data-theme="light"] .dw-title,
    html[data-theme="light"] .settings-section-title,
    html[data-theme="light"] .p-ttl,
    html[data-theme="light"] .hd-c h1,
    html[data-theme="light"] .hd-c p,
    html[data-theme="light"] .menu-header h3,
    html[data-theme="light"] .license-product-name,
    html[data-theme="light"] .template-management-header h3,
    html[data-theme="light"] .indicator-definition-header h3 {
      color: var(--txt);
    }
    html[data-theme="light"] .hd-l b { color: #1c2b45; }
    html[data-theme="light"] .hd-l span { color: #55657f; }
    html[data-theme="light"] .kpi .k { color: #55657f; }
    html[data-theme="light"] .kpi .v small { color: #55657f; }
    html[data-theme="light"] .health-card .h-title { color: #1c2b45; }
    /* 只兜「无状态」的中性值；.pos/.neg 交给墨色令牌（否则本条 0,2,1 > 0,2,0 又会压掉语义色） */
    html[data-theme="light"] .cf-gauge-value:not(.pos):not(.neg) { color: var(--txt); }
    html[data-theme="light"] .cf-activity-name { color: #55657f; }
    html[data-theme="light"] .cf-sum-value { color: #1c2b45; }
    html[data-theme="light"] .alert-row .t { color: var(--txt3); }
    html[data-theme="light"] .alert-row .msg { color: #1c2b45; }
    html[data-theme="light"] .dw-sec { color: #1c2b45; }
    html[data-theme="light"] .tbl td { color: #33405a; }
    /* ★ 2026-09-13（走查阻塞项 B-3 补遗）：本覆盖块内 9 条规则原硬编码 #8494ab
       （白底 3.09:1、浅面板 ≈2.84:1），是「--txt3 浅色值调深」时被漏掉的同源副本 ——
       令牌已改而字面量未改，导致 .license-hint / .menu-section-title /
       .structure-metric-unit / .expense-metric-unit 四处实机渲染仍是 2.84:1（实测取证）。
       现一律委托 var(--txt3)，单一真源；其中 .alert-row .t / .tbl th 等原本已被后续规则覆盖的死规则
       一并归一，消除「同一语义两份字面量」的复发路径。 */
    html[data-theme="light"] .tbl th { color: var(--txt3); }
    html[data-theme="light"] .metric .k { color: var(--txt3); }
    /* 浅色主题下钻弹窗数据卡 .metric：背景改为干净白色（不再淡黄/淡蓝），深色模式保持深蓝不变 */
    html[data-theme="light"] .metric {
      background: #ffffff;
      border-color: #d8e1ef;
    }
    /* 弹出页面说明文字框样式 - 深色模式默认背景 */
    .dw-note-box {
      background: rgba(21, 45, 90, 0.25);
    }
    /* 浅色主题下弹出页面说明文字框淡黄色背景 */
    html[data-theme="light"] .dw-note-box {
      background: linear-gradient(135deg, rgba(255, 251, 235, 0.95), rgba(254, 243, 199, 0.85)) !important;
      border-color: rgba(245, 158, 11, 0.25) !important;
    }
    /* 浅色主题下指标说明栏淡黄色背景 */
    html[data-theme="light"] .indicator-explain-box {
      background: linear-gradient(135deg, rgba(255, 251, 235, 0.95), rgba(254, 243, 199, 0.85));
      border-left-color: #f59e0b;
    }
    html[data-theme="light"] .indicator-explain-box .indicator-name {
      color: #1c2b45;
    }
    html[data-theme="light"] .indicator-explain-box .indicator-detail {
      color: #55657f;
    }
    /* 浅色主题下预警内容栏淡黄色背景 */
    html[data-theme="light"] .alert-content-box {
      background: linear-gradient(135deg, rgba(255, 251, 235, 0.95), rgba(254, 243, 199, 0.85));
    }
    html[data-theme="light"] .alert-content-box .alert-msg {
      color: #1c2b45;
    }
    html[data-theme="light"] .alert-content-box .alert-detail {
      color: #55657f;
    }
    html[data-theme="light"] .data-entry-table th { color: #33405a; }
    html[data-theme="light"] .data-entry-table td { color: #44536b; }
    html[data-theme="light"] .data-entry-table tbody tr td.col-item { color: #1c2b45; }
    html[data-theme="light"] .settings-label { color: #1c2b45; }
    html[data-theme="light"] .quick-entry-label-name { color: #1c2b45; }
    html[data-theme="light"] .quick-entry-label-hint { color: var(--txt3); }
    html[data-theme="light"] .template-content h4 { color: #1c2b45; }
    html[data-theme="light"] .template-content li { color: #44536b; }
    html[data-theme="light"] .indicator-name-cell { color: #1c2b45; }
    html[data-theme="light"] .indicator-table td { color: #44536b; }
    html[data-theme="light"] .indicator-table th { color: var(--txt3); }
    html[data-theme="light"] .clear-item { color: #1c2b45; }
    html[data-theme="light"] .dimw-name { color: #1c2b45; }
    html[data-theme="light"] .license-status-label { color: #1c2b45; }
    html[data-theme="light"] .license-section-title { color: #1c2b45; }
    html[data-theme="light"] .license-info-value { color: #1c2b45; }
    html[data-theme="light"] .license-info-label { color: var(--txt3); }
    html[data-theme="light"] .license-hint { color: var(--txt3); }
    html[data-theme="light"] .license-legal-links a { color: #1f4fd6; }
    html[data-theme="light"] .license-legal-links a:hover { color: #143a9e; }
    html[data-theme="light"] .menu-section-title { color: var(--txt3); }
    html[data-theme="light"] .menu-item { color: #33405a; }
    html[data-theme="light"] .shortcut-hint { color: #55657f; }
    /* 浅色下收入结构与费用结构卡片文字 */
    html[data-theme="light"] .structure-metric-label,
    html[data-theme="light"] .expense-metric-label { color: #55657f; }
    html[data-theme="light"] .structure-metric-value,
    html[data-theme="light"] .expense-metric-value { color: #1c2b45; }
    html[data-theme="light"] .structure-metric-unit,
    html[data-theme="light"] .expense-metric-unit { color: var(--txt3); }
    html[data-theme="light"] .structure-metric-item,
    html[data-theme="light"] .expense-metric-item {
      background: linear-gradient(135deg, rgba(246, 250, 255, 0.8), rgba(234, 240, 250, 0.8));
      border-color: rgba(90, 130, 220, 0.2);
    }
    html[data-theme="light"] .structure-metric-item:hover,
    html[data-theme="light"] .expense-metric-item:hover {
      border-color: #3b82f6;
      background: rgba(59, 130, 246, 0.08);
    }
    /* 浅色下各色输入框文字 */
    html[data-theme="light"] input,
    html[data-theme="light"] textarea,
    html[data-theme="light"] select,
    html[data-theme="light"] .unified-input,
    html[data-theme="light"] .settings-input,
    html[data-theme="light"] .indicator-threshold-input,
    html[data-theme="light"] .indicator-weight-input,
    html[data-theme="light"] .indicator-meaning-input,
    html[data-theme="light"] .dimw-input,
    html[data-theme="light"] .quick-entry-input {
      color: #1c2b45;
    }
    html[data-theme="light"] input::placeholder,
    html[data-theme="light"] textarea::placeholder,
    html[data-theme="light"] .settings-input::placeholder,
    html[data-theme="light"] .quick-entry-input::placeholder {
      color: #aab6c8;
    }
    /* 浅色下 option 文字 */
    html[data-theme="light"] select option { color: #1c2b45; }
    /* 浅色下操作说明阅读区保持浅色不变（其自身已是浅色） */
    html[data-theme="light"] #manualDrawer .manual-dw-body { background: #eef1f6; }
    /* 浅色主题下，ECharts 图表画布区由深海军蓝改为浅色渐变面板，
       与浅色页面协调（图内文字/轴线/分隔线配色由 charts.js 主题感知逻辑按当前主题取值；
       深色主题零变化，本规则仅在 html[data-theme="light"] 下生效） */
    html[data-theme="light"] .chart,
    html[data-theme="light"] .dw-chart,
    html[data-theme="light"] .structure-chart,
    html[data-theme="light"] .chart > div[style*="width"] {
      background: linear-gradient(165deg, #f8fbff 0%, #eff5fd 55%, #e8f0fa 100%);
      border-radius: 6px;
    }
    /* 浅色主题下 KPI / 健康卡等内联微图表随面板为浅色（其颜色走当前色/变量） */
    

    * { margin: 0; padding: 0; box-sizing: border-box; }
    html, body { width: 100%; height: 100%; overflow: hidden; background: var(--body-bg); font-family: var(--font); color: var(--txt); }
    body { display: flex; align-items: center; justify-content: center; }
    
    /* 屏幕自适应：留边区域用画布最外层同色延展（消除「黑边」观感）
       —— 仅自适应模式生效；16:9 屏幕保持改造前的原样呈现。 */
    html[data-screen-mode="adaptive"],
    html[data-screen-mode="adaptive"] body {
      background: var(--vp-bg-3);
    }

    /* ==========================================================================
     * 屏幕自适应 · 各栏高度配比（2026-09-12 第 2 轮：按评审意见微调）
     * 作用域：**仅 html[data-screen-mode="adaptive"]** ⇒ 16:9 屏幕一行不改（保持既有页面）。
     * 本轮配比（基准 = 1080 设计稿；括号内为调整幅度）：
     *   · 最底部 3 栏 .foot：200 → 200 × 7/6 ≈ 233.33px（+1/6）
     *   · 整体财务健康度 .oh-panel：104 → 104 × 4/3 ≈ 138.67px（+1/3）
     *   · 中间 5 张 KPI 卡 .kpis：142 → 142 × 5/4 = 177.5px（+1/4）
     *   · 中间 8 张健康卡 .health-grid：140 → 140 × 5/4 = 175px（+1/4）
     *   · 右栏「收入结构 / 费用结构 / 风险预警」：三等分等高
     *     （撤回上一轮对两枚饼图面板的单独锁高 —— 该锁高会让三栏在画布长高后不再等分）
     * 让出的高度自动落到「可安全拉伸」的图表面板：周转健康分析（左栏）与营收与净利趋势（中间栏）
     * —— 二者都是 ECharts 容器，读容器高重绘，加高只增大绘图区、不产生留白。
     * 现金流健康度仍锁高 309px：半圆仪表盘是固定尺寸内容，被撑开只会在底部留大片空白；
     * 锁高之后画布再长高时，左栏多余高度全部由周转折线图吸收。
     * ========================================================================== */
    html[data-screen-mode="adaptive"] .foot { height: calc(200px * 7 / 6); }          /* 最底部 3 栏 +1/6 */
    html[data-screen-mode="adaptive"] .oh-panel { height: calc(104px * 4 / 3); }      /* 整体财务健康度 +1/3 */
    html[data-screen-mode="adaptive"] .kpis { height: calc(142px * 5 / 4); }          /* 5 张 KPI 卡 +1/4 */
    html[data-screen-mode="adaptive"] .health-grid { height: calc(140px * 5 / 4); }   /* 8 张健康卡 +1/4 */
    html[data-screen-mode="adaptive"] .col-l > .cf-home { flex: none; height: 309px; }/* 现金流面板锁高（防仪表盘留白） */
    /* 底部「财务合规风险」四卡块原为内联固定 160px：底栏加高后须改为填满面板，否则面板底部留白 */
    html[data-screen-mode="adaptive"] #tax-risk-matrix {
      flex: 1 1 0%;
      height: auto !important;
      min-height: 0;
    }

    /* 主视口 - 设计画布：默认 1920×1080，作为 16:9 模式的单一真源；
       屏幕自适应模式下由 adjustViewport() 按视口写入内联 width/height，宽高都自适应。 */
    #vp {
      position: absolute;
      left: 50%;
      top: 50%;
      width: 1920px;
      height: 1080px;
      transform-origin: center center;
      background: radial-gradient(1200px 700px at 50% -10%, var(--vp-bg-1) 0%, var(--vp-bg-2) 45%, var(--vp-bg-3) 100%);
      box-shadow: 0 0 120px rgba(30, 80, 180, 0.25);
      overflow: hidden;
      user-select: none;
    }
    
    .screen {
      position: absolute;
      inset: 14px 16px 14px;
      display: flex;
      flex-direction: column;
      gap: 12px;
      z-index: 1;
    }
    
    /* 顶部区域 */
    .hd {
      height: 82px;
      flex: none;
      display: flex;
      align-items: center;
      justify-content: space-between;
      padding: 0 26px;
      background: linear-gradient(180deg, rgba(var(--h-r), var(--h-g), var(--h-b), 0.85), rgba(var(--d2-r), var(--d2-g), var(--d2-b), 0.4));
      border: 1px solid var(--line);
      border-radius: 12px;
      position: relative;
    }
    
    .hd::after {
      content: "";
      position: absolute;
      left: 0;
      bottom: -1px;
      width: 100%;
      height: 2px;
      background: linear-gradient(90deg, transparent, rgba(201, 162, 92, 0.8), rgba(0, 212, 255, 0.6), transparent);
    }
    
    .hd-l {
      display: flex;
      align-items: center;
      gap: 14px;
    }
    
    .logo {
      height: 40px;
      width: auto;
      border-radius: 8px;
      display: block;
      object-fit: contain;
    }
    
    .hd-l b {
      display: block;
      font-size: 16px;
      color: #fff;
      letter-spacing: 1px;
    }
    
    .hd-l span {
      display: block;
      font-size: 11px;
      color: var(--txt2);
      letter-spacing: 2px;
      margin-top: 2px;
    }
    
    .hd-c {
      text-align: center;
      position: absolute;
      left: 50%;
      transform: translateX(-50%);
      /* ★ 2026-09-13（走查项 C-1）：原先无宽度约束。注入 33 字公司名后 h1 实测宽 1386px，
         右边缘越过 .hd-r 左边界 90px，压住年份下拉与「老板速读报告 / 操作菜单」按钮。
         1920 设计画布下 .hd 内容宽 1868，左右两翼各约 330 与 150，故 1000px 是安全上界。 */
      max-width: 1000px;
    }
    
    .hd-c h1 {
      font-size: 34px;
      color: #fff;
      letter-spacing: 8px;
      font-weight: 700;
      white-space: nowrap;
      text-shadow: 0 0 24px rgba(0, 212, 255, 0.35);
      /* ★ 2026-09-13（走查项 C-1）：超长即省略，不得覆盖相邻功能控件。
         完整名称由 js/ui.js 写入 title 属性（悬浮可见），且系统名称输入已限 28 字。 */
      max-width: 100%;
      overflow: hidden;
      text-overflow: ellipsis;
    }
    
    .hd-c p {
      font-size: 12px;
      color: #9ec5ff;
      letter-spacing: 5px;
      margin-top: 5px;
      white-space: nowrap;
      max-width: 100%;
      overflow: hidden;
      text-overflow: ellipsis;
    }
    
    .hd-r {
      display: flex;
      align-items: center;
      gap: 10px;
      font-size: 12px;
      color: var(--txt2);
    }
    
    .time-display {
      font-size: 13px;
      color: var(--cyan);
      letter-spacing: 1px;
    }
    
    /* 主体区域 */
    .main {
      flex: 1;
      min-height: 0;
      display: flex;
      gap: 12px;
    }
    
    .col {
      display: flex;
      flex-direction: column;
      gap: 12px;
      min-width: 0;
    }
    
    .col-l { width: 480px; flex: none; }
    .col-m { flex: 1; }
    .col-r { width: 480px; flex: none; }
    
    /* 面板样式 */
    .panel {
      position: relative;
      background: var(--card);
      border: 1px solid var(--line);
      border-radius: 10px;
      padding: 12px 14px 8px;
      min-height: 0;
      display: flex;
      flex-direction: column;
      overflow: hidden;
    }
    
    .panel::before {
      content: "";
      position: absolute;
      left: 0;
      top: 0;
      width: 100%;
      height: 2px;
      opacity: 0.9;
      background: linear-gradient(90deg, var(--gold), rgba(201, 162, 92, 0));
    }
    
    .panel.blue::before { background: linear-gradient(90deg, var(--cyan), rgba(0, 212, 255, 0)); }
    .panel.purple::before { background: linear-gradient(90deg, var(--blue), rgba(59, 130, 246, 0)); }
    .panel.red::before { background: linear-gradient(90deg, var(--red), rgba(255, 107, 107, 0)); }
    
    .p-ttl {
      flex: none;
      display: flex;
      align-items: center;
      gap: 8px;
      font-size: 14px;
      color: var(--txt);
      font-weight: 500;
      letter-spacing: 1px;
      margin-bottom: 8px;
    }

    .p-ttl::before {
      content: "";
      width: 4px;
      height: 14px;
      background: var(--orange);
      border-radius: 2px;
    }

    .p-ttl-legend {
      margin-left: auto;
      display: flex;
      align-items: center;
      gap: 16px;
      font-size: 12px;
      font-weight: 400;
      letter-spacing: 0;
    }

    .legend-item {
      display: flex;
      align-items: center;
      gap: 6px;
      color: var(--txt2);
    }

    .legend-dot {
      width: 12px;
      height: 3px;
      border-radius: 2px;
    }

    .legend-dot-actual {
      background: #00d4ff;
    }

    .legend-dot-standard {
      background: #ffa94d;
    }

    .panel.blue .p-ttl::before { background: var(--cyan); }
    .panel.purple .p-ttl::before { background: var(--blue); }
    .panel.red .p-ttl::before { background: var(--red); }
    
    .p-ttl .tag {
      margin-left: auto;
      font-size: 10.5px;
      color: var(--txt3);
      font-weight: 400;
      letter-spacing: 0;
    }
    
    .chart {
      flex: 1;
      min-height: 0;
      width: 100%;
      cursor: pointer;
    }
    
    /* 收入结构专用样式 */
    .structure-container {
      flex: 1;
      display: flex;
      min-height: 0;
      gap: 10px;
    }
    
    .structure-chart-wrapper {
      flex: 2;
      min-height: 0;
      min-width: 0;
      margin-left: -14px;
    }
    
    .structure-chart {
      width: 100%;
      height: 100%;
    }
    
    /* 控制收入结构图例行间距 */
    #chart-structure canvas + div {
      line-height: 12px !important;
    }
    
    #chart-structure canvas + div > div {
      margin-bottom: 2px !important;
    }
    
    /* 控制费用结构图例行间距 */
    #chart-expense canvas + div {
      line-height: 12px !important;
    }
    
    #chart-expense canvas + div > div {
      margin-bottom: 2px !important;
    }
    
    .structure-metrics-bar {
      width: 206px;
      flex: none;
      display: grid;
      grid-template-columns: 1fr 1fr;
      grid-template-rows: 1fr 1fr;
      gap: 6px;
      min-width: 0;
      margin-right: -4px;
    }
    
    .structure-metric-item {
      height: auto;
      background: linear-gradient(135deg, rgba(var(--p-r), var(--p-g), var(--p-b), 0.5), rgba(var(--d-r), var(--d-g), var(--d-b), 0.5));
      border: 1px solid rgba(76, 130, 255, 0.2);
      border-radius: 6px;
      padding: 8px 10px;
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: flex-start;
      transition: all 0.2s ease;
      cursor: pointer;
    }
    
    .structure-metric-item:hover {
      border-color: var(--cyan);
      background: rgba(0, 212, 255, 0.08);
    }
    
    .structure-metric-label {
      font-size: 10px;
      color: var(--txt3);
      margin-bottom: 6px;
      letter-spacing: 0.5px;
      line-height: 1;
      white-space: nowrap;
    }
    
    .structure-metric-value {
      font-size: 18px;
      font-weight: 700;
      line-height: 1;
      margin-bottom: 2px;
      white-space: nowrap;
      color: var(--txt);
    }
    
    .structure-metric-unit {
      font-size: 9px;
      color: var(--txt3);
      line-height: 1;
      margin-bottom: 5px;
      white-space: nowrap;
    }
    
    .structure-metric-change {
      font-size: 10px;
      line-height: 1;
      white-space: nowrap;
    }
    
    /* 费用结构卡片样式 */
    .expense-metrics-bar {
      width: 206px;
      flex: none;
      display: grid;
      grid-template-columns: 1fr 1fr;
      grid-template-rows: 1fr 1fr;
      gap: 6px;
      min-width: 0;
      margin-right: -4px;
    }
    
    .expense-metric-item {
      height: auto;
      background: linear-gradient(135deg, rgba(var(--p-r), var(--p-g), var(--p-b), 0.5), rgba(var(--d-r), var(--d-g), var(--d-b), 0.5));
      border: 1px solid rgba(76, 130, 255, 0.2);
      border-radius: 6px;
      padding: 8px 10px;
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: flex-start;
      transition: all 0.2s ease;
      cursor: pointer;
    }
    
    .expense-metric-item:hover {
      border-color: var(--cyan);
      background: rgba(0, 212, 255, 0.08);
    }
    
    .expense-metric-label {
      font-size: 10px;
      color: var(--txt3);
      margin-bottom: 6px;
      letter-spacing: 0.5px;
      line-height: 1;
      white-space: nowrap;
    }
    
    .expense-metric-value {
      font-size: 18px;
      font-weight: 700;
      line-height: 1;
      margin-bottom: 2px;
      white-space: nowrap;
      color: var(--txt);
    }
    
    .expense-metric-unit {
      font-size: 9px;
      color: var(--txt3);
      line-height: 1;
      margin-bottom: 5px;
      white-space: nowrap;
    }
    
    .expense-metric-change {
      font-size: 10px;
      line-height: 1;
      white-space: nowrap;
    }
    
    /* KPI卡片 */
    .kpis {
      flex: none;
      display: flex;
      gap: 12px;
      margin-bottom: 1px;
      height: 142px;
    }
    
    .kpi {
      flex: 1;
      position: relative;
      background: linear-gradient(160deg, rgba(var(--k-r), var(--k-g), var(--k-b), 0.9), rgba(var(--d-r), var(--d-g), var(--d-b), 0.9));
      border: 1px solid var(--line2);
      border-radius: 10px;
      padding: 14px 10px 50px;
      overflow: hidden;
      cursor: pointer;
      transition: all 0.25s ease;
      display: flex;
      flex-direction: column;
    }
    
    .kpi:hover {
      border-color: rgba(0, 212, 255, 0.5);
      box-shadow: 0 0 18px rgba(0, 212, 255, 0.15);
      transform: translateY(-2px);
    }
    
    .kpi::after {
      content: "";
      position: absolute;
      inset: 0;                       /* 装饰层与卡片同尺寸，绝不越界 */
      border-radius: inherit;
      /* ★ 2026-09-13（走查项 C-7）：原为「110×110 圆 + right:-30px / top:-30px」，
         恒定溢出 30px。虽被 .kpi 的 overflow:hidden 裁掉、视觉无差异，但它让卡片的
         scrollWidth - clientWidth 恒为 30px（与数值长度无关），使「卡片是否溢出」
         这一诊断信号彻底失效 —— 任何「卡片不得溢出」的断言都会恒红。
         ⚠ 曾尝试用 transform: translate(30px,-30px) 保留原坐标：**无效**。
           CSS Overflow 规范把「施加变换后的后代盒子」计入可滚动溢出区，实测仍为 30px。
         故改为等价复刻、整体不越界：原圆心落在（距右 25px，距上 25px），
         渐变为 rgba(青,0.14) 线性过渡到 65%（≈36px）处透明 ⇒ 下面用同圆心 + 半径 36px 表达。 */
      background: radial-gradient(circle 36px at calc(100% - 25px) 25px,
                                  rgba(0, 212, 255, 0.14), transparent);
      pointer-events: none;
    }
    
    .kpi .k {
      font-size: 12px;
      color: var(--txt2);
      letter-spacing: 1px;
    }
    
    .kpi .v {
      font-size: 28px;
      color: #fff;
      font-weight: 700;
      margin: 4px 0 2px;
      font-variant-numeric: tabular-nums;
      flex: 1;
      display: flex;
      align-items: center;
      justify-content: center;
      /* ★ 2026-09-13（走查阻塞项 B-4）：长数值兜底第 1 层 —— 容器硬约束。
         实测卡片宽 171px，而数值元素注入 14 位金额后宽 248px（溢出 77px）。
         此处锁定容器不越界，再由 js/app.js 的 fitKpiValue() 逐档降字号。 */
      min-width: 0;
      max-width: 100%;
      overflow: hidden;
      white-space: nowrap;
    }
    
    .kpi .v small {
      font-size: 14px;
      color: var(--txt2);
      font-weight: 400;
      margin-left: 3px;
    }
    
    .kpi .d {
      font-size: 10.5px;
      display: flex;
      align-items: center;
      gap: 12px;
      margin-bottom: 6px;
      flex-wrap: nowrap;
      white-space: nowrap;
    }
    
    .kpi .d-item {
      display: flex;
      align-items: center;
      gap: 4px;
      flex-shrink: 0;
    }
    
    .kpi .d .up { color: var(--success-ink); }
    .kpi .d .dn { color: var(--danger-ink); }
    
    .kpi .spark {
      position: absolute;
      left: 15px;
      bottom: 10px;
      width: calc(100% - 35px);
      overflow: visible;
      opacity: 0.9;
      height: 24px;
      transition: all 0.3s ease;
    }
    .kpi:hover .spark {
      opacity: 1;
      transform: scale(1.02);
    }
    .kpi .spark-area {
      opacity: 0;
      transition: opacity 0.3s ease;
    }
    .kpi:hover .spark-area {
      opacity: 1;
    }
    .kpi .spark-start,
    .kpi .spark-end {
      transition: all 0.3s ease;
    }
    .kpi:hover .spark-start,
    .kpi:hover .spark-end {
      opacity: 1 !important;
    }
    
    /* 健康度矩阵 */
    .health-grid {
      display: grid;
      grid-template-columns: repeat(4, 1fr);
      gap: 10px;
      margin-bottom: 6px;
      height: 140px;
    }
    
    .health-card {
      background: linear-gradient(160deg, rgba(var(--k-r), var(--k-g), var(--k-b), 0.7), rgba(var(--d-r), var(--d-g), var(--d-b), 0.7));
      border: 1px solid var(--line);
      border-radius: 8px;
      padding: 4px 12px 10px;
      cursor: pointer;
      transition: all 0.2s ease;
      display: flex;
      flex-direction: column;
      justify-content: space-between;
    }
    
    .health-card:hover {
      border-color: var(--cyan);
      background: rgba(0, 212, 255, 0.08);
    }
    
    .health-card .h-top {
      display: flex;
      align-items: center;
      justify-content: space-between;
      gap: 12px;
    }
    
    .health-card .h-title {
      font-size: 12px;
      color: var(--txt);
      font-weight: 500;
    }
    
    .health-card .h-score {
      font-size: 28px;
      font-weight: 700;
      flex: none;
      /* ★ 2026-09-13：显式声明，替代原先「靠 .health-card 继承 + 浅色笼统覆盖」的隐式行为。
         深色取值与原继承结果逐字相同（--txt = #d6e4ff，实测 rgb(214,228,255)），零视觉变化。 */
      color: var(--txt);
    }
    
    .health-card .h-score.excellent { color: var(--success-ink); }
    .health-card .h-score.warning { color: var(--warning-ink); }
    .health-card .h-score.danger { color: var(--danger-ink); }
    .health-card .h-score.na { color: var(--txt3); font-size: 20px; }
    
    .health-card .h-bar {
      height: 4px;
      background: rgba(76, 130, 255, 0.2);
      border-radius: 2px;
      overflow: hidden;
    }
    
    .health-card .h-bar-fill {
      height: 100%;
      border-radius: 2px;
      transition: width 0.8s ease;
    }
    
    .health-card .h-bar-fill.excellent { background: linear-gradient(90deg, var(--success), #34d399); }
    .health-card .h-bar-fill.warning { background: linear-gradient(90deg, var(--warning), #fbbf24); }
    .health-card .h-bar-fill.danger { background: linear-gradient(90deg, var(--danger), #f87171); }
    .health-card .h-bar-fill.na { background: rgba(148, 163, 184, 0.55); }
    
    .health-card .h-bar-fill {
      height: 100%;
      border-radius: 2px;
      transition: width 0.8s ease;
    }
    
    .health-card .h-bar-fill.excellent { background: linear-gradient(90deg, var(--success), #34d399); }
    .health-card .h-bar-fill.warning { background: linear-gradient(90deg, var(--warning), #fbbf24); }
    .health-card .h-bar-fill.danger { background: linear-gradient(90deg, var(--danger), #f87171); }
    .health-card .h-bar-fill.na { background: rgba(148, 163, 184, 0.55); }
    
    /* 现金流健康度面板（高密度布局：消除留白，提升信息密度） */
    .cashflow-gauges {
      display: flex;
      flex-direction: column;
      flex: 1;
      min-height: 0;
      gap: 12px;
      padding: 4px 0 2px;
    }
    
    /* 上区：三大活动现金流（3 列等宽，列间细分隔线） */
    .cf-activities {
      display: grid;
      grid-template-columns: repeat(3, 1fr);
      flex: 1;
      min-height: 0;
      position: relative;
    }
    
    .cf-activities::before,
    .cf-activities::after {
      content: "";
      position: absolute;
      top: 6%;
      bottom: 6%;
      width: 1px;
      background: rgba(76, 130, 255, 0.14);
      pointer-events: none;
    }
    
    .cf-activities::before { left: 33.3333%; }
    .cf-activities::after { left: 66.6667%; }
    
    .cf-gauge {
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: flex-start;
      gap: 7px;
      padding: 8px 6px 10px;
      cursor: pointer;
      border-radius: 8px;
      transition: background 0.15s;
      min-height: 0;
    }

    .cf-gauge:hover { background: rgba(0, 212, 255, 0.06); }

    .cf-activity-head {
      display: flex;
      align-items: center;
      gap: 6px;
      flex-wrap: wrap;
      justify-content: center;
    }

    .cf-activity-name {
      font-size: 11px;
      color: var(--txt2);
      font-weight: 500;
      white-space: nowrap;
      line-height: 1.2;
    }

    .cf-value-row {
      display: flex;
      align-items: baseline;
      gap: 1px;
      line-height: 1.1;
    }

    .cf-gauge-value {
      font-size: 19px;
      font-weight: 700;
      color: #fff;
      line-height: 1.1;
      font-variant-numeric: tabular-nums;
      white-space: nowrap;
    }

    .cf-gauge-value.pos { color: var(--success-ink); }
    .cf-gauge-value.neg { color: var(--danger-ink); }

    .cf-unit {
      font-size: 10px;
      font-weight: 500;
      color: var(--txt3);
    }

    /* ========== 现金流仪表盘（半圆 SVG 仪表盘：行 2） ========== */
    .cf-dial {
      width: 100%;
      max-width: 124px;
      display: flex;
      align-items: center;
      justify-content: center;
      flex: none;
      line-height: 0;
    }
    .cf-dial svg { width: 100%; height: auto; display: block; overflow: visible; }

    .cf-dial .dial-track {
      fill: none;
      stroke: rgba(255, 255, 255, 0.09);
      stroke-width: 4;
      stroke-linecap: round;
    }
    .cf-dial .dial-zone-neg {
      fill: none;
      stroke: var(--danger);
      stroke-width: 4;
      stroke-linecap: round;
      opacity: 0.42;
    }
    .cf-dial .dial-zone-pos {
      fill: none;
      stroke: var(--success);
      stroke-width: 4;
      stroke-linecap: round;
      opacity: 0.42;
    }
    .cf-dial .dial-tick {
      stroke: rgba(255, 255, 255, 0.32);
      stroke-width: 1.2;
      stroke-linecap: round;
    }
    .cf-dial .dial-needle {
      stroke-width: 2.4;
      stroke-linecap: round;
      fill: none;
      transform-box: view-box;
      transform-origin: 60px 60px;
      transition: transform 3s cubic-bezier(.4, 0, .2, 1), stroke 0.3s;
    }
    .cf-dial .dial-hub {
      fill: var(--txt);
      stroke: none;
    }
    .cf-dial .dial-hub-inner { fill: rgba(255, 255, 255, 0.12); }

    /* 指针与中心轴颜色按状态切换（与数值颜色语义一致：正绿 / 负红 / 零或无数据中性灰） */
    .cf-dial[data-state="pos"] .dial-needle { stroke: var(--success); }
    .cf-dial[data-state="neg"] .dial-needle { stroke: var(--danger); }
    .cf-dial[data-state="zero"] .dial-needle,
    .cf-dial[data-state="empty"] .dial-needle { stroke: rgba(255, 255, 255, 0.5); }
    .cf-dial[data-state="pos"] .dial-hub { fill: var(--success); }
    .cf-dial[data-state="neg"] .dial-hub { fill: var(--danger); }
    .cf-dial[data-state="zero"] .dial-hub,
    .cf-dial[data-state="empty"] .dial-hub { fill: rgba(255, 255, 255, 0.55); }

    /* 浅色主题适配（仪表盘各元素在白底上保持可见） */
    html[data-theme="light"] .cf-dial .dial-track { stroke: rgba(28, 43, 69, 0.10); }
    html[data-theme="light"] .cf-dial .dial-tick { stroke: rgba(28, 43, 69, 0.28); }
    html[data-theme="light"] .cf-dial .dial-hub-inner { fill: rgba(28, 43, 69, 0.08); }
    html[data-theme="light"] .cf-dial[data-state="zero"] .dial-needle,
    html[data-theme="light"] .cf-dial[data-state="empty"] .dial-needle { stroke: rgba(28, 43, 69, 0.45); }
    html[data-theme="light"] .cf-dial[data-state="zero"] .dial-hub,
    html[data-theme="light"] .cf-dial[data-state="empty"] .dial-hub { fill: rgba(28, 43, 69, 0.5); }

    .cf-gauge-status {
      font-size: 10px;
      padding: 1px 7px;
      border-radius: 10px;
      font-weight: 500;
      white-space: nowrap;
      line-height: 1.4;
    }
    
    /* ★ 2026-09-13（走查阻塞项 B-2 补遗）：浅色主题下原 color: var(--success) 在浅绿芯片底
       rgb(205,234,232) 上仅 2.01:1、var(--danger) 在浅红芯片底上仅 2.17:1（均 < 4.5:1）。
       这两个标签正是「现金流正/负向」的唯一文字说明，读不出等于正负向判断失效。 */
    .cf-gauge-status.positive {
      background: rgba(16, 185, 129, 0.15);
      color: var(--success-ink);
      border: 1px solid rgba(16, 185, 129, 0.3);
    }
    
    .cf-gauge-status.negative {
      background: rgba(255, 107, 107, 0.15);
      color: var(--danger-ink);
      border: 1px solid rgba(255, 107, 107, 0.3);
    }
    
    /* 下区：3 个数据卡片（现金净增加额 / 盈余现金保障倍数 / 资金可持续月数） */
    .cf-summary {
      flex: none;
      display: grid;
      grid-template-columns: repeat(3, 1fr);
      gap: 12px;
      padding: 8px 2px 2px;
      border-top: 1px solid rgba(76, 130, 255, 0.14);
    }
    
    .cf-sum-item {
      display: flex;
      flex-direction: column;
      align-items: center;
      gap: 3px;
      min-width: 0;
      background: rgba(76, 130, 255, 0.07);
      border: 1px solid rgba(76, 130, 255, 0.16);
      border-radius: 8px;
      padding: 7px 6px 8px;
    }
    
    .cf-sum-label {
      font-size: 10px;
      color: var(--txt3);
      white-space: nowrap;
      line-height: 1.2;
    }
    
    .cf-sum-value {
      font-size: 18px;
      font-weight: 700;
      color: var(--txt);
      font-variant-numeric: tabular-nums;
      line-height: 1.1;
      white-space: nowrap;
    }
    
    .cf-sum-value.pos { color: var(--success-ink); }
    .cf-sum-value.neg { color: var(--danger-ink); }
    .cf-sum-value.warn { color: var(--warning-ink); }
    
    .cf-sum-value .u {
      font-size: 10px;
      font-weight: 500;
      color: var(--txt3);
      margin-left: 1px;
    }
    
    /* R6：整体健康卡归因文本区 */
    .oh-attribution {
      border-top: 1px solid rgba(76, 130, 255, 0.14);
      margin-top: 2px; padding: 8px 2px 4px;
      font-size: 11px; line-height: 1.75; color: var(--txt2);
    }
    .oh-attr-empty { color: var(--txt3); }
    .oh-attribution .oh-attr-sentence { color: var(--txt); font-weight: 600; }
    .oh-attribution .oh-attr-neg { color: var(--danger-ink); }
    .oh-attribution .oh-attr-pos { color: var(--success-ink); }

    .cf-hint {
      display: flex;
      align-items: center;
      gap: 8px;
      padding: 8px 12px;
      font-size: 12px;
      color: var(--txt2);
    }
    
    .cf-hint-dot {
      width: 8px;
      height: 8px;
      border-radius: 50%;
      flex-shrink: 0;
    }
    
    .cf-hint-dot.green {
      background: var(--success);
      box-shadow: 0 0 6px rgba(16, 185, 129, 0.5);
    }
    
    .cf-hint-dot.yellow {
      background: var(--warning);
      box-shadow: 0 0 6px rgba(255, 169, 77, 0.5);
    }
    
    .cf-hint-dot.red {
      background: var(--danger);
      box-shadow: 0 0 6px rgba(255, 107, 107, 0.5);
    }
    
    .cf-hint-text {
      line-height: 1.4;
    }
    
    /* 预警列表 */
    .alert-list {
      flex: 1;
      min-height: 0;
      overflow: hidden;
      position: relative;
      mask-image: linear-gradient(180deg, transparent, #000 8%, #000 92%, transparent);
    }
    
    .alert-track {
      animation: scrollY 20s linear infinite;
    }
    
    @keyframes scrollY {
      0% { transform: translateY(0); }
      100% { transform: translateY(-50%); }
    }
    
    .alert-row {
      display: flex;
      align-items: center;
      gap: 10px;
      padding: 9px 4px;
      border-bottom: 1px dashed rgba(76, 130, 255, 0.12);
      font-size: 12.5px;
      color: var(--txt);
      cursor: pointer;
      border-radius: 6px;
      transition: 0.15s;
    }
    
    .alert-row:hover {
      background: rgba(0, 212, 255, 0.08);
    }
    
    .alert-row .t {
      font-size: 11px;
      color: var(--txt3);
      font-variant-numeric: tabular-nums;
      flex: none;
      width: 75px;
    }
    
    .alert-row .lv {
      flex: none;
      width: 52px;
      text-align: center;
      font-size: 11px;
      border-radius: 4px;
      padding: 2px 0;
    }
    
    /* ★ 2026-09-13（走查阻塞项 B-2 补遗）：文字色由「语义本色」改走「语义墨色」。
       浅色主题下 .lv.o/.lv.y 原 1.71:1、.lv.r 原 2.49:1、.lv.b 原 1.47:1 —— 实质不可读，
       而它们承载「高风险 / 关注 / 提示」这一核心分级语义。底色/描边仍用本色（色块不压暗）。 */
    .lv.y { background: rgba(255, 169, 77, 0.15); color: var(--warning-ink); border: 1px solid rgba(255, 169, 77, 0.4); }
    .lv.o { background: rgba(255, 169, 77, 0.15); color: var(--warning-ink); border: 1px solid rgba(255, 169, 77, 0.4); }
    .lv.r { background: rgba(255, 107, 107, 0.15); color: var(--danger-ink); border: 1px solid rgba(255, 107, 107, 0.4); }
    .lv.b { background: rgba(0, 212, 255, 0.12); color: var(--primary-ink); border: 1px solid rgba(0, 212, 255, 0.35); }
    
    .alert-row .msg {
      flex: 1;
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
    }
    
    /* —— 风险预警：标题(.msg)可点暗示 —— */
    .alert-row .msg {
      font-size: 12px;
      cursor: pointer;
      transition: color 0.15s;
    }
    .alert-row .msg:hover {
      color: var(--primary);
      text-decoration: underline;
      text-decoration-color: rgba(0, 212, 255, 0.55);
      text-underline-offset: 3px;
    }
    
    /* —— 风险预警：标题行右侧「全部」按钮（点击打开全部预警列表抽屉） —— */
    .alert-all-btn {
      flex: none;
      margin-left: auto;
      /* ★ 2026-09-13（走查项 C-2）：原 2px 上下内边距 → 实测高 23px，触屏/投屏遥控易点空；
         提到 5px（+内外边框 = 29px，卡内 chip 目标档，44 口径见 F-1 待裁决）。 */
      padding: 5px 12px;
      font-size: 11px;
      line-height: 17px;
      letter-spacing: 1px;
      color: var(--txt2);
      background: rgba(255, 107, 107, 0.12);
      border: 1px solid rgba(255, 107, 107, 0.35);
      border-radius: 999px;
      cursor: pointer;
      transition: all 0.15s;
      font-family: inherit;
    }
    .alert-all-btn:hover {
      color: #fff;
      background: rgba(255, 107, 107, 0.28);
      border-color: var(--red);
    }
    /* ★ 2026-09-13：浅色下 chip 底为淡红，实测 --txt2 仅 4.43:1（差 0.07 未过 AA），
       而 hover 的「白字压淡红」更是 ≈1.3:1。浅色改用与底色同族的深红墨色（≈5.5:1）。 */
    html[data-theme="light"] .alert-all-btn { color: var(--danger-ink); }
    html[data-theme="light"] .alert-all-btn:hover {
      color: var(--danger-ink);
      background: rgba(185, 28, 28, 0.14);
      border-color: var(--danger-ink);
    }
    
    /* —— 全部预警抽屉列表（含已读，已读置灰） —— */
    .alert-drawer-list {
      display: flex;
      flex-direction: column;
      gap: 10px;
    }
    
    .alert-drawer-item {
      display: flex;
      align-items: center;
      gap: 12px;
      padding: 12px 14px;
      border-radius: 8px;
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.45);
      border: 1px solid var(--line);
      transition: 0.15s;
    }
    
    .alert-drawer-item:hover {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.72);
      border-color: var(--line2);
    }
    
    .alert-drawer-item .t {
      flex: none;
      width: 150px;
      font-size: 12px;
      color: var(--txt3);
      font-variant-numeric: tabular-nums;
    }
    
    .alert-drawer-item .lv {
      flex: none;
      width: auto;
      min-width: 52px;
      padding: 2px 8px;
      text-align: center;
      font-size: 11px;
      border-radius: 4px;
    }
    
    .alert-drawer-item .msg {
      flex: 1;
      min-width: 0;
      font-size: 13px;
      color: var(--txt);
      line-height: 1.5;
      cursor: pointer;
      transition: color 0.15s;
    }
    
    .alert-drawer-item .msg:hover {
      color: var(--primary);
      text-decoration: underline;
      text-decoration-color: rgba(0, 212, 255, 0.55);
      text-underline-offset: 3px;
    }
    
    .alert-drawer-item .status {
      flex: none;
      display: inline-flex;
      align-items: center;
      gap: 6px;
      padding: 3px 10px;
      border-radius: 12px;
      font-size: 11px;
      cursor: pointer;
      user-select: none;
      transition: 0.15s;
    }
    
    .alert-drawer-item .status .dot {
      width: 6px;
      height: 6px;
      border-radius: 50%;
      display: inline-block;
    }
    
    .alert-drawer-item .status.unread {
      color: var(--warning);
      background: rgba(255, 169, 77, 0.12);
      border: 1px solid rgba(255, 169, 77, 0.45);
    }
    
    .alert-drawer-item .status.unread .dot {
      background: var(--warning);
      box-shadow: 0 0 6px rgba(255, 169, 77, 0.8);
    }
    
    .alert-drawer-item .status.read {
      color: var(--txt3);
      background: rgba(var(--t2-r), var(--t2-g), var(--t2-b), 0.12);
      border: 1px solid rgba(var(--t2-r), var(--t2-g), var(--t2-b), 0.4);
    }
    
    .alert-drawer-item .status.read .dot {
      background: var(--txt3);
    }
    
    .alert-drawer-item .status:hover {
      filter: brightness(1.2);
    }
    
    .alert-drawer-item.is-read {
      opacity: 0.6;
    }
    
    /* 底部区域 */
    .foot {
      flex: none;
      display: flex;
      gap: 12px;
      align-items: stretch;
      height: 200px;
    }
    
    .foot .panel {
      min-height: 200px;
    }
    
    /* 右侧控制菜单 */
    #control-menu {
      position: fixed;
      top: 0;
      right: 0;
      /* 464.5px = 1(左边框)+20(左内边距)+3×134.5(单按钮宽)+2×10(列间距)+20(右内边距)。
         原两列布局的按钮宽 = (320−1−40−10)/2 = 134.5px；三列下本宽度同样得 134.5px
         ⇒ 「宽度加大、按钮尺寸零变化」（实测轨宽 134.5 / 134.5 / 134.5）。 */
      width: min(464.5px, 100vw);
      height: 100%;
      background: linear-gradient(180deg, var(--dw-bg-1), var(--dw-bg-2));
      border-left: 1px solid var(--line);
      transform: translateX(100%); /* 收起即平移出视口外，阴影须随开屏态出现（见 .open），否则会向右侧渗出黑边 */
      transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
      z-index: 500;
      display: flex;
      flex-direction: column;
    }

    #control-menu.open {
      transform: translateX(0);
      box-shadow: -20px 0 60px rgba(0, 0, 0, 0.5);
    }
    
    .menu-header {
      flex: none;
      padding: 20px;
      border-bottom: 1px solid var(--line);
      display: flex;
      justify-content: space-between;
      align-items: center;
    }
    
    .menu-header h3 {
      font-size: 16px;
      color: #fff;
      font-weight: 600;
    }
    
    .menu-close {
      width: 32px;
      height: 32px;
      border-radius: 6px;
      border: 1px solid var(--line2);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      color: var(--txt2);
      font-size: 18px;
      cursor: pointer;
      transition: 0.2s;
    }
    
    .menu-close:hover {
      color: #fff;
      border-color: var(--cyan);
    }
    
    .menu-body {
      flex: 1;
      overflow-y: auto;
      padding: 16px 20px;
    }
    
    .menu-section {
      margin-bottom: 20px;
    }
    
    .menu-section-title {
      font-size: 12px;
      color: var(--txt3);
      letter-spacing: 1px;
      margin-bottom: 10px;
      text-transform: uppercase;
    }
    
    /* 控制面板菜单：每行显示 3 个按钮 */
    .menu-grid {
      display: grid;
      grid-template-columns: repeat(3, 1fr);
      gap: 8px 10px;
    }
    .menu-grid .menu-item {
      margin-bottom: 0;
    }

    /* 控制面板菜单「快捷方式」栏：每行显示 2 个，键帽 + 说明，纯展示不可触发 */
    .menu-grid.menu-grid-2 {
      grid-template-columns: repeat(2, 1fr);
    }
    .menu-item.sc-static {
      cursor: default;
    }
    .menu-item.sc-static:hover {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.4);
      border-color: var(--line);
    }
    .sc-key {
      display: inline-flex;
      align-items: center;
      justify-content: center;
      min-width: 28px;
      height: 22px;
      padding: 0 6px;
      font-size: 12px;
      font-weight: 600;
      font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
      color: var(--txt);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.5);
      border: 1px solid var(--line);
      border-bottom-width: 2px;
      border-radius: 5px;
      line-height: 1;
      flex: none;
    }
    
    .menu-item {
      display: flex;
      align-items: center;
      gap: 12px;
      padding: 9px 16px;
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.4);
      border: 1px solid var(--line);
      border-radius: 8px;
      margin-bottom: 8px;
      cursor: pointer;
      transition: all 0.2s ease;
      color: var(--txt);
      font-size: 14px;
    }
    
    .menu-item:hover {
      background: rgba(0, 212, 255, 0.12);
      border-color: var(--cyan);
    }
    
    .menu-item.active {
      background: rgba(0, 212, 255, 0.15);
      border-color: var(--cyan);
      color: var(--cyan);
    }
    
    .menu-item i {
      font-size: 16px;
      width: 20px;
      text-align: center;
    }
    
    .menu-footer {
      flex: none;
      padding: 16px 20px;
      border-top: 1px solid var(--line);
    }
    
    .menu-hint {
      font-size: 11px;
      color: var(--txt3);
      text-align: center;
      letter-spacing: 0.5px;
    }
    
    /* 抽屉 */
    #mask {
      position: fixed;
      inset: 0;
      background: rgba(3, 8, 20, 0.55);
      opacity: 0;
      pointer-events: none;
      transition: opacity 0.25s;
      z-index: 200;
    }
    
    #mask.on {
      opacity: 1;
      pointer-events: auto;
    }
    
    #drawer {
      position: fixed;
      top: 0;
      right: 0;
      width: 1280px;
      height: 100%;
      z-index: 210;
      transform: translateX(100%);
      transition: transform 0.28s cubic-bezier(0.2, 0.8, 0.2, 1), width 0.28s cubic-bezier(0.2, 0.8, 0.2, 1);
      display: flex;
      flex-direction: column;
      background: linear-gradient(180deg, var(--dw-bg-1), var(--dw-bg-2));
      border-left: 1px solid var(--line);
    }

    #drawer.on {
      transform: translateX(0);
      box-shadow: -20px 0 60px rgba(0, 0, 0, 0.5);
    }
    
    /* 主页面点击打开的drawer宽度（1/2） */
    #drawer.half-width {
      width: 960px;
    }
    
    /* 控制面板菜单打开的drawer宽度（目标 1280px = 1920 设计稿宽度的 2/3）
       数据录入 / 快速录入 / 模板管理 / 指标定义 4 个菜单滑出页统一 1280px；
       2026-09-11 A3：改为 min(1280px, 100vw) —— 1920 屏不变，1024 等窄屏降级为整屏宽，
       不再出现 x=−256px 的左侧裁切（原固定 1280px 在 <1280 视口会向右溢出）。 */
    #drawer.menu-width {
      width: 1280px;
      width: min(1280px, 100vw);
    }

    /* 2026-09-11 P0-2（U-2）：数据录入抽屉单独放大到 1680px（1920 屏下占比 66.7% → 87.5%）。
       用模块级 :has() 覆盖而非改基类 —— 基类被经营诊断 / 预算达成 / 多维分析 / 账龄分析共用，
       且 verify-budget-theme-tokens.js C1 与 verify-aging-theme-tokens.js C1 显式断言基类为 min(1280px,100vw)。
       选择器用 #dataEntryContent（仅数据录入抽屉渲染，见 data-entry.js:3186）而非 .data-entry-container
       —— 后者被经营诊断 / 预算达成 / 账龄分析页同样使用，会误伤其它抽屉宽度。 */
    #drawer.menu-width:has(#dataEntryContent) {
      width: min(1680px, 100vw);
    }
    /* U-15（P2-4）：用户在「⋯ 更多 → 放大 / 还原窗口」显式还原时覆盖上面的默认放大
       （多一个类 → 特异性更高，无需 !important）。 */
    #drawer.menu-width.de-narrow:has(#dataEntryContent) {
      width: min(1280px, 100vw);
    }
    
    /* 周转健康分析 · 雷达图点击滑出的指标详情（与其它 drawer 同风格，更窄） */
    #drawer.turnover-width {
      width: 540px;
    }
    
    /* 子抽屉样式 */
    #subDrawer {
      position: fixed;
      top: 0;
      right: 0;
      width: 1280px;
      height: 100%;
      z-index: 220;
      transform: translateX(100%);
      transition: transform 0.28s cubic-bezier(0.2, 0.8, 0.2, 1);
      display: flex;
      flex-direction: column;
      background: linear-gradient(180deg, var(--dw-bg-1), var(--dw-bg-2));
      border-left: 1px solid var(--line);
    }
    
    /* 8 大健康度卡片下钻子窗口：宽度与主滑出窗口（half-width = 960px）一致
       （showHealthIndicatorDetail 打开前显式挂载，closeSubDrawer 关闭时移除） */
    #subDrawer.match-width {
      width: 960px;
    }
    
    #subDrawer.on {
      transform: translateX(0);
      box-shadow: -20px 0 60px rgba(0, 0, 0, 0.5);
    }
    
    #subDwClose {
      position: absolute;
      right: 18px;
      top: 18px;
      width: 32px;
      height: 32px;
      border-radius: 8px;
      border: 1px solid var(--line2);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      color: var(--txt2);
      font-size: 16px;
      cursor: pointer;
      transition: 0.2s;
    }
    
    #subDwClose:hover {
      color: #fff;
      border-color: var(--cyan);
    }
    
    /* 系统设置抽屉样式 */
    #settingsDrawer {
      position: fixed;
      top: 0;
      right: 0;
      width: 640px;
      height: 100%;
      z-index: 220;
      transform: translateX(100%);
      transition: transform 0.28s cubic-bezier(0.2, 0.8, 0.2, 1);
      display: flex;
      flex-direction: column;
      background: linear-gradient(180deg, var(--dw-bg-1), var(--dw-bg-2));
      border-left: 1px solid var(--line);
    }

    #settingsDrawer.on {
      transform: translateX(0);
      box-shadow: -20px 0 60px rgba(0, 0, 0, 0.5);
    }
    
    #settingsClose {
      position: absolute;
      right: 18px;
      top: 18px;
      width: 32px;
      height: 32px;
      border-radius: 8px;
      border: 1px solid var(--line2);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      color: var(--txt2);
      font-size: 16px;
      cursor: pointer;
      transition: 0.2s;
    }
    
    #settingsClose:hover {
      color: #fff;
      border-color: var(--cyan);
    }
    
    .back-btn {
      display: inline-flex;
      align-items: center;
      gap: 6px;
      padding: 8px 16px;
      margin-bottom: 16px;
      border-radius: 6px;
      border: 1px solid var(--line2);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.4);
      color: var(--txt2);
      font-size: 13px;
      cursor: pointer;
      transition: 0.2s;
    }
    
    .back-btn:hover {
      color: #fff;
      border-color: var(--cyan);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
    }
    
    .dw-hd {
      flex: none;
      padding: 16px 22px 12px;
      border-bottom: 1px solid var(--line);
      position: relative;
      display: flex;
      align-items: center;
      justify-content: space-between;
    }
    
    .dw-hd .dw-title-group {
      flex: 1;
    }
    
    .dw-title {
      font-size: 20px;
      color: #fff;
      font-weight: 700;
      letter-spacing: 1px;
    }
    
    .dw-sub {
      font-size: 12px;
      color: var(--txt2);
      margin-top: 4px;
    }
    
    #dwClose,
    #ohDrawerClose {
      position: absolute;
      right: 18px;
      top: 18px;
      width: 32px;
      height: 32px;
      border-radius: 8px;
      border: 1px solid var(--line2);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      color: var(--txt2);
      font-size: 16px;
      cursor: pointer;
      transition: 0.2s;
    }
    
    #dwClose:hover,
    #ohDrawerClose:hover {
      color: #fff;
      border-color: var(--cyan);
    }

    /* 快速录入抽屉头部操作按钮 */
    .quick-entry-header-actions {
      position: absolute;
      right: 55px;
      top: 18px;
      display: flex;
      gap: 8px;
      z-index: 1;
    }

    /* 指标定义页面头部操作按钮 */
    .indicator-header-actions-in-drawer {
      position: absolute;
      right: 60px;
      top: 20px;
      display: flex;
      gap: 8px;
      z-index: 1;
    }
    
    .indicator-header-actions-in-drawer button {
      padding: 6px 14px;
      border-radius: 6px;
      font-size: 12px;
      font-weight: 500;
      cursor: pointer;
      transition: all 0.2s ease;
      white-space: nowrap;
    }
    
    .indicator-header-actions-in-drawer .indicator-btn.primary {
      background: linear-gradient(135deg, var(--cyan), #0098ff);
      border: none;
      color: #fff;
    }
    
    .indicator-header-actions-in-drawer .indicator-btn.primary:hover {
      transform: translateY(-1px);
      box-shadow: 0 4px 12px rgba(0, 212, 255, 0.4);
    }
    
    .indicator-header-actions-in-drawer .indicator-btn.secondary {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      border: 1px solid var(--line);
      color: var(--txt2);
    }
    
    .indicator-header-actions-in-drawer .indicator-btn.secondary:hover {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.8);
      border-color: var(--cyan);
    }
    
    /* 行业口径切换下拉框 */
    .indicator-header-actions-in-drawer .indicator-industry-select {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      border: 1px solid var(--line);
      color: var(--txt2);
      border-radius: 6px;
      padding: 0 10px;
      height: 32px;
      font-size: 13px;
      cursor: pointer;
      outline: none;
    }
    
    .indicator-header-actions-in-drawer .indicator-industry-select:hover,
    .indicator-header-actions-in-drawer .indicator-industry-select:focus {
      border-color: var(--cyan);
    }
    
    .indicator-header-actions-in-drawer .indicator-industry-select option {
      background: var(--opt-bg);
      color: var(--txt2);
    }
    
    /* 数据录入页面头部操作按钮 */
    .data-entry-header-actions {
      display: flex;
      gap: 10px;
      margin-right: 42px;
    }
    
    .data-entry-header-actions button {
      padding: 8px 16px;
      border-radius: 6px;
      font-size: 12px;
      font-weight: 500;
      cursor: pointer;
      transition: all 0.2s ease;
      border: 1px solid var(--line);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      color: var(--txt2);
    }
    
    .data-entry-header-actions button:hover {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.8);
      border-color: var(--cyan);
    }
    
    .dw-body {
      flex: 1;
      min-height: 0;
      overflow-y: auto;
      padding: 18px 22px 26px;
      position: relative;
    }
    
    .dw-body::-webkit-scrollbar {
      width: 5px;
    }
    
    .dw-body::-webkit-scrollbar-thumb {
      background: rgba(var(--t-r), var(--t-g), var(--t-b), 0.3);
      border-radius: 3px;
    }
    
    .metric-grid {
      display: grid;
      grid-template-columns: repeat(3, 1fr);
      gap: 10px;
      margin-bottom: 16px;
    }
    
    .metric {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.5);
      border: 1px solid var(--line);
      border-radius: 8px;
      padding: 10px 12px;
    }
    
    .metric .k {
      font-size: 11px;
      color: var(--txt3);
    }
    
    .metric .v {
      font-size: 19px;
      color: #fff;
      font-weight: 700;
      margin-top: 3px;
      font-variant-numeric: tabular-nums;
    }
    
    .metric .v .up { color: var(--rise); }
    .metric .v .dn { color: var(--fall); }
    
    .dw-chart {
      height: 210px;
      width: 100%;
      margin-bottom: 16px;
    }
    
    .dw-sec {
      font-size: 13px;
      color: var(--txt);
      font-weight: 500;
      margin: 14px 0 8px;
      display: flex;
      align-items: center;
      gap: 8px;
    }
    
    .dw-sec::before {
      content: "";
      width: 3px;
      height: 12px;
      background: var(--orange);
      border-radius: 2px;
    }

    /* 指标说明栏样式 */
    .indicator-explain-box {
      background: rgba(58, 74, 94, 0.3);
      padding: 16px;
      border-radius: 8px;
      border-left: 4px solid var(--orange);
    }

    .indicator-explain-box .indicator-name {
      font-size: 14px;
      color: #fff;
      margin-bottom: 8px;
    }

    .indicator-explain-box .indicator-detail {
      font-size: 13px;
      color: #7f9bc4;
      line-height: 2;
    }

    /* 预警内容栏样式 */
    .alert-content-box {
      background: rgba(58, 74, 94, 0.3);
      padding: 16px;
      border-radius: 8px;
      border-left: 4px solid var(--orange);
    }

    .alert-content-box .alert-msg {
      font-size: 14px;
      color: #fff;
      margin-bottom: 12px;
    }

    .alert-content-box .alert-detail {
      font-size: 13px;
      color: #7f9bc4;
      line-height: 1.8;
    }

    .tbl {
      width: 100%;
      border-collapse: collapse;
      font-size: 12.5px;
      margin-bottom: 8px;
    }
    
    .tbl th {
      color: var(--txt3);
      font-weight: 400;
      text-align: left;
      padding: 7px 10px;
      border-bottom: 1px solid var(--line);
      font-size: 11.5px;
      white-space: nowrap;
    }
    
    .tbl td {
      padding: 8px 10px;
      border-bottom: 1px solid rgba(76, 130, 255, 0.1);
      color: var(--txt);
    }
    
    .tbl tr {
      transition: 0.12s;
    }
    
    .tbl tr.clickable {
      cursor: pointer;
    }
    
    .tbl tr.clickable:hover {
      background: rgba(0, 212, 255, 0.08);
    }
    
    .tbl td.num {
      text-align: right;
      font-variant-numeric: tabular-nums;
    }
    
    /* 详情抽屉-全列左对齐表格（成长与偿债趋势 → 详细数据对比）：
       数值列(含 .num)与表头统一左对齐，仅此变体生效，不影响其它抽屉表格 */
    .tbl-left th,
    .tbl-left td {
      text-align: left !important;
    }
    
    .tbl .up { color: var(--success); }
    .tbl .dn { color: var(--danger); }
    .tbl .gold { color: var(--warning); }
    
    .tag2 {
      font-size: 11px;
      padding: 1px 8px;
      border-radius: 4px;
    }
    
    .tag2.ok { background: rgba(46, 204, 113, 0.14); color: var(--green); border: 1px solid rgba(46, 204, 113, 0.35); }
    .tag2.no { background: rgba(255, 107, 107, 0.14); color: var(--red); border: 1px solid rgba(255, 107, 107, 0.35); }
    
    .dw-note {
      font-size: 11.5px;
      color: var(--txt3);
      margin-top: 12px;
      line-height: 1.7;
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.4);
      padding: 12px;
      border-radius: 6px;
      border-left: 3px solid var(--cyan);
    }
    
    /* 数据清空 · 选择性删除面板 */
    .clear-note {
      background: rgba(255, 107, 107, 0.12);
      border: 1px solid rgba(255, 107, 107, 0.42);
      color: #ffc9c9;
      border-radius: 8px;
      padding: 11px 13px;
      font-size: 13px;
      line-height: 1.65;
      margin-bottom: 14px;
    }
    .clear-actions-top {
      display: flex;
      align-items: center;
      gap: 10px;
      margin-bottom: 12px;
    }
    .clear-count {
      margin-left: auto;
      font-size: 13px;
      color: var(--txt3);
    }
    .clear-list {
      display: flex;
      flex-direction: column;
      gap: 8px;
      margin-bottom: 16px;
    }
    .clear-item {
      display: flex;
      align-items: center;
      gap: 11px;
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.5);
      border: 1px solid var(--line);
      border-radius: 8px;
      padding: 12px 14px;
      cursor: pointer;
      font-size: 14px;
      color: var(--txt);
      transition: border-color .15s, background .15s;
    }
    .clear-item:hover {
      border-color: rgba(0, 212, 255, 0.5);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.78);
    }
    .clear-item input[type="checkbox"] {
      width: 17px;
      height: 17px;
      accent-color: #ff6b6b;
      cursor: pointer;
      flex-shrink: 0;
    }
    .clear-actions-bottom {
      display: flex;
      justify-content: flex-end;
      gap: 10px;
      padding-top: 14px;
      border-top: 1px solid var(--line);
    }
    .clear-actions-top .btn-secondary,
    .clear-actions-bottom .btn-secondary,
    .clear-actions-bottom .btn-danger {
      border: 0;
      border-radius: 8px;
      padding: 9px 18px;
      font-size: 14px;
      cursor: pointer;
      font-family: inherit;
      transition: filter .15s;
    }
    .clear-actions-top .btn-secondary,
    .clear-actions-bottom .btn-secondary {
      background: rgba(var(--t-r), var(--t-g), var(--t-b), 0.18);
      color: var(--txt);
      border: 1px solid var(--line);
    }
    .clear-actions-bottom .btn-danger {
      background: linear-gradient(135deg, #ff6b6b, #e03131);
      color: #fff;
      font-weight: 600;
    }
    .clear-actions-top .btn-secondary:hover,
    .clear-actions-bottom .btn-secondary:hover,
    .clear-actions-bottom .btn-danger:hover { filter: brightness(1.08); }
    
    /* ============ 品牌开屏（A+B 组合：品牌时刻 + 超时进度兜底） ============ */
    #splash {
      position: absolute;
      inset: 0;
      z-index: 100;
      background: radial-gradient(1200px 700px at 50% -10%, var(--vp-bg-1) 0%, var(--vp-bg-2) 45%, var(--vp-bg-3) 100%);
      overflow: hidden;
      transition: opacity 0.45s ease, visibility 0.45s ease;
    }

    #splash.hide {
      opacity: 0;
      visibility: hidden;
      pointer-events: none;
      z-index: -1;
    }

    /* —— 品牌段（A：品牌开屏时刻） —— */
    .splash-brand {
      position: absolute;
      left: 50%;
      top: calc(50% - 260px);
      width: 100%;
      text-align: center;
      transform: translateX(-50%);
      transition: transform 0.4s ease;
    }

    .splash-logo-box {
      position: relative;
      width: 340px;
      margin: 0 auto 60px;
    }

    .splash-logo {
      display: none;
      width: 100%;
      height: auto;
      opacity: 0;
      transform: translateY(14px);
      animation: splashLogoIn 0.7s cubic-bezier(0.16, 1, 0.3, 1) forwards;
    }

    /* 深色主题显示 CZlogo1，浅色主题显示 CZlogo2 */
    .splash-logo-dark { display: block; }
    .splash-logo-light { display: none; }
    html[data-theme="light"] .splash-logo-dark { display: none; }
    html[data-theme="light"] .splash-logo-light { display: block; }

    .splash-logo-line {
      position: absolute;
      left: 0;
      bottom: -14px;
      width: 0;
      height: 1px;
      background: linear-gradient(90deg, rgba(0, 212, 255, 0), #00d4ff 50%, rgba(0, 212, 255, 0));
      animation: splashLogoLine 0.9s ease 0.45s forwards;
    }

    .splash-title {
      font-size: 40px;
      font-weight: 600;
      line-height: 1.25;
      letter-spacing: 6px;
      color: #ffffff;
      white-space: nowrap;
      text-shadow: 0 0 30px rgba(0, 212, 255, 0.28);
      opacity: 0;
      transform: translateY(16px);
      animation: splashTextIn 0.7s cubic-bezier(0.16, 1, 0.3, 1) 0.15s forwards;
    }

    /* 浅色模式下系统名称为深色 */
    html[data-theme="light"] .splash-title {
      color: #1a2b42;
      text-shadow: 0 0 30px rgba(0, 150, 200, 0.15);
    }

    .splash-slogan {
      margin-top: 16px;
      font-size: 18px;
      font-weight: 400;
      line-height: 1.4;
      letter-spacing: 4px;
      color: rgba(255, 255, 255, 0.62);
      opacity: 0;
      transform: translateY(12px);
      animation: splashTextIn 0.7s cubic-bezier(0.16, 1, 0.3, 1) 0.3s forwards;
    }

    /* 浅色模式下口号为深色 */
    html[data-theme="light"] .splash-slogan {
      color: rgba(26, 43, 66, 0.65);
    }

    /* —— 进度段（B：超时兜底，仅进度模式显示） —— */
    .splash-progress {
      position: absolute;
      left: 50%;
      top: 50%;
      width: 640px;
      text-align: center;
      transform: translate(-50%, calc(-50% + 165px));
      opacity: 0;
      visibility: hidden;
      transition: opacity 0.4s ease, transform 0.4s ease, visibility 0.4s;
    }

    #splash.progress-mode .splash-brand {
      transform: translateX(-50%) translateY(-290px) scale(0.92);
    }

    #splash.progress-mode .splash-progress {
      opacity: 1;
      visibility: visible;
      transform: translate(-50%, calc(-50% - 30px));
    }

    .splash-progress-title {
      font-size: 20px;
      font-weight: 600;
      line-height: 1.4;
      letter-spacing: 3px;
      color: #ffffff;
    }

    .splash-steps {
      width: 460px;
      margin: 22px auto 0;
      text-align: left;
    }

    .splash-step {
      display: flex;
      align-items: center;
      gap: 14px;
      padding: 9px 0;
    }

    .splash-step-dot {
      position: relative;
      flex: none;
      width: 18px;
      height: 18px;
      border-radius: 50%;
      border: 1px solid #3c5b8a;
      background: rgba(60, 91, 138, 0.22);
    }

    .splash-step-text {
      font-size: 16px;
      line-height: 1.4;
      letter-spacing: 1px;
      color: rgba(255, 255, 255, 0.55);
      transition: color 0.3s ease;
    }

    .splash-step.active .splash-step-text { color: rgba(255, 255, 255, 0.92); }
    .splash-step.done .splash-step-text { color: rgba(255, 255, 255, 0.9); }

    .splash-step.active .splash-step-dot {
      border-color: rgba(0, 212, 255, 0.9);
      background: rgba(0, 212, 255, 0.08);
      animation: splashDotPulse 1.6s ease-in-out infinite;
    }

    .splash-step.active .splash-step-dot::before {
      content: "";
      position: absolute;
      left: 50%;
      top: 50%;
      width: 6px;
      height: 6px;
      margin: -3px 0 0 -3px;
      border-radius: 50%;
      background: #00d4ff;
    }

    .splash-step.done .splash-step-dot {
      border-color: #0fae7e;
      background: #0fae7e;
      animation: none;
    }

    .splash-step.done .splash-step-dot::before { display: none; }

    .splash-step.done .splash-step-dot::after {
      content: "✓";
      position: absolute;
      inset: 0;
      display: flex;
      align-items: center;
      justify-content: center;
      color: #ffffff;
      font-size: 12px;
      font-weight: 700;
      line-height: 1;
    }

    .splash-bar {
      width: 460px;
      height: 6px;
      margin: 24px auto 0;
      border-radius: 3px;
      background: rgba(255, 255, 255, 0.08);
      overflow: hidden;
    }

    .splash-bar-fill {
      width: 0;
      height: 100%;
      border-radius: 3px;
      background: linear-gradient(90deg, #00d4ff, #7cc7ff);
      box-shadow: 0 0 8px rgba(0, 212, 255, 0.45);
      transition: width 0.4s ease;
    }

    /* —— 品牌段底部细进度光条（A 的兜底视觉；就绪早会停在中间再随整体淡出） —— */
    .splash-timeline {
      position: absolute;
      left: 0;
      bottom: 0;
      width: 0;
      height: 3px;
      background: linear-gradient(90deg, rgba(0, 212, 255, 0), #00d4ff 40%, #7cc7ff 70%, rgba(124, 199, 255, 0));
      animation: splashTimeline 2.2s linear forwards;
    }

    /* —— 品牌开屏动画 —— */
    @keyframes splashLogoIn {
      to { opacity: 1; transform: translateY(0); }
    }

    @keyframes splashLogoLine {
      to { width: 100%; }
    }

    @keyframes splashTextIn {
      to { opacity: 1; transform: translateY(0); }
    }

    @keyframes splashTimeline {
      to { width: 100%; }
    }

    @keyframes splashDotPulse {
      0%, 100% { opacity: 0.6; transform: scale(1); }
      50% { opacity: 1; transform: scale(1.15); }
    }

    /* 入场动画 */
    .kpi {
      opacity: 0;
      transform: translateY(20px);
      animation: kpiEnter 0.6s cubic-bezier(0.16, 1, 0.3, 1) forwards;
    }
    
    .kpi:nth-child(1) { animation-delay: 0.1s; }
    .kpi:nth-child(2) { animation-delay: 0.18s; }
    .kpi:nth-child(3) { animation-delay: 0.26s; }
    .kpi:nth-child(4) { animation-delay: 0.34s; }
    .kpi:nth-child(5) { animation-delay: 0.42s; }
    
    @keyframes kpiEnter {
      to {
        opacity: 1;
        transform: translateY(0);
      }
    }
    
    .panel {
      opacity: 0;
      transform: translateY(16px);
      animation: panelEnter 0.55s cubic-bezier(0.16, 1, 0.3, 1) forwards;
    }
    
    .col-l .panel:nth-child(1) { animation-delay: 0.05s; }
    .col-l .panel:nth-child(2) { animation-delay: 0.12s; }
    .col-l .panel:nth-child(3) { animation-delay: 0.22s; }
    .col-m .panel:nth-child(1) { animation-delay: 0.1s; }
    .col-m .panel:nth-child(2) { animation-delay: 0.2s; }
    .col-r .panel:nth-child(1) { animation-delay: 0.1s; }
    .col-r .panel:nth-child(2) { animation-delay: 0.2s; }
    .col-r .panel:nth-child(3) { animation-delay: 0.3s; }
    
    @keyframes panelEnter {
      to {
        opacity: 1;
        transform: translateY(0);
      }
    }
    
    .health-card {
      opacity: 0;
      transform: scale(0.95);
      animation: healthEnter 0.5s ease forwards;
    }
    
    .health-card:nth-child(1) { animation-delay: 0.1s; }
    .health-card:nth-child(2) { animation-delay: 0.15s; }
    .health-card:nth-child(3) { animation-delay: 0.2s; }
    .health-card:nth-child(4) { animation-delay: 0.25s; }
    .health-card:nth-child(5) { animation-delay: 0.3s; }
    .health-card:nth-child(6) { animation-delay: 0.35s; }
    .health-card:nth-child(7) { animation-delay: 0.4s; }
    .health-card:nth-child(8) { animation-delay: 0.45s; }
    
    @keyframes healthEnter {
      to {
        opacity: 1;
        transform: scale(1);
      }
    }
    
    /* 快捷键提示 */
    .shortcut-hint {
      position: fixed;
      bottom: 20px;
      left: 50%;
      transform: translateX(-50%);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.8);
      border: 1px solid var(--line2);
      border-radius: 20px;
      padding: 8px 20px;
      font-size: 11px;
      color: var(--txt3);
      letter-spacing: 1px;
      z-index: 50;
      opacity: 0;
      animation: hintShow 0.5s ease 1s forwards;
    }
    
    @keyframes hintShow {
      to { opacity: 1; }
    }
    
    .shortcut-hint kbd {
      display: inline-block;
      background: rgba(0, 212, 255, 0.15);
      border: 1px solid rgba(0, 212, 255, 0.3);
      border-radius: 4px;
      padding: 2px 6px;
      margin: 0 4px;
      color: var(--cyan);
      font-family: inherit;
      font-size: 10px;
    }
    
    /* 数据录入表格样式 */
    .data-entry-container {
      padding: 0;
      display: flex;
      flex-direction: column;
    }
    
    .data-entry-header-row {
      display: flex;
      justify-content: space-between;
      align-items: flex-end;
      padding: 0 20px 16px;
      flex-shrink: 0;
      gap: 20px;
    }
    
    .data-entry-header-row .data-entry-tabs {
      flex: 0 1 auto;
      margin-bottom: 0;
      padding-bottom: 4px;
      margin-left: -20px;
    }
    
    .data-entry-actions {
      display: flex;
      gap: 10px;
      flex-shrink: 0;
    }
    
    .data-entry-actions button {
      padding: 8px 16px;
      border-radius: 6px;
      font-size: 12px;
      font-weight: 500;
      cursor: pointer;
      transition: all 0.2s ease;
      display: flex;
      align-items: center;
      gap: 6px;
      white-space: nowrap;
    }
    
    .data-entry-actions .btn-primary {
      background: linear-gradient(135deg, var(--cyan), #0098ff);
      border: none;
      color: #fff;
    }
    
    .data-entry-actions .btn-primary:hover {
      transform: translateY(-1px);
      box-shadow: 0 4px 12px rgba(0, 212, 255, 0.4);
    }
    
    .data-entry-actions .btn-secondary {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      border: 1px solid var(--line);
      color: var(--txt2);
    }
    
    .data-entry-actions .btn-secondary:hover {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.8);
      border-color: var(--cyan);
    }
    
    .data-entry-actions .btn-danger {
      background: rgba(255, 107, 107, 0.15);
      border: 1px solid rgba(255, 107, 107, 0.3);
      color: var(--danger);
    }
    
    .data-entry-actions .btn-danger:hover {
      background: rgba(255, 107, 107, 0.25);
    }
    
    .data-entry-tabs {
      display: flex;
      gap: 4px;
      flex-shrink: 0;
      border-bottom: 1px solid var(--line);
    }
    
    .data-entry-tabs .tab-btn {
      padding: 10px 20px;
      border-radius: 6px 6px 0 0;
      font-size: 13px;
      font-weight: 500;
      cursor: pointer;
      transition: all 0.2s ease;
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.3);
      border: 1px solid transparent;
      border-bottom: none;
      color: var(--de-tab-ink-off);
    }
    
    .data-entry-tabs .tab-btn:hover {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.5);
      color: var(--txt2);
    }
    
    .data-entry-tabs .tab-btn.active {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.8);
      border-color: var(--line);
      color: var(--de-tab-ink-on);
      font-weight: 600;
    }
    
    .data-entry-table-wrapper {
      overflow-x: auto;
      overflow-y: visible;
      border-radius: 0;
      border: none;
      border-top: 1px solid var(--line);
      background: rgba(var(--i-r), var(--i-g), var(--i-b), 0.4);
    }
    
    .data-entry-content {
      display: flex;
      flex-direction: column;
    }
    
    .data-entry-table {
      table-layout: fixed;
      width: 1172px;
      min-width: 0;
      border-collapse: separate;
      border-spacing: 0;
      font-size: 12px;
    }
    
    .data-entry-table thead {
      z-index: 10;
    }
    
    .data-entry-table th {
      background: linear-gradient(180deg, var(--th-bg-1), var(--th-bg-2));
      color: var(--txt);
      font-weight: 600;
      padding: 12px 10px;
      text-align: center;
      border-bottom: 2px solid var(--line);
      white-space: nowrap;
      font-size: 11px;
      box-sizing: border-box;
    }
    
    /* 固定列：项目列（宽 176，长科目名自动换行，避免溢出挤宽表格/被相邻固定列遮挡） */
    .data-entry-table th.col-item,
    .data-entry-table td.col-item {
      position: sticky;
      left: 0;
      z-index: 5;
      width: 176px;
      min-width: 176px;
      max-width: 176px;
      text-align: left;
      padding-left: 12px;
      padding-right: 8px;
      white-space: normal;
      line-height: 1.35;
      background: linear-gradient(180deg, var(--th-bg-1), var(--th-bg-2));
    }
    
    /* 月份列 */
    .data-entry-table th.col-month {
      width: 76px;
      min-width: 76px;
      max-width: 76px;
    }
    
    /* 固定列在tbody中的样式 - 默认样式 */
    .data-entry-table tbody tr td.col-item {
      background: rgba(15, 30, 60, 0.95);
      color: var(--txt);
      font-weight: 500;
    }
    
    /* hover时固定列背景 */
    .data-entry-table tbody tr:hover td.col-item {
      background: rgba(0, 212, 255, 0.1);
    }
    
    /* 数据行奇数行的固定列背景（浅蓝色）- 使用更高优先级选择器 */
    .data-entry-table tbody tr.data-row.data-row-odd td.col-item {
      background: rgba(76, 130, 255, 0.15) !important;
    }
    
    .data-entry-table tbody tr.data-row.data-row-odd:hover td.col-item {
      background: rgba(0, 212, 255, 0.15) !important;
    }
    
    /* 数据行偶数行的固定列背景（保持原样） */
    .data-entry-table tbody tr.data-row.data-row-even td.col-item {
      background: rgba(15, 30, 60, 0.95);
    }
    
    .data-entry-table tbody tr.data-row.data-row-even:hover td.col-item {
      background: rgba(0, 212, 255, 0.1);
    }
    
    .data-entry-table td {
      padding: 10px 6px;
      text-align: center;
      border-bottom: 1px solid rgba(76, 130, 255, 0.1);
      color: var(--txt2);
      width: 76px;
      min-width: 76px;
      max-width: 76px;
    }
    
    /* 数据行hover效果 */
    .data-entry-table tbody tr.data-row:hover {
      background: rgba(0, 212, 255, 0.05);
    }
    
    /* 数据行斑马纹：奇数行浅蓝色背景 */
    .data-entry-table tbody tr.data-row.data-row-odd {
      background: rgba(76, 130, 255, 0.15) !important;
    }
    
    .data-entry-table tbody tr.data-row.data-row-odd:hover {
      background: rgba(0, 212, 255, 0.15) !important;
    }
    
    /* 偶数行保持原样（透明背景） */
    .data-entry-table tbody tr.data-row.data-row-even {
      background: transparent;
    }
    
    .data-entry-table tbody tr.data-row.data-row-even:hover {
      background: rgba(0, 212, 255, 0.05);
    }
    
    /* 统一输入框基础样式 */
    .unified-input {
      padding: var(--input-padding);
      border: 1px solid var(--input-border);
      border-radius: var(--input-radius);
      background: var(--input-bg);
      color: var(--txt);
      font-size: var(--input-font-size);
      font-family: 'Consolas', 'Monaco', monospace;
      text-align: right;
      transition: all 0.2s ease;
      box-sizing: border-box;
    }
    
    .unified-input:focus {
      outline: none;
      border-color: var(--input-focus-border);
      background: rgba(var(--i-r), var(--i-g), var(--i-b), 0.8);
      box-shadow: var(--input-focus-shadow);
    }
    
    .unified-input::placeholder {
      color: var(--txt3);
      text-align: left;
    }
    
    /* 报表录入输入框样式（继承统一基础） */
    .data-entry-table input {
      width: 73px;
      padding: 6px 8px;
      border: 1px solid var(--line2);
      border-radius: 4px;
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.4);
      color: var(--txt);
      font-size: 12px;
      text-align: right;
      font-variant-numeric: tabular-nums;
      box-sizing: border-box;
      transition: all 0.2s ease;
    }
    
    /* 2026-09-11 P1-1（U-6）：账龄台账 / 维度数据金额输入框几何对齐列宽。
       原与 .data-entry-table input 共用 73px 固定宽 → 账龄列宽 121px 时输入框只占 73px（40% 空置），
       且 11 字符金额（1234567.89）scrollWidth 79 > clientWidth 71 被裁切（证据 L7_账龄_长数值单元格.png）。
       配色保持原状（原规则走 --p-r/g/b 变量，本身已双主题自适应）→ 深色主题零变化，只改几何。 */
    /* ★ 2026-09-12 优化：增强维度数据TAB输入框的视觉辨识度，让用户一眼识别可录入区域 */
    .de-ag-table .aging-cell,
    .dimension-data-tab .dim-num {
      width: 100%;
      height: var(--de-cell-h);
      padding: 0 8px;
      border: 1.5px solid rgba(0, 212, 255, 0.35);
      border-radius: 4px;
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.55);
      color: var(--txt);
      font-size: 12px;
      font-family: inherit;
      text-align: right;
      font-variant-numeric: tabular-nums;
      box-sizing: border-box;
      transition: all 0.2s ease;
    }
    .dimension-data-tab .dim-num:hover {
      border-color: rgba(0, 212, 255, 0.6);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.65);
    }
    .de-ag-table .aging-cell:focus,
    .dimension-data-tab .dim-num:focus {
      outline: none;
      border-color: var(--input-focus-border);
      box-shadow: var(--input-focus-shadow);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.75);
    }

    /* 隐藏数字输入框的增减按钮（资产负债表 / 账龄台账 / 维度数据 同款） */
    .data-entry-table input::-webkit-outer-spin-button,
    .data-entry-table input::-webkit-inner-spin-button,
    .dimension-data-tab input::-webkit-outer-spin-button,
    .dimension-data-tab input::-webkit-inner-spin-button,
    .aging-cell::-webkit-outer-spin-button,
    .aging-cell::-webkit-inner-spin-button,
    .dim-num::-webkit-outer-spin-button,
    .dim-num::-webkit-inner-spin-button {
      -webkit-appearance: none;
      margin: 0;
    }
    
    .data-entry-table input[type=number],
    .dimension-data-tab input[type=number],
    .aging-cell[type=number],
    .dim-num[type=number] {
      -moz-appearance: textfield;
    }
    
    .data-entry-table input:focus {
      outline: none;
      border-color: var(--cyan);
      box-shadow: 0 0 0 2px rgba(0, 212, 255, 0.2);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
    }
    
    .data-entry-table input:hover {
      border-color: rgba(0, 212, 255, 0.5);
    }
    
    .data-entry-table input::placeholder {
      color: var(--txt3);
      text-align: center;
    }
    
    /* 分类标题行：浅橙色背景 + 橙色文字 */
    .data-entry-table tbody tr.category-row {
      background: rgba(255, 169, 77, 0.12) !important;
      font-weight: 600;
    }
    
    .data-entry-table tbody tr.category-row td {
      background: transparent !important;
      color: var(--orange) !important;
      border-bottom: 1px solid var(--line);
    }
    
    .data-entry-table tbody tr.category-row td.col-item {
      background: rgba(255, 169, 77, 0.12) !important;
      color: var(--orange) !important;
    }
    
    /* 补充数据TAB：分类名称输入框（弹性占满首列剩余空间，删除按钮不被遮挡） */
    .data-entry-table .category-name-input {
      flex: 1 1 auto;
      min-width: 0;
      width: auto;
      text-align: left;
      font-weight: 600;
      background: rgba(76, 130, 255, 0.12);
      border-color: rgba(76, 130, 255, 0.4);
      color: var(--txt);
    }
    
    .data-entry-table .category-name-input::placeholder {
      text-align: left;
      color: var(--txt3);
    }
    
    /* 补充数据TAB：首列单元格（名称输入 + 删除按钮并排） */
    .data-entry-table .supplementary-name-cell {
      display: flex;
      align-items: center;
      gap: 6px;
      min-width: 0;
    }
    
    /* 补充数据TAB：删除分类按钮 */
    .data-entry-table .btn-icon {
      flex-shrink: 0;
      width: 26px;
      height: 26px;
      padding: 0;
      border: 1px solid rgba(244, 67, 54, 0.4);
      border-radius: 4px;
      background: rgba(244, 67, 54, 0.1);
      color: #f43f30;
      font-size: 12px;
      line-height: 1;
      cursor: pointer;
      transition: all 0.2s ease;
      display: inline-flex;
      align-items: center;
      justify-content: center;
    }
    
    .data-entry-table .btn-icon:hover {
      background: rgba(244, 67, 54, 0.25);
      border-color: #f43f30;
      box-shadow: 0 0 0 2px rgba(244, 63, 48, 0.2);
    }
    
    /* 补充数据TAB：添加分类按钮与提示区 */
    .supplementary-data-wrapper .supplementary-actions {
      display: flex;
      align-items: center;
      gap: 16px;
      margin-top: 10px;
      padding: 0 4px;
    }
    
    .supplementary-data-wrapper .btn-add-category {
      border: 1px dashed rgba(0, 212, 255, 0.5);
      background: rgba(0, 212, 255, 0.08);
      color: var(--cyan);
    }
    
    .supplementary-data-wrapper .btn-add-category:hover {
      background: rgba(0, 212, 255, 0.15);
      border-color: var(--cyan);
      border-style: solid;
    }
    
    .supplementary-data-wrapper .supplementary-hint {
      color: var(--de-note-ink);
      font-size: 11px;
    }
    
    .data-entry-table .subtotal-row {
      background: rgba(255, 169, 77, 0.08) !important;
    }
    
    .data-entry-table .subtotal-row td {
      color: var(--orange);
      font-weight: 600;
    }
    
    .data-entry-table .total-row {
      background: rgba(16, 185, 129, 0.1) !important;
    }
    
    .data-entry-table .total-row td {
      color: var(--success);
      font-weight: 700;
      border-top: 2px solid var(--line);
    }
    
    .data-entry-status {
      display: flex;
      align-items: center;
      gap: 8px;
      padding: 12px 16px;
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.4);
      border-radius: 6px;
      margin-top: 12px;
      font-size: 12px;
      color: var(--txt2);
      flex-shrink: 0;
    }
    
    .data-entry-status .status-icon {
      width: 8px;
      height: 8px;
      border-radius: 50%;
    }
    
    .data-entry-status .status-icon.saved {
      background: var(--success);
      box-shadow: 0 0 6px rgba(16, 185, 129, 0.5);
    }
    
    .data-entry-status .status-icon.unsaved {
      background: var(--warning);
      box-shadow: 0 0 6px rgba(255, 169, 77, 0.5);
    }
    
    /* 模板管理样式 */
    .template-management-container {
      padding: 20px;
      height: 100%;
      display: flex;
      flex-direction: column;
      overflow: hidden;
    }
    
    .template-management-header {
      display: flex;
      justify-content: space-between;
      align-items: center;
      margin-bottom: 16px;
      flex-shrink: 0;
    }
    
    .template-management-header h3 {
      font-size: 18px;
      font-weight: 600;
      color: var(--txt);
      display: flex;
      align-items: center;
      gap: 10px;
    }
    
    .template-management-header h3::before {
      content: "📋";
    }
    
    .template-tabs {
      display: flex;
      gap: 4px;
      margin-bottom: 16px;
      flex-shrink: 0;
      border-bottom: 1px solid var(--line);
      padding-bottom: 4px;
    }
    
    .template-tabs .tab-btn {
      padding: 10px 24px;
      border-radius: 6px 6px 0 0;
      font-size: 13px;
      font-weight: 500;
      cursor: pointer;
      transition: all 0.2s ease;
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.3);
      border: 1px solid transparent;
      border-bottom: none;
      color: var(--txt3);
    }
    
    .template-tabs .tab-btn:hover {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.5);
      color: var(--txt2);
    }
    
    .template-tabs .tab-btn.active {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.8);
      border-color: var(--line);
      color: var(--cyan);
      font-weight: 600;
    }
    
    .template-content-wrapper {
      flex: 1;
      overflow-y: auto;
      border-radius: 8px;
      border: 1px solid var(--line);
      background: rgba(var(--i-r), var(--i-g), var(--i-b), 0.4);
      padding: 16px;
      scrollbar-width: none; /* Firefox */
      -ms-overflow-style: none; /* IE and Edge */
    }
    
    .template-content-wrapper::-webkit-scrollbar {
      display: none; /* Chrome, Safari, Opera */
    }
    
    .template-content {
      font-size: 12px;
      line-height: 1.8;
    }
    
    .template-content h4 {
      font-size: 15px;
      font-weight: 600;
      color: var(--cyan);
      margin: 16px 0 12px;
      padding-bottom: 8px;
      border-bottom: 1px solid var(--line);
    }
    
    .template-content h4:first-child {
      margin-top: 0;
    }
    
    .template-content table {
      width: 100%;
      border-collapse: collapse;
      margin: 12px 0;
    }
    
    .template-content table th,
    .template-content table td {
      padding: 8px 12px;
      text-align: left;
      border: 1px solid var(--line2);
    }
    
    .template-content table th {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.5);
      color: var(--txt);
      font-weight: 600;
    }
    
    .template-content table td {
      color: var(--txt2);
    }
    
    .template-content ul {
      list-style: none;
      padding: 0;
      margin: 8px 0;
    }
    
    .template-content li {
      padding: 6px 0 6px 20px;
      position: relative;
      color: var(--txt2);
    }
    
    .template-content li::before {
      content: "•";
      position: absolute;
      left: 6px;
      color: var(--cyan);
    }
    
    /* 模板管理 - 操作按钮样式 */
    .template-item-actions {
      display: flex;
      gap: 4px;
      justify-content: flex-start;
      flex-wrap: nowrap;
    }
    
    .template-btn {
      padding: 4px 8px;
      margin: 0;
      border-radius: 4px;
      font-size: 11px;
      cursor: pointer;
      transition: all 0.2s ease;
      border: 1px solid var(--line);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.5);
      color: var(--txt);
      white-space: nowrap;
    }
    
    .template-btn:hover:not(.disabled) {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.8);
      border-color: var(--cyan);
      transform: translateY(-1px);
    }
    
    .template-btn.disabled {
      opacity: 0.4;
      cursor: not-allowed;
      background: rgba(100, 100, 100, 0.3);
      color: var(--txt3);
    }
    
    .template-btn.edit-btn:hover:not(.disabled) {
      border-color: var(--cyan);
      color: var(--cyan);
    }
    
    .template-btn.delete-btn:hover:not(.disabled) {
      border-color: var(--danger);
      color: var(--danger);
    }
    
    .template-btn.add-btn:hover:not(.disabled) {
      border-color: var(--green);
      color: var(--green);
    }
    
    .readonly-hint {
      font-size: 16px;
      opacity: 0.5;
      cursor: not-allowed;
    }
    
    /* 模板管理 - 行样式 */
    .indicator-row {
      background: rgba(0, 212, 255, 0.08);
      border-left: 3px solid var(--cyan);
    }
    
    .calculated-row {
      background: rgba(16, 185, 129, 0.12);
      font-weight: 700;
    }
    
    .action-cell {
      min-width: 200px;
    }
    
    /* 模板管理 - 头部操作按钮容器 */
    .template-header-actions {
      display: flex;
      gap: 10px;
      margin-right: 42px;
    }
    
    .template-header-actions button {
      padding: 8px 16px;
      border-radius: 6px;
      font-size: 12px;
      font-weight: 500;
      cursor: pointer;
      transition: all 0.2s ease;
      border: 1px solid var(--line);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      color: var(--txt2);
    }
    
    .template-header-actions button:hover {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.8);
      border-color: var(--cyan);
    }
    
    /* 模板管理 - 未保存标记 */
    .unsaved-mark {
      color: var(--orange);
      animation: pulse 2s infinite;
    }
    
    @keyframes pulse {
      0%, 100% { opacity: 1; }
      50% { opacity: 0.5; }
    }
    
    /* 模板管理 - 编辑对话框 */
    .template-edit-dialog {
      position: fixed;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      background: rgba(0, 0, 0, 0.7);
      display: flex;
      align-items: center;
      justify-content: center;
      z-index: 10000;
    }
    
    .template-edit-dialog .dialog-content {
      background: linear-gradient(135deg, rgba(var(--p-r), var(--p-g), var(--p-b), 0.98), rgba(11, 25, 50, 0.99));
      border: 1px solid var(--line);
      border-radius: 12px;
      padding: 24px;
      min-width: 400px;
      max-width: 500px;
      box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6);
    }
    
    .template-edit-dialog h3 {
      margin: 0 0 20px 0;
      color: var(--cyan);
      font-size: 16px;
      font-weight: 600;
      padding-bottom: 12px;
      border-bottom: 1px solid var(--line);
    }
    
    .template-edit-dialog .form-group {
      margin-bottom: 16px;
    }
    
    .template-edit-dialog label {
      display: block;
      margin-bottom: 6px;
      color: var(--txt2);
      font-size: 13px;
      font-weight: 500;
    }
    
    .template-edit-dialog input,
    .template-edit-dialog select {
      width: 100%;
      padding: 10px 12px;
      border: 1px solid var(--line);
      border-radius: 6px;
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      color: var(--txt);
      font-size: 14px;
      transition: all 0.2s ease;
    }
    
    .template-edit-dialog input:focus,
    .template-edit-dialog select:focus {
      outline: none;
      border-color: var(--cyan);
      box-shadow: 0 0 0 3px rgba(0, 212, 255, 0.1);
    }
    
    .template-edit-dialog select:disabled {
      opacity: 0.6;
      cursor: not-allowed;
    }
    
    .template-edit-dialog .hint {
      font-size: 11px;
      color: var(--orange);
      margin-top: 4px;
      display: block;
    }
    
    .template-edit-dialog .dialog-buttons {
      margin-top: 24px;
      padding-top: 16px;
      border-top: 1px solid var(--line);
      display: flex;
      justify-content: flex-end;
      gap: 12px;
    }
    
    .template-edit-dialog .dialog-buttons button {
      padding: 10px 20px;
      border-radius: 6px;
      font-size: 14px;
      font-weight: 500;
      cursor: pointer;
      transition: all 0.2s ease;
      border: 1px solid var(--line);
    }
    
    .template-edit-dialog .btn-secondary {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.5);
      color: var(--txt2);
    }
    
    .template-edit-dialog .btn-secondary:hover {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.8);
      color: var(--txt);
    }
    
    .template-edit-dialog .btn-primary {
      background: linear-gradient(135deg, rgba(0, 212, 255, 0.3), rgba(0, 180, 220, 0.3));
      border-color: var(--cyan);
      color: var(--cyan);
    }
    
    .template-edit-dialog .btn-primary:hover {
      background: linear-gradient(135deg, rgba(0, 212, 255, 0.5), rgba(0, 180, 220, 0.5));
      transform: translateY(-1px);
      box-shadow: 0 4px 12px rgba(0, 212, 255, 0.2);
    }
    
    /* 快速录入样式 */
    .quick-entry-container {
      display: flex;
      flex-direction: column;
      height: 100%;
      gap: 0;
    }
    
    /* 成功提示条 */
    .quick-entry-success-banner {
      position: sticky;
      top: 0;
      z-index: 10;
      padding: 12px 20px;
      background: rgba(16, 185, 129, 0.15);
      border: 1px solid rgba(16, 185, 129, 0.4);
      border-radius: 6px;
      margin: 12px 20px 0;
      display: flex;
      align-items: center;
      justify-content: space-between;
      gap: 16px;
      animation: slideDown 0.3s ease;
    }
    
    .quick-entry-success-banner.success-hidden {
      display: none;
    }
    
    .quick-entry-success-message {
      display: flex;
      align-items: center;
      gap: 8px;
      color: var(--rise);
      font-size: 14px;
      font-weight: 500;
    }
    
    .quick-entry-success-actions {
      display: flex;
      gap: 8px;
    }
    
    .quick-entry-success-btn {
      padding: 6px 12px;
      border: 1px solid rgba(16, 185, 129, 0.5);
      background: rgba(16, 185, 129, 0.2);
      color: var(--rise);
      border-radius: 4px;
      font-size: 12px;
      cursor: pointer;
      transition: all 0.2s ease;
      white-space: nowrap;
    }
    
    .quick-entry-success-btn:hover {
      background: rgba(16, 185, 129, 0.3);
      border-color: var(--rise);
    }
    
    @keyframes slideDown {
      from {
        opacity: 0;
        transform: translateY(-10px);
      }
      to {
        opacity: 1;
        transform: translateY(0);
      }
    }
    
    /* 「数据录入」抽屉内嵌的快速录入 TAB：容器占满可视高度（内部 .quick-entry-body 自行滚动） */
    .data-entry-content .quick-entry-container {
      height: calc(100vh - 230px);
      min-height: 520px;
    }
    
    .quick-entry-selector {
      flex-shrink: 0;
      padding: 16px 20px;
      background: rgba(var(--i-r), var(--i-g), var(--i-b), 0.3);
      border-bottom: 1px solid var(--line);
      display: flex;
      align-items: center;
      gap: 20px;
    }
    .quick-entry-selector-label {
      font-size: 14px;
      color: var(--txt2);
      font-weight: 500;
    }
    
    .quick-entry-selector-group {
      display: flex;
      align-items: center;
      gap: 12px;
    }
    
    .quick-entry-selector-group select {
      padding: 8px 12px;
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.5);
      border: 1px solid var(--line);
      border-radius: 6px;
      color: var(--txt);
      font-size: 14px;
      cursor: pointer;
      min-width: 100px;
    }
    
    .quick-entry-selector-group select:focus {
      outline: none;
      border-color: var(--cyan);
      box-shadow: 0 0 0 2px rgba(0, 212, 255, 0.1);
    }
    
    .quick-entry-selector-hint {
      font-size: 12px;
      color: var(--txt3);
      margin-left: auto;
    }
    
    .quick-entry-body {
      flex: 1;
      display: flex;
      gap: 16px;
      padding: 16px;
      overflow: hidden;
    }
    
    .quick-entry-form {
      flex: 1;
      overflow-y: auto;
      padding-right: 8px;
    }
    
    .quick-entry-form::-webkit-scrollbar {
      width: 6px;
    }
    
    .quick-entry-form::-webkit-scrollbar-track {
      background: rgba(var(--i-r), var(--i-g), var(--i-b), 0.3);
      border-radius: 3px;
    }
    
    .quick-entry-form::-webkit-scrollbar-thumb {
      background: rgba(76, 130, 255, 0.3);
      border-radius: 3px;
    }
    
    .quick-entry-form::-webkit-scrollbar-thumb:hover {
      background: rgba(76, 130, 255, 0.5);
    }
    
    .quick-entry-section {
      margin-bottom: 16px;
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.3);
      border: 1px solid var(--line);
      border-radius: 8px;
      overflow: hidden;
      transition: all 0.3s ease;
    }
    
    .quick-entry-section.collapsed {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.15);
      border-left: 4px solid var(--cyan);
    }
    
    .quick-entry-section-header {
      display: flex;
      align-items: center;
      justify-content: space-between;
      padding: 12px 16px;
      background: rgba(255, 169, 77, 0.08);
      border-bottom: 1px solid var(--line);
      cursor: pointer;
      user-select: none;
    }
    
    .quick-entry-section-header:hover {
      background: rgba(255, 169, 77, 0.12);
    }
    
    .quick-entry-section-title {
      font-size: 14px;
      font-weight: 600;
      color: var(--orange);
      display: flex;
      align-items: center;
      gap: 8px;
    }
    
    .quick-entry-section-title .icon {
      font-size: 16px;
    }
    
    .quick-entry-section-count {
      font-size: 11px;
      color: var(--txt3);
      padding: 2px 8px;
      background: rgba(76, 130, 255, 0.2);
      border-radius: 10px;
    }
    
    .quick-entry-section-toggle {
      color: var(--txt3);
      font-size: 12px;
      transition: transform 0.3s ease;
    }
    
    .quick-entry-section.collapsed .quick-entry-section-toggle {
      transform: rotate(-90deg);
    }
    
    .quick-entry-section.collapsed .quick-entry-section-content {
      max-height: 0;
      padding: 0 16px;
      opacity: 0;
      overflow: hidden;
    }
    
    .quick-entry-section-content {
      padding: 12px 16px;
      max-height: 2000px;
      opacity: 1;
      transition: max-height 0.3s ease, padding 0.3s ease, opacity 0.3s ease;
    }
    
    .quick-entry-row {
      display: grid;
      grid-template-columns: 1fr 140px 140px;
      gap: 12px;
      align-items: center;
      padding: 10px 0;
      border-bottom: 1px solid rgba(76, 130, 255, 0.1);
    }
    
    .quick-entry-row:last-child {
      border-bottom: none;
    }
    
    .quick-entry-label {
      font-size: 12px;
      color: var(--txt2);
      display: flex;
      flex-direction: column;
      gap: 2px;
    }
    
    .quick-entry-label-name {
      font-weight: 500;
      color: var(--txt);
    }
    
    .quick-entry-label-hint {
      font-size: 12px;
      color: var(--txt2);
      margin-top: 2px;
    }
    
    .quick-entry-input-group {
      display: flex;
      flex-direction: column;
      gap: 4px;
    }
    
    .quick-entry-input-label {
      font-size: 10px;
      color: var(--txt3);
    }
    
    .quick-entry-input {
      width: 100%;
      padding: var(--input-padding);
      border: 1px solid var(--input-border);
      border-radius: var(--input-radius);
      background: var(--input-bg);
      color: var(--txt);
      font-size: var(--input-font-size);
      font-family: 'Consolas', 'Monaco', monospace;
      text-align: right;
      transition: all 0.2s ease;
    }
    
    /* 隐藏数字输入框的微调按钮 */
    .quick-entry-input::-webkit-outer-spin-button,
    .quick-entry-input::-webkit-inner-spin-button {
      -webkit-appearance: none;
      margin: 0;
    }
    .quick-entry-input[type=number] {
      -moz-appearance: textfield;
    }
    
    .quick-entry-input:focus {
      outline: none;
      border-color: var(--input-focus-border);
      background: rgba(var(--i-r), var(--i-g), var(--i-b), 0.8);
      box-shadow: var(--input-focus-shadow);
    }
    
    .quick-entry-input::placeholder {
      color: var(--txt3);
      text-align: left;
    }
    
    /* 上期金额只读样式 */
    .quick-entry-input[readonly] {
      background: rgba(76, 130, 255, 0.05);
      border: 1px dashed var(--line);
      color: var(--txt2);
      cursor: not-allowed;
    }
    
    .quick-entry-input[readonly]:focus {
      border-color: var(--line);
      background: rgba(76, 130, 255, 0.05);
      box-shadow: none;
    }
    
    /* 勾稽校验错误状态 */
    .quick-entry-input.error {
      border-color: var(--danger) !important;
      background: rgba(255, 107, 107, 0.1) !important;
      animation: shake 0.3s ease;
    }
    
    .quick-entry-input.error:focus {
      box-shadow: 0 0 8px rgba(255, 107, 107, 0.3) !important;
    }
    
    /* 业务分类收入金额输入框样式 */
    .qe-sup-amount::-webkit-outer-spin-button,
    .qe-sup-amount::-webkit-inner-spin-button {
      -webkit-appearance: none;
      margin: 0;
    }
    .qe-sup-amount[type=number] {
      -moz-appearance: textfield;
    }
    
    .quick-entry-error-message {
      color: var(--danger);
      font-size: 11px;
      margin-top: 2px;
      padding-left: 4px;
    }
    
    @keyframes shake {
      0%, 100% { transform: translateX(0); }
      25% { transform: translateX(-5px); }
      75% { transform: translateX(5px); }
    }
    
    /* 业务分类删除状态 */
    .qe-sup-row.marked-delete {
      background: rgba(255, 107, 107, 0.1) !important;
      opacity: 0.6;
    }
    
    .qe-sup-row.marked-delete td {
      text-decoration: line-through;
      color: var(--txt3);
    }
    
    .qe-sup-row.marked-delete .qe-sup-name,
    .qe-sup-row.marked-delete .qe-sup-amount {
      text-decoration: line-through;
      background: rgba(255, 107, 107, 0.05);
    }
    
    .qe-undo-delete-btn {
      background: rgba(255, 107, 107, 0.2);
      border: 1px solid var(--danger);
      color: var(--danger);
      padding: 2px 8px;
      border-radius: 3px;
      font-size: 11px;
      cursor: pointer;
      transition: all 0.2s ease;
    }
    
    .qe-undo-delete-btn:hover {
      background: rgba(255, 107, 107, 0.3);
    }
    
    .quick-entry-preview {
      width: 280px;
      flex-shrink: 0;
      background: rgba(var(--i-r), var(--i-g), var(--i-b), 0.4);
      border: 1px solid var(--line);
      border-radius: 8px;
      padding: 16px;
      overflow-y: auto;
    }
    
    .quick-entry-preview-title {
      font-size: 13px;
      font-weight: 600;
      color: var(--cyan);
      margin-bottom: 12px;
      padding-bottom: 8px;
      border-bottom: 1px solid var(--line);
    }
    
    .quick-entry-preview-item {
      display: flex;
      justify-content: space-between;
      align-items: center;
      padding: 8px 0;
      border-bottom: 1px solid rgba(76, 130, 255, 0.1);
      font-size: 11px;
    }
    
    .quick-entry-preview-item:last-child {
      border-bottom: none;
    }
    
    .quick-entry-preview-label {
      color: var(--txt3);
    }
    
    .quick-entry-preview-value {
      font-weight: 600;
      font-family: 'Consolas', 'Monaco', monospace;
    }
    
    .quick-entry-preview-value.positive {
      color: var(--success);
    }
    
    .quick-entry-preview-value.negative {
      color: var(--danger);
    }
    
    .quick-entry-preview-value.neutral {
      color: var(--txt);
    }
    
    /* 预览面板增强样式 */
    .quick-entry-preview-section {
      margin-bottom: 16px;
    }
    
    .quick-entry-preview-section-title {
      font-size: 11px;
      font-weight: 600;
      color: var(--txt2);
      margin-bottom: 8px;
      display: flex;
      align-items: center;
      gap: 4px;
    }
    
    .quick-entry-comparison {
      display: grid;
      grid-template-columns: 1fr 1fr;
      gap: 8px;
      padding: 8px;
      background: rgba(76, 130, 255, 0.05);
      border-radius: 4px;
      margin-bottom: 12px;
    }
    
    .quick-entry-comparison-item {
      display: flex;
      flex-direction: column;
      gap: 2px;
    }
    
    .quick-entry-comparison-label {
      font-size: 10px;
      color: var(--txt3);
    }
    
    .quick-entry-comparison-value {
      font-size: 12px;
      font-weight: 600;
      font-family: 'Consolas', 'Monaco', monospace;
      color: var(--txt);
    }
    
    .quick-entry-growth {
      display: flex;
      align-items: center;
      gap: 4px;
      font-size: 10px;
      font-weight: 500;
    }
    
    .quick-entry-growth.up {
      color: var(--rise);
    }
    
    .quick-entry-growth.down {
      color: var(--fall);
    }
    
    .quick-entry-formula {
      font-size: 10px;
      color: var(--txt3);
      background: rgba(76, 130, 255, 0.05);
      padding: 6px 8px;
      border-radius: 4px;
      margin-bottom: 8px;
      font-family: 'Consolas', 'Monaco', monospace;
    }
    
    .quick-entry-progress {
      margin-top: 12px;
      padding-top: 12px;
      border-top: 1px solid var(--line);
    }
    
    .quick-entry-progress-label {
      font-size: 11px;
      color: var(--txt2);
      margin-bottom: 6px;
      display: flex;
      justify-content: space-between;
      align-items: center;
    }
    
    .quick-entry-progress-bar {
      width: 100%;
      height: 6px;
      background: rgba(76, 130, 255, 0.1);
      border-radius: 3px;
      overflow: hidden;
    }
    
    .quick-entry-progress-fill {
      height: 100%;
      background: linear-gradient(90deg, var(--cyan), #00d4ff);
      border-radius: 3px;
      transition: width 0.3s ease;
    }
    
    .quick-entry-footer {
      flex-shrink: 0;
      padding: 16px 20px;
      background: rgba(var(--i-r), var(--i-g), var(--i-b), 0.3);
      border-top: 1px solid var(--line);
      display: flex;
      justify-content: space-between;
      align-items: center;
      gap: 12px;
    }
    
    .quick-entry-footer-left {
      display: flex;
      gap: 8px;
    }
    
    .quick-entry-footer-right {
      display: flex;
      gap: 8px;
    }
    
    .quick-entry-btn {
      padding: 8px 16px;
      border-radius: 6px;
      font-size: 12px;
      font-weight: 500;
      cursor: pointer;
      transition: all 0.2s ease;
      display: flex;
      align-items: center;
      gap: 6px;
      white-space: nowrap;
    }
    
    .quick-entry-btn.primary {
      background: linear-gradient(135deg, var(--cyan), #0098ff);
      border: none;
      color: #fff;
    }
    
    .quick-entry-btn.primary:hover {
      transform: translateY(-1px);
      box-shadow: 0 4px 12px rgba(0, 212, 255, 0.4);
    }
    
    .quick-entry-btn.secondary {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      border: 1px solid var(--line);
      color: var(--txt2);
    }
    
    .quick-entry-btn.secondary:hover {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.8);
      border-color: var(--cyan);
    }
    
    .quick-entry-btn.danger {
      background: rgba(255, 107, 107, 0.15);
      border: 1px solid rgba(255, 107, 107, 0.3);
      color: var(--danger);
    }
    
    .quick-entry-btn.danger:hover {
      background: rgba(255, 107, 107, 0.25);
    }
    
    .quick-entry-tip {
      font-size: 11px;
      color: var(--txt3);
      display: flex;
      align-items: center;
      gap: 4px;
    }
    
    /* 指标定义样式 */
    .indicator-definition-container {
      padding: 20px;
      display: flex;
      flex-direction: column;
      overflow: visible;
    }
    
    .indicator-definition-header {
      display: flex;
      justify-content: space-between;
      align-items: center;
      margin-bottom: 16px;
      flex-shrink: 0;
    }
    
    .indicator-definition-header h3 {
      font-size: 18px;
      font-weight: 600;
      color: var(--txt);
      display: flex;
      align-items: center;
      gap: 10px;
    }
    
    .indicator-definition-header h3::before {
      content: "📊";
    }
    
    .indicator-header-actions {
      display: flex;
      gap: 8px;
    }
    
    .indicator-category-tabs {
      display: flex;
      gap: 4px;
      margin-bottom: 16px;
      flex-shrink: 0;
      border-bottom: 1px solid var(--line);
      padding-bottom: 4px;
      flex-wrap: wrap;
    }
    
    .indicator-category-tabs .category-tab {
      padding: 10px 20px;
      border-radius: 6px 6px 0 0;
      font-size: 13px;
      font-weight: 500;
      background: transparent;
      border: 1px solid transparent;
      border-bottom: none;
      color: var(--txt2);
      cursor: pointer;
      transition: all 0.2s ease;
      white-space: nowrap;
    }
    
    .indicator-category-tabs .category-tab:hover {
      background: rgba(76, 130, 255, 0.1);
      color: var(--txt);
    }
    
    .indicator-category-tabs .category-tab.active {
      background: rgba(0, 212, 255, 0.15);
      border-color: var(--line);
      color: var(--cyan);
      font-weight: 600;
    }
    
    .indicator-content-wrapper {
      flex: 1;
      overflow: visible;
      padding-right: 8px;
    }
    
    /* 数据录入 → 账龄台账 · 坏账计提政策面板（卡片内衬，wrapper 展开/收起逻辑见 data-entry.js） */
    .aging-policy-panel {
      margin-top: 18px;
      border-top: 1px solid rgba(120, 150, 200, 0.18);
      padding-top: 14px;
    }
    
    .aging-policy-panel .aging-policy-card-inner {
      padding: 14px 16px;
      background: var(--de-ag-policy-card-bg);
      border: 1px solid rgba(120, 150, 200, 0.18);
      border-radius: 10px;
    }
    
    .aging-policy-panel .aging-policy-editor {
      width: 100%;
    }
    
    .indicator-table {
      width: 100%;
      border-collapse: collapse;
      font-size: 12px;
    }
    
    .indicator-table thead {
      background: rgba(30, 60, 110, 0.4);
      position: sticky;
      top: 0;
      z-index: 10;
    }
    
    .indicator-table th {
      padding: 12px 10px;
      text-align: left;
      font-weight: 600;
      color: var(--txt);
      border-bottom: 1px solid var(--line);
      white-space: nowrap;
    }
    
    .indicator-table td {
      padding: 10px;
      border-bottom: 1px solid rgba(76, 130, 255, 0.1);
      color: var(--txt2);
    }
    
    .indicator-table tbody tr:hover {
      background: rgba(76, 130, 255, 0.08);
    }
    
    .indicator-name-cell {
      font-weight: 500;
      color: var(--txt);
    }
    
    .indicator-formula-cell {
      font-family: 'Consolas', 'Monaco', monospace;
      font-size: 11px;
      color: var(--txt3);
      max-width: 200px;
      word-break: break-all;
    }
    
    .indicator-threshold-input {
      width: 70px;
      padding: 6px 8px;
      background: rgba(var(--i-r), var(--i-g), var(--i-b), 0.6);
      border: 1px solid var(--line);
      border-radius: 4px;
      color: var(--txt);
      font-size: 12px;
      font-family: 'Consolas', 'Monaco', monospace;
      text-align: center;
      transition: all 0.2s ease;
    }
    
    .indicator-threshold-input:focus {
      outline: none;
      border-color: var(--cyan);
      background: rgba(var(--i-r), var(--i-g), var(--i-b), 0.8);
      box-shadow: 0 0 8px rgba(0, 212, 255, 0.2);
    }
    
    .indicator-weight-input {
      width: 70px;
      padding: 6px 8px;
      background: rgba(var(--i-r), var(--i-g), var(--i-b), 0.6);
      border: 1px solid var(--line);
      border-radius: 4px;
      color: var(--txt);
      font-size: 12px;
      font-family: 'Consolas', 'Monaco', monospace;
      text-align: center;
      transition: all 0.2s ease;
    }
    
    .indicator-weight-input:focus {
      outline: none;
      border-color: var(--warning);
      background: rgba(var(--i-r), var(--i-g), var(--i-b), 0.8);
      box-shadow: 0 0 8px rgba(255, 169, 77, 0.25);
    }
    
    .indicator-weight-sum {
      margin-top: 6px;
      font-size: 11px;
      color: var(--txt3);
      text-align: center;
    }
    
    .indicator-weight-sum.ok {
      color: var(--success);
    }
    
    .indicator-weight-sum.err {
      color: var(--danger);
      font-weight: 600;
    }
    
    .indicator-meaning-input {
      flex: 1;
      min-width: 0;
      padding: 6px 8px;
      background: rgba(var(--i-r), var(--i-g), var(--i-b), 0.6);
      border: 1px solid var(--line);
      border-radius: 4px;
      color: var(--txt);
      font-size: 11px;
      transition: all 0.2s ease;
    }
    
    .indicator-meaning-input:focus {
      outline: none;
      border-color: var(--cyan);
      background: rgba(var(--i-r), var(--i-g), var(--i-b), 0.8);
      box-shadow: 0 0 8px rgba(0, 212, 255, 0.2);
    }
    
    .indicator-direction-tag {
      display: inline-block;
      padding: 3px 8px;
      border-radius: 4px;
      font-size: 10px;
      font-weight: 500;
      white-space: nowrap;
    }
    
    .indicator-direction-tag.positive {
      background: rgba(16, 185, 129, 0.15);
      color: var(--success);
      border: 1px solid rgba(16, 185, 129, 0.3);
    }
    
    .indicator-direction-tag.negative {
      background: rgba(255, 107, 107, 0.15);
      color: var(--danger);
      border: 1px solid rgba(255, 107, 107, 0.3);
    }
    
    .indicator-direction-tag.range {
      background: rgba(255, 169, 77, 0.15);
      color: var(--warning);
      border: 1px solid rgba(255, 169, 77, 0.3);
    }
    
    .indicator-footer {
      display: flex;
      justify-content: space-between;
      align-items: center;
      padding: 16px 0;
      border-top: 1px solid var(--line);
      margin-top: 16px;
      flex-shrink: 0;
    }
    
    .indicator-footer-left {
      display: flex;
      align-items: center;
      gap: 12px;
    }
    
    .indicator-footer-right {
      display: flex;
      gap: 8px;
    }
    
    .indicator-btn {
      padding: 8px 16px;
      border-radius: 6px;
      font-size: 12px;
      font-weight: 500;
      cursor: pointer;
      transition: all 0.2s ease;
      display: flex;
      align-items: center;
      gap: 6px;
      white-space: nowrap;
    }
    
    .indicator-btn.primary {
      background: linear-gradient(135deg, var(--cyan), #0098ff);
      border: none;
      color: #fff;
    }
    
    .indicator-btn.primary:hover {
      transform: translateY(-1px);
      box-shadow: 0 4px 12px rgba(0, 212, 255, 0.4);
    }
    
    .indicator-btn.secondary {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      border: 1px solid var(--line);
      color: var(--txt2);
    }
    
    .indicator-btn.secondary:hover {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.8);
      border-color: var(--cyan);
    }
    
    .indicator-tip-text {
      font-size: 11px;
      color: var(--txt3);
      display: flex;
      align-items: center;
      gap: 4px;
    }
    
    .threshold-group {
      display: flex;
      align-items: center;
      gap: 6px;
    }
    
    .meaning-group {
      display: flex;
      align-items: center;
      gap: 6px;
    }
    
    .threshold-separator {
      color: var(--txt3);
      font-size: 12px;
    }
    
    .category-header {
      background: rgba(30, 60, 110, 0.3);
      font-weight: 600;
      color: var(--cyan);
    }
    
    .category-header td {
      padding: 12px 10px;
      border-bottom: 1px solid var(--line);
    }
    
    /* 年度选择器样式 */
    .year-selector-container {
      display: flex;
      align-items: center;
      gap: 12px;
      margin-bottom: 12px;
      padding: 12px 16px;
      background: rgba(var(--c-r), var(--c-g), var(--c-b), 0.5);
      border-radius: 8px;
      border: 1px solid var(--line);
    }
    
    .year-selector-container label {
      font-size: 14px;
      color: var(--txt);
      font-weight: 500;
    }
    
    .year-selector {
      padding: 8px 16px;
      font-size: 14px;
      color: var(--txt);
      background: rgba(var(--d-r), var(--d-g), var(--d-b), 0.8);
      border: 1px solid var(--line);
      border-radius: 6px;
      cursor: pointer;
      outline: none;
      min-width: 120px;
    }
    
    .year-selector:hover {
      border-color: var(--primary);
    }
    
    .year-selector option {
      background: var(--sel-bg);
      color: var(--txt);
    }

    /* 顶部年度下拉选择器 */
    .year-select {
      background: rgba(var(--h-r), var(--h-g), var(--h-b), 0.6);
      border: 1px solid var(--line);
      color: var(--txt);
      padding: 6px 10px;
      border-radius: 6px;
      font-size: 12px;
      cursor: pointer;
      min-width: 80px;
    }

    .year-select option {
      background: var(--sel-bg);
      color: var(--txt);
    }
    
    .btn-add-year {
      padding: 8px 16px;
      font-size: 13px;
      color: var(--primary);
      background: transparent;
      border: 1px solid var(--primary);
      border-radius: 6px;
      cursor: pointer;
      transition: all 0.2s;
    }
    
    .btn-add-year:hover {
      background: rgba(0, 212, 255, 0.15);
    }
    
    .btn-success {
      background: linear-gradient(135deg, #10b981, #059669) !important;
      color: white !important;
      border: none !important;
      padding: 10px 20px;
      border-radius: 6px;
      cursor: pointer;
      font-size: 13px;
      font-weight: 500;
      transition: all 0.2s;
    }
    
    .btn-success:hover {
      transform: translateY(-1px);
      box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);
    }
    
    .btn-success:disabled {
      opacity: 0.6;
      cursor: not-allowed;
    }
    
    /* 验证状态样式 */
    .validation-status {
      margin-top: 12px;
      padding: 12px 16px;
      border-radius: 8px;
      font-size: 13px;
      line-height: 1.6;
    }
    
    .validation-status.success {
      background: rgba(16, 185, 129, 0.15);
      border: 1px solid rgba(16, 185, 129, 0.3);
      color: #10b981;
    }
    
    .validation-status.error {
      background: rgba(255, 107, 107, 0.15);
      border: 1px solid rgba(255, 107, 107, 0.3);
      color: #ff6b6b;
    }
    
    .validation-status.warning {
      background: rgba(255, 169, 77, 0.15);
      border: 1px solid rgba(255, 169, 77, 0.3);
      color: #ffa94d;
    }
    
    .dw-sec-row {
      display: flex;
      justify-content: space-between;
      align-items: center;
      margin: 14px 0 8px;
    }
    
    .dw-sec-row .dw-sec {
      margin: 0;
    }
    
    .dw-sec-legend {
      display: flex;
      align-items: center;
      gap: 12px;
      font-size: 11px;
      color: #666;
    }
    
    .dw-sec-legend-item {
      display: flex;
      align-items: center;
      gap: 6px;
    }
    
    .dw-sec-legend-color {
      width: 12px;
      height: 12px;
      border-radius: 2px;
    }
    
    /* 系统设置样式 */
    .system-settings-container {
      padding: 24px;
      max-width: 800px;
      margin: 0 auto;
    }
    
    .settings-section {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.4);
      border: 1px solid var(--line);
      border-radius: 12px;
      padding: 24px;
      margin-bottom: 20px;
    }
    
    .settings-section-title {
      font-size: 16px;
      font-weight: 600;
      color: var(--cyan);
      margin-bottom: 20px;
      padding-bottom: 12px;
      border-bottom: 1px solid var(--line);
      display: flex;
      align-items: center;
      gap: 10px;
    }
    
    .settings-section-title::before {
      content: "";
      width: 4px;
      height: 16px;
      background: var(--cyan);
      border-radius: 2px;
    }
    
    .settings-form-group {
      margin-bottom: 24px;
    }
    
    .settings-form-group:last-child {
      margin-bottom: 0;
    }
    
    .settings-label {
      display: block;
      font-size: 14px;
      color: var(--txt);
      font-weight: 500;
      margin-bottom: 10px;
    }
    
    .settings-label-hint {
      font-size: 12px;
      color: var(--txt3);
      font-weight: 400;
      margin-left: 8px;
    }
    
    .settings-input {
      width: 100%;
      padding: 12px 16px;
      background: rgba(var(--i-r), var(--i-g), var(--i-b), 0.6);
      border: 1px solid var(--line);
      border-radius: 8px;
      color: var(--txt);
      font-size: 14px;
      transition: all 0.2s ease;
    }
    
    .settings-input:focus {
      outline: none;
      border-color: var(--cyan);
      box-shadow: 0 0 0 3px rgba(0, 212, 255, 0.1);
    }
    
    .settings-input::placeholder {
      color: var(--txt3);
    }
    
    .logo-upload-area {
      border: 2px dashed var(--line);
      border-radius: 12px;
      padding: 20px;
      text-align: center;
      transition: all 0.2s ease;
      cursor: pointer;
      background: rgba(var(--i-r), var(--i-g), var(--i-b), 0.3);
    }
    
    .logo-upload-area:hover {
      border-color: var(--cyan);
      background: rgba(0, 212, 255, 0.05);
    }
    
    .logo-upload-area.has-logo {
      padding: 10px;
    }
    
    .logo-preview {
      max-width: 300px;
      max-height: 80px;
      margin: 0 auto 16px;
      display: none;
    }
    
    .logo-upload-area.has-logo .logo-preview {
      display: block;
    }
    
    .logo-upload-area.has-logo .upload-placeholder {
      display: none;
    }
    
    .upload-placeholder {
      color: var(--txt3);
    }
    
    .upload-icon {
      font-size: 32px;
      margin-bottom: 6px;
      opacity: 0.5;
    }
    
    .upload-text {
      font-size: 14px;
      margin-bottom: 4px;
    }
    
    .upload-hint {
      font-size: 12px;
      color: var(--txt3);
    }
    
    .settings-actions {
      display: flex;
      gap: 12px;
      justify-content: flex-end;
      margin-top: 24px;
      padding-top: 20px;
      border-top: 1px solid var(--line);
    }
    
    .settings-btn {
      padding: 10px 24px;
      border-radius: 8px;
      font-size: 14px;
      font-weight: 500;
      cursor: pointer;
      transition: all 0.2s ease;
      display: flex;
      align-items: center;
      gap: 8px;
    }
    
    .settings-btn.primary {
      background: linear-gradient(135deg, var(--cyan), #0098ff);
      border: none;
      color: #fff;
    }
    
    .settings-btn.primary:hover {
      transform: translateY(-1px);
      box-shadow: 0 4px 12px rgba(0, 212, 255, 0.4);
    }
    
    .settings-btn.secondary {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      border: 1px solid var(--line);
      color: var(--txt2);
    }
    
    .settings-btn.secondary:hover {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.8);
      border-color: var(--cyan);
    }
    
    .logo-actions {
      display: flex;
      gap: 8px;
      justify-content: center;
      margin-top: 12px;
    }
    
    .logo-action-btn {
      padding: 6px 16px;
      border-radius: 6px;
      font-size: 12px;
      cursor: pointer;
      transition: all 0.2s ease;
      border: 1px solid var(--line);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.5);
      color: var(--txt2);
    }
    
    .logo-action-btn:hover {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.8);
      border-color: var(--cyan);
    }
    
    .logo-action-btn.danger {
      border-color: rgba(255, 107, 107, 0.4);
      color: var(--danger);
    }
    
    .logo-action-btn.danger:hover {
      background: rgba(255, 107, 107, 0.15);
      border-color: var(--danger);
    }
    
    /* ===== 整体财务健康度栏（col-l 顶部 · P1-1+，瘦身主卡 → 点击滑出 #ohDrawer 详情） ===== */
    .oh-panel {
      flex: none;
      height: 104px;
      cursor: pointer;
      transition: border-color 0.2s ease, box-shadow 0.2s ease;
    }
    .oh-panel:hover {
      border-color: rgba(0, 212, 255, 0.45);
      box-shadow: 0 0 0 1px rgba(0, 212, 255, 0.15), 0 6px 22px rgba(0, 212, 255, 0.10);
    }
    .oh-strip-meta {
      font-size: 11px;
      color: var(--txt3);
      letter-spacing: 0;
      white-space: nowrap;
      overflow: hidden;
      text-overflow: ellipsis;
    }
    .oh-head-right {
      margin-left: auto;
      display: inline-flex;
      align-items: center;
      gap: 8px;
      font-size: 12px;
      font-weight: 400;
      color: var(--txt2);
      letter-spacing: 0;
    }
    .oh-mode-chip {
      display: inline-flex;
      align-items: center;
      gap: 6px;
      padding: 3px 10px;
      border-radius: 999px;
      background: rgba(0, 212, 255, 0.08);
      border: 1px solid rgba(0, 212, 255, 0.22);
      color: var(--txt2);
      font-size: 11px;
      white-space: nowrap;
    }
    .oh-mode-chip b {
      font-weight: 600;
      color: var(--cyan);
    }
    .oh-mode-chip em {
      font-style: normal;
      color: var(--txt3);
      font-size: 10px;
      border: 1px solid rgba(76, 130, 255, 0.25);
      border-radius: 3px;
      padding: 0 5px;
      line-height: 14px;
    }
    .oh-body {
      flex: 1;
      min-height: 0;
      display: flex;
      align-items: stretch;
      gap: 16px;
      padding: 0 2px;
    }
    /* 第1列：占2/3，显示评级、进度条和文字 */
    .oh-col-left {
      flex: 2;
      min-width: 0;
      display: flex;
      align-items: center;
      gap: 12px;
    }
    /* 第2列：占1/3，显示分值 */
    .oh-col-right {
      flex: 1;
      min-width: 0;
      display: flex;
      align-items: center;
      justify-content: center;
      margin-top: -20px;
    }
    .oh-score-row {
      display: flex;
      align-items: center;
      gap: 10px;
    }
    .oh-score-row .oh-bar {
      flex: 1;
      min-width: 0;
    }
    .oh-score {
      flex: none;
      font-size: 60px;
      font-weight: 700;
      line-height: 1;
      font-variant-numeric: tabular-nums;
      letter-spacing: 0;
      text-align: center;
      color: var(--txt);            /* ★ 2026-09-13：见 .health-card .h-score 说明 */
    }
    .oh-score.excellent { color: var(--success-ink); text-shadow: 0 0 20px rgba(16, 185, 129, 0.35); }
    .oh-score.warning { color: var(--warning-ink); text-shadow: 0 0 20px rgba(255, 169, 77, 0.3); }
    .oh-score.danger { color: var(--danger-ink); text-shadow: 0 0 20px rgba(255, 107, 107, 0.3); }
    .oh-score.na { color: var(--txt3); }
    .oh-level-chip {
      flex: none;
      min-width: 60px;
      text-align: center;
      font-size: 12px;
      font-weight: 600;
      padding: 4px 12px;
      border-radius: 999px;
      letter-spacing: 1px;
      white-space: nowrap;
    }
    .oh-level-chip.excellent { color: var(--success-ink); background: rgba(16, 185, 129, 0.12); border: 1px solid rgba(16, 185, 129, 0.35); }
    .oh-level-chip.warning { color: var(--warning-ink); background: rgba(255, 169, 77, 0.12); border: 1px solid rgba(255, 169, 77, 0.35); }
    .oh-level-chip.danger { color: var(--danger-ink); background: rgba(255, 107, 107, 0.12); border: 1px solid rgba(255, 107, 107, 0.35); }
    .oh-level-chip.na { color: var(--txt2); background: rgba(var(--t-r), var(--t-g), var(--t-b), 0.12); border: 1px solid rgba(var(--t-r), var(--t-g), var(--t-b), 0.25); }
    .oh-vsep {
      flex: none;
      width: 1px;
      height: 34px;
      background: rgba(var(--t-r), var(--t-g), var(--t-b), 0.18);
    }
    .oh-bar-zone {
      flex: 1;
      min-width: 0;
      display: flex;
      flex-direction: column;
      gap: 5px;
    }
    .oh-bar {
      height: 9px;
      border-radius: 5px;
      background: rgba(76, 130, 255, 0.14);
      overflow: hidden;
    }
    .oh-bar-fill {
      height: 100%;
      width: 0%;
      border-radius: 5px;
      transition: width 3s ease;
    }
    .oh-bar-fill.excellent { background: linear-gradient(90deg, #0fae7e, var(--success)); }
    .oh-bar-fill.warning { background: linear-gradient(90deg, #d9892f, var(--warning)); }
    .oh-bar-fill.danger { background: linear-gradient(90deg, #d64545, var(--danger)); }
    .oh-bar-fill.na { background: rgba(var(--t-r), var(--t-g), var(--t-b), 0.4); }
    .oh-bar-meta {
      display: flex;
      align-items: center;
      justify-content: space-between;
      gap: 8px;
      font-size: 10.5px;
      color: var(--txt3);
      letter-spacing: 0;
    }
    .oh-bar-meta .oh-cov { color: var(--txt2); }
    
    /* ===== 系统设置 · 评分视角权重配置（P1-1+） ===== */
    .settings-section-title .dimw-title-actions {
      margin-left: auto;
      display: flex;
      align-items: center;
      gap: 8px;
    }
    .settings-mini-btn {
      display: inline-flex;
      align-items: center;
      gap: 4px;
      padding: 5px 12px;
      border-radius: 6px;
      font-size: 12px;
      font-weight: 500;
      line-height: 1;
      cursor: pointer;
      transition: all 0.2s ease;
      border: 1px solid var(--line);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      color: var(--txt2);
    }
    .settings-mini-btn:hover {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.85);
      border-color: var(--cyan);
      color: var(--cyan);
    }
    .dimw-badge {
      display: inline-flex;
      align-items: center;
      gap: 4px;
      font-size: 11px;
      font-weight: 500;
      letter-spacing: 0;
      color: #0fae7e;
      background: rgba(15, 174, 126, 0.12);
      border: 1px solid rgba(15, 174, 126, 0.35);
      border-radius: 999px;
      padding: 2px 10px;
      white-space: nowrap;
    }
    .dimw-active-tip {
      margin-bottom: 16px;
      padding: 10px 14px;
      border-radius: 8px;
      font-size: 12.5px;
      line-height: 1.7;
      color: #d6e4ff;
      background: rgba(15, 174, 126, 0.1);
      border: 1px solid rgba(15, 174, 126, 0.32);
    }
    .dimw-active-tip::before { content: "⚡ "; }
    .dimw-card {
      margin-top: 4px;
      margin-bottom: 6px;
      padding: 16px;
      background: rgba(var(--i-r), var(--i-g), var(--i-b), 0.45);
      border: 1px solid rgba(76, 130, 255, 0.28);
      border-radius: 10px;
    }
    .dimw-card-hd {
      display: flex;
      align-items: center;
      justify-content: space-between;
      gap: 10px;
      margin-bottom: 8px;
    }
    .dimw-card-hd .dimw-card-ttl {
      font-size: 14px;
      font-weight: 600;
      color: var(--cyan);
    }
    .dimw-note {
      font-size: 12px;
      color: var(--txt2);
      line-height: 1.7;
      margin-bottom: 12px;
    }
    .dimw-note b { color: var(--cyan); font-weight: 600; }
    .dimw-grid {
      display: grid;
      grid-template-columns: 1fr 1fr;
      column-gap: 14px;
      row-gap: 10px;
    }
    .dimw-row {
      display: flex;
      align-items: center;
      gap: 8px;
      min-width: 0;
    }
    .dimw-name {
      flex: none;
      width: 74px;
      font-size: 12.5px;
      color: var(--txt);
      text-align: right;
      white-space: nowrap;
    }
    .dimw-field {
      flex: 1;
      position: relative;
      display: flex;
      align-items: center;
      min-width: 0;
    }
    .dimw-input {
      width: 100%;
      padding: 7px 34px 7px 10px;
      background: rgba(var(--i-r), var(--i-g), var(--i-b), 0.6);
      border: 1px solid var(--line);
      border-radius: 6px;
      color: var(--txt);
      font-size: 13px;
      text-align: right;
      transition: all 0.2s ease;
    }
    .dimw-input:focus {
      outline: none;
      border-color: var(--cyan);
      box-shadow: 0 0 0 3px rgba(0, 212, 255, 0.1);
    }
    .dimw-unit {
      position: absolute;
      right: 10px;
      font-size: 12px;
      color: var(--txt3);
      pointer-events: none;
    }
    .dimw-total-row {
      display: flex;
      align-items: center;
      gap: 8px;
      margin-top: 14px;
      font-size: 13px;
      color: var(--txt2);
    }
    .dimw-total-row b {
      font-size: 16px;
      font-variant-numeric: tabular-nums;
      color: var(--txt);
    }
    .dimw-total-ok { color: #0fae7e; }
    .dimw-total-bad { color: var(--danger); }
    .dimw-actions {
      display: flex;
      flex-wrap: wrap;
      gap: 10px;
      justify-content: flex-end;
      margin-top: 14px;
      padding-top: 12px;
      border-top: 1px solid rgba(76, 130, 255, 0.18);
    }
    .dimw-btn {
      display: inline-flex;
      align-items: center;
      gap: 6px;
      padding: 7px 14px;
      border-radius: 6px;
      font-size: 12.5px;
      font-weight: 500;
      cursor: pointer;
      transition: all 0.2s ease;
      border: 1px solid var(--line);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      color: var(--txt2);
    }
    .dimw-btn:hover {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.85);
      border-color: var(--cyan);
    }
    .dimw-btn.primary {
      background: linear-gradient(135deg, var(--cyan), #0098ff);
      border: none;
      color: #fff;
    }
    .dimw-btn.primary:hover:not(:disabled) {
      transform: translateY(-1px);
      box-shadow: 0 4px 12px rgba(0, 212, 255, 0.4);
    }
    .dimw-btn.primary:disabled {
      opacity: 0.5;
      cursor: not-allowed;
    }
    .dimw-btn.danger {
      border-color: rgba(255, 107, 107, 0.4);
      color: var(--danger);
    }
    .dimw-btn.danger:hover {
      background: rgba(255, 107, 107, 0.15);
      border-color: var(--danger);
    }

    /* 授权抽屉 */
    #licenseDrawer {
      position: fixed;
      top: 0;
      right: 0;
      width: 480px;
      height: 100vh;
      background: linear-gradient(180deg, var(--lic-bg-1) 0%, var(--lic-bg-2) 100%);
      border-left: 1px solid var(--line);
      z-index: 1000;
      /* ★ 2026-09-18 修复（取证可复现性）：原用 `right: -480px → 0` 过渡 —— right 是布局属性，
         会触发合成层重栅格，柜内文本在不同进程被光栅化到不同亚像素相位 ⇒ 截图逐像素不可复现
         （实测授权抽屉区 7.9k~13k px 字缘 AA 差异，肉眼不可辨；同页 #vp / .panel 均 0 px，
         故非平台固有而是本抽屉独有）。改走 transform（与 #manualDrawer、法律文件抽屉同一范式），
         实测跨进程逐像素 0.0000%。动画观感不变（仍 0.3s ease、仍自右侧滑出）。 */
      transform: translateX(100%);
      transition: transform 0.3s ease;
      display: flex;
      flex-direction: column;
    }
    #licenseDrawer.open {
      transform: translateX(0);
    }
    .license-container {
      padding: 24px;
      overflow-y: auto;
      flex: 1;
    }
    .license-status-section {
      margin-bottom: 24px;
      padding: 16px;
      background: rgba(76, 130, 255, 0.08);
      border: 1px solid var(--line);
      border-radius: 10px;
    }
    .license-status-header {
      display: flex;
      justify-content: space-between;
      align-items: center;
      margin-bottom: 12px;
    }
    .license-status-label {
      font-size: 14px;
      font-weight: 500;
      color: var(--txt);
    }
    .license-status-badge {
      padding: 4px 12px;
      border-radius: 12px;
      font-size: 12px;
      font-weight: 600;
    }
    .license-status-badge.unlicensed {
      background: rgba(255, 107, 107, 0.2);
      color: #ff6b6b;
    }
    .license-status-badge.licensed {
      background: rgba(15, 174, 126, 0.2);
      color: #0fae7e;
    }
    .license-status-badge.expiring {
      background: rgba(232, 161, 58, 0.2);
      color: #e8a13a;
    }
    .license-status-badge.expired {
      background: rgba(255, 107, 107, 0.2);
      color: #ff6b6b;
    }
    .license-info-grid {
      display: grid;
      grid-template-columns: 1fr 1fr;
      gap: 12px;
      margin-top: 12px;
    }
    .license-info-item {
      display: flex;
      flex-direction: column;
      gap: 4px;
    }
    .license-info-label {
      font-size: 11px;
      color: var(--txt3);
    }
    .license-info-value {
      font-size: 13px;
      color: var(--txt);
      font-weight: 500;
    }
    .license-machine-section {
      margin-bottom: 24px;
    }
    .license-section-title {
      font-size: 13px;
      font-weight: 500;
      color: var(--txt);
      margin-bottom: 10px;
    }
    .license-machine-code-box {
      display: flex;
      align-items: center;
      gap: 8px;
      padding: 12px;
      background: rgba(0, 0, 0, 0.3);
      border: 1px solid var(--line);
      border-radius: 6px;
    }
    .license-machine-code-box code {
      flex: 1;
      font-family: monospace;
      font-size: 14px;
      color: var(--cyan);
      word-break: break-all;
    }
    .license-copy-btn {
      padding: 6px 12px;
      background: rgba(0, 212, 255, 0.15);
      border: 1px solid var(--cyan);
      border-radius: 4px;
      color: var(--cyan);
      font-size: 12px;
      cursor: pointer;
      transition: all 0.2s;
    }
    .license-copy-btn:hover {
      background: rgba(0, 212, 255, 0.25);
    }
    .license-hint {
      margin-top: 8px;
      font-size: 11px;
      color: var(--txt3);
    }
    .license-input-section {
      margin-bottom: 24px;
    }
    #licenseCodeInput {
      width: 100%;
      padding: 12px;
      background: rgba(0, 0, 0, 0.3);
      border: 1px solid var(--line);
      border-radius: 6px;
      color: var(--txt);
      font-family: monospace;
      font-size: 12px;
      resize: none;
      margin-bottom: 12px;
    }
    #licenseCodeInput:focus {
      outline: none;
      border-color: var(--cyan);
    }
    #licenseCodeInput::placeholder {
      color: var(--txt3);
    }
    .license-actions {
      display: flex;
      gap: 12px;
    }
    .license-btn {
      flex: 1;
      padding: 10px 16px;
      border-radius: 6px;
      font-size: 13px;
      font-weight: 500;
      cursor: pointer;
      transition: all 0.2s;
    }
    .license-btn.primary {
      background: linear-gradient(135deg, var(--cyan), var(--blue));
      border: none;
      color: #fff;
    }
    .license-btn.primary:hover {
      transform: translateY(-1px);
      box-shadow: 0 4px 12px rgba(0, 212, 255, 0.4);
    }
    .license-btn.secondary {
      background: transparent;
      border: 1px solid var(--line);
      color: var(--txt2);
    }
    .license-btn.secondary:hover {
      background: rgba(255, 255, 255, 0.05);
      border-color: var(--txt2);
    }
    .license-error {
      margin-top: 12px;
      padding: 10px;
      background: rgba(255, 107, 107, 0.1);
      border: 1px solid rgba(255, 107, 107, 0.3);
      border-radius: 6px;
      color: #ff6b6b;
      font-size: 12px;
    }
    .license-product-section {
      text-align: center;
      padding-top: 24px;
      border-top: 1px solid var(--line);
    }
    .license-product-name {
      font-size: 15px;
      font-weight: 600;
      color: var(--txt);
      margin-bottom: 4px;
    }
    .license-product-version {
      font-size: 12px;
      color: var(--txt3);
      margin-bottom: 8px;
    }
    .license-copyright {
      font-size: 11px;
      color: var(--txt3);
    }
    .license-legal-links {
      margin-top: 8px;
      font-size: 11px;
      line-height: 1.7;
      color: var(--txt3);
    }
    .license-legal-links a {
      color: var(--cyan);
      text-decoration: underline;
      text-underline-offset: 2px;
    }
    .license-legal-links a:hover {
      color: var(--txt);
    }
    /* ==========================================================================
     * 法律文件抽屉（#eulaDrawer / #thirdPartyDrawer）—— 2026-09-18
     *
     * 入口：授权抽屉（#licenseDrawer）底部「使用本软件受《最终用户许可协议》约束 ·
     *       第三方开源组件声明」两个按钮。
     * 形式：独立抽屉，自右侧滑出；宽度 min(920px, 92vw) ＞ 授权抽屉 480px，
     *       开启时完整覆盖授权抽屉；关闭后回到授权抽屉，产品上下文不丢。
     * 正文：由 js/legal-content.js 注入（生成物，源为仓库根 LICENSE.md /
     *       THIRD-PARTY-NOTICES.md）。本段只管版式，不管内容 —— 改协议改 .md 后
     *       重跑 `node tools/build-legal-content.js`。
     * 层级：mask 200 < … < #licenseDrawer 1000 < 本抽屉 1100 < rbppt-modal 1200 < 通知 10000
     * ========================================================================== */
    #eulaDrawer,
    #thirdPartyDrawer {
      position: fixed;
      top: 0;
      right: 0;
      width: min(920px, 92vw);
      height: 100%;
      z-index: 1100; /* 关系断言由 tools/verify-legal-drawer.js L3 以「数值比较」维护，勿写死对端值 */
      transform: translateX(100%); /* 收起态平移出视口右侧 ⇒ 展开方向为「从右滑出」 */
      transition: transform 0.28s cubic-bezier(0.2, 0.8, 0.2, 1);
      display: flex;
      flex-direction: column;
      background: linear-gradient(180deg, var(--dw-bg-1), var(--dw-bg-2));
      border-left: 1px solid var(--line);
    }
    #eulaDrawer.on,
    #thirdPartyDrawer.on {
      transform: translateX(0);
      box-shadow: -20px 0 60px rgba(0, 0, 0, 0.5);
    }
    .legal-dw-actions {
      flex: none;
      display: flex;
      align-items: center;
      gap: 10px;
    }
    .legal-src-link {
      font-size: 12px;
      color: var(--txt2);
      text-decoration: none;
      padding: 5px 10px;
      border: 1px solid var(--line2);
      border-radius: 8px;
      transition: 0.2s;
      white-space: nowrap;
    }
    .legal-src-link:hover {
      color: var(--cyan);
      border-color: var(--cyan);
    }
    .legal-dw-close {
      position: static;
      width: 32px;
      height: 32px;
      border-radius: 8px;
      border: 1px solid var(--line2);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      color: var(--txt2);
      font-size: 16px;
      line-height: 1;
      cursor: pointer;
      transition: 0.2s;
    }
    .legal-dw-close:hover {
      color: #fff;
      border-color: var(--cyan);
    }
    /* 长文阅读区：沿用「系统操作说明」抽屉（#manualDrawer）的浅色范式 ——
       深色驾驶舱皮肤下，长文可读性优先于皮肤一致性。正文恒用深字，不随主题反色。 */
    #eulaDrawer .legal-dw-body,
    #thirdPartyDrawer .legal-dw-body {
      background: #eef1f6;
      color: #1c2b45;
      padding: 26px 40px 64px;
    }
    .legal-dw-body .legal-fallback {
      font-size: 13px;
      line-height: 1.9;
      color: #55657f;
      max-width: 46em;
      margin: 0 auto;
    }

    /* ---------- 法律正文排版（.legal-* 家族；内容由生成物注入） ---------- */
    /* 版心：文字类块统一收到 46em（中文舒适区 30–45 字，上限约 46 字）并居中，
       法律条款不会因抽屉 920px 宽而拉成超长行；表格另放宽（见下）。 */
    .legal-dw-body .legal-h1,
    .legal-dw-body .legal-h2,
    .legal-dw-body .legal-h3,
    .legal-dw-body .legal-h4,
    .legal-dw-body .legal-p,
    .legal-dw-body .legal-quote,
    .legal-dw-body .legal-list,
    .legal-dw-body .legal-pre,
    .legal-dw-body .legal-hr {
      max-width: 46em;
      margin-left: auto;
      margin-right: auto;
    }
    .legal-dw-body .legal-h1 {
      font-size: 21px;
      font-weight: 700;
      line-height: 1.55;
      color: #16233c;
      margin-top: 0;
      margin-bottom: 14px;
    }
    .legal-dw-body .legal-h2 {
      font-size: 16px;
      font-weight: 700;
      line-height: 1.55;
      color: #16233c;
      margin-top: 26px;
      margin-bottom: 10px;
      padding-left: 10px;
      border-left: 3px solid #3f6ad8;
    }
    .legal-dw-body .legal-h3 {
      font-size: 14px;
      font-weight: 600;
      line-height: 1.6;
      color: #22304a;
      margin-top: 18px;
      margin-bottom: 8px;
    }
    .legal-dw-body .legal-h4 {
      font-size: 13.5px;
      font-weight: 600;
      color: #22304a;
      margin-top: 16px;
      margin-bottom: 8px;
    }
    .legal-dw-body .legal-p {
      font-size: 13.5px;
      line-height: 1.92;
      color: #1c2b45;
      margin-top: 0;
      margin-bottom: 12px;
    }
    .legal-dw-body .legal-hr {
      border: none;
      border-top: 1px solid #ccd6e6;
      margin-top: 22px;
      margin-bottom: 22px;
    }
    .legal-dw-body .legal-quote {
      border-left: 3px solid #7f95c0;
      background: #e9eefa;
      padding: 10px 14px;
      margin-top: 12px;
      margin-bottom: 18px;
      font-size: 13px;
      line-height: 1.85;
      color: #33405a;
    }
    .legal-dw-body .legal-quote p {
      margin: 0;
    }
    .legal-dw-body .legal-list {
      font-size: 13.5px;
      line-height: 1.92;
      color: #1c2b45;
      padding-left: 24px;
      margin-top: 0;
      margin-bottom: 14px;
    }
    .legal-dw-body .legal-list li {
      margin-bottom: 6px;
    }
    .legal-dw-body strong {
      color: #12203a;
      font-weight: 600;
    }
    .legal-dw-body a {
      color: #1f4fd6;
      text-decoration: underline;
      text-underline-offset: 2px;
    }
    .legal-dw-body a:hover {
      color: #143a9e;
    }
    .legal-dw-body code {
      background: #dfe6f2;
      border-radius: 4px;
      padding: 1px 5px;
      font-family: monospace;
      font-size: 0.94em;
    }
    .legal-dw-body .legal-tablewrap {
      overflow-x: auto;
      margin: 14px 0 20px;
    }
    .legal-dw-body .legal-table {
      width: 100%;
      border-collapse: collapse;
      font-size: 13px;
      line-height: 1.7;
      background: #fff;
      border: 1px solid #d7dfec;
    }
    .legal-dw-body .legal-table th,
    .legal-dw-body .legal-table td {
      border: 1px solid #d7dfec;
      padding: 8px 12px;
      text-align: left;
      vertical-align: top;
      overflow-wrap: anywhere; /* SHA-256 无空格长串必须能折行 */
    }
    .legal-dw-body .legal-table th {
      background: #e3e9f4;
      font-weight: 600;
      color: #16233c;
    }
    .legal-dw-body .legal-table tbody tr:nth-child(even) {
      background: #f6f8fc;
    }
    .legal-dw-body .legal-pre {
      background: #e6ebf4;
      border: 1px solid #d7dfec;
      border-radius: 8px;
      padding: 12px 14px;
      margin-top: 12px;
      margin-bottom: 18px;
      overflow-x: auto;
    }
    .legal-dw-body .legal-pre code {
      background: none;
      padding: 0;
      font-size: 12.5px;
      line-height: 1.65;
      color: #1c2b45;
    }

    /* ---------- 授权抽屉内的入口改造（原为 .md 直链，2026-09-18 改为开抽屉） ---------- */
    .license-legal-links .legal-link-btn {
      padding: 0;
      margin: 0;
      border: none;
      background: none;
      font: inherit;
      color: var(--cyan);
      text-decoration: underline;
      text-underline-offset: 2px;
      cursor: pointer;
    }
    .license-legal-links .legal-link-btn:hover {
      color: var(--txt);
    }
    .license-legal-files {
      margin-top: 4px;
      font-size: 11px;
      color: var(--txt3);
    }
    .license-legal-files a {
      color: var(--txt3);
      text-decoration: underline;
      text-underline-offset: 2px;
    }
    .license-legal-files a:hover {
      color: var(--cyan);
    }
    /* 浅色主题下的可点击态（阅读区恒为浅底，无需反色） */
    html[data-theme="light"] .license-legal-links .legal-link-btn {
      color: #1f4fd6;
    }
    html[data-theme="light"] .license-legal-links .legal-link-btn:hover {
      color: #143a9e;
    }

    /* ==========================================================================
     * 系统操作说明抽屉（#manualDrawer）
     * 由 js/manual.js 注入内容。全宽浅色阅读区，适配深色驾驶舱皮肤，
     * 文档类内容独立成浅色面板以保证长文可读性。
     * ========================================================================== */
    #manualDrawer {
      position: fixed;
      top: 0;
      right: 0;
      width: min(1080px, 100vw);
      height: 100%;
      z-index: 240;
      transform: translateX(100%);
      transition: transform 0.28s cubic-bezier(0.2, 0.8, 0.2, 1);
      display: flex;
      flex-direction: column;
      background: linear-gradient(180deg, var(--dw-bg-1), var(--dw-bg-2));
      border-left: 1px solid var(--line);
    }
    #manualDrawer.on {
      transform: translateX(0);
      box-shadow: -20px 0 60px rgba(0, 0, 0, 0.5);
    }
    #manualDrawer .manual-dw-hd {
      border-bottom: 1px solid var(--line);
    }
    #manualDrawer #manualClose {
      position: absolute;
      right: 18px;
      top: 18px;
      width: 32px;
      height: 32px;
      border-radius: 8px;
      border: 1px solid var(--line2);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      color: var(--txt2);
      font-size: 16px;
      cursor: pointer;
      transition: 0.2s;
    }
    #manualDrawer #manualClose:hover {
      color: #fff;
      border-color: var(--cyan);
    }
    #manualDrawer .manual-dw-body {
      background: #eef1f6;
    }
    /* 边距口径：「目录左边缘」与「正文右边缘」分别距抽屉外沿 30px。
       抽屉自带 border-left: 1px ⇒ 左侧补 7px（1 + 22 + 7 = 30）、右侧补 8px（22 + 8 = 30）。 */
    #manualDrawer .manual-wrap {
      padding-left: 7px;
      padding-right: 8px;
    }

    /* ---------- 操作说明书内容排版（浅色阅读区） ---------- */
    .manual-wrap {
      /* 铺满阅读区：不再居中限宽（原 1010px + auto 会在两侧留下 40+px 空白）。
         左右各留 8px，与父容器内边距 22px 相加 = 30px。
         左侧的 1px 差由下方 #manualDrawer .manual-wrap 抵消。

         版心双层模型（M01）：容器边界守 30px 口径不动，文字行末端另由 --m-text
         收敛到 48 字（中文舒适区 30–45 字，上限 48）；间距统一收敛到 4px 基数。 */
      --m-text: 48em;      /* 段落 / 列表「文字行」上限 = 48 字 */
      --m-col: 46px;       /* 步骤卡 序号列宽 */
      --m-run: 26px;       /* 步骤卡 序号圆点直径 */
      max-width: none;
      margin: 0;
      padding: 28px 8px 48px;
      color: #1c2433;
      font-family: "PingFang SC", "Microsoft YaHei", "Hiragino Sans GB", sans-serif;
      font-size: 14.5px;
      line-height: 1.8;
    }
    /* 文字行收窄：容器仍满宽到 30px，只约束「行末端」——两者互不冲突。 */
    .manual-wrap p,
    .manual-wrap ul:not(.manual-steps),
    .manual-wrap ol:not(.manual-steps) {
      max-width: var(--m-text);
    }
    /* 步骤卡例外：它自带右侧内收（把内容列收到 45.8 字/行），不再叠加限宽，
       否则两重收窄会让内容列掉到 39 字/行。序号是绝对定位的，ol 也不需要内边距。 */
    .manual-wrap ol.manual-steps {
      max-width: none;
      padding-left: 0;
    }
    /* 结构性块（网格 / 卡片 / 长清单双列）不受文字行限宽约束 */
    .manual-wrap .manual-hero-points,
    .manual-wrap .manual-hero-meta,
    .manual-wrap .manual-hero,
    .manual-wrap .manual-note,
    #m-sec-2 h3 + ul,
    #m-sec-6 h3[data-lv="lv3"] + p {
      max-width: none;
    }
    /* 章标题（L1 · 23px）：滚动吸附 —— #manualBody 是独立滚动容器，
       sticky 以它为基准，滚动到任意位置都能看到「我在哪一章」。 */
    .manual-wrap h2 {
      position: sticky;
      top: 0;
      z-index: 3;
      font-size: 23px;
      font-weight: 800;
      color: #1f4fd6;
      letter-spacing: 0.5px;
      margin: 0 0 12px;
      padding: 10px 0 8px;
      background: #eef1f6;
      border-bottom: 3px solid #1f4fd6;
      box-shadow: 0 6px 8px -8px rgba(28, 36, 51, 0.18);
    }
    /* 小节标题（L3 · 15px）：蓝色 + 细左线 + 浅缩进 */
    .manual-wrap h3 {
      font-size: 16px;
      font-weight: 700;
      color: #1f4fd6;
      margin: 22px 0 8px;
    }
    .manual-wrap h3[data-lv="lv3"] {
      font-size: 15px;
      color: #2f5fd8;
      margin: 20px 0 7px;
      padding-left: 12px;
      border-left: 2px solid #d5dcea;
    }
    /* 功能组标题（L2 · 17px）：深色 + 4px 左色条 + 分组底 —— 第五章的 5.1 / 5.2 …
       由 js/manual.js 的 buildManualNav() 打 data-lv="grp"（纯呈现层标记）。 */
    .manual-wrap h3[data-lv="grp"] {
      font-size: 17px;
      color: #16202f;
      margin: 34px 0 12px;
      padding: 8px 12px;
      border-left: 4px solid #1f4fd6;
      background: linear-gradient(90deg, #f2f6ff 0%, rgba(242, 246, 255, 0) 78%);
    }
    .manual-wrap p {
      margin: 12px 0;
      line-height: 1.88;
    }
    .manual-wrap ul, .manual-wrap ol {
      margin: 12px 0;
      padding-left: 20px;
    }
    .manual-wrap li {
      margin: 6px 0;
    }
    /* 列表标记弱化：标记不该与正文抢注意力 */
    .manual-wrap ul > li::marker {
      color: #9db2dd;
      font-size: 0.9em;
    }
    .manual-wrap ol > li::marker {
      color: #9db2dd;
      font-weight: 700;
    }
    /* 行内强调降权（M08）：全文 351 个 <b>（每 36 字一处）＝ 等于没有重点。
       降到 600 保留区分度，把「重点」让给结构（标题 / 步骤名 / 标签胶囊）。 */
    .manual-wrap p b,
    .manual-wrap li b {
      font-weight: 600;
      color: #1c2433;
    }
    .manual-wrap code {
      background: #e7ecf4;
      border: 1px solid #d5dcea;
      border-radius: 4px;
      padding: 1px 6px;
      font-size: 13px;
      color: #c0392b;
    }
    .manual-wrap kbd {
      background: #fff;
      border: 1px solid #c7d0df;
      border-bottom-width: 2px;
      border-radius: 4px;
      padding: 1px 7px;
      font-size: 12px;
      font-family: inherit;
      color: #1c2433;
    }
    .manual-wrap a {
      color: #1f4fd6;
      text-decoration: none;
    }
    .manual-wrap a:hover {
      text-decoration: underline;
    }
    .manual-wrap .manual-sec {
      margin: 0 0 32px;
    }

    /* 顶部导读（价值主张 + 四大卖点 + 规格胶囊 + 本页用法）
     * 层级自上而下：主标题 → 标语徽章 → 主张段 → 卖点卡 → 规格胶囊 → 本页用法。
     * 一律左对齐（原先整块 text-align:center，3 行长段落每行起点不同，不利阅读）。
     * 选择器统一加 .manual-wrap 前缀：否则 .manual-wrap p / .manual-wrap ul 的元素选择器
     * 会盖掉这里的边距（同为 class 级时前者权重更高）。 */
    .manual-wrap .manual-hero {
      background: linear-gradient(135deg, #e8efff 0%, #f8faff 60%);
      border: 1px solid #dbe4f5;
      border-radius: 12px;
      padding: 16px 20px 16px;
      margin-bottom: 20px;
      text-align: left;
    }
    .manual-wrap .manual-hero-title {
      font-size: 24px;
      font-weight: 800;
      color: #16202f;
      letter-spacing: 0.5px;
      line-height: 1.25;
    }
    /* 标语：做成徽章，与主标题拉开层级，不做成第二行大标题 */
    .manual-wrap .manual-hero-slogan {
      display: inline-block;
      background: #e8f8f2;
      border: 1px solid #bfe8d8;
      border-radius: 6px;
      color: #0b8f68;
      font-size: 12.5px;
      font-weight: 700;
      letter-spacing: 1.5px;
      padding: 3px 10px;
      margin: 6px 0 0;
    }
    .manual-wrap .manual-hero-desc {
      color: #38455e;
      font-size: 15px;
      line-height: 1.70;
      max-width: 860px;
      margin: 8px 0 0;
    }
    /* 四大卖点：等宽四列卡（1024px 降 2 列 / 900px 降 1 列） */
    .manual-wrap .manual-hero-points {
      list-style: none;
      display: grid;
      grid-template-columns: repeat(4, minmax(0, 1fr));
      gap: 12px;
      padding: 0;
      margin: 12px 0 0;
    }
    .manual-wrap .manual-hero-points > li {
      background: #fff;
      border: 1px solid #dbe4f5;
      border-radius: 10px;
      padding: 8px 12px;
      margin: 0;
    }
    .manual-wrap .hp-ico {
      display: block;
      font-size: 15px;
      line-height: 1.15;
    }
    .manual-wrap .hp-t {
      display: block;
      font-size: 13.5px;
      font-weight: 800;
      color: #16202f;
      line-height: 1.4;
      margin-top: 3px;
    }
    .manual-wrap .hp-d {
      display: block;
      font-size: 12.5px;
      line-height: 1.55;
      color: #6b7688;
      margin-top: 2px;
    }
    /* 规格胶囊：与卖点区之间用虚线分隔，左对齐 */
    .manual-wrap .manual-hero-meta {
      display: flex;
      flex-wrap: wrap;
      gap: 10px;
      justify-content: flex-start;
      margin-top: 11px;
      padding-top: 10px;
      border-top: 1px dashed #d3ddef;
    }
    .manual-wrap .manual-hero-meta span {
      background: #fff;
      border: 1px solid #d5dcea;
      border-radius: 18px;
      padding: 4px 12px;
      font-size: 12.5px;
      color: #5b6678;
    }
    /* 本页用法：全块最小字号，置于最末，只承担「这本手册怎么用」 */
    .manual-wrap .manual-hero-guide {
      color: #5b6678;
      font-size: 12.5px;
      line-height: 1.6;
      max-width: 900px;
      margin: 9px 0 0;
    }
    @media (max-width: 1024px) {
      .manual-wrap .manual-hero-points { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    }
    @media (max-width: 900px) {
      .manual-wrap .manual-hero { padding: 20px 18px 18px; }
      .manual-wrap .manual-hero-title { font-size: 22px; }
      .manual-wrap .manual-hero-points { grid-template-columns: minmax(0, 1fr); }
    }

    /* ---------- 左侧悬浮目录（一级 / 二级手风琴） ----------
     * 目录结构由 js/manual.js 的 buildManualNav() 扫描正文 h2 / h3 现场生成：
     *   .manual-layout   两栏容器（左目录 + 右正文）
     *   .manual-nav      悬浮栏：position:sticky，随 #manualBody 滚动浮在左侧
     *   .mnav-l1         一级（h2）折叠钮，点击展开本级并收起其他一级
     *   .mnav-l2 / -i    二级（h3）列表，默认折叠，点击直达对应小节
     * -------------------------------------------------------- */
    .manual-layout {
      display: flex;
      align-items: flex-start;
      gap: 24px;
    }
    .manual-main {
      flex: 1 1 auto;
      min-width: 0;
    }
    .manual-nav {
      flex: 0 0 228px;
      width: 228px;
      position: sticky;
      top: 10px;
      max-height: calc(100vh - 60px);
      overflow-y: auto;
      overscroll-behavior: contain;
      background: #fff;
      border: 1px solid #d5dcea;
      border-radius: 12px;
      padding: 12px 10px 14px;
      box-shadow: 0 2px 10px rgba(31, 79, 214, 0.06);
    }
    .manual-nav-hd {
      position: sticky;
      top: 0;
      z-index: 2;
      background: #fff;
      font-size: 13px;
      font-weight: 800;
      color: #1c2433;
      letter-spacing: 3px;
      padding: 0 8px 9px;
      border-bottom: 1px solid #e7ecf4;
      margin-bottom: 8px;
    }
    /* 阅读进度条（M12②）：目录顶栏之下一条 3px 蓝线。
       用 CSS 滚动驱动动画，时间轴绑定 #manualBody（命名滚动容器）；
       不支持的浏览器整块 @supports 被忽略 —— 静默降级，零功能影响。 */
    #manualBody {
      scroll-timeline: --mbScroll block;
    }
    @supports (animation-timeline: scroll()) {
      .manual-nav-hd::after {
        content: '';
        display: block;
        height: 3px;
        margin-top: 9px;
        border-radius: 2px;
        background: #1f4fd6;
        transform-origin: 0 50%;
        animation: mnavProgress linear both;
        animation-timeline: --mbScroll;
      }
      @keyframes mnavProgress {
        from { transform: scaleX(0); }
        to { transform: scaleX(1); }
      }
    }
    /* 一级：折叠触发钮（清除浏览器默认按钮外观） */
    .mnav-l1 {
      display: flex;
      align-items: center;
      justify-content: space-between;
      gap: 6px;
      width: 100%;
      background: transparent;
      border: 0;
      border-radius: 8px;
      padding: 8px;
      font-family: inherit;
      font-size: 13.5px;
      font-weight: 700;
      line-height: 1.5;
      letter-spacing: 0;
      color: #35425c;
      text-align: left;
      cursor: pointer;
      transition: background 0.18s, color 0.18s;
    }
    .mnav-l1-t {
      flex: 1 1 auto;
      min-width: 0;
    }
    .mnav-caret {
      flex: 0 0 auto;
      color: #6b7688;
      font-size: 15px;
      line-height: 1;
      transition: transform 0.22s ease, color 0.18s;
    }
    .mnav-l1:hover {
      background: #f2f5fc;
      color: #1f4fd6;
    }
    .mnav-l1:focus-visible {
      outline: 2px solid #1f4fd6;
      outline-offset: -2px;
    }
    .mnav-group.open > .mnav-l1,
    .mnav-group.active > .mnav-l1 {
      color: #1f4fd6;
    }
    .mnav-group.active > .mnav-l1 {
      background: #eef3ff;
    }
    .mnav-group.open > .mnav-l1 .mnav-caret {
      transform: rotate(90deg);
      color: #1f4fd6;
    }
    /* 无二级小节的一级（.mnav-flat，如「四、快速上手」）：不显示折叠箭头，
       点击只定位到该章，不参与手风琴切换 */
    .mnav-flat > .mnav-l1 .mnav-caret {
      display: none;
    }
    /* 二级：默认折叠，仅当前展开的一级可见 */
    .mnav-l2 {
      max-height: 0;
      overflow: hidden;
      transition: max-height 0.26s ease;
      margin-left: 11px;
      padding-left: 6px;
      border-left: 1px solid #e7ecf4;
    }
    .mnav-group.open > .mnav-l2 {
      max-height: 1800px;
    }
    .mnav-l2-i {
      display: block;
      width: 100%;
      background: transparent;
      border: 0;
      border-radius: 6px;
      padding: 6px 8px;
      font-family: inherit;
      font-size: 12.5px;
      font-weight: 400;
      line-height: 1.5;
      letter-spacing: 0;
      color: #5b6678;
      text-align: left;
      cursor: pointer;
      transition: background 0.18s, color 0.18s;
    }
    .mnav-l2-i:hover {
      background: #f2f5fc;
      color: #1f4fd6;
    }
    .mnav-l2-i:focus-visible {
      outline: 2px solid #1f4fd6;
      outline-offset: -2px;
    }
    .mnav-l2-i.active {
      background: #eef3ff;
      color: #1f4fd6;
      font-weight: 700;
      box-shadow: inset 3px 0 0 #1f4fd6;
    }
    /* 分区标签（M03②）：第五章展开后按 5.1 / 5.2 … 分组，标签不可点击，
       只承担「我在哪一组」。由 buildManualNav() 依据 h3[data-lv="grp"] 生成。 */
    .mnav-sec {
      font-size: 11.5px;
      font-weight: 700;
      color: #8a93a6;
      letter-spacing: 0.6px;
      line-height: 1.45;
      padding: 9px 8px 3px;
      border-top: 1px solid #f0f3f9;
      margin-top: 2px;
    }
    .mnav-group.open > .mnav-l2 > .mnav-sec:first-child {
      border-top: 0;
      margin-top: 0;
    }
    /* 回到顶部（M12③）：并入既有 nav 点击委托，零新增顶层监听 */
    .mnav-top {
      width: 100%;
      margin-top: 8px;
      padding: 7px 8px;
      font-family: inherit;
      font-size: 12px;
      color: #5b6678;
      background: #f7f9fc;
      border: 1px solid #e7ecf4;
      border-radius: 6px;
      cursor: pointer;
      transition: color 0.18s, border-color 0.18s, background 0.18s;
    }
    .mnav-top:hover {
      color: #1f4fd6;
      border-color: #c9d8f7;
      background: #eef3ff;
    }
    .mnav-top:focus-visible {
      outline: 2px solid #1f4fd6;
      outline-offset: -2px;
    }
    .manual-nav::-webkit-scrollbar {
      width: 5px;
    }
    .manual-nav::-webkit-scrollbar-thumb {
      background: rgba(31, 79, 214, 0.22);
      border-radius: 3px;
    }
    /* 窄窗口：抽屉宽度不足时目录改为顶部通栏，避免正文被挤压 */
    @media (max-width: 900px) {
      .manual-wrap {
        --m-text: none;   /* 窄窗视口已够窄，不再额外限制文字行宽 */
      }
      .manual-steps > li {
        padding-right: 14px;
      }
      .manual-layout {
        flex-direction: column;
      }
      .manual-nav {
        position: static;
        flex: 0 0 auto;
        width: 100%;
        max-height: none;
        margin-bottom: 6px;
      }
    }

    /* 步骤 / 提示 */
    .manual-steps {
      counter-reset: mstep;
      list-style: none;
      padding-left: 0;
    }
    .manual-steps > li {
      position: relative;
      padding: 12px 56px 12px 46px;
      margin: 6px 0;
      background: #fff;
      border: 1px solid #dde4ef;
      border-radius: 10px;
      box-shadow: inset 3px 0 0 #dfe6f4;
    }
    .manual-steps > li::before {
      counter-increment: mstep;
      content: counter(mstep);
      position: absolute;
      left: 14px;
      top: 14px;
      width: var(--m-run);
      height: var(--m-run);
      background: #1f4fd6;
      color: #fff;
      border-radius: 50%;
      display: flex;
      align-items: center;
      justify-content: center;
      font-weight: 800;
      font-size: 12.5px;
    }
    /* 步骤名（每个 <li> 的第一个 <b>）升格为卡标题；
       紧随其后的 <br> 让位，避免 block 化后多出一个空行。 */
    .manual-steps > li > b:first-child {
      display: block;
      font-size: 14.5px;
      font-weight: 800;
      color: #16202f;
      margin-bottom: 4px;
    }
    .manual-steps > li > b:first-child + br {
      display: none;
    }
    /* 两个具名字段（操作动作 / 预期结果）降格为色块胶囊标签 ——
       由 js/manual.js 的 markManualSteps() 按「后随冒号」判定打 data-lbl，
       不硬编码文案、不动正文一个字。 */
    .manual-steps > li > b[data-lbl] {
      display: inline-block;
      font-size: 12px;
      font-weight: 700;
      color: #2f5fd8;
      background: #eef3ff;
      border: 1px solid #d8e2fa;
      border-radius: 4px;
      padding: 0 6px;
      margin-right: 2px;
    }
    /* 提示块：左侧 4px 实心色条 + 圆形图标位，与「步骤卡」形成两个视觉家族 ——
       扫读时不读文字也能区分「这是操作」还是「这是提醒」。
       标题色压深至 AA 达标（3.13 -> 5.22 / 3.97 -> 5.42）。 */
    .manual-note {
      position: relative;
      border: 1px solid #f0e0b0;
      border-left: 4px solid #e0a800;
      background: #fffaf0;
      border-radius: 10px;
      padding: 12px 18px 12px 46px;
      margin: 16px 0;
    }
    .manual-note::before {
      content: '';
      position: absolute;
      left: 16px;
      top: 15px;
      width: 16px;
      height: 16px;
      border-radius: 50%;
      border: 2px solid #e0a800;
      box-sizing: border-box;
    }
    .manual-note-t {
      font-weight: 800;
      color: #8a6300;
      margin-bottom: 4px;
    }
    .manual-note-danger {
      border-color: #f3c2c6;
      border-left-color: #c0262f;
      background: #fdf3f4;
    }
    .manual-note-danger::before {
      border-color: #c0262f;
    }
    .manual-note-danger .manual-note-t {
      color: #c0262f;
    }

    /* FAQ 问答卡（M09 · 第六章 22 条）：问句带 Q 色块前缀，答案与之无缝衔接。
       复用 h3[data-lv="lv3"]（第六章内无三段式编号 ⇒ 条目级）。 */
    #m-sec-6 h3[data-lv="lv3"] {
      font-size: 15px;
      font-weight: 700;
      color: #16202f;
      margin: 22px 0 0;
      padding: 10px 14px 10px 40px;
      background: #f5f8ff;
      border: 1px solid #e0e8fa;
      border-left: 3px solid #1f4fd6;
      border-radius: 8px 8px 0 0;
      position: relative;
    }
    #m-sec-6 h3[data-lv="lv3"]::before {
      content: 'Q';
      position: absolute;
      left: 13px;
      top: 11px;
      font-size: 12px;
      font-weight: 800;
      color: #1f4fd6;
    }
    #m-sec-6 h3[data-lv="lv3"] + p {
      margin: 0 0 6px;
      padding: 11px 14px 11px 40px;
      background: #fff;
      border: 1px solid #e0e8fa;
      border-top: 0;
      border-radius: 0 0 8px 8px;
      font-size: 14px;
      line-height: 1.85;
      color: #344054;
    }

    /* 场景卡（M10 · 第二章 7 组）：h3 + ul 拼成一张卡（卡头 + 卡体），
       7 张等距序列，横向比较不同场景时视线不必重新定位。 */
    #m-sec-2 h3 {
      background: #fff;
      border: 1px solid #dde4ef;
      border-bottom: 0;
      border-left: 3px solid #1f4fd6;
      border-radius: 10px 10px 0 0;
      margin: 0;
      padding: 11px 16px 8px;
      font-size: 15.5px;
      color: #16202f;
    }
    #m-sec-2 h3 + ul {
      background: #fff;
      border: 1px solid #dde4ef;
      border-top: 1px dashed #e7ecf4;
      border-radius: 0 0 10px 10px;
      margin: 0 0 16px;
      padding: 12px 16px 14px 34px;
    }

    /* 长清单双列（M07）：条目多（>=6）且每条短的清单，双列可显著压缩纵向长度。
       仅命中 3 处（1.2 / 1.3 / 3.4），第二章场景卡（已是卡片）排除；
       :has() 不支持的浏览器自动保持单列，窄窗（<=900px）同样回退单列。 */
    @supports selector(:has(*)) {
      @media (min-width: 901px) {
        .manual-wrap section.manual-sec:not(#m-sec-2) > ul:has(> li:nth-child(6)) {
          column-count: 2;
          column-gap: 28px;
        }
        .manual-wrap section.manual-sec:not(#m-sec-2) > ul:has(> li:nth-child(6)) > li {
          break-inside: avoid;
          max-width: none;
        }
      }
    }

    /* ---------- 指标目录（第八章 · 50 项） ----------
     * 结构与文案由 js/manual.js 的 buildIndicatorCatalogHtml() 从 js/config.js 的
     * UnifiedIndicatorConfig 现场派生（维度分组表 + 计权/解读徽章 + 通用参考线）。
     * 此处只负责呈现。规则一律带 .manual-wrap 前缀：单 class 会被
     * .manual-wrap p / ul 这类元素选择器压掉（M07 已踩过这个坑）。 */
    .manual-wrap .manual-cat {
      max-width: none;      /* 表格属结构块，不受 --m-text 文字行限宽约束 */
    }
    /* 汇总条：四个计数胶囊，计数全部由真源派生，页面不写死数字 */
    .manual-wrap .cat-sum {
      display: flex;
      flex-wrap: wrap;
      gap: 10px;
      margin: 14px 0 4px;
    }
    .manual-wrap .cat-sum-i {
      background: #fff;
      border: 1px solid #d5dcea;
      border-radius: 18px;
      padding: 4px 14px;
      font-size: 12.5px;
      color: #5b6678;
    }
    .manual-wrap .cat-sum-i b {
      font-size: 15px;
      font-weight: 800;
      color: #1f4fd6;
      margin-right: 5px;
    }
    /* 本节的 8 个 h3 都是「维度分组」，升格为功能组质感（与第五章 5.x 同级复用同一视觉语言） */
    #m-sec-8 h3[data-lv="lv3"] {
      font-size: 17px;
      color: #16202f;
      margin: 30px 0 6px;
      padding: 8px 12px;
      border-left: 4px solid #1f4fd6;
      background: linear-gradient(90deg, #f2f6ff 0%, rgba(242, 246, 255, 0) 78%);
    }
    .manual-wrap .cat-meta {
      color: #55606f;
      font-size: 12.5px;
      letter-spacing: 0.2px;
      margin: 0 0 8px;
      padding-left: 2px;
    }
    /* 指标表：名称 / 单位 / 计算公式 / 通用参考线 四列固定布局 */
    .manual-wrap .cat-tbl {
      width: 100%;
      table-layout: fixed;
      border-collapse: separate;
      border-spacing: 0;
      background: #fff;
      border: 1px solid #dde4ef;
      border-radius: 10px;
      overflow: hidden;
      font-size: 13px;
      line-height: 1.6;
    }
    .manual-wrap .cat-tbl th {
      background: #f4f7fd;
      color: #35425c;
      font-size: 12.5px;
      font-weight: 700;
      text-align: left;
      white-space: nowrap;
      padding: 8px 12px;
      border-bottom: 1px solid #dde4ef;
    }
    .manual-wrap .cat-tbl td {
      padding: 8px 12px;
      color: #38455e;
      vertical-align: top;
      word-break: break-word;
      border-bottom: 1px solid #eef1f6;
    }
    .manual-wrap .cat-tbl tbody tr:last-child td {
      border-bottom: 0;
    }
    .manual-wrap .cat-tbl tbody tr:nth-child(even) {
      background: #fafbfe;
    }
    .manual-wrap .cat-tbl td:first-child {
      color: #16202f;
      font-weight: 600;
    }
    .manual-wrap .cat-tbl .cat-c-name { width: 26%; }
    .manual-wrap .cat-tbl .cat-c-unit { width: 8%; }
    .manual-wrap .cat-tbl .cat-c-ref { width: 19%; }
    /* 「解读」徽章：13 项 weight:0，只展示不评分 */
    .manual-wrap .cat-badge {
      display: inline-block;
      margin-left: 6px;
      padding: 0 5px;
      font-size: 11px;
      font-weight: 700;
      color: #8a6300;
      background: #fff6e0;
      border: 1px solid #f0dcae;
      border-radius: 4px;
      vertical-align: 1px;
    }
    .manual-wrap .cat-ref {
      color: #0b6b4f;
      font-weight: 700;
      font-variant-numeric: tabular-nums;
    }
    .manual-wrap .cat-ref-none {
      color: #6b7688;
    }
    /* 窄窗：四列表格转「字段行」卡片式。用 ::before 生成字段名走 inline 流，
       不用 Grid —— td 内是「裸文本 + 徽章元素」混排，Grid 会把它们拆成两个 item。 */
    @media (max-width: 700px) {
      .manual-wrap .cat-tbl, .manual-wrap .cat-tbl tbody,
      .manual-wrap .cat-tbl tr, .manual-wrap .cat-tbl td {
        display: block;
        width: auto;
      }
      .manual-wrap .cat-tbl thead {
        display: none;
      }
      .manual-wrap .cat-tbl tr {
        border-bottom: 1px solid #dde4ef;
        padding: 6px 0;
      }
      .manual-wrap .cat-tbl tbody tr:last-child {
        border-bottom: 0;
      }
      .manual-wrap .cat-tbl td {
        border: 0;
        padding: 2px 12px;
        font-weight: 400;
      }
      .manual-wrap .cat-tbl td::before {
        content: attr(data-th) '：';
        display: inline-block;
        width: 76px;
        color: #55606f;
        font-weight: 600;
      }
      .manual-wrap .cat-tbl td:first-child {
        font-size: 14px;
        font-weight: 700;
      }
    }

    /* 结尾 */
    .manual-footer {
      margin-top: 32px;
      padding: 24px 20px;
      border-top: 3px solid #1f4fd6;
      text-align: center;
      color: #5b6678;
      font-size: 13px;
    }
    .manual-footer p {
      margin: 4px 0;
    }
    .manual-footer-copy {
      margin-top: 10px !important;
      color: #55606f;
      font-size: 12px;
    }

    /* ---------- 独立操作手册配图（figure.manual-fig） ----------
       仅《财智检财务驾驶舱操作手册》独立页使用（由 tools/build-manual-preview.js
       在章节锚点后注入）；系统内说明书（js/manual.js）与预览页均不带图。
       样式放在本节内，保证生成器提取本段时能一并取到（预览页取到但不使用）。 */
    .manual-fig {
      margin: 18px 0;
      border: 1px solid #d5e0f2;
      border-radius: 12px;
      overflow: hidden;
      background: #fff;
      box-shadow: 0 2px 12px rgba(31, 79, 214, 0.06);
    }
    .manual-fig img {
      display: block;
      width: 100%;
      height: auto;
      background: #fff;
    }
    .manual-fig figcaption {
      padding: 10px 16px;
      font-size: 13px;
      line-height: 1.7;
      color: #5b6678;
      border-top: 1px solid #e7ecf4;
      background: #f5f7fb;
    }

    /* 打印 */
    @media print {
      #manualDrawer {
        transform: none;
        width: 100%;
        background: #fff;
      }
      #manualDrawer .manual-dw-body {
        background: #fff;
      }
      .manual-layout {
        display: block;
      }
      .manual-nav {
        display: none;
      }
      /* 打印：取消吸附与限宽，充分利用纸面；引导元件不落纸 */
      .manual-wrap {
        --m-text: none;
      }
      .manual-wrap h2 {
        position: static;
        box-shadow: none;
        padding-top: 0;
      }
      .manual-steps > li {
        padding-right: 14px;
        box-shadow: none;
      }
      /* 打印：指标目录行不跨页断开 */
      .manual-wrap .cat-tbl {
        font-size: 11.5px;
      }
      .manual-wrap .cat-tbl tr {
        break-inside: avoid;
        page-break-inside: avoid;
      }
      .manual-wrap .cat-sum {
        gap: 8px;
      }
    }

    /* ==========================================================================
     * 系统设置 · 界面主题选择器（深色/浅色）
     * ========================================================================== */
    .theme-selector {
      display: flex;
      gap: 12px;
      flex-wrap: wrap;
    }
    .theme-option {
      position: relative;
      flex: 1;
      min-width: 150px;
      display: flex;
      align-items: center;
      gap: 10px;
      padding: 12px 14px;
      background: rgba(var(--i-r), var(--i-g), var(--i-b), 0.55);
      border: 1px solid var(--line);
      border-radius: 10px;
      cursor: pointer;
      transition: all 0.2s ease;
      user-select: none;
    }
    .theme-option:hover {
      border-color: var(--cyan);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.7);
    }
    .theme-option input[type="radio"] {
      position: absolute;
      opacity: 0;
      width: 0;
      height: 0;
    }
    .theme-option .theme-swatch {
      flex: none;
      width: 34px;
      height: 34px;
      border-radius: 8px;
      display: flex;
      align-items: center;
      justify-content: center;
      font-size: 16px;
      border: 1px solid rgba(127, 155, 196, 0.4);
      background: #0e2040;
      transition: all 0.2s ease;
    }
    .theme-option .theme-swatch.light {
      background: #eef2f8;
    }
    .theme-option .theme-name {
      font-size: 14px;
      font-weight: 500;
      color: var(--txt);
    }
    .theme-option input[type="radio"]:checked + .theme-swatch {
      border-color: var(--cyan);
      box-shadow: 0 0 0 2px rgba(0, 212, 255, 0.35);
    }
    .theme-option input[type="radio"]:checked ~ .theme-name {
      color: var(--cyan);
    }
    .theme-option:has(input[type="radio"]:checked) {
      border-color: var(--cyan);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.75);
    }
    /* 浅色主题下主题选择器文字适配 */
    html[data-theme="light"] .theme-option .theme-name { color: #1c2b45; }
    html[data-theme="light"] .theme-option input[type="radio"]:checked ~ .theme-name { color: #1f4fd6; }

    /* ==========================================================================
     * 系统设置 · 屏幕显示选择器（屏幕自适应 / 16:9 屏幕；2026-09-12 新增）
     * 结构、悬停、选中态与浅色适配**全部复用**「界面主题」选择器
     * （.theme-selector / .theme-option / .theme-swatch / .theme-name），
     * 此处只补两枚图标底色与字号 —— 避免复制一份样式后与主题选择器漂移。
     * ========================================================================== */
    .theme-option .theme-swatch.screen-swatch {
      font-size: 14px;
      font-weight: 600;
      letter-spacing: 0;
      line-height: 1;
    }
    /* 屏幕自适应：满屏铺开（深底蓝调） */
    .theme-option .theme-swatch.screen-swatch-adaptive {
      background: linear-gradient(135deg, #123063 0%, #0a1830 100%);
      color: #7fd8ff;
    }
    /* 16:9 屏幕：固定画布（窄字号塞入 34×34 格） */
    .theme-option .theme-swatch.screen-swatch-169 {
      background: #0b1b33;
      color: #9fb6d8;
      font-size: 11px;
      letter-spacing: -0.3px;
    }
    html[data-theme="light"] .theme-option .theme-swatch.screen-swatch-adaptive {
      background: linear-gradient(135deg, #e6eefc 0%, #d8e5f8 100%);
      color: #1f4fd6;
    }
    html[data-theme="light"] .theme-option .theme-swatch.screen-swatch-169 {
      background: #eef2f8;
      color: #3b5a86;
    }

    /* ==========================================================================
     * 数据录入页深度优化命名空间（.de-*）
     * 仅作用于 .data-entry-table.de-table 等新增 DOM；不覆盖既有 .data-entry-* 规则
     * （冲突处用更高优先级选择器 + !important 接管斑马/类别行/首列背景）。
     * ========================================================================== */
    .data-entry-table.de-table {
      table-layout: fixed;
      width: 100%;
    }
    .data-entry-table.de-table th.col-item,
    .data-entry-table.de-table td.col-item {
      width: 230px;
      min-width: 230px;
      max-width: 300px;
    }
    .data-entry-table.de-table th.col-month,
    .data-entry-table.de-table td.data-cell,
    .data-entry-table.de-table td.col-month {
      width: 80px;
      min-width: 80px;
      max-width: 80px;
    }
    /* 去「小计」列（5 张报表在 generateDataEntryTable 加 de-table--no-summary 标记，JS 不渲染该列） */
    .data-entry-table.de-table.de-table--no-summary th.de-summary-col,
    .data-entry-table.de-table.de-table--no-summary td.de-summary-col { display: none; }

    /* 斑马纹：完全替换旧的深蓝行背景为极淡 zebra（深色白透 / 浅色黑透） */
    .data-entry-table.de-table tbody tr.de-data-row.data-row-odd,
    .data-entry-table.de-table tbody tr.de-data-row.data-row-even {
      background: transparent !important;
    }
    .data-entry-table.de-table tbody tr.de-data-row.data-row-even {
      background: var(--de-zebra) !important;
    }
    .data-entry-table.de-table tbody tr.de-data-row:hover {
      background: rgba(0, 212, 255, 0.05) !important;
    }

    /* 类别行：主题 primary 条带 + 加粗 + 折叠三角 + 序号（替换旧橙/青硬色） */
    .data-entry-table.de-table tbody tr.de-cat-row.category-row,
    .data-entry-table.de-table tbody tr.de-cat-row.category-row td {
      background: transparent !important;
      color: var(--txt) !important;
      border-bottom: 1px solid var(--line);
    }
    .data-entry-table.de-table tbody tr.de-cat-row.category-row td.col-item {
      background: var(--de-cat-bg) !important;
      color: var(--txt) !important;
    }
    .data-entry-table.de-table tbody tr.de-cat-row.category-row {
      background: var(--de-cat-bg) !important;
    }
    .de-cat-toggle {
      display: inline-block;
      width: 14px;
      color: var(--de-ink-accent);
      cursor: pointer;
      user-select: none;
      font-size: 10px;
      transition: transform 0.15s;
    }
    .de-cat-idx {
      color: var(--de-ink-accent);
      font-weight: 700;
      margin-right: 4px;
      font-variant-numeric: tabular-nums;
    }
    .de-cat-name {
      font-weight: 600;
    }
    /* U-4：折叠三角由 <span> 升为 <button>（可聚焦 + aria-expanded），清除浏览器默认按钮外观 */
    button.de-cat-toggle {
      background: transparent; border: 0; padding: 0; font-family: inherit;
      line-height: 1; text-align: left; vertical-align: baseline;
    }
    button.de-cat-toggle:focus-visible {
      outline: 2px solid var(--de-cell-border-focus); outline-offset: 2px; border-radius: 3px;
    }
    /* U-4：视觉隐藏但读屏可见（live region） */
    .de-sr-only {
      position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
      overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
    }

    /* sticky 首列（项目列）：不透明底，避免横向滚动时内容穿透 */
    .data-entry-table.de-table tbody tr.de-data-row td.col-item {
      background: var(--de-colitem-bg) !important;
      color: var(--txt) !important;
      font-weight: 500;
    }
    .data-entry-table.de-table tbody tr.de-data-row.data-row-even td.col-item {
      background: var(--de-colitem-bg) !important;
    }
    .data-entry-table.de-table tbody tr.de-data-row:hover td.col-item {
      background: var(--de-colitem-bg) !important;
    }

    /* 输入格容器：边框/焦点/错误/已录 由容器承担，input 仅负责数值 */
    .data-entry-table.de-table td.data-cell {
      padding: 4px 3px;
      border-bottom: 1px solid rgba(76, 130, 255, 0.08);
    }
    .data-entry-table.de-table .de-cell {
      position: relative;
      display: flex;
      align-items: center;
      justify-content: flex-end;
      height: 32px;
      padding: 0 6px;
      border: 1px solid var(--de-cell-border);
      border-radius: 4px;
      background: var(--de-cell-bg);
      box-sizing: border-box;
      transition: border-color 0.12s, box-shadow 0.12s, background 0.12s;
    }
    .data-entry-table.de-table .de-cell .data-input {
      width: 100%;
      border: none;
      outline: none;
      background: transparent;
      box-shadow: none;
      text-align: right;
      color: var(--txt);
      font-size: 12px;
      font-family: 'Consolas', 'Monaco', monospace;
      font-variant-numeric: tabular-nums;
      padding: 0;
      -moz-appearance: textfield;
    }
    .data-entry-table.de-table .de-cell .data-input::-webkit-outer-spin-button,
    .data-entry-table.de-table .de-cell .data-input::-webkit-inner-spin-button {
      -webkit-appearance: none;
      margin: 0;
    }
    .data-entry-table.de-table .de-cell .data-input::placeholder {
      color: var(--txt3);
      opacity: 0.6;
      text-align: center;
    }
    /* 接管旧 .data-entry-table input:focus 的描边/阴影，避免与容器 focus-within 双重发光 */
    .data-entry-table.de-table .de-cell .data-input:focus {
      outline: none;
      border: none;
      background: transparent;
      box-shadow: none;
    }
    .data-entry-table.de-table .de-cell .data-input.neg {
      color: var(--danger);
    }
    .data-entry-table.de-table .de-cell:focus-within {
      border-color: var(--de-cell-border-focus);
      box-shadow: 0 0 0 3px var(--de-primary-soft);
    }
    /* 已录态：左侧浅绿竖线 */
    .data-entry-table.de-table .de-cell.de-cell-filled {
      box-shadow: inset 2px 0 0 var(--success);
    }
    .data-entry-table.de-table .de-cell.de-cell-filled:focus-within {
      box-shadow: inset 2px 0 0 var(--success), 0 0 0 3px var(--de-primary-soft);
    }
    /* 错误态（非法负数 / 校验未过）：红描边 + 右下角小三角 */
    .data-entry-table.de-table .de-cell.has-error {
      border-color: var(--danger);
      box-shadow: 0 0 0 3px rgba(255, 107, 107, 0.18);
    }
    .data-entry-table.de-table .de-cell.has-error::after {
      content: '';
      position: absolute;
      right: 0;
      bottom: 0;
      border: 5px solid transparent;
      border-right-color: var(--danger);
      border-bottom-color: var(--danger);
      pointer-events: none;
    }
    /* 选区高亮 */
    .data-entry-table.de-table .de-cell.de-selected {
      background: var(--de-fill) !important;
    }

    /* 差异 chip：默认收起为小色点，hover 展开为浮动文本 */
    .data-entry-table.de-table .de-chip {
      position: absolute;
      top: 1px;
      right: 2px;
      display: inline-flex;
      align-items: center;
      gap: 4px;
      font-size: 11px;
      line-height: 1;
      cursor: default;
      z-index: 6;
    }
    /* U-14：无基期 / 空值时用类隐藏（替代 chip.style.display，保持零内联样式） */
    .data-entry-table.de-table .de-chip.is-hidden { display: none; }
    .de-chip-dot {
      width: 6px;
      height: 6px;
      border-radius: 50%;
      background: var(--txt3);
      flex: none;
    }
    .de-chip-txt {
      display: none;
      white-space: nowrap;
      font-variant-numeric: tabular-nums;
      position: absolute;
      top: 9px;
      right: 0;
      padding: 2px 6px;
      border-radius: 4px;
      background: var(--dw-bg-1);
      border: 1px solid var(--line);
      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
    }
    .de-chip.pos .de-chip-dot { background: var(--success); }
    .de-chip.neg .de-chip-dot { background: var(--danger); }
    .de-chip.zero .de-chip-dot { background: var(--txt3); }
    .de-chip.pos .de-chip-txt { color: var(--success); }
    .de-chip.neg .de-chip-txt { color: var(--danger); }
    .de-chip.zero .de-chip-txt { color: var(--txt3); }
    .de-chip:hover { z-index: 30; }
    .de-chip:hover .de-chip-txt { display: inline-block; }

    /* 拖拽填充手柄 */
    .de-fill-handle {
      display: none;
      position: absolute;
      right: -1px;
      bottom: -1px;
      width: 9px;
      height: 9px;
      border-right: 2px solid var(--primary);
      border-bottom: 2px solid var(--primary);
      cursor: crosshair;
    }
    .data-entry-table.de-table .de-cell:focus-within .de-fill-handle {
      display: block;
    }

    /* 汇总列（最右，sticky） */
    .data-entry-table.de-table td.de-summary-col {
      position: sticky;
      right: 0;
      z-index: 2;
      width: 96px;
      min-width: 96px;
      max-width: 96px;
      text-align: right;
      padding: 4px 8px;
      background: var(--de-summary-bg);
      color: var(--txt2);
      font-weight: 600;
      font-variant-numeric: tabular-nums;
      border-bottom: 1px solid rgba(76, 130, 255, 0.08);
    }
    .data-entry-table.de-table thead th.de-summary-col {
      right: 0;
      z-index: 4;
      background: linear-gradient(180deg, var(--th-bg-1), var(--th-bg-2));
      color: var(--txt);
      font-weight: 600;
    }
    .data-entry-table.de-table .de-summary {
      text-align: right;
      font-variant-numeric: tabular-nums;
      color: var(--txt2);
      width: 100%;
    }
    .data-entry-table.de-table .de-cat-row .de-summary {
      color: var(--de-ink-sum);
      font-weight: 700;
    }
    .data-entry-table.de-table .de-summary.de-rowsum {
      color: var(--txt);
    }
    .de-num {
      font-variant-numeric: tabular-nums;
    }

    /* 工具栏主次按钮（.de-btn-* 命名空间） */
    .data-entry-header-actions .de-btn {
      height: 36px;
      border-radius: 8px;
      padding: 0 16px;
      font-weight: 600;
      font-size: 13px;
      cursor: pointer;
      border: 1px solid transparent;
      display: inline-flex;
      align-items: center;
      gap: 6px;
      transition: all 0.15s ease;
      white-space: nowrap;
    }
    .data-entry-header-actions .de-btn-primary {
      background: linear-gradient(135deg, var(--de-btn-primary-a), var(--de-btn-primary-b));
      color: var(--de-btn-primary-ink);
    }
    .data-entry-header-actions .de-btn-primary:hover {
      transform: translateY(-1px);
      box-shadow: 0 4px 12px rgba(0, 212, 255, 0.4);
    }
    .data-entry-header-actions .de-btn-ghost-primary {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      border-color: var(--line);
      color: var(--primary);
    }
    .data-entry-header-actions .de-btn-ghost-primary:hover {
      border-color: var(--primary);
      background: rgba(var(--p-g), var(--p-g), var(--p-b), 0.85);
    }
    .data-entry-header-actions .de-btn-danger {
      background: rgba(255, 107, 107, 0.15);
      border-color: rgba(255, 107, 107, 0.3);
      color: var(--de-btn-danger-ink);
    }
    .data-entry-header-actions .de-btn-danger:hover {
      background: rgba(255, 107, 107, 0.25);
    }
    .data-entry-header-actions .de-btn-ghost {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      border-color: var(--line);
      color: var(--txt2);
    }
    .data-entry-header-actions .de-btn-ghost:hover {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.85);
      border-color: var(--primary);
      color: var(--txt);
    }
    /* U-7：按钮三层级 —— 主（保存，渐变）/ 危（清空）/ 次（计算指标）+「⋯ 更多」弹层 */
    .data-entry-header-actions .de-hide { display: none !important; }
    .data-entry-header-actions .de-dirty {
      display: inline-block; width: 7px; height: 7px; margin-left: 6px;
      border-radius: 50%; background: var(--de-btn-primary-ink); opacity: 0.9;
      vertical-align: middle;
    }
    .data-entry-header-actions .de-dirty[hidden] { display: none; }
    .data-entry-header-actions .de-more { position: relative; display: inline-flex; }
    .data-entry-header-actions .de-more-pop {
      position: absolute; right: 0; top: calc(100% + 6px); z-index: 40;
      display: flex; flex-direction: column; gap: 6px; min-width: 136px;
      padding: 8px; border-radius: 10px;
      background: var(--dw-bg-1); border: 1px solid var(--line);
      box-shadow: 0 8px 24px rgba(0, 0, 0, 0.28);
    }
    .data-entry-header-actions .de-more-pop[hidden] { display: none; }
    .data-entry-header-actions .de-more-pop .de-btn { width: 100%; justify-content: flex-start; }
    .de-year-tip {
      align-self: center;
      font-size: 11px;
      color: var(--txt3);
      border: 1px dashed var(--line);
      border-radius: 6px;
      padding: 3px 8px;
      cursor: help;
    }

    /* 折叠分类：隐藏子项（由 JS 切 class，不使用不可靠的兄弟选择器） */
    .data-entry-table.de-table tbody tr.de-data-row.de-folded {
      display: none;
    }

    /* ==================== R4 数据覆盖度口径标签（评分口径 2.0） ==================== */
    .cov-tag {
      display: inline-block;
      margin-left: 6px;
      padding: 1px 7px;
      border-radius: 10px;
      font-size: 11px;
      font-weight: 500;
      line-height: 1.6;
      color: var(--txt2, #94a3b8);
      background: rgba(148, 163, 184, 0.12);
      border: 1px solid rgba(148, 163, 184, 0.25);
      white-space: nowrap;
      vertical-align: middle;
    }
    .oh-cov-tag {
      display: block;
      margin: 4px 0 0;
      width: fit-content;
    }
    html[data-theme="light"] .cov-tag {
      color: #52607a;
      background: rgba(82, 96, 122, 0.08);
      border-color: rgba(82, 96, 122, 0.22);
    }
    /* 开关关闭态：整站隐藏 cov-tag（JS 在 body[data-covlabel] 上切换） */
    body[data-covlabel="off"] .cov-tag {
      display: none !important;
    }

    /* 系统设置：数据展示开关行 */
    .settings-toggle-row {
      display: flex;
      align-items: center;
      gap: 10px;
      margin-top: 4px;
    }
    .settings-toggle {
      display: inline-flex;
      align-items: center;
      cursor: pointer;
      position: relative;
    }
    .settings-toggle input[type="checkbox"] {
      width: 16px;
      height: 16px;
      margin: 0;
      cursor: pointer;
      accent-color: var(--primary, #4c82ff);
    }
    .settings-toggle-text {
      font-size: 12px;
      color: var(--txt2);
    }

    /* ==================== 3 个特殊 TAB（补充数据 / 账龄台账 / 维度数据）风格统一 ==================== */
    /* 通用卡片面板：账龄台账外层、维度数据外层 + 内层面板；双主题感知（深/浅均正常，无硬编码 hex） */
    .de-card {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.4);
      border: 1px solid var(--line);
      border-radius: 12px;
      padding: 16px;
      box-sizing: border-box;
    }

    /* 通用工具栏 / 文本 / 输入 / 提示：账龄、维度顶栏复用，独立于 .data-entry-header-actions */
    .de-toolbar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 8px; }
    .de-toolbar-actions { margin-left: auto; display: flex; gap: 8px; flex-wrap: wrap; }
    .de-muted { font-size: 13px; color: var(--txt2); }
    .de-input {
      padding: 6px 10px; background: var(--de-cell-bg); border: 1px solid var(--de-cell-border);
      border-radius: 6px; color: var(--txt); font-size: 12.5px; box-sizing: border-box;
    }
    .de-note {
      display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 12px;
      padding: 8px 12px; border: 1px solid var(--line); border-radius: 8px; font-size: 12px;
      color: var(--txt2); line-height: 1.7; background: rgba(var(--i-r), var(--i-g), var(--i-b), 0.25);
    }

    /* 通用按钮（.de-btn-* 命名；账龄/维度顶栏与底部按钮区复用，独立于报表 TAB 顶部工具栏） */
    .de-btn {
      height: 34px; border-radius: 8px; padding: 0 14px; font-weight: 600; font-size: 13px;
      cursor: pointer; border: 1px solid transparent; display: inline-flex; align-items: center; gap: 6px;
      transition: all .15s ease; white-space: nowrap; box-sizing: border-box;
    }
    .de-btn-ghost { background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6); border-color: var(--line); color: var(--txt2); }
    .de-btn-ghost:hover { background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.85); border-color: var(--primary); color: var(--txt); }
    .de-btn-ghost-primary { background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6); border-color: var(--de-btn-ghost-primary-bd); color: var(--de-btn-ghost-primary-ink); }
    .de-btn-primary { background: linear-gradient(135deg, var(--de-btn-primary-a), var(--de-btn-primary-b)); color: var(--de-btn-primary-ink); }
    .de-btn-danger { background: rgba(255, 107, 107, 0.15); border-color: rgba(255, 107, 107, 0.3); color: var(--de-btn-danger-ink); }
    .de-btn-danger:hover { background: rgba(255, 107, 107, 0.25); }

    /* P0-3：空库 / 旧版引导横幅（令牌化，替代 renderSeedStatusBanner 的内联样式） */
    .de-seed-banner {
      display: flex; align-items: center; gap: 12px;
      padding: 10px 14px; margin-bottom: 12px;
      background: linear-gradient(90deg, var(--de-seed-bg-1), var(--de-seed-bg-2));
      border: 1px solid var(--de-seed-bd); border-radius: 8px;
      color: var(--de-seed-ink); font-size: 13px; line-height: 1.6;
    }
    .de-seed-banner .de-seed-icon { font-size: 18px; }
    .de-seed-banner .de-seed-text { flex: 1; }
    .de-seed-banner.is-upgrade {
      background: linear-gradient(90deg, var(--de-seed-bg-warn-1), var(--de-seed-bg-warn-2));
      border-color: var(--de-seed-bd-warn);
      color: var(--de-seed-ink-warn);
    }
    .de-seed-close {
      flex: 0 0 auto; width: var(--de-touch); height: var(--de-touch); min-width: var(--de-touch);
      display: inline-flex; align-items: center; justify-content: center;
      background: transparent; border: 0; border-radius: 6px;
      color: inherit; font-size: 18px; line-height: 1; cursor: pointer;
    }
    .de-seed-close:hover { background: rgba(0, 0, 0, 0.10); }
    html[data-theme="light"] .de-seed-close:hover { background: rgba(0, 0, 0, 0.06); }
    .de-seed-close:focus-visible { outline: 2px solid var(--de-seed-bd); outline-offset: 2px; }

    /* P1-2：录入表格首列表头「（万元）」单位声明 */
    .data-entry-table.de-table th.col-item .de-unit {
      font-weight: 400; font-size: 11px; color: var(--de-unit-ink); margin-left: 4px;
    }

    /* ---- P1-4 预算目标 TAB 工具条（原 7 处内联样式 → 0；浅色可读） ---- */
    .de-bud-bar {
      display: flex; align-items: center; flex-wrap: wrap; gap: 10px;
      margin-bottom: 12px; padding: 10px 14px; border-radius: 10px;
      background: var(--de-bud-bar-bg); border: 1px solid var(--de-bud-bar-bd);
    }
    .de-bud-bar-title { font-size: 13px; font-weight: 600; color: var(--de-dim-ink-2); }
    .de-bud-bar-mode { min-width: 250px; }
    .de-bud-factor {
      display: inline-flex; align-items: center; gap: 6px;
      font-size: 12px; color: var(--de-dim-ink-3);
    }
    .de-bud-factor[hidden] { display: none; }
    .de-bud-factor-input {
      width: 84px; padding: 4px 6px; border-radius: 6px; font-size: 12px;
      border: 1px solid var(--de-bud-fill-bd); background: var(--de-bud-fill-bg);
      color: var(--de-bud-fill-ink);
    }
    .de-bud-bar-note { font-size: 11.5px; color: var(--de-dim-ink-3); line-height: 1.6; }
    .de-bud-hint {
      margin-left: 6px; font-size: 11px; color: var(--de-bud-hint-ink);
      border: 1px solid var(--de-bud-hint-bd); background: var(--de-bud-hint-bg);
      padding: 1px 6px; border-radius: 8px;
    }
    /* ---- P1-2 补充数据 TAB：说明行与表格外距（原 2 处内联样式 → 0） ---- */
    .de-sup-wrap { margin-top: 20px; }
    /* 注意：旧规则 .data-entry-table tbody tr.category-row td { color: var(--orange) !important }
       会压过普通类选择器 → 本类必须同样带 !important 才能接管（沿用本命名空间既有的提权策略） */
    .data-entry-table.de-table tbody tr td.col-item.de-sup-note {
      color: var(--de-note-ink) !important; font-size: 12px; line-height: 1.8;
      text-align: left; padding: 6px 10px;
    }
    /* ---- 收入双口径对账横幅（--de-recon-* · P0-3①②；只加提示不改数字，零内联样式） ---- */
    .de-recon {
      display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
      margin-bottom: 12px; padding: 9px 13px; border-radius: 8px;
      border: 1px solid var(--de-recon-mut-bd); background: var(--de-recon-mut-bg);
      color: var(--de-recon-ink-2); font-size: 12.5px; line-height: 1.6;
    }
    .de-recon:empty { display: none; }
    .de-recon-ico { flex: 0 0 auto; font-size: 15px; line-height: 1; }
    .de-recon-main { flex: 1 1 260px; min-width: 220px; display: flex; flex-direction: column; gap: 2px; }
    .de-recon-title { font-weight: 700; color: var(--de-recon-ink); }
    .de-recon-nums { font-size: 11.5px; color: var(--de-recon-ink-3); font-variant-numeric: tabular-nums; }
    .de-recon-detail { flex: 1 1 240px; min-width: 200px; font-size: 11.5px; color: var(--de-recon-ink-3); }
    .de-recon--match { border-color: var(--de-recon-ok-bd); background: var(--de-recon-ok-bg); }
    .de-recon--match .de-recon-title { color: var(--de-recon-ok-ink); }
    .de-recon--low, .de-recon--high { border-color: var(--de-recon-warn-bd); background: var(--de-recon-warn-bg); }
    .de-recon--low .de-recon-title, .de-recon--high .de-recon-title { color: var(--de-recon-warn-ink); }
    .de-recon--unreconcilable, .de-recon--incomparable { border-color: var(--de-recon-mut-bd); background: var(--de-recon-mut-bg); }

    /* 多维分析页结论条内的对账胶囊（--de-* 令牌；内联文案 ≤20 字） */
    .de-recon-chip {
      display: inline-flex; align-items: center; gap: 4px; padding: 1px 8px; border-radius: 9px;
      font-size: 11px; font-weight: 600; white-space: nowrap;
      border: 1px solid var(--de-recon-mut-bd); background: var(--de-recon-mut-bg); color: var(--de-recon-mut-ink);
    }
    .de-recon-chip--match { border-color: var(--de-recon-ok-bd); background: var(--de-recon-ok-bg); color: var(--de-recon-ok-ink); }
    .de-recon-chip--low, .de-recon-chip--high { border-color: var(--de-recon-warn-bd); background: var(--de-recon-warn-bg); color: var(--de-recon-warn-ink); }

    /* 口径标注徽标（会计科目口径 / 产品线口径） */
    .de-acc-badge {
      display: inline-block; margin-left: 6px; padding: 1px 7px; border-radius: 9px;
      font-size: 10.5px; font-weight: 600; vertical-align: middle;
      border: 1px solid var(--de-recon-mut-bd); background: var(--de-recon-mut-bg); color: var(--de-recon-mut-ink);
    }
    /* 双口径互指引说明 */
    .de-recon-note {
      display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
      margin: 8px 0 12px; padding: 7px 11px; border-radius: 8px;
      border: 1px dashed var(--de-recon-mut-bd); background: var(--de-recon-mut-bg);
      font-size: 12px; color: var(--de-recon-ink-3);
    }

    /* P1：产品维度 → 补充数据 一键互导归并面板 */
    .de-supimport-host:empty { display: none; }
    .de-supimport {
      margin: 12px 0; padding: 12px 14px; border-radius: 10px;
      border: 1px solid var(--de-recon-mut-bd); background: var(--de-recon-mut-bg);
    }
    .de-supimport-head { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin-bottom: 4px; }
    .de-supimport-title { font-size: 13px; font-weight: 700; color: var(--de-recon-ink); }
    .de-supimport-note { font-size: 11.5px; color: var(--de-recon-ink-3); }
    .de-supimport-warn {
      margin-bottom: 8px; padding: 7px 11px; border-radius: 8px;
      border: 1px solid var(--de-recon-warn-bd); background: var(--de-recon-warn-bg);
      color: var(--de-recon-warn-ink); font-size: 12px; line-height: 1.6;
    }
    .de-supimport-warn[hidden] { display: none; }
    .de-supimport-hint { font-size: 12px; color: var(--de-recon-ink-2); line-height: 1.7; margin-bottom: 8px; }
    .de-supimport-scroll { max-height: 280px; overflow: auto; border: 1px solid var(--de-recon-mut-bd); border-radius: 8px; background: var(--de-cell-bg); }
    .de-supimport-table { width: 100%; border-collapse: collapse; font-size: 12.5px; }
    .de-supimport-table th, .de-supimport-table td { padding: 6px 10px; border-bottom: 1px solid var(--line2); text-align: left; }
    .de-supimport-table th { position: sticky; top: 0; background: var(--th-bg-1); color: var(--txt); font-weight: 600; }
    .de-supimport-rev { text-align: right; font-variant-numeric: tabular-nums; }
    .de-supimport-target { height: 30px; }
    .de-supimport-actions { display: flex; gap: 8px; margin-top: 10px; }

    /* 表头浅色背景（维度数据表格 de-thead 与报表 de-thead 共用，双主题感知；覆盖内联深色） */
    .de-thead, .de-thead th {
      background: linear-gradient(180deg, var(--th-bg-1), var(--th-bg-2)) !important;
      color: var(--txt) !important;
    }
    .de-thead th div { color: var(--txt3) !important; }
    /* U-9：勾稽问题面板（替代 window.confirm 的纯文本提示流） */
    .de-issue-panel {
      margin-bottom: 12px; border-radius: 10px; overflow: hidden;
      border: 1px solid var(--de-bad-bd); background: var(--de-bad-bg);
    }
    .de-issue-head {
      display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap;
      padding: 9px 13px; border-bottom: 1px solid var(--de-bad-bd);
    }
    .de-issue-head b { font-size: 13px; color: var(--de-bad-ink); }
    .de-issue-head span { font-size: 11.5px; color: var(--txt2); }
    .de-issue-list { list-style: none; margin: 0; padding: 6px 13px; }
    .de-issue-item {
      display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap;
      padding: 6px 0; border-bottom: 1px dashed var(--line);
    }
    .de-issue-item:last-child { border-bottom: 0; }
    .de-issue-tag {
      flex: none; min-width: 42px; text-align: center; padding: 1px 7px; border-radius: 9px;
      border: 1px solid var(--de-bad-bd); font-size: 11px; color: var(--de-bad-ink);
      font-variant-numeric: tabular-nums;
    }
    .de-issue-rule { font-size: 12px; font-weight: 600; color: var(--txt); }
    .de-issue-msg { font-size: 12px; color: var(--txt); }
    .de-issue-num { font-size: 11px; color: var(--txt2); font-variant-numeric: tabular-nums; }
    .de-issue-locate {
      margin-left: auto; height: 26px; padding: 0 10px; border-radius: 8px;
      border: 1px solid var(--line); background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      color: var(--txt2); font-size: 11.5px; font-family: inherit; cursor: pointer;
    }
    .de-issue-locate:hover { border-color: var(--de-ink-accent); color: var(--de-ink-accent); }
    .de-issue-foot {
      display: flex; justify-content: flex-end; gap: 10px;
      padding: 9px 13px; border-top: 1px solid var(--de-bad-bd);
    }

    /* U-2：维度表头副标题走专用墨色令牌（--txt3 浅色仅 2.58:1，不可用作表头说明文字） */
    .dimension-data-tab .de-thead th .de-dim-sub { color: var(--de-dim-ink-3) !important; }

    /* 维度数据表格表头吸顶（滚动容器为 .de-dim-scroll；表头背景由上方 .de-thead 规则提供） */
    .dimension-data-tab .de-thead th { position: sticky; top: 0; z-index: 2; }

    /* ===== U-2：维度数据 TAB（管理维度）令牌化 =====
       替代 renderDimensionDataTab / dimTabRowHtml 原 169 处内联样式。
       墨色一律走 --de-dim-*（双主题赋值）；输入面/描边/正负色复用既有令牌，保持单一真源。 */
    .de-dim-typebar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 8px; }
    .de-dim-typebar-label { font-size: 13px; color: var(--de-dim-ink-2); font-weight: 600; }
    .de-dim-typebar-btns { margin-left: 4px; display: flex; gap: 6px; flex-wrap: wrap; }
    .de-dim-typebar-note { margin-left: auto; font-size: 11.5px; color: var(--de-dim-ink-3); }

    .de-dim-headbar { display: flex; align-items: center; gap: 10px; margin-bottom: 6px; flex-wrap: wrap; }
    .de-dim-title { font-size: 13px; color: var(--de-dim-ink); font-weight: 700; }
    .de-dim-hint { font-size: 11.5px; color: var(--de-dim-ink-3); }
    .de-dim-msg { font-size: 11.5px; min-height: 16px; color: var(--de-dim-ink-3); margin-bottom: 8px; line-height: 1.6; }

    .de-dim-daterow { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 10px; }
    .de-dim-datelabel { font-size: 12px; color: var(--de-dim-ink-3); white-space: nowrap; }
    /* ★ 2026-09-12（P0-2 防回退 · B4）：数据截至日期输入宽度由 CSS 承担（原渲染层内联 style="width:140px"） */
    #dimAsOf { width: 140px; }
    /* ★ 2026-09-12 诉求③：数据截止日期在检索栏时的样式（保持紧凑） */
    .de-grid-toolbar .de-dim-datelabel { margin-right: 4px; }
    .de-dim-datenote { font-size: 11px; color: var(--de-dim-ink-3); }

    /* 提示条（客户—区域关联 / 多级维度说明） */
    .de-dim-tip {
      font-size: 11.5px; color: var(--de-dim-ink-2); line-height: 1.7;
      background: var(--de-dim-tip-bg); border: 1px solid var(--de-dim-tip-bd);
      border-radius: 6px; padding: 7px 11px; margin-bottom: 10px;
    }

    /* 表格滚动容器 + 表格（原内联 max-height:360px / min-width:980px 归位） */
    /* ★ 2026-09-12 诉求⑤：去除竖向滚动条，列表显示所有内容 */
    .de-dim-scroll {
      overflow-x: auto; overflow-y: visible;  /* 只保留横向滚动 */
      border: 1px solid var(--line); border-radius: 8px; margin-bottom: 10px;
      /* 移除 max-height 限制 */
    }
    /* ★ 2026-09-12 诉求④：区域子TAB去除容器边框 */
    .dimension-data-tab[data-dim="region"] .de-dim-scroll {
      border: none;
      border-radius: 0;
    }
    .de-dim-table {
      width: 100%; border-collapse: collapse; font-size: 12.5px;
      color: var(--de-dim-ink-2);
      /* ★ 第三轮 P0-2：固定布局 + 比例列宽。原无 table-layout → 走 auto，表格收缩不到
         min-content（被 dim-name 280 / dim-parent 150 / thead nowrap 三处撑到 1586px）
         → 与视口无关地横向溢出（部门档 1920 仍溢出 21px）。
         固定布局下「比例列宽之和 ≤ 100%」时表格恒等于容器宽 → 溢出 0。
         min-width 为「可读性下限」：低于此值保留列宽 + 横滚，操作列 sticky 恒可见。
         ⚠ 1480px 不是拍脑袋值 —— 它是「各列表头所需宽 ÷ 该列百分比」的最大值：
             可排序列（收入 / 成本 / 毛利）标题含 `⇅` 箭头 → 需 100px → 100 / 7.0% ≈ 1429；
             「操作」列按钮组实测需 ≈175px → 175 / 12.5% = 1400；
             「累计占比」62px / 5.5% = 1128 …… 取上限 1429 并留 ≥3px 余量 → **1480px**。
             同时 1480 ≤ 1600 视口下滚动容器内宽（≈1485）→ 1600 档零溢出、零提示。
             取该值即**任何列的表头标题都不会溢出列宽**（含排序箭头）。
         ⚠ 因此改动三处必然联动：① 调整列百分比 ② 新增/加长表头标题（rightTh 的 label）
             ③ 给某列加排序（.de-grid-sort，会多出 `⇅` 的 13px）
             —— 二者任一变动都要重算本值，否则表头标题会被相邻列表头底色遮盖。
             表头标题「≤ 6 全角字符」的契约写在 js/data-entry.js 的 rightTh 上方；
             护栏见 tools/verify-de-agingdim-r3.js 的 C3 / C4。 */
      table-layout: fixed; min-width: 1480px;   /* 兜底 = 列数最多者（产品 / 部门 13 列） */
    }

    /* ★ 第三轮 P0-2：**按维度类型**收紧 min-width。
       为什么能收紧：固定布局下「各列百分比之和 ≤ 100%」时浏览器按比例摊余
       （实测摊余系数：产品 1.149 / 客户 1.316 / 区域 1.438 / 部门 1.000），
       列数少的维度每列实际得到更宽 ⇒ 其「不裁字」下限天然更低。
       若四类型共用 1480px，客户 / 区域在 1366–1440 档会被逼出无谓的横滚
       （与决策点 D2=③「≥1366 严格贴合容器」相悖）。
       取值 = ceil( max_i 该列所需宽 ÷ (该列 pct ÷ 该维计划 pct 之和) ) + ≥2px 余量，
       按**展开态**（pct 之和最大 = 需求最紧）算，故与「变动/固定成本是否收起」无关：
         区域（Σ=82.5%）：gp 100 ÷ (7/82.5) = 1179 → 取 1210
         客户（Σ=89.0%）：gp 100 ÷ (7/89)   = 1271 → 取 1310
         产品（Σ=89.0%） ：1429 × 89% / 100% ≈ 1271 → 取 1310（批次⑨去"上级/产品编码"列）
         部门（Σ=100%） ：1429 → 沿用兜底 1480
       护栏：tools/verify-de-agingdim-r3.js 的 C4（逐类型断言）。 */
    /* ★ 2026-09-12（第三轮 P0-2 C4 修正）：区域页 dimShowSec = !isRegionType && !isProd ⇒ 区域为 false，
       即**不渲染 sec 列**（colgroup / th / td / tfoot 四处同步收敛）。区域段已把 7 列全部重写
       （name 16.0 / rev 13.5 / cost 13.5 / var 11.0 / fix 11.0 / gp 13.5 / op 14.5），
       叠上全局 sel 3.0 / idx 3.5 ⇒ **实际生效 Σ = 99.5%**（非 100%，浏览器按 pct/Σ 摊余）。
       最紧列 = 操作列 op 14.5%：其内容为 3 个按钮（添加子级 / 复制 / 删除），
       **1152 档实测**该按钮组需 ≥ 153px（实得 151.5px 时溢出 1px）⇒
         下限 = 153 ÷ 14.5% × 99.5% ≈ 1050px ⇒ 取 1060px。
       ⚠️ 不采用「基础 pct × 71.5%」那套算法（护栏 C3/C4 现用的模型）——它把各列基础 pct
       与「剔列后的 Σ」混在一起，给出的 1021.4px 与实测不符（那是本次 1030px 取值的来源，
       实测即发现 1152 档 op 溢出）。逐类型实测真值见本段各处注释。 */
    .dimension-data-tab .de-dim-table[data-dim="region"] { min-width: 1060px; }
    .dimension-data-tab .de-dim-table[data-dim="customer"] { min-width: 1310px; }
    /* ★ 2026-09-12（第三轮 P0-2 C4 · 逐类型 min-width 与列百分比联动自洽）：
       产品页批次⑨已去「上级 / 产品编码」列 ⇒ Σ=89.0%，最紧列 gp 100 ÷ (7/89) ≈ 1271px
         ⇒ 取 1310px 即满足（**不得**误按 13 列 Σ=100% 提到 1429，会逼出无谓横滚）；
       部门页保留「部门类型」列（dimShowSec = !isRegionType && !isProd ⇒ 部门为真）⇒ Σ=100%，
         最紧列 rev / cost（pct 7.0%，含 .de-grid-sort 的 ⇅ 后需 100px）⇒ 下限 = 100 ÷ 7.0% = 1428.6px，
         ⇒ 取 1429px。原 1310px 会使 rev / cost 实得 91.7px < 100px（表头「收入（万元）」裁字）。 */
    .dimension-data-tab .de-dim-table[data-dim="product"] { min-width: 1310px; }
    .dimension-data-tab .de-dim-table[data-dim="department"] { min-width: 1429px; }

    /* 表头单元格 */
    .de-dim-head { padding: 8px 6px; text-align: left; white-space: nowrap; }
    .de-dim-head-name { padding: 8px 9px; text-align: left; white-space: nowrap; }
    .de-dim-head-op { width: 100px; padding: 8px 6px; text-align: left; white-space: nowrap; }
    /* ★ 第三轮 P0-2：主标题保留 nowrap（不拆词），副标题允许换行 ——
       原两者皆 nowrap，是 min-content 撑到 1586px 的三大元凶之一。 */
    .de-dim-sub { font-size: 10px; color: var(--de-dim-ink-3); font-weight: 400; white-space: normal; line-height: 1.35; }
    .de-dim-tag { color: var(--de-dim-gold); font-size: 10px; }

    /* ★ 2026-09-12 诉求④：维度数据表格斑马纹 —— 序号逢双的行（偶数行）使用浅色背景 */
    .de-dim-table tbody tr.dim-row:nth-child(even) {
      background: var(--de-zebra) !important;
    }
    .de-dim-table tbody tr.dim-row:hover {
      background: rgba(0, 212, 255, 0.05) !important;
    }

    /* 行内单元格 */
    .de-dim-cell { padding: 1px 4px; }
    .de-dim-cell-name { padding: 1px 6px; white-space: nowrap; }
    .de-dim-cell-op { padding: 1px 2px; white-space: nowrap; }
    /* ★ 2026-09-12 诉求③：操作列操作按钮居中对齐 */
    .de-dim-cell-op { text-align: center; }

    /* 缩进：由 data-lv 驱动（0~12 级，18px/级），彻底移除内联 width */
    .dim-indent { display: inline-block; }
    .dim-indent[data-lv="0"]  { width: 0; }
    .dim-indent[data-lv="1"]  { width: 18px; }
    .dim-indent[data-lv="2"]  { width: 36px; }
    .dim-indent[data-lv="3"]  { width: 54px; }
    .dim-indent[data-lv="4"]  { width: 72px; }
    .dim-indent[data-lv="5"]  { width: 90px; }
    .dim-indent[data-lv="6"]  { width: 108px; }
    .dim-indent[data-lv="7"]  { width: 126px; }
    .dim-indent[data-lv="8"]  { width: 144px; }
    .dim-indent[data-lv="9"]  { width: 162px; }
    .dim-indent[data-lv="10"] { width: 180px; }
    .dim-indent[data-lv="11"] { width: 198px; }
    .dim-indent[data-lv="12"] { width: 216px; }
    .de-dim-mark { font-size: 10.5px; }
    .de-dim-mark-branch { color: var(--de-dim-ink-3); margin-right: 2px; }
    .de-dim-mark-leaf { color: var(--de-dim-ink-3); margin-right: 4px; }

    /* 名称输入 / 上级·区域下拉（原 nameStyle / parStyle 内联） */
    /* ★ 2026-09-12 优化：增强维度数据TAB输入框的视觉辨识度，让用户一眼识别可录入区域 */
    .dimension-data-tab .dim-name {
      width: 100%; min-width: 0; height: var(--de-cell-h); padding: 0 9px; box-sizing: border-box;
      background: var(--input-bg); border: 1.5px solid rgba(0, 212, 255, 0.35);
      border-radius: 6px; color: var(--de-dim-ink); font-size: 12px;
      font-family: inherit; transition: all 0.2s ease;
    }
    .dimension-data-tab .dim-name:hover {
      border-color: rgba(0, 212, 255, 0.6);
    }
    .dimension-data-tab .dim-parent,
    .dimension-data-tab .dim-region {
      width: 100%; min-width: 0; height: var(--de-cell-h); padding: 0 8px; box-sizing: border-box;
      background: var(--input-bg); border: 1.5px solid rgba(0, 212, 255, 0.35);
      border-radius: 6px; color: var(--de-dim-ink-2); font-size: 12px;
      font-family: inherit; transition: all 0.2s ease;
    }
    .dimension-data-tab .dim-parent:hover,
    .dimension-data-tab .dim-region:hover {
      border-color: rgba(0, 212, 255, 0.6);
    }
    .dimension-data-tab .dim-name:focus,
    .dimension-data-tab .dim-parent:focus,
    .dimension-data-tab .dim-region:focus {
      outline: none; border-color: var(--input-focus-border);
      background: var(--input-bg); box-shadow: var(--input-focus-shadow);
    }

    /* ★ 批次③ P2-3：上级行「含 N 子」标记 —— 名称列后缀（原落在「毛利」数值列，
       既被读成金额、又破坏数值列右对齐扫描）。仅上级行显示，叶子行 [hidden]。 */
    .dimension-data-tab .de-dim-name-row > .de-dim-childcount {
      flex: 0 0 auto; margin-left: 6px; padding: 0 6px; border-radius: 9px;
      font-size: 10.5px; line-height: 16px; white-space: nowrap;
      color: var(--de-dim-gold);
      background: var(--de-dim-rg-badge-bg); border: 1px solid var(--de-dim-rg-badge-bd);
    }
    .dimension-data-tab .de-dim-name-row > .de-dim-childcount[hidden] { display: none; }

    /* ★ 批次③ P2-5：区域「上级」只读 —— 由「仅 1 项 option 的 disabled <select>」改为纯文本。
       层级值挂 data-parent（供 dimRowParentOf 读回），视觉上仍是与其它控件同高的只读块。 */
    .dimension-data-tab .de-dim-ro-parent {
      flex: 1 1 0; min-width: 0; height: var(--de-cell-h); display: flex; align-items: center;
      padding: 0 9px; box-sizing: border-box; border-radius: 6px;
      background: var(--de-dim-rg-ro-bg); border: 1px solid var(--de-dim-rg-item-bd);
      font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    }

    /* ★ 第三轮 P0-2：横向裁切提示（浮出 ⟺ 确有非冻结列被裁） */
    .de-dim-colhint {
      margin: -4px 0 8px; padding: 5px 10px; border-radius: 7px;
      font-size: 11.5px; line-height: 1.5;
      color: var(--de-dim-cov-warn-ink);
      background: var(--de-dim-cov-warn-bg);
      border: 1px solid var(--de-dim-cov-warn-bd);
    }
    .de-dim-colhint[hidden] { display: none; }

    /* 行内操作按钮（原 opBtns 三处内联） */
    /* ★ P1-3（批次③）：.de-dim-op 实测 26px，低于项目「操作类 ≥32px」约定。
       做法：min-height 提到 --de-touch（32px）+ 上下各 -3px 负 margin ——
       元素热区 32px，但布局占高仍 26px，行高不变（P1-1 的 ≤34px 行高不破）。 */
    .de-dim-op {
      display: inline-flex; align-items: center; justify-content: center;
      min-height: var(--de-touch); margin: -3px 0; box-sizing: border-box;
      padding: 4px 8px; border-radius: 6px; font-size: 11.5px;
      font-family: inherit; cursor: pointer; transition: filter 0.15s ease;
    }
    .de-dim-op:hover { filter: brightness(1.15); }
    .de-dim-op:focus-visible { outline: 2px solid var(--input-focus-border); outline-offset: 2px; }
    .de-dim-op-add { border: 1px solid var(--de-ok-bd); background: var(--de-ok-bg); color: var(--de-ok-ink); }
    .de-dim-op-del { border: 1px solid var(--de-bad-bd); background: var(--de-bad-bg); color: var(--de-bad-ink); margin-left: 5px; }
    .de-dim-op-del.is-only { margin-left: 0; }

    /* 毛利格（原 .dim-gp 内联色；结构行由 .is-sum 切换，替代 g.style.color 写入） */
    /* ★ 2026-09-12 诉求③：毛利列数据居右对齐 */
    .de-dim-gp { text-align: right; font-weight: 600; color: var(--de-ok-ink); padding: 0 8px; white-space: nowrap; }
    .de-dim-gp.is-sum { color: var(--de-dim-gold); font-size: 11px; }

    /* 底部按钮行 / 汇总 / 脚注 */
    .de-dim-foot { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
    .de-dim-sum { margin-left: auto; font-size: 11.5px; color: var(--de-dim-ink-3); }
    .de-dim-sum b { font-weight: 600; font-variant-numeric: tabular-nums; }
    .de-dim-sum .de-dim-sum-cnt { color: var(--de-dim-accent); }
    .de-dim-sum .de-dim-sum-amt { color: var(--de-dim-ink); }
    .de-dim-sum .de-dim-sum-gp { color: var(--de-ok-ink); }
    /* ★ 2026-09-12 诉求④：表格上方按钮区 */
    .de-dim-table-actions {
      display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
      margin-bottom: 8px; padding: 8px 0;
    }
    /* ★ 2026-09-12 诉求③：保存按钮primary风格 */
    /* ★ 2026-09-12 优化：主按钮样式同步缩小 */
    .de-grid-chip-primary {
      background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%) !important;
      color: #fff !important;
      border-color: transparent !important;
      font-weight: 600 !important;
      height: 26px;
      padding: 0 10px;
      font-size: 11px;
    }
    .de-grid-chip-primary:hover {
      background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%) !important;
      transform: translateY(-1px);
      box-shadow: 0 2px 6px rgba(59, 130, 246, 0.3);
    }
    .de-dim-note { font-size: 11px; color: var(--de-dim-ink-3); margin-top: 9px; line-height: 1.8; }

    /* ★ 2026-09-12 诉求①：对账弹窗样式 */
    .de-recon-alert-dialog {
      position: fixed;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      z-index: 10000;
      display: flex;
      align-items: center;
      justify-content: center;
    }
    .de-recon-alert-overlay {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background: rgba(0, 0, 0, 0.6);
      backdrop-filter: blur(4px);
    }
    .de-recon-alert-box {
      position: relative;
      width: 520px;
      max-width: 90vw;
      background: #ffffff;
      border-radius: 12px;
      box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
      overflow: hidden;
    }
    .de-recon-alert-header {
      display: flex;
      align-items: center;
      gap: 12px;
      padding: 20px 24px;
      background: linear-gradient(135deg, #fbbf24 0%, #f59e0b 100%);
      color: #fff;
    }
    .de-recon-alert-icon {
      font-size: 32px;
      animation: pulse 2s ease-in-out infinite;
    }
    @keyframes pulse {
      0%, 100% { transform: scale(1); }
      50% { transform: scale(1.1); }
    }
    .de-recon-alert-title {
      flex: 1;
      margin: 0;
      font-size: 18px;
      font-weight: 600;
    }
    .de-recon-alert-content {
      padding: 24px;
      font-size: 14px;
      line-height: 1.8;
      color: var(--txt);
    }
    .de-recon-alert-content p {
      margin: 0;
    }
    /* ★ 2026-09-13（走查项 C-3）：--panel-bg 全库无定义 ⇒ 声明在计算值阶段失效，
       本操作条此前**没有背景**（按钮直接浮在弹窗底上）。改映射到既有面板令牌 --card。 */
    .de-recon-alert-actions {
      display: flex;
      gap: 12px;
      padding: 16px 24px;
      background: var(--card);
      border-top: 1px solid var(--line);
    }
    .de-recon-alert-btn {
      flex: 1;
      padding: 10px 20px;
      border: none;
      border-radius: 6px;
      font-size: 14px;
      font-weight: 600;
      cursor: pointer;
      transition: all 0.2s;
    }
    /* ★ 2026-09-13（走查项 C-4）：原为整块浅色硬编码（#6b7280 压 #e5e7eb = 3.70:1，
       14px 正文未过 AA），且在深色主题的对账告警弹窗里与周围风格断裂。
       本按钮是弹窗里唯一的「退出」路径，可达性优先。改用语义令牌 + 灰色通道。 */
    .de-recon-alert-btn-cancel {
      background: rgba(var(--t-r), var(--t-g), var(--t-b), 0.18);
      color: var(--txt2);
      border: 1px solid var(--line);
    }
    .de-recon-alert-btn-cancel:hover {
      background: rgba(var(--t-r), var(--t-g), var(--t-b), 0.3);
      color: var(--txt);
    }
    /* ★ 2026-09-13（走查项 C-3）：--panel-bg / --hover-bg 均无定义 ⇒ 本按钮此前
       无背景、且 hover 也无反馈。改用 --card（面板底）与 --p-* 按钮基色通道。 */
    .de-recon-alert-btn-secondary {
      background: var(--card);
      color: var(--txt);
      border: 1px solid var(--line);
    }
    .de-recon-alert-btn-secondary:hover {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.95);
    }
    .de-recon-alert-btn-primary {
      background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);
      color: #fff;
    }
    .de-recon-alert-btn-primary:hover {
      background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%);
      transform: translateY(-1px);
    }

    /* ★ 2026-09-12 诉求②：帮助按钮样式（数据截至右侧的圆形"?"按钮） */
    .de-grid-toolbar > .de-dim-help-btn {
      width: 24px;
      height: 24px;
      padding: 0;
      border: 2px solid var(--de-ink-accent);
      border-radius: 50%;
      background: transparent;
      color: var(--de-ink-accent);
      font-size: 14px;
      font-weight: 700;
      cursor: pointer;
      transition: all 0.3s;
      animation: breathe 2s ease-in-out infinite;
    }
    .de-grid-toolbar > .de-dim-help-btn:hover {
      background: var(--de-ink-accent);
      color: #fff;
      transform: scale(1.1);
    }
    @keyframes breathe {
      0%, 100% { box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.4); }
      50% { box-shadow: 0 0 0 8px rgba(59, 130, 246, 0); }
    }

    /* ★ 2026-09-12 诉求②：右侧滑出数据说明窗口 */
    .de-dim-data-panel {
      position: fixed;
      top: 0;
      right: 0;
      width: 420px;
      height: 100%;
      /* ★ 2026-09-13（走查项 C-3）：原 var(--bg) 全库无定义 ⇒ 面板背景失效（透明）。
         （本面板所在链路已死 —— 见 C-8；此处仅拆除未定义变量的地雷。） */
      background: var(--body-bg);
      box-shadow: -4px 0 16px rgba(0, 0, 0, 0.2);
      transform: translateX(100%);
      transition: transform 0.3s ease;
      z-index: 9999;
    }
    .de-dim-data-panel.is-open {
      transform: translateX(0);
    }
    .de-dim-data-content {
      height: 100%;
      display: flex;
      flex-direction: column;
    }
    .de-dim-data-header {
      display: flex;
      align-items: center;
      justify-content: space-between;
      padding: 20px 24px;
      background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);
      color: #fff;
    }
    .de-dim-data-header h3 {
      margin: 0;
      font-size: 18px;
      font-weight: 600;
    }
    .de-dim-data-close {
      width: 32px;
      height: 32px;
      padding: 0;
      border: none;
      border-radius: 50%;
      background: rgba(255, 255, 255, 0.2);
      color: #fff;
      font-size: 24px;
      cursor: pointer;
      transition: background 0.2s;
    }
    .de-dim-data-close:hover {
      background: rgba(255, 255, 255, 0.3);
    }
    .de-dim-data-body {
      flex: 1;
      padding: 24px;
      overflow-y: auto;
    }
    .de-dim-data-section {
      margin-bottom: 24px;
    }
    .de-dim-data-section:last-child {
      margin-bottom: 0;
    }
    .de-dim-data-section h4 {
      margin: 0 0 12px;
      font-size: 15px;
      font-weight: 600;
      color: var(--de-ink-accent);
    }
    .de-dim-data-section p {
      margin: 0;
      font-size: 13px;
      line-height: 1.8;
      color: var(--txt2);
    }
    .de-dim-data-section ul {
      margin: 8px 0 0;
      padding-left: 20px;
    }
    .de-dim-data-section li {
      margin-bottom: 8px;
      font-size: 13px;
      line-height: 1.6;
      color: var(--txt2);
    }
    .de-dim-tip .de-dim-key,
    .de-dim-note .de-dim-key,
    .de-dim-footnote .de-dim-key { color: var(--de-dim-gold); }
    .de-dim-footnote {
      margin-top: 8px; font-size: 11.5px; color: var(--de-dim-ink-3); line-height: 1.9;
      padding: 6px 16px; border-top: 1px solid var(--line);
    }

    /* ===== 2026-09-11 录入网格增强（U-1/U-4/U-5/U-6/U-7/U-8/U-12）=====
       通用类 .de-grid-*（账龄台账 + 维度数据共用），墨色一律走 --de-grid-* / --de-ag-* 令牌。 */

    /* —— 工具条：搜索 / 命中计数 / 筛选 chip / 快捷键 —— */
    /* ★ 2026-09-12 优化：缩小维度数据TAB按钮尺寸，提升工具栏紧凑性 */
    .de-grid-toolbar { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: 8px; }
    .de-grid-search {
      width: 200px; height: var(--de-touch); padding: 0 10px; box-sizing: border-box; font-family: inherit;
      background: var(--de-grid-input-bg); border: 1px solid var(--de-grid-input-bd);
      border-radius: 6px; color: var(--de-grid-input-ink); font-size: 12.5px;
    }
    .de-grid-search::placeholder { color: var(--de-note-ink); }
    .de-grid-search:focus { outline: none; border-color: var(--input-focus-border); box-shadow: var(--input-focus-shadow); }
    .de-grid-count { font-size: 11px; color: var(--de-note-ink); font-variant-numeric: tabular-nums; }
    .de-grid-chips { display: flex; gap: 4px; }
    /* ★ P1-3（批次③）：触控目标口径 —— ① 可聚焦元素最小边 ≥24px（WCAG 2.5.8 AA）
       ② 操作类（.de-btn / .de-dim-op）≥32px。.de-grid-chip 由 26px 提到 30px。 */
    /* ★ 2026-09-12 优化：缩小维度数据TAB按钮尺寸，提升工具栏紧凑性 */
    .de-grid-chip {
      height: 26px; padding: 0 9px; border-radius: 13px; cursor: pointer; font-family: inherit; font-size: 11px;
      background: var(--de-grid-tools-bg); border: 1px solid var(--de-grid-input-bd); color: var(--de-note-ink);
      transition: all .15s ease;
    }
    .de-grid-chip:hover { border-color: var(--de-ink-accent); color: var(--de-ink-accent); }
    /* is-on 原用 font-weight:600「加粗」—— 粗体字宽 > 常规字宽，会让右侧 chip 位移（同 V-9 抖动）。
       改为「等宽占位 + 仅换色」：min-width 覆盖粗体宽，故两种状态下宽度逐一相等。 */
    .de-grid-chips .de-grid-chip { min-width: 44px; }
    .de-grid-chip.is-on { border-color: var(--de-ink-accent); color: var(--de-ink-accent); font-weight: 600; }
    .de-grid-right { margin-left: auto; display: flex; gap: 8px; align-items: center; }
    .de-grid-hint { font-size: 11px; color: var(--de-note-ink); }

    /* —— 搜索命中高亮 / 筛选隐藏 —— */
    .de-grid-table tr.is-hit > td { background: var(--de-grid-hit-bg); }
    .de-grid-table tr.is-hidden { display: none; }

    /* —— 选择列 / 行号列（同时是拖拽手柄） / 排序按钮 —— */
    .de-grid-sel { width: 34px; padding: 1px 4px; text-align: center; }
    .de-grid-sel input { width: 15px; height: 15px; min-width: 15px; cursor: pointer; accent-color: var(--de-ink-accent); }
    .de-grid-idx {
      width: 48px; padding: 1px 6px; text-align: right; white-space: nowrap; cursor: grab;
      color: var(--de-note-ink); font-size: 11.5px; font-variant-numeric: tabular-nums;
    }
    .de-grid-idx:active { cursor: grabbing; }
    /* ★ P1-3（批次③）：.de-grid-sort 原热区仅 17px（表头文字高）——加 padding 外扩、
       用等量负 margin 抵消布局影响 → 视觉与列宽完全不变，热区达 24px。 */
    .de-grid-sort {
      display: inline-flex; align-items: center; gap: 3px; padding: 2px 4px; margin: -2px -4px;
      box-sizing: border-box; min-height: 24px;
      border: none; background: none;
      color: inherit; font: inherit; font-weight: 600; cursor: pointer;
    }
    .de-grid-sort:focus-visible { outline: 2px solid var(--input-focus-border); outline-offset: 2px; border-radius: 3px; }
    .de-grid-sort::after { content: "\21C5"; font-size: 10px; opacity: .55; }
    .de-grid-sort[aria-sort="ascending"]::after { content: "\2191"; opacity: 1; }
    .de-grid-sort[aria-sort="descending"]::after { content: "\2193"; opacity: 1; }

    /* —— 冻结：表头 3 / 首列 2 / 表头首列 4（交叉区最高） / 合计行吸底 3 —— */
    .de-grid-table thead th { position: sticky; top: 0; z-index: 3; }
    .de-ag-table thead th { background: var(--de-grid-head-bg); }
    .de-grid-table thead th.de-grid-fix { left: 0; z-index: 4; }
    .de-grid-table tbody td.de-grid-fix { position: sticky; left: 0; z-index: 2; background: var(--de-grid-stick-bg); }
    /* ★ 2026-09-12 优化：tfoot合计行数值单元格居右显示，与输入框对齐 */
    .de-grid-table tfoot td { position: sticky; bottom: 0; z-index: 3; background: var(--de-grid-tfoot-bg); font-weight: 600; }
    .de-grid-table tfoot td.de-grid-fix { left: 0; z-index: 4; }
    .de-dim-table tfoot td.de-grid-num {
      text-align: right;
      padding-right: 8px;
    }

    /* —— 数值列右对齐 / 等宽数字 / 零值弱化 —— */
    .de-grid-table td.is-num, .de-grid-table th.is-num { text-align: right; }
    .de-grid-table .de-grid-num { font-variant-numeric: tabular-nums; }
    .de-grid-table td.is-zero { color: var(--de-note-ink); }

    /* —— 拖拽落位指示 —— */
    tr.de-grid-drag-over > td { box-shadow: inset 0 2px 0 var(--de-ink-accent); }

    /* —— U-11 折叠说明（默认收起；长句下沉 title） —— */
    .de-grid-details summary {
      display: inline-block; cursor: pointer; font-size: 11.5px; color: var(--de-note-ink);
      padding: 3px 8px; border-radius: 6px; background: var(--de-grid-tools-bg);
      border: 1px solid var(--de-grid-input-bd); list-style-position: inside;
    }
    .de-grid-details summary:hover { border-color: var(--de-ag-input-bd); color: var(--de-note-ink); }
    .de-grid-details[open] summary { margin-bottom: 4px; }
    .de-grid-details > div { font-size: 11px; color: var(--de-note-ink); line-height: 1.85; margin-top: 4px; }

    /* —— 账龄台账录入面板（.de-ag-*） —— */
    .de-ag-panel { display: none; margin-top: 12px; border-top: 1px solid var(--aa-card-bd); padding-top: 10px; }
    .de-ag-panel.on { display: block; }
    .de-ag-lead { font-size: 12.5px; color: var(--de-note-ink); margin-bottom: 8px; }
    .de-ag-scroll {
      /* ★ 2026-09-12 账龄台账优化：去除竖向滚动条，表格完全展开 */
      overflow-x: auto; overflow-y: visible;
      border: 1px solid var(--aa-line); border-radius: 8px; margin-bottom: 10px;
      /* 移除 max-height 限制 */
    }
    .de-ag-table { width: 100%; border-collapse: collapse; font-size: 12.5px; color: var(--aa-ink); min-width: 940px; }
    .de-ag-head { padding: 7px 6px; text-align: left; white-space: nowrap; }
    .de-ag-head-name { width: 300px; padding: 7px 8px; text-align: left; white-space: nowrap; }
    .de-ag-rate { display: block; margin-top: 2px; font-size: 10px; font-weight: 400; color: var(--de-ag-rate-ink); }
    .de-ag-cell { padding: 1px 4px; }
    .de-ag-cell-name { padding: 1px 6px; }
    .de-ag-cell-op { padding: 1px 4px; white-space: nowrap; }
    .de-ag-cust {
      width: 100%; height: var(--de-cell-h); padding: 0 8px; box-sizing: border-box; font-family: inherit;
      background: var(--de-ag-input-bg); border: 1px solid var(--de-ag-input-bd);
      border-radius: 6px; color: var(--de-ag-input-ink); font-size: 12px; text-align: left;
    }
    .de-ag-cust:focus { outline: none; border-color: var(--input-focus-border); box-shadow: var(--input-focus-shadow); }
    .de-ag-total {
      padding: 0 8px; white-space: nowrap; text-align: right; font-weight: 600;
      color: var(--de-ag-total-ink); font-variant-numeric: tabular-nums;
    }
    .de-ag-op {
      height: 26px; min-width: 26px; padding: 0 8px; border-radius: 6px; cursor: pointer; font-family: inherit; font-size: 12px;
      background: var(--de-ag-del-bg); border: 1px solid var(--de-ag-del-bd); color: var(--de-ag-del-ink);
    }
    .de-ag-op:hover { filter: brightness(1.15); }
    .de-ag-op:focus-visible { outline: 2px solid var(--input-focus-border); outline-offset: 2px; }
    .de-ag-op-copy { margin-right: 4px; background: var(--de-grid-tools-bg); border-color: var(--de-grid-input-bd); color: var(--de-note-ink); }
    .de-ag-neg { border-color: var(--de-ag-del-bd) !important; background: var(--de-ag-del-bg) !important; }
    .de-ag-foot { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
    .de-ag-msg { font-size: 12px; min-height: 16px; }
    .de-ag-note { margin-top: 6px; font-size: 11px; color: var(--de-note-ink); line-height: 1.8; }
    .de-ag-paste { display: none; margin-top: 10px; border: 1px solid var(--aa-line); border-radius: 8px; padding: 10px; }
    .de-ag-paste-head { font-size: 12px; color: var(--de-note-ink); margin-bottom: 6px; }
    .de-ag-paste-area {
      width: 100%; min-height: 120px; padding: 9px; box-sizing: border-box;
      font-family: Menlo, Consolas, monospace; font-size: 12px;
      background: var(--aa-input-bg); color: var(--aa-ink-strong);
      border: 1px solid var(--aa-neutral-bd); border-radius: 6px;
    }
    .de-ag-paste-foot { display: flex; gap: 8px; margin-top: 8px; align-items: center; }
    .de-ag-badge {
      padding: 3px 11px; border-radius: 12px; font-size: 11.5px;
      color: var(--de-ag-badge-ink); background: var(--de-grid-tools-bg); border: 1px solid var(--de-grid-input-bd);
    }

    /* 坏账计提政策编辑器（原 19 处内联样式收敛为 .de-ag-policy-* 类） */
    .de-ag-policy-title { margin-bottom: 4px; font-size: 13px; font-weight: 700; color: var(--aa-ink); }
    .de-ag-policy-desc { margin-bottom: 6px; font-size: 12.5px; color: var(--aa-mut); line-height: 1.9; }
    .de-ag-policy-state { color: var(--aa-primary-ink); }
    .de-ag-policy-row { display: flex; gap: 8px; flex-wrap: wrap; margin: 10px 0; }
    .de-ag-policy-small { align-self: center; font-size: 11px; color: var(--aa-mut); }
    .de-ag-policy-sub { margin-bottom: 8px; font-size: 12px; color: var(--aa-mut); }
    .de-ag-policy-warn { margin-bottom: 10px; font-size: 11.5px; color: var(--aa-num-wo); line-height: 1.8; }
    .de-ag-policy-params { display: flex; gap: 12px; flex-wrap: wrap; margin-bottom: 4px; }
    .de-ag-policy-param {
      display: flex; align-items: center; justify-content: space-between; gap: 8px; min-width: 220px;
      padding: 8px 10px; background: var(--aa-bg-soft); border: 1px solid var(--aa-line); border-radius: 8px;
    }
    .de-ag-policy-label { font-size: 12px; color: var(--aa-ink-2); }
    .de-ag-policy-field { display: flex; align-items: center; gap: 4px; }
    .de-ag-policy-input {
      width: 76px; height: var(--de-touch); padding: 0 8px; box-sizing: border-box; font-family: inherit;
      background: var(--aa-input-bg); border: 1px solid var(--aa-input-bd); border-radius: 6px;
      color: var(--aa-ink-strong); font-size: 12.5px; text-align: right;
    }
    .de-ag-policy-input:focus { outline: none; border-color: var(--input-focus-border); }
    .de-ag-policy-unit { font-size: 12px; color: var(--aa-mut); }
    .de-ag-policy-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(172px, 1fr)); gap: 8px 12px; margin-bottom: 12px; }
    .de-ag-policy-acts { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
    .de-ag-policy-foot { margin-top: 10px; font-size: 11px; color: var(--aa-mut); line-height: 1.9; }
    .de-ag-policy-impact {
      margin-top: 8px; padding: 7px 11px; border-radius: 8px; line-height: 1.8; font-size: 12px;
      color: var(--aa-num-wo); border: 1px solid var(--aa-bad-bd); background: var(--aa-bad-bg);
    }

    /* —— 状态消息墨色（.de-ag-msg-*）：原 showAgingMsg 内联 #ff8f8f / #7ee2a8 / #7f9bc4 —— */
    .de-ag-msg-ok { color: var(--de-ag-msg-ok); }
    .de-ag-msg-bad { color: var(--de-ag-msg-bad); }
    .de-ag-msg-info { color: var(--de-ag-msg-info); }

    /* —— 快捷键浮层（用 <details> 实现，零 JS） —— */
    .de-grid-kbd { position: relative; }
    .de-grid-kbd > summary { list-style: none; display: inline-flex; align-items: center; }
    .de-grid-kbd > summary::-webkit-details-marker { display: none; }
    .de-grid-kbd[open] > summary { border-color: var(--de-ink-accent); color: var(--de-ink-accent); }
    .de-grid-kbd > div {
      position: absolute; right: 0; top: 32px; z-index: 6; width: 340px; padding: 8px 11px;
      border-radius: 8px; line-height: 1.9;
      background: var(--de-grid-tools-bg); border: 1px solid var(--de-grid-input-bd);
      box-shadow: 0 6px 18px rgba(0, 0, 0, 0.25);
    }

    /* —— 批量删除内联二次确认条（替代原生 confirm） —— */
    .de-grid-confirm {
      display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
      margin-bottom: 8px; padding: 8px 12px; border-radius: 8px;
      border: 1px solid var(--de-bad-bd); background: var(--de-bad-bg);
    }
    .de-grid-confirm[hidden] { display: none; }

    /* —— 行号文本（U-4；与拖拽手柄同格） —— */
    .de-grid-no { font-variant-numeric: tabular-nums; }

    /* —— U-8 冻结列偏移（列宽由 colgroup 固定，偏移按宽度推导）——
       选择列 0 / 行号 34 / 名称 82；账龄表与维度表列定义一致。 */
    .de-ag-table col.de-ag-col-sel { width: 34px; }
    .de-ag-table col.de-ag-col-idx { width: 48px; }
    .de-ag-table col.de-ag-col-name { width: 300px; }
    .de-ag-table col.de-ag-col-total { width: 110px; }
    .de-ag-table col.de-ag-col-op { width: 88px; }
    .de-ag-table .de-grid-sel { left: 0; }
    .de-ag-table .de-grid-idx { left: 34px; }
    .de-ag-table .de-ag-cell-name { left: 82px; }

    /* ★ 第三轮 P0-2：列宽改「比例」——固定布局下按比例分配，表格恒等于容器宽（溢出 0）。
       口径 = dimColPlan（config 单一真源）全部 13 列，必须「无一漏定义」：
       漏一列会在固定布局下退回 auto，独吞全部余量（例：prev 漏定义 → 独得 17% ≈ 238px）。
       13 列合计 = 3.0+3.5+18.5+11.0+7+7+6.5+6.5+6.5+6.5+6+5.5+12.5 = 100.0%（产品/部门）
       少列时（区域 10 列 / 客户 11 列）合计 < 100%，浏览器按比例摊余 → 比例关系不变。 */
    .de-dim-table col.de-dim-col-sel { width: 3.0%; }
    .de-dim-table col.de-dim-col-idx { width: 3.5%; }
    .de-dim-table col.de-dim-col-name { width: 18.5%; }
    .de-dim-table col.de-dim-col-sec { width: 11.0%; }
    .de-dim-table col.de-dim-col-rev,
    .de-dim-table col.de-dim-col-cost { width: 7.0%; }
    .de-dim-table col.de-dim-col-var,
    .de-dim-table col.de-dim-col-fix { width: 6.5%; }
    /* ★ 可排序列（rev/cost/gp）的标题含 `⇅` 箭头（.de-grid-sort::after, gap 3 + 10px）
       → 内容需 6 全角(75) + 3 + 10 = 88px，含 padding 共 100px。
         故 rev/cost 7.0%、gp 7.0% 在 min-width 1480 下 = 103.6px ≥ 100px。 */
    .de-dim-table col.de-dim-col-gp { width: 7.0%; }
    .de-dim-table col.de-dim-col-prev { width: 6.5%; }
    .de-dim-table col.de-dim-col-share { width: 5.5%; }
    .de-dim-table col.de-dim-col-cum { width: 5.5%; }
    .de-dim-table col.de-dim-col-op { width: 12.5%; }

    /* ★ 2026-09-12（诉求②④）：区域页列结构变更 —— 去掉「上级」列（10 → 9 列）。
       若沿用全局比例，固定布局的「Σ<100% 按比例摊余」会把释放出的 11% 平摊到每一列
       （名称反而从 351px 变宽、行号/操作列虚胖）。故给区域页一套**专属列宽（Σ = 100.0%）**：
       名称列 18.5% → 16.0%（1920 宽屏实得 351 → 250px，-29%），释放的宽度按比例加给金额列
       （rev/cost 7% → 13.5%，gp 7% → 13.5%，var/fix 6.5% → 11%），操作列 12.5% → 14.5%。
       自洽校验（实测，2026-09-12 · 1920/1440/1366/1280/1152 五档）：
       生效 Σ = 16.0+13.5+13.5+11.0+11.0+13.5+14.5（本段）+ 3.0+3.5（全局 sel/idx）= **99.5%**；
       1920 档表宽 1567 → name 实得 252px、op 实得 228px（均单行不裁）；最紧列 = op，
       1152 档实得 151.5px 时溢出 1px ⇒ 需 ≥153px ⇒ min-width 取 1060px（见上「按类型收窄」段）。 */
    .dimension-data-tab .de-dim-table[data-dim="region"] col.de-dim-col-name { width: 16.0%; }
    .dimension-data-tab .de-dim-table[data-dim="region"] col.de-dim-col-rev,
    .dimension-data-tab .de-dim-table[data-dim="region"] col.de-dim-col-cost { width: 13.5%; }
    .dimension-data-tab .de-dim-table[data-dim="region"] col.de-dim-col-var,
    .dimension-data-tab .de-dim-table[data-dim="region"] col.de-dim-col-fix { width: 11.0%; }
    .dimension-data-tab .de-dim-table[data-dim="region"] col.de-dim-col-gp { width: 13.5%; }
    .dimension-data-tab .de-dim-table[data-dim="region"] col.de-dim-col-op { width: 14.5%; }

    /* ★ 2026-09-12 批次⑨：产品页列结构变更 —— 去掉「上级/产品编码」列（12 → 11 列）。
       与区域页同理，释放的 11% 按比例加给金额列，名称列从 18.5% → 16.0%，
       rev/cost 7% → 13.5%，gp 7% → 13.5%，var/fix 6.5% → 11%，操作列 12.5% → 14.5%。
       自洽校验（实测）：产品页实际渲染 12 列（sec 关、prev/share/cum 开），
       生效 pct = 本段 7 列 + 全局 sel 3.0 / idx 3.5 / prev 6.5 / share 5.5 / cum 5.5
       ⇒ **展开态 Σ = 117.0%**；默认收起「变动/固定成本」时 **Σ = 95.0%**。
       1280 档实测（表宽 = min-width 1310）：name 220.6px（= 16/95 × 1310）、op 200px，
       各列表头均单行不裁。 */
    .dimension-data-tab .de-dim-table[data-dim="product"] col.de-dim-col-name { width: 16.0%; }
    .dimension-data-tab .de-dim-table[data-dim="product"] col.de-dim-col-rev,
    .dimension-data-tab .de-dim-table[data-dim="product"] col.de-dim-col-cost { width: 13.5%; }
    .dimension-data-tab .de-dim-table[data-dim="product"] col.de-dim-col-var,
    .dimension-data-tab .de-dim-table[data-dim="product"] col.de-dim-col-fix { width: 11.0%; }
    .dimension-data-tab .de-dim-table[data-dim="product"] col.de-dim-col-gp { width: 13.5%; }
    .dimension-data-tab .de-dim-table[data-dim="product"] col.de-dim-col-op { width: 14.5%; }

    /* ★ 2026-09-12 批次⑩：部门维度列宽优化 — 去除上级下拉后，列数与产品维度相同，
       但部门类型列比产品编码列更窄，名称列可适当加大。
       列宽分配：sel 3%, idx 3.5%, name 15%, sec 7.5%, rev/cost 7%, var/fix 6%, gp 7%, prev 7%, share/cum 5.5%, op 12.5%。
       自洽校验（实测）：**展开态 Σ = 92.5%**；默认收起「变动/固定成本」时 **Σ = 80.5%**
       （1280 档实测表宽 = min-width 1429：name 266.3px = 15/80.5 × 1429、sec 133.1px、op 222px，
       与之逐列吻合；各列表头单行不裁）。min-width 取值见上方「按类型收窄」段。 */
    .dimension-data-tab .de-dim-table[data-dim="department"] col.de-dim-col-name { width: 15.0%; }
    .dimension-data-tab .de-dim-table[data-dim="department"] col.de-dim-col-sec { width: 7.5%; }
    .dimension-data-tab .de-dim-table[data-dim="department"] col.de-dim-col-rev,
    .dimension-data-tab .de-dim-table[data-dim="department"] col.de-dim-col-cost { width: 7.0%; }
    .dimension-data-tab .de-dim-table[data-dim="department"] col.de-dim-col-var,
    .dimension-data-tab .de-dim-table[data-dim="department"] col.de-dim-col-fix { width: 6.0%; }
    .dimension-data-tab .de-dim-table[data-dim="department"] col.de-dim-col-gp { width: 7.0%; }
    .dimension-data-tab .de-dim-table[data-dim="department"] col.de-dim-col-prev { width: 7.0%; }
    .dimension-data-tab .de-dim-table[data-dim="department"] col.de-dim-col-share { width: 5.5%; }
    .dimension-data-tab .de-dim-table[data-dim="department"] col.de-dim-col-cum { width: 5.5%; }
    .dimension-data-tab .de-dim-table[data-dim="department"] col.de-dim-col-op { width: 12.5%; }

    /* ★ 2026-09-12（实测回归修复）：区域页**收起态**（隐藏「变动/固定成本」）必须另给一套列宽。
       根因：本浏览器 fixed 布局在「全部 <col> 的 pct 之和 = 100%」时**严格按 pct × 表宽分配、不再摊余**，
       收起后可见 7 列只占 78% → 表格右侧留白 22%（实测 1920 档留白 353px、可见列和 1212 vs 表宽 1565）。
       修法：收起态把隐藏列置 0%，其余 7 列重分配为 Σ = 100%（两态都严格铺满）。
       实测口径：① 改造前（10 列 / Σ=82.5% / 收起）可见列和 = 1565 = 表宽（铺满）；
                 ② 改造后（9 列 / Σ=100% / 收起）可见列和 = 1212（留白 353px）；
                 ③ 本规则后收起态可见列和 = 表宽。 */
    .dimension-data-tab .de-dim-table[data-dim="region"].de-dim-cols-collapsed col.de-dim-col-var,
    .dimension-data-tab .de-dim-table[data-dim="region"].de-dim-cols-collapsed col.de-dim-col-fix { width: 0%; }
    .dimension-data-tab .de-dim-table[data-dim="region"].de-dim-cols-collapsed col.de-dim-col-name { width: 20.0%; }
    .dimension-data-tab .de-dim-table[data-dim="region"].de-dim-cols-collapsed col.de-dim-col-rev,
    .dimension-data-tab .de-dim-table[data-dim="region"].de-dim-cols-collapsed col.de-dim-col-cost,
    .dimension-data-tab .de-dim-table[data-dim="region"].de-dim-cols-collapsed col.de-dim-col-gp { width: 19.0%; }
    .dimension-data-tab .de-dim-table[data-dim="region"].de-dim-cols-collapsed col.de-dim-col-op { width: 16.5%; }

    /* ★ 第三轮 P0-2：冻结首列偏移改「实测驱动」。
       ① 列宽已改比例，写死的 34 / 82px（旧固定列宽的产物）必然错位；
       ② 一并修存量缺陷：「名称」列表头原无 left 规则（走 .de-grid-fix 的 left:0），
          与表体 82px 不一致 → 横滚时表头三列互相重叠（td 有、th 无 = 同源失效）。
       三档（thead / tbody / tfoot）统一用 :nth-child 定位第 1/2/3 列（= dimColPlan 前三项），
       偏移值由 dimUpdateStickyOffsets() 实测写入 --de-dim-l-idx / --de-dim-l-name。 */
    .dimension-data-tab .de-dim-table thead th:nth-child(1),
    .dimension-data-tab .de-dim-table tbody td:nth-child(1),
    .dimension-data-tab .de-dim-table tfoot td:nth-child(1) { left: 0; }
    .dimension-data-tab .de-dim-table thead th:nth-child(2),
    .dimension-data-tab .de-dim-table tbody td:nth-child(2),
    .dimension-data-tab .de-dim-table tfoot td:nth-child(2) { left: var(--de-dim-l-idx, 34px); }
    .dimension-data-tab .de-dim-table thead th:nth-child(3),
    .dimension-data-tab .de-dim-table tbody td:nth-child(3),
    .dimension-data-tab .de-dim-table tfoot td:nth-child(3) { left: var(--de-dim-l-name, 82px); }
    /* ★ 第三轮 P0-2：「操作」列冻结在右侧（与既有首列 left:0 对称）——
       原先横向裁切时「删除」直接不可达（1440 档实测）；冻结后任何档位都可达。 */
    .de-dim-table thead th.de-dim-head-op,
    .de-dim-table tbody td.de-dim-cell-op,
    .de-dim-table tfoot td.de-dim-cell-op {
      position: sticky; right: 0; background: var(--de-grid-stick-bg);
    }
    .de-dim-table thead th.de-dim-head-op { z-index: 4; }
    .de-dim-table tbody td.de-dim-cell-op { z-index: 2; }
    .de-dim-table tfoot td.de-dim-cell-op { z-index: 4; }

    /* —— U-14 列显隐：账龄六档区间列整体收起（display:none，不删节点、不影响保存）——
       列序：1 选择 / 2 行号 / 3 名称 / 4-9 六档 / 10 合计 / 11 操作 */
    .de-ag-table.de-ag-cols-collapsed thead th:nth-child(n+4):nth-child(-n+9),
    .de-ag-table.de-ag-cols-collapsed tbody td:nth-child(n+4):nth-child(-n+9),
    .de-ag-table.de-ag-cols-collapsed tfoot td:nth-child(n+4):nth-child(-n+9) { display: none; }

    /* —— 维度表补充：tfoot 毛利列右对齐（.de-dim-gp 本体是左对齐的表格正文样式） —— */
    .de-dim-table tfoot td.de-dim-gp { text-align: right; }

    /* ★ 2026-09-12 诉求①：区域子TAB父级行（华东、华南等）样式 - 浅蓝色背景 */
    /* 父级行背景 */
    .dimension-data-tab[data-dim="region"] tbody tr.dim-parent {
      background: linear-gradient(135deg, rgba(59, 130, 246, 0.08) 0%, rgba(59, 130, 246, 0.12) 100%);
    }
    /* 父级行所有单元格背景（包括冻结列） */
    .dimension-data-tab[data-dim="region"] tbody tr.dim-parent td {
      background: transparent !important;
    }
    /* 父级行悬停效果 */
    .dimension-data-tab[data-dim="region"] tbody tr.dim-parent:hover {
      background: linear-gradient(135deg, rgba(59, 130, 246, 0.12) 0%, rgba(59, 130, 246, 0.16) 100%);
    }
    .dimension-data-tab[data-dim="region"] tbody tr.dim-parent:hover td {
      background: transparent !important;
    }
    /* 父级行文字样式 */
    .dimension-data-tab[data-dim="region"] tbody tr.dim-parent .dim-name {
      font-weight: 600;
      color: var(--de-ink-accent);
    }

    /* 合计行（tfoot）背景 */
    .dimension-data-tab[data-dim="region"] tfoot tr {
      background: linear-gradient(135deg, rgba(59, 130, 246, 0.08) 0%, rgba(59, 130, 246, 0.12) 100%);
      border: none;
    }
    /* 合计行所有单元格背景透明 */
    .dimension-data-tab[data-dim="region"] tfoot td {
      background: transparent !important;
      border-top: none;
      border-bottom: none;
      padding: 1px 4px;
      height: auto;
      line-height: normal;
    }

    /* ★ 2026-09-12：客户/产品/部门子TAB页统一样式 - 与区域子TAB保持一致 */
    /* ★ 2026-09-12 批次⑥：客户/产品/部门三页全面对齐区域页样式 */
    /* 父级行背景 */
    .dimension-data-tab[data-dim="customer"] tbody tr.dim-parent,
    .dimension-data-tab[data-dim="product"] tbody tr.dim-parent,
    .dimension-data-tab[data-dim="department"] tbody tr.dim-parent {
      background: linear-gradient(135deg, rgba(59, 130, 246, 0.08) 0%, rgba(59, 130, 246, 0.12) 100%);
    }
    /* 父级行所有单元格背景透明 */
    .dimension-data-tab[data-dim="customer"] tbody tr.dim-parent td,
    .dimension-data-tab[data-dim="product"] tbody tr.dim-parent td,
    .dimension-data-tab[data-dim="department"] tbody tr.dim-parent td {
      background: transparent !important;
    }
    /* 父级行悬停效果 */
    .dimension-data-tab[data-dim="customer"] tbody tr.dim-parent:hover,
    .dimension-data-tab[data-dim="product"] tbody tr.dim-parent:hover,
    .dimension-data-tab[data-dim="department"] tbody tr.dim-parent:hover {
      background: linear-gradient(135deg, rgba(59, 130, 246, 0.12) 0%, rgba(59, 130, 246, 0.16) 100%);
    }
    .dimension-data-tab[data-dim="customer"] tbody tr.dim-parent:hover td,
    .dimension-data-tab[data-dim="product"] tbody tr.dim-parent:hover td,
    .dimension-data-tab[data-dim="department"] tbody tr.dim-parent:hover td {
      background: transparent !important;
    }
    /* 父级行文字样式 */
    .dimension-data-tab[data-dim="customer"] tbody tr.dim-parent .dim-name,
    .dimension-data-tab[data-dim="product"] tbody tr.dim-parent .dim-name,
    .dimension-data-tab[data-dim="department"] tbody tr.dim-parent .dim-name {
      font-weight: 600;
      color: var(--de-ink-accent);
    }
    /* 合计行背景（无边框 + 浅蓝渐变，与区域页一致）*/
    .dimension-data-tab[data-dim="customer"] tfoot tr,
    .dimension-data-tab[data-dim="product"] tfoot tr,
    .dimension-data-tab[data-dim="department"] tfoot tr {
      background: linear-gradient(135deg, rgba(59, 130, 246, 0.08) 0%, rgba(59, 130, 246, 0.12) 100%);
      border: none;
    }
    /* 合计行所有单元格背景透明 + 无边框 */
    .dimension-data-tab[data-dim="customer"] tfoot td,
    .dimension-data-tab[data-dim="product"] tfoot td,
    .dimension-data-tab[data-dim="department"] tfoot td {
      background: transparent !important;
      border-top: none;
      border-bottom: none;
      padding: 1px 4px;
    }
    /* ★ 2026-09-12 诉求⑤：合计行高度与普通行一致 */
    .dimension-data-tab[data-dim="customer"] tfoot td,
    .dimension-data-tab[data-dim="product"] tfoot td,
    .dimension-data-tab[data-dim="department"] tfoot td {
      height: auto;
      line-height: normal;
    }
    /* 确保表头没有底部边框分隔线 */
    .dimension-data-tab[data-dim="customer"] thead th,
    .dimension-data-tab[data-dim="product"] thead th,
    .dimension-data-tab[data-dim="department"] thead th {
      border-bottom: none;
    }
    /* 去除单元格之间的横向分隔线（与区域页一致）*/
    .dimension-data-tab[data-dim="customer"] tbody tr,
    .dimension-data-tab[data-dim="product"] tbody tr,
    .dimension-data-tab[data-dim="department"] tbody tr {
      border-bottom: 1px solid rgba(255, 255, 255, 0.05);
    }

    /* 确保表头没有底部边框分隔线 */
    .dimension-data-tab[data-dim="region"] thead th {
      border-bottom: none;
    }
    /* 去除单元格之间的横向分隔线（可选，根据实际需求） */
    .dimension-data-tab[data-dim="region"] tbody tr {
      border-bottom: 1px solid rgba(255, 255, 255, 0.05);
    }
    /* 维度表头冻结列 z-index 显式压到 4（既有 `.dimension-data-tab .de-thead th` 为 2） */
    .dimension-data-tab .de-thead th.de-grid-fix { z-index: 4; }

    /* —— U-14 维度列显隐：变动成本 / 固定成本两列默认收起 ——
       ★ 2026-09-12：改「**列槽位类**」定位（原为绝对列位 nth-child(7)/(8)）。
       区域页去掉「上级」列后列位整体前移 1 位，nth-child(7)/(8) 会落到「固定成本/毛利」
       → 误收起两列（实测 cellW 出现两个 0）。槽位类随列计划同源，抗列数变化。
       列序（非区域）：1 选择 / 2 行号 / 3 名称 / 4 区域·上级 / 5 收入 / 6 成本 / 7 变动 / 8 固定 / 9 毛利 / 10 操作
       列序（区域）  ：1 选择 / 2 行号 / 3 名称 / 4 收入 / 5 成本 / 6 变动 / 7 固定 / 8 毛利 / 9 操作 */
    .de-dim-table.de-dim-cols-collapsed thead th.de-dim-head-var,
    .de-dim-table.de-dim-cols-collapsed thead th.de-dim-head-fix,
    .de-dim-table.de-dim-cols-collapsed tbody td.de-dim-cell-var,
    .de-dim-table.de-dim-cols-collapsed tbody td.de-dim-cell-fix,
    .de-dim-table.de-dim-cols-collapsed tfoot td.de-dim-cell-var,
    .de-dim-table.de-dim-cols-collapsed tfoot td.de-dim-cell-fix,
    /* ★ 第三轮 P0-3：<colgroup> 必须同步收敛。只隐藏 th/td 会让固定布局按「位置」
       分配宽度 —— 第 7/8 个 <col>(178/155) 会落到「毛利」「操作」列上，
       实测 col.de-dim-col-op{108px} 从未生效（渲染 156/155）。 */
    .de-dim-table.de-dim-cols-collapsed col.de-dim-col-var,
    .de-dim-table.de-dim-cols-collapsed col.de-dim-col-fix { display: none; }

    /* —— U-13 大表渲染降级（> 200 行时由 agingGridRefresh 挂 .de-grid-heavy）——
       用 CSS 渲染跳过代替真窗口化：DOM 保持完整（本项目「DOM 即唯一真源」，
       saveAgingTable 与抽屉 DOM 快照都读 DOM），仅让浏览器不排版视口外的行。 */
    .de-grid-table.de-grid-heavy tbody tr {
      content-visibility: auto;
      contain-intrinsic-size: auto 34px;
    }
    @supports not (content-visibility: auto) {
      .de-grid-table.de-grid-heavy tbody tr { content-visibility: visible; }
    }

    /* ★ 第三轮 P0-2（D2 裁决③）：递减档 —— 宽屏（≥1600px，抽屉放宽到 1680）严格贴合容器、溢出 0；
       < 1600px 保留 min-width:1400px 的可读下限 → 横滚 + 操作列 sticky + 「还有 N 列」提示兜底。 */
    @media (min-width: 1600px) {
      #drawer.menu-width:has(#dataEntryContent) .de-ag-table { min-width: 1160px; }
      #drawer.menu-width:has(#dataEntryContent) .de-dim-table { min-width: 100%; }
    }

    /* 补充数据 TAB：表格加 de-table 类，复用既有 .de-* 体系（类别行浅蓝条带 + 序号 + 输入格圆角白/暗底） */
    .supplementary-data-wrapper .data-entry-table td.data-cell { min-width: 80px; }
    .supplementary-data-wrapper .data-entry-table tbody tr.category-row.de-cat-row,
    .supplementary-data-wrapper .data-entry-table tbody tr.category-row.de-cat-row td {
      background: var(--de-cat-bg) !important; color: var(--txt) !important; border-bottom: 1px solid var(--line);
    }
    .supplementary-data-wrapper .data-entry-table tbody tr.category-row.de-cat-row td.col-item {
      background: var(--de-cat-bg) !important;
    }
    .supplementary-data-wrapper .supplementary-name-cell .category-name-input {
      width: 100%; padding: 6px 8px; border: 1px solid var(--de-cell-border); border-radius: 6px;
      background: var(--de-cell-bg); color: var(--txt); font-size: 12px; box-sizing: border-box;
    }
    .supplementary-data-wrapper .supplementary-row .btn-remove-row {
      margin-left: 4px; background: transparent; border: none; color: var(--de-note-ink); cursor: pointer; font-size: 12px;
    }

    /* ==================== 首页现金流健康度（col-l 中部；与下方「周转健康分析」栏弹性等高） ==================== */
    .cf-home {
      flex: 1 1 0%;
      height: auto;
      min-height: 0;
    }

    /* ==================== 整体财务健康度详情抽屉 #ohDrawer（P1-1+，点击主卡滑出） ==================== */
    #ohDrawer {
      position: fixed;
      top: 0;
      right: 0;
      width: 960px;
      height: 100%;
      z-index: 215;
      transform: translateX(100%);
      transition: transform 0.28s cubic-bezier(0.2, 0.8, 0.2, 1);
      display: flex;
      flex-direction: column;
      background: linear-gradient(180deg, var(--dw-bg-1), var(--dw-bg-2));
      border-left: 1px solid var(--line);
    }

    #ohDrawer.on {
      transform: translateX(0);
      box-shadow: -20px 0 60px rgba(0, 0, 0, 0.5);
    }

    /* 综合分总览卡 */
    .ohd-card {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.45);
      border: 1px solid var(--line);
      border-radius: 12px;
      padding: 18px 20px;
    }

    .ohd-overview {
      display: flex;
      align-items: center;
      gap: 32px;
    }

    .ohd-score-l {
      flex: none;
      min-width: 330px;
      display: flex;
      flex-direction: column;
      gap: 12px;
    }

    .ohd-score-row {
      display: flex;
      align-items: center;
      gap: 12px;
    }

    .ohd-score {
      font-size: 58px;
      font-weight: 700;
      line-height: 1;
      font-variant-numeric: tabular-nums;
      letter-spacing: 0;
    }
    .ohd-score.excellent { color: var(--success-ink); text-shadow: 0 0 26px rgba(16, 185, 129, 0.35); }
    .ohd-score.warning { color: var(--warning-ink); text-shadow: 0 0 26px rgba(255, 169, 77, 0.3); }
    .ohd-score.danger { color: var(--danger-ink); text-shadow: 0 0 26px rgba(255, 107, 107, 0.3); }
    .ohd-score.na { color: var(--txt3); }
    html[data-theme="light"] .ohd-score.excellent { text-shadow: none; }
    html[data-theme="light"] .ohd-score.warning { text-shadow: none; }
    html[data-theme="light"] .ohd-score.danger { text-shadow: none; }

    .ohd-score-suffix {
      font-size: 14px;
      color: var(--txt3);
      letter-spacing: 0;
    }

    .ohd-score-meta {
      display: flex;
      align-items: center;
      gap: 8px;
      flex-wrap: wrap;
    }

    .ohd-bar-r {
      flex: 1;
      min-width: 0;
      display: flex;
      flex-direction: column;
      gap: 10px;
    }

    .ohd-bar-label {
      display: flex;
      align-items: baseline;
      justify-content: space-between;
      gap: 10px;
      font-size: 12px;
      color: var(--txt2);
      letter-spacing: 0;
    }

    .ohd-bar-label .oh-cov {
      color: var(--cyan);
      font-weight: 600;
    }

    .ohd-bar-r .oh-bar {
      height: 14px;
      border-radius: 7px;
      background: rgba(76, 130, 255, 0.14);
    }

    .ohd-meta {
      font-size: 12px;
      color: var(--txt3);
      letter-spacing: 0;
    }

    /* 8 大维度评分构成 - 雷达图布局（左右2列） */
    .ohd-dim-list {
      display: block;
    }

    .ohd-radar-wrapper {
      display: flex;
      gap: 24px;
      align-items: stretch;
    }

    .ohd-radar-chart {
      flex: 0 0 50%;
      display: flex;
      align-items: center;
      justify-content: center;
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.25);
      border: 1px solid var(--line);
      border-radius: 12px;
      padding: 16px;
      margin-left: 0;
    }

    .ohd-radar-chart > div {
      width: 100%;
      max-width: 325px;
      height: 304px;
    }

    .ohd-radar-legend {
      flex: 0 0 calc(50% - 24px);
      display: grid;
      grid-template-columns: 1fr 1fr;
      gap: 8px;
      align-content: center;
    }

    .ohd-legend-item {
      display: flex;
      flex-direction: row;
      align-items: center;
      justify-content: space-between;
      gap: 12px;
      padding: 12px 14px;
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.35);
      border: 1px solid var(--line);
      border-radius: 8px;
      cursor: pointer;
      transition: all 0.2s ease;
    }

    .ohd-legend-item:hover {
      border-color: rgba(0, 212, 255, 0.5);
      background: rgba(0, 212, 255, 0.08);
      transform: scale(1.02);
    }

    .ohd-legend-left {
      display: flex;
      flex-direction: column;
      gap: 4px;
      flex: 1;
      min-width: 0;
    }

    .ohd-legend-name {
      font-size: 12.5px;
      color: var(--txt);
      font-weight: 600;
    }

    .ohd-legend-weight {
      font-size: 10.5px;
      color: var(--txt2);
      font-variant-numeric: tabular-nums;
    }

    .ohd-legend-score {
      font-size: 40px;
      font-weight: 700;
      font-variant-numeric: tabular-nums;
      flex-shrink: 0;
    }

    .ohd-legend-score.excellent { color: var(--success-ink); }
    .ohd-legend-score.warning { color: var(--warning-ink); }
    .ohd-legend-score.danger { color: var(--danger-ink); }
    .ohd-legend-score.na { color: var(--txt3); font-weight: 500; }

    /* 响应式布局：小屏幕时垂直排列 */
    @media (max-width: 768px) {
      .ohd-radar-wrapper {
        flex-direction: column;
      }

      .ohd-radar-chart {
        flex: none;
        width: 100%;
        height: 280px;
      }
    }

    .ohd-dim-empty {
      padding: 16px 14px;
      text-align: center;
      font-size: 12.5px;
      color: var(--txt3);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.3);
      border: 1px dashed var(--line2);
      border-radius: 10px;
    }

    html[data-theme="light"] .ohd-dim-empty {
      color: #52607a;
    }

    /* 归因区（保留 .oh-attribution 基础样式，去掉顶部分隔线改由小节标题区隔） */
    #ohDrawer .oh-attribution {
      border: 1px solid var(--line);
      border-radius: 12px;
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.4);
      margin-top: 0;
      padding: 12px 16px;
      font-size: 12px;
    }

    /* ============================================================================
       统一 Tooltip 样式（与 ECharts FD_TOOLTIP_BASE 风格一致）
       深蓝背景 + 青色描边 + 10px 圆角 + 阴影
       ============================================================================ */

    /* 自定义 tooltip 容器 */
    .fd-tooltip {
      position: fixed;
      z-index: 99999;
      padding: 10px 14px;
      background: rgba(10, 24, 52, 0.96);
      border: 1px solid #00d4ff;
      border-radius: 10px;
      box-shadow: 0 6px 22px rgba(0, 0, 0, 0.45);
      color: #d6e4ff;
      font-size: 12px;
      line-height: 1.6;
      max-width: 320px;
      word-wrap: break-word;
      pointer-events: none;
      opacity: 0;
      transform: translateY(4px);
      transition: opacity 0.2s ease, transform 0.2s ease;
    }

    .fd-tooltip.show {
      opacity: 1;
      transform: translateY(0);
    }

    .fd-tooltip-title {
      font-weight: 600;
      color: #fff;
      font-size: 13px;
      margin-bottom: 8px;
      padding-bottom: 6px;
      border-bottom: 1px solid rgba(0, 212, 255, 0.3);
    }

    .fd-tooltip-content {
      color: #d6e4ff;
    }

    .fd-tooltip-row {
      display: flex;
      justify-content: space-between;
      margin: 6px 0;
      gap: 12px;
    }

    .fd-tooltip-label {
      color: #7f9bc4;
    }

    .fd-tooltip-value {
      color: #fff;
      font-weight: 600;
    }

    .fd-tooltip-value.highlight {
      color: #ffa94d;
    }

    .fd-tooltip-tip {
      margin-top: 8px;
      padding-top: 8px;
      border-top: 1px solid rgba(0, 212, 255, 0.2);
      font-size: 11px;
      color: #7f9bc4;
    }

    /* 浅色主题适配 */
    html[data-theme="light"] .fd-tooltip {
      background: rgba(255, 255, 255, 0.98);
      border-color: #3b82f6;
      color: #1e293b;
      box-shadow: 0 6px 22px rgba(0, 0, 0, 0.25);
    }

    html[data-theme="light"] .fd-tooltip-title {
      color: #0f172a;
      border-bottom-color: rgba(59, 130, 246, 0.3);
    }

    html[data-theme="light"] .fd-tooltip-content {
      color: #1e293b;
    }

    html[data-theme="light"] .fd-tooltip-label {
      color: #64748b;
    }

    html[data-theme="light"] .fd-tooltip-value {
      color: #0f172a;
    }

    html[data-theme="light"] .fd-tooltip-value.highlight {
      color: #f59e0b;
    }

    html[data-theme="light"] .fd-tooltip-tip {
      border-top-color: rgba(59, 130, 246, 0.2);
      color: #64748b;
    }

    /* ==================== 经营诊断抽屉页 .dw-* 命名空间（2026-09-09 双主题令牌自适应） ====================
       依赖令牌（均已双赋值，勿在下方硬编码新 hex）：文字 --txt/--txt2/--txt3、面板基色 rgba(var(--p-r)...)、
       边框 --line、状态 --rise/--warning/--fall（浅色加深版已就绪）、信息色 --primary。
       状态四态映射：is-good/.dw-tone-good → var(--rise)；is-warn → var(--warning)；
       is-danger → var(--fall)；is-muted → var(--txt3)。 */
    .dw-wrap { padding: 6px 26px 30px; box-sizing: border-box; }
    .dw-meta { font-size: 12px; color: var(--txt2); margin-bottom: 12px; line-height: 1.8; }
    .dw-meta b { color: var(--txt); font-weight: 600; }

    /* 顶部状态汇总条 */
    .dw-summary { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 14px; }
    .dw-sum-item {
      display: inline-flex; align-items: center; gap: 6px; padding: 7px 14px;
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.5);
      border: 1px solid var(--line); border-radius: 10px;
      font-size: 12.5px; color: var(--txt2);
    }
    .dw-sum-item b { font-size: 16px; font-weight: 800; }
    .dw-sum-item.is-good b { color: var(--rise); }
    .dw-sum-item.is-warn b { color: var(--warning); }
    .dw-sum-item.is-danger b { color: var(--fall); }
    .dw-sum-item.is-muted b { color: var(--txt3); }

    /* 综合结论串讲区 */
    .dw-concl { display: flex; flex-direction: column; gap: 8px; margin-bottom: 14px; }
    .dw-concl-card {
      border-left: 4px solid var(--txt3);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.55);
      border-radius: 10px; padding: 11px 15px; line-height: 1.8;
    }
    .dw-concl-card .t { font-size: 14px; font-weight: 700; color: var(--txt); margin-bottom: 2px; }
    .dw-concl-card .d { font-size: 12.5px; color: var(--txt2); }
    .dw-concl-card .a { font-size: 12px; color: var(--txt3); margin-top: 4px; }
    .dw-concl-card.is-danger { border-left-color: var(--fall); }
    .dw-concl-card.is-danger .t { color: var(--fall); }
    .dw-concl-card.is-warn { border-left-color: var(--warning); }
    .dw-concl-card.is-warn .t { color: var(--warning); }
    .dw-concl-card.is-info { border-left-color: var(--primary); }
    .dw-concl-card.is-info .t { color: var(--primary); }

    /* 卡栅格 / 卡片 */
    .dw-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 12px; }
    .dw-grid.tags { grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); margin-top: 12px; }
    .dw-card {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.45);
      border: 1px solid var(--line); border-radius: 12px; padding: 16px 18px;
      display: flex; flex-direction: column; gap: 8px; min-height: 168px; box-sizing: border-box;
    }
    .dw-card-t { font-size: 14px; font-weight: 600; color: var(--txt); line-height: 1.5; }
    .dw-chip {
      display: inline-block; margin-left: 8px; font-size: 10px; font-weight: 400;
      color: var(--txt3); border: 1px solid rgba(var(--t-r), var(--t-g), var(--t-b), 0.35);
      padding: 0 6px; border-radius: 8px; white-space: nowrap; vertical-align: 1px;
    }
    .dw-desc { font-size: 12px; color: var(--txt2); line-height: 1.7; }
    .dw-hint { font-size: 11px; color: var(--txt3); line-height: 1.6; margin-top: auto; }

    /* 数值（含单位 .u）与状态色 */
    .dw-val { font-size: 24px; font-weight: 700; line-height: 1.3; }
    .dw-val .u { font-size: 12px; color: var(--txt3); font-weight: 400; margin-left: 4px; }
    .dw-val.is-good { color: var(--rise); }
    .dw-val.is-warn { color: var(--warning); }
    .dw-val.is-danger { color: var(--fall); }
    .dw-val.is-muted { color: var(--txt3); }
    .dw-empty-val { font-size: 15px; font-weight: 600; color: var(--txt3); }

    /* 标签 tone 药丸（label chip） */
    .dw-tone {
      display: inline-block; font-size: 13px; font-weight: 700; padding: 3px 12px;
      border-radius: 14px; background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
    }
    .dw-tone-good { color: var(--rise); border: 1px solid var(--rise); }
    .dw-tone-warn { color: var(--warning); border: 1px solid var(--warning); }
    .dw-tone-danger { color: var(--fall); border: 1px solid var(--fall); }
    .dw-tone-muted { color: var(--txt3); border: 1px solid var(--txt3); }

    /* CTA / 底部按钮 / 页脚口径 */
    .dw-cta { align-self: flex-start; margin-top: 2px; }
    .dw-btn-bar { display: flex; justify-content: flex-end; margin-top: 16px; }
    .dw-btn {
      height: 36px; border-radius: 9px; padding: 0 20px; font-weight: 600; font-size: 13.5px;
      cursor: pointer; border: 1px solid var(--primary);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6); color: var(--primary);
      display: inline-flex; align-items: center; gap: 6px; transition: all .15s ease;
    }
    .dw-btn:hover { background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.85); }
    .dw-foot {
      margin-top: 14px; font-size: 11px; color: var(--txt3); line-height: 1.9;
      padding: 12px 16px; border-top: 1px solid var(--line);
    }

    /* 空态（loading / noData / error） */
    .dw-empty { padding: 90px 0; text-align: center; color: var(--txt2); }
    .dw-empty-icon { font-size: 44px; margin-bottom: 14px; }
    .dw-empty-title { font-size: 16px; font-weight: 600; color: var(--txt); margin-bottom: 6px; }
    .dw-empty-desc { font-size: 13px; margin-bottom: 22px; line-height: 1.8; }
    .dw-empty-error { padding: 60px 0; text-align: center; color: var(--fall); }

    /* ==========================================================================
     * 杜邦分析 .dup-* 命名空间（D-P1-3 主题化，2026-09-10）
     * 页面内 buildDupontHtml 不再内联深色硬色值，统一引用 --dup-* 令牌
     *（深色 :root / 浅色 html[data-theme=light] 双赋值；令牌见顶部变量区）。
     * 本文件仅负责「骨架类 / 通用工具类」，元素局部差异仍由 JS 内联 var() 组合。
     * ========================================================================== */
    .dup-empty-icon { font-size: 44px; margin-bottom: 14px; }
    .dup-empty-title { font-size: 16px; font-weight: 600; color: var(--dup-ink); margin-bottom: 6px; }
    .dup-empty-desc { font-size: 13px; color: var(--dup-mut); margin-bottom: 20px; line-height: 1.8; }
    .dup-foot {
      margin-top: 14px; font-size: 12px; line-height: 1.9; color: var(--dup-mut);
      padding: 14px 18px; border-top: 1px solid var(--dup-line-2);
    }
    .dup-btn {
      background: var(--dup-btn-bg); color: var(--dup-badge-ink); border: none; border-radius: 7px;
      padding: 6px 13px; font-size: 12px; cursor: pointer; display: inline-block;
    }
    .dup-toolbar {
      display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
      margin-bottom: 12px; padding: 9px 14px; border-radius: 10px;
      background: var(--dup-bg); border: 1px solid var(--dup-line);
    }
    .dup-year-select {
      padding: 5px 9px; background: var(--dup-bg-note); border: 1px solid var(--dup-line-mid);
      border-radius: 7px; color: var(--dup-ink); font-size: 12.5px;
    }
    .dup-trend-chart { width: 100%; height: 430px; }
    .dup-sec-title { font-size: 12px; color: var(--dup-mut); margin: 0 4px 8px; }
    .dup-badge {
      font-size: 10.5px; font-weight: 600; color: var(--dup-badge-ink); padding: 1px 8px; border-radius: 8px;
      white-space: nowrap;
    }
    .dup-up { color: var(--dup-rise); }
    .dup-dn { color: var(--dup-fall); }
    .dup-mut { color: var(--dup-mut); }

    /* --------------------------------------------------------------------------
     * 杜邦分析可读性改造（2026-09-10 · T01/T02/T03/T04）
     * 新增：首屏结论条 .dup-concl-* / 白话卡 .dup-fcard-* / 位置条 .dup-benchbar-*
     *       杜邦树 .dup-tree-* / 勾稽条 .dup-recon-* / 标签页 .dup-tab-*
     * 颜色全部走 --dup-* 令牌（深/浅两套已同补）；不写死主题色。
     * -------------------------------------------------------------------------- */

    /* ① 首屏结论条（与白话卡同卡语系） */
    .dup-concl {
      background: var(--dup-green-bg); border: 1px solid var(--dup-green-line);
      border-radius: 12px; padding: 16px 20px; margin-bottom: 14px;
    }
    .dup-concl-head { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; flex-wrap: wrap; }
    .dup-concl-title { font-size: 14px; font-weight: 700; color: var(--dup-ink); }
    .dup-concl-term { font-size: 12px; font-weight: 600; color: var(--dup-rise); }
    .dup-concl-big { font-size: 26px; font-weight: 700; color: var(--dup-ink); margin-top: 6px; }
    .dup-concl-big .dup-concl-unit { font-size: 13px; font-weight: 400; color: var(--dup-mut); margin-left: 2px; }
    .dup-concl-line { font-size: 13px; color: var(--dup-ink); margin-top: 4px; line-height: 1.7; }
    .dup-concl-line2 { font-size: 12px; color: var(--dup-rise); margin-top: 3px; line-height: 1.7; }
    .dup-concl .dup-badge { margin-left: 6px; }

    /* ② 三因子白话卡 */
    .dup-factors-row { display: flex; flex-wrap: wrap; gap: 12px; margin-bottom: 14px; }
    .dup-fcard {
      flex: 1; min-width: 280px; background: var(--dup-green-bg);
      border: 1px solid var(--dup-green-line); border-radius: 12px; padding: 14px 18px;
    }
    .dup-fcard-head { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; flex-wrap: wrap; }
    .dup-fcard-title { font-size: 14px; font-weight: 700; color: var(--dup-ink); }
    .dup-fcard-term { font-size: 12px; font-weight: 600; color: var(--dup-rise); }
    .dup-fcard-concl { font-size: 13px; color: var(--dup-ink); margin-top: 6px; line-height: 1.7; }
    .dup-fcard-concl2 { font-size: 12px; color: var(--dup-rise); margin-top: 3px; line-height: 1.7; }
    .dup-fcard-nums { margin-top: 10px; display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
    .dup-fcard-val { font-size: 26px; font-weight: 700; color: var(--dup-ink); }
    .dup-fcard-val .dup-fcard-unit { font-size: 13px; font-weight: 400; color: var(--dup-mut); margin-left: 2px; }
    .dup-fcard-prev { font-size: 13px; color: var(--dup-mut); }
    .dup-fcard-prev-dim { font-size: 10.5px; color: var(--dup-faint); }
    .dup-fcard-chg { font-size: 13px; font-weight: 600; margin-left: auto; }
    .dup-fcard-sep { height: 1px; background: var(--dup-line-soft); margin: 11px 0 8px; }
    .dup-fcard details > summary { cursor: pointer; font-size: 12px; color: var(--dup-ink-2); }
    .dup-fcard-scope { font-size: 11px; color: var(--dup-faint); line-height: 1.8; margin-top: 6px; }

    /* ③ 位置条（胶囊轨道 + 良好线刻度 + 三点轴标签） */
    .dup-benchbar { margin: 12px 0 2px; padding-top: 16px; }
    .dup-benchbar-track {
      position: relative; height: 14px; border-radius: 7px;
      background: var(--dup-bench-track); overflow: visible;
    }
    .dup-benchbar-fill { position: absolute; left: 0; top: 0; bottom: 0; border-radius: 7px; }
    .dup-benchbar-good { position: absolute; top: -2px; bottom: -2px; width: 1.5px; background: var(--dup-badge-mid); }
    .dup-benchbar-good .dup-benchbar-goodlabel {
      position: absolute; top: -15px; left: 50%; transform: translateX(-50%);
      font-size: 9.5px; color: var(--dup-mut); white-space: nowrap;
    }
    .dup-benchbar-mark {
      position: absolute; top: -15px; transform: translateX(-50%);
      font-size: 9.5px; color: var(--dup-mut); white-space: nowrap;
    }
    .dup-mark-now { color: var(--dup-ink); font-weight: 700; }
    .dup-benchbar-axis {
      display: flex; justify-content: space-between; gap: 8px;
      font-size: 11px; color: var(--dup-mut); margin-top: 6px;
    }
    .dup-benchbar-axis .dup-bench-mid { font-weight: 600; }
    .dup-benchbar-single { font-size: 12px; color: var(--dup-mut); margin-top: 8px; }

    /* ④ 杜邦树（P1-C：wrap/head/detail 内距与 margin 压缩，配合层距 120→92、节点 76→70 / 56→50） */
    .dup-tree-wrap {
      margin-bottom: 14px; border: 1px solid var(--dup-line); border-radius: 12px;
      padding: 10px 12px; background: var(--dup-bg); overflow-x: auto;
    }
    .dup-tree-head { display: flex; justify-content: space-between; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 5px; }
    .dup-tree-head-title { font-size: 12px; color: var(--dup-mut); }
    .dup-tree-head-tag {
      font-size: 10.5px; color: var(--dup-mut); background: var(--dup-bg-inset);
      border: 1px solid var(--dup-line-2); padding: 1px 8px; border-radius: 8px;
    }
    .dup-tree-svg { width: 100%; min-width: 980px; display: block; }
    .dup-tree-node { transition: opacity .12s ease; }
    .dup-tree-node.dup-tree-dim, .dup-tree-note.dup-tree-dim { opacity: .26; }
    .dup-tree-node.dup-tree-hl rect { stroke: var(--dup-roe) !important; stroke-width: 2 !important; }
    .dup-tree-node.dup-tree-risk.dup-tree-hl rect { stroke: var(--dup-fall-2) !important; }
    .dup-tree-detail { margin: 6px 0 0; }
    .dup-tree-detail > summary { cursor: pointer; font-size: 12px; color: var(--dup-ink-2); }
    .dup-tree-detail[open] > summary { margin-bottom: 8px; }
    .dup-tree-detailwrap { overflow-x: auto; }
    .dup-tree-nodata { font-size: 11.5px; color: var(--dup-faint); margin-top: 8px; line-height: 1.8; }
    .dup-tree-foot { font-size: 11px; color: var(--dup-faint); margin-top: 8px; line-height: 1.8; }
    /* 树底行（勾稽条 + 交互提示 + pp 白话，压成一行 —— P1-C / P2-F） */
    .dup-tree-footline { margin-top: 6px; display: flex; flex-wrap: wrap; align-items: baseline; gap: 3px 10px; }
    .dup-tree-footline .dup-recon { margin-top: 0; }
    .dup-tree-hint { font-size: 10.5px; color: var(--dup-faint); line-height: 1.6; }

    /* ⑤ 勾稽条 */
    .dup-recon { font-size: 11px; line-height: 1.6; margin-top: 8px; border-radius: 8px; padding: 5px 10px; }
    .dup-recon-ok { color: var(--dup-mut); background: var(--dup-bg-inset); }
    .dup-recon-warn { color: var(--dup-gold-ink); background: var(--dup-gold-bg); border: 1px solid var(--dup-gold-line); }

    /* ⑥ 标签页 */
    .dup-tab-bar { display: flex; gap: 8px; flex-wrap: wrap; margin: 14px 0 10px; }
    .dup-tab-btn {
      font-size: 12.5px; color: var(--dup-mut); background: var(--dup-bg-2);
      border: 1px solid var(--dup-line-2); border-radius: 8px; padding: 6px 14px; cursor: pointer;
    }
    .dup-tab-btn.on { color: var(--dup-badge-ink); background: var(--dup-btn-bg); border-color: var(--dup-btn-bg); font-weight: 600; }
    .dup-tab-panel { display: none; }
    .dup-tab-panel.on { display: block; }

    /* ⑦ 页脚（1 行 + 展开） */
    .dup-foot-line { font-size: 11.5px; color: var(--dup-faint); }
    .dup-foot details > summary { cursor: pointer; font-size: 12px; color: var(--dup-mut); margin-top: 8px; }
    .dup-foot details .dup-foot-body { margin-top: 8px; font-size: 12px; line-height: 1.9; color: var(--dup-mut); }

    /* ==========================================================================
     * 经营诊断「老板一眼看懂」可读性改造 .odi-* 命名空间（2026-09-10 增量设计 T06）
     * 只引用现成双主题令牌（--txt/--txt2/--txt3 / --line / --primary / --rise / --fall /
     * 面板基色 rgba(var(--p-r),var(--p-g),var(--p-b),α)），不新增主题色、不写死主题 hex；
     * 状态四态映射同 .dw-*：is-good→var(--rise) / is-danger→var(--fall) / is-muted→var(--txt3)；
     * warn 状态**文字**色改用本命名空间专用令牌 --odi-warn-ink（深色 = var(--warning)，
     *   浅色 = #b45309 深琥珀，满足 AA 对比度）；warn 的**色块/边框/图例**仍用 var(--warning)。
     *   该令牌仅作用于 .odi-*，不影响全站语义色 --warning。
     * 新样式独立命名空间，不覆盖旧 .dw-* / .dup-* / .aa-* / .dim-* 段。
     * ========================================================================== */
    .odi-wrap { padding: 6px 26px 30px; box-sizing: border-box; }

    /* ---- 首屏总评 ---- */
    .odi-top-wrap { margin-bottom: 14px; }
    .odi-top {
      display: flex; gap: 16px; align-items: stretch; flex-wrap: wrap;
      position: relative;
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.55);
      border: 1px solid var(--line); border-radius: 12px; padding: 16px 20px;
    }
    .odi-lamp {
      flex: 0 0 118px; display: flex; flex-direction: column; align-items: center; justify-content: center;
      border-radius: 10px; border: 1px solid var(--line);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.7);
    }
    .odi-lamp .big { font-size: 20px; font-weight: 800; line-height: 1.3; color: var(--txt); text-align: center; }
    .odi-lamp .sm { font-size: 12px; color: var(--odi-ink3); margin-top: 3px; text-align: center; }
    .odi-lamp.is-good .big { color: var(--rise); }
    .odi-lamp.is-warn .big { color: var(--odi-warn-ink); }
    .odi-lamp.is-danger .big { color: var(--fall); }
    .odi-lamp.is-muted .big { color: var(--odi-ink3); }
    /* 首屏总评那一句话结论专用：flex 简写只服务 .odi-top 下的 .odi-say。
       该 flex 简写不得再写成裸 `.odi-say{flex:…}`：.odi-say 同时被 opdiagCardHtml() 用在
       每张 .odi-card 内部（.odi-card 为 flex 列容器），裸选择器会把 flex-basis:340px 级联进
       卡内子项，强制该行高度=340px，在卡内撑出 ~300px 纯空白死区。此处已收窄为 .odi-top > .odi-say。 */
    .odi-top > .odi-say { flex: 1 1 340px; font-size: 15px; font-weight: 700; color: var(--txt); line-height: 1.75; }
    /* P0-1：CTA / 「最要紧的一件事」文字走 --odi-link-ink（品牌主色在浅色面板仅 1.71:1，不可作正文） */
    .odi-say .odi-do { display: block; margin-top: 8px; font-size: 13px; font-weight: 600; color: var(--odi-link-ink); }
    .odi-say .odi-cta { margin-top: 8px; }
    .odi-abs { flex: 0 0 300px; display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }
    .odi-abs > div {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.5);
      border: 1px solid var(--line); border-radius: 9px; padding: 8px 10px;
    }
    .odi-abs span { display: block; font-size: 12px; color: var(--odi-ink3); }
    .odi-abs b { font-size: 16px; color: var(--txt); }
    .odi-abs b.g { color: var(--rise); }
    .odi-abs b.r { color: var(--fall); }
    /* P1-6：「看依据」由卡外游离改为 .odi-top 内右下角（贴底右对齐，整行占满后换行） */
    .odi-why-wrap { flex: 1 1 100%; display: flex; flex-direction: column; align-items: flex-end; gap: 6px; }
    .odi-why-btn {
      font-size: 12px; color: var(--txt2); cursor: pointer;
      background: transparent; border: 1px solid var(--line); border-radius: 8px; padding: 4px 12px;
      min-height: 28px; display: inline-flex; align-items: center;
    }
    .odi-why { display: none; width: 100%; font-size: 12px; color: var(--txt2); line-height: 1.8; }
    .odi-why.on { display: block; }
    .odi-why-line { margin-top: 4px; }
    .odi-why-line:first-child { margin-top: 0; }
    .odi-why-line .k { color: var(--txt); font-weight: 600; }
    .odi-why-line .tag { display: inline-block; margin-left: 4px; font-size: 12px; font-weight: 700; }

    /* ---- 四大问红绿灯（P1-6/信息架构：sticky 吸顶，滚动时保留方位感） ---- */
    .odi-chips {
      display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-top: 10px;
      position: sticky; top: 0; z-index: 3;
      padding: 4px 0;
      background: linear-gradient(180deg, rgba(var(--p-r), var(--p-g), var(--p-b), 0.94) 70%, rgba(var(--p-r), var(--p-g), var(--p-b), 0));
      backdrop-filter: blur(2px);
    }
    .odi-chip {
      min-height: 40px; width: 100%; text-align: left; font-family: inherit;
      border-radius: 10px; padding: 9px 12px; font-size: 12px; cursor: pointer;
      border: 1px solid var(--line); background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      border-left: 4px solid var(--txt3);
      transition: background .15s ease, border-color .15s ease;
    }
    .odi-chip .s { float: right; font-size: 12px; font-weight: 700; color: var(--odi-ink3); }
    .odi-chip .q { font-weight: 700; color: var(--txt); }
    .odi-chip.is-good { border-left-color: var(--rise); }
    .odi-chip.is-good .s { color: var(--rise); }
    .odi-chip.is-warn { border-left-color: var(--warning); }
    .odi-chip.is-warn .s { color: var(--odi-warn-ink); }
    .odi-chip.is-danger { border-left-color: var(--fall); }
    .odi-chip.is-danger .s { color: var(--fall); }
    .odi-chip.is-muted { border-left-color: var(--txt3); }
    .odi-chip.is-muted .s { color: var(--odi-ink3); }
    /* scroll-spy：当前所在组的红绿灯加 aria-current，视觉上给一道主色描边 */
    .odi-chip[aria-current="true"] { border-color: var(--odi-link-ink); border-left-color: var(--odi-link-ink); }

    /* ---- 四大问分组卡片 ----
       2026-09-11 P1-1/P1-2：栅格改「统一 4 轨基线」——data-cards 不再决定轨数，只决定**跨列数**：
         data-cards=4 → 每卡 span 1（4 卡一行，卡宽 1/4）
         data-cards=3 → 首卡 span 2（主指标更宽）+ 其余 span 1
         data-cards=2 → 每卡 span 2（卡宽 1/2）
         data-cards=1 → span 4（满宽横向结论横幅，见下）
       卡宽由改造前的 4 种（274/369/560/1131）收敛为 2 种（1/4 与 1/2）+ 满宽横幅特例；
       轨数恒定 4 → 组间切换不再改变列宽，版式节奏统一。 */
    .odi-group { margin-bottom: 12px; }
    .odi-group-t { font-size: 15px; font-weight: 700; color: var(--txt); margin: 0 0 10px; }
    .odi-cards {
      display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px;
      align-items: stretch;   /* P1-2：同组卡高对齐（原 align-items:start 导致组内极差 62.4px） */
    }
    .odi-cards[data-cards="4"] > .odi-card { grid-column: span 1; }
    .odi-cards[data-cards="3"] > .odi-card:first-child { grid-column: span 2; }
    .odi-cards[data-cards="3"] > .odi-card { grid-column: span 1; }
    .odi-cards[data-cards="2"] > .odi-card { grid-column: span 2; }
    .odi-cards[data-cards="1"] > .odi-card { grid-column: 1 / -1; }
    /* 单卡组改横向「结论横幅」：标题 / 一句话结论 / 数值同行，相当于+口径次行，避免整行只有一句短文案 */
    .odi-cards[data-cards="1"] .odi-card { flex-direction: row; flex-wrap: wrap; align-items: center; gap: 6px 16px; }
    .odi-cards[data-cards="1"] .odi-card-q { flex: 0 0 auto; }
    .odi-cards[data-cards="1"] .odi-say { flex: 1 1 320px; }
    .odi-cards[data-cards="1"] .odi-val { flex: 0 0 auto; margin-left: auto; }
    .odi-cards[data-cards="1"] .odi-equiv,
    .odi-cards[data-cards="1"] .odi-scope,
    .odi-cards[data-cards="1"] .odi-cta { flex: 0 0 100%; }
    /* 抽屉虽固定 1280px，窗口过窄时降级为 2 轨，避免卡宽被压到 250px 以下 */
    @media (max-width: 1100px) {
      .odi-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); }
      .odi-cards[data-cards="2"] > .odi-card { grid-column: span 1; }
    }
    .odi-card {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.45);
      border: 1px solid var(--line); border-left: 4px solid var(--txt3);
      border-radius: 12px; padding: 12px 16px; display: flex; flex-direction: column; gap: 6px;
      box-sizing: border-box; position: relative;
      transition: border-color .15s ease;
    }
    .odi-card.is-good { border-left-color: var(--rise); }
    .odi-card.is-warn { border-left-color: var(--warning); }
    .odi-card.is-danger { border-left-color: var(--fall); }
    .odi-card.is-muted { border-left-color: var(--txt3); }
    /* P1-2：口径 + CTA 作贴底固定区，配合 .odi-cards{align-items:stretch} 让同组卡底边对齐 */
    .odi-card > .odi-scope { margin-top: auto; }
    /* P1-2/P2-2：标题行 = 白话提问 + 状态徽标（不只在左框色里表达状态）；
       别名仅在「与提问不等义」时显示（runway 的别名「还能撑几个月」已被提问包含 → 自动隐藏） */
    .odi-card-q { display: flex; align-items: flex-start; gap: 6px; font-size: 15px; font-weight: 700; color: var(--txt); line-height: 1.5; }
    .odi-card-q .odi-q-text { flex: 1 1 auto; min-width: 0; }
    /* 别名灰字整体换行：第①组 4 列窄卡（约 274px）下若允许断开，会把别名从词中拆成「自 / 由现金流 FCF」；
       最长别名「经营杠杆（固定成本占比）」≈144px，远小于卡内容宽约 240px，不会横向溢出。 */
    .odi-card-q .odi-alias { margin-left: 6px; font-size: 12px; font-weight: 400; color: var(--odi-ink3); white-space: nowrap; }
    .odi-state-badge {
      flex: 0 0 auto; margin-top: 2px;
      font-size: 12px; font-weight: 700; line-height: 1.3;
      padding: 2px 8px; border-radius: 6px;
      color: var(--txt2); background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.9);
      border: 1px solid var(--line);
    }
    .odi-state-badge.is-good { color: var(--rise); border-color: var(--rise); }
    .odi-state-badge.is-warn { color: var(--odi-warn-ink); border-color: var(--odi-warn-ink); }
    .odi-state-badge.is-danger { color: var(--fall); border-color: var(--fall); }
    .odi-state-badge.is-muted { color: var(--odi-ink3); border-color: var(--line); }
    /* 第二道保险：卡内「一句话结论」显式解除 flex 弹性，防止任何上游 .odi-say flex 简写级联撑高 */
    .odi-card .odi-say { flex: 0 0 auto; font-size: 13px; font-weight: 400; color: var(--txt2); line-height: 1.65; }
    .odi-val { font-size: 22px; font-weight: 800; line-height: 1.2; color: var(--txt); }
    .odi-val small { font-size: 12px; font-weight: 400; color: var(--odi-ink3); margin-left: 3px; }
    .odi-val.is-good { color: var(--rise); }
    .odi-val.is-warn { color: var(--odi-warn-ink); }
    .odi-val.is-danger { color: var(--fall); }
    .odi-val.is-muted { color: var(--odi-ink3); }
    /* P1-5：文本型结论（「健康优质」「存货积压型」）不再套用 22px/800 数值样式，
       改 18px/700 + 状态色 8% 彩底标签，与非数值结论语义一致 */
    .odi-val.is-text {
      font-size: 18px; font-weight: 700; line-height: 1.4;
      display: inline-block; padding: 3px 10px; border-radius: 8px;
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.7);
    }
    .odi-val.is-text.is-good { background: rgba(16, 185, 129, 0.14); }
    .odi-val.is-text.is-warn { background: rgba(255, 169, 77, 0.18); }
    .odi-val.is-text.is-danger { background: rgba(255, 107, 107, 0.16); }
    .odi-equiv { font-size: 12px; color: var(--odi-ink3); line-height: 1.6; }
    /* P1-3：卡内改为「ⓘ 一行公式」入口（完整公式/阈值/口径说明只留「专业口径」Tab）；折叠行抬到 28px */
    .odi-scope > summary {
      cursor: pointer; font-size: 12px; color: var(--txt2);
      min-height: 28px; display: flex; align-items: center;
    }
    .odi-scope > .odi-scope-body { margin-top: 6px; font-size: 12px; color: var(--odi-ink3); line-height: 1.8; }
    .odi-cta {
      align-self: flex-start; font-size: 12px; color: var(--odi-link-ink); cursor: pointer;
      background: transparent; border: 1px solid var(--primary); border-radius: 8px; padding: 6px 14px;
      min-height: 32px; display: inline-flex; align-items: center;
    }

    /* ---- 三色刻度条 ---- */
    .odi-bar { margin: 2px 0 4px; }
    .odi-bar-empty { font-size: 12px; color: var(--odi-ink3); }
    .odi-bar-track {
      position: relative; height: 8px; border-radius: 5px;
      background: var(--odi-track); overflow: visible;
    }
    .odi-bar-seg { position: absolute; inset: 0; border-radius: 5px; }
    .odi-bar-line { position: absolute; top: -3px; width: 1px; height: 14px; background: rgba(var(--t-r), var(--t-g), var(--t-b), 0.6); }
    .odi-bar-mark { position: absolute; top: -4px; width: 4px; height: 16px; border-radius: 2px; background: var(--txt); transform: translateX(-2px); }
    .odi-bar-lab { display: flex; justify-content: space-between; font-size: 12px; color: var(--odi-ink3); margin-top: 4px; }

    /* ---- 现金流水图（阶梯瀑布，纯手绘 SVG） ---- */
    .odi-cash { grid-column: 1 / -1; }
    .odi-cash-svg { width: 100%; display: block; }

    /* ---- 盈亏平衡安全垫 ---- */
    .odi-safe { margin: 4px 0 2px; }
    .odi-safe-track {
      position: relative; height: 10px; border-radius: 6px;
      background: var(--odi-track);
    }
    .odi-safe-fill { position: absolute; left: 0; top: 0; bottom: 0; border-radius: 6px; background: var(--rise); opacity: 0.55; }
    .odi-safe.is-warn .odi-safe-fill { background: var(--warning); }
    .odi-safe.is-danger .odi-safe-fill { background: var(--fall); }
    .odi-safe-line { position: absolute; top: -3px; width: 2px; height: 16px; background: var(--txt2); }
    .odi-safe-lab { font-size: 12px; color: var(--txt2); margin-top: 6px; }
    .odi-safe-lab b { color: var(--txt); }
    .odi-safe-note { font-size: 12px; color: var(--odi-ink3); margin-top: 3px; }

    /* ---- 最要紧的 3 件事 ---- */
    .odi-actions {
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.5);
      border: 1px solid var(--line); border-radius: 12px; padding: 14px 16px; margin-top: 4px;
    }
    .odi-actions-t { font-size: 15px; font-weight: 700; color: var(--txt); margin-bottom: 10px; }
    .odi-act { display: flex; gap: 10px; align-items: flex-start; padding: 8px 0; border-top: 1px solid var(--line); }
    .odi-act:first-of-type { border-top: none; }
    .odi-act .n {
      flex: 0 0 22px; height: 22px; border-radius: 50%; text-align: center; line-height: 22px;
      font-size: 12px; font-weight: 700; color: var(--txt); background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.9);
      border: 1px solid var(--line);
    }
    .odi-act .b { flex: 1 1 auto; }
    .odi-act .t { font-size: 13px; font-weight: 600; color: var(--txt); }
    .odi-act .a { font-size: 12px; color: var(--txt2); line-height: 1.7; margin-top: 2px; }
    .odi-act.is-danger .t { color: var(--fall); }
    .odi-act.is-warn .t { color: var(--odi-warn-ink); }
    .odi-act.is-good .t { color: var(--rise); }
    .odi-jump {
      display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
      margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--line);
    }
    .odi-jump > span { font-size: 13px; color: var(--txt2); }
    .odi-btn {
      font-size: 12px; color: var(--txt2); cursor: pointer;
      background: transparent; border: 1px solid var(--line); border-radius: 8px; padding: 6px 14px;
      min-height: 32px; display: inline-flex; align-items: center;
    }

    /* ---- 标签页 ---- */
    .odi-tab-bar { display: flex; gap: 8px; flex-wrap: wrap; margin: 14px 0 10px; }
    .odi-tab-btn {
      font-size: 13px; color: var(--txt2); background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      border: 1px solid var(--line); border-radius: 8px; padding: 6px 14px; cursor: pointer;
      min-height: 34px; display: inline-flex; align-items: center;
    }
    /* P0-1：激活态文字走 --odi-link-ink（原 --primary 浅色下仅 1.71:1）；边框仍保留品牌主色 */
    .odi-tab-btn.on { color: var(--odi-link-ink); border-color: var(--primary); font-weight: 600; }
    .odi-tab-panel { display: none; }
    .odi-tab-panel.on { display: block; }

    /* ---- 专业口径 ---- */
    .odi-pro { font-size: 12px; color: var(--txt2); }
    .odi-protab { width: 100%; border-collapse: collapse; margin: 6px 0 12px; font-size: 12px; }
    .odi-protab th, .odi-protab td { border: 1px solid var(--line); padding: 6px 10px; text-align: left; vertical-align: top; color: var(--txt2); }
    .odi-protab th { color: var(--txt); background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.7); font-weight: 700; }
    .odi-profoot { font-size: 12px; color: var(--odi-ink3); line-height: 1.9; }

    /* ==========================================================================
     * .odi-* 交互态补齐（2026-09-11 P0-3）：改造前本段 :hover / :focus-visible / :active 规则数为 0，
     * 键盘用户无法感知焦点、鼠标用户得不到反馈。以下仅作用于 .odi-* 命名空间内。
     * ========================================================================== */
    .odi-cta:hover, .odi-btn:hover, .odi-tab-btn:hover, .odi-why-btn:hover {
      border-color: var(--primary);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.9);
    }
    .odi-chip:hover { background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.95); }
    .odi-card:hover { border-color: var(--line2); }
    .odi-cta:active, .odi-btn:active, .odi-tab-btn:active, .odi-why-btn:active, .odi-chip:active { transform: translateY(1px); }
    .odi-wrap :is(a, button, summary, [tabindex]):focus-visible {
      outline: 2px solid var(--primary); outline-offset: 2px; border-radius: 8px;
    }
    /* P2-6：尊重系统「减弱动态效果」偏好（原 scrollIntoView 恒为 smooth） */
    @media (prefers-reduced-motion: reduce) {
      .odi-wrap *, .odi-wrap *::before, .odi-wrap *::after { transition: none !important; animation: none !important; }
    }
    /* P2-5：本页导出 / 打印入口（复用 body 级打印类机制），仅打印抽屉正文，隐藏交互件 */
    .odi-toolbar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 0 0 6px; }
    .odi-toolbar > span.odi-toolbar-t { font-size: 12px; color: var(--odi-ink3); }
    /* 打印版面（body.odi-printing，由 opdiagPrintPage() 挂/摘）：只留 #drawer 正文，A4 浅色 */
    body.odi-printing { background: #fff !important; }
    body.odi-printing > *:not(#drawer) { display: none !important; }
    body.odi-printing #mask { display: none !important; }
    body.odi-printing #drawer {
      position: static !important; inset: auto !important; transform: none !important;
      width: auto !important; max-width: none !important; height: auto !important; max-height: none !important;
      margin: 0 !important; padding: 0 !important; border: none !important; border-radius: 0 !important;
      box-shadow: none !important; background: #fff !important; overflow: visible !important;
    }
    body.odi-printing #drawer #dwBody { overflow: visible !important; max-height: none !important; height: auto !important; padding: 0 !important; }
    body.odi-printing .odi-toolbar,
    body.odi-printing .odi-tab-bar,
    body.odi-printing .odi-jump,
    body.odi-printing .odi-why-btn { display: none !important; }
    body.odi-printing .odi-tab-panel { display: block !important; }
    body.odi-printing .odi-card,
    body.odi-printing .odi-actions,
    body.odi-printing .odi-top,
    body.odi-printing .odi-cash { break-inside: avoid; page-break-inside: avoid; }

    /* ==========================================================================
     * 账龄分析 .aa-* 命名空间（2026-09-09 账龄优化：历史趋势/迁移矩阵/准备金/到期预测）
     * 双主题令牌 --aa-*（深色 :root / 浅色 html[data-theme=light]）见顶部变量区；
     * 账龄分析页原有主结构仍以 JS 内联样式为主，本段仅覆盖新增区块骨架与语义格。
     * ========================================================================== */
    .aa-block {
      background: var(--aa-bg);
      border: 1px solid var(--aa-line);
      border-radius: 10px;
      padding: 12px 14px;
      margin: 14px 0 8px;
    }
    .aa-block-title {
      font-size: 13px; font-weight: 700; color: var(--aa-ink-2);
      margin-bottom: 8px;
    }
    .aa-trend-head { font-size: 11px; color: var(--aa-mut); margin-bottom: 10px; line-height: 1.8; }
    .aa-trend-cols {
      display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 10px;
    }
    .aa-trend-col {
      flex: 1; min-width: 96px; text-align: center; padding: 7px 6px;
      background: var(--aa-bg-2); border: 1px solid var(--aa-line-2);
      border-radius: 8px;
    }
    .aa-trend-asof { font-size: 11.5px; font-weight: 600; color: var(--aa-ink); }
    .aa-trend-rate { font-size: 11px; color: var(--aa-mut); margin-top: 3px; }
    .aa-trend-delta { font-size: 11px; margin-top: 2px; }
    .aa-trend-bar { width: 100%; margin-top: 4px; }
    .aa-mx-note { font-size: 11.5px; color: var(--aa-mut); line-height: 1.8; margin-bottom: 10px; }
    .aa-mx-table-wrap {
      max-height: 300px; overflow: auto;
      border: 1px solid var(--aa-line); border-radius: 8px;
    }
    .aa-mx-table {
      width: 100%; border-collapse: collapse; font-size: 12px; color: var(--aa-ink);
      min-width: 640px;
    }
    .aa-mx-table th {
      padding: 6px 8px; text-align: center; color: var(--aa-head);
      background: var(--aa-head-bg); white-space: nowrap;
      position: sticky; top: 0; z-index: 1;
    }
    .aa-mx-table td {
      padding: 5px 8px; text-align: center; white-space: nowrap;
      border-top: 1px solid var(--aa-line-soft);
    }
    .aa-mx-table .aa-mx-diag { background: var(--aa-diag); }
    .aa-mx-table .aa-mx-back { background: var(--aa-back); color: var(--aa-num-re); }
    .aa-mx-table .aa-mx-fwd { background: var(--aa-fwd); }
    .aa-mx-rowsum, .aa-mx-colsum, .aa-mx-total { background: var(--aa-rowsum); font-weight: 600; }
    .aa-reserve-cards {
      display: flex; gap: 10px; flex-wrap: wrap; margin: 4px 0 10px;
    }
    .aa-card {
      flex: 1; min-width: 150px; background: var(--aa-bg-2);
      border: 1px solid var(--aa-line); border-radius: 10px; padding: 10px 13px;
    }
    .aa-card-label { font-size: 11px; color: var(--aa-mut); }
    .aa-card-val { font-size: 17px; font-weight: 700; color: var(--aa-ink); margin-top: 3px; white-space: nowrap; }
    .aa-card-sub { font-size: 10px; color: var(--aa-mut); margin-top: 3px; line-height: 1.6; }
    .aa-card-acc { border-color: var(--aa-line); }
    .aa-card-wo .aa-card-val { color: var(--aa-num-wo); }
    .aa-card-re .aa-card-val { color: var(--aa-num-re); }
    .aa-card-end { border-color: var(--aa-line-2); }
    .aa-card-end .aa-card-val { color: var(--aa-head); }
    .aa-reserve-lead { font-size: 12px; font-weight: 600; color: var(--aa-mut); margin: 2px 0 6px; }
    .aa-forecast-note { font-size: 11.5px; color: var(--aa-mut); line-height: 1.8; margin-top: 2px; }
    .aa-badge {
      display: inline-block; font-size: 11px; padding: 1px 9px; border-radius: 10px;
      white-space: nowrap; border: 1px solid transparent;
    }
    .aa-badge-wo { color: var(--aa-num-wo); background: var(--aa-wo-bg); border-color: var(--aa-num-wo); }
    .aa-badge-re { color: var(--aa-num-re); background: var(--aa-re-bg); border-color: var(--aa-num-re); }
    .aa-cell-mut { color: var(--aa-mut); font-size: 11.5px; white-space: nowrap; }
    .aa-cell-num { text-align: right; font-weight: 600; white-space: nowrap; }
    .aa-num { text-align: right; }
    .aa-num-wo { color: var(--aa-num-wo); }
    .aa-num-re { color: var(--aa-num-re); }
    .aa-empty { text-align: center; color: var(--aa-mut); padding: 16px; }
    /* 账龄图表/明细工具类（P1-3） */
    .aa-chip {
      padding: 4px 11px; border-radius: 12px; font-size: 12px; cursor: pointer;
      border: 1px solid var(--aa-line); background: var(--aa-bg-2); color: var(--aa-mut);
      transition: all .15s ease; line-height: 1.4;
    }
    .aa-chip:hover { border-color: var(--aa-head); color: var(--aa-head); }
    .aa-chip-on {
      border-color: var(--aa-head); background: var(--aa-head-bg); color: var(--aa-head);
      font-weight: 600;
    }
    .aging-dim-missing-tip { color: var(--aa-faint); }

    /* ---- 账龄分析页 IA 组件（2026-09-11 UI/UX 优化 A2/A3/B2/B4/B5 + C1/C3/C4） ----
       命名空间 .aa-*；全部走顶部 --aa-* 双主题令牌，禁止再写内联硬编码色。 */
    /* 页面容器：padding 随视口收缩（原固定 6px 26px 30px） */
    .aa-page { padding: 6px clamp(12px, 2vw, 26px) 30px; box-sizing: border-box; }

    /* —— A2 顶部吸附区：风险条 + Tab 条合体，避免两层 sticky 打架 —— */
    .aa-headbar {
      position: sticky; top: 0; z-index: 3;
      background: var(--aa-panel-bg);
      border: 1px solid var(--aa-panel-bd);
      border-radius: 10px;
      padding: 8px 12px 0;
      margin-bottom: 10px;
      backdrop-filter: blur(8px);
    }
    .aa-riskbar {
      display: flex; align-items: center; gap: 8px 12px; flex-wrap: wrap;
      padding-bottom: 8px;
    }
    .aa-riskbar .aa-yearsel { display: flex; align-items: center; gap: 6px; }
    .aa-riskbar-spacer { flex: 1 1 auto; min-width: 8px; }
    .aa-metrics { display: inline-flex; align-items: baseline; gap: 4px; white-space: nowrap; }
    .aa-metrics > span { font-size: var(--aa-fs-2); color: var(--aa-mut); }
    .aa-metrics > b { font-size: var(--aa-fs-4); font-weight: 700; color: var(--aa-ink-strong); font-variant-numeric: tabular-nums; }
    .aa-metrics.is-ok > b { color: var(--aa-ok-ink); }
    .aa-metrics.is-warn > b { color: var(--aa-warn-ink); }
    .aa-metrics.is-bad > b { color: var(--aa-bad-ink); }

    /* 语义灯（对账状态 / 时效） */
    .aa-lamp {
      display: inline-flex; align-items: center; gap: 5px;
      font-size: var(--aa-fs-2); line-height: 1.6;
      padding: 2px 10px; border-radius: 11px;
      border: 1px solid var(--aa-neutral-bd); background: var(--aa-neutral-bg); color: var(--aa-mut);
      white-space: nowrap;
    }
    .aa-lamp.is-ok { border-color: var(--aa-ok-bd); background: var(--aa-ok-bg); color: var(--aa-ok-ink); }
    .aa-lamp.is-warn { border-color: var(--aa-warn-bd); background: var(--aa-warn-bg); color: var(--aa-warn-ink); }
    .aa-lamp.is-bad { border-color: var(--aa-bad-bd); background: var(--aa-bad-bg); color: var(--aa-bad-ink); }

    /* —— A2 Tab 条 —— */
    .aa-tabs {
      display: flex; gap: 6px; flex-wrap: wrap;
      padding: 8px 0 9px; margin: 0;
      border-top: 1px solid var(--aa-line-soft);
    }
    .aa-tab-btn {
      padding: 6px 14px; border-radius: 8px; cursor: pointer;
      font-size: var(--aa-fs-3); line-height: 1.5;
      border: 1px solid var(--aa-btn-bd); background: var(--aa-btn-bg); color: var(--aa-mut);
      transition: border-color .15s ease, color .15s ease, background .15s ease;
      min-height: 32px;
    }
    .aa-tab-btn:hover { border-color: var(--aa-primary-bd); color: var(--aa-primary-ink); }
    .aa-tab-btn.on {
      border-color: var(--aa-primary-bd); background: var(--aa-primary-bg);
      color: var(--aa-primary-ink); font-weight: 600;
    }
    .aa-tab-btn .aa-tab-n { font-size: var(--aa-fs-1); opacity: .8; margin-left: 4px; }
    .aa-tab-panel { display: none; }
    .aa-tab-panel.on { display: block; }

    /* —— 通用圆角块 / 指标卡（替代原内联 background:rgba(24,40,70,.55)） —— */
    .aa-box {
      background: var(--aa-card-bg); border: 1px solid var(--aa-card-bd);
      border-radius: 10px; padding: 12px 14px; margin-bottom: 12px;
    }
    .aa-box-tight { padding: 11px 14px; }
    .aa-metric-row { display: flex; gap: 12px; flex-wrap: wrap; margin-bottom: 6px; }
    .aa-metric {
      background: var(--aa-card-bg); border: 1px solid var(--aa-card-bd);
      border-radius: 10px; padding: 12px 16px; flex: 1 1 180px; min-width: 0; box-sizing: border-box;
    }
    .aa-metric-label { font-size: var(--aa-fs-2); color: var(--aa-mut); }
    .aa-metric-val {
      font-size: var(--aa-fs-6); font-weight: 700; margin-top: 4px; white-space: nowrap;
      color: var(--aa-ink-strong); font-variant-numeric: tabular-nums;
    }
    .aa-metric-val.is-ok { color: var(--aa-ok-ink); }
    .aa-metric-val.is-warn { color: var(--aa-warn-ink); }
    .aa-metric-val.is-bad { color: var(--aa-bad-ink); }
    .aa-metric-sub { font-size: var(--aa-fs-1); color: var(--aa-mut); margin-top: 3px; }
    .aa-section-title {
      font-size: var(--aa-fs-4); font-weight: 600; color: var(--aa-ink-2);
      margin: 4px 0 8px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
    }
    .aa-section-title small { font-size: var(--aa-fs-1); font-weight: 400; color: var(--aa-mut); }

    /* —— 顶部两行横幅（对账 + DSO 互证） —— */
    .aa-banner {
      display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
      border-radius: 10px; padding: 9px 14px; margin-bottom: 8px;
      font-size: var(--aa-fs-3); line-height: 1.7;
      background: var(--aa-neutral-bg); border: 1px solid var(--aa-neutral-bd); color: var(--aa-ink);
    }
    .aa-banner > b.aa-banner-label { color: var(--aa-ink-2); flex: 0 0 auto; }
    .aa-banner-body { flex: 1 1 280px; min-width: 0; }
    .aa-banner.is-ok { background: var(--aa-ok-bg); border-color: var(--aa-ok-bd); }
    .aa-banner.is-warn { background: var(--aa-warn-bg); border-color: var(--aa-warn-bd); }
    .aa-banner.is-bad { background: var(--aa-bad-bg); border-color: var(--aa-bad-bd); }
    .aa-inline-ok { color: var(--aa-ok-ink); }
    .aa-inline-warn { color: var(--aa-warn-ink); }
    .aa-inline-bad { color: var(--aa-bad-ink); }
    .aa-inline-strong { color: var(--aa-ink-strong); }
    .aa-inline-head { color: var(--aa-head); }
    .aa-inline-num-wo { color: var(--aa-num-wo); }
    .aa-inline-num-re { color: var(--aa-num-re); }

    /* —— 按钮（统一最小高度 32px，对齐触控目标下限） —— */
    .aa-btn {
      padding: 6px 12px; border-radius: 7px; cursor: pointer;
      border: 1px solid var(--aa-btn-bd); background: var(--aa-btn-bg); color: var(--aa-ink-2);
      font-size: var(--aa-fs-3); line-height: 1.5; min-height: 32px;
    }
    .aa-btn:hover { border-color: var(--aa-primary-bd); color: var(--aa-primary-ink); }
    .aa-btn-primary { border-color: var(--aa-primary-bd); background: var(--aa-primary-bg); color: var(--aa-primary-ink); }
    .aa-btn-icon { padding: 4px 10px; min-width: 32px; }
    .aa-select, .aa-input {
      padding: 5px 8px; border-radius: 6px; box-sizing: border-box;
      background: var(--aa-input-bg); border: 1px solid var(--aa-input-bd); color: var(--aa-ink-strong);
      font-size: var(--aa-fs-3); min-height: 32px;
    }
    .aa-select { font-size: var(--aa-fs-3); }

    /* —— 表格 —— */
    .aa-table-wrap {
      overflow: auto; max-width: 100%; max-height: 60vh;
      border: 1px solid var(--aa-line-2); border-radius: 8px;
      -webkit-overflow-scrolling: touch;
    }
    .aa-table-wrap.aa-no-scroll { max-height: none; }
    .aa-table { width: 100%; border-collapse: collapse; font-size: var(--aa-fs-3); color: var(--aa-ink); }
    .aa-table td, .aa-table th { font-variant-numeric: tabular-nums; }
    .aa-th {
      background: var(--aa-head-bg); color: var(--aa-head);
      text-align: center; padding: 0; white-space: nowrap;
      position: sticky; top: 0; z-index: 2;
    }
    .aa-th-sort {
      display: flex; align-items: center; justify-content: flex-end; gap: 3px;
      width: 100%; box-sizing: border-box; padding: 7px 6px;
      background: transparent; border: 0; color: inherit; font: inherit; font-weight: 600;
      cursor: pointer; min-height: 32px; text-align: inherit;
    }
    .aa-th-sort.is-left { justify-content: flex-start; }
    .aa-th-sort.is-center { justify-content: center; }
    .aa-th-sort:hover { color: var(--aa-primary-ink); }
    .aa-th-sort:focus-visible { outline: 2px solid var(--aa-primary-bd); outline-offset: -2px; border-radius: 4px; }
    .aa-th-rate { display: block; font-size: var(--aa-fs-1); font-weight: 400; color: var(--aa-faint); }
    .aa-sort-mark { color: var(--aa-primary-ink); font-size: var(--aa-fs-1); }
    .aa-td { padding: 6px 6px; }
    .aa-td-num { text-align: right; }
    .aa-td-mut { color: var(--aa-mut); }
    .aa-td-zero { color: var(--aa-faint); }
    .aa-tfoot td {
      position: sticky; bottom: 0; z-index: 2;
      background: var(--aa-rowsum); font-weight: 700; color: var(--aa-ink-strong);
      border-top: 1px solid var(--aa-line);
      padding: 6px 8px;
    }
    .aa-table tbody td:first-child,
    .aa-table tfoot td:first-child {
      position: sticky; left: 0; z-index: 1;
      background: var(--aa-table-stick-bg); border-right: 1px solid var(--aa-line-soft);
    }
    .aa-table tfoot td:first-child { z-index: 3; background: var(--aa-rowsum); }
    .aa-table thead th:first-child { z-index: 4; }
    .aa-tool {
      display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
      padding: 6px 10px; background: var(--aa-soft-bg);
      border-bottom: 1px solid var(--aa-line-soft); font-size: var(--aa-fs-1); color: var(--aa-mut);
    }
    .aa-tool input[type="search"], .aa-tool input[type="text"] {
      padding: 5px 9px; border-radius: 6px; flex: 1 1 180px; max-width: 260px; box-sizing: border-box;
      background: var(--aa-input-bg); border: 1px solid var(--aa-input-bd); color: var(--aa-ink-strong);
      font-size: var(--aa-fs-3); min-height: 32px;
    }
    .aa-check { width: 16px; height: 16px; min-height: 16px; cursor: pointer; accent-color: var(--aa-primary-bd); }
    /* 读屏专用文本（视觉隐藏但可被辅助技术读到） */
    .aa-visually-hidden {
      position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
      overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
    }
    /* 催收任务表折叠区：summary 内挂状态分布，不与标题抢宽 */
    .aa-collect > summary { flex-wrap: wrap; }
    .aa-collect .aa-tab-n { font-weight: 400; }
    /* 隐藏全零账龄档列（B4）：只隐藏列，不动数据 */
    .aa-table.aa-hide-zero .aa-col-zero { display: none; }

    /* —— 折叠区（C2/C6：脚注 / 催收表） —— */
    .aa-details { border-top: 1px solid var(--aa-line-soft); margin-top: 14px; padding-top: 6px; }
    .aa-details > summary {
      cursor: pointer; min-height: 32px; display: flex; align-items: center; gap: 6px;
      font-size: var(--aa-fs-3); font-weight: 600; color: var(--aa-ink-2);
      list-style: none;
    }
    .aa-details > summary::-webkit-details-marker { display: none; }
    .aa-details > summary::before { content: "▸"; color: var(--aa-mut); font-size: var(--aa-fs-1); }
    .aa-details[open] > summary::before { content: "▾"; }
    .aa-details > summary:focus-visible { outline: 2px solid var(--aa-primary-bd); outline-offset: 2px; border-radius: 6px; }
    .aa-details-body { font-size: var(--aa-fs-2); line-height: 1.95; color: var(--aa-mut); padding: 6px 4px 2px; }
    .aa-details-body b { color: var(--aa-sub); }
    .aa-details-body .aa-note-group { margin-bottom: 10px; }
    .aa-details-body .aa-note-group > h4 {
      font-size: var(--aa-fs-2); color: var(--aa-ink-2); margin: 0 0 4px; font-weight: 600;
    }

    /* —— 空状态引导（C5） —— */
    .aa-empty-state { text-align: center; padding: 26px 12px; color: var(--aa-mut); line-height: 1.9; }
    .aa-empty-steps { display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; margin: 14px 0 4px; }
    .aa-empty-step {
      flex: 1 1 180px; max-width: 240px; text-align: left; padding: 10px 12px;
      background: var(--aa-card-bg); border: 1px dashed var(--aa-card-bd); border-radius: 10px;
      font-size: var(--aa-fs-2); color: var(--aa-mut); line-height: 1.7;
    }
    .aa-empty-step b { display: block; color: var(--aa-ink-2); font-size: var(--aa-fs-3); margin-bottom: 2px; }
    .aa-empty-step i { font-style: normal; color: var(--aa-primary-ink); font-size: var(--aa-fs-1); }

    /* —— A3 响应式：窄屏（<1100px）降级 —— */
    @media (max-width: 1100px) {
      .aa-metric { flex: 1 1 calc(50% - 6px); }
      .aa-headbar { position: static; }
      .aa-riskbar { gap: 6px 10px; }
      .aa-table-wrap { max-height: 52vh; }
      .aa-trend-cols { gap: 6px; }
      .aa-trend-col { min-width: 84px; }
    }
    @media (max-width: 720px) {
      .aa-metric { flex: 1 1 100%; }
      .aa-trend-col { flex: 1 1 calc(50% - 6px); }
    }
    @media (prefers-reduced-motion: reduce) {
      .aa-tab-btn, .aa-btn, .aa-chip { transition: none; }
    }

    @media print {
      .aa-block, .aa-card, .aa-mx-table-wrap { page-break-inside: avoid; }
      .aa-mx-table th, .aa-mx-table td, #agingDetailTable th, #agingDetailTable td { border-color: #c7d4e8 !important; }
      /* C2：打印时展开 Tab / 折叠区、解除内滚与吸附 */
      .aa-headbar { position: static !important; border: none; padding: 0; background: transparent; }
      .aa-tabs { display: none !important; }
      .aa-tab-panel { display: block !important; }
      .aa-table-wrap { max-height: none !important; overflow: visible !important; border: none; }
      .aa-details > .aa-details-body { display: block !important; }
      .aa-table thead { display: table-header-group; }
      .aa-table tfoot { display: table-footer-group; }
      .aa-table thead th, .aa-table tfoot td,
      .aa-table tbody td:first-child, .aa-table tfoot td:first-child { position: static !important; }
      .aa-tool { display: none !important; }
    }

    /* ==========================================================================
     * 多维分析 .dim-* 命名空间（2026-09-10 增量 P0-5/P2-5：13 区块主题化 + 明细工具条/模拟条）
     * 双主题令牌 --dim-* 见顶部 :root / html[data-theme=light]；本节为组件 class。
     * 注意：不可与 data-entry 已占用 .dim-row/.dim-thead/.dim-name/.dim-num/.dim-rev/
     *   .dim-cost/.dim-var/.dim-fix/.dim-gp/.dim-parent/.dim-region/.dim-indent/
     *   .dimension-data-tab/.dimw-* 合并冲突（CSS 同名会误伤录入 TAB）。
     * ========================================================================== */
    .dim-block {
      background: var(--dim-bg);
      border: 1px solid var(--dim-line);
      border-radius: 10px;
      padding: 14px 16px;
      margin-bottom: 18px;
    }
    .dim-block-title {
      font-size: var(--dim-fs-3); font-weight: 700; color: var(--dim-ink);
      margin-bottom: 8px; line-height: 1.6;
    }
    .dim-block-sub { font-size: var(--dim-fs-1); color: var(--dim-mut); margin-left: 8px; font-weight: 400; }
    .dim-note { font-size: var(--dim-fs-1); color: var(--dim-mut); line-height: 1.8; }
    .dim-note-sm { font-size: var(--dim-fs-1); color: var(--dim-mut); line-height: 1.7; }
    .dim-row-flex { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 16px; }
    .dim-chip {
      padding: 6px 14px; border-radius: 8px; cursor: pointer; line-height: 1.4;
      border: 1px solid var(--dim-line-2);
      background: var(--dim-bg-2);
      color: var(--dim-ink-2);
      font-size: var(--dim-fs-3);
    }
    .dim-chip-sm {
      padding: 4px 12px; border-radius: 6px; cursor: pointer; line-height: 1.4;
      border: 1px solid var(--dim-line-2);
      background: var(--dim-bg-soft);
      color: var(--dim-faint);
      font-size: var(--dim-fs-2);
    }
    .dim-chip-on-blue {
      border-color: #3b7bff; background: var(--dim-blue-bg); color: var(--dim-blue); font-weight: 600;
    }
    .dim-chip-on-green {
      border-color: var(--dim-rise-2); background: var(--dim-green-bg); color: var(--dim-rise); font-weight: 600;
    }
    .dim-chip-on-amber {
      border-color: var(--dim-gold); background: rgba(245, 158, 11, .22); color: var(--dim-gold-3); font-weight: 600;
    }
    .dim-banner-amber {
      display: flex; align-items: center; gap: 8px; margin-bottom: 12px;
      background: var(--dim-amber-bg); border: 1px solid var(--dim-amber-line);
      border-radius: 8px; padding: 8px 13px; font-size: var(--dim-fs-2); color: var(--dim-gold); line-height: 1.7;
    }
    .dim-banner-red {
      display: flex; align-items: center; gap: 8px; margin-bottom: 12px;
      background: var(--dim-red-bg); border: 1px solid var(--dim-red-line);
      border-radius: 8px; padding: 8px 13px; font-size: var(--dim-fs-2); color: var(--dim-fall-ink); line-height: 1.7;
    }
    .dim-banner-ok {
      display: flex; align-items: center; gap: 8px; margin-bottom: 12px;
      background: var(--dim-bg-soft); border: 1px solid var(--dim-line-2);
      border-radius: 8px; padding: 8px 13px; font-size: var(--dim-fs-2); color: var(--dim-ink-3); line-height: 1.7;
    }
    .dim-banner-blue {
      display: flex; align-items: center; gap: 8px; margin-bottom: 12px;
      background: var(--dim-blue-bg); border: 1px solid var(--dim-blue-line);
      border-radius: 8px; padding: 8px 13px; font-size: var(--dim-fs-2); color: var(--dim-blue); line-height: 1.7;
    }
    .dim-stat {
      flex: 1; min-width: 150px;
      background: var(--dim-bg-2); border: 1px solid var(--dim-line);
      border-radius: 10px; padding: 12px 16px;
    }
    .dim-stat-sm { flex: 1; min-width: 150px; background: var(--dim-bg-2); border: 1px solid var(--dim-line); border-radius: 10px; padding: 10px 14px; }
    .dim-stat-amber { background: var(--dim-amber-bg); border-color: var(--dim-amber-line); }
    .dim-stat-green { background: var(--dim-green-bg); border-color: var(--dim-green-line); }
    .dim-stat-red { background: var(--dim-red-bg); border-color: var(--dim-red-line); }
    .dim-stat-blue { background: var(--dim-blue-bg); border-color: var(--dim-blue-line); }
    .dim-stat-title { font-size: var(--dim-fs-1); color: var(--dim-mut); line-height: 1.5; }
    .dim-stat-val { font-size: var(--dim-fs-4); font-weight: 700; margin-top: 3px; line-height: 1.3; white-space: nowrap; }
    .dim-stat-sub { font-size: var(--dim-fs-1); color: var(--dim-mut); margin-top: 3px; line-height: 1.6; }
    .dim-k-label { font-size: var(--dim-fs-1); color: var(--dim-mut); line-height: 1.5; }
    .dim-k-num { font-size: var(--dim-fs-4); font-weight: 700; line-height: 1.4; }
    .dim-k-sub { font-size: var(--dim-fs-1); color: var(--dim-mut); margin-top: 2px; line-height: 1.6; }
    .dim-badge {
      display: inline-block; border-radius: 3px; padding: 0 4px; font-size: var(--dim-fs-1);
      border: 1px solid transparent; line-height: 1.6; white-space: nowrap;
    }
    .dim-badge-red { color: var(--dim-fall-2); border-color: var(--dim-red-line); }
    .dim-badge-amber { color: var(--dim-gold-2); border-color: var(--dim-amber-line); }
    .dim-badge-green { color: var(--dim-rise); border-color: var(--dim-green-line); }
    .dim-badge-grey { color: var(--dim-faint); border-color: var(--dim-line-2); }
    .dim-badge-blue { color: var(--dim-blue); border-color: var(--dim-blue-line); }
    .dim-bar-row {
      display: grid; gap: 10px; align-items: center; padding: 5px 0; font-size: var(--dim-fs-2);
      /* ★ 列定义必须写在本类内（毛利率清单视图与主视图共用同一套）——
         2026-09-11 修复：此前主视图（毛利/收入/边际贡献）渲染该行时未带栅格，
         只剩 display:grid 的隐式单列 → 6 个子元素竖向堆叠，单条目行高 147px（应 32px），
         帕累托块独占整页 62.3%。栅格一律禁止写在行内 style（两处各写一遍必然漂移）。 */
      grid-template-columns: 40px minmax(120px, 1fr) 92px 68px 76px 84px; /* 排名·名称·规模·占比·累计·★ */
    }
    /* 数值列右对齐 + 等宽数字（纵向逐位对齐，扫读更快）；条内名称保持左对齐 */
    .dim-bar-row > .dim-detail-td-num,
    .dim-bar-row > .dim-faint { text-align: right; font-variant-numeric: tabular-nums; }
    .dim-bar-row > .dim-bar-track { text-align: left; font-variant-numeric: normal; }
    .dim-bar-track {
      position: relative; height: 22px;
      background: var(--dim-track); border-radius: 4px; overflow: hidden;
    }
    .dim-bar-fill { position: absolute; left: 0; top: 0; bottom: 0; }
    .dim-bar-label {
      position: relative; padding-left: 8px; line-height: 22px; color: var(--dim-ink);
      z-index: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: block;
    }
    .dim-scroll-x { overflow-x: auto; }
    .dim-scroll-y { max-height: 600px; overflow-y: auto; }
    .dim-table { width: 100%; border-collapse: collapse; font-size: var(--dim-fs-2); }
    .dim-table th { padding: 6px 8px; color: var(--dim-ink-2); font-weight: 600; text-align: left; white-space: nowrap; }
    .dim-table td { padding: 6px 8px; }
    .dim-table tbody tr { border-bottom: 1px solid var(--dim-line-3); }
    .dim-row-reach80 { background: var(--dim-green-bg); }
    .dim-neg-box { margin-top: 8px; border: 1px solid var(--dim-red-line); border-radius: 8px; overflow: hidden; }
    .dim-neg-head {
      display: flex; align-items: center; gap: 10px;
      background: rgba(239, 68, 68, .14); padding: 8px 13px; font-size: var(--dim-fs-2); font-weight: 700;
      color: #ffb4b4;
    }
    html[data-theme="light"] .dim-neg-head { color: #b3261e; }
    .dim-neg-row {
      display: flex; align-items: center; gap: 10px; padding: 6px 13px;
      border-top: 1px solid var(--dim-red-line);
      font-size: var(--dim-fs-2); background: var(--dim-red-bg);
    }
    .dim-btn-primary {
      padding: 9px 24px; border-radius: 8px; cursor: pointer;
      border: 1px solid #3b7bff; background: var(--dim-blue-bg); color: var(--dim-blue);
      font-size: var(--dim-fs-3); font-weight: 600; line-height: 1.4;
    }
    .dim-btn-ghost {
      padding: 6px 12px; border-radius: 6px; cursor: pointer;
      border: 1px solid var(--dim-line-2); background: var(--dim-bg-soft); color: var(--dim-ink-2);
      font-size: var(--dim-fs-2); line-height: 1.4;
    }
    .dim-toolbar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 8px; }
    .dim-tool-search {
      padding: 5px 10px; border-radius: 6px;
      border: 1px solid var(--dim-line-2); background: var(--dim-bg-soft);
      color: var(--dim-ink); font-size: var(--dim-fs-2); min-width: 170px;
    }
    .dim-filter-note { font-size: var(--dim-fs-1); color: var(--dim-faint); margin-left: auto; }
    .dim-sel-cell { text-align: center; }
    .dim-sel-check { width: 15px; height: 15px; accent-color: var(--dim-rise-2); cursor: pointer; vertical-align: middle; }
    .dim-sim-bar {
      display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
      padding: 10px 14px; margin-top: 12px;
      border: 1px solid var(--dim-line-2); border-radius: 8px; background: var(--dim-bg-soft);
      font-size: var(--dim-fs-2); color: var(--dim-mut); line-height: 1.6;
    }
    .dim-sim-pill { font-size: var(--dim-fs-3); font-weight: 600; color: var(--dim-ink); }
    .dim-sim-note { font-size: var(--dim-fs-1); color: var(--dim-mut); }
    .dim-bridge-card {
      margin-top: 4px; padding: 9px 12px; border-radius: 8px;
      background: var(--dim-bg-soft); border: 1px solid var(--dim-line); font-size: var(--dim-fs-1);
      color: var(--dim-mut); line-height: 1.9;
    }
    .dim-concl {
      margin-top: 10px; padding: 10px 13px; border-radius: 8px;
      background: var(--dim-bg-soft); border: 1px solid var(--dim-line);
      font-size: var(--dim-fs-2); color: var(--dim-mut); line-height: 1.95;
    }
    .dim-concl b { color: var(--dim-ink-2); font-weight: 600; }
    .dim-sep { border-top: 1px solid var(--dim-line); margin: 10px 0 12px; }
    .dim-muted { color: var(--dim-mut); }
    .dim-faint { color: var(--dim-faint); }
    .dim-faint2 { color: var(--dim-faint-2); }
    .dim-ink { color: var(--dim-ink); }
    .dim-ink2 { color: var(--dim-ink-2); }
    .dim-ink3 { color: var(--dim-ink-3); }
    .dim-gold { color: var(--dim-gold); }
    .dim-gold2 { color: var(--dim-gold-2); }
    .dim-rise { color: var(--dim-rise); }
    .dim-rise2 { color: var(--dim-rise-2); }
    .dim-fall { color: var(--dim-fall); }
    .dim-fall2 { color: var(--dim-fall-2); }
    .dim-fallink { color: var(--dim-fall-ink); }
    .dim-blue { color: var(--dim-blue); }
    .dim-blue-deep { color: var(--dim-blue-deep); }
    .dim-bd-amber { border: 1px solid var(--dim-amber-line); }
    .dim-legend-line { display: inline-block; width: 10px; height: 3px; border-radius: 2px; vertical-align: middle; margin-right: 5px; }
    .dim-chart-foot { font-size: var(--dim-fs-1); color: var(--dim-mut); margin-top: 4px; line-height: 1.8; }
    .dim-lvlbar {
      display: flex; align-items: center; gap: 6px; margin-bottom: 14px; flex-wrap: wrap;
      padding: 8px 12px; background: rgba(245, 158, 11, .06); border: 1px solid rgba(245, 158, 11, .22);
      border-radius: 8px;
    }
    .dim-lvlbar-title { font-size: var(--dim-fs-2); color: var(--dim-gold); font-weight: 600; margin-right: 4px; }
    .dim-unsplit-note { font-size: var(--dim-fs-1); color: var(--dim-gold); }
    .dim-detail-th-num { text-align: right !important; }
    .dim-detail-td-num { text-align: right; white-space: nowrap; }
    .dim-pager-mark { font-size: var(--dim-fs-1); color: var(--dim-faint); margin-left: 8px; }

    /* ── U-2 信息架构（2026-09-11）──────────────────────────────────────────
       sticky 结论条：全页唯一的人话结论 + 它的成立条件（数据时效/覆盖率/口径可比性）
       + 维度·指标·层级筛选 + 4 段锚点导航 —— 一次滚动，结论与免责永远同框。
       实测原实现：结论落在页面 87.5% 处，限定它的「覆盖率不足」埋在 2% 处一张 228px
       卡的 10.5px 副文里，三者相隔 8.5 屏；全页 sticky 元素 0 个、锚点 0 个。 */
    .dim-sticky {
      position: sticky; top: 0; z-index: 6;
      /* 左右 -26px 抵消 .data-entry-container 的左右 padding，让结论条通栏。
         顶部靠下方 :has() 规则把 #dwBody 的 padding-top 归零后即可与滚动口齐平。 */
      margin: 0 -26px 16px; padding: 9px 26px 7px;
      background: var(--dim-sticky-bg);
      -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
      border-bottom: 1px solid var(--dim-sticky-line);
      box-shadow: 0 8px 16px -14px rgba(8, 18, 36, .7);
    }
    .dim-conclbar {
      display: flex; align-items: flex-start; gap: 9px;
      padding-bottom: 8px; margin-bottom: 8px;
      border-bottom: 1px dashed var(--dim-line-2);
    }
    .dim-conclbar-ico { font-size: var(--dim-fs-3); line-height: 1.5; flex: 0 0 auto; }
    .dim-conclbar-txt {
      flex: 1 1 auto; min-width: 0; font-size: var(--dim-fs-3); font-weight: 600; line-height: 1.6;
      color: var(--dim-ink);
      display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
    }
    .dim-cbadges { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; justify-content: flex-end; flex: 0 1 auto; }
    .dim-cbadge {
      display: inline-flex; align-items: center; gap: 4px; white-space: nowrap;
      border-radius: 20px; padding: 2px 9px; font-size: var(--dim-fs-1); line-height: 1.65;
      border: 1px solid transparent; font-variant-numeric: tabular-nums;
    }
    .dim-cbadge-ok      { color: var(--dim-rise);  background: var(--dim-green-bg); border-color: var(--dim-green-line); }
    .dim-cbadge-amber   { color: var(--dim-gold-2); background: var(--dim-amber-bg); border-color: var(--dim-amber-line); }
    .dim-cbadge-red     { color: var(--dim-fall-2); background: var(--dim-red-bg);   border-color: var(--dim-red-line); }
    .dim-cbadge-grey    { color: var(--dim-mut);    background: var(--dim-bg-soft);  border-color: var(--dim-line-2); }
    .dim-opbar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
    .dim-nav { display: flex; align-items: center; gap: 6px; margin-left: auto; }
    .dim-navchip {
      padding: 4px 11px; border-radius: 6px; cursor: pointer; line-height: 1.5;
      border: 1px solid var(--dim-line-2); background: var(--dim-bg-soft); color: var(--dim-mut);
      font-size: var(--dim-fs-2); font-family: inherit; transition: color .15s, border-color .15s, background .15s;
    }
    .dim-navchip:hover { color: var(--dim-ink-2); border-color: var(--dim-blue-line); }
    .dim-navchip:focus-visible { outline: 2px solid var(--dim-blue); outline-offset: 2px; }
    .dim-navchip.on { color: var(--dim-blue); border-color: var(--dim-blue-line); background: var(--dim-blue-bg); font-weight: 600; }
    /* 锚点落点需让开 sticky 高度，否则标题被结论条压住 */
    .dim-sec { scroll-margin-top: 96px; }
    /* ★ sticky 与滚动口齐平的前提：#dwBody 的 padding-top(18px) 必须为 0。
       sticky 元素不可越出父级内容盒，父级被 padding 下推多少，条上方就露多宽的缝
       （实测 18px 缝里能看到滚动中的正文穿透）。用 :has() 按「页面上是否存在结论条」
       作用域化，随页面内容自动生效/失效，无需 JS 挂类、零泄漏风险。 */
    html:has(#dwBody .dim-sticky) #dwBody { padding-top: 0; }
    /* U-2：口径说明默认折叠（12 条方法论占满 1 屏，属查阅型内容而非决策内容） */
    .dim-details { margin-top: 18px; border-top: 1px solid var(--dim-line); }
    .dim-details-sum {
      cursor: pointer; padding: 11px 2px 9px; font-size: var(--dim-fs-2); font-weight: 600; color: var(--dim-ink-2);
      list-style: none;
    }
    .dim-details-sum::-webkit-details-marker { display: none; }
    .dim-details-sum::before { content: '▸ '; color: var(--dim-faint); }
    .dim-details[open] > .dim-details-sum::before { content: '▾ '; }
    .dim-details-sum:focus-visible { outline: 2px solid var(--dim-blue); outline-offset: 2px; }
    .dim-details-hint { font-size: var(--dim-fs-1); font-weight: 400; color: var(--dim-mut); margin-left: 8px; }
    .dim-details-body {
      font-size: var(--dim-fs-2); line-height: 2; color: var(--dim-mut);
      padding: 4px 18px 14px;
    }

    /* ── U-4 双视图切换（图形 / 表格）─────────────────────────────────────────
       同一份排名两种呈现。切视图只切 display、不重渲染 —— 勾选 / 排序 / 搜索态
       天然保持，滚动位置显式保留（实测原实现三视图各占一段，重复 76.5% 页高）。 */
    .dim-viewtabs { display: flex; align-items: center; gap: 6px; margin-bottom: 12px; flex-wrap: wrap; }
    .dim-vtab {
      padding: 6px 18px; border-radius: 8px; cursor: pointer; line-height: 1.5;
      border: 1px solid var(--dim-line-2); background: var(--dim-bg-soft); color: var(--dim-ink-2);
      font-size: var(--dim-fs-3); font-family: inherit;
    }
    .dim-vtab.on { border-color: var(--dim-blue-line); background: var(--dim-blue-bg); color: var(--dim-blue); font-weight: 600; }
    .dim-vtab:focus-visible { outline: 2px solid var(--dim-blue); outline-offset: 2px; }
    .dim-vtab-note { font-size: var(--dim-fs-1); color: var(--dim-mut); margin-left: 6px; }
    .dim-chart-limit {
      font-size: var(--dim-fs-1); color: var(--dim-gold-2); background: var(--dim-amber-bg);
      border: 1px solid var(--dim-amber-line); border-radius: 6px; padding: 5px 10px; margin: 8px 0 2px;
    }
    .dim-details-inline { margin-top: 8px; border-top: 1px dashed var(--dim-line-2); }
    #dim-view-chart[hidden], #dim-view-table[hidden] { display: none !important; }

    /* ── U-7 明细表可读性：表头吸附 + 首列冻结 + 等宽数字 ──────────────────
       原实现滚动 500px 后表头不可见、窄屏横滚丢失行身份、金额列数字逐位不齐。 */
    .dim-table { font-variant-numeric: tabular-nums; }
    .dim-table thead th {
      position: sticky; top: 0; z-index: 3;
      background: var(--dim-th-bg);
      /* border-collapse:collapse 下 sticky 单元格边框不随动，改用内阴影画分隔线 */
      box-shadow: inset 0 -1px 0 var(--dim-line-2);
    }
    .dim-table-freeze thead th:nth-child(1),
    .dim-table-freeze tbody td:nth-child(1) { position: sticky; left: 0;    z-index: 4; background: var(--dim-th-bg); }
    .dim-table-freeze thead th:nth-child(2),
    .dim-table-freeze tbody td:nth-child(2) { position: sticky; left: 36px; z-index: 4; background: var(--dim-th-bg); }
    .dim-table-freeze thead th:nth-child(1),
    .dim-table-freeze thead th:nth-child(2) { z-index: 5; }
    .dim-table-freeze tbody tr.dim-row-reach80 td:nth-child(1),
    .dim-table-freeze tbody tr.dim-row-reach80 td:nth-child(2) { background: var(--dim-green-bg); }

    /* ── U-9 层级栏禁用态（该维度无层级可选时仍展示，避免用户以为功能缺失）── */
    .dim-lvlbar-off { opacity: .6; }
    .dim-chip-sm[disabled] { cursor: not-allowed; opacity: .55; }
    /* U-8 数值卡等宽网格（auto-fit 自动均分，三档视口都不会出现孤立尾卡） */
    .dim-row-cards {
      display: grid; grid-template-columns: repeat(auto-fit, minmax(215px, 1fr));
      gap: 10px; margin-bottom: 10px;
    }
    .dim-row-cards > .dim-stat-sm { min-width: 0; }
    /* U-8 口径桥 → 全宽说明条（等式不再挤在卡片的「数值位」里） */
    .dim-bridge-bar {
      display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
      padding: 9px 14px; border-radius: 8px; margin-bottom: 16px;
      background: var(--dim-bg-soft); border: 1px solid var(--dim-line);
      font-size: var(--dim-fs-2); line-height: 1.7;
    }
    .dim-bridge-tag {
      flex: 0 0 auto; padding: 1px 9px; border-radius: 20px;
      border: 1px solid var(--dim-line-2); color: var(--dim-ink-2);
      font-size: var(--dim-fs-1); font-weight: 600;
    }
    .dim-bridge-eq { flex: 1 1 auto; min-width: 0; color: var(--dim-mut); }
    .dim-bridge-eq b { color: var(--dim-ink-2); font-weight: 700; }
    .dim-bridge-note { flex: 0 0 auto; color: var(--dim-mut); font-size: var(--dim-fs-1); }
    .dim-bridge-off { border-style: dashed; }
    /* U-9 导出回执 */
    .dim-export-hint { font-size: var(--dim-fs-1); color: var(--dim-rise); margin-left: 4px; }
    /* U-7 冻结列宽度（显式宽度才能让第二列固定 left 偏移可预测） */
    .dim-table-freeze thead th:nth-child(1),
    .dim-table-freeze tbody td:nth-child(1) { width: 36px; min-width: 36px; }
    .dim-table-freeze thead th:nth-child(2),
    .dim-table-freeze tbody td:nth-child(2) { width: 52px; min-width: 52px; }

/* ============================================================================
   老板速读报告（模板 D）—— .rb-* 命名空间 + #bossReportDrawer 抽屉
   ----------------------------------------------------------------------------
   · 样式命名空间一律 .rb-*（仅 #bossReportDrawer 例外），不覆盖任何既有类；
   · 双主题：.rb-* 令牌在 :root（深色默认）与 html[data-theme="light"]（浅色）双赋值，
     浅色下正文文字为深色可读（--rb-ink #1c2b45 on #fff，对比度达标）；
   · 红黄绿只表示风险等级；涨跌用 ↑↓ + 多/少（--rb-up-ink / --rb-dn-ink，非红非绿）；
   · 图表全部内联 SVG（无外链、无第三方图表库）。
   ============================================================================ */
    :root {
      --rb-ink: #d6e4ff;
      --rb-ink2: #9db4d6;
      --rb-ink3: #6d86ad;
      --rb-line: #1e3a63;
      --rb-card: rgba(21, 45, 90, 0.55);
      --rb-card2: rgba(10, 20, 40, 0.45);
      --rb-good: #10b981;
      --rb-good-ink: #10b981; /* 语义「良好」的**文字**色：默认与 --rb-good 同值，屏幕态像素不变；
                                 打印态单独覆盖为达标深色（--rb-good 本身是灰度阶梯填充，不可压暗） */
      --rb-warn: #ffa94d;
      --rb-warn-ink: #ffa94d;
      --rb-bad: #ff6b6b;
      --rb-bad-ink: #ff6b6b; /* 语义「危险」的文字色：同上，打印态单独覆盖 */
      --rb-muted: #5a7399;
      --rb-accent: #3b82f6;
      --rb-c1: #3b82f6;
      --rb-c2: #ffa94d;
      --rb-c3: #8a63e0;
      --rb-c4: #5f7aa8;
      --rb-up-ink: #7cb0ff;
      --rb-dn-ink: #ffc078;
      /* P0-2 · 报告抽屉几何（与主题无关，仅在此赋值一次；var() 均带兜底值）
         算式：导航左缘(--rb-toc-left) + 导航宽(--rb-toc-w) + 间距(--rb-toc-gap)
               = 正文左缘(抽屉坐标系 145px)；
               .rb-doc 的父级 .dw-body 左内边距 22px 需先扣除，
               故 .rb-doc 的 margin-left(=--rb-doc-left) = 145 - 22 = 123px。
         · .rb-toc 为 fixed，抽屉带 transform → 其包含块为 #bossReportDrawer，
           故 --rb-toc-left 的基准是抽屉左缘（非视口左缘）。 */
      --rb-toc-left: 20px;   /* 导航条相对抽屉左缘的偏移 */
      --rb-toc-w: 110px;     /* 导航条固定宽度（不再由内容撑开，使间距可计算、确定） */
      --rb-toc-gap: 15px;    /* 导航右缘 → 正文可见内容左缘的恒定间距 */
      --rb-body-pad-l: 22px; /* .dw-body 左内边距（必须计入） */
      --rb-doc-left: calc(var(--rb-toc-left) + var(--rb-toc-w) + var(--rb-toc-gap) - var(--rb-body-pad-l)); /* = 123px */
    }

    html[data-theme="light"] {
      --rb-ink: #1c2b45;
      --rb-ink2: #44506b;
      --rb-ink3: #8494ab;
      --rb-line: #d8e1ef;
      --rb-card: #ffffff;
      --rb-card2: #f6f9fd;
      --rb-good: #059669;
      --rb-good-ink: #059669; /* 浅色主题：文字色初值 = 当前 --rb-good（屏幕态像素不变） */
      --rb-warn: #e8a13a;
      --rb-warn-ink: #b45309;
      --rb-bad: #dc2626;
      --rb-bad-ink: #dc2626;  /* 浅色主题：危险文字色初值 = 当前 --rb-bad */
      --rb-muted: #8494ab;
      --rb-accent: #1a5fd0;
      --rb-c1: #1d4ed8;
      --rb-c2: #b7791f;
      --rb-c3: #6d28d9;
      --rb-c4: #a5b2c8;
      --rb-up-ink: #1d4ed8;
      --rb-dn-ink: #b45309;
    }

    /* 顶部工具栏「快速报告」按钮（位于「操作」按钮之前，实心品牌蓝 + 描边，与「操作」协调可区分） */
    .rb-top-btn {
      /* ★ 2026-09-13（走查项 C-2）：原渐变起点 #3b82f6 上白字实测 4.35:1（未过 AA 4.5）；
         加深到 #2563eb 后 ≈5.2:1，一次到位且不改变「实心品牌蓝」的观感。
         同时把高度从 34px 提到 36px（顶栏为最高频入口；44×44 口径见规范项 F-1 待裁决）。 */
      background: linear-gradient(135deg, #2563eb, #1d4ed8);
      border: 1px solid rgba(255, 255, 255, 0.28);
      color: #fff;
      padding: 6px 14px;
      min-height: 36px;
      display: inline-flex;
      align-items: center;
      border-radius: 6px;
      font-size: 12px;
      font-weight: 600;
      cursor: pointer;
      transition: all 0.2s;
      white-space: nowrap;
    }
    .rb-top-btn::before { content: "⚡ "; font-weight: 400; }
    .rb-top-btn:hover { filter: brightness(1.08); box-shadow: 0 0 10px rgba(59, 130, 246, 0.45); }
    html[data-theme="light"] .rb-top-btn { border-color: rgba(255, 255, 255, 0.5); }
    /* hover 的 brightness(1.08) 会把渐变提亮、反而压低白字对比度 —— 浅色下改用加深 */
    html[data-theme="light"] .rb-top-btn:hover { filter: none; background: linear-gradient(135deg, #1d4ed8, #1e40af); }

    /* 老板速读报告抽屉骨架（#ohDrawer=215 / #subDrawer=220 / #mask=200 → 取 216 不冲突） */
    #bossReportDrawer {
      position: fixed;
      top: 0;
      right: 0;
      width: 960px;
      height: 100%;
      z-index: 216;
      transform: translateX(100%);
      transition: transform 0.28s cubic-bezier(0.2, 0.8, 0.2, 1);
      display: flex;
      flex-direction: column;
      background: linear-gradient(180deg, var(--dw-bg-1), var(--dw-bg-2));
      border-left: 1px solid var(--line);
    }
    #bossReportDrawer.on {
      transform: translateX(0);
      box-shadow: -20px 0 60px rgba(0, 0, 0, 0.5);
    }
    @media (max-width: 1000px) {
      #bossReportDrawer { width: calc(100vw - 40px); }
    }
    #bossReportClose.rb-x {
      position: absolute;
      right: 18px;
      top: 18px;
      width: 32px;
      height: 32px;
      border-radius: 8px;
      border: 1px solid var(--line2);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      color: var(--txt2);
      font-size: 16px;
      cursor: pointer;
      transition: 0.2s;
    }
    #bossReportClose.rb-x:hover { color: #fff; border-color: var(--cyan); }

    /* 生成 PPT · 预览浮层（js/report-boss-ppt.js）
       z-index 分层：掩膜 200 < 抽屉 216 < 本浮层 1200 < 全局通知 10000
       —— 浮层必须压住抽屉（它是从抽屉里点出来的），但不能压住通知/提示。 */
    .rbppt-modal { position: fixed; left: 0; right: 0; top: 0; bottom: 0; z-index: 1200; display: none; }
    .rbppt-modal.on { display: block; }
    .rbppt-bd { position: absolute; left: 0; right: 0; top: 0; bottom: 0; background: rgba(4, 8, 18, 0.72); backdrop-filter: blur(3px); animation: rbpptFade 0.22s ease; }
    .rbppt-dlg {
      position: relative;
      z-index: 2;
      width: min(1560px, calc(100vw - 64px));
      height: calc(100vh - 64px);
      margin: 32px auto;
      display: flex;
      flex-direction: column;
      background: var(--dw-bg-1, #0e2040);
      border: 1px solid var(--line);
      border-radius: 18px;
      overflow: hidden;
      box-shadow: 0 30px 90px rgba(0, 0, 0, 0.55);
      animation: rbpptUp 0.26s cubic-bezier(0.2, 0.8, 0.3, 1);
    }
    .rbppt-hd { display: flex; align-items: center; gap: 16px; padding: 14px 18px; border-bottom: 1px solid var(--line); }
    .rbppt-tg { min-width: 0; }
    .rbppt-t { font-size: 16px; font-weight: 800; color: var(--txt); }
    .rbppt-s { font-size: 12px; color: var(--txt2); margin-top: 3px; }
    .rbppt-ks { margin-left: auto; font-size: 11.5px; color: var(--txt2); white-space: nowrap; }
    .rbppt-act { display: flex; align-items: center; gap: 8px; }
    .rbppt-btn {
      border: 1px solid var(--line2);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      color: var(--txt);
      padding: 6px 12px;
      border-radius: 8px;
      font-size: 12.5px;
      font-family: inherit;
      cursor: pointer;
      transition: 0.2s;
      white-space: nowrap;
    }
    .rbppt-btn:hover { border-color: var(--cyan); color: #fff; }
    html[data-theme="light"] .rbppt-btn:hover { color: var(--rb-accent, #1a5fd0); }
    .rbppt-btn.is-primary { background: linear-gradient(135deg, #2f6bff, #1a5fd0); border-color: transparent; color: #fff; font-weight: 700; }
    .rbppt-x {
      width: 30px;
      height: 30px;
      border-radius: 8px;
      border: 1px solid var(--line2);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      color: var(--txt2);
      font-size: 16px;
      line-height: 1;
      cursor: pointer;
    }
    .rbppt-x:hover { color: #fff; border-color: var(--cyan); }
    /* 预览区底色恒为演示文稿深色画布，避免 iframe 首帧闪白 */
    .rbppt-stage { flex: 1; min-height: 0; position: relative; background: #070C16; }
    .rbppt-frame { width: 100%; height: 100%; display: block; border: 0; background: #070C16; }
    /* 伪全屏（F1 降级）：拿不到原生全屏权限时改为铺满视口 —— 用户呈现与真全屏一致，
       且不会像「硬请求 requestFullscreen」那样留下 Permissions Policy 控制台报错。 */
    .rbppt-dlg.is-faux-fs { width: 100vw; height: 100vh; margin: 0; border-radius: 0; border: 0; }
    .rbppt-modal.is-faux-fs .rbppt-bd { background: #000; backdrop-filter: none; }
    @keyframes rbpptFade { from { opacity: 0; } to { opacity: 1; } }
    @keyframes rbpptUp { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: none; } }
    @media (max-width: 900px) {
      .rbppt-dlg { width: 100vw; height: 100vh; margin: 0; border-radius: 0; }
      .rbppt-ks { display: none; }
    }
    @media (prefers-reduced-motion: reduce) {
      .rbppt-bd, .rbppt-dlg { animation: none; }
    }

    /* 抽屉头部操作区（年度切换 + 下载 + 打印） */
    .rb-dw-hd { display: flex; align-items: center; gap: 12px; }
    .rb-hd-actions {
      display: flex;
      align-items: center;
      gap: 8px;
      margin-left: auto;
      margin-right: 38px; /* 从 48px 减少到 38px，向右移动 10px */
      margin-top: -10px; /* 向上移动 10px（之前-5px，再向上5px） */
    }

    /* 抽屉内工具条（sticky 常驻在滚动区顶部） */
    .rb-tool {
      position: sticky;
      top: 0;
      z-index: 3;
      display: flex;
      align-items: center;
      gap: 8px;
      padding: 8px 0 10px;
      margin-bottom: 4px;
      background: linear-gradient(180deg, var(--dw-bg-1) 70%, rgba(var(--p-r), var(--p-g), var(--p-b), 0));
    }
    .rb-tool-btn {
      border: 1px solid var(--line2);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      color: var(--txt);
      padding: 5px 12px;
      border-radius: 7px;
      font-size: 12px;
      cursor: pointer;
      transition: 0.15s;
    }
    .rb-tool-btn:hover { border-color: var(--cyan); color: #fff; }
    html[data-theme="light"] .rb-tool-btn:hover { color: var(--rb-accent); }
    .rb-tool-tip { margin-left: auto; font-size: 11px; color: var(--rb-ink3); }
    /* P1-6 · 键盘焦点可见（原仅有 hover 态） */
    .rb-tool-btn:focus-visible,
    #bossReportClose.rb-x:focus-visible,
    .rb-toc-a:focus-visible,
    .rb-gloss-input:focus-visible,
    .rb-tool-year:focus-visible { outline: 2px solid var(--rb-accent); outline-offset: 2px; }
    /* P1-5 · 年度下拉（与工具条按钮同高同圆角，作主操作前的筛选控件） */
    .rb-tool-year {
      border: 1px solid var(--line2);
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.6);
      color: var(--txt);
      padding: 5px 8px;
      border-radius: 7px;
      font-size: 12px;
      cursor: pointer;
      transition: 0.15s;
    }
    .rb-tool-year:hover { border-color: var(--cyan); }
    /* P0-1 · 章节锚点导航条（左侧固定悬浮；滚动高亮当前章，打印态隐藏） */
    .rb-toc {
      position: fixed;
      left: var(--rb-toc-left, 20px);
      top: 90px;
      width: var(--rb-toc-w, 110px);
      z-index: 220;
      display: flex;
      flex-direction: column;
      gap: 6px;
      padding: 12px;
      background: rgba(var(--p-r), var(--p-g), var(--p-b), 0.95);
      border: 1px solid var(--line);
      border-radius: 12px;
      box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
      backdrop-filter: blur(10px);
      max-height: calc(100vh - 110px);
      overflow-y: auto;
    }
    .rb-toc-a {
      display: inline-flex;
      align-items: center;
      height: 28px;
      padding: 0 12px;
      border: 1px solid var(--rb-line);
      border-radius: 6px;
      background: var(--rb-card);
      color: var(--rb-ink2);
      font-size: 12px;
      text-decoration: none;
      white-space: nowrap;
      transition: 0.15s;
    }
    .rb-toc-a:hover { border-color: var(--rb-accent); color: var(--rb-accent); transform: translateX(3px); }
    .rb-toc-a.on {
      background: var(--rb-accent);
      border-color: var(--rb-accent);
      color: #fff;
      font-weight: 700;
    }
    html[data-theme="light"] .rb-toc-a.on { color: #fff; }
    html[data-theme="light"] .rb-toc {
      background: rgba(255, 255, 255, 0.95);
      box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
    }

    /* 报告文档区 */
    .rb-body { padding-top: 8px; }
    .rb-report { color: var(--rb-ink); }
    .rb-doc { color: var(--rb-ink); }
    /* P0-2 · 阅读宽度：收窄至 900px 居中（中文舒适行宽 35–45 全角字符）。
       离线下载件由 .rb-pad（960px）控制，不受本条影响（其自带内联样式）。
       正文左缘 = 导航左缘 20 + 导航宽 110 + 间距 15 = 145px（抽屉坐标系）；
       .dw-body 左内边距 22px 已计入 --rb-doc-left（= 145 − 22 = 123px），
       故此处 padding-left 归零，避免与 margin-left 叠成双重左偏移。 */
    #bossReportDrawer .rb-doc { max-width: 900px; margin: 0 auto; padding-left: 0; }
    @media (min-width: 901px) {
      /* 大屏：为固定导航条留出 15px 恒定间距，正文左缘落在抽屉 145px 处 */
      #bossReportDrawer .rb-doc { margin-left: var(--rb-doc-left, 123px); margin-right: auto; }
    }
    /* P0-1 · 锚点跳转补偿 sticky 工具条 + 章节导航条高度，避免章标题被压住 */
    #bossReportDrawer .rb-sec { scroll-margin-top: 112px; }
    .rb-standalone-body { background: #fff; }
    .rb-pad { max-width: 960px; margin: 0 auto; padding: 30px 34px; }
    .rb-doc-hd {
      display: flex; justify-content: space-between; align-items: flex-start; gap: 16px;
      border-bottom: 2px solid var(--rb-accent); padding-bottom: 10px; margin-bottom: 16px;
    }
    .rb-doc-brand { display: flex; align-items: center; gap: 10px; }
    .rb-logo { height: 34px; width: auto; max-width: 200px; object-fit: contain; }
    /* P1-6 · 抬头主标题升级为 h1（语义 heading 起点），故显式归零默认 margin */
    .rb-doc-t { font-size: 17px; font-weight: 800; color: var(--rb-ink); margin: 0; line-height: 1.4; }
    html[data-theme="light"] .rb-doc-t { color: #1c2b45; }
    .rb-doc-meta { display: flex; flex-wrap: wrap; gap: 4px 14px; font-size: 11.5px; color: var(--rb-ink3); justify-content: flex-end; text-align: right; margin-top: 15px; }

    .rb-sec { margin: 20px 0 12px; }
    .rb-sec-h { display: flex; align-items: center; gap: 8px; border-left: 5px solid var(--rb-accent); padding-left: 10px; margin-bottom: 6px; background: rgba(47, 107, 255, 0.08); padding-top: 8px; padding-bottom: 8px; border-radius: 4px; }
    .rb-no {
      display: inline-flex; align-items: center; justify-content: center; min-width: 22px; height: 22px;
      border-radius: 6px; background: var(--rb-accent); color: #fff; font-size: 12px; font-weight: 800; padding: 0 6px;
    }
    .rb-h2 { font-size: 16px; font-weight: 800; color: var(--rb-ink); margin: 0; }
    html[data-theme="light"] .rb-h2 { color: #1c2b45; }
    .rb-lead { font-size: 13.5px; color: var(--rb-ink2); margin: 4px 0 12px; line-height: 1.9; }
    .rb-lead b { color: var(--rb-ink); }
    html[data-theme="light"] .rb-lead b { color: #1c2b45; }

    .rb-card, .rb-block { background: var(--rb-card2); border: 1px solid var(--rb-line); border-radius: 10px; padding: 12px 14px; margin: 8px 0; }
    .rb-card-t, .rb-block-t { font-size: 13.5px; font-weight: 700; color: var(--rb-ink); margin: 0 0 8px; }
    html[data-theme="light"] .rb-card-t, html[data-theme="light"] .rb-block-t { color: #1c2b45; }
    .rb-card-t2 { font-size: 12.5px; font-weight: 700; color: var(--rb-accent); margin: 0 0 6px; }
    .rb-kv { display: flex; justify-content: space-between; gap: 10px; font-size: 12.5px; color: var(--rb-ink2); border-bottom: 1px dashed var(--rb-line); padding: 4px 0; }
    .rb-kv b { color: var(--rb-ink); font-weight: 700; }
    html[data-theme="light"] .rb-kv b { color: #1c2b45; }
    /* 口径 / 分母等辅助说明行：弱化，不与主数值抢视觉 */
    .rb-kv-quiet { font-size: 11.5px; color: var(--rb-ink3, var(--rb-ink2)); opacity: .82; border-bottom-style: dotted; }
    .rb-kv-quiet b { font-weight: 600; }
    /* P2-3 · 快照时效徽标：快照期间落后于财务期间时提示，避免旧快照被当最新 */
    .rb-stale {
      margin: 6px 0 2px; padding: 6px 8px; border-radius: 8px; font-size: 11.5px; line-height: 1.55;
      color: var(--rb-ink2); background: rgba(var(--t-r), var(--t-g), var(--t-b), .05);
      border: 1px dashed var(--rb-line);
    }
    .rb-stale-badge {
      display: inline-block; margin-right: 6px; padding: 1px 6px; border-radius: 999px;
      font-size: 10.5px; font-weight: 800; color: var(--rb-warn);
      border: 1px solid var(--rb-warn); background: rgba(255, 176, 32, .10);
    }
    .rb-grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
    .rb-c0-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 10px; }
    /* P1-1 · 第 0 章大数字卡：金额三联（数值 20px/800 + 单位弱化 + 补充行对齐占位） */
    .rb-bignum-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-bottom: 8px; }
    .rb-bignum {
      background: var(--rb-card);
      border: 1px solid var(--rb-line);
      border-radius: 9px;
      padding: 8px 6px 6px;
      text-align: center;
      display: flex;
      flex-direction: column;
      gap: 1px;
      min-width: 0;
    }
    .rb-bignum-k { font-size: 10.5px; color: var(--rb-ink3); line-height: 1.4; }
    .rb-bignum-v { font-size: 20px; font-weight: 800; color: var(--rb-ink); line-height: 1.25; font-variant-numeric: tabular-nums; }
    .rb-bignum-v em { font-style: normal; font-size: 11px; font-weight: 600; color: var(--rb-ink3); margin-left: 2px; }
    .rb-bignum-sub { font-size: 10.5px; color: var(--rb-ink3); line-height: 1.4; }
    .rb-bignum.is-empty .rb-bignum-v { font-size: 14px; font-weight: 600; color: var(--rb-ink3); }
    html[data-theme="light"] .rb-bignum-v { color: #1c2b45; }

    .rb-c0-top { display: flex; gap: 16px; align-items: center; background: var(--rb-card2); border: 1px solid var(--rb-line); border-radius: 12px; padding: 14px; }
    .rb-c0-gauge { flex: 0 0 200px; }
    .rb-gauge { width: 100%; max-width: 240px; display: block; }
    .rb-gauge-num { font-size: 38px; font-weight: 800; }
    .rb-gauge-sub { font-size: 11.5px; fill: var(--rb-ink3); }
    .rb-c0-right { flex: 1; min-width: 0; }
    .rb-c0-title { font-size: 16px; font-weight: 800; color: var(--rb-ink); }
    html[data-theme="light"] .rb-c0-title { color: #1c2b45; }
    .rb-c0-scoreline { font-size: 13px; color: var(--rb-ink2); margin-top: 4px; }
    .rb-c0-scoreline b { color: var(--rb-ink); }
    html[data-theme="light"] .rb-c0-scoreline b { color: #1c2b45; }
    .rb-c0-mom { font-size: 12px; color: var(--rb-ink3); margin-top: 4px; }

    .rb-lights { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
    .rb-light { display: inline-flex; align-items: center; gap: 5px; font-size: 12px; border: 1px solid var(--rb-line); border-radius: 8px; padding: 3px 9px; color: var(--rb-ink2); background: var(--rb-card); }
    .rb-light i { width: 8px; height: 8px; border-radius: 50%; background: var(--rb-muted); }
    .rb-light b { color: var(--rb-ink); font-weight: 700; }
    .rb-light.is-good i { background: var(--rb-good); }
    .rb-light.is-warn i { background: var(--rb-warn); }
    .rb-light.is-danger i { background: var(--rb-bad); }
    .rb-light.is-muted i { background: var(--rb-muted); }

    .rb-scorebar { width: 100%; display: block; }
    .rb-mini-lab { font-size: 10.5px; fill: var(--rb-ink3); }
    .rb-mini-strong { fill: var(--rb-ink); font-weight: 700; }
    .rb-legs { width: 100%; max-width: 420px; display: block; }
    .rb-legs-lab { font-size: 12px; fill: var(--rb-ink2); font-weight: 600; }
    /* 「三条腿」柱色改由 CSS 类驱动（不再内联 fill）——便于单色打印按变量重定义 */
    .rb-legs-bar.is-c1 { fill: var(--rb-c1); }
    .rb-legs-bar.is-c2 { fill: var(--rb-c2); }
    .rb-legs-bar.is-c3 { fill: var(--rb-c3); }
    /* P2-2 · 三条腿图 + 数值摘要横排，填满收窄后的正文宽度 */
    .rb-legs-wrap { display: grid; grid-template-columns: 1fr 200px; gap: 16px; align-items: center; }
    .rb-legs-chart { min-width: 0; }
    .rb-legs-side { display: flex; flex-direction: column; gap: 6px; }
    .rb-legstat {
      background: var(--rb-card2);
      border: 1px solid var(--rb-line);
      border-radius: 8px;
      padding: 6px 10px;
      display: flex;
      flex-direction: column;
    }
    .rb-legstat-k { font-size: 11px; color: var(--rb-ink3); }
    .rb-legstat-v { font-size: 15px; font-weight: 800; font-variant-numeric: tabular-nums; }
    .rb-legstat-s { font-size: 10px; color: var(--rb-ink3); }

    .rb-hundred-stack { display: flex; height: 18px; border-radius: 6px; overflow: hidden; background: var(--rb-line); }
    .rb-hundred-stack span { display: block; height: 100%; }
    .rb-hundred-rows { display: flex; flex-wrap: wrap; gap: 4px 16px; margin-top: 8px; }
    .rb-hundred-row { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--rb-ink2); }
    .rb-hundred-dot { width: 9px; height: 9px; border-radius: 3px; display: inline-block; }
    .rb-hundred-lab { color: var(--rb-ink2); }
    .rb-hundred-val { color: var(--rb-ink); font-weight: 700; }
    html[data-theme="light"] .rb-hundred-val { color: #1c2b45; }
    .rb-hundred-note { font-size: 11px; color: var(--rb-ink3); margin-top: 6px; }

    .rb-scale { display: flex; flex-direction: column; gap: 8px; }
    /* P2-2 · 行高与轨道加厚，收窄后不显松散 */
    .rb-scale-row { display: grid; grid-template-columns: 168px 1fr 190px; gap: 10px; align-items: center; font-size: 12px; min-height: 26px; }
    .rb-scale-lab { color: var(--rb-ink2); }
    .rb-scale-track { height: 16px; border-radius: 6px; background: var(--rb-line); overflow: hidden; }
    .rb-scale-fill { display: block; height: 100%; background: var(--rb-c1); }
    .rb-scale-fill.is-c2 { background: var(--rb-c2); }
    .rb-scale-fill.is-c3 { background: var(--rb-c3); }
    .rb-scale-fill.is-c4 { background: var(--rb-c4); }
    .rb-scale-val { color: var(--rb-ink); font-weight: 700; text-align: right; }
    html[data-theme="light"] .rb-scale-val { color: #1c2b45; }
    .rb-scale-val em { display: block; font-style: normal; font-size: 10.5px; color: var(--rb-ink3); font-weight: 400; }

    .rb-dimlist { list-style: none; padding: 0; margin: 8px 0; display: grid; grid-template-columns: 1fr 1fr; gap: 6px 14px; }
    .rb-dimlist li { display: flex; align-items: center; gap: 8px; font-size: 12.5px; border-left: 3px solid var(--rb-muted); padding: 3px 8px; background: var(--rb-card2); border-radius: 6px; }
    .rb-dimlist li.is-good { border-left-color: var(--rb-good); }
    .rb-dimlist li.is-warn { border-left-color: var(--rb-warn); }
    .rb-dimlist li.is-danger { border-left-color: var(--rb-bad); }
    .rb-dimlist li b { color: var(--rb-ink); min-width: 76px; }
    .rb-dimlist li span { color: var(--rb-ink); font-weight: 700; }
    .rb-dimlist li em { margin-left: auto; font-style: normal; color: var(--rb-ink3); }
    /* P1-2 · 最差项（列表首行）强调：「短板」徽标 + 浅色底，让第一优先一眼可辨 */
    .rb-dimlist li.is-first { background: rgba(var(--t-r), var(--t-g), var(--t-b), 0.13); font-weight: 700; }
    .rb-dimflag {
      font-style: normal;
      font-size: 10px;
      font-weight: 800;
      color: #fff;
      background: var(--rb-bad);
      border-radius: 4px;
      padding: 0 5px;
      line-height: 15px;
    }
    .rb-dimstate { font-size: 10.5px; border-radius: 9px; padding: 0 7px; line-height: 16px; background: rgba(var(--t-r), var(--t-g), var(--t-b), 0.12); }
    .rb-dimstate.is-good { color: var(--rb-good-ink, var(--rb-good)); }
    .rb-dimstate.is-warn { color: var(--rb-warn-ink); }
    .rb-dimstate.is-danger { color: var(--rb-bad-ink, var(--rb-bad)); }

    /* P1-4 · 风险分区轨道：0–3 / 3–6 / 6–12 淡色分区 + 命名刻度 + 当前值气泡
       （沿用全站约定：红黄绿只表风险区间，不表涨跌） */
    .rb-runway { position: relative; padding-top: 26px; }
    .rb-runway-track { position: relative; display: flex; height: 20px; border-radius: 8px; background: var(--rb-line); overflow: hidden; }
    .rb-runway-seg { display: block; height: 100%; }
    .rb-runway-seg.is-danger { background: var(--rb-bad); opacity: 0.14; }
    .rb-runway-seg.is-warn { background: var(--rb-warn); opacity: 0.16; }
    .rb-runway-seg.is-good { background: var(--rb-good); opacity: 0.14; }
    .rb-runway-fill { position: absolute; left: 0; top: 0; height: 100%; border-radius: 8px 0 0 8px; background: var(--rb-good); opacity: 0.6; }
    .rb-runway.is-warn .rb-runway-fill { background: var(--rb-warn); }
    .rb-runway.is-danger .rb-runway-fill { background: var(--rb-bad); }
    .rb-runway-bubble {
      position: absolute; top: 0; transform: translateX(-50%);
      background: var(--rb-good); color: #fff; font-size: 11px; font-weight: 800;
      border-radius: 9px; padding: 0 8px; line-height: 18px; white-space: nowrap;
    }
    .rb-runway.is-warn .rb-runway-bubble { background: var(--rb-warn); }
    .rb-runway.is-danger .rb-runway-bubble { background: var(--rb-bad); }
    .rb-runway-ticks { position: relative; height: 15px; margin-top: 4px; font-size: 10px; color: var(--rb-ink3); }
    .rb-runway-ticks span { position: absolute; transform: translateX(-50%); white-space: nowrap; }
    .rb-runway-ticks span:first-child { transform: none; }
    .rb-runway-ticks span:last-child { transform: translateX(-100%); }
    .rb-runway-line { position: absolute; top: -2px; width: 2px; height: 22px; background: var(--rb-ink3); }
    .rb-runway-note { font-size: 12px; color: var(--rb-ink2); margin-top: 8px; }
    .rb-runway-note b { color: var(--rb-ink); }
    html[data-theme="light"] .rb-runway-note b { color: #1c2b45; }
    .rb-runway-tag { color: var(--rb-ink3); font-size: 11px; }

    .rb-tbl { width: 100%; border-collapse: collapse; font-size: 12.5px; margin: 6px 0; }
    .rb-tbl th, .rb-tbl td { border: 1px solid var(--rb-line); padding: 7px 9px; text-align: left; vertical-align: top; }
    .rb-tbl th { background: var(--rb-card2); color: var(--rb-ink); font-weight: 700; }
    html[data-theme="light"] .rb-tbl th { color: #1c2b45; }
    .rb-num { text-align: right; font-variant-numeric: tabular-nums; }
    .rb-gloss-calc { color: var(--rb-ink3); font-size: 11.5px; }
    /* P2-1 · 附录 A 名词表检索条（20 条术语不必肉眼翻） */
    .rb-gloss-bar { display: flex; align-items: center; gap: 10px; margin: 4px 0 8px; flex-wrap: wrap; }
    .rb-gloss-input {
      flex: 1 1 240px;
      min-width: 0;
      border: 1px solid var(--rb-line);
      background: var(--rb-card);
      color: var(--rb-ink);
      border-radius: 8px;
      padding: 6px 10px;
      font-size: 12.5px;
      font-family: inherit;
    }
    .rb-gloss-input::placeholder { color: var(--rb-ink3); }
    .rb-gloss-count { font-size: 11.5px; color: var(--rb-ink3); white-space: nowrap; }

    .rb-ul { margin: 4px 0; padding-left: 20px; }
    .rb-ul li { font-size: 12.5px; color: var(--rb-ink2); margin: 3px 0; }
    .rb-ul li b { color: var(--rb-ink); }
    html[data-theme="light"] .rb-ul li b { color: #1c2b45; }

    .rb-tip { background: var(--rb-card2); border: 1px solid var(--rb-line); border-left: 3px solid var(--rb-accent); border-radius: 8px; padding: 8px 12px; font-size: 12.5px; color: var(--rb-ink2); margin: 8px 0; }
    .rb-tip b { color: var(--rb-ink); }
    html[data-theme="light"] .rb-tip b { color: #1c2b45; }
    .rb-tip-quiet { border-left-color: var(--rb-ink3); color: var(--rb-ink3); }
    /* P1-6 · 老板速读报告月度切换：历史期提示条（沿用 .rb-tip 骨架，仅换琥珀色左标以示区别） */
    .rb-tip.rb-tip-hist { border-left-color: #d97706; }
    /* 第 6 章 Top1 高度集中（>50%）高风险提示：左侧红条 + 浅红底（仅表风险等级，不表涨跌）。
       背景恒为浅红底，故文字恒用深红字（不跟随主题令牌，避免深色主题「浅字压浅底」），两主题对比度均 ≥4.5:1 */
    .rb-tip.rb-tip-danger { border-left-color: var(--rb-bad); background: #fdf1f1; color: #7d2b2b; }
    .rb-tip.rb-tip-danger b { color: #5c1f1f; }
    html[data-theme="light"] .rb-tip.rb-tip-danger { background: #fdecec; color: #7d2b2b; }
    html[data-theme="light"] .rb-tip.rb-tip-danger b { color: #5c1f1f; }
    .rb-note { background: var(--rb-card2); border: 1px dashed var(--rb-line); border-radius: 8px; padding: 8px 12px; font-size: 11.5px; color: var(--rb-ink3); }
    .rb-ok { background: #eef9f3; border: 1px solid #bfe8d4; color: #0a7d54; border-radius: 8px; padding: 8px 12px; font-size: 12px; }
    .rb-warn { background: #fdf6e9; border: 1px solid #ead9ab; color: #8a5a1c; border-radius: 8px; padding: 8px 12px; font-size: 12px; }
    .rb-empty { color: var(--rb-ink3); font-size: 12px; padding: 6px 2px; }

    .rb-up { color: var(--rb-up-ink); font-weight: 700; }
    .rb-dn { color: var(--rb-dn-ink); font-weight: 700; }
    .rb-flat { color: var(--rb-ink3); }
    .rb-neg { color: #cf3b4a; }

    .rb-acts { background: #fdf1f1; border: 1px solid #f0c4c4; border-radius: 10px; padding: 12px 16px; margin-top: 10px; }
    .rb-acts-t { font-size: 13.5px; font-weight: 800; color: #b3261e; margin: 0 0 6px; }
    .rb-acts-list { margin: 0; padding-left: 20px; }
    .rb-acts-list li { font-size: 12.5px; color: #7d2b2b; margin: 4px 0; }
    /* P1-3 · 第 0 章「本月最要紧的三件事」：整块红底 → 白卡 + 左侧风险色条（红底只留给真正的危险语义） */
    .rb-acts3 { margin-top: 10px; }
    .rb-acts3-t { font-size: 13.5px; font-weight: 800; color: var(--rb-ink); margin: 0 0 8px; }
    html[data-theme="light"] .rb-acts3-t { color: #1c2b45; }
    .rb-acts3-list { display: flex; flex-direction: column; gap: 6px; }
    .rb-act3 {
      display: flex;
      align-items: flex-start;
      gap: 10px;
      background: var(--rb-card);
      border: 1px solid var(--rb-line);
      border-left: 4px solid var(--rb-muted);
      border-radius: 8px;
      padding: 8px 12px;
    }
    .rb-act3.is-danger { border-left-color: var(--rb-bad); }
    .rb-act3.is-warning { border-left-color: var(--rb-warn); }
    .rb-act3.is-good { border-left-color: var(--rb-good); }
    .rb-act3-body { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
    .rb-act3-body b { font-size: 12.5px; color: var(--rb-ink); font-weight: 700; }
    html[data-theme="light"] .rb-act3-body b { color: #1c2b45; }
    .rb-act3-meta { font-size: 11.5px; color: var(--rb-ink3); }
    .rb-jump { display: inline-block; margin-top: 8px; font-size: 12px; color: var(--rb-accent); text-decoration: none; }
    .rb-jump:hover { text-decoration: underline; }

    .rb-actcards { display: flex; flex-direction: column; gap: 10px; }
    .rb-act { display: flex; gap: 12px; background: var(--rb-card2); border: 1px solid var(--rb-line); border-radius: 10px; padding: 12px 14px; border-left: 5px solid var(--rb-muted); }
    .rb-act.is-danger { border-left-color: var(--rb-bad); }
    .rb-act.is-warning { border-left-color: var(--rb-warn); }
    .rb-act.is-good { border-left-color: var(--rb-good); }
    .rb-act-n { flex: 0 0 26px; height: 26px; border-radius: 50%; background: var(--rb-accent); color: #fff; font-weight: 800; display: flex; align-items: center; justify-content: center; font-size: 13px; }
    .rb-act-body { flex: 1; min-width: 0; }
    .rb-act-row { display: grid; grid-template-columns: 64px 1fr; gap: 8px; font-size: 12.5px; padding: 3px 0; }
    .rb-act-k { color: var(--rb-ink3); }
    .rb-act-v { color: var(--rb-ink); }
    html[data-theme="light"] .rb-act-v { color: #1c2b45; }

    /* ── 第 7 章「风险」台账（2026-09-13 新增）──────────────────────────────────
       只做组合，不新造视觉语言：灯带复用 .rb-light 的灯点语义、清单复用 .rb-tbl、
       敞口条复用 .rb-scale；本段只补「六维 chip」「等级徽标」「读数主/副行」三处。
       本段只新增 .rb-risk-*，不覆盖任何既有 .rb-* 类。 */
    .rb-risk-band { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0; }
    .rb-risk-chip {
      display: inline-flex; align-items: center; gap: 6px;
      font-size: 12px; color: var(--rb-ink2);
      border: 1px solid var(--rb-line); border-left: 4px solid var(--rb-muted);
      border-radius: 8px; padding: 3px 10px 3px 8px; background: var(--rb-card);
    }
    .rb-risk-chip i { flex: 0 0 8px; width: 8px; height: 8px; border-radius: 50%; background: var(--rb-muted); }
    .rb-risk-chip b { color: var(--rb-ink); font-weight: 800; }
    html[data-theme="light"] .rb-risk-chip b { color: #1c2b45; }
    .rb-risk-chip.is-good { border-left-color: var(--rb-good); }
    .rb-risk-chip.is-good i { background: var(--rb-good); }
    .rb-risk-chip.is-warn { border-left-color: var(--rb-warn); }
    .rb-risk-chip.is-warn i { background: var(--rb-warn); }
    .rb-risk-chip.is-danger { border-left-color: var(--rb-bad); }
    .rb-risk-chip.is-danger i { background: var(--rb-bad); }
    .rb-risk-chip.is-muted { border-left-color: var(--rb-muted); }
    .rb-risk-chip.is-muted i { background: var(--rb-muted); }

    .rb-risk-tbl td { vertical-align: top; }
    .rb-risk-c-lv { width: 48px; }
    .rb-risk-lv {
      display: inline-block; min-width: 22px; text-align: center;
      font-size: 11.5px; font-weight: 800; line-height: 18px; border-radius: 5px;
      color: #fff; background: var(--rb-muted); padding: 0 6px;
    }
    .rb-risk-lv.is-danger { background: var(--rb-bad); }
    .rb-risk-lv.is-warn { background: var(--rb-warn); }
    .rb-risk-lv.is-good { background: var(--rb-good); }
    .rb-risk-read { font-weight: 700; color: var(--rb-ink); font-variant-numeric: tabular-nums; }
    html[data-theme="light"] .rb-risk-read { color: #1c2b45; }
    .rb-risk-sub { display: block; font-style: normal; font-size: 10.5px; color: var(--rb-ink3); line-height: 1.5; }
    .rb-risk-dim { display: block; font-style: normal; font-size: 10.5px; color: var(--rb-ink3); margin-top: 2px; }
    .rb-risk-impact { color: var(--rb-ink3); font-size: 11.5px; }
    .rb-risk-tbl td.rb-num b { color: var(--rb-ink); font-variant-numeric: tabular-nums; }
    .rb-risk-tbl td.rb-num em { display: block; font-style: normal; font-size: 10px; color: var(--rb-ink3); }
    html[data-theme="light"] .rb-risk-tbl td.rb-num b { color: #1c2b45; }
    .rb-risk-jump { color: var(--rb-accent); text-decoration: none; white-space: nowrap; }
    .rb-risk-jump:hover { text-decoration: underline; }
    @media (max-width: 900px) {
      .rb-risk-band { gap: 4px; }
      .rb-risk-tbl { font-size: 12px; }
    }

    .rb-doc-ft { margin-top: 16px; border-top: 1px solid var(--rb-line); padding-top: 8px; font-size: 11px; color: var(--rb-ink3); line-height: 1.7; }
    .rb-loading { color: var(--rb-ink3); font-size: 13px; padding: 24px; text-align: center; }
    .rb-error { color: #c0392b; font-size: 13px; padding: 16px; }
    .rb-err-hint { color: var(--rb-ink3); font-size: 12px; margin-top: 6px; }

    @media (max-width: 900px) {
      .rb-grid2, .rb-c0-grid { grid-template-columns: 1fr; }
      .rb-scale-row { grid-template-columns: 1fr; }
      .rb-bignum-grid { grid-template-columns: 1fr 1fr; }
      .rb-legs-wrap { grid-template-columns: 1fr; }
      /* 小屏幕时隐藏左侧固定导航 */
      .rb-toc { display: none; }
    }

    /* ==========================================================================
     * 老板速读报告 · A4 打印版式（body.rb-printing）
     * --------------------------------------------------------------------------
     * 这些规则【不放在 @media print 内】：打印前 JS（rbBossPreparePrint）会给 body
     * 挂 rb-printing 类，并在屏幕态按「真实打印版面」完成分页测量；只有与最终打印
     * 同宽同字体，分页才自洽（Chrome 不支持在 @page 命名页边距框里用 counter(page)）。
     * 几何：A4 210×297mm，1mm = 96/25.4 = 3.779528px；
     *   @page margin 12mm 10mm 16mm → 可印 190×269mm = 718×1017px；
     *   每页预留 页眉 34px + 页脚 30px + 安全 8px → 正文可用高约 945px。
     * ========================================================================== */
    body.rb-printing { background: #fff !important; }
    /* 只输出报告抽屉：直接隐藏其余顶层节点（避免 visibility:hidden 占位产生空白页） */
    body.rb-printing > *:not(#bossReportDrawer) { display: none !important; }
    body.rb-printing #mask { display: none !important; }
    body.rb-printing #bossReportDrawer {
      position: absolute !important; left: 0 !important; top: 0 !important; right: auto !important;
      width: 718px !important; height: auto !important; max-height: none !important; min-height: 0 !important;
      transform: none !important; box-shadow: none !important; border: none !important;
      background: #fff !important; z-index: auto !important; color: #111;
    }
    body.rb-printing #bossReportDrawer .dw-hd,
    body.rb-printing #bossReportDrawer .rb-x,
    body.rb-printing #bossReportDrawer .rb-tool,
    body.rb-printing #bossReportDrawer .rb-toc,
    body.rb-printing #bossReportDrawer .rb-gloss-bar { display: none !important; }
    body.rb-printing #bossReportDrawer .dw-body {
      overflow: visible !important; height: auto !important; max-height: none !important;
      padding: 0 !important; margin: 0 !important; background: #fff !important;
    }
    body.rb-printing #bossReportDrawer .rb-doc {
      max-width: none !important; width: 100% !important; margin: 0 !important; padding: 0 !important;
      color: #111 !important; font-size: 12px !important; line-height: 1.55 !important;
      -webkit-print-color-adjust: exact; print-color-adjust: exact;
    }
    /* ---- 打印态「打印安全深色文字令牌」（彩色 / 单色两分支共用）----
     * 打印前 rbBossPreparePrint 会把主题临时置为浅色（data-theme=light）以保证白纸黑字；
     * 但浅色主题的次要文字令牌偏浅：--rb-ink3(#8494ab)/--txt3(#8494ab) 在白底仅 ≈3.1:1，
     * 打印后发灰不可读。此处在共享打印域内统一压深到 ≥4.5:1（实测 #333 on #fff = 12.6:1）。
     * 注意：单色分支 .rb-print-mono 特异性更高(1 id + 2 class)，会在下方再覆盖一次，二者不冲突。 */
    body.rb-printing #bossReportDrawer {
      --rb-ink2: #1a1a1a; --rb-ink3: #333;
      --txt: #000; --txt2: #1a1a1a; --txt3: #333;
      /* --rb-good / --rb-bad 本身是「灰度阶梯填充色」，不可压暗（否则破坏三档明度差）；
         故单列「文字色」令牌，打印态覆盖为达标深色（白底实测：#047857≈5.0:1，#b91c1c≈6.5:1） */
      --rb-good-ink: #047857; --rb-bad-ink: #b91c1c;
    }
    /* 字号下限（可读性）：正文 ≥9pt(12px)、章标题 ≥13pt(17.3px)、表格 ≥8.5pt(11.3px) */
    body.rb-printing #bossReportDrawer .rb-doc .rb-lead { font-size: 12px !important; line-height: 1.6 !important; }
    body.rb-printing #bossReportDrawer .rb-doc .rb-h2 { font-size: 17.3px !important; }
    body.rb-printing #bossReportDrawer .rb-doc .rb-tbl { font-size: 11.3px !important; }
    body.rb-printing #bossReportDrawer .rb-doc .rb-tbl th,
    body.rb-printing #bossReportDrawer .rb-doc .rb-tbl td { padding: 5px 7px !important; }
    body.rb-printing #bossReportDrawer .rb-doc .rb-num { text-align: right !important; }
    /* 现金流水图底部注释（opdiagCashflowSvg 的 <text font-size="11.5">）：
       viewBox 宽 1120 被缩放到 718px 列宽后，该行实际渲染高仅 ≈7px，低于 9pt(12px) 下限。
       字号由 rbBossPreparePrint 按实测缩放比反算后写入 --rb-svg-note-fs；
       用属性选择器精确命中「全图唯一 font-size=11.5 的注释行」，不放大图内其它标注（15/13/12.5/12），
       同时其 fill:var(--txt3) 已被上面的打印安全深色令牌压到 #333，对比度一并达标。 */
    body.rb-printing #bossReportDrawer .odi-cash-svg text[font-size="11.5"] {
      font-size: var(--rb-svg-note-fs, 20px) !important;
    }
    /* 仪表盘大数字（rbBossGaugeSvg 的 .rb-gauge-num，fill 内联为风险色）：
       打印到白底时「黄 / 绿档」对比严重不足（warn 单色 #c9c9c9 = 1.66:1，彩色 #e8a13a = 2.07:1；
       good 彩色 #059669 = 3.57:1），属印刷不可读。打印态把数字统一改为深色字，
       风险色语义交由同一 SVG 的语义色「圆弧」承担（数字本身不需要靠颜色表达档位）。 */
    body.rb-printing #bossReportDrawer .rb-gauge-num { fill: var(--rb-ink, #111) !important; }
    /* 打印版面宽 718px < 900px 会命中全站 max-width:900px 响应式折叠，导致打印版式
       与屏幕测量不一致 → 在打印域内锁定桌面布局，使测量版面 = 最终打印版面 */
    body.rb-printing #bossReportDrawer .rb-grid2,
    body.rb-printing #bossReportDrawer .rb-c0-grid { grid-template-columns: 1fr 1fr !important; }
    body.rb-printing #bossReportDrawer .rb-bignum-grid { grid-template-columns: repeat(3, 1fr) !important; }
    body.rb-printing #bossReportDrawer .rb-scale-row { grid-template-columns: 168px 1fr 190px !important; }
    body.rb-printing #bossReportDrawer .rb-legs-wrap { grid-template-columns: 1fr 200px !important; }
    /* ---- 分页：章节可跨页；原子块不拦腰截断；表头每页重复 ---- */
    body.rb-printing #bossReportDrawer .rb-sec { break-inside: auto !important; page-break-inside: auto !important; margin: 8px 0 !important; }
    /* 打印域内收紧块间距，回收纵向空间，减少断页处的尾部留白 */
    body.rb-printing #bossReportDrawer .rb-block,
    body.rb-printing #bossReportDrawer .rb-card,
    body.rb-printing #bossReportDrawer .rb-tip,
    body.rb-printing #bossReportDrawer .rb-note,
    body.rb-printing #bossReportDrawer .rb-ok,
    body.rb-printing #bossReportDrawer .rb-warn,
    body.rb-printing #bossReportDrawer .rb-empty { margin: 8px 0 !important; }
    body.rb-printing #bossReportDrawer .rb-lead { margin: 8px 0 !important; }
    body.rb-printing #bossReportDrawer .rb-act,
    body.rb-printing #bossReportDrawer .rb-act3,
    body.rb-printing #bossReportDrawer .rb-acts,
    body.rb-printing #bossReportDrawer .rb-acts3,
    body.rb-printing #bossReportDrawer .rb-tbl,
    body.rb-printing #bossReportDrawer .rb-dimlist,
    body.rb-printing #bossReportDrawer .rb-ul,
    body.rb-printing #bossReportDrawer .rb-c0-top,
    body.rb-printing #bossReportDrawer .rb-c0-grid,
    body.rb-printing #bossReportDrawer .rb-bignum-grid,
    body.rb-printing #bossReportDrawer .rb-legs-wrap,
    body.rb-printing #bossReportDrawer .rb-scale,
    body.rb-printing #bossReportDrawer .rb-hundred { margin: 8px 0 !important; }
    body.rb-printing #bossReportDrawer .rb-actcards,
    body.rb-printing #bossReportDrawer .rb-acts3-list,
    body.rb-printing #bossReportDrawer .rb-acts-list,
    body.rb-printing #bossReportDrawer .rb-dimlist,
    body.rb-printing #bossReportDrawer .rb-legs-side,
    body.rb-printing #bossReportDrawer .rb-hundred-rows,
    body.rb-printing #bossReportDrawer .rb-hundred-row { gap: 8px !important; }
    body.rb-printing #bossReportDrawer .rb-grid2,
    body.rb-printing #bossReportDrawer .rb-c0-grid { gap: 8px !important; }
    /* 统一内部元素间距 */
    body.rb-printing #bossReportDrawer .rb-block-t,
    body.rb-printing #bossReportDrawer .rb-card-t,
    body.rb-printing #bossReportDrawer .rb-card-t2 { margin: 0 0 8px !important; }
    body.rb-printing #bossReportDrawer .rb-kv { padding: 4px 0 !important; }
    body.rb-printing #bossReportDrawer .rb-lights { margin-top: 8px !important; gap: 8px !important; }
    body.rb-printing #bossReportDrawer .rb-c0-scoreline,
    body.rb-printing #bossReportDrawer .rb-c0-mom { margin-top: 8px !important; }
    /* 章节壳被摊平后，用章标题上边距还原章节间距 */
    body.rb-printing #bossReportDrawer .rb-sec-h { break-after: avoid !important; page-break-after: avoid !important; margin: 8px 0 !important; }
    body.rb-printing #bossReportDrawer .rb-card,
    body.rb-printing #bossReportDrawer .rb-block,
    body.rb-printing #bossReportDrawer .rb-act,
    body.rb-printing #bossReportDrawer .rb-act3,
    body.rb-printing #bossReportDrawer .rb-tip,
    body.rb-printing #bossReportDrawer .rb-note,
    body.rb-printing #bossReportDrawer .rb-ok,
    body.rb-printing #bossReportDrawer .rb-warn,
    body.rb-printing #bossReportDrawer .rb-empty,
    body.rb-printing #bossReportDrawer .rb-grid2,
    body.rb-printing #bossReportDrawer .rb-c0,
    body.rb-printing #bossReportDrawer .rb-c0-top,
    body.rb-printing #bossReportDrawer .rb-c0-grid,
    body.rb-printing #bossReportDrawer .rb-bignum-grid,
    body.rb-printing #bossReportDrawer .rb-dimlist,
    body.rb-printing #bossReportDrawer .rb-scale,
    body.rb-printing #bossReportDrawer .rb-hundred,
    body.rb-printing #bossReportDrawer .rb-legs-wrap,
    body.rb-printing #bossReportDrawer .rb-tbl,
    body.rb-printing #bossReportDrawer .rb-tbl tr,
    body.rb-printing #bossReportDrawer .rb-doc-hd { break-inside: avoid !important; page-break-inside: avoid !important; }
    body.rb-printing #bossReportDrawer .rb-print-oversize { break-inside: auto !important; page-break-inside: auto !important; }
    body.rb-printing #bossReportDrawer .rb-tbl thead { display: table-header-group; }
    /* 附录 A · 名词白话对照表：禁止分栏，保持单栏布局 */
    body.rb-printing #bossReportDrawer .rb-gloss {
      width: 100% !important;
      column-count: 1 !important;
      break-inside: auto !important;
      page-break-inside: auto !important;
    }
    body.rb-printing #bossReportDrawer .rb-gloss tbody tr {
      break-inside: avoid !important;
      page-break-inside: avoid !important;
    }
    /* ---- 打印页眉 / 页脚（rbBossPaginate 插入，每页重复；页码 JS 回填） ---- */
    body.rb-printing #bossReportDrawer .rb-print-hd {
      height: 30px; box-sizing: border-box; display: flex; align-items: center; justify-content: space-between;
      gap: 12px; margin: 0 0 4px; padding: 0 2px 3px; border-bottom: 1px solid #555;
      font-size: 9.5px; color: #333; break-after: avoid; page-break-after: avoid;
    }
    body.rb-printing #bossReportDrawer .rb-print-hdbrk { break-before: page; page-break-before: always; }
    body.rb-printing #bossReportDrawer .rb-print-hd-l { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
    body.rb-printing #bossReportDrawer .rb-print-hd-r { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
    body.rb-printing #bossReportDrawer .rb-print-hd-logo { height: 15px; width: auto; }
    body.rb-printing #bossReportDrawer .rb-print-ft {
      position: absolute; left: 0; right: 0; bottom: 0;
      height: 26px; box-sizing: border-box; display: flex; align-items: center; justify-content: space-between;
      gap: 12px; margin: 0; padding: 3px 2px 0; border-top: 1px solid #999;
      font-size: 9.5px; color: #555;
    }
    body.rb-printing #bossReportDrawer .rb-print-ft-c { font-weight: 700; color: #333; }
    /* ---- 分页容器：每页固定高 1009px（945 正文 + 34 页眉 + 30 页脚），页脚绝对贴底 ----
     * 固定高 = 可印内容高 945 + 页眉 30+4 + 页脚 26+4；物理可印高 1017px，留 8px 安全余量。
     * 页脚贴底后，尾部余白只会落在「最后一个正文块与页脚之间」，不会掉到页脚下方。 ---- */
    body.rb-printing #bossReportDrawer .rb-pg {
      position: relative; box-sizing: border-box; width: 100%; height: 1009px; overflow: hidden;
      break-inside: avoid; page-break-inside: avoid;
    }
    body.rb-printing #bossReportDrawer .rb-pg-body { display: block; }
    body.rb-printing #bossReportDrawer .rb-pg-body-cover { height: 945px; }
    /* ---- 封面页（独立成页，填满正文高 945px，页脚由包裹容器贴底） ---- */
    body.rb-printing #bossReportDrawer .rb-cover {
      box-sizing: border-box; height: 100%; width: 100%;
      display: flex; flex-direction: column; align-items: center;
      text-align: center; padding: 0 34px;
    }
    /* 三个等权弹性空白，把页面余量均分，避免出现单条超大留白 */
    body.rb-printing #bossReportDrawer .rb-cover-sp { flex: 1 1 0; width: 100%; min-height: 0; }
    body.rb-printing #bossReportDrawer .rb-cover-top { width: 100%; display: flex; flex-direction: column; align-items: center; }
    body.rb-printing #bossReportDrawer .rb-cover-band { display: none; }
    body.rb-printing #bossReportDrawer .rb-cover-logo { height: 96px; width: auto; max-width: 320px; object-fit: contain; margin-top: 72px; }
    body.rb-printing #bossReportDrawer .rb-cover-mid { width: 100%; }
    body.rb-printing #bossReportDrawer .rb-cover-t { font-size: 42px; font-weight: 800; letter-spacing: 3px; color: #111; margin: 0 0 18px; }
    body.rb-printing #bossReportDrawer .rb-cover-company { font-size: 19px; font-weight: 700; color: #222; margin-bottom: 8px; }
    body.rb-printing #bossReportDrawer .rb-cover-rule { width: 130px; height: 3px; background: var(--rb-accent); margin: 26px auto; }
    body.rb-printing #bossReportDrawer .rb-cover-meta { display: flex; gap: 26px; justify-content: center; font-size: 12.5px; color: #333; }
    body.rb-printing #bossReportDrawer .rb-cover-nav { width: 100%; max-width: 560px; border-top: 1px solid #bbb; border-bottom: 1px solid #bbb; padding: 20px 6px; text-align: left; }
    body.rb-printing #bossReportDrawer .rb-cover-nav-t { font-size: 11.5px; font-weight: 700; color: #333; margin-bottom: 10px; }
    body.rb-printing #bossReportDrawer .rb-cover-nav-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 7px 24px; font-size: 11px; color: #444; }
    body.rb-printing #bossReportDrawer .rb-cover-nav-l { display: flex; justify-content: space-between; border-bottom: 1px dotted #ccc; padding: 3px 0; }
    body.rb-printing #bossReportDrawer .rb-cover-foot { width: 100%; padding-top: 16px; border-top: 1px solid #bbb; font-size: 11px; color: #555; }
    /* ---- 单色（灰度 + 纯黑白双兼容）：语义变量按明度分层重定义 ---- */
    body.rb-printing.rb-print-mono #bossReportDrawer {
      --rb-ink: #000000; --rb-ink2: #1a1a1a; --rb-ink3: #333333;
      --rb-line: #6b6b6b; --rb-card: #ffffff; --rb-card2: #ffffff;
      --rb-good: #808080; --rb-warn: #c9c9c9; --rb-warn-ink: #000000; --rb-bad: #000000;
      --rb-muted: #8a8a8a; --rb-accent: #444444;
      --rb-c1: #262626; --rb-c2: #5c5c5c; --rb-c3: #949494; --rb-c4: #cfcfcf;
      --rb-up-ink: #000000; --rb-dn-ink: #000000;
      /* 单色文字色令牌：good 的中灰 #808080 作正文仅 3.95:1 → 压到 #4d4d4d(≈8.5:1)；
         danger 直接纯黑。注意 --rb-good 保持 #808080 不变（它是灰度阶梯的填充档位）。 */
      --rb-good-ink: #4d4d4d; --rb-bad-ink: #000000;
      --txt: #000000; --txt2: #1a1a1a; --txt3: #333333;
    }
    /* 卡片 / 区块：无底色也能成形——1px 实线边框 */
    body.rb-printing #bossReportDrawer .rb-card,
    body.rb-printing #bossReportDrawer .rb-block,
    body.rb-printing #bossReportDrawer .rb-act,
    body.rb-printing #bossReportDrawer .rb-act3,
    body.rb-printing #bossReportDrawer .rb-dimlist li,
    body.rb-printing #bossReportDrawer .rb-legstat,
    body.rb-printing #bossReportDrawer .rb-bignum { border: 1px solid #333 !important; background: #fff !important; }
    body.rb-printing #bossReportDrawer .rb-doc-hd { border-bottom: 2px solid #333 !important; }
    /* 上面 .rb-card/.rb-block/.rb-act/.rb-act3/.rb-dimlist li 的 1px 实线边框用 border 简写，
       会把原本的「语义左条」一并冲成 1px #333 —— 这里在彩色打印域内按风险等级复原左条，
       使「彩色打印 → 红/黄/绿仍可辨」，并保留「实线 / 虚线」这层非颜色冗余（即使彩色机也兼容色弱）。
       单色分支（下方 .rb-print-mono）特异性更高，会用灰阶明度再覆盖一次。 */
    body.rb-printing #bossReportDrawer .rb-dimlist li,
    body.rb-printing #bossReportDrawer .rb-act,
    body.rb-printing #bossReportDrawer .rb-act3 { border-left: 3px solid var(--rb-muted) !important; }
    body.rb-printing #bossReportDrawer .rb-dimlist li.is-good,
    body.rb-printing #bossReportDrawer .rb-act.is-good,
    body.rb-printing #bossReportDrawer .rb-act3.is-good { border-left: 4px solid var(--rb-good) !important; }
    body.rb-printing #bossReportDrawer .rb-dimlist li.is-warn,
    body.rb-printing #bossReportDrawer .rb-act.is-warn,
    body.rb-printing #bossReportDrawer .rb-act.is-warning,
    body.rb-printing #bossReportDrawer .rb-act3.is-warn,
    body.rb-printing #bossReportDrawer .rb-act3.is-warning { border-left: 4px dashed var(--rb-warn) !important; }
    body.rb-printing #bossReportDrawer .rb-dimlist li.is-danger,
    body.rb-printing #bossReportDrawer .rb-act.is-danger,
    body.rb-printing #bossReportDrawer .rb-act3.is-danger { border-left: 6px solid var(--rb-bad) !important; }
    /* 章节序号徽标：描边 + 透明底 + 深色字（原为实心底 + 白字，背景不打印会白字白底） */
    body.rb-printing #bossReportDrawer .rb-no {
      background: #fff !important; color: #111 !important; border: 1.5px solid var(--rb-accent) !important;
    }
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-no { border-color: #000 !important; }
    /* 表头：不靠底色，改上下双线 + 加粗 */
    body.rb-printing #bossReportDrawer .rb-tbl th {
      background: #fff !important; color: #000 !important; font-weight: 800 !important;
      border-top: 2px solid #000 !important; border-bottom: 2px solid #000 !important;
    }
    body.rb-printing #bossReportDrawer .rb-tbl td { border: 1px solid #777 !important; }
    /* 进度 / 分区条：背景不打印 → 用边框画出可见条（保留原有语义色） */
    body.rb-printing #bossReportDrawer .rb-scale-track { border: 1px solid #999 !important; }
    body.rb-printing #bossReportDrawer .rb-scale-fill { background: #fff !important; border-top: 14px solid var(--rb-c1) !important; height: 0 !important; }
    body.rb-printing #bossReportDrawer .rb-scale-fill.is-c2 { border-top-color: var(--rb-c2) !important; }
    body.rb-printing #bossReportDrawer .rb-scale-fill.is-c3 { border-top-color: var(--rb-c3) !important; }
    body.rb-printing #bossReportDrawer .rb-scale-fill.is-c4 { border-top-color: var(--rb-c4) !important; }
    body.rb-printing #bossReportDrawer .rb-hundred-stack { border: 1px solid #999 !important; }
    body.rb-printing #bossReportDrawer .rb-hundred-stack span { background: #fff !important; border-top: 16px solid currentColor !important; height: 0 !important; }
    body.rb-printing #bossReportDrawer .rb-hundred-dot { border: 1px solid #333 !important; }
    body.rb-printing #bossReportDrawer .rb-runway-track { border: 1px solid #999 !important; overflow: visible !important; }
    /* 当前值气泡：打印态上移到轨道上方（.rb-runway 预留的 26px padding 正是为此），
       让下方轨道的「位置游标(needle)」不再被气泡遮住，气泡也不再压住游标与分区色。 */
    body.rb-printing #bossReportDrawer .rb-runway-bubble { top: auto !important; bottom: calc(100% + 3px) !important; }
    body.rb-printing #bossReportDrawer .rb-runway-seg { background: #fff !important; border-top: 18px solid currentColor !important; height: 0 !important; opacity: 1 !important; }
    body.rb-printing #bossReportDrawer .rb-runway-seg.is-danger { color: var(--rb-bad) !important; }
    body.rb-printing #bossReportDrawer .rb-runway-seg.is-warn { color: var(--rb-warn) !important; }
    body.rb-printing #bossReportDrawer .rb-runway-seg.is-good { color: var(--rb-good) !important; }
    body.rb-printing #bossReportDrawer .rb-runway-fill {
      /* 不再铺不透明色块（原实现 width=pos% 会盖住其下方 0–pos% 的危险/警戒分区，
         实测只剩两段可见）。改为「零宽 + 右描边」：右描边恰好落在盒子右缘 = 当前值位置，
         成为一根位置游标(needle)，分区条得以完整露出。 */
      background: none !important; opacity: 1 !important; border-radius: 0 !important;
      border-top: 0 !important; height: 18px !important; box-sizing: border-box !important;
      border-right: 3px solid #000 !important;
    }
    /* 游标右侧补一根白色对照描边：纯黑游标落在 danger(纯黑档) 上时仍能看出位置。
       注意：绝对定位子元素的 left/right 百分比基准是「填充盒」(不含父元素 border)，
       父元素右侧有 3px 边框，故用 calc(100% + 3px) 把白线精确贴到黑线右缘之后。 */
    body.rb-printing #bossReportDrawer .rb-runway-fill::after {
      content: "" !important; position: absolute; top: 0; left: calc(100% + 3px);
      width: 0; height: 18px; border-left: 3px solid #fff !important;
    }
    /* 白字实心底的小徽标：打印改描边 + 深字 */
    body.rb-printing #bossReportDrawer .rb-runway-bubble { background: #fff !important; color: #000 !important; border: 1px solid #000 !important; }
    body.rb-printing #bossReportDrawer .rb-act-n,
    body.rb-printing #bossReportDrawer .rb-dimflag { background: #fff !important; color: #000 !important; border: 1px solid #000 !important; }
    /* ---- 第 7 章「风险」台账的打印适配（2026-09-13 新增）----
       等级徽标屏幕态是「实心底 + 白字」，白纸打印会白字白底不可读 → 改「描边 + 深字」；
       非颜色冗余：红=粗实线、黄=虚线、绿=细实线、灰=点线，配合徽标文字（红/黄/绿/待补）
       构成双通道，黑白激光与针式打印机也能分清等级。 */
    body.rb-printing #bossReportDrawer .rb-risk-lv {
      background: #fff !important; color: #000 !important; border: 2px solid #000 !important;
    }
    body.rb-printing #bossReportDrawer .rb-risk-chip {
      background: #fff !important; border: 1px solid #333 !important;
    }
    body.rb-printing #bossReportDrawer .rb-risk-chip.is-danger { border-left: 6px solid var(--rb-bad) !important; }
    body.rb-printing #bossReportDrawer .rb-risk-chip.is-warn { border-left: 4px dashed var(--rb-warn) !important; }
    body.rb-printing #bossReportDrawer .rb-risk-chip.is-good { border-left: 3px solid var(--rb-good) !important; }
    body.rb-printing #bossReportDrawer .rb-risk-chip.is-muted { border-left: 3px dotted var(--rb-muted) !important; }
    body.rb-printing #bossReportDrawer .rb-risk-chip i { border: 1px solid #000 !important; }
    /* 清单表列宽：718px 可印宽下 6 列必须收窄，否则读数列被挤到换行 */
    body.rb-printing #bossReportDrawer .rb-risk-c-lv { width: 38px !important; }
    body.rb-printing #bossReportDrawer .rb-risk-tbl td,
    body.rb-printing #bossReportDrawer .rb-risk-tbl th { padding: 4px 6px !important; }
    body.rb-printing #bossReportDrawer .rb-risk-tbl th:nth-child(2) { width: 132px !important; }
    body.rb-printing #bossReportDrawer .rb-risk-tbl th:nth-child(4) { width: 104px !important; }
    body.rb-printing #bossReportDrawer .rb-risk-tbl th:nth-child(5) { width: 84px !important; }
    body.rb-printing #bossReportDrawer .rb-risk-tbl th:nth-child(6) { width: 46px !important; }
    /* 新块纳入「原子块不拆」清单，避免灯带 / 清单行被拦腰截断 */
    body.rb-printing #bossReportDrawer .rb-risk-band,
    body.rb-printing #bossReportDrawer .rb-risk-chip,
    body.rb-printing #bossReportDrawer .rb-risk-tbl { break-inside: avoid !important; page-break-inside: avoid !important; }
    body.rb-printing #bossReportDrawer .rb-risk-band { gap: 5px !important; margin: 8px 0 !important; }
    /* 单色分支：徽标与灯点按「明度 + 线型 + 形状」三重区分 */
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-risk-lv.is-danger { border-style: solid !important; border-width: 3px !important; }
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-risk-lv.is-warn { border-style: dashed !important; }
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-risk-chip.is-danger i { background: var(--rb-bad) !important; border-radius: 0 !important; }
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-risk-chip.is-warn i { background: var(--rb-warn) !important; border-radius: 0 !important; }
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-risk-chip.is-good i { background: var(--rb-good) !important; }
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-risk-chip.is-muted i { background: #fff !important; border-style: dotted !important; }
    /* 告警块：粗左条 + 加粗（左条色随分支：彩色=深红，单色=纯黑，均由 --rb-bad-ink 驱动） */
    body.rb-printing #bossReportDrawer .rb-tip.rb-tip-danger { border-left: 5px solid var(--rb-bad-ink, #b91c1c) !important; background: #fff !important; font-weight: 700 !important; }
    body.rb-printing #bossReportDrawer .rb-tip { border-left-width: 3px !important; border-left-color: #666 !important; background: #fff !important; }
    body.rb-printing #bossReportDrawer .rb-ok,
    body.rb-printing #bossReportDrawer .rb-warn { background: #fff !important; border: 1px dashed #333 !important; }
    /* 单色：风险色条 = 「明度分层（good 中灰 / warn 浅灰 / danger 纯黑）+ 线型·粗细」双通道 */
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-dimlist li { border-left: 2px solid var(--rb-good) !important; }
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-dimlist li.is-warn { border-left: 3px dashed var(--rb-warn) !important; }
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-dimlist li.is-danger { border-left: 5px solid var(--rb-bad) !important; }
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-act,
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-act3 { border-left: 2px solid var(--rb-good) !important; }
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-act.is-warning,
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-act3.is-warning { border-left: 3px dashed var(--rb-warn) !important; }
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-act.is-danger,
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-act3.is-danger { border-left: 5px solid var(--rb-bad) !important; }
    /* 单色：风险灯点用「明度分层 + 形状」双重区分（圆 / 方 / 实心方） */
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-light i { border: 1px solid #000 !important; }
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-light.is-good i { background: var(--rb-good) !important; border-radius: 50% !important; }
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-light.is-warn i { background: var(--rb-warn) !important; border-radius: 0 !important; }
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-light.is-danger i { background: var(--rb-bad) !important; border-radius: 0 !important; }
    /* 单色：LOGO 位图转灰度并略提对比 */
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-logo,
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-print-hd-logo,
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-cover-logo { filter: grayscale(1) contrast(1.1); }
    /* 单色：多系列 SVG 柱改「灰阶 + 图案」，同图内各系列可区分 */
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-legs-bar.is-c1 { fill: #262626 !important; }
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-legs-bar.is-c2 { fill: url(#rbPatDiag) !important; }
    body.rb-printing.rb-print-mono #bossReportDrawer .rb-legs-bar.is-c3 { fill: #cfcfcf !important; stroke: #000 !important; stroke-width: 1 !important; }

    /* 打印设置面板（挂 body 下，层级介于抽屉 216 与控制菜单 500 之间） */
    .rb-print-pmask { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.45); z-index: 250; display: none; }
    .rb-print-pmask.on { display: block; }
    .rb-print-panel {
      position: fixed; z-index: 260; left: 50%; top: 50%; transform: translate(-50%, -50%);
      width: 360px; max-width: calc(100vw - 40px); box-sizing: border-box;
      background: linear-gradient(180deg, var(--dw-bg-1), var(--dw-bg-2));
      color: var(--txt); border: 1px solid var(--line2); border-radius: 14px;
      box-shadow: 0 18px 50px rgba(0, 0, 0, 0.5); padding: 18px 18px 16px; display: none;
    }
    .rb-print-panel.on { display: block; }
    .rb-print-pt { font-size: 15px; font-weight: 700; margin-bottom: 12px; color: var(--txt); }
    .rb-print-prow { display: flex; align-items: center; gap: 10px; padding: 7px 0; border-bottom: 1px solid var(--line); font-size: 13px; }
    .rb-print-pk { flex: 0 0 64px; color: var(--txt2); }
    .rb-print-pradios { display: flex; gap: 16px; }
    .rb-print-popt { display: inline-flex; align-items: center; gap: 6px; cursor: pointer; color: var(--txt); }
    .rb-print-popt input { accent-color: var(--primary-dark); cursor: pointer; }
    .rb-print-phint { margin: 12px 0 14px; font-size: 11.5px; line-height: 1.7; color: var(--txt3); }
    .rb-print-pact { display: flex; justify-content: flex-end; gap: 10px; }
    .rb-print-pbtn { padding: 7px 16px; border-radius: 8px; font-size: 13px; cursor: pointer; border: 1px solid var(--line2); background: transparent; color: var(--txt); }
    .rb-print-pcancel:hover { border-color: var(--cyan); }
    .rb-print-pgo { background: linear-gradient(135deg, #3b82f6, #2f6bff); border-color: transparent; color: #fff; font-weight: 700; }
    .rb-print-pgo:hover { filter: brightness(1.08); }

    @media print {
      @page { size: A4 portrait; margin: 12mm 10mm 16mm; }
      body.rb-printing { background: #fff !important; }
    }


    /* ==========================================================================
     * 预算达成 .bud-* 命名空间（2026-09-11 UI/UX 优化 P0-1/P0-2/P0-3 + P1 + P2 落地）
     * 入口：右上「操作」菜单 → 📊 预算达成（showBudgetAchievement）。
     * 全部走顶部 --bud-* 双主题令牌，渲染层禁止再写内联硬编码色；
     * 本段不覆盖 .dw-* / .aa-* / .odi-* / .dim-* / .dup-* / .de-* / .rb-* 任何既有类。
     * 改造前实测：本页渲染层 100% 内联样式（264 处 style、var(-- 出现 0 次）、
     * 浅色主题 176 个文本样本 168 个不达标（95.5%，最低 1.10:1）。
     * ========================================================================== */
    .bud-root { color: var(--bud-ink-2); }
    .bud-wrap { padding: 0 clamp(8px, 1.6vw, 26px) 30px; }

    /* ── P0-2 吸顶风险条 ────────────────────────────────────────────────────
       全页唯一的「结论 + 状态灯 + 操作」常驻位。文案按 20 字预算写（净宽约 1183px），
       长说明一律下沉 title —— 实测一条 43 字长句会把后面的元素挤到下一行、条高 148→203px。 */
    .bud-sticky {
      position: sticky; top: 0; z-index: 6;
      display: flex; align-items: center; gap: 8px 10px; flex-wrap: wrap;
      padding: 9px clamp(8px, 1.6vw, 26px);
      margin: 0 0 12px;
      background: var(--bud-sticky-bg);
      -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
      border-bottom: 1px solid var(--bud-sticky-line);
      box-shadow: 0 8px 16px -14px rgba(8, 18, 36, .7);
    }
    /* ★ sticky 不可越出父级内容盒，父级 padding 下推多少、条上方就露多宽的缝。
       用 :has() 按「页面上是否存在预算吸顶条」作用域化，随内容自动生效/失效、零泄漏。 */
    html:has(#dwBody .bud-sticky) #dwBody { padding-top: 0; }
    .bud-sy { font-size: var(--bud-fs-3); font-weight: 700; color: var(--bud-ink); }
    .bud-chip {
      display: inline-flex; align-items: center; gap: 4px; white-space: nowrap;
      padding: 2px 9px; border-radius: 20px; font-size: var(--bud-fs-1); line-height: 1.6;
      border: 1px solid var(--bud-line-2); background: var(--bud-bg-soft); color: var(--bud-mut);
      font-variant-numeric: tabular-nums;
    }
    .bud-chip-blue { color: var(--bud-norm-ink); border-color: var(--bud-norm-bar); background: transparent; }
    .bud-chip-ok   { color: var(--bud-ok-ink);   border-color: var(--bud-ok-bar);   background: transparent; }
    .bud-chip-warn { color: var(--bud-warn-ink); border-color: var(--bud-warn-bar); background: transparent; }
    .bud-chip-bad  { color: var(--bud-bad-ink);  border-color: var(--bud-bad-bar);  background: transparent; }
    .bud-lamps { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
    .bud-lamp { display: inline-flex; align-items: center; gap: 5px; font-size: var(--bud-fs-1); color: var(--bud-mut); white-space: nowrap; }
    .bud-lamp i { width: 7px; height: 7px; border-radius: 50%; display: inline-block; flex: 0 0 auto; }
    .bud-lamp-ok i   { background: var(--bud-ok-bar); }
    .bud-lamp-norm i { background: var(--bud-norm-bar); }
    .bud-lamp-warn i { background: var(--bud-warn-bar); }
    .bud-lamp-bad i  { background: var(--bud-bad-bar); }
    .bud-lamp b { color: var(--bud-ink); font-variant-numeric: tabular-nums; }
    .bud-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-left: auto; }
    .bud-btn {
      display: inline-flex; align-items: center; justify-content: center; gap: 4px;
      min-height: var(--bud-touch); padding: 4px 12px; cursor: pointer;
      border-radius: 6px; border: 1px solid var(--bud-line-2); background: var(--bud-bg-soft);
      color: var(--bud-ink-2); font-size: var(--bud-fs-1); font-family: inherit; line-height: 1.5;
      transition: color .15s, border-color .15s, background .15s;
    }
    .bud-btn:hover { color: var(--bud-ink); border-color: var(--bud-norm-bar); }
    .bud-btn:focus-visible { outline: 2px solid var(--bud-focus); outline-offset: 2px; }
    .bud-btn-primary { border-color: var(--bud-norm-bar); background: transparent; color: var(--bud-norm-ink); }

    /* ── P0-2 三 Tab 信息架构 ──────────────────────────────────────────────── */
    .bud-tabs {
      display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
      margin: 0 0 12px;
    }
    .bud-tab {
      padding: 6px 18px; border-radius: 8px; cursor: pointer; line-height: 1.5;
      min-height: var(--bud-touch);
      border: 1px solid var(--bud-line-2); background: var(--bud-bg-soft); color: var(--bud-ink-2);
      font-size: var(--bud-fs-3); font-family: inherit;
      transition: color .15s, border-color .15s, background .15s;
    }
    .bud-tab:hover { border-color: var(--bud-norm-bar); }
    .bud-tab:focus-visible { outline: 2px solid var(--bud-focus); outline-offset: 2px; }
    .bud-tab[aria-selected="true"] {
      border-color: var(--bud-norm-bar); color: var(--bud-norm-ink); font-weight: 600;
    }
    .bud-tab-n {
      margin-left: 6px; font-size: var(--bud-fs-1); color: var(--bud-mut);
      font-variant-numeric: tabular-nums;
    }
    .bud-tab-panel { scroll-margin-top: 120px; }
    .bud-tab-panel[hidden] { display: none; }

    /* ── 区块卡 ───────────────────────────────────────────────────────────── */
    .bud-sec { margin-bottom: 12px; }
    .bud-card {
      background: var(--bud-bg); border: 1px solid var(--bud-line);
      border-radius: 10px; padding: 13px 16px; margin-bottom: 12px;
    }
    .bud-card-hd {
      display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
      min-width: 0; margin-bottom: 8px;
    }
    .bud-card-ttl { font-size: var(--bud-fs-3); font-weight: 600; color: var(--bud-ink-2); }
    .bud-card-note { margin-left: auto; font-size: var(--bud-fs-1); color: var(--bud-mut); }

    /* ── 结论 / 预警条（结论前置） ─────────────────────────────────────────── */
    .bud-alert {
      display: flex; align-items: flex-start; gap: 8px; flex-wrap: wrap;
      border-radius: 8px; padding: 10px 14px; margin-bottom: 12px;
      font-size: var(--bud-fs-2); line-height: 1.7;
      border: 1px solid var(--bud-line-2); background: var(--bud-bg-soft); color: var(--bud-ink-2);
    }
    .bud-alert b { font-variant-numeric: tabular-nums; }
    .bud-alert-bad  { border-color: var(--bud-bad-bar);  color: var(--bud-bad-ink); }
    .bud-alert-warn { border-color: var(--bud-warn-bar); color: var(--bud-warn-ink); }
    .bud-alert-ok   { border-color: var(--bud-ok-bar);   color: var(--bud-ok-ink); }

    /* ── KPI 4 卡（深底渐变，两主题共用） ─────────────────────────────────── */
    .bud-kpi-grid {
      display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));
      gap: 12px; margin-bottom: 14px;
    }
    .bud-kpi {
      position: relative; overflow: hidden; min-width: 0;
      border-radius: 10px; padding: 12px 14px;
      border: 1px solid var(--bud-kpi-line);
      background: linear-gradient(160deg, var(--bud-kpi-bg-1), var(--bud-kpi-bg-2));
    }
    .bud-kpi-t { font-size: var(--bud-fs-1); color: var(--bud-kpi-ink); letter-spacing: .5px; }
    .bud-kpi-v {
      font-size: var(--bud-fs-6); font-weight: 700; line-height: 1.25;
      margin: 4px 0 2px; font-variant-numeric: tabular-nums;
    }
    .bud-kpi-s { font-size: var(--bud-fs-1); margin-bottom: 6px; }
    .bud-kpi-h {
      font-size: var(--bud-fs-1); color: var(--bud-kpi-ink); line-height: 1.65;
      display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
    }
    .bud-kpi-h[title]:hover { color: var(--bud-ink-2); }
    .bud-kpi[data-status="good"]   { border-color: var(--bud-ok-bar); }
    .bud-kpi[data-status="warn"]   { border-color: var(--bud-warn-bar); }
    .bud-kpi[data-status="danger"] { border-color: var(--bud-bad-bar); }
    .bud-kpi-v[data-status="good"],   .bud-kpi-s[data-status="good"]   { color: var(--bud-kpi-ok); }
    .bud-kpi-v[data-status="normal"], .bud-kpi-s[data-status="normal"] { color: var(--bud-kpi-norm); }
    .bud-kpi-v[data-status="warn"],   .bud-kpi-s[data-status="warn"]   { color: var(--bud-kpi-warn); }
    .bud-kpi-v[data-status="danger"], .bud-kpi-s[data-status="danger"] { color: var(--bud-kpi-bad); }
    .bud-kpi-v[data-status="nodata"], .bud-kpi-s[data-status="nodata"],
    .bud-kpi-v[data-status="none"],   .bud-kpi-s[data-status="none"]   { color: var(--bud-kpi-ink); }

    /* ── 表格（P1-4 / P1-5 / P1-7） ───────────────────────────────────────── */
    .bud-scroll-x { overflow-x: auto; -webkit-overflow-scrolling: touch; }
    .bud-tbl {
      width: 100%; border-collapse: separate; border-spacing: 0;
      table-layout: fixed; font-variant-numeric: tabular-nums;
    }
    .bud-tbl th, .bud-tbl td {
      padding: 6px 8px; font-size: var(--bud-fs-2); font-weight: 400;
      text-align: left; vertical-align: middle;
      box-shadow: inset 0 -1px 0 var(--bud-line-3);
    }
    .bud-tbl thead th {
      position: sticky; top: 0; z-index: 3;
      font-size: var(--bud-fs-1); font-weight: 500; color: var(--bud-mut);
      background: var(--bud-th-bg); white-space: nowrap;
    }
    .bud-tbl tbody th[scope="row"], .bud-tbl tfoot th {
      position: sticky; left: 0; z-index: 2;
      background: var(--bud-th-bg); color: var(--bud-ink-2);
      white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    }
    .bud-tbl thead th:first-child { z-index: 4; }
    .bud-tbl tfoot td, .bud-tbl tfoot th {
      font-weight: 600; color: var(--bud-ink);
      box-shadow: inset 0 1px 0 var(--bud-line-2);
    }
    .bud-num { text-align: right; }
    .bud-zero { color: var(--bud-faint); }
    .bud-subj { color: var(--bud-ink-2); }
    .bud-sort {
      display: inline-flex; align-items: center; gap: 4px;
      background: none; border: 0; padding: 2px 0; cursor: pointer;
      color: inherit; font: inherit; line-height: 1.5;
    }
    .bud-sort:hover { color: var(--bud-ink-2); }
    .bud-sort:focus-visible { outline: 2px solid var(--bud-focus); outline-offset: 2px; border-radius: 3px; }
    .bud-sort::after { content: '⇅'; color: var(--bud-faint); font-size: var(--bud-fs-1); }
    .bud-sort[aria-sort="ascending"]::after  { content: '▲'; color: var(--bud-norm-ink); }
    .bud-sort[aria-sort="descending"]::after { content: '▼'; color: var(--bud-norm-ink); }

    /* ── 状态徽标 / 迷你进度条 ────────────────────────────────────────────── */
    .bud-pill {
      display: inline-block; white-space: nowrap; border-radius: 10px; padding: 1px 8px;
      font-size: var(--bud-fs-1); line-height: 1.6;
      border: 1px solid var(--bud-line-2); color: var(--bud-mut);
    }
    .bud-pill[data-status="good"]   { color: var(--bud-ok-ink);   border-color: var(--bud-ok-bar); }
    .bud-pill[data-status="normal"] { color: var(--bud-norm-ink); border-color: var(--bud-norm-bar); }
    .bud-pill[data-status="warn"]   { color: var(--bud-warn-ink); border-color: var(--bud-warn-bar); }
    .bud-pill[data-status="danger"] { color: var(--bud-bad-ink);  border-color: var(--bud-bad-bar); }
    .bud-pill[data-status="nodata"], .bud-pill[data-status="none"] { color: var(--bud-faint); }
    .bud-bar {
      position: relative; height: 7px; border-radius: 4px; overflow: hidden;
      background: var(--bud-track); min-width: 40px;
    }
    .bud-bar > i { display: block; height: 100%; border-radius: 4px; background: var(--bud-norm-bar); }
    .bud-bar[data-status="good"] > i   { background: var(--bud-ok-bar); }
    .bud-bar[data-status="normal"] > i { background: var(--bud-norm-bar); }
    .bud-bar[data-status="warn"] > i   { background: var(--bud-warn-bar); }
    .bud-bar[data-status="danger"] > i { background: var(--bud-bad-bar); }
    .bud-bar[data-status="nodata"] > i, .bud-bar[data-status="none"] > i { background: var(--bud-faint); }
    .bud-cell-bar { display: flex; align-items: center; gap: 7px; min-width: 0; }
    .bud-cell-bar .bud-bar { flex: 1 1 auto; }
    .bud-cell-bar span { flex: 0 0 auto; font-size: var(--bud-fs-2); }

    /* ── 迁移：逐月图科目 chip 切换（P0-2 单图替代 7 图堆叠） ──────────────── */
    .bud-chips { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: 10px; }
    .bud-chip-sub {
      padding: 4px 12px; min-height: var(--bud-touch); border-radius: 6px; cursor: pointer;
      border: 1px solid var(--bud-line-2); background: var(--bud-bg-soft); color: var(--bud-ink-2);
      font-size: var(--bud-fs-2); font-family: inherit; line-height: 1.5;
      transition: color .15s, border-color .15s, background .15s;
    }
    .bud-chip-sub:hover { border-color: var(--bud-norm-bar); color: var(--bud-ink); }
    .bud-chip-sub:focus-visible { outline: 2px solid var(--bud-focus); outline-offset: 2px; }
    .bud-chip-sub.on { border-color: var(--bud-norm-bar); color: var(--bud-norm-ink); font-weight: 600; }
    .bud-pane[hidden] { display: none; }
    .bud-figure { width: 100%; height: 370px; min-width: 0; }   /* P1-6：主图 60% ≈222px + 偏差格 13% ≈48px + 间距 40px */
    .bud-fc-txt { font-size: var(--bud-fs-2); line-height: 1.8; margin-top: 4px; }

    /* ── 折叠（口径说明） ─────────────────────────────────────────────────── */
    .bud-details { border-top: 1px solid var(--bud-line-4); margin-top: 14px; }
    .bud-details-sum {
      cursor: pointer; padding: 11px 2px 9px; list-style: none;
      font-size: var(--bud-fs-2); font-weight: 600; color: var(--bud-ink-2);
    }
    .bud-details-sum::-webkit-details-marker { display: none; }
    .bud-details-sum::before { content: '▸ '; color: var(--bud-faint); }
    .bud-details[open] > .bud-details-sum::before { content: '▾ '; }
    .bud-details-sum:focus-visible { outline: 2px solid var(--bud-focus); outline-offset: 2px; }
    .bud-details-hint { font-size: var(--bud-fs-1); font-weight: 400; color: var(--bud-mut); margin-left: 8px; }
    .bud-details-body {
      font-size: var(--bud-fs-2); line-height: 1.9; color: var(--bud-mut);
      padding: 4px 2px 14px;
    }
    .bud-details-body b { color: var(--bud-ink-3); }

    /* ── 空态（P2-5 规范化：完整交互态 + 折叠口径） ───────────────────────── */
    .bud-empty { padding: 72px 0 40px; text-align: center; }
    .bud-empty-ico { font-size: 44px; line-height: 1.2; margin-bottom: 14px; }
    .bud-empty-ttl { font-size: var(--bud-fs-4); font-weight: 600; color: var(--bud-ink-3); margin-bottom: 6px; }
    .bud-empty-txt { font-size: var(--bud-fs-2); color: var(--bud-mut); margin-bottom: 22px; }
    .bud-empty-btn {
      display: inline-flex; align-items: center; justify-content: center;
      min-height: 40px; padding: 10px 24px; border-radius: 8px; cursor: pointer;
      border: 1px solid var(--bud-norm-bar); background: var(--bud-bg-soft);
      color: var(--bud-norm-ink); font-size: var(--bud-fs-3); font-family: inherit;
      transition: color .15s, border-color .15s, background .15s;
    }
    .bud-empty-btn:hover { color: var(--bud-ink); border-color: var(--bud-norm-ink); }
    .bud-empty-btn:focus-visible { outline: 2px solid var(--bud-focus); outline-offset: 2px; }

    /* ── 无障碍：视觉隐藏标题（供读屏，不占版面） ─────────────────────────── */
    .bud-sr-only {
      position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
      overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
    }

    /* ── 响应式（P0-3）：1100 / 720 两级断点 ──────────────────────────────── */
    @media (max-width: 1100px) {
      .bud-kpi-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
      .bud-card { padding: 11px 12px; }
      .bud-sticky { gap: 6px 8px; padding: 8px clamp(8px, 1.6vw, 26px); }
      .bud-actions { margin-left: 0; }
      .bud-figure { height: 330px; }
    }
    @media (max-width: 720px) {
      .bud-kpi-grid { grid-template-columns: minmax(0, 1fr); }
      .bud-tab { flex: 1 1 auto; justify-content: center; }
      .bud-card-note { margin-left: 0; }
      .bud-figure { height: 290px; }
      .bud-kpi-h { -webkit-line-clamp: 2; }
    }

    /* ── 动效降级 ─────────────────────────────────────────────────────────── */
    @media (prefers-reduced-motion: reduce) {
      .bud-btn, .bud-tab, .bud-chip-sub, .bud-empty-btn { transition: none; }
    }

    /* ── 打印（P1-1 budgetPrintPage）：展开全部 Tab 面板，A4 浅色 ────────────
       ⚠ 抽屉模板内 `<details class="bud-details" …>` 的展开**必须**靠打印前纯字符串
       替换补 `open` 属性（Chromium 下 closed <details> 的子元素设 display:block 不生效）。 */
    @media print {
      @page { size: A4 portrait; margin: 12mm 10mm 16mm; }
      body.bud-printing .bud-tab-panel,
      body.bud-printing .bud-tab-panel[hidden],
      body.bud-printing .bud-tab-panel.on { display: block !important; }
      body.bud-printing .bud-pane,
      body.bud-printing .bud-pane[hidden] { display: block !important; }
      body.bud-printing .bud-sticky { position: static; box-shadow: none; }
      body.bud-printing .bud-scroll-x { overflow: visible !important; }
    }
    body.bud-printing > *:not(#drawer) { display: none !important; }
    body.bud-printing #drawer {
      position: static !important; width: auto !important; max-width: none !important;
      height: auto !important; max-height: none !important;
      background: #fff !important; box-shadow: none !important; border: 0 !important;
    }
    body.bud-printing #drawer #dwBody {
      overflow: visible !important; max-height: none !important; height: auto !important;
      padding: 0 !important; display: block !important;
    }
    body.bud-printing .bud-card,
    body.bud-printing .bud-kpi { break-inside: avoid; }

    /* ── 预算达成 .bud-* 补充（表格宽度 / 语义字色 / 桥接因子条） ──────────────── */
    .bud-tbl-wide { min-width: 880px; }
    .bud-tbl-mid  { min-width: 720px; }
    .bud-pos { color: var(--bud-rise); }
    .bud-neg { color: var(--bud-fall); }
    .bud-em { font-weight: 700; }
    .bud-cell-note { font-size: var(--bud-fs-1); color: var(--bud-mut); }
    .bud-note-ok { color: var(--bud-rise); }
    .bud-note-warn { color: var(--bud-gold); }
    .bud-factor-bar { height: 12px; border-radius: 3px; }
    .bud-factor-bar-pos { background: var(--bud-rise); }
    .bud-factor-bar-neg { background: var(--bud-fall); }
    .bud-details-wrap { margin-top: 14px; }

    /* ==========================================================================
     * 数据录入 · 维度数据 TAB · 区域维度（T01–T05 · 2026-09-11）
     * 区域目录（结构 · 只读现算）· 来源徽章 · 添加子级候选面板 · 未分配虚拟行 ·
     * 迁移前基线折叠区 · 区域归属迁移向导。全部走 .de-dim-* 类 + --de-dim-rg-* 令牌（零内联样式）。
     * ★ 2026-09-12（诉求⑤）：新增「操作说明」按钮 + hover 浮层 —— 区域页全部说明文案的单一出口，
     *   页面上不再出现任何说明文字（列头副标题 / 类型条 / 卡片头 / 数据截至 / 三处说明折叠区已移除）。
     * ========================================================================== */
    .de-dim-help { position: relative; display: inline-flex; align-items: center; }
    .de-dim-help-btn { white-space: nowrap; }
    .de-dim-help-panel {
      display: none; position: absolute; right: 0; top: calc(100% + 6px);
      z-index: 60;
      width: 660px; max-width: min(660px, calc(100vw - 48px));
      max-height: min(58vh, 520px); overflow: auto;
      padding: 12px 14px 14px; border-radius: 10px;
      border: 1px solid var(--de-dim-rg-panel-bd);
      background: var(--de-dim-rg-panel-bg);
      box-shadow: var(--de-dim-rg-pop-shadow);
      font-size: 12px; line-height: 1.7; text-align: left; white-space: normal;
      color: var(--de-dim-rg-baseline-ink);
    }
    /* 鼠标移入 / 键盘聚焦 / 点击 toggle 三种入口均可打开（触屏与键盘可达） */
    .de-dim-help:hover .de-dim-help-panel,
    .de-dim-help:focus-within .de-dim-help-panel,
    .de-dim-help.is-open .de-dim-help-panel { display: block; }
    .de-dim-help-h {
      margin: 10px 0 4px; font-size: 11.5px; font-weight: 700; letter-spacing: 0.02em;
      color: var(--de-dim-rg-badge-ink);
    }
    .de-dim-help-h:first-child { margin-top: 0; }
    .de-dim-help-ul { margin: 0; padding-left: 18px; }
    .de-dim-help-ul li { margin: 2px 0; }
    .de-dim-help-ul code {
      padding: 0 3px; border-radius: 3px;
      background: var(--de-dim-rg-item-bg);
      border: 1px solid var(--de-dim-rg-item-bd);
    }
    .de-dim-srcbadge {
      display: inline-block; margin: 0 0 8px;
      padding: 4px 10px; border-radius: 6px;
      border: 1px solid var(--de-dim-rg-badge-bd);
      background: var(--de-dim-rg-badge-bg);
      color: var(--de-dim-rg-badge-ink);
      font-size: 11.5px; line-height: 1.6;
    }
    .de-dim-table select.dim-name,
    .de-dim-table .dim-region,
    .de-dim-table .dim-parent {
      background: var(--de-dim-rg-item-bg);
      border: 1px solid var(--de-dim-rg-item-bd);
      color: var(--de-dim-rg-item-ink);
      border-radius: 6px;
    }
    .de-dim-table select.dim-name:disabled,
    .de-dim-table .dim-parent:disabled {
      background: var(--de-dim-rg-ro-bg);
      color: var(--de-dim-rg-ro-ink);
      cursor: default;
    }
    .de-dim-ro { color: var(--de-dim-rg-ro-ink); }
    .de-dim-table input.dim-num:disabled {
      background: var(--de-dim-rg-ro-bg);
      color: var(--de-dim-rg-ro-ink);
      cursor: default;
    }
    /* 未分配虚拟行（天然不含 .dim-row 类 → 不被 dimRow 选择器/收集逻辑计入） */
    .de-dim-unassigned td {
      background: var(--de-dim-rg-unassigned-bg);
      color: var(--de-dim-rg-unassigned-ink);
      font-style: italic;
      border-top: 1px dashed var(--de-dim-rg-unassigned-bd);
    }
    .de-dim-unassigned .de-dim-tag {
      display: inline-block; margin-left: 6px; padding: 1px 6px; border-radius: 4px;
      border: 1px solid var(--de-dim-rg-unassigned-bd);
      font-size: 10.5px; font-style: normal;
    }
    /* 添加子级候选面板
       ★ 2026-09-12（诉求①）：由「文档流面板」改为**视口固定模态**（遮罩 + 居中 + 内部滚动）。
       原实现 appendChild 到 .dimension-data-tab 末尾 → 触发按钮在表格行（页面中下部），
       面板渲染在页面最底部（实测 1920×1080：按钮 top=1175 / 面板 top=1929，距视口底 849px），
       用户看不见 → 表现为「点「添加子级」没反应 / 无法添加子项」。 */
    .de-dim-candmask {
      position: fixed; inset: 0; z-index: 3400;
      background: var(--de-dim-rg-mask-bg);
    }
    .de-dim-candpanel {
      position: fixed; left: 50%; top: 50%; transform: translate(-50%, -50%);
      z-index: 3401;
      display: flex; flex-direction: column;
      width: min(720px, calc(100vw - 40px));
      max-height: min(70vh, 560px);
      border-radius: 12px; overflow: hidden;
      border: 1px solid var(--de-dim-rg-panel-bd);
      background: var(--de-dim-rg-panel-bg);
      box-shadow: var(--de-dim-rg-pop-shadow-lg);
    }
    .de-dim-candpanel-head {
      flex: none;
      padding: 9px 12px; font-size: 12px; font-weight: 700;
      color: var(--de-dim-rg-baseline-ink);
      border-bottom: 1px solid var(--de-dim-rg-panel-bd);
    }
    .de-dim-candpanel-body {
      flex: 1 1 auto; min-height: 0;
      display: flex; flex-wrap: wrap; gap: 6px; align-content: flex-start;
      padding: 10px 12px; overflow: auto;
    }
    .de-dim-cand-item {
      display: inline-flex; align-items: center; gap: 4px; cursor: pointer;
      padding: 3px 9px; border-radius: 6px; font-size: 12px;
      border: 1px solid var(--de-dim-rg-item-bd);
      background: var(--de-dim-rg-item-bg);
      color: var(--de-dim-rg-item-ink);
    }
    .de-dim-cand-item:hover { background: var(--de-dim-rg-item-hover-bg); }
    .de-dim-candpanel-foot {
      flex: none;
      display: flex; gap: 8px; justify-content: flex-end;
      padding: 9px 12px; border-top: 1px solid var(--de-dim-rg-panel-bd);
    }
    /* 迁移前基线折叠区 */
    .de-dim-baseline {
      margin: 8px 0; border-radius: 8px; padding: 8px 12px;
      border: 1px solid var(--de-dim-rg-baseline-bd);
      background: var(--de-dim-rg-baseline-bg);
      color: var(--de-dim-rg-baseline-ink);
      font-size: 12px; line-height: 1.7;
    }
    .de-dim-baseline > summary { cursor: pointer; font-weight: 600; }
    .de-dim-baseline-note { margin: 6px 0; color: var(--de-dim-rg-note-ink); font-size: 11.5px; }
    .de-dim-baseline-tbl { width: 100%; border-collapse: collapse; margin-top: 6px; font-size: 11.5px; }
    .de-dim-baseline-tbl th,
    .de-dim-baseline-tbl td {
      border-bottom: 1px solid var(--de-dim-rg-baseline-bd);
      padding: 4px 8px; text-align: left;
    }
    /* 区域归属迁移向导 */
    .de-dim-migpanel {
      margin: 10px 0; border-radius: 10px; overflow: hidden;
      border: 1px solid var(--de-dim-rg-mig-bd);
      background: var(--de-dim-rg-mig-bg);
    }
    .de-dim-migpanel-head {
      padding: 10px 12px; font-size: 12.5px; font-weight: 700;
      color: var(--de-dim-rg-mig-head-ink);
      border-bottom: 1px solid var(--de-dim-rg-mig-bd);
    }
    .de-dim-migpanel-note { padding: 8px 12px; font-size: 11.5px; line-height: 1.7; color: var(--de-dim-rg-baseline-ink); }
    .de-dim-migpanel-body { max-height: 280px; overflow: auto; padding: 0 12px 8px; }
    .de-dim-migpanel-tbl { width: 100%; border-collapse: collapse; font-size: 12px; }
    .de-dim-migpanel-tbl th,
    .de-dim-migpanel-tbl td { padding: 5px 8px; text-align: left; border-bottom: 1px solid var(--de-dim-rg-panel-bd); }
    .de-dim-migpanel-tbl select { min-width: 96px; }
    .de-dim-migpanel-foot {
      display: flex; gap: 8px; justify-content: flex-end;
      padding: 10px 12px; border-top: 1px solid var(--de-dim-rg-mig-bd);
    }
    /* E8 · R3 收尾：区域 L2 省级候选「已被其它大区使用」提示（省级名按名称唯一定位 → 置灰 + 说明） */
    .de-dim-cand-item.is-taken {
      cursor: not-allowed; opacity: 0.72;
      border-style: dashed;
    }
    .de-dim-cand-item.is-taken .de-dim-cand-taken { color: var(--de-dim-rg-note-ink); }
    .de-dim-table select.dim-name option:disabled { color: var(--de-dim-rg-ro-ink); }

    /* ==========================================================================
     * 数据录入 · 维度数据 TAB · 区域维度（批次② T06/T08/T09/T10 · 2026-09-11）
     * 客户一级/二级双下拉 · 覆盖率提示条（橙/绿双态）· 空态一键预置 · 未归属/待改派面板 ·
     * 预置二次确认面板。全部走 .de-* 类 + --de-dim-* 令牌（零内联样式）。
     * ========================================================================== */
    /* ★ 2026-09-12：区域下拉框样式统一，增强视觉辨识度 */
    .de-dim-table select.dim-region-l1,
    .de-dim-table select.dim-region-l2 {
      height: var(--de-cell-h);
      padding: 0 8px;
      box-sizing: border-box;
      background: var(--input-bg);
      border: 1.5px solid var(--de-dim-rg-accent-bd);
      color: var(--de-dim-ink-2);
      border-radius: 6px;
      font-size: 12px;
      font-family: inherit;
      transition: all 0.2s ease;
    }
    .de-dim-table select.dim-region-l1:hover,
    .de-dim-table select.dim-region-l2:hover {
      border-color: var(--de-dim-rg-accent-bd-hi);
    }
    .de-dim-table select.dim-region-l1:focus,
    .de-dim-table select.dim-region-l2:focus {
      outline: none;
      border-color: var(--input-focus-border);
      box-shadow: var(--input-focus-shadow);
    }
    .de-dim-table select.dim-region-l1 { margin-right: 4px; }
    .de-dim-table select.dim-region-l2:disabled {
      background: var(--de-dim-rg-ro-bg);
      color: var(--de-dim-rg-ro-ink);
      cursor: default;
    }
    /* 覆盖率提示条（橙 / 绿双态） */
    .de-dim-coverage {
      display: block; margin: 0 0 8px; padding: 8px 12px; border-radius: 8px;
      font-size: 12.5px; line-height: 1.7;
      border: 1px solid var(--de-dim-rg-panel-bd);
      background: var(--de-dim-rg-panel-bg);
      color: var(--de-dim-rg-item-ink);
    }
    .de-dim-coverage.is-warn {
      border-color: var(--de-dim-cov-warn-bd);
      background: var(--de-dim-cov-warn-bg);
      color: var(--de-dim-cov-warn-ink);
    }
    .de-dim-coverage.is-ok {
      border-color: var(--de-dim-cov-ok-bd);
      background: var(--de-dim-cov-ok-bg);
      color: var(--de-dim-cov-ok-ink);
    }
    /* ★ P1-3（批次③）：.de-dim-cov-btn 热区仅 21px（行内文字高）。
       加纵向 padding 撑到 29px（≥24px AA）；横向 2px padding 用 -2px margin 抵消，
       文字位置与换行行为不变。 */
    .de-dim-cov-btn {
      display: inline; border: 0; background: none;
      padding: 4px 2px; margin: 0 -2px; box-sizing: border-box;
      color: inherit; font: inherit; cursor: pointer; text-align: left;
    }
    .de-dim-cov-btn:hover { text-decoration: underline; }
    .de-dim-cov-btn:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }
    /* 空态一键预置 / 客户页引导条 */
    .de-dim-emptystate, .de-dim-guide {
      display: flex; flex-wrap: wrap; align-items: center; gap: 10px;
      margin: 0 0 8px; padding: 9px 12px; border-radius: 8px;
      border: 1px dashed var(--de-dim-rg-item-bd);
      background: var(--de-dim-rg-item-bg);
      color: var(--de-dim-rg-item-ink);
      font-size: 12.5px;
    }
    /* 一键预置二次确认面板 */
    .de-dim-presetpanel {
      margin: 10px 0; border-radius: 10px; overflow: hidden;
      border: 1px solid var(--de-dim-rg-mig-bd);
      background: var(--de-dim-rg-mig-bg);
    }
    .de-dim-presetpanel-head { padding: 10px 12px; font-size: 12.5px; font-weight: 700; color: var(--de-dim-rg-mig-head-ink); border-bottom: 1px solid var(--de-dim-rg-mig-bd); }
    .de-dim-presetpanel-body { padding: 10px 12px; font-size: 12px; line-height: 1.75; color: var(--de-dim-rg-baseline-ink); }
    .de-dim-presetpanel-foot { display: flex; gap: 8px; justify-content: flex-end; padding: 10px 12px; border-top: 1px solid var(--de-dim-rg-mig-bd); }
    /* 未归属 / 待改派面板 */
    .de-dim-repanel {
      margin: 10px 0; border-radius: 10px; overflow: hidden;
      border: 1px solid var(--de-dim-rg-mig-bd);
      background: var(--de-dim-rg-mig-bg);
    }
    .de-dim-repanel-head { padding: 10px 12px; font-size: 12.5px; font-weight: 700; color: var(--de-dim-rg-mig-head-ink); border-bottom: 1px solid var(--de-dim-rg-mig-bd); }
    .de-dim-repanel-note { padding: 8px 12px; font-size: 11.5px; line-height: 1.7; color: var(--de-dim-rg-baseline-ink); }
    .de-dim-repanel-body { max-height: 280px; overflow: auto; padding: 0 12px 8px; }
    .de-dim-repanel-tbl { width: 100%; border-collapse: collapse; font-size: 12px; }
    .de-dim-repanel-tbl th,
    .de-dim-repanel-tbl td { padding: 5px 8px; text-align: left; border-bottom: 1px solid var(--de-dim-rg-panel-bd); }
    .de-dim-repanel-tbl select { min-width: 120px; }
    .de-dim-repanel-foot { display: flex; gap: 8px; justify-content: flex-end; padding: 10px 12px; border-top: 1px solid var(--de-dim-rg-mig-bd); }

    /* ==========================================================================
     * 数据录入 · 维度数据 TAB · 批次③（T11/T12/T15 · 2026-09-11）
     * 占比 / 累计占比 / 上年同期 只读列 · 产品编码 / 部门类型 第二格控件 · 批量改上级 / 分摊面板。
     * 全部走 .de-* 类 + --de-dim-* 令牌（零内联样式，深浅双主题）。
     * ========================================================================== */
    /* T11/T15：只读列（右对齐 · 等宽数字 · 只读底） */
    .de-dim-table tbody td.de-dim-share,
    .de-dim-table tbody td.de-dim-cum,
    .de-dim-table tbody td.de-dim-prev {
      text-align: right; font-variant-numeric: tabular-nums;
      background: var(--de-dim-rg-ro-bg); color: var(--de-dim-share-ink);
    }
    .de-dim-table tfoot td#dimFootShare,
    .de-dim-table tfoot td#dimFootCum,
    .de-dim-table tfoot td#dimFootPrev {
      text-align: right; font-variant-numeric: tabular-nums;
    }
    .de-dim-table tbody td.is-zero { color: var(--de-dim-rg-ro-ink); }
    /* 列宽：新增列（上年同期 / 占比 / 累计占比）
       ★ 第三轮 P0-2：原为 px（116 / 92）——与表主体的百分比体系混用：px 列恒得绝对宽、
       % 列按比例，合计超 100% 时被反比例压缩，列宽随容器漂移。
       已统一收敛到上方「列宽改比例」块（单一真源），此处不再重复定义。 */
    /* ★ 第三轮 P1-1（D1 裁决①）：第二格内控件「横向并排」——
       原纵向堆叠（display:block + margin-top:3px）把产品/部门行高顶到 53/54px，
       而同屏的客户/区域仅 32/33px。
       ⚠ 绝不能把 <td> 本身写成 display:flex —— 那会让单元格脱离表格网格、整表错乱；
         必须用内层包裹盒 .de-dim-sec-row。 */
    .dimension-data-tab .de-dim-sec-row { display: flex; gap: 6px; align-items: center; }
    .dimension-data-tab .de-dim-sec-row > .dim-parent,
    .dimension-data-tab .de-dim-sec-row > .dim-region-l1,
    .dimension-data-tab .de-dim-sec-row > .dim-region-l2 { flex: 1 1 0; min-width: 0; }
    .dimension-data-tab .de-dim-sec-row > .de-dim-region-hint { flex: 0 0 auto; }
    /* ★ 第三轮 P0-2：名称格「缩进衬距 + 层级标记 + 名称控件」同样必须走内层包裹盒。
       固定布局下列宽不再随内容增长，原写法（inline-block 缩进 + width:100% 输入框）
       会让行内容溢出列宽 18×层级+标记宽 px —— 第 2 层即溢出 30px，压到「第二列」上。
       （同一 td 禁 display:flex：会让单元格脱离表格网格、整表错乱。）
       .dim-indent 仍留在 DOM 内（JS 靠 data-lv 还原层级），此处仅作 flex 定宽衬距。 */
    .dimension-data-tab .de-dim-name-row { display: flex; align-items: center; min-width: 0; }
    .dimension-data-tab .de-dim-name-row > .dim-indent { flex: 0 0 auto; }
    .dimension-data-tab .de-dim-name-row > .de-dim-mark { flex: 0 0 auto; }
    .dimension-data-tab .de-dim-name-row > .dim-name { flex: 1 1 0; width: auto; min-width: 0; }
    /* ★ 2026-09-12 优化：产品编码输入框样式统一 */
    .de-dim-table input.dim-sku {
      flex: 0 0 84px; width: 84px; min-width: 0; margin-top: 0; box-sizing: border-box;
      background: var(--input-bg);
      border: 1.5px solid var(--de-dim-rg-accent-bd);
      color: var(--de-dim-rg-item-ink);
      border-radius: 6px;
    }
    .de-dim-table input.dim-sku:hover {
      border-color: var(--de-dim-rg-accent-bd-hi);
    }
    .de-dim-table input.dim-sku:focus {
      outline: none; border-color: var(--input-focus-border);
      box-shadow: var(--input-focus-shadow);
    }
    /* ★ 批次⑩：部门类型下拉框高度和风格与部门名称输入框保持一致 */
    .de-dim-table select.dim-depttype {
      width: 100%; min-width: 0; height: var(--de-cell-h); padding: 0 8px; box-sizing: border-box;
      background: var(--input-bg); border: 1.5px solid var(--de-dim-rg-accent-bd);
      border-radius: 6px; color: var(--de-dim-ink-2); font-size: 12px;
      font-family: inherit; transition: all 0.2s ease;
    }
    .de-dim-table select.dim-depttype:hover {
      border-color: var(--de-dim-rg-accent-bd-hi);
    }
    .de-dim-table select.dim-depttype:focus {
      outline: none; border-color: var(--input-focus-border);
      background: var(--input-bg); box-shadow: var(--input-focus-shadow);
    }
    /* T12：批量改上级 / 按比例分摊 面板（自建 · 禁原生 confirm） */
    .de-dim-bpanel {
      margin: 10px 0; border-radius: 10px; overflow: hidden;
      border: 1px solid var(--de-dim-batch-bd);
      background: var(--de-dim-batch-bg);
    }
    .de-dim-bpanel-head { padding: 10px 12px; font-size: 12.5px; font-weight: 700; color: var(--de-dim-batch-head-ink); border-bottom: 1px solid var(--de-dim-batch-bd); }
    .de-dim-bpanel-body { padding: 10px 12px; }
    .de-dim-bpanel-row { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; font-size: 12px; color: var(--de-dim-rg-item-ink); }
    .de-dim-bpanel-lab { font-size: 12px; }
    .de-dim-bpanel-note { margin: 6px 0 0; font-size: 11.5px; line-height: 1.7; color: var(--de-dim-rg-note-ink); }
    .de-dim-bpanel-tbl { width: 100%; border-collapse: collapse; margin-top: 8px; font-size: 12px; }
    .de-dim-bpanel-tbl th,
    .de-dim-bpanel-tbl td { padding: 5px 8px; text-align: left; border-bottom: 1px solid var(--de-dim-batch-bd); }
    .de-dim-bpanel-tbl .de-alc-w { width: 96px; }
    .de-dim-bpanel select.de-brp-parent { min-width: 160px; }
    .de-dim-bpanel input.de-alc-total { width: 140px; }
    .de-dim-bpanel-foot { display: flex; gap: 8px; justify-content: flex-end; padding: 10px 12px; border-top: 1px solid var(--de-dim-batch-bd); }

/* ==================== 维度数据TAB操作说明弹窗（2026-09-12 批次⑦） ==================== */
.de-modal {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: var(--de-modal-mask);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 9999;
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.3s ease, visibility 0.3s ease;
}

.de-modal.is-open {
  opacity: 1;
  visibility: visible;
}

.de-modal-content {
  background: linear-gradient(180deg, var(--dw-bg-1), var(--dw-bg-2));
  border: 1px solid var(--line);
  border-radius: 12px;
  box-shadow: 0 20px 60px var(--de-modal-shadow);
  transform: translateY(-20px);
  transition: transform 0.3s ease;
  display: flex;
  flex-direction: column;
  max-height: 90vh;
}

.de-modal.is-open .de-modal-content {
  transform: translateY(0);
}

.de-modal-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 16px 20px;
  border-bottom: 1px solid var(--line);
}

.de-modal-header h2 {
  margin: 0;
  font-size: 18px;
  color: var(--txt);
  font-weight: 600;
}

.de-modal-close {
  width: 32px;
  height: 32px;
  border: none;
  background: transparent;
  color: var(--txt2);
  font-size: 24px;
  cursor: pointer;
  border-radius: 4px;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: all 0.2s ease;
}

.de-modal-close:hover {
  background: var(--de-modal-close-hover);
  color: var(--txt);
}

.de-modal-body {
  padding: 0;
  overflow-y: auto;
  flex: 1;
}

.dim-guide-content {
  padding: 20px;
}

.dim-guide-section {
  margin-bottom: 24px;
}

.dim-guide-section:last-child {
  margin-bottom: 0;
}

.dim-guide-section h3 {
  color: var(--primary);
  font-size: 16px;
  font-weight: 600;
  margin-bottom: 12px;
  border-bottom: 2px solid var(--primary);
  padding-bottom: 8px;
}

.dim-guide-section > div {
  color: var(--txt);
  line-height: 1.8;
  font-size: 13px;
}

/* ==========================================================================
 * 主页面 UI/UX 走查落地（2026-09-13）· 键盘可达与焦点可见（阻塞项 B-1）
 * 走查实测：主画布 36 处可点元素全是裸 <div>（tabIndex=-1、零 role、零 aria-label），
 * Tab 从顶栏三个控件之后直接跳进抽屉内部 —— 整块主画布（8 张健康卡 / 5 张 KPI /
 * 3 个现金流仪表 / 操作菜单 / 整体健康度主卡）不在 Tab 序列内。
 * 本轮为 35 处补 role="button" + tabindex="0" + aria-label（.mask 遮罩层不计），
 * 由 js/ui.js 的**全局委托**监听补 Enter / Space 激活（零新增顶层监听之外的开销）。
 * 焦点环色走 --focus-ring：深色品牌青 / 浅色 #0b63c4（品牌青在浅底仅 1.71:1，不满足 3:1）。
 * ========================================================================== */
.kpi:focus-visible,
.health-card:focus-visible,
.cf-gauge:focus-visible,
.oh-panel:focus-visible,
.logo-upload-area:focus-visible {
  outline: 2px solid var(--focus-ring);
  outline-offset: 2px;
  /* ★ 2026-09-13 实测踩坑：.kpi 与 .health-card 上有 `transition: all 0.25s/0.2s ease`，
     它把 outline-color / outline-width 一并纳入过渡 —— 聚焦瞬间读到的仍是
     currentColor（outline-style 不可插值，故只有它立刻变 solid）。
     结果焦点环要 200ms 才「显色」。焦点指示必须瞬时可见，故在此关掉过渡。 */
  transition-property: none;
}

/* 有边框的卡类：焦点环与边框同色，视觉更整 */
.kpi:focus-visible,
.health-card:focus-visible,
.oh-panel:focus-visible {
  border-color: var(--focus-ring);
}

/* 菜单项相邻紧密，焦点环内收以免压到邻项 */
.menu-item:focus-visible {
  outline: 2px solid var(--focus-ring);
  outline-offset: -2px;
  border-radius: 8px;
}

/* 未授权受限态（license-watermark.js 给 body 加 .license-restricted）。
   置灰受限写操作入口：数据录入「保存数据」按钮 + 控制面板 备份/恢复/清空 菜单项。
   注：deClearBtn 已被下线（见 data-entry.js 注释），改用真实存在的 aria-label 选择器。 */
.license-restricted #deSaveBtn,
.license-restricted [aria-label="备份数据"],
.license-restricted [aria-label="恢复数据"],
.license-restricted [aria-label="清空数据"] {
  pointer-events: none;
  opacity: .5;
}

/* -----------------------------------------------------------------------------
   新增主题分析 .ax-* 命名空间（T01 共享骨架）
   —— 视觉语言与既有抽屉页（账龄分析 .aa-* / 多维分析）一致：14px 圆角卡、1px 描边、
      同一套字体（var(--font)）与间距节奏。
   —— 颜色一律走既有 CSS 变量（复用 --aa-* 分析调色板；该调色板在 :root 与
      html[data-theme="light"] 双赋值且已过 AA 对比度）；本段不得出现任何硬编码色值。
   —— 本段不新增任何令牌（因此无需 :root / [data-theme=light] 双赋值）。
   护栏：tools/verify-analysis-common.js（F 组）。
   -------------------------------------------------------------------------- */
/* ===== AX-BEGIN ===== */
.ax-page { padding: 6px clamp(12px, 2vw, 26px) 30px; box-sizing: border-box; color: var(--aa-ink); font-family: var(--font); }
.ax-toolbar { display: flex; align-items: center; gap: 8px 12px; flex-wrap: wrap; margin: 0 0 10px; padding: 8px 12px; border: 1px solid var(--aa-panel-bd); border-radius: 14px; background: var(--aa-panel-bg); font-size: var(--aa-fs-3); color: var(--aa-mut); }
.ax-toolbar .ax-tag { padding: 2px 10px; border-radius: 11px; border: 1px solid var(--aa-neutral-bd); background: var(--aa-neutral-bg); color: var(--aa-mut); white-space: nowrap; }
.ax-toolbar-spacer { flex: 1 1 auto; min-width: 8px; }

.ax-tabs, .ax-tabbar { display: flex; gap: 6px; flex-wrap: wrap; padding: 8px 0 9px; margin: 0; border-bottom: 1px solid var(--aa-line-soft); }
.ax-tab { padding: 6px 14px; border-radius: 8px; cursor: pointer; font-size: var(--aa-fs-3); line-height: 1.5; min-height: 32px; border: 1px solid var(--aa-btn-bd); background: var(--aa-btn-bg); color: var(--aa-mut); transition: border-color .15s ease, color .15s ease, background .15s ease; }
.ax-tab:hover { border-color: var(--aa-primary-bd); color: var(--aa-primary-ink); }
.ax-tab.on { border-color: var(--aa-primary-bd); background: var(--aa-primary-bg); color: var(--aa-primary-ink); font-weight: 600; }
.ax-tab-name { pointer-events: none; }
.ax-tab-sub { font-size: var(--aa-fs-1); opacity: .8; margin-left: 4px; pointer-events: none; }
.ax-panels { padding-top: 12px; }
.ax-panel { display: none; }
.ax-panel.on { display: block; }

.ax-card, .ax-box { background: var(--aa-card-bg); border: 1px solid var(--aa-card-bd); border-radius: 14px; padding: 12px 14px; margin-bottom: 12px; }
.ax-card-tight { padding: 11px 14px; }
.ax-metric-row { display: flex; gap: 12px; flex-wrap: wrap; margin-bottom: 6px; }
.ax-kpi, .ax-metric { background: var(--aa-card-bg); border: 1px solid var(--aa-card-bd); border-radius: 14px; padding: 12px 16px; flex: 1 1 180px; min-width: 0; box-sizing: border-box; }
.ax-kpi-label, .ax-metric-label { font-size: var(--aa-fs-2); color: var(--aa-mut); }
.ax-kpi-val, .ax-metric-val { font-size: var(--aa-fs-6); font-weight: 700; margin-top: 4px; white-space: nowrap; color: var(--aa-ink-strong); font-variant-numeric: tabular-nums; }
.ax-metric-sub { font-size: var(--aa-fs-1); color: var(--aa-mut); margin-top: 3px; }
.ax-kpi-val.is-ok, .ax-metric-val.is-ok { color: var(--aa-ok-ink); }
.ax-kpi-val.is-warn, .ax-metric-val.is-warn { color: var(--aa-warn-ink); }
.ax-kpi-val.is-bad, .ax-metric-val.is-bad { color: var(--aa-bad-ink); }
.ax-section-title { font-size: var(--aa-fs-4); font-weight: 600; color: var(--aa-ink-2); margin: 4px 0 8px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.ax-section-title small { font-size: var(--aa-fs-1); font-weight: 400; color: var(--aa-mut); }

.ax-lamp { display: inline-flex; align-items: center; gap: 5px; font-size: var(--aa-fs-2); line-height: 1.6; padding: 2px 10px; border-radius: 11px; border: 1px solid var(--aa-neutral-bd); background: var(--aa-neutral-bg); color: var(--aa-mut); white-space: nowrap; }
.ax-lamp.is-ok { border-color: var(--aa-ok-bd); background: var(--aa-ok-bg); color: var(--aa-ok-ink); }
.ax-lamp.is-warn { border-color: var(--aa-warn-bd); background: var(--aa-warn-bg); color: var(--aa-warn-ink); }
.ax-lamp.is-bad { border-color: var(--aa-bad-bd); background: var(--aa-bad-bg); color: var(--aa-bad-ink); }
.ax-lamp.is-muted { border-color: var(--aa-neutral-bd); background: var(--aa-neutral-bg); color: var(--aa-mut); }

.ax-btn { padding: 6px 12px; border-radius: 7px; cursor: pointer; border: 1px solid var(--aa-btn-bd); background: var(--aa-btn-bg); color: var(--aa-ink-2); font-size: var(--aa-fs-3); line-height: 1.5; min-height: 32px; }
.ax-btn:hover { border-color: var(--aa-primary-bd); color: var(--aa-primary-ink); }
.ax-btn-primary { border-color: var(--aa-primary-bd); background: var(--aa-primary-bg); color: var(--aa-primary-ink); }

.ax-table-wrap { overflow: auto; max-width: 100%; max-height: 60vh; border: 1px solid var(--aa-line-2); border-radius: 8px; }
.ax-table { width: 100%; border-collapse: collapse; font-size: var(--aa-fs-3); color: var(--aa-ink); }
.ax-table th, .ax-table td { padding: 7px 10px; border-bottom: 1px solid var(--aa-line-2); text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; }
.ax-table th { color: var(--aa-head); background: var(--aa-head-bg); font-weight: 600; }
.ax-table th:first-child, .ax-table td:first-child { text-align: left; }
.ax-table tbody tr:hover td { background: var(--aa-bg-soft); }
.ax-table .ax-up { color: var(--aa-rise); }
.ax-table .ax-dn { color: var(--aa-fall); }
/* P1-5（2026-09-16）：表头吸顶。.ax-table-wrap 自带 overflow:auto + max-height:60vh，**已是滚动容器**
   —— 故 th 用 position:sticky;top:0 即粘在它的顶部（无需另建滚动体，也不受 #dwBody 滚动影响）。
   · z-index:2：显式声明，防未来给 td 加定位后表头被盖。
   · 用 inset box-shadow 代替 border-bottom：border-collapse:collapse 下 sticky 元素的 border
     绘制在表格层、会随内容一起滚走；inset shadow 随元素本身吸顶才留得住分隔线。 */
.ax-table thead th { position: sticky; top: 0; z-index: 2; box-shadow: inset 0 -1px 0 var(--aa-line-2); }

.ax-chart { width: 100%; height: 320px; }
.ax-chart-sm { height: 240px; }
.ax-chart-lg { height: 400px; }

.ax-empty { padding: 60px 20px; text-align: center; color: var(--aa-mut); }
.ax-empty-icon { font-size: 44px; margin-bottom: 14px; line-height: 1; }
.ax-empty-title { font-size: 16px; font-weight: 600; color: var(--aa-ink); margin-bottom: 6px; }
.ax-empty-desc { font-size: 13px; margin-bottom: 22px; line-height: 1.8; color: var(--aa-mut); }
.ax-empty-cta { padding: 8px 20px; border-radius: 8px; cursor: pointer; border: 1px solid var(--aa-primary-bd); background: var(--aa-primary-bg); color: var(--aa-primary-ink); font-size: var(--aa-fs-3); min-height: 32px; }
.ax-empty-cta:hover { background: var(--aa-primary-fill); color: var(--aa-fill-ink); }
/* P1-6（2026-09-16）：抽屉内年份切换控件 —— 用 .ax-btn 同款令牌，保证深浅主题一致。 */
.ax-select { padding: 5px 10px; border-radius: 7px; cursor: pointer; border: 1px solid var(--aa-btn-bd); background: var(--aa-btn-bg); color: var(--aa-ink-2); font-size: var(--aa-fs-3); line-height: 1.5; min-height: 32px; }
/* P1-8（2026-09-16）：工具条勾稽三联的差异率分档配色（仅描边/底/墨，复用语义令牌） */
.ax-toolbar .ax-tag.is-ok { border-color: var(--aa-ok-bd); background: var(--aa-ok-bg); color: var(--aa-ok-ink); }
.ax-toolbar .ax-tag.is-warn { border-color: var(--aa-warn-bd); background: var(--aa-warn-bg); color: var(--aa-warn-ink); }
.ax-toolbar .ax-tag.is-bad { border-color: var(--aa-bad-bd); background: var(--aa-bad-bg); color: var(--aa-bad-ink); }
/* P1-3（2026-09-16）：表头内的限定词（如「收入下滑 · 语义反转」）—— 不抢主标题字重。 */
.ax-table th small { font-weight: 400; color: var(--aa-mut); }
/* 合计行吸底（与表头吸顶对称；.ax-table-wrap 即滚动容器）。 */
.ax-table tfoot td { position: sticky; bottom: 0; z-index: 2; background: var(--aa-head-bg); color: var(--aa-head); font-weight: 600; box-shadow: inset 0 1px 0 var(--aa-line-2); }
/* ── 第 3 批「增强」· 表格内联标签与对齐规则（P1-7 / P1-8 · 2026-09-16）──────────
   .ax-tag 原本只在 .ax-toolbar / .ax-conclusion 两个作用域内定义基础样式，
   表格单元格内**没有**样式 ⇒ 催收页「触发因子」列的标签会退化成无样式纯文本。
   此处**新增** .ax-table 作用域的基础样式（只新增选择器、不改任何既有规则），
   其余 6 个主题分析页未在表格内用 .ax-tag ⇒ 零影响。 */
.ax-table .ax-tag {
  display: inline-block; margin: 0 3px 0 0; padding: 1px 5px;
  border: 1px solid var(--aa-neutral-bd); border-radius: 9px;
  background: var(--aa-neutral-bg); color: var(--aa-mut);
  font-size: 12px; line-height: 16px; vertical-align: middle; white-space: nowrap;
}
.ax-table .ax-tag:last-child { margin-right: 0; }
.ax-table .ax-tag.is-ok { border-color: var(--aa-ok-bd); background: var(--aa-ok-bg); color: var(--aa-ok-ink); }
.ax-table .ax-tag.is-warn { border-color: var(--aa-warn-bd); background: var(--aa-warn-bg); color: var(--aa-warn-ink); }
.ax-table .ax-tag.is-bad { border-color: var(--aa-bad-bd); background: var(--aa-bad-bg); color: var(--aa-bad-ink); }
.ax-table .ax-tag.is-muted { border-color: var(--aa-neutral-bd); background: var(--aa-neutral-bg); color: var(--aa-mut); }
/* P1-8：三表对齐规则统一 —— 数值列右对齐（既有 .ax-table td 默认值），文本型列显式左对齐。 */
.ax-table td.ax-cell-text { text-align: left; }
.ax-table .ax-mut { color: var(--aa-mut); }
/* ── 税务合规页（T04 · tx）专用样式 —— 2026-09-16 UI/UX 优化 ────────────────────
   集中成一块连续追加，便于并发提交时按 hunk 切分（避免与中部主题块产生交叉 hunk）。 */

/* P2-1：吸顶免责条底/线**直接复用既有吸顶条令牌** —— --dim-sticky-bg / --dim-sticky-line
   由 :root（深色默认）与 html[data-theme="light"] 两端定义，.dim-sticky / .bud-sticky 同源。
   零新增令牌、零硬编码色值（契约层护栏 F2 反查 .ax-* 段不得出现十六进制色值）。 */

/* P2-1：免责文案吸顶常驻（承 P1-9「正常态与空态同源」）—— 照 .dim-sticky / .bud-sticky 同法。
   sticky 元素不可越出父级内容盒：父级 padding-top 下推多少，条上方就露多宽的缝；
   故同时归零 #dwBody 与 .ax-page 的 padding-top。用 :has() 作用域化 —— 仅当页面上
   存在 .tx-disclaimer 时生效，**零泄漏**到其余 7 个分析页（版式不变）。 */
html:has(#dwBody .tx-disclaimer) #dwBody { padding-top: 0; }
.ax-page:has(.tx-disclaimer) { padding-top: 0; }
.tx-disclaimer {
  position: sticky; top: 0; z-index: 6;
  margin: 0 0 10px; padding: 9px 14px;
  background: var(--dim-sticky-bg);
  -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
  border: 1px solid var(--dim-sticky-line); border-radius: 12px;
  font-size: var(--aa-fs-2); line-height: 1.75; color: var(--aa-mut);
}

/* P2-8：结论条 —— 结论先于明细，置顶呈现（硬信号命中时右侧标签转红） */
.ax-conclusion {
  display: flex; align-items: flex-start; gap: 8px 10px; flex-wrap: wrap;
  margin: 0 0 10px; padding: 10px 14px;
  border: 1px solid var(--aa-panel-bd); border-radius: 14px; background: var(--aa-panel-bg);
}
.ax-conclusion-txt { flex: 1 1 260px; min-width: 0; font-size: var(--aa-fs-3); line-height: 1.75; color: var(--aa-ink-2); }
/* 结论条内的 .ax-tag 不在 .ax-toolbar 作用域内 ⇒ 需自带基础样式 + 三档语义配色（与工具条同源）。 */
.ax-conclusion .ax-tag {
  flex: none; padding: 2px 10px; border-radius: 11px; white-space: nowrap;
  font-size: var(--aa-fs-2); line-height: 1.6;
  border: 1px solid var(--aa-neutral-bd); background: var(--aa-neutral-bg); color: var(--aa-mut);
}
.ax-conclusion .ax-tag.is-ok { border-color: var(--aa-ok-bd); background: var(--aa-ok-bg); color: var(--aa-ok-ink); }
.ax-conclusion .ax-tag.is-warn { border-color: var(--aa-warn-bd); background: var(--aa-warn-bg); color: var(--aa-warn-ink); }
.ax-conclusion .ax-tag.is-bad { border-color: var(--aa-bad-bd); background: var(--aa-bad-bg); color: var(--aa-bad-ink); }

/* P0-2：进销项结构桥（中性呈现，6 值）—— 宽屏 6 列，窄屏降级 3 列 / 2 列。
   硬信号卡复用同一视觉语言，但最多 4 项 ⇒ 用 .tx-bridge-4 修饰类单独定列数（避免 6 列留空 2 格）。 */
.tx-bridge { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 8px; margin: 10px 0 6px; }
.tx-bridge-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.tx-bridge-cell {
  min-width: 0; padding: 9px 11px; border-radius: 11px;
  border: 1px solid var(--aa-card-bd); background: var(--aa-card-bg);
}
.tx-bridge-label {
  font-size: var(--aa-fs-1); color: var(--aa-mut);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.tx-bridge-val {
  margin-top: 3px; font-size: var(--aa-fs-5); font-weight: 700; color: var(--aa-ink-strong);
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
.tx-bridge-unit { margin-left: 3px; font-size: var(--aa-fs-1); font-weight: 400; color: var(--aa-mut); }
.tx-bridge-val.is-ok { color: var(--aa-ok-ink); }
.tx-bridge-val.is-warn { color: var(--aa-warn-ink); }
.tx-bridge-val.is-bad { color: var(--aa-bad-ink); }

/* P1-4：红线看板三仪表 —— 宽屏一行三列（每个仪表约 320px 宽 × 240px 高，可读），
   中屏降级 2 列，窄屏 1 列。 */
.tx-gauge-row { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; margin: 0 0 12px; }
.tx-gauge-row .tx-gauge-box { min-width: 0; margin-bottom: 0; }

/* 硬信号卡钩子（供护栏/测试定位；间距沿用 .ax-box 默认值，显式声明避免「未定义类名」）。 */
.tx-hs { margin-bottom: 12px; }
/* 硬信号命中时的红字提示（.ax-metric-sub 基础为中性灰）。 */
.ax-metric-sub.is-bad { color: var(--aa-bad-ink); }

@media (max-width: 1080px) {
  .tx-bridge { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .tx-bridge-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .tx-gauge-row { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 720px) {
  .tx-bridge { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .tx-gauge-row { grid-template-columns: 1fr; }
}

/* ===== AX-END ===== */
