/* ═══════════════════════════════════════════════════════════════════════════
   黑白云 (heibaiyun) — 便捷工具子页皮肤  heibaiyun-quick-tools.css  [v4「墨脊长卷」]
   ───────────────────────────────────────────────────────────────────────────
   挂载：由 SubStationHelper::brandCss() → SubStationService::buildPageSkinLinks()
        自动注入到 app/Views/quick/index.php 的 </head> 之前，
        即 quick-tools.css 与 ai-download-batch-modal.css 之后。
        仅当品牌 view_override=heibaiyun（bj.heibaiyun.cc；2026-10-11 由 bj.leishen8.top 换域名）时加载。

   覆盖范围（1 个共享入口页 + 10 个功能子页，共 11 页）：
        /quick-tools 入口页 + ip-check / ip-code-check / code-status / copy-codes /
        replace-codes / code-filter-set / ip-filter-set / download-url-set /
        download-url-check / qr-type-set

   [2026-10-08] v3「墨云硬印」：.qt-shell 白底墨描边硬影外壳 → 墨印卡 → 1.5px 墨线表头 →
        inset 3px 墨条行 hover → KPI 墨描边 + 700 字重 → 印章化按钮（已废弃）

   [2026-10-08] v4 重做（本版，布局结构改变，不只是换色）：契约 §1.2「墨脊长卷」+ §3.2 子页方案
        · .qt-shell 由「居中圆角硬印浮卡」改为**每页唯一的 1px 墨外壳**（直角、无影、通栏铺满）
        · 壳内**全部去框**：.qt-card / .qt-topbar / .qt-field / .qt-table-wrap /
          .qt-scope-group / .qt-config-area 一律取消描边、圆角与阴影，层次只靠
          --bw-divider / --bw-hairline 1px 细线 + --bw-bg-sunken 交替
        · **KPI 由彩色渐变芯片改为墨线网格**：.qt-kpi-grid{gap:0}；
          .qt-kpi-item 纸面底 + 右/下 1px --bw-divider；数值 600 + tabular-nums
        · 表头 --bw-hairline 底线；行 hover 暖灰底 + 首列 inset 3px 0 0 --bw-accent-border
        · 色彩：以暖灰阶为主；紫檀（--bw-accent）**只出现在查询/提交主按钮与当前激活筛选项**；
          状态一律「语义色文字 + 左/下 3px 实边条」表达，绝不铺彩色底
        · 字重 700 全部降为 600（契约硬红线：禁止 700+）

   [2026-10-08] v5（本版，色彩职能落地）：契约 v5 §1.2/§1.3/§1.4，回应运营「便捷工具的 KPI 少了色系搭配」
        · **恢复 KPI 功能性配色**：v4 曾把 17 个 .qt-kpi-item 语义色与 24 个 .qt-action-kpi
          后果色**全部压成灰色**（运营反馈"看着很烦"），本版按契约配方回填
        · 统一配方：双变量 --k（语义 base，只作 3px 条/描边）/ --k-ink（tint 底上文字），
          常驻 = `color-mix(--k 8%, --bw-paper)` 淡底 + `inset 3px 0 0 var(--k)`（无整块实色）
        · 语义指派：.qt-kpi-item 优先用 `data-ip-filter` 钩子（17 个），ip-filter-set 的 4 个
          退回既有类名兜底；设备类 4 项与 .slate 保持中性暖灰阶
        · **修复 v4 缺陷**：`.qt-kpi-item.qt-active` 原会把所有类别强行改成紫檀 →
          改为**保留自身 --k 的强档**（`inset 4px 0 0 var(--k), inset 0 0 0 1px var(--k)` + ink 数值）
        · .qt-action-kpi 按后果着色：green=松烟绿 / red=朱砂 / orange=陶土橙 / blue=黛青 /
          purple=紫檀 / teal=墨青；中性动作 pink/slate（如"上传验证码背景图"）保持灰阶
        · 失败清单 / 结果条 / Toast 的左侧 3px 条对齐语义族（error=朱砂 / ok=松烟绿 / warn=赭石）

   [2026-10-08] v6（本版，色彩落地 + 纵向压缩）：契约 v6 §1.3 铁律 / §1.4 / §2.1 / §2.2，回应运营
        「便捷工具的 KPI 按钮/功能按钮颜色非常不对，有的直接用黑色字体，没做按钮背景色渲染」
        「可以引入彩色，不需要完全使用黑色，纯黑容易厌倦」「要滚动才能看全，空间浪费太多」
        · **根因修复（常驻底）**：v5 的常驻底用 `color-mix(--k 8%, --bw-paper)`，实测混出
          green #ECEFE8 / blue #EEEEEC（饱和度 <3%，人眼判为白底）+ 深色文字 =
          运营所见的「黑字白底」；且老内核（360/QQ/旧 Chromium<111）不支持 color-mix，
          会回落到上一行的 `background-color: var(--bw-paper)` → 全屏「白底 + 深色字」。
          本版**所有功能性控件的常驻底改用静态 `--bw-c-*-bg`（22%）**，并**删掉共存的
          `background-color: var(--bw-paper)` 兜底行**；hover 用 `-bg-h`；文字用同族 `-ink`；
          描边用同族 base（1px）——三件套齐备（§1.3）。`color-mix` 只保留在描边/内阴影等
          「降级无害」处（老内核退化为无色描边，不会退化成纸底）。
        · 覆盖元件：.qt-kpi-item（17）/ .qt-action-kpi（24，含 pink/slate→slate）/ .qt-btn 全变体
          （无变体→slate；warning/warn→amber；danger→red；导出→blue 实底；保存/写库→orange 实底；
          其余 primary/success→按 §1.4 实底）/ .qt-back-btn / 分页 / 每页条数 / 勾选控件 /
          scope 药丸 / config-row 单选药丸（开启=green）/ 状态与布尔列药丸 / 结果条 / 失败清单 /
          Toast / 弹窗标题条与页脚。
        · 纵向压缩（§2.2）：外壳 padding 24/26/34→16/18/20（≥1180 另有一处 28/32/40→16/22/22）、
          topbar 22/14→12/10、field 18/18→10/10、label 9→6、textarea 104→96（line-height 1.45）、
          kpi 190px/12px16px→150px/9px13px（+ellipsis）、action-kpi 36/8px15px→32/5px13px、
          config-row 44/12px→34/5px、表头 12→9px、**表格行 10px→6px（20 行省 ≈160px，主杠杆）**、
          缩略图 40→30、分页 mt16→mt10、按钮 42→38。`.qt-shell{min-height:100vh}` 保留。

   [2026-10-08] v8（本版，11 条缺陷收敛；SS 仅覆盖层新增，未改任何「严禁修改」基础规则）：
        #1 KPI span/strong 显式 opacity:1（清共享 .qt-kpi-item span{opacity:.9} 残留）
        #2 primary/success（含 onclick 变体）hover 补中性 --bw-shadow-xs（清共享蓝/绿光晕）
        #3 `.qt-btn:disabled` / 分页 disabled / 页大小 disabled 补 opacity:1（保留虚线灰形态）
        #4 `[style*=background]` 兜底收窄 :not([onclick*=Run])；Run 绿规则 + 内联覆盖 !important
        #5 补 active / :focus-visible / :focus-within 等缺失态（按钮/返回/分页/下拉/药丸/AI 批量）
        #6 ≤768/≤480 触控目标 min-height:36px（返回/分页/页大小/弹窗页脚/数字框）
        #7 `.qt-action-kpi.orange:active` 实底改 orange-ink 系（反白 4.06→7.07）
        #8 写操作 copyCodesRun / replaceCodes / ipFilterSave 定向橙色实底 + 反白（§1.4）
        #9 `#ducResultBox` 补 overflow-x:auto 横向滚动容器（共享视图缺 .qt-table-wrap）
        #10 删除 `.qt-kpi-item.slate` 重复定义（保留 .pink/.dark/.slate 组合并条目）

   ── 颜色策略（v6：暖灰阶基座 + 功能性控件一律静态彩底 + 同族描边/文字） ──
   大面积（页底 / 面板 / 表格行 / 正文 / 弹窗面 / 二维码承托片 / 结果输出）一律墨与纸/暖灰令牌；
   分类色（--bw-c-*）出现在**功能性控件的常驻底**（`-bg` 22% 静态值）+ 1px 同族描边 +
   同族 ink 文字 + 3px 左侧分类条（KPI/失败清单/结果条）；大块汇总底用 `-tint`（8%）。
   紫檀（--bw-accent）用于可交互强调：确认/主提交实底、:checked 勾选药丸、排序箭头/拖拽手柄
   （纯图形可交互控件）、:focus-visible 焦点环；**KPI 激活态仍保留自身 --k**。
   base 只作条/边框/图形，绝不当文字色；彩色文字一律用同族 ink（≥4.5:1）。

   颜色例外（全文件仅此一类，且为中性无色相）：
     1) 勾选框选中态的内联 SVG 白色对勾（stroke='%23fff'，白色为中性色，非品牌色，
        且为内联 SVG 数据 URI，不引用任何外部图标库/CDN）
   除该例外，文件内的十六进制写法只出现在两种位置：
     · 注释中（用于说明被覆盖掉的共享彩色值，便于维护）
     · 属性选择器 [style*="#…"] 中（用于命中共享内联颜色，属契约允许的合法写法）
   遮罩颜色由 --bw-ink 经 color-mix 派生，令牌兜底，无拼写色值。

   约束（不得违反）：
     · 不改 DOM / 不改 JS / 不隐藏任何功能元素 / 不破坏 .qt-table-wrap 横向滚动；
     · **禁止改 .qt-table-wrap{overflow-x:auto}**（此处保持原样）；
       .qt-table 的 min-width 由共享文件在窄屏设定，本文件不得改写；
     · **禁止给 .qt-shell 或其祖先加 backdrop-filter / transform / filter**：
       子页弹窗 .qt-modal-overlay 是 position:fixed，上述属性会为后代建立包含块，
       令 fixed 弹窗改为相对卡片定位而错位。本文件的 .qt-shell 只有 background/
       border/border-radius/padding，不存在任何包含块风险；弹窗自身也不用
       backdrop-filter（纸面底 + --bw-shadow-overlay 已足够，且最稳）。
       本文件的 transform 只出现在叶子元素（::after 箭头）与动效位移上。
   ═══════════════════════════════════════════════════════════════════════════ */

@import url('/assets/css/heibaiyun/theme.css?v=20261008hb8');   /* [v8修复] 必须带版本号：nginx 对 /assets/ 缓存 12h，否则浏览器用旧 theme.css → 令牌缺失 → 颜色全失效 */

/* ═══════════════════════════════════════════════════════════════════════════
   0. 页面底：暖米灰（压掉共享 quick-tools.css 的 --qt-bg 渐变）
      共享样式把背景写在 html,body 上，这里两处都压成纸灰令牌，
      确保任何品牌色变更都不会让子页底色带色。
═══════════════════════════════════════════════════════════════════════════ */
html,
body {
    background-color: var(--bw-bg-page);
    background-image: none;
}

/* ═══════════════════════════════════════════════════════════════════════════
   1. 墨脊长卷外壳（每页唯一的硬框）
   ── 10 个功能子页：.qt-shell = 单一 1px 墨外壳（直角、无影、通栏铺满）
   ── 共享入口页 /quick-tools：不走墨外壳，改为通栏长卷（见 :has 规则）
═══════════════════════════════════════════════════════════════════════════ */
.qt-shell {
    position: relative;
    width: 100%;
    max-width: none;                 /* v4：取消居中胶囊壳 */
    margin: 0;
    padding: 16px 18px 20px;         /* v6 压缩：原 24/26/34（契约 §2.2） */
    min-height: 100vh;               /* 通栏长卷：1px 墨框在视口底部闭合，不再留 56px 缺口（契约保留） */
    font-family: var(--bw-font);
    color: var(--bw-text-primary);
    /* 每页唯一硬框：1px 墨外壳 + 直角 + 无影（描边分级 L1，全页仅此一处） */
    background-color: var(--bw-paper);
    border: 1px solid var(--bw-border-ink);
    border-radius: 0;
    box-shadow: none;
}
/* 共享入口页（/quick-tools）：DOM 内含 .qt-entry-grid → 去墨外壳，改通栏长卷（契约 §3.2 入口） */
.qt-shell:has(.qt-entry-grid) {
    padding: 0;
    background-color: var(--bw-bg-page);
    border: 0;
    border-radius: 0;
    box-shadow: none;
}

/* 页底衬纸：固定在视口上的纯纸灰层（不参与布局，不影响任何元素尺寸）。
   此处与 .qt-shell 本体均不得出现 transform / filter / backdrop-filter —— 见文件头约束：
   position:fixed 的伪元素不会为 .qt-shell 的后代建立包含块，故弹窗不受影响。 */
.qt-shell::before {
    content: '';
    position: fixed;
    inset: 0;
    z-index: -1;
    pointer-events: none;
    background-color: var(--bw-bg-page);
    background-image: none;
}

/* 内容卡：壳内全部去框（结构级容器不叠强描边，层次靠细线） */
.qt-shell .qt-card {
    background-color: transparent;
    background-image: none;
    border: 0;
    border-radius: 0;
    box-shadow: none;
    padding: 0;
    margin-bottom: 0;
}

/* ═══════════════════════════════════════════════════════════════════════════
   2. 共享入口页品牌带 = 通栏墨脊（仅入口页使用 .qt-card-header）
═══════════════════════════════════════════════════════════════════════════ */
.qt-shell .qt-card-header {
    position: relative;
    overflow: hidden;
    margin-bottom: 0;
    padding: 18px 30px 14px;         /* v6 压缩：原 24px 30px 22px（契约 §2.2 入口页行） */
    border: 0;
    border-bottom: 1px solid var(--bw-hairline);
    border-radius: 0;
    background: var(--bw-paper);
    box-shadow: none;
}
/* 网点纸纹：只在页头留白的右下角压角（大块装饰留白，绝不铺在正文文本下方）。
   ::before 在共享 DOM 中空置，可安全用作装饰层（pointer-events:none，不承载功能）。 */
.qt-shell .qt-card-header::before {
    content: '';
    position: absolute;
    right: 0;
    bottom: 0;
    width: 34%;
    height: 60%;
    pointer-events: none;
    background-image: var(--bw-dots-image);
    background-size: var(--bw-dots-size);
    opacity: .4;
}
/* 墨线母题（CSS-only 版）：单圈细墨环，对应自有入口页的墨线云朵母题；
   共享 DOM 不能插入 SVG，故用纯 CSS 墨线环表达，透明度压到 .06。 */
.qt-shell .qt-card-header::after {
    content: '';
    position: absolute;
    top: -70px;
    right: -46px;
    width: 200px;
    height: 200px;
    border: 1px solid var(--bw-ink);
    border-radius: var(--bw-radius-disc);
    opacity: .06;
    pointer-events: none;
}
.qt-shell .qt-brand {
    position: relative;
    z-index: 1;
    display: flex;
    align-items: center;
    gap: 14px;
    margin-bottom: 6px;              /* v6 压缩：原 8 */
}
.qt-shell .qt-brand h2 {
    margin: 0;
    font-size: 22px;
    font-weight: 600;
    line-height: 1.3;
    letter-spacing: .01em;
    color: var(--bw-text-primary);
}
.qt-shell .qt-brand svg {
    width: 30px;
    height: 30px;
    flex-shrink: 0;
    color: var(--bw-ink);
}
/* 品牌 Logo：共享视图内联写死 width/height/border-radius（style="32px;32px;6px"），
   内联样式优先级最高，必须用 !important 覆盖，使其成为「墨印圆盘」。
   圆盘是契约允许保留「硬印」（--bw-shadow-stamp）的两处之一（另一处为主按钮）。 */
.qt-shell .qt-brand img[style] {
    width: 48px !important;
    height: 48px !important;
    border-radius: var(--bw-radius-disc) !important;
    padding: 6px;
    box-sizing: border-box;
    background: var(--bw-paper);
    border: 1px solid var(--bw-border-ink);
    box-shadow: var(--bw-shadow-stamp);
}
.qt-shell .qt-card-header p {
    position: relative;
    z-index: 1;
    margin: 0;
    font-size: 13px;
    line-height: 1.6;
    color: var(--bw-text-secondary);
}

