/* ============================================================================
 * admin_v8_theme_light.css —— 资源平台后台「简约现代 · 浅色」主题
 * ----------------------------------------------------------------------------
 * 客户 2026-10-03 决定: 后台【每天要用】-> 用浅色 ✓ (长时间看表格/表单更舒服)
 *   (深色"盯数据"舒服, 但长时间看表格累 ✗ —— 这就是当时的权衡, 客户自己想通了)
 *
 * ★ 设计目标(客户点名的三件事):
 *   ① 字体最舒服: 中文栈 + tabular-nums 数字对齐 + 行高 1.55 + 不用细体
 *   ② 布局简约现代: 近白底 + 白卡片 + 极细边框 + 克制圆角 + 大留白但【信息密度够】
 *   ③ 操作便捷: 行内操作 / 一键完成 / 键盘 / 筛选记忆 / 首屏关键数字
 *
 * ★★ 本文件的【安全边界】(照抄本项目教训: 只加增量, 不重写容器基础布局 ✗)
 *   §1 Token (含【重映射 legacy 变量名】-> 旧后台配色自动跟随, 零布局风险 ✓✓)
 *   §2 旧后台harmonization —— ★ 只改【颜色/字体/数字对齐】, 绝不动 display/position/
 *      width/height/margin/padding/grid ✗ (旧页面几何由 _adm_probe.py 前后对比证明不变 ✓)
 *   §3 侧栏(浅色化) —— 只改颜色/背景 ✓
 *   §4 新组件 (.v8-* 命名空间, 只用于新页面, 不会碰到旧页面 ✓)
 *   §5 侧栏两个微变体 + 主色两选 (给客户挑 ✓)
 *
 * ★ 依赖: 无。纯 CSS, 无框架/无构建/无外部字体请求 ✓
 * ★ 加载顺序: 必须在本页 inline <style> 之后 (即 </style> 之后 link) ✓
 * 生成日期: 2026-10-03
 * ==========================================================================*/


/* ==========================================================================
 * §1 设计 Token
 * ========================================================================*/
:root{
  /* ---- 1.1 字体栈 (客户点名"最舒服") ----------------------------------
   * Windows: -apple-system/BlinkMacSystemFont/PingFang SC 都不存在 -> 落到
   *          "Microsoft YaHei UI" 再 "Microsoft YaHei" ✓ (黑体, 不会是宋体 ✓)
   * macOS:   -apple-system 命中 -> SF Pro + 系统中文(PingFang) ✓
   * ★ 中文字重放最前, 让【中英文同一个字体】, 视觉更统一 (混排不跳字号)
   * ------------------------------------------------------------------- */
  --v8-font: -apple-system, BlinkMacSystemFont, "PingFang SC",
             "Microsoft YaHei UI", "Microsoft YaHei",
             "Source Han Sans SC", "Noto Sans SC", "Hiragino Sans GB",
             "Segoe UI", Roboto, Arial, sans-serif;
  /* 订单号/编码/ID: 等宽更易核对 */
  --v8-mono: ui-monospace, "Cascadia Mono", "SF Mono", Consolas,
             "Liberation Mono", Menlo, monospace;

  /* ---- 1.2 字号 (★ 最小 12px, 不要更小; 中文行高要比英文大) ---- */
  --v8-fs-xs:  12px;    /* 表头 / 辅助说明 */
  --v8-fs-sm:  12.5px;  /* 次级 / 时间 / 标签 */
  --v8-fs-md:  14px;    /* 正文基准 */
  --v8-fs-td:  13.5px;  /* 表格内容 (比正文略小, 提升密度) */
  --v8-fs-lg:  16px;    /* 卡片标题 */
  --v8-fs-h1:  20px;    /* 页面标题 */
  --v8-fs-kpi: 28px;    /* KPI 数字 */
  --v8-lh:     1.55;    /* 中文正文行高 */
  --v8-lh-tight:1.35;

  /* ---- 1.3 字重 (★ 不用 300 以下的细体 ✗) ---- */
  --v8-fw:      400;
  --v8-fw-med:  500;
  --v8-fw-semi: 600;
  --v8-fw-bold: 700;

  /* ---- 1.4 底色层次 (近白, 靠极浅灰分层而不是靠阴影) ---- */
  --v8-bg:        #f6f8fa;   /* 应用底 */
  --v8-panel:     #ffffff;   /* 卡片 */
  --v8-panel-2:   #f6f8fa;   /* 卡内分区 / 表头 */
  --v8-panel-3:   #eef1f4;   /* 控件底 / 标签底 */
  --v8-side:      #ffffff;   /* 侧栏(变体1: 纯白) */
  --v8-side-gray: #f6f8fa;   /* 侧栏(变体2: 极浅灰) */

  /* ---- 1.5 边框 (极细 1px, 少阴影) ---- */
  --v8-line:      #eaeef2;
  --v8-line-2:    #d0d7de;

  /* ---- 1.6 文字三级 ---- */
  --v8-text:   #1f2328;   /* 主 */
  --v8-text-2: #59636e;   /* 次 (正文/表格) */
  --v8-text-3: #818b98;   /* 三 (说明/占位) */

  /* ---- 1.7 主色 (★ 变体在 §5: 橙 / 蓝) ---- */
  --v8-accent:      #e8590c;   /* 默认: 沿用桌面 APP 的橙 -> 品牌一致 ✓ */
  --v8-accent-hover:#d94f08;
  --v8-accent-soft: rgba(232,89,12,.08);
  --v8-accent-line: rgba(232,89,12,.32);
  --v8-accent-2:    #f08c00;   /* 主色第二档(渐变/图标用), 随变体走 ✓ 不要硬编码 ✗ */
  --v8-on-accent:   #ffffff;

  /* ---- 1.8 状态色 (浅色底用饱和一点的, 保证对比度) ---- */
  --v8-ok:     #1a7f37;  --v8-ok-soft:     rgba(26,127,55,.09);   --v8-ok-line:     rgba(26,127,55,.28);
  --v8-warn:   #9a6700;  --v8-warn-soft:   rgba(154,103,0,.10);   --v8-warn-line:   rgba(154,103,0,.30);
  --v8-danger: #cf222e;  --v8-danger-soft: rgba(207,34,46,.08);   --v8-danger-line: rgba(207,34,46,.28);
  --v8-gray:   #59636e;  --v8-gray-soft:   rgba(89,99,110,.10);   --v8-gray-line:   rgba(89,99,110,.26);
  --v8-info:   #8250df;  --v8-info-soft:   rgba(130,80,223,.09);  --v8-info-line:   rgba(130,80,223,.28);

  /* ---- 1.9 图表系列色 ---- */
  --v8-data-1:#0969da; --v8-data-2:#1a7f37; --v8-data-3:#bf8700; --v8-data-4:#8250df;

  /* ---- 1.10 圆角 (克制 6~8px) ---- */
  --v8-r-sm: 5px;  --v8-r-md: 6px;  --v8-r-lg: 8px;  --v8-r-pill: 999px;

  /* ---- 1.11 阴影 (极轻, 靠边框分层) ---- */
  --v8-sh-card: 0 1px 0 rgba(31,35,40,.02);
  --v8-sh-pop:  0 8px 24px rgba(31,35,40,.12);
  --v8-sh-focus:0 0 0 3px var(--v8-accent-soft);

  /* ---- 1.12 间距 (4px 基准, 只用这几档) ---- */
  --v8-sp-1:4px; --v8-sp-2:6px; --v8-sp-3:8px; --v8-sp-4:10px;
  --v8-sp-5:12px; --v8-sp-6:16px; --v8-sp-7:20px; --v8-sp-8:26px;

  /* ---- 1.13 布局尺寸 ---- */
  --v8-w-side: 232px;
  --v8-h-top:  56px;

  /* ======================================================================
   * 1.14 ★★ 重映射【旧后台的变量名】 -> 旧后台一整套配色自动跟随本主题 ✓✓
   *   这是本次"零布局风险"改配色的关键: 旧后台全部颜色都走这几个变量,
   *   我只覆盖变量值, 不碰任何旧规则 ✗ => 布局不可能变 ✓
   * ==================================================================== */
  --bg:             var(--v8-bg);
  --card:           var(--v8-panel);
  --border:         var(--v8-line);
  --text:           var(--v8-text);
  --text-muted:     var(--v8-text-2);
  --text-tertiary:  var(--v8-text-3);
  --primary:        var(--v8-accent);
  --primary-hover:  var(--v8-accent-hover);
  --success:        var(--v8-ok);
  --warning:        #bf8700;
  --danger:         var(--v8-danger);
  --info:           var(--v8-info);
  --win:            #0969da;
  --mac:            #e8590c;
  --linux:          #8250df;
  --price-low:      var(--v8-text-2);
  --price-mid:      #bf8700;
  --price-high:     var(--v8-danger);
  --radius:         var(--v8-r-md);
  --radius-lg:      var(--v8-r-lg);
  /* 旧 v7 增强脚本用的键 */
  --c-bg:var(--v8-bg); --c-panel:var(--v8-panel); --c-panel-2:var(--v8-panel-2);
  --c-panel-3:var(--v8-panel-3); --c-border:var(--v8-line); --c-border-strong:var(--v8-line-2);
  --c-text:var(--v8-text); --c-text-2:var(--v8-text-2); --c-text-3:var(--v8-text-3);
  --c-text-4:var(--v8-text-3); --c-accent:var(--v8-accent); --c-accent-hover:var(--v8-accent-hover);
  --c-accent-soft:var(--v8-accent-soft); --c-on-accent:var(--v8-on-accent);
  --c-ok:var(--v8-ok); --c-ok-soft:var(--v8-ok-soft); --c-ok-line:var(--v8-ok-line);
  --c-warn:var(--v8-warn); --c-warn-soft:var(--v8-warn-soft); --c-warn-line:var(--v8-warn-line);
  --c-danger:var(--v8-danger); --c-danger-soft:var(--v8-danger-soft); --c-danger-line:var(--v8-danger-line);
  --c-gray:var(--v8-gray); --c-gray-soft:var(--v8-gray-soft); --c-gray-line:var(--v8-gray-line);
  --c-info:var(--v8-info); --c-info-soft:var(--v8-info-soft); --c-info-line:var(--v8-info-line);
  --c-zebra:rgba(31,35,40,.022);
  --r-sm:var(--v8-r-sm); --r-md:var(--v8-r-md); --r-lg:var(--v8-r-lg); --r-pill:var(--v8-r-pill);
  --sh-card:var(--v8-sh-card); --sh-pop:var(--v8-sh-pop); --sh-focus:var(--v8-sh-focus);
  --f-sans:var(--v8-font); --f-mono:var(--v8-mono);
  --fs-xs:var(--v8-fs-xs); --fs-sm:var(--v8-fs-sm); --fs-md:var(--v8-fs-md);
  --fs-lg:var(--v8-fs-h1); --fs-kpi:var(--v8-fs-kpi);
  --fw-normal:var(--v8-fw); --fw-medium:var(--v8-fw-med); --fw-semi:var(--v8-fw-semi); --fw-bold:var(--v8-fw-bold);
  --sp-1:var(--v8-sp-1); --sp-2:var(--v8-sp-2); --sp-3:var(--v8-sp-3); --sp-4:var(--v8-sp-4);
  --sp-5:var(--v8-sp-5); --sp-6:var(--v8-sp-6); --sp-7:var(--v8-sp-7); --sp-8:var(--v8-sp-8);
  --w-sidebar:var(--v8-w-side); --h-topbar:var(--v8-h-top);
  --lh-base:var(--v8-lh); --lh-loose:1.7; --lh-tight:var(--v8-lh-tight);
  color-scheme: light;
}


/* ==========================================================================
 * §2 旧后台 harmonization —— ★★ 只改【颜色 / 字体 / 数字对齐】✗ 不动任何布局属性
 *     (display/position/width/height/margin/padding/grid 一律不出现 ✗)
 * ========================================================================*/

/* 2.1 字体统一 (旧后台是 15px + 自带字体栈; 换成更舒服的一套) */
body{
  font-family: var(--v8-font) !important;
  font-size: var(--v8-fs-md) !important;
  line-height: var(--v8-lh) !important;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
}
button,input,select,textarea{font-family:var(--v8-font) !important}

/* ========================================================================
 * ★★ STV3u：全站字体栈统一（客户："字体样式、粗细改成和你这个界面一样"）
 * ★ 实测查出的真 bug：同一个页面上【并存两套字体栈】✗
 *    · body / .v8-btn 走 --v8-font（**中文优先**：PingFang SC -> Microsoft YaHei UI -> … -> Segoe UI ✓）
 *    · 而 h1 / 卡片名 / KPI 数字 / th / td / 标签 等走另一套（**英文优先**：
 *      -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "PingFang SC", … ✗）
 *      —— 来自基础样式（admin_v7.css，✗ 本任务禁止改它 ✗）-> 所以在这里用【最后加载 + !important】覆盖 ✓
 *    => 后果：同一行里**中文和数字来自不同字体** ✗ 中英混排会"跳"、粗细观感不一致 ✗
 *       （这正是客户说"字体样式/粗细"的根因 ✓，不是"看着不像"那种模糊感受 ✓）
 * ★ 范围：**全站 12 页**（✗ 不只站点页 —— 客户看的是整个后台 ✓ 只统一一页反而更不一致 ✗）
 * ★✗ 等宽例外【必须保留】：订单号 / 域名 / ID / code 用 --v8-mono 更好核对 ✓
 *    （本项目的图标全是内联 SVG ✓ 没有图标字体 ✓ 所以统一字体栈不会把图标搞坏 ✓）
 * ====================================================================== */
html body h1, html body h2, html body h3, html body h4, html body h5, html body h6,
html body p, html body span, html body b, html body strong, html body i, html body em,
html body td, html body th, html body label, html body button, html body input,
html body select, html body textarea, html body div, html body a, html body small,
html body li, html body legend, html body option{
  font-family: var(--v8-font) !important;
}
/* ★ 等宽例外（写在后面 -> 同优先级下覆盖上面那条 ✓） */
html body .mono, html body .mono *, html body .ono, html body .order-no, html body code,
html body pre, html body kbd, html body samp, html body [class*="mono"], html body [class*="mono"] *{
  font-family: var(--v8-mono) !important;
}

/* ★★ STV3u ②：中文粗细策略（照顾 Windows 上"微软雅黑只有 Regular/Bold"这个现实 ✗）
 *    实测：字重 400/500/600/700 浏览器都"接受" ✓，但**微软雅黑没有中间档** ✗
 *    -> 中文的 500 / 600 会被渲染成同一个样子（合成或落 Bold）✗ => 设计【不能依赖 500 与 600 的差别】✓
 *    策略：① 标题/卡片名 = 600（中文 Semibold，比 Bold 轻 ✓）
 *          ② ★ 表格【正文】600 -> 500（中文实际落 Regular，观感更清爽 ✓；数字单元格自己有 600 不受影响 ✓）
 *          ③ 数字 / KPI = 600~700 + tabular-nums（数字字体有真 Semibold ✓ 不虚 ✗）
 *    ★ 这里只兜"基础样式把表格正文设成 600"这一处 ✗；
 *      本项目自己写的类（.v8-*）各有明确字重，不动 ✓ */
html body table td, html body table th, html body .table td, html body .table th,
html body .v8-tbl td, html body .v8-tbl th{
  font-weight: var(--v8-fw-med) !important;
}
/* ★ 例外：数值/统计/KPI/标题类仍用 600 ✓（在表格里更醒目，且数字有真 Semibold ✓） */
html body .v8-tbl td.num, html body .v8-tbl th.num, html body .v8-tbl .mono,
html body .v8-stv-stat .st .v, html body .v8-stv-stat .st .k, html body .v8-stv-kpi-v,
html body .v8-tbl .strong, html body .v8-tbl.v8-stv-tbl .dom, html body .v8-tbl.v8-stv-tbl .sid{
  font-weight: var(--v8-fw-semi) !important;
}

/* 2.2 表格: 字号/字重/行高统一 + ★数字等宽对齐(金额/订单数纵向对得齐 ✓)
 *     ✗ 不设 padding / white-space / border-collapse (那是布局属性) */
.table td,.table th{font-family:var(--v8-font) !important}
.table tbody td{font-size:var(--v8-fs-td) !important;color:var(--v8-text-2) !important}
.table thead th{font-size:var(--v8-fs-xs) !important;color:var(--v8-text-3) !important;
  letter-spacing:.02em !important}
/* 数字类单元格 + 订单号: 等宽数字/等宽字体, 便于纵向核对 */
.table td.num,.table td[data-num],.ver-price,.kpi-value,.kpi-val,
.order-no,.ono,[class*="amount"],[class*="price"],[class*="count"]{
  font-variant-numeric: tabular-nums;font-feature-settings:"tnum" 1;
}
.ono,.order-no{font-family:var(--v8-mono) !important}

/* 2.3 页面标题字重/字距 (只是字重与字距, 不是字号尺寸语义) */
.page-title{font-weight:var(--v8-fw-semi) !important;letter-spacing:-.2px !important}
.card-title{font-weight:var(--v8-fw-semi) !important}

/* 2.4 数字统一等宽 (KPI / 统计) */
.kpi-value,.kpi-val,.dc-revenue,.dc-cost,.dc-profit,.dc-rate{
  font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1;
}

/* 2.5 主色相关: 边框/阴影跟随主色 (旧后台写死了 rgba(22,119,255,...) 的蓝色光晕 ✗) */
input:focus,select:focus,textarea:focus{
  border-color:var(--v8-accent) !important;
  box-shadow:var(--v8-sh-focus) !important;
}

/* 2.6 滚动条: 浅色细滚动条 (Windows 默认滚动条在浅色后台里很突兀) */
*::-webkit-scrollbar{width:10px;height:10px}
*::-webkit-scrollbar-track{background:transparent}
*::-webkit-scrollbar-thumb{background:#d0d7de;border-radius:6px;border:2px solid transparent;
  background-clip:content-box}
