/* =====================================================================
   theme-ios.css —— 和安筑 iOS 视觉层（Apple HIG 规范）· 2026-10-07
   =====================================================================
   【定位】纯换皮层。参照 Apple 官方设计规范（Human Interface Guidelines）
   重写视觉语言：SF Pro 字阶、13px 圆角、四层柔和阴影、毛玻璃仅用于导航层、
   弹性缓动 cubic-bezier(.34,1.26,.64,1)、1.7px 线性图标。

   【为什么不直接改 theme-tokens.css】
   现有 CSS 有 6 层叠加（theme-tokens → styles → v3 → v4 → v5 → ai-page），
   直接改底层令牌会一次性影响全站 20+ 个页面，出问题极难定位回滚。
   本层**排在最前之后、其余全部之后**，靠「同特异性 + 后出现」覆盖，
   删掉 index.html 里本文件那一行即可**完全回退**，零残留。

   【设计令牌对照旧版】
     旧渐变  #4c7dff → #7a5cff → #ec4899（蓝紫粉）  ⇒ 弃用（AI 套路色，同屏与蓝 logo 打架）
     新强调  #0A84FF（Apple Blue）单一色
     旧圆角  16px 单一值                        ⇒ 改三级 13/18/22
     旧阴影  2 层                               ⇒ 改四层 s1–s4

   【无障碍】
     · 文字对比度全部 ≥ 4.5:1（Ink1 16.1:1 / Ink2 8.2:1 / Ink3 3.5:1 仅用于非关键信息）
     · 状态一律「色点 + 文字徽标」双编码，色弱用户可读
     · 触摸目标 ≥ 44px（iOS HIG）
     · 尊重 prefers-reduced-motion
   ===================================================================== */

/* ═══════════════════════════════════════════════════════════════════
   一、设计令牌（.hz-ios-scope 之外也生效，供全局复用）
   ═══════════════════════════════════════════════════════════════════ */
:root {
  /* ---------- 色彩：单一强调 + iOS 三级背景 + 三级文字 ---------- */
  --ios-acc:        #0A84FF;   /* Apple Blue */
  --ios-acc-deep:   #0B5FBF;
  --ios-acc-soft:   #E8F2FF;
  --ios-acc-veil:   rgba(10, 132, 255, .10);

  --ios-bg:         #F2F2F7;   /* iOS grouped background */
  --ios-card:       #FFFFFF;
  --ios-bg-3:       #FAFAFC;   /* 卡片内嵌块 */
  --ios-bg-4:       #F5F5F7;   /* 次级按钮底 */

  --ios-ink-1:      #1C1C1E;   /* 主文  对比度 16.1:1 */
  --ios-ink-2:      #48484A;   /* 正文  对比度  8.2:1 */
  --ios-ink-3:      #6B6B70;   /* 次要  对比度  5.1:1（比 iOS 原 #8E8E93 提高） */
  --ios-ink-4:      #8E8E93;   /* 占位/装饰，不承载关键信息 */

  --ios-line:       rgba(60, 60, 67, .13);
  --ios-line-2:     rgba(60, 60, 67, .06);

  /* ---------- iOS 系统语义色 ---------- */
  --ios-danger:     #FF3B30;
  --ios-danger-ink: #C7000A;   /* 文字用（保证对比） */
  --ios-danger-bg:  rgba(255, 59, 48, .12);
  --ios-warn:       #FF9F0A;
  --ios-warn-ink:   #8F5000;
  --ios-warn-bg:    rgba(255, 159, 10, .14);
  --ios-ok:         #34C759;
  --ios-ok-ink:     #0A7A33;
  --ios-ok-bg:      rgba(52, 199, 89, .14);
  --ios-rank:       #FFCC00;   /* 榜单金 */

  /* ---------- 圆角：三级递进（控件 13 / 卡片 18 / 容器 22） ---------- */
  --ios-r-ctl:  13px;
  --ios-r-card: 18px;
  --ios-r-cont: 22px;
  --ios-r-xl:   28px;   /* 特大容器（专注模式主按钮）；2026-10-07 补：此前只引用未定义 */
  --ios-r-pill: 999px;

  /* ---------- 阴影：四层 ---------- */
  --ios-s1: 0 1px 2px rgba(0, 0, 0, .04);            /* 常态微浮 */
  --ios-s2: 0 4px 16px rgba(0, 0, 0, .07);           /* 悬停 */
  --ios-s3: 0 12px 40px rgba(0, 0, 0, .10);          /* 卡片抬起 */
  --ios-s4: 0 20px 60px rgba(0, 0, 0, .14);          /* 模态/抽屉 */

  /* ---------- 动效：Apple 式弹性 ---------- */
  --ios-ease:  cubic-bezier(.34, 1.26, .64, 1);      /* 弹性（用于交互反馈） */
  --ios-ease-o: cubic-bezier(.4, 0, .2, 1);          /* 常规（用于状态切换） */
  --ios-dur:   .28s;

  /* ---------- 毛玻璃：仅导航层使用 ---------- */
  --ios-blur: saturate(180%) blur(26px);
  --ios-blur-nav: rgba(255, 255, 255, .72);
  --ios-blur-side: rgba(248, 248, 250, .76);
}

/* ═══════════════════════════════════════════════════════════════════
   二、全局基线（仅在不改变布局的前提下做视觉统一）
   ═══════════════════════════════════════════════════════════════════ */

/* 数字统一等宽比例：指标数字上下跳动是最廉价感的来源 */
.hz-ios-tabular,
.stat-card .v,
.kv,
.dash-rank .rk-pts,
.rk-me-pts { font-variant-numeric: tabular-nums; font-feature-settings: "tnum"; }

/* iOS 语义色映射到项目既有类名（避免改动各处业务模板） */
.sl-verdict.sl-v-bad,
.verdict-bad { background: var(--ios-danger-bg) !important; color: var(--ios-danger-ink) !important; }
.sl-verdict.sl-v-ok,
.verdict-ok  { background: var(--ios-ok-bg) !important;     color: var(--ios-ok-ink) !important; }
.sl-verdict.sl-v-mix { background: rgba(10,132,255,.12) !important; color: var(--ios-acc-deep) !important; }
.sl-verdict.sl-v-ill { background: rgba(118,118,128,.12) !important; color: var(--ios-ink-2) !important; }

/* 焦点可见性：键盘导航必须看得见（无障碍硬指标） */
:focus-visible {
  outline: 2px solid var(--ios-acc);
  outline-offset: 2px;
  border-radius: 4px;
}