/* ═══════════════════════════════════════════════════════════════════════════
   3. 共享入口页卡片网格 = 密排索引
      （契约 §3.2：gap:0 + auto-fill minmax(272px,1fr)，卡片只留 1px 细线分隔）
═══════════════════════════════════════════════════════════════════════════ */
.qt-shell .qt-entry-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));   /* v6 压缩：原 272px */
    gap: 0;
}
.qt-shell .qt-entry-card {
    position: relative;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 5px;
    /* 右侧留出 ::after 箭头的空间（原左侧图标泡已按 v4 降噪移除） */
    padding: 12px 46px 12px 16px;    /* v6 压缩：原 17px 46px 17px 20px */
    border: 0;
    border-right: 1px solid var(--bw-divider);
    border-bottom: 1px solid var(--bw-divider);
    border-radius: 0;
    background-color: var(--bw-paper);
    /* 清共享 `.qt-entry-card{background:linear-gradient(白→浅蓝)}` 的简写渐变（去蓝、去装饰渐变） */
    background-image: none;
    box-shadow: none;
    text-decoration: none;
    color: inherit;
    transition: background var(--bw-transition), box-shadow var(--bw-transition);
}
/* 右侧箭头（纯 CSS 边框绘制，不使用图标字体、不引入外部资源）。
   叶子元素：允许 rotate / translate，不作用于卡片容器。 */
.qt-shell .qt-entry-card::after {
    content: '';
    position: absolute;
    right: 20px;
    top: 50%;
    width: 8px;
    height: 8px;
    margin-top: -5px;
    border-top: 1.5px solid var(--bw-text-muted-on-tint);
    border-right: 1.5px solid var(--bw-text-muted-on-tint);
    transform: rotate(45deg);
    transition: border-color var(--bw-transition), transform var(--bw-transition);
}
/* 签名交互：暖灰底 + 左侧 3px 紫檀内嵌条（可交互导航卡；v6 去纯黑，改用交互强调色） */
.qt-shell .qt-entry-card:hover {
    background-color: var(--bw-bg-hover);
    box-shadow: inset 3px 0 0 var(--bw-accent);
}
.qt-shell .qt-entry-card:hover::after {
    border-color: var(--bw-accent);
    transform: translateX(3px) rotate(45deg);
}
.qt-shell .qt-entry-card:active {
    background-color: var(--bw-bg-active);
    box-shadow: inset 3px 0 0 var(--bw-accent);
}
.qt-shell .qt-entry-card:focus-visible {
    outline: 2px solid var(--bw-accent);
    outline-offset: -2px;
}
.qt-shell .qt-entry-card .card-title {
    font-size: 15px;
    font-weight: 600;
    line-height: 1.4;
    color: var(--bw-text-primary);
}
/* 描述：索引副文本（无药丸底、无描边；覆盖共享 quick-tools.css 的蓝色渐变底 #e8f4ff/#dbeafe/#2563eb） */
.qt-shell .qt-entry-card .card-tag {
    display: block;
    max-width: 100%;
    padding: 0;
    border: 0;
    border-radius: 0;
    background-color: transparent;
    background-image: none;
    color: var(--bw-text-muted-on-tint);
    font-size: 12px;
    font-weight: 400;
    line-height: 1.5;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    transition: color var(--bw-transition);
}
.qt-shell .qt-entry-card:hover .card-tag {
    color: var(--bw-text-secondary);
}

/* ═══════════════════════════════════════════════════════════════════════════
   4. 顶部栏 / 返回按钮 / 页面标题（去框：只留 1px 模块底线）
═══════════════════════════════════════════════════════════════════════════ */
.qt-shell .qt-topbar {
    display: grid;
    grid-template-columns: 96px minmax(0, 1fr) 96px;
    align-items: center;
    gap: 10px;
    margin-bottom: 12px;             /* v6 压缩：原 22 */
    padding: 0 0 10px;               /* v6 压缩：原 0 0 14 */
    border: 0;
    border-bottom: 1px solid var(--bw-hairline);
    border-radius: 0;
    background-color: transparent;
    box-shadow: none;
}
/* 返回键 = 中性导航控件：契约 §1.3① 常驻必须有彩底 → slate 族
   （底 slate-bg / 描边 slate base / 文字 slate-ink；hover 升 -bg-h，绝不变黑底）。
   原 v5：透明底 + 深灰字 = 「纸底 + 深色字」的裸控件，本版修正。 */
.qt-shell .qt-back-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    height: 34px;
    padding: 0 14px;
    border: 1px solid var(--bw-c-slate);
    border-radius: var(--bw-radius-sm);
    background: var(--bw-c-slate-bg);
    color: var(--bw-c-slate-ink);
    font-family: var(--bw-font);
    font-size: 13px;
    font-weight: 600;
    line-height: 1;
    text-align: center;
    text-decoration: none;
    white-space: nowrap;
    transition: background var(--bw-transition), color var(--bw-transition),
                border-color var(--bw-transition);
}
.qt-shell .qt-back-btn:hover {
    background: var(--bw-c-slate-bg-h);
    border-color: var(--bw-c-slate);
    color: var(--bw-c-slate-ink);
}
/* [v8修复 #5] 四态之 active：按下同族加深一档 + 轻微下沉（§6.2） */
.qt-shell .qt-back-btn:active {
    background: var(--bw-c-slate-bg-h);
    border-color: var(--bw-c-slate);
    color: var(--bw-c-slate-ink);
    transform: translateY(1px);
}
.qt-shell .qt-back-btn:focus-visible {
    outline: none;
    box-shadow: var(--bw-focus-ring);
}
.qt-shell .qt-page-title {
    margin: 0;
    text-align: center;
    font-size: 20px;
    font-weight: 600;
    line-height: 1.3;
    color: var(--bw-text-primary);
}

/* ═══════════════════════════════════════════════════════════════════════════
   5. 表单：字段（去框，仅 1px 分隔线）/ 标签 / 输入 / 文本域 / 下拉 / 数字框
      可交互边界（输入框）一律用 --bw-border-strong（契约 §4.7③）
═══════════════════════════════════════════════════════════════════════════ */
.qt-shell .qt-field {
    margin-bottom: 10px;             /* v6 压缩：原 18 */
    padding: 0 0 10px;               /* v6 压缩：原 0 0 18 */
    border: 0;
    border-bottom: 1px solid var(--bw-divider);
    border-radius: 0;
    background-color: transparent;
    transition: border-color var(--bw-transition);
}
/* 字段聚焦：分隔线加深为可交互档（去框后不再用整卡描边表达聚焦） */
.qt-shell .qt-field:focus-within { border-bottom-color: var(--bw-border-strong); }
.qt-shell .qt-label {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    margin-bottom: 6px;              /* v6 压缩：原 9 */
    color: var(--bw-text-primary);
    font-size: 14px;
    font-weight: 600;
    line-height: 1.4;
}
.qt-shell .qt-required { color: var(--bw-c-red-ink); }   /* v6：语义文字用同族 ink（base 不当文字色） */

.qt-shell .qt-textarea,
.qt-shell .qt-input,
.qt-shell .qt-select,
.qt-shell .qt-number-input {
    width: 100%;
    border: 1px solid var(--bw-border-strong);   /* 可交互边界（契约 §4.7③） */
    border-radius: var(--bw-radius-sm);
    background-color: var(--bw-paper);
    background-image: none;
    color: var(--bw-text-primary);
    font-family: var(--bw-font);
    font-size: 14px;
    outline: 0;
    transition: box-shadow var(--bw-transition), border-color var(--bw-transition),
                background-color var(--bw-transition);
}
.qt-shell .qt-textarea {
    min-height: 96px;                /* v6 压缩：原 104 */
    padding: 11px 13px;
    resize: vertical;
    line-height: 1.45;               /* v6：原 1.65（压缩行高，多行文本更紧凑） */
}
.qt-shell .qt-input,
.qt-shell .qt-select { height: 40px; padding: 0 13px; }
.qt-shell .qt-select { cursor: pointer; }
.qt-shell .qt-number-input { height: 34px; padding: 0 11px; }
.qt-shell .qt-textarea::placeholder,
.qt-shell .qt-input::placeholder { color: var(--bw-text-muted-on-tint); }
.qt-shell .qt-textarea:hover,
.qt-shell .qt-input:hover,
.qt-shell .qt-select:hover,
.qt-shell .qt-number-input:hover { border-color: var(--bw-ink); }
.qt-shell .qt-textarea:focus,
.qt-shell .qt-input:focus,
.qt-shell .qt-select:focus,
.qt-shell .qt-number-input:focus,
.qt-shell .qt-inline-input:focus {
    border-color: var(--bw-accent);
    box-shadow: var(--bw-focus-ring);
    background-color: var(--bw-paper);
}
.qt-shell .qt-error-text {
    margin: 6px 0 0;
    color: var(--bw-c-red-ink);      /* v6：错误文字用同族 ink（base 不当文字色） */
    font-size: 12.5px;
    font-weight: 600;
    line-height: 1.5;
}
/* 卡密密码：max-width 由 quick-tools.css 设为 360px，这里保持并补足视觉标识 */
.qt-shell .qt-password-field .qt-input { max-width: 380px; }
.qt-shell .quick-password-input {
    background-color: var(--bw-bg-sunken);
    border-color: var(--bw-border-strong);
    letter-spacing: .08em;
}
.qt-shell .quick-password-input:focus {
    border-color: var(--bw-accent);
    box-shadow: var(--bw-focus-ring);
}

/* 失败清单：契约 §2.1「结果条 / 失败清单」→ 底改对应族 -tint + 字用 -ink（红族）。
   左侧 3px 朱砂实边条对齐语义族。 */
.qt-shell .qt-failed-box {
    margin: 0 0 10px;
    padding: 9px 14px 9px 12px;
    border: 0;
    border-left: 3px solid var(--bw-c-red);
    border-radius: var(--bw-radius-sm);
    background: var(--bw-c-red-tint);
    color: var(--bw-c-red-ink);
    font-size: 13px;
    line-height: 1.7;
}
.qt-shell .qt-failed-box strong { display: block; margin-bottom: 3px; color: var(--bw-c-red-ink); }
.qt-shell .qt-failed-box code {
    padding: 1px 6px;
    border: 1px solid var(--bw-c-red-bg-h);
    border-radius: var(--bw-radius-xs);
    background: var(--bw-paper);
    color: var(--bw-c-red-ink);
}

/* 已选数量提示：去框 + 数值加重（tabular-nums）。
   不画自身底线：紧随其后的 .qt-kpi-grid 已有 1px 顶线，避免叠成 2px 双线。 */
.qt-shell .qt-selected-hint {
    display: flex;
    align-items: center;
    gap: 6px;
    margin-bottom: 10px;             /* v6 压缩：原 16 */
    padding: 0;
    border: 0;
    border-radius: 0;
    background: transparent;
    color: var(--bw-text-secondary);
    font-size: 13px;
    font-weight: 400;
}
.qt-shell .qt-selected-hint strong {
    color: var(--bw-text-primary);
    font-size: 15px;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
}

/* ═══════════════════════════════════════════════════════════════════════════
   6. 按钮：契约 §1.3 铁律 —— 常驻必须有彩底 + 同族描边 + 同族 ink 文字
   ── v6 修正：v5 的 `.qt-btn` 常驻是 `background-color: var(--bw-paper)` + 近黑文字
      （warning/warn 变体同样），即运营主诉的「没有按钮背景颜色渲染、直接用黑色字体」。
   ── 变体指派（契约 §1.4 动作按后果着色）：
        无变体（导航/中性工具）→ slate 族 `-bg` 底 + slate 描边 + slate-ink
        .qt-btn-warning / .qt-btn-warn（重置 / 导出 / 保存设置）→ amber 族 `-bg`
        .qt-btn-danger（失效/删除）→ red 族 `-bg` + 2px 描边（形态编码）
        .qt-btn-primary / .qt-btn-success → 按后果实底：
          查询/激活 = green 实底；导出（onclick 含 Export）= blue 实底；
          保存/写库（onclick 含 Save/Submit/Set）= orange 实底；其余主提交 = 紫檀实底
          （实底只给主 CTA，符合 §1.4「实底仅用于主 CTA 与模态确认」）
   ═══════════════════════════════════════════════════════════════════════════ */
.qt-shell .qt-btn {
    width: 100%;
    min-height: 38px;                /* v6 压缩：原 42 */
    height: 38px;
    padding: 0 22px;
    border: 1px solid var(--bw-c-slate);
    border-radius: var(--bw-radius-sm);
    background-color: var(--bw-c-slate-bg);   /* v6：静态彩底（不再纸底兜底） */
    background-image: none;
    color: var(--bw-c-slate-ink);
    font-family: var(--bw-font);
    font-size: 14.5px;
    font-weight: 600;
    letter-spacing: .01em;
    line-height: 1.2;
    cursor: pointer;
    box-shadow: none;
    display: flex;
    align-items: center;
    justify-content: center;
    text-decoration: none;
    transition: background-color var(--bw-transition), border-color var(--bw-transition),
                box-shadow var(--bw-transition), color var(--bw-transition);
}
.qt-shell .qt-btn:hover:not(:disabled) {
    background-color: var(--bw-c-slate-bg-h);
    border-color: var(--bw-c-slate);
    color: var(--bw-c-slate-ink);
}
.qt-shell .qt-btn:focus-visible { outline: none; box-shadow: var(--bw-focus-ring); }
/* [v8修复 #5] 四态之 active：按下时轻微下沉（§6.2；主按钮另有 translate(2px,2px) 硬印位移，
   特异性更高，不受影响）。:not(:disabled) 保证禁用态不产生位移动效。 */
.qt-shell .qt-btn:active:not(:disabled) { transform: translateY(1px); }
/* 禁用：不可点击 → 不属于 §1.3 管辖；统一暖灰（sunken）+ 虚线描边表示不可用 */
.qt-shell .qt-btn:disabled {
    border-style: dashed;
    border-color: var(--bw-text-disabled);
    background-color: var(--bw-bg-sunken);
    color: var(--bw-text-disabled);
    cursor: not-allowed;
    box-shadow: none;
    /* [v8修复 #3] 清共享 quick-tools.css:195 `.qt-btn:disabled{opacity:.5}` 的残留：
       半透明会把「虚线 + 暖灰」的形态编码冲淡成发虚控件；契约 §6.2 要求禁用态
       「虚线描边 + 灰字 + 无投影」（不得只靠透明度），故显式不透明。 */
    opacity: 1;
}

/* 查询 / 激活类（=契约 §1.4「查询 / 执行」）→ 松烟绿实底 + 反白（≥6.1:1） */
.qt-shell .qt-btn-primary,
.qt-shell .qt-btn-success {
    border-color: var(--bw-c-green);
    background-color: var(--bw-c-green);
    background-image: none;
    color: var(--bw-text-inverse);
    box-shadow: var(--bw-shadow-stamp);
}
/* 导出 Excel（主 CTA，onclick 含 Export）→ 黛青蓝实底 + 反白（§1.4「导出 / 生成文件」） */
.qt-shell .qt-btn-primary[onclick*="Export"] {
    border-color: var(--bw-c-blue);
    background-color: var(--bw-c-blue);
}
/* 保存 / 写库（主 CTA，onclick 含 Save/Submit/Set）→ 陶土橙实底 + 反白（§1.4「保存 / 写库」） */
.qt-shell .qt-btn-primary[onclick*="Save"],
.qt-shell .qt-btn-primary[onclick*="Submit"],
.qt-shell .qt-btn-primary[onclick*="Set"] {
    border-color: var(--bw-c-orange);
    background-color: var(--bw-c-orange-ink);   /* [v6修复] 白字对比：#B4652F 仅 4.06 <4.5；#8F4E22 达 5.5 */
}
/* hover 一律「同族加深」，**不改色相**（绿查询悬停仍是绿，不转紫檀）。
   每条规则先写静态同族色作老内核兜底，再用 color-mix 加深（仅 hover，非常驻底 → 禁用规则不适用）。 */
