/* ============================================================
   兴赫 · 内页统一皮肤（浅色极简 · 白卡片）
   ------------------------------------------------------------
   设计语言取自开源设计体系（MIT）：
     · shadcn/ui 的 zinc 中性色阶 —— 底色/描边/文字三级灰
     · Radix Colors 的单色强调 —— 全身只有一个品牌色
   只作用于「点进去之后」的内页。主控台首页、顶栏、登录页、落地页一律不碰。

   ⚠️ 作用域 = **所有 dash 内页**（2026-10-14 起**含看板 `#dashboard-view`**）。
      历史上这里写的是 `.dash-view:not(#dashboard-view)`，把看板排除在外 ——
      当时老板把看板当禁区，结果是**全站只剩它一页还是旧的深色**，他看出来了、点名要一起换。

   `.dash-view:is(#dashboard-view, :not(#dashboard-view))` 看着绕，是**故意的**：
      它等价于「所有 .dash-view」，但 `:is()` 取参数里最高的特异性（`#dashboard-view` = 1,0,0），
      于是整条**仍是 (1,1,0)**，和改之前一模一样。
      ✅ 因此对原有那 16 页是**零变化**（特异度没动），只是多盖住了看板一页。
      ⚠️ 别「顺手简化」成裸 `.dash-view` —— 那会掉到 (0,1,0)，输给页面里
         `#profile-view .dash-bar` 这类 (1,1,0) 的页级规则，档案 / 介入平台 / AI 助手 /
         管理中心 四页的顶栏会集体回退。

   本文件在 index.html 里是**最后一张样式表**（第 11280 行，排在 mobile.css 之后、
   也在三份 <template> 自己的 <style> 之后），所以同分时靠文档顺序取胜。
   ============================================================ */

.dash-view:is(#dashboard-view, :not(#dashboard-view)),
#industry-view {
  --ui-bg: #f7f7f8;
  --ui-surface: #ffffff;
  --ui-surface-2: #fafafa;
  --ui-line: #e8e8ec;
  --ui-line-2: #dcdce1;
  --ui-t1: #18181b;
  --ui-t2: #3f3f46;
  --ui-t3: #71717a;
  --ui-accent: #6e56cf;
  --ui-accent-soft: #f2effc;
  --ui-shadow: 0 1px 2px rgba(16, 16, 24, .04), 0 1px 3px rgba(16, 16, 24, .06);

  background: var(--ui-bg);
  color: var(--ui-t1);
  color-scheme: light;
}