*::-webkit-scrollbar-thumb:hover{background:#b1b8c0;background-clip:content-box}
*::-webkit-scrollbar-corner{background:transparent}


/* ==========================================================================
 * §3 侧栏浅色化 —— ★★ 只改【背景与前景颜色】✗ 不动 width/position/display
 *     旧后台侧栏是深蓝渐变 + 白字 ✗ 改成浅色后必须同时把白字改深, 否则看不见 ✗✗
 * ========================================================================*/
.sidebar{
  background: var(--v8-side) !important;
  border-right: 1px solid var(--v8-line) !important;
  color: var(--v8-text) !important;
}
.sidebar h1{
  color: var(--v8-text) !important;
  font-size: var(--v8-fs-md) !important;
  font-weight: var(--v8-fw-semi) !important;
  letter-spacing: 0 !important;
  border-bottom: 1px solid var(--v8-line) !important;
}
.sidebar h2{color:var(--v8-text-3) !important;font-size:var(--v8-fs-xs) !important;
  font-weight:var(--v8-fw-med) !important;letter-spacing:.06em !important}

/* 应用级菜单项 */
.nav-top .nav-item{
  color: var(--v8-text-2) !important;
  font-size: var(--v8-fs-md) !important;
  font-weight: var(--v8-fw);
  border-left: 3px solid transparent !important;
}
.nav-top .nav-item:hover{background:var(--v8-panel-2) !important;color:var(--v8-text) !important}
.nav-top .nav-item.active{
  background: var(--v8-accent-soft) !important;
  color: var(--v8-accent) !important;
  border-left-color: var(--v8-accent) !important;
  font-weight: var(--v8-fw-semi) !important;
}
/* 软件列表项 */
.product-nav-item{color:var(--v8-text-2) !important;font-size:var(--v8-fs-sm) !important}
.product-nav-item:hover{background:var(--v8-panel-2) !important;color:var(--v8-text) !important}
.product-nav-item.active{background:var(--v8-accent-soft) !important;color:var(--v8-accent) !important;
  border-left-color:var(--v8-accent) !important}
.product-nav-item .icon{background:var(--v8-panel-3) !important;color:var(--v8-text-3) !important}
.product-nav-item .dot{background:var(--v8-ok) !important}
/* 搜索框 */
.product-nav-search input{
  background:var(--v8-panel-2) !important;border-color:var(--v8-line) !important;
  color:var(--v8-text) !important;font-size:var(--v8-fs-sm) !important
}
.product-nav-search input::placeholder{color:var(--v8-text-3) !important}
.product-nav-search input:focus{background:#fff !important;border-color:var(--v8-accent) !important}
.sidebar .empty{color:var(--v8-text-3) !important}

/* 顶栏: 白底 + 细线 (旧的是白底但阴影偏重) */
.topbar{background:var(--v8-panel) !important;border-bottom:1px solid var(--v8-line) !important;
  box-shadow:none !important}
.topbar .logo{color:var(--v8-text) !important;font-weight:var(--v8-fw-semi) !important}
.topbar .breadcrumb{color:var(--v8-text-3) !important;font-size:var(--v8-fs-sm) !important}
.topbar .breadcrumb .current{color:var(--v8-text) !important;font-weight:var(--v8-fw-med) !important}
.topbar .user{background:var(--v8-panel-2) !important;border:1px solid var(--v8-line) !important;
  color:var(--v8-text-2) !important;font-size:var(--v8-fs-sm) !important}
.avatar{background:linear-gradient(135deg,var(--v8-accent),var(--v8-accent-2)) !important;color:#fff !important}
.btn-icon{background:var(--v8-panel-2) !important;border:1px solid var(--v8-line) !important;
  color:var(--v8-text-2) !important}
.btn-icon:hover{background:var(--v8-panel-3) !important;color:var(--v8-text) !important}

/* 内容区底色 (旧的是 #f5f7fa, 换成更中性的 #f6f8fa) */
html,body{background:var(--v8-bg) !important}
.main{background:transparent !important}


/* ==========================================================================
 * §4 新组件 (.v8-* 命名空间) —— ★ 只用于新页面, 旧页面完全没有这些 class ✓
 * ========================================================================*/

/* ---- 4.1 布局容器 ---- */
.v8-wrap{display:flex;flex-direction:column;gap:var(--v8-sp-6)}
.v8-grid{display:grid;gap:var(--v8-sp-6)}
.v8-grid.c2{grid-template-columns:1fr 1fr}
.v8-grid.c3{grid-template-columns:repeat(3,1fr)}
.v8-grid.main-side{grid-template-columns:1.35fr 1fr;align-items:start}
.v8-col{display:flex;flex-direction:column;gap:var(--v8-sp-6);min-width:0}

/* ---- 4.2 页面头 ---- */
.v8-head{display:flex;align-items:flex-end;justify-content:space-between;gap:var(--v8-sp-6);
  padding-bottom:2px}
.v8-head h1{font-size:var(--v8-fs-h1);font-weight:var(--v8-fw-semi);letter-spacing:-.3px;
  color:var(--v8-text);line-height:1.25}
.v8-head p{font-size:var(--v8-fs-sm);color:var(--v8-text-3);margin-top:3px}
.v8-head-r{display:flex;gap:var(--v8-sp-3);align-items:center;flex:0 0 auto}

/* ---- 4.3 卡片 ---- */
.v8-card{background:var(--v8-panel);border:1px solid var(--v8-line);border-radius:var(--v8-r-lg);
  box-shadow:var(--v8-sh-card)}
.v8-card-h{display:flex;align-items:center;justify-content:space-between;gap:var(--v8-sp-5);
  padding:var(--v8-sp-5) var(--v8-sp-6);border-bottom:1px solid var(--v8-line)}
.v8-card-h.no-b{border-bottom:none}
.v8-card-t{font-size:var(--v8-fs-lg);font-weight:var(--v8-fw-semi);color:var(--v8-text);
  display:flex;align-items:baseline;gap:var(--v8-sp-3)}
.v8-card-t small{font-size:var(--v8-fs-xs);font-weight:var(--v8-fw);color:var(--v8-text-3)}
.v8-card-b{padding:var(--v8-sp-6)}
.v8-card-b.flush{padding:0}

/* ---- 4.4 KPI 卡 (★首屏可见, 不用滚动 ✓) ---- */
.v8-kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--v8-sp-6)}
.v8-kpi{background:var(--v8-panel);border:1px solid var(--v8-line);border-radius:var(--v8-r-lg);
  padding:var(--v8-sp-6);box-shadow:var(--v8-sh-card);display:flex;flex-direction:column;gap:2px}
.v8-kpi-t{display:flex;align-items:center;justify-content:space-between;gap:var(--v8-sp-3)}
.v8-kpi-l{font-size:var(--v8-fs-sm);color:var(--v8-text-2);font-weight:var(--v8-fw-med)}
.v8-kpi-v{font-size:var(--v8-fs-kpi);font-weight:var(--v8-fw-bold);color:var(--v8-text);
  line-height:1.15;margin-top:2px;font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1}
.v8-kpi-s{font-size:var(--v8-fs-xs);color:var(--v8-text-3)}
.v8-delta{font-size:12px;font-weight:var(--v8-fw-semi);padding:1.5px 7px;border-radius:var(--v8-r-sm);
  white-space:nowrap}
.v8-delta.up{color:var(--v8-ok);background:var(--v8-ok-soft)}
.v8-delta.down{color:var(--v8-danger);background:var(--v8-danger-soft)}
.v8-delta.flat{color:var(--v8-gray);background:var(--v8-gray-soft)}

/* ---- 4.5 累计指标条 ---- */
.v8-cum{display:grid;grid-template-columns:repeat(6,1fr);background:var(--v8-panel);
  border:1px solid var(--v8-line);border-radius:var(--v8-r-lg);box-shadow:var(--v8-sh-card);
  padding:var(--v8-sp-5) var(--v8-sp-3)}
.v8-cum-i{display:flex;flex-direction:column;gap:2px;padding:0 var(--v8-sp-6);
  border-right:1px solid var(--v8-line);min-width:0}
.v8-cum-i:last-child{border-right:none}
.v8-cum-i span{font-size:var(--v8-fs-xs);color:var(--v8-text-3)}
.v8-cum-i b{font-size:16px;font-weight:var(--v8-fw-semi);color:var(--v8-text);
  font-variant-numeric:tabular-nums}

/* ---- 4.6 按钮 ---- */
.v8-btn{display:inline-flex;align-items:center;gap:var(--v8-sp-2);padding:6px 13px;
  border-radius:var(--v8-r-md);font-size:var(--v8-fs-sm);font-weight:var(--v8-fw-med);
  border:1px solid var(--v8-line-2);background:var(--v8-panel);color:var(--v8-text);
  cursor:pointer;transition:background .12s,border-color .12s,color .12s;white-space:nowrap;
  line-height:1.5}
.v8-btn:hover{background:var(--v8-panel-2)}
.v8-btn:active{background:var(--v8-panel-3)}
.v8-btn-pri{background:var(--v8-accent);border-color:var(--v8-accent);color:var(--v8-on-accent);
  font-weight:var(--v8-fw-semi)}
.v8-btn-pri:hover{background:var(--v8-accent-hover);border-color:var(--v8-accent-hover)}
.v8-btn-danger{background:transparent;border-color:var(--v8-danger-line);color:var(--v8-danger)}
.v8-btn-danger:hover{background:var(--v8-danger-soft)}
.v8-btn.sm{padding:4px 9px;font-size:var(--v8-fs-xs)}
.v8-btn:disabled{opacity:.5;cursor:not-allowed}
.v8-btn-setdefault{background:var(--v8-accent);border-color:var(--v8-accent);
  color:var(--v8-on-accent);font-weight:var(--v8-fw-semi);padding:5px 14px}
.v8-link{color:var(--v8-accent);font-size:var(--v8-fs-sm);font-weight:var(--v8-fw-med);
  cursor:pointer;background:none;border:none;padding:0}
.v8-link:hover{text-decoration:underline}
.v8-link.danger{color:var(--v8-danger)}

/* ---- 4.7 状态标签 ---- */
.v8-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 9px;border-radius:var(--v8-r-pill);
  font-size:var(--v8-fs-xs);font-weight:var(--v8-fw-semi);border:1px solid transparent;white-space:nowrap}
.v8-chip-ok{background:var(--v8-ok-soft);color:var(--v8-ok);border-color:var(--v8-ok-line)}
.v8-chip-warn{background:var(--v8-warn-soft);color:var(--v8-warn);border-color:var(--v8-warn-line)}
.v8-chip-danger{background:var(--v8-danger-soft);color:var(--v8-danger);border-color:var(--v8-danger-line)}
.v8-chip-gray{background:var(--v8-gray-soft);color:var(--v8-gray);border-color:var(--v8-gray-line)}
.v8-chip-info{background:var(--v8-info-soft);color:var(--v8-info);border-color:var(--v8-info-line)}
.v8-chip-accent{background:var(--v8-accent-soft);color:var(--v8-accent);border-color:var(--v8-accent-line)}
.v8-tag{font-size:var(--v8-fs-xs);font-weight:var(--v8-fw-semi);background:var(--v8-panel-3);
  color:var(--v8-text-2);border-radius:var(--v8-r-sm);padding:1px 7px;white-space:nowrap}

/* ---- 4.8 表格 ---- */
.v8-tbl{width:100%;border-collapse:collapse}
.v8-tbl th{background:var(--v8-panel-2);color:var(--v8-text-3);font-size:var(--v8-fs-xs);
  font-weight:var(--v8-fw-semi);text-align:left;padding:9px 14px;border-bottom:1px solid var(--v8-line-2);
  white-space:nowrap;letter-spacing:.02em}
.v8-tbl td{padding:9px 14px;border-bottom:1px solid var(--v8-line);font-size:var(--v8-fs-td);
  color:var(--v8-text-2);vertical-align:middle}
.v8-tbl tbody tr:nth-child(even){background:rgba(31,35,40,.016)}   /* 极淡斑马纹 ✓ */
.v8-tbl tbody tr:hover{background:var(--v8-panel-2)}
.v8-tbl tbody tr:last-child td{border-bottom:none}
.v8-tbl .num{text-align:right;font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1}
.v8-tbl .mono{font-family:var(--v8-mono);font-size:12.5px}
.v8-tbl .strong{color:var(--v8-text);font-weight:var(--v8-fw-semi)}
.v8-tbl .nowrap{white-space:nowrap}
/* ★ 行内操作: 平时淡, 悬浮整行时变清晰 (客户要"表格行内操作" ✓ 不用点进详情 ✓) */
.v8-tbl .rowacts{display:flex;gap:10px;align-items:center;opacity:.45;transition:opacity .12s}
.v8-tbl tbody tr:hover .rowacts{opacity:1}
.v8-tbl .empty-row td{text-align:center;color:var(--v8-text-3);padding:34px 14px;font-size:var(--v8-fs-sm)}

/* ---- 4.9 筛选区 (★筛选条件会记住, 见 features.js) ---- */
.v8-filters{display:grid;gap:11px;align-items:end;background:var(--v8-panel);
  border:1px solid var(--v8-line);border-radius:var(--v8-r-lg);padding:13px 16px;
  box-shadow:var(--v8-sh-card)}
.v8-f{display:flex;flex-direction:column;gap:var(--v8-sp-1);min-width:0}
.v8-f>label{font-size:var(--v8-fs-xs);color:var(--v8-text-3);font-weight:var(--v8-fw-semi)}
.v8-f input,.v8-f select{width:100%;font-size:var(--v8-fs-sm);padding:6px 10px;
  border:1px solid var(--v8-line-2);border-radius:var(--v8-r-md);background:#fff;color:var(--v8-text)}
.v8-f input:focus,.v8-f select:focus{border-color:var(--v8-accent);outline:none;
  box-shadow:var(--v8-sh-focus)}
.v8-facts{display:flex;gap:var(--v8-sp-3)}

/* ---- 4.10 分段控件 / Tabs ---- */
.v8-seg{display:inline-flex;gap:2px;padding:2.5px;background:var(--v8-panel-2);
  border:1px solid var(--v8-line);border-radius:var(--v8-r-md)}
.v8-seg-b{padding:4px 11px;border-radius:4px;font-size:var(--v8-fs-sm);color:var(--v8-text-2);
  cursor:pointer;border:none;background:none}
.v8-seg-b.on{background:#fff;color:var(--v8-text);font-weight:var(--v8-fw-semi);
  box-shadow:0 1px 2px rgba(31,35,40,.08)}
.v8-tabs{display:flex;gap:2px;border-bottom:1px solid var(--v8-line);padding:0 var(--v8-sp-6)}
.v8-tab{padding:9px 14px;font-size:var(--v8-fs-sm);color:var(--v8-text-3);cursor:pointer;
  border:none;background:none;border-bottom:2px solid transparent;margin-bottom:-1px}
.v8-tab.on{color:var(--v8-text);font-weight:var(--v8-fw-semi);border-bottom-color:var(--v8-accent)}

/* ---- 4.11 迷你占比条 ---- */
.v8-bar{display:flex;align-items:center;gap:9px;width:100%}
.v8-bar-t{flex:1;height:5px;border-radius:3px;overflow:hidden;background:var(--v8-panel-3);min-width:40px}
.v8-bar-t i{display:block;height:100%;border-radius:3px;background:var(--v8-accent)}
.v8-bar-p{width:42px;text-align:right;font-size:var(--v8-fs-xs);color:var(--v8-text-3);
  font-variant-numeric:tabular-nums}

/* ---- 4.12 提示条 (★把"不确定性"露在界面上 ✓ 见架构文档 §16.2) ---- */
.v8-warn{display:flex;align-items:flex-start;gap:var(--v8-sp-3);background:var(--v8-warn-soft);
  border:1px solid var(--v8-warn-line);border-radius:var(--v8-r-lg);padding:9px 14px;
  font-size:var(--v8-fs-sm);color:var(--v8-text-2);line-height:1.6}
.v8-warn b{color:var(--v8-text)}
.v8-note{background:var(--v8-panel-2);border:1px solid var(--v8-line);border-radius:var(--v8-r-lg);
  padding:9px 14px;font-size:var(--v8-fs-sm);color:var(--v8-text-2);line-height:1.65}
.v8-caliber{font-size:var(--v8-fs-xs);color:var(--v8-text-3);line-height:1.75;padding:0 2px}
.v8-caliber b{color:var(--v8-text-2)}

/* ---- 4.13 空状态 ---- */
.v8-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:var(--v8-sp-3);padding:44px 20px;color:var(--v8-text-3);text-align:center}
.v8-empty-ico{font-size:30px;opacity:.4;line-height:1}
.v8-empty-t{font-size:var(--v8-fs-md);color:var(--v8-text-2);font-weight:var(--v8-fw-med)}
.v8-empty-s{font-size:var(--v8-fs-sm);line-height:1.7;max-width:520px}

/* ---- 4.14 漏斗 ---- */
.v8-funnel{display:flex;flex-direction:column;gap:var(--v8-sp-3);padding:var(--v8-sp-6)}
.v8-fn-row{display:flex;align-items:center;gap:var(--v8-sp-5)}
.v8-fn-lab{width:104px;flex:0 0 104px;font-size:var(--v8-fs-sm);color:var(--v8-text-2)}
.v8-fn-track{flex:1;height:26px;background:var(--v8-panel-2);border-radius:var(--v8-r-md);
  overflow:hidden;border:1px solid var(--v8-line)}
.v8-fn-fill{height:100%;border-radius:5px;background:linear-gradient(90deg,var(--v8-accent),var(--v8-accent-2));
  min-width:2px;transition:width .3s}
.v8-fn-val{width:112px;flex:0 0 112px;text-align:right;font-size:var(--v8-fs-td);
  font-weight:var(--v8-fw-semi);color:var(--v8-text);font-variant-numeric:tabular-nums}
.v8-fn-rate{width:56px;flex:0 0 56px;text-align:right;font-size:var(--v8-fs-xs);color:var(--v8-text-3);
  font-variant-numeric:tabular-nums}