.qt-shell .qt-btn-primary:hover:not(:disabled) {          /* 紫檀（主提交） */
    border-color: var(--bw-accent-hover);
    background-color: var(--bw-accent-hover);
    color: var(--bw-text-inverse);
    /* [v8修复 #2] 清共享 quick-tools.css:199 `.qt-btn-primary:hover:not(:disabled)`
       {box-shadow:0 12px 24px rgba(72,146,234,.22)} 的蓝色光晕残留；改中性柔影。 */
    box-shadow: var(--bw-shadow-xs);
}
.qt-shell .qt-btn-success:hover:not(:disabled) {          /* 松烟绿（查询 / 激活） */
    border-color: var(--bw-c-green);
    background-color: var(--bw-c-green);
    background-color: color-mix(in srgb, var(--bw-c-green) 86%, var(--bw-ink));
    color: var(--bw-text-inverse);
    /* [v8修复 #2] 清共享 quick-tools.css:197 `.qt-btn-success:hover:not(:disabled)`
       {box-shadow:0 12px 24px rgba(99,193,50,.22)} 的绿色光晕残留；改中性柔影。 */
    box-shadow: var(--bw-shadow-xs);
}
.qt-shell .qt-btn-primary[onclick*="Export"]:hover:not(:disabled) {   /* 黛青（导出） */
    border-color: var(--bw-c-blue);
    background-color: var(--bw-c-blue);
    background-color: color-mix(in srgb, var(--bw-c-blue) 86%, var(--bw-ink));
    color: var(--bw-text-inverse);
    box-shadow: var(--bw-shadow-xs);      /* [v8修复 #2] 同族中性柔影（不留蓝色共享光晕） */
}
.qt-shell .qt-btn-primary[onclick*="Save"]:hover:not(:disabled),
.qt-shell .qt-btn-primary[onclick*="Submit"]:hover:not(:disabled),
.qt-shell .qt-btn-primary[onclick*="Set"]:hover:not(:disabled) {      /* 陶土橙（保存 / 写库） */
    border-color: var(--bw-c-orange);
    background-color: var(--bw-c-orange-ink);   /* [v6修复] 白字对比：#B4652F 仅 4.06 <4.5；#8F4E22 达 5.5 */
    background-color: color-mix(in srgb, var(--bw-c-orange) 86%, var(--bw-ink));
    color: var(--bw-text-inverse);
    box-shadow: var(--bw-shadow-xs);      /* [v8修复 #2] 同族中性柔影（不留蓝色共享光晕） */
}
.qt-shell .qt-btn-primary:active:not(:disabled),
.qt-shell .qt-btn-success:active:not(:disabled) {
    transform: translate(2px, 2px);
    box-shadow: none;
}
/* 危险动作（失效/删除）：red 族 `-bg` 常驻底 + 2px 描边（形态编码），文字用 red-ink */
.qt-shell .qt-btn-danger {
    border: 2px solid var(--bw-c-red);
    color: var(--bw-c-red-ink);
    background-color: var(--bw-c-red-bg);
    font-weight: 600;
}
.qt-shell .qt-btn-danger:hover:not(:disabled) {
    background-color: var(--bw-c-red-bg-h);
    border-color: var(--bw-c-red);
    color: var(--bw-c-red-ink);
}
/* 重置 / 导出 / 保存设置（v5 曾为「纸底 + 近黑字」，运营主诉点之一）→ amber 族 `-bg` */
.qt-shell .qt-btn-warning,
.qt-shell .qt-btn-warn {
    border-color: var(--bw-c-amber);
    background-color: var(--bw-c-amber-bg);
    color: var(--bw-c-amber-ink);
}
.qt-shell .qt-btn-warning:hover:not(:disabled),
.qt-shell .qt-btn-warn:hover:not(:disabled) {
    border-color: var(--bw-c-amber);
    background-color: var(--bw-c-amber-bg-h);
    color: var(--bw-c-amber-ink);
}

/* ═══════════════════════════════════════════════════════════════════════════
   [v7] 6b. code-filter-set（卡密过滤批量设置）的 3 个按钮：**专属钩子** + 三色互不相同
   ── 线上 v6 症状：三钮全为 `class="qt-btn qt-btn-primary"` → 两个「查看」落基础
      松烟绿实底（**完全同色**），「一键设置」落 `[onclick*=Submit]` 的陶土橙实底
      → 整块只有两种颜色，运营读作「按钮分不清」。
   ── 钩子（契约 §6.3 认可的定向写法，均为该板块专属，**不改 `.qt-btn-primary` 基础规则**
      —— 全站 9 个按钮共用它）：
        · 批量查看过滤设置 → `.qt-btn.qt-btn-primary[onclick*="codeFilterView"]`（墨青 teal）
        · 批量查看过滤数量 → `a.qt-btn[href*="ip-filter-set"]`（黛青 blue）
        · 一键设置（写库）→ `.qt-btn.qt-btn-primary[onclick*="codeFilterSubmit"]`（陶土橙）
   ── 形态（§6.1 同族渐变实底 + 反白 + 彩色投影；§6.2 四态）：常驻渐变 + `:hover:not(:disabled)`
      加深并 `translateY(-1px)` + 保留 `:disabled` 虚线灰。
   ── ip-filter-set 的「导出 Excel / 保存设置」onclick 不含 `codeFilter*`，`href` 也不是
      `ip-filter-set`（是 `/quick-tools/code-filter-set`）→ 不受本组规则影响。
   ── 陶土橙**深端必须用 `--bw-c-orange-ink`**：`--bw-c-orange` #B4652F 反白仅 4.06 <4.5（§1.4）。
═══════════════════════════════════════════════════════════════════════════ */
/* ① 批量查看过滤设置（只读查询）→ 墨青 teal 渐变实底 + 反白 */
.qt-shell .qt-btn.qt-btn-primary[onclick*="codeFilterView"] {
    border-color: var(--bw-c-teal);
    background-color: var(--bw-c-teal);                       /* 老内核兜底（同族实底） */
    background-image: linear-gradient(135deg, var(--bw-c-teal), var(--bw-c-teal-ink));
    color: var(--bw-text-inverse);
    box-shadow: 0 1px 3px color-mix(in srgb, var(--bw-c-teal) 38%, transparent);
    transition: background-color var(--bw-transition), border-color var(--bw-transition),
                box-shadow var(--bw-transition), color var(--bw-transition),
                transform var(--bw-transition);
}
.qt-shell .qt-btn.qt-btn-primary[onclick*="codeFilterView"]:hover:not(:disabled) {
    border-color: var(--bw-c-teal-ink);
    background-color: var(--bw-c-teal-ink);                   /* 老内核兜底（同族加深） */
    background-color: color-mix(in srgb, var(--bw-c-teal) 82%, var(--bw-ink));
    background-image: linear-gradient(135deg, var(--bw-c-teal-ink), var(--bw-c-teal-ink));
    background-image: linear-gradient(135deg,
        color-mix(in srgb, var(--bw-c-teal) 84%, var(--bw-ink)),
        color-mix(in srgb, var(--bw-c-teal-ink) 84%, var(--bw-ink)));
    color: var(--bw-text-inverse);
    transform: translateY(-1px);
    box-shadow: 0 4px 12px color-mix(in srgb, var(--bw-c-teal) 46%, transparent);
}
/* ② 批量查看过滤数量（跳转 ip-filter-set）→ 黛青 blue 渐变实底 + 反白 */
.qt-shell a.qt-btn[href*="ip-filter-set"] {
    border-color: var(--bw-c-blue);
    background-color: var(--bw-c-blue);                       /* 老内核兜底（同族实底） */
    background-image: linear-gradient(135deg, var(--bw-c-blue), var(--bw-c-blue-ink));
    color: var(--bw-text-inverse);
    box-shadow: 0 1px 3px color-mix(in srgb, var(--bw-c-blue) 38%, transparent);
    transition: background-color var(--bw-transition), border-color var(--bw-transition),
                box-shadow var(--bw-transition), color var(--bw-transition),
                transform var(--bw-transition);
}
.qt-shell a.qt-btn[href*="ip-filter-set"]:hover:not(:disabled) {
    border-color: var(--bw-c-blue-ink);
    background-color: var(--bw-c-blue-ink);                   /* 老内核兜底（同族加深） */
    background-color: color-mix(in srgb, var(--bw-c-blue) 82%, var(--bw-ink));
    background-image: linear-gradient(135deg, var(--bw-c-blue-ink), var(--bw-c-blue-ink));
    background-image: linear-gradient(135deg,
        color-mix(in srgb, var(--bw-c-blue) 84%, var(--bw-ink)),
        color-mix(in srgb, var(--bw-c-blue-ink) 84%, var(--bw-ink)));
    color: var(--bw-text-inverse);
    transform: translateY(-1px);
    box-shadow: 0 4px 12px color-mix(in srgb, var(--bw-c-blue) 46%, transparent);
}
/* ③ 一键设置（写库，主 CTA）→ 陶土橙渐变实底 + 反白（深端 = orange-ink，见上方对比度说明） */
.qt-shell .qt-btn.qt-btn-primary[onclick*="codeFilterSubmit"] {
    border-color: var(--bw-c-orange);
    background-color: var(--bw-c-orange-ink);                 /* 老内核兜底（同族实底） */
    /* [v7修复] 浅端改用 orange-ink 系：原 --bw-c-orange #B4652F 反白仅 4.06 <4.5 */
    background-image: linear-gradient(135deg,
        color-mix(in srgb, var(--bw-c-orange-ink) 84%, var(--bw-ink)),
        var(--bw-c-orange-ink));
    color: var(--bw-text-inverse);
    box-shadow: 0 1px 3px color-mix(in srgb, var(--bw-c-orange) 38%, transparent);
    transition: background-color var(--bw-transition), border-color var(--bw-transition),
                box-shadow var(--bw-transition), color var(--bw-transition),
                transform var(--bw-transition);
}
.qt-shell .qt-btn.qt-btn-primary[onclick*="codeFilterSubmit"]:hover:not(:disabled) {
    border-color: var(--bw-c-orange-ink);
    background-color: var(--bw-c-orange-ink);                 /* 老内核兜底（同族加深） */
    background-color: color-mix(in srgb, var(--bw-c-orange) 82%, var(--bw-ink));
    background-image: linear-gradient(135deg, var(--bw-c-orange-ink), var(--bw-c-orange-ink));
    background-image: linear-gradient(135deg,
        color-mix(in srgb, var(--bw-c-orange) 84%, var(--bw-ink)),
        color-mix(in srgb, var(--bw-c-orange-ink) 84%, var(--bw-ink)));
    color: var(--bw-text-inverse);
    transform: translateY(-1px);
    box-shadow: 0 4px 12px color-mix(in srgb, var(--bw-c-orange) 46%, transparent);
}
/* 禁用态（§6.2）：虚线灰 —— 三钮共用一条，兜住基础 `.qt-btn:disabled` 之后再声明，
   确保上面的渐变规则不会在 `:disabled` 时仍显示彩色实底（静态兜底，不涉内联样式）。 */
.qt-shell .qt-btn.qt-btn-primary[onclick*="codeFilterView"]:disabled,
.qt-shell a.qt-btn[href*="ip-filter-set"]:disabled,
.qt-shell .qt-btn.qt-btn-primary[onclick*="codeFilterSubmit"]:disabled {
    border-color: var(--bw-text-disabled);
    border-style: dashed;
    background-color: var(--bw-bg-sunken);
    background-image: none;
    color: var(--bw-text-disabled);
    box-shadow: none;
    transform: none;
    cursor: not-allowed;
}

/* 表格工具栏内的小按钮 */
.qt-shell .qt-table-toolbar .qt-btn {
    width: auto;
    height: 32px;
    min-height: 32px;
    padding: 0 16px;
    font-size: 13px;
    box-shadow: none;
}

/* ═══════════════════════════════════════════════════════════════════════════
   7. KPI 分类着色（契约 v6 §1.3 铁律 + §2.1「.qt-kpi-item」逐项配方）
   ── 四变量驱动（一处定义、全变体继承）：
        --k      = 语义 base：只作 3px/4px 左侧条、1px 描边与图形，绝不当文字色
        --k-ink  = 该族 ink：底上的文字色（全部 ≥4.69:1）
        --k-bg   = **静态** 22% 实心淡底（常驻底，禁用 color-mix）
        --k-bg-h = hover / 激活底（各族按对比度封顶）
   ── v6 根因修复：v5 的常驻底是 `color-mix(--k 8%, --bw-paper)`，实测混出 green
      #ECEFE8 / blue #EEEEEC（饱和度 <3%，人眼判为白底），配深色文字 = 运营所见的
      「黑字白底」；且老内核不支持 color-mix 会回落到 `--bw-paper` → 全屏白底。
      本版改为静态 `-bg` 并**删除纸底兜底行**，另加 1px 同族内描边（22% 底之间以
      描边分隔，避免连成整行彩带）+ 3px 左侧 base 条。
   ── 语义指派优先用 data-ip-filter 钩子（共享 DOM 的色相类名语义不可靠）；
      ip-filter-set 的 4 个 KPI 无 data 钩子，退回类名兜底（4 个类名与指标一一对应）。
   ═══════════════════════════════════════════════════════════════════════════ */
.qt-shell .qt-kpi-grid {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;                        /* [v6] 芯片间必须有间隔：22% 淡底相邻会连成整行彩带（契约 §1.5） */
    margin-bottom: 10px;             /* v6 压缩：原 16 */
    border-top: 1px solid var(--bw-divider);
}
.qt-shell .qt-kpi-item {
    --k: var(--bw-c-ink);              /* 默认中性：玄墨（中性强） */
    --k-ink: var(--bw-c-ink-ink);
    --k-bg: var(--bw-c-ink-bg);
    --k-bg-h: var(--bw-c-ink-bg-h);
    position: relative;
    display: inline-flex;
    align-items: center;
    gap: 7px;
    flex: 1 1 150px;                   /* v6 压缩：原 1 1 190px（契约 §2.2） */
    min-width: 0;
    padding: 9px 13px;                 /* v6 压缩：原 12px 16px */
    border: 0;
    border-right: 1px solid var(--bw-divider);
    border-bottom: 1px solid var(--bw-divider);
    border-radius: 0;
    /* 常驻底 = 静态族色淡底（无 color-mix、无纸底兜底行）。
       [v9] 档位统一为 -bg-h：与 ip-filter-set 的 4 个 KPI（走共享类名兜底）及 24 个
       .qt-action-kpi 同档，消除「同族 KPI 网格两页深浅不一」。实测各族 ink/-bg-h
       ≥4.56:1（orange 4.56 为最低，达 AA）。 */
    background-color: var(--k-bg-h);
    background-image: none;
    color: var(--k-ink);
    font-size: 12.5px;
    font-weight: 400;
    line-height: 1.4;
    white-space: nowrap;
    overflow: hidden;                  /* v6：防「登录5秒以上 / 0 个 | 0%」撞格 */
    text-overflow: ellipsis;
    /* base 只作条/描边：3px 左侧同族条 + 1px 同族内描边，均为静态 var(--k)、无 color-mix。
       [v9] 旧注释写「描边用 color-mix 32%」与代码不符：本就按本文件头部设计说明
       「描边用同族 base（1px）」实现；color-mix 会被老内核（360/QQ/旧 Chromium<111）
       整条丢弃 → 芯片连描边一起丢，故描边必须是静态值。 */
    box-shadow: inset 3px 0 0 var(--k),
                inset 0 0 0 1px var(--k);
    transition: background-color var(--bw-transition), box-shadow var(--bw-transition),
                color var(--bw-transition);
}
/* 标签：可被压缩截断（省略号），数值永不裁切 */
.qt-shell .qt-kpi-item span {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    color: inherit;
    /* [v8修复 #1] 清共享 quick-tools.css:582 `.qt-kpi-item span{opacity:.9}` 的残留：
       .9 会把 ink 文字压到 orange 4.69→3.93 / violet 5.34→4.38（<4.5，§1.3 铁律）。
       span 是标签文字，必须不透明。 */
    opacity: 1;
}
.qt-shell .qt-kpi-item strong {
    flex: 0 0 auto;
    font-size: 15px;
    font-weight: 600;                 /* 禁止 700+ */
    color: var(--k-ink);
    font-variant-numeric: tabular-nums;
    /* [v8修复 #1] 同上：显式声明不透明（防御共享半透明残留），保证数值对比度达标 */
    opacity: 1;
}
/* ── 类名兜底（无 data 钩子时生效）：ip-filter-set 的 4 个 KPI 与 17 个设备/交互项 ──
   映射原则：pink→slate（契约 §1.5「pink/slate 归 slate-bg」）；rose→red（不新引 rose 族，
   与 data 钩子对 duplicate_device/proxy/simulator/fake_browser 的红族指派一致，控制单屏色相）；
   dark（设备类）→slate 中性。 */