/* ---------------- 顶条 ---------------- */
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-bar {
  background: rgba(255, 255, 255, .82);
  -webkit-backdrop-filter: blur(12px) saturate(160%);
  backdrop-filter: blur(12px) saturate(160%);
  border-bottom: 1px solid var(--ui-line);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-back {
  background: var(--ui-surface);
  border: 1px solid var(--ui-line);
  color: var(--ui-t1);
  border-radius: 9px;
  box-shadow: var(--ui-shadow);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-back:hover {
  background: var(--ui-surface-2);
  border-color: var(--ui-line-2);
  color: #000;
  transform: none;
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-title {
  background: none;
  -webkit-background-clip: border-box;
  background-clip: border-box;
  -webkit-text-fill-color: var(--ui-t1);
  color: var(--ui-t1);
  letter-spacing: -.01em;
}

/* ---------------- 顶条上的小控件 ---------------- */
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-time-switch {
  background: #f1f1f4;
  border: 1px solid var(--ui-line);
}
/* ⚠️ 未选中的档位**不能**用 --ui-t3(#71717a)：它压在 #f1f1f4 上只有 4.29:1。
   这里要的是「比正文弱、但仍读得清」，专门给一档 #5f5f68（≈5.3:1）。 */
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-time-btn { color: #5f5f68; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-time-btn:hover { color: var(--ui-t1); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-time-btn.active {
  color: var(--ui-t1);
  background: #fff;
  box-shadow: 0 0 0 1px var(--ui-line), 0 1px 2px rgba(16, 16, 24, .06);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-custom-picker {
  background: var(--ui-surface);
  border: 1px solid var(--ui-line);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-custom-picker input[type="date"] {
  color: var(--ui-t1);
  color-scheme: light;
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-custom-ok {
  background: var(--ui-accent);
  color: #fff;
  border-radius: 7px;
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-voice {
  background: var(--ui-accent);
  box-shadow: 0 3px 12px rgba(70, 95, 255, .26);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-voice:hover {
  background: #3a4fd8;
  box-shadow: 0 6px 18px rgba(70, 95, 255, .38);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-empty { color: var(--ui-t3); }

/* ============================================================
   外壳共用组件
   ------------------------------------------------------------
   ⚠️ 下面这些类**好几页在共用**（#statistics-view 复用 .dash-kpis/.dash-card/.dash-seg，
      看板首页全用）。
      所以这里一条都**不能裸写** —— 必须挂在 `.dash-view` 作用域下，
      否则会漏到 #industry-view 的左侧列表、以及三份 <template> 之外的外壳上去。
   ============================================================ */

/* ---- KPI 卡 ---- */
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-kpi {
  border: 1px solid var(--ui-line);
  background: var(--ui-surface);
  box-shadow: var(--ui-shadow);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-kpi:hover {
  border-color: var(--ui-line-2);
  box-shadow: 0 4px 14px rgba(16, 16, 24, .08);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-kpi::before {
  background: var(--ui-accent);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-kpi-label { color: var(--ui-t3); }
/* ⚠️ 这条是经营统计那一页最要命的一处：原色 #f9fafb 在白卡上只有 1.05:1，数字等于看不见 */
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-kpi-value { color: var(--ui-t1); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-kpi-value.na { color: #a1a1aa; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-kpi-delta { color: var(--ui-t3); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-kpi-delta.up { color: #1f6329; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-kpi-delta.down { color: #ce2c31; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-kpi-plats { color: var(--ui-t3); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-kpi-plat i { color: var(--ui-t3); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-kpi-plat-sep { color: #b4b4bb; }

/* ---- 卡片 ---- */
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-card {
  border: 1px solid var(--ui-line);
  background: var(--ui-surface);
  box-shadow: var(--ui-shadow);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-card-title { color: var(--ui-t1); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-card-sub { color: var(--ui-t3); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-widget {
  border: 1px solid var(--ui-line);
  background: var(--ui-surface);
  box-shadow: var(--ui-shadow);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-widget-title { color: var(--ui-t1); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-widget-sub { color: var(--ui-t3); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-widget-more { color: var(--ui-t3); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-widget-more:hover { background: #f1f1f4; color: var(--ui-t1); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-widget-pop {
  background: var(--ui-surface);
  border: 1px solid var(--ui-line);
  box-shadow: 0 8px 24px rgba(16, 16, 24, .12);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-widget-pop button { color: var(--ui-t2); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-widget-pop button:hover { background: var(--ui-accent-soft); color: var(--ui-t1); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-widget-pop button.danger { color: #ce2c31; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-widget-pop button.danger:hover { background: #fdf0f0; }

/* ---- 分段按钮 ---- */
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-seg {
  background: #f1f1f4;
  border: 1px solid var(--ui-line);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-seg-btn { color: #5f5f68; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-seg-btn:hover { color: var(--ui-t1); }
/* ⚠️ 原来是「白字压在 50% 透明紫」上（1.92:1）；改成实色紫，白字 5.6:1 */
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-seg-btn.active {
  color: #fff;
  background: var(--ui-accent);
}

/* ---- TOP5 榜 ---- */
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-top-rank { color: #3538cd; background: #eef2ff; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-top-row:nth-child(1) .dash-top-rank { color: #946200; background: #fdf6e3; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-top-name { color: var(--ui-t1); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-top-bar-wrap { background: #f1f1f4; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-top-bar { background: var(--ui-accent); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-top-val { color: var(--ui-t1); }

/* ---- 预警列表 ---- */
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-alert {
  border: 1px solid var(--ui-line);
  background: var(--ui-surface-2);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-alert.red { border-left: 3px solid #ce2c31; background: #fdf3f3; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-alert.yellow { border-left: 3px solid #8f5500; background: #fdf8ec; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-alert.red .dash-alert-dot { background: #ce2c31; box-shadow: none; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-alert.yellow .dash-alert-dot { background: #8f5500; box-shadow: none; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-alert-title { color: var(--ui-t1); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-alert.red .dash-alert-title { color: #b42318; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-alert.yellow .dash-alert-title { color: #946200; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-alert-detail { color: var(--ui-t3); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .dash-alert-suggest { color: var(--ui-t3); }

/* ---------------- 通行质感：表格、焦点 ---------------- */
.dash-view:is(#dashboard-view, :not(#dashboard-view)) table th,
#industry-view table th {
  background: var(--ui-surface-2);
  color: var(--ui-t2);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) :focus-visible,
#industry-view :focus-visible {
  outline: 2px solid var(--ui-accent);
  outline-offset: 2px;
}

/* ============================================================
   main.js 里的内联硬编码色
   ------------------------------------------------------------
   main.js 有 124 处把颜色直接写在 style="color:#xxxxxx" 上（模板串拼出来的），
   写在 HTML 属性里的内联声明**样式表默认压不过**，只能靠 `!important`。
   ⚠️ 为什么用 [style*="color:#xxxxxx"] 而不是 [style*="#xxxxxx"]：
      同一个十六进制在别处可能是底色（实测 background:#34d399 就有一处，
      是健康度进度条的填充，属正常色块，不该被改）。带上 `color:` 才只打文字。
   ⚠️ main.js 的写法统一是 `color:#hex`（冒号后无空格），已逐条核对过原文。

   ⚠️⚠️ 外层包 `:where(...)` 而不是 `:is(...)` —— 这一层是**故意**的，别改回去。
      `:is()` 取参数里**最高**的特异性（这里含 `.dash-view:is(#dashboard-view, :not(#dashboard-view))` = 1,2,0），
      于是这 13 条会盖过 index.html 里各页自己写的同款规则（那些都是
      `#页id [style*="#hex"]` = 1,1,0）。两边都带 !important，谁特异性高谁赢 ——
      结果就是**页面级的有意决策被无声推翻**。
      2026-10-14 全套回归实测踩中：扫码验券页的「核销」按钮是老板拍板的微信实心绿、
      以及「已补发拉新券」那句 `#fbbf24 → #b45309`，两条都被这里悄悄改掉了。
      `:where()` 特异性算 0，整条降到 (0,1,0)：**仍然压得过内联声明**（!important
      对普通内联优先），但**输给任何页面级的 !important 规则** —— 页面有自己意见的
      地方就让页面说了算。全局兜底只该兜「没人管」的那些，不该覆盖「有人管过」的。
   ============================================================ */
:where(.dash-view:is(#dashboard-view, :not(#dashboard-view)), #ad-view, #industry-view) [style*="color:#fbbf24"] { color: #8f5500 !important; }
:where(.dash-view:is(#dashboard-view, :not(#dashboard-view)), #ad-view, #industry-view) [style*="color:#f59e0b"] { color: #8f5500 !important; }
:where(.dash-view:is(#dashboard-view, :not(#dashboard-view)), #ad-view, #industry-view) [style*="color:#93c5fd"] { color: #1d4ed8 !important; }
:where(.dash-view:is(#dashboard-view, :not(#dashboard-view)), #ad-view, #industry-view) [style*="color:#34d399"] { color: #1f6329 !important; }
:where(.dash-view:is(#dashboard-view, :not(#dashboard-view)), #ad-view, #industry-view) [style*="color:#4ade80"] { color: #1f6329 !important; }
:where(.dash-view:is(#dashboard-view, :not(#dashboard-view)), #ad-view, #industry-view) [style*="color:#f87171"] { color: #ce2c31 !important; }
:where(.dash-view:is(#dashboard-view, :not(#dashboard-view)), #ad-view, #industry-view) [style*="color:#a855f7"] { color: #6e56cf !important; }
:where(.dash-view:is(#dashboard-view, :not(#dashboard-view)), #ad-view, #industry-view) [style*="color:#e5e7eb"] { color: #18181b !important; }
:where(.dash-view:is(#dashboard-view, :not(#dashboard-view)), #ad-view, #industry-view) [style*="color:#9ca3af"] { color: #52525b !important; }
:where(.dash-view:is(#dashboard-view, :not(#dashboard-view)), #ad-view, #industry-view) [style*="color:#6b7280"] { color: #71717a !important; }
:where(.dash-view:is(#dashboard-view, :not(#dashboard-view)), #ad-view, #industry-view) [style*="color:#374151"] { color: #52525b !important; }
:where(.dash-view:is(#dashboard-view, :not(#dashboard-view)), #ad-view, #industry-view) [style*="color:#64748b"] { color: #71717a !important; }
:where(.dash-view:is(#dashboard-view, :not(#dashboard-view)), #ad-view, #industry-view) [style*="color:#94a3b8"] { color: #71717a !important; }
/* 上面 #93c5fd 那批元素同时带 background:rgba(59,130,246,0.12)，在浅色下就是一块淡蓝底，
   配 #1d4ed8 文字对比度够，不必动。 */

/* ============================================================
   单一强调色：把已浅色的三页（管理中心 / 介入平台 / 档案）的「绿主色」换成紫
   ------------------------------------------------------------
   那三页原本各自带一套 `--xx-brand` 绿色令牌（#06ad56 一族）。它们是**唯一**喂给
   「主按钮 / 徽标 on / 勾选 / 焦点圈 / 选中态 / 加载环」的变量（已逐条核过用法），
   换掉这几行 = 全站只剩一个强调色，和「数据」等页的紫接上了。

   ⚠️ 顺带修掉一个真 bug：`#06ad56` 上压白字只有 **2.95:1**（保存档案 / 创建账号
      两个主按钮踩了），换成 `#6e56cf` 后是 **5.39:1**。这一条不是审美，是可读性。

   ⚠️⚠️ **扫码验券（`#redeem-view`）不在这一批里**，它的 `--rdm-brand` 一个字节都不许动。
      原因不是审美：「核销」按钮是**老板拍板**的微信实心绿，绿色在这个按钮上是有语义的
      （微信核销）。2026-10-14 我把这四页一起改成紫，`_cdp_redeem_contrast.mjs` 直接
      红了三条 ★ 断言，才把它逮出来。**代价如实记账**：白字压在 `#06ad56` 上只有
      **2.95:1** —— 低于正文线 4.5、也差一点点不到大字线 3.0。真要修只能换一档更深的绿，
      但换什么绿是老板的决定，不是我替他做。**别自作主张把它并进紫色那批。**

   ⚠️ 语义色**不动**：成功/失败仍走各页自己的 `.xx-xxx.ok/.err`，与主色无关。

   ⚠️ 要退回绿色：删掉下面这一整块即可，页面自己那套 `--xx-brand` 立刻接管。
   ============================================================ */
/* 逐页赋值。⚠️ 不搞「先设一个中转变量再逐个改名」—— 同一个规则里
   `--adm-brand: var(--x-brand)` 读到的 --x-brand 是**继承来的旧值**，不是本规则刚写下的，
   会静默取不到。老实按页各写一遍。 */
.dash-view.adm-page {
  --adm-brand: #6e56cf; --adm-brand-d: #5b45b8; --adm-brand-t: #4c3d9e; --adm-brand-bg: #f2effc;
  --adm-warn-t: #8a5300;      /* 原 #a4691a 在 #fff8ec 上只有 4.31:1 */
  --adm-danger: #b42318;      /* 原 #fa5151 当文字色只有 3.4:1 */
  --adm-t2: #565c64; --adm-t3: #646a73;   /* 原 t3 #6b7280 在 #f2f3f5 上只有 4.35:1 */
}
#data-connect-view {
  --dc-brand: #465fff; --dc-brand-d: #3538cd; --dc-brand-t: #2d31a6; --dc-brand-bg: #eef2ff;
  --dc-warn-t: #8a5300; --dc-danger: #b42318;
  --dc-t2: #565c64; --dc-t3: #646a73;
}
#profile-view {
  --pf-brand: #6e56cf; --pf-brand-d: #5b45b8; --pf-brand-t: #4c3d9e; --pf-brand-bg: #f2effc;
  --pf-warn-t: #8a5300; --pf-danger: #b42318;
  --pf-t2: #565c64; --pf-t3: #646a73;
}
#redeem-view {
  /* ⚠️ 这里**故意不写** --rdm-brand 那一行：本页主色是老板定的微信实心绿，
     由 index.html 自己的 `#redeem-view` 令牌块提供（--rdm-brand/-d/-t/-bg/-line 一整套
     = #06ad56 / #059048 / #07773f / #e8f8ef / #c6ecd7）。详见上面那段说明。 */
  --rdm-warn-t: #8a5300; --rdm-danger: #b42318;
  --rdm-t2: #565c64; --rdm-t3: #646a73;
}

/* ---- 剩下几处孤立的低对比度 ---- */
/* 矩阵里的「—」空值标记：原 #dcdfe6 在白底上 1.33:1，等于看不见 */
.dc-matrix .cell-na { color: #71717a; }
/* 矩阵里的「○」未支持标记：原 #c9cdd4 只有 1.59:1（介入平台那一页 ×9） */
.dc-matrix .cell-no { color: #71717a; }
/* 档案页的完成度进度条：原本是绿→蓝的硬编码渐变（#06ad56→#0b74d9），
   是整站唯一没跟着强调色走的主色元素。改用本页的 --pf-brand（已在上面统一成紫）。 */
#profile-view .pf-bar-fill { background: var(--pf-brand); }
/* 自动化运营那张「总开关」卡原本是淡绿渐变 + 绿描边。它不是状态提示（不管开关开没开都是绿的），
   留着就是全站第二个强调色。压成和别处一样的白卡 + 发丝描边。 */
#automation-view .au-master {
  border: 1px solid var(--ui-line);
  background: var(--ui-surface);
  box-shadow: var(--ui-shadow);
}
/* 智能广告「图片库」的用量与空态说明：原 #98a2b3 只有 2.58:1 */
.ad-view .ad-lib-usage,
.ad-view .ad-lib-empty { color: #71717a; }

/* ============================================================
   「数据」页的左侧列表（#industrySidebar）
   ------------------------------------------------------------
   ⚠️⚠️ 这一列**差点坏掉**：`#industry-view` 原来的底色是 #0b0d12（近黑），
       而这个从 React Bits 移植来的 LineSidebar 把「未选中」的字色写成了
       `--text-color:#c4c4c4`（浅灰）—— 那是配深色底用的。底色一改成 #f7f7f8，
       整列菜单掉到 1.5:1 左右，**几乎看不见**，而它是老板点每个模块的入口。
   ⚠️⚠️ 但那三个色**不能在这里补**：main.js 是用
       `nav.style.setProperty("--text-color", …)` **写成内联自定义属性**的，
       内联声明压得过任何样式表规则（不加 !important 的写在这里等于没写）。
       所以真正的改动在 main.js 的 `CONFIG`（accentColor / textColor）里，
       这里刻意不再重复设一遍同一个变量 —— 同一个值写两个地方，日后只会打架。
   ⚠️ 顺带：「02～11」那串序号原来是 `opacity: calc(0.55 + effect*0.45)`，
       静止时把 #c4c4c4 再糊一层 → 约 2.6:1。序号也属于要读的字，压到正文线以上，
       但仍比左边那行标题浅一档，保住「次要」的层级。
   ============================================================ */
#industry-view .line-sidebar__index {
  opacity: 1;
  color: #71717a;
}
/* 注：「数据未接通」那条状态条的 ok 态，字色已直接改在 index.html 的
   `.industry-data-status.ok` 里（原来的 #86efac 是浅绿压淡绿底，接通数据后立刻看不见），
   这里刻意不再挂一条覆盖规则 —— 同一个值写两处只会互相打架。 */

/* ============================================================
   AI 决策面板（.ai-block / .ai-card / .ai-btn 那一族）
   ------------------------------------------------------------
   ⚠️⚠️ 这族样式写在 #assistant-view 的 <style> 里（原文注明「四个 AI 决策面板唯一的样式来源」），
       但**用它的元素根本不在这页上** —— 它们是营销助手 / 库存管家 / 会员管家 /
       私域运营几页里的「AI 决策」标签页。那些标签**默认不展开**，所以逐页对比度扫描
       （只扫默认标签）永远扫不到它们 = 标准假绿灯。
       实测证据（_ui97_aiprojobe.mjs，点开「AI 智能决策」后量）：营销助手那一页
       **22 个可见元素里 14 个不达标**，最差 1.13:1（`.ai-btn` 淡紫字压淡紫底）、
       1.16:1（`.ai-title` #e5e7eb 落在浅底上 = 等于没字）。

   ⚠️ 作用域只挂 .dash-view:is(#dashboard-view, :not(#dashboard-view))：
       · 看板首页一个字节不动（它也有 .dash-view）；
       · #assistant-view 自己的那套（.ai-msg/.ai-row/.ai-avatar/.ai-think/.ai-web-*）
         **不在下面这张清单里**，不会被碰到。
       · 唯一会被碰到的交叉点是 `.ai-badge`（助手页顶栏那个「本地规则」角标），
         但 `#assistant-view #assistantAiSource` 是 (2,0,0)，比下面这些 (1,2,0) 高，仍然由它接管。
   ============================================================ */
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-block {
  border: 1px solid var(--ui-line);
  background: var(--ui-surface);
  box-shadow: var(--ui-shadow);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-title { color: var(--ui-t1); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-note { color: var(--ui-t3); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-sub { color: #3538cd; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-card {
  border: 1px solid var(--ui-line);
  background: var(--ui-surface-2);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-card.advised {
  border-color: rgba(70, 95, 255, .32);
  background: #f5f7ff;
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-card.adopted {
  border-color: rgba(31, 99, 41, .3);
  background: #f2f8f3;
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-card-title { color: #3538cd; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-reason { color: var(--ui-t2); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-reason b { color: #3538cd; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-action { color: #0e7490; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-meta { color: var(--ui-t3); }

.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-btn {
  border: 1px solid var(--ui-line-2);
  background: var(--ui-surface);
  color: var(--ui-t2);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-btn:hover {
  border-color: var(--ui-accent);
  background: var(--ui-accent-soft);
  color: #3538cd;
}
/* ⚠️ 主按钮做成实色强调蓝 + 白字（4.8:1）。原来「淡紫字压 15% 淡紫底」只有 1.13:1 */
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-btn.primary {
  border-color: var(--ui-accent);
  background: var(--ui-accent);
  color: #fff;
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-btn.primary:hover { background: #3a4fd8; border-color: #3a4fd8; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-btn.ok {
  border-color: rgba(31, 99, 41, .35);
  background: #eaf4ec;
  color: #1f6329;
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-btn.warn {
  border-color: rgba(143, 85, 0, .35);
  background: #fdf4e6;
  color: #8f5500;
}

.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-loading { color: var(--ui-t3); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-loading::before {
  border-color: #dbe1ff;
  border-top-color: var(--ui-accent);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-src { color: var(--ui-t3); }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-src b { color: #52525b; }

.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-tag {
  border: 1px solid var(--ui-line-2);
  background: var(--ui-surface);
  color: var(--ui-t2);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-tag.on {
  background: var(--ui-accent);
  border-color: var(--ui-accent);
  color: #fff;
}

.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-plan {
  border: 1px solid rgba(70, 95, 255, .3);
  background: #f5f7ff;
}
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-plan-h { color: #3538cd; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-plan-text { color: var(--ui-t2); }

.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-badge.on { color: #1f6329; background: #eaf4ec; }
.dash-view:is(#dashboard-view, :not(#dashboard-view)) .ai-badge.off { color: #8f5500; background: #fdf4e6; }

/* 滚动条跟着浅色走（Chromium 系） */
.dash-view:is(#dashboard-view, :not(#dashboard-view))::-webkit-scrollbar { width: 10px; height: 10px; }
.dash-view:is(#dashboard-view, :not(#dashboard-view))::-webkit-scrollbar-thumb {
  background: #d8d8de; border-radius: 99px; border: 3px solid var(--ui-bg);
}
.dash-view:is(#dashboard-view, :not(#dashboard-view))::-webkit-scrollbar-thumb:hover { background: #c2c2cb; }

/* ============================================================
   v99 · 照模板「搬样子」（老板 2026-10-15 原话：
     「你这两页改了和没改一样，我让你完全按照你给我截图的模板来，
       布局颜色样子都要一模一样，只不过把功能融合一下」）
   ------------------------------------------------------------
   ⚠️ v98 只动了字体、圆角、留白 —— 布局和颜色原封没动，所以他说「改了和没改一样」。
      那句评价是准的。这一版不再「上调观感」，而是**照截图逐项搬**：

     看板 #dashboard-view      → 07 TailAdmin（HTML 版）
        · 页面底 #f9fafb，卡片纯白 + 1px #e4e7ec + 16px 圆角、**不上阴影**
        · KPI 卡 = 左上圆角方形图标块(46×46/#f2f4f7) + 灰色小标签 +
          大号粗体数字 + **同一行右侧的内联涨跌**（裸文字 ↑11.0%，不是药丸）
        · 图表靛蓝 #465fff、只留极淡横向格线、面积带自上而下的渐变
        · 分段控件 = 浅灰槽 + 选中项浮起的白块

     经营统计 #statistics-view → 06b Semi Design（应用预览）
        · 页面底**纯白**，卡片靠 1px 描边分层、8px 圆角、不上阴影
        · 指标区**不套卡片**，直接一条平铺数字行（标签在上、数字在下、
          涨跌紧挨在数字右边），单元格之间一条极淡竖线
        · 选中态是**浅蓝底蓝字**，不是 TailAdmin 那种白块
        · 表格：表头浅灰底 + 只有横向细线、行高放开

   ⚠️ 强调色：这两页由 v97 的紫 #6e56cf 换成模板的靛蓝 #465fff ——
      他要的是「颜色一模一样」，模板里就是这个蓝。
      ⚠️ v99d（2026-10-15）已铺开到老板点名的那 **11 个模块页**（见 _v99d_widen.py 的注释）。
      ⚠️ v97 令牌块里的 --ui-accent 仍然是紫，**这是故意的**：
         它会连带 #profile-view / #notifications-view / #ad-view /
         #admin-view / #redeem-view，而那几页本轮**不在范围**，
         且扫码验券那页的绿是老板拍板的、一个字节都不许动。
         11 页的蓝由下面那个作用域块自己覆盖。

   ⚠️ 特异性：共用规则写 `.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) …` = (1,2,0)，
      与 v97 那 111 条**同分**，靠「本文件在后面」取胜。
      页级规则写 `.dash-view#dashboard-view …` / `.dash-view#statistics-view …`，
      同为 (1,2,0) 且排在共用规则**之后**，所以能盖住共用规则。
      ⚠️ 容器级覆盖必须写成 `.dash-view#statistics-view`（=1,1,0）——
         只写 `#statistics-view` 是 (1,0,0)，**压不过**上面那条 (1,1,0) 的共用规则。
      ⚠️ 千万别写成裸 `.dash-view .dash-kpi-value`（(0,2,0)），
         会被页里 `#statistics-view …` 这类 (1,1,0) 的规则反过来压住。

   ⚠️ 对比度两处**故意没有照抄模板原值**（模板自己那两处过不了 AA）：
      · TailAdmin 的涨跌绿 #12b76a / 红 #f04438 压在白卡上只有 2.62:1 / 3.76:1。
        换成同一套 Tailwind 色阶里更深的两档 #027a48 / #b42318（5.41:1 / 6.57:1）。
      · Semi 的选中态 #1664ff 压 #e8f3ff 只有 4.35:1，换同族的 #3538cd 压 #eef2ff（7.21:1）。
      外观上看是同一个绿、同一个蓝，只是深一档 —— 这不是审美，是能不能读。
   ============================================================ */

/* ---- 令牌：这两页整体换成模板的灰阶与强调色 ---- */
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) {
  --ui-bg: #f9fafb;
  --ui-surface: #ffffff;
  --ui-surface-2: #f9fafb;
  --ui-line: #e4e7ec;
  --ui-line-2: #d0d5dd;
  --ui-t1: #101828;
  --ui-t2: #344054;
  --ui-t3: #667085;
  --ui-accent: #465fff;
  --ui-accent-soft: #eef2ff;
  --ui-shadow: none;
  --tpl-radius: 12px;
  --tpl-pad: 22px;
}
/* 经营统计按 Semi 走：纯白页面底、小圆角（它的卡片靠描边分层，不靠底色差） */
.dash-view#statistics-view {
  --ui-bg: #ffffff;
  --ui-surface-2: #fafafa;
  --ui-line: #e5e7eb;
  --tpl-radius: 8px;
  --tpl-pad: 18px;
}

/* ---- 共用：卡片一律白底 + 发丝描边 + 不上阴影（TailAdmin / Semi 都这样） ---- */
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-card,
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-widget,
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .stat-block {
  border: 1px solid var(--ui-line);
  background: var(--ui-surface);
  border-radius: var(--tpl-radius);
  padding: var(--tpl-pad);
  box-shadow: none;
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-card-head { margin-bottom: 18px; }
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-card-title,
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-widget-title,
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .stat-block-title {
  font-size: 17px;
  font-weight: 600;
  letter-spacing: -.01em;
  color: var(--ui-t1);
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-card-sub,
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-widget-sub {
  font-size: 12.5px;
  color: var(--ui-t3);
}

/* ---- 共用：KPI 卡骨架（看板套白卡、经营统计不套，见各自的页级规则） ---- */
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-kpis {
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 16px;
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-kpi {
  border: 1px solid var(--ui-line);
  background: var(--ui-surface);
  border-radius: var(--tpl-radius);
  padding: var(--tpl-pad);
  box-shadow: none;
  /* ⚠️ 原来那条 3px 的紫→青竖条是深色时代的装饰，两套模板里都没有 */
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-kpi::before { display: none; }
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-kpi:hover {
  transform: none;
  border-color: var(--ui-line-2);
  box-shadow: none;
}
/* 左上角那枚圆角方形图标块 —— TailAdmin KPI 卡最显眼的一处 */
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-kpi-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 8px;
  margin-bottom: 18px;
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-kpi-ico {
  width: 46px; height: 46px; flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  border-radius: 12px;
  background: #f2f4f7;
  color: #475467;
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-kpi-label {
  font-size: 14px;
  font-weight: 500;
  letter-spacing: 0;
  color: var(--ui-t3);
  margin-bottom: 6px;
}
/* 数字与涨跌同一行：数字在左、涨跌贴右（TailAdmin 的排法） */
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-kpi-row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 2px 10px;
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-kpi-value {
  font-family: 'DM Sans', 'PingFang SC', 'Microsoft YaHei', sans-serif;
  font-size: 30px;
  font-weight: 700;
  line-height: 1.15;
  letter-spacing: -.022em;
  font-variant-numeric: tabular-nums;
  color: var(--ui-t1);
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-kpi-value.na { color: #98a2b3; }
/* 涨跌 = 裸文字（v98 那个药丸是我自己加的，模板里没有，撤掉） */
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-kpi-delta {
  font-size: 13px;
  font-weight: 600;
  white-space: nowrap;
  color: var(--ui-t3);
  background: none;
  padding: 0;
  border-radius: 0;
  margin: 0;
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-kpi-row .dash-kpi-delta { margin-left: auto; }
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-kpi-delta.up { color: #027a48; }
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-kpi-delta.down { color: #b42318; }
/* v74 目标进度线：原来槽色是内联的 rgba(255,255,255,.12)（配深色底的），
   放在白卡上等于没有槽 —— 改成类名，槽色跟着浅色走。 */
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-goal-track {
  margin-top: 10px;
  height: 6px;
  border-radius: 999px;
  background: #eaecf0;
  overflow: hidden;
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-goal-fill {
  height: 100%;
  border-radius: 999px;
  background: var(--ui-accent);
  transition: width .4s ease;
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-kpi-plats {
  margin-top: 8px;
  font-size: 12px;
  color: var(--ui-t3);
  line-height: 1.6;
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-kpi-plat i { color: var(--ui-t3); }
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-kpi-plat-sep { color: #d0d5dd; }

/* ---- 共用：TOP 榜 ---- */
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-top-rank {
  border-radius: 7px;
  background: #f2f4f7;
  color: #475467;
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-top-row:nth-child(1) .dash-top-rank {
  background: #eef2ff;
  color: #3538cd;
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-top-name { color: var(--ui-t2); }
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-top-bar-wrap { background: #f2f4f7; }
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-top-bar { background: var(--ui-accent); }
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-top-val {
  color: var(--ui-t1);
  font-family: 'DM Sans', 'PingFang SC', 'Microsoft YaHei', sans-serif;
  font-variant-numeric: tabular-nums;
}

/* ---- 共用：预警列表 ----
   ⚠️ 原来是「左侧一道彩色竖条 + 半透明彩底」，那正是各类 AI 模板的典型记号，
      两套参考里都没有 —— 改成 TailAdmin 的做法：白卡 + 描边 + 一枚状态点。 */
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-alert {
  border: 1px solid var(--ui-line);
  border-left-width: 1px;
  border-radius: 12px;
  background: var(--ui-surface);
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-alert.red { border-color: #fda29b; background: #fffbfa; }
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-alert.yellow { border-color: #fec84b; background: #fffcf5; }
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-alert.red .dash-alert-dot { background: #f04438; box-shadow: none; }
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-alert.yellow .dash-alert-dot { background: #f79009; box-shadow: none; }
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-alert-title { color: var(--ui-t1); }
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-alert.red .dash-alert-title { color: #b42318; }
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-alert.yellow .dash-alert-title { color: #b54708; }
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-alert-detail { color: var(--ui-t3); }
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-alert-suggest { color: var(--ui-t3); }
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-empty { color: var(--ui-t3); }

/* ---- 共用：导出按钮（TailAdmin 的主按钮 = 靛蓝实心 + 8px 圆角，不是胶囊） ---- */
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-voice {
  background: var(--ui-accent);
  border-radius: 8px;
  box-shadow: 0 1px 2px rgba(70, 95, 255, .24);
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-voice:hover {
  background: #3a4fd8;
  transform: none;
  box-shadow: 0 2px 6px rgba(70, 95, 255, .32);
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-custom-picker { border-color: var(--ui-line); }
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-custom-ok { border-radius: 6px; }

/* ---- 共用：「恢复被隐藏的卡片」那条虚线提示（原来整条是紫的） ---- */
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-restore {
  border: 1px dashed var(--ui-line-2);
  background: #f9fafb;
  color: var(--ui-t2);
  border-radius: 12px;
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-restore b { color: var(--ui-t1); }
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-restore button {
  border: 1px solid var(--ui-line-2);
  background: #fff;
  color: var(--ui-t2);
  border-radius: 8px;
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-restore button:hover { background: #f2f4f7; }

/* ---- 共用：图表放大浮层（原来是近黑的 #12141f，在浅色皮肤下整块是黑的） ---- */
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-zoom { background: rgba(16, 24, 40, .45); }
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-zoom-card {
  background: #fff;
  border: 1px solid var(--ui-line);
  border-radius: 16px;
  box-shadow: 0 24px 60px rgba(16, 24, 40, .18);
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-zoom-close {
  border: 1px solid var(--ui-line);
  background: #fff;
  color: var(--ui-t2);
}
.dash-view:is(#dashboard-view, #statistics-view, #data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dash-zoom-close:hover { background: #f2f4f7; }

/* ============================================================
   看板 · 照 TailAdmin 搬
   ============================================================ */
/* 顶部分段控件：浅灰槽 + 选中项浮起一块白（TailAdmin 的 Overview/Sales/Revenue） */
.dash-view#dashboard-view .dash-time-switch {
  background: #f2f4f7;
  border: 1px solid transparent;
  border-radius: 10px;
  padding: 3px;
}
.dash-view#dashboard-view .dash-time-btn {
  color: #475467;
  font-weight: 500;
  border-radius: 8px;
  padding: 5px 14px;
}
.dash-view#dashboard-view .dash-time-btn:hover { color: #101828; }
.dash-view#dashboard-view .dash-time-btn.active {
  color: #101828;
  background: #fff;
  box-shadow: 0 1px 2px rgba(16, 24, 40, .06), 0 1px 3px rgba(16, 24, 40, .10);
}
/* 图表卡：标题一行 + 右侧 ⋯（TailAdmin 的卡片头） */
.dash-view#dashboard-view .dash-widget-head { gap: 12px; }
.dash-view#dashboard-view .dash-widget { display: flex; flex-direction: column; gap: 14px; }
.dash-view#dashboard-view .dash-chart { height: 280px; }
/* 卡内的分段按钮（销量/毛利）跟顶栏那排用同一套：灰槽 + 浮起的白块 */
.dash-view#dashboard-view .dash-seg {
  background: #f2f4f7;
  border: 1px solid transparent;
  border-radius: 10px;
  padding: 3px;
}
.dash-view#dashboard-view .dash-seg-btn { color: #475467; font-weight: 500; border-radius: 8px; padding: 5px 14px; }
.dash-view#dashboard-view .dash-seg-btn:hover { color: #101828; }
.dash-view#dashboard-view .dash-seg-btn.active {
  color: #101828;
  background: #fff;
  box-shadow: 0 1px 2px rgba(16, 24, 40, .06), 0 1px 3px rgba(16, 24, 40, .10);
}

/* ============================================================
   看板 · 版面（v99b：照 TailAdmin 那张看板的**排法**搬，不只是配色）

   ① 营业额 / 订单数 / 客单价 / 毛利额 四张指标卡（左 8 栏，2×2，竖着跨两排）
   ② 本月目标 半圆仪表盘（右 4 栏，竖着跨两排）
      —— 模板里 Monthly Target 就是顶着最上面、与左边 KPI 卡齐平的那一格，
         也就是老板说的「半圆在右上角」
   ③ 近 14 天营业额 竖状图（整宽）—— 模板的 Monthly Sales
   ④ 分时营业额（整宽）—— 模板的 Statistics
   ⑤ 异常预警 8 栏 | 渠道拆分 4 栏

   ⚠️⚠️ 12 栏是**自动排版**的，靠 DOM 顺序落位（index.html 的 .dash-widgets）。
      半圆要落在右上角，靠的是「指标卡先占掉左 8 栏的两排 → 半圆正好落进右 4 栏」。
      **「指标卡跨两排」和「半圆紧跟指标卡之后」缺一不可**，少任何一条半圆就掉到
      第二排左半边去（曾经改成「指标卡整宽一排 + 竖状图并排」，半圆就低了一排、
      不像模板那个顶在最上面的位置，所以又改回来了）。
   ============================================================ */
.dash-view#dashboard-view .dash-body { max-width: 1400px; }
.dash-view#dashboard-view .dash-kpis {
  grid-column: span 8;
  grid-row: span 2;
  grid-template-columns: repeat(2, 1fr);
  gap: 16px;
}
.dash-view#dashboard-view .dash-widget.span-12 { grid-column: span 12; }
.dash-view#dashboard-view .dash-goal-card { grid-column: span 4; grid-row: span 2; }
/* ⚠️ .small（渠道拆分的饼图）也得补一条：上面 v99 那条 .dash-chart{280px} 是页面级、
      比 index.html 里的 .dash-chart.small 分高，不补就被顶成 280。 */
.dash-view#dashboard-view .dash-chart.bars { height: 280px; }
.dash-view#dashboard-view .dash-chart.wide { height: 320px; }
/* 饼图别太高：这两张卡并排，行高取两者里高的那个。饼图一高，左边预警卡的
   列表底下就空出一大块白（看着像没渲染完）。压到 200 两卡基本齐平。 */
.dash-view#dashboard-view .dash-chart.small { height: 200px; }
/* 放大查看时图表要长高。
   ⚠️ 这三条必须排在上面 .bars / .wide 的**后面**：与它们同分（都是页面级 + 类名），
      只靠源码顺序取胜。v99 就漏了这一层 —— 放大层里的图画布还是原来的高度。 */
.dash-view#dashboard-view .dash-zoom-card .dash-chart { height: 420px; }
.dash-view#dashboard-view .dash-zoom-card .dash-chart.bars,
.dash-view#dashboard-view .dash-zoom-card .dash-chart.wide { height: 420px; }

/* 涨跌那枚小药丸：模板里**是有浅色底**的（v99 只写成裸文字，少了一层） */
.dash-view#dashboard-view .dash-kpi-row .dash-kpi-delta {
  padding: 2px 8px;
  border-radius: 999px;
}
.dash-view#dashboard-view .dash-kpi-delta.up { background: #ecfdf3; }
.dash-view#dashboard-view .dash-kpi-delta.down { background: #fef3f2; }

/* ---- 本月目标：半圆仪表盘 ---- */
.dash-view#dashboard-view .dash-goal-card .dash-goal-body {
  flex: 1;
  display: flex;
  flex-direction: column;
  min-height: 0;
}
.dash-view#dashboard-view .dash-goal-top { position: relative; }
.dash-view#dashboard-view .dash-gauge {
  display: block;
  width: 100%;
  aspect-ratio: 240 / 140;
}
.dash-view#dashboard-view .dash-gauge-track {
  fill: none;
  stroke: #eaecf0;
  stroke-width: 11;
  stroke-linecap: round;
}
.dash-view#dashboard-view .dash-gauge-fill {
  fill: none;
  stroke: var(--ui-accent);
  stroke-width: 11;
  stroke-linecap: round;
  transition: stroke-dashoffset .6s cubic-bezier(.4, 0, .2, 1);
}
/* ⚠️ 达成时**不给弧换颜色**：模板里那道弧自己就是强调色，达成这层意思由开口里那枚
   绿色「已达成」小药丸说（模板的 +10% 绿药丸就是这个位置）。曾经把整条弧染成深绿
   #027a48，视觉上压过满页的靛蓝，一眼看过去像另一个软件。 */
.dash-view#dashboard-view .dash-gauge-fill.is-muted { stroke: #d0d5dd; }
/* 数字 + 药丸叠在半圆开口里：整叠贴着 SVG 底边往上收 12% */
.dash-view#dashboard-view .dash-goal-center {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 12%;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
}
.dash-view#dashboard-view .dash-gauge-pct {
  font-family: 'DM Sans', 'PingFang SC', 'Microsoft YaHei', sans-serif;
  font-size: 32px;
  font-weight: 700;
  line-height: 1;
  letter-spacing: -.02em;
  font-variant-numeric: tabular-nums;
  color: var(--ui-t1);
}
/* 同上：大数字保持中性深色（模板里那个大百分比就是黑的），只有没设目标时才转灰 */
.dash-view#dashboard-view .dash-gauge-pct.is-muted { color: #98a2b3; }
.dash-view#dashboard-view .dash-gauge-pill {
  display: inline-flex;
  align-items: center;
  height: 22px;
  padding: 0 9px;
  border-radius: 999px;
  font-size: 12px;
  font-weight: 600;
  background: var(--ui-accent-soft);
  color: #3538cd;
}
.dash-view#dashboard-view .dash-gauge-pill.is-ok { background: #ecfdf3; color: #027a48; }
.dash-view#dashboard-view .dash-goal-note {
  margin-top: 10px;
  text-align: center;
  font-size: 12.5px;
  line-height: 1.6;
  color: var(--ui-t3);
}
/* 第二行走 <span>，换行显示（模板那两行灰字） */
.dash-view#dashboard-view .dash-goal-note span { display: block; }
/* 底部三格统计带：贴到卡片下沿、通到左右两边（模板卡底下那条浅灰带） */
.dash-view#dashboard-view .dash-goal-foot {
  margin: auto calc(var(--tpl-pad) * -1) calc(var(--tpl-pad) * -1);
  padding: 14px var(--tpl-pad);
  border-top: 1px solid var(--ui-line);
  background: #fcfcfd;
  border-radius: 0 0 calc(var(--tpl-radius) - 1px) calc(var(--tpl-radius) - 1px);
  display: grid;
  grid-template-columns: repeat(3, 1fr);
}
.dash-view#dashboard-view .dash-goal-foot-item { min-width: 0; text-align: center; }
.dash-view#dashboard-view .dash-goal-foot-item + .dash-goal-foot-item {
  border-left: 1px solid var(--ui-line);
}
.dash-view#dashboard-view .dash-goal-foot-label {
  display: block;
  font-size: 12px;
  color: var(--ui-t3);
  margin-bottom: 3px;
}
.dash-view#dashboard-view .dash-goal-foot-val {
  display: block;
  font-family: 'DM Sans', 'PingFang SC', 'Microsoft YaHei', sans-serif;
  font-size: 15px;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  color: var(--ui-t1);
}
.dash-view#dashboard-view .dash-goal-foot-delta {
  margin-left: 5px;
  font-size: 11.5px;
  font-weight: 600;
}
.dash-view#dashboard-view .dash-goal-foot-delta.up { color: #027a48; }
.dash-view#dashboard-view .dash-goal-foot-delta.down { color: #b42318; }

/* ---- 异常预警：改成**一条列表**（行与行一根发丝线 + 左边一枚「严重 / 关注」药丸） ----
   v99 之前是「一张张独立小卡」，每行都带描边和彩底 —— 堆在一起像账单。
   模板里没有预警卡，所以这段是我们自己的排法，用的是同一套白底 + 发丝线 + 状态色的词汇。
   ⚠️ .dash-alert.red / .yellow 那条共用规则是 (1,3,0)，比下面这条 (1,2,0) 高，
      所以彩底必须**单独再压一次**，否则红黄两行的浅色底会留下来。 */
/* 列表撑满整张卡（.dash-widget 是竖向 flex）。
   ⚠️ 老板库里现在一单没有，他第一次打开看到的就是空态那两行；不撑满的话空态孤零零
      挂在卡片顶头、底下空出两百来像素，看着像没渲染完。撑满后空态自己居中。 */
.dash-view#dashboard-view .dash-alert-list { gap: 0; flex: 1; display: flex; flex-direction: column; }
.dash-view#dashboard-view .dash-alert {
  display: flex;
  gap: 12px;
  padding: 14px 0;
  border: 0;
  border-radius: 0;
  background: transparent;
  border-top: 1px solid var(--ui-line);
}
.dash-view#dashboard-view .dash-alert.red,
.dash-view#dashboard-view .dash-alert.yellow {
  border-color: transparent;
  background: transparent;
}
.dash-view#dashboard-view .dash-alert:first-child { border-top: 0; padding-top: 2px; }
.dash-view#dashboard-view .dash-alert-chip {
  flex: none;
  display: inline-flex;
  align-items: center;
  height: 22px;
  padding: 0 9px;
  border-radius: 6px;
  font-size: 12px;
  font-weight: 600;
}
.dash-view#dashboard-view .dash-alert.red .dash-alert-chip { background: #fef3f2; color: #b42318; }
.dash-view#dashboard-view .dash-alert.yellow .dash-alert-chip { background: #fffaeb; color: #b54708; }
.dash-view#dashboard-view .dash-alert-main { flex: 1; min-width: 0; }
/* ⚠️ 标题不按严重度染色了。左边那枚 chip 已经把「严重/关注」说清楚了，标题再染一遍
      就是同一件事说两次；四条排下来满屏棕红字，整张卡看着发闷。
      模板里的列表项标题也全是中性深色。
   ⚠️ 必须连着 .red / .yellow 一起写：上面那条共用规则带 `.dash-alert.yellow`
      是 (1,4,0)，光写 `.dash-alert .dash-alert-title` 只有 (1,3,0)，压不住。 */
.dash-view#dashboard-view .dash-alert.red .dash-alert-title,
.dash-view#dashboard-view .dash-alert.yellow .dash-alert-title { color: var(--ui-t1); }
.dash-view#dashboard-view .dash-alert-title { font-size: 14px; }
.dash-view#dashboard-view .dash-alert-detail { font-size: 12.5px; }
.dash-view#dashboard-view .dash-alert-suggest { font-size: 12.5px; }
/* 空态：一枚绿勾 + 两行话（原来只有中间一行灰字，看着像漏了东西） */
/* margin: auto 0 —— 只在竖向有多余空间时把它顶到中间；有预警时列表从顶上排，不受影响 */
.dash-view#dashboard-view .dash-alert-empty { display: flex; gap: 12px; padding: 6px 0 2px; margin: auto 0; }
.dash-view#dashboard-view .dash-alert-ok {
  flex: none;
  width: 34px;
  height: 34px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: #ecfdf3;
  color: #027a48;
  font-size: 16px;
  font-weight: 700;
}
.dash-view#dashboard-view .dash-alert-empty-text { min-width: 0; }
.dash-view#dashboard-view .dash-alert-empty-text b {
  display: block;
  font-size: 14px;
  font-weight: 600;
  color: var(--ui-t1);
}
.dash-view#dashboard-view .dash-alert-empty-text span {
  display: block;
  margin-top: 2px;
  font-size: 12.5px;
  color: var(--ui-t3);
}

/* ============================================================
   经营统计 · 照 Semi Design 搬
   ============================================================ */
/* ⚠️ Semi 的顶部指标**不套卡片**，是直接铺在白页上的一条数字行。
      这里用 `:has(> #statKpis)` 摘掉「多周期报表」那层卡片壳。
      `:has()` 在老浏览器上整条规则会被丢弃 = 退回「有卡片」的样子，不会坏。 */
.dash-view#statistics-view .stat-block:has(> .dash-kpis) {
  border: 0;
  background: transparent;
  padding: 0 0 6px;
  border-radius: 0;
}
.dash-view#statistics-view .dash-kpis {
  grid-template-columns: repeat(auto-fit, minmax(158px, 1fr));
  gap: 0;
}
.dash-view#statistics-view .dash-kpi {
  position: relative;
  border: 0;
  background: transparent;
  border-radius: 0;
  box-shadow: none;
  padding: 4px 18px 10px 0;
}
/* 单元格之间一条极淡的竖线（Semi 那排指标的中间那道） */
.dash-view#statistics-view .dash-kpi + .dash-kpi {
  border-left: 1px solid #f0f0f0;
  padding-left: 18px;
}
.dash-view#statistics-view .dash-kpi:hover { border-color: #f0f0f0; }
/* 指标格不显示图标块；⋯ 菜单浮到右上角，不占数字的位置 */
.dash-view#statistics-view .dash-kpi-ico { display: none; }
.dash-view#statistics-view .dash-kpi-head {
  position: absolute;
  top: 0; right: 0;
  margin: 0;
}
.dash-view#statistics-view .dash-kpi-label { font-size: 13px; margin-bottom: 8px; }
.dash-view#statistics-view .dash-kpi-value { font-size: 26px; }
/* Semi 的涨跌紧挨着数字，不推到行尾 */
.dash-view#statistics-view .dash-kpi-row { justify-content: flex-start; }
.dash-view#statistics-view .dash-kpi-row .dash-kpi-delta { margin-left: 0; font-size: 12px; }
.dash-view#statistics-view .stat-block-title { font-size: 15px; }

/* 分段控件：浅蓝底蓝字的选中态（不是 TailAdmin 那种白块） */
.dash-view#statistics-view .dash-time-switch {
  background: #f5f6f7;
  border: 1px solid transparent;
  border-radius: 6px;
  padding: 2px;
}
.dash-view#statistics-view .dash-time-btn {
  color: #4e5969;
  border-radius: 5px;
  padding: 5px 13px;
}
.dash-view#statistics-view .dash-time-btn:hover { color: #1d2129; }
.dash-view#statistics-view .dash-time-btn.active {
  color: #3538cd;
  background: #eef2ff;
  box-shadow: none;
}
/* 卡内的分段按钮（环比/同比/自定义、销量/毛利）跟顶栏那排同一套浅蓝选中态 */
.dash-view#statistics-view .dash-seg {
  background: #f5f6f7;
  border: 1px solid transparent;
  border-radius: 6px;
  padding: 2px;
}
.dash-view#statistics-view .dash-seg-btn { color: #4e5969; border-radius: 5px; padding: 5px 13px; }
.dash-view#statistics-view .dash-seg-btn:hover { color: #1d2129; }
.dash-view#statistics-view .dash-seg-btn.active {
  color: #3538cd;
  background: #eef2ff;
}

/* 对比行 / 渠道行 / 顾客行：Semi 是「只有横向细线、没有底色块」 */
.dash-view#statistics-view .stat-cmp-row,
.dash-view#statistics-view .stat-channel-row,
.dash-view#statistics-view .stat-cust-row {
  background: transparent;
  border-radius: 0;
  border-bottom: 1px solid #f0f0f0;
  padding: 12px 4px;
}
.dash-view#statistics-view .stat-top10-row { border-radius: 0; padding: 9px 4px; }
.dash-view#statistics-view .stat-top10-row:hover,
.dash-view#statistics-view .stat-channel-row:hover,
.dash-view#statistics-view .stat-cust-row:hover { background: #f7f8fa; }
.dash-view#statistics-view .stat-cmp-cur,
.dash-view#statistics-view .stat-prod-val,
.dash-view#statistics-view .stat-struct-pct { color: #1d2129; }
.dash-view#statistics-view .stat-cmp-label,
.dash-view#statistics-view .stat-prod-name,
.dash-view#statistics-view .stat-struct-name { color: #4e5969; }
.dash-view#statistics-view .stat-cmp-base,
.dash-view#statistics-view .stat-prod-share,
.dash-view#statistics-view .stat-struct-cum,
.dash-view#statistics-view .stat-rank { color: #86909c; }
/* 条形图与排名序号：原来硬编码的紫渐变 → 本页强调色 */
.dash-view#statistics-view .stat-prod-bar { background: var(--ui-accent); border-radius: 999px; }
.dash-view#statistics-view .stat-prod-bar-wrap { background: #f0f1f3; border-radius: 999px; }
.dash-view#statistics-view .stat-struct-bar { background: var(--ui-accent); border-radius: 999px; }
.dash-view#statistics-view .stat-struct-bar-wrap { background: #f0f1f3; border-radius: 999px; }
.dash-view#statistics-view .stat-week-h { color: var(--ui-accent); }
/* 明细弹窗里的表格：Semi 表头是浅灰底、只有横向细线 */
.dash-view#statistics-view .stat-drill-head { border-bottom: 1px solid #f0f0f0; }
.dash-view#statistics-view .stat-drill-table th {
  background: #f7f8fa;
  color: #6b7280;
  font-weight: 500;
  font-size: 13px;
  border-bottom: 0;
  padding: 12px;
}
.dash-view#statistics-view .stat-drill-table td {
  padding: 14px 12px;
  font-size: 13px;
  color: #1d2129;
  border-bottom: 1px solid #f0f0f0;
}

/* ============================================================
   其余 9 个内页 · 按**页型**借模板（v99g）

   v99d/e/f 把颜色收成了一套，这一轮补的是**排法**。
   借哪一套是按页型分的（老板定的）：
     · 列表 / 表格页（库存管家、会员管家、私域运营、营销助手）
       → Semi：浅灰表头、横向细线、白卡 + 发丝线、无渐变
     · 表单 / 设置页（营销助手、自动化运营）
       → AntD：白底描边控件、32px 高、聚焦环、主色开关
     · 卡片头 / 向导（数据接入中心）
       → TDesign / TailAdmin：12px 圆角、发丝线、强调色只落在数字上
     · KPI 的图标点位
       → TailAdmin（已在上面那条共用的 .dash-kpi-ico 里）

   ⚠️ 只追加样式：index.html 与 main.js 一个字节都没动。
   ⚠️ 看板 / 经营统计（v99b/v99c 已完成）不在这个作用域里。
   ⚠️ 扫码验券的微信实心绿不在这个作用域里，一个字节没动。
   ============================================================ */

/* ---- 1. 卡片刻度：把 10/12/14px 的乱象收进模板的三档（容器 12 / 卡内小块 10 / 行条 8 / 控件 6） ---- */
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .stat-block,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mkt-panel > .stat-block,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-card,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-master,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dc-card,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .crm-broadcast,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .crm-cal,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .crm-set-card,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mem-set-card {
  border-radius: 12px;
}
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mkt-coupon,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mkt-copy-card,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mkt-funnel-step,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mkt-month,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mkt-plan,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mkt-report,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .inv-sum-card,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mem-detail-item,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mem-rfm-card,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .inv-cost-card,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .crm-card {
  border-radius: 10px;
}
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mkt-rule,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mkt-remind,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .inv-flow-row,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .inv-reason-bar .bar,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mem-risk-row,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mem-value-risk,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .crm-fun-bar,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-run,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-save {
  border-radius: 8px;
}

/* ---- 2. 「强调色淡底 + 强调色描边」的卡片 → 模板的白卡 + 发丝线 ----
   ⚠️ 强调不丢：大数字改用**强调色**（TailAdmin 也这么上色），
      底色和描边回到中性 —— 强调靠颜色，不靠一整块淡紫/淡蓝的底。 */
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mem-rfm-card,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .inv-cost-card,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .crm-card {
  border: 1px solid var(--ui-line);
  background: var(--ui-surface);
  box-shadow: none;
}
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mem-rfm-card .n,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .inv-cost-card .n,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .crm-card .n { color: var(--ui-accent); }
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mem-rfm-card .k,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .inv-cost-card .k,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .crm-card .k { color: var(--ui-t2); font-weight: 600; }
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mem-rfm-card .s,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .crm-card .s { color: var(--ui-t3); }

/* ---- 3. 行条：Semi 的列表是「只有一条横向细线」，不是一条条有底色的圆角块 ---- */
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mkt-rule,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .inv-flow-row,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mem-risk-row {
  background: transparent;
  border-radius: 0;
  border-bottom: 1px solid #f0f0f0;
  margin-bottom: 0;
  padding: 12px 4px;
}
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mkt-rule:hover,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .inv-flow-row:hover,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mem-risk-row:hover { background: #f7f8fa; }
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-log-item {
  background: transparent;
  border: 0;
  border-bottom: 1px solid #f0f0f0;
  border-radius: 0;
  margin-bottom: 0;
  padding: 12px 2px;
}

/* ---- 4. 表格：Semi 是浅灰表头 + 横向细线（原来表头纯白，和表体糊在一起） ---- */
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mkt-log-table th,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mem-table th,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dc-table th {
  background: #f7f8fa;
  color: #6b7280;
  font-weight: 500;
  font-size: 12.5px;
  padding: 11px 12px;
  border-bottom: 0;
}
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mkt-log-table td,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mem-table td,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .dc-table td {
  padding: 12px;
  font-size: 13px;
  color: var(--ui-t1);
  border-bottom: 1px solid #f0f0f0;
}
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mkt-log-table tr:hover td,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mem-table tr:hover td { background: #f7f8fa; }

/* ---- 5. 表单控件：照 AntD（白底 + #d9d9d9 描边 + 32px 高 + 聚焦环） ----
   ⚠️ 用 background-color 而不是 background 简写：
      .au-select 的箭头是 background-image 里那张 data-URI 的 SVG，
      写成 background 简写会把它一起清掉（下拉框就没箭头了）。 */
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) :is(.mkt-input, .au-input, .au-select, .mkt-form-row input:not([type=checkbox]):not([type=radio]), .mkt-form-row select, .inv-tools input:not([type=checkbox]):not([type=radio]), .inv-tools select, .mem-value-tools input:not([type=checkbox]):not([type=radio]), .mem-value-tools select, .crm-broadcast input:not([type=checkbox]):not([type=radio]), .crm-broadcast select) {
  background-color: #ffffff;
  border: 1px solid #d9d9d9;
  border-radius: 6px;
  color: var(--ui-t1);
  font-family: inherit;
  font-size: 13px;
  padding: 5px 10px;
  height: 32px;
  box-sizing: border-box;
  transition: border-color .15s ease, box-shadow .15s ease;
}
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) :is(.mkt-input, .au-input, .au-select, .mkt-form-row input:not([type=checkbox]):not([type=radio]), .mkt-form-row select, .inv-tools input:not([type=checkbox]):not([type=radio]), .inv-tools select, .mem-value-tools input:not([type=checkbox]):not([type=radio]), .mem-value-tools select, .crm-broadcast input:not([type=checkbox]):not([type=radio]), .crm-broadcast select):hover { border-color: #7592ff; }
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) :is(.mkt-input, .au-input, .au-select, .mkt-form-row input:not([type=checkbox]):not([type=radio]), .mkt-form-row select, .inv-tools input:not([type=checkbox]):not([type=radio]), .inv-tools select, .mem-value-tools input:not([type=checkbox]):not([type=radio]), .mem-value-tools select, .crm-broadcast input:not([type=checkbox]):not([type=radio]), .crm-broadcast select):focus {
  border-color: var(--ui-accent);
  box-shadow: 0 0 0 2px rgba(70, 95, 255, .12);
  outline: none;
}
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-select { padding-right: 26px; }
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mkt-form-row label,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-label,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mem-value-tools label { color: var(--ui-t2); font-size: 13px; width: auto; min-width: 52px; }

/* ---- 6. 开关：AntD 的开关打开是**主色**，不是绿（绿在这几页是「已完成」的语义色，
       拿它当「打开」用，两件事就混在一个颜色里了） ---- */
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mkt-toggle.on,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-toggle.on { background: var(--ui-accent); }

/* ---- 7. 渐变 → 实色（模板里没有渐变；老板嫌的「一眼就是 AI 做的」，蓝→青渐变算一处） ---- */
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .crm-fun-bar {
  background: var(--ui-accent);
  color: #ffffff;
  font-weight: 600;
}
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-master {
  border: 1px solid var(--ui-line);
  background: var(--ui-surface);
}
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-run {
  border: 1px solid var(--ui-accent);
  background: var(--ui-accent);
  color: #ffffff;
  font-weight: 600;
}
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-run:hover { background: #3a4fd8; border-color: #3a4fd8; }
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-save {
  border: 1px solid var(--ui-line-2);
  background: #ffffff;
  color: var(--ui-t2);
  font-weight: 600;
}
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-save:hover { background: #f9fafb; border-color: var(--ui-line-2); }


/* ---- 9. 药丸：5 处前景色压在自己的淡底上过不了 4.5:1（空库扫不到，是按色值算出来的） ----
   ⚠️ 色相一律不动，只压深一档 —— 看起来还是同一个「品红 / 淡金 / 浅绿 / 灰 / 蓝」。 */
/* 节日标识、客户旅程的「拥护者」：#f472b6 压 #f7e3ec 只有 2.4:1 → 同族深到 #9d174d（6.7:1） */
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .crm-cal-cat-fest,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .crm-stage-advocate { color: #9d174d; background: rgba(190, 24, 93, .10); }
/* 会员「金卡」：#d8b98a 压 #f4e8d9 只有 1.7:1 → 深到 #946200（4.5:1） */
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mem-lv-b { color: #946200; background: rgba(148, 98, 0, .14); }
/* 执行记录里的「AI 经营周报」：#86efac 压 #e3f0e6 只有 1.2:1（等于没字）→ #027a48（7.6:1） */
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-log-kind.weekly_report { color: #027a48; background: rgba(31, 99, 41, .12); }
/* 库存的「已过期」：#71717a 压 #e8e9ea 只有 3.98:1 → #52525b（6.3:1） */
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .inv-status-expired { color: #52525b; background: rgba(107, 114, 128, .15); }

/* ---- 10. 页内分段控件：照 Semi 的按钮式 TabBar（浅蓝底蓝字的选中态） ----
   ⚠️ 这 4 页共用同一套 .mkt-tabbar / .mkt-tab（营销助手 / 库存管家 /
      会员管家 / 私域运营），一条规则同时收口 4 页。
      选中态用**浅蓝底蓝字**而不是「看板」那种浮起白块 —— 同样一个控件在两页上
      本来就有两种模板做法（TailAdmin / Semi），这几页都是列表表格页，选 Semi，
      也就和「经营统计」顶栏那排一模一样了。
   ⚠️ 不加灰色槽：这几页的标签最多有 8 个，加个灰槽横向铺一整条会很重，
      而且顶栏本来就有下边框，两条灰线叠在一起。 */
.dash-view:is(#marketing-view, #inventory-view, #members-view, #crm-view) .mkt-tabbar { gap: 4px; }
.dash-view:is(#marketing-view, #inventory-view, #members-view, #crm-view) .mkt-tab {
  background: transparent;
  border: 1px solid transparent;
  border-radius: 6px;
  color: #4e5969;
  font-weight: 500;
  padding: 5px 12px;
}
.dash-view:is(#marketing-view, #inventory-view, #members-view, #crm-view) .mkt-tab:hover { color: #1d2129; background: #f2f4f7; }
.dash-view:is(#marketing-view, #inventory-view, #members-view, #crm-view) .mkt-tab.active { color: #3538cd; background: #eef2ff; border-color: transparent; }
/* 翻页按钮与「选人群」的片子：TailAdmin 的次按钮 = 白底 + 描边，选中态 = 浅蓝 */
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mem-page-btn,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .crm-pick {
  background: #ffffff;
  border: 1px solid var(--ui-line-2);
  color: var(--ui-t2);
  border-radius: 6px;
}
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mem-page-btn:hover,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .crm-pick:hover { background: #f9fafb; }
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mem-page-btn.active,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .crm-pick.on { background: #eef2ff; border-color: transparent; color: #3538cd; }

/* ---- 11. 自动化运营：480px 的单列挤在 1440 的页面中间，右边一大片空 ----
   改成 AntD 设置页那种两列卡片：总开关整宽，「营销自动规则」也整宽（它多一行
   执行间隔），剩下四张两两一行，最后两个按钮并排一行。 */
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-wrap {
  max-width: 920px;
  margin: 0 auto;
  padding: 22px 24px 56px;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 12px;
  align-content: start;
}
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-master,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-master + .au-card,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-log-h,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-log-empty,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-log-item { grid-column: 1 / -1; }
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-master { margin-bottom: 0; }
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-card { margin-bottom: 0; }
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-log-h { margin: 8px 2px 0; }
/* 两个动作按钮：不许被网格拉成卡片那么宽（一个 400px 宽的按钮不成按钮了），
   统一靠右、定宽 —— 就是设置页页脚那排按钮的样子。 */
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-run,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-save {
  grid-column: 2;
  justify-self: end;
  width: auto;
  min-width: 148px;
  margin: 0;
}
@media (max-width: 900px) {
  .dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-wrap { grid-template-columns: 1fr; }
}

/* ---- 12. 空态：和「看板」的 .dash-empty 一个样子 ---- */
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .mkt-empty,
.dash-view:is(#data-connect-view, #marketing-view, #inventory-view, #members-view, #crm-view, #assistant-view, #automation-view) .au-log-empty {
  color: var(--ui-t3);
  font-size: 13px;
  padding: 28px 16px;
  text-align: center;
}

/* ---- 13. 数据接入中心：页面底色原本是 #f2f3f5，比其余 8 页的 #f9fafb 深一档，
       并排看会像两个软件。对齐过来（白卡仍然浮得起来）。 ---- */
.dash-view#data-connect-view { --dc-bg: #f9fafb; }