/* ---- 4.15 趋势柱图 (纯 CSS/SVG, 无图表库 ✓) ---- */
.v8-chart{padding:var(--v8-sp-6)}
.v8-chart svg{display:block;width:100%;height:172px;overflow:visible}
.v8-bar-rect{fill:var(--v8-accent);opacity:.85}
.v8-bar-rect:hover{opacity:1}
.v8-axis{font-size:11px;fill:var(--v8-text-3)}
.v8-gridline{stroke:var(--v8-line);stroke-width:1}

/* ---- 4.16 访客/来源图例 ---- */
.v8-lg{display:flex;flex-direction:column;gap:8px}
.v8-lg-r{display:flex;align-items:center;gap:var(--v8-sp-3);font-size:var(--v8-fs-sm)}
.v8-lg-r i{width:8px;height:8px;border-radius:2.5px;flex:0 0 8px}
.v8-lg-n{flex:1;color:var(--v8-text-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.v8-lg-v{font-weight:var(--v8-fw-semi);color:var(--v8-text);font-variant-numeric:tabular-nums}
.v8-lg-p{width:46px;text-align:right;color:var(--v8-text-3);font-variant-numeric:tabular-nums}

/* ---- 4.17 分页 ---- */
.v8-pager{display:flex;align-items:center;justify-content:space-between;padding:var(--v8-sp-5) var(--v8-sp-6)}
.v8-pager-i{font-size:var(--v8-fs-sm);color:var(--v8-text-3)}
.v8-pager-i b{color:var(--v8-text)}
.v8-pager-b{display:flex;gap:5px}

/* ---- 4.18 Toast (新页面用, 与旧 showMsg 并存) ---- */
.v8-toast{position:fixed;top:70px;right:26px;z-index:9999;display:flex;align-items:center;
  gap:var(--v8-sp-3);background:var(--v8-panel);border:1px solid var(--v8-line-2);
  border-radius:var(--v8-r-lg);box-shadow:var(--v8-sh-pop);padding:10px 15px;
  font-size:var(--v8-fs-md);color:var(--v8-text);max-width:420px}
.v8-toast.ok{border-color:var(--v8-ok-line)}   .v8-toast.ok .i{color:var(--v8-ok)}
.v8-toast.err{border-color:var(--v8-danger-line)} .v8-toast.err .i{color:var(--v8-danger)}
.v8-toast.warn{border-color:var(--v8-warn-line)} .v8-toast.warn .i{color:var(--v8-warn)}

/* ---- 4.19 侧栏分组标题 + 应用切换器 (多应用平台入口 ✓) ---- */
.v8-side-t{padding:11px 18px 5px;font-size:var(--v8-fs-xs);font-weight:var(--v8-fw-semi);
  color:var(--v8-text-3);letter-spacing:.06em;display:flex;align-items:center;gap:6px}
.v8-side-t .soon{margin-left:auto;font-size:11px;font-weight:var(--v8-fw);background:var(--v8-panel-3);
  color:var(--v8-text-3);border-radius:4px;padding:1px 6px}
.v8-side-sep{height:1px;background:var(--v8-line);margin:var(--v8-sp-3) 14px}
.v8-side-ghost{padding:8px 18px;font-size:var(--v8-fs-sm);color:var(--v8-text-3);display:flex;
  align-items:center;gap:var(--v8-sp-4);opacity:.72;cursor:not-allowed;border-left:3px solid transparent}
.v8-side-ghost .soon{margin-left:auto;font-size:11px;background:var(--v8-panel-3);border-radius:4px;
  padding:1px 6px}

.v8-switcher{padding:var(--v8-sp-4) 14px var(--v8-sp-1)}
.v8-sw-hint{font-size:11px;color:var(--v8-text-3);letter-spacing:.06em;margin:0 2px 5px;
  font-weight:var(--v8-fw-semi)}
.v8-sw-btn{display:flex;align-items:center;gap:var(--v8-sp-4);padding:7px 9px;
  border-radius:var(--v8-r-md);background:var(--v8-panel-2);border:1px solid var(--v8-line);
  cursor:pointer}
.v8-sw-btn:hover{background:var(--v8-panel-3)}
.v8-sw-ico{width:22px;height:22px;flex:0 0 22px;border-radius:var(--v8-r-sm);font-size:11px;
  font-weight:var(--v8-fw-bold);color:#fff;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(135deg,var(--v8-accent),var(--v8-accent-2))}
.v8-sw-n{flex:1;color:var(--v8-text);font-size:var(--v8-fs-sm);font-weight:var(--v8-fw-med)}
.v8-sw-c{color:var(--v8-text-3);font-size:11px}
.v8-side-foot{margin-top:auto;padding:var(--v8-sp-5) 18px 14px;border-top:1px solid var(--v8-line);
  display:flex;flex-direction:column;gap:5px}
.v8-side-foot .r{display:flex;justify-content:space-between;font-size:11.5px;color:var(--v8-text-3)}
.v8-side-foot .r b{color:var(--v8-text-2);font-weight:var(--v8-fw-med)}
.v8-dot-ok{color:var(--v8-ok)}
.v8-dot-ok::before{content:'';display:inline-block;width:6px;height:6px;border-radius:50%;
  background:var(--v8-ok);margin-right:5px;vertical-align:1px}


/* ==========================================================================
 * §5 两个微变体 (让客户挑 ✓)
 *    变体1 white: 纯白侧栏 (最简约)
 *    变体2 gray : 极浅灰侧栏 + 白色内容区 (层次感更好)
 *    主色  orange (默认, 品牌一致) / blue (工具感)
 *    ★ 只改颜色变量, 不改任何布局 ✗
 * ========================================================================*/
html[data-v8-side="white"] .sidebar{background:#ffffff !important}
html[data-v8-side="gray"]  .sidebar{background:var(--v8-side-gray) !important}
html[data-v8-side="gray"]  .v8-sw-btn{background:#ffffff}
html[data-v8-side="gray"]  .product-nav-search input{background:#ffffff !important}
html[data-v8-side="gray"]  .nav-top .nav-item:hover,
html[data-v8-side="gray"]  .product-nav-item:hover{background:#eceff2 !important}
html[data-v8-side="gray"]  .nav-top .nav-item.active{background:#fff !important}

html[data-v8-accent="blue"]{
  --v8-accent:#0969da; --v8-accent-hover:#0757ba;
  --v8-accent-2:#3b82f6;
  --v8-accent-soft:rgba(9,105,218,.08); --v8-accent-line:rgba(9,105,218,.30);
  --v8-sh-focus:0 0 0 3px rgba(9,105,218,.10);
}

/* 打印兜底 (低优先) */
@media print{
  .sidebar,.topbar,.v8-toast{display:none !important}
  .main{margin-left:0 !important;padding-top:0 !important}
  body{background:#fff !important}
}

/* ============================================================================
 * ★ V8_FIX_ROWACTS —— 行内操作列不许折行
 *   实测问题(Step2 截图): 「站点与账户」的域名绑定表里，操作列同时放了
 *   <select> + 停用 + 删除，"停用/删除"被挤成【竖排一个字一行】✗ 很难看也难点 ✗
 *   修法: 行内操作整体 nowrap + 单元格 nowrap + 给个最小宽度 ✓
 *   ★ 只加 white-space / min-width —— 不碰任何容器布局属性 ✓ 零回归风险 ✓
 * ==========================================================================*/
.v8-tbl .rowacts{white-space:nowrap !important}
.v8-tbl .rowacts .v8-link,
.v8-tbl .rowacts a,
.v8-tbl .rowacts button{white-space:nowrap !important;display:inline-block}
.v8-tbl td:last-child,
.v8-tbl th:last-child{white-space:nowrap}
.v8-tbl .rowacts select{min-width:52px}

/* ============================================================================
 * §9 ★ P0_LAYOUT —— 方案D「层级化导航 + 紧凑内容区」第一步
 *   客户 2026-10-03 批准「开始」; 数值全部取自 layout_preview/schemeD3_*.html (已实测稿) ✓
 *   ① 侧栏可达性根治: 220 -> 200px 宽; 11 个产品移出侧栏
 *      -> 侧栏内容高 1420px -> ~620px, 底部溢出 498px -> 0px ✓
 *   ② 层级化导航 (4 父级 + 11 子项) 的样式 (折叠行为在 features.js / V8_LAYOUT_P0)
 *   ③ 排序按钮: 17x9 的 ▲▼ -> 单个 62x22「▲▼ 排序」+ 面板, 并与「删除」物理隔离
 *   ④ 表格行高统一 32px (原 8 档 42~75px) + 页头收敛 1 套 (原 3 套 77/49/34)
 *   ★ 本段是本项目【唯一】有意改布局属性的一段 (客户批准的布局改造); 其余段落一律不动 ✓
 *   ★ 退路: 整段删掉即回到旧布局 ✓
 * ==========================================================================*/

/* ---- 9.1 侧栏: 220 -> 200px + 内部滚动兜底 (底部永远不会再不可达) ---- */
:root{ --v7-sidebar-width: 200px; }
.sidebar{
  display:flex !important; flex-direction:column !important;
  height:100vh !important; min-height:0 !important; overflow:hidden !important;
}
.sidebar h1.sb-brand{
  height:38px !important; min-height:38px !important; padding:0 12px !important;
  display:flex !important; align-items:center !important;
  font-size:13px !important; letter-spacing:0 !important;
}
.v8-side-nav{flex:1 1 auto; min-height:0; overflow-y:auto; overflow-x:hidden; padding:4px 0 6px !important}
.v8-nav-par{
  display:flex; align-items:center; gap:7px; height:28px; padding:0 11px; margin-top:3px;
  font-size:12.5px; font-weight:600; color:var(--v8-text); cursor:pointer;
  border-left:3px solid transparent; user-select:none;
}
.v8-nav-par:hover{background:var(--v8-panel-2)}
.v8-nav-par .v8-par-ic{flex:0 0 16px; width:16px; text-align:center; font-size:12.5px}
.v8-nav-par .v8-par-tt{flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
.v8-nav-par .v8-par-cv{margin-left:auto; font-size:9px; color:var(--v8-text-3); transition:transform .12s}
.v8-nav-par.closed .v8-par-cv{transform:rotate(-90deg)}
/* 父级高亮: 当前页所在父级 (客户要求: 否则用户不知道自己在哪 ✓) */
.v8-nav-par.onpath{color:var(--v8-accent); background:linear-gradient(90deg, rgba(9,105,218,.10), transparent)}
.v8-nav-par.onpath .v8-par-cv{color:var(--v8-accent)}
.v8-nav-sub{position:relative}
.v8-nav-sub::before{content:""; position:absolute; left:19px; top:2px; bottom:2px; width:1px; background:var(--v8-line-2)}
.v8-nav-sub.v8-collapsed{display:none !important}
#v8SideNav .nav-item{
  height:26px !important; padding:0 11px 0 30px !important; margin:0 !important;
  display:flex !important; align-items:center !important;
  font-size:12.5px !important; color:var(--v8-text-2) !important; font-weight:400 !important;
  border-left:3px solid transparent !important;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
#v8SideNav .nav-item:hover{background:var(--v8-panel-2) !important; color:var(--v8-text) !important; padding-left:30px !important}
#v8SideNav .nav-item.active{
  background:var(--v8-accent-soft) !important; color:var(--v8-accent) !important;
  border-left-color:var(--v8-accent) !important; font-weight:600 !important;
}
/* 平台级分组(固定底部) + 页脚 */
.v8-side-plat{flex:0 0 auto; border-top:1px solid var(--v8-line); padding:3px 0 4px}
.v8-side-plat .v8-side-t{padding:7px 11px 3px !important}
.v8-side-plat .v8-side-ghost{padding:6px 11px 6px 30px !important; font-size:12px !important}
.v8-side-foot{flex:0 0 auto; margin-top:0 !important; padding:6px 11px 8px !important}

/* ---- 9.2 页头收敛: 3 套 (77/49/34) -> 1 套 34px 单行 ---- */
.page-header{
  display:flex !important; align-items:center !important; justify-content:space-between !important;
  min-height:34px !important; margin:0 0 8px 0 !important; padding:0 !important; border-bottom:0 !important;
}
.page-header>div:first-child{display:flex; align-items:baseline; gap:8px; min-width:0}
.page-title{font-size:15px !important; font-weight:700 !important; line-height:1.35}
.page-subtitle{font-size:11.5px !important; color:var(--v8-text-3) !important; margin:0 !important}
.v8-head{
  display:flex !important; align-items:center !important; justify-content:space-between !important;
  min-height:34px !important; padding:2px 0 6px !important;
}
.v8-head>div:first-child:not(.v8-head-r){display:flex; align-items:baseline; gap:8px; min-width:0}
.v8-head h1{font-size:15px !important; letter-spacing:0 !important; line-height:1.35 !important}
.v8-head p{font-size:11.5px !important; color:var(--v8-text-3) !important; margin:0 !important}
/* ★ 实测: 页头右侧的按钮/分段控件原来是 33px -> 把 .v8-head 顶到 41px ✗
   收敛到 24px 后: 页头 = 24 + 8 = 34px, 与 .page-header 完全一致 ✓ (且 >=24px 可点下限) */
.v8-head .v8-btn{height:24px !important; padding:0 10px !important; line-height:22px !important}
.v8-head .v8-btn.sm{height:22px !important; padding:0 8px !important}
.v8-head .v8-btn-setdefault{height:24px !important; padding:0 12px !important}
.v8-head .v8-seg{height:24px !important; padding:2px !important}
.v8-head .v8-seg-b{padding:1px 9px !important; line-height:18px !important; font-size:12px !important}
/* ★ 只有一行 .page-title 的页 (套餐) 也收敛成同一条 34px 页头 ✓ */
.page-section>.page-title{display:flex !important; align-items:center !important; min-height:34px !important; margin:0 0 8px 0 !important}

/* ---- 9.3 表格行高统一 32px (原 8 档: 总览75 订单61 套餐60 对接47 用户44 转化40 商品43 站点43)
   ★★ 两处实测坑 (2026-10-03, 都是"DOM 计数全绿但截图难看"的那一类):
     ① 单元格 line-height 写成固定 30px 时, 行内的 .v8-chip 会【继承 30px】-> 涨到 36px ->
        整行 37px ✗  => 改成无单位比例 1.45 (子元素继承比例, 不继承绝对值) ✓
     ② 「下单时间」列 140px 装不下 "2026-10-03 05:39:45" -> 折成 2 行 -> 整行 39px ✗
        => 单元格 nowrap (实测 1638 与 1366 视口横向溢出都是 0px ✓)
   ★ 表头与数据行【同高】(Carbon: column header row should always match the row size) ✓ */
.table thead th{height:32px !important; padding:0 14px !important; line-height:1.35 !important; font-size:11.5px !important}
.table tbody td{height:32px !important; padding:0 14px !important; line-height:1.45 !important; font-size:13px !important; white-space:nowrap}
.v8-tbl th{height:32px !important; padding:0 14px !important; line-height:1.35 !important}
.v8-tbl td{height:32px !important; padding:0 14px !important; line-height:1.45 !important; white-space:nowrap}
.table tbody td .btn-sm{height:22px !important; padding:0 8px !important; font-size:12px !important; line-height:20px !important}
.table tbody td .chip{line-height:20px}

/* ---- 9.4 产品选择器 (原侧栏 11 个产品移到这里; 产品是数据不是导航 ✓) ---- */
.v8-psel{position:relative; flex:0 0 auto}
.v8-psel-btn{
  display:flex; align-items:center; gap:6px; height:28px; padding:0 9px; max-width:270px;
  border:1px solid var(--v8-accent); background:var(--v8-accent-soft); border-radius:var(--v8-r-md);
  color:var(--v8-accent); font-size:12.5px; font-weight:600; cursor:pointer;
}
.v8-psel-btn:hover{background:rgba(9,105,218,.14)}
.v8-psel-btn .nm{overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
.v8-psel-btn .cv{font-size:9px}
.v8-psel-pop{
  position:absolute; left:0; top:31px; z-index:70; width:292px; display:none;
  background:#fff; border:1px solid var(--v8-line); border-radius:var(--v8-r-md);
  box-shadow:var(--v8-sh-pop); padding:6px;
}
.v8-psel.open .v8-psel-pop{display:block}
.v8-psel-search{
  width:100%; height:26px; padding:0 8px; margin-bottom:5px; font-size:12.5px;
  border:1px solid var(--v8-line-2); border-radius:6px; background:#fff; color:var(--v8-text);
}
.v8-psel-search:focus{border-color:var(--v8-accent); outline:none}
.v8-psel-list{max-height:300px; overflow-y:auto}
.v8-psel-it{
  display:flex; align-items:center; gap:7px; height:26px; padding:0 8px; border-radius:5px;
  cursor:pointer; font-size:12.5px; color:var(--v8-text);
}
.v8-psel-it:hover{background:var(--v8-panel-2)}
.v8-psel-it.on{background:var(--v8-accent-soft); color:var(--v8-accent); font-weight:600}
.v8-psel-it .nm{flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
.v8-psel-it .bd{font-size:10.5px; color:var(--v8-text-3)}
.v8-psel-note{font-size:10.5px; color:var(--v8-text-3); padding:4px 4px 1px; line-height:1.5}

/* ---- 9.4b ★ 2026-10-04 紧急修「软件与版本里面没有软件」:
   P0 把原侧栏 11 个软件搬进本页下拉后, 客户进来只看到【一个产品】-> 报"没有软件" ✗
   这里在页顶摆一行【全部软件 (11)】: 一眼看到所有软件, 当前那个高亮, 点一下即切 ✓
   退路: localStorage.setItem('csdmxx_adm_sw_list_off','1') / window.__v8SwList=false ✓ */
.v8-swlist{
  display:flex; align-items:flex-start; gap:8px; padding:5px 10px; margin:0 0 6px;
  background:var(--v8-panel-2); border:1px solid var(--v8-line); border-radius:var(--v8-r-md);
}
.v8-swlist-lb{flex:0 0 auto; font-size:11px; font-weight:600; color:var(--v8-text-3); line-height:24px; white-space:nowrap}
.v8-swlist-lb b{color:var(--v8-accent); font-size:12.5px}
.v8-swlist-items{display:flex; flex-wrap:wrap; gap:4px; min-width:0}
.v8-swchip{
  display:inline-flex; align-items:center; gap:4px; height:24px; max-width:170px; padding:0 8px;
  border:1px solid var(--v8-line-2); background:#fff; border-radius:12px;
  color:var(--v8-text); font-size:12px; font-weight:600; cursor:pointer; white-space:nowrap;
}
.v8-swchip:hover{border-color:var(--v8-accent); background:var(--v8-accent-soft); color:var(--v8-accent)}
.v8-swchip.on{border-color:var(--v8-accent); background:var(--v8-accent-soft); color:var(--v8-accent)}
.v8-swchip .ic{font-size:11px}
.v8-swchip .nm{overflow:hidden; text-overflow:ellipsis; white-space:nowrap; max-width:104px}
.v8-swchip .bd{font-size:10px; font-weight:600; color:var(--v8-text-3); background:rgba(0,0,0,.05); border-radius:8px; padding:0 5px; line-height:15px}
.v8-swchip.on .bd{background:rgba(9,105,218,.14); color:var(--v8-accent)}
/* 加载态 / 空态 (不再是死胡同 ✗) */
.v8-sw-state{font-size:13px; line-height:1.9}
.v8-sw-state .v8-sw-hint{font-size:12px; color:var(--v8-text-3)}

/* ---- 9.5 产品头压缩 (83 -> 44px) + 排序按钮与删除物理隔离 ---- */
#softwareFocus .product-focus-header{padding:7px 10px !important; gap:9px !important; min-height:44px}
/* ★ 实测: 产品名 + meta 原来是上下两行 (36px) -> 顶到 52px; 改成一行 => 44px ✓ */
#softwareFocus .product-focus-header>div[style*="flex:1"]{display:flex; align-items:baseline; gap:8px; min-width:0}
#softwareFocus .product-focus-header img{width:26px !important; height:26px !important; border-radius:6px !important}
#softwareFocus .product-focus-header .big-icon{width:26px !important; height:26px !important; font-size:13px !important; border-radius:6px !important}
#softwareFocus .product-focus-header .title{font-size:14.5px !important; line-height:1.3 !important}
#softwareFocus .product-focus-header .meta{font-size:11px !important; margin-top:0 !important}
#softwareFocus .product-focus-header .back-btn{padding:4px 8px !important; font-size:12px !important}
#softwareFocus .product-focus-header .btn{height:22px !important; padding:0 9px !important; font-size:12px !important}
#softwareFocus .product-focus-header .btn-icon{
  height:22px !important; padding:0 7px !important; font-size:13px !important;
  display:inline-flex; align-items:center;
}
.v8-sortbtn{min-width:62px; justify-content:center; font-variant-numeric:tabular-nums}
.v8-actsep{flex:0 0 1px; width:1px; height:20px; background:var(--v8-line-2); margin:0 6px}

/* ---- 9.6 产品排序面板 (危险操作收敛在一个面板里, 按钮 28x28) ---- */
#v8SortPanel .modal-box{width:560px}
.v8-sortp-hd{font-size:15px; font-weight:700; margin-bottom:4px}
.v8-sortp-note{
  font-size:12px; line-height:1.65; color:#7a5b00; background:#fff8c5; border:1px solid #f0d58c;
  border-radius:6px; padding:8px 10px; margin:10px 0;
}
.v8-sortp-list{max-height:46vh; overflow-y:auto}
.v8-sortp-row{
  display:flex; align-items:center; gap:9px; height:40px; padding:0 2px;
  border-bottom:1px solid var(--v8-line-2);
}
.v8-sortp-row:last-child{border-bottom:none}
.v8-sortp-row .idx{flex:0 0 20px; color:var(--v8-text-3); font-size:12px; font-variant-numeric:tabular-nums}
.v8-sortp-row .nm{flex:1; font-size:13px; color:var(--v8-text); overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
.v8-sortp-row .bd{font-size:11px; color:var(--v8-text-3)}
.v8-sortp-row .cur{font-size:10.5px; color:var(--v8-accent); background:var(--v8-accent-soft); border-radius:8px; padding:1px 6px}
.v8-sortp-btn{
  width:28px; height:28px; border:1px solid var(--v8-line); border-radius:6px; background:#fff;
  color:var(--v8-text-2); display:inline-flex; align-items:center; justify-content:center;
  font-size:12px; cursor:pointer;
}
.v8-sortp-btn:hover:not(:disabled){background:var(--v8-panel-2); color:var(--v8-text); border-color:var(--v8-accent)}
.v8-sortp-btn:disabled{opacity:.35; cursor:not-allowed}
.v8-sortp-foot{display:flex; justify-content:flex-end; gap:8px; margin-top:14px}

/* ============================================================================
 * §10 ★ P1_LAYOUT —— 方案D 第二步「紧凑内容区」(客户 2026-10-03 批准)
 *   数值取自 layout_preview/schemeD1_orders.html + schemeD3_software.html (已实测稿) ✓
 *   ⑤ KPI 大卡 110~139px -> 40px 紧凑统计条
 *   ⑥ 筛选区 53~85px -> 34px 表格工具条
 *   ⑦ 行级操作 -> ⋯ 菜单 24x24 (复制链接保留直达 ✓)
 *   ⑧ 开发自检话术 -> 表头「?」悬浮说明
 *   ⑩ 用户页零信息列隐藏
 *   ★ 退路: 整段删掉 = 回到 P0 形态 (标记类 v8-toolbar / v8-ract / v8-help 都不再被使用) ✓
 * ==========================================================================*/

/* ---- 10.1 ⑤ KPI 大卡 -> 40px 统计条 (卡数量再多也是一条)
       ★ 用 html[data-v8-p1] 做闸门: 退路开关打开时整条规则失效 -> 回到大卡 ✓ ---- */
html:not([data-v8-p1="off"]) .v8-kpis,
html:not([data-v8-p1="off"]) .kpi-grid{
  display:flex !important; flex-wrap:nowrap !important; gap:0 !important;
  height:40px !important; min-height:40px !important; max-height:40px !important;
  background:var(--v8-panel) !important; border:1px solid var(--v8-line) !important;
  border-radius:var(--v8-r-md) !important; overflow:hidden !important; margin:0 0 4px !important;
}
html:not([data-v8-p1="off"]) .v8-kpi,
html:not([data-v8-p1="off"]) .kpi-grid .kpi{
  flex:1 1 0 !important; min-width:0 !important;
  display:flex !important; flex-direction:row !important; align-items:baseline !important; gap:6px !important;
  height:40px !important; min-height:0 !important; padding:0 12px !important; margin:0 !important;
  background:transparent !important; border:0 !important; border-right:1px solid var(--v8-line-2) !important;
  border-radius:0 !important; box-shadow:none !important;
}
.v8-kpi:last-child,.kpi-grid .kpi:last-child{border-right:0 !important}
html:not([data-v8-p1="off"]) .kpi::before{display:none !important}   /* 旧的 4px 彩条在统计条里多余 ✗ */
html:not([data-v8-p1="off"]) .v8-kpi-t{display:flex !important; align-items:baseline !important; gap:5px !important; min-width:0 !important}
html:not([data-v8-p1="off"]) .v8-kpi-l,
html:not([data-v8-p1="off"]) .kpi-label{
  font-size:11px !important; line-height:1.2 !important; font-weight:600 !important;
  color:var(--v8-text-2) !important; margin:0 !important; letter-spacing:0 !important;
  text-transform:none !important; white-space:nowrap;
  overflow:hidden; text-overflow:ellipsis; flex:0 1 auto; min-width:0;
}
html:not([data-v8-p1="off"]) .v8-kpi-v,
html:not([data-v8-p1="off"]) .kpi-value{
  font-size:17px !important; line-height:1.1 !important; font-weight:700 !important;
  color:var(--v8-text) !important; margin:0 !important; letter-spacing:-.02em !important;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; flex:0 0 auto;
  font-variant-numeric:tabular-nums; font-feature-settings:"tnum" 1;
}
html:not([data-v8-p1="off"]) .v8-kpi-s,
html:not([data-v8-p1="off"]) .kpi-sub{
  font-size:10.5px !important; line-height:1.2 !important; color:var(--v8-text-3) !important;
  margin:0 !important; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  flex:0 1 auto; min-width:0;
}

/* ---- 10.2 ⑥ 筛选区 -> 34px 表格工具条 (闸门同上: 退路开关打开时回到旧筛选区) ---- */
html:not([data-v8-p1="off"]) .v8-toolbar{
  display:flex !important; flex-wrap:nowrap !important; align-items:center !important; gap:6px !important;
  height:34px !important; min-height:34px !important; max-height:34px !important;
  padding:0 8px !important; margin:0 0 4px !important;
  background:var(--v8-panel) !important; border:1px solid var(--v8-line) !important;
  border-radius:var(--v8-r-md) !important; box-shadow:none !important;
}
html:not([data-v8-p1="off"]) .v8-toolbar .v8-f,
html:not([data-v8-p1="off"]) .v8-toolbar .filter-group{
  display:flex !important; flex-direction:row !important; align-items:center !important; gap:5px !important;
  min-width:0 !important; margin:0 !important;
}
html:not([data-v8-p1="off"]) .v8-toolbar .v8-f>label,
html:not([data-v8-p1="off"]) .v8-toolbar .filter-group>label{
  font-size:11px !important; font-weight:600 !important; color:var(--v8-text-3) !important;
  line-height:1.2 !important; margin:0 !important; white-space:nowrap; text-transform:none !important;
  letter-spacing:0 !important;
}
html:not([data-v8-p1="off"]) .v8-toolbar input,
html:not([data-v8-p1="off"]) .v8-toolbar select,
html:not([data-v8-p1="off"]) .v8-toolbar .v8-btn,
html:not([data-v8-p1="off"]) .v8-toolbar .btn{
  height:24px !important; min-height:24px !important; padding:0 8px !important;
  font-size:12px !important; line-height:22px !important; border-radius:5px !important;
  width:auto !important; margin:0 !important;
}
html:not([data-v8-p1="off"]) .v8-toolbar .v8-f input[type="text"]{width:150px !important}
html:not([data-v8-p1="off"]) .v8-toolbar .v8-f input[type="date"]{width:132px !important}
html:not([data-v8-p1="off"]) .v8-toolbar .v8-grow{flex:1 1 auto !important; min-width:120px !important}
html:not([data-v8-p1="off"]) .v8-toolbar .v8-grow input[type="text"]{width:100% !important}
html:not([data-v8-p1="off"]) .v8-toolbar .filter-actions{margin-left:auto !important; display:flex !important; gap:6px !important; align-items:center !important}
html:not([data-v8-p1="off"]) .v8-toolbar .v8-facts{margin-left:auto !important; display:flex !important; gap:6px !important; align-items:center !important}
html:not([data-v8-p1="off"]) .v8-toolbar .v8-facts .v8-btn{height:24px !important}

/* ---- 10.3 ⑦ 行级操作 -> ⋯ 菜单 (目标 >=24x24, 复制链接保留直达) ---- */
.v8-tbl .rowacts{gap:4px !important; opacity:1 !important; justify-content:flex-end; white-space:nowrap}
.v8-tbl .rowacts .v8-link{
  display:inline-flex !important; align-items:center !important; justify-content:center !important;
  height:24px !important; min-width:24px !important; padding:0 8px !important;
  border-radius:5px !important; font-size:12px !important; border:1px solid transparent;
  text-decoration:none !important;
}
.v8-tbl .rowacts .v8-link:hover{background:var(--v8-panel-2) !important; text-decoration:none !important}
.v8-rm{position:relative; display:inline-flex; vertical-align:middle}
.v8-ract{
  width:24px; height:24px; padding:0; display:inline-flex; align-items:center; justify-content:center;
  border:1px solid transparent; border-radius:5px; background:transparent; color:var(--v8-text-2);
  font-size:14px; line-height:1; cursor:pointer; flex:0 0 24px;
}
.v8-ract:hover{background:var(--v8-panel-2); color:var(--v8-text); border-color:var(--v8-line)}
.v8-rm.open .v8-rm-btn{background:var(--v8-accent-soft); color:var(--v8-accent); border-color:var(--v8-accent)}
/* ★★ 必须 position:fixed —— 实测: admin_v7.css 有一条【全局 table{overflow:hidden}】(327 行),
   菜单放在表格里会被裁成 38px 高(只看得见第一项) ✗✗
   fixed 定位不受祖先 overflow 裁剪 ✓ 坐标由 features.js 在打开时算 (含贴底向上弹) ✓
   ★ 本文件不改 admin_v7.css (它写在 index.html 基线里, 动它要连带换 ?ver=7.x 的引用 ✗) */
.v8-rm-pop{
  display:none; position:fixed; left:0; top:0; z-index:95; min-width:154px; padding:4px;
  background:#fff; border:1px solid var(--v8-line); border-radius:var(--v8-r-md); box-shadow:var(--v8-sh-pop);
}
.v8-rm.open .v8-rm-pop{display:block}
/* ★★ 必须写全 .v8-tbl .rowacts .v8-rm-pop .v8-rm-it —— 实测: 本文件 557 行已有一条
   `.v8-tbl .rowacts button{white-space:nowrap !important; display:inline-block}`,
   普通写法(.v8-rm-it)会被它压成 inline-block -> 3 个菜单项挤在同一行、弹出只有 38px 高 ✗✗
   这里用更高特异性(4 个 class) + !important 拿回 display:flex ✓ */
.v8-tbl .rowacts .v8-rm-pop .v8-rm-it{
  display:flex !important; white-space:nowrap !important;
  align-items:center; gap:8px; width:100%; height:28px; padding:0 9px;
  border:0; border-radius:5px; background:transparent; color:var(--v8-text);
  font-size:12.5px; text-align:left; cursor:pointer;
}
.v8-rm-it:hover{background:var(--v8-panel-2)}
.v8-rm-it.danger{color:var(--v8-danger)}
.v8-rm-it.danger:hover{background:var(--v8-danger-soft)}

/* ---- 10.4 ⑧ 「?」悬浮说明 (替代 42px 自检话术块) ---- */
.v8-help{
  position:relative; display:inline-flex; align-items:center; justify-content:center;
  width:15px; height:15px; flex:0 0 15px; margin-left:6px; vertical-align:middle;
  border:1px solid var(--v8-line-2); border-radius:50%; background:var(--v8-panel-2);
  color:var(--v8-text-3); font-size:10px; font-weight:700; cursor:help;
}
.v8-help:hover,.v8-help:focus{background:var(--v8-accent-soft); color:var(--v8-accent); border-color:var(--v8-accent); outline:none}
.v8-help-pop{
  display:none; position:absolute; left:50%; transform:translateX(-50%); bottom:23px; z-index:90;
  width:max-content; max-width:430px; padding:9px 11px; border-radius:var(--v8-r-md);
  background:#1f2328; color:#fff; font-size:11.5px; font-weight:400; line-height:1.7;
  text-align:left; white-space:normal; box-shadow:0 8px 24px rgba(0,0,0,.20);
}
.v8-help-pop b{color:#fff}
.v8-help:hover .v8-help-pop,.v8-help:focus .v8-help-pop{display:block}

/* ---- 10.5 ⑩ 用户页零信息列隐藏 (数据驱动; 按钮在卡片头) ---- */
.v8-col-empty{display:none !important}
.v8-card-h .v8-colnote{font-size:11px; color:var(--v8-text-3); font-weight:400}
.v8-card-h .v8-btn{height:24px !important; padding:0 9px !important; line-height:22px !important; font-size:12px !important}

/* ============================================================================
 * §11 ★ P2_LAYOUT —— 方案D 第三步「收尾」(客户 2026-10-03 批准)
 *   ⑭ 两套顶栏合一 + 删重复品牌名 + 删实时钟 + 顶栏 56 -> 40
 *   ★ 先查清了"哪套在用"(实测): .v7-topbar 是 admin_v7.js 新建并 append 到 body 的,
 *     z-index 100; 旧 .topbar 在 index.html 里, z-index 40 -> 【被盖住的那一套】✗
 *     => 保留 .v7-topbar(活的那套), 旧 .topbar 已从 index.html 删除(只留 3 个隐藏占位) ✓
 *   ★ 不动 admin_v7.js (它写在 index.html 基线里, 动它要连带换 ?ver=7.x 引用 ✗)
 *     所以: 品牌名/实时钟 用 CSS 隐藏 ✓ (实时钟还留着 setInterval, 但写的是隐藏元素, 不报错 ✓)
 *   数值: 顶栏 40px 取自设计稿 schemeD1/D3 (顶栏 56->40) ✓
 * ==========================================================================*/

/* 11.1 顶栏 56 -> 40 (主内容区 padding-top 走同一个变量, 自动跟着上移 ✓) */
:root{ --v7-topbar-height: 40px; }

/* 11.2 删重复品牌名 + 删实时钟 (客户点名: 侧栏已写一次品牌名, 顶栏不再重复 ✓) */
.v7-topbar-logo{display:none !important}
.v7-clock{display:none !important}

/* 11.3 顶栏内部按 40px 收敛 (原来按 56px 排的) */
.v7-topbar{height:40px !important; padding:0 16px !important; gap:10px !important}
.v7-topbar .v7-hamburger{height:26px !important; line-height:26px !important; padding:0 8px !important; font-size:13px !important}
.v7-breadcrumb{font-size:12.5px !important}
.v7-search{height:26px !important; width:230px !important; padding:0 10px !important}
.v7-search input{font-size:12px !important}
.v7-user{gap:6px !important; font-size:12.5px !important}
.v7-user-avatar{width:22px !important; height:22px !important; font-size:11px !important; line-height:22px !important}

/* 11.4 旧 .topbar 兜底: 万一将来又被人加回来, 也不会和新顶栏叠着显示 ✗ */
.topbar{display:none !important}

/* 11.5 面包屑「父级 / 子级」的强调 (客户要求: 一眼看出自己在哪一层) */
.v7-breadcrumb span{color:var(--v8-text-3)}
.v7-breadcrumb .v7-crumb-current{color:var(--v8-text) !important; font-weight:600 !important}

/* ============================================================================
 * §12 ★ V8_SW_PLAT —— 2026-10-04 客户报「软件与版本里面 Mac 的版本和 Windows 的版本要分开」
 *   ① 版本列表【按平台分组】: 🪟 Windows / 🍎 macOS / 🪟🍎 通用 / 🐧 Linux / ⚠️ 未标注
 *      一组 = 一行小标题(图标 + 名称 + 数量 + 一句说明) + 一张独立的 .v8-tbl
 *      ★ 表格本体零改动 (还是原来的 .v8-tbl / 内联编辑 / ⋯菜单) ✓
 *   ② 卡头右上角【快捷切换】: 全部 / 只看 Windows / 只看 macOS / 只看通用 (复用 .v8-seg ✓)
 *   ③ 空的分组 / 空的那一档【一律不画】✗
 *      (只有 Windows 版本的产品 -> 绝不出现空的「🍎 macOS 版本」组和空的 macOS 档 ✓ 客户最烦空的东西)
 *   ★★ 浮层安全: 本段【没有任何浮层】, 分组小标题在【表格外面】✓
 *      (admin_v7.css:327 有一条全局 table{overflow:hidden} —— 放表格里的浮层会被裁 ✗ 本项目踩过)
 *   ★★ 冲突检查: 本段用的全是新类名 (.v8-swseg/.v8-swgrp*/.v8-swtbl-h), 已 grep 确认两份 CSS 里
 *      都没有同名老规则 -> 不存在"老规则压过新规则"的问题 ✓ (真冲突的那两种写了更高特异性)
 *   ★ 退路: localStorage.setItem('csdmxx_adm_sw_plat_off','1') / window.__v8SwPlat=false
 *      -> 回到一张平表; 本段样式留着不生效, 也完全不影响其它 11 页 ✓
 * ==========================================================================*/

/* 12.1 版本列表卡头: 右上角放分段控件 —— 卡头行高不变 (控件里没有浮层, 不会被裁 ✓) */
.v8-swtbl-h .v8-swseg{height:26px !important; padding:2px !important; flex:0 0 auto}
.v8-swtbl-h .v8-swseg .v8-seg-b{
  display:inline-flex !important; align-items:center; gap:4px;
  padding:2px 9px !important; line-height:18px !important; font-size:12px !important;
  white-space:nowrap;
}
.v8-swseg .v8-seg-b b{
  font-size:10px; font-weight:600; color:var(--v8-text-3); background:rgba(31,35,40,.06);
  border-radius:8px; padding:0 5px; line-height:15px; font-variant-numeric:tabular-nums;
}
.v8-swseg .v8-seg-b.on b{background:var(--v8-accent-soft); color:var(--v8-accent)}

/* 12.2 分组规则说明 (★ 客户要求: 规则写在页面上, 别让人困惑 ✓ 不做成悬浮层 ✗) */
.v8-swgrp-rule{
  font-size:11px; line-height:1.7; color:var(--v8-text-3); padding:5px 10px; margin:0 0 10px;
  background:var(--v8-panel-2); border:1px solid var(--v8-line); border-radius:var(--v8-r-md);
}
.v8-swgrp-rule b{color:var(--v8-text-2); font-weight:600}

/* 12.3 分组: 一组 = 小标题 + 一张表 (每组左边一条平台色竖线, 一眼分清 ✓) */
.v8-swgrp{margin-bottom:14px}
.v8-swgrp:last-child{margin-bottom:0}
.v8-swgrp-h{display:flex; align-items:center; gap:7px; padding:0 2px 6px; font-size:13px; min-width:0}
.v8-swgrp-h::before{content:""; flex:0 0 3px; width:3px; height:14px; border-radius:2px;
  background:var(--v8-accent)}
.v8-swgrp[data-v8grp="win"] .v8-swgrp-h::before{background:#0969da}
.v8-swgrp[data-v8grp="mac"] .v8-swgrp-h::before{background:#8250df}
.v8-swgrp[data-v8grp="all"] .v8-swgrp-h::before{background:#1a7f37}
.v8-swgrp[data-v8grp="linux"] .v8-swgrp-h::before{background:#bc4c00}
.v8-swgrp[data-v8grp="unknown"] .v8-swgrp-h::before{background:#cf222e}
.v8-swgrp-ic{font-size:12.5px; flex:0 0 auto}
.v8-swgrp-nm{font-weight:600; color:var(--v8-text); white-space:nowrap; flex:0 0 auto}
.v8-swgrp-bd{
  font-size:11px; font-weight:600; color:var(--v8-text-2); background:var(--v8-panel-3);
  border-radius:9px; padding:0 7px; line-height:16px; flex:0 0 auto;
  font-variant-numeric:tabular-nums;
}
.v8-swgrp-hint{font-size:11px; color:var(--v8-text-3); overflow:hidden; text-overflow:ellipsis;
  white-space:nowrap; min-width:0}
/* 组间距靠 margin, 不再叠一层阴影 ✗ (3 张表叠 3 层阴影会显脏) */
.v8-swgrp>.v8-card{box-shadow:none}

/* ==========================================================================
 * §13 收款账户页 (V8_PAYACCOUNTS) —— 客户点名: 「很方便地切换收款公司」
 * --------------------------------------------------------------------------
 * ① 当前默认账户: 大字号 + 主色左边线 + 浅主色底 -> 一眼看到「现在用哪家」✓
 * ② 危险操作(停用/删除) 与普通操作【竖线分隔 + 红色】✗ 不挨着主按钮 ✓
 *    (项目教训: ▲▼排序按钮 17×9px 紧邻主按钮 -> 误点换掉版本 ✗
 *     => 这里的按钮统一 ≥30px 高、间距 ≥10px、危险组前加分隔线 ✓)
 * ③ 表格里【绝不放浮层】✗ —— admin_v7.css:327 有全局 table{overflow:hidden},
 *    放表格里的下拉/浮层会被裁成一条 ✗ (本项目踩过)
 *    => 「查看/核对」/表单/二次确认 全部走 body 级 .v8-pacc-mask ✓
 * ④ 全部颜色走 --v8-* 变量 -> 变体(橙/蓝)自动跟随 ✓ 不硬编码颜色 ✗
 * ==========================================================================*/

/* ---- 13.1 诚实横幅 (★★ 最关键的一条: 切换暂未接入下单流程) ---- */
.v8-pacc-alert{background:var(--v8-danger-soft);border:1px solid var(--v8-danger-line);
  border-left:4px solid var(--v8-danger);border-radius:var(--v8-r-lg);padding:12px 16px;
  font-size:var(--v8-fs-sm);color:var(--v8-text-2);line-height:1.75}
.v8-pacc-alert h4{margin:0 0 5px;font-size:var(--v8-fs-md);color:var(--v8-danger);
  font-weight:var(--v8-fw-bold);display:flex;align-items:center;gap:6px}
.v8-pacc-alert ul{margin:5px 0 0;padding-left:19px}
.v8-pacc-alert li{margin:2px 0}
.v8-pacc-alert b{color:var(--v8-text);font-weight:var(--v8-fw-semi)}
.v8-pacc-alert .ok{color:var(--v8-ok);font-weight:var(--v8-fw-semi)}
.v8-pacc-alert .no{color:var(--v8-danger);font-weight:var(--v8-fw-semi)}
.v8-pacc-alert code{font-family:var(--v8-mono);font-size:12px;background:var(--v8-panel-3);
  border-radius:4px;padding:.5px 5px;color:var(--v8-text)}

/* ---- 13.2 折叠: 改造后会发生什么 (客户要"提前知道后果" ✓) ---- */
.v8-pacc-det{margin-top:8px;border-top:1px dashed var(--v8-danger-line);padding-top:7px}
.v8-pacc-det>summary{cursor:pointer;font-size:var(--v8-fs-sm);color:var(--v8-accent);
  font-weight:var(--v8-fw-semi);list-style:none;display:inline-flex;align-items:center;gap:5px}
.v8-pacc-det>summary::-webkit-details-marker{display:none}
.v8-pacc-det>summary::before{content:"▸";font-size:10px;transition:transform .15s}
.v8-pacc-det[open]>summary::before{transform:rotate(90deg)}
.v8-pacc-det .bd{margin-top:6px}
.v8-pacc-det .bd ol{margin:4px 0 0;padding-left:20px}
.v8-pacc-det .bd li{margin:3px 0}

/* ---- 13.3 ★ 当前默认账户大卡 (客户最怕搞错"现在用哪家" ✗) ---- */
.v8-pacc-cur{position:relative;display:flex;align-items:center;justify-content:space-between;
  gap:var(--v8-sp-6);flex-wrap:wrap;
  background:linear-gradient(90deg,var(--v8-accent-soft) 0%,var(--v8-panel) 52%);
  border:1px solid var(--v8-accent-line);border-left:4px solid var(--v8-accent);
  border-radius:var(--v8-r-lg);padding:14px 18px;box-shadow:var(--v8-sh-card)}
.v8-pacc-cur.flash{animation:v8PaccFlash 1.1s ease-out 2}
@keyframes v8PaccFlash{0%{box-shadow:0 0 0 0 var(--v8-accent-line)}
  100%{box-shadow:0 0 0 9px rgba(0,0,0,0)}}
.v8-pacc-cur-k{font-size:var(--v8-fs-xs);color:var(--v8-text-3);font-weight:var(--v8-fw-semi);
  letter-spacing:.04em;display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.v8-pacc-cur-n{font-size:23px;font-weight:var(--v8-fw-bold);color:var(--v8-text);line-height:1.25;
  margin-top:3px;display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.v8-pacc-cur-m{font-size:var(--v8-fs-sm);color:var(--v8-text-2);margin-top:5px;
  font-variant-numeric:tabular-nums;display:flex;gap:16px;flex-wrap:wrap}
.v8-pacc-cur-m i{font-style:normal;color:var(--v8-text-3)}
.v8-pacc-cur-r{flex:0 0 auto;text-align:right;display:flex;flex-direction:column;
  align-items:flex-end;gap:6px}
.v8-pacc-cur-hint{font-size:11.5px;color:var(--v8-text-3);line-height:1.6;max-width:250px}
.v8-pacc-cur-hint b{color:var(--v8-accent);font-weight:var(--v8-fw-semi)}
.v8-pacc-cur-none{font-size:15px;color:var(--v8-danger);font-weight:var(--v8-fw-semi)}

/* ---- 13.4 表格里的账户名 + 状态 ---- */
.v8-pacc-nm{display:flex;align-items:center;gap:7px;flex-wrap:wrap;min-width:0}
.v8-pacc-nm b{color:var(--v8-text);font-weight:var(--v8-fw-semi);font-size:var(--v8-fs-td)}
.v8-pacc-nm .sub{display:block;font-size:11px;color:var(--v8-text-3);margin-top:2px}
.v8-pacc-defchip{display:inline-flex;align-items:center;gap:4px;background:var(--v8-accent);
  color:var(--v8-on-accent);font-size:11px;font-weight:var(--v8-fw-semi);border-radius:var(--v8-r-pill);
  padding:1px 9px;white-space:nowrap}
.v8-pacc-tblwrap{overflow-x:auto}
.v8-pacc-mono{font-family:var(--v8-mono);font-size:12.5px;font-variant-numeric:tabular-nums;
  white-space:nowrap}
.v8-pacc-note{font-size:11px;color:var(--v8-text-3);display:block;margin-top:2px}

/* ---- 13.5 ★★ 操作列: 普通操作 | 分隔线 | 危险操作(红) ---- */
.v8-pacc-acts{display:flex;align-items:center;gap:10px;justify-content:flex-end}
.v8-pacc-acts .grp{display:flex;align-items:center;gap:7px}
.v8-pacc-acts .sep{width:1px;height:22px;background:var(--v8-line-2);flex:0 0 1px;margin:0 2px}
.v8-pacc-acts .v8-btn{min-height:30px;padding:5px 12px}
.v8-pacc-acts .v8-btn.sm{min-height:28px}
.v8-pacc-acts .off{color:var(--v8-text-3)}
.v8-pacc-setdef{background:var(--v8-accent);border-color:var(--v8-accent);color:var(--v8-on-accent);
  font-weight:var(--v8-fw-semi);min-height:30px;padding:5px 14px}
.v8-pacc-setdef:hover{background:var(--v8-accent-hover);border-color:var(--v8-accent-hover)}
/* 已停用/已删除行: 整行淡出, 一眼区分 ✓ */
.v8-pacc-tbl tr.is-off td{opacity:.55}
.v8-pacc-tbl tr.is-del td{opacity:.45;text-decoration:none}

/* ---- 13.6 分账统计 ---- */
.v8-pacc-range{display:flex;align-items:center;gap:var(--v8-sp-4);flex-wrap:wrap}
.v8-pacc-range .dt{display:flex;align-items:center;gap:5px;font-size:var(--v8-fs-xs);color:var(--v8-text-3)}
.v8-pacc-range input[type=date]{font-size:var(--v8-fs-sm);padding:5px 8px;
  border:1px solid var(--v8-line-2);border-radius:var(--v8-r-md);background:#fff;color:var(--v8-text)}
.v8-pacc-tbl{width:100%;border-collapse:collapse;table-layout:auto}
.v8-pacc-tbl th{background:var(--v8-panel-2);color:var(--v8-text-3);font-size:var(--v8-fs-xs);
  font-weight:var(--v8-fw-semi);text-align:left;padding:9px 14px;border-bottom:1px solid var(--v8-line-2);
  white-space:nowrap}
.v8-pacc-tbl td{padding:10px 14px;border-bottom:1px solid var(--v8-line);font-size:var(--v8-fs-td);
  color:var(--v8-text-2);vertical-align:middle}
.v8-pacc-tbl tbody tr:hover{background:var(--v8-panel-2)}
.v8-pacc-tbl tbody tr:last-child td{border-bottom:none}
.v8-pacc-tbl .num{text-align:right;font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1}
.v8-pacc-tbl .strong{color:var(--v8-text);font-weight:var(--v8-fw-semi)}
.v8-pacc-tbl tr.unassigned td{background:var(--v8-warn-soft)}
.v8-pacc-tbl tr.total td{background:var(--v8-panel-2);font-weight:var(--v8-fw-semi);color:var(--v8-text)}
.v8-pacc-why{background:var(--v8-warn-soft);border:1px solid var(--v8-warn-line);
  border-radius:var(--v8-r-lg);padding:10px 14px;font-size:var(--v8-fs-sm);color:var(--v8-text-2);
  line-height:1.8;margin:0 var(--v8-sp-6) var(--v8-sp-6)}
.v8-pacc-why h5{margin:0 0 4px;font-size:var(--v8-fs-md);color:var(--v8-warn);
  font-weight:var(--v8-fw-semi);display:flex;align-items:center;gap:6px}
.v8-pacc-why ul{margin:4px 0 0;padding-left:19px}
.v8-pacc-why code{font-family:var(--v8-mono);font-size:12px;background:var(--v8-panel);
  border:1px solid var(--v8-line);border-radius:4px;padding:.5px 5px}

/* ---- 13.7 弹窗 (body 级, z-index 盖过 .v7-topbar 的 100 与旧 modal 的 9999) ---- */
.v8-pacc-mask{position:fixed;inset:0;background:rgba(31,35,40,.45);z-index:10050;
  display:flex;align-items:flex-start;justify-content:center;padding:56px 20px 20px;overflow:auto}
.v8-pacc-mbox{background:var(--v8-panel);border-radius:var(--v8-r-lg);width:560px;max-width:100%;
  box-shadow:var(--v8-sh-pop);border:1px solid var(--v8-line-2);display:flex;flex-direction:column;
  max-height:calc(100vh - 80px)}
.v8-pacc-mbox.w620{width:620px}
.v8-pacc-mbox.w480{width:480px}
.v8-pacc-mhd{display:flex;align-items:center;justify-content:space-between;gap:var(--v8-sp-5);
  padding:14px 18px;border-bottom:1px solid var(--v8-line)}
.v8-pacc-mhd h3{margin:0;font-size:16px;font-weight:var(--v8-fw-semi);color:var(--v8-text);
  display:flex;align-items:center;gap:7px}
.v8-pacc-mhd .x{border:none;background:none;font-size:19px;line-height:1;color:var(--v8-text-3);
  cursor:pointer;padding:3px 7px;border-radius:var(--v8-r-sm)}
.v8-pacc-mhd .x:hover{background:var(--v8-panel-2);color:var(--v8-text)}
.v8-pacc-mbd{padding:16px 18px;overflow:auto;font-size:var(--v8-fs-sm);color:var(--v8-text-2);line-height:1.75}
.v8-pacc-mft{display:flex;align-items:center;justify-content:flex-end;gap:var(--v8-sp-4);
  padding:12px 18px;border-top:1px solid var(--v8-line);background:var(--v8-panel-2);
  border-radius:0 0 var(--v8-r-lg) var(--v8-r-lg)}
.v8-pacc-mft .left{margin-right:auto;font-size:var(--v8-fs-xs);color:var(--v8-text-3)}

/* ---- 13.8 二次确认里的"后果"块 (★ 危险动作必须写清后果) ---- */
.v8-pacc-conseq{background:var(--v8-danger-soft);border:1px solid var(--v8-danger-line);
  border-left:3px solid var(--v8-danger);border-radius:var(--v8-r-md);padding:9px 13px;margin-top:10px}
.v8-pacc-conseq b{color:var(--v8-danger)}
.v8-pacc-conseq ul{margin:4px 0 0;padding-left:19px}
.v8-pacc-conseq li{margin:2px 0}
.v8-pacc-conseq code{font-family:var(--v8-mono);font-size:12px}
.v8-pacc-arrow{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-top:8px;
  font-size:var(--v8-fs-md)}
.v8-pacc-arrow .frm{color:var(--v8-text-3);text-decoration:line-through}
.v8-pacc-arrow .to{color:var(--v8-text);font-weight:var(--v8-fw-bold)}
.v8-pacc-arrow .ar{color:var(--v8-accent);font-weight:700}

/* ---- 13.9 表单 ---- */
.v8-pacc-form{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.v8-pacc-f{display:flex;flex-direction:column;gap:4px;min-width:0}
.v8-pacc-f.full{grid-column:1 / -1}
.v8-pacc-f>label{font-size:var(--v8-fs-xs);color:var(--v8-text-3);font-weight:var(--v8-fw-semi)}
.v8-pacc-f>label .req{color:var(--v8-danger)}
.v8-pacc-f input[type=text],.v8-pacc-f input[type=password],.v8-pacc-f input[type=number],
.v8-pacc-f textarea,.v8-pacc-f select{width:100%;font-size:var(--v8-fs-sm);padding:7px 10px;
  border:1px solid var(--v8-line-2);border-radius:var(--v8-r-md);background:#fff;color:var(--v8-text);
  font-family:inherit;box-sizing:border-box}
.v8-pacc-f input:focus,.v8-pacc-f textarea:focus{border-color:var(--v8-accent);outline:none;
  box-shadow:var(--v8-sh-focus)}
.v8-pacc-f .hint{font-size:11px;color:var(--v8-text-3);line-height:1.6}
.v8-pacc-f .hint.warn{color:var(--v8-warn)}
.v8-pacc-f.err input,.v8-pacc-f.err textarea{border-color:var(--v8-danger)}
.v8-pacc-f .errmsg{font-size:11px;color:var(--v8-danger);font-weight:var(--v8-fw-semi)}
.v8-pacc-keyline{display:flex;gap:6px;align-items:center}
.v8-pacc-keyline input{flex:1;min-width:0}
.v8-pacc-eye{flex:0 0 auto;border:1px solid var(--v8-line-2);background:var(--v8-panel);
  border-radius:var(--v8-r-md);cursor:pointer;padding:6px 10px;font-size:13px;line-height:1.2}
.v8-pacc-eye:hover{background:var(--v8-panel-2)}
.v8-pacc-chk{display:flex;align-items:center;gap:7px;font-size:var(--v8-fs-sm);color:var(--v8-text-2)}
.v8-pacc-chk input{width:auto}
.v8-pacc-topline{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:10px}
.v8-pacc-errbox{background:var(--v8-danger-soft);border:1px solid var(--v8-danger-line);
  border-radius:var(--v8-r-md);padding:8px 12px;font-size:var(--v8-fs-sm);color:var(--v8-danger);
  margin-bottom:10px;font-weight:var(--v8-fw-semi)}
.v8-pacc-okbox{background:var(--v8-ok-soft);border:1px solid var(--v8-ok-line);
  border-radius:var(--v8-r-md);padding:9px 12px;font-size:var(--v8-fs-sm);color:var(--v8-text-2);
  line-height:1.7;margin-top:10px}
.v8-pacc-okbox.bad{background:var(--v8-danger-soft);border-color:var(--v8-danger-line)}
.v8-pacc-okbox b{color:var(--v8-text)}
.v8-pacc-okbox .big{font-size:var(--v8-fs-md);font-weight:var(--v8-fw-bold)}
.v8-pacc-okbox pre{margin:6px 0 0;white-space:pre-wrap;word-break:break-all;font-size:11.5px;
  color:var(--v8-text-3);font-family:var(--v8-mono);max-height:110px;overflow:auto}
.v8-pacc-spin{display:inline-block;width:12px;height:12px;border:2px solid var(--v8-line-2);
  border-top-color:var(--v8-accent);border-radius:50%;animation:v8PaccSpin .7s linear infinite}
@keyframes v8PaccSpin{to{transform:rotate(360deg)}}

/* ---- 13.10 「查看/核对」面板内容 ---- */
.v8-pacc-kv{display:grid;grid-template-columns:96px 1fr;gap:6px 10px;font-size:var(--v8-fs-sm)}
.v8-pacc-kv .k{color:var(--v8-text-3)}
.v8-pacc-kv .v{color:var(--v8-text);word-break:break-all;font-variant-numeric:tabular-nums}
.v8-pacc-kv .v.mono{font-family:var(--v8-mono);font-size:12.5px}
.v8-pacc-check{display:flex;gap:7px;align-items:center;margin-top:6px}
.v8-pacc-check input{flex:1;min-width:0;font-size:var(--v8-fs-sm);padding:7px 10px;
  border:1px solid var(--v8-line-2);border-radius:var(--v8-r-md);font-family:var(--v8-mono)}
.v8-pacc-verdict{font-size:var(--v8-fs-sm);font-weight:var(--v8-fw-semi);margin-top:7px}
.v8-pacc-verdict.ok{color:var(--v8-ok)}
.v8-pacc-verdict.no{color:var(--v8-danger)}

/* ---- 13.11 空态指引 (★ 绝不留死链: 空态一定给"下一步点哪里") ---- */
.v8-pacc-guide{padding:26px 22px;text-align:center}
.v8-pacc-guide .ic{font-size:32px;opacity:.5;line-height:1}
.v8-pacc-guide .t{font-size:15px;color:var(--v8-text);font-weight:var(--v8-fw-semi);margin-top:9px}
.v8-pacc-guide .s{font-size:var(--v8-fs-sm);color:var(--v8-text-3);line-height:1.8;
  max-width:560px;margin:7px auto 0;text-align:left}
.v8-pacc-guide .s ol{margin:4px 0 0;padding-left:20px}
.v8-pacc-guide .s li{margin:3px 0}
.v8-pacc-guide .b{margin-top:14px;display:flex;gap:9px;justify-content:center;flex-wrap:wrap}

/* ---- 13.12 变更日志 ---- */
.v8-pacc-act{display:inline-flex;align-items:center;gap:5px;font-size:var(--v8-fs-xs);
  font-weight:var(--v8-fw-semi);border-radius:var(--v8-r-pill);padding:2px 9px;white-space:nowrap;
  background:var(--v8-panel-3);color:var(--v8-text-2)}
.v8-pacc-act.sw{background:var(--v8-accent-soft);color:var(--v8-accent)}
.v8-pacc-act.new{background:var(--v8-ok-soft);color:var(--v8-ok)}
.v8-pacc-act.del{background:var(--v8-danger-soft);color:var(--v8-danger)}
.v8-pacc-act.dis{background:var(--v8-warn-soft);color:var(--v8-warn)}
.v8-pacc-logsw{display:inline-flex;align-items:center;gap:6px}
.v8-pacc-logsw .to{color:var(--v8-text);font-weight:var(--v8-fw-semi)}
.v8-pacc-logsw .ar{color:var(--v8-text-3)}
.v8-pacc-more{display:flex;justify-content:center;padding:11px}

/* ---- 13.1b 状态自检横幅的「已接入 ✓」绿档 (2026-10-04 pay.js 改造上线后新增)
   ★ 为什么要有绿档: 原来那条横幅是红档"还没接入", 改造上线后结论反了 ✗
     现在横幅结论由实测数字驱动, 底色也跟着状态走 -> 客户一眼看出"到底生效没生效" ✓ */
.v8-pacc-alert.ok{background:var(--v8-ok-soft);border-color:var(--v8-ok-line);border-left-color:var(--v8-ok)}
.v8-pacc-alert.ok h4{color:var(--v8-ok)}
.v8-pacc-alert.ok .v8-pacc-conseq{margin-top:10px}
.v8-pacc-note-li{font-size:var(--v8-fs-xs);color:var(--v8-text-3);list-style:none;margin-left:-19px}

/* ---- 13.1c 分账"要等新订单才开始累计"的说明块 (信息档: 琥珀色, 不是危险红) ---- */
.v8-pacc-info{background:var(--v8-warn-soft);border:1px solid var(--v8-warn-line);
  border-left:3px solid var(--v8-warn);border-radius:var(--v8-r-md);padding:9px 13px;margin-top:10px;
  font-size:var(--v8-fs-sm);color:var(--v8-text-2);line-height:1.75}
.v8-pacc-info>b{color:var(--v8-warn)}
.v8-pacc-info ul{margin:4px 0 0;padding-left:19px}
.v8-pacc-info li{margin:2px 0}
.v8-pacc-info code{font-family:var(--v8-mono);font-size:12px;background:var(--v8-panel);
  border:1px solid var(--v8-line);border-radius:4px;padding:.5px 5px;color:var(--v8-text)}

/* ============================================================================
 * §14 STV2 —— 「站点与转化」页（按域名一行 + 每行 4 个操作）
 * ----------------------------------------------------------------------------
 * 客户 2026-10-04 原话：「站点那里改成鼎尖的样式，按域名分开操作
 *   （可以查看实时访客，可以手动回传，自动回传，可以填token）」+ 已确认【不需要客服】✗
 *
 * ★ 命名全部带 .v8-stv / .stv- 前缀 -> 与既有 1200 行规则零撞名 ✓
 *
 * ★★ 为什么表格必须用【更高特异性 + !important】夺回 height/white-space：
 *    实测本文件 654-655 行有
 *      .v8-tbl th{height:32px !important; ...}
 *      .v8-tbl td{height:32px !important; padding:0 14px !important; white-space:nowrap !important}
 *    （那是 P0_LAYOUT 的"表格行高统一 32px"改造，是客户批准过的，不能动它 ✗）
 *    但本页的单元格里有【副行】（如「PV 361」「近7天 4 笔」），32px 会被压掉 ✗
 *    => 本页表头用 .v8-tbl.v8-stv-tbl（2 个 class + !important）只在本页夺回 ✓
 *       ★ 绝不改那些既有规则 ✗ 别的页零影响 ✓
 *
 * ★★ 抽屉必须 position:fixed 且挂在 body 上：
 *    admin_v7.css:327 有【全局 table{overflow:hidden}】+ .v8-card 也是 overflow 场景，
 *    浮层放在卡片/表格里会被裁 ✗（本项目已踩过：⋯ 菜单被裁成 38px 只看得见第一项）
 * ==========================================================================*/

/* ---------------------------------------------------------------- 侧栏「本轮变更」小标 */
.v8-side-nav .v8-nm{margin-left:5px;font-size:9.5px;font-weight:var(--v8-fw-semi);line-height:1;
  padding:1.5px 4px;border-radius:3px;background:var(--v8-accent-soft);color:var(--v8-accent);
  border:1px solid var(--v8-accent-line);vertical-align:1px;letter-spacing:0}

/* ---------------------------------------------------------------- KPI 条 */
.v8-stv-kpis{display:grid;grid-template-columns:repeat(6,1fr);gap:10px}
.v8-stv-kpi{background:var(--v8-panel);border:1px solid var(--v8-line);border-radius:var(--v8-r-lg);
  padding:11px 13px;box-shadow:var(--v8-sh-card);min-width:0}
.v8-stv-kpi-l{font-size:var(--v8-fs-xs);color:var(--v8-text-2);font-weight:var(--v8-fw-med);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.v8-stv-kpi-v{font-size:24px;font-weight:var(--v8-fw-bold);line-height:1.25;margin-top:3px;
  font-variant-numeric:tabular-nums;letter-spacing:-.5px}
.v8-stv-kpi-v .u{font-size:13px;font-weight:var(--v8-fw-med);margin-left:1px;color:var(--v8-text-3)}
.v8-stv-kpi-s{font-size:var(--v8-fs-xs);color:var(--v8-text-3);margin-top:2px;line-height:1.5;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.v8-stv-kpi.is-nil{background:var(--v8-panel-2)}
.v8-stv-nil{color:var(--v8-text-3);font-weight:var(--v8-fw-med);cursor:help}
.v8-stv-kpi.is-nil .v8-stv-nil{font-size:24px}

/* ---------------------------------------------------------------- 筛选工具栏（设计稿列表页） */
.v8-stv-tools{display:flex;align-items:center;justify-content:space-between;gap:10px;
  flex-wrap:wrap;padding:10px 16px !important;border-bottom:1px solid var(--v8-line);
  background:var(--v8-panel-2)}
.v8-stv-tools-l{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0}
.v8-stv-tools-r{display:flex;align-items:center;gap:8px;flex:0 0 auto}
.v8-stv-tools .stv-inp{height:28px;padding:0 9px;font-size:12.5px}
.v8-stv-tools .v8-btn{height:28px}

/* ---------------------------------------------------------------- 主表 */
.v8-tbl.v8-stv-tbl{table-layout:fixed}
.v8-tbl.v8-stv-tbl td{height:auto !important;padding:4px 12px !important;
  white-space:normal !important;vertical-align:middle}
.v8-tbl.v8-stv-tbl th{height:auto !important;min-height:34px;padding:5px 12px !important;
  white-space:normal !important;line-height:1.3 !important;vertical-align:middle;
  font-weight:var(--v8-fw-semi)}
/* 表头第二行小字（普通转化 / 点击下载）—— 宽列名挤在一行会变成 3 行被裁 ✗ */
.v8-tbl.v8-stv-tbl th .th-s{font-size:10.5px;font-weight:var(--v8-fw);color:var(--v8-text-3);line-height:1.35}
.v8-tbl.v8-stv-tbl td.num,.v8-tbl.v8-stv-tbl th.num,
.v8-tbl.v8-stv-tbl td.mono{white-space:nowrap !important}
.v8-tbl.v8-stv-tbl td.num{text-align:right;font-variant-numeric:tabular-nums}
.v8-tbl.v8-stv-tbl tbody tr.v8-stv-row.is-open{background:var(--v8-accent-soft) !important}
.v8-tbl.v8-stv-tbl tbody tr.is-orphan{background:repeating-linear-gradient(45deg,
  rgba(31,35,40,.014) 0 8px,transparent 8px 16px) !important}
.v8-stv-tbl .sub{font-size:11.5px;color:var(--v8-text-3);line-height:1.5;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis;margin-top:2px}
.v8-stv-tbl .sub .v8-chip{font-size:10.5px;padding:1px 6px}
.v8-stv-tbl .sub b.warn{color:var(--v8-warn)}
/* ★★ 必须写全 `.v8-tbl.v8-stv-tbl td.v8-stv-note` —— 实测本页自己那条
   `.v8-tbl.v8-stv-tbl td{white-space:normal !important}` 有【更高特异性】，
   只写 `.v8-stv-note{white-space:nowrap !important}` 会被它压掉 ->
   备注列被折成 2~3 行，把行高从 58 撑到 74/93 ✗✗（已踩）
   这里用 2 class + 1 element 拿回 nowrap，配合 ellipsis + title 显示完整值 ✓ */
.v8-tbl.v8-stv-tbl td.v8-stv-note{font-size:12px;color:var(--v8-text-3);
  white-space:nowrap !important;overflow:hidden;text-overflow:ellipsis}

/* ============================================================================
 * ★★ 鼎尖式重排（客户第二次给截图后按那张表做的）
 *   页面标识/名称(含图标群) | 页面状态 | 统计数据 | 在线访客 | 回传 | 备注 | ⋯
 *   要点：无竖线 · 行高紧凑 · 浅色 · 留白多但信息密度高 ✓
 * ==========================================================================*/
/* 表格线：只留极淡的横线，✗ 无竖线 */
.v8-tbl.v8-stv-tbl thead th{border-bottom:1px solid var(--v8-line-2) !important;
  color:var(--v8-text-2) !important;font-size:11.5px !important}
.v8-tbl.v8-stv-tbl tbody td{border-bottom:1px solid var(--v8-line) !important;
  border-left:0 !important;border-right:0 !important}
.v8-tbl.v8-stv-tbl{background:#fff}

/* ---- ① 名称列：小头像 + 名称 + #ID + 图标群 + 一排状态小标记 ---- */
.v8-stv-tbl td.v8-stv-site{padding:6px 10px 6px 12px !important}
.v8-stv-site .nm{display:flex;align-items:center;gap:8px;min-width:0}
.v8-stv-site .ava{width:24px;height:24px;border-radius:6px;flex:0 0 24px;display:inline-flex;
  align-items:center;justify-content:center;font-size:12px;font-weight:var(--v8-fw-bold);
  color:#fff;background:var(--v8-data-1);letter-spacing:0}
.v8-stv-site .ava-a1{background:var(--v8-data-1)}
.v8-stv-site .ava-a2{background:var(--v8-data-4)}
.v8-stv-site .ava-a3{background:var(--v8-data-2)}
.v8-stv-site .ava-a4{background:var(--v8-data-3)}
.v8-stv-site .ava-orphan{background:var(--v8-panel-3);color:var(--v8-text-3)}
.v8-stv-site .nm-txt{display:flex;align-items:baseline;gap:5px;min-width:0;flex:0 1 auto}
.v8-stv-site .dom{font-family:var(--v8-mono);font-size:12.5px;font-weight:var(--v8-fw-semi);
  color:var(--v8-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:150px;
  display:inline-block;vertical-align:bottom}
.v8-stv-site .sid{font-size:10.5px;color:var(--v8-text-3);font-family:var(--v8-mono);flex:0 0 auto}
.v8-stv-site .dom-btn{display:inline-flex;align-items:center;max-width:100%;
  background:transparent;border:0;padding:1px 3px;margin-left:-3px;border-radius:5px;cursor:pointer;text-align:left}
.v8-stv-site .dom-btn:hover{background:var(--v8-accent-soft)}
.v8-stv-site .marks{display:flex;gap:5px;align-items:center;margin-top:2px;padding-left:32px;
  overflow:hidden;white-space:nowrap}
.v8-stv-site .mk{font-size:10.5px;line-height:1.5;color:var(--v8-text-3);
  background:var(--v8-panel-2);border:1px solid var(--v8-line);border-radius:3px;padding:0 5px;flex:0 0 auto}
.v8-stv-site .mk-ok{color:var(--v8-ok);background:var(--v8-ok-soft);border-color:var(--v8-ok-line)}
.v8-stv-site .mk-warn{color:var(--v8-warn);background:var(--v8-warn-soft);border-color:var(--v8-warn-line)}
.v8-stv-site .mk-gray{color:var(--v8-text-3)}

/* ---- ★★ 图标群（紧跟名称右边）：客户点名的 3 个操作必须一眼找到 ----
   可点区域 26×26 ✓（本项目踩过 ▲▼ 17×9 太小误点 ✗）；✗ 不用 emoji ✗ 不用图标字体 */
.v8-stv-site .ig{display:inline-flex;align-items:center;gap:2px;flex:0 0 auto;margin-left:2px}
/* ★★ STV3n（客户："按钮做的更可视化一点"）：原来 4 个按钮是【透明底 + 透明边框】= 看着像裸图标 ✗
   -> 改成【一整条可见的操作条】：浅底 + 可见边框 + 组内分隔，一眼就知道"这里能点" ✓
      ★ 每个按钮仍有 26×26 的可点区域（本项目踩过 ▲▼ 17×9 太小误点 ✗ 不再犯 ✓）*/
.v8-stv-site .ig{border:1px solid var(--v8-line);border-radius:8px;background:var(--v8-panel-2);
  padding:2px;gap:1px}
.v8-stv-site .ig-b{width:26px;height:26px;padding:0;display:inline-flex;align-items:center;
  justify-content:center;border:1px solid transparent;border-radius:6px;background:transparent;
  color:var(--v8-text-2);cursor:pointer;flex:0 0 26px;transition:background .12s,color .12s,border-color .12s}
.v8-stv-site .ig:hover{box-shadow:0 1px 2px rgba(0,0,0,.04)}
.v8-stv-site .ig-b:hover{background:var(--v8-accent-soft);color:var(--v8-accent);
  border-color:var(--v8-accent-line)}
/* ★★ STV3o/3p（客户："没有层次感" -> 又指出"最重要的按钮是访客"）
   => 三层层次（★ 主操作 = 看访客，客户说的最重要那一个）：
      ① 主操作 = 👁 看访客（实心浅主题色 + 加粗，hover 变实心主题色）
      ② 次操作 = 🔑 转化对接（描边按钮，比主操作轻一档但明显可点）
      ③ 辅助 = ⏻ 回传开关（ghost，但保留状态色：开=绿 ✓）/ ↻ 手动回传（ghost 灰）
      + 查看类 与 配置类 之间一条分隔线 = 分组 ✓（每个按钮仍有 26×26 可点区 ✓）*/
.v8-stv-site .ig-b.ig-primary{background:var(--v8-accent-soft);border-color:var(--v8-accent-line);
  color:var(--v8-accent);font-weight:600}
.v8-stv-site .ig-b.ig-primary:hover{background:var(--v8-accent);border-color:var(--v8-accent);color:#fff}
.v8-stv-site .ig-b.ig-sw{background:var(--v8-panel);border-color:var(--v8-line);color:var(--v8-text-3)}
.v8-stv-site .ig-b.ig-sec{background:var(--v8-panel);border-color:var(--v8-line);color:var(--v8-text-2)}
.v8-stv-site .ig-b.ig-sec:hover{background:var(--v8-accent-soft);border-color:var(--v8-accent-line);color:var(--v8-accent)}
.v8-stv-site .ig-b.ig-ghost{background:transparent;border-color:transparent;color:var(--v8-text-3)}
.v8-stv-site .ig-b.ig-ghost:hover{background:var(--v8-panel-3);color:var(--v8-text);border-color:var(--v8-line)}
.v8-stv-site .ig-sep{width:1px;height:16px;background:var(--v8-line);margin:0 3px;flex:0 0 1px}
.v8-stv-site .ig-b:active{background:var(--v8-panel-3)}
.v8-stv-site .ig-b:disabled{opacity:.45;cursor:not-allowed}
/* ★★ STV3q：主按钮「看访客」的【在线人数徽标】—— 小胶囊、与主按钮同色系（主题蓝底白字）
   ✗ 不用红色 ✗（红会让客户以为是"错误/告警"）；在线为 0 时【根本不渲染】(见 JS 注释里的三条理由 ✓) */
.v8-stv-site .ig-b.ig-primary .bb{min-width:16px;height:16px;padding:0 5px;margin-left:1px;border-radius:9px;
  background:var(--v8-accent);color:#fff;font-size:10.5px;font-weight:600;line-height:1;
  display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;
  font-variant-numeric:tabular-nums}
.v8-stv-site .ig-b.ig-primary:hover .bb{background:#fff;color:var(--v8-accent)}
@media (max-width:1280px){.v8-stv-site .ig-b.ig-primary .bb{display:none}}
/* ★★ STV3i/3n（客户要求：「转化对接」要能一眼看出是转化对接）—— 宽屏给【图标 + 短文字】，窄屏只留图标
   ★ 实测：行宽 1388px、表格零横向溢出、单元格零截断（发布前已断言 ✓）；加宽只作用在这几个按钮上 */
.v8-stv-site .ig-b.ig-lb{width:auto;flex:0 0 auto;padding:0 8px 0 6px;gap:4px}
.v8-stv-site .ig-b.ig-lb .lb{font-size:11px;line-height:1;white-space:nowrap;color:inherit}
@media (max-width:1280px){.v8-stv-site .ig-b.ig-lb .lb{display:none}.v8-stv-site .ig-b.ig-lb{width:26px;padding:0;flex:0 0 26px}}
/* ★ 自动回传 = 开关态：开=绿色实心开关；关=灰色空心开关（一眼看出 ✓） */
.v8-stv-site .ig-sw.on{color:var(--v8-ok);background:var(--v8-ok-soft);border-color:var(--v8-ok-line)}
.v8-stv-site .ig-sw.on:hover{color:var(--v8-ok);border-color:var(--v8-ok)}
.v8-stv-site .ig-sw .lb{font-weight:600}
.stv-ic .stv-fill{fill:currentColor;stroke:none}
.stv-ic .stv-knob{fill:#fff;stroke:none}

/* ---- ② 页面状态列 ---- */
.v8-tbl.v8-stv-tbl td .sub{max-width:100%}

/* ---- ③ 统计数据列：★ 只有两行（行高才压得住）----
   line1 访问 N · PV N   line2 转化 普通 深度 成交额（三个不同颜色的数字）+ 转化率 */
.v8-stv-stat .st{display:flex;align-items:baseline;gap:6px;line-height:1.4;min-width:0}
.v8-stv-stat .st+.st{margin-top:2px}
.v8-stv-stat .st .k{font-size:10.5px;color:var(--v8-text-3);flex:0 0 26px}
.v8-stv-stat .st .v{font-size:13.5px;font-weight:var(--v8-fw-semi);
  font-variant-numeric:tabular-nums;flex:0 0 auto}
.v8-stv-stat .st .v1{color:var(--v8-data-1)}
.v8-stv-stat .st .v2{color:var(--v8-data-1)}
.v8-stv-stat .st .v3{color:var(--v8-data-2)}
.v8-stv-stat .st .v5{color:var(--v8-info);font-size:12.5px}
.v8-stv-stat .st .v4{color:var(--v8-text-3)}
.v8-stv-stat .st .v0{color:var(--v8-text-3);cursor:help}
.v8-stv-stat .st .x{font-size:10.5px;color:var(--v8-text-3);white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;font-variant-numeric:tabular-nums;min-width:0}
/* 表头旁的小刷新图标 */
.v8-tbl.v8-stv-tbl th.v8-stv-stath{display:table-cell}
.stv-thref{width:20px;height:20px;margin-left:5px;padding:0;display:inline-flex;align-items:center;
  justify-content:center;border:1px solid var(--v8-line);border-radius:5px;background:#fff;
  color:var(--v8-text-3);cursor:pointer;vertical-align:-4px}
.stv-thref:hover{color:var(--v8-accent);border-color:var(--v8-accent-line);background:var(--v8-accent-soft)}

/* ---- ⑦ 行尾 ⋯ ---- */
.v8-stv-ops{white-space:nowrap !important;text-align:right}
.v8-stv-ops .ops-orphan{display:inline-flex;align-items:center;gap:6px;justify-content:flex-end}
.v8-stv-ops .ops-orphan .tip{font-size:10.5px;color:var(--v8-text-3);white-space:nowrap}
.v8-stv-more{width:26px;height:26px;padding:0;display:inline-flex;align-items:center;justify-content:center;
  border:1px solid transparent;border-radius:6px;background:transparent;color:var(--v8-text-2);cursor:pointer}
.v8-stv-more:hover{background:var(--v8-panel-2);color:var(--v8-text);border-color:var(--v8-line-2)}
/* ⋯ 弹层：★★ 必须 position:fixed 且挂在 body（躲开 admin_v7.css 的全局 table{overflow:hidden}）
   坐标由 JS 按按钮 rect 算，贴底会自动向上弹 ✓ */
.stv-menu{position:fixed;z-index:130;min-width:186px;padding:4px;background:#fff;
  border:1px solid var(--v8-line-2);border-radius:var(--v8-r-md);box-shadow:var(--v8-sh-pop)}
.stv-menu .stv-mi{display:flex !important;align-items:center;gap:8px;width:100%;height:30px;
  padding:0 9px;border:0;border-radius:5px;background:transparent;color:var(--v8-text);
  font-size:12.5px;font-family:inherit;cursor:pointer;text-align:left;white-space:nowrap}
.stv-menu .stv-mi:hover{background:var(--v8-panel-2)}
.stv-menu .stv-mi .stv-ic{color:var(--v8-text-3);flex:0 0 15px}
.stv-menu .stv-mi:hover .stv-ic{color:var(--v8-accent)}
.stv-menu .stv-mi.danger{color:var(--v8-danger)}
.stv-menu .stv-mi.danger .stv-ic{color:var(--v8-danger)}
.stv-menu .stv-mi.danger:hover{background:var(--v8-danger-soft)}

/* 在线访客列 */
.v8-stv-live{display:inline-flex;align-items:center;gap:5px}
.v8-stv-live .dot{width:7px;height:7px;border-radius:50%;background:var(--v8-line-2);flex:0 0 7px}
.v8-stv-live .dot.on{background:#12b886;box-shadow:0 0 0 3px rgba(18,184,134,.16)}
.v8-stv-live b{font-variant-numeric:tabular-nums;min-width:14px;text-align:right}
.v8-stv-live .bars{display:inline-flex;align-items:flex-end;gap:1.5px;height:13px;margin-left:2px}
.v8-stv-live .bars i{width:3px;background:var(--v8-data-1);border-radius:1px;display:block}

/* ---------------------------------------------------------------- 展开行（漏斗/趋势/明细） */
.v8-tbl.v8-stv-tbl tbody tr.v8-stv-det>td{background:var(--v8-panel-2) !important;padding:0 !important;
  border-bottom:2px solid var(--v8-line-2) !important}
.det-box{display:grid;grid-template-columns:1fr 1fr;gap:14px;padding:14px 16px}
.det-col{min-width:0}
.det-wide{grid-column:1 / -1}
.det-t{font-size:12.5px;font-weight:var(--v8-fw-semi);color:var(--v8-text);margin-bottom:8px;
  display:flex;align-items:baseline;gap:7px}
.det-t small{font-size:11px;font-weight:var(--v8-fw);color:var(--v8-text-3)}
.det-load,.det-empty{font-size:12px;color:var(--v8-text-3);padding:14px 2px}
.det-funnel{display:flex;flex-direction:column;gap:9px}
.det-funnel .fl-l{display:flex;justify-content:space-between;font-size:12px;color:var(--v8-text-2);margin-bottom:3px}
.det-funnel .fl-l b{color:var(--v8-text);font-variant-numeric:tabular-nums}
.det-funnel .fl-bar{height:12px;border-radius:3px;background:var(--v8-panel-3);overflow:hidden}
.det-funnel .fl-bar i{display:block;height:100%;border-radius:3px;transition:width .25s}
.det-funnel .fl-n{font-size:11px;color:var(--v8-text-3);margin-top:2px}
.det-trend svg{width:100%;height:96px;display:block;background:#fff;border:1px solid var(--v8-line);border-radius:var(--v8-r-md)}
.det-trend .xlab{display:flex;justify-content:space-between;font-size:10.5px;color:var(--v8-text-3);margin-top:3px}
.det-trend .ylab{font-size:11px;color:var(--v8-text-3);margin-top:2px}
.v8-tbl.v8-stv-mini{background:#fff;border:1px solid var(--v8-line);border-radius:var(--v8-r-md);overflow:hidden}
.v8-tbl.v8-stv-mini th{height:26px !important;padding:0 9px !important;font-size:11px !important}
.v8-tbl.v8-stv-mini td{height:26px !important;padding:0 9px !important;font-size:11.5px !important;
  white-space:nowrap !important;border-bottom:1px solid var(--v8-line)}
.det-kv{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:4px 18px}
.det-kv .kv{display:flex;gap:6px;font-size:12px;padding:2px 0;border-bottom:1px dashed var(--v8-line);min-width:0}
.det-kv .kv .k{color:var(--v8-text-3);flex:0 0 132px}
.det-kv .kv .v{color:var(--v8-text);white-space:normal;word-break:break-all}
.det-cfg .det-acts{display:flex;gap:8px;margin-top:10px}

/* ---------------------------------------------------------------- 底部两块 */
.v8-stv-bottom{display:grid;grid-template-columns:1fr 1fr;gap:var(--v8-sp-6)}
.ch-row{display:flex;align-items:center;gap:9px;padding:7px 0;border-bottom:1px dashed var(--v8-line);
  font-size:12.5px;flex-wrap:wrap}
.ch-row:last-of-type{border-bottom:0}
.ch-row .ch-ic{font-size:11px;color:var(--v8-text-3);flex:0 0 auto}
.ch-row .ch-k{color:var(--v8-text);font-weight:var(--v8-fw-semi);flex:0 0 76px}
.ch-row .ch-v{color:var(--v8-text-3);font-size:11.5px;flex:1 1 140px;min-width:0}
.v8-stv-warn24{margin-top:10px;background:var(--v8-warn-soft);border:1px solid var(--v8-warn-line);
  border-left:3px solid var(--v8-warn);border-radius:var(--v8-r-md);padding:9px 12px;
  font-size:11.5px;color:var(--v8-text-2);line-height:1.7}
.v8-stv-warn24 b{color:var(--v8-warn)}
.v8-stv-warn24 code{font-family:var(--v8-mono);font-size:11px;background:var(--v8-panel);
  border:1px solid var(--v8-line);border-radius:4px;padding:.5px 4px}
.v8-stv-cal{margin-top:2px}

/* ============================================================================
 * 抽屉（★ position:fixed 挂 body —— 躲开全局 table{overflow:hidden}）
 * ==========================================================================*/
.stv-drawer-wrap{position:fixed;inset:0;z-index:120;pointer-events:none}
.stv-drawer-mask{position:absolute;inset:0;background:transparent;pointer-events:none}
.stv-drawer{position:absolute;right:0;top:0;bottom:0;width:452px;background:var(--v8-panel);
  border-left:1px solid var(--v8-line-2);box-shadow:-12px 0 32px rgba(31,35,40,.13);
  display:flex;flex-direction:column;pointer-events:auto}
/* ★★ 主内容让出宽度（设计稿 D11）—— 必须 !important:
   实测 admin_v7.css:88 有 `.main{padding:... 24px 24px !important}`，
   不加 !important 的话这条完全不生效 -> 抽屉会【盖住最后一列「操作」】✗
   （实测过一次: .main 的 computed padding-right 还是 24px，操作列右边界 1613 被抽屉左边界 1186 盖住 ✗）*/
body.stv-drawer-open .main{padding-right:466px !important}
/* ★ 抽屉打开时操作列只剩 ~250px -> 4 个按钮收成【图标形态】（title 里仍有完整说明 ✓ 4 个操作一个不少 ✓）*/
/* ★ 抽屉打开时操作列已不再是 4 个文字按钮（现在是名称右边的图标群 + 行尾 ⋯），
   所以这里只保留"次级文字隐藏"这一条，图标群照常可点 ✓（4 个点名的操作一个都不少）*/
body.stv-drawer-open .v8-stv-tbl .sub{display:none}
/* ★ 抽屉打开时容器窄 ~230px：表头统一 11px + nowrap，避免「状 态」「在线访 客」折成两行；
   次级表头（点击下载/支付成功/支付÷访问）此时隐藏，省出高度 ✓ */
body.stv-drawer-open .v8-tbl.v8-stv-tbl th{font-size:11px !important;white-space:nowrap !important;
  padding:0 8px !important;height:34px !important}
body.stv-drawer-open .v8-tbl.v8-stv-tbl th .th-s{display:none}
body.stv-drawer-open .v8-tbl.v8-stv-tbl td{padding:6px 8px !important}
body.stv-drawer-open .v8-stv-site .dom{max-width:118px}
body.stv-drawer-open .v8-stv-kpi-s,body.stv-drawer-open .v8-head p{overflow:hidden;text-overflow:ellipsis}
body.stv-drawer-open .v8-head h1{white-space:nowrap}
.stv-dh{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;
  padding:13px 16px;border-bottom:1px solid var(--v8-line);flex:0 0 auto;background:var(--v8-panel-2)}
.stv-dh-t{font-size:14px;font-weight:var(--v8-fw-semi);color:var(--v8-text)}
.stv-dh-s{font-size:11.5px;color:var(--v8-text-3);margin-top:2px;line-height:1.5}
.stv-dh-x{width:26px;height:26px;border:1px solid transparent;border-radius:6px;background:transparent;
  color:var(--v8-text-2);font-size:13px;cursor:pointer;flex:0 0 26px;line-height:1}
.stv-dh-x:hover{background:var(--v8-panel-3);color:var(--v8-text)}
.stv-db{flex:1 1 auto;overflow-y:auto;padding:14px 16px}
.stv-rowhint{background:var(--v8-accent-soft);border:1px solid var(--v8-accent-line);
  border-radius:var(--v8-r-md);padding:9px 11px;font-size:11.5px;color:var(--v8-text-2);line-height:1.7;margin-bottom:12px}
.stv-rowhint b{color:var(--v8-accent)}
.stv-sec{margin-bottom:14px}
.stv-sec-t{font-size:12px;font-weight:var(--v8-fw-semi);color:var(--v8-text);margin-bottom:6px;
  padding-bottom:4px;border-bottom:1px solid var(--v8-line)}
.stv-ro{background:var(--v8-panel-3);border:1px solid var(--v8-line);border-radius:var(--v8-r-md);
  padding:7px 10px;font-size:12.5px;color:var(--v8-text-2)}
.stv-hint{font-size:11px;color:var(--v8-text-3);line-height:1.7;margin-top:5px}
.stv-hint code{font-family:var(--v8-mono);font-size:10.5px;background:var(--v8-panel-3);
  border-radius:3px;padding:.5px 4px;word-break:break-all}
.stv-inp{font-size:12.5px;padding:6px 10px;border:1px solid var(--v8-line-2);border-radius:var(--v8-r-md);
  width:100%;font-family:inherit;color:var(--v8-text);background:#fff;box-sizing:border-box}
.stv-inp.mono{font-family:var(--v8-mono);font-size:12px}
.stv-inp:focus{border-color:var(--v8-accent);outline:none;box-shadow:var(--v8-sh-focus)}
.stv-fl{display:flex;flex-direction:column;gap:4px;font-size:11.5px;color:var(--v8-text-3)}
.stv-ck{display:flex;align-items:flex-start;gap:8px;font-size:12.5px;color:var(--v8-text-2);
  line-height:1.5;margin:5px 0;cursor:pointer}
.stv-ck input{margin-top:2px;flex:0 0 auto}
.stv-ck b{color:var(--v8-text)}
.stv-map{display:flex;flex-direction:column;gap:6px}
.stv-map-r{display:grid;grid-template-columns:1fr 116px 54px;gap:8px;align-items:center}
.stv-map-r .stv-ck{margin:0}
.stv-map-s{font-size:11px;color:var(--v8-text-3);text-align:right}
.stv-adv{margin-top:4px}
.stv-btns{display:flex;gap:8px;flex-wrap:wrap}
.stv-btns .v8-btn{text-decoration:none}
.stv-testout{margin-top:8px;font-size:11.5px;color:var(--v8-text-2);line-height:1.7}
.stv-testout ul{margin:4px 0 0;padding-left:18px}
.stv-testout .ok{color:var(--v8-ok);font-weight:var(--v8-fw-semi)}
.stv-testout .bad{color:var(--v8-danger);font-weight:var(--v8-fw-semi)}
.stv-testout .mu{color:var(--v8-text-3)}
.stv-df{flex:0 0 auto;border-top:1px solid var(--v8-line);padding:11px 16px;display:flex;
  justify-content:space-between;gap:10px;align-items:center;background:var(--v8-panel-2)}
.stv-df-r{display:flex;gap:8px}

/* 实时访客面板 */
.stv-live-big{text-align:center;padding:14px 0 6px;background:var(--v8-panel-2);
  border:1px solid var(--v8-line);border-radius:var(--v8-r-lg)}
.stv-live-n{display:flex;align-items:center;justify-content:center;gap:9px;
  font-size:40px;font-weight:var(--v8-fw-bold);color:var(--v8-text);line-height:1.1}
.stv-live-n .u{font-size:14px;font-weight:var(--v8-fw-med);color:var(--v8-text-3)}
.stv-live-n .stv-live-dot{width:11px;height:11px;border-radius:50%;background:var(--v8-line-2)}
.stv-live-n .stv-live-dot.on{background:#12b886;box-shadow:0 0 0 5px rgba(18,184,134,.16)}
.stv-live-s{font-size:11.5px;color:var(--v8-text-3);margin-top:4px}
.stv-live-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:12px}
.stv-live-grid>div{background:#fff;border:1px solid var(--v8-line);border-radius:var(--v8-r-md);
  padding:8px 11px;display:flex;flex-direction:column;gap:2px}
.stv-live-grid .k{font-size:11px;color:var(--v8-text-3)}
.stv-live-grid .v{font-size:17px;font-weight:var(--v8-fw-semi);color:var(--v8-text);
  font-variant-numeric:tabular-nums}

/* 窄屏兜底（客户屏 2048x1152 dpr1.25 = CSS 1638x922，正常不会触发；防笔记本外接小屏 ✗） */
@media (max-width:1400px){
  .v8-stv-kpis{grid-template-columns:repeat(3,1fr)}
  .v8-stv-bottom{grid-template-columns:1fr}
  /* 窄屏把图标群收紧一点（仍保持 ≥24px 可点区域 ✓ 本项目踩过太小误点 ✗） */
  .v8-stv-site .ig-b{width:24px;height:24px;flex:0 0 24px}
  .v8-stv-site .marks{padding-left:0}
}
@media (max-width:1000px){
  /* 小屏不做"让出宽度"（会把主内容挤没 ✗）—— 抽屉改成覆盖式，宽度自适应 ✓ */
  body.stv-drawer-open .main{padding-right:24px !important}
  .stv-drawer{width:min(452px,92vw)}
}

/* ==========================================================================
 * ★★★ STV3 第一步（2026-10-04）：「访客明细」11 列
 * --------------------------------------------------------------------------
 * ★ 布局演进（客户反馈驱动）：
 *   初版 -> 452px 侧屏（放不下 12 列 ✗）-> STV3b 加宽到 1180px 侧屏
 *   -> ★ 客户：「点进访客应该是大屏，不应该侧屏，不然显示不全元素」
 *   -> 现版：【近全屏大屏面板 + 左右两栏】（左 300px 实时概览 / 右访客明细铺满）
 *      配置抽屉 / 新增站点抽屉保持 452px 不动 ✓
 * ★ 本项目踩过的两个坑，这里都规避了：
 *   ① admin_v7.css:327 有【全局 table{overflow:hidden}】-> 会让 sticky 表头失效/被裁 ✗
 *      => 用 #stvDrawerWrap 提高特异性把表格 overflow 夺回 visible ✓
 *   ② admin_v7.css 里 .v8-tbl td 有 height:32px / white-space:nowrap !important ✗
 *      => 本表【不带 .v8-tbl 类】，自己的类 .stv-vt-tbl + 更高特异性 → 互不干扰 ✓
 * ★ 全部尺寸都做了紧凑处理（行高 ~27px），一屏能看更多行 ✓
 * ======================================================================== */
/* ★★ STV3b（客户反馈：「点进访客应该是大屏，不应该侧屏，不然显示不全元素」）
   -> 从"右侧窄抽屉"改成【近全屏大屏面板】：四周留 18px，1638px 视口下可用宽 ≈1602px
   （客户屏 2048x1152 @dpr1.25 -> CSS 视口就是 1638px，所以按这个口径调 ✓）
   ★ 配置 / 新增站点 两个抽屉【仍然是原来的 452px 右侧抽屉】✓ 一个字没动 */
.stv-drawer.is-full{position:fixed;left:18px;right:18px;top:18px;bottom:18px;width:auto;max-width:none;
  border-radius:14px;border:1px solid var(--v8-line);box-shadow:0 26px 80px rgba(15,23,42,.30)}
.stv-drawer-mask.is-full{background:rgba(15,23,42,.30);pointer-events:auto}
/* ★ 大屏时页面【不再让出 466px】（那是侧屏抽屉的逻辑；面板已盖住整页，再让就是白挤扁列表 ✗）*/
body.stv-full-open .main{padding-right:24px !important}
@media (max-width:900px){.stv-drawer.is-full{left:0;right:0;top:0;bottom:0;border-radius:0}}

/* ★ 大屏两栏：左 = 实时概览（固定 300px）/ 右 = 访客明细（铺满剩余宽高） */
.stv-db.stv-db-live{display:flex;gap:16px;padding:14px 18px;overflow:hidden}
.stv-live-col{flex:0 0 312px;min-width:0;overflow-y:auto;padding-right:4px}
.stv-vt-col{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;overflow:hidden;
  border-left:1px solid var(--v8-line);padding-left:16px}
/* 左栏变窄 -> 这两块改成单列，免得文字被挤成一条一条 */
.stv-db-live .det-kv{grid-template-columns:1fr}
/* ★ 实测截图发现：左栏窄，`今日访问（会话去重）` 会被折成两行（"…会话去 / 重）"）不好看 ✗
   -> 左栏加宽到 312px + 标签列 124px，一行放得下 ✓ */
.stv-db-live .det-kv .kv .k{flex:0 0 124px}
.stv-db-live .stv-live-grid{gap:6px}
.stv-db-live .stv-live-big{padding:10px 0 4px}
/* 右栏里「访客明细」是第一个元素 -> 去掉分隔线与上边距，把高度全让给表格 */
.stv-vt-col .stv-vt{margin-top:0;border-top:0;padding-top:0;display:flex;flex-direction:column;
  min-height:0;flex:1 1 auto}
.stv-vt-col #stvVtBox{display:flex;flex-direction:column;min-height:0;flex:1 1 auto}
/* ★ 实测截图发现：写 flex:1 1 auto 时，只有 3 行数据也会把表格框撑满整栏 -> 一大片空白 ✗
   => 改成 flex:0 1 auto（不主动长高、内容多时可收缩并内部滚动 ✓）：
      行少 -> 框贴着内容；行多 -> 撑满可用高度后内部滚动 ✓ */
.stv-vt-col .stv-vt-scroll{max-height:none;flex:0 1 auto;min-height:120px}
/* 窄屏（<1100px）退回上下堆叠，各自能滚 ✓ */
@media (max-width:1100px){
  .stv-db.stv-db-live{flex-direction:column;overflow-y:auto;gap:10px}
  .stv-live-col{flex:0 0 auto;overflow:visible}
  .stv-vt-col{flex:1 1 auto;overflow:visible;border-left:0;padding-left:0;
    border-top:1px solid var(--v8-line);padding-top:10px}
  .stv-vt-col .stv-vt-scroll{max-height:44vh;flex:0 0 auto}
  .stv-db-live .det-kv{grid-template-columns:repeat(2,minmax(0,1fr))}
}

.stv-vt{margin-top:16px;border-top:1px solid var(--v8-line);padding-top:12px}
.stv-vt-h{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;margin-bottom:8px}
.stv-vt-t{font-size:13px;font-weight:var(--v8-fw-semi);color:var(--v8-text)}
.stv-vt-sub{font-size:11px;color:var(--v8-text-3);line-height:1.6;margin-top:3px}
.stv-vt-sub code{font-family:var(--v8-mono);font-size:10.5px;background:var(--v8-panel-3);padding:0 4px;border-radius:3px}
.stv-vt-hr{display:flex;gap:6px;flex:0 0 auto}
.stv-vt-hr .v8-btn{height:26px}

.stv-vt-chart-h{display:flex;justify-content:space-between;font-size:11px;color:var(--v8-text-3);margin-bottom:3px}
.stv-vt-chart-h .mu{color:var(--v8-text-3)}
.stv-vt-chart{display:flex;align-items:flex-end;gap:1px;height:54px;padding:4px 6px 2px;
  background:var(--v8-panel-2);border:1px solid var(--v8-line);border-radius:var(--v8-r-md);overflow:hidden}
/* ★ 实测截图发现：只写 flex:1 的话，只有 1 根柱子时它会【铺满整个宽度变成一大块蓝色】✗
   -> 加 max-width 封顶：柱子少时是细柱（好看 ✓），柱子多时仍然由 flex 撑满 ✓ */
.stv-vt-chart i{flex:1 1 0;min-width:1px;max-width:22px;background:var(--v8-data-1);border-radius:1px;display:block}
/* 0 的桶画一条 2% 高的底线：表示"这个时间点真的没人来"（与"没数据源"不是一回事 ✓） */
.stv-vt-chart i.z{background:var(--v8-line-2)}
.stv-vt-chart-e{font-size:11.5px;color:var(--v8-text-3);margin:auto}
.stv-vt-chart-x{display:flex;justify-content:space-between;font-size:10px;color:var(--v8-text-3);margin:1px 2px 0}

.stv-vt-f{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:10px 0 8px}
.stv-vt-f label{font-size:11px;color:var(--v8-text-3)}
.stv-vt-f select,.stv-vt-f input{height:26px;font-size:12px;padding:0 6px;background:#fff;color:var(--v8-text);
  border:1px solid var(--v8-line-2);border-radius:var(--v8-r-md)}
.stv-vt-f input{width:180px}
.stv-vt-f input:disabled{background:var(--v8-panel-3);color:var(--v8-text-3);cursor:not-allowed}
.stv-vt-f select:focus,.stv-vt-f input:focus{border-color:var(--v8-accent);outline:none}
.stv-vt-f .v8-btn{height:26px}

/* ★ 横向滚动容器（列多必须能滚 ✓）；纵向也给个上限，免得抽屉里再套一层长滚动 */
.stv-vt-scroll{overflow:auto;max-height:44vh;border:1px solid var(--v8-line);border-radius:var(--v8-r-md);background:#fff;
  -webkit-overflow-scrolling:touch}
.stv-vt-tbl{border-collapse:separate;border-spacing:0;font-size:12px;min-width:1120px;width:100%}
#stvDrawerWrap .stv-vt-tbl{overflow:visible}
#stvDrawerWrap .stv-vt-tbl th{position:sticky;top:0;z-index:3;background:var(--v8-panel-2);text-align:left;
  height:auto!important;white-space:nowrap;padding:6px 5px;font-size:11.5px;font-weight:var(--v8-fw-med);
  color:var(--v8-text-2);border-bottom:1px solid var(--v8-line-2)}
#stvDrawerWrap .stv-vt-tbl th.s{cursor:pointer;user-select:none}
#stvDrawerWrap .stv-vt-tbl th.s:hover{color:var(--v8-accent);background:var(--v8-accent-soft)}
#stvDrawerWrap .stv-vt-tbl th .ar{font-size:9px;color:var(--v8-accent);margin-left:2px}
#stvDrawerWrap .stv-vt-tbl th.help::after{content:'?';font-size:9px;color:var(--v8-text-3);
  border:1px solid var(--v8-line-2);border-radius:50%;padding:0 3px;margin-left:3px;vertical-align:1px}
#stvDrawerWrap .stv-vt-tbl td{height:auto!important;white-space:nowrap;padding:4px 5px;font-size:12px;
  color:var(--v8-text);border-bottom:1px solid var(--v8-line);vertical-align:middle}
/* ★★ STV3c：加了「转化开关」列（13 列）-> 内边距 8->5px、入口地址列 230->190px，
   保证在 1638px 视口的大屏里仍然【零横向滚动】✓（有实测断言：needHScroll=false） */
#stvDrawerWrap .stv-vt-tbl td.ent{max-width:190px;overflow:hidden;text-overflow:ellipsis}
#stvDrawerWrap .stv-vt-tbl tbody tr[data-stv-vt-row]{cursor:pointer}
#stvDrawerWrap .stv-vt-tbl tbody tr[data-stv-vt-row]:hover td{background:var(--v8-accent-soft)}
#stvDrawerWrap .stv-vt-tbl tbody tr.open td{background:var(--v8-accent-soft)}
#stvDrawerWrap .stv-vt-tbl td.num{text-align:right;font-variant-numeric:tabular-nums}
#stvDrawerWrap .stv-vt-tbl td.mono{font-family:var(--v8-mono);font-size:11.5px}
/* ★★★ STV3c「转化开关」：一个按钮三态（未标记 -> 浅层 -> 深度 -> 撤销）
   ★ 三态必须【一眼能分辨】：空心虚线灰（未标记）/ 半实心蓝（浅层）/ 实心绿（深度）*/
#stvDrawerWrap .stv-vt-tbl td.csw{padding:2px 5px;text-align:center}
.stv-csw{font:inherit;font-size:11.5px;line-height:1.5;padding:1px 8px;border-radius:11px;cursor:pointer;
  border:1px solid var(--v8-line-2);background:#fff;color:var(--v8-text-2);white-space:nowrap}
.stv-csw:hover{border-color:var(--v8-accent);color:var(--v8-accent)}
.stv-csw.is-none{background:#fff;border-style:dashed;color:var(--v8-text-3)}
.stv-csw.is-shallow{background:rgba(45,127,249,.12);border-color:rgba(45,127,249,.45);color:#1b62c9;font-weight:600}
.stv-csw.is-deep{background:#12b886;border-color:#12b886;color:#fff;font-weight:600}
/* ★ STV3d：真实转化=实线 / 人工标记=虚线（再配合「·人工」后缀，真实与人工一眼分清 ✓）
   只读态（真实深度转化 / 已回传成功 / 无 bd_vid）用 is-ro：明确不可点，不是"点了才报错"的假开关 ✗ */
.stv-csw.is-manual{border-style:dashed}
.stv-csw.is-real{border-style:solid}
.stv-csw.is-ro{cursor:help}
.stv-csw:disabled{opacity:.5;cursor:not-allowed}
#stvDrawerWrap .stv-vt-tbl .nilv{color:var(--v8-text-3);cursor:help}
#stvDrawerWrap .stv-vt-tbl td.nilv{text-align:center;cursor:help}
/* ★ 实测截图发现：首列 sticky 吸左时，滚到中间的列会被它【切掉半个字】
   （看到 "客 · 第2次" 而不是 "新访客 · 第2次"）-> 观感像 bug ✗
   => 只保留 sticky 表头（横滚时表头始终在 ✓），✗ 首列不吸左 ✗ */
#stvDrawerWrap .stv-vt-tbl tbody tr:hover td{background:var(--v8-accent-soft)}
#stvDrawerWrap .stv-vt-tbl tbody tr.open td{background:var(--v8-accent-soft)}
.stv-vt-tbl tr.det td{background:var(--v8-panel-2)!important;color:var(--v8-text-2);font-size:11.5px;
  white-space:normal!important;line-height:1.9}
.stv-vt-tbl tr.det .kv{margin-right:16px;display:inline-block}
.stv-vt-tbl tr.det .k{color:var(--v8-text-3);margin-right:3px}
.stv-vt-pg{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:8px;
  font-size:11.5px;color:var(--v8-text-3)}
.stv-vt-pg .v8-btn{height:24px}
.stv-vt-pg b{color:var(--v8-text)}
.stv-vt-notes{margin-top:8px;font-size:11px;color:var(--v8-text-3);line-height:1.75}
.stv-vt-empty{padding:20px 14px;text-align:center;font-size:12px;color:var(--v8-text-3);
  background:var(--v8-panel-2);border:1px solid var(--v8-line);border-radius:var(--v8-r-md)}
.stv-vt-empty b{color:var(--v8-text-2)}