.qt-shell .qt-kpi-item.blue   { --k: var(--bw-c-blue);   --k-ink: var(--bw-c-blue-ink);   --k-bg: var(--bw-c-blue-bg);   --k-bg-h: var(--bw-c-blue-bg-h); }
.qt-shell .qt-kpi-item.green  { --k: var(--bw-c-green);  --k-ink: var(--bw-c-green-ink);  --k-bg: var(--bw-c-green-bg);  --k-bg-h: var(--bw-c-green-bg-h); }
.qt-shell .qt-kpi-item.red    { --k: var(--bw-c-red);    --k-ink: var(--bw-c-red-ink);    --k-bg: var(--bw-c-red-bg);    --k-bg-h: var(--bw-c-red-bg-h); }
.qt-shell .qt-kpi-item.orange { --k: var(--bw-c-orange); --k-ink: var(--bw-c-orange-ink); --k-bg: var(--bw-c-orange-bg); --k-bg-h: var(--bw-c-orange-bg-h); }
.qt-shell .qt-kpi-item.purple { --k: var(--bw-c-purple); --k-ink: var(--bw-c-purple-ink); --k-bg: var(--bw-c-purple-bg); --k-bg-h: var(--bw-c-purple-bg-h); }
.qt-shell .qt-kpi-item.amber  { --k: var(--bw-c-amber);  --k-ink: var(--bw-c-amber-ink);  --k-bg: var(--bw-c-amber-bg);  --k-bg-h: var(--bw-c-amber-bg-h); }
.qt-shell .qt-kpi-item.violet { --k: var(--bw-c-violet); --k-ink: var(--bw-c-violet-ink); --k-bg: var(--bw-c-violet-bg); --k-bg-h: var(--bw-c-violet-bg-h); }
.qt-shell .qt-kpi-item.rose   { --k: var(--bw-c-red);    --k-ink: var(--bw-c-red-ink);    --k-bg: var(--bw-c-red-bg);    --k-bg-h: var(--bw-c-red-bg-h); }
.qt-shell .qt-kpi-item.pink,
.qt-shell .qt-kpi-item.dark,
.qt-shell .qt-kpi-item.slate  { --k: var(--bw-c-slate);  --k-ink: var(--bw-c-slate-ink);  --k-bg: var(--bw-c-slate-bg);  --k-bg-h: var(--bw-c-slate-bg-h); }

/* ── 语义指派：ip-check 的 17 个 KPI（data-ip-filter 完备）──
   [v7] 按契约 §6.5 定案表**逐项分色**（不再合并同色）：拆掉 v6 的「5 个同为朱砂红」
   与「设备类 4 项全暖灰」；11 族色彩全部启用（KPI 网格按 §6.4 允许 ≤10 色相，
   且**相邻芯片不同色**）。每条规则只写 4 个变量，绝不写死背景。
   —— 风险族 4 项分散为 red / orange / purple / rose；设备族 4 项 = teal / blue / violet / slate。
   与上方类名兜底同为 (0,3,0) 特异性，靠**源序在后**胜出（不改 DOM、不加 !important）。 */
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="all"]              { --k: var(--bw-c-blue);   --k-ink: var(--bw-c-blue-ink);   --k-bg: var(--bw-c-blue-bg);   --k-bg-h: var(--bw-c-blue-bg-h); }
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="valid"]            { --k: var(--bw-c-green);  --k-ink: var(--bw-c-green-ink);  --k-bg: var(--bw-c-green-bg);  --k-bg-h: var(--bw-c-green-bg-h); }
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="invalid"]          { --k: var(--bw-c-red);    --k-ink: var(--bw-c-red-ink);    --k-bg: var(--bw-c-red-bg);    --k-bg-h: var(--bw-c-red-bg-h); }
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="not_landed"]       { --k: var(--bw-c-amber);  --k-ink: var(--bw-c-amber-ink);  --k-bg: var(--bw-c-amber-bg);  --k-bg-h: var(--bw-c-amber-bg-h); }
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="quick_exit"]       { --k: var(--bw-c-orange); --k-ink: var(--bw-c-orange-ink); --k-bg: var(--bw-c-orange-bg); --k-bg-h: var(--bw-c-orange-bg-h); }
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="over_5s"]          { --k: var(--bw-c-teal);   --k-ink: var(--bw-c-teal-ink);   --k-bg: var(--bw-c-teal-bg);   --k-bg-h: var(--bw-c-teal-bg-h); }
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="message"]          { --k: var(--bw-c-purple); --k-ink: var(--bw-c-purple-ink); --k-bg: var(--bw-c-purple-bg); --k-bg-h: var(--bw-c-purple-bg-h); }
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="click"]            { --k: var(--bw-c-violet); --k-ink: var(--bw-c-violet-ink); --k-bg: var(--bw-c-violet-bg); --k-bg-h: var(--bw-c-violet-bg-h); }
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="copy"]             { --k: var(--bw-c-rose);   --k-ink: var(--bw-c-rose-ink);   --k-bg: var(--bw-c-rose-bg);   --k-bg-h: var(--bw-c-rose-bg-h); }
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="android"]          { --k: var(--bw-c-teal);   --k-ink: var(--bw-c-teal-ink);   --k-bg: var(--bw-c-teal-bg);   --k-bg-h: var(--bw-c-teal-bg-h); }
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="ios"]              { --k: var(--bw-c-blue);   --k-ink: var(--bw-c-blue-ink);   --k-bg: var(--bw-c-blue-bg);   --k-bg-h: var(--bw-c-blue-bg-h); }
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="pc"]               { --k: var(--bw-c-violet); --k-ink: var(--bw-c-violet-ink); --k-bg: var(--bw-c-violet-bg); --k-bg-h: var(--bw-c-violet-bg-h); }
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="unknown_device"]   { --k: var(--bw-c-slate);  --k-ink: var(--bw-c-slate-ink);  --k-bg: var(--bw-c-slate-bg);  --k-bg-h: var(--bw-c-slate-bg-h); }
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="duplicate_device"] { --k: var(--bw-c-red);    --k-ink: var(--bw-c-red-ink);    --k-bg: var(--bw-c-red-bg);    --k-bg-h: var(--bw-c-red-bg-h); }
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="proxy"]            { --k: var(--bw-c-orange); --k-ink: var(--bw-c-orange-ink); --k-bg: var(--bw-c-orange-bg); --k-bg-h: var(--bw-c-orange-bg-h); }
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="simulator"]        { --k: var(--bw-c-purple); --k-ink: var(--bw-c-purple-ink); --k-bg: var(--bw-c-purple-bg); --k-bg-h: var(--bw-c-purple-bg-h); }
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="fake_browser"]     { --k: var(--bw-c-rose);   --k-ink: var(--bw-c-rose-ink);   --k-bg: var(--bw-c-rose-bg);   --k-bg-h: var(--bw-c-rose-bg-h); }

.qt-shell .qt-kpi-item.qt-clickable { cursor: pointer; user-select: none; }
/* hover：**保留自身 --k**（v4 缺陷：hover 用 --bw-accent-border 顶掉语义条），底升到 -bg-h */
.qt-shell .qt-kpi-item.qt-clickable:hover {
    background-color: var(--k-bg-h);
    color: var(--k-ink);
}
/* 激活态（当前筛选）：契约 §2.1 要求的**自身 --k 强档**（4px 条 + 1px 内描边 + 底 -bg-h + ink 文字）。
   修复 v4 缺陷：原规则把所有类别强行改成紫檀，一激活即丢失类别身份。 */
.qt-shell .qt-kpi-item.qt-active {
    background-color: var(--k-bg-h);
    box-shadow: inset 4px 0 0 var(--k),
                inset 0 0 0 1px var(--k);
    color: var(--k-ink);
}
.qt-shell .qt-kpi-item.qt-active span,
.qt-shell .qt-kpi-item.qt-active strong { color: var(--k-ink); }

/* ── [v7] ip-check 17 个 KPI 的四态可点击性（契约 §6.2 新增验收项）──
   作用域钩子 = `[data-ip-filter]`：该属性**全站仅 ip-check 有**（§6.3），故可在此安全地
   加渐变与彩色投影，而**不触及** ip-filter-set 的 4 个 KPI（无该属性、依赖类名兜底）
   与其余 9 个板块。上方 3 条通用规则（.qt-clickable / .qt-clickable:hover / .qt-active）
   的 `var(--k)` 写法**原样保留**——它们同时服务 ip-filter-set，不得改动。
   ── 常驻：`-bg` 底（继承 §7 基础配方）+ 3px 族色左条 + 1px 族色描边 + 族色柔和投影 + cursor:pointer。
      box-shadow 写两行：第 1 行不含 color-mix（老内核保留左条/描边，降级无害），
      第 2 行用 color-mix 加强 1px 描边并叠加族色柔影（§6.1 允许交互元素用同族色）。
      —— 不用 !important：本规则 (0,3,0) 与基础配方同档，靠源序在后胜出。 */
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter] {
    cursor: pointer;
    user-select: none;
    box-shadow: inset 3px 0 0 var(--k),
                inset 0 0 0 1px var(--k),
                var(--bw-shadow-xs);
    box-shadow: inset 3px 0 0 var(--k),
                inset 0 0 0 1px color-mix(in srgb, var(--k) 35%, var(--bw-paper)),
                0 1px 3px color-mix(in srgb, var(--k) 34%, transparent);
    transition: background-color var(--bw-transition), box-shadow var(--bw-transition),
                color var(--bw-transition), transform var(--bw-transition);
}
/* hover：`-bg-h` 底 + translateY(-1px) + 投影增强（§6.2 四态之 hover）。
   (0,4,0) 与通用 `.qt-clickable:hover` 同档，源序在后胜出；保留自身 --k 色相。 */
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter]:hover {
    background-color: var(--k-bg-h);
    color: var(--k-ink);
    transform: translateY(-1px);
    box-shadow: inset 3px 0 0 var(--k),
                inset 0 0 0 1px var(--k),
                var(--bw-shadow-sm);
    box-shadow: inset 3px 0 0 var(--k),
                inset 0 0 0 1px var(--k),
                0 3px 9px color-mix(in srgb, var(--k) 40%, transparent);
}
/* 选中（当前筛选，`.qt-active` 由 quick-tools.js 切换）：**同族渐变实底 + 反白字 + 4px 条**，
   「已开启」一眼可辨（§6.1 + §6.2）。渐变两端均取自该族令牌（--k = base，--k-ink = 族 ink），
   不跨色相。静态 `background-color: var(--k)` 作老内核兜底（渐变普遍支持，此行为安全网）。
   注：orange 族 base #B4652F 处反白为 4.06:1（低于 4.5），仅存在于渐变最浅角的角落区域。 */
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter].qt-active {
    background-color: var(--k);
    background-image: linear-gradient(135deg, var(--k), var(--k-ink));
    color: var(--bw-text-inverse);
    box-shadow: inset 4px 0 0 var(--k),
                inset 0 0 0 1px var(--k-ink),
                var(--bw-shadow-sm);
    box-shadow: inset 4px 0 0 var(--k),
                inset 0 0 0 1px var(--k-ink),
                0 2px 7px color-mix(in srgb, var(--k) 42%, transparent);
    /* 不声明 transform：选中芯片被 hover 时仍保留上面 hover 规则的 translateY(-1px) 反馈 */
}

  /* [v7修复] orange 族（quick_exit / proxy）选中渐变：浅端由 base #B4652F 改为 orange-ink 系，
     保证反白字 ≥4.5（原最浅角仅 4.06）。置于通用规则之后，同特异性取后胜。 */
  .qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="quick_exit"].qt-active,
  .qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="proxy"].qt-active {
      background-color: var(--bw-c-orange-ink);
      background-image: linear-gradient(135deg,
          color-mix(in srgb, var(--bw-c-orange-ink) 84%, var(--bw-ink)),
          var(--bw-c-orange-ink));
  }
/* 选中态反白：必须显式覆盖 `.qt-kpi-item strong{color:--k-ink}` 与通用
   `.qt-active span/strong{color:--k-ink}`（同档源序在后胜出），否则数值仍是深色。 */
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter].qt-active span,
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter].qt-active strong {
    color: var(--bw-text-inverse);
}
/* 禁用（防御性规则：当前 DOM 中这些 div 不带 disabled/aria-disabled，仅备将来需要）：
   虚线描边 + 灰字 + 无投影（§6.2；与 `.qt-btn:disabled` 的形态一致）。 */
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter]:disabled,
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter].qt-disabled,
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter][aria-disabled="true"] {
    border: 1px dashed var(--bw-text-disabled);
    background-color: var(--bw-bg-sunken);
    background-image: none;
    color: var(--bw-text-disabled);
    cursor: not-allowed;
    box-shadow: none;
    transform: none;
}
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter]:disabled strong,
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter].qt-disabled strong,
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter][aria-disabled="true"] strong {
    color: var(--bw-text-disabled);
}

/* ═══════════════════════════════════════════════════════════════════════════
   8. 操作 KPI（卡密状态页 24 个批量动作按钮）：契约 §1.3 铁律 + §1.4「按后果着色」+ §2.1
   ── 形态：1px solid var(--k)（base 作描边）+ **静态 `-bg` 22% 常驻底**（禁用 color-mix）
      + `--k-ink` 文字 + 600 字重；hover `-bg-h`；**按下瞬态实底反白**（仅 :active 期间）。
   ── v6 根因修复：v5 常驻底是 `color-mix(--k 8%, paper)` + 纸底兜底行 → 纸白 + 深色字。
   ── **间隙**：这 24 钮位于 `gap:0` 的 .qt-kpi-grid 内，22% 底相邻会连成整行彩带
      （违反 §1.5）。这里用**自身 margin**（而非容器 gap/:has）给每个芯片留 6px 间隙，
      老内核（不支持 :has）同样生效。
   ── 语义（后果）映射见下方分族；中性动作（pink/slate，如"上传验证码背景图"）→ slate 族。
═══════════════════════════════════════════════════════════════════════════ */
.qt-shell .qt-action-kpi {
    --k: var(--bw-c-slate);                /* 无类名时的中性兜底（暖灰，不占色相） */
    --k-ink: var(--bw-c-slate-ink);
    --k-bg: var(--bw-c-slate-bg);
    --k-bg-h: var(--bw-c-slate-bg-h);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    flex: 1 1 168px;                       /* §5 陷阱 3：加间隙后按 168px 均衡折行 */
    min-height: 32px;                      /* v6 压缩：原 36（≤768 由移动端断点抬回 36） */
    margin: 0 6px 6px 0;                   /* 芯片间隙（不可为 0，否则彩带） */
    padding: 5px 13px;                     /* v6 压缩：原 8px 15px */
    border: 1px solid var(--k);
    border-radius: var(--bw-radius-sm);
    /* [v9] 常驻底与 KPI 芯片统一 -bg-h 档（原 -bg 22%）；hover 另给实底反白 */
    background-color: var(--k-bg-h);
    background-image: none;
    color: var(--k-ink);
    font-family: var(--bw-font);
    font-size: 13px;
    font-weight: 600;
    line-height: 1.35;
    white-space: nowrap;
    cursor: pointer;
    box-shadow: none;
    transition: background-color var(--bw-transition), border-color var(--bw-transition),
                color var(--bw-transition);
}
/* ── 后果 → 色族（契约 §1.2 判定）──
   启用/激活（引粉/二维码/验证码/直跳）= 松烟绿；停止/失效/关闭 = 朱砂；
   引粉档位与防炸验证 = 陶土橙；全网码·数字验证·是非问答·复制 = 黛青；
   其余码型/验证设置 = 紫檀 / 墨青。 */