/* 图片加载失败的提示卡（app-imgload.js 注入的）—— 换 iOS 语言 */
.sl-img-fail {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  background: rgba(250, 250, 252, .94) !important;
  color: var(--ios-ink-2) !important;
  font-size: 11.5px !important;
  border-radius: 10px;
  backdrop-filter: saturate(180%) blur(12px);
  -webkit-backdrop-filter: saturate(180%) blur(12px);
}
.sl-img-fail b { color: var(--ios-ink-2) !important; font-weight: 600 !important; }
.sl-img-retry {
  font-family: inherit !important;
  background: var(--ios-card) !important;
  color: var(--ios-acc) !important;
  border: none !important;
  border-radius: 8px !important;
  padding: 5px 14px !important;
  font-size: 12px !important;
  font-weight: 600 !important;
  box-shadow: var(--ios-s1);
  transition: transform .18s var(--ios-ease);
}
.sl-img-retry:hover { transform: scale(1.04); background: #fff !important; }
.sl-img-retry:active { transform: scale(.96); }

/* ═══════════════════════════════════════════════════════════════════
   三、示范样板库页（试点范围）
   ═══════════════════════════════════════════════════════════════════ */

/* 页面容器：iOS grouped 背景 */
.sl-wrap, .kb-wrap { background: var(--ios-bg) !important; }

/* 左侧方案树：玻璃层 */
.sl-nav {
  background: var(--ios-blur-side) !important;
  backdrop-filter: var(--ios-blur);
  -webkit-backdrop-filter: var(--ios-blur);
  border: .5px solid var(--ios-line) !important;
  border-radius: var(--ios-r-cont) !important;
  box-shadow: var(--ios-s1) !important;
  padding: 10px !important;
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
}
.sl-navsearch { margin-bottom: 8px !important; }
.sl-navsearch input {
  font-family: inherit !important;
  background: rgba(118, 118, 128, .10) !important;
  border: none !important;
  border-radius: 10px !important;
  height: 36px !important;
  font-size: 13px !important;
  color: var(--ios-ink-1) !important;
  padding: 0 32px 0 12px !important;
  transition: background .2s var(--ios-ease-o);
}
.sl-navsearch input::placeholder { color: var(--ios-ink-4) !important; }
.sl-navsearch input:focus {
  background: var(--ios-card) !important;
  box-shadow: 0 0 0 3px var(--ios-acc-veil);
}

.sl-navtree { scrollbar-width: thin; -webkit-overflow-scrolling: touch; }

.sl-navgroup { border-bottom: .5px solid var(--ios-line-2) !important; }

.sl-navhead {
  font-family: inherit !important;
  padding: 10px 8px !important;
  border-radius: 10px !important;
  color: var(--ios-ink-1) !important;
  font-size: 13.5px !important;
  font-weight: 700 !important;
  transition: background .18s var(--ios-ease-o);
}
.sl-navhead:hover { background: rgba(118, 118, 128, .08) !important; }
.sl-navhead:active { background: rgba(118, 118, 128, .13) !important; }

.sl-caret {
  border-left: 5px solid var(--ios-ink-4) !important;
  transition: transform .24s var(--ios-ease) !important;
}
.sl-navgroup.open .sl-caret { border-left-color: var(--ios-acc) !important; }

.sl-navname { font-weight: 700 !important; letter-spacing: -.01em; }
.sl-navgroup.open .sl-navname { color: var(--ios-acc) !important; }

.sl-navcount {
  font-family: inherit !important;
  font-size: 10.5px !important;
  font-weight: 700 !important;
  font-variant-numeric: tabular-nums;
  background: rgba(118, 118, 128, .13) !important;
  color: var(--ios-ink-3) !important;
  border: none !important;
  border-radius: var(--ios-r-pill) !important;
  padding: 1.5px 8px !important;
}
.sl-navgroup.open .sl-navcount {
  background: var(--ios-acc-veil) !important;
  color: var(--ios-acc-deep) !important;
}

.sl-navitems { padding: 0 0 8px !important; }

.sl-navitems .sl-item {
  font-family: inherit !important;
  font-size: 12.5px !important;
  color: var(--ios-ink-2) !important;
  border-radius: 9px !important;
  padding: 7px 9px 7px 20px !important;
  margin-bottom: 1px;
  transition: background .16s var(--ios-ease-o), color .16s var(--ios-ease-o);
}
.sl-navitems .sl-item:hover { background: rgba(118, 118, 128, .08) !important; }
.sl-navitems .sl-item.on {
  background: var(--ios-acc) !important;
  color: #fff !important;
  font-weight: 650 !important;
  box-shadow: 0 1px 9px rgba(10, 132, 255, .3) !important;
}
.sl-no {
  font-family: inherit !important;
  font-variant-numeric: tabular-nums;
  color: inherit !important;
  opacity: .62 !important;
  font-weight: 650 !important;
}

/* 右侧主区 */
.sl-main { font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif; }
.sl-title {
  font-size: 19px !important;
  font-weight: 770 !important;
  letter-spacing: -.018em !important;
  color: var(--ios-ink-1) !important;
  line-height: 1.32 !important;
}
.sl-crumb { font-size: 11.5px !important; color: var(--ios-ink-4) !important; font-weight: 500 !important; }
.sl-src { font-size: 11.5px !important; color: var(--ios-ink-3) !important; }
.sl-sec {
  font-size: 13px !important;
  font-weight: 700 !important;
  color: var(--ios-ink-1) !important;
  letter-spacing: -.01em !important;
}
.sl-desc {
  font-family: inherit !important;
  font-size: 13px !important;
  line-height: 1.72 !important;
  color: var(--ios-ink-2) !important;
  background: var(--ios-card) !important;
  border-radius: var(--ios-r-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  box-shadow: var(--ios-s1) !important;
  padding: 15px 16px !important;
  white-space: pre-wrap !important;
}
/* ★ v2.3.50 情况描述「结构化展示」：按行分段。
   数据侧（_samplelib_polish.py）已在编号项 (1) / 1) / 1. 前插入换行，
   这里把每行渲染成一个段落，小节标题（风险分析/整改措施）加重。 */
.sl-desc .sl-dln {
  margin: 0 0 7px !important;
  line-height: 1.75 !important;
  word-break: break-word !important;
}
.sl-desc .sl-dln:last-child { margin-bottom: 0 !important; }
.sl-desc .sl-dln-hd {
  margin-top: 11px !important;
  font-weight: 700 !important;
  color: var(--ios-ink-1) !important;
}
.sl-desc .sl-dln:first-child.sl-dln-hd { margin-top: 0 !important; }
/* 隐患等级徽章——【重大隐患】/【一般隐患】是等级信息，涛哥明确要保留 */
.sl-badge-danger {
  display: inline-block !important;
  margin: 0 2px !important;
  padding: 1px 7px !important;
  border-radius: 6px !important;
  font-size: 11.5px !important;
  font-weight: 700 !important;
  color: #b42318 !important;
  background: #fef3f2 !important;
  border: .5px solid #fda29b !important;
  vertical-align: 1px !important;
}
.sl-norms {
  font-family: inherit !important;
  font-size: 12.5px !important;
  line-height: 1.7 !important;
  color: var(--ios-ink-2) !important;
  background: var(--ios-card) !important;
  border-radius: var(--ios-r-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  box-shadow: var(--ios-s1) !important;
  padding: 14px 16px !important;
}

/* 照片网格 */
.sl-pgrid { gap: 10px !important; }
.sl-ph {
  border-radius: var(--ios-r-card) !important;
  overflow: hidden;
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  box-shadow: var(--ios-s1) !important;
  transition: transform .32s var(--ios-ease), box-shadow .32s var(--ios-ease) !important;
}
.sl-ph:hover { transform: translateY(-2px); box-shadow: var(--ios-s2) !important; }
.sl-ph:active { transform: scale(.985); }
.sl-ph img {
  border-radius: 0 !important;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  transition: transform .5s var(--ios-ease);
}
.sl-ph:hover img { transform: scale(1.035); }
.sl-verdict {
  font-family: inherit !important;
  font-size: 10.5px !important;
  font-weight: 700 !important;
  border-radius: var(--ios-r-pill) !important;
  padding: 2.5px 9px !important;
  backdrop-filter: saturate(180%) blur(8px);
  -webkit-backdrop-filter: saturate(180%) blur(8px);
  letter-spacing: .01em;
}
.sl-cap {
  font-family: inherit !important;
  font-size: 11.5px !important;
  line-height: 1.5 !important;
  color: var(--ios-ink-2) !important;
  padding: 9px 11px !important;
  background: var(--ios-card) !important;
  border-top: .5px solid var(--ios-line-2);
}
.sl-hold {
  font-family: inherit !important;
  font-size: 10px !important;
  font-weight: 700 !important;
  background: var(--ios-warn-bg) !important;
  color: var(--ios-warn-ink) !important;
  border-radius: var(--ios-r-pill) !important;
  padding: 2px 8px !important;
}
.sl-conftip { border-radius: var(--ios-r-card) !important; }
.sl-stat {
  font-family: inherit !important;
  border-radius: var(--ios-r-pill) !important;
  font-weight: 700 !important;
  padding: 4px 12px !important;
  font-variant-numeric: tabular-nums;
}
.sl-back {
  font-family: inherit !important;
  background: var(--ios-card) !important;
  color: var(--ios-acc) !important;
  border: .5px solid var(--ios-line) !important;
  border-radius: var(--ios-r-ctl) !important;
  font-size: 14px !important;
  font-weight: 650 !important;
  box-shadow: var(--ios-s1);
  transition: transform .18s var(--ios-ease);
}
.sl-back:hover { background: var(--ios-bg-3) !important; }
.sl-back:active { transform: scale(.98); }

/* 判定状态统计徽标 */
.sl-stat.ok   { background: var(--ios-ok-bg) !important;     color: var(--ios-ok-ink) !important; }
.sl-stat.hold { background: var(--ios-warn-bg) !important;   color: var(--ios-warn-ink) !important; }
.sl-stat.todo { background: rgba(118,118,128,.12) !important; color: var(--ios-ink-2) !important; }

/* ═══════════════════════════════════════════════════════════════════
   四、移动端（≤820px）：方案树改横向胶囊条，不再占满首屏
   ═══════════════════════════════════════════════════════════════════ */
@media (max-width: 820px) {
  .sl-wrap { display: block !important; }
  .sl-wrap > .sl-nav {
    position: static !important;
    width: 100% !important;
    max-height: none !important;
    margin-bottom: 12px;
    padding: 8px !important;
    border-radius: var(--ios-r-card) !important;
  }
  /* 方向组变成横向可滚动胶囊 */
  .sl-wrap > .sl-nav .sl-navtree {
    display: flex !important;
    gap: 7px;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    padding-bottom: 2px;
  }
  .sl-wrap > .sl-nav .sl-navgroup {
    flex: none;
    border-bottom: none !important;
    border-radius: var(--ios-r-ctl) !important;
    background: rgba(118, 118, 128, .09);
    overflow: hidden;
  }
  .sl-wrap > .sl-nav .sl-navhead { padding: 8px 12px !important; white-space: nowrap; font-size: 13px !important; }
  .sl-wrap > .sl-nav .sl-navgroup.open {
    background: var(--ios-acc-soft) !important;
    box-shadow: inset 0 0 0 1.5px var(--ios-acc);
  }
  .sl-wrap > .sl-nav .sl-navgroup.open .sl-navname { color: var(--ios-acc-deep) !important; }
  .sl-wrap > .sl-nav .sl-caret { display: none; }
  .sl-wrap > .sl-nav .sl-navitems {
    display: block !important;
    max-height: 260px;
    overflow-y: auto;
    background: var(--ios-card);
    padding: 4px !important;
  }
  .sl-wrap > .sl-nav .sl-navitems .sl-item {
    min-height: 44px;               /* iOS HIG 触摸目标 */
    display: flex;
    align-items: center;
    font-size: 13px !important;
    padding: 10px 12px !important;
  }
  /* ★ 真机复验发现（2026-10-07）：展开某方向后，条目列表把详情整个顶出首屏，
     照片要往下滚很久才看到 —— 违背「移动端先看图」的初衷。
     改法：条目区限高 200px 自身滚动，让详情始终留在首屏可见范围内。
     （原来 max-height:260px 出现在 .sl-navitems 上，但 .sl-navitems 在
       非 open 状态 display:none，展开后才生效；这里压到 200px 更保守。） */
  .sl-wrap > .sl-nav .sl-navgroup.open .sl-navitems {
    max-height: 200px;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    border-top: .5px solid var(--ios-line-2);
  }
  /* 详情内容上移：照片优先 */
  .sl-title { font-size: 17px !important; }
  .sl-desc, .sl-norms { padding: 13px 14px !important; font-size: 12.5px !important; }
  .sl-pgrid { grid-template-columns: repeat(2, 1fr) !important; gap: 8px !important; }
  .sl-ph { border-radius: var(--ios-r-ctl) !important; }
  .sl-back { min-height: 46px !important; }
}

/* ═══════════════════════════════════════════════════════════════════
   五、动效降级（无障碍：尊重系统设置）
   ═══════════════════════════════════════════════════════════════════ */
@media (prefers-reduced-motion: reduce) {
  .sl-navhead, .sl-navitems .sl-item, .sl-ph, .sl-ph img,
  .sl-back, .sl-img-retry, .sl-caret, .sl-img-fail {
    transition: none !important;
    animation: none !important;
    transform: none !important;
  }
  .sl-ph:hover { transform: none !important; }
  .sl-ph:hover img { transform: none !important; }
}

/* ═══════════════════════════════════════════════════════════════════
   六、打印（监督员常打印文书，照片页也要能用）
   ═══════════════════════════════════════════════════════════════════ */
@media print {
  .sl-nav, .sl-back, .sl-img-retry { display: none !important; }
  .sl-ph, .sl-desc, .sl-norms { box-shadow: none !important; break-inside: avoid; }
  .sl-pgrid { grid-template-columns: repeat(2, 1fr) !important; }
}

/* ═══════════════════════════════════════════════════════════════════
   七、手机端底部 Tab（V2.3.28 收敛为 5 项 + 线性图标）
   ─────────────────────────────────────────────────────────────────
   ★ 一个此前没人注意到的硬伤：旧版 .tabbar button .ic 全部没有内容，
     theme-v3.css:1024 用 .ic::before 画了一个 9px 灰色圆点 ——
     ★★ 7 个 Tab 视觉上长得一模一样，只靠下方文字区分。
     本层改为内联 1.7px 线性 SVG（currentColor 随激活态变蓝）。
   ═══════════════════════════════════════════════════════════════════ */
@media (max-width: 820px) {
  .tabbar {
    font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
    background: rgba(248, 248, 250, .90) !important;
    backdrop-filter: saturate(180%) blur(24px);
    -webkit-backdrop-filter: saturate(180%) blur(24px);
    border-top: .5px solid var(--ios-line) !important;
    box-shadow: 0 -1px 20px rgba(0, 0, 0, .05);
    padding: 5px 4px calc(5px + env(safe-area-inset-bottom)) !important;
  }
  .tabbar button {
    color: var(--ios-ink-3) !important;
    font-size: 9.5px !important;
    font-weight: 600 !important;
    background: none !important;
    gap: 0 !important;
    padding: 3px 2px !important;
    min-height: 50px;                 /* iOS HIG 触摸目标 */
    /* ★ 关键：theme-v3.css:1016 写的是 min-width:calc(25% - 2px)（为 4 个 Tab 设计）。
       收到 5 个后 5×93=465px > 388px 视口 ⇒ 横向溢出 77px。
       这里改成 flex:1 让 5 个均分，并显式清掉 min-width。 */
    flex: 1 1 0 !important;
    min-width: 0 !important;
    max-width: none !important;
    border-radius: 10px !important;
    transition: color .2s var(--ios-ease-o);
    -webkit-tap-highlight-color: transparent;
  }
  .tabbar button .ic {
    width: 22px !important; height: 22px !important;
    margin: 0 auto 2.5px !important;
    display: block !important;
    font-size: 0 !important;          /* 抹掉旧版 ::before 圆点 */
    opacity: .58 !important;
    transition: opacity .24s var(--ios-ease-o), transform .24s var(--ios-ease) !important;
  }
  /* ★ 核心修复：抹掉 theme-v3 的 ::before 灰圆点，改用真 SVG */
  .tabbar button .ic::before { content: none !important; }
  .tabbar button .ic svg {
    width: 100%; height: 100%;
    display: block;
  }
  .tabbar button.active,
  .tabbar button.on {
    background: none !important;      /* 旧版是渐变底，去掉 */
    color: var(--ios-acc) !important;
    font-weight: 650 !important;
    box-shadow: none !important;
  }
  .tabbar button.active .ic,
  .tabbar button.on .ic {
    background: none !important;
    box-shadow: none !important;
    transform: none !important;
    opacity: 1 !important;
  }
  .tabbar button:active .ic { transform: scale(.9); }
  .tabbar-more.on { color: var(--ios-acc) !important; }
  .tabbar-more.on .ic { opacity: 1 !important; }

  /* 「更多」抽屉（iOS 模态范式） */
  .ios-more-mask {
    position: fixed; inset: 0; z-index: 38;
    background: rgba(0, 0, 0, .32);
    opacity: 0; visibility: hidden;
    transition: opacity .32s var(--ios-ease-o), visibility .32s;
    -webkit-backdrop-filter: blur(2px);
    backdrop-filter: blur(2px);
  }
  .ios-more-mask.on { opacity: 1; visibility: visible; }

  .ios-more-sheet {
    position: fixed; left: 0; right: 0; bottom: 0; z-index: 39;
    background: rgba(250, 250, 252, .98);
    backdrop-filter: saturate(180%) blur(28px);
    -webkit-backdrop-filter: saturate(180%) blur(28px);
    border-radius: var(--ios-r-cont) var(--ios-r-cont) 0 0;
    box-shadow: var(--ios-s4);
    padding: 7px 0 calc(12px + env(safe-area-inset-bottom));
    transform: translateY(101%);
    transition: transform .38s var(--ios-ease);
    max-height: 76vh; overflow-y: auto;
    visibility: hidden;
  }
  .ios-more-sheet.on { transform: translateY(0); visibility: visible; }

  .ios-more-grab {
    width: 34px; height: 4.5px; border-radius: 2.5px;
    background: rgba(118, 118, 128, .28);
    margin: 0 auto 10px;
  }
  .ios-more-head {
    font-size: 11px; font-weight: 700; color: var(--ios-ink-3);
    letter-spacing: .04em; padding: 4px 16px 7px;
  }
  .ios-more-sheet button {
    display: flex; align-items: center; gap: 11px;
    width: 100%; min-height: 48px;      /* HIG 触摸目标 */
    padding: 11px 16px;
    background: none; border: none;
    font-family: inherit; font-size: 14.5px; font-weight: 500;
    color: var(--ios-ink-1); text-align: left;
    cursor: pointer; -webkit-tap-highlight-color: transparent;
    transition: background .16s var(--ios-ease-o);
  }
  .ios-more-sheet button:active { background: rgba(118, 118, 128, .12); }
  .ios-more-sheet button .ic {
    width: 21px; height: 21px; flex: none;
    font-size: 0; color: var(--ios-acc); opacity: .95;
  }
  .ios-more-sheet button .ic::before { content: none !important; }
  .ios-more-sheet button .ic svg { width: 100%; height: 100%; display: block; }
  .ios-more-sheet button.active { color: var(--ios-acc); font-weight: 680; background: var(--ios-acc-veil); }

  /* 抽屉打开时锁背景滚动 */
  body.ios-sheet-open { overflow: hidden; }
}

/* PC 端不该出现「更多」抽屉入口 */
@media (min-width: 821px) {
  .ios-more-mask, .ios-more-sheet { display: none !important; }
}

/* 抽屉的动效降级 */
@media (prefers-reduced-motion: reduce) {
  .ios-more-mask, .ios-more-sheet { transition: none !important; }
}

/* ═══════════════════════════════════════════════════════════════════
   八、渐变收敛（V2.3.28）
   ─────────────────────────────────────────────────────────────────
   真机复验发现「隐患闭环看板」大按钮与「AI 问答」悬浮球仍是
   蓝→紫→粉渐变（定义散落在 theme-v5.css 的 8 处），与蓝色 logo 并存时
   同屏出现两套色系。这里用「覆盖变量 + 覆盖具体选择器」双保险收敛为单一 Apple 蓝，
   **不修改 theme-v5.css 本体**（保持一键回退）。
   ═══════════════════════════════════════════════════════════════════ */
:root {
  --hz-brand-grad: linear-gradient(135deg, #0A84FF, #0B5FBF) !important;
  --v5-grad: linear-gradient(135deg, #0A84FF 0%, #0B5FBF 100%) !important;
  --hz-brand-2: #0B5FBF !important;
  --hz-brand-3: #0A84FF !important;
}

/* 主要渐变按钮 / Tab 激活底 —— 统一为 Apple 蓝
   ★★★ 真机复验踩坑（2026-10-07）：上一版写了 `.dash-grid3 .dash-act`，结果把
     「开始检查」「知识库」两张**白底卡**一起染成蓝底白字 —— 页面里三块大蓝，
     反而比改之前更刺眼、层级更乱。
     教训：`.dash-grid3 .dash-act` 是**宽泛选择器**，卡片的配色由各自修饰类决定
     （act-new / act-kb 才是白底卡），收敛渐变必须**只点名真正带渐变的那个**。
   ✅ 正确做法：只覆盖 .board-entry（app-rectify.js:381 实证它是渐变按钮）。 */
.dash-act.board-entry,
.tabbar button.active,
.tabbar button.on { background: var(--ios-acc) !important; background-image: none !important; color: #fff !important; }

/* 白底大卡（act-new / act-kb）：显式保持白底 + iOS 阴影，防止被上面的规则误伤 */
.dash-act.act-new,
.dash-act.act-kb {
  background: var(--ios-card) !important;
  background-image: none !important;
  color: var(--i1) !important;
  border: .5px solid var(--ios-line-2) !important;
  box-shadow: var(--ios-s1) !important;
}
.dash-act.act-new .da-t,
.dash-act.act-kb .da-t { color: var(--i1) !important; }
.dash-act.act-new .da-sub,
.dash-act.act-kb .da-sub { color: var(--ios-ink-3) !important; }

/* AI 悬浮球：渐变改纯色 + 去掉外发光 */
.ai-fab {
  background: var(--ios-acc) !important;
  background-image: none !important;
  box-shadow: 0 4px 16px rgba(10, 132, 255, .34) !important;
  color: #fff !important;
  transition: transform .2s var(--ios-ease) !important;
}
.ai-fab::after { display: none !important; }   /* 去掉外圈色晕 */
.ai-fab:active { transform: scale(.94) !important; }

/* 抽屉打开时，AI 悬浮球要让位（原来 z-index:90 会压在抽屉上） */
body.ios-sheet-open .ai-fab { opacity: 0; pointer-events: none; transition: opacity .24s var(--ios-ease-o); }

/* 顶栏与侧栏：玻璃层统一（避免与内容区抢视觉） */
.app-header, .side-nav, .topbar {
  background: var(--ios-blur-nav) !important;
  backdrop-filter: var(--ios-blur) !important;
  -webkit-backdrop-filter: var(--ios-blur) !important;
}

/* 主按钮：去渐变，改纯色 + iOS 阴影 */
.btn-primary, .btn.primary, .primary-btn {
  background: var(--ios-acc) !important;
  background-image: none !important;
  box-shadow: 0 2px 10px rgba(10, 132, 255, .28) !important;
  border-radius: var(--ios-r-ctl) !important;
  transition: transform .2s var(--ios-ease), box-shadow .2s var(--ios-ease) !important;
}
.btn-primary:hover, .btn.primary:hover, .primary-btn:hover {
  transform: translateY(-1.5px);
  box-shadow: 0 6px 20px rgba(10, 132, 255, .36) !important;
}
.btn-primary:active, .btn.primary:active, .primary-btn:active { transform: scale(.97) !important; }

/* 徽标 / 标签：去掉渐变底 */
.badge-grad, .chip-grad { background: var(--ios-acc) !important; background-image: none !important; }

/* ═══════════════════════════════════════════════════════════════════
   九、工作台 iOS 布局重构（V2.3.29）
   ─────────────────────────────────────────────────────────────────
   旧结构问题（真机与代码实证）：
     app-rectify.js:380 起的 .dash-top 里，.dash-grid3 放
       「开始检查」+「知识库」+「您的积分」三张卡，其中
       theme-v5.css:188 强制 .dash-grid3 > * { min-height:118px }
     ⇒ 两张只是「跳转入口」的卡各占 118px 高度，首屏被吃光，
        而 6 张真正的指标卡（.dash-grid6）被挤到折叠线以下。
   新设计（Apple HIG 原则：把「入口」与「数据」分层）
     · 入口区：紧凑 action tile（min-height 收到 76px），一行放下
     · 指标区：iOS 风格 inset grid 优先出现在入口之前
     · 积分卡：从「和入口并列的大卡」降为侧栏卡，段位用胶囊
   ★ 全部靠 CSS 覆盖，**不改 app-rectify.js 一行**。
   ═══════════════════════════════════════════════════════════════════ */

/* ── 指标卡：iOS inset card ── */
.stat-card,
.dash-grid2 .stat-card,
.dash-grid6 .stat-card {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  border-radius: var(--ios-r-card) !important;
  box-shadow: var(--ios-s1) !important;
  padding: 14px 15px !important;
  min-height: 0 !important;
  position: relative;
  overflow: hidden;
  transition: transform .28s var(--ios-ease), box-shadow .28s var(--ios-ease);
}
.stat-card:hover { transform: translateY(-2px); box-shadow: var(--ios-s2) !important; }

/* 语义色改为「顶部 3px 色条 + 淡色底」，不再整块高饱和 */
.stat-card::before {
  content: ''; position: absolute; left: 0; right: 0; top: 0; height: 3px;
}
.stat-card.blue::before   { background: var(--ios-acc); }
.stat-card.red::before    { background: var(--ios-danger); }
.stat-card.green::before  { background: var(--ios-ok); }
.stat-card.orange::before { background: var(--ios-warn); }
.stat-card.blue   { background: linear-gradient(158deg, #fff, var(--ios-acc-soft)) !important; }
.stat-card.red    { background: linear-gradient(158deg, #fff, var(--ios-danger-bg)) !important; }
.stat-card.green  { background: linear-gradient(158deg, #fff, var(--ios-ok-bg)) !important; }
.stat-card.orange { background: linear-gradient(158deg, #fff, var(--ios-warn-bg)) !important; }

/* 数字：等宽比例 + 大字重（tabular 防止跳动） */
.stat-card .v,
.dash-grid6 .stat-card .v {
  font-family: inherit !important;
  font-size: 30px !important;
  font-weight: 830 !important;
  letter-spacing: -.03em !important;
  line-height: 1.05 !important;
  font-variant-numeric: tabular-nums;
  color: var(--ios-ink-1) !important;
  margin: 2px 0 3px !important;
}
.stat-card.blue .v   { color: var(--ios-acc-deep) !important; }
.stat-card.red .v    { color: var(--ios-danger-ink) !important; }
.stat-card.green .v  { color: var(--ios-ok-ink) !important; }
.stat-card.orange .v { color: var(--ios-warn-ink) !important; }

.stat-card .l {
  font-size: 12.5px !important;
  font-weight: 650 !important;
  color: var(--ios-ink-1) !important;
  letter-spacing: -.005em !important;
}
.stat-card .sub {
  font-size: 11px !important;
  color: var(--ios-ink-3) !important;
  font-weight: 500 !important;
  line-height: 1.45 !important;
}
/* 趋势小标签 */
.stat-card .trend, .stat-card [class*="trend"] {
  font-size: 10.5px !important; font-weight: 700 !important;
  border-radius: var(--ios-r-pill) !important; padding: 1.5px 7px !important;
  background: rgba(255,255,255,.7) !important;
}

/* ── 指标网格：桌面 3 列（不再 6 列挤成两行）── */
/* ★ 第二轮修正：theme-v5.css:185 有 .dash-grid3{align-items:stretch}
   —— 同网格里若有高卡（积分卡内容多），会把整行一起撑高。
   指标网格必须 align-items:start 独立成行。 */
.dash-grid6, .dash-grid2 {
  align-items: start !important;
  grid-auto-rows: min-content !important;
}
.dash-grid6 { grid-template-columns: repeat(3, 1fr) !important; gap: 11px !important; margin-top: 12px !important; }
.dash-grid2 { grid-template-columns: repeat(2, 1fr) !important; gap: 11px !important; }
/* 指标卡自身高度由内容决定，不被 stretch */
.dash-grid6 .stat-card, .dash-grid2 .stat-card { align-self: start !important; height: auto !important; }

/* ── 入口区：紧凑 tile ── */
.dash-top { display: flex !important; flex-direction: column !important; gap: 0 !important; }

/* ★ 第三轮修正（实测 grid3Children = [act-new, act-kb, rank-me, dash-duo]）：
   .dash-duo 在 HTML 里是 .dash-grid3 的第 4 个子元素（app-rectify.js:383），
   原本靠「3 列网格 + 它自动换行」排版。改成 min-content 后它与前三个同排竞列，
   导致整行被 rank-me（419px 高）撑到 419px。
   ✅ 正解：dash-duo 明确 grid-column: 1 / -1 独占整行，grid3 回到 3 列只放三张卡。 */
.dash-grid3 > .dash-duo {
  grid-column: 1 / -1 !important;
  align-self: stretch !important;
  height: auto !important;
  min-height: 0 !important;
}
.dash-grid3 {
  display: grid !important;
  grid-template-columns: repeat(3, 1fr) !important;
  gap: 11px !important;
  align-items: start !important;
  grid-auto-rows: min-content !important;
}
/* ★ 关键：解除 theme-v5.css:188 的 min-height:118px —— 入口卡不该占那么高 */
/* 只给下限不给上限：入口卡内容少自然 72px，积分卡内容多可自行撑开
   （★ 曾加 max-height:96px 把积分卡裁到 130px，段位与排名被切掉一半） */
.dash-grid3 > *:not(.dash-duo) {
  min-height: 72px !important;
  align-self: stretch !important;
  height: auto !important;
  overflow: hidden !important;
}

/* 白底入口卡（开始检查 / 知识库）：iOS inset card */
.dash-act {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  background: var(--ios-card) !important;
  background-image: none !important;
  border: .5px solid var(--ios-line-2) !important;
  border-radius: var(--ios-r-card) !important;
  box-shadow: var(--ios-s1) !important;
  color: var(--ios-ink-1) !important;
  padding: 12px 13px !important;
  gap: 10px !important;
  transition: transform .28s var(--ios-ease), box-shadow .28s var(--ios-ease) !important;
}
.dash-act:hover { transform: translateY(-2px) !important; box-shadow: var(--ios-s2) !important; }
.dash-act:active { transform: scale(.985) !important; }

.dash-act .da-ico {
  width: 36px !important; height: 36px !important;
  border-radius: 10px !important;
  flex: none !important;
  display: flex !important; align-items: center !important; justify-content: center !important;
}
.dash-act .da-ico svg { width: 19px !important; height: 19px !important; }
.dash-act.act-new .da-ico { background: var(--ios-ok-bg) !important; color: var(--ios-ok-ink) !important; }
.dash-act.act-kb  .da-ico { background: var(--ios-acc-veil) !important; color: var(--ios-acc) !important; }
.dash-act { align-items: center !important; }
.dash-act .da-body { min-width: 0 !important; }
.dash-act .da-t { font-size: 14px !important; font-weight: 700 !important; letter-spacing: -.012em !important; color: var(--ios-ink-1) !important; }
.dash-act .da-sub { font-size: 11px !important; color: var(--ios-ink-3) !important; font-weight: 500 !important; }

/* 蓝底强调块（隐患闭环看板 / 文书验真）：唯一允许的实色块 */
.dash-duo { display: grid !important; grid-template-columns: repeat(2, 1fr) !important; gap: 11px !important; }
.dash-duo.solo { grid-template-columns: 1fr !important; }
.dash-duo .board-entry {
  background: var(--ios-acc) !important;
  background-image: none !important;
  color: #fff !important;
  border: none !important;
  border-radius: var(--ios-r-ctl) !important;
  box-shadow: 0 2px 10px rgba(10,132,255,.26) !important;
  font-size: 13.5px !important;
  font-weight: 650 !important;
  min-height: 44px !important;
  transition: transform .2s var(--ios-ease), box-shadow .2s var(--ios-ease) !important;
}
.dash-duo .board-entry:hover { transform: translateY(-1.5px) !important; box-shadow: 0 6px 20px rgba(10,132,255,.34) !important; }
.dash-duo .board-entry svg { width: 17px !important; height: 17px !important; }

/* ── 顶部搜索卡：iOS 搜索框 ── */
.dash-search-card {
  font-family: inherit !important;
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  border-radius: var(--ios-r-card) !important;
  box-shadow: var(--ios-s1) !important;
  padding: 13px 15px !important;
  margin-bottom: 12px !important;
  transition: transform .28s var(--ios-ease), box-shadow .28s var(--ios-ease) !important;
}
.dash-search-card:hover { transform: translateY(-1px) !important; box-shadow: var(--ios-s2) !important; }
.dash-search-card .ds-ic {
  background: var(--ios-acc-veil) !important; color: var(--ios-acc) !important;
  border-radius: 10px !important; width: 34px !important; height: 34px !important;
}
.dash-search-card .ds-tx b { font-size: 14px !important; font-weight: 700 !important; color: var(--ios-ink-1) !important; }
.dash-search-card .ds-tx span { font-size: 11px !important; color: var(--ios-ink-3) !important; }
.dash-search-card .ds-go { color: var(--ios-ink-4) !important; font-size: 20px !important; }

/* ── 积分卡 / 排行榜：iOS inset list ── */
.rank-card {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  border-radius: var(--ios-r-card) !important;
  box-shadow: var(--ios-s1) !important;
  overflow: hidden !important;
  transition: transform .28s var(--ios-ease), box-shadow .28s var(--ios-ease) !important;
}
.rank-card:hover { transform: translateY(-1px) !important; box-shadow: var(--ios-s2) !important; }
.rank-card .rk-h {
  font-size: 12.5px !important; font-weight: 700 !important;
  color: var(--ios-ink-1) !important;
  background: var(--ios-bg-3) !important;
  border-bottom: .5px solid var(--ios-line-2) !important;
  padding: 11px 14px !important;
}
.rank-card.rank-me { grid-column: auto !important; align-self: start !important; }
.rank-card.rank-me .rk-h { background: var(--ios-acc-soft) !important; color: var(--ios-acc-deep) !important; }
.rank-card .rk-h svg { width: 15px !important; height: 15px !important; }
.rank-card .rk-body { padding: 12px 14px !important; font-size: 12px !important; color: var(--ios-ink-2) !important; }

.rk-me-pts {
  font-size: 30px !important; font-weight: 840 !important;
  letter-spacing: -.035em !important; color: var(--ios-ink-1) !important;
  font-variant-numeric: tabular-nums;
}
.rk-me-tier {
  background: var(--ios-acc) !important; color: #fff !important;
  font-size: 10.5px !important; font-weight: 700 !important;
  border-radius: var(--ios-r-pill) !important; padding: 2px 9px !important;
  display: inline-block;
}
.rk-me-lbl { font-size: 10.5px !important; color: var(--ios-ink-3) !important; }
.rk-me-ranks { font-size: 11.5px !important; color: var(--ios-ink-2) !important; }
.rk-me-ranks b { color: var(--ios-acc) !important; }
.rk-me-break { border-top: .5px solid var(--ios-line-2) !important; margin-top: 9px !important; padding-top: 9px !important; }
.rk-b-line { display: flex !important; justify-content: space-between !important; font-size: 11.5px !important; color: var(--ios-ink-2) !important; padding: 2.5px 0 !important; }
.rk-b-line b { color: var(--ios-ink-1) !important; font-variant-numeric: tabular-nums; }
.rk-me-tip { font-size: 10.5px !important; color: var(--ios-ink-3) !important; margin-top: 7px !important; line-height: 1.5 !important; }

/* 榜单行：inset list 风格 */
.rk-row {
  display: flex !important; align-items: center !important; gap: 9px !important;
  padding: 7px 0 !important;
  border-bottom: .5px solid var(--ios-line-2) !important;
  font-size: 12.5px !important;
}
.rk-row:last-child { border-bottom: none !important; }
.rk-no {
  width: 20px !important; height: 20px !important; flex: none !important;
  border-radius: 6px !important; background: rgba(118,118,128,.12) !important;
  color: var(--ios-ink-3) !important;
  font-size: 10.5px !important; font-weight: 700 !important;
  display: flex !important; align-items: center !important; justify-content: center !important;
  font-variant-numeric: tabular-nums;
}
.rk-no.first { background: var(--ios-rank) !important; color: #7A5C00 !important; }
.rk-name { flex: 1 !important; min-width: 0 !important; font-weight: 550 !important; color: var(--ios-ink-1) !important; }
.rk-name > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rk-dist {
  font-size: 9.5px !important; font-weight: 600 !important;
  background: rgba(118,118,128,.12) !important; color: var(--ios-ink-3) !important;
  border-radius: var(--ios-r-pill) !important; padding: 1px 6px !important; margin-left: 6px !important;
}
.rk-pts { font-size: 12.5px !important; font-weight: 740 !important; color: var(--ios-ink-1) !important; font-variant-numeric: tabular-nums; }

/* ── 面板（排名/空态容器）── */
.panel {
  font-family: inherit !important;
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  border-radius: var(--ios-r-card) !important;
  box-shadow: var(--ios-s1) !important;
  overflow: hidden;
  transition: transform .28s var(--ios-ease), box-shadow .28s var(--ios-ease) !important;
}
.panel:hover { box-shadow: var(--ios-s2) !important; }
.panel-h {
  font-size: 12.5px !important; font-weight: 700 !important;
  color: var(--ios-ink-1) !important;
  background: var(--ios-bg-3) !important;
  border-bottom: .5px solid var(--ios-line-2) !important;
  padding: 11px 14px !important;
}
.panel .empty {
  font-size: 12px !important; color: var(--ios-ink-3) !important;
  padding: 22px 14px !important; text-align: center; line-height: 1.7;
}
.dash-rank { display: grid !important; grid-template-columns: repeat(2, 1fr) !important; gap: 11px !important; }
.dash-t10-grid { display: grid !important; grid-template-columns: repeat(2, 1fr) !important; gap: 11px !important; }

/* ═══════════════════════════════════════════════════════════════════
   十、积分卡瘦身（V2.3.29 第二轮修正）
   ─────────────────────────────────────────────────────────────────
   实测：入口卡收窄后，同排的积分卡（内容最多）决定整行高度 = 419px，
   导致「开始检查」「知识库」两张内容很少的卡被拉出大片空白。
   两手处理：
     ① 积分卡自身瘦身（分数/段位同行、明细更紧凑、说明限 2 行）
     ② 入口卡不再被拉伸（align-self:start + 自身设 min-height）
   ★ 只减字号与留白，不删任何数据。
   ═══════════════════════════════════════════════════════════════════ */
.rk-me-pts { font-size: 27px !important; }
.rk-me-flex { gap: 9px !important; align-items: flex-end !important; }
.rk-me-break { margin-top: 7px !important; padding-top: 7px !important; }
.rk-b-line { padding: 1.5px 0 !important; }
.rk-me-ranks { font-size: 11px !important; }
.rk-me-tip {
  font-size: 10px !important; color: var(--ios-ink-3) !important;
  margin-top: 6px !important; line-height: 1.42 !important;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.rank-card .rk-body { padding: 11px 13px !important; }
.rank-card .rk-h { padding: 10px 13px !important; }

/* ═══════════════════════════════════════════════════════════════════
   十一、积分卡行高压缩（V2.3.29 第三轮修正）
   ─────────────────────────────────────────────────────────────────
   实测内部结构（真机量测）：
     .rk-b-line   h=28px ×2   ← 单行却占 28px
     .rk-me-ranks h=50px      ← 单行却占 50px
   原因：这些块里是 inline <b>/<span>，继承了旧主题较大的 line-height，
         一行文字被撑到 21~28px。⇒ 明确给行高，文字才紧凑。
   ★ 只改行高与字号，不删任何数据项。
   ═══════════════════════════════════════════════════════════════════ */
.rk-me-flex { display: flex !important; align-items: flex-end !important; gap: 9px !important; }
.rk-me-side { display: flex !important; flex-direction: column !important; gap: 1px !important; padding-bottom: 1px !important; }
.rk-me-pts { line-height: 1 !important; }
.rk-b-line { line-height: 1.35 !important; min-height: 0 !important; }
.rk-b-line span, .rk-b-line b { line-height: 1.35 !important; }
.rk-me-ranks { line-height: 1.4 !important; min-height: 0 !important; }
.rk-me-ranks b, .rk-me-ranks { line-height: 1.4 !important; }
.rk-me-tip { line-height: 1.42 !important; }
.rk-body .empty { line-height: 1.5 !important; }

/* ═══════════════════════════════════════════════════════════════════
   十二、隐患闭环看板 iOS 化（V2.3.29）
   ─────────────────────────────────────────────────────────────────
   结构实证（app-tail.js:2889 renderBoard）：
     .proj-head > h2            标题
     内联 grid 容器              4 张 .stat-card（已复用第九节样式）
     .btn-row > .hz-empty-act    「导出本月报表」胶囊按钮
     .panel > .panel-h          分组标题
     .hz-bp（工程）→ .hz-bp-h（行）→ .hz-bp-name / .hz-bp-n / .hz-bp-bar>i / .hz-fold-pill
     .hz-bp-items → 任务行
   本节只做视觉，不动其三层折叠逻辑（hzToggleProjItems / hzToggleTaskItems）。
   ═══════════════════════════════════════════════════════════════════ */

/* 标题 */
.proj-head { margin-bottom: 4px !important; }
.proj-head h2 {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  font-size: 24px !important; font-weight: 800 !important;
  letter-spacing: -.025em !important; color: var(--ios-ink-1) !important;
}

/* 导出按钮：iOS 胶囊 */
.hz-empty-act,
.btn-row button {
  font-family: inherit !important;
  background: var(--ios-card) !important;
  color: var(--ios-acc) !important;
  border: .5px solid var(--ios-line) !important;
  border-radius: var(--ios-r-pill) !important;
  font-size: 13.5px !important; font-weight: 650 !important;
  min-height: 44px !important;                     /* HIG 触摸目标 */
  box-shadow: var(--ios-s1) !important;
  transition: transform .2s var(--ios-ease), box-shadow .2s var(--ios-ease) !important;
}
.hz-empty-act:hover { transform: translateY(-1px) !important; box-shadow: var(--ios-s2) !important; }
.hz-empty-act:active { transform: scale(.98) !important; }

/* 工程行（.hz-bp-h）：iOS inset row */
.hz-bp { border-bottom: .5px solid var(--ios-line-2) !important; }
.hz-bp:last-child { border-bottom: none !important; }
.hz-bp-h {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  padding: 12px 14px !important;
  gap: 9px !important;
  min-height: 44px !important;
  transition: background .16s var(--ios-ease-o) !important;
  border-radius: 10px !important;
}
.hz-bp-h:hover { background: var(--ios-bg-3) !important; }
.hz-bp-name {
  font-size: 13.5px !important; font-weight: 680 !important;
  color: var(--ios-ink-1) !important; letter-spacing: -.01em !important;
}
.hz-bp-n { font-size: 11.5px !important; color: var(--ios-ink-3) !important; }
.hz-bp-n b { color: var(--ios-danger-ink) !important; font-variant-numeric: tabular-nums; }

/* 进度条：轨道更细、填充按闭环率语义变色（绿=好 / 橙=偏低 / 红=无） */
.hz-bp-bar {
  background: rgba(118, 118, 128, .14) !important;
  border-radius: var(--ios-r-pill) !important;
  height: 5px !important;
  overflow: hidden;
  flex: none !important;
}
.hz-bp-bar > i {
  display: block; height: 100% !important;
  border-radius: var(--ios-r-pill) !important;
  background: var(--ios-ok) !important;         /* 默认达标=绿 */
  transition: width .5s var(--ios-ease) !important;
}
/* 0% 填充宽度为 0 时用轨道底色示意，避免「看不见进度」误读 */
.hz-bp[data-open="1"] > .hz-bp-h .hz-bp-bar > i { box-shadow: 0 0 0 1px rgba(255,255,255,.4); }

/* 折叠胶囊 */
.hz-fold-pill {
  background: rgba(118, 118, 128, .10) !important;
  border-radius: var(--ios-r-pill) !important;
  padding: 3px 10px !important;
  font-size: 11px !important; font-weight: 620 !important;
  color: var(--ios-ink-2) !important;
  transition: background .16s var(--ios-ease-o) !important;
  min-height: 26px;
  display: inline-flex !important; align-items: center !important;
}
.hz-fold-pill:hover { background: rgba(118, 118, 128, .18) !important; }
.hz-fold-pill b { color: var(--ios-acc) !important; }

/* 状态徽标：语义色 + 文字双编码（色弱可读），不只靠颜色 */
.hz-st {
  font-family: inherit !important;
  font-size: 10.5px !important; font-weight: 700 !important;
  border-radius: var(--ios-r-pill) !important;
  padding: 2.5px 9px !important;
  display: inline-flex !important; align-items: center !important; gap: 3px !important;
  white-space: nowrap;
}
.hz-st svg { width: 11px !important; height: 11px !important; }
.hz-st-ok      { background: var(--ios-ok-bg) !important;     color: var(--ios-ok-ink) !important; }
.hz-st-warn    { background: var(--ios-warn-bg) !important;   color: var(--ios-warn-ink) !important; }
.hz-st-danger  { background: var(--ios-danger-bg) !important; color: var(--ios-danger-ink) !important; }
.hz-st-info    { background: var(--ios-acc-veil) !important;  color: var(--ios-acc-deep) !important; }
.hz-st-neutral { background: rgba(118,118,128,.12) !important; color: var(--ios-ink-2) !important; }

/* 任务行内的双按钮（已整改 / 待整改）：iOS 小按钮 */
.hz-bp-task-act button {
  font-family: inherit !important;
  font-size: 11px !important; font-weight: 680 !important;
  border-radius: var(--ios-r-pill) !important;
  padding: 4px 11px !important;
  min-height: 30px;
  border: none !important;
  transition: transform .18s var(--ios-ease), opacity .18s var(--ios-ease-o) !important;
}
.hz-bp-task-act button:active { transform: scale(.94) !important; }
.hz-bp-task-act button.hz-st-ok   { background: var(--ios-ok-bg) !important; color: var(--ios-ok-ink) !important; }
.hz-bp-task-act button.hz-st-warn { background: var(--ios-warn-bg) !important; color: var(--ios-warn-ink) !important; }
.hz-bp-task-act button.hz-st-danger{ background: var(--ios-danger-bg) !important; color: var(--ios-danger-ink) !important; }

/* 展开区：淡底衬托，形成层级 */
.hz-bp-items {
  background: var(--ios-bg-3) !important;
  border-radius: 0 0 var(--ios-r-ctl) var(--ios-r-ctl) !important;
  padding: 4px 0 !important;
  margin: 0 10px 10px !important;
  border: .5px solid var(--ios-line-2) !important;
  border-top: none !important;
}
.hz-bp-items .empty { color: var(--ios-ink-3) !important; font-size: 12px !important; }

/* ═══════════════════════════════════════════════════════════════════
   十三、移动端专项修正（V2.3.30 第四轮）
   ─────────────────────────────────────────────────────────────────
   真机对照发现三处问题：
   ① .dash-duo 在手机上仍是 2 列 ⇒ 「隐患闭环看板」被压成 8 个字竖排一行。
      修正：≤820px 改单列，两个按钮各占整行。
   ② .dash-grid3 在手机上仍是 3 列 ⇒ 「开始检查」「知识库」被压成竖排。
      修正：≤820px 改 2 列（积分卡独占一行）。
   ③ 积分卡内 .rk-me-break / .rk-me-ranks 文字挤成竖条。
      修正：手机上给这些块解除 flex 方向约束，允许正常换行。
   ═══════════════════════════════════════════════════════════════════ */
@media (max-width: 820px) {
  /* ① 强调按钮单列 */
  .dash-duo,
  .dash-duo.solo { grid-template-columns: 1fr !important; gap: 9px !important; }
  .dash-duo .board-entry { min-height: 46px !important; font-size: 14px !important; }

  /* ② 入口卡 2 列，积分卡独占整行 */
  .dash-grid3 { grid-template-columns: repeat(2, 1fr) !important; gap: 9px !important; }
  .dash-grid3 > .rank-card.rank-me { grid-column: 1 / -1 !important; }
  .dash-grid3 > *:not(.dash-duo) { min-height: 64px !important; }

  /* ③ 积分卡内部允许换行，不再竖排 */
  .rank-card .rk-body { padding: 12px 13px !important; }
  .rk-me-flex { flex-wrap: wrap !important; align-items: center !important; gap: 10px !important; }
  .rk-me-side { flex-direction: row !important; align-items: center !important; gap: 6px !important; }
  .rk-me-pts { font-size: 26px !important; }
  .rk-me-ranks, .rk-me-tip { white-space: normal !important; word-break: break-word !important; }
  .rk-me-break .rk-b-line { flex-wrap: nowrap !important; }

  /* 指标卡：手机上 2 列，数字略收 */
  .dash-grid6, .dash-grid2 { grid-template-columns: repeat(2, 1fr) !important; gap: 9px !important; }
  .dash-grid6 .stat-card .v, .dash-grid2 .stat-card .v { font-size: 26px !important; }
  .dash-rank, .dash-t10-grid { grid-template-columns: 1fr !important; }

  /* 看板工程行：手机上信息换行更从容 */
  .hz-bp-h { flex-wrap: wrap !important; row-gap: 7px !important; }
  .hz-bp-n { flex: 1 1 100% !important; order: 3 !important; }
  .hz-bp-bar { flex: 1 1 100% !important; order: 4 !important; }
  .hz-fold-pill { margin-left: auto !important; }
}

/* ═══════════════════════════════════════════════════════════════════
   十四、工程列表 iOS 化（V2.3.31）
   ─────────────────────────────────────────────────────────────────
   结构实证（app-laws.js:2137 renderProjects / :2161 工程卡模板）：
     .proj-head > h2                       标题
     .proj-search > .ps-ic + input          搜索
     #proj-list > .proj-card               工程卡
        .p-acts > .p-edit / .p-del        修改 / 删除（★ 现为 emoji ✎ 🗑）
        .p-name                            工程名
        .p-meta                            建设/施工/监理单位 + 地点 + 进度
        .p-foot > span + .chip-count       任务数/隐患数 + 最新日期
   ★ 本节把 emoji 按钮换成 iOS 文字胶囊，并重排信息层级。
     ⚠ 只改视觉，onclick / data 属性 / 字段名一律不动。
   ═══════════════════════════════════════════════════════════════════ */
.proj-head { margin-bottom: 10px !important; }
.proj-head h2 {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  font-size: 24px !important; font-weight: 800 !important;
  letter-spacing: -.025em !important; color: var(--ios-ink-1) !important;
  margin-bottom: 10px !important;
}

/* 搜索框：iOS rounded search field */
.proj-search {
  display: flex !important; align-items: center !important; gap: 7px !important;
  background: rgba(118, 118, 128, .10) !important;
  border-radius: 10px !important;
  padding: 0 12px !important;
  min-height: 38px !important;
  border: none !important;
  box-shadow: none !important;
  transition: box-shadow .2s var(--ios-ease-o) !important;
}
.proj-search:focus-within { box-shadow: 0 0 0 3px var(--ios-acc-veil) !important; background: var(--ios-card) !important; }
.proj-search .ps-ic { color: var(--ios-ink-3) !important; display: flex !important; }
.proj-search input {
  border: none !important; background: none !important; outline: none !important;
  font-family: inherit !important; font-size: 13.5px !important;
  color: var(--ios-ink-1) !important; padding: 0 !important; height: 36px !important;
  width: 100% !important;
}
.proj-search input::placeholder { color: var(--ios-ink-4) !important; }

/* 工程卡：iOS inset card */
#proj-list { display: grid !important; grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)) !important; gap: 11px !important; }
.proj-card {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  border-radius: var(--ios-r-card) !important;
  box-shadow: var(--ios-s1) !important;
  padding: 15px 16px !important;
  position: relative !important;
  transition: transform .28s var(--ios-ease), box-shadow .28s var(--ios-ease) !important;
  cursor: pointer;
}
.proj-card:hover { transform: translateY(-2px) !important; box-shadow: var(--ios-s2) !important; }
.proj-card:active { transform: scale(.995) !important; }

/* 操作按钮：emoji → iOS 文字胶囊（右上角浮起） */
.p-acts {
  position: absolute !important; top: 12px !important; right: 12px !important;
  display: flex !important; gap: 6px !important;
  opacity: 0; transition: opacity .2s var(--ios-ease-o);
}
.proj-card:hover .p-acts { opacity: 1; }
.proj-card .p-edit,
.proj-card .p-del {
  font-family: inherit !important;
  font-size: 11.5px !important; font-weight: 620 !important;
  border: none !important; cursor: pointer;
  border-radius: var(--ios-r-pill) !important;
  padding: 4px 11px !important; min-height: 28px;
  transition: transform .18s var(--ios-ease), background .18s var(--ios-ease-o) !important;
}
.proj-card .p-edit { background: var(--ios-acc-veil) !important; color: var(--ios-acc-deep) !important; }
.proj-card .p-del  { background: var(--ios-danger-bg) !important; color: var(--ios-danger-ink) !important; }
/* ★ 隐藏 emoji 首字（原文是「✎ 修改」「🗑 删除」，emoji 已在 CSS 层去不掉了，
   故改为在 JS 侧替换文本；此处先把它们压小，避免 emoji 与文字不齐） */
.proj-card .p-edit, .proj-card .p-del { text-indent: 0 !important; }
.proj-card .p-edit::first-letter, .proj-card .p-del::first-letter { font-size: 0 !important; }
.proj-card .p-edit:hover { transform: scale(1.05); background: rgba(10,132,255,.18) !important; }
.proj-card .p-del:hover  { transform: scale(1.05); background: rgba(255,59,48,.18) !important; }
.proj-card .p-edit:active, .proj-card .p-del:active { transform: scale(.94) !important; }

/* 触摸设备（无 hover）常显按钮 */
@media (hover: none) { .p-acts { opacity: 1 !important; } }

.proj-card .p-name {
  font-size: 15.5px !important; font-weight: 720 !important;
  letter-spacing: -.015em !important; color: var(--ios-ink-1) !important;
  line-height: 1.35 !important;
  padding-right: 108px !important;              /* 给右上角按钮留位 */
  margin-bottom: 7px !important;
}
.proj-card .p-meta {
  font-size: 11.5px !important; color: var(--ios-ink-2) !important;
  line-height: 1.75 !important;
  padding: 9px 11px !important;
  background: var(--ios-bg-3) !important;
  border-radius: 10px !important;
  margin-bottom: 9px !important;
}
.proj-card .p-foot {
  display: flex !important; align-items: center !important; gap: 8px !important;
  font-size: 11.5px !important; color: var(--ios-ink-3) !important;
  padding-top: 9px !important;
  border-top: .5px solid var(--ios-line-2) !important;
}
.proj-card .chip-count {
  margin-left: auto !important;
  background: var(--ios-acc-veil) !important; color: var(--ios-acc-deep) !important;
  border-radius: var(--ios-r-pill) !important;
  font-size: 10.5px !important; font-weight: 700 !important;
  padding: 2px 9px !important;
  font-variant-numeric: tabular-nums;
}

/* ═══════════════════════════════════════════════════════════════════
   十五、知识库首页 iOS 化（V2.3.31）
   ─────────────────────────────────────────────────────────────────
   结构实证（kb.js:265 renderKbHome）：
     .kb-wrap > .kb-home-head（.kb-home-t 标题 / .kb-home-s 副标 / .kb-home-search）
     .kb-grid > .kb-card × 4
        .kb-card-ic.ic-{purple|green|orange|pink}  图标底
        .kb-card-t 标题 / .kb-card-d 描述 / .kb-card-f(.kb-chip + .kb-go)
   ★ 四张卡的图标底色原本是紫/绿/橙/粉四色（.ic-purple 等），
     与单一强调色体系冲突 ⇒ 统一为 Apple 蓝的深浅四级。
   ═══════════════════════════════════════════════════════════════════ */
.kb-home-t {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  font-size: 26px !important; font-weight: 820 !important;
  letter-spacing: -.028em !important; color: var(--ios-ink-1) !important;
}
.kb-home-s { font-size: 12.5px !important; color: var(--ios-ink-3) !important; }

/* iOS 搜索框 */
.kb-home-search {
  display: flex !important; align-items: center !important; gap: 8px !important;
  background: rgba(118, 118, 128, .10) !important;
  border-radius: 12px !important;
  padding: 5px 5px 5px 14px !important;
  min-height: 42px !important;
  max-width: 560px !important;
  margin: 12px auto 0 !important;
  transition: box-shadow .2s var(--ios-ease-o) !important;
}
.kb-home-search:hover { box-shadow: 0 0 0 3px var(--ios-acc-veil) !important; background: var(--ios-card) !important; }
.kb-home-search input {
  flex: 1 !important; border: none !important; background: none !important; outline: none !important;
  font-family: inherit !important; font-size: 13.5px !important;
  color: var(--ios-ink-1) !important; cursor: pointer;
}
.kb-home-search input::placeholder { color: var(--ios-ink-4) !important; }
.kb-home-search button {
  font-family: inherit !important;
  background: var(--ios-acc) !important; color: #fff !important;
  border: none !important; border-radius: 9px !important;
  font-size: 13px !important; font-weight: 680 !important;
  padding: 8px 18px !important; cursor: pointer;
  box-shadow: 0 1px 6px rgba(10,132,255,.28) !important;
  transition: transform .18s var(--ios-ease) !important;
}
.kb-home-search button:hover { transform: scale(1.03) !important; }
.kb-home-search button:active { transform: scale(.96) !important; }

/* 四张卡：iOS inset card + 单一蓝色系图标底 */
.kb-grid { display: grid !important; grid-template-columns: repeat(auto-fit, minmax(238px, 1fr)) !important; gap: 12px !important; }
.kb-card {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  border-radius: var(--ios-r-card) !important;
  box-shadow: var(--ios-s1) !important;
  padding: 17px 16px !important;
  cursor: pointer;
  transition: transform .28s var(--ios-ease), box-shadow .28s var(--ios-ease) !important;
}
.kb-card:hover { transform: translateY(-3px) !important; box-shadow: var(--ios-s2) !important; }
.kb-card:active { transform: scale(.99) !important; }
.kb-card:focus-visible { outline: 2px solid var(--ios-acc) !important; outline-offset: 2px !important; }

/* ★ 图标底：紫/绿/橙/粉 → Apple 蓝的四个深浅层级（保留可辨识度但同色系） */
.kb-card-ic {
  width: 40px !important; height: 40px !important;
  border-radius: 11px !important;
  display: flex !important; align-items: center !important; justify-content: center !important;
  margin-bottom: 12px !important;
}
.kb-card-ic svg { width: 20px !important; height: 20px !important; }
html:not([data-theme="dark"]) .kb-card-ic.ic-purple { background: rgba(10,132,255,.14) !important; color: var(--ios-acc-deep) !important; }
html:not([data-theme="dark"]) .kb-card-ic.ic-green  { background: rgba(10,132,255,.10) !important; color: var(--ios-acc) !important; }
html:not([data-theme="dark"]) .kb-card-ic.ic-orange { background: rgba(10,132,255,.18) !important; color: var(--ios-acc-deep) !important; }
html:not([data-theme="dark"]) .kb-card-ic.ic-pink   { background: rgba(10,132,255,.07) !important; color: var(--ios-acc) !important; }

.kb-card-t {
  font-size: 15px !important; font-weight: 720 !important;
  letter-spacing: -.015em !important; color: var(--ios-ink-1) !important;
  margin-bottom: 5px !important;
}
.kb-card-d {
  font-size: 11.5px !important; color: var(--ios-ink-3) !important;
  line-height: 1.6 !important; min-height: 37px !important;
  margin-bottom: 11px !important;
}
.kb-card-f {
  display: flex !important; align-items: center !important; gap: 8px !important;
  padding-top: 10px !important; border-top: .5px solid var(--ios-line-2) !important;
}
.kb-chip {
  font-family: inherit !important;
  background: var(--ios-acc-veil) !important; color: var(--ios-acc-deep) !important;
  border-radius: var(--ios-r-pill) !important;
  font-size: 10.5px !important; font-weight: 700 !important;
  padding: 2.5px 9px !important;
  font-variant-numeric: tabular-nums;
}
.kb-go { margin-left: auto !important; font-size: 12px !important; font-weight: 620 !important; color: var(--ios-acc) !important; }

/* ═══════════════════════════════════════════════════════════════════
   十六、违反条文 → 规范引用卡（V2.3.31）
   ─────────────────────────────────────────────────────────────────
   数据依据（samplelib.json 实测 1163 段 norms）：
     · 92.1% 只含 1 个规范；7.9% 含 2 个以上
     · 96.0% 符合「《标准名》（编号）第X.X条 正文」格式
   ⇒ 可结构化拆成三段：标准名 / 编号 / 条款号 + 条文要点。
   ★ 卡片样式：左侧 3px 蓝色条（iOS 引用块范式），超 96 字折叠。
   ═══════════════════════════════════════════════════════════════════ */
.sl-norms { background: none !important; border: none !important; box-shadow: none !important; padding: 0 !important; }

.sl-norm-box { display: flex; flex-direction: column; gap: 9px; }

.sl-norm-sum {
  font-size: 11px !important; font-weight: 700 !important;
  color: var(--ios-ink-3) !important;
  letter-spacing: .02em;
  padding: 0 2px 1px !important;
}

.sl-norm {
  position: relative;
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  border-left: 3px solid var(--ios-acc) !important;   /* iOS 引用块 */
  border-radius: var(--ios-r-ctl) !important;
  box-shadow: var(--ios-s1) !important;
  padding: 12px 14px !important;
  transition: box-shadow .28s var(--ios-ease) !important;
}
.sl-norm:hover { box-shadow: var(--ios-s2) !important; }

/* 头部：条款号 + 编号胶囊 + 标准名 */
.sl-norm-hd {
  display: flex !important; align-items: center !important; gap: 7px !important;
  flex-wrap: wrap !important;
  margin-bottom: 7px !important;
}
.sl-norm-no {
  font-size: 11px !important; font-weight: 800 !important;
  background: var(--ios-acc) !important; color: #fff !important;
  border-radius: var(--ios-r-pill) !important;
  padding: 2.5px 9px !important;
  font-variant-numeric: tabular-nums;
  letter-spacing: .01em;
  flex: none;
}
.sl-norm-code {
  font-size: 10.5px !important; font-weight: 700 !important;
  background: var(--ios-bg-4) !important; color: var(--ios-ink-2) !important;
  border: .5px solid var(--ios-line) !important;
  border-radius: var(--ios-r-pill) !important;
  padding: 2px 8px !important;
  font-family: ui-monospace, "SF Mono", Menlo, monospace;
  font-variant-numeric: tabular-nums;
  flex: none;
}
.sl-norm-name {
  font-size: 12.5px !important; font-weight: 680 !important;
  color: var(--ios-ink-1) !important;
  letter-spacing: -.008em !important;
  min-width: 0;
}

/* 条文要点 */
.sl-norm-tx {
  font-size: 12.5px !important;
  line-height: 1.75 !important;
  color: var(--ios-ink-2) !important;
  text-wrap: pretty;
}
.sl-norm.long .sl-norm-tx { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
/* ★★ v2.3.46 修「点展开全文没反应」：这条**必须带 !important**。
   原因（同 v2.3.43 白字白底那次一模一样的坑）：下方移动端块里有
     `.sl-norm.long .sl-norm-tx { -webkit-line-clamp: 3 !important; }`（3 个类 + !important）
   它会**压死**本条 `.sl-norm.long.open .sl-norm-tx`（4 个类但无 !important）——
   !important 优先于特异性，于是点开 .open 后行数钳制纹丝不动，高度 62→62。
   实测：.open 已加、按钮已变「收起」、.sl-norm-rest 已 display:inline，
        唯独 clamp 仍是 3 ⇒ 文字一行不展开（涛哥截图现象）。
   ⇒ 展开态同样补 !important，让两者在同一优先级下比特异性（4 类 > 3 类）。 */
.sl-norm.long.open .sl-norm-tx { -webkit-line-clamp: unset !important; }
.sl-norm-rest { display: none; }
.sl-norm.long.open .sl-norm-rest { display: inline !important; }

.sl-norm-more {
  font-family: inherit !important;
  background: none !important; border: none !important;
  color: var(--ios-acc) !important;
  font-size: 11.5px !important; font-weight: 650 !important;
  padding: 6px 0 0 !important;
  cursor: pointer;
  transition: opacity .18s var(--ios-ease-o) !important;
}
.sl-norm-more:hover { opacity: .7 !important; }

/* 未拆解成功的原文（347 条无结构化引用） */
.sl-norm-raw { border-left-color: var(--ios-ink-4) !important; }
.sl-norm-empty {
  font-size: 12px !important; color: var(--ios-ink-3) !important;
  background: var(--ios-card) !important;
  border: .5px dashed var(--ios-line) !important;
  border-radius: var(--ios-r-ctl) !important;
  padding: 14px 15px !important; text-align: center;
}

/* ═══════════════════════════════════════════════════════════════════
   十七、技术标准库 iOS 化（V2.3.31）
   ─────────────────────────────────────────────────────────────────
   结构实证（kb.js:344 renderStandards）：
     .kb-page-h > .kb-back + 标题 / .kb-page-sub
     .lib-search > input + .ar-btn.ok（搜索）+ .ar-btn.ai（AI 提问）
     .std-filter > .std-fbtn（分类，可带 .std-fcnt）+ .active
     .std-list > .std-card → .std-ic / .std-main(.std-t + .std-tags) / .std-go
   ★ 分类按钮原本是药丸标签组 → 改 iOS segmented control（滑块高亮）。
   ★ .std-ic 原本是 emoji（📘📗⚡📋🧾📄）→ 已在 JS 侧换成 1.7px 线性 SVG。
   ═══════════════════════════════════════════════════════════════════ */
.kb-page-h {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  font-size: 22px !important; font-weight: 800 !important;
  letter-spacing: -.022em !important; color: var(--ios-ink-1) !important;
  display: flex !important; align-items: center !important; gap: 10px !important;
}
.kb-back {
  font-size: 13px !important; font-weight: 600 !important;
  color: var(--ios-acc) !important; cursor: pointer;
  transition: opacity .18s var(--ios-ease-o) !important;
}
.kb-back:hover { opacity: .65 !important; }
.kb-page-sub {
  font-size: 12.5px !important; color: var(--ios-ink-3) !important;
  line-height: 1.7 !important; margin: 6px 0 12px !important;
  max-width: 860px !important;
}
.kb-page-sub b { color: var(--ios-ink-2) !important; font-weight: 700 !important; }

/* 检索条：iOS search field + 双按钮 */
.lib-search {
  display: flex !important; align-items: center !important; gap: 8px !important;
  background: rgba(118, 118, 128, .10) !important;
  border-radius: 12px !important;
  padding: 5px 5px 5px 14px !important;
  min-height: 42px !important;
  margin-bottom: 12px !important;
  transition: box-shadow .2s var(--ios-ease-o) !important;
}
.lib-search:focus-within { box-shadow: 0 0 0 3px var(--ios-acc-veil) !important; background: var(--ios-card) !important; }
.lib-search input {
  flex: 1 !important; border: none !important; background: none !important; outline: none !important;
  font-family: inherit !important; font-size: 13.5px !important;
  color: var(--ios-ink-1) !important; height: 34px !important;
}
.lib-search input::placeholder { color: var(--ios-ink-4) !important; }
.lib-search .ar-btn {
  font-family: inherit !important;
  font-size: 12.5px !important; font-weight: 680 !important;
  border: none !important; border-radius: 9px !important;
  padding: 8px 16px !important; cursor: pointer; flex: none;
  transition: transform .18s var(--ios-ease) !important;
}
.lib-search .ar-btn.ok { background: var(--ios-acc) !important; color: #fff !important; box-shadow: 0 1px 6px rgba(10,132,255,.26) !important; }
.lib-search .ar-btn.ai { background: var(--ios-acc-veil) !important; color: var(--ios-acc-deep) !important; }
.lib-search .ar-btn:hover { transform: scale(1.03) !important; }
.lib-search .ar-btn:active { transform: scale(.96) !important; }

/* 分类筛选：iOS segmented control（滑块高亮） */
.std-filter {
  display: flex !important; flex-wrap: wrap !important; gap: 3px !important;
  background: rgba(118, 118, 128, .10) !important;
  border-radius: 11px !important;
  padding: 3px !important;
  margin-bottom: 12px !important;
  max-width: 100% !important;
}
.std-fbtn {
  font-family: inherit !important;
  font-size: 12.5px !important; font-weight: 600 !important;
  color: var(--ios-ink-2) !important;
  background: none !important; border: none !important;
  border-radius: 8.5px !important;
  padding: 7px 13px !important; cursor: pointer;
  min-height: 34px;
  display: inline-flex !important; align-items: center !important; gap: 5px !important;
  transition: background .2s var(--ios-ease-o), color .2s var(--ios-ease-o), box-shadow .2s var(--ios-ease-o) !important;
}
.std-fbtn:hover { color: var(--ios-ink-1) !important; }
.std-fbtn.active {
  background: var(--ios-card) !important; color: var(--ios-ink-1) !important;
  font-weight: 700 !important;
  box-shadow: var(--ios-s1) !important;
}
.std-fcnt {
  font-size: 10px !important; font-weight: 700 !important;
  background: rgba(118, 118, 128, .16) !important; color: var(--ios-ink-3) !important;
  border-radius: var(--ios-r-pill) !important; padding: 1px 6px !important;
  font-variant-numeric: tabular-nums;
}
.std-fbtn.active .std-fcnt { background: var(--ios-acc-veil) !important; color: var(--ios-acc-deep) !important; }

/* 标准列表：iOS inset list */
.std-list { display: flex !important; flex-direction: column !important; gap: 8px !important; }
.std-card {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  border-radius: var(--ios-r-card) !important;
  box-shadow: var(--ios-s1) !important;
  padding: 13px 15px !important;
  display: flex !important; align-items: center !important; gap: 12px !important;
  cursor: pointer;
  transition: transform .28s var(--ios-ease), box-shadow .28s var(--ios-ease) !important;
}
.std-card:hover { transform: translateY(-2px) !important; box-shadow: var(--ios-s2) !important; }
.std-card:active { transform: scale(.995) !important; }
.std-ic {
  width: 38px !important; height: 38px !important; flex: none !important;
  background: var(--ios-acc-veil) !important; color: var(--ios-acc) !important;
  border-radius: 10px !important;
  display: flex !important; align-items: center !important; justify-content: center !important;
  font-size: 0 !important;                     /* 抹掉旧 emoji 字号 */
}
.std-ic svg { width: 17px !important; height: 17px !important; display: block; }
.std-main { flex: 1 !important; min-width: 0 !important; }
.std-t {
  font-size: 13.5px !important; font-weight: 660 !important;
  color: var(--ios-ink-1) !important; line-height: 1.4 !important;
  margin-bottom: 4px !important;
}
.std-tags { display: flex !important; gap: 6px !important; }
.std-go {
  font-size: 12.5px !important; font-weight: 620 !important;
  color: var(--ios-acc) !important; flex: none !important;
}

/* ═══════════════════════════════════════════════════════════════════
   十八、本轮三页的移动端断点（V2.3.31）
   ═══════════════════════════════════════════════════════════════════ */
@media (max-width: 820px) {
  /* 工程卡：单列，操作按钮常显 */
  #proj-list { grid-template-columns: 1fr !important; gap: 10px !important; }
  .proj-card { padding: 14px 14px !important; }
  .proj-card .p-name { font-size: 14.5px !important; padding-right: 100px !important; }
  .proj-card .p-meta { font-size: 11px !important; line-height: 1.7 !important; }

  /* 知识库：卡片单列（原来是 auto-fit minmax(238px)，390px 下会挤成 1 列但描述被压） */
  .kb-grid { grid-template-columns: 1fr !important; gap: 10px !important; }
  .kb-card { padding: 15px 14px !important; }
  .kb-card-d { min-height: 0 !important; }
  .kb-home-t { font-size: 22px !important; }
  .kb-home-search { padding-left: 12px !important; }
  .kb-home-search button { padding: 8px 14px !important; }

  /* 技术标准：检索条竖排、分类横向滚动 */
  .lib-search { flex-wrap: wrap !important; padding: 8px !important; gap: 7px !important; }
  .lib-search input { flex: 1 1 100% !important; height: 32px !important; }
  .lib-search .ar-btn { flex: 1 !important; }
  .std-filter {
    flex-wrap: nowrap !important; overflow-x: auto !important;
    -webkit-overflow-scrolling: touch;
    border-radius: 11px !important;
  }
  .std-fbtn { flex: none !important; white-space: nowrap !important; }
  .std-card { padding: 12px 13px !important; gap: 10px !important; }
  .std-t { font-size: 13px !important; }

  /* 违反条文：卡片头竖排（条款号+编号一行，标准名一行） */
  .sl-norm { padding: 11px 12px !important; }
  .sl-norm-hd { gap: 6px !important; }
  .sl-norm-name { font-size: 12px !important; }
  .sl-norm-tx { font-size: 12px !important; line-height: 1.72 !important; }
  .sl-norm.long .sl-norm-tx { -webkit-line-clamp: 3 !important; }
}

/* ═══════════════════════════════════════════════════════════════════
   十九、常见问题库 iOS 化（V2.3.33）
   ─────────────────────────────────────────────────────────────────
   结构实证（kb.js:552 renderFaq）：
     .kb-page-h / .kb-page-sub / .lib-search（与标准库同款，已在第十七节覆盖）
     .haz-section > .haz-sec-h
       .haz-cat（类别，可折叠）> .haz-cat-h
         .haz-cat-ic  ★ 现在是 emoji（cat.icon || '📁'）
         .haz-cat-t 类别名 / .haz-cat-n 条数 / .haz-cat-arrow ▾
       .haz-cat-body > 二级分组（重大事故隐患置顶 + 图集分类）
   ═══════════════════════════════════════════════════════════════════ */
.haz-section { margin-top: 4px !important; }
.haz-sec-h {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  font-size: 12.5px !important; font-weight: 700 !important;
  color: var(--ios-ink-1) !important;
  background: var(--ios-bg-3) !important;
  border: .5px solid var(--ios-line-2) !important;
  border-radius: var(--ios-r-ctl) !important;
  padding: 11px 14px !important;
  display: flex !important; align-items: center !important; gap: 7px !important;
  margin-bottom: 9px !important;
}
.haz-sec-h svg { width: 14px !important; height: 14px !important; color: var(--ios-ink-3) !important; }

/* 类别行：iOS inset row */
.haz-cat {
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  border-radius: var(--ios-r-card) !important;
  box-shadow: var(--ios-s1) !important;
  margin-bottom: 8px !important;
  overflow: hidden !important;
  transition: box-shadow .28s var(--ios-ease) !important;
}
.haz-cat:hover { box-shadow: var(--ios-s2) !important; }
.haz-cat-h {
  display: flex !important; align-items: center !important; gap: 10px !important;
  padding: 12px 14px !important;
  min-height: 46px !important;                    /* HIG 触摸目标 */
  cursor: pointer;
  transition: background .16s var(--ios-ease-o) !important;
}
.haz-cat-h:hover { background: var(--ios-bg-3) !important; }
.haz-cat-ic {
  width: 30px !important; height: 30px !important; flex: none !important;
  background: var(--ios-acc-veil) !important;
  border-radius: 9px !important;
  display: flex !important; align-items: center !important; justify-content: center !important;
  font-size: 0 !important;                         /* 抹掉 emoji 字号 */
  overflow: hidden;
}
.haz-cat-ic svg { width: 15px !important; height: 15px !important; color: var(--ios-acc-deep) !important; }
.haz-cat-t {
  flex: 1 !important; min-width: 0 !important;
  font-size: 13.5px !important; font-weight: 670 !important;
  color: var(--ios-ink-1) !important; letter-spacing: -.01em !important;
}
.haz-cat-n {
  font-size: 11px !important; font-weight: 620 !important;
  color: var(--ios-ink-3) !important;
  background: rgba(118,118,128,.12) !important;
  border-radius: var(--ios-r-pill) !important;
  padding: 2px 8px !important;
  font-variant-numeric: tabular-nums;
  flex: none;
}
.haz-cat-arrow {
  color: var(--ios-ink-4) !important; font-size: 12px !important;
  transition: transform .24s var(--ios-ease) !important;
  flex: none;
}
/* 展开时箭头旋转 */
.haz-cat.open .haz-cat-arrow, .haz-cat-h.on .haz-cat-arrow { transform: rotate(180deg) !important; }
.haz-cat-body {
  border-top: .5px solid var(--ios-line-2) !important;
  background: var(--ios-bg-3) !important;
  padding: 4px 0 !important;
}

/* ═══════════════════════════════════════════════════════════════════
   二十、整改通知 / 整改闭环 iOS 化（V2.3.33）
   ─────────────────────────────────────────────────────────────────
   结构实证（kb.js:2441 renderRectifyList / :2497 rectListCard）：
     .page-back-bar > .page-back-btn
     .arena-card.detail > .ar-title（含 .rect-cnt 计数）+ .ar-brief
     .rect-list > .rect-row
        .rect-row-h > .rect-no（文书号）+ .rect-badge（状态）+ .rect-date
        .rect-proj（工程名 + 施工单位）
        .rect-units > .rect-uchip（三方企业 + 状态）
        .rect-meta（销号进度 / 隐患数 / 待复查 / 期限）
   ═══════════════════════════════════════════════════════════════════ */
.page-back-bar { margin-bottom: 11px !important; }
.page-back-btn {
  font-family: inherit !important;
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  border-radius: var(--ios-r-pill) !important;
  font-size: 12.5px !important; font-weight: 620 !important;
  color: var(--ios-acc) !important;
  padding: 7px 15px !important; min-height: 36px !important;
  box-shadow: var(--ios-s1) !important;
  transition: transform .18s var(--ios-ease) !important;
}
.page-back-btn:hover { transform: translateY(-1px) !important; }
.page-back-btn:active { transform: scale(.97) !important; }

.arena-card {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  border-radius: var(--ios-r-card) !important;
  box-shadow: var(--ios-s1) !important;
  padding: 16px !important;
  margin-bottom: 12px !important;
  transition: box-shadow .28s var(--ios-ease) !important;
}
.arena-card:hover { box-shadow: var(--ios-s2) !important; }
.ar-title {
  font-size: 16px !important; font-weight: 750 !important;
  letter-spacing: -.018em !important; color: var(--ios-ink-1) !important;
  display: flex !important; align-items: center !important; gap: 8px !important;
  margin-bottom: 7px !important;
}
.rect-cnt {
  font-size: 11px !important; font-weight: 700 !important;
  background: var(--ios-acc-veil) !important; color: var(--ios-acc-deep) !important;
  border-radius: var(--ios-r-pill) !important; padding: 2px 9px !important;
  font-variant-numeric: tabular-nums;
}
.ar-brief {
  font-size: 12px !important; color: var(--ios-ink-3) !important;
  line-height: 1.72 !important; margin-bottom: 12px !important;
}

/* 通知卡：iOS inset list */
.rect-list { display: flex !important; flex-direction: column !important; gap: 9px !important; }
.rect-row {
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  border-radius: var(--ios-r-ctl) !important;
  box-shadow: var(--ios-s1) !important;
  padding: 12px 14px !important;
  cursor: pointer;
  transition: transform .26s var(--ios-ease), box-shadow .26s var(--ios-ease) !important;
}
.rect-row:hover { transform: translateY(-2px) !important; box-shadow: var(--ios-s2) !important; }
.rect-row:active { transform: scale(.995) !important; }
.rect-row-h { display: flex !important; align-items: center !important; gap: 8px !important; margin-bottom: 7px !important; flex-wrap: wrap !important; }
.rect-no {
  font-size: 10.5px !important; font-weight: 700 !important;
  background: var(--ios-bg-4) !important; color: var(--ios-ink-2) !important;
  border: .5px solid var(--ios-line) !important;
  border-radius: var(--ios-r-pill) !important; padding: 2px 8px !important;
  font-variant-numeric: tabular-nums;
  font-family: ui-monospace, "SF Mono", Menlo, monospace;
}
.rect-badge {
  font-size: 10.5px !important; font-weight: 700 !important;
  border-radius: var(--ios-r-pill) !important; padding: 2.5px 9px !important;
  white-space: nowrap;
}
.rect-date {
  margin-left: auto !important;
  font-size: 11px !important; color: var(--ios-ink-3) !important;
  font-variant-numeric: tabular-nums;
}
.rect-proj {
  font-size: 13.5px !important; font-weight: 660 !important;
  color: var(--ios-ink-1) !important; line-height: 1.4 !important;
  margin-bottom: 8px !important;
}
.rect-proj small { font-weight: 500 !important; color: var(--ios-ink-3) !important; font-size: 11.5px !important; }
.rect-units { display: flex !important; flex-wrap: wrap !important; gap: 5px !important; margin-bottom: 8px !important; }
.rect-uchip {
  font-size: 10.5px !important; font-weight: 600 !important;
  border-radius: var(--ios-r-pill) !important; padding: 3px 9px !important;
  background: rgba(118,118,128,.10) !important; color: var(--ios-ink-2) !important;
  white-space: nowrap;
}
.rect-uchip b { color: var(--ios-ink-1) !important; font-weight: 700 !important; }
.rect-empty { font-size: 11px !important; color: var(--ios-ink-3) !important; font-style: italic !important; }
.rect-meta {
  font-size: 11px !important; color: var(--ios-ink-3) !important;
  padding-top: 8px !important; border-top: .5px solid var(--ios-line-2) !important;
  font-variant-numeric: tabular-nums;
}

/* ═══════════════════════════════════════════════════════════════════
   二十一、工程详情页 + 检查任务页（V2.3.33）
   ─────────────────────────────────────────────────────────────────
   结构实证：
     app-laws.js:2324  <button class="s-btn hz-tf-merge">⇄ 合并生成整改文书</button>
     app-laws.js:2352  <label class="s-chk"><input class="merge-sel" data-sid>…</label>
     app-tail.js:1582  j59RenderInspect → .inspTopHTML(...) + .insp3
                        .insp-left（左目录）/ .insp-resizer / .insp-mid（中检查项）
                        / .insp-resizer / .insp-right（右详情）
   ★ 截图复验发现：「合并生成整改文书」按钮仍是紫粉渐变（第八节的收敛没点名到它），
     且它带 ⇄ 字符图标 —— 一并处理。
   ★ 检查页是**三栏可拖拽**布局，逻辑复杂，本节只做视觉（不改 resize 逻辑）。
   ═══════════════════════════════════════════════════════════════════ */

/* 主操作按钮：渐变 → 单一 Apple 蓝 */
.s-btn,
.s-btn.hz-tf-merge {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  background: var(--ios-acc) !important;
  background-image: none !important;
  color: #fff !important;
  border: none !important;
  border-radius: var(--ios-r-ctl) !important;
  font-size: 13px !important; font-weight: 660 !important;
  padding: 9px 16px !important;
  min-height: 38px !important;
  box-shadow: 0 2px 10px rgba(10,132,255,.26) !important;
  transition: transform .2s var(--ios-ease), box-shadow .2s var(--ios-ease) !important;
}
.s-btn:hover { transform: translateY(-1px) !important; box-shadow: 0 6px 20px rgba(10,132,255,.34) !important; }
.s-btn:active { transform: scale(.97) !important; }

/* 次要按钮（ghost 变体）保持白底 */
.s-btn.ghost,
.btn.ghost {
  background: var(--ios-card) !important;
  background-image: none !important;
  color: var(--ios-ink-1) !important;
  border: .5px solid var(--ios-line) !important;
  box-shadow: var(--ios-s1) !important;
}
.s-btn.ghost:hover { background: var(--ios-bg-3) !important; }

/* 勾选行 */
.s-chk {
  display: inline-flex !important; align-items: center !important;
  gap: 5px !important; cursor: pointer !important;
  font-size: 11.5px !important; color: var(--ios-ink-2) !important;
  min-height: 30px;
}
.s-chk input[type="checkbox"] {
  width: 17px !important; height: 17px !important;
  accent-color: var(--ios-acc) !important;   /* iOS 蓝勾选 */
  cursor: pointer;
}

/* 检查任务状态分类标签（检查中 / 整改中 / 已整改）*/
.tf-tabs, .hz-tf-tabs { display: flex !important; gap: 3px !important; flex-wrap: wrap !important; }
.tf-tab, .hz-tf-tab {
  font-family: inherit !important;
  font-size: 12px !important; font-weight: 620 !important;
  border-radius: var(--ios-r-pill) !important;
  padding: 5px 12px !important; min-height: 32px !important;
  background: rgba(118,118,128,.10) !important; color: var(--ios-ink-2) !important;
  border: none !important; cursor: pointer !important;
  position: relative;
  transition: background .2s var(--ios-ease-o), color .2s var(--ios-ease-o) !important;
}
.tf-tab:hover, .hz-tf-tab:hover { background: rgba(118,118,128,.17) !important; }
.tf-tab.on, .hz-tf-tab.on, .tf-tab.active, .hz-tf-tab.active {
  background: var(--ios-acc) !important; color: #fff !important; font-weight: 700 !important;
  box-shadow: 0 1px 6px rgba(10,132,255,.26) !important;
}
.tf-tab .n, .hz-tf-tab .n {
  font-size: 10px !important; font-weight: 700 !important;
  background: rgba(118,118,128,.18) !important; color: var(--ios-ink-3) !important;
  border-radius: var(--ios-r-pill) !important; padding: 1px 6px !important;
  margin-left: 4px !important; font-variant-numeric: tabular-nums;
}
.tf-tab.on .n, .hz-tf-tab.on .n, .tf-tab.active .n, .hz-tf-tab.active .n {
  background: rgba(255,255,255,.26) !important; color: #fff !important;
}

/* ── 检查页三栏：iOS 分栏（仅视觉，不动 insp3 / resizer 逻辑）── */
.insp3 {
  background: transparent !important;
  border-radius: var(--ios-r-card) !important;
  overflow: hidden;
}
.insp-left,
.insp-right {
  background: var(--ios-card) !important;
  border-radius: var(--ios-r-card) !important;
  box-shadow: var(--ios-s1) !important;
  border: .5px solid var(--ios-line-2) !important;
}
/* 拖拽手柄：iOS 细分隔条 */
.insp-resizer {
  background: var(--ios-line) !important;
  border-radius: 1px !important;
  transition: background .2s var(--ios-ease-o) !important;
}
.insp-resizer:hover, .insp-resizer.dragging { background: var(--ios-acc) !important; }

/* 左栏目录项 */
.insp-left .dir-item {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  font-size: 12.5px !important; color: var(--ios-ink-2) !important;
  border-radius: 9px !important; padding: 8px 10px !important;
  min-height: 38px !important;
  display: flex !important; align-items: center !important; gap: 8px !important;
  transition: background .16s var(--ios-ease-o) !important;
}
.insp-left .dir-item:hover { background: rgba(118,118,128,.08) !important; }
.insp-left .dir-item.active,
.insp-left .dir-item.on {
  background: var(--ios-acc) !important; color: #fff !important; font-weight: 660 !important;
}

/* 中栏检查项卡 */
.insp-mid .item-card,
.item-card {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  border-radius: var(--ios-r-card) !important;
  box-shadow: var(--ios-s1) !important;
  padding: 13px 14px !important;
  margin-bottom: 9px !important;
  transition: transform .26s var(--ios-ease), box-shadow .26s var(--ios-ease) !important;
}
.item-card:hover { transform: translateY(-1px) !important; box-shadow: var(--ios-s2) !important; }
.item-card.active { border-color: rgba(10,132,255,.4) !important; box-shadow: 0 0 0 3px var(--ios-acc-veil) !important; }
.item-card input[type="checkbox"] { width: 18px !important; height: 18px !important; accent-color: var(--ios-acc) !important; }

/* 分组头 */
.hz-group-head {
  font-family: inherit !important;
  font-size: 12.5px !important; font-weight: 700 !important;
  color: var(--ios-ink-1) !important;
  background: var(--ios-bg-3) !important;
  border-radius: var(--ios-r-ctl) !important;
  padding: 10px 13px !important;
  margin: 4px 0 8px !important;
  min-height: 40px !important;
  display: flex !important; align-items: center !important; gap: 8px !important;
  transition: background .18s var(--ios-ease-o) !important;
}
.hz-group-head:hover { background: var(--ios-bg-4) !important; }

/* ═══════════════════════════════════════════════════════════════════
   二十二、专注模式 iOS 化（V2.3.34）
   ─────────────────────────────────────────────────────────────────
   结构实证（app-rectify.js:275~ renderCareDashboard）：
     .care-hero > .care-badge（专注模式徽标）+ h1 + p
     .care-main-btn（大「开始检查」按钮）
     .care-recent > .care-sec-t（我的工程）+ .care-proj（工程行）/ .care-empty
     退出按钮 .care-exit
     专注导航条 .care-nav > button.cn-home（「专注首页」，app-laws.js:1533 hzCareBar）
   ★ 定位：这是给一线监督员现场检查用的「极简模式」——
     界面越干净越好，按钮越大越好（戴手套/户外操作），故主按钮做成 iOS 大尺寸。
   ═══════════════════════════════════════════════════════════════════ */

/* 专注模式整体：去掉多余装饰，卡片更「实」 */
body.hz-care { background: var(--ios-bg) !important; }

/* 顶部说明区 */
.care-hero {
  text-align: center !important;
  padding: 26px 16px 20px !important;
  margin-bottom: 4px !important;
}
.care-badge {
  display: inline-flex !important; align-items: center !important; gap: 5px !important;
  background: var(--ios-acc-veil) !important;
  color: var(--ios-acc-deep) !important;
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  font-size: 11.5px !important; font-weight: 700 !important;
  border-radius: var(--ios-r-pill) !important;
  padding: 5px 12px !important;
  margin-bottom: 14px !important;
}
.care-badge svg { width: 13px !important; height: 13px !important; }
.care-hero h1 {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Display", "PingFang SC", sans-serif;
  font-size: 30px !important; font-weight: 830 !important;
  letter-spacing: -.03em !important; color: var(--ios-ink-1) !important;
  margin-bottom: 6px !important;
}
.care-hero p {
  font-size: 13.5px !important; color: var(--ios-ink-3) !important;
  line-height: 1.6 !important;
}

/* ★ 主按钮：户外/戴手套操作 ⇒ 尺寸要够大（≥64px 高，符合 iOS HIG 主操作规范）*/
.care-main-btn {
  display: flex !important;
  align-items: center !important; justify-content: center !important; gap: 12px !important;
  background: var(--ios-acc) !important; background-image: none !important;
  color: #fff !important;
  border-radius: var(--ios-r-xl) !important;
  box-shadow: 0 6px 24px rgba(10, 132, 255, .32) !important;
  min-height: 66px !important;
  margin: 0 auto 24px !important;
  max-width: 420px !important;
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Display", "PingFang SC", sans-serif;
  font-size: 19px !important; font-weight: 750 !important;
  letter-spacing: -.015em !important;
  cursor: pointer;
  transition: transform .2s var(--ios-ease), box-shadow .2s var(--ios-ease) !important;
}
.care-main-btn:hover { transform: translateY(-2px) !important; box-shadow: 0 10px 34px rgba(10,132,255,.4) !important; }
.care-main-btn:active { transform: scale(.975) !important; box-shadow: 0 3px 14px rgba(10,132,255,.3) !important; }
.care-main-btn svg { width: 28px !important; height: 28px !important; flex: none; }

/* 分区标题 */
.care-sec-t {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  font-size: 12.5px !important; font-weight: 700 !important;
  color: var(--ios-ink-3) !important;
  letter-spacing: .02em !important;
  padding: 0 4px 9px !important;
  margin-bottom: 4px !important;
}

/* 工程行：iOS inset list（触摸目标 56px，户外友好） */
.care-recent { max-width: 560px !important; margin: 0 auto !important; }
.care-proj {
  display: flex !important; align-items: center !important; gap: 11px !important;
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  border-radius: var(--ios-r-card) !important;
  box-shadow: var(--ios-s1) !important;
  padding: 14px 16px !important;
  min-height: 56px !important;                  /* 户外/手套操作友好 */
  margin-bottom: 9px !important;
  cursor: pointer;
  transition: transform .24s var(--ios-ease), box-shadow .24s var(--ios-ease) !important;
}
.care-proj:hover { transform: translateY(-2px) !important; box-shadow: var(--ios-s2) !important; }
.care-proj:active { transform: scale(.99) !important; }
.care-proj .cp-t {
  font-size: 14.5px !important; font-weight: 680 !important;
  color: var(--ios-ink-1) !important; letter-spacing: -.01em !important;
  flex: 1 !important; min-width: 0 !important;
}
.care-proj .cp-n {
  font-size: 11.5px !important; color: var(--ios-ink-3) !important;
  font-variant-numeric: tabular-nums; flex: none;
}
.care-empty {
  background: var(--ios-card) !important;
  border: .5px dashed var(--ios-line) !important;
  border-radius: var(--ios-r-card) !important;
  padding: 26px 18px !important;
  text-align: center !important;
  font-size: 13px !important; color: var(--ios-ink-3) !important;
  line-height: 1.7 !important;
}

/* 退出按钮：低调但可点 */
.care-exit {
  display: block !important;
  margin: 22px auto 0 !important;
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line) !important;
  border-radius: var(--ios-r-pill) !important;
  color: var(--ios-ink-2) !important;
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  font-size: 13px !important; font-weight: 620 !important;
  padding: 10px 22px !important;
  min-height: 44px !important;                    /* HIG 触摸目标 */
  box-shadow: var(--ios-s1) !important;
  cursor: pointer;
  transition: transform .18s var(--ios-ease), background .18s var(--ios-ease-o) !important;
}
.care-exit:hover { background: var(--ios-bg-3) !important; }
.care-exit:active { transform: scale(.97) !important; }

/* 专注导航条（专注页顶部「专注首页」）*/
.care-nav {
  display: flex !important; align-items: center !important; gap: 10px !important;
  max-width: 1240px !important; margin: 0 auto 12px !important;
  padding: 0 2px !important;
}
.care-nav .cn-home {
  display: inline-flex !important; align-items: center !important; gap: 6px !important;
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line) !important;
  border-radius: var(--ios-r-pill) !important;
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  font-size: 13px !important; font-weight: 650 !important;
  color: var(--ios-acc) !important;
  padding: 8px 16px !important;
  min-height: 38px !important;
  box-shadow: var(--ios-s1) !important;
  cursor: pointer;
  transition: transform .18s var(--ios-ease) !important;
}
.care-nav .cn-home:hover { transform: translateY(-1px) !important; }
.care-nav .cn-home:active { transform: scale(.97) !important; }

/* 移动端：主按钮占满宽，工程行触摸目标再放大 */
@media (max-width: 820px) {
  .care-hero { padding: 20px 14px 16px !important; }
  .care-hero h1 { font-size: 25px !important; }
  .care-main-btn { min-height: 70px !important; font-size: 18px !important; max-width: none !important; }
  .care-proj { min-height: 60px !important; padding: 15px !important; }
  .care-exit { width: 100% !important; }
}

/* ═══════════════════════════════════════════════════════════════════
   二十三、企业整改台 iOS 化（V2.3.34）
   ─────────────────────────────────────────────────────────────────
   结构实证（kb.js:2620 renderUnitDeskList）：
     .rect-grp（按工程分组）
       .rect-grp-h > .rg-name（工程名）+ .rg-cnt（份数 / 待办 / 待复查 / 全部闭环）
       .rg-team > .rg-chip（建设/施工/监理三方阵容，「我单位」高亮 .me）
       .rect-list > .rect-row（★ 复用第二十节已 iOS 化的通知卡样式）
   ⚠ 访问守卫：kb.js:67 isUnitUser() 要求 role === '单位用户'，
     且 isUnitUser 为 false 时 goHash('unitdesk') 会被弹回 dashboard。
   ★ 已在云端用管理员接口创建测试企业账号验证（hz_ui_test / UiTest2026）。
   ═══════════════════════════════════════════════════════════════════ */
.rect-grp {
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  border-radius: var(--ios-r-card) !important;
  box-shadow: var(--ios-s1) !important;
  margin-bottom: 12px !important;
  overflow: hidden !important;
  transition: box-shadow .28s var(--ios-ease) !important;
}
.rect-grp:hover { box-shadow: var(--ios-s2) !important; }
.rect-grp-h {
  display: flex !important; align-items: baseline !important; gap: 9px !important;
  flex-wrap: wrap !important;
  padding: 13px 15px 10px !important;
  background: var(--ios-bg-3) !important;
  border-bottom: .5px solid var(--ios-line-2) !important;
}
.rg-name {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  font-size: 14.5px !important; font-weight: 720 !important;
  color: var(--ios-ink-1) !important; letter-spacing: -.014em !important;
  min-width: 0;
}
.rg-cnt {
  margin-left: auto !important;
  font-size: 11.5px !important; color: var(--ios-ink-3) !important;
  font-variant-numeric: tabular-nums;
  display: flex !important; align-items: center !important; gap: 5px !important;
  flex-wrap: wrap !important;
}
.rg-cnt b, .rg-cnt .u-warn, .rg-cnt .u-ok, .rg-cnt .u-overdue { font-weight: 700 !important; }
.rg-cnt .u-warn   { color: var(--ios-warn-ink) !important; }
.rg-cnt .u-ok     { color: var(--ios-ok-ink) !important; }
.rg-cnt .u-overdue{ color: var(--ios-danger-ink) !important; }

/* 三方阵容：iOS 胶囊，「我单位」高亮 */
.rg-team {
  display: flex !important; flex-wrap: wrap !important; gap: 6px !important;
  padding: 10px 15px 4px !important;
  background: var(--ios-bg-3) !important;
}
.rg-chip {
  font-family: inherit !important;
  font-size: 10.5px !important; font-weight: 600 !important;
  background: rgba(118,118,128,.11) !important; color: var(--ios-ink-2) !important;
  border-radius: var(--ios-r-pill) !important;
  padding: 3px 9px !important;
  white-space: nowrap;
}
.rg-chip.me {
  background: var(--ios-acc) !important; color: #fff !important;
  font-weight: 700 !important;
  box-shadow: 0 1px 6px rgba(10,132,255,.26) !important;
}
.rect-grp > .rect-list { padding: 10px 12px 12px !important; }

/* 空态：企业台没有通知时的引导 */
#unit-desk .empty,
.rect-list:empty::after {
  font-size: 13px !important; color: var(--ios-ink-3) !important;
  line-height: 1.7 !important;
}
#unit-desk > .empty {
  background: var(--ios-card) !important;
  border: .5px dashed var(--ios-line) !important;
  border-radius: var(--ios-r-card) !important;
  padding: 30px 20px !important; text-align: center;
}

/* ═══════════════════════════════════════════════════════════════════
   二十四、专注模式下的底部 Tab（V2.3.34 修正）
   ─────────────────────────────────────────────────────────────────
   theme-v5.css:2004~2008 的原设计是**有意保留 3 个 Tab**：
     body.hz-care .tabbar { display:flex !important }
     .tabbar button { display:none }，再单独放开 dashboard / projects / inspect
   ⇒ 不是 bug，主链路（首页→工程→检查）仍要能一键跳。
   本节只把这 3 个可见项做成 iOS 形态（图标+标签、触摸目标、激活态），
   并保持「只显示这 3 个」的行为不变。
   ═══════════════════════════════════════════════════════════════════ */
body.hz-care .tabbar {
  background: rgba(248, 248, 250, .92) !important;
  backdrop-filter: saturate(180%) blur(24px);
  -webkit-backdrop-filter: saturate(180%) blur(24px);
  border-top: .5px solid var(--ios-line) !important;
  box-shadow: 0 -1px 20px rgba(0, 0, 0, .05) !important;
}
body.hz-care .tabbar button {
  color: var(--ios-ink-3) !important;
  font-size: 9.5px !important; font-weight: 600 !important;
  background: none !important; border-radius: 10px !important;
  min-height: 50px !important;                     /* HIG 触摸目标 */
  padding: 3px 2px !important;
  transition: color .2s var(--ios-ease-o) !important;
}
body.hz-care .tabbar button .ic {
  width: 22px !important; height: 22px !important;
  margin: 0 auto 2.5px !important; display: block !important;
  font-size: 0 !important; opacity: .58 !important;
  transition: opacity .24s var(--ios-ease-o) !important;
}
body.hz-care .tabbar button .ic::before { content: none !important; }  /* 抹掉旧灰圆点 */
body.hz-care .tabbar button .ic svg { width: 100%; height: 100%; display: block; }
body.hz-care .tabbar button.active,
body.hz-care .tabbar button.on {
  background: none !important; color: var(--ios-acc) !important; font-weight: 650 !important;
  box-shadow: none !important;
}
body.hz-care .tabbar button.active .ic,
body.hz-care .tabbar button.on .ic { opacity: 1 !important; background: none !important; box-shadow: none !important; transform: none !important; }
/* 专注模式的「更多」入口本就不该出现 */
body.hz-care .tabbar .tabbar-more { display: none !important; }

/* ═══════════════════════════════════════════════════════════════════
   二十五、企业整改台空态（V2.3.34 修正）
   ─────────────────────────────────────────────────────────────────
   实测：`#unit-desk` 里的空态 **0px 圆角** —— 上一节写的选择器是
     `#unit-desk > .empty`（直接子级），实测 DOM 里 .empty 被包了两层
     （#unit-desk > div > .empty），选择器没命中。
   ⇒ 改为后代选择器，并同时兜住 .kb-wrap .arena-wrap 那一层。
   ═══════════════════════════════════════════════════════════════════ */
#unit-desk .empty,
.kb-wrap .arena-wrap .empty {
  background: var(--ios-card) !important;
  border: .5px dashed var(--ios-line) !important;
  border-radius: var(--ios-r-card) !important;
  padding: 30px 22px !important;
  text-align: center !important;
  color: var(--ios-ink-3) !important;
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  font-size: 13px !important;
  line-height: 1.75 !important;
  box-shadow: var(--ios-s1) !important;
  margin: 0 !important;
}
/* 有分组时（.rect-grp 存在）不该再有虚线大空态 */
#unit-desk .empty:has(+ .rect-grp) { display: none !important; }

/* ═══════════════════════════════════════════════════════════════════
   二十六、弹窗 / 输入框 / 个人中心卡（V2.3.34 收尾）
   ─────────────────────────────────────────────────────────────────
   覆盖范围：全站通用的模态框与表单控件 + 「我的账号」卡（kb.js:1505+ profile-card）
   ★ 企业整改台实测时弹的「修改登录密码」框也在此列（首次登录强制改密）。
   ⚠ 只改视觉，不动任何提交/校验逻辑与 id（pp-old / pp-new / pp-new2 等一律不动）。
   ═══════════════════════════════════════════════════════════════════ */

/* 模态框：iOS 弹窗（更大圆角、更轻阴影、标题层级） */
.modal-card, .modal, .mc-card, .hz-modal, .login-card {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  border-radius: var(--ios-r-xl) !important;
  box-shadow: var(--ios-s4) !important;
  background: rgba(255, 255, 255, .98) !important;
  backdrop-filter: saturate(180%) blur(24px);
  -webkit-backdrop-filter: saturate(180%) blur(24px);
}
.modal-card h3, .modal h3, .mc-card h3, .mc-t {
  font-size: 16.5px !important; font-weight: 730 !important;
  letter-spacing: -.015em !important; color: var(--ios-ink-1) !important;
}

/* 输入框：iOS filled field */
.modal input[type="text"], .modal input[type="password"], .modal input[type="number"],
.modal input[type="tel"], .modal input[type="search"], .modal textarea, .modal select,
.mc-card input, .hz-modal input,
input[type="text"], input[type="password"], input[type="number"], input[type="tel"], input[type="search"] {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif !important;
  border-radius: 10px !important;
  border: .5px solid var(--ios-line) !important;
  background: var(--ios-bg-3) !important;
  color: var(--ios-ink-1) !important;
  font-size: 13.5px !important;
  min-height: 40px !important;
  padding: 9px 12px !important;
  transition: border-color .2s var(--ios-ease-o), box-shadow .2s var(--ios-ease-o), background .2s var(--ios-ease-o) !important;
}
input:focus, textarea:focus, select:focus {
  outline: none !important;
  background: var(--ios-card) !important;
  border-color: var(--ios-acc) !important;
  box-shadow: 0 0 0 3px var(--ios-acc-veil) !important;
}
input::placeholder, textarea::placeholder { color: var(--ios-ink-4) !important; }

/* 弹窗按钮：iOS 胶囊 */
.modal .btn, .mc-card .btn, .hz-modal .btn, .login-card .btn {
  font-family: inherit !important;
  border-radius: var(--ios-r-ctl) !important;
  min-height: 42px !important;
  font-size: 14px !important; font-weight: 680 !important;
  background: var(--ios-acc) !important; background-image: none !important;
  color: #fff !important;
  box-shadow: 0 2px 10px rgba(10, 132, 255, .26) !important;
  transition: transform .2s var(--ios-ease), box-shadow .2s var(--ios-ease) !important;
}
.modal .btn:hover { transform: translateY(-1px) !important; box-shadow: 0 6px 20px rgba(10,132,255,.34) !important; }
.modal .btn:active { transform: scale(.97) !important; }
.modal .btn.ghost, .mc-card .btn.ghost, .login-card .btn.ghost {
  background: var(--ios-card) !important; color: var(--ios-ink-1) !important;
  border: .5px solid var(--ios-line) !important; box-shadow: var(--ios-s1) !important;
}

/* 「我的账号」页：profile-card / pc-row iOS 化 */
.profile-card {
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  border-radius: var(--ios-r-card) !important;
  box-shadow: var(--ios-s1) !important;
  padding: 16px !important;
  margin-bottom: 12px !important;
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  transition: box-shadow .28s var(--ios-ease) !important;
}
.profile-card:hover { box-shadow: var(--ios-s2) !important; }
.pc-row {
  font-family: inherit !important;
  font-size: 13px !important; color: var(--ios-ink-2) !important;
  padding: 11px 0 !important;
  border-bottom: .5px solid var(--ios-line-2) !important;
  display: flex !important; align-items: center !important; gap: 10px !important;
  min-height: 42px !important;
  transition: background .16s var(--ios-ease-o) !important;
}
.pc-row:last-child { border-bottom: none !important; }
/* 标签型行（如「修改登录密码」）：可点 ⇒ 胶囊化 */
.profile-card .pc-row[onclick] {
  border-radius: 10px !important;
  padding: 11px 12px !important;
  margin: 2px 0;
  cursor: pointer;
}
.profile-card .pc-row[onclick]:hover { background: var(--ios-bg-3) !important; }
.profile-card .pc-row[onclick] b, .profile-card .pc-row[onclick] strong { color: var(--ios-acc) !important; }

/* 遮罩：iOS 深色半透明 */
.mask, .modal-mask, .mc-mask {
  background: rgba(0, 0, 0, .32) !important;
  backdrop-filter: blur(2px) !important;
  -webkit-backdrop-filter: blur(2px) !important;
}

/* ═══════════════════════════════════════════════════════════════════
   二十七、涛哥 2026-10-07 提出的问题修复
   ─────────────────────────────────────────────────────────────────
   1) 知识库首页加「示范样板库」卡片 —— 5 卡布局，首卡横跨 2 列做主卡
   2) 「您的积分」卡美术：去突兀蓝底、「积分」二字加强、段位徽标去蓝底
   3) 协同检查人员状态框（.imb-collab）在迷你条里，位于折叠按钮左侧
   4) 收起详情后检查页高度自适应填满
   ═══════════════════════════════════════════════════════════════════ */

/* ── 1) 知识库 5 卡：主卡横跨 2 列 + 4 张副卡 2×2 ── */
.kb-grid { grid-template-columns: repeat(4, 1fr) !important; }
.kb-card-wide { grid-column: span 2 !important; }
/* 主卡：横向排布（图标在左、文案在右），视觉权重更高 */
.kb-card-wide { display: grid !important; grid-template-columns: auto 1fr !important;
  grid-template-areas: 'ic t' 'ic d' 'ic f' !important; align-content: center !important;
  column-gap: 15px !important; row-gap: 0 !important; padding: 20px !important; }
.kb-card-wide .kb-card-ic { grid-area: ic !important; margin-bottom: 0 !important;
  width: 52px !important; height: 52px !important; border-radius: 14px !important; }
.kb-card-wide .kb-card-ic svg { width: 25px !important; height: 25px !important; }
.kb-card-wide .kb-card-t { grid-area: t !important; font-size: 17.5px !important; margin-bottom: 4px !important; }
.kb-card-wide .kb-card-d { grid-area: d !important; min-height: 0 !important; margin-bottom: 12px !important;
  font-size: 12px !important; max-width: 560px !important; }
.kb-card-wide .kb-card-f { grid-area: f !important; }
/* 第五个色（LLM 卡片换用青色，替代原先的紫/绿/橙/粉混用） */
html:not([data-theme="dark"]) .kb-card-ic.ic-teal { background: rgba(10,132,255,.06) !important; color: var(--ios-acc) !important; }
/* 移动端：全部单列，主卡不跨列 */
@media (max-width: 820px) {
  .kb-grid { grid-template-columns: 1fr !important; }
  .kb-card-wide { grid-column: auto !important; display: block !important; padding: 15px 14px !important; }
  .kb-card-wide .kb-card-ic { width: 40px !important; height: 40px !important; margin-bottom: 12px !important; border-radius: 11px !important; }
  .kb-card-wide .kb-card-ic svg { width: 20px !important; height: 20px !important; }
  .kb-card-wide .kb-card-t { font-size: 15px !important; }
}

/* ── 2) 「您的积分」卡美术修复 ──
   涛哥反馈三点：① 蓝底突兀 ②「积分」二字存在感薄弱 ③ 段位徽标蓝底突兀。
   改法：卡头去掉整条蓝底改为淡灰底；标题里的「积分」二字放大加粗并与数字同色系；
        段位徽标改为「描边胶囊」（透明底 + 蓝边蓝字），不再实心蓝块。 */
.rank-card.rank-me { background: var(--ios-card) !important; border-color: var(--ios-line-2) !important; box-shadow: var(--ios-s1) !important; }
.rank-card.rank-me .rk-h {
  background: var(--ios-bg-3) !important; color: var(--ios-ink-1) !important;
  border-bottom: .5px solid var(--ios-line-2) !important;
}
.rk-me-lbl {
  /* 「积分」二字：放大 + 加粗 + 深色，存在感拉起来 */
  font-size: 15px !important;
  font-weight: 750 !important;
  color: var(--ios-ink-1) !important;
  letter-spacing: -.01em !important;
  line-height: 1.1 !important;
}
.rk-me-pts { color: var(--ios-ink-1) !important; }
.rk-me-tier {
  /* ★ v2.3.36 修正：涛哥反馈「描边胶囊仍有一圈蓝色圆角框线」⇒ 直接去掉边框，
     只留淡灰底 + 深色字（段位本身是次要信息，不该抢眼）。 */
  background: var(--ios-bg-4) !important;
  color: var(--ios-ink-2) !important;
  border: none !important;
  font-size: 11px !important;
  font-weight: 700 !important;
  padding: 3px 10px !important;
  box-shadow: none !important;
}

/* ── 3) 协同检查人员状态框：原块搬到迷你条 ──
   ★ 涛哥第二次反馈：要的是**搬运**原来挂在工程信息卡下方那块（app-core.js colabRenderBar
     往 #colab-bar 写内容），不是另做一个。我第一版自造的 .imb-collab 已删除。
   现在 #colab-bar 就在迷你条里、imb-fold 左侧，沿用它原本的绿色样式只做尺寸收敛。
   ★★ v2.3.36 根因（实测坐实，勿再踩）：本项目「协同」一词**两处拼写并存**——
      app-core.js 内部函数/变量与 DOM id 一律是 colab（单 l，如 colabRenderBar/getElementById('colab-bar')）；
      而 window 导出名写成 collabRenderBar（双 l）。
      搬运时若照着「能看到的那半边」写，容器 id 就会写成 collab-bar，
      ⇒ JS 永远找不到它。下面所有选择器一律用 #colab-bar（单 l）。 */
.insp-mini-bar { display: flex !important; align-items: center !important; gap: 8px !important; }
#colab-bar.insp-collab {
  /* ★ v2.3.36 修正：这里原来写 display:none，结果把 colabRenderBar 设的 display:flex
     压掉了（行内样式与样式表同特异性时，样式表这条赢了）⇒ 状态栏永远不显示。
     现在改为「不设 display」，显隐完全交给 JS（colabRenderBar 控制 inline style）。 */
  align-items: center !important; gap: 8px !important;
  margin-left: auto !important;   /* 推到右侧，紧邻折叠按钮 */
  background: rgba(48, 200, 140, .10) !important;
  border: .5px solid rgba(48, 200, 140, .28) !important;
  border-radius: var(--ios-r-pill) !important;
  padding: 4px 12px !important;
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif !important;
  font-size: 11.5px !important;
  color: #0f766e !important;
  max-width: 46vw; overflow: hidden;
  white-space: nowrap; text-overflow: ellipsis;
}
/* 里面的文字与退出按钮收敛 */
#colab-bar.insp-collab > span {
  font-size: 11.5px !important; line-height: 1.5 !important;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
#colab-bar.insp-collab > span:first-child {   /* 在线/离线状态点 */
  width: 7px !important; height: 7px !important; margin-top: 0 !important;
  flex: 0 0 auto !important;
}
#colab-bar.insp-collab button {   /* 「退出协同」 */
  border: .5px solid var(--ios-line) !important;
  background: var(--ios-card) !important;
  color: var(--ios-ink-2) !important;
  border-radius: var(--ios-r-pill) !important;
  padding: 3px 10px !important; font-size: 11px !important; font-weight: 620 !important;
  flex: none !important; cursor: pointer;
  transition: background .18s var(--ios-ease-o) !important;
}
#colab-bar.insp-collab button:hover { background: var(--ios-bg-3) !important; }

/* ── 4) 收起详情后高度自适应 + ★ 中栏必须能滚到底 ──
   ★ v2.3.36 二次修正（涛哥实测：能滑动但滑不到最底部）：
     实测数据（视口 900px）：
       .insp3   y=330 h=932 bottom=1261  ← 容器底部在视口外 361px
       .insp-mid h=932（被内容撑开）但 max-height 写的是 690px（未生效，因为父级更高）
       .insp-mid scrollHeight=8405 clientHeight=690 ⇒ 中栏内可滚 7715px
     症状：容器整体被推到视口下方 ⇒ 中栏「能滚」，但滚到底也看不到底。
   根因：我给 .insp3 设了 min-height（600/900-300），内容多时它被撑到 932px，
         而 .insp-mid 的 max-height 是「相对视口」算的，不是「相对剩余空间」——
         两个值对不上，父容器比视口高，中栏底部就永远在屏幕外。
   ⇒ 正确做法：**用 flex 链把「视口剩余高度」一路传下去**，不再用 calc(100vh - 常数)：
        #view（展开态）→ flex column，height = 视口 - 顶栏
        .insp-mini-bar / .insp-top → flex: none（按内容高）
        .insp3 → flex: 1 1 auto; min-height: 0   ← 关键：让它吃掉剩余空间
        .insp-mid → height: 100%; overflow-y: auto
     这样无论上栏展开还是收起，中栏都恰好占满剩余高度、内容在其内部滚到底。 */

/* 让 #view 在检查页成为「占满剩余视口高度的 flex 列」 */
#view.insp-wide {
  display: flex !important;
  flex-direction: column !important;
  height: calc(100vh - 116px) !important;   /* 116 = 顶栏实际高度 */
  /* ★★ v2.3.43【根因修复】必须补 min-height:0 —— 手机端「重大事故隐患 /
     隐患库隐患」展开后滑不动，就是这一行的缺失造成的。
     实测（390×844，线上 v2.3.42）：
       折叠态  #view h=434    .insp-mid h=254  can=0
       展开重大 #view h=1006   .insp-mid h=826  can=0  ← 容器被撑破
       全展开   #view h=22902  .insp-mid h=22722 can=0
     根因：#view 是 .app-main（flex 容器）的 flex 子项，flex item 的
           **min-height 默认 auto ⇒ 不能小于内容高度**，
           于是 `height:calc(100vh-96px)` 被内容顶穿（433→1006→22902），
           而 #view 自身 overflow:hidden ⇒ 超出视口的部分**既被裁剪又滚不动**。
     这条链（#view → .insp3 → .insp-mid）前两级上一轮已加 min-height:0，
     唯独 #view 自己漏了 —— 补上后 flex 链才真正闭合：
       #view 固定剩余高度 → .insp3 flex:1 吃掉 → .insp-mid 内容在其内部滚动到底。 */
  min-height: 0 !important;
  overflow: hidden !important;               /* 滚动交给中栏 */
  padding-bottom: 0 !important;
}

/* ★★ v2.3.43【补第二层根因】只给 #view 加 min-height:0 还不够 ——
   实测（390×844，v2.3.43 第一版）：折叠态 #view h=406（正常），
   展开「重大事故隐患」后 **#view h=979**、全展开 **h=22875**，仍然被撑破。
   原因：**整条祖先链都没有限高** ——
     .app-shell / .app-main 在手机端是 min-height:auto（styles.css:44-46），
     只有 shell-fit.css 在**桌面端**（min-width:821px）才给它们 height:100%。
   容器 height:auto 时，flex item 的 hypothetical size 会按 **max-content
   contribution** 参与计算 ⇒ 后代再写 min-height:0 / flex:1 1 0% 都拦不住撑破。
   ⇒ 必须把「视口高度」从外壳这一层灌进去（与 shell-fit.css 桌面端同一思路）。
   ⚠ 只在检查页（body.insp-open）且手机端生效，避免影响其它页面。
   ⚠ tabbar 仍在 .app-shell 的 flex 流里占位 ⇒ .app-main 用 flex:1 + min-height:0
     吃掉「视口 - tabbar」的空间，不能用 height:100%（那会把 tabbar 挤出屏幕）。 */
@media (max-width: 820px) {
  body.insp-open .app-shell{
    height: 100vh !important;
    /* ★★ v2.3.44：不能再写 100dvh 满屏 —— 下栏是 position:fixed，不占文档流，
       满屏外壳会让中栏底边顶到视口底（实测 244→844），而下栏占 772→834
       ⇒ 末尾 72px 内容被压在下栏底下，永远滑不出来。
       改成「视口 − 下栏占位」，结构上就不可能再被遮挡。
       变量 --hz-tabbar-h 见本文件末尾「三十三」节（唯一真源，随开关显隐过渡）。 */
    height: calc(100dvh - var(--hz-tabbar-h)) !important;
    min-height: 0 !important;
    overflow: hidden !important;
    /* 高度变化跟着下栏显隐一起过渡 ⇒ 下栏收起时中栏平滑变高（"页面上抬"） */
    transition: height .28s cubic-bezier(.22,1,.36,1);
  }
  body.insp-open .app-main{
    flex: 1 1 auto !important;
    min-height: 0 !important;
    overflow: hidden !important;
  }
  /* ★ v2.3.44：body 那 86px 底部内边距是给下栏留的旧占位；
     检查页的占位已经算进 .app-shell 高度里了，再留一层会造成
     86px「幽灵滚动」（实测 document.scrollHeight=930 vs innerHeight=844）
     —— 整体能被拖走 86px，顶栏被推走、手感像页面坏了。 */
  body.insp-open{ padding-bottom: 0 !important; }

  /* ★★ 上面「外壳限高」带来的**副作用**，必须一并修正：
     theme-ios.css 里 `.insp3 > .insp-left{height:100%}` / `.insp-mid{height:100%}`
     过去一直是**无效**的（.insp3 是 height:auto ⇒ 100% 解析不成确定高度，
     左栏按内容渲染成 52px 的横向方向条、中栏按 flex 分配）。
     外壳限高后 .insp3 有了确定高度 662px ⇒ 这两条 height:100% **第一次真正生效**：
       实测 .insp-left h=662（吃掉全部） / .insp-mid h=26（被挤到 y=854，视口外）
     ⇒ 手机端必须按「左栏内容高 + 中栏吃掉剩余」重排：
        左栏 = height:auto（横向方向条）；中栏 = height:auto + flex:1（剩余空间）。
     ⚠ 用 body.insp-open 前缀提特异性，压过上面的 `.insp3 > .insp-left`(0,2,0)。 */
  body.insp-open .insp3 > .insp-left{
    height: auto !important;
    max-height: none !important;
    flex: none !important;
    overflow-x: auto !important;
    overflow-y: hidden !important;
  }
  body.insp-open .insp3 > .insp-mid{
    height: auto !important;      /* ★ 不能用 100%：会溢出 .insp3 把底边顶出视口 */
    flex: 1 1 auto !important;
    min-height: 0 !important;
    overflow-y: auto !important;
    -webkit-overflow-scrolling: touch !important;
    overscroll-behavior: contain !important;
  }
  body.insp-open .insp3 > .insp-right{
    height: auto !important;
    flex: none !important;
  }
}
#view.insp-wide > .insp-mini-bar,
#view.insp-wide > .insp-top { flex: none !important; }

/* 三栏容器吃掉全部剩余空间 */
.insp3 {
  flex: 1 1 auto !important;
  min-height: 0 !important;
  height: auto !important;
  overflow: hidden !important;
}

/* ★ 中栏：占满 .insp3 的高度，内容在内部滚动（不再用视口 calc） */
.insp3 > .insp-mid {
  flex: 1 1 auto !important;
  min-height: 0 !important;
  max-height: none !important;   /* ★ 关键：解除上一轮写死的 max-height */
  height: 100% !important;
  overflow-y: auto !important;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
}
/* 左右栏同理：不参与滚动 */
.insp3 > .insp-left, .insp3 > .insp-right {
  max-height: none !important;
  height: 100% !important;
  overflow-y: auto !important;
}

/* 移动端：去掉上栏占位后中栏更高 */
@media (max-width: 820px) {
  #view.insp-wide { height: calc(100vh - 96px) !important; }
}
/* ═══════════════════════════════════════════════════════════════════
   二十八、补齐涛哥点名的 5 处未改造区域
   ─────────────────────────────────────────────────────────────────
   ① 文书查看与下载（docs）  ② 站内信弹窗（mailbox）
   ③ 检查记录弹窗（rec-drawer）  ④ AI 记录隐患（openGenModal）
   ⑤ 全局左栏左上角 logo（.side-logo .logo-badge）
   ═══════════════════════════════════════════════════════════════════ */

/* ── ① 文书查看与下载 ── */
.docs-wrap, .doc-list-wrap { font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif; }
.doc-card, .docfile-card, .docs-item {
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  border-radius: var(--ios-r-card) !important;
  box-shadow: var(--ios-s1) !important;
  padding: 14px 16px !important;
  margin-bottom: 9px !important;
  transition: transform .26s var(--ios-ease), box-shadow .26s var(--ios-ease) !important;
}
.doc-card:hover, .docfile-card:hover, .docs-item:hover { transform: translateY(-2px) !important; box-shadow: var(--ios-s2) !important; }
.doc-card .dc-t, .docfile-card .dc-t, .docs-item .dc-t { font-size: 14px !important; font-weight: 680 !important; color: var(--ios-ink-1) !important; }
.doc-card .dc-m, .docfile-card .dc-m, .docs-item .dc-m { font-size: 11.5px !important; color: var(--ios-ink-3) !important; }
.doc-actions button, .docfile-card button {
  font-family: inherit !important;
  border-radius: var(--ios-r-ctl) !important;
  border: .5px solid var(--ios-line) !important;
  background: var(--ios-card) !important;
  color: var(--ios-acc) !important;
  font-size: 12.5px !important; font-weight: 620 !important;
  padding: 7px 14px !important; min-height: 36px !important;
  transition: transform .18s var(--ios-ease) !important;
}
.doc-actions button:hover { background: var(--ios-bg-3) !important; }
.doc-actions button:active { transform: scale(.97) !important; }

/* ── ② 站内信弹窗 ── */
.mail-tabs { display: flex !important; gap: 3px !important; }
.mail-tabs .mtab {
  font-family: inherit !important;
  font-size: 12.5px !important; font-weight: 620 !important;
  background: rgba(118, 118, 128, .10) !important;
  color: var(--ios-ink-2) !important;
  border: none !important; border-radius: var(--ios-r-pill) !important;
  padding: 6px 14px !important; min-height: 34px !important; cursor: pointer;
  transition: background .2s var(--ios-ease-o), color .2s var(--ios-ease-o) !important;
}
.mail-tabs .mtab.active {
  background: var(--ios-acc) !important; color: #fff !important; font-weight: 700 !important;
  box-shadow: 0 1px 6px rgba(10, 132, 255, .26) !important;
}
.mail-row, .mail-item {
  display: flex !important; align-items: flex-start !important; gap: 11px !important;
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  border-radius: var(--ios-r-ctl) !important;
  padding: 12px 14px !important; margin-bottom: 7px !important;
  transition: background .18s var(--ios-ease-o) !important;
}
.mail-row:hover, .mail-item:hover { background: var(--ios-bg-3) !important; }
.mail-row.unread, .mail-item.unread { border-left: 3px solid var(--ios-acc) !important; }
/* ★ v2.3.36 修正：这里原来写了 display:inline-flex !important，
   把 HTML 上的内联 style="display:none" 覆盖掉了 —— 于是「站内信」即使 0 条未读，
   也会显示一个红字「0」。涛哥反馈的就是这个。
   ⇒ 去掉强制 display，改用 :not([style*="none"]) 之外的方案：
      保留 HTML 的内联 display 控制（由 mail.js renderBadges 切 flex/none），
      这里只做配色/尺寸，不碰 display。 */
.side-mail-badge, .h-mail-badge {
  background: var(--ios-danger) !important; color: #fff !important;
  font-size: 9.5px !important; font-weight: 750 !important;
  border-radius: var(--ios-r-pill) !important; min-width: 17px !important;
  align-items: center !important; justify-content: center !important;
  padding: 1px 5px !important;
}

/* ── ③ 检查记录弹窗 ── */
#rec-drawer, .rec-drawer {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  background: rgba(252, 252, 254, .98) !important;
  backdrop-filter: saturate(180%) blur(26px) !important;
  -webkit-backdrop-filter: saturate(180%) blur(26px) !important;
  border-radius: var(--ios-r-xl) 0 0 var(--ios-r-xl) !important;
  box-shadow: var(--ios-s4) !important;
}
#rec-drawer .d-head, .rec-drawer .d-head {
  background: rgba(250, 250, 252, .9) !important;
  border-bottom: .5px solid var(--ios-line) !important;
  padding: 13px 18px !important;
  position: sticky !important; top: 0 !important; z-index: 3 !important;
}
#rec-drawer .d-head h3 { font-size: 15px !important; font-weight: 720 !important; color: var(--ios-ink-1) !important; }
#rec-drawer .d-head button, .rec-drawer .d-head button {
  background: var(--ios-bg-4) !important; border: none !important;
  border-radius: var(--ios-r-pill) !important;
  color: var(--ios-ink-2) !important; font-size: 12.5px !important; font-weight: 620 !important;
  padding: 6px 14px !important; min-height: 32px !important; cursor: pointer;
  transition: background .18s var(--ios-ease-o) !important;
}
#rec-drawer .d-head button:hover { background: rgba(118, 118, 128, .16) !important; }
#rec-drawer .rec-item, .rec-drawer .rec-item {
  background: var(--ios-card) !important;
  border: .5px solid var(--ios-line-2) !important;
  border-radius: var(--ios-r-card) !important;
  padding: 12px 14px !important; margin-bottom: 8px !important;
  font-size: 12.5px !important; color: var(--ios-ink-2) !important;
  transition: transform .24s var(--ios-ease), box-shadow .24s var(--ios-ease) !important;
}
#rec-drawer .rec-item:hover, .rec-drawer .rec-item:hover { transform: translateY(-1px) !important; box-shadow: var(--ios-s1) !important; }

/* ── ④ AI 记录隐患弹窗 ── */
#rec-overlay, .rec-overlay {
  background: rgba(0, 0, 0, .32) !important;
  backdrop-filter: blur(3px) !important;
  -webkit-backdrop-filter: blur(3px) !important;
}
.gen-modal, .ai-rec-modal {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", sans-serif;
  background: rgba(255, 255, 255, .99) !important;
  backdrop-filter: saturate(180%) blur(26px) !important;
  -webkit-backdrop-filter: saturate(180%) blur(26px) !important;
  border-radius: var(--ios-r-xl) !important;
  box-shadow: var(--ios-s4) !important;
  max-width: 640px !important;
}
.gen-modal h3, .ai-rec-modal h3 { font-size: 16.5px !important; font-weight: 730 !important; color: var(--ios-ink-1) !important; }
/* AI 记录隐患的分类选择项 */
.gen-cat, .ai-rec-cat {
  border: .5px solid var(--ios-line) !important;
  border-radius: var(--ios-r-ctl) !important;
  background: var(--ios-card) !important;
  padding: 11px 13px !important; min-height: 44px !important;
  font-size: 13px !important; color: var(--ios-ink-1) !important;
  transition: border-color .2s var(--ios-ease-o), background .2s var(--ios-ease-o) !important;
}
.gen-cat:hover, .ai-rec-cat:hover { background: var(--ios-bg-3) !important; }
.gen-cat.on, .ai-rec-cat.on, .gen-cat.active, .ai-rec-cat.active {
  border-color: var(--ios-acc) !important;
  background: var(--ios-acc-veil) !important;
  box-shadow: 0 0 0 3px var(--ios-acc-veil) !important;
}
/* AI 悬浮按钮（记录隐患入口）*/
.insp-ai-btn, .fab-rec {
  background: var(--ios-acc) !important; background-image: none !important;
  border-radius: var(--ios-r-pill) !important;
  box-shadow: 0 2px 10px rgba(10, 132, 255, .28) !important;
  transition: transform .2s var(--ios-ease), box-shadow .2s var(--ios-ease) !important;
}
.insp-ai-btn:hover { transform: translateY(-1px) !important; box-shadow: 0 6px 20px rgba(10,132,255,.34) !important; }
.imm-ic {
  background: rgba(255, 255, 255, .22) !important;
  border-radius: 5px !important;
  font-size: 10px !important; font-weight: 800 !important;
  padding: 1px 5px !important;
}

/* ── ⑤ 全局左栏左上角 logo ──
   ★ theme-v3.css:75 的原始实现是「蓝青渐变底 + ::after 内联 SVG 盾牌对勾」。
     那个盾牌（.logo-badge::after）是**关键视觉资产，不能覆盖**，
     所以本节只把底色渐变收敛为纯 Apple 蓝，::after 原样保留。
   ★★ 但这里踩了个优先级坑：theme-v5.css 里有一条
      `html:not([data-theme="dark"]) .logo-badge { background: linear-gradient(...) }`，
      特异性 (0,2,1) **高于**我写的 `.logo-badge`（0,1,0），
      即便加了 !important 也会被它压掉（实测 bg 仍是渐变、backgroundColor 为透明）。
      ⇒ 选择器必须带上同样的 `html:not([data-theme="dark"])` 前缀才能压过它。 */
html:not([data-theme="dark"]) .side-logo .logo-badge {
  background: var(--ios-acc) !important;
  background-image: none !important;
  border-radius: 10px !important;
  width: 38px !important; height: 38px !important;
  box-shadow: 0 2px 10px rgba(10, 132, 255, .30) !important;
  position: relative !important;
  overflow: hidden !important;
  transition: transform .24s var(--ios-ease), box-shadow .24s var(--ios-ease) !important;
}
.side-logo { align-items: center !important; }
.side-logo:hover .logo-badge { transform: scale(1.05) !important; box-shadow: 0 4px 14px rgba(10,132,255,.38) !important; }
.logo-tx {
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Display", "PingFang SC", sans-serif !important;
  font-size: 15.5px !important; font-weight: 770 !important;
  color: var(--ios-ink-1) !important; letter-spacing: -.012em !important;
}
.logo-tx small {
  font-size: 10.5px !important; color: var(--ios-ink-3) !important;
  font-weight: 500 !important; display: block !important; margin-top: 1px !important;
}
.logo-ver {
  font-size: 9.5px !important; font-weight: 700 !important;
  background: var(--ios-acc-veil) !important; color: var(--ios-acc-deep) !important;
  border-radius: var(--ios-r-pill) !important; padding: 1px 6px !important;
  margin-left: 5px !important; vertical-align: middle !important;
  font-variant-numeric: tabular-nums;
}

/* ═══════════════════════════════════════════════════════════════════
   第二十九节 · v2.3.38 三项修复
   ① 示范样板库加载骨架（spinner）—— 修「点击后停留原页面、毫无反应」
   ② 工作台「知识库」卡双图标重合 + 悬停不明图标
   ③ 「您的积分」卡灰底 → 白/透明
   ═══════════════════════════════════════════════════════════════════ */

/* ── 1) 示范样板库加载骨架 ──
   ★ 根因：app-samplelib.js 的占位判据写成 `!v.innerHTML`，
     而 route() 切页时 #view 仍留着上一页内容 ⇒ 条件恒 false ⇒ 占位永不显示。
   实测：点击后 0→4.6s 视图完全不变、第 5.1s 才瞬间出现 286KB DOM。
   现在改为「本页加载中就无条件画骨架」，旧内容被替换掉。 */
.sl-loading {
  display: flex !important; flex-direction: column !important;
  align-items: center !important; justify-content: center !important;
  min-height: 62vh !important; gap: 0 !important;
  padding: 40px 20px !important;
}
.sl-spinner {
  width: 34px !important; height: 34px !important;
  border-radius: 50% !important;
  border: 2.5px solid var(--ios-line-2) !important;
  border-top-color: var(--ios-acc) !important;
  animation: slSpin .82s linear infinite !important;
  margin-bottom: 16px !important;
}
@keyframes slSpin { to { transform: rotate(360deg); } }
/* 无障碍：尊重系统的「减少动态效果」设置 */
@media (prefers-reduced-motion: reduce) {
  .sl-spinner { animation-duration: 2.4s !important; }
}
.sl-loading-t {
  font-size: 14.5px !important; font-weight: 680 !important;
  color: var(--ios-ink-1) !important; letter-spacing: -.01em !important;
}
.sl-loading-s {
  margin-top: 6px !important;
  font-size: 12px !important; color: var(--ios-ink-3) !important;
  text-align: center !important; max-width: 340px !important; line-height: 1.6 !important;
}

/* ── 2) 工作台「知识库」卡：去掉重合的第二层图标 ──
   ★ 根因：theme-v3.css 当年用 `::before` 伪元素**画**图标（act-new 画加号、act-kb 画书本），
     那个年代 .da-ico 里没有真实 SVG；如今 app-rectify.js 已改为**真内联 SVG**，
     而 theme-ios.css 又把 .da-ico 显示出来 ⇒ **两层图标叠在一起**。
       · act-new：CSS 加号与 SVG 加号完全重合 ⇒ 看不出来
       · act-kb ：CSS 书本与 SVG 书本错位 ⇒ 「两个图标重合」（涛哥报障）
   ⇒ 伪元素整体清掉，只保留真 SVG（1.7px stroke 线性图标，符合项目约定）。 */
.dash-act .da-ico::before,
.dash-act.act-new .da-ico::before,
.dash-act.act-hazards .da-ico::before,
.dash-act.act-kb .da-ico::before {
  content: none !important;
  display: none !important;
}
/* 悬停时右下角那个「不明图标」= .dash-act::after（theme-v3.css:303，平时 opacity:0，
   悬停 opacity:1 画一个蓝色箭头）。iOS 大卡不该在角落冒箭头 ⇒ 一并去掉。 */
.dash-act::after { content: none !important; display: none !important; }

/* ── 3) 「您的积分」卡：去掉灰色底 ──
   ★ 涛哥反馈：「您的积分」文字与段位图标都有灰色底色块，要求改成透明或白色。
     卡头 .rk-h   = var(--ios-bg-3) #FAFAFC（灰）
     段位 .rk-me-tier = var(--ios-bg-4) #F5F5F7（更深的灰）
   而卡片本体 .rank-card.rank-me = var(--ios-card) #FFFFFF（白），
   ⇒ 改成与卡片同白，灰块即消失（视觉上「透明」）。 */
.rank-card.rank-me .rk-h {
  background: var(--ios-card) !important;
  color: var(--ios-ink-1) !important;
}
.rk-me-tier {
  background: var(--ios-card) !important;
  color: var(--ios-ink-2) !important;
}
/* 段位徽章原来靠灰底与卡体分隔，去掉底色后补一条极淡描边保住层级 */
.rk-me-tier {
  box-shadow: inset 0 0 0 .5px var(--ios-line-2) !important;
}

/* ═══════════════════════════════════════════════════════════════════
   第三十节 · v2.3.39 移动端工作台布局（涛哥真机实测反馈）
   ─────────────────────────────────────────────────────────────────
   反馈三条：
     ① 「开始检查」「知识库」两个按钮缩在左侧，只占半屏宽；
        要求**参照上方「知识库检索」卡片那样横向充满手机屏幕**。
     ② 「隐患闭环看板」「文书验真」两卡太大，各占整行；要求**缩小后左右并列**，
        目的是节省工作台纵向空间。
     ③ 下栏「更多」按钮点击无反应 —— 那是 JS 侧 bug（app-inspect.js 用
        `.tabbar button` + `b.onclick=` 赋值覆盖掉了内联的 openTabMore），
        本节只管布局，JS 修法见 app-inspect.js v2.3.39 注释。

   改造前实测（390px 视口，来自 _diag_mobile.cjs）：
     .dash-grid3 列定义 = 172.5px 172.5px
       开始检查  w=173  知识库  w=173      ← 只占一半，缩在左
     .dash-duo   列定义 = 1fr（单列）
       隐患闭环看板 w=354  文书验真 w=354    ← 各占整行，纵向浪费
   改造后目标：
       开始检查  w=354  知识库  w=354      ← 各占满整行
       隐患闭环看板 / 文书验真 各 w≈171 并排
   ═══════════════════════════════════════════════════════════════════ */
@media (max-width: 820px) {
  /* ── ① 两个入口卡各占满整行（对齐「知识库检索」卡的 354px 宽） ── */
  /* ★ 必须先重置 order：PC 端为了让「三卡一行 + duo 独占一行」给元素设了负 order
     （实测 act-new=-3、dash-duo=-2）。那是为多列布局设计的，
     单列布局下会把 dash-duo 硬顶到两个入口卡**中间**（实测 y 顺序变成
     开始检查 → 看板/验真 → 知识库 → 积分），观感错乱。
     这里统一归零，再按「入口卡 → 看板/验真 → 积分」的期望顺序显式排。 */
  .dash-grid3 > * { order: 0 !important; }
  .dash-grid3 > .dash-duo { order: 1 !important; }
  .dash-grid3 > .rank-card.rank-me { order: 2 !important; }
  .dash-grid3 {
    grid-template-columns: 1fr !important;
    gap: 9px !important;
  }
  .dash-grid3 > .rank-card.rank-me { grid-column: 1 / -1 !important; }
  .dash-grid3 > *:not(.dash-duo) { min-height: 62px !important; }
  /* 占满整行后改为「图标在左 + 文字在右」的横向排布，并压低高度，
     避免两个整行卡把工作台往下撑太多 */
  .dash-grid3 > .dash-act.act-new,
  .dash-grid3 > .dash-act.act-kb {
    justify-content: flex-start !important;
    text-align: left !important;
    padding: 11px 14px !important;
  }
  .dash-grid3 > .dash-act .da-ico { width: 40px !important; height: 40px !important; }
  .dash-grid3 > .dash-act .da-ico svg { width: 20px !important; height: 20px !important; }
  .dash-grid3 > .dash-act .da-t { font-size: 15.5px !important; }
  .dash-grid3 > .dash-act .da-sub { font-size: 11.5px !important; }

  /* ── ② 看板 / 验真：缩小高度 + 左右并列 ── */
  .dash-duo,
  .dash-duo.solo {
    grid-template-columns: repeat(2, 1fr) !important;
    gap: 8px !important;
  }
  .dash-duo .board-entry {
    min-height: 40px !important;
    font-size: 12.5px !important;
    font-weight: 640 !important;
    padding: 0 8px !important;
    justify-content: center !important;
    /* ★ 关键：禁止换行。
       两列并排后宽度只有 ~171px，旧的 14px 字号会把「隐患闭环看板」压成竖排一列
       （第十三节注释① 记录过这个坑），这里锁死单行 + 省略号兜底。 */
    white-space: nowrap !important;
    overflow: hidden !important;
    text-overflow: ellipsis !important;
    display: inline-flex !important;
    align-items: center !important;
  }
  .dash-duo .board-entry svg { width: 14px !important; height: 14px !important; flex: 0 0 auto !important; }
  .dash-duo .board-entry span { white-space: nowrap !important; overflow: hidden !important; text-overflow: ellipsis !important; }
}

/* ═══════════════════════════════════════════════════════════════════
   第三十一节 · v2.3.41「更多」抽屉遮挡与滚动（涛哥真机截图反馈）
   ─────────────────────────────────────────────────────────────────
   现象：手机上点「更多」能弹出全部功能，但
     ① 抽屉无法正常滑动浏览；
     ② 末项「现场检查辅助」被底部 tabbar 压住、点不到。

   根因：层级写反了。
     .tabbar          z-index: 40   ← 更高
     .ios-more-sheet  z-index: 39   ← 更低
   ⇒ 下栏**浮在抽屉之上**，抽屉底部内容被盖住，看起来像"滑不动"。

   修法（两条一起上）：
     ① 抽屉打开期间把 tabbar 隐藏（iOS 模态惯例：模态期间不露出底层导航）
        并把 mask/sheet 的层级提到 hzModalShell 同档（100001）做双保险；
     ② 给 sheet 补 -webkit-overflow-scrolling / overscroll-behavior，
        让 Android WebView（APK 就是它）真正支持惯性滚动。
   ═══════════════════════════════════════════════════════════════════ */
@media (max-width: 820px) {
  .ios-more-mask,
  .ios-more-sheet { z-index: 100001 !important; }
  /* 抽屉打开时隐藏下栏：模态期间不露出底层导航（同时解决遮挡） */
  body.ios-sheet-open .tabbar { display: none !important; }
  /* 抽屉自身的滚动能力（Android WebView 惯性滚动） */
  .ios-more-sheet {
    -webkit-overflow-scrolling: touch !important;
    overscroll-behavior: contain !important;
    touch-action: pan-y !important;
  }
}

/* ══════════════════════════════════════════════════════════════════════════
   三十二、v2.3.43 手机端「检查任务详情」上栏精简 + 重排（涛哥要求）
   ──────────────────────────────────────────────────────────────────────────
   背景（实测 390×844，v2.3.42 线上）：展开详情后上栏可见 4 个按钮
     检查记录(1) / AI记录隐患 / 本次检查范围 / 关联规范
   其中三个与**右下角 insp-fab 常驻悬浮组**完全重复：
     检查记录  ↔ FAB「检查记录」（带计数徽标）
     AI记录隐患 ↔ FAB「AI 记隐患」
     关联规范  ↔ FAB「查看依据」（打开的正是「关联规范与核查要点」抽屉）
   顶部迷你条（.insp-mini-bar）已有「返回」⇒ 上栏的「返回工程」同样重复。

   ⇒ 手机端只保留：**工程信息卡片 + 本次检查范围（+ j59 检查结论）**

   ⚠ 只在 ≤820px 生效，绝不能全局删按钮：
     PC 端**没有 insp-fab**（styles.css:356 默认 display:none，放行规则
     body.insp-open.insp-fab-on 本身也在手机端媒体查询内）⇒ 全局删会让
     PC 端彻底失去「检查记录 / 关联规范 / 返回工程」入口。
   ⚠ 计数徽标不受影响：app-core.js refreshRecBadge 查的是**所有 .fab-rec**，
     FAB 内那颗仍在（走 .fab-badge 徽标分支），数字照常联动。
   ⚠ 「检查结论」(j59-concl-btn) 保留：FAB 里没有它的对应入口，删了就进不去。
   适用：三个检查专项（日常抽查 / 安管人员履职 / 日常安全清单 j59）共用同一套
        .insp-top DOM（app-rectify.js inspTopHTML），本块一次覆盖全部。
   ══════════════════════════════════════════════════════════════════════════ */
@media (max-width: 820px) {
  /* ① 上栏改纵向单列：卡片通栏在上，按钮组在下 */
  .insp-top{
    display:flex !important;
    flex-direction:column !important;
    gap:10px !important;
  }
  .insp-top-left{
    display:block !important;
    width:100% !important;
    flex:none !important;
  }
  /* ② 隐藏与迷你条重复的「返回工程」 */
  .insp-top .insp-back{ display:none !important; }
  /* ③ 隐藏与 FAB 重复的三个按钮（PC 端保留） */
  .insp-top-right .fab-rec,
  .insp-top-right .insp-ai-btn,
  .insp-top-right .insp-right-btn{ display:none !important; }
  /* ④ 按钮组改 flex 自适应：1 个按钮通栏、2 个各占一半
     （flex-grow:1 ⇒ 只剩一个时自动铺满整行，无需为 j59 单独写分支） */
  .insp-top .insp-top-right{
    display:flex !important;
    flex-wrap:wrap !important;
    gap:8px !important;
    width:100% !important;
    grid-template-columns:none !important;   /* 压掉 theme-v5 的 repeat(6,1fr) */
  }
  .insp-top-right > *{
    flex:1 1 calc(50% - 4px) !important;
    min-width:0 !important;
    min-height:var(--hz-tap,44px) !important;
    margin:0 !important;
    display:inline-flex !important;
    align-items:center; justify-content:center; gap:6px;
    padding:0 10px !important;
    font-size:12.5px !important; font-weight:700 !important;
    border-radius:var(--hz-r-md,10px) !important;
    white-space:nowrap !important;
    box-shadow:none !important;
  }
  /* ⑤ 美术：本次检查范围 = 主行动渐变；检查结论 = 描边次行动
     ★★ v2.3.43 修正（截图实测抓到的坑）：
        第一版写的是 `background:var(--hz-brand-grad, linear-gradient(...))`，
        实测 computed 为 **backgroundImage:none / backgroundColor:#fff**，
        而同一规则里的 `color:#fff` 却生效了
        ⇒ **白字 + 白底 = 按钮整个看不见**（手机端表现为一个「空胶囊」）。
        原因：var() 在本场景解析不出有效渐变值 ⇒ background 简写整条失效
        （注意 var() 的语义：变量缺失才用 fallback；变量存在但值无效时
         属性会「invalid at computed-value time」而**整条丢弃，不回退 fallback**）。
        ⇒ 改为**不依赖任何 CSS 变量**，background-image + background-color 双写兜底；
          并把 border 显式设为透明（不再依赖 `border:none` 与其它规则的先后）。
      ⚠ 教训：改完外观**必须看截图**——「元素可见」不等于「内容可见」，
        本轮的自动化断言只校验了 display/尺寸，漏掉了「白字白底」。 */
  /* ★★ 特异性必须 ≥ 5 个类（第二版踩的坑）：
     theme-v5.css:34 有 `.insp-top-right .btn.sm.ghost{background:#fff !important;}`
     —— **4 个类 + !important**，而这两个按钮的 class 正好是 `btn sm ghost xxx-btn`，
     所以我上一版 2 个类的选择器 (0,2,0) 被它压掉 ⇒ background 仍是白，
     而我的 `color:#fff !important`（那条对方没写 !important）却生效
     ⇒ **依旧是白字白底**。实测复现：bg=rgb(255,255,255) / color=rgb(255,255,255)。
     ⇒ 选择器补齐为 `.insp-top-right > .btn.sm.ghost.xxx-btn`（5 个类，稳压 4 个类）。 */
  .insp-top-right > .btn.sm.ghost.j59-scope-btn{
    background-image: linear-gradient(135deg,#4c7dff,#7a5cff,#ec4899) !important;
    background-color: #4c7dff !important;
    color:#fff !important;
    border:1px solid transparent !important;
    box-shadow:0 4px 12px -4px rgba(76,125,255,.55) !important;
  }
  .insp-top-right > .btn.sm.ghost.j59-concl-btn{
    background-image:none !important;
    background-color: var(--ios-card,#fff) !important;
    color: var(--ios-ink-2,#344054) !important;
    border:1px solid var(--ios-line,#d5dae4) !important;
    box-shadow:0 1px 2px rgba(15,23,42,.05) !important;
  }
  /* ⑥ 工程信息卡片通栏 */
  .insp-top-left .ipi-card{ width:100% !important; max-width:none !important; }
}

/* ═══════════════════════════════════════════════════════════════════
   三十三、v2.3.44「下栏永不遮挡」——把它做成一条**结构性规则**，而不是各页各留各的魔法数
   ─────────────────────────────────────────────────────────────────
   涛哥原话：「我认为你应该为**下栏设置独特的性质**，使得它永远不会遮挡页面，
             展现出用户开启单击页面隐藏下栏功能后，下栏出现，页面上抬，
             下栏显示，页面下落的效果。」

   ── 为什么要单独做 ────────────────────────────────────────────────
   下栏是 `position:fixed`，**不占文档流** ⇒ 谁都不"知道"它压住了底下多少内容。
   过去各页靠各自写死一个 padding-bottom 去躲它：
     · body            padding-bottom:86px          （styles.css，手机端）
     · main#view       padding-bottom:calc(96px+…)  （theme-v3.css，手机端）
     · #view.insp-wide padding-bottom:0             （检查页，直接没躲）
   三处各写各的 ⇒ 检查页漏了 ⇒ 实测中栏底边 244→844，下栏 772→834
   ⇒ 末尾 72px 永远滑不出来（v2.3.44 实测取证，见 _06_tools/_probe_padding.cjs）。

   ── 修法（单一真源 + 结构性占位）──────────────────────────────────
   ① 定义变量 --hz-tabbar-h = 下栏实际占用高度（含安全区），全站只此一处定义；
   ② 需要"躲下栏"的容器统一用 `calc(基础留白 + var(--hz-tabbar-h))`；
   ③ 下栏隐藏（body.ui-hidden-tabbar）时变量归 0，配合 padding/height 过渡
      ⇒ 下栏收起 = 可用区变高（页面上抬）；下栏出现 = 可用区收回（页面下落）。

   ⚠ 变量取值来源（390×844 实测）：tabbar rect[772→834]，下栏底距屏幕底 10px
     ⇒ 占用 = 844 − 772 = 72px；再叠加 env(safe-area-inset-bottom)。
     旧 body 的 86px ≈ 14px 呼吸 + 72px 下栏 ⇒ 换成公式后数值不变，不会引起跳动。
   ⚠ 桌面端（>820px）无下栏 ⇒ 变量恒为 0，两处 padding 与旧值一致。
   ═══════════════════════════════════════════════════════════════════ */

:root{
  /* 桌面端/无下栏：占位为 0（不能省，否则 var() 取不到值整条声明会被丢弃） */
  --hz-tabbar-h: 0px;
}
@media (max-width: 820px){
  :root{ --hz-tabbar-h: calc(72px + env(safe-area-inset-bottom)); }
  /* 单击页面隐藏下栏（app-tail.js initUiAutoHideCtrl）⇒ 占位同步归零 */
  body.ui-hidden-tabbar{ --hz-tabbar-h: 0px; }

  /* ① 常规页：底部留白 = 14px 呼吸 + 下栏占位（旧值 96px → 现在 86px，视觉不变） */
  body{
    padding-bottom: calc(14px + var(--hz-tabbar-h)) !important;
    transition: padding-bottom .28s cubic-bezier(.22,1,.36,1);
  }
  main#view{
    padding-bottom: calc(14px + var(--hz-tabbar-h)) !important;
    transition: padding-bottom .28s cubic-bezier(.22,1,.36,1);
  }
  /* AI 问答页自带底部输入条，自己撑满，不参与下栏占位（保持既有行为） */
  main#view.ai-wide{ padding-bottom: 0 !important; }
  /* ② 检查页：占位已算进 .app-shell 高度（见本节上方「三十二」处的改写） */
  body.insp-open{ padding-bottom: 0 !important; }
}

/* ═══════════════════════════════════════════════════════════════════
   三十四、v2.3.45 示范样板库手机端导航：横向胶囊条 → 右下角图标 + 弹窗
   ─────────────────────────────────────────────────────────────────
   涛哥原话（2026-10-12）：「示范样板库导航栏手机端适配有问题，
     **左右滑动的导航栏非常反直觉**，建议参照规范标准库，
     固定一个右下角图标，点击后直接打开导航弹窗，上下滑动，
     默认折叠的形式还不错」

   ── 为什么横向条在手机上不只是"不好用"，是**手势打架** ──────────
   ① 触摸手势歧义：横向拖 = 翻页方向 / 系统返回 / 横向滑动列表，三者同域，
      方向判错就误触发，现场检查时最容易出岔子；
   ② 一屏要装下**几百个方向/条目**的横向条，靠"一直划"找方向，实际不可用；
   ③ 展开某方向后条目区嵌在横向 flex 项内，宽度被兄弟项挤压，
      纵向滚动与横向滚动互相干扰。

   ── 做法（照抄技术标准库 #law-toc-fab + #toc-drawer 的既有范式）──
   · 右下角固定圆形图标，**下沉量用 v2.3.44 的 --hz-tabbar-h**
     （标准库写死 92px，这里跟着下栏显隐走 ⇒ 下栏收起时图标同步上移）；
   · 点击开**居中卡片弹窗**（圆角 + 遮罩 + 缩放渐入），非全屏抽屉；
   · 内容区纵向滚动（.d-body 本身 overflow:auto），方案树**默认全收起**的
     形态原样保留（2026-10-07 定的规则，涛哥明确说"还不错"）。

   ⚠ 断点用 **820px**（与本文件样板库既有移动端样式一致），
     刻意**不**套用全局 drawer 的 780px 居中规则 —— 否则 781~820px
     区间会露出"右侧抽屉"形态，与 820px 以下不一致。
   ⚠ 本节之前的「四、移动端」那段横向胶囊样式已全部限定到 `.sl-wrap > .sl-nav`，
     否则它会**污染抽屉里那棵树**（抽屉里也在 .sl-nav/.sl-navtree 类名）。
   ═══════════════════════════════════════════════════════════════════ */

/* ① 页面内那棵树：手机端不再渲染（JS navSlot 返回空串），此处兜底隐藏 */
@media (max-width: 820px) {
  .sl-wrap > .sl-nav { display: none !important; }

  /* ② 右下角图标：只在「本就在样板库页」时出现；否则隐藏 */
  #sl-nav-fab { display: none !important; }
  body.sl-page #sl-nav-fab {
    display: flex !important;
    bottom: calc(var(--hz-tabbar-h, 72px) + 20px) !important;
  }
  /* 弹窗打开时图标让位，避免浮在弹窗上 */
  body.sl-nav-lock #sl-nav-fab { opacity: 0 !important; pointer-events: none !important; }
  /* 弹窗打开时锁住背景滚动（否则手指在弹窗边缘会把整页带着走） */
  body.sl-nav-lock .app-shell,
  body.sl-nav-lock .app-main { overflow: hidden !important; }

  /* ③ 弹窗本体：居中卡片（自成一套，不依赖全局 780px 规则） */
  #sl-nav-overlay { z-index: 50; }
  #sl-nav-drawer {
    position: fixed;
    top: 50% !important; left: 50% !important; right: auto !important; bottom: auto !important;
    transform: translate(-50%, -46%) scale(.96);
    opacity: 0; visibility: hidden;
    height: auto !important;
    width: min(88vw, 400px) !important; max-width: 88vw !important;
    max-height: min(82vh, 760px) !important;
    border-radius: 18px !important;
    box-shadow: 0 24px 60px -12px rgba(15, 23, 42, .42) !important;
    overflow: hidden;
    animation: none !important;
    transition: transform .2s ease, opacity .2s ease, visibility .2s;
  }
  #sl-nav-drawer.open {
    display: flex !important;
    transform: translate(-50%, -50%) scale(1);
    opacity: 1; visibility: visible;
  }
  #sl-nav-drawer:not(.open) { pointer-events: none; }
  #sl-nav-drawer .d-head { border-radius: 0 !important; flex: 0 0 auto; }
  #sl-nav-drawer .d-head h3 { white-space: normal; }
  /* 内容区：纵向滚动 + 触屏惯性 + 不穿透到背景 */
  #sl-nav-drawer .d-body {
    padding: 10px 12px calc(14px + env(safe-area-inset-bottom, 0px));
    overflow: auto; -webkit-overflow-scrolling: touch; overscroll-behavior: contain;
  }

  /* ④ 抽屉里的方案树：去掉页面那套玻璃层/粘顶，改为正常纵向文档流 */
  #sl-nav-body .sl-nav {
    position: static !important;
    width: auto !important; max-width: none !important; max-height: none !important;
    display: block !important;
    padding: 0 !important;
    background: transparent !important;
    backdrop-filter: none !important; -webkit-backdrop-filter: none !important;
    border: none !important; border-radius: 0 !important; box-shadow: none !important;
    overflow: visible !important;
  }
  #sl-nav-body .sl-navtree { overflow: visible !important; max-height: none !important; }
  /* 触摸目标放大到 46px（iOS HIG 建议 ≥44px），长描述换行显示 */
  #sl-nav-body .sl-navitems .sl-item { min-height: 46px; font-size: 13px; line-height: 1.5; }
  #sl-nav-body .sl-navitems { max-height: none !important; overflow: visible !important; }
  /* 折叠箭头要回来（页面横向胶囊里被隐藏了，抽屉里需要它表达"可展开"） */
  #sl-nav-body .sl-caret { display: inline-block !important; }
}

/* ⑤ 打印：与 #law-toc-fab 一致不输出（styles.css 里那条是 class+!important，
      特异性低于上面的 id 选择器，这里补一条同级的） */
@media print {
  #sl-nav-fab, #sl-nav-drawer, #sl-nav-overlay { display: none !important; }
}

/* ═══════════════════════════════════════════════════════════════════
   三十五、v2.3.46 违反条文 ⇄ 技术标准库原文（查原文弹窗 + 跳转）
   ─────────────────────────────────────────────────────────────────
   涛哥需求：违反条文自带「规范名 + 编号 + 条款号」⇒ 与知识库打通，
   提供原文弹窗 + 跳转技术标准库该条文的按钮。

   弹窗沿用 #sl-nav-drawer 的同款「居中卡片」范式（断点 820px，与样板库一致），
   不套用全局 drawer 的 780px 规则 —— 否则 781~820px 会露出右侧抽屉形态（v2.3.45 已记）。
   ═══════════════════════════════════════════════════════════════════ */
@media (max-width: 820px) {
  /* ★★ v2.3.47（涛哥截图报障）：「整个页面亮度被调低，观感上不舒服」。
     全局 .overlay 是 `rgba(15,23,42,.46)` + `backdrop-filter:blur(3px)`
     —— 那是给**右侧全屏抽屉**用的（要挡住大半屏，必须压暗）。
     但这里是**居中卡片**弹窗：卡片自带阴影 + 白底，层级已经很清楚，
     再压暗整页只会让背景文字发虚发灰 ⇒ 观感差。
     ⇒ 样板库两个弹窗（原文 / 导航）统一改用**轻遮罩**：
       不透明度 .46→.22，并去掉 blur（模糊是"发虚"的直接来源）。 */
  /* ★★★ v2.3.49 紧急修复（涛哥报障：「点章节导航弹窗后整体页面变暗、弹窗也变暗，
     且导航无法点击、点击直接退出、伴有滑动穿透」）：
     我 v2.3.47 写这条时**多写了一个 z-index: 70** —— 而全局层级是
        .overlay { z-index: 50 }   ← 遮罩
        .drawer  { z-index: 60 }   ← 弹窗
     把遮罩提到 70 ⇒ **遮罩反盖在弹窗上**，三个症状全由它引起：
       ① 视觉：遮罩盖住弹窗 ⇒ 整体（含弹窗）变暗
       ② 交互：点击落在遮罩上 ⇒ 触发遮罩的 onclick 关闭 ⇒ "点导航直接退出"
       ③ 滚动：滚动事件落在遮罩/body，弹窗自己的 overscroll 拦不住 ⇒ 穿透
     ⇒ 这里**只改视觉，绝不碰 z-index**（遮罩保持 50、低于弹窗 60）。
     ★ 教训：改遮罩的"观感"（透明度/模糊）时，不要顺带改层级 —— 那是另一件事。 */
  #sl-norm-overlay, #sl-nav-overlay {
    background: rgba(15, 23, 42, .22) !important;
    backdrop-filter: none !important;
    -webkit-backdrop-filter: none !important;
  }
  #sl-norm-pop {
    position: fixed;
    top: 50% !important; left: 50% !important; right: auto !important; bottom: auto !important;
    transform: translate(-50%, -46%) scale(.96);
    opacity: 0; visibility: hidden;
    height: auto !important;
    /* v2.3.56：!important 已去（width 也交给 JS slFitPop 统一折算 zoom） */
    width: min(92vw, 460px); max-width: 92vw;
    /* v2.3.56：!important 已去 —— 手机端同样吃 body zoom，84vh 也会溢出；
       高度改由 JS slFitPop() 按 (视口-留白)/zoom 写入 inline style。 */
    max-height: min(84vh, 780px);
    border-radius: 18px !important;
    box-shadow: 0 24px 60px -12px rgba(15, 23, 42, .42) !important;
    overflow: hidden;
    animation: none !important;
    transition: transform .2s ease, opacity .2s ease, visibility .2s;
  }
  #sl-norm-pop.open {
    display: flex !important;
    transform: translate(-50%, -50%) scale(1);
    opacity: 1; visibility: visible;
  }
  #sl-norm-pop:not(.open) { pointer-events: none; }
  #sl-norm-pop .d-head { border-radius: 0 !important; flex: 0 0 auto; }
  /* ★ 标题可能很长（「JGJ 215-2010 施工升降机安装、使用、拆卸安全技术规程 第4.2.21条」），
     挤下去会把「关闭」按钮压成竖排换行（截图实测）。
     ⇒ 标题区限一行 + 省略号，关闭按钮 flex:0 0 auto 永不被挤。 */
  #sl-norm-pop .d-head h3 {
    font-size: 14px !important;
    display: flex !important; align-items: center; gap: 7px !important;
    flex: 1 1 auto !important; min-width: 0 !important;
    white-space: nowrap !important; overflow: hidden !important; text-overflow: ellipsis !important;
  }
  #sl-norm-pop .d-head h3 span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  #sl-norm-pop .d-head button { flex: 0 0 auto !important; white-space: nowrap !important; }
  #sl-norm-pop .d-body {
    padding: 12px 14px 14px;
    overflow: auto; -webkit-overflow-scrolling: touch; overscroll-behavior: contain;
    font-size: 13.5px; line-height: 1.85; color: var(--ios-ink, #1f2937);
  }
  /* 弹窗内文 */
  .sl-norm-meta { margin-bottom: 12px; }
  .sl-norm-mt { display: block; font-size: 13px; font-weight: 800; color: var(--ios-ink, #1f2937); }
  .sl-norm-crumb { display: block; margin-top: 3px; font-size: 11.5px; color: var(--ios-ink-4, #9ca3af); }
  .sl-norm-sec { margin: 14px 0 6px; font-size: 12px; font-weight: 800; color: var(--ios-ink-4, #9ca3af); letter-spacing: .5px; }
  .sl-norm-clause { font-size: 13px; font-weight: 800; color: var(--ios-acc-deep, #1d4ed8); margin-bottom: 4px; }
  .sl-norm-full { font-size: 13.5px; line-height: 1.9; white-space: pre-wrap; overflow-wrap: anywhere; }
  .sl-norm-sub { display: flex; gap: 8px; padding: 6px 0; border-top: 1px dashed var(--ios-line-2, #e5e7eb); }
  .sl-norm-sub.hit { background: rgba(76, 125, 255, .08); border-radius: 8px; padding: 6px 8px; }
  .sl-norm-subno { flex: none; font-weight: 800; color: var(--ios-ink-2, #374151); }
  .sl-norm-subtx { overflow-wrap: anywhere; }
  /* 未收录：如实告知，不冒充原文 */
  .sl-norm-warn {
    padding: 10px 12px; border-radius: 10px; font-size: 12.5px; font-weight: 700;
    background: rgba(234, 179, 8, .12); color: #92400e; border: 1px solid rgba(234, 179, 8, .3);
  }
  .sl-norm-tip { margin-top: 8px; font-size: 12px; color: var(--ios-ink-4, #9ca3af); line-height: 1.7; }
  .sl-norm-err { padding: 10px 12px; border-radius: 10px; font-size: 12.5px; background: rgba(239, 68, 68, .1); color: #b91c1c; }
  .sl-norm-err .dim { color: var(--ios-ink-4, #9ca3af); font-size: 11.5px; }
  .sl-norm-loading { display: flex; align-items: center; gap: 8px; padding: 20px 0; justify-content: center; color: var(--ios-ink-4, #9ca3af); font-size: 13px; }
  .sl-spin { width: 16px; height: 16px; border: 2px solid rgba(76, 125, 255, .25); border-top-color: #4c7dff; border-radius: 50%; animation: sl-spin .7s linear infinite; }
  @keyframes sl-spin { to { transform: rotate(360deg); } }
  body.sl-norm-lock .app-shell, body.sl-norm-lock .app-main { overflow: hidden !important; }
}

/* 桌面端：条文卡的三个按钮排一行 */
/* ★★ v2.3.47（涛哥报障）：「没有按更改后的美术风格，新增的'去技术标准库'按钮
   仍然是蓝紫渐变胶囊按钮」+「这个按钮我认为应该替代掉'查规范原文'弹窗中右下角的
   '查看规范全文'按钮，然后按钮文字应该改为'跳转到原文'」。
   ⇒ 弹窗底部按钮已删（HTML 里 .d-foot 移除），动作收敛到条文卡上；
   ⇒ 渐变胶囊换成 Linear/Vercel/Apple 级 SaaS 的做法：
      次行动 = 描边幽灵钮（透明底 + 1px 边）
      主行动 = 实心浅蓝底（不用渐变，靠底色与文字对比分层级）
   ⚠ 不用 background 简写 + 不依赖 CSS 变量（同 v2.3.43 白字白底教训：
     变量存在但无效会让整条声明被丢弃 ⇒ 只剩白底白字）。 */
.sl-norm-acts { display: flex; gap: 8px; margin-top: 10px; flex-wrap: wrap; }
.sl-norm-act {
  font-family: inherit !important; cursor: pointer;
  padding: 7px 14px !important; border-radius: 8px !important;
  font-size: 12.5px !important; font-weight: 650 !important; line-height: 1.5 !important;
  border: 1px solid #d5dae4 !important;
  color: #344054 !important; background-color: #fff !important;
  transition: border-color .15s ease, background-color .15s ease, color .15s ease;
}
.sl-norm-act:hover { border-color: #98a2b3 !important; background-color: #f8fafc !important; }
/* 主行动：实心蓝底白字（单色，非渐变） */
.sl-norm-act-go {
  border: 1px solid #1570ef !important;
  color: #fff !important;
  background-color: #1570ef !important;
}
.sl-norm-act-go:hover { background-color: #0b5ccc !important; border-color: #0b5ccc !important; }
.sl-norm-act:active { transform: scale(.985); }
.sl-norm-act:disabled { opacity: .55; cursor: wait; }

@media print { #sl-norm-pop, #sl-norm-overlay, .sl-norm-acts { display: none !important; } }

/* v2.3.48：条款「降级命中」提示（引用编号比库内条号更深时，展示的是上级条文） */
@media (max-width: 820px) {
  .sl-norm-deg {
    margin: 6px 0 4px; padding: 7px 10px; border-radius: 8px;
    font-size: 11.5px; line-height: 1.6;
    background: rgba(21, 112, 239, .08);
    color: #1d4ed8; border: 1px solid rgba(21, 112, 239, .22);
  }
}

/* ═════════ v2.3.51 示范样板库首页：章节导航 + 首次引导（涛哥 2026-10-13） ═════════ */
.sl-guide{border:1px solid var(--hz-brand,#4c7dff);background:var(--hz-brand-soft,#eef3ff);border-radius:14px;padding:14px 16px;margin:10px 0 4px}
.sl-guide-t{font-size:14.5px;font-weight:800;color:var(--hz-brand-ink,#3b5bdb);margin-bottom:8px}
.sl-guide-s{font-size:12.8px;line-height:1.85;color:#334155}
.sl-guide-s b{color:#0f172a}
.sl-guide-btn{margin-top:10px;min-height:36px;padding:0 18px;border:0;border-radius:999px;background:var(--hz-brand,#4c7dff);color:#fff;font-size:13px;font-weight:700;cursor:pointer;font-family:inherit}
.sl-guide-btn:active{transform:scale(.97)}
.sl-chaps{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:10px;margin:8px 0 4px}
.sl-chap{display:flex;flex-direction:column;align-items:flex-start;gap:4px;text-align:left;min-height:76px;padding:12px 14px;border:1px solid var(--hz-line-strong,#d5dae4);border-radius:14px;background:#fff;cursor:pointer;font-family:inherit;transition:box-shadow .15s,border-color .15s}
.sl-chap:hover{border-color:var(--hz-brand,#4c7dff);box-shadow:0 4px 14px rgba(76,125,255,.14)}
.sl-chap:active{transform:scale(.985)}
.sl-chap-name{font-size:14px;font-weight:750;color:#0f172a;line-height:1.35}
.sl-chap-meta{font-size:11.5px;color:#667085}
.sl-chap-go{margin-top:auto;font-size:12px;font-weight:700;color:var(--hz-brand,#4c7dff)}
@media (max-width:820px){ .sl-chaps{grid-template-columns:repeat(2,1fr)} .sl-chap{min-height:68px;padding:11px 12px} .sl-chap-name{font-size:13px} }

/* ═════════ v2.3.52 方案树：展开组头部吸顶（涛哥 2026-10-13） ═════════
   涛哥原话：「现在方案树内容较多，用户浏览靠下的内容时折叠按钮被移上去，
   必须滑到最上方才能折叠。希望点击展开方案树后，该方案树在导航栏中固定」。
   做法：只给**展开中**的组的头部加 position:sticky（top:0）——
   收起态的组头不吸顶（树不会很长，无必要）；展开态滚到容器顶即吸住，
   折叠按钮（.sl-navhead 整条）随时可点，条目列表照常从其下方滚过。
   PC 左栏（.sl-navtree 滚动）与手机端抽屉树（同一选择器）同时生效。 */
.sl-navtree .sl-navgroup.open > .sl-navhead{position:sticky;top:0;z-index:3;background:#fff;box-shadow:0 1px 0 var(--hz-line,#e2e8f0),0 4px 8px -6px rgba(15,23,42,.18)}
.sl-navtree .sl-navgroup.open > .sl-navhead .sl-caret{margin-left:1px}

/* ═════════ v2.3.53 示范样板库：固定浏览高度 + 左右栏独立滚动（涛哥 2026-10-13） ═════════
   涛哥原话（网页端）：「应该参照之前的全局左栏和页面修改，固定浏览示范样板库的页面高度，
   固定其导航栏的高度、右栏使它们和浏览器可视页面高度一致，仅通过滚动查看全部内容，
   而不是滚动整个浏览器页面来查看。」

   ⚠ 为什么**不能照抄知识库页的 .law-body-wrap{height:calc(100vh - 150px)}**：
     实测本页 body 有 zoom:1.35（涛哥的页面缩放），而 **100vh 不受 zoom 影响**——
     实测 100vh = 900px，但 #view 实际可用只有 804(物理)/1.35 = **595 CSS 像素**。
     照抄会得到 750px 的容器塞进 595px 的地方 ⇒ 溢出 55%，反而更糟。
     ⇒ 高度由 JS（slFitHeight）按「视口底边 - .sl-wrap 顶边」实测换算后写入 style.height，
       随 zoom / 窗口尺寸变化重算；这里的 CSS 只负责「两栏各自滚动」的骨架。 */
@media(min-width:821px){
  .sl-wrap{align-items:stretch}
  .sl-nav{position:static;max-height:none;height:auto;align-self:stretch}
  .sl-navtree{overflow-y:auto;min-height:0;flex:1 1 auto}
  .sl-main{overflow-y:auto;-webkit-overflow-scrolling:touch}
  /* .kb-wrap 原本 padding-bottom:60px（给手机端底部悬浮图标留的），
     在固定高度的网页端就是一片白占的空白（实测吃掉约 80 物理像素）⇒ 收紧到 12px。
     ⚠ 只作用于包裹 .sl-wrap 的那个 kb-wrap，知识库页（.law-body-wrap）不受影响。 */
  #view .kb-wrap:has(> .sl-wrap){padding-bottom:12px}
}
/* 上一条 / 下一条（v2.3.53）：右栏右上角，与面包屑同一行右对齐 */
.sl-topbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:8px}
.sl-topbar .sl-crumb{flex:1;min-width:0;margin-bottom:0}
.sl-seqbtns{display:flex;align-items:center;gap:6px;flex:none}
.sl-seqbtn{min-height:28px;padding:0 11px;border:1px solid #cbd5e1;border-radius:8px;background:#fff;color:#344054;font-size:12px;font-weight:700;cursor:pointer;display:inline-flex;align-items:center;gap:4px}
.sl-seqbtn:hover{background:#f1f5f9;border-color:#94a3b8}
.sl-seqbtn[disabled]{opacity:.45;cursor:not-allowed;background:#f8fafc}
.sl-seqpos{flex:none;font-size:11.5px;color:#94a3b8;font-variant-numeric:tabular-nums;padding:0 2px}
@media(max-width:820px){
  .sl-seqbtn{min-height:32px;padding:0 13px;font-size:12.5px}
  /* 手机上按钮占了约 180px，面包屑不截断会折成三行（实测）⇒ 单行省略；
     完整来源信息在下方「来源」行里，不影响溯源。 */
  .sl-topbar .sl-crumb{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:44px;font-size:11.5px}
}

/* ═════════ v2.3.54 查规范原文弹窗：居中模态 + SaaS 风格重设（涛哥 2026-10-14） ═════════
   涛哥原话：「网页端示范样板库的查规范原文按钮点击后弹窗是从右弹出的，我希望你修改为
   中间弹出，重新按新的网页风格设计弹窗 UI」＋「顺便把弹窗内的规范文本结构化一下，
   将 1.2.3.4 的小节也添加换行的格式便于阅读」。

   现状取证：该弹窗 DOM 是 <div class="drawer">，而全局 .drawer 就是「右侧整高抽屉」，
   只有 ≤820px 那段媒体查询把它改成了居中卡片 ⇒ **网页端一直是右侧抽屉**（截图已确认）。
   ⚠ 两条不可越的线：
     ① **不动 .drawer 本身** —— 知识库目录、方案树导航等抽屉都靠它；
     ② **不碰 z-index** —— 遮罩 50 / 弹窗 60 是 v2.3.49 血泪教训（多写 70 ⇒ 遮罩反盖弹窗）。 */

/* ── 结构化正文（两端共用）：小节号做成左列对齐的蓝色编号列（有序列表观感） ── */
#sl-norm-pop .sl-norm-full{white-space:normal}   /* 已由 JS 拆成块级行，不该再依赖 pre-wrap */
.sl-norm-full .sl-nf-p{margin:0 0 8px}
.sl-norm-full .sl-nf-p:last-child{margin-bottom:0}
.sl-norm-full .sl-nf-li{display:flex;gap:10px;align-items:baseline;padding:3px 0}
.sl-norm-full .sl-nf-no{flex:none;font-weight:700;color:#1570ef;font-variant-numeric:tabular-nums;text-align:right}
.sl-norm-full .sl-nf-no-m{min-width:46px}   /* 1.2.3.4 这类多级号留够列宽 */
.sl-norm-full .sl-nf-no-s{min-width:18px}
.sl-norm-full .sl-nf-li-sub{padding-left:24px}
.sl-norm-full .sl-nf-li-sub .sl-nf-no{color:#667085;font-weight:600;min-width:26px;text-align:left}
.sl-norm-full .sl-nf-tx{overflow-wrap:anywhere}
.sl-norm-full .sl-nf-gap{height:7px}
/* 小节标题（1 总则 / 2.1 术语 / 5.2.1 一般规定）：短行 + 无句末标点 ⇒ 加标题观感 */
.sl-norm-full .sl-nf-li.sl-nf-h{margin-top:9px;padding-top:6px;border-top:1px solid #f2f5f9}
.sl-norm-full .sl-nf-li.sl-nf-h:first-child{margin-top:0;padding-top:0;border-top:none}
.sl-norm-full .sl-nf-h .sl-nf-tx{font-weight:800;color:#0f172a}
.sl-norm-full .sl-nf-h .sl-nf-no{font-weight:800}
/* 关闭按钮：中性描边圆角方块（hover 才着色，不与正文抢视觉） */
.hz-x{width:30px;height:30px;flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;
  border:1px solid #e4e8ef!important;border-radius:9px!important;background:#fff!important;color:#667085!important;
  cursor:pointer;padding:0!important;
  transition:background-color .15s ease,border-color .15s ease,color .15s ease}
.hz-x:hover{background:#f4f6fa!important;border-color:#cfd6e2!important;color:#1f2937!important}
.hz-x:active{transform:scale(.96)}

@media (min-width:821px){
  /* 遮罩：轻压暗 + 极轻模糊（卡片自带阴影已足够分层，比右侧抽屉时代的 .46/blur(3) 克制） */
  #sl-norm-overlay{background:rgba(15,23,42,.30)!important;backdrop-filter:blur(2px)!important;-webkit-backdrop-filter:blur(2px)!important}
  /* ★ 核心：右侧整高抽屉 → 居中模态 */
  #sl-norm-pop{
    top:50%!important;left:50%!important;right:auto!important;bottom:auto!important;
    transform:translate(-50%,-48%) scale(.97);
    opacity:0;visibility:hidden;
    height:auto!important;
    /* v2.3.56：!important 已去 —— 高度/宽度改由 JS slFitPop() 按 (视口-留白)/zoom 实测写入
       inline style（CSS 用 vh 在 body zoom 下会溢出，见 slFitPop 注释）。此处保留作 JS 失效时的兜底。 */
    width:min(780px,90vw);max-width:90vw;
    max-height:min(82vh,780px);
    border:1px solid #e4e8ef;border-radius:16px!important;
    background:#fff!important;overflow:hidden;
    box-shadow:0 30px 70px -18px rgba(15,23,42,.42),0 6px 18px -8px rgba(15,23,42,.16)!important;
    animation:none!important;
    transition:transform .2s cubic-bezier(.22,.8,.3,1),opacity .18s ease,visibility .2s;
  }
  #sl-norm-pop.open{display:flex!important;transform:translate(-50%,-50%) scale(1);opacity:1;visibility:visible}
  #sl-norm-pop:not(.open){pointer-events:none}
  /* 头部：白底 + 1px 细分线（替换原蓝色实底） */
  #sl-norm-pop .d-head{background:#fff!important;color:#0f172a!important;border-bottom:1px solid #eef1f6;
    padding:15px 18px!important;border-radius:0!important;flex:0 0 auto}
  #sl-norm-pop .d-head h3{display:flex!important;align-items:center;gap:9px!important;
    font-size:15px!important;font-weight:700!important;color:#0f172a!important;
    flex:1 1 auto!important;min-width:0!important;
    white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}
  #sl-norm-pop .d-head h3 svg{color:#4c7dff;flex:none}
  #sl-norm-pop .d-head h3 span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  /* 正文区：留白舒展、行高放宽（长条文可读性） */
  #sl-norm-pop .d-body{padding:16px 20px 20px!important;font-size:13.5px;line-height:1.85;color:#1f2937}
  /* 规范名卡片 */
  #sl-norm-pop .sl-norm-meta{background:#f7f9fc;border:1px solid #eef1f6;border-radius:11px;padding:12px 14px;margin-bottom:14px}
  #sl-norm-pop .sl-norm-mt{font-size:13.5px;font-weight:700;color:#0f172a}
  #sl-norm-pop .sl-norm-crumb{margin-top:5px;font-size:11.5px;color:#98a2b3;line-height:1.65}
  #sl-norm-pop .sl-norm-sec{margin:16px 0 8px;font-size:11.5px;font-weight:800;color:#98a2b3;letter-spacing:.6px}
  /* 条款号：蓝色胶囊徽章（原为纯文字） */
  #sl-norm-pop .sl-norm-clause{display:inline-block;font-size:12px;font-weight:700;color:#1570ef;
    background:#eff6ff;border:1px solid #d3e4fe;border-radius:7px;padding:2px 10px;margin-bottom:9px}
  /* 条文正文：浅底 + 左侧 3px 蓝色强调边（白纸感） */
  #sl-norm-pop .sl-norm-full{background:#fbfcfe;border:1px solid #eef1f6;border-left:3px solid #4c7dff;
    border-radius:10px;padding:13px 16px;font-size:13.5px;line-height:1.9}
  /* 降级命中提示 */
  #sl-norm-pop .sl-norm-deg{background:rgba(234,179,8,.1);border:1px solid rgba(234,179,8,.28);
    border-radius:8px;padding:7px 11px;font-size:12px;color:#92400e;margin-bottom:9px}
  /* 各款：更松的列表（含命中款高亮） */
  #sl-norm-pop .sl-norm-subs{border:1px solid #eef1f6;border-radius:10px;overflow:hidden}
  #sl-norm-pop .sl-norm-sub{padding:9px 12px;border-top:1px solid #f2f5f9;gap:10px}
  #sl-norm-pop .sl-norm-sub:first-child{border-top:none}
  #sl-norm-pop .sl-norm-sub.hit{background:#f0f6ff}
}
@media (max-width:820px){
  /* 手机端结构同上，只收紧尺寸；关闭按钮同样换新样式 */
  .hz-x{width:28px;height:28px;border-radius:8px!important}
  .sl-norm-full .sl-nf-no-m{min-width:40px}
  #sl-norm-pop .sl-norm-meta{background:#f7f9fc;border:1px solid #eef1f6;border-radius:10px;padding:10px 12px;margin-bottom:12px}
  #sl-norm-pop .sl-norm-full{background:#fbfcfe;border:1px solid #eef1f6;border-left:3px solid #4c7dff;border-radius:10px;padding:11px 13px}
  #sl-norm-pop .sl-norm-clause{background:#eff6ff;border:1px solid #d3e4fe;border-radius:7px;padding:2px 9px;display:inline-block;margin-bottom:8px}
}
