/* =====================================================================
 * theme-v5.css — V10 全站重设计实装层（v2.1.28）
 * ---------------------------------------------------------------------
 * 设计原则（Redesign · Preserve）：
 *   1. 只做视觉覆盖，不改任何功能契约（路由/权限/数据/事件全保真）
 *   2. 加载顺序在 theme-v4 之后，同名选择器以本文件为准
 *   3. 品牌渐变收敛：检查页仅「AI 记录隐患」保留渐变（AI 专属身份标识），
 *      其余按钮统一清爽白底描边；分组选中态浅蓝高亮
 *   4. 色彩令牌：品牌蓝 #4f7cff / 深蓝 #3b5bdb / 隐患 var(--hz-st-danger) /
 *      合规 var(--hz-st-ok) / 警示 #b54708 / 发丝线 #e2e8f0
 * ===================================================================== */

/* ---------- ① 检查页顶栏：仅「AI 记录隐患」保留品牌渐变 ---------- */
/* 反转 theme-v4 的「五按钮全渐变」：检查记录(.fab-rec) / 协同检查(.fab-share) 回归清爽 */
.fab-rec,
.fab-share:not(.insp-ai-btn),
.insp-top-right .fab-rec,
.insp-top-right .fab-share:not(.insp-ai-btn){
  background:#ffffff !important;
  color:var(--ink-2,#0f172a) !important;
  border:1px solid var(--line,#e2e8f0) !important;
  box-shadow:0 1px 2px rgba(15,23,42,.05) !important;
}
.fab-rec:hover,
.fab-share:not(.insp-ai-btn):hover{
  background:#f6f8fb !important;
  border-color:#cfd6e2 !important;
  transform:translateY(-1px);
  filter:none !important;
}
/* AI 记录隐患：唯一品牌渐变胶囊（不覆盖，theme-v4 的 .insp-ai-btn 渐变继续生效） */

/* 删除任务等危险按钮保持红字白底（若被 danger 渐变误伤则拉回） */
.insp-top-right .btn.sm.ghost,
.insp-top-right button.ghost{
  background:#fff !important;
  color:var(--ink-2,#0f172a);
  border:1px solid var(--line,#e2e8f0) !important;
  box-shadow:0 1px 2px rgba(15,23,42,.05) !important;
}

/* ---------- ② 中栏搜索按钮：清爽白底描边 ---------- */
.mid-search-btn{
  background:#fff !important;
  color:var(--ink-2,#0f172a) !important;
  border:1px solid var(--line,#e2e8f0) !important;
  box-shadow:0 1px 2px rgba(15,23,42,.05) !important;
}
.mid-search-btn:hover{
  background:#f6f8fb !important;
  border-color:#cfd6e2 !important;
}

/* ---------- ③ 检查部位框：显眼渐变描边容器 + 浅蓝标签 ---------- */
.j59-part-bar{
  padding:8px 11px;
  background:linear-gradient(135deg,#f5f8ff,#fbf6ff);
  border:1.5px solid #c9d6fe;
  border-radius:11px;
  box-shadow:0 1px 6px rgba(76,125,255,.10);
}
.j59-part-lb{
  display:inline-flex;
  align-items:center;
  gap:5px;
  background:#eaf0fe;
  color:#3b5bdb;
  border:1px solid #d6e2fb;
  font-weight:800;
  border-radius:8px;
  padding:4px 10px;
}
#j59-part-input,.j59-part-input{
  background:#fff;
  border:1px solid #d9e1f5;
  border-radius:8px;
  padding:5px 10px;
  font-size:12px;
}
#j59-part-input:focus,.j59-part-input:focus{border-color:#b9cbf7;}

/* ---------- ④ 两级分组标签：清爽胶囊 + 浅蓝选中态 ---------- */
.hz-sub{
  background:#fff;
  border:1px solid var(--line,#e2e8f0);
  color:#475569;
  border-radius:999px;
  font-weight:600;
}
.hz-sub:hover{
  border-color:#b9cbf7;
  color:#3b5bdb;
  background:#fff;
}
.hz-sub.hz-sub-on{
  background:#eaf0fe;
  border-color:#b9cbf7;
  color:#3b5bdb;
}
.hz-subbars{
  padding-bottom:9px;
  margin-bottom:10px;
}

/* ---------- ⑤ 中栏分组头：重大事故隐患 / 隐患库隐患 ---------- */
.hz-group-head{
  display:flex;
  align-items:center;
  gap:8px;
  border-radius:10px;
  padding:7px 11px;
  margin:2px 0 9px;
  font-size:12px;
  line-height:1.4;
}
.hz-group-head b{font-size:12px;flex:none;}
.hz-group-head .sub{
  font-size:9.5px;
  opacity:.78;
  font-weight:400;
  min-width:0;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.hz-group-head .cnt{
  margin-left:auto;
  font-size:10px;
  font-weight:800;
  flex:none;
  background:rgba(255,255,255,.75);
  border-radius:999px;
  padding:1px 8px;
}
.hz-group-head.major{background:#fef2f1;border:1px solid #f3c2be;color:var(--hz-st-danger);}
.hz-group-head.major .cnt{color:var(--hz-st-danger);}
.hz-group-head.lib{background:#eaf2fe;border:1px solid #d6e2fb;color:#3b5bdb;}
.hz-group-head.lib .cnt{color:#3b5bdb;}

/* ---------- ⑥ 隐患库卡三面板：标签头彩色胶囊化 ---------- */
/* 真机结构：hz-check(现场核查) / hz-rc(风险后果) / hz-advice(整改建议) */
.hz-check,
.hz-rc,
.hz-advice{
  border-radius:10px;
  padding:7px 9px;
  display:flex;
  gap:7px;
  align-items:flex-start;
  margin-top:6px;
}
.hz-check{background:#f5f8ff;border:1px solid #e3eafb;}
.hz-rc{background:#fef9f0;border:1px solid #f5e5c8;}
.hz-advice{background:#f0fdf9;border:1px solid #b8e8dc;}
.hz-tag{
  flex:none;
  font-size:9.5px;
  font-weight:800;
  border-radius:6px;
  padding:2px 7px;
  letter-spacing:.5px;
}
.hz-check .hz-tag{background:#eaf0fe;color:#3b5bdb;}
.hz-rc .hz-tag{background:#fef3e2;color:#b54708;}
.hz-advice .hz-tag{background:#d8f3ea;color:#0f766e;}
/* ★ 2026-09-30 M1 收尾：原此处三条 `.hz-tag::before{content:"🔍/⚠️/💡 "}` 已**删除**。
   它们是**死代码** —— 本文件下方 `html:not([data-theme="dark"]) … {content:"" !important}` 早已清空前缀；
   而深色主题 2026-09-29 已整体下线（M3 删首屏脚本 + route() 每次强制摘 `data-theme`），
   ⇒ `html:not([data-theme="dark"])` **恒为真** ⇒ 这三个 emoji 在线上从来就看不见（改前真浏览器截图已印证）。
   设计意图本就是「hz-tag 不加前缀图标」，故**不做成线性图标**，直接清掉。 */
/* 真机 hz-tag 内已写死 emoji 时去重：v2.1.28 渲染层不再手写 emoji（CSS 注入） */
.hz-body{font-size:11px;color:var(--ink-2,#334155);line-height:1.65;min-width:0;}
.hz-advice-h{flex:none;font-size:9.5px;font-weight:800;color:#0f766e;background:#d8f3ea;border-radius:6px;padding:2px 7px;}
.hz-advice-b{font-size:11px;color:var(--ink-2,#334155);line-height:1.65;min-width:0;}

/* ---------- ⑦ 卡片左边线语义色：重大红 / 隐患库蓝 ---------- */
.item-card.item-major{border-left:3px solid #f3c2be;}
.item-card.item-atlas{border-left:3px solid #c9d6fe;}
.item-card.item-atlas.item-sel,
.item-card.item-major.item-sel{border-left-color:#4f7cff;}

/* ---------- ⑧ 工作台：积分卡与统计卡微调（对齐设计稿） ---------- */
.rank-card{transition:box-shadow .2s var(--spring,ease),transform .15s ease;}
.rank-card:hover{box-shadow:0 4px 14px -6px rgba(15,23,42,.18);}
.dash-grid3{align-items:stretch;}
/* V2.2.47：原为 .dash-grid3 > *{min-height:118px}（用意是让首行 3 张卡等高）；
   .dash-duo 也是直接子元素，会被一并撑到 118px 造成并排按钮过高 → 显式排除。 */
.dash-grid3 > *:not(.dash-duo){min-height:118px;}

/* ---------- ⑨ 工程详情任务卡：协同按钮（fab 无关，.s-btn 渐变误伤防护） ---------- */
.session-item .s-btn{
  background:#fff;
  color:var(--ink-2,#0f172a);
  border:1px solid var(--line,#e2e8f0);
}
.session-item .s-btn:hover{background:#f6f8fb;border-color:#cfd6e2;}
.session-item .s-btn.danger{color:#dc2626;border-color:#f3c2be;background:#fff;}
.session-item .s-btn.danger:hover{background:#fef2f1;}

/* ---------- ⑩ 动效令牌（全局统一） ---------- */
.hz-group-head,
.j59-part-bar,
.mid-search-btn,
.hz-sub{
  transition:background .15s cubic-bezier(.22,1,.36,1),border-color .15s cubic-bezier(.22,1,.36,1),box-shadow .2s;
}

/* ---------- ⑪ 移动端同步（窄屏与 APK WebView） ---------- */
@media (max-width:768px){
  .fab-rec,.fab-share{padding:5px 10px;font-size:11.5px;}
  .j59-part-bar{padding:7px 9px;}
  .hz-group-head .sub{display:none;}
  .hz-group-head .cnt{margin-left:auto;}
}

/* =====================================================================
 * ⑫ 工作台与全局美化（V10 设计稿实装 · v2.1.29 美术支线批次）
 * ===================================================================== */

/* ---- 12.1 首行三卡：开始检查 / 知识库（紧凑卡 + 副文案 + hover 抬升） ---- */
.dash-act{
  border-radius:14px;
  border-top:none;
  padding:18px 18px;
  gap:13px;
  align-items:center;
}
.dash-act .da-ico{
  width:46px;height:46px;
  border-radius:13px;
  font-size:23px;font-weight:700;
  display:flex;align-items:center;justify-content:center;
  flex:0 0 auto;
}
.dash-act.act-new .da-ico{background:#eaf7f0;color:var(--hz-st-ok);}
.dash-act.act-kb .da-ico{background:#eaf0fe;color:#3b5bdb;}
.dash-act.act-kb .da-ico svg{width:22px;height:22px;}
.dash-act .da-t{font-size:14.5px;font-weight:800;letter-spacing:-.01em;}
.dash-act .da-sub{
  font-size:10.5px;
  color:var(--muted,#94a3b8);
  margin-top:3px;
  font-weight:500;
}
.dash-act:hover{transform:translateY(-2px);box-shadow:0 8px 22px -8px rgba(15,23,42,.22);}

/* ---- 12.2 积分卡（您的积分）：徽章行与数字层级对齐设计稿 ---- */
.rank-card.rank-me .rk-h{
  font-size:13px;font-weight:800;color:var(--ink-2,#0f172a);
  display:flex;align-items:center;gap:6px;
}
.rank-card .rk-h svg{flex:0 0 auto;}
.rank-card .rk-body{font-size:11px;}
.rank-card .rk-body .empty{font-size:10.5px;}

/* ---- 12.3 检索卡：渐变描边增强 ----
   V2.1.31b 修复：v3 基础样式给 .dash-search-card 设了 color:#fff（配合深色渐变），
   v5 把背景换成浅色渐变却没改文字色 → 手机端白字白底看不清。 */
.dash-search-card{
  border:1.5px solid #c9d6fe;
  background:linear-gradient(135deg,#f5f8ff,#fbf6ff);
  box-shadow:0 1px 6px rgba(76,125,255,.10);
  color:#1e293b;
}
.dash-search-card .ds-tx b{color:var(--hz-ink-1);}
.dash-search-card .ds-tx span{color:#64748b;opacity:1;}
.dash-search-card .ds-ic{background:#e6ecfe;color:#3b5bdb;}
.dash-search-card .ds-go{color:#3b5bdb;font-weight:700;}

/* ---- 12.4 排名面板：卡片化 + 渐变竖条标题 ---- */
.panel{
  border:1px solid var(--hairline,var(--hz-line));
  border-radius:14px;
}
.panel-h{
  font-size:14px;font-weight:800;gap:9px;letter-spacing:-.01em;
}
.panel-h::before{
  content:"";
  width:3.5px;height:15px;border-radius:2px;
  background:linear-gradient(180deg,#4f7cff,#a855f7);
  flex:0 0 auto;
}

/* ---- 12.5 Top10 双列并排（移动端单列） ---- */
.dash-t10-grid{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:12px;
  align-items:start;
}
.dash-t10-grid .panel{margin:0;}
@media (max-width:920px){
  .dash-t10-grid{grid-template-columns:1fr;}
}

/* ---- 12.6 排名条：编号圆徽 + 渐变进度条 + 数值右对齐 ---- */
.rank-item{display:flex;align-items:center;gap:10px;padding:5px 2px;}
.rank-item .idx{
  width:18px;height:18px;border-radius:50%;
  background:#e4e7ee;color:#667085;
  font-size:10px;font-weight:800;
  display:flex;align-items:center;justify-content:center;
  flex:0 0 auto;
}
.rank-item .idx.top{background:linear-gradient(135deg,#4f7cff,#a855f7);color:#fff;}
.rank-item .name{flex:1;min-width:0;}
.rank-item .name .t{
  font-size:12px;color:var(--ink-2,#0f172a);font-weight:600;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.rank-item .name .bar{height:5px;border-radius:99px;background:#eef1f5;margin-top:4px;}
.rank-item .name .bar > i{
  background:linear-gradient(90deg,#4f7cff,#7a5cff);
  border-radius:99px;
}
.rank-item .num{
  font-family:var(--num,inherit);
  font-size:12.5px;font-weight:800;color:var(--ink-2,#0f172a);
  width:26px;text-align:right;flex:0 0 auto;
}

/* ---- 12.7 统计卡：数值与副文案层级 ---- */
.stat-card .v{
  font-size:21px;font-weight:800;letter-spacing:-.02em;
  font-variant-numeric:tabular-nums;
}
.stat-card .l{font-size:11px;font-weight:700;color:var(--ink-2,#334155);}
.stat-card .sub{font-size:9.5px;}

/* ---- 12.8 空态弱化居中 ---- */
.panel .empty{
  text-align:center;
  font-size:11.5px;
  color:var(--muted,#94a3b8);
  padding:18px 8px;
}

/* ---- 12.9 左栏：分组小标题 + 选中/hover 胶囊态 ---- */
.nav-group{
  font-size:9.5px;font-weight:800;letter-spacing:.08em;
  color:#94a3b8;
  padding:12px 13px 4px;
  text-transform:uppercase;
}
.nav-item{
  border-radius:10px;
  font-weight:600;
}
.nav-item:hover{background:#f1f4fa;}
.nav-item.on,
.nav-item.active{
  background:#eaf0fe;
  color:#3b5bdb;
}

/* ---- 12.10 监督之星并排区：等高卡片 ---- */
.dash-rank{align-items:stretch;}
.dash-rank .rank-card{display:flex;flex-direction:column;}
.dash-rank .rank-card .rk-body{flex:1;}

/* =====================================================================
 * ⑬ 工作台高感知视觉批次（v2.1.29 美术支线批次②）
 * 目标：一眼可辨——统计卡彩色顶条渐变化、三卡渐变描边、面板头部底色、
 *       检索框精修、左栏品牌渐变、工作区背景微渐变、空态装饰
 * ===================================================================== */

/* ---- 13.1 工作区背景：冷灰蓝微渐变，托出白卡层次 ---- */
main#view, .app-main{
  background:linear-gradient(180deg,#f6f8fb 0%,#f3f5fa 100%);
}

/* ---- 13.2 统计卡（严格按设计稿 s3）：白底+hairline 边+底部 3px 细色条+27px 大数字 ---- */
.stat-card{
  background:#fff !important;
  border:1px solid var(--hairline,var(--hz-line)) !important;
  border-top:1px solid var(--hairline,var(--hz-line)) !important;
  border-radius:14px;
  position:relative;overflow:hidden;
}
.stat-card::after{
  content:"";position:absolute;left:0;right:0;bottom:0;height:3px !important;
  display:block !important; /* 对抗 styles.css:954 的 display:none!important */
}
.stat-card.blue::after{background:linear-gradient(90deg,#4f7cff,#60a5fa);}
.stat-card.red::after{background:linear-gradient(90deg,var(--hz-st-danger),#f97066);}
.stat-card.green::after{background:linear-gradient(90deg,var(--hz-st-ok),#12b76a);}
.stat-card.orange::after{background:linear-gradient(90deg,#dc6803,#f59e0b);}
.stat-card .v{
  font-family:var(--disp,"Manrope","Noto Sans SC",sans-serif);
  font-size:26px !important;font-weight:700 !important;letter-spacing:-.03em;line-height:1.05;
  font-variant-numeric:tabular-nums;
}
.stat-card.blue .v{color:#1849a9;}
.stat-card.red .v{color:var(--hz-st-danger);}
.stat-card.green .v{color:var(--hz-st-ok);}
.stat-card.orange .v{color:#dc6803;}
.stat-card.blue + .stat-card.blue .v{color:#1849a9;}

/* ---- 13.3 首行三卡：渐变描边 + 图标渐变底 ---- */
.dash-act{
  border:1.5px solid transparent;
  background:linear-gradient(#ffffff,#ffffff) padding-box,
             linear-gradient(135deg,#c9d6fe,#e4d9fb) border-box;
}
.dash-act.act-new .da-ico{
  background:linear-gradient(135deg,#e2f6ec,#d1f0e2);color:var(--hz-st-ok);
}
.dash-act.act-kb .da-ico{
  background:linear-gradient(135deg,#e4ecff,#e9e2ff);color:#3b5bdb;
}

/* ---- 13.4 面板头部：浅渐变底色条（圆角上沿通栏） ---- */
.panel{overflow:hidden;}
.panel-h{
  margin:-16px -16px 12px;
  padding:11px 16px;
  background:linear-gradient(90deg,#f6f9ff,#fbf9ff 70%,#fdfbff);
  border-bottom:1px solid #eef1f8;
}
.panel .panel-h + *{margin-top:2px;}

/* ---- 13.5 顶部检索框：精修胶囊 ---- */
.h-search{
  background:linear-gradient(135deg,#f5f8ff,#fbf6ff);
  border:1.5px solid #d9e1f5;
  border-radius:999px;
  box-shadow:0 1px 6px rgba(76,125,255,.08);
}
.h-search:hover{
  border-color:#b9cbf7;
  background:linear-gradient(135deg,#eef4ff,#f8f2ff);
  box-shadow:0 3px 12px rgba(76,125,255,.16);
}

/* ---- 13.6 左栏品牌块：渐变底 + 顶栏标题层级 ---- */
.brand{
  border-radius:12px;
}
.logo-ic{
  box-shadow:0 2px 8px rgba(76,125,255,.35);
}

/* ---- 13.7 空态装饰：弱圆环图标感 ---- */
.panel .empty{position:relative;}
.panel .empty::before{
  content:"";
  display:block;
  width:34px;height:34px;margin:0 auto 8px;
  border-radius:50%;
  background:
    radial-gradient(circle at 50% 50%,#eef2fb 0 42%,transparent 44%),
    linear-gradient(135deg,#e6ecfa,#f0e9fb);
  opacity:.9;
}

/* ---- 13.8 双星卡：渐变细顶条 ---- */
.dash-rank .rank-card{border-top:3px solid transparent;
  background:linear-gradient(#fff,#fff) padding-box,linear-gradient(90deg,#f59e0b,#f97316) border-box;
  border:3px solid transparent;background-clip:padding-box,border-box;}
.dash-rank .rank-card:last-child{
  background:linear-gradient(#fff,#fff) padding-box,linear-gradient(90deg,#4f7cff,#a855f7) border-box;
}


/* ---- 13.9 任务卡按钮体系（严格按设计稿 s4）：协同=info tinted 文字钮 / 删除=灰字 / 进入=ghost ---- */
html:not([data-theme="dark"]) .session-item .s-btn{
  background:#fff;
  border:1px solid var(--hairline-strong,var(--hz-line-strong));
  color:var(--sub,#475467);
  font-weight:600;
  border-radius:9px;
}
html:not([data-theme="dark"]) .session-item .s-btn:hover{background:#f7faff;border-color:#b9cbf7;color:#3b5bdb;}
html:not([data-theme="dark"]) .session-item .s-btn[onclick*="shareSessionBtn"]{
  background:var(--info-bg,#eaf0fe);
  border-color:transparent;
  color:var(--info,#3b5bdb);
}
html:not([data-theme="dark"]) .session-item .s-btn[onclick*="shareSessionBtn"]:hover{background:#dfe9fd;}
html:not([data-theme="dark"]) .session-item .s-btn.danger{
  background:#fff;
  border-color:var(--hairline-strong,var(--hz-line-strong));
  color:var(--sub,#475467);
}
html:not([data-theme="dark"]) .session-item .s-btn.danger:hover{background:#fef3f2;border-color:#f4b6b0;color:var(--hz-st-danger);}

/* =====================================================================
 * ⑭ 全站横扫（V10 设计稿系统落地 · 美术批次③）
 * 范围：通用卡片 / 弹窗 / 抽屉 / 登录页 / Toast / 表单 focus / 徽章 chip
 * 保护：暗色模式（[data-theme="dark"]）下本段白底覆盖不生效，维持原暗色
 * ===================================================================== */

/* ---- 14.0 作用域：亮色模式限定（暗色全跳过） ---- */

/* ---- 14.1 通用卡片全家：白底+发丝边+圆角14+hover 抬升描边品牌色 ---- */
html:not([data-theme="dark"]) .card,
html:not([data-theme="dark"]) .proj-card,
html:not([data-theme="dark"]) .session-item,
html:not([data-theme="dark"]) .item-card,
html:not([data-theme="dark"]) .rank-card,
html:not([data-theme="dark"]) .mo-card{
  border:1px solid var(--line,var(--hz-line));
  border-radius:14px;
  transition:transform .2s cubic-bezier(.22,1,.36,1),box-shadow .22s,border-color .2s;
}
html:not([data-theme="dark"]) .card:hover,
html:not([data-theme="dark"]) .proj-card:hover,
html:not([data-theme="dark"]) .session-item:hover,
html:not([data-theme="dark"]) .item-card:hover{
  transform:translateY(-2px);
  border-color:#c6d3f5;
  box-shadow:0 2px 4px rgba(16,24,40,.05),0 10px 28px -8px rgba(16,24,40,.12);
}

/* ---- 14.2 弹窗全家：quota-modal / qm 头部体系 ---- */
html:not([data-theme="dark"]) .quota-modal{
  border:1px solid var(--hz-line);
  border-radius:16px;
  box-shadow:0 4px 8px rgba(16,24,40,.06),0 28px 64px -20px rgba(16,24,40,.24);
  overflow:hidden;
}
html:not([data-theme="dark"]) .quota-modal .qm-h{
  margin:-20px -20px 14px;
  padding:13px 20px;
  background:linear-gradient(90deg,#f6f9ff,#fbf9ff 70%,#fdfbff);
  border-bottom:1px solid #eef1f8;
  font-size:14.5px;font-weight:800;color:var(--hz-ink-1);
  display:flex;align-items:center;gap:8px;
}
html:not([data-theme="dark"]) .quota-modal .qm-x{
  margin-left:auto;
  width:28px;height:28px;border-radius:8px;
  display:flex;align-items:center;justify-content:center;
  color:#98a2b3;cursor:pointer;
  transition:background .15s,color .15s;
}
html:not([data-theme="dark"]) .quota-modal .qm-x:hover{background:#eef1f8;color:var(--hz-ink-1);}
html:not([data-theme="dark"]) .quota-modal .qm-tip{
  background:#f5f8ff;border:1px solid #e3eafb;border-radius:10px;
  padding:8px 11px;font-size:12px;color:#475467;
}
html:not([data-theme="dark"]) .quota-modal .qm-btns .btn{
  border-radius:12px;
}

/* ---- 14.3 抽屉：头部底色条 + 圆角 ---- */
html:not([data-theme="dark"]) .drawer{
  border-left:1px solid var(--hz-line);
  box-shadow:-12px 0 40px -12px rgba(16,24,40,.22);
}
html:not([data-theme="dark"]) .drawer .dr-h,
html:not([data-theme="dark"]) .drawer .drawer-h{
  background:linear-gradient(90deg,#f6f9ff,#fbf9ff);
  border-bottom:1px solid #eef1f8;
}

/* ---- 14.4 登录页：浅色重设计（V10 s14） ---- */
html:not([data-theme="dark"]) .login-mask{
  background:
    radial-gradient(900px 520px at 78% -12%,rgba(122,92,255,.16),transparent),
    radial-gradient(760px 460px at 8% 108%,rgba(76,125,255,.14),transparent),
    linear-gradient(160deg,#eef2fa 0%,#e9edf8 55%,#efe9f8 100%);
}
html:not([data-theme="dark"]) .login-card{
  border:1px solid var(--hz-line);
  border-radius:18px;
  box-shadow:0 4px 8px rgba(16,24,40,.06),0 28px 64px -20px rgba(16,24,40,.24);
}
html:not([data-theme="dark"]) .login-card input[type="text"],
html:not([data-theme="dark"]) .login-card input[type="password"],
html:not([data-theme="dark"]) .login-card input{
  border:1px solid var(--hz-line-strong);border-radius:10px;
  transition:border-color .15s,box-shadow .15s;
}
html:not([data-theme="dark"]) .login-card input:focus{
  outline:none;border-color:#4c7dff;box-shadow:0 0 0 3px rgba(76,125,255,.18);
}
html:not([data-theme="dark"]) .login-card .btn,
html:not([data-theme="dark"]) .login-card button[type="submit"],
html:not([data-theme="dark"]) .login-card .login-btn{
  background:linear-gradient(135deg,#4c7dff 0%,#7a5cff 52%,#ec4899 100%);
  border:none;border-radius:999px;color:#fff;font-weight:650;
  box-shadow:0 2px 4px rgba(16,24,40,.10),0 10px 26px -8px rgba(96,80,220,.45);
}

/* ---- 14.5 Toast：白底品牌描边（设计稿 s10） ---- */
html:not([data-theme="dark"]) .toast{
  background:#fff;
  color:var(--hz-ink-1);
  border:1px solid #c9d6fe;
  border-left:4px solid var(--hz-brand);
  border-radius:12px;
  box-shadow:0 4px 8px rgba(16,24,40,.06),0 18px 44px -14px rgba(16,24,40,.28);
  font-weight:600;
}

/* ---- 14.6 表单 focus ring 品牌化（全局） ---- */
html:not([data-theme="dark"]) input:focus,
html:not([data-theme="dark"]) select:focus,
html:not([data-theme="dark"]) textarea:focus{
  border-color:var(--hz-brand);
  box-shadow:0 0 0 3px rgba(76,125,255,.16);
}

/* ---- 14.7 徽章体系：设计稿 badge 四色胶囊 ---- */
html:not([data-theme="dark"]) .badge{border-radius:999px;font-weight:600;}

/* ---- 14.8 移动端 tabbar：白底+顶部发丝线+选中品牌色 ---- */
html:not([data-theme="dark"]) .tabbar{
  background:#fff;
  border-top:1px solid var(--hz-line);
}
html:not([data-theme="dark"]) .tabbar .tab.on,
html:not([data-theme="dark"]) .tabbar .tab.active{color:#3b5bdb;}

/* ---- 14.9 检查页「记入检查记录」等主动作：品牌蓝实底（v4 渐变收敛的兄弟规则） ---- */
html:not([data-theme="dark"]) .j59-rec-btn,
html:not([data-theme="dark"]) button[onclick*="j59Record"]{
  background:#3b5bdb;
}

/* ---- 14.10 工程详情：返回钮回归清爽描边（设计稿 s4 返回为白底） ---- */
html:not([data-theme="dark"]) .back-btn{
  background:#fff !important;
  color:var(--ink-2,#0f172a) !important;
  border:1px solid var(--line,#e2e8f0) !important;
  box-shadow:0 1px 2px rgba(15,23,42,.05) !important;
}
html:not([data-theme="dark"]) .back-btn:hover{background:#f6f8fb !important;border-color:#cfd6e2 !important;}

/* ---- 14.11 知识库阅读页（北京指南）底色统一 ---- */
html:not([data-theme="dark"]) .hz-reading-detail,
html:not([data-theme="dark"]) .law-detail{
  background:#fff;
}


/* ---- 14.13 指南依据弹窗（j59-dw）V10 化：头部底色条 / tab 胶囊化 / 卡片圆角 ---- */
html:not([data-theme="dark"]) .j59-dw-head{
  background:linear-gradient(90deg,#f6f9ff,#fbf9ff 70%,#fdfbff);
  border-bottom:1px solid #eef1f8;
}
html:not([data-theme="dark"]) .j59-dw-tabs{
  background:#fbfcff;
}
html:not([data-theme="dark"]) .j59-dw-tabs button,
html:not([data-theme="dark"]) .j59-dw-tabs .j59-dw-tab{
  border-radius:999px !important;
  transition:background .15s,color .15s;
}
html:not([data-theme="dark"]) .j59-dw-close{border-radius:9px;transition:background .15s;}
html:not([data-theme="dark"]) .j59-dw-close:hover{background:#eef1f8;color:var(--hz-ink-1);}

/* ---- 14.11b 隐患库三面板（设计稿图2）：去底色框/去emoji，标签=纯彩字，行紧凑 ---- */
html:not([data-theme="dark"]) .hz-check,
html:not([data-theme="dark"]) .hz-rc,
html:not([data-theme="dark"]) .hz-advice{
  background:transparent !important;
  border:none !important;
  border-radius:0 !important;
  padding:1px 0 !important;
  margin-top:5px !important;
  display:flex;gap:9px;align-items:baseline;
}
html:not([data-theme="dark"]) .hz-check .hz-tag,
html:not([data-theme="dark"]) .hz-rc .hz-tag,
html:not([data-theme="dark"]) .hz-advice .hz-tag,
html:not([data-theme="dark"]) .hz-advice-h{
  background:transparent !important;
  border:none !important;
  padding:0 !important;
  border-radius:0 !important;
  font-size:11px !important;
  font-weight:700;
  flex:0 0 auto;
}
html:not([data-theme="dark"]) .hz-check .hz-tag{color:#2563eb;}
html:not([data-theme="dark"]) .hz-rc .hz-tag{color:#d97706;}
html:not([data-theme="dark"]) .hz-advice .hz-tag,
html:not([data-theme="dark"]) .hz-advice-h{color:#0f766e;}
/* CSS 注入的 emoji 前缀清空（HTML 内 emoji 由 app.js 文本级去除） */
html:not([data-theme="dark"]) .hz-check .hz-tag::before,
html:not([data-theme="dark"]) .hz-rc .hz-tag::before,
html:not([data-theme="dark"]) .hz-advice .hz-tag::before{content:"" !important;}
html:not([data-theme="dark"]) .hz-check .hz-body,
html:not([data-theme="dark"]) .hz-rc .hz-body,
html:not([data-theme="dark"]) .hz-advice-b{
  color:var(--hz-ink-2);font-weight:500;
}
/* 编号徽章：设计稿图2 蓝底白字 */
html:not([data-theme="dark"]) .session-item .i-no,
html:not([data-theme="dark"]) .item-card .i-no{
  background:linear-gradient(135deg,#4c7dff,#7a5cff);
  color:#fff;border-radius:7px;padding:2px 9px;
  font-weight:700;font-size:11px;
}


/* ---- 14.12 移动端同步（≤768px）---- */
@media (max-width:768px){
  html:not([data-theme="dark"]) .login-mask{
    background:
      radial-gradient(560px 380px at 80% -10%,rgba(122,92,255,.15),transparent),
      linear-gradient(165deg,#eef2fa,#e9edf8 60%,#efe9f8);
  }
}

/* =====================================================================
 * ⑮ 设计稿 s01~s15 逐板块落地（美术批次⑤ · 全量收尾）
 * s01 令牌/s02 动效 → 全局曲线与令牌；s08 AI弹窗；s09 记录抽屉；
 * s10 弹窗补充；s11 知识库；s12 AI页；s13 规范库；s15 设置
 * ===================================================================== */

/* ---- 15.0 全局动效令牌（s02）：统一曲线 ---- */
:root{
  --v5-ease:cubic-bezier(.22,1,.36,1);
  --v5-grad:linear-gradient(135deg,#4c7dff 0%,#7a5cff 52%,#ec4899 100%);
}
html:not([data-theme="dark"]) .btn,
html:not([data-theme="dark"]) .card,
html:not([data-theme="dark"]) .proj-card,
html:not([data-theme="dark"]) .session-item,
html:not([data-theme="dark"]) .item-card{
  transition-timing-function:cubic-bezier(.22,1,.36,1);
}

/* ---- 15.1 顶栏（s01）：白底圆角容器 + logo 渐变块 + 检索胶囊（13.5 已做） ---- */
html:not([data-theme="dark"]) .topbar-app{
  background:#fff;
  border-bottom:1px solid var(--hz-line);
}

/* ---- 15.2 s08 AI 记录隐患弹窗（#gm-ai）：V10 化 ---- */
html:not([data-theme="dark"]) #gm-ai{
  border:1px solid var(--hz-line) !important;
  border-radius:16px !important;
  box-shadow:0 4px 8px rgba(16,24,40,.06),0 28px 64px -20px rgba(16,24,40,.24) !important;
  overflow:hidden;
}
html:not([data-theme="dark"]) #gm-ai .gm-dir{
  border:1px solid #e3eafb;
  border-radius:11px;
  background:#f8faff;
}
html:not([data-theme="dark"]) #gm-ai .gm-dir-h{color:#3b5bdb;font-weight:800;}
html:not([data-theme="dark"]) #gm-ai .gm-dir-pick{
  border-radius:9px;
  transition:background .15s,border-color .15s;
}
html:not([data-theme="dark"]) #gm-ai .gm-input-row textarea,
html:not([data-theme="dark"]) #gm-ai .gm-edit-ta,
html:not([data-theme="dark"]) #gm-ai textarea,
html:not([data-theme="dark"]) #gm-ai input{
  border-radius:10px;
}
html:not([data-theme="dark"]) #gm-ai textarea:focus,
html:not([data-theme="dark"]) #gm-ai input:focus{
  border-color:var(--hz-brand) !important;
  box-shadow:0 0 0 3px rgba(76,125,255,.16) !important;
}
html:not([data-theme="dark"]) #gm-ai .mb-foot{
  border-top:1px solid #eef1f8;
  background:#fbfcff;
}
html:not([data-theme="dark"]) #gm-ai .mb-foot .btn{
  border-radius:12px;
}

/* ---- 15.3 s09 记录抽屉（#rec-drawer）：头部/记录卡/底部按钮 V10 化 ---- */
html:not([data-theme="dark"]) #rec-drawer{
  background:linear-gradient(180deg,#f6f8fb 0%,#f3f5fa 100%);
}
html:not([data-theme="dark"]) #rec-drawer .rec-seq{
  background:#eaf0fe;color:#3b5bdb;border-radius:8px;
  font-weight:800;
}
html:not([data-theme="dark"]) #rec-drawer .rec-time{color:#98a2b3;}
html:not([data-theme="dark"]) #rec-drawer .rec-src{
  color:#3b5bdb;background:#eaf0fe;border-radius:999px;padding:1px 9px;
  font-weight:600;
}
/* 抽屉底部动作按钮（内联渐变的统一收敛：整改通知书=品牌渐变/报告=品牌渐变，其余 ghost） */
html:not([data-theme="dark"]) #rec-drawer button[onclick*="genMergeDocs"],
html:not([data-theme="dark"]) #rec-drawer button[onclick*="genReport"],
html:not([data-theme="dark"]) #rec-drawer button[onclick*="genSpot"]{
  background:var(--v5-grad) !important;
  color:#fff !important;
  border:none !important;
  border-radius:12px !important;
  box-shadow:0 2px 4px rgba(16,24,40,.10),0 10px 26px -8px rgba(96,80,220,.45) !important;
  font-weight:650;
}
html:not([data-theme="dark"]) #rec-drawer button[onclick*="clearRecords"],
html:not([data-theme="dark"]) #rec-drawer button[onclick*="openRank"],
html:not([data-theme="dark"]) #rec-drawer button[onclick*="quiz"]{
  background:#fff !important;
  color:var(--ink-2,#0f172a) !important;
  border:1px solid var(--line,#e2e8f0) !important;
  border-radius:12px !important;
  box-shadow:0 1px 2px rgba(15,23,42,.05) !important;
}

/* ---- 15.4 s10 弹窗补充：检查结论 / 圈定范围 / 协同 / 搜索 / 删除确认 ---- */
html:not([data-theme="dark"]) .j59-concl-wrap,
html:not([data-theme="dark"]) .j59-scope-wrap,
html:not([data-theme="dark"]) .colab-pop,
html:not([data-theme="dark"]) .dir-search-pop,
html:not([data-theme="dark"]) .hz-del-pop,
html:not([data-theme="dark"]) .modal,
html:not([data-theme="dark"]) .modal-box{
  border:1px solid var(--hz-line);
  border-radius:16px;
  box-shadow:0 4px 8px rgba(16,24,40,.06),0 28px 64px -20px rgba(16,24,40,.24);
}

/* ---- 15.5 s11 知识库页：kb-card 图标卡 V10 化 ---- */
html:not([data-theme="dark"]) .kb-card{
  border:1px solid var(--hz-line);
  border-radius:14px;
  background:#fff;
  transition:transform .2s cubic-bezier(.22,1,.36,1),box-shadow .22s,border-color .2s;
}
html:not([data-theme="dark"]) .kb-card:hover{
  transform:translateY(-3px);
  border-color:#b9cbf7;
  box-shadow:0 2px 4px rgba(16,24,40,.05),0 14px 32px -10px rgba(16,24,40,.14);
}
html:not([data-theme="dark"]) .kb-card-ic{
  border-radius:12px;
}
html:not([data-theme="dark"]) .kb-chip{
  border-radius:999px;
}
html:not([data-theme="dark"]) .kb-go{color:#3b5bdb;font-weight:700;}

/* ---- 15.6 s13 规范库阅读页（law-*） ---- */
html:not([data-theme="dark"]) .law-back,
html:not([data-theme="dark"]) .law-btn{
  background:#fff;
  border:1px solid var(--line,#e2e8f0);
  border-radius:10px;
}
html:not([data-theme="dark"]) .law-crumb{color:#475467;}
html:not([data-theme="dark"]) .law-body-wrap{background:#fff;}

/* ---- 15.7 s15 设置/系统管理：表单卡片统一（14.1 卡片覆盖已生效，此处补表单行） ---- */
html:not([data-theme="dark"]) .form-row label{
  font-weight:700;color:var(--hz-ink-2);
}
html:not([data-theme="dark"]) .form-row input,
html:not([data-theme="dark"]) .form-row select{
  border-radius:10px;
}

/* ---- 15.8 s16 移动端：tabbar/部位框已同步；弹窗宽度自适应 ---- */
@media (max-width:768px){
  html:not([data-theme="dark"]) .quota-modal,
  html:not([data-theme="dark"]) #gm-ai{width:min(94vw,420px);}
}

/* =====================================================================
 * ⑯ 版心与密度对齐（根因修复：设计稿按 ~900px 版心设计，
 *    真机 1440 全宽渲染导致所有组件拉宽 1.7 倍——空洞松散的真正原因）
 * ===================================================================== */

/* ---- 16.1 版心限制：主内容区 1200px 居中（设计稿密度） ---- */
html:not([data-theme="dark"]) main#view{
  max-width:1200px;
  margin:0 auto;
  width:100%;
}

/* ---- 16.2 三卡行收紧（对齐设计稿 s3 比例） ---- */
.dash-act{padding:14px 16px;gap:11px;}
.dash-act .da-ico{width:38px;height:38px;border-radius:11px;font-size:19px;}
.dash-act.act-kb .da-ico svg{width:19px;height:19px;}
.dash-act .da-t{font-size:14px;}
.dash-act .da-sub{font-size:10px;margin-top:2px;}

/* ---- 16.3 统计卡收紧 ---- */
.stat-card{padding:12px 14px !important;}
.stat-card .v{font-size:24px !important;}
.stat-card .l{font-size:11px !important;}

/* ---- 16.4 面板与检索卡收紧 ---- */
.panel{padding:14px 16px;}
.panel-h{margin:-14px -16px 11px;padding:10px 16px;font-size:13.5px;}
.dash-search-card{padding:11px 14px;}

/* =====================================================================
 * ⑰ logo 三色渐变（设计稿 .toc .brand .mark）+ 任务卡结构样式（设计稿 s4 mock 精确值）
 * ===================================================================== */

/* ---- 17.1 logo：蓝→紫→粉三色渐变 34px（设计稿 --grad），替换旧蓝青渐变 ---- */
html:not([data-theme="dark"]) .logo-badge{
  width:34px;height:34px;border-radius:10px;
  background:linear-gradient(135deg,#4C7DFF 0%,#7A5CFF 52%,#EC4899 100%) !important;
  box-shadow:0 2px 4px rgba(16,24,40,.10),0 10px 26px -8px rgba(96,80,220,.45),inset 0 1px 0 rgba(255,255,255,.28);
}
html:not([data-theme="dark"]) .logo-badge::after{
  width:19px;height:19px;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='white' d='M12 2.5l7.5 2.8v5.7c0 4.6-3.1 8-7.5 10.5-4.4-2.5-7.5-5.9-7.5-10.5V5.3z'/%3E%3Cpath fill='%234C7DFF' d='M10.7 14.9l-2.6-2.6 1.5-1.5 1.1 1.1 3.6-3.6 1.5 1.5z'/%3E%3C/svg%3E") !important;
}
.side-logo .logo-tx b,
html:not([data-theme="dark"]) .logo-tx{font-weight:800;letter-spacing:-.01em;}

/* ---- 17.2 任务卡新结构（设计稿 s4 mock 精确值） ---- */
html:not([data-theme="dark"]) .session-item{
  border-radius:12px;
  padding:11px 13px;
  gap:11px;
}
html:not([data-theme="dark"]) .session-item .sic{
  width:32px;height:32px;border-radius:10px;
  background:#eaf0fe;
  display:flex;align-items:center;justify-content:center;
  flex:0 0 auto;
}
html:not([data-theme="dark"]) .session-item .s-row1{
  display:flex;align-items:center;gap:7px;flex-wrap:wrap;
}
html:not([data-theme="dark"]) .session-item .s-title{
  font-size:13px;font-weight:700;color:var(--hz-ink-1);
}
html:not([data-theme="dark"]) .session-item .badge.na{
  margin-left:0;
  font-size:11px;padding:2px 10px;
  color:#475467;background:#eff1f5;
}
html:not([data-theme="dark"]) .session-item .s-hz{
  font-size:11.5px;color:var(--hz-st-danger);font-weight:600;
}
html:not([data-theme="dark"]) .session-item .s-rg{
  font-size:11px;color:#98a2b3;
}
html:not([data-theme="dark"]) .session-item .s-row2{
  font-size:10.5px;color:#98a2b3;margin-top:3px;
}
html:not([data-theme="dark"]) .session-item .s-meta{display:none;}
html:not([data-theme="dark"]) .session-item .s-cotag{display:inline-flex;}

/* ---- 17.3 工程列表卡：同款设计语言（p-name 13px 精简/meta subtle） ---- */
html:not([data-theme="dark"]) .proj-card{padding:13px 15px;}
html:not([data-theme="dark"]) .proj-card .p-name{font-size:13.5px;font-weight:700;}
html:not([data-theme="dark"]) .proj-card .p-meta{font-size:10.5px;color:#98a2b3;line-height:1.7;}
html:not([data-theme="dark"]) .proj-card .p-edit,
html:not([data-theme="dark"]) .proj-card .p-del{
  background:#fff;border:1px solid var(--hz-line-strong);color:#475467;
  border-radius:8px;font-weight:600;
}
html:not([data-theme="dark"]) .proj-card .p-del:hover{background:#fef3f2;border-color:#f4b6b0;color:var(--hz-st-danger);}
html:not([data-theme="dark"]) .proj-card .p-edit:hover{background:#f6f8fb;border-color:#cfd6e2;color:var(--hz-ink-1);}

/* ---- 17.4 「进入 →」钮按设计稿转 ghost（渐变仅留主动作） ---- */
html:not([data-theme="dark"]) .session-item .s-go{
  background:#fff !important;
  color:var(--ink-2,#0f172a) !important;
  border:1px solid var(--line,#e2e8f0) !important;
  box-shadow:0 1px 2px rgba(15,23,42,.05) !important;
}
html:not([data-theme="dark"]) .session-item .s-go:hover{
  background:#f6f8fb !important;border-color:#cfd6e2 !important;color:#3b5bdb !important;
}

/* =====================================================================
 * ⑱ 依据弹窗复刻（设计稿图2）+ 工程详情复刻（设计稿图4）· 美术批次⑧
 * ===================================================================== */

/* ---- 18.1 指南依据弹窗：顶部三色渐变细条 + 图标底 ---- */
html:not([data-theme="dark"]) #j59-drawer{
  /* 保持原生 position:fixed 居中（styles.css:1838），不得覆盖 */
}
html:not([data-theme="dark"]) #j59-drawer::before{
  content:"";position:absolute;top:0;left:0;right:0;height:4px;
  background:linear-gradient(90deg,#4c7dff,#7a5cff 52%,#ec4899);
  z-index:2;
}
html:not([data-theme="dark"]) .j59-dw-ic{
  width:30px;height:30px;border-radius:9px;flex:0 0 auto;
  background:linear-gradient(135deg,#4c7dff,#7a5cff);
  display:flex;align-items:center;justify-content:center;
  box-shadow:0 2px 8px rgba(76,125,255,.3);
}
/* ---- 18.2 tabs 胶囊化：选中=三色渐变白字 ---- */
html:not([data-theme="dark"]) .j59-dw-tab{
  border-radius:999px !important;
  padding:7px 16px !important;
  background:transparent;
  color:#475467;font-weight:600;
  transition:background .18s,color .18s;
}
html:not([data-theme="dark"]) .j59-dw-tab:hover{background:#eef2fb;color:var(--hz-ink-1);}
html:not([data-theme="dark"]) .j59-dw-tab.on{
  background:linear-gradient(135deg,#4c7dff 0%,#7a5cff 52%,#ec4899 100%) !important;
  color:#fff !important;font-weight:700;
  box-shadow:0 4px 14px -4px rgba(122,92,255,.5);
}
/* ---- 18.3 说明横条：浅紫底 + 💡 ---- */
html:not([data-theme="dark"]) .j59-dw-tip{
  background:#f4f1fe;
  border:1px solid #e4dcfb;
  border-radius:10px;
  color:#5b4a9e;
  padding:8px 12px;
  font-size:12px;
}
/* M1 收尾：这处 💡 是 4 个里**唯一真正可见**的（上面三条是死代码），换成线性图标。
   ★ 为什么用 mask 而不是 content:url(svg)：content:url() 里的 SVG 拿不到 currentColor，
     图标颜色就死了；「mask + background-color:currentColor」才能跟着提示条文字色走。
   ★ path 与 icons.js 的 sparkle 是**同一份**（viewBox 0 0 24 24 / stroke 1.7 / round caps&joins）。
   ★★ 两个必须的转义（第一版就栽在这，症状 = 图标位置变成填满 currentColor 的实心方块）：
      ① path 数据里的**双引号**会把 CSS `url("…")` 提前闭合 ⇒ 整条声明失效 ⇒ 一律改单引号；
      ② 空格转 `%20` —— APK 跑的是 Android System WebView，老版本对裸空格更严。 */
html:not([data-theme="dark"]) .j59-dw-tip::before{
  content:"";
  display:inline-block;
  width:1.05em;height:1.05em;
  margin-right:.32em;
  vertical-align:-.14em;
  background-color:currentColor;
  -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
  -webkit-mask-position:center;mask-position:center;
  -webkit-mask-size:contain;mask-size:contain;
  -webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='%23000'%20stroke-width='1.7'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cpath%20d='M12%203l1.8%204.6L18.5%209.5l-4.7%201.9L12%2016l-1.8-4.6L5.5%209.5l4.7-1.9L12%203z'/%3E%3Cpath%20d='M19%2015l.9%202.3%202.1.7-2.1.8L19%2021l-.9-2.2-2.1-.8%202.1-.7L19%2015z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='%23000'%20stroke-width='1.7'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cpath%20d='M12%203l1.8%204.6L18.5%209.5l-4.7%201.9L12%2016l-1.8-4.6L5.5%209.5l4.7-1.9L12%203z'/%3E%3Cpath%20d='M19%2015l.9%202.3%202.1.7-2.1.8L19%2021l-.9-2.2-2.1-.8%202.1-.7L19%2015z'/%3E%3C/svg%3E");
}

/* ---- 18.4 工程信息卡：图标底 + 在检徽章 + 头部行 ---- */
html:not([data-theme="dark"]) .proj-card .p-head{
  display:flex;align-items:center;gap:10px;
  margin-bottom:8px;flex-wrap:wrap;
}
html:not([data-theme="dark"]) .proj-card .p-ic{
  width:32px;height:32px;border-radius:10px;flex:0 0 auto;
  background:#eaf0fe;
  display:flex;align-items:center;justify-content:center;
}
html:not([data-theme="dark"]) .proj-card .p-name{
  font-size:14px;margin:0;
}
html:not([data-theme="dark"]) .proj-card .p-live{
  font-size:10.5px;font-weight:700;
  color:var(--hz-st-ok);background:var(--hz-st-ok-bg);
  border-radius:999px;padding:2px 10px;
}
html:not([data-theme="dark"]) .proj-card .p-meta{
  font-size:10.5px;color:#98a2b3;line-height:1.8;
}

/* ---- 18.5 任务卡类型彩色图标底（s4 图4） ---- */
html:not([data-theme="dark"]) .session-item .sic{color:#3b5bdb;}
html:not([data-theme="dark"]) .session-item .sic.sic-purple{background:#f1ecfe;color:var(--hz-brand-2);}
html:not([data-theme="dark"]) .session-item .sic.sic-green{background:var(--hz-st-ok-bg);color:var(--hz-st-ok);}
html:not([data-theme="dark"]) .session-item .sic.sic-red{background:var(--hz-st-danger-bg);color:var(--hz-st-danger);}
/* 隐患 0 绿字 / 有隐患红字（s4 图4：隐患 0 绿、隐患 1 红） */
html:not([data-theme="dark"]) .session-item .s-hz.zero{color:var(--hz-st-ok);}
/* ---- 18.7 任务卡布局钉死：单行 flex，按钮组恒在右侧 ---- */
html:not([data-theme="dark"]) .session-item{
  flex-wrap:nowrap !important;
  align-items:center !important;
}
html:not([data-theme="dark"]) .session-item .s-main{
  flex:1 1 auto;min-width:0;
}
html:not([data-theme="dark"]) .session-item .s-foot{
  margin-left:auto;flex:0 0 auto;
  display:flex;gap:5px;align-items:center;
}

/* ---- 18.6 任务卡按钮 svg 对齐 ---- */
html:not([data-theme="dark"]) .session-item .s-btn{
  display:inline-flex;align-items:center;gap:4px;
}
html:not([data-theme="dark"]) .session-item .s-btn svg{flex:0 0 auto;}
html:not([data-theme="dark"]) .session-item .s-go{
  display:inline-flex;align-items:center;gap:3px;font-weight:700;
}

/* =====================================================================
 * ⑲ 三复刻收尾（美术批次⑩）：记录抽屉按钮三态 / AI 抽屉浅色复刻 / 知识库首页
 * ===================================================================== */

/* ---- 19.1 检查记录抽屉按钮（设计稿图2）：清空/排位赛/报告=白底一行；抽查记录=蓝紫渐变、整改通知书=紫粉渐变 ---- */
html:not([data-theme="dark"]) .drawer .d-foot{flex-wrap:wrap;gap:8px;}
html:not([data-theme="dark"]) #rec-drawer .rec-act-btn{
  background:#fff !important;
  color:var(--ink-2,#0f172a) !important;
  border:1px solid var(--line,#e2e8f0) !important;
  border-radius:999px !important;
  box-shadow:0 1px 2px rgba(15,23,42,.05) !important;
  font-weight:650;
  flex:1 1 0;
  padding:10px 0;
  transition:transform .15s var(--v5-ease),box-shadow .2s;
}
html:not([data-theme="dark"]) #rec-drawer .rec-act-btn:hover{background:#f6f8fb !important;border-color:#cfd6e2 !important;}
html:not([data-theme="dark"]) #rec-drawer #btn-spot{
  background:linear-gradient(135deg,#4c7dff 0%,#7a5cff 100%) !important;
  color:#fff !important;border:none !important;
  box-shadow:0 4px 14px -4px rgba(122,92,255,.5) !important;
}
html:not([data-theme="dark"]) #rec-drawer #btn-rectify{
  background:linear-gradient(135deg,#7a5cff 0%,#ec4899 100%) !important;
  color:#fff !important;border:none !important;
  box-shadow:0 4px 14px -4px rgba(236,72,153,.45) !important;
}
html:not([data-theme="dark"]) #rec-drawer .d-foot .rec-act-btn{flex:1 1 30%;}
html:not([data-theme="dark"]) #rec-drawer .d-foot #btn-spot,
html:not([data-theme="dark"]) #rec-drawer .d-foot #btn-rectify{flex:1 1 46%;}

/* ---- 19.2 AI 抽屉浅色复刻（设计稿图6） ---- */
html:not([data-theme="dark"]) .ai-drawer{background:#fff !important;}
/* 反压 theme-v3:960 的深蓝渐变 !important——设计稿图6/图2 头部为白底 */
html:not([data-theme="dark"]) .ai-drawer .ai-head{
  background:#fff !important;
  color:var(--hz-ink-1) !important;
  border-bottom:1px solid var(--hz-line) !important;
  box-shadow:none !important;
}
html:not([data-theme="dark"]) .ai-head h3{
  color:var(--hz-ink-1) !important;
}
html:not([data-theme="dark"]) .ai-head .ai-sub{
  color:#98a2b3 !important;
}
html:not([data-theme="dark"]) .ai-head button{
  color:#475469 !important;
  background:#f1f4f9 !important;
}
/* 头部渐变 AI 徽标（设计稿图2 左上角） */
html:not([data-theme="dark"]) .ai-gmark{
  width:30px;height:30px;border-radius:9px;flex:0 0 auto;
  background:linear-gradient(135deg,#4c7dff 0%,#7a5cff 52%,#ec4899 100%);
  color:#fff;font-size:12px;font-weight:800;letter-spacing:.02em;
  display:flex;align-items:center;justify-content:center;
  box-shadow:0 2px 8px rgba(122,92,255,.35);
  font-family:var(--disp,"Manrope","Noto Sans SC",sans-serif);
}
html:not([data-theme="dark"]) .ai-ic{display:none;}
html:not([data-theme="dark"]) .badge-ai{display:none;}
html:not([data-theme="dark"]) .ai-head h3{font-size:15.5px;font-weight:800;color:var(--hz-ink-1);margin:0;}
html:not([data-theme="dark"]) .ai-sub{font-size:11px;color:#98a2b3;}
html:not([data-theme="dark"]) .ai-head button{
  background:#f1f4f9;border:none;border-radius:9px;
  width:30px;height:30px;color:#475469;cursor:pointer;
}
html:not([data-theme="dark"]) .ai-head button:hover{background:#e6eaf2;}
/* 气泡：用户浅蓝右对齐 / AI 白底描边 */
html:not([data-theme="dark"]) .ai-msg.user .bubble{
  background:#e8f0fe;border:1px solid #d6e2fb;border-radius:14px 4px 14px 14px;
  color:var(--hz-ink-1);box-shadow:none;
}
html:not([data-theme="dark"]) .ai-msg.bot .bubble{
  background:#fff;border:1px solid var(--hz-line);border-top-left-radius:4px;
  box-shadow:0 1px 2px rgba(16,24,40,.05);
}
html:not([data-theme="dark"]) .ai-msg.bot .av{
  background:#eaf0fe;color:#3b5bdb;
  border:1px solid #d6e2fb;
}
/* 输入区：胶囊输入框 + 圆形箭头发送钮 */
html:not([data-theme="dark"]) .ai-input{
  background:#fff;border-top:1px solid var(--hz-line);
}
html:not([data-theme="dark"]) .ai-input textarea{
  border:1.5px solid var(--hz-line-strong) !important;
  border-radius:999px !important;
  padding:9px 16px !important;
  background:#fff;
  font-size:12.5px;
}
html:not([data-theme="dark"]) .ai-input textarea:focus{
  border-color:var(--hz-brand) !important;box-shadow:0 0 0 3px rgba(76,125,255,.14) !important;
}
html:not([data-theme="dark"]) .ai-input .ai-send{
  width:40px;height:40px;border-radius:50%;
  background:#fff;border:1.5px solid #c9d6fe;
  display:flex;align-items:center;justify-content:center;
  cursor:pointer;flex:0 0 auto;
  box-shadow:0 1px 6px rgba(76,125,255,.18);
  transition:transform .15s,box-shadow .2s;
}
html:not([data-theme="dark"]) .ai-input .ai-send:hover{
  transform:translateY(-1px);box-shadow:0 4px 14px -4px rgba(76,125,255,.4);
}

/* ---- 19.3 知识库首页（设计稿图4，无重复文字） ---- */
html:not([data-theme="dark"]) .kb-home-head{
  text-align:center;
  padding:26px 16px 20px;
}
html:not([data-theme="dark"]) .kb-home-t{
  font-family:var(--disp,"Manrope","Noto Sans SC",sans-serif);
  font-size:24px;font-weight:800;letter-spacing:-.02em;color:var(--hz-ink-1);
}
html:not([data-theme="dark"]) .kb-home-s{
  font-size:12px;color:#98a2b3;margin-top:6px;
}
html:not([data-theme="dark"]) .kb-home-search{
  display:flex;align-items:center;justify-content:center;gap:10px;
  margin:16px auto 6px;max-width:560px;
}
html:not([data-theme="dark"]) .kb-home-search input{
  flex:1;min-width:0;
  border:1.5px solid var(--hz-line-strong);border-radius:12px;
  padding:11px 16px;font-size:13px;color:var(--hz-ink-1);background:#fff;
  cursor:pointer;transition:border-color .15s;
}
html:not([data-theme="dark"]) .kb-home-search input:hover{border-color:#b9cbf7;}
html:not([data-theme="dark"]) .kb-home-search button{
  border:none;border-radius:12px;cursor:pointer;
  background:linear-gradient(135deg,#4c7dff 0%,#7a5cff 52%,#ec4899 100%);
  color:#fff;font-size:13px;font-weight:700;padding:11px 26px;
  box-shadow:0 4px 14px -4px rgba(122,92,255,.5);
  transition:transform .15s;
  font-family:inherit;
}
html:not([data-theme="dark"]) .kb-home-search button:hover{transform:translateY(-1px);}
/* 旧横幅/统计行隐藏（结构已不输出，兜底） */
html:not([data-theme="dark"]) .kb-hero,
html:not([data-theme="dark"]) .kb-stats{display:none !important;}
/* 分类卡线性图标四色 */
html:not([data-theme="dark"]) .kb-card-ic{width:38px;height:38px;border-radius:11px;display:flex;align-items:center;justify-content:center;}
html:not([data-theme="dark"]) .kb-card-ic.ic-purple{background:#f1ecfe;color:var(--hz-brand-2);}
html:not([data-theme="dark"]) .kb-card-ic.ic-green{background:var(--hz-st-ok-bg);color:var(--hz-st-ok);}
html:not([data-theme="dark"]) .kb-card-ic.ic-orange{background:#fef3e2;color:#dc6803;}
html:not([data-theme="dark"]) .kb-card-ic.ic-pink{background:#fdeef7;color:var(--hz-brand-3);}
html:not([data-theme="dark"]) .kb-card{padding:16px;}
html:not([data-theme="dark"]) .kb-card-t{font-size:14px;font-weight:800;color:var(--hz-ink-1);margin-top:10px;}
html:not([data-theme="dark"]) .kb-card-d{font-size:11.5px;color:#98a2b3;margin-top:4px;line-height:1.6;}

/* =====================================================================
 * ⑳ 两处布局修正（美术批次⑪）：AI 抽屉对齐图6窄条形态 / 知识库四卡一行并列
 * ===================================================================== */

/* ---- 20.1 AI 抽屉：380px 窄条 + 头部紧凑（对齐设计稿图6） ---- */
html:not([data-theme="dark"]) .ai-drawer{
  width:min(380px,94vw) !important;
}
html:not([data-theme="dark"]) .ai-head{
  padding:13px 16px;
  gap:8px;
  display:flex;align-items:center;
}
html:not([data-theme="dark"]) .ai-head h3{
  font-size:15px;letter-spacing:-.01em;
}
html:not([data-theme="dark"]) .ai-head > div{min-width:0;}
html:not([data-theme="dark"]) .ai-head button{margin-left:auto;flex:0 0 auto;}
html:not([data-theme="dark"]) .ai-msg .bubble{
  font-size:12.5px;line-height:1.7;padding:10px 13px;
}
html:not([data-theme="dark"]) .ai-msg .av{width:28px;height:28px;border-radius:9px;font-size:13px;}
html:not([data-theme="dark"]) .ai-input{padding:10px 14px;gap:8px;display:flex;align-items:flex-end;}

/* ---- 20.2 知识库四卡一行并列（设计稿图4） ---- */
html:not([data-theme="dark"]) .kb-grid{
  grid-template-columns:repeat(4,1fr) !important;
  gap:12px;
}
@media (max-width:1080px){
  html:not([data-theme="dark"]) .kb-grid{grid-template-columns:repeat(2,1fr) !important;}
}
@media (max-width:600px){
  html:not([data-theme="dark"]) .kb-grid{grid-template-columns:1fr !important;}
}
html:not([data-theme="dark"]) .kb-card{min-width:0;}

/* ---- 21. 目录当前项高亮（V2.1.31b）：章/节/子节/条文统一可见样式 ----
   旧版只有 .toc-ch 带 .active 视觉；窗口化文档（北京指南等）的节级目录项
   此前完全不高亮，用户点了章节看不出自己在哪。 */
.law-toc .toc-tree .toc-ch.active,
#toc-body .toc-tree .toc-ch.active{
  background:#dbeafe !important;color:#1d4ed8 !important;font-weight:800;
  box-shadow:inset 3px 0 0 #2563eb;
}
.law-toc .toc-tree .toc-sec-h.active,
#toc-body .toc-tree .toc-sec-h.active{
  background:#e0edff !important;color:#1d4ed8 !important;font-weight:800;
  box-shadow:inset 3px 0 0 #3b82f6;
}
.law-toc .toc-tree .toc-sub.active,
.law-toc .toc-tree .toc-subsub.active,
#toc-body .toc-tree .toc-sub.active,
#toc-body .toc-tree .toc-subsub.active{
  background:#eef2ff !important;color:#4338ca !important;font-weight:700;
  box-shadow:inset 3px 0 0 #6366f1;
}
.law-toc .toc-tree .toc-item.active,
#toc-body .toc-tree .toc-item.active{
  background:#eef2ff !important;color:#1d4ed8 !important;font-weight:700;
  box-shadow:inset 3px 0 0 #60a5fa;
}
/* 抽屉内目录补缩进，避免高亮条贴左边缘 */
#toc-body .toc-tree .toc-sub{padding-left:26px;}
#toc-body .toc-tree .toc-subsub{padding-left:34px;}

/* ---- 22. 移动端适配（≤780px）：任务卡 / 区块标题 / 工程卡按钮 ----
   18.7 的「单行钉死」（nowrap + s-main min-width:0）在手机上把任务标题挤成竖排单字；
   .sec-title 内 float:right 的操作组在 flex 容器里不换行，把「检查任务」挤成竖排；
   工程卡 修改/删除 两按钮绝对定位（right:10px / right:64px）按固定宽度错位，
   手机端字体变大即互相重叠。统一在 ≤780px 恢复换行布局。 */
@media (max-width:780px){
  html:not([data-theme="dark"]) .session-item{
    flex-wrap:wrap !important;
    align-items:flex-start !important;
    row-gap:8px;
  }
  html:not([data-theme="dark"]) .session-item .s-main{
    flex:1 1 140px;
    min-width:0;
  }
  html:not([data-theme="dark"]) .session-item .s-main .s-title{
    white-space:normal;
    word-break:break-word;
    line-height:1.45;
  }
  html:not([data-theme="dark"]) .session-item .s-foot{
    flex:1 1 100%;
    margin-left:0;
    justify-content:flex-end;
    flex-wrap:wrap;
    row-gap:6px;
  }
  html:not([data-theme="dark"]) .sec-title{
    flex-wrap:wrap;
    row-gap:8px;
  }
  html:not([data-theme="dark"]) .sec-title .sec-x{
    float:none;
    margin-left:0;
    flex:1 1 100%;
    display:flex;
    align-items:center;
    gap:12px;
    white-space:normal;
  }
  html:not([data-theme="dark"]) .proj-card .p-name{
    padding-right:112px;
  }
}
/* ---- 23. 工程卡操作按钮成组（任意屏宽都不再重叠） ---- */
.p-acts{position:absolute;top:10px;right:10px;z-index:2;display:flex;align-items:center;gap:6px;}
.p-acts .p-edit,.p-acts .p-del{position:static;}

/* ---- 24. 移动端弹窗横向加固（≤780px）----
   实测（390px headless）：AI记录隐患弹窗的 AI 结果区 #gm-ai/.ai-opt-row 在手机端
   计算宽 ~367px，超出弹窗右缘 13~14px；mbox overflow-x:auto → 触摸可左右拖动弹窗内容
   （用户反馈「弹窗可以左右拖动」「描述框没适配弹窗」）。统一钳制 + 禁横向平移。 */
@media (max-width:780px){
  .mbox{
    overflow-x:hidden;
    max-width:calc(100vw - 24px);
  }
  .mbox > *{ max-width:100%; }
  .mbox #gm-ai,
  .mbox .ai-opt-row,
  .mbox .ai-opt-h,
  .mbox .gm-input-row,
  .mbox .ai-basis-choose{
    max-width:100% !important;
  }
  .mbox textarea,
  .mbox input,
  .mbox select{
    max-width:100%;
    overflow-wrap:break-word;
  }
  .mbox .mb-foot{ flex-wrap:wrap; }
}

/* ---- 25. 协同检查顶部轻提示（V2.1.31c）----
   置顶居中、白底毛玻璃胶囊、自动消失；两种状态：
   collab = 品牌渐变圆徽；plain = 中性灰圆徽。低调不抢焦点。 */
#colab-toast{
  position:fixed;
  top:calc(10px + env(safe-area-inset-top,0px));
  left:50%;
  transform:translate(-50%,-14px);
  z-index:85;
  max-width:min(92vw,560px);
  display:flex;align-items:center;gap:8px;
  padding:8px 15px 8px 9px;
  background:rgba(255,255,255,.96);
  -webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);
  border:1px solid var(--hz-line);
  border-radius:999px;
  box-shadow:0 8px 28px -10px rgba(16,24,40,.22),0 1px 3px rgba(16,24,40,.06);
  font-size:12.5px;font-weight:600;color:var(--hz-ink-2);
  opacity:0;pointer-events:none;
  transition:opacity .3s ease,transform .3s cubic-bezier(.22,1,.36,1);
  white-space:nowrap;overflow:hidden;
}
#colab-toast.show{opacity:1;transform:translate(-50%,0);}
#colab-toast .ct-ic{
  width:22px;height:22px;border-radius:999px;flex:0 0 auto;
  display:flex;align-items:center;justify-content:center;
}
#colab-toast.collab .ct-ic{
  background:linear-gradient(135deg,#4c7dff,#7a5cff,#ec4899);
  color:#fff;
  box-shadow:0 3px 8px -2px rgba(122,92,255,.5);
}
#colab-toast.plain .ct-ic{background:var(--hz-st-neutral-bg);color:#667085;}
#colab-toast .ct-ic svg{width:12px;height:12px;}
#colab-toast .ct-tx{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;letter-spacing:.2px;}

/* =====================================================================
   27. V2.2.0 批次1：状态语义色 + 卡片三层级（全部引用 theme-tokens 变量）
   —— 颜色 + 图标 + 文案三重表达，强光/色弱环境同样可读
   —— 卡片统一「主标题 / 正文 / 次要信息」三级，字号与色阶单一来源
   ===================================================================== */

/* 状态徽标基础组件（新代码统一使用 .hz-st + .hz-st-* ） */
.hz-st{
  display:inline-flex;align-items:center;gap:4px;
  padding:2px 8px;border-radius:var(--hz-r-pill);
  font-size:var(--hz-fs-meta);font-weight:700;line-height:1.75;white-space:nowrap;
}
.hz-st svg{width:11px;height:11px;flex:0 0 auto;}
.hz-st-danger{color:var(--hz-st-danger);background:var(--hz-st-danger-bg);}
.hz-st-warn{color:var(--hz-st-warn);background:var(--hz-st-warn-bg);}
.hz-st-ok{color:var(--hz-st-ok);background:var(--hz-st-ok-bg);}
.hz-st-info{color:var(--hz-st-info);background:var(--hz-st-info-bg);}
.hz-st-neutral{color:var(--hz-st-neutral);background:var(--hz-st-neutral-bg);}

/* 现有状态元素挂到语义色变量（隐患红 / 已闭环绿 / 整改中琥珀 / 协同蓝） */
html:not([data-theme="dark"]) .session-item .s-hz{ color:var(--hz-st-danger); }
html:not([data-theme="dark"]) .session-item .s-hz.zero{ color:var(--hz-st-ok); }
html:not([data-theme="dark"]) .session-item .s-rg{ color:var(--hz-ink-3); }
html:not([data-theme="dark"]) .co-tag{ color:var(--hz-st-info); background:var(--hz-st-info-bg); }
html:not([data-theme="dark"]) .s-cdtn.warn{ color:var(--hz-st-warn); }
html:not([data-theme="dark"]) .s-cdtn.over{ color:var(--hz-st-danger); }
html:not([data-theme="dark"]) .hz-basis-warn{ color:var(--hz-st-warn); }
html:not([data-theme="dark"]) .hz-basis-ok{ color:var(--hz-st-ok); }

/* 卡片三层级：主标题 / 正文 / 次要信息 */
html:not([data-theme="dark"]) .proj-card .p-name,
html:not([data-theme="dark"]) .session-item .s-title,
html:not([data-theme="dark"]) .kb-card .kb-title,
html:not([data-theme="dark"]) .item-card .ic-title{
  font-size:var(--hz-fs-title);
  font-weight:700;
  color:var(--hz-ink-1);
  line-height:1.45;
}
html:not([data-theme="dark"]) .proj-card .p-meta,
html:not([data-theme="dark"]) .session-item .s-row2,
html:not([data-theme="dark"]) .kb-card .kb-sub{
  font-size:var(--hz-fs-meta);
  color:var(--hz-ink-3);
  line-height:1.65;
}
html:not([data-theme="dark"]) .card,
html:not([data-theme="dark"]) .panel,
html:not([data-theme="dark"]) .proj-card,
html:not([data-theme="dark"]) .session-item,
html:not([data-theme="dark"]) .kb-card{
  border-color:var(--hz-line);
  box-shadow:var(--hz-sh-2);
}

/* 目录折叠/图钉改为线性图标后的对齐（图标为 inline svg） */
.toc-caret,.toc-pin{ display:inline-flex;align-items:center; }
.toc-caret svg,.toc-pin svg{ display:block; }
.toc-part[data-open="1"] .toc-caret{ transform:rotate(90deg); }
.sr-fold{ display:inline-flex;align-items:center;gap:3px; }

/* 扫描发现的真低对比项修正：「未定级」徽标原 #94a3b8 在白底仅 2.34:1 → 提至 --hz-ink-3（≈4.6:1） */
html:not([data-theme="dark"]) .tier-badge.none{ color:var(--hz-ink-3); }

/* =====================================================================
   28. V2.2.0 批次2：体验层
   ① 大字号（适老）：body 级 zoom 整体放大，不改布局结构
   ② 顶栏显示设置按钮（大字号/深色）
   ③ 骨架屏 + 图片加载失败可点重试
   ④ 空状态首步引导按钮
   ===================================================================== */

/* ① 字号策略（V2.2.71 定案）：桌面端固定放大、手机端固定原样，**不再有用户开关**。
   原 `html.hz-bigfont body{ zoom:1.15 }` 已移除 —— 手机端不再需要它（涛哥：手机小字号够用），
   桌面端也不需要开关（固定 1.35）。新规则见本文件末尾 V2.2.71 区块。 */

/* ③ 骨架屏（列表/正文加载占位） */
.hz-skel{
  background:linear-gradient(90deg,var(--hz-st-neutral-bg) 25%,#f7f9fc 37%,var(--hz-st-neutral-bg) 63%);
  background-size:400% 100%;
  animation:hz-skel 1.3s ease infinite;
  border-radius:var(--hz-r-sm);
  height:14px;margin:8px 0;
}
.hz-skel.w60{width:60%;} .hz-skel.w80{width:80%;} .hz-skel.w40{width:40%;}
.hz-skel.tall{height:38px;}
@keyframes hz-skel{0%{background-position:100% 50%}100%{background-position:0 50%}}
/* 图片加载中/失败占位 */
img.hz-img-loading{
  background:linear-gradient(90deg,var(--hz-st-neutral-bg) 25%,#f7f9fc 37%,var(--hz-st-neutral-bg) 63%);
  background-size:400% 100%;animation:hz-skel 1.3s ease infinite;
  min-height:44px;
}
.hz-imgfail{
  display:inline-flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;
  min-height:56px;padding:10px 12px;
  border:1px dashed var(--hz-line-strong);border-radius:var(--hz-r-md);
  background:var(--hz-surface-2);color:var(--hz-ink-3);
  font-size:var(--hz-fs-meta);line-height:1.5;text-align:center;cursor:pointer;
  min-width:var(--hz-tap);
}
.hz-imgfail:hover{border-color:var(--hz-brand);color:var(--hz-brand);}
.hz-imgfail svg{width:16px;height:16px;}

/* ④ 空状态首步引导按钮 */
.hz-empty-act{
  display:inline-flex;align-items:center;gap:6px;
  margin-top:10px;padding:0 16px;min-height:var(--hz-tap);
  border:none;border-radius:var(--hz-r-pill);
  background:var(--hz-brand-grad,linear-gradient(135deg,#4c7dff,#7a5cff,#ec4899));color:#fff;
  font-size:var(--hz-fs-body);font-weight:700;cursor:pointer;
  box-shadow:0 4px 12px -4px rgba(76,125,255,.55);
}
.hz-empty-act:active{transform:translateY(1px);}

/* =====================================================================
   29. V2.2.0 批次2+：手机端检查页顶栏按钮重排（≤780px）
   旧：6 个胶囊换行堆叠、宽窄不一、主次不分
   新：AI记录隐患 = 通栏渐变主按钮；其余 5 个进 44px 等宽网格
       （检查记录/协同检查/本次检查范围 一行，关联规范/删除任务 一行）
   ===================================================================== */
@media (max-width:780px){
  .insp-top{ row-gap:8px; }
  .insp-top-right{
    display:grid !important;
    grid-template-columns:repeat(6,1fr);
    gap:8px; width:100%;
  }
  .insp-top-right > *{
    min-height:var(--hz-tap); margin:0 !important;
    display:inline-flex !important; align-items:center; justify-content:center;
    padding:0 4px; font-size:12.5px; font-weight:700;
    border-radius:var(--hz-r-md); white-space:nowrap;
    background:var(--hz-surface); color:var(--hz-ink-2);
    border:1px solid var(--hz-line);
    box-shadow:none;
  }
  /* 主行动：AI 记录隐患 通栏渐变 */
  .insp-top-right > .insp-ai-btn{
    grid-column:span 6; order:1;
    background:var(--hz-brand-grad,linear-gradient(135deg,#4c7dff,#7a5cff,#ec4899)); color:#fff; border:none;
    font-size:13.5px; font-weight:800;
    box-shadow:0 4px 12px -4px rgba(76,125,255,.55);
  }
  .insp-top-right > .fab-rec{ order:2; grid-column:span 2; }
  .insp-top-right > .fab-share:not(.insp-ai-btn){ order:3; grid-column:span 2; }
  .insp-top-right > .j59-scope-btn{ order:4; grid-column:span 2; }
  .insp-top-right > .insp-right-btn{ order:5; grid-column:span 3; }
  .insp-top-right > .insp-del-btn{
    order:6; grid-column:span 3;
    color:var(--hz-st-danger); border-color:#f3c2be; background:var(--hz-st-danger-bg);
  }
  .insp-top-right > .insp-ai-btn .imm-ic{
    background:rgba(255,255,255,.22); color:#fff;
  }
}

/* =====================================================================
   30. V2.2.0 批次4：隐患闭环看板
   ===================================================================== */
.hz-bp{ border:1px solid var(--hz-line); border-radius:var(--hz-r-md); margin:10px 0; background:var(--hz-surface); overflow:hidden; }
.hz-bp-h{ display:flex; align-items:center; gap:10px; padding:11px 14px; cursor:pointer; }
.hz-bp-h:hover{ background:var(--hz-surface-2); }
.hz-bp-name{ font-size:var(--hz-fs-title); font-weight:700; color:var(--hz-ink-1); flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.hz-bp-n{ font-size:var(--hz-fs-meta); color:var(--hz-ink-3); white-space:nowrap; }
.hz-bp-n b{ color:var(--hz-st-danger); }
.hz-caret{ display:inline-flex; color:var(--hz-ink-4); transition:transform var(--hz-dur) var(--hz-ease); }
.hz-bp-items{ border-top:1px solid var(--hz-line); padding:6px 14px 10px; }
.hz-bp-it{ display:flex; align-items:flex-start; gap:10px; padding:8px 0; border-bottom:1px dashed var(--hz-line); }
.hz-bp-it:last-child{ border-bottom:none; }
.hz-bp-it-tx{ flex:1; min-width:0; font-size:var(--hz-fs-meta); color:var(--hz-ink-2); line-height:1.6; }
.hz-bp-it-tx b{ color:var(--hz-ink-1); }
.hz-bp-it-act{ flex:0 0 auto; }

/* =====================================================================
   31. V2.2.0 批次4+：看板美术优化（清爽卡片化）
   ===================================================================== */
.hz-bp{ border:none; background:transparent; box-shadow:none; }
.hz-bp-h{ padding:12px 14px; border:1px solid var(--hz-line); border-radius:var(--hz-r-lg);
  background:var(--hz-surface); box-shadow:var(--hz-sh-1); }
.hz-bp-h:hover{ background:var(--hz-surface); border-color:var(--hz-line-strong); }
.hz-bp-name{ font-weight:800; letter-spacing:.2px; }
.hz-bp-n{ font-weight:600; }
.hz-bp-bar{ flex:0 0 72px; height:6px; background:var(--hz-st-neutral-bg); border-radius:3px; overflow:hidden; }
.hz-bp-bar > i{ display:block; height:100%; background:var(--hz-brand-grad,linear-gradient(135deg,#4c7dff,#7a5cff,#ec4899)); border-radius:3px; }
.hz-bp-task{ border:none; margin:8px 10px; }
.hz-bp-task-h{ padding:11px 12px; background:var(--hz-surface); border:1px solid var(--hz-line);
  border-radius:var(--hz-r-md); box-shadow:var(--hz-sh-1); }
.hz-bp-task-h:hover{ background:var(--hz-brand-soft); border-color:var(--hz-brand); }
.hz-bp-task-name{ font-size:var(--hz-fs-body); font-weight:800; color:var(--hz-ink-1); }
.hz-bp-task-n{ font-weight:600; color:var(--hz-ink-3); }
.hz-bp-recs{ padding:2px 12px 10px 16px; }
.hz-bp-rec{ background:var(--hz-surface-2); border:1px solid var(--hz-line); border-radius:10px;
  padding:8px 10px; margin:6px 0; }
.hz-bp-rec:hover{ border-color:var(--hz-line-strong); }
.hz-bp-rec .rec-seq{ color:var(--hz-ink-4); font-weight:700; }
.hz-bp-rec-tx{ font-size:var(--hz-fs-meta); color:var(--hz-ink-2); line-height:1.7; }
.hz-bp-rec-tx b{ color:var(--hz-ink-1); font-weight:700; }

/* =====================================================================
   32. V2.2.0 批次4+：手机端检查页专属适配
   ① 检查页专属「AI 记隐患」悬浮按钮（AI 问答 FAB 检查页隐藏，由 JS 控制）
   ② 迷你条（返回工程+任务名+折叠开关）+ 上栏一键折叠
   ③ 中栏分组折叠（重大/隐患库默认折叠，点击标题展开）
   ===================================================================== */
.insp-fab .fab-ico.fab-gen{
  background:var(--hz-brand-grad,linear-gradient(135deg,#4c7dff,#7a5cff,#ec4899)) !important;color:#fff !important;border:none !important;
  box-shadow:0 6px 18px -4px rgba(76,125,255,.6) !important;
}
.fab-gen-tx{ font-size:10.5px;font-weight:800;letter-spacing:.5px;color:#fff !important; }
body.hz-insp-duty .fab-gen{ display:none !important; }   /* 履职任务无 AI 记录 */
@media (max-width:780px){
  /* V2.2.5 修复：mini-bar 与 imb-fold 块移到全局（不在媒体内），保证任意宽度都解析规则；桌面端单独 display:none 隐藏 */
  .insp-mini-bar{ padding-top:calc(8px + env(safe-area-inset-top,0px)); }
  body.hz-insp-folded .insp-top{ display:none !important; }
  body.hz-insp-folded .insp-resizer{ display:none; }
  .insp-fab{ display:none !important; }   /* 专属 FAB 仅手机端 */
}
/* V2.2.24 修复：此处原有 v2.2.5 遗留的多余 }，导致 CSS 解析错位、其后追加的全部规则被浏览器静默丢弃（mini-bar 间距三连败的真凶） */
/* V2.2.5 修复：mini-bar 与按钮全局规则（任意宽度解析渐变 fallback；桌面端由上 media display:none 隐藏） */
.insp-mini-bar{
  display:flex;align-items:center;gap:8px;
  position:sticky;top:0;z-index:40;
  padding:8px 10px;
  background:var(--hz-surface);border-bottom:1px solid var(--hz-line);
}
.insp-mini-bar .imb-back{ flex:0 0 auto; }
.insp-mini-bar .imb-title{ flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-size:var(--hz-fs-body);font-weight:800;color:var(--hz-ink-1); }
.insp-mini-bar .imb-fold{
  display:inline-flex;align-items:center;gap:4px;flex:0 0 auto;
  min-height:34px;padding:0 14px;border:none;border-radius:var(--hz-r-pill);
  background:linear-gradient(135deg,#4c7dff,#7a5cff,#ec4899) !important;
  color:#fff !important;font-size:12px;font-weight:800;letter-spacing:.5px;
  box-shadow:0 4px 12px -4px rgba(76,125,255,.55) !important;
  cursor:pointer;transition:transform var(--hz-dur-fast) var(--hz-ease);
}
.insp-mini-bar .imb-fold:active{ transform:scale(.94); }
.insp-mini-bar .imb-fold svg{ width:13px;height:13px; }
/* 中栏分组头折叠态 */
.hz-group-head{ cursor:pointer; user-select:none; }
.hz-group-head .gz-caret{ display:inline-block;margin-left:auto;font-size:11px;color:var(--hz-ink-4);
  transition:transform var(--hz-dur) var(--hz-ease); }
.hz-group-head[data-folded="1"]{ opacity:.92; }
.hz-group-head[data-folded="1"] .sub{ display:none; }

/* 批次4+：弹窗滚动穿透修复（手机端滑动弹窗内容不再带动背后页面） */
body.modal-lock{ overflow:hidden; }
.modal-box{ overscroll-behavior:contain; -webkit-overscroll-behavior:contain; touch-action:pan-y; }

/* V2.2.6：迷你条全宽显示（桌面亦可用收起/展开）；桌面展开态 mini-bar 隐藏自身返回按钮（insp-top 已有），折叠后自动恢复返回 */
@media (min-width:781px){
  .insp-mini-bar .imb-back{ display:none; }
  body.hz-insp-folded .insp-mini-bar .imb-back{ display:inline-flex; }
  body.hz-insp-folded .insp-top{ display:none !important; }
}

/* V2.2.8：记隐患按钮纯图标（不显示文字标签） */
.fab-gen-tx{ display:none !important; }
.insp-fab .fab-ico.fab-gen svg{ width:22px;height:22px; }
/* V2.2.8：迷你条折叠按钮——圆角小胶囊、长文案、手机端横向占满（与「检查记录」按钮同风格同宽） */
.insp-mini-bar{ gap:6px; }
.insp-mini-bar .imb-title{ font-size:12px; }
.insp-mini-bar .imb-fold{
  min-width:160px;
  border-radius:999px;
  box-shadow:0 4px 14px -6px rgba(76,125,255,.65) !important;
}
@media (max-width:780px){
  .insp-mini-bar .imb-title{ font-size:11px; }
  .insp-mini-bar .imb-fold{ flex:1 1 0; min-height:34px; justify-content:center; }
}
/* V2.2.8：弹窗滚动穿透——html 级锁定 + 遮罩吞掉触摸滚动 */
html.modal-lock, html.modal-lock body{ overflow:hidden !important; height:100%; }
.modal-mask.show, #modal-mask.show, #j59-dmask.show, #toc-overlay.show{ overscroll-behavior:contain; touch-action:none; }
#modal-box, .j59-dw, .modal-box{ overscroll-behavior:contain; -webkit-overflow-scrolling:touch; }

/* ===== V2.2.47 站内信弹窗滚动穿透修复（补 V2.2.8 的遗漏）=====
   根因：mail.js 里 body 已加 .mail-open，但 CSS 从未写对应规则；
   且 .mail-mask / .mail-panel / 内层滚动容器都没做 overscroll 拦截
   → 弹窗内滚动到底后链式传给背后整页（桌面滚轮、手机触摸同样中招）。
   三层处理：① html+body 锁定（JS 同步记录/还原滚动位置）；② 遮罩层拦链式滚动；③ 内层滚动容器禁止链式滚动。 */
html.mail-lock, html.mail-lock body{ overflow:hidden !important; height:100%; }
.mail-mask.show{ overscroll-behavior:contain; -webkit-overscroll-behavior:contain; }
.mail-panel{ overscroll-behavior:contain; -webkit-overscroll-behavior:contain; }
.mail-list, .mail-chat-body, .mail-form,
#mail-view-compose, #mail-view-broadcast{
  overscroll-behavior:contain; -webkit-overscroll-behavior:contain;
}
@media (max-width:780px){
  /* 手机端 .mail-panel 全屏，触摸滚动更易穿透：内层容器只放行纵向滚动，不向外传 */
  .mail-list, .mail-chat-body, .mail-form{ touch-action:pan-y; }
}

/* V2.2.15 状态条卡片（渐变淡底+图标+打开文书按钮，手机端竖排） */
.hz-status-card{
  display:flex; align-items:center; gap:8px; flex-wrap:wrap;
  padding:8px 12px; border-radius:12px;
  background:linear-gradient(135deg, rgba(79,124,255,.10), rgba(168,85,247,.08));
  border:1px solid rgba(79,124,255,.30);
  font-size:12.5px; line-height:1.5; color:var(--hz-ink-1,#1e293b);
  margin:4px 0;
}
.hz-status-card .hz-status-icon{
  flex:0 0 22px; width:22px; height:22px; border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  background:linear-gradient(135deg,#4c7dff,#a855f7); color:#fff;
  font-size:11px; font-weight:800;
  box-shadow:0 2px 8px -2px rgba(79,124,255,.45);
}
.hz-status-card .hz-status-text{ flex:1 1 auto; min-width:120px; font-weight:600; }
.hz-status-card .hz-status-text b{ color:var(--hz-brand); font-weight:800; }
.hz-status-card .hz-doc-open{
  display:inline-flex; align-items:center; gap:5px;
  padding:5px 12px; border-radius:999px;
  background:#fff; color:#2563eb; border:1.5px solid var(--hz-brand);
  font-weight:800; font-size:12px; cursor:pointer; white-space:nowrap; flex:0 0 auto;
}
.hz-status-card .hz-doc-open svg{ width:13px;height:13px; }
.hz-status-card .hz-doc-open i{ font-style:normal; opacity:.7; }
@media (max-width:480px){
  .hz-status-card{ flex-direction:column; align-items:stretch; }
  .hz-status-card .hz-doc-open{ align-self:flex-end; }
}
/* V2.2.15 手机端折叠胶囊全屏宽：mini-bar 两行布局（上行返回+任务名，下行全宽折叠钮） */
@media (max-width:780px){
  .insp-mini-bar{ flex-wrap:wrap; row-gap:6px; }
  .insp-mini-bar .imb-title{ flex:1 1 auto; }
  .insp-mini-bar .imb-fold{ flex:1 1 100%; width:100%; min-height:38px; justify-content:center; font-size:12.5px; }
}

/* ===== V2.2.17 清单检查：保证项目/一般项目分组折叠（与常见问题页分组同款交互） ===== */
.j59-secbar{ cursor:pointer; user-select:none; }
.j59-secbar .sec-cnt{
  flex:none; font-size:11px; font-weight:700; color:var(--hz-ink-4, #64748b);
  background:rgba(255,255,255,.85); border:1px solid var(--line,#e2e8f0); border-radius:999px; padding:1px 8px;
}
.j59-secbar .gz-caret{
  flex:none; display:inline-block; font-size:11px; color:var(--hz-ink-4, #64748b);
  transition:transform var(--hz-dur,.18s) var(--hz-ease,ease);
}
.j59-secbar[data-folded="1"] .gz-caret{ transform:rotate(-90deg); }
.j59-secbar:active{ opacity:.86; }

/* ===== V2.2.18 六项 UI 优化 ===== */
/* ① 迷你条（收起/展开检查任务详情）间距：与返回工程/检查方向等内容留出呼吸感 */
.insp-mini-bar{ gap:10px; padding:10px 14px 12px; margin-bottom:8px; }
@media (max-width:780px){ .insp-mini-bar{ padding-top:calc(12px + env(safe-area-inset-top,0px)); } }

/* ② 隐患闭环看板 · 手机端专属布局（两行式工程/任务头，进度条通栏） */
@media (max-width:780px){
  .proj-head h2{ font-size:17px; letter-spacing:-.01em; }
  .hz-bp{ margin-bottom:10px; }
  .hz-bp-h{ display:flex; flex-wrap:wrap; align-items:center; gap:4px 8px; padding:10px 12px; }
  .hz-bp-name{ flex:1 1 100%; font-size:14px; font-weight:800; }
  .hz-bp-n{ flex:1 1 auto; font-size:11px; color:var(--hz-ink-3,#475569); }
  .hz-bp-bar{ flex:1 1 100%; }
  .hz-bp-task-h{ display:flex; flex-wrap:wrap; align-items:center; gap:4px 6px; }
  .hz-bp-task-name{ flex:1 1 100%; font-size:13px; font-weight:700; }
  .hz-bp-task-n{ font-size:11px; }
  .hz-bp-task-act{ margin-left:auto; display:inline-flex; gap:4px; }
  .hz-bp-rec{ font-size:12px; line-height:1.55; }
  /* 统计卡 2 列（4 卡刚好两行） */
  #view > div[style*="grid-template-columns:repeat(auto-fit"]{ grid-template-columns:repeat(2,1fr) !important; gap:8px !important; }
}

/* ⑥ 手机端弹窗溢出兜底：检查记录抽屉 / 知识库目录抽屉 */
@media (max-width:780px){
  #rec-drawer{ width:100vw !important; max-width:100vw !important; }
  #rec-drawer .d-body{ padding:10px 12px calc(18px + env(safe-area-inset-bottom,0px)); }
  #rec-drawer *, .drawer .d-body *{ max-width:100%; box-sizing:border-box; overflow-wrap:break-word; word-break:break-word; }
  #toc-drawer{ width:min(92vw,420px) !important; max-width:92vw !important; }
  #toc-drawer *, #toc-overlay *{ overflow-wrap:break-word; word-break:break-word; }
  .drawer .d-head h3{ white-space:normal; }
}

/* ===== V2.2.19 六项 UI 精修 ===== */
/* ④ 工作台「隐患闭环看板 / 文书验真」：胶囊渐变按钮
   V2.2.47 改为「一左一右并排」——原先两个按钮各自 grid-column:1/-1 通栏，竖向吃掉两行高度；
   现由 .dash-duo 包一层 2 列网格承载（.dash-duo span 整行，内部 1fr 1fr 并排），
   手机端仍用 order 提到「开始检查」之后，只是由两行压成一行。 */
.dash-grid3 .dash-duo{ grid-column:1/-1; display:grid; grid-template-columns:1fr 1fr; gap:14px; }
.dash-grid3 .dash-duo.solo{ grid-template-columns:1fr; }
.dash-grid3 .board-entry{
  display:flex; align-items:center; justify-content:center; gap:8px;
  min-width:0; min-height:44px; border-radius:999px;
  background:linear-gradient(135deg,#4c7dff,#7a5cff,#ec4899);
  color:#fff; font-size:13.5px; font-weight:800; letter-spacing:.5px;
  box-shadow:0 6px 18px -6px rgba(76,125,255,.55);
  cursor:pointer; transition:transform var(--hz-dur-fast,.16s) var(--hz-ease,ease);
}
.dash-grid3 .board-entry span{ white-space:nowrap; }
.dash-grid3 .board-entry:hover{ transform:translateY(-2px); }
.dash-grid3 .board-entry:active{ transform:scale(.97); }
.dash-grid3 .board-entry svg{ width:16px; height:16px; flex:0 0 auto; }
@media (max-width:780px){
  .dash-grid3 .act-new{ order:-3; }
  .dash-grid3 .dash-duo{ order:-2; gap:10px; }
  .dash-grid3 .board-entry{ min-height:42px; padding:10px 8px; gap:6px; font-size:12.5px; letter-spacing:0; }
  .dash-grid3 .board-entry svg{ width:15px; height:15px; }
}

/* ⑤ 手机端隐患闭环看板重设计：字号统一 / 胶囊按钮 / 隐患列表卡片化 */
@media (max-width:780px){
  .hz-st{ font-size:11px !important; padding:3px 10px !important; border-radius:999px !important; font-weight:700 !important; white-space:nowrap; }
  .hz-bp-task-h > .hz-st{ font-size:11px !important; }
  .hz-bp-task-act{ display:inline-flex; gap:6px; }
  .hz-bp-task-act .hz-st{ border-radius:999px !important; padding:5px 13px !important; font-size:11.5px !important; font-weight:800 !important; cursor:pointer; }
  .hz-bp-task-act .hz-st-ok{ background:linear-gradient(135deg,#e9f9f0,#f3fcf7) !important; color:#0f9d58 !important; border:1.5px solid #b9e8cd !important; }
  .hz-bp-task-act .hz-st-warn{ background:#fff8e9 !important; color:var(--hz-st-warn) !important; border:1.5px solid #fbd9a0 !important; }
  .hz-bp-task-act .hz-st-danger{ background:#fef2f2 !important; color:#b91c1c !important; border:1.5px solid #fca5a5 !important; }
  .hz-bp-rec{
    display:flex; align-items:flex-start; gap:8px;
    margin:7px 0; padding:10px 12px;
    background:linear-gradient(135deg,#fafbff,#f8fafc);
    border:1px solid #eef2f7; border-radius:12px;
  }
  .hz-bp-rec .rec-seq{ flex:0 0 auto; color:var(--hz-ink-4,#94a3b8); font-weight:800; font-size:11px; padding-top:2px; }
  .hz-bp-rec .hz-st{ flex:0 0 auto; font-size:10.5px !important; padding:2px 9px !important; }
  .hz-bp-rec-tx{ flex:1; min-width:0; font-size:12.5px; line-height:1.65; color:var(--hz-ink-2,#334155); overflow-wrap:break-word; word-break:break-word; }
  .hz-bp-n, .hz-bp-task-n{ font-size:11.5px; }
}

/* ⑥ 手机端弹窗溢出根治：检查记录抽屉（textarea/固定宽）+ 法规目录弹窗（nowrap/贴边） */
@media (max-width:780px){
  #rec-drawer{ overflow-x:hidden; }
  #rec-drawer .d-body{ overflow-x:hidden; }
  #rec-drawer textarea{
    width:100% !important; max-width:100% !important; min-width:0 !important;
    box-sizing:border-box !important; resize:vertical;
  }
  #rec-drawer input, #rec-drawer select, #rec-drawer table{
    max-width:100% !important; box-sizing:border-box !important;
  }
  #rec-drawer *{ min-width:0; }
  #toc-drawer, #toc-drawer .law-toc, #toc-drawer .toc-tree{
    overflow-x:hidden; max-width:100%; box-sizing:border-box;
  }
  #toc-drawer *{ min-width:0; max-width:100%; box-sizing:border-box; }
  #toc-drawer .toc-tree a, #toc-drawer .law-toc a{ white-space:normal !important; word-break:break-word; }
}
@media (max-width:780px){
  .panel{ padding:12px 12px 14px !important; overflow:hidden; }
  .panel-h{ margin:0 0 10px !important; padding:0 2px !important; }
}

/* ===== V2.2.20 四项精修 ===== */
/* ① 看板折叠箭头 → 明显的胶囊按钮（展开任务 N / 收起，data-open 驱动文案切换） */
.hz-fold-pill{
  display:inline-flex; align-items:center; gap:4px; flex:0 0 auto; margin-left:auto;
  padding:5px 13px; border-radius:999px;
  background:linear-gradient(135deg,#eaf0fe,#f2eeff); color:#3b5bdb;
  border:1px solid #d6e0fb; font-size:11px; font-weight:800; letter-spacing:.3px;
  cursor:pointer; user-select:none; white-space:nowrap;
  transition:transform var(--hz-dur-fast,.16s) var(--hz-ease,ease), box-shadow var(--hz-dur-fast,.16s);
}
.hz-fold-pill:hover{ transform:translateY(-1px); box-shadow:0 4px 12px -6px rgba(76,125,255,.45); }
.hz-fold-pill:active{ transform:scale(.95); }
.hz-fold-pill b{ font-weight:800; }
.hz-fold-pill .fp-open{ display:none; }
.hz-bp[data-open="1"] .hz-fold-pill .fp-fold, .hz-bp-task[data-open="1"] .hz-fold-pill .fp-fold{ display:none; }
.hz-bp[data-open="1"] .hz-fold-pill .fp-open, .hz-bp-task[data-open="1"] .hz-fold-pill .fp-open{ display:inline; }
.hz-bp[data-open="1"] .hz-fold-pill, .hz-bp-task[data-open="1"] .hz-fold-pill{ background:linear-gradient(135deg,#eef2f7,#f6f8fb); color:#475569; border-color:#e2e8f0; }
.hz-fold-pill.fp-sm{ padding:4px 11px; font-size:10.5px; }
@media (max-width:780px){
  .hz-bp-h .hz-fold-pill{ margin-left:0; }
}

/* ③ mini-bar：折叠态两行之间拉开缝隙；桌面行内标题与胶囊拉开 */
.insp-mini-bar{ gap:14px; row-gap:10px; }

/* ④ 手机端弹窗宽度硬性缩小到 2/3（涛哥拍板） */
@media (max-width:780px){
  #rec-drawer{ width:66.7vw !important; max-width:66.7vw !important; }
  #toc-drawer{ width:66.7vw !important; max-width:66.7vw !important; }
}

/* ===== V2.2.21 四项精修 ===== */
/* ② 折叠按钮间距再增强（手机返回工程↔标题、桌面标题↔胶囊） */
.insp-mini-bar{ gap:16px; row-gap:10px; }
.insp-mini-bar .imb-back{ margin-right:2px; }
.insp-mini-bar .imb-title{ padding-right:4px; }

/* ③ 手机端看板：每个检查任务独立卡片框（与相邻任务划清界限） */
@media (max-width:780px){
  .hz-bp-task{
    background:#fff;
    border:1px solid #eef2f7;
    border-radius:14px;
    padding:11px 12px;
    margin:9px 0;
    box-shadow:0 2px 10px -6px rgba(15,23,42,.10);
  }
  .hz-bp-task:last-child{ margin-bottom:2px; }
}

/* ④ 手机端弹窗推翻右侧抽屉 → 居中卡片弹窗（仿指南依据弹窗：圆角+遮罩+缩放渐入） */
@media (max-width:780px){
  #rec-drawer, #toc-drawer{
    top:50% !important; left:50% !important; right:auto !important; bottom:auto !important;
    height:auto !important; max-height:86vh !important;
    width:min(83vw,378px) !important; max-width:min(83vw,378px) !important;
    border-radius:18px !important;
    box-shadow:0 24px 60px -12px rgba(15,23,42,.42) !important;
    overflow:hidden;
    animation:none !important;
    transform:translate(-50%,-46%) scale(.96);
    opacity:0; visibility:hidden;
    transition:transform .2s ease, opacity .2s ease, visibility .2s;
  }
  #rec-drawer.open, #toc-drawer.open{
    display:flex !important;
    transform:translate(-50%,-50%) scale(1);
    opacity:1; visibility:visible;
  }
  #rec-drawer .d-head, #toc-drawer .d-head{ border-radius:0; }
  /* 隐藏态禁止误触 */
  #rec-drawer:not(.open), #toc-drawer:not(.open){ pointer-events:none; }
}

/* ===== V2.2.22 手机端 mini-bar 返回工程↔标题 显式拉开（不依赖 flex gap 单点） ===== */
@media (max-width:780px){
  .insp-mini-bar{ gap:16px; row-gap:10px; }
  .insp-mini-bar .imb-back{ margin-right:14px !important; }
  .insp-mini-bar .imb-title{ margin-left:2px; }
  /* 折叠态（两行）时第一行内同样生效 */
  body.hz-insp-folded .insp-mini-bar .imb-back{ margin-right:14px !important; }
}

/* ===== V2.2.24 长辈关怀模式 ===== */
.dash-grid3 .care-entry{
  grid-column:1/-1;
  display:flex; align-items:center; justify-content:center; gap:8px;
  min-height:44px; border-radius:999px;
  background:linear-gradient(135deg,#f59e0b,#f97316);
  color:#fff; font-size:13.5px; font-weight:800; letter-spacing:.5px;
  box-shadow:0 6px 18px -6px rgba(249,115,22,.5);
  cursor:pointer; transition:transform var(--hz-dur-fast,.16s) var(--hz-ease,ease);
}
.dash-grid3 .care-entry:hover{ transform:translateY(-2px); }
.dash-grid3 .care-entry:active{ transform:scale(.97); }
.dash-grid3 .care-entry svg{ width:16px; height:16px; }
@media (max-width:780px){ .dash-grid3 .care-entry{ order:-1; } }

.care-hero{ text-align:center; padding:34px 16px 22px; }
.care-hero h1{ font-size:30px; font-weight:900; letter-spacing:-.02em; color:var(--hz-ink-1,#0f172a); margin:10px 0 6px; }
.care-hero p{ font-size:15px; color:var(--hz-ink-3,#475569); margin:0; }
.care-badge{
  display:inline-flex; align-items:center; gap:6px;
  padding:6px 14px; border-radius:999px;
  background:linear-gradient(135deg,#fff3e0,#ffe9d6); color:#c2570a;
  border:1px solid #fed7aa; font-size:12.5px; font-weight:800;
}
.care-main-btn{
  display:flex; align-items:center; justify-content:center; gap:10px;
  margin:6px 16px 20px; min-height:64px; border-radius:20px;
  background:linear-gradient(135deg,#4c7dff,#7a5cff,#ec4899);
  color:#fff; font-size:19px; font-weight:900; letter-spacing:1px;
  box-shadow:0 10px 28px -8px rgba(76,125,255,.6);
  cursor:pointer; transition:transform .16s ease;
}
.care-main-btn:active{ transform:scale(.97); }
.care-recent{ margin:0 16px 18px; }
.care-sec-t{ font-size:13px; font-weight:800; color:var(--hz-ink-4,#94a3b8); letter-spacing:1px; margin:0 2px 8px; }
.care-proj{
  display:flex; align-items:center; justify-content:space-between; gap:10px;
  background:#fff; border:1px solid #eef2f7; border-radius:14px;
  padding:16px; margin-bottom:9px; cursor:pointer;
  box-shadow:0 2px 10px -6px rgba(15,23,42,.10);
}
.care-proj .cp-name{ font-size:16.5px; font-weight:800; color:var(--hz-ink-1,#1e293b); }
.care-proj em{ font-style:normal; font-size:12.5px; color:var(--hz-ink-4,#94a3b8); white-space:nowrap; }
.care-proj:active{ transform:scale(.98); }
.care-empty{ padding:18px; text-align:center; font-size:14px; color:var(--hz-ink-4,#94a3b8); background:#f8fafc; border-radius:14px; }
.care-exit{
  margin:6px 16px 30px; min-height:52px; display:flex; align-items:center; justify-content:center;
  border-radius:999px; border:1.5px solid #cbd5e1; background:#fff;
  color:#475569; font-size:14.5px; font-weight:800; cursor:pointer;
}
.care-exit:active{ transform:scale(.98); }

body.hz-care #ai-fab,
body.hz-care .h-actions,
body.hz-care .h-search,
body.hz-care .sidebar,
body.hz-care .menu-btn,
body.hz-care .top-btn,
body.hz-care .dash-search-card,
body.hz-care .dash-rank,
body.hz-care .dash-t10-grid,
body.hz-care .sync-status{ display:none !important; }
body.hz-care .header{ padding-bottom:10px; }
body.hz-care #view{ padding-bottom:24px !important; }


/* V2.2.25 关怀模式：下栏保留 工作台/工程/检查 三栏，其余隐藏 */
body.hz-care .tabbar{ display:flex !important; }
body.hz-care .tabbar button{ display:none; }
body.hz-care .tabbar button[data-route="dashboard"],
body.hz-care .tabbar button[data-route="projects"],
body.hz-care .tabbar button[data-route="inspect"]{ display:flex !important; }
body.hz-care #view{ padding-bottom:70px !important; }

/* V2.2.25 关怀导航条：所有关怀页面顶部显示（网页端回首页的唯一入口） */
.care-nav{ display:flex; gap:10px; padding:10px 14px 2px; align-items:center; }
.care-nav .cn-home{
  flex:0 0 auto; display:inline-flex; align-items:center; gap:6px;
  padding:9px 15px; border-radius:999px;
  background:linear-gradient(135deg,#fff7ec,#ffefdd); color:#c2570a;
  border:1px solid #f8d9b8;
  font-size:13px; font-weight:800; letter-spacing:.5px; cursor:pointer;
}
.care-nav .cn-home svg{ width:15px; height:15px; }
.care-nav .cn-home:active{ transform:scale(.96); }
.care-nav .cn-back{
  flex:0 0 auto; display:inline-flex; align-items:center;
  padding:10px 16px; border-radius:999px; background:#fff;
  border:1.5px solid #cbd5e1; color:#475569; font-size:14px; font-weight:800; cursor:pointer;
}
.care-nav .cn-back:active{ transform:scale(.96); }

/* ===== V2.2.26 关怀/专注模式手机端微调 ===== */
/* ① 专注导航条仅网页端显示（手机端靠下栏三栏直达，不再重复） */
@media (max-width:780px){
  .care-nav{ display:none !important; }
}
/* ② 手机端下栏三栏均分全宽（原 flex:1 规则在部分断点未生效导致挤右） */
@media (max-width:820px){
  body.hz-care .tabbar{ justify-content:space-around; }
  body.hz-care .tabbar button[data-route="dashboard"],
  body.hz-care .tabbar button[data-route="projects"],
  body.hz-care .tabbar button[data-route="inspect"]{
    display:flex !important; flex:1 1 0 !important;
    align-items:center; justify-content:center;
  }
}


/* ===== V2.2.27 上栏「专注」文字胶囊（替代爱心圆钮） ===== */
.h-care-pill{
  display:inline-flex; align-items:center; justify-content:center;
  height:34px; padding:0 16px; border-radius:999px;
  background:linear-gradient(135deg,#fff7ec,#ffefdd); color:#c2570a;
  border:1px solid #f8d9b8; font-size:13px; font-weight:800; letter-spacing:1px;
  cursor:pointer; transition:transform var(--hz-dur-fast,.16s) var(--hz-ease,ease);
}
.h-care-pill:hover{ transform:translateY(-1px); }
.h-care-pill:active{ transform:scale(.95); }


/* ===== V2.2.29 mini-bar 紧凑回调：间隙过大回调 + 返回/标题锁同行的空间优化 ===== */
.insp-mini-bar{ gap:12px; row-gap:6px; padding:8px 12px 10px; margin-bottom:6px; }
@media (max-width:780px){
  .insp-mini-bar .imb-back{ margin-right:6px !important; }
  .insp-mini-bar .imb-title{ margin-left:0; flex:1 1 0 !important; min-width:0; }
  .insp-mini-bar .imb-fold{ flex:1 1 100% !important; }
}


/* ===== V2.2.30 三项修复 ===== */
/* ① AI 悬浮按钮点击热区：提升层级防透明层遮挡 + ::after 外扩 8px 热区（触控容错） */
.ai-fab{ z-index:90 !important; }
.ai-fab::after{ content:''; position:absolute; inset:-8px; border-radius:28px; }
/* ①b V2.2.84：弹窗打开时把 AI 悬浮球沉到遮罩之下。
   为什么必须做：`.mask` 只有 z-index:70，而 .ai-fab 被上面那条 `!important` 顶到 90 ——
   于是球会压住弹窗**左侧**的正文（V2.2.82 更新弹窗实测：推送正文第一个字被「AI 问答」球盖住，
   截图才看出来，DOM 断言全绿也没暴露）。用 body.modal-lock（弹窗打开时产品自己加的类）
   做条件，只在这一种状态下下沉，平时层级完全不变。
   ★ 不改 .mask 的原因：toast 也是 z-index:90，抬 .mask 会把 toast 一起压到弹窗底下。 */
body.modal-lock .ai-fab{ z-index:60 !important; }
/* ② 顶栏标题「和安筑」禁止换行（手机端右侧按钮多时不再折成两行） */
.h-title{ flex-wrap:nowrap; white-space:nowrap; }
.h-title > *{ flex:0 0 auto; }
.h-title-mb{ white-space:nowrap; }

/* ===== V2.2.36 更新公告弹窗限高（涛哥：过长压迫，缩至 80% 并内部滚动） ===== */
#modal-box{ max-height:80vh !important; overflow-y:auto !important; }

/* ===== V2.2.37 手机端顶栏版本徽标（和安筑右侧，不换行不挤压） ===== */
.h-ver{
  display:inline-block; vertical-align:2px; margin-left:6px;
  font-size:10px; font-weight:700; font-style:normal; letter-spacing:.2px;
  color:var(--blue-700,#3b6fa5);
  background:linear-gradient(135deg,rgba(91,141,239,.14),rgba(56,198,217,.12));
  border:1px solid var(--chip-b,#c7d9f8); border-radius:999px;
  padding:1px 7px; line-height:1.5;
  font-variant-numeric:tabular-nums; flex:0 0 auto; white-space:nowrap;
}
.h-title .h-title-mb{ flex:0 0 auto; white-space:nowrap; }

/* ===== V2.2.38 顶栏徽标防遮挡：压缩参数确保窄屏（360 级）也不与右侧按钮重叠 ===== */
header .h-title{ gap:5px; flex:0 1 auto; min-width:0; }
.h-ver{ margin-left:4px; padding:1px 5px; font-size:9.5px; }
header .h-actions{ gap:6px; }

/* =====================================================================
   v2.2.51 左栏「等高收缩」：19 项导航在常见桌面视口内一屏可见，免整页下拉
   根因：.side-nav 早已是独立滚动容器（styles.css:17 flex:1 + overflow-y:auto），
        但内容 885px 远超可视 716px，且 theme-v3.css:56 `scrollbar-width:thin`
        + 9px 半透明滑块让滚动条近乎不可见 → 用户误判成「要滚整页」。
   修法：① 压缩 logo / 分组标题 / 导航项 / 页脚的行高与内外边距，全部条目一屏装下；
        ② 侧栏滚动条改为常显（小视口兜底时能看见「还能滚」）；
        ③ 补 min-height:0，确保 flex 子项在矮视口下真的收缩而非撑破父容器。
   ===================================================================== */
.sidebar{ min-height:0; }
.sidebar .side-logo{ padding:16px 20px 12px; }
.sidebar .side-welcome{ margin:2px 16px 8px; padding:8px 12px; }
.sidebar .side-nav{ flex:1 1 0%; min-height:0; padding:8px 10px 10px; gap:2px; }
.side-nav > .nav-group{ padding:10px 14px 5px; font-size:10px; letter-spacing:1.2px; }
.side-nav > .nav-item{ padding:8px 13px 8px 32px; font-size:13px; }
.side-nav > .nav-item::before{ width:8px; height:8px; }
.sidebar .side-foot{ padding:10px 20px; font-size:10.5px; line-height:1.6; }
.sidebar .side-nav{ scrollbar-width:thin; scrollbar-color:rgba(91,141,239,.34) transparent; }
.sidebar .side-nav::-webkit-scrollbar{ width:6px; }
.sidebar .side-nav::-webkit-scrollbar-thumb{
  background:rgba(91,141,239,.34); border:0; background-clip:border-box; border-radius:99px;
}
.sidebar .side-nav::-webkit-scrollbar-thumb:hover{ background:rgba(91,141,239,.55); }

/* ================= V2.2.62 检查任务状态分类标签 =================
   工程详情页「合并生成整改文书」右侧的三个分类标签（检查中 / 整改中 / 已整改），
   每个标签右上角角标显示该分类下的任务数量。
   ★ 放在本文件（最后加载的样式表）末尾 ⇒ 与既有多版本覆盖链同权重时后置胜出。 */
.hz-tf-total{ font-size:11.5px; font-weight:400; color:var(--muted,#98a2b3); }
.hz-tf-ops{ margin-left:auto; display:inline-flex; align-items:center; flex-wrap:wrap; gap:10px;
  font-size:12.5px; font-weight:400; color:var(--hz-ink-3,#667085); }
.hz-tf-cnt{ color:var(--hz-ink-3,#667085); white-space:nowrap; }
.hz-tf-all{ cursor:pointer; display:inline-flex; align-items:center; gap:4px; white-space:nowrap; }
.hz-tf-merge{ background:linear-gradient(90deg,#4f7cff,#a855f7); color:#fff; border:none; border-radius:8px; }
.hz-tf{ display:inline-flex; align-items:center; gap:18px; margin-left:4px; }
.hz-tf-t{ position:relative; display:inline-flex; align-items:center; justify-content:center;
  height:28px; padding:0 14px; border:1px solid var(--hz-line,#e5e8ef); background:#fff;
  color:var(--hz-ink-3,#667085); font-size:12.5px; font-weight:500; border-radius:999px;
  cursor:pointer; transition:background .2s, color .2s, border-color .2s; }
.hz-tf-t:hover{ border-color:var(--hz-line-strong,#d5dae4); color:var(--hz-ink-1,#101828); }
.hz-tf-t.on{ background:var(--hz-brand-soft,#eaf0fe); border-color:#b9cdfc; color:var(--hz-brand-ink,#3b5bdb); font-weight:700; }
.hz-tf-n{ position:absolute; top:-7px; right:-6px; min-width:17px; height:17px; padding:0 4px;
  box-sizing:border-box; border-radius:999px; background:#94a3b8; color:#fff; font-size:11px;
  font-weight:700; line-height:17px; text-align:center; font-style:normal; box-shadow:0 0 0 2px #fff; }
.hz-tf-t.on .hz-tf-n{ background:var(--hz-brand,#4c7dff); }
/* V2.2.90（涛哥需求 2）：分类角标按状态语义着色 —— 检查中蓝 / 整改中红 / 已整改绿。
   ★ 必须放在 `.hz-tf-t.on .hz-tf-n`（上一条）**之后**：两者同为「类+属性+后代」权重，
     后者靠「后出现」胜出，选中态才不会把角标统一染成品牌蓝。 */
.hz-tf-t[data-cat="checking"] .hz-tf-n{ background:#2563eb; }   /* 检查中 · 蓝 */
.hz-tf-t[data-cat="recting"]  .hz-tf-n{ background:#dc2626; }   /* 整改中 · 红 */
.hz-tf-t[data-cat="done"]     .hz-tf-n{ background:#16a34a; }   /* 已整改 · 绿 */
@media (max-width:820px){
  .hz-tf-ops{ margin-left:0; width:100%; justify-content:flex-start; }
  .hz-tf{ gap:12px; margin-left:0; }
  .hz-tf-t{ height:26px; padding:0 11px; font-size:12px; }
}

/* ================= V2.2.62 字号可读性回抬 =================
   问题（用户 2026-09-14 反馈「网页端字体和UI大小似乎越来越小了」）——实测确认成立：
   5 个样式表叠加（styles → theme-v3 → v4 → v5），每一代都用更小的字号覆盖上一代，
   theme-v5 还用 !important 锁死。静态审计出 63 组同名覆盖链，真实浏览器实测：
     工作台 37.6% 的文字 <12px；隐患闭环看板 48.8%；统计卡副标题低到 9.5px。
   处方：统一回抬到「正文/标签 ≥12px，次要信息 ≥11px」，只改字号、不动布局尺寸与配色。
   ★ 本区块置于最后加载的样式表末尾 ⇒ 同权重后置胜出；对已被 !important 锁死的点同样加 !important。
   ★ 回退：删除本区块即可完全恢复原状（见 theme-v5.css.bak_* 备份）。 */
.side-logo .logo-ver, .logo-ver, em.h-ver, .h-ver{ font-size:11px !important; }
.side-logo small{ font-size:12px !important; }
.nav-group{ font-size:11.5px !important; }
.side-foot{ font-size:11.5px !important; }
.h-sub{ font-size:12.5px !important; }
.sw-tx{ font-size:12.5px !important; }
.stat-card .l, .dash-grid6 .stat-card .l{ font-size:12px !important; }
.stat-card .sub{ font-size:11.5px !important; }
.stat-card .trend, .trend{ font-size:11.5px !important; }
.p-meta{ font-size:12px !important; }
.empty{ font-size:12px !important; }
.ai-sub{ font-size:12px !important; }
.chip, .chip-count, .haz-cat-n, .kb-chip, .tier-badge{ font-size:12px !important; }
.badge{ font-size:11.5px !important; }
.session-item .s-row2{ font-size:12px !important; }
.session-item .s-hz, .session-item .s-rg, .session-item .s-cotag{ font-size:11.5px !important; }
.mini-bar .imb-title, .insp-mini-bar .imb-title{ font-size:12.5px !important; }
.panel-h{ font-size:14px !important; }
.sec-title{ font-size:14.5px !important; }

/* V2.2.62 字号回抬 · 第二轮补漏（首轮实测后复测仍 <12px 的项） */
.da-sub{ font-size:12px !important; }
.nav-group{ font-size:12px !important; }
.hz-bp-n, .hz-bp-it-tx, .hz-bp-rec-tx{ font-size:12px !important; }
.hz-st, .hz-bp-task-h > .hz-st, .hz-bp-task-act .hz-st{ font-size:11.5px !important; }
.hz-bp-rec .hz-st{ font-size:11.5px !important; }
.imb-title, .insp-mini-bar .imb-title{ font-size:12.5px !important; }

/* V2.2.62 字号回抬 · 第三轮（收尾：把仍 <12px 的高频项与可点操作标签抬齐） */
.side-foot{ font-size:12px !important; }
.stat-card .sub{ font-size:12px !important; }
.fp-fold, .fp-open, .rk-me-tip{ font-size:12px !important; }

/* =======================================================================
   V2.2.71 字号策略变更（涛哥 2026-09-14 第二轮反馈，取代 V2.2.63 的开关式设计）
   -----------------------------------------------------------------------
   原文：「取消小字号的网页端大小，保留大字号的页面效果（我的意思就是小字号太小了，
          干脆不要了，还能节省一个上栏的图标）。同时，手机端保留目前小字号的界面，
          连同大字号按钮、大字号界面一起删除（因为我觉得手机端的小字号就够用了）。」

   结果 —— 两端都**不再有开关**，纯由视口宽度决定，用户无法也不需要选择：

     · >820px（桌面）：固定 zoom 1.35 —— 即原「大字号」的页面效果
                       （V2.2.63 实测 ×1.354、横向溢出 0px、PC 端 fixed 元素集合为空）
     · ≤820px（手机）：**不放大**（zoom 保持默认 1）—— 即原「小字号」界面

   ⇒ 上栏 A+ 按钮、`hz-bigfont` 类、`hz_bigfont` 偏好键**全部作废**
     （清理见 app-laws.js 的 hzApplyDisplay 与 index.html）。

   为什么手机端是「不放大」而不是「保留原来的 1.15」：
     涛哥要的是「手机端保留**目前小字号**的界面」，而手机端默认（未开大字号时）就是 zoom:1。
     原 1461 行的 `zoom:1.15` 属于**大字号功能**的一部分，随该功能一并删除。
     所以这条规则必须写成**无条件的 `body`**，不能再带 `.hz-bigfont` 前缀。
   ======================================================================= */
@media (min-width:821px){
  /* ★ E1 阶段 1（2026-09-30）：原为硬编码 `zoom:1.35`，与本文件 :2233 的
     `:root{--hz-page-zoom:1.35}` **构成两处数值**，注释自己都写着「改一处要改两处」。
     ⇒ 改为引用变量，使 `--hz-page-zoom` 成为**唯一数值来源**（值不变，渲染零变化）。
     ⚠ 兜底值 1.35 与现状完全等价；本规则只在 ≥821px 生效，此时变量必已定义。 */
  body{ zoom: var(--hz-page-zoom, 1.35); }
}

/* =======================================================================
   V2.2.72 桌面端 zoom 下「浮层被顶出视口」修复（涛哥 2026-09-15 报 bug）
   -----------------------------------------------------------------------
   现象：「网页端字号现在固定了大字号，站内信弹窗没做适配，现在站内信弹窗
          溢出了网页端，我点不到站内信的上栏。修复这个bug」

   实测取证（Edge headless 1280×900，bodyZoom=1.35，视口 1256×808）：
     · .mail-mask   rect 1256×808  → **正好等于视口，本来就是对的**
     · .mail-panel  rect 1026×938  → 视口只有 808，**上下各被切 65px**
       计算值 height:min(86vh,780px) = 694.9，×1.35 渲染 = 938px
     ⇒ .mail-head（上栏标题行）rect.top = -65（视口外）
       ⇒ elementFromPoint(628,-9) 命中 null ⇒ **点不到** ✓ 与涛哥描述完全吻合

   ★ 真正的规律（两套坐标系，别搞混）：
     · getBoundingClientRect() 返回**视觉坐标**（已被 zoom 放大）
       getComputedStyle() 返回**布局坐标**（zoom 前）；两者正好相差 1.35
     · 对 fixed 浮层：`inset:0` 与 `100%` 会被 Chrome 按「视口 / zoom」作参照自动修正，
       **视觉上正好等于视口**；而 `vh` / `vw` **不做修正** —— 86vh 会渲染成 116vh。
     ⇒ 所以只需给「用 vh/vw 定尺寸的浮层」做反算，**遮罩一个都不用动**。

   ⚠ 教训留存：本修的第一版把全屏遮罩也一起 /1.35 反算，实测反而把遮罩压成 599px 高
     （遮罩本来就是对的），面板随之被切 48px。**「看起来会溢出」≠「真的溢出」，
     必须先量 rect、再动手**；本次靠 before/after 截图 + elementFromPoint 命中测试钉死。

   ✅ E1 阶段 1（2026-09-30）已消除此隐患：上方 body 规则改为 `zoom: var(--hz-page-zoom, 1.35)`，
      本变量即成**唯一数值来源**，改字号只需改这一处。
   ⚠ 阶段 2（真正的去 zoom 改造）尚未进行 —— 需一次性处理 38 个点位
      （31 处 CSS 反算 + 7 处 JS 坐标换算，牵涉 8 个核心交互），
      且**必然改变渲染**，故必须先在隔离环境做原型 + 全页面截图比对后再上线。
      影响面清单见本文件末尾「E1 改造前盘点」注释块。
   ======================================================================= */
@media (min-width:821px){
  :root{ --hz-page-zoom: 1.35; }

  /* 站内信面板：86vh -> 视觉 116vh，上下各切 65px => 上栏点不到。反算回「视觉 86vh」。 */
  .mail-panel{
    height: min(calc(86vh / var(--hz-page-zoom)), calc(780px / var(--hz-page-zoom)));
  }

  /* 底部抽屉式 modal：max-height:84vh -> 视觉 113vh，上沿被顶出视口。同理反算。 */
  .modal .sheet{
    max-height: calc(84vh / var(--hz-page-zoom));
  }

  /* V2.2.76（涛哥截图：AI 记录隐患弹窗标题被切、内容溢出网页边界）：
     V2.2.36 给 #modal-box 定的 max-height:80vh，在 zoom 1.35 下视觉高度 = 108vh
     ⇒ 比视口还高，flex 居中后上下各切出约 4vh。同理反算回「视觉 80vh」。
     ★ 必须带 !important —— V2.2.36 那条是 `80vh !important`，同特异性下重要声明胜出。 */
  #modal-box{
    max-height: calc(80vh / var(--hz-page-zoom)) !important;
  }
}

/* ===== V2.2.76 弹窗动作按钮**文字居中**（涛哥反馈：「直接记录 / AI 优化描述 / 记入检查记录」
   三颗按钮的文字没有居中） ====================================================
   根因（不是 padding、不是 letter-spacing）：`.btn` 全局定义是
       .btn{ display:inline-flex; align-items:center; gap:6px; … }     ← styles.css:78
   **没有 justify-content** ⇒ flex 容器主轴默认从起点排列，内容整体贴左；
   而且 `text-align:center` 对 flex 容器**不生效**，所以一直没人发现能这么修。
   旁证：同项目 theme-v3.css 里排位赛按钮早就单独补过 `justify-content:center`
   （注释写着「所有按钮文字垂直水平居中」）—— 说明这是 .btn 的既知缺陷，只是没全局修。

   ★ 这里**只补「弹窗底部动作区」和「AI 结果区动作按钮」两处**（即涛哥点名的那三颗），
     不动全局 .btn —— 有些带图标的按钮按设计就是左起排列（gap:6px 就是为图标+文字准备的），
     全局加 justify-content 会把它们全部改成居中，属于未经确认的版式扩散。 */
.mb-foot .btn,
.ai-opt-btns .btn{
  justify-content:center;
  text-align:center;
}

/* ===== V2.2.77 AI 问答抽屉两处（涛哥 2026-09-15 下午反馈）====================
   ① 「回答文本没有适配弹窗大小，我需要左右拖动浏览回答」
      —— 实测（手机 390×844）：#ai-body `scrollWidth=543 / clientWidth=367`，横向溢出 176px；
         真凶是**回答里那张 7 列表格**（宽 459px）。链路上 `.ai-msg`、`.bubble`、以及
         表格的外层 div 都是 flex 子项，而 **flex 子项默认 `min-width:auto`** ——
         它不会被压缩，于是宽内容一路把祖先撑破，最后整条回答出现横向滚动条。
      ⇒ 逐层锁宽（max-width:100% + min-width:0），宽表格只在**它自己的滚动容器内**横滚。
   ② 「滑动问答内容时会带动下方网页页面一起滑动」（滚动穿透）
      —— 实测 `getComputedStyle('#ai-body').overscrollBehavior === 'auto'`。
         触摸滚到边界后滚动链继续传给 body ⇒ 背景页跟着动。
      ⇒ `overscroll-behavior: contain` 断链；再加一层「打开抽屉时锁 body 滚动」（见 ai.js）。
   ⚠ 注意 `#ai-body` 原为 `overflow-y:auto`，按 CSS 规则其 `overflow-x` 会被连带算成 auto
     ⇒ 内容一宽就出横向滚动条。这里显式 `overflow-x:hidden` 关掉它。
   ========================================================================== */
.ai-body > *{ max-width:100%; min-width:0; }
.ai-body .ai-msg{ max-width:100%; min-width:0; }
.ai-body .ai-msg .bubble{ max-width:100%; min-width:0; overflow-wrap:anywhere; }
.ai-body .ai-msg .bubble > *{ max-width:100%; min-width:0; }
.ai-body table{ max-width:100%; }
.ai-body{ overflow-x:hidden; overscroll-behavior:contain; -webkit-overflow-scrolling:touch; }
.ai-drawer{ overscroll-behavior:contain; }
/* 抽屉打开时锁住背景页滚动 —— 防穿透的最后一道保险 */
body.ai-open{ overflow:hidden; }

/* ===== V2.2.78 附录原图集（规范浏览页）=====
   来自 docx「整个附录的插图」整块附上（不做逐处对应，避免错配）。
   图片本体复用 .lib-imgs / .lib-img-fig 既有样式（灯箱、懒加载、失败占位一致），这里只补容器与标题。 */
.lib-apx{ margin:12px 0 6px; }
.lib-apx-h{
  font-size:12.5px; font-weight:700; color:#334155;
  padding:6px 10px; margin-bottom:6px;
  background:#f4f7fd; border-left:3px solid #6f9cf7; border-radius:6px;
}

/* ===== V2.2.80 附录「按原文阅读顺序」重建版（JGJ 94）
   段落 / 公式图 / 结构化表格 按 docx 原始顺序交替排布，替代之前那堆「条目 + 71 处图源缺失」。 */
.apx-item{ padding-bottom:8px; }
.apx-h{
  font-size:14.5px; font-weight:750; color:#0f172a;
  margin:14px 0 8px; padding:8px 12px;
  background:linear-gradient(135deg,#eef4ff,#f7faff);
  border-left:3px solid #5b8def; border-radius:8px;
}
.apx-item .lib-table-wrap{ margin:8px 0 14px; }
.apx-item .lib-img-fig{ margin:8px 0; }
.apx-item .cl-text{ margin:2px 0; }

/* ===== V2.2.100 AI记录隐患弹窗「两栏版式」（涛哥 2026-09-20 截图反馈）=============
   诉求原文：
     「网页端…在 AI 记录隐患弹窗中左侧新增弹窗的页面，等于是把原来弹窗页面变成了两页，
       左侧页面是库内联想（如用户开启该功能），右侧是原来的 AI 记录隐患弹窗。
       至于手机端，库内联想保持下拉菜单的方式。」

   为什么这么写（四个关键决策，都踩过）：
   ① 只在「电脑端(≥821px) + 库内联想开启 + 本弹窗」同时成立时两栏，判据用
      `#modal-box:has(.gm-split-on)` 而**不是** JS 往 #modal-box 挂 class。
      原因：#modal-box 是所有弹窗**共用**的容器，别的弹窗也会往它里面写 innerHTML；
      靠 class 切换就会把版式带到不相干的弹窗上（且忘了清理就一直串味）。
      :has() 只看「当前 DOM 里有没有这个元素」，换内容即自动失效，零状态残留。
   ② 宽度按本文件既有惯例 `calc(px / var(--hz-page-zoom))` 反算 —— zoom 下 `vw` 不修正、
      `100%` 会修正（见上方 V2.2.71 区块注释），所以右边界用 `100%` 而非 `vw`。
      目标观感：整体 ≈940 视觉px（左栏 300 + 间距 16 + 右栏 ≈620，比原来的 621 略宽）。
   ③ `#modal-box` 宽度来自 styles.css:305 `.mbox{width:min(460px,100%)}`。
      选择器 `#modal-box:has(.gm-split-on)` 特异性 (1,1,0) > `.mbox` (0,1,0)，故能覆盖。
   ④ `.mbox > *{max-width:100%}`（本文件 1335 行）原本保护直接子元素不横向溢出；
      本版多包了 .gm-split/.gm-main 两层 ⇒ 必须把这条保护补回这两层，否则长表格会撑破弹窗。 */
.gm-split{ display:block; }
.gm-split > *, .gm-main > *{ max-width:100%; }
.gm-sug-pane{ display:none; }
.gm-sug-pane-h{
  display:flex; justify-content:space-between; align-items:baseline; gap:8px;
  font-size:12.5px; font-weight:700; color:#334155;
  padding:6px 10px; margin-bottom:8px;
  background:#f4f7fd; border-left:3px solid #6f9cf7; border-radius:6px;
}
.gm-sug-pane-n{ font-size:11.5px; font-weight:600; color:#94a3b8; white-space:nowrap; }
.gm-sug-pane-b{ overflow-y:auto; overflow-x:hidden; }

@media (min-width:821px){
  #modal-box:has(.gm-split-on){ width: min(calc(940px / var(--hz-page-zoom)), 100%); }
  #modal-box:has(.gm-split-on) .gm-split{ display:flex; gap:16px; align-items:stretch; }
  /* 左栏常驻：随弹窗内部滚动**吸顶**，输入/挑选时不会滚出视野 */
  #modal-box:has(.gm-split-on) .gm-sug-pane{
    display:flex; flex-direction:column; min-width:0;
    flex:0 0 calc(300px / var(--hz-page-zoom));
    align-self:flex-start; position:sticky; top:0;
    padding-right:16px;
    border-right:1px solid var(--line,#e2e8f0);
  }
  /* 候选多时左栏内部自己滚，不去撑高弹窗（/zoom 反算成视觉高度，同 .mail-panel 的写法） */
  #modal-box:has(.gm-split-on) .gm-sug-pane-b{ max-height: calc(60vh / var(--hz-page-zoom)); }
  #modal-box:has(.gm-split-on) .gm-main{ flex:1 1 auto; min-width:0; }
}

/* =====================================================================
   ★★ V2.3.2（涛哥 2026-09-21 报障）：AI记录隐患弹窗「底栏固定在最下方」
   现象：点「AI优化描述」后内容一下子变长，底栏（取消 / AI优化描述 / 直接记录）
        被推到最底下，用户必须下滑才能点到 —— 而这三颗按钮是弹窗**唯一出口**。
   根因：#modal-box 自己就是滚动容器（本文件上方 `max-height:80vh; overflow-y:auto !important`）
        ⇒ 里面的所有东西（含底栏）都跟着一起滚。
        （新弹窗走的 hzModalShell 是「头固定/中滚动/脚固定」三段式，所以没这毛病；
          本弹窗用的是**共用老容器** #modal-box —— openGenModal 直接 box.innerHTML。）
   修法：在本弹窗场景下把 #modal-box 改成同款三段式，与 styles.css:1957
        的 `.mbox.j59-basis-mbox` 完全同一套做法（那是同类问题的既有先例，照着来）。
        · #modal-box 不再自己滚（overflow:hidden，盖掉上方那条 !important）
        · 滚动下沉到内容区 .gm-main
        · 底栏 flex:0 0 auto + position:sticky;bottom:0
          ⇒ 内容不足一屏时贴底（margin-top:auto 推到底），超出一屏时钉在底部
   ★ 作用域用 `:has(#gm-ai)` 限定 —— #modal-box 是**所有弹窗共用**的容器，
     全局改会让别的弹窗（各种确认框）也变成 flex 三段式而错版。
   ★ 横向不加负 margin 去抵消 .mbox 的 padding：本需求只要求"固定住"，
     横向观感必须与现状一致（改宽度属于未经确认的版式扩散）。
   ===================================================================== */
#modal-box:has(#gm-ai){
  display:flex; flex-direction:column;
  overflow:hidden !important;
}
#modal-box:has(#gm-ai) > h3{ flex:0 0 auto; }
/* ★★ V2.3.7 修（涛哥 2026-09-21 报障）：这里必须**默认纵向堆叠**。
   涛哥原话：「网页端 AI记录隐患在关闭库内联想功能的时候出现了滚动条消失，
             用户无法滚动浏览全部弹窗内容」。
   根因：原先「纵向堆叠」只写在**手机端媒体查询**里（见本块末尾），
        于是电脑端**关闭库内联想**时 `.gm-split` 仍是 `display:block`（本文件 2407 行）
        ⇒ 它的子项 `.gm-main` 上的 `flex:1 1 auto; min-height:0` **全部失效**
          （block 父级里 flex 属性本就无效）
        ⇒ `.gm-main` 的高度由内容撑开、拿不到限高
        ⇒ 既不出滚动条，又被本块的 `#modal-box:has(#gm-ai){ overflow:hidden }` 直接裁掉
        ⇒ 用户既看不到、也滚不到。
   ★ 为什么「只有关掉联想才复现」：开启时 `.gm-split-on` 那条（2421）把 `.gm-split` 变成
     flex 行，`.gm-main` 才真正成为 flex item、才拿得到限高 —— 所以这个坑一直藏着。
   ★ 特异性 (1,2,0)，与 2421 的两栏规则同分；横向两栏在下方用 (1,3,0) 显式覆盖回来。 */
#modal-box:has(#gm-ai) .gm-split{
  display:flex; flex-direction:column;
  flex:1 1 auto; min-height:0;
}
/* 内容区承担滚动。min-height:0 是必须的 —— 否则 flex 子项不肯收缩，滚动条出不来 */
#modal-box:has(#gm-ai) .gm-main{
  flex:1 1 auto; min-width:0; min-height:0;
  display:flex; flex-direction:column;
  overflow-y:auto; overflow-x:hidden;
  overscroll-behavior:contain; -webkit-overflow-scrolling:touch;
}
/* ★★ 关键一条：内容子项**一律不许收缩**（flex:0 0 auto）。
   踩过的坑：.gm-main 一旦是 flex 列，里面的 #gm-ai 默认 flex-shrink:1 ⇒
   内容超长时它被**压扁**（实测 1529px 的内容被压进 318px），而 #gm-ai 自带
   `overflow:hidden`（theme-v5 上方 V10 化样式的圆角裁切）⇒ 中间内容被**直接裁掉**，
   且 .gm-main 感受不到溢出（scrollHeight == clientHeight）⇒ 滚动条根本不出现。
   修法就是让子项按内容自然撑高 ⇒ .gm-main 才会溢出 ⇒ 滚动条出现、内容不被裁。 */
#modal-box:has(#gm-ai) .gm-main > *{ flex:0 0 auto; }
/* 底栏：永远贴在弹窗最下方 */
#modal-box:has(#gm-ai) .mb-foot{
  flex:0 0 auto;
  margin-top:auto;
  position:sticky; bottom:0; z-index:3;
  background:#fff;                       /* 与 .mbox 同底色（styles.css:305 也是 #fff，暗色下弹窗同样白底） */
  padding-top:12px;
  box-shadow:0 -10px 18px -14px rgba(15,23,42,.22);   /* 内容滚到它下面时给一条上沿阴影作提示 */
}
/* 电脑端「库内联想开启」时才改回**横向两栏**（默认纵向见上方 .gm-split 那条）。
   ★ 必须 (1,3,0) —— 双 `:has` 才能压过 2421 的 `:has(.gm-split-on)`(1,2,0)，
     以及与上方默认纵向同分时的顺序不确定性问题。 */
@media (min-width:821px){
  #modal-box:has(#gm-ai):has(.gm-split-on) .gm-split{ flex-direction:row; }
}

/* =====================================================================
   ★★ V2.3.5（涛哥 2026-09-21）：三栏高度必须与浏览器视口等高
   涛哥原话：「目前我们大部分界面已经独立滚动、互不穿透，那么我们是否应该限制页面的高度，
             使其与浏览器页面高度一致？否则…右栏中往往会有很多依据、中栏中隐患库数量庞大，
             那么多余的条目直通非常下面，而因为独立滚动了，即使用户在中栏/右栏滑动到最下方，
             整体页面也无法整体向下，导致用户无法阅读完全的中栏内容」
   **判断成立**，实测证据：`.insp3` 视觉高 **1026px**，视口只有 **900px**
     ⇒ **栏底有 126px 在屏幕外** ⇒ 三栏虽然能各自滚动，但滚到栏底时那一截落在屏幕外，
       最后的内容用户永远看不到（页面又整体不滚，没有第二条出路）。
   根因：`styles.css:588` 写的是 `height: calc(100vh - 140px)` ——
        **`vh` 在 zoom 下不修正**，于是渲染成视觉 (900-140)×1.35 = 1026px
        （与 V2.2.71 抽屉、V2.2.76 弹窗同一个老坑）。
   修法：**运行时实测栏顶**再算高度（写死任何一个数都会再错，见下）——
        由 `hzFitInsp3()`（app-tail.js）设 inline `height`，本处只是 JS 未跑时的**兜底值**。
   ★ 兜底值取 245px：这是实测的**栏顶布局位置**（1440×900 / zoom1.35 下视觉 330px）。
     注意它**与视口高度无关**（取决于「顶栏 + 检查页页头」的高度），所以对所有 PC 视口都适用。
     原 `styles.css:588` 写死 140px —— 那是更早版式的值，现在顶栏高了 ⇒ 必然溢出。
   ★ 断点用 `min-width:921px` —— 窄屏（≤920px）本来就被
     `styles.css:629 .insp3{height:auto}` 覆盖成「竖向堆叠 + 高度自适应」，**不能碰**。
   ★ 全局左栏（.sidebar）在 V2.3.3 已同样按 zoom 反算限高（实测视觉高 = 视口高）✓
   ===================================================================== */
@media (min-width:921px){
  .insp3{ height: calc(100vh / var(--hz-page-zoom) - 245px); }
}

/* =====================================================================
   ★★ V2.3.3（涛哥需求）：全局左栏独立滚动 —— 在左栏上下滑动**不再带动页面**
   实测复现（CDP 真滚轮，1440×900，先量后改）：
     · 在左栏中心滚一次 → `.side-nav` 滚 62px，页面没动；
     · **再滚一次 → 页面直接跳 600px** ✗
       原因：`.side-nav` 只溢出 61px（scrollHeight 766 / clientHeight 705），
       滚到底后**滚动链外溢**到页面 = 经典「滚动穿透」。
     · 另测出 `.sidebar` 实际高 **1215px > 视口 900px**（sticky 却没限高）
       ⇒ 左栏下半截其实压在页面上，在那儿滑动等于直接滚页面。
   根因：`overscroll-behavior:contain` 只在**手机端媒体查询**里写过 ——
        `styles.css:52` 位于 `@media(max-width:820px)` 内，`styles.css:915` 同属手机端区块
        ⇒ **电脑端从来没有生效过**（实测 computed 一直是 `auto`）。
   修法两条：
     ① 电脑端把 `.sidebar` 限高到视口（vh 在 zoom 下不修正，必须按 --hz-page-zoom 反算）
        ⇒ 左栏不再比屏幕高；
     ② 左栏及其内部滚动容器一律**断掉滚动链**（不限媒体查询：手机端本就该有，电脑端是补漏）。
   ★ 覆盖范围（涛哥点名要求「统一修到所有检查专项」）：
     · 全局侧边导航：.sidebar / .side-nav
     · **检查页三栏（三个专项共用同一套 DOM）：.insp-left / .insp-mid / .insp-right**
       —— 日常安全清单检查(jgj59) / 安管人员履职检查 / 日常抽查，三者都是这套三栏
     · **指南依据弹窗：`#modal-box.j59-basis-mbox` + 内部 `#j59-basis-list`**
     · 其它侧栏：.mail-list（站内信）、.law-toc（规范目录）
     `overscroll-behavior` 对「不可滚动的元素」无副作用，多写几个是安全的。
   ===================================================================== */
.sidebar,
.sidebar .side-nav,
.side-nav,
.insp-left,
.insp-mid,
.insp-right,
.mail-list,
.law-toc,
#modal-box.j59-basis-mbox,
#modal-box.j59-basis-mbox #j59-basis-list,
#j59-basis-list{
  overscroll-behavior: contain;
  overscroll-behavior-y: contain;
  -webkit-overscroll-behavior: contain;
}
/* ★ 顺带修一处既有缺陷：（V2.2.36）的特异性
   (1,0,0) 高于 `.mbox.j59-basis-mbox{ overflow:hidden }`(0,2,0) ⇒ 依据弹窗的「三段式」被压掉，
   变成**弹窗自己 + 内部列表 双层滚动**。这里用更高特异性 + !important 压回去，
   滚动只交给 #j59-basis-list（实测修复前 box.overflowY=auto）。 */
#modal-box.j59-basis-mbox{ overflow: hidden !important; }

@media (min-width:821px){
  /* 电脑端左栏限高到视口：vh 在 zoom 下不修正 ⇒ 必须 calc(100vh / zoom)，
     否则会渲染成视觉 135vh、比屏幕还高（本项目 V2.2.71/76 已踩过同类坑）。 */
  .sidebar{
    height: calc(100vh / var(--hz-page-zoom));
    max-height: calc(100vh / var(--hz-page-zoom));
    overflow: hidden;              /* 左栏自身不滚，滚动交给内部 .side-nav */
  }
}

/* ══ 空态插画组件（2026-09-30 M6）══════════════════════════════════════════
   与 .empty 分工：`.empty` 继续管**紧凑纯文字**小空态（全站 91 处，不动其定义）；
   `.hz-empty` 管**需要插画 + 首步引导**的主空态（工程列表 / 检查任务 / 文书 / 通知 / 搜索无结果）。
   ★ M8 示范：样式写在这里，不写内联 style（见 theme-tokens.css 头部的团队约定）。 */
.hz-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; padding: 22px 16px; text-align: center; }
.hz-empty .hz-empty-art { color: var(--hz-line-strong, #d5dae4); flex: none; display: block; }
.hz-empty .hz-empty-t { font-size: 13.5px; font-weight: 700; color: var(--hz-ink-2, #344054); line-height: 1.5; }
.hz-empty .hz-empty-d { font-size: 12px; color: var(--hz-ink-3, #667085); line-height: 1.6; max-width: 430px; }
.hz-empty .hz-empty-act { margin-top: 6px; }

/* ══════════════════════════════════════════════════════════════════════════
   ★ E1「桌面 zoom:1.35 架构」改造前盘点（2026-09-30，仅调研、未改动）
   为什么现在不动它（报告 N4 红线）：改造成本远超想象，且**必然改变渲染**。
   实测影响面（若要以 rem + 字号档替代固定 zoom）：
     · 定义处 **2 处必须同步**：本文件 (:2203) 与 (:2233)
     · CSS「必须除以 zoom」的反算补丁 **31 处**：shell-fit.css 11 ｜ theme-v5.css 11 ｜ ai-page.css 9
     · JS 里读取 zoom 并做视觉↔布局坐标换算 **7 处**：
         ai.js ×2、app-fmt.js、app-lawjump.js、app-signpad.js、app-suggest.js、app-tail.js
     · 牵涉模块：AI 页、弹窗骨架、法规阅读、签字板、联想浮层、文书、检查页三栏、侧栏
   ⇒ 结论：**31 + 7 处都要逐点重新验证**，且 zoom 一旦移除，所有 
     会瞬间变成多除了一次⇒ 必须先一次性评估全部 38 个点位，不能边改边看。
   ⇒ 若将来要动：**先建全模块截图基线**（本仓已有 E:/heanzhu_shots/baseline 与 e1/），
     再分阶段替换，每阶段全页面比对。
   ══════════════════════════════════════════════════════════════════════════ */

/* ═════════════════════════════════════════════════════════════════════════
   F4 无障碍第一步（2026-09-30，功能线 zcode）：恢复键盘焦点圈
   · 仅 :focus-visible（键盘导航）显示，鼠标点击不触发，不改变任何视觉基线
   · 本文件最后加载 ⇒ 规则可覆盖此前散落的 outline:none（styles.css 10+ 处）
   · 只追加、不改既有行（双线协议：zcode 仅动 outline/focus 相关行）
   ═════════════════════════════════════════════════════════════════════════ */
:focus-visible{outline:2.5px solid #4c7dff !important;outline-offset:2px}

/* ★ 2026-11-04 涛哥：任务列表「含监督抽检」胶囊标签 */
.session-item .s-sp{
  display:inline-flex;align-items:center;gap:3px;
  font-size:11px;font-weight:600;line-height:1;
  padding:3px 8px;border-radius:999px;white-space:nowrap;margin-left:6px;
  background:#eaf1fe;color:#2f6fed;border:1px solid #d3e0fb;
}
.session-item .s-sp.bad{background:#fdecea;color:#c0392b;border-color:#f6cfcb}
[data-theme="dark"] .session-item .s-sp{background:#1d2b4a;color:#8db4ff;border-color:#2f4a78}
[data-theme="dark"] .session-item .s-sp.bad{background:#3a1f1c;color:#f19a90;border-color:#5c322c}