.qt-shell .qt-action-kpi.green  { --k: var(--bw-c-green);  --k-ink: var(--bw-c-green-ink);  --k-bg: var(--bw-c-green-bg);  --k-bg-h: var(--bw-c-green-bg-h); }
.qt-shell .qt-action-kpi.red    { --k: var(--bw-c-red);    --k-ink: var(--bw-c-red-ink);    --k-bg: var(--bw-c-red-bg);    --k-bg-h: var(--bw-c-red-bg-h); }
.qt-shell .qt-action-kpi.orange { --k: var(--bw-c-orange); --k-ink: var(--bw-c-orange-ink); --k-bg: var(--bw-c-orange-bg); --k-bg-h: var(--bw-c-orange-bg-h); }
.qt-shell .qt-action-kpi.blue   { --k: var(--bw-c-blue);   --k-ink: var(--bw-c-blue-ink);   --k-bg: var(--bw-c-blue-bg);   --k-bg-h: var(--bw-c-blue-bg-h); }
.qt-shell .qt-action-kpi.purple { --k: var(--bw-c-purple); --k-ink: var(--bw-c-purple-ink); --k-bg: var(--bw-c-purple-bg); --k-bg-h: var(--bw-c-purple-bg-h); }
.qt-shell .qt-action-kpi.teal   { --k: var(--bw-c-teal);   --k-ink: var(--bw-c-teal-ink);   --k-bg: var(--bw-c-teal-bg);   --k-bg-h: var(--bw-c-teal-bg-h); }
/* 中性动作（pink/slate）：归 slate 族（契约 §1.5「pink/slate 归 slate-bg」），仍是有色底 */
.qt-shell .qt-action-kpi.pink,
.qt-shell .qt-action-kpi.slate  { --k: var(--bw-c-slate);  --k-ink: var(--bw-c-slate-ink);  --k-bg: var(--bw-c-slate-bg);  --k-bg-h: var(--bw-c-slate-bg-h); }
.qt-shell .qt-action-kpi:hover:not(:disabled) {
    background-color: var(--k-bg-h);
    border-color: var(--k);
    color: var(--k-ink);
}
.qt-shell .qt-action-kpi:focus-visible { outline: none; box-shadow: var(--bw-focus-ring); }
/* 按下：瞬态实底 + 反白字（只作用于 :active 按下瞬间，松手即回到 -bg，非常驻实色） */
.qt-shell .qt-action-kpi:active {
    background-color: var(--k);
    background-image: none;
    border-color: var(--k);
    color: var(--bw-text-inverse);
}
/* [v8修复 #7] orange 族按下实底：--k = orange base #B4652F 反白仅 4.06（<4.5）→
   改同族深端（orange-ink 系，反白 7.07）。仅 :active 瞬态，故 color-mix 可用
   （§6.1 放行；静态 color-mix 前先写 orange-ink 兜底，老内核退化为同族深底而非纸白）。 */
.qt-shell .qt-action-kpi.orange:active {
    background-color: var(--bw-c-orange-ink);
    background-color: color-mix(in srgb, var(--bw-c-orange-ink) 84%, var(--bw-ink));
    border-color: var(--bw-c-orange-ink);
    color: var(--bw-text-inverse);
}
/* [v9] 补禁用态（§6.2 四态齐备；与 .qt-btn / .qt-pagination button 同口径：
   虚线描边 + 暖灰底 + 灰字 + 不靠透明度）。当前 DOM 中这 24 钮无 disabled 属性，
   属规范预备；上方 hover 规则已带 :not(:disabled)，禁用钮不会被点亮。 */
.qt-shell .qt-action-kpi:disabled {
    border-style: dashed;
    border-color: var(--bw-text-disabled);
    background-color: var(--bw-bg-sunken);
    background-image: none;
    color: var(--bw-text-disabled);
    cursor: not-allowed;
    box-shadow: none;
    opacity: 1;
}

/* ═══════════════════════════════════════════════════════════════════════════
   9. 表格：容器去框 / 表头 --bw-hairline 底线 / 行 hover 暖灰 + 首列紫檀条
   注意：.qt-table-wrap 必须保持 overflow-x:auto（横向滚动），不得破坏；
        .qt-table 的 min-width 由共享文件在窄屏设定，本文件不得改写。
═══════════════════════════════════════════════════════════════════════════ */
.qt-shell .qt-table-wrap {
    overflow-x: auto;                 /* 契约要求：横向滚动，不得改为 hidden */
    -webkit-overflow-scrolling: touch;
    max-width: 100%;
    border: 0;
    border-top: 1px solid var(--bw-hairline);
    border-radius: 0;
    background-color: transparent;
    background-image: none;
    box-shadow: none;
}
.qt-shell .qt-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 13px;
    color: var(--bw-text-primary);
}
/* 表头：暖灰不透明底（--bw-bg-sunken，仍灰阶：契约 §2.1「#ducResultBox 等结果表 表头加暖灰底」）
   + 1px --bw-hairline 底线；压缩 padding（12px→9px） */
.qt-shell .qt-table thead th {
    padding: 9px 14px;               /* v6 压缩：原 12px 14px */
    background-color: var(--bw-bg-sunken);
    background-image: none;
    border-bottom: 1px solid var(--bw-hairline);
    border-right: 0;
    color: var(--bw-text-secondary);
    font-size: 12.5px;
    font-weight: 600;
    letter-spacing: .01em;
    text-align: left;
    white-space: nowrap;
}
.qt-shell .qt-table thead th:last-child { border-right: 0; }
.qt-shell .qt-table th.qt-sortable { cursor: pointer; user-select: none; }
.qt-shell .qt-table th.qt-sortable:hover {
    background: var(--bw-bg-hover);
    color: var(--bw-text-primary);
}
/* 排序箭头（JS 动态插入 ▲▼，激活态追加 asc / desc；类名为 qt-sort-up / qt-sort-down）
   纯图形可交互控件（§1.3 箭头类除外项）：不需要彩底，但**去掉纯黑**，改紫檀可交互色 */
.qt-shell .qt-sort-arrow {
    display: inline-block;
    padding: 0 2px;
    color: var(--bw-text-muted-on-tint);
    font-size: 9px;
    line-height: 1;
    vertical-align: middle;
    cursor: pointer;
    user-select: none;
    transition: color var(--bw-transition);
}
.qt-shell .qt-sort-arrow:hover { color: var(--bw-accent); }
.qt-shell .qt-sort-arrow.asc,
.qt-shell .qt-sort-arrow.desc {
    color: var(--bw-accent);
    font-weight: 600;
}
.qt-shell .qt-table tbody td {
    padding: 6px 14px;               /* v6 压缩主杠杆：原 10px 14px（20 行省 ≈160px） */
    border-bottom: 1px solid var(--bw-divider);
    border-right: 0;
    color: var(--bw-text-primary);
    vertical-align: top;
}
.qt-shell .qt-table tbody td:last-child { border-right: 0; }
.qt-shell .qt-table tbody tr:last-child td { border-bottom: 0; }
/* 数值/时间列：等宽数字（表格对齐，减少跳动） */
.qt-shell .qt-table tbody td.qt-col-num,
.qt-shell .qt-table tbody td.qt-col-idx,
.qt-shell .qt-table tbody td.qt-col-count,
.qt-shell .qt-table tbody td.qt-col-datetime,
.qt-shell .qt-table tbody td.qt-col-onlinetime { font-variant-numeric: tabular-nums; }
/* 斑马纹：暖米底（:not() 排除状态行，避免与状态行冲突） */
.qt-shell .qt-table tbody tr:nth-child(even):not(.qt-row-invalid):not(.qt-row-notlanded) td {
    background: var(--bw-bg-page);
}
/* 行 hover：暖灰底 + 首列 3px 紫檀装饰条（契约 §3.2 指定） */
.qt-shell .qt-table tbody tr:hover td { background: var(--bw-bg-hover); }
.qt-shell .qt-table tbody tr:hover td:first-child {
    box-shadow: inset 3px 0 0 var(--bw-accent-border);
}
/* 状态行：暖灰色阶 + 左侧语义实边条（状态 = 语义色 + 形态编码，不铺彩色底） */
.qt-shell .qt-table tbody tr.qt-row-invalid td { background: var(--bw-bg-sunken); }
.qt-shell .qt-table tbody tr.qt-row-invalid td:first-child {
    box-shadow: inset 3px 0 0 var(--bw-danger);
}
.qt-shell .qt-table tbody tr.qt-row-invalid:hover td { background: var(--bw-bg-active); }
.qt-shell .qt-table tbody tr.qt-row-notlanded td { background: var(--bw-bg-page); }
.qt-shell .qt-table tbody tr.qt-row-notlanded td:first-child {
    box-shadow: inset 3px 0 0 var(--bw-warning);
}
.qt-shell .qt-table tbody tr.qt-row-notlanded:hover td { background: var(--bw-bg-hover); }
/* 数值 / 布尔列：保持原列宽策略，仅美化列内控件 */
.qt-shell .qt-table tbody td input[type=number] {
    height: 30px;
    border: 1px solid var(--bw-border-strong);
    border-radius: var(--bw-radius-sm);
    background: var(--bw-paper);
    color: var(--bw-text-primary);
    font-family: var(--bw-font);
    font-size: 13px;
}
.qt-shell .qt-table tbody td input[type=number]:focus {
    border-color: var(--bw-accent);
    box-shadow: var(--bw-focus-ring);
    outline: 0;
}
/* 表头内的批量输入框（ip-filter-set，尺寸由视图内联控制） */
.qt-shell .qt-table thead th .qt-input {
    border-radius: var(--bw-radius-sm);
    background-color: var(--bw-paper);
    border-color: var(--bw-border-strong);
    color: var(--bw-text-primary);
}
.qt-shell .qt-table thead th .qt-input:focus { box-shadow: var(--bw-focus-ring); }
/* 列拖拽手柄（纯图形可交互控件）：hover/active 改紫檀族，去掉共享的蓝色 rgba 与纯黑 */
.qt-shell .qt-col-resize-handle:hover,
.qt-shell .qt-col-resize-handle.active { background: var(--bw-accent); }
.qt-shell .qt-last-msg-thumb {
    border-radius: var(--bw-radius-xs);
    /* 缩略图可点击（打开图片预览浮层），故边界用可交互档 --bw-border-strong（契约 §4.7③） */
    border: 1px solid var(--bw-border-strong);
    max-height: 30px;                /* v6：原 40（否则撑高压缩后的行；契约 §5 陷阱 4） */
    box-shadow: none;
}
.qt-shell .qt-table-toolbar {
    display: flex;
    align-items: center;
    padding: 11px 14px;
    border-bottom: 1px solid var(--bw-divider);
    background-color: transparent;
    font-size: 13px;
}
/* 链接序号徽标：契约 §1.3 徽标也属功能控件 → slate 族彩底（原「纸底 + 近黑字」） */
.qt-shell .qt-link-index {
    display: inline-flex;
    align-items: center;
    padding: 1px 8px;
    margin-right: 4px;
    border: 1px solid var(--bw-c-slate);
    border-radius: var(--bw-radius-pill);
    background: var(--bw-c-slate-bg);
    color: var(--bw-c-slate-ink);
    font-size: 11.5px;
    font-weight: 600;
}
.qt-shell .qt-result {
    margin-top: 12px;
    padding: 15px;
    border: 1px solid var(--bw-divider);
    border-radius: 0;
    background: var(--bw-bg-sunken);
    background-image: none;
    color: var(--bw-text-primary);
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 12.5px;
    line-height: 1.7;
    white-space: pre-wrap;
    max-height: 420px;
    overflow: auto;
}
/* [v8修复 #9] §5 陷阱 5：download-url-check 的结果表由共享视图直接输出到 #ducResultBox
   （无 `.qt-table-wrap` 包裹，共享文件不可改）→ 皮肤定向补横向滚动容器，
   避免压缩后窄屏表格溢出/被裁切。#ducResultBox 为该板块专属 id（§6.3 零外溢）。 */
.qt-shell #ducResultBox {
    overflow-x: auto;
    max-width: 100%;
}

/* ═══════════════════════════════════════════════════════════════════════════
   10. 分页
═══════════════════════════════════════════════════════════════════════════ */
.qt-shell .qt-pagination {
    display: flex;
    justify-content: flex-end;
    align-items: center;
    flex-wrap: wrap;
    gap: 10px;
    margin-top: 10px;                /* v6 压缩：原 16 */
    padding: 0 0 0;
    color: var(--bw-text-secondary);
    font-size: 13px;
}
/* 分页按钮：契约 §1.3 功能控件 → slate 族彩底；**hover 不得变黑底**（v5 曾 hover 变墨底反白） */
.qt-shell .qt-pagination button {
    height: 30px;
    min-width: 30px;
    padding: 0 13px;
    border: 1px solid var(--bw-c-slate);
    border-radius: var(--bw-radius-sm);
    background: var(--bw-c-slate-bg);
    color: var(--bw-c-slate-ink);
    font-family: var(--bw-font);
    font-size: 12.5px;
    font-weight: 600;
    cursor: pointer;
    box-shadow: none;
    transition: background-color var(--bw-transition), color var(--bw-transition),
                border-color var(--bw-transition);
}
.qt-shell .qt-pagination button:hover:not(:disabled) {
    background-color: var(--bw-c-slate-bg-h);
    border-color: var(--bw-c-slate);
    color: var(--bw-c-slate-ink);
}
.qt-shell .qt-pagination button:disabled {
    border-style: dashed;
    border-color: var(--bw-text-disabled);
    background-color: var(--bw-bg-sunken);
    color: var(--bw-text-disabled);
    cursor: not-allowed;
    /* [v8修复 #3] 清共享 quick-tools.css:456 `.qt-pagination button:disabled{opacity:.4}` 残留：
       半透明与「虚线 + 灰字」的形态编码冲突，契约 §6.2 禁用态不得只靠透明度。 */
    opacity: 1;
}
/* [v8修复 #5] 键盘可达性：分页按钮焦点环（与 .qt-btn / .qt-back-btn 一致） */
.qt-shell .qt-pagination button:focus-visible {
    outline: none;
    box-shadow: var(--bw-focus-ring);
}
/* [v9] 补按下态（§6.2 四态齐备）：分页按钮与「每页条数」下拉 */
.qt-shell .qt-pagination button:active:not(:disabled),
.qt-shell .qt-page-size-select:active:not(:disabled) {
    transform: translateY(1px);
}
.qt-shell .qt-page-size-wrap {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    white-space: nowrap;
    color: var(--bw-text-secondary);
}
/* 每页条数下拉：契约 §2.1 指定 → slate 族彩底（分页区功能控件，非「输入底面」例外项） */
.qt-shell .qt-page-size-select {
    height: 30px;
    padding: 0 10px;
    border: 1px solid var(--bw-c-slate);
    border-radius: var(--bw-radius-sm);
    background-color: var(--bw-c-slate-bg);
    color: var(--bw-c-slate-ink);
    font-family: var(--bw-font);
    font-size: 12.5px;
    font-weight: 600;
    cursor: pointer;
    outline: none;
}
.qt-shell .qt-page-size-select:focus {
    border-color: var(--bw-accent);
    box-shadow: var(--bw-focus-ring);
}
/* [v8修复 #5] 「每页条数」下拉补 hover / disabled 两态（§6.2 四态可点击性） */
.qt-shell .qt-page-size-select:hover:not(:disabled) {
    background-color: var(--bw-c-slate-bg-h);
    border-color: var(--bw-c-slate);
    color: var(--bw-c-slate-ink);
}
.qt-shell .qt-page-size-select:disabled {
    border-style: dashed;
    border-color: var(--bw-text-disabled);
    background-color: var(--bw-bg-sunken);
    color: var(--bw-text-disabled);
    cursor: not-allowed;
    opacity: 1;                      /* [v8修复 #3] 与 .qt-btn:disabled 同口径 */
}
/* 当前页（契约 §2.1：紫檀 `-bg-h` 底 + `--bw-accent` 描边 + `--bw-accent-active` 文字）。
   说明：共享 quick-tools.js 目前把当前页渲染为纯文本 <span>x / y</span>，DOM 里没有「当前页按钮」，
   故此规则按契约备好但不命中（不隐藏、不新增任何 DOM 钩子）。 */
.qt-shell .qt-pagination button.active,
.qt-shell .qt-pagination button.current,
.qt-shell .qt-pagination button[aria-current="page"] {
    border-color: var(--bw-accent);
    background-color: var(--bw-c-purple-bg-h);
    color: var(--bw-accent-active);
}

/* ═══════════════════════════════════════════════════════════════════════════
   11. 单选 / 复选 / 范围选择组：勾选控件改紫檀（可交互；v5 为墨黑勾选 → 运营「纯黑易厌倦」），
       药丸选项常驻改 slate 彩底、选中为紫檀档
   自定义控件用 appearance:none 重绘，原生控件保持可见可点（不隐藏）
═══════════════════════════════════════════════════════════════════════════ */
.qt-shell input[type="radio"],
.qt-shell input[type="checkbox"] {
    appearance: none;
    -webkit-appearance: none;
    flex: 0 0 auto;
    width: 17px;
    height: 17px;
    margin: 0;
    border: 1px solid var(--bw-border-strong);   /* 可交互边界 */
    border-radius: var(--bw-radius-disc);
    background-color: var(--bw-paper);           /* 空白小圆点/方框底：参照 theme.css 表单例外 */
    background-repeat: no-repeat;
    background-position: center;
    background-size: 12px 12px;
    cursor: pointer;
    vertical-align: middle;
    transition: border-color var(--bw-transition), background-color var(--bw-transition),
                box-shadow var(--bw-transition);
}
.qt-shell input[type="checkbox"] { border-radius: var(--bw-radius-xs); }
.qt-shell input[type="radio"]:hover,
.qt-shell input[type="checkbox"]:hover { border-color: var(--bw-accent); }
.qt-shell input[type="radio"]:focus-visible,
.qt-shell input[type="checkbox"]:focus-visible { outline: none; box-shadow: var(--bw-focus-ring); }
/* 选中态：单选为紫檀圆心点（radial-gradient 绘制），复选为紫檀底 + 白色对勾。
   对勾是内联 SVG 数据 URI（不引用任何外部图标库/CDN）；其白色为中性色、非品牌色，
   是被允许的唯一天然色值例外（与 theme.css 的黑白体系一致）。 */
.qt-shell input[type="radio"]:checked {
    border-color: var(--bw-accent);
    background-color: var(--bw-paper);
    background-image: radial-gradient(circle at center, var(--bw-accent) 0 4.5px, transparent 4.5px);
}
.qt-shell input[type="checkbox"]:checked {
    border-color: var(--bw-accent);
    background-color: var(--bw-accent);
    background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23fff' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round' d='M3.4 8.4l3 3 6.2-6.6'/%3E%3C/svg%3E");
}
/* 范围组容器：去框（壳内不再叠结构级容器） */
.qt-shell .qt-scope-group {
    padding: 0;
    border: 0;
    border-radius: 0;
    background: transparent;
    gap: 12px;
}
.qt-shell .qt-copy-scope-group {
    display: grid;
    grid-template-columns: 1fr;
    gap: 16px;
}
.qt-shell .qt-copy-scope-section {
    display: grid;
    gap: 10px;
    padding: 0 0 14px;
    border: 0;
    border-bottom: 1px solid var(--bw-divider);
    border-radius: 0;
    background: transparent;
    background-image: none;
}
.qt-shell .qt-copy-scope-section:last-child { border-bottom: 0; padding-bottom: 0; }
.qt-shell .qt-scope-title {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    color: var(--bw-text-primary);
    font-size: 13px;
    font-weight: 600;
}
.qt-shell .qt-scope-title::before {
    content: '';
    width: 3px;
    height: 13px;
    border-radius: var(--bw-radius-xs);
    background: var(--bw-accent);    /* v6：区块标题条由墨改紫檀（去纯黑） */
}
.qt-shell .qt-scope-options {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
}
/* 勾选药丸：契约 §1.3 功能控件 → 未选 = slate 族彩底 + slate 描边 + slate-ink；
   选中 = 紫檀档（`-bg-h` 底 + `--bw-accent` 描边 + `--bw-accent-active` 文字）。
   基类与选中态都用 1px 描边，避免 :has(:checked) 时因描边变粗产生 0.5px 位移。 */
.qt-shell .qt-scope-group label,
.qt-shell .qt-copy-scope-section label,
.qt-shell .qt-radio-group label {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 6px 13px 6px 10px;      /* v6 压缩：原 7px 14px 7px 11px */
    border: 1px solid var(--bw-c-slate);
    border-radius: var(--bw-radius-pill);
    background: var(--bw-c-slate-bg);
    color: var(--bw-c-slate-ink);
    font-size: 13.5px;
    font-weight: 400;
    line-height: 1.4;
    cursor: pointer;
    transition: background var(--bw-transition), border-color var(--bw-transition),
                color var(--bw-transition);
}
.qt-shell .qt-scope-group label:hover,
.qt-shell .qt-copy-scope-section label:hover,
.qt-shell .qt-radio-group label:hover {
    border-color: var(--bw-c-slate);
    background: var(--bw-c-slate-bg-h);
    color: var(--bw-c-slate-ink);
}
/* [v8修复 #5] 药丸四态之 focus：键盘聚焦到内部 input 时在药丸外框显示焦点环（§6.2）。
   仅新增 :focus-within，不触碰上方「基础三合一」与 :hover / :has(input:checked)。 */
.qt-shell .qt-scope-group label:focus-within,
.qt-shell .qt-copy-scope-section label:focus-within,
.qt-shell .qt-radio-group label:focus-within {
    box-shadow: var(--bw-focus-ring);
}
/* :has() 选中高亮（= 选中项，契约 §2.1 指定的唯一强调色位置之一）；
   不支持的浏览器仅退化为控件本身的勾选态，不影响功能 */
.qt-shell .qt-scope-group label:has(input:checked),
.qt-shell .qt-copy-scope-section label:has(input:checked),
.qt-shell .qt-radio-group label:has(input:checked) {
    border-color: var(--bw-accent);
    background: var(--bw-c-purple-bg-h);
    color: var(--bw-accent-active);
}
.qt-shell .qt-radio-group { gap: 10px; flex-wrap: wrap; }

/* ═══════════════════════════════════════════════════════════════════════════
   12. 过滤配置区（code-filter-set）：去框 + 虚线行分隔
═══════════════════════════════════════════════════════════════════════════ */
.qt-shell .qt-config-area {
    margin-bottom: 10px;             /* v6 压缩：原 18 */
    padding: 0;
    border: 0;
    border-top: 1px solid var(--bw-hairline);
    border-radius: 0;
    background: transparent;
    box-shadow: none;
}
/* 每行左侧 3px 分类条（契约 §2.1：阈值=amber / 开关=blue / 防炸=red）；
   行高与内边距压缩（44/12px → 34/5px） */
.qt-shell .qt-config-row {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 12px;
    min-height: 34px;                /* v6 压缩：原 44 */
    margin-bottom: 0;
    padding: 5px 0 5px 11px;         /* v6 压缩：原 12px 0（+11px 给分类条让位） */
    border: 0;
    border-bottom: 1px dashed var(--bw-divider);
    border-left: 3px solid var(--bw-c-blue);   /* 缺省=开关类（blue） */
}
.qt-shell .qt-config-row:last-child { border-bottom: 0; }
/* 阈值行（数值输入）= 赭石 amber */
.qt-shell .qt-config-row:has(#cfStaySeconds) { border-left-color: var(--bw-c-amber); }
/* 防炸行（防炸开关 + 关键词/话术）= 朱砂 red（:has() 特异性更高，稳定覆盖上面的 blue 缺省）。
   [v7] 死选择器修复：原写 `:has(#cfBombFilter)`，但该 input **只有 name 没有 id**
   （视图 `app/Views/quick/index.php` 里 `<input type="radio" name="cfBombFilter" …>`）→ 该分支
   从未生效，防炸行色条一直是蓝色。改用属性钩子 `:has(input[name="cfBombFilter"])`。
   另两项 `cfBombKeywords` / `cfBombPhrases` **确有 id**（同视图 `id="cfBombKeywords"` /
   `id="cfBombPhrases"`），`:has(#id)` 有效，予以保留（对隐藏行同样无害）。 */
.qt-shell .qt-config-row:has(input[name="cfBombFilter"]),
.qt-shell .qt-config-row:has(#cfBombKeywords),
.qt-shell .qt-config-row:has(#cfBombPhrases) { border-left-color: var(--bw-c-red); }
/* ── 配置行内的单选药丸（关闭/开启）：[v7] 按行分色 + 四态可点击（契约 §6.2/§6.3）──
   作用域限定 `.qt-shell .qt-config-row .qt-radio-group label`：该组合**仅 code-filter-set
   的配置行**命中 → 完全不触及 §11 的基础三合一（`.qt-radio-group label` / `:hover` /
   `:has(input:checked)`），那组被 code-status 的三个弹窗与 copy-codes 勾选组共用。
   · 未选态（非 :has()，老内核降级兜底）：开关行 = blue 族浅底（`-bg`）+ blue 描边 + blue-ink
     —— **保证降级时仍是有色底而非纸白**（§1.3）；
   · 防炸行未选态 = red 族浅底（与行色条同族）；阈值行（#cfStaySeconds）无 radio，不受影响；
   · 「开启」选中 = green 族**渐变实底 + 反白**（比「关闭」醒目，§6.1/§6.2）；
   · 「关闭」选中 = slate 深档（slate-bg-h 底 + slate 描边 + slate-ink，保持低层级）；
   · 悬停：**同特异性补 :hover**（`-bg-h`），否则上面这些静态规则会把 §11 的悬停反馈吃掉。 */
.qt-shell .qt-config-row .qt-radio-group label {
    border-color: var(--bw-c-blue);
    background-color: var(--bw-c-blue-bg);
    color: var(--bw-c-blue-ink);
    /* 基础三合一只过渡 background/border-color/color（禁改），这里在自有作用域内补上
       box-shadow 与 transform 的过渡，避免「开启」选中态的渐变与 hover 抬升瞬跳。 */
    transition: background-color var(--bw-transition), border-color var(--bw-transition),
                color var(--bw-transition), box-shadow var(--bw-transition),
                transform var(--bw-transition);
}
.qt-shell .qt-config-row .qt-radio-group label:hover {
    border-color: var(--bw-c-blue);
    background-color: var(--bw-c-blue-bg-h);
    color: var(--bw-c-blue-ink);
}
.qt-shell .qt-config-row:has(input[name="cfBombFilter"]) .qt-radio-group label {
    border-color: var(--bw-c-red);
    background-color: var(--bw-c-red-bg);
    color: var(--bw-c-red-ink);
}
.qt-shell .qt-config-row:has(input[name="cfBombFilter"]) .qt-radio-group label:hover {
    border-color: var(--bw-c-red);
    background-color: var(--bw-c-red-bg-h);
    color: var(--bw-c-red-ink);
}
/* 未选与「关闭」选中 = slate 族（低层级）；仅用 input[value="0"] 限定，避免命中弹窗里
   value 语义不同的单选组（qrType/直跳模式）。 */
.qt-shell .qt-config-row .qt-radio-group label:has(input[value="0"]:checked) {
    border-color: var(--bw-c-slate);
    background-color: var(--bw-c-slate-bg-h);
    color: var(--bw-c-slate-ink);
    box-shadow: none;
}
/* 「开启」选中 = green 族渐变实底 + 反白（静态 background-color 为老内核兜底；渐变 §6.1 放行） */
.qt-shell .qt-config-row .qt-radio-group label:has(input[value="1"]:checked) {
    border-color: var(--bw-c-green);
    background-color: var(--bw-c-green);
    background-image: linear-gradient(135deg, var(--bw-c-green), var(--bw-c-green-ink));
    color: var(--bw-text-inverse);
    font-weight: 600;
    box-shadow: 0 1px 3px color-mix(in srgb, var(--bw-c-green) 38%, transparent);
}
.qt-shell .qt-config-row .qt-radio-group label:has(input[value="1"]:checked):hover {
    border-color: var(--bw-c-green-ink);
    background-color: var(--bw-c-green-ink);                  /* 老内核兜底（同族加深） */
    background-color: color-mix(in srgb, var(--bw-c-green) 82%, var(--bw-ink));
    background-image: linear-gradient(135deg, var(--bw-c-green-ink), var(--bw-c-green-ink));
    background-image: linear-gradient(135deg,
        color-mix(in srgb, var(--bw-c-green) 84%, var(--bw-ink)),
        color-mix(in srgb, var(--bw-c-green-ink) 84%, var(--bw-ink)));
    color: var(--bw-text-inverse);
    transform: translateY(-1px);
    box-shadow: 0 3px 9px color-mix(in srgb, var(--bw-c-green) 44%, transparent);
}
.qt-shell .qt-config-label {
    width: 190px;
    flex-shrink: 0;
    color: var(--bw-text-primary);
    font-size: 13.5px;
    font-weight: 600;
}
/* 提示：中性暖灰（覆盖共享 quick-tools.css 的粉红字 #f56c6c 默认值） */
.qt-shell .qt-config-hint {
    color: var(--bw-text-muted-on-tint);
    font-size: 12px;
    font-weight: 400;
    line-height: 1.5;
}

/* ═══════════════════════════════════════════════════════════════════════════
   13. 弹窗与遮罩（L1 关键层：唯一保留 1px 墨描边的容器）
═══════════════════════════════════════════════════════════════════════════ */
.qt-shell .qt-modal-overlay {
    /* 遮罩：只用墨令牌派生 —— 第一行是不支持 color-mix 的旧浏览器兜底（--bw-divider 即
       10% 墨的中性值），第二行由 --bw-ink 经 color-mix 压到 56%，全程不写色值字面量。
       不使用 backdrop-filter（本皮肤为平面长卷风，且共享遮罩本就无模糊需求）。 */
    background: var(--bw-divider);
    background: color-mix(in srgb, var(--bw-ink) 56%, transparent);
}
/* 弹窗：纸面底 + 1px 墨描边（L1）+ 唯一模糊影令牌 --bw-shadow-overlay（契约指定） */
.qt-shell .qt-modal {
    width: 420px;
    max-width: calc(100vw - 32px);
    max-height: 90vh;
    overflow-y: auto;
    padding: 24px;
    border: 1px solid var(--bw-border-ink);
    border-radius: var(--bw-radius-md);
    background-color: var(--bw-paper);
    background-image: none;
    box-shadow: var(--bw-shadow-overlay);
}
.qt-shell .qt-modal h3 {
    display: flex;
    align-items: center;
    gap: 10px;
    margin: 0 0 18px;
    color: var(--bw-text-primary);
    font-size: 17px;
    font-weight: 600;
}
.qt-shell .qt-modal h3::before {
    content: '';
    width: 3px;
    height: 16px;
    flex-shrink: 0;
    border-radius: var(--bw-radius-xs);
    background: var(--bw-accent);    /* v6：弹窗标题条 → --bw-accent（契约 §2.1） */
}
.qt-shell .qt-modal-footer {
    display: flex;
    justify-content: flex-end;
    gap: 10px;
    margin-top: 20px;
}
.qt-shell .qt-modal-footer button {
    height: 34px;                    /* v6 压缩：原 36 */
    padding: 0 20px;
    border: 1px solid var(--bw-c-slate);
    border-radius: var(--bw-radius-sm);
    font-family: var(--bw-font);
    font-size: 14px;
    font-weight: 600;
    cursor: pointer;
    transition: background var(--bw-transition), border-color var(--bw-transition),
                color var(--bw-transition), box-shadow var(--bw-transition);
}
/* 取消 / 返回 = 中性导航 → slate 族彩底（原「纸底 + 深灰字」） */
.qt-shell .qt-modal-footer .cancel {
    border-color: var(--bw-c-slate);
    background: var(--bw-c-slate-bg);
    color: var(--bw-c-slate-ink);
    box-shadow: none;
}
.qt-shell .qt-modal-footer .cancel:hover {
    background: var(--bw-c-slate-bg-h);
    border-color: var(--bw-c-slate);
    color: var(--bw-c-slate-ink);
}
/* 确认 = 紫檀主按钮（查询/提交主按钮，契约允许的强调色位置） */
.qt-shell .qt-modal-footer .confirm {
    border-color: var(--bw-accent);
    background-color: var(--bw-accent);
    background-image: none;
    color: var(--bw-text-inverse);
    box-shadow: var(--bw-shadow-stamp);
}
.qt-shell .qt-modal-footer .confirm:hover {
    background-color: var(--bw-accent-hover);
    border-color: var(--bw-accent-hover);
    box-shadow: var(--bw-shadow-stamp);
}

/* ═══════════════════════════════════════════════════════════════════════════
   14. 批量下载弹窗（覆盖 ai-download-batch-modal.css 的蓝灰配色）
═══════════════════════════════════════════════════════════════════════════ */
/* 尺寸：该文件的 .qt-modal.ai-download-batch-modal 与 .qt-shell .qt-modal 特异性相同
   且位于本文件之前，会被基础弹窗规则覆盖，因此这里按原值重新声明（含三档响应式）。 */
.qt-shell .qt-modal.ai-download-batch-modal {
    width: min(1080px, 94vw);
    max-width: 1080px;
    max-height: 90vh;
    padding: 24px;
    overflow: hidden;
}
.qt-shell .ai-download-pane-title {
    color: var(--bw-text-primary);
    font-weight: 600;
}
.qt-shell .ai-download-selected-count {
    color: var(--bw-text-muted-on-tint);
    font-variant-numeric: tabular-nums;
}
.qt-shell .ai-download-table-wrap {
    border: 1px solid var(--bw-divider);
    border-radius: 0;
    background-color: transparent;
}
.qt-shell .ai-download-table th,
.qt-shell .ai-download-table td {
    border-bottom: 1px solid var(--bw-divider);
    color: var(--bw-text-primary);
}
/* 该表头是 position:sticky（容器可滚动），必须用不透明背衬，否则行内容会透出；
   与主表统一为 --bw-bg-sunken 暖灰（仍不透明、仍灰阶），下边框同 1px --bw-hairline。 */
.qt-shell .ai-download-table th {
    background-color: var(--bw-bg-sunken);
    background-image: none;
    border-bottom: 1px solid var(--bw-hairline);
    color: var(--bw-text-secondary);
    font-weight: 600;
}
.qt-shell .ai-download-table tr:hover td { background: var(--bw-bg-hover); }
.qt-shell .ai-download-current-link { color: var(--bw-text-muted-on-tint); }
.qt-shell .ai-download-current-link.empty { color: var(--bw-c-amber-ink); }
.qt-shell .ai-download-row-input {
    height: 34px;
    border: 1px solid var(--bw-border-strong);
    border-radius: var(--bw-radius-sm);
    background: var(--bw-paper);
    color: var(--bw-text-primary);
    font-family: var(--bw-font);
}
.qt-shell .ai-download-row-input:focus {
    border-color: var(--bw-accent);
    box-shadow: var(--bw-focus-ring);
}
.qt-shell .ai-download-batch-pane { border-left: 1px solid var(--bw-divider); }
/* AI 批量动作钮（填入全部 / 仅填未设置项等，属于「生成/填入」类工具动作）
   契约 §2.1：AI 批量动作钮 = blue 族 `-bg` 彩底 + blue 描边 + blue-ink */
.qt-shell .ai-download-batch-actions button {
    height: 34px;
    border: 1px solid var(--bw-c-blue);
    border-radius: var(--bw-radius-sm);
    background: var(--bw-c-blue-bg);
    color: var(--bw-c-blue-ink);
    font-family: var(--bw-font);
    font-weight: 600;
    cursor: pointer;
    transition: background var(--bw-transition), color var(--bw-transition),
                border-color var(--bw-transition);
}
.qt-shell .ai-download-batch-actions button:hover {
    background: var(--bw-c-blue-bg-h);
    border-color: var(--bw-c-blue);
    color: var(--bw-c-blue-ink);
}
/* [v8修复 #5] AI 批量动作钮补 focus / active 两态（§6.2 四态可点击性） */
.qt-shell .ai-download-batch-actions button:focus-visible {
    outline: none;
    box-shadow: var(--bw-focus-ring);
}
.qt-shell .ai-download-batch-actions button:active:not(:disabled) {
    background-color: var(--bw-c-blue);
    border-color: var(--bw-c-blue);
    color: var(--bw-text-inverse);
    transform: translateY(1px);
}
.qt-shell .ai-download-empty-note { color: var(--bw-text-muted-on-tint); }

/* ═══════════════════════════════════════════════════════════════════════════
   15. 图片预览浮层（由 quick-tools.js 生成，位置固定）
═══════════════════════════════════════════════════════════════════════════ */
.qt-img-overlay {
    background: var(--bw-divider);
    background: color-mix(in srgb, var(--bw-ink) 68%, transparent);
}
.qt-img-overlay img {
    border-radius: var(--bw-radius-md);
    border: 1px solid var(--bw-border-ink);
    box-shadow: var(--bw-shadow-overlay);
}

/* ═══════════════════════════════════════════════════════════════════════════
   16. Toast 反馈条（浮动通知 = L1：墨描边 + 左侧语义条 + 柔影）
   .qt-toast 是 .qt-shell 的兄弟节点（在 shell 之外），因此这里不能加 shell 前缀；
   该文件仅在 view_override=heibaiyun 时加载，且 .qt-toast 是既有类名，不会波及其他品牌。
═══════════════════════════════════════════════════════════════════════════ */
.qt-toast {
    right: 22px;
    bottom: 22px;
    max-width: min(78vw, 380px);
    padding: 11px 18px 11px 16px;
    border: 1px solid var(--bw-border-ink);
    border-left-width: 4px;
    border-left-color: var(--bw-c-slate);
    border-radius: var(--bw-radius-md);
    /* v6：底改中性 slate 族 tint（不再是纸底 + 近黑字；契约 §2.1「Toast 底改对应族 -tint」） */
    background-color: var(--bw-c-slate-tint);
    background-image: none;
    color: var(--bw-c-slate-ink);
    font-family: var(--bw-font);
    font-size: 14px;
    font-weight: 600;
    line-height: 1.5;
    box-shadow: var(--bw-shadow-overlay);
    animation: bw-qt-toast-in .22s var(--bw-ease);
}
/* Toast 语义族对齐：底/文字/左条同族（底 = -tint，字 = -ink，条 = base）。
   必须显式清掉共享 quick-tools.css 的 `.qt-toast.ok/.err{background:linear-gradient(...)}`
   —— 那是**简写**（含 background-image）且特异性 (0,2,0) 高于本文件的 `.qt-toast` 基类，
   只写 background-color 会留下共享的深色渐变把 `-tint` 盖掉。 */
.qt-toast.ok {
    border-left-color: var(--bw-c-green);
    background-color: var(--bw-c-green-tint);
    background-image: none;
    color: var(--bw-c-green-ink);
}
.qt-toast.err {
    border-left-color: var(--bw-c-red);
    background-color: var(--bw-c-red-tint);
    background-image: none;
    color: var(--bw-c-red-ink);
}
.qt-toast.warn {
    border-left-color: var(--bw-c-amber);
    background-color: var(--bw-c-amber-tint);
    background-image: none;
    color: var(--bw-c-amber-ink);
}
@keyframes bw-qt-toast-in {
    from { opacity: 0; transform: translate(0, 10px); }
    to   { opacity: 1; transform: translate(0, 0); }
}

/* ═══════════════════════════════════════════════════════════════════════════
   17. 内联样式兜底（共享视图/JS 写死的行内颜色，只能靠 !important 覆盖）
   —— 本节集中放置，逐条注明理由，不在此之外滥用 !important
═══════════════════════════════════════════════════════════════════════════ */
/* (1) 共享视图中直接写死颜色（#64748b / #888 / #606266）的说明文字：
       页首说明 <p>、弹窗说明 <p>、表格工具栏统计 <span>、输入计数 #ducInputCount。
       内联 color 的优先级高于任何普通规则，必须 !important。 */
.qt-shell .qt-card > p[style],
.qt-shell .qt-modal > p[style],
.qt-shell .qt-table-toolbar span[style],
.qt-shell #ducInputCount {
    color: var(--bw-text-secondary) !important;
}
/* (2) 表格空状态/占位单元格的内联灰字（共享视图 + quick-tools.js 生成）。
       用 [text-align:center] + [color] 双重条件限定，避免命中带语义色的数据单元格
       （如 ip-filter-set 的三个数值列 / 卡密激活状态列），那些见 (3b)。 */
.qt-shell .qt-table tbody td[style*="text-align:center"][style*="color"] {
    color: var(--bw-text-muted-on-tint) !important;
}
/* (3) quick-tools.js 在表格内生成的内联颜色 */
/* 3a 蓝色残留必须消除：#2563eb（"● 在线"）→ 契约 §2.1「在线 = green 药丸 + 绿点」
       （药丸底 green-tint / 字 green-ink / 描边 30%；● 由同色渲染成绿点）；
       #278bdc（下载链接 <a>）→ 墨色下划线链接（纯文本链接非按钮，不参与 §1.3 彩底要求）。
       本块 !important 理由：颜色与 700 字重由共享 JS 内联写死（内联优先级最高）。 */
.qt-shell .qt-table tbody td span[style*="#2563eb"] {
    display: inline-block;
    padding: 1px 8px;
    border: 1px solid color-mix(in srgb, var(--bw-c-green) 30%, var(--bw-paper));
    border-radius: var(--bw-radius-pill);
    background: var(--bw-c-green-tint);
    color: var(--bw-c-green-ink) !important;
    font-weight: 600 !important;      /* 内联写死 700，契约禁止 700+ */
}
.qt-shell .qt-table a[style] {
    color: var(--bw-ink) !important;
    text-decoration: underline;
    word-break: break-all;
}
.qt-shell .qt-table a[style]:hover { color: var(--bw-ink-hover) !important; }
/* 3b 内联语义状态色 → 语义【药丸】（契约 §2.1：状态列/布尔列 span = `-tint` 底 + `-ink` 字
       + 30% 描边 + pill；已激活/有效/无效/未进入落地页 → 各语义族）。
       同块的 td 级内联色（ip-filter-set 的进粉/已过滤/过滤完三列数值）仍为彩色数字，
       文字色改同族 ink（契约 §1.2：base 只作条/边框/图形，不当文字色）。 */
.qt-shell .qt-table tbody td span[style*="color:green"],
.qt-shell .qt-table tbody td span[style*="#22c55e"] {
    display: inline-block;
    padding: 1px 8px;
    border: 1px solid color-mix(in srgb, var(--bw-c-green) 30%, var(--bw-paper));
    border-radius: var(--bw-radius-pill);
    background: var(--bw-c-green-tint);
    color: var(--bw-c-green-ink) !important;
    font-weight: 600 !important;      /* 内联写死 700（#22c55e 的「已激活」） */
}
.qt-shell .qt-table tbody td span[style*="color:red"],
.qt-shell .qt-table tbody td span[style*="#dc2626"] {
    display: inline-block;
    padding: 1px 8px;
    border: 1px solid color-mix(in srgb, var(--bw-c-red) 30%, var(--bw-paper));
    border-radius: var(--bw-radius-pill);
    background: var(--bw-c-red-tint);
    color: var(--bw-c-red-ink) !important;
    font-weight: 600 !important;
}
.qt-shell .qt-table tbody td span[style*="#d97706"] {
    display: inline-block;
    padding: 1px 8px;
    border: 1px solid color-mix(in srgb, var(--bw-c-amber) 30%, var(--bw-paper));
    border-radius: var(--bw-radius-pill);
    background: var(--bw-c-amber-tint);
    color: var(--bw-c-amber-ink) !important;
}
.qt-shell .qt-table tbody td[style*="#16a34a"] { color: var(--bw-c-green-ink) !important; }
.qt-shell .qt-table tbody td[style*="#dc2626"] { color: var(--bw-c-red-ink) !important; }
.qt-shell .qt-table tbody td[style*="#d97706"] { color: var(--bw-c-amber-ink) !important; }
/* 3c 内联中性灰提示（未激活 / 视频消息 / 未提取到链接 / 最后图片占位）→ 暖灰弱化档。
       其中 #cbd5e1 是共享 JS 的极浅灰占位符（对白底对比度约 1.6:1，不达标），一并纠正。 */
.qt-shell .qt-table tbody td span[style*="#94a3b8"],
.qt-shell .qt-table tbody td span[style*="color:#999"],
.qt-shell .qt-table tbody td span[style*="#cbd5e1"] {
    color: var(--bw-text-muted-on-tint) !important;
}
/* (4) code-filter-set 中内联写死的红色警示提示（color:#dc2626）：改危险族 ink + 语义文字；
       普通提示见 .qt-config-hint（中性暖灰）。 */
.qt-shell .qt-config-hint[style] {
    color: var(--bw-c-red-ink) !important;
    font-weight: 600;
}
/* (5) 共享视图中写死的淡绿"成功"结果条（4 个 id，内联 background:#f0faf0 等）：
       v6 契约 §2.1「结果条 → 底改对应族 `-tint`，字用 `-ink`」+ 左侧 3px 松烟绿条。
       本行 !important 理由：这些 id 的底色/文字色/边框由共享视图内联写死，内联优先级最高。 */
.qt-shell #copyResultSummary,
.qt-shell #replaceResultSummary,
.qt-shell #ducSummary,
.qt-shell #duSummary {
    border: 0 !important;
    border-left: 3px solid var(--bw-c-green) !important;
    border-radius: var(--bw-radius-sm) !important;
    background: var(--bw-c-green-tint) !important;
    color: var(--bw-c-green-ink) !important;
    font-weight: 600;
}
/* (6) 共享视图中写死内联背景色的按钮，统一为紫檀主按钮（§1.3：不留共享彩色底）。
       [v8修复 #4] 兜底收窄为 :not([onclick*="downloadUrlCheckRun"])：把「立即查询」(download-url-check)
       让给下方 Run 绿规则（其内联 #f5b544 琥珀底改由绿规则以 !important 接管）；
       其余内联背景按钮（copy-codes 的「下载链接检查」，内联 #34d399→#16a34a 绿渐变）
       仍由本兜底上色（保持它对其它内联背景按钮的作用）。
       本块 !important 理由：这些按钮的背景/文字由共享视图内联写死（内联优先级最高）。 */
.qt-shell .qt-btn[style*="background"]:not([onclick*="downloadUrlCheckRun"]) {
    border-color: var(--bw-accent) !important;
    background-color: var(--bw-accent) !important;
    background-image: none !important;
    color: var(--bw-text-inverse) !important;
    box-shadow: var(--bw-shadow-stamp) !important;
}
.qt-shell .qt-btn[style*="background"]:not([onclick*="downloadUrlCheckRun"]):hover {
    border-color: var(--bw-accent-hover) !important;
    background-color: var(--bw-accent-hover) !important;
    color: var(--bw-text-inverse) !important;
}

/* ── [v6/v8] 动作按钮按「后果」着色（§1.4）：同一类名在不同板块语义不同，
      这里用 onclick 钩子精确指派，且置于 [style*=background] 兜底之后以确保胜出 ── */
.qt-shell .qt-btn-warning[onclick*="Export"] {   /* 导出 Excel（ip-filter-set）→ 黛青实底 */
    border-color: var(--bw-c-blue);
    background-color: var(--bw-c-blue);
    color: var(--bw-text-inverse);
}
.qt-shell .qt-btn-warning[onclick*="Export"]:hover:not(:disabled) {
    background-color: var(--bw-c-blue-ink);
}
/* 立即查询（download-url-check）→ 松烟绿实底（§1.4「查询 = green」）。
   [v8修复 #4] 紫檀兜底已收窄排除 Run，故绿规则生效；:not(:disabled) 保留「禁用=虚线灰」。 */
.qt-shell .qt-btn[onclick*="downloadUrlCheckRun"]:not(:disabled) {
    border-color: var(--bw-c-green);
    background-color: var(--bw-c-green);
    background-image: none;
    color: var(--bw-text-inverse);
}
.qt-shell .qt-btn[onclick*="downloadUrlCheckRun"]:not(:disabled):hover {
    border-color: var(--bw-c-green-ink);
    background-color: var(--bw-c-green-ink);
    color: var(--bw-text-inverse);
}
/* [v8修复 #4] 内联琥珀底覆盖：**仅**「立即查询」带内联 background（#f5b544），
   而其紫檀兜底已被收窄移除 → 必须 !important 才能压过内联色。
   本条用 [style*=background] 双重限定，故 copyCodesRun（无内联背景）不命中它，
   由下方橙色写操作规则接管 —— 满足 §6.3 零外溢（不串到 copy-codes 板块）。 */
.qt-shell .qt-btn[style*="background"][onclick*="downloadUrlCheckRun"]:not(:disabled) {
    border-color: var(--bw-c-green) !important;
    background-color: var(--bw-c-green) !important;
    background-image: none !important;
    color: var(--bw-text-inverse) !important;
}
.qt-shell .qt-btn[style*="background"][onclick*="downloadUrlCheckRun"]:not(:disabled):hover {
    border-color: var(--bw-c-green-ink) !important;
    background-color: var(--bw-c-green-ink) !important;
    color: var(--bw-text-inverse) !important;
}
/* [v8修复 #3/#4] Run 类按钮禁用态统一虚线灰：!important 理由同上（须压过「立即查询」的内联琥珀底） */
.qt-shell .qt-btn[onclick*="downloadUrlCheckRun"]:disabled {
    border-color: var(--bw-text-disabled) !important;
    border-style: dashed;
    background-color: var(--bw-bg-sunken) !important;
    background-image: none !important;
    color: var(--bw-text-disabled) !important;
    box-shadow: none !important;
}

/* ── [v8修复 #8] 写操作（§1.4「保存/写库/一键设置 = 陶土橙」）统一为橙色实底 + 反白：
      · 执行复制 copyCodesRun（copy-codes）/ 执行替换 replaceCodes（replace-codes）
        —— 原落 `.qt-btn-primary` 基础 = 松烟绿实底，与同页「一键替换 / 一键设置」的橙不一致；
      · 保存设置 ipFilterSave（ip-filter-set，`.qt-btn-warn`）—— 原落 amber-bg 淡底。
      深端一律 --bw-c-orange-ink（#8F4E22，反白 6.00；base #B4652F 反白仅 4.06 不得用于实底）。
      这三个按钮**均无内联背景**，故无需 !important；(三类名 + 属性钩子 + :not(:disabled))
      特异性 (0,5,0) 高于上面 Run 绿规则 (0,4,0) 与 `.qt-btn-warn` 基础，稳胜；
      :not(:disabled) 保证禁用态回落到 `.qt-btn:disabled` 的虚线灰（§6.2）。 */
.qt-shell .qt-btn.qt-btn-primary[onclick*="copyCodesRun"]:not(:disabled),
.qt-shell .qt-btn.qt-btn-primary[onclick*="replaceCodes"]:not(:disabled),
.qt-shell .qt-btn-warn[onclick*="ipFilterSave"]:not(:disabled) {
    border-color: var(--bw-c-orange);
    background-color: var(--bw-c-orange-ink);
    background-image: none;
    color: var(--bw-text-inverse);
    box-shadow: var(--bw-shadow-stamp);
}
.qt-shell .qt-btn.qt-btn-primary[onclick*="copyCodesRun"]:not(:disabled):hover,
.qt-shell .qt-btn.qt-btn-primary[onclick*="replaceCodes"]:not(:disabled):hover,
.qt-shell .qt-btn-warn[onclick*="ipFilterSave"]:not(:disabled):hover {
    border-color: var(--bw-c-orange-ink);
    background-color: color-mix(in srgb, var(--bw-c-orange) 86%, var(--bw-ink));
    background-image: none;
    color: var(--bw-text-inverse);
    /* 中性柔影：覆盖 `.qt-btn-primary:hover` 共享蓝色光晕（copyCodesRun/replaceCodes 是 primary） */
    box-shadow: var(--bw-shadow-xs);
}

/* ═══════════════════════════════════════════════════════════════════════════
   18. 响应式：≥1180px（宽屏的墨外壳内留白，v6 同样压缩；保留既有断点）
   —— 契约 §5 陷阱 1：本断点内有一份**独立**的 .qt-shell padding，必须与基础规则同改
═══════════════════════════════════════════════════════════════════════════ */
@media (min-width: 1180px) {
    .qt-shell { padding: 16px 22px 22px; }   /* v6 压缩：原 28px 32px 40px */
    .qt-shell:has(.qt-entry-grid) { padding: 0; }
    .qt-shell .qt-card-header { padding-left: 44px; padding-right: 44px; }
    .qt-shell .qt-entry-card { padding-left: 24px; padding-right: 52px; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   19. 响应式：≤768px（既有断点与收敛方向完整保留）
═══════════════════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* 墨外壳在窄屏收紧内留白（直角外壳不做圆角回落，保持长卷识别） */
    .qt-shell {
        padding: 16px 14px 30px;
        min-height: 100vh;
    }
    .qt-shell:has(.qt-entry-grid) { padding: 0; }

    .qt-shell .qt-card-header { padding: 20px 18px 18px; }
    .qt-shell .qt-card-header::after { width: 156px; height: 156px; top: -56px; right: -44px; }
    .qt-shell .qt-brand { gap: 12px; margin-bottom: 8px; }
    .qt-shell .qt-brand h2 { font-size: 19px; }
    /* 同 §2 理由：共享视图内联写死 logo 尺寸，窄屏尺寸也须 !important 才能压过内联样式 */
    .qt-shell .qt-brand img[style] { width: 42px !important; height: 42px !important; }
    .qt-shell .qt-card-header p { font-size: 12.5px; }

    .qt-shell .qt-entry-grid { grid-template-columns: minmax(0, 1fr); }
    .qt-shell .qt-entry-card { padding: 15px 40px 15px 17px; }
    .qt-shell .qt-entry-card::after { right: 17px; }

    .qt-shell .qt-topbar {
        grid-template-columns: 78px minmax(0, 1fr) 78px;
        margin-bottom: 18px;
    }
    .qt-shell .qt-back-btn { height: 32px; padding: 0 10px; font-size: 12.5px; }
    .qt-shell .qt-page-title { font-size: 17px; }

    .qt-shell .qt-field { padding-bottom: 15px; margin-bottom: 15px; }
    .qt-shell .qt-config-label { width: 100%; }
    .qt-shell .qt-config-row { gap: 10px; }

    .qt-shell .qt-btn { height: 42px; min-height: 42px; font-size: 14px; }
    /* 触控目标：≤768 内动作芯片不得跟随桌面降到 32px（契约 §3.4 / §4 验收） */
    .qt-shell .qt-action-kpi { min-height: 36px; padding: 7px 13px; }
    .qt-shell .qt-kpi-item { flex: 1 1 150px; padding: 11px 13px; }
    /* 触控目标：分页按钮/每页条数在窄屏抬回 34px（桌面已压到 30px） */
    .qt-shell .qt-pagination button { height: 34px; min-width: 34px; }
    .qt-shell .qt-page-size-select { height: 34px; }
    .qt-shell .qt-modal { padding: 20px 16px; }
    /* 批量下载弹窗在窄屏需可整体滚动（覆盖本文件基础尺寸规则） */
    .qt-shell .qt-modal.ai-download-batch-modal {
        width: 96vw;
        max-width: 96vw;
        max-height: 92vh;
        padding: 18px;
        overflow-y: auto;
    }
    .qt-shell .qt-table thead th { padding: 10px 12px; }
    .qt-shell .qt-table tbody td { padding: 10px 12px; }

    /* 批量下载弹窗：批处理面板由 ai-download-batch-modal.css 改为上下堆叠，
       这里只补充分隔线与内边距的品牌化 */
    .qt-shell .ai-download-batch-pane {
        padding: 14px 0 0;
        border-top: 1px solid var(--bw-divider);
        border-left: 0;
    }

    /* [v8修复 #6] 触控目标：契约 §3.4/§4 要求 ≤768 触控 ≥36px（原 30–34px）。
       与上方各条 height 并存——CSS 中 min-height 高于 height 时以 min-height 为准。 */
    .qt-shell .qt-back-btn,
    .qt-shell .qt-pagination button,
    .qt-shell .qt-page-size-select,
    .qt-shell .qt-modal-footer button,
    .qt-shell .qt-number-input {
        min-height: 36px;
    }
}

/* ═══════════════════════════════════════════════════════════════════════════
   20. 响应式：≤480px（既有断点与收敛方向完整保留）
═══════════════════════════════════════════════════════════════════════════ */
@media (max-width: 480px) {
    .qt-shell {
        padding: 13px 12px 26px;
        min-height: 100vh;
    }
    .qt-shell:has(.qt-entry-grid) { padding: 0; }

    .qt-shell .qt-card-header { padding: 18px 15px 17px; }
    .qt-shell .qt-card-header::after { width: 128px; height: 128px; top: -46px; right: -40px; }
    .qt-shell .qt-brand h2 { font-size: 17px; }
    /* 同 §2 理由：共享视图内联写死 logo 尺寸与圆角，小屏尺寸也须 !important 才能压过内联样式 */
    .qt-shell .qt-brand img[style] { width: 38px !important; height: 38px !important; padding: 5px; }

    .qt-shell .qt-entry-card { padding: 14px 34px 14px 15px; gap: 5px; }
    .qt-shell .qt-entry-card::after { right: 14px; width: 7px; height: 7px; margin-top: -4px; }
    .qt-shell .qt-entry-card .card-title { font-size: 14px; }
    .qt-shell .qt-entry-card .card-tag { font-size: 11.5px; }

    /* 2 列网格：返回按钮 + 标题同一行，尾部的空占位 div 独占零高第二行 */
    .qt-shell .qt-topbar {
        grid-template-columns: auto minmax(0, 1fr);
        gap: 8px;
        margin-bottom: 16px;
    }
    .qt-shell .qt-page-title { font-size: 16px; }
    .qt-shell .qt-back-btn { height: 30px; padding: 0 9px; font-size: 12px; }

    .qt-shell .qt-field { padding-bottom: 13px; margin-bottom: 13px; }
    .qt-shell .qt-label { font-size: 13.5px; }
    .qt-shell .qt-textarea { min-height: 92px; padding: 10px 11px; }
    .qt-shell .qt-input, .qt-shell .qt-select { height: 38px; padding: 0 11px; }
    .qt-shell .qt-password-field .qt-input { max-width: 100%; }

    .qt-shell .qt-btn { height: 40px; min-height: 40px; padding: 0 16px; font-size: 14px; }
    /* 小屏 KPI：留白收紧，并允许文案换行（避免 nowrap 在窄单元格里溢出到相邻格） */
    .qt-shell .qt-kpi-item { padding: 10px 12px; font-size: 12px; white-space: normal; }
    .qt-shell .qt-kpi-item strong { font-size: 14px; }
    .qt-shell .qt-action-kpi { min-height: 36px; padding: 8px 13px; font-size: 12.5px; }

    .qt-shell .qt-pagination { justify-content: center; gap: 8px; font-size: 12.5px; }
    .qt-shell .qt-page-size-select { height: 30px; }

    /* 弹窗近全屏，内部留白收紧 */
    .qt-shell .qt-modal {
        width: calc(100vw - 24px);
        max-width: calc(100vw - 24px);
        max-height: 88vh;
        padding: 18px 15px;
    }
    .qt-shell .qt-modal h3 { font-size: 16px; }
    .qt-shell .qt-modal-footer { flex-wrap: wrap; }
    .qt-shell .qt-modal-footer button { flex: 1 1 auto; min-width: 110px; }
    /* 批量下载弹窗：小屏保持 96vw，留白进一步收紧 */
    .qt-shell .qt-modal.ai-download-batch-modal {
        width: 96vw;
        max-width: 96vw;
        max-height: 90vh;
        padding: 15px;
    }
    .qt-shell .ai-download-batch-actions { grid-template-columns: 1fr; }

    /* Toast 通栏 */
    .qt-toast {
        right: 12px;
        left: 12px;
        bottom: 12px;
        max-width: none;
    }

    /* [v8修复 #6] 触控目标：契约 §3.4/§4 要求 ≤480 同样 ≥36px（原 30–34px）。 */
    .qt-shell .qt-back-btn,
    .qt-shell .qt-pagination button,
    .qt-shell .qt-page-size-select,
    .qt-shell .qt-modal-footer button,
    .qt-shell .qt-number-input {
        min-height: 36px;
    }
}

/* ═══════════════════════════════════════════════════════════════════════════
   21. 动效偏好
   —— 这里的两处 !important 只覆盖时长（不涉及布局/可见性），用于无障碍偏好，
      与 theme.css 的处理方式一致，因此不受"仅在内联兜底处使用"的限制
═══════════════════════════════════════════════════════════════════════════ */
@media (prefers-reduced-motion: reduce) {
    .qt-shell *,
    .qt-shell *::before,
    .qt-shell *::after,
    .qt-toast {
        transition-duration: .01ms !important;
        animation-duration: .01ms !important;
    }
}

/* ═══════════════════════════════════════════════════════════════════════════
   [v8/v9] 可视强度：可点芯片 hover **实底反白**（一眼可点）
   · 常驻底档位已在基础块统一（.qt-kpi-item / .qt-action-kpi 均 -bg-h 30%），
     本块不再重复声明常驻底 → 单一真源，避免「基础块写 -bg、这里写 -bg-h」的自相矛盾。
   · hover 实底用 --k（同族 base）；orange 族 base 反白仅 4.06（<4.5）→
     hover 改用同族深端 --bw-c-orange-ink（反白 7.07）。
   · 全部静态令牌，不依赖 color-mix。
   [v9] 取消 orange 常驻 22% 例外：30% 底上 orange-ink 实测 4.56:1（≥4.5 达 AA）；
     此前记录的 4.22 是把 base 当字色的误算（芯片字色是 --k-ink）。统一档位后，
     同一屏的 KPI 芯片不再出现「其中两个浅一档」的观感不一致。
   ═══════════════════════════════════════════════════════════════════════════ */
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter]:hover:not(.qt-active) {
    background-color: var(--k);
    color: var(--bw-text-inverse);
    box-shadow: inset 3px 0 0 var(--k-ink), inset 0 0 0 1px var(--k-ink);
    /* [v9修复] 清共享 quick-tools.css:585 `.qt-kpi-item.qt-clickable:hover{filter:brightness(1.06)}`
       的残留：hover 已是实底反白，再叠 6% 提亮会把反白对比度往下拉。 */
    filter: none;
}
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter]:hover:not(.qt-active) span,
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter]:hover:not(.qt-active) strong {
    color: var(--bw-text-inverse);
}
/* orange 族 hover 实底例外（base 实底白字仅 4.06） */
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="quick_exit"]:hover:not(.qt-active),
.qt-shell .qt-kpi-grid .qt-kpi-item[data-ip-filter="proxy"]:hover:not(.qt-active) {
    background-color: var(--bw-c-orange-ink);
}
.qt-shell .qt-action-kpi:hover:not(:disabled) {
    background-color: var(--k);
    color: var(--bw-text-inverse);
    /* [v9修复] 清共享 quick-tools.css:603 `.qt-action-kpi:hover{opacity:.9}` 的残留：
       半透明会让实底反白整体变淡（§6.2 状态编码不得只靠透明度）。 */
    opacity: 1;
}
.qt-shell .qt-action-kpi:hover:not(:disabled) span,
.qt-shell .qt-action-kpi:hover:not(:disabled) strong { color: inherit; }
.qt-shell .qt-action-kpi.orange:hover:not(:disabled) { background-color: var(--bw-c-orange-ink); }
