/*fp-seed:syd794640bzw v4.86 2yoirf*/
/* ==========================================================================
   _seo_mobile.css v2 - 企业站完整移动端 CSS
   auto-generated by SEO-克隆建站系统/克隆引擎/内容/移动端适配器.py
   生效条件: 屏幕 ≤768px (平板 + 手机), PC 端 (>768px) 完全失效
   ========================================================================== */

/* ===== 0. 关键性能优化 (全屏生效, 不限媒体查询) ===== */
img[loading] { background: #f5f5f5}
img.lazyload { opacity: 0; transition: opacity .35s}
img.lazyloaded { opacity: 1}

/* v17.48(2026-06-01) 默认隐藏移动端 tabbar (PC 端不该看到这玩意).
   下面 @media (max-width: 768px) 里再设 display:flex 把手机端打开.
   bug 历史: 之前没这条全局隐藏, PC 浏览器对 <div class="seo-mobile-tabbar">
   按默认 display:block 渲染, 用户看到一行裸 emoji "🏠首页📦产品💬联系🏢关于⬇底部" */
.seo-mobile-tabbar { display: none !important}

/* ============================================================
   ★ 主响应式块: 屏幕 ≤768px
   ============================================================ */
@media screen and (max-width: 768px) {

  /* ---- 1. 全局 reset ---- */
  html, body {
    min-width: 0 !important;
    max-width: 100% !important;
    overflow-x: hidden !important;
    -webkit-text-size-adjust: 100% !important;
    -webkit-font-smoothing: antialiased;
    -webkit-tap-highlight-color: rgba(0,0,0,0.08);
    scroll-behavior: smooth}
  body {
    font-size: 16px !important;
    line-height: 1.6 !important;
    font-family: -apple-system, BlinkMacSystemFont, "PingFang SC",
                 "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial,
                 sans-serif !important;
    color: #333 !important;
    background: #fff !important;
    /* 给底部 tabbar 让出 60px 空间 */
    padding-bottom: 60px !important}

  /* ---- 2. 容器 (全名单) ---- */
  .container, .wrap, .wrapper, .main, .content, .page, .pagebody,
  .layout, .l-wrap, .layout-main, .site-wrap, .site-content,
  .body-wrap, .body-content, .main-wrap, .main-content,
  #container, #wrap, #wrapper, #main, #content, #page, #pagebody {
    width: 100% !important;
    max-width: 100% !important;
    min-width: 0 !important;
    margin-left: 0 !important;
    margin-right: 0 !important;
    padding-left: 12px !important;
    padding-right: 12px !important;
    box-sizing: border-box !important;
    float: none !important}

  /* ---- 2.5 固定像素宽度容器 (OKA-158) ----
     上面是类名白名单, 灰产 CMS 常用的 .w1200 / .w1000 / .w960 这种
     "宽度写进类名" 的容器不在名单里, 于是 width:1200px 原样渲染,
     撑破 375px 视口 —— html,body 的 overflow-x:hidden 只是把溢出裁掉
     不显示滚动条, 内部元素照样按 PC 宽度排, 视觉上就是右边被切.

     病例 tiemajiaoguan (run #174): <div class="w1200"> 实测 right=1212,
     它的子元素 .f2/.f2_3/img.cfr 跟着一起被推出视口.

     只 reset 宽度, 不加 padding —— 这类容器可能嵌在已有 padding 的
     外层里, 再加会双重缩进. */
  [class*="w960"], [class*="w1000"], [class*="w1100"], [class*="w1152"],
  [class*="w1180"], [class*="w1200"], [class*="w1220"], [class*="w1230"],
  [class*="w1240"], [class*="w1280"], [class*="w1300"], [class*="w1400"],
  [class*="width1000"], [class*="width1200"], [class*="wrap1200"] {
    width: 100% !important;
    max-width: 100% !important;
    min-width: 0 !important;
    box-sizing: border-box !important}

  /* ---- 3. 排版 ---- */
  /* v85(2026-07-27 OKA-210) h1 加 :not([style]) —— 放行 TDK处理._注入h1关键词
     写死 inline style 的 X 词 h1 (32px/700/left, 对齐樱梦真站; 樱梦移动端同样
     不缩字号, 实测 375px 下仍是 32px)。这里的 !important 本意是压平源站各种
     奇怪标题字号, 但它连 inline style 一起盖掉了, 把 X 词 h1 压成 22/20px。
     源站原有的 h1 在 _注入h1关键词 里已被无条件降级成 h2, 由下面那条 h2 规则
     接管, 所以放行裸 h1 不会让源站标题失去移动端规范化。 */
  h1:not([style]), .h1 { font-size: 22px !important; line-height: 1.4 !important; margin: 14px 0 10px !important; font-weight: 600 !important}
  h2, .h2 { font-size: 19px !important; line-height: 1.4 !important; margin: 12px 0 8px !important; font-weight: 600 !important}
  h3, .h3 { font-size: 17px !important; line-height: 1.4 !important; margin: 10px 0 6px !important; font-weight: 600 !important}
  h4, h5, h6, .h4, .h5, .h6 { font-size: 16px !important; line-height: 1.4 !important}
  p { font-size: 15px !important; line-height: 1.7 !important; word-wrap: break-word !important; margin: 0 0 10px !important}
  ul, ol { padding-left: 20px !important; margin: 0 0 10px !important}
  li { line-height: 1.6 !important}
  blockquote { padding: 10px 14px !important; border-left: 3px solid #1e88e5 !important; background: #f5f9ff !important; margin: 10px 0 !important}

  /* ---- 4. 图片自适应 ---- */
  img, picture, .img-fluid, .img-responsive {
    max-width: 100% !important;
    height: auto !important;
    display: inline-block}
  figure { margin: 10px 0 !important; max-width: 100% !important}

  /* ---- 5. 表格 (横向滚动) ---- */
  .table-wrap, .table-responsive {
    width: 100% !important;
    overflow-x: auto !important;
    -webkit-overflow-scrolling: touch;
    margin: 10px 0 !important}
  table {
    display: block !important;
    width: 100% !important;
    overflow-x: auto !important;
    -webkit-overflow-scrolling: touch;
    border-collapse: collapse !important;
    white-space: nowrap !important}
  td, th {
    padding: 8px 10px !important;
    font-size: 14px !important;
    border: 1px solid #eee !important}
  th { background: #f5f5f5 !important; font-weight: 600 !important}

  /* ---- 5b. 源站用 <table> 当图片卡片的 (float + 定宽) (v32.22 · OKA-300) ----
   * 病例 qdrx999.com (源站 cntysw.com · 证书/产品列表):
   *   <table width="280" style="float:left;margin:5px;border:1px solid">
   *     <tr><td align="center"><a><img width="280" height="260"></a></td></tr>
   *     <tr><td align="center"><a>实用新型专利</a></td></tr>
   *   </table>
   * 每张证书 = 一个 float:left + width=280 的独立小 table (源站拿 table 当卡片)。
   * 移动端 td 是 display:table-cell, `seo-w-full` 的 width:100% 对它无效 (被
   * table 列宽算法卡在 280) → 图只占视口 65%、两边留白, 用户报"图片小结构不对"。
   *
   * ⚠️ 跟 §5 数据表格的分界 (关键, 否则误伤 24 个真数据表格站, ntfjdt 有 94 个):
   *   **float + 定宽 = 卡片 table** (数据表格不会 float 也不定死 width 当卡片摆)。
   *   §5 那条 (无 float 的 table) 保持横向滚动不动; 这条只管 float+定宽的。
   * 实测 8 站命中 (全 cntysw.com 同源站, 每站 10 个, 全含 img), 24 个数据表格
   * 站零命中。
   *
   * 处理: float:none + width:100% (拉满视口) · td 转 block 居中 · img width:100%。
   * ⚠️ 必须 float:none —— 不清的话多个卡片 table 仍会浮动并排挤成小块。 */
  html.seo-nav-fullwidth table[width][style*="float"],
  table[align][width][style*="float"] {
    float: none !important;
    width: 100% !important;
    max-width: 100% !important;
    margin: 8px 0 !important;
    display: block !important;
    white-space: normal !important;
    overflow-x: visible !important}
  html.seo-nav-fullwidth table[width][style*="float"] td,
  table[align][width][style*="float"] td {
    display: block !important;
    width: 100% !important;
    text-align: center !important;
    white-space: normal !important}
  html.seo-nav-fullwidth table[width][style*="float"] img,
  table[align][width][style*="float"] img {
    width: 100% !important;
    height: auto !important;
    max-width: 100% !important}

  /* ---- 6. 表单 (iOS 字号 ≥16px 防放大) ---- */
  input, textarea, select {
    font-size: 16px !important;
    max-width: 100% !important;
    box-sizing: border-box !important;
    border-radius: 6px !important;
    border: 1px solid #ddd !important;
    background: #fff !important;
    color: #333 !important;
    -webkit-appearance: none !important}
  input[type="text"], input[type="tel"], input[type="email"],
  input[type="search"], input[type="password"], input[type="number"],
  input[type="url"], input[type="date"], input[type="time"], textarea {
    width: 100% !important;
    padding: 12px 14px !important;
    margin: 6px 0 !important}
  textarea { min-height: 100px !important; resize: vertical !important}
  select {
    padding: 12px 14px !important;
    background: #fff url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'><polygon points='0,0 10,0 5,6' fill='%23999'/></svg>") no-repeat right 12px center !important;
    padding-right: 32px !important}
  label { display: block !important; margin: 6px 0 4px !important; font-size: 14px !important; color: #555 !important}
  .form, form { width: 100% !important}

  /* ---- 7. 按钮 (Apple HIG 44x44px) ---- */
  button, .btn, .button, input[type="button"],
  input[type="submit"], input[type="reset"] {
    min-height: 44px !important;
    min-width: 44px !important;
    font-size: 16px !important;
    padding: 12px 20px !important;
    border-radius: 6px !important;
    border: none !important;
    cursor: pointer;
    font-weight: 500 !important;
    line-height: 1.2 !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    transition: all .2s ease}
  .btn-primary, .btn.primary, button.primary,
  input[type="submit"], .btn-blue {
    background: linear-gradient(135deg, #1e88e5, #1565c0) !important;
    color: #fff !important}
  .btn-success, .btn-green { background: linear-gradient(135deg, #43a047, #2e7d32) !important; color: #fff !important}
  .btn-danger, .btn-red { background: linear-gradient(135deg, #e53935, #c62828) !important; color: #fff !important}
  .btn-block, .btn.block { width: 100% !important}

  /* ---- 8. 顶部导航 · v32(2026-07-29 OKA-252) 2 列网格常显 · 撤掉汉堡折叠 ----
   * 用户原话: "移动端可以不用右那个隐藏吗? 只需要把字体导航变小, 适配移动端 ...
   *   类似这个樱梦的站, 导航会自动换行, 适配移动端, UI 也会比较漂亮,
   *   不需要右上那个汉堡折起来"
   *
   * 形态取自樱梦 52291.cn 蜘蛛版实测 (源站 dedecms 模板自带的 .hy-nav-menu
   * 响应式, 不是它的克隆系统加的):
   *   li a { padding:12px 5px; font-size:15px; border-radius:8px;
   *          min-height:44px; white-space:normal; word-break:break-word;
   *          background:rgba(102,126,234,.05); text-align:center;
   *          display:flex; align-items:center; justify-content:center }
   * 我方沿用同一套量, 主题色换成本项目的 #1e88e5 系。
   *
   * ⚠️ 这里撤掉的是 v30.5/v31 的"默认收起 + 汉堡展开"策略 (见下方 v30.5 段
   *    和 _生成JS.py)。那两版修的是 guangdongzuyi.com 的"nav 7 项竖排撑爆首屏
   *    676px"和"展开后全屏白底挡内容"—— 而竖排本身就是 v2 那条
   *    `nav li {display:block; width:100%}` 造成的。网格化之后 7 项只占 4 行
   *    约 200px, 两个病因都不存在了, 所以是**换解法**不是退回老 bug。
   *    别再改回 `display:block; width:100%` + 汉堡, 会重演本次用户投诉。
   */
  /* 8.0 导航容器 full-bleed —— 突破源站 PC 栅格的窄栏限制
   * 这类源站**根本没有移动端布局**: PC 两栏结构 (logo 左 / 导航右) 直接塞进
   * 375px, 导航天生躺在 114-164px 的右侧栏里。网格再怎么调也排不开, 而且整块
   * 偏在屏幕右侧被裁 (sxxwpnc.com / ynrgjz.com 截图实测)。
   * 原来的"汉堡折叠"其实正是**规避**这一点的手段 —— 把导航拎出文档流做成
   * 全宽抽屉, 就绕开了"它在窄栏里"的事实。撤掉汉堡就必须正面解决它。
   *
   * `margin-left: calc(-50vw + 50%)` 是标准的 full-bleed 技巧: 元素先左移到
   * 视口左边缘, 再配 `width:100vw` 占满整个视口宽 —— **只改导航自己, 一个
   * 祖先都不碰**。试过改祖先 (4 版), 每版都破坏源站层叠 (导航被 banner 盖 /
   * logo 消失), 见 tests/test_seo_cloner_导航网格.py:test_E_不许用JS改源站布局。
   * ⚠️ 要跟 `position:relative` 一起用 (不能是 static), 否则某些源站的
   *    absolute 子元素会跑位。 */
  /* ⚠️ full-bleed 只在 `html.seo-nav-fullwidth` 下启用 —— 那个 class 由
   * _seo_mobile.js 的 `搬导航到独立行()` **搬成功后**才加。
   * 原因: 全宽的前提是导航已经独占一行。若源站没有 <header> 可作落点
   * (病例 ynrgjz.com), 导航搬不走、仍跟 logo 同行, 这时给它 100vw 会直接
   * 盖在 logo 和 banner 上 —— 比不改更糟。那类站只做网格化 (§ 8.2-8.5),
   * 导航留在原窄栏里排 1 列, 不溢出也不重叠。 */
  html.seo-nav-fullwidth nav, html.seo-nav-fullwidth .nav,
  html.seo-nav-fullwidth .navbar, html.seo-nav-fullwidth .navigation,
  html.seo-nav-fullwidth .header-nav, html.seo-nav-fullwidth .top-nav,
  html.seo-nav-fullwidth #nav, html.seo-nav-fullwidth #navbar,
  html.seo-nav-fullwidth .menu, html.seo-nav-fullwidth .main-menu,
  html.seo-nav-fullwidth .h-nav, html.seo-nav-fullwidth .header-menu {
    width: 100vw !important;
    max-width: 100vw !important;
    min-width: 0 !important;
    margin-left: calc(-50vw + 50%) !important;
    margin-right: 0 !important;
    box-sizing: border-box !important;
    padding-left: 10px !important;
    padding-right: 10px !important;
    float: none !important;
    display: block !important;
    text-align: left !important;
    position: relative !important;
    left: auto !important;
    right: auto !important;
    /* ⚠️ height:auto + overflow:visible 不能省 —— 源站给导航容器写死过高度
     * (PC 单行导航 ~50px), 网格化后内容变成 4 行 208px, 容器却还是 101px,
     * ul 溢出 107px 正好盖在 logo 上 (病例 ynrgjz.com: 看着像"logo 压导航",
     * 实际是"导航溢出容器压到 logo")。 */
    height: auto !important;
    min-height: 0 !important;
    max-height: none !important;
    overflow: visible !important;
    line-height: normal !important}

  /* 8.0b 搬不动的站 = 改造前 v2 的原样行为 (一个字都不多改)
   * ────────────────────────────────────────────────────────
   * 网格化 / 全宽 / 藏汉堡 全部挂在 `html.seo-nav-fullwidth` 下, 只给导航
   * 真被搬成独立一行的站。搬不动的站 (源站没 <header> 可作落点, 病例
   * ynrgjz.com) 这里必须**完整保留改造前那套**, 否则会退化:
   *   · 少了这套 → 既没网格也没汉堡, 导航彻底不可用 (实测项数 0)
   *   · 多改一点 (加 position/display/box-sizing) → 动到源站布局,
   *     banner 反过来盖住导航 (实测截图)
   * 所以这一段是**逐字照抄 v2**, 不许"顺手优化"。 */
  nav, .nav, .navbar, .navigation, .header-nav, .top-nav,
  #nav, #navbar, .menu, .main-menu, .h-nav, .header-menu {
    width: 100% !important;
    float: none !important;
    /* `flow-root` 而不是 `block` —— 它布局行为跟 block 完全一样, 但会**形成
     * BFC 包住浮动子元素**。源站的导航 ul 往往是 float 的, block 父容器
     * 高度算不进它 → 容器 46px 而 ul 525px, 溢出 479px 压到 banner 上
     * (ynrgjz.com 实测, 就是用户报的"移动端错位")。iOS 13+ / Chrome 58+ 支持,
     * 不支持的老浏览器退化成 block = 改造前行为, 不会更糟。 */
    display: flow-root !important;
    text-align: left !important;
    position: relative !important;
    /* ⚠️ 这三行是**修 bug**, 跟"全宽/网格"无关, 所以放在兜底段 (所有站生效)。
     * 源站给导航容器写死了 PC 单行高度 (ynrgjz.com 实测 nav h=101), 而移动端
     * 竖排后 ul 有 208px —— 溢出 107px 正好压在 banner 上, 就是用户报的
     * "移动端错位": 导航文字跟 banner 图叠在一起。
     * 早先版本我把这三行放进了 full-bleed 条件段, 结果搬不动的站 (ynrgjz) 吃不到,
     * 错位照旧。别再挪回条件段。 */
    height: auto !important;
    max-height: none !important;
    overflow: visible !important}
  nav ul, .nav ul, .navbar ul, .menu ul,
  .header-nav ul, .top-nav ul {
    padding: 0 !important;
    margin: 0 !important;
    list-style: none !important;
    /* ⚠️ display:block 不能省 —— v2 只给 `nav li` 设了 `display:block; width:100%`,
     * 但源站的 ul 常是 `display:flex` (横排导航)。flex 容器下 li 的 width:100%
     * 不会让它们换行, 7 项挤在 430px 里每项只剩 60px, 文字被压成一字一行
     * (病例 ygbljx.com: ul.navBar.df display=flex w=420, 截图里"核心价值观"
     * 竖着排). 兜底模式必须真的竖排。
     * 网格模式那条 `display:grid !important` 特异性更高, 不受影响。 */
    display: block !important;
    /* 同上: ul 自己也可能被源站写死高度 */
    height: auto !important;
    max-height: none !important;
    /* ul 自己 float 的话父容器高度算不进它 (v2 只给 li 清了 float, ul 漏了)
     * —— ynrgjz.com 实测容器 82px 而 ul 525px, 溢出 443px 压 banner */
    float: none !important;
    width: 100% !important;
    max-width: 100vw !important;
    box-sizing: border-box !important}
  /* 顶级导航 ul 回到文档流 —— 源站常把它 absolute 定位 (PC 下拉菜单的做法),
   * 那样它**不占父容器高度**: 容器 82px 而 ul 525px, 溢出 443px 压在 banner 上
   * (ynrgjz.com 实测, 就是用户报的"移动端错位")。
   * ⚠️ 只改**直接子级**的 ul —— 二级 ul (`nav li ul`) 保持源站的 absolute,
   * 它是下拉浮层, 改了会平铺出来把页面顶开。 */
  nav > ul, .nav > ul, .navbar > ul, .menu > ul,
  .header-nav > ul, .top-nav > ul, #nav > ul, #navbar > ul,
  nav > div > ul, .nav > div > ul, .navbar > div > ul,
  #nav > div > ul, #navbar > div > ul, .menu > div > ul {
    position: static !important;
    top: auto !important;
    left: auto !important;
    right: auto !important;
    bottom: auto !important;
    transform: none !important}

  /* 导航容器内部的中间层 (源站栅格 div) 也要形成 BFC —— 它们不在
   * `nav/.nav/...` 名单里, 仍是 block, 包不住浮动的 ul。只加 flow-root,
   * 不动宽度/定位。 */
  nav > div, .nav > div, .navbar > div, .menu > div,
  .header-nav > div, .top-nav > div, #nav > div, #navbar > div,
  nav > div > div, .nav > div > div, #nav > div > div, #navbar > div > div {
    display: flow-root !important;
    float: none !important;
    width: 100% !important;
    max-width: 100vw !important;
    box-sizing: border-box !important;
    /* ⚠️ height:auto 是这里的关键 —— 源站给这些栅格 div 写死了 PC 单行高度
     * (ynrgjz.com 实测 `.nav_r.bj` 恒 46px), 里面的 ul 竖排后有 525px,
     * 于是溢出 479px 压在 banner 上 = 用户报的"移动端错位"。
     * 光加 flow-root 不够 (那只管"包住浮动"), 写死的 height 还得放开。 */
    height: auto !important;
    min-height: 0 !important;
    max-height: none !important;
    overflow: visible !important}
  nav li, .nav li, .navbar li, .menu li,
  .header-nav li, .top-nav li {
    display: block !important;
    width: 100% !important;
    float: none !important;
    border-bottom: 1px solid rgba(0,0,0,0.06) !important}
  nav a, .nav a, .navbar a, .menu a,
  .header-nav a, .top-nav a {
    display: block !important;
    padding: 14px 18px !important;
    line-height: 1.5 !important;
    color: #333 !important;
    text-decoration: none !important;
    font-size: 15px !important}
  nav a:active, .nav a:active, .menu a:active {
    background: #f5f9ff !important}
  /* 我方注入的汉堡 (搬不动的站靠它展开导航 · 见 _生成JS.py 的 fallback) */
  .seo-mobile-burger {
    display: inline-block !important;
    position: fixed !important;
    top: 8px;
    right: 8px;
    z-index: 9998;
    width: 44px;
    height: 44px;
    line-height: 44px;
    text-align: center;
    background: rgba(255,255,255,0.95);
    border: 1px solid #eee;
    border-radius: 6px;
    box-shadow: 0 2px 8px rgba(0,0,0,0.08);
    cursor: pointer;
    user-select: none}
  .seo-mobile-burger::before {
    content: "≡";
    font-size: 28px;
    color: #1e88e5;
    font-weight: bold}

  /* 8.0d 包含导航的祖先容器放开写死高度 (CSS 版 · 不依赖 JS 执行时序)
   * ────────────────────────────────────────────────────────
   * 用户报的"移动端错位"真正机制是**高度塌陷层层传递**:
   *   UL h=525 (竖排后真实高) → DIV h=525 → DIV.nav_r.bj h=46 (§ 8.0b 已放开)
   *   → DIV.main_poxx h=**101** ← 再往上还写死, nav 涨到 561 后溢出它
   *   → banner (.iBan, body 直接子元素 static, 紧跟其后) 按 101px 排位
   *   → 跟 561px 的导航垂直重叠 503px, 导航文字压在 banner 图上
   *
   * 这层的类名没有共识 (.main_poxx / .nav_r / .bj / #main_nav ...), 写死清单
   * 覆盖不到 —— 又是"白名单式"那个老病 (同 OKA-183/197/203)。
   * 用 `:has()` 按**结构**命中: "body 的直接子元素里, 包含 nav 的那个"。
   * 只改高度三属性, 不动 float/position/width (那条路已证伪 4 版)。
   * `:has()` iOS 15.4+ / Chrome 105+ 支持; 不支持的老浏览器退化成改造前行为。
   *
   * ⚠️ 先用 JS 版 (`放开导航祖先高度()`) 试过, 但它依赖执行时序: 第一拍时 nav
   * 还只有 82px、这层判据不成立不该改, 等 CSS 让 nav 涨到 561px 真塌陷了却
   * 没人再检查 (实测 inline height 始终为空)。CSS 没有时序问题。 */
  /* ⚠️ 这份选择器也要跟 JS 的 `_主导航ul()` 同源 —— 它认 `header ul`,
   * 所以这里必须能命中"含 header 的祖先"。病例 ygbljx.com 的导航是
   * `UL.navBar.df` 挂在 `<header>` 里、**不在 `<nav>` 里**, 只写 `:has(nav)`
   * 命中不到 → 祖先仍写死 PC 单行高, 网格化后 224px 的导航溢出去压 banner。 */
  body > *:has(nav),
  body > *:has(.nav),
  body > *:has(#nav),
  body > *:has(.navbar),
  body > *:has(.header-nav),
  body > *:has(.navbox),
  body > *:has(.nav-menu),
  body > header,
  body > *:has(header),
  body > *:has(> header),
  body > * > *:has(> nav),
  body > * > *:has(> .nav),
  body > * > *:has(> header) {
    height: auto !important;
    min-height: 0 !important;
    max-height: none !important;
    overflow: visible !important}

  /* ---- 8.0e 高度放开 class (JS 打的) ----
   * 为什么不能只靠 JS 写 inline style: **源站 JS 会把它擦掉**。
   * 病例 ygbljx.com 埋点实测, 三拍每拍都是"我方写 height:auto → 生效 (80→241)
   * → 源站清空 inline → 回到 80", 导航 224px 溢出 header 80px 去压 banner。
   * class 走 CSS, 源站清 style 影响不到。
   *
   * 特异性: `html .seo-h-auto` = (0,1,1) > 源站 `.header` = (0,1,0), 且本文件
   * 后加载 —— 双保险赢。不用 `html body .seo-h-auto` 那种更长的选择器是因为
   * (0,1,1) 已经够, 越短越不容易跟未来规则打起来。 */
  html .seo-h-auto,
  html.seo-nav-fullwidth .seo-h-auto {
    height: auto !important;
    min-height: 0 !important;
    max-height: none !important;
    overflow: visible !important}

  /* ---- 8.0f PC 两栏 flex 拆平 class (JS 打的 · v32.3 OKA-252d) ----
   * 源站按 1200px 设计的 `display:flex; flex-direction:row` 两栏, 在 430px 下
   * 每栏只分到一半, 里面的文字被逐字换行 (病例 ygbljx.com "核心价值观" w=38px)。
   * JS 按实测形态挑出这类容器 (见 _生成JS.py § 2f 的三条判据), 这里负责拆平。
   *
   * ⚠️ `> *` 那条 width:100% 是必须的 —— 光改 flex-direction 不够, 子元素
   * 还带着 PC 的 flex-basis / width 百分比, 会继续窄着。 */
  html .seo-flex-col {
    flex-direction: column !important;
    flex-wrap: wrap !important;
    align-items: stretch !important}

  html .seo-flex-col > * {
    width: 100% !important;
    max-width: 100% !important;
    min-width: 0 !important;
    flex: 0 0 auto !important;
    box-sizing: border-box !important}

  /* 图片在拆平后的容器里别被拉变形 */
  html .seo-flex-col img {
    max-width: 100% !important;
    height: auto !important}

  /* ---- 8.0g flex-wrap 多列 → 2 列网格 (JS 打的 · v32.5 OKA-252f) ----
   * 病例 ygbljx.com 产品列表实测:
   *   UL.df.flex-wrap  w=408  display:flex · flex-wrap:wrap · 8 个子元素
   *     └─ LI.wow  **width:75px 硬编码**  h=139
   *          └─ A → 文字 "新能源汽车驅動電機轉轴(zhou)、法蘭盘" (19 字)
   *   19 字 × 15px = 285px 塞进 75px → 折成 139px 高的竖条
   *
   * ⚠️ **不能用 seo-flex-col** —— 那会把 8 个卡片变成 8 行竖排, 页面拉得很长
   * 且每行只剩一个卡片, 信息密度崩掉。2 列网格才是移动端产品列表的正确形态
   * (对齐樱梦 52291.cn, 也对齐我们导航那套 2 列网格)。
   *
   * ⚠️ `> *` 必须写 `width:auto` 而不是 `100%` —— grid item 的宽由 track 决定,
   * 写 100% 在有 gap 时会溢出。同时 `max-width:none` 是为了盖掉源站的
   * `max-width:75px` 这类硬限制 (只清 width 不清 max-width 会白做)。 */
  html .seo-grid-2 {
    display: grid !important;
    grid-template-columns: 1fr 1fr !important;
    gap: 10px !important;
    align-items: start !important}

  html .seo-grid-2 > * {
    width: auto !important;
    max-width: none !important;
    min-width: 0 !important;
    flex: none !important;
    float: none !important;
    margin-left: 0 !important;
    margin-right: 0 !important;
    box-sizing: border-box !important}

  /* 网格格子里的图片跟着格子走 */
  html .seo-grid-2 img {
    width: 100% !important;
    height: auto !important;
    max-width: 100% !important}

  /* ---- 8.0h 内容图拉满 class (JS 打的 · v32.5 OKA-252f) ----
   * 病例 ygbljx.com 新闻区实测:
   *   IMG  inlineStyle="width: 240px; height: 142px;"   ← **源站内联硬编码**
   *   父 DIV.img  w=410 (已满宽)  → 图片只占 240/410 = 59%, 右侧空 170px
   *
   * ⚠️ `max-width:100%` 这条路**在这类站上永久无效** —— 240px 本来就没超过
   * 430px 视口, max-width 压根不触发。必须 `width:100%` 才能盖掉内联值。
   *
   * ⚠️ 为什么不直接对所有 `img` 写 width:100% —— logo / 图标 / 二维码 / inline
   * 表情都会被拉成满宽变形。所以由 JS 按实测形态精确打标 (见 _生成JS.py § 2i
   * 的排除清单), 这里只负责被打上标的那些。 */
  html .seo-img-full {
    width: 100% !important;
    height: auto !important;
    max-width: 100% !important;
    min-width: 0 !important}

  /* ---- 8.0i 虚高容器收紧 class (JS 打的 · v32.9 OKA-252l) ----
   * 病例 hanyatc.com/Wap/ 用户报"CSS 结构不对, 封面图下面间隔了很远"。
   * 实测 (Baiduspider UA · 421×936):
   *   DIV.FrontPublic_slideShow01-d3_c1   421x**720**  cssH=720px  maxH=**none**
   *     └─ banner IMG  421x**158**  (natural 1920x720, 等比缩到 158)
   *   → 图下面 **562px 纯白**, 中间飘着轮播的 ‹ › 箭头
   *
   * 720px 是**源站 PC 的轮播高度**(源图就是 1920x720)。图片跟着视口等比缩了,
   * 容器高度**没跟着缩**。
   *
   * ⚠️ 我方 § 10a/10b 那两条 banner 规则**没命中它** —— 选择器是
   * `.banner/.swiper/.carousel/.slider/.slide` 这类 class 名, 而它叫
   * `FrontPublic_slideShow01-d3_c1`。这就是白名单式选择器的老病 (同 OKA-183/197/203),
   * 每来一个新建站系统就漏一次。所以改成 **JS 按实测形态打标**:
   * "容器高 > 300px 且内容只占不到 60%" = 虚高, 不管它叫什么 class。
   *
   * ⚠️ 跟 `seo-h-auto` 是**反方向**且互斥:
   *   seo-h-auto    容器**比内容矮** (塌陷) → 放开高度
   *   seo-h-shrink  容器**比内容高**很多 (虚高) → 收紧高度
   * 两个判据不可能同时成立, JS 侧还额外跳过已带 seo-h-auto 的元素。
   *
   * ⚠️ `max-height` 兜一层上限而不是只写 `height:auto` —— 万一某个站的内容本身
   * 就很高 (量出来的"内容底"含了不该算的东西), 有上限不至于又撑爆。 */
  html .seo-h-shrink,
  html.seo-nav-fullwidth .seo-h-shrink {
    /* ⚠️ `--seo-shrink-h` 由 JS `收紧虚高容器()` 按主图真实宽高比算出来写在 inline 上。
     * **变量本身不产生样式**, 只有这条规则应用它 —— 而这整块在
     * `@media (max-width:768px)` 内, 所以 PC 端 (视口 > 768) 规则不生效、变量白放着。
     * 这就是"移动端和 PC 端分开"的实现方式 (v32.11 · OKA-252o)。
     * fallback 值兜住 JS 没跑或变量被擦的情况。 */
    height: var(--seo-shrink-h, auto) !important;
    min-height: 0 !important;
    max-height: var(--seo-shrink-h, 70vw) !important}

  /* ---- 8.0h2 脱流导航容器让位 class (JS 打的 · v32.16 OKA-262) ----
   *
   * 病例 hanyatc 模板域: 源站把导航装在 `position:absolute` 的 wrapper 里
   * (PC 靠 z-index 浮在 banner 上)。导航从横排 44px 变成 3 列网格 148px 后
   * wrapper 涨到 355px, 但**脱流不占文档流高度** → 后面 `DIV.clearfix`
   * 仍从 231 开始 → **10 个文本块压在导航上**。
   *
   * ⚠️ 治法只能是「给后面第一个占流兄弟补 margin-top」:
   * · 改 wrapper 的 position → v32.5 明令禁止 (破坏层叠)
   * · 撑高 wrapper → OKA-252q 踩过, **撑高脱流元素完全不改变后续内容位置**
   *
   * `--seo-nav-clear-h` 由 JS `让开脱流导航容器()` 按 wrapper 实测高度写 inline。
   * fallback 0 兜住"变量被擦"的情况 —— 那时退回原样(重叠), 而不是凭空多出空白。 */
  html .seo-nav-clear,
  html.seo-nav-fullwidth .seo-nav-clear {
    margin-top: var(--seo-nav-clear-h, 0px) !important}

  /* ---- 8.0h3 导航原宿主收紧 class (JS 打的 · v32.19 OKA-267) ----
   *
   * 病例 hanyatc 模板域 @430px: 导航被 `搬导航到独立行()` 从 HEADER.top 里挪
   * 出来后, HEADER 仍占着源站给 PC 导航横条留的 **207px**, 而里面真实内容
   * (LOGO + 一行 slogan) 只到 60px。叠上搬出来的导航 148px →
   * banner top=355, **首屏 932px 里 38% 是空的** = 用户报的"移动端很乱"。
   *
   * ⚠️ 跟 `seo-h-shrink` 不是一回事 —— 那条按"铺满主图的宽高比"收轮播容器,
   *    判据要求容器里有铺满的图, header 里只有个小 LOGO 压根不命中。
   * ⚠️ 只压 max-height **不动 height** —— 源站常靠 height 撑背景图/边框,
   *    改 height 会连带塌陷; max-height + overflow:hidden 只裁多余空白。
   * ⚠️ 目标值由 JS 量"内部所有可见元素的最低点"得出 (含 absolute 的角标),
   *    所以不会把微信浮标之类的东西裁掉。
   * fallback `none` 兜住"变量被擦" —— 那时退回原样(留白), 而不是把 header 压没。 */
  html .seo-exhost-shrink,
  html.seo-nav-fullwidth .seo-exhost-shrink {
    max-height: var(--seo-exhost-h, none) !important;
    overflow: hidden !important}

  /* ---- 8.0i 窄容器放开宽度 class (JS 打的 · v32.6 OKA-252g) ----
   * 病例 kunhe818.com 实测 (74 个一字一行里 39 个是这形态):
   *   DIV.layout_column.one_column  cssW="86px"  **float 子数 = 1** (单列!)
   *     └─ DIV.modules  float:left  cssW="86px"
   *          └─ 文字 "產品的應用 產品用於玻璃加工、防…"  w=71  **h=574**
   *   34 处 @86px + 5 处 @143px, class 名就叫 `one_column` —— 源站 PC 栅格的
   *   单列被硬编码成绝对 px, 移动端没有响应式就还是 86px。
   *
   * ⚠️ 跟 `seo-grid-2` 的分界: 那个治"**多列**并排每列太窄" (flex-wrap 多个格子),
   * 这个治"**单列**但整列宽度写死很窄"。判据看 `float 兄弟数`:
   *   1 个 → 单列 → 放开成 100% (本 class)
   *   >= 3 个 → 多列栅格 → 也放开成 100% 让它们竖着叠 (比一字一行强)
   *
   * ⚠️ 必须连 `float:none` 一起写 —— 100% 宽的 float 元素后面的兄弟仍会尝试
   * 浮在它旁边 (浮动不占常规流高度), 结果内容叠在一起。 */
  html .seo-w-full,
  html.seo-nav-fullwidth .seo-w-full {
    width: 100% !important;
    max-width: none !important;
    min-width: 0 !important;
    float: none !important;
    box-sizing: border-box !important;
    /* ⚠️ 横向 margin 必须清 (v32.10 · OKA-252m) —— `width:100%` 的元素带横向
     * margin 一定溢出视口。病例 hanyatc `DIV.hanyatc-news fl ml55` 有
     * `margin-left:55px`, 不清的话放开宽度后右边超出 55px。 */
    margin-left: 0 !important;
    margin-right: 0 !important}/*grid-ztpmujcd5sig*/



  /* 8.1 汉堡按钮全部隐藏 (我方注入的 + 源站自带的常见名)
   * 导航已常显, 汉堡点下去只会把它藏起来, 留着是负体验。
   * ⚠️ 名单跟 _生成JS.py 的 `源站汉堡选择器` 同源 —— 改一处要改两处,
   *    tests/test_seo_cloner_导航网格.py 用正则锁死两边一致。 */
  /* ⚠️ 藏汉堡也是条件的 —— 只有导航真的搬成独立一行 (html.seo-nav-fullwidth)
   * 才藏。搬不动的站 (源站没 <header>) 导航仍在原窄栏里, 这时藏掉汉堡等于
   * 让用户既看不到完整导航、又没法展开, 比不改更糟。 */
  html.seo-nav-fullwidth .seo-mobile-burger,
  html.seo-nav-fullwidth .navs, html.seo-nav-fullwidth .nav_button,
  html.seo-nav-fullwidth .menu-toggle, html.seo-nav-fullwidth .hamburger,
  html.seo-nav-fullwidth .nav-toggle, html.seo-nav-fullwidth .navbar-toggler,
  html.seo-nav-fullwidth .navbar-toggle, html.seo-nav-fullwidth .mobile-menu,
  html.seo-nav-fullwidth .m-nav, html.seo-nav-fullwidth .mnav,
  html.seo-nav-fullwidth [class*="navicon"], html.seo-nav-fullwidth [class*="fa-bars"],
  html.seo-nav-fullwidth [class*="icon-menu"], html.seo-nav-fullwidth [class*="menu-icon"],
  html.seo-nav-fullwidth [class*="menu-btn"], html.seo-nav-fullwidth [class*="nav-btn"],
  html.seo-nav-fullwidth [class*="btn-menu"], html.seo-nav-fullwidth [class*="burger"] {
    display: none !important}

  /* 8.2 导航 ul → 2 列网格 */
  /* 网格化同样只给"已搬成独立一行"的站 —— 见 § 8.0 注释。留在原窄栏的
   * 导航保持源站排布 + 汉堡, 零退化。 */
  /* ⚠️ 这份选择器必须跟 _生成JS.py 的 `_主导航ul()` **完全同源** ——
   * JS 靠它找导航, CSS 靠它上样式。少一个 JS 就会"找到了却没样式":
   * 病例 ygbljx.com 的 ul 是 `UL.navBar.df`(不在 <nav> 里), JS 通过
   * `header ul` 找到它并开了 seo-nav-fullwidth, 但 CSS 少了 `header ul`
   * → 导航仍是源站的 display:flex, 7 项挤在 430px 每项 37px。
   * tests/test_seo_cloner_导航网格.py:test_D_CSS选择器必须覆盖JS选择器 锁死。 */
  html.seo-nav-fullwidth nav ul, html.seo-nav-fullwidth .nav ul,
  html.seo-nav-fullwidth .navbar ul, html.seo-nav-fullwidth .menu ul,
  html.seo-nav-fullwidth .header-nav ul, html.seo-nav-fullwidth .top-nav ul,
  html.seo-nav-fullwidth .navbox ul, html.seo-nav-fullwidth .nav-menu ul,
  html.seo-nav-fullwidth header ul {
    padding: 0 !important;
    margin: 0 !important;
    list-style: none !important;
    display: grid !important;
    /* auto-fit + minmax 而不是写死 repeat(2,1fr) ——
     * 375px 视口下正好排 2 列 (每列约 176px, 对齐樱梦观感);
     * 而当导航躺在**窄容器**里 (病例 sxxwpnc.com: 源站 PC 布局把导航塞进
     * 164px 的栅格列) 时自动降成 1 列, 不会挤成 52.8px 让"网站首页"折成
     * "网站/首页"。写死 2 列就只能靠 JS 逐层拉宽祖先, 实测那样会把
     * ynrgjz.com 的祖先撑到 1200px (视口 3 倍) 有撑破布局的风险,
     * 取舍同 OKA-203「误伤源站=页面崩不可逆, 宁可精确」。
     * ⚠️ `min(140px, 100%)` 里的 min() 不能省 —— minmax 的最小值是**硬下限**,
     * 容器比它还窄时 (sxxwpnc 那个 114px 栅格列) 列宽仍按 140px 算, 溢出 26px
     * 被裁掉。夹一层 min() 后窄容器下退成容器自身宽度, 不溢出。 */
    grid-template-columns: repeat(auto-fit, minmax(min(140px, 100%), 1fr)) !important;
    gap: 8px !important;
    width: 100% !important;
    /* ⚠️ max-width 必须给视口硬上限 —— `width:100%` 在**父容器宽度是 auto**
     * (内容驱动) 时等于不设限, auto-fit 就会按"能排多少列"一路展开:
     * 实测 ynrgjz.com 顶级导航 7 项排成 7 列 = 735px, 再把祖先
     * `.nav_r.bj` 撑到 1200px (视口 3.2 倍), 导航整块溢出屏幕右侧。 */
    max-width: 100vw !important;
    box-sizing: border-box !important;
    float: none !important;
    height: auto !important}

  /* 8.2b clearfix 伪元素不占 grid 格 (v32.9 · OKA-252l)
   * ────────────────────────────────────────────────────────
   * `display:grid` 之后, ul 自己的 `::before` / `::after` 会**各自变成一个
   * grid item**, 把第 1 格 (有时还有最后 1 格) 占掉。
   * 病例 dgsths.com 的 `<ul class="clearfix">`: 老式 clearfix 写法
   * `.clearfix::before { content:""; display:table }` —— 实测 8 个 li
   * 排出来第 1 行**只有右列的「网站首页」, 左格是空的**, 之后才每行 2 个。
   * clearfix 是国内 CMS 的标配 (源站这个 ul、它的父 div 全带), 所以这不是
   * 单站问题。
   * ⚠️ 只清导航 ul 自己的伪元素 —— **不碰 li 的**: `li::after` 常被用来画
   *    分隔竖线 / 小箭头, 一起清掉会掉视觉元素 (而它在 grid 里是 li 的子级,
   *    压根不占 ul 的格, 本来就没问题)。 */
  html.seo-nav-fullwidth nav ul::before, html.seo-nav-fullwidth nav ul::after,
  html.seo-nav-fullwidth .nav ul::before, html.seo-nav-fullwidth .nav ul::after,
  html.seo-nav-fullwidth .navbar ul::before, html.seo-nav-fullwidth .navbar ul::after,
  html.seo-nav-fullwidth .menu ul::before, html.seo-nav-fullwidth .menu ul::after,
  html.seo-nav-fullwidth .header-nav ul::before, html.seo-nav-fullwidth .header-nav ul::after,
  html.seo-nav-fullwidth .top-nav ul::before, html.seo-nav-fullwidth .top-nav ul::after,
  html.seo-nav-fullwidth .navbox ul::before, html.seo-nav-fullwidth .navbox ul::after,
  html.seo-nav-fullwidth .nav-menu ul::before, html.seo-nav-fullwidth .nav-menu ul::after,
  html.seo-nav-fullwidth header ul::before, html.seo-nav-fullwidth header ul::after {
    display: none !important;
    content: none !important}

  /* 8.3 二级/三级 ul 移动端隐藏
   * 特异性 (0,0,3) > 上面那条 (0,0,2), 所以能盖住。
   * 病例 ynrgjz.com: 顶级 7 项 + 二级 13 项 = 20 项, 全铺网格要 10 行,
   * 又变成"撑满整屏"。蜘蛛读 HTML 不受 display 影响, href 照样抓得到;
   * 真人从一级页面进二级, 跟樱梦 (只有顶级 5 项) 的形态一致。
   *
   * ⚠️ **这条只管 `ul` 载体, 绝不能顺手把 `dl` 也加进来** (v32.18 · OKA-288)
   *   —— 两者的展开时机完全不同, 治法相反, 见下面 § 8.3b:
   *   · `ul` 二级是**常驻在 DOM 里跟着网格一起铺开**的 → 藏掉才不撑满屏
   *   · `dl` 二级默认就是 `display:none`, **靠源站 JS 点击才展开** →
   *     再加一条 `display:none !important` 等于把展开功能焊死,
   *     用户点导航"一点反应也没有" (v32.17 就这么错过一次) */
  html.seo-nav-fullwidth nav li ul, html.seo-nav-fullwidth .nav li ul,
  html.seo-nav-fullwidth .navbar li ul, html.seo-nav-fullwidth .menu li ul,
  html.seo-nav-fullwidth .header-nav li ul, html.seo-nav-fullwidth .top-nav li ul,
  html.seo-nav-fullwidth .navbox li ul, html.seo-nav-fullwidth .nav-menu li ul,
  html.seo-nav-fullwidth header li ul {
    display: none !important}

  /* 8.3c 二级子菜单**可展开** (手风琴) (v32.23 · 2026-08-02 OKA-301)
   * ────────────────────────────────────────────────────────
   * 病例 qdrx999.com: 主导航"新闻動態"下有二级 ol.ol-list (公司新闻/行業新闻),
   * PC hover 展开, 移动端被**源站 CSS** `.menu .ol-list{display:none}` 藏死。
   * 用户要移动端也能看到分层 → JS `二级菜单可展开()` 给含二级的一级 li 打
   * `data-seo-has-sub` + 加箭头钮, 点箭头 toggle `seo-sub-open`。
   *
   * 这里定义三态 (优先级/特异性都要压过 §8.3 的 `li ul{display:none}` 和
   * 源站的 `.menu .ol-list{display:none}`):
   *   · 含二级的一级 li: relative 定位 (给箭头绝对定位用) + 箭头
   *   · 二级默认**收起** (max-height:0 + overflow:hidden, 用 max-height 过渡)
   *   · `.seo-sub-open` 时二级**展开** (max-height 放大 + display:block)
   * ⚠️ 用 `data-seo-has-sub` 限定 —— 只作用于 JS 确认有二级的项,3,3),
   *   压过源站 `.menu .ol-list` (0,2,0) 和 §8.3 `nav li ul` (0,1{
    position: relative !important}
  /* ⚠️ 箭头必须显式清掉背景/边框 —— 源站给导航里的 `span` 常有深色底
   *   (PC 悬浮态遗留){
    display: inline-block !important;
    width: 26px !important; height: 26px !important;
    position: absolute !important; top: 3px !important; right: 1px !important;
    cursor: pointer !important; z-index: 3 !important;
    background: transparent !important; background-image: none !important;
    border: 0 !important; box-shadow: none !important;
    font-size: 0 !important; line-height: 0 !important}
  /* 二级项样式 (缩进 + 浅底{
    display: block !important; width: 100% !important; float: none !important;
    list-style: none !important}

  /* 8.3b 二级 dl 下拉 · 浅色卡片化 (v32.18 · 2026-08-02 OKA-288)
   * 老式 CMS 用 `<dl><dd>` 做下拉, 默认 `display:none`, 源站 JS 点击才展开
   * —— **这个展开行为是用户要的, 必须保留**, 只治它的配色。
   *
   * 病例 hbmdjj.com: 源站给 dl 的是 PC 悬浮下拉的 `rgba(30,30,30,0.9)`
   * 深色底, 而 dd 里的 a 是 `#333` 深灰字 —— 深色压深色, 展开后是一块
   * **连字都看不见的黑块**。用户原话「点击展开以后里面是黑色的」。
   * 生产实测 seo-f 83 个站有 **37 个 (44.6%)** 的 li 内含 dl。
   *
   * ⚠️ **判据必须是 `li dl` 不能是 `nav dl`** —— 内容区拿 `<dl>` 做产品/
   *   新闻列表的源站很多, 限定在导航项内部才不误伤。
   * ⚠️ **不写 `display`** —— 展开与否归源站 JS 管, 我们只在它展开时提供配色。
   *   写死 block 会让所有二级常驻展开 (退化成 § 8.3 治的那个"撑满屏")。
   * ⚠️ `position:static` 是有意的 —— 源站那套 absolute 悬浮定位在 430px
   *   窄屏会溢出视口, 改成占文档流的手风琴才是移动端惯例 (下面的格子
   *   被往下推是正常行为, 不是布局错乱)。 */
  html.seo-nav-fullwidth nav li dl, html.seo-nav-fullwidth .nav li dl,
  html.seo-nav-fullwidth .navbar li dl, html.seo-nav-fullwidth .menu li dl,
  html.seo-nav-fullwidth .header-nav li dl, html.seo-nav-fullwidth .top-nav li dl,
  html.seo-nav-fullwidth .navbox li dl, html.seo-nav-fullwidth .nav-menu li dl,
  html.seo-nav-fullwidth header li dl {
    position: static !important;
    width: auto !important;
    min-width: 0 !important;
    background: #fff !important;
    border: 1px solid rgba(30, 136, 229, 0.18) !important;
    border-radius: 8px !important;
    margin: 4px 0 0 0 !important;
    padding: 4px !important;
    box-shadow: none !important}
  html.seo-nav-fullwidth nav li dl dd, html.seo-nav-fullwidth .nav li dl dd,
  html.seo-nav-fullwidth .navbar li dl dd, html.seo-nav-fullwidth .menu li dl dd,
  html.seo-nav-fullwidth .header-nav li dl dd, html.seo-nav-fullwidth .top-nav li dl dd,
  html.seo-nav-fullwidth .navbox li dl dd, html.seo-nav-fullwidth .nav-menu li dl dd,
  html.seo-nav-fullwidth header li dl dd {
    margin: 0 !important;
    padding: 0 !important;
    border: none !important;
    background: transparent !important;
    float: none !important;
    width: auto !important}
  html.seo-nav-fullwidth nav li dl a, html.seo-nav-fullwidth .nav li dl a,
  html.seo-nav-fullwidth .navbar li dl a, html.seo-nav-fullwidth .menu li dl a,
  html.seo-nav-fullwidth .header-nav li dl a, html.seo-nav-fullwidth .top-nav li dl a,
  html.seo-nav-fullwidth .navbox li dl a, html.seo-nav-fullwidth .nav-menu li dl a,
  html.seo-nav-fullwidth header li dl a {
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    min-height: 38px !important;
    padding: 4px 6px !important;
    margin: 2px 0 !important;
    font-size: 13px !important;
    line-height: 1.3 !important;
    color: #333 !important;
    background: rgba(30, 136, 229, 0.05) !important;
    border-radius: 6px !important;
    text-align: center !important;
    width: auto !important;
    float: none !important;
    border: none !important}

  /* 8.4 grid item · 空项/隐藏项不占格 (樱梦真站就有 <li class="hide">) */
  html.seo-nav-fullwidth nav li, html.seo-nav-fullwidth .nav li,
  html.seo-nav-fullwidth .navbar li, html.seo-nav-fullwidth .menu li,
  html.seo-nav-fullwidth .header-nav li, html.seo-nav-fullwidth .top-nav li,
  html.seo-nav-fullwidth .navbox li, html.seo-nav-fullwidth .nav-menu li,
  html.seo-nav-fullwidth header li {
    display: block !important;
    width: auto !important;
    min-width: 0 !important;
    float: none !important;
    margin: 0 !important;
    padding: 0 !important;
    border-bottom: none !important;
    height: auto !important;
    line-height: normal !important}
  html.seo-nav-fullwidth nav li:empty, html.seo-nav-fullwidth .nav li:empty,
  html.seo-nav-fullwidth .navbar li:empty, html.seo-nav-fullwidth .menu li:empty,
  html.seo-nav-fullwidth nav li.hide, html.seo-nav-fullwidth .nav li.hide,
  html.seo-nav-fullwidth .navbar li.hide, html.seo-nav-fullwidth .menu li.hide {
    display: none !important}{
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    width: 100% !important;
    min-height: 44px !important;
    padding: 10px 6px !important;
    box-sizing: border-box !important;
    line-height: 1.35 !important;
    color: #333 !important;
    text-decoration: none !important;
    font-size: 14px !important;
    text-align: center !important;
    border-radius: 8px !important;
    background: rgba(30,136,229,0.06) !important;
    white-space: normal !important;
    word-break: break-word !important;
    transition: background .2s ease !important}
  html.seo-nav-fullwidth nav li > a:active, html.seo-nav-fullwidth .nav li > a:active,
  html.seo-nav-fullwidth .menu li > a:active {
    background: rgba(30,136,229,0.16) !important}
  html.seo-nav-fullwidth nav li > a.active, html.seo-nav-fullwidth nav li.active > a,
  html.seo-nav-fullwidth .nav li > a.active, html.seo-nav-fullwidth .nav li.active > a,
  html.seo-nav-fullwidth .menu li > a.active, html.seo-nav-fullwidth .menu li.active > a {
    background: rgba(30,136,229,0.2) !important;
    color: #1565c0 !important}

  /* 8.6 导航恒定一排 3 个 · 自动换行 (v32.11 · 2026-07-30 OKA-252n)
   * ────────────────────────────────────────────────────────
   * 用户原话 (第二版, **推翻了同日第一版的"固定 2 排"**):
   *   "一排都是横从左到右 3 个这样排序下去, 自动换行, 如果导航是 7 个分类就自动
   *    换 3 行, 刚才的 2 排是不准确的这样容易挤压, 反正固定是一排 3 个, 这样有
   *    固定的排序后面的字体就不会被挤压"
   *
   * ⚠️ **别改回"按项数反算列数"**: v32.10 那版是 `列数 = ceil(项数/2)` 让排数
   *   恒定 2 —— 6 项 3 列没问题, 但 **10 项变 5 列** (430px 下每列 75px, 4 字
   *   导航名要压到 12px), 12 项更是 6 列 63px/11px。**排数恒定的代价是列宽随
   *   项数缩水**。现在反过来: 列数恒定 3, 排数 = ceil(项数/3) 自由增长,
   *   列宽恒定 131px → **字号恒定 14px, 项数再多都不挤**。
   *     6 项 → 3×2 行 · 7 项 → 3+3+1 共 3 行 · 10 项 → 3+3+3+1 共 4 行
   *
   * 为什么是 3 不是 2: § 8.2 的 auto-fit 在 430px 下恒排 2 列, 6 项要 3 行
   * (实测 kunhe818 ul 高 171px); 3 列只要 2 行 92px, 同样不挤字还省 79px。
   * 3 是"列宽够放 4 字 (131px vs 需要 62px) + 行数够少"的平衡点。
   *
   * ⚠️ **重复 class 提特异性不是笔误** —— `ul.seo-nav-c3.seo-nav-c3` 是 (0,3,2),
   *   而 § 8.2 里 `.navbox ul` / `.nav-menu ul` 那几个变体是 (0,2,2) 跟单写的
   *   `ul.seo-nav-c3` **完全平手**, 平手时只能靠"写在后面"赢 —— 太脆, 谁在
   *   § 8.2 后面再加一条就翻盘。重复 class 是标准的特异性提升写法, 无副作用。
   *
   * ⚠️ **JS 侧只打 class 不写 inline** (用户: "只改移动端的排列, 不动 PC 端") ——
   *   inline style 没有 media query 包裹, PC 用户缩窄窗口时会被写上, 再拉宽
   *   **不会自己撤销**, 导航就被钉成 3 列了。本节整块在
   *   `@media (max-width:768px)` 内, 视口一宽自动失效, PC 端零影响。
   *
   * ⚠️ 字号那条的选择器必须跟 § 8.5 **同源 (含 `li > * > a`)** —— 这类源站常把
   *   a 包一层 div (病例 kunhe818: `<li><div class="navPage"><a>首頁</a></div></li>`),
   *   只写 `li > a` 会让字号在那些站上静默失效。 */
  html.seo-nav-fullwidth ul.seo-nav-c3.seo-nav-c3 {
    /* ⚠️ `display:grid` 这条不能省 (v32.18 · OKA-289) —— 病例 dc1819.com 的导航
     * ul **自己就叫 `class="menu"`** (`<ul class="menu" id="menu-mainmenu">`),
     * 于是它同时命中 § 8.0 的**导航容器**清单 `html.seo-nav-fullwidth .menu`。
     * 特异性 (0,2,1) 压过 § 8.2 `html.seo-nav-fullwidth nav ul` 的 (0,1,2),
     * 把 display 抢成 `flow-root` → 下面那行 grid-template-columns 算得出来却
     * 因为 display 不是 grid 而**静默失效**, 3 列退化成 1 列竖排 (用户报"导航
     * 全竖着排")。本选择器 (0,3,2) > (0,2,1), 在这儿补一次 display 才压得住。
     * ⚠️ 判据来自 CDP `getMatchedStylesForNode` 实测的层叠链, 不是 grep CSS
     *    猜的 —— 同 OKA-258 的教训 (那次 `.box_skitter` 的 left 压根不在 CSS 里)。 */
    display: grid !important;
    grid-template-columns: repeat(3, 1fr) !important}
  html.seo-nav-fullwidth ul.seo-nav-c3.seo-nav-c3 li > a,
  html.seo-nav-fullwidth ul.seo-nav-c3.seo-nav-c3 li > * > a {
    /* 列宽恒定 131px (430px 视口 · ul 410px · gap 8px), 所以字号也恒定 ——
     * 4 字导航名 (關於我們 / 聯系我們) 14px = 56px + 左右 padding 6px = 62px,
     * 离 131px 还差一半, 5-6 字也放得下, 换行是兜底不是常态。 */
    font-size: 14px !important;
    padding: 10px 3px !important}

  /* 8.6b LOGO 独立一行居中 + 导航整行居中 (v32.15 · 2026-08-01 OKA-284)
   * ────────────────────────────────────────────────────────
   * 用户: "还是要好看, 好看代表布局漂亮, 所以 LOGO 居中然后就是导航,
   *        然后几个导航呢, 导航页居中开始自适应大小"
   *
   * 病例 hbmdjj: 源站把 LOGO 做成**导航的一个 `<li class="nav-logo">`**
   * (PC 端 6 项一排 · LOGO 居中第 4 项)。3 列网格换行后它落到第 2 行第 1 格,
   * 而且那格 162px 高把整行撑高, 右边两项文字挤在顶部 —— 实测
   * `li3 "" 131x162` vs `li0 "網站首頁" 131x46`。
   *
   * 樱梦对照 (94 站实测 · 2026-08-01): LOGO 居中只有 25%, 而且是 LOGO 本身
   * 宽 400px 自然填满, 樱梦并没有主动做这件事。所以这条**不是抄樱梦**,
   * 是我方主动做得比它整齐 —— 我们注入适配器, 它不注入, 我们能统一它做不到。
   *
   * ⚠️ 三条属性缺一不可:
   *   · `grid-column: 1/-1` —— 占满整行, 否则 LOGO 只占一格右边留空
   *   · `justify-self: center` —— 在那一整行里水平居中
   *   · `order: -1` —— **排到所有导航项之前**, 兑现"LOGO 然后导航"的顺序;
   *     不加的话它还在原位 (源站第 4 项) 只是变成独占一行, 顺序还是错的
   * ⚠️ 卡片样式要清掉 —— § 8.5 给 li 打了圆角背景/min-height:44px,
   *   套在 LOGO 上会出现一个包着图片的灰框。 */
  html.seo-nav-fullwidth ul li.seo-nav-logo-row,
  html.seo-nav-fullwidth ul.seo-nav-c3.seo-nav-c3 li.seo-nav-logo-row {
    grid-column: 1 / -1 !important;
    justify-self: center !important;
    order: -1 !important;
    background: none !important;
    border: none !important;
    box-shadow: none !important;
    min-height: 0 !important;
    padding: 6px 0 10px !important;
    text-align: center !important}
  html.seo-nav-fullwidth ul li.seo-nav-logo-row > a,
  html.seo-nav-fullwidth ul li.seo-nav-logo-row > * > a {
    /* LOGO 那格不参与 § 8.6 的字号/padding 规则 */
    padding: 0 !important;
    display: inline-block !important;
    background: none !important}
  html.seo-nav-fullwidth ul li.seo-nav-logo-row img {
    /* 高度封顶避免超大 LOGO 把首屏占满 —— 实测樱梦 LOGO 中位高 45-98px */
    max-height: 60px !important;
    width: auto !important;
    max-width: 70vw !important;
    display: block !important;
    margin: 0 auto !important}

  /* 8.6c 导航区统一白底 + 隐藏重复 LOGO (v32.16 · 2026-08-01 OKA-286)
   * ────────────────────────────────────────────────────────
   * 用户: "统一白色底"
   *
   * 病例 hbmdjj: 源站 PC 版把导航做成 `nav.nav { background: rgba(0,0,0,.95) }`
   * **深色半透明条压在 banner 图上** (视觉上是"图片上的蒙层黑条")。源站移动端
   * 用汉堡把导航整个藏起来, 那个黑背景从没显形。
   *
   * 而我方为 SEO **不用汉堡** (导航藏在 display:none 里, 蜘蛛的内链权重传递
   * 大打折扣 —— 樱梦 94 站实测也只有 6% 用汉堡), 把导航铺开 → 黑背景露出来了,
   * 且它下面没有 banner 图垫底, 变成一整片纯黑。
   *
   * ⚠️ 判据按**实测亮度**不按 class 名: 遍历导航祖先 (最多 4 层), 算
   *   `(R*299 + G*587 + B*114) / 1000 < 128` 且 `alpha > 0.1` 才转白。
   *   透明的 (α=0) 和本来就是白的 (亮度 255) 都跳过 —— 实测 hbmdjj 三层祖先
   *   只有 `NAV.nav` 命中, `DIV.container`(α=0) 和 `HEADER`(白) 正确跳过。
   *
   * ⚠️ **文字色必须一起转** —— 深色背景上的 LOGO/文字通常是白色的, 只转背景
   *   会让它们在白底上隐形。 */
  html.seo-nav-fullwidth .seo-nav-light-bg {
    background-color: #fff !important;
    background-image: none !important}
  html.seo-nav-fullwidth .seo-nav-light-bg a,
  html.seo-nav-fullwidth .seo-nav-light-bg li {
    color: #333 !important}
  /* ⚠️ 重复 LOGO **不用 CSS 隐藏, 由 JS 直接 remove()** (用户 2026-08-01:
   *   "重复的 LOGO 就删除了, 不要隐藏, 保持代码的干净")。见 `_生成JS.py`
   *   的 `删重复LOGO()` —— display:none 会在 DOM 里留个隐形节点, 移除才干净。 */

  /* 导航整体居中 —— grid 最后一行不满时默认**靠左**, 3 项排 3 列时看不出来,
   * 但 4/5/7/8 项就会在最后一行留出空格子, 视觉上导航偏向左边。
   * `justify-content: center` 让每一行 (含不满的那行) 都居中。
   * ⚠️ 它跟 `grid-template-columns: repeat(3,1fr)` 不冲突: 1fr 已经吃满宽度时
   *   居中是空操作, 只有列宽被 max-content 限制住才显形 —— 所以这条是**兜底**,
   *   不会改变正常 3 列站的现状 (实测 kunhe818 改前改后列宽都是 131px)。 */
  html.seo-nav-fullwidth ul.seo-nav-c3.seo-nav-c3 {
    justify-content: center !important;
    justify-items: stretch !important}

  /* 8.7 X 词 h1 让开源站吸顶条 (v32.14 · 2026-07-30 OKA-252r)
   * ────────────────────────────────────────────────────────
   * 用户: "移动端这个品牌 LOGO 怎么被挡住了, 然后往下拉动时这个品牌 LOGO 才出来"
   *
   * 病例 www.kunhe818.com: 我方 X 词 h1 的 inline 带 `background:#fff` +
   * `z-index:2147483647` (OKA-256 为压过源站 `#wrapper{z-index:20000}` 调的),
   * 430x220 坐在 top:0 → 把源站吸顶条 (fixed · z:1001 · 高 50px) **整个盖住**,
   * LOGO 看不见; 下拉后 h1 滚走 fixed 条才露出来。
   *
   * 修法不是降 z-index (那会让 X 词反过来被源站压住, 撤销 OKA-256 的成果),
   * 而是给 h1 补一个等于吸顶条高度的 margin-top, 让它从吸顶条**下面**开始。
   *
   * ⚠️ 值由 JS 算 (各站吸顶条高度不同) 但**用 CSS 变量传, 不写 margin inline** ——
   *   inline 没有 media query 包裹, PC 端缩窄窗口后会残留 (同 § 8.6 那条)。
   *   本节在 `@media (max-width:768px)` 内, 视口一宽自动失效。
   * ⚠️ `!important` 不能省 —— h1 的 inline 里有 `margin: 0`(非 !important),
   *   CSS 的 !important 才盖得住 (实测 marginTop 0px → 50px)。 */
  html .seo-h1-offset,
  html.seo-nav-fullwidth .seo-h1-offset {
    margin-top: var(--seo-h1-offset, 0px) !important}

  /* ---- 8.7b 无 top 的 fixed 吸顶条拉回页顶 (v32.15 · OKA-271g) ----
   * 病例 www.hanyatc.com: `#headtot{position:fixed;z-index:999}` **没写 top**,
   * 而 CSS 规范里 `top:auto` 的 fixed 元素停在它**在文档流中的静态位置** ——
   * 反审注入的 X 词 h1 (高 264px, 排在它前面) 把那个位置顶下去了半屏,
   * 于是导航条和 LOGO 悬在产品图上面, 下拉时看着像"跟着滚"。
   * 模板域没有 X 词 h1 所以静态位置是 0, 一直正常 —— 这个对照面证明**源站
   * 本意就是贴顶**, 补 top:0 是还原意图不是改变它。
   *
   * ⚠️ `left/right` 一起写死 —— top:auto 的 fixed 元素同理会继承静态水平位置,
   *   只补 top 可能留下水平偏移 (实测 hanyatc 的 left 恰好是 0, 但别赌)。
   * ⚠️ 判据在 JS 里 (形态: 通栏 + 上半屏 + 高度 <= 视口 30% + 无 fixed 祖先),
   *   这里只负责落地, 见 `_生成JS.py:修正无top吸顶条()`。 */
  html body .seo-fixed-top0 {
    top: 0 !important;
    left: 0 !important;
    right: 0 !important}

  /* ---- 9. Logo ---- */
  header, .header, #header, .top, .topbar, .h-top {
    width: 100% !important;
    padding: 8px 12px !important;
    box-sizing: border-box !important;
    text-align: center !important;
    background: #fff !important;
    border-bottom: 1px solid #f0f0f0 !important}
  .logo, .h-logo, .brand, .brand-logo, #logo, .site-logo {
    display: block !important;
    max-height: 50px !important;
    text-align: center !important;
    padding: 4px 0 !important}
  .logo img, .h-logo img, .brand img, #logo img, .site-logo img {
    max-height: 44px !important;
    width: auto !important;
    display: inline-block !important}

  /* ---- 10. Banner / Swiper / Carousel ---- */
  /* ⚠️ **这里拆成两组是必须的** (v32.7 · 2026-07-30 OKA-252i) ——
   * 老版本把 `.swiper` / `.swiper-container` / `.carousel` / `.slider` / `.slide`
   * 跟普通 banner 容器写在同一条里, 一起给了 `height:auto` + `position:relative`。
   *
   * 病例 kunhe818.com "移动端没有企业首页封面" 实测 (Baiduspider UA · 430×932):
   *   DIV.banner_frame                     430x230
   *     IMG.first_img                      430x146  opacity:0 z-index:-1  ← 源站故意藏的占位图
   *     DIV.padding_bottom_swiper_frame    430x230  padding-bottom:229px  ← 用 pb 撑比例高度
   *       DIV.swiper-container             430x**0**  height:0  position:relative
   *         DIV.swiper-wrapper             430x**0**  height:100%
   *           DIV.swiper-slide             430x**0**  height:100% + background-image
   *   → 用户看到 230px 纯白空白 (`elementsFromPoint` 那点最上层是 padding 空盒,
   *     IMG 因 opacity:0 压根不在堆叠里)
   *
   * 源站的高度机制是「父用 `padding-bottom:%` 撑比例高 + swiper-container
   * `position:absolute; height:100%` 填满」。我方两条 `!important` **同时覆盖了
   * 这两个关键属性**: `height:auto` 干掉 `height:100%`, `position:relative` 干掉
   * `position:absolute` → slide 的 `height:100%` 指向 auto 父 → **循环依赖全塌 0**。
   *
   * 浏览器实证 (注入 `position:absolute; height:100%` 后):
   *   swiper-container 0 → **230px** · wrapper 0 → **230px** · slide 0 → **230px**
   *
   * ⚠️ 修法是**摘出去而不是改成 absolute** —— 大多数站的 swiper-container 本来就该
   * 是 relative + 显式高度, 我方硬写 absolute 会把那些站反过来搞坏。库容器的
   * position/height 交给库和源站 CSS 自己管, 我方**只夹上限**就够了
   * (`max-height` 对 `height:100%` 填 230px 的场景无影响: 230 < 258)。 */

  /* 10a · 普通 banner 容器 (非轮播库) —— 可以放开高度 */
  .banner, .index-banner, .home-banner, .top-banner, .head-banner {
    width: 100% !important;
    height: auto !important;
    max-height: 60vw !important;
    overflow: hidden !important;
    position: relative !important}

  /* 10b · 轮播库容器 —— **不许动 height / position**, 只夹上限 */
  .swiper, .swiper-container, .carousel, .slider, .slide,
  .slick-slider, .flexslider, .owl-carousel {
    width: 100% !important;
    max-height: 60vw !important;
    overflow: hidden !important}

  .banner img, .swiper img, .carousel img, .slider img,
  .index-banner img, .top-banner img {
    width: 100% !important;
    height: 100% !important;
    object-fit: cover !important}
  .swiper-slide, .carousel-item, .slick-slide {
    width: 100% !important;
    flex-shrink: 0 !important}

  /* ---- 11. 多列栅格降级 ---- */
  .col, .column,
  [class*="col-md-"], [class*="col-lg-"], [class*="col-xs-"], [class*="col-sm-"],
  .grid-item, .row > div,
  .left, .right, .sidebar, .aside, .side-bar,
  .main-left, .main-right, .content-left, .content-right {
    width: 100% !important;
    max-width: 100% !important;
    float: none !important;
    margin-left: 0 !important;
    margin-right: 0 !important;
    padding-left: 0 !important;
    padding-right: 0 !important;
    clear: both !important}
  .row { display: block !important; margin: 0 !important}

  /* ---- 12. 卡片 / 列表 / 产品网格 ---- */
  .card, .product, .product-card, .case, .case-card, .news-item,
  .news-card, .article-card, .item, .list-item, .grid-item,
  .product-list > li, .news-list > li, .case-list > li {
    width: 100% !important;
    max-width: 100% !important;
    box-sizing: border-box !important;
    margin: 0 0 12px !important;
    padding: 12px !important;
    background: #fff !important;
    border: 1px solid #eee !important;
    border-radius: 8px !important;
    box-shadow: 0 1px 3px rgba(0,0,0,0.04) !important;
    overflow: hidden !important}
  .card img, .product img, .news-item img, .case img,
  .product-card img, .case-card img, .news-card img {
    width: 100% !important;
    max-height: 56vw !important;
    object-fit: cover !important;
    border-radius: 6px !important;
    margin-bottom: 8px !important}
  .card .title, .card h3, .product .title, .product h3,
  .news-item .title, .news-item h3 {
    font-size: 15px !important;
    line-height: 1.4 !important;
    color: #222 !important;
    margin: 4px 0 !important;
    overflow: hidden;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical}
  .card .desc, .news-item .desc, .product .desc {
    font-size: 13px !important;
    color: #777 !important;
    line-height: 1.6 !important;
    margin: 4px 0 0 !important;
    overflow: hidden;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical}

  /* ---- 13. PC-only 元素隐藏 ---- */
  .pc-only, .desktop-only, .hidden-xs, .hidden-sm,
  .visible-md, .visible-lg, .sidebar-pc,
  .header-pc, .footer-pc, .nav-pc {
    display: none !important}
  .mobile-only, .visible-xs, .visible-sm {
    display: block !important}

  /* ---- 14. footer ---- */
  footer, .footer, #footer {
    text-align: center !important;
    padding: 20px 12px !important;
    background: #2c2c2c !important;
    color: #b0b0b0 !important;
    font-size: 13px !important;
    line-height: 1.7 !important}
  footer a, .footer a { color: #b0b0b0 !important}
  footer .col, .footer .col, footer ul, .footer ul {
    width: 100% !important;
    text-align: center !important;
    display: block !important;
    margin: 0 0 12px !important;
    padding: 0 !important;
    list-style: none !important}
  footer h3, .footer h3, footer h4, .footer h4 {
    font-size: 14px !important;
    color: #fff !important;
    margin: 12px 0 6px !important}
  footer img, .footer img { max-width: 120px !important}

  /* ---- 15. 弹窗 / modal 全屏 ---- */
  .modal, .popup, .dialog, .overlay-content, .layer, .layui-layer {
    width: 94% !important;
    max-width: 100% !important;
    margin: 0 auto !important;
    border-radius: 10px !important;
    left: 3% !important;
    transform: none !important}
  .modal-content, .popup-content { padding: 16px !important}

  /* ---- 16. 文本断行 ---- */
  .text, article, p, li, dd, td, span {
    word-wrap: break-word !important;
    overflow-wrap: break-word !important;
    word-break: break-word !important}

  /* ---- 17. 视频自适应 ---- */
  video, iframe {
    max-width: 100% !important;
    height: auto !important}
  .video-wrap, .video-container {
    position: relative !important;
    padding-bottom: 56.25% !important;
    height: 0 !important;
    overflow: hidden !important}
  .video-wrap iframe, .video-wrap video,
  .video-container iframe, .video-container video {
    position: absolute !important;
    inset: 0 !important;
    width: 100% !important;
    height: 100% !important}

  /* ---- 18. 浮动联系按钮区 (右下角) ---- */
  .right-tools, .float-tools, .side-bar-fixed, .right-fixed,
  .pop-tools, .float-bar, .quick-link, .floating, .fixed-tools {
    right: 4px !important;
    bottom: 70px !important;
    transform: scale(0.8);
    transform-origin: right bottom}
  .scroll-top, .back-to-top, .gotop {
    right: 8px !important;
    bottom: 70px !important;
    width: 44px !important;
    height: 44px !important;
    line-height: 44px !important;
    font-size: 18px !important;
    border-radius: 50% !important}

  /* ---- 19. 底部固定 tabbar (本模块 JS 注入的 5 按钮) ---- */
  .seo-mobile-tabbar {
    display: flex !important;
    position: fixed !important;
    bottom: 0;
    left: 0;
    right: 0;
    height: 56px;
    background: #fff;
    border-top: 1px solid #e0e0e0;
    box-shadow: 0 -2px 12px rgba(0,0,0,0.08);
    z-index: 9999;
    padding: 4px 0}
  .seo-mobile-tabbar a {
    flex: 1;
    display: flex !important;
    flex-direction: column !important;
    align-items: center !important;
    justify-content: center !important;
    text-decoration: none !important;
    color: #666 !important;
    font-size: 11px !important;
    padding: 0 !important;
    border: none !important;
    background: transparent !important}
  .seo-mobile-tabbar a:active { background: #f5f9ff !important}
  .seo-mobile-tabbar .seo-mobile-icon {
    font-size: 20px;
    line-height: 24px;
    margin-bottom: 2px}
  .seo-mobile-tabbar .seo-mobile-call {
    color: #fff !important;
    background: linear-gradient(135deg, #43a047, #2e7d32) !important;
    border-radius: 50% !important;
    width: 48px !important;
    height: 48px !important;
    margin-top: -16px !important;
    margin-bottom: -4px !important;
    box-shadow: 0 2px 8px rgba(67,160,71,0.4) !important;
    flex: 0 0 48px !important}
  .seo-mobile-tabbar .seo-mobile-call .seo-mobile-icon { margin: 0 !important}
  .seo-mobile-tabbar .seo-mobile-call-label {
    color: #43a047 !important;
    margin-top: 2px}

  /* ---- 20. 滚动条美化 (移动端通常隐藏) ---- */
  ::-webkit-scrollbar { width: 0; height: 0; background: transparent}

  /* ---- 21. 面包屑导航 · v30.9(2026-07-25) 强制隐藏 ---- */
  /* 用户诉求: 顶部蓝底 "首页" 面包屑不该显示 · JSON-LD 已在 head · SEO 保留
   * inline style="display:none" 被源 CSS 覆盖 · 用 html body 前缀提高优先级
   */
  html body .breadcrumb,
  html body nav.breadcrumb,
  html body .crumb,
  html body .position,
  html body .nav-position,
  html body .location {
    display: none !important}
  .breadcrumb a, .crumb a, .position a, .location a {
    color: #1e88e5 !important;
    text-decoration: none !important}
  .breadcrumb li, .crumb li {
    display: inline-block !important;
    margin-right: 4px !important}
  .breadcrumb li::after, .crumb li::after {
    content: "›";
    margin-left: 4px;
    color: #ccc}
  .breadcrumb li:last-child::after, .crumb li:last-child::after { content: ""}

  /* ---- 22. 分页器 ---- */
  .pagination, .pages, .page-list, .pager {
    text-align: center !important;
    padding: 14px 8px !important;
    overflow-x: auto !important;
    white-space: nowrap !important;
    -webkit-overflow-scrolling: touch !important}
  .pagination a, .pagination span, .pages a, .pages span,
  .page-list a, .pager a, .pager span {
    display: inline-block !important;
    min-width: 36px !important;
    height: 36px !important;
    line-height: 34px !important;
    padding: 0 10px !important;
    margin: 0 2px !important;
    border: 1px solid #ddd !important;
    border-radius: 4px !important;
    color: #555 !important;
    background: #fff !important;
    text-decoration: none !important;
    font-size: 14px !important}
  .pagination .current, .pagination .active, .pages .current,
  .pages .active, .pager .current, .pager .active {
    background: #1e88e5 !important;
    color: #fff !important;
    border-color: #1e88e5 !important}

  /* ---- 23. 文章/新闻详情页 ---- */
  .article, .news-detail, .article-content, .post-content,
  .content-detail, .detail-content, .news-content {
    padding: 12px !important;
    background: #fff !important;
    font-size: 15px !important;
    line-height: 1.8 !important;
    color: #333 !important}
  .article-title, .news-title, .post-title, .detail-title {
    font-size: 19px !important;
    font-weight: 600 !important;
    line-height: 1.4 !important;
    margin: 12px 0 8px !important;
    color: #222 !important}
  .article-meta, .news-meta, .post-meta, .detail-meta {
    font-size: 12px !important;
    color: #999 !important;
    margin-bottom: 16px !important;
    padding-bottom: 12px !important;
    border-bottom: 1px solid #eee !important}
  .article p, .news-detail p, .article-content p, .post-content p {
    margin: 0 0 14px !important;
    text-indent: 2em !important}
  .article img, .news-detail img, .article-content img, .post-content img {
    max-width: 100% !important;
    height: auto !important;
    display: block !important;
    margin: 10px auto !important;
    border-radius: 4px !important}

  /* ---- 24. 产品详情页 (大图 + 缩略图列表) ---- */
  .product-detail, .product-info, .goods-detail {
    padding: 12px !important;
    background: #fff !important}
  .product-gallery, .product-images, .goods-gallery {
    width: 100% !important;
    margin-bottom: 12px !important}
  .product-gallery .main-img, .product-images .big-img {
    width: 100% !important;
    max-height: 80vw !important;
    object-fit: contain !important;
    background: #f5f5f5 !important;
    border-radius: 6px !important}
  .product-gallery .thumbs, .product-images .small-imgs {
    display: flex !important;
    gap: 6px !important;
    margin-top: 8px !important;
    overflow-x: auto !important;
    -webkit-overflow-scrolling: touch !important;
    padding-bottom: 4px !important}
  .product-gallery .thumbs img, .product-images .small-imgs img {
    width: 60px !important;
    height: 60px !important;
    object-fit: cover !important;
    border-radius: 4px !important;
    border: 2px solid transparent !important;
    flex-shrink: 0 !important}
  .product-gallery .thumbs img.active, .product-images .small-imgs img.active {
    border-color: #1e88e5 !important}
  .product-title, .goods-title { font-size: 18px !important; font-weight: 600 !important; margin: 8px 0 !important}
  .product-price, .goods-price {
    font-size: 22px !important;
    color: #e53935 !important;
    font-weight: 600 !important;
    margin: 8px 0 !important}

  /* ---- 25. 在线客服浮窗 (右下圆形) ---- */
  .online-service, .kefu, .customer-service, .qqlive, .live-chat {
    position: fixed !important;
    right: 8px !important;
    bottom: 130px !important;
    width: 48px !important;
    height: 48px !important;
    border-radius: 50% !important;
    background: linear-gradient(135deg, #ff7043, #f4511e) !important;
    box-shadow: 0 4px 12px rgba(244,81,30,0.35) !important;
    text-align: center !important;
    line-height: 48px !important;
    color: #fff !important;
    font-size: 22px !important;
    z-index: 9990 !important;
    cursor: pointer !important}
  .online-service::before { content: "💬"}

  /* ---- 26. 二维码图片 (公众号/微信) ---- */
  .qrcode, .qr-code, .ewm, .erweima, .gzh-qrcode {
    max-width: 140px !important;
    height: auto !important;
    margin: 12px auto !important;
    display: block !important;
    padding: 8px !important;
    background: #fff !important;
    border: 1px solid #eee !important;
    border-radius: 6px !important}

  /* ---- 27. 地图容器 ---- */
  #map, .map, .map-container, .baidu-map, .amap, #BMap_*,
  .map-wrap, .iw-content {
    width: 100% !important;
    height: 240px !important;
    margin: 10px 0 !important;
    border-radius: 6px !important;
    overflow: hidden !important}

  /* ---- 28. 联系我们页 ---- */
  .contact-us, .contact-info, .contact-list {
    padding: 12px !important}
  .contact-item {
    display: flex !important;
    align-items: center !important;
    padding: 12px !important;
    background: #fff !important;
    border-radius: 8px !important;
    margin-bottom: 8px !important;
    border: 1px solid #f0f0f0 !important}
  .contact-item .icon, .contact-item i {
    font-size: 22px !important;
    color: #1e88e5 !important;
    margin-right: 12px !important;
    flex-shrink: 0 !important}
  .contact-item .text, .contact-item .info {
    flex: 1 !important;
    font-size: 14px !important;
    color: #444 !important;
    word-break: break-all !important}
  .contact-item .text strong { display: block; color: #888; font-size: 12px; margin-bottom: 2px; font-weight: normal}

  /* ---- 29. 资讯列表/搜索分类 tab ---- */
  .tab, .tabs, .tab-list, .news-tab, .filter-tab, .nav-tab {
    display: flex !important;
    overflow-x: auto !important;
    -webkit-overflow-scrolling: touch !important;
    background: #fff !important;
    border-bottom: 1px solid #eee !important;
    margin-bottom: 12px !important}
  .tab a, .tabs a, .tab-list a, .news-tab a {
    flex-shrink: 0 !important;
    padding: 12px 16px !important;
    color: #555 !important;
    font-size: 14px !important;
    text-decoration: none !important;
    border-bottom: 2px solid transparent !important}
  .tab .active, .tabs .active, .tab-list .active, .news-tab .active {
    color: #1e88e5 !important;
    border-bottom-color: #1e88e5 !important}

  /* ---- 30. 标签 tag ---- */
  .tag, .label, .keyword {
    display: inline-block !important;
    padding: 3px 10px !important;
    margin: 2px 4px 2px 0 !important;
    background: #f0f7ff !important;
    color: #1e88e5 !important;
    border-radius: 4px !important;
    font-size: 12px !important;
    line-height: 1.6 !important;
    text-decoration: none !important}
  .tag.hot, .label.hot { background: #ffebee !important; color: #e53935 !important}
  .tag.new, .label.new { background: #e8f5e9 !important; color: #43a047 !important}

  /* ---- 31. 公司介绍 / about 页 ---- */
  .about-section, .company-intro, .about-content {
    padding: 16px 12px !important;
    background: #fff !important}
  .about-section .title, .company-intro .title {
    font-size: 18px !important;
    font-weight: 600 !important;
    text-align: center !important;
    margin-bottom: 14px !important;
    position: relative !important;
    padding-bottom: 10px !important}
  .about-section .title::after {
    content: "";
    position: absolute;
    bottom: 0;
    left: 50%;
    transform: translateX(-50%);
    width: 40px;
    height: 2px;
    background: #1e88e5}

  /* ---- 32. 数据展示卡 (年限/客户/案例数等数字) ---- */
  .stats, .data-card, .number-card, .achievement {
    display: grid !important;
    grid-template-columns: repeat(auto-fit, minmax(min(140px, 100%), 1fr)) !important;
    gap: 8px !important;
    padding: 12px !important}
  .stats-item, .stat-item, .data-item, .achievement-item {
    text-align: center !important;
    padding: 14px 10px !important;
    background: linear-gradient(135deg, #f5f9ff, #e8f1ff) !important;
    border-radius: 8px !important}
  .stats-item .num, .stat-item .num, .data-item .num,
  .stats-item strong, .achievement-item strong {
    font-size: 24px !important;
    color: #1e88e5 !important;
    font-weight: 600 !important;
    display: block !important;
    line-height: 1.2 !important}
  .stats-item .label, .stat-item .label, .data-item .label {
    font-size: 12px !important;
    color: #888 !important;
    margin-top: 4px !important}

  /* ---- 33. 友情链接 ---- */
  .links, .friend-link, .blogroll {
    padding: 10px 12px !important;
    background: #fafafa !important;
    font-size: 12px !important;
    color: #888 !important;
    line-height: 2 !important}
  .links a, .friend-link a {
    color: #888 !important;
    margin-right: 12px !important;
    text-decoration: none !important}

  /* ---- 34. 备案信息 ---- */
  .icp, .beian, .copyright, .bottom-info {
    text-align: center !important;
    padding: 10px !important;
    font-size: 11px !important;
    color: #888 !important;
    line-height: 1.8 !important;
    background: #2c2c2c !important}

  /* ---- 35. 动画/过渡降级 (低端机省电) ---- */
  @media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
      animation-duration: 0.01ms !important;
      transition-duration: 0.01ms !important}
  }

}  /* end @media max-width: 768px */


/* ============================================================
   ★ 小屏幕加强 (≤480px 真手机)
   ============================================================ */
@media screen and (max-width: 480px) {
  body { font-size: 15px !important}
  /* v85(2026-07-27 OKA-210) 同 768px 档 · 放行带 inline style 的 X 词 h1 */
  h1:not([style]), .h1 { font-size: 20px !important}
  h2, .h2 { font-size: 17px !important}
  h3, .h3 { font-size: 15px !important}
  .container, .wrap, .wrapper, .main, .content {
    padding-left: 10px !important;
    padding-right: 10px !important}
  /* 卡片间距压缩 */
  .card, .product, .news-item, .case { margin-bottom: 10px !important; padding: 10px !important}
  /* 表单按钮拉满 */
  .form button, form .submit, .form-submit, .form-submit-btn { width: 100% !important}
}


/* ============================================================
   ★ 横屏 (landscape)
   ============================================================ */
@media screen and (max-width: 900px) and (orientation: landscape) {
  body { padding-bottom: 0 !important}
  .seo-mobile-tabbar { display: none !important}
  .banner, .swiper, .carousel { max-height: 50vh !important}
}


/* ============================================================
   ★ 微信浏览器特殊修正 (User-Agent 含 MicroMessenger)
   ★ 用 :root[data-ua-wechat] 通过 JS 标记后命中
   ============================================================ */
:root[data-ua-wechat] body {
  /* 微信顶部隐藏不到, 保留 padding-top 给微信导航条 */
  padding-top: 0 !important}
:root[data-ua-wechat] a[href^="tel:"]::before {
  content: "📞 "}

/* QQ 浏览器修正 */
:root[data-ua-qq] .seo-mobile-tabbar {
  bottom: env(safe-area-inset-bottom, 0)}

/* iOS 安全区域 (iPhone X 及以后) */
.seo-mobile-tabbar {
  padding-bottom: env(safe-area-inset-bottom, 0) !important;
  height: calc(56px + env(safe-area-inset-bottom, 0)) !important}

/* ============================================================
   ★ v30.5(2026-07-25) 移动端标准商业站优化 (5 项)
   修 guangdongzuyi.com 病例: header 676px 撑爆首屏, nav 7 项全展开, 相关推荐重复 5 段
   用户诉求: header 60-80px, 汉堡菜单收起, hero 首屏可见, 悬浮 CTA
   ============================================================ */
@media screen and (max-width: 768px) {
  /* 1. header 紧凑 · 从 676px 缩到 ~80px */
  header.header, .header, #header,
  header.head, .head, .top-header, .site-header {
    min-height: auto !important;
    max-height: 80px !important;
    padding: 8px 15px !important;
    position: relative !important;
    z-index: 100 !important;
    overflow: visible !important}
  header.header .logo, .header .logo, .head .logo,
  .logo.fl, .site-logo, .brand {
    max-height: 60px !important;
    line-height: 60px !important;
    display: inline-block !important;
    float: left !important;
    padding: 0 !important}
  header.header .logo img, .header .logo img, .logo.fl img {
    max-height: 44px !important;
    width: auto !important;
    vertical-align: middle !important}

  /* 2. 导航容器 · v32(2026-07-29 OKA-252) 常显网格 · 撤掉 v30.5/v31 的折叠抽屉
   *
   * v30.5(默认隐藏 + 汉堡展开) → v31(JS class 侧滑 260px) → **v32 常显网格**
   * 用户 2026-07-29 原话: "不需要右上那个汉堡折起来"、"导航会自动换行"。
   *
   * 为什么撤掉抽屉是安全的 (不是退回 v30.5 之前的 bug):
   *   v30.5 修的病因是"nav 7 项**竖排**撑爆首屏 676px", 而竖排来自
   *   § 8 那条 `nav li {display:block; width:100%}` — 现在 § 8 已改 2 列网格,
   *   7 项 = 4 行 ≈ 200px, 病因消失, 不需要再靠隐藏来省高度。
   *   v31 修的"展开后全屏白底挡内容"更是抽屉本身带来的问题, 没抽屉就没这事。
   * ⚠️ 别再改回 `display:none + .seo-nav-open`, 会重演本次用户投诉。
   */
  /* ⚠️ 常显名单只放 .navbox / .site-nav —— **不能**把 .navbar-collapse /
   * .nav-collapse / .nav-menu 也塞进来。那三个是 Bootstrap 系"折叠容器"的
   * 惯用名, 源站往往**另有一份移动端抽屉菜单**挂在上面 (默认 display:none,
   * 点汉堡才 .show)。强制显示会让它跟我方网格导航**同时出现**, 页面上叠两份
   * 导航文字 + 一个源站的 × 关闭按钮 (sxxwpnc.com 实测截图)。
   * 这类容器交给 JS 的 `确保导航常显()` 精确判断 —— 它只显示"承载最多导航项
   * 的那条祖先链", 天生隐藏的第二份抽屉不碰。 */
  html body .navbox,
  html body nav.navbox.fl,
  html body .site-nav {
    display: block !important;
    visibility: visible !important;
    position: relative !important;
    top: auto !important;
    right: auto !important;
    left: auto !important;
    bottom: auto !important;
    width: 100% !important;
    max-width: 100% !important;
    height: auto !important;
    float: none !important;
    margin: 0 !important;
    padding: 0 !important;
    background: transparent !important;
    box-shadow: none !important;
    overflow: visible !important;
    z-index: auto !important}
  /* 老 JS 若还在页面里给它加了 .seo-nav-open (存量产物 / 缓存的旧 js),
   * 也不许再变成固定定位的抽屉 — 保持跟常显态一致。 */
  html body .navbox.seo-nav-open,
  html body nav.navbox.fl.seo-nav-open,
  html body.seo-nav-open .navbox,
  html body.seo-nav-open nav.navbox.fl {
    position: relative !important;
    width: 100% !important;
    max-width: 100% !important;
    height: auto !important;
    box-shadow: none !important;
    padding: 0 !important;
    animation: none !important}
  /* 产品页侧栏 .page_navs · 默认文档流挡 banner 下 · 移动端隐藏 */
  html body .page_navs,
  html body nav.page_navs {
    display: none !important}
  /* 顶部 page_top 面包屑条 · 移动端隐藏 */
  html body .page_top,
  html body .page_lj {
    display: none !important}
  /* .navbox 系容器内的 ul/li/a · 跟 § 8 同一套网格量
   * (这里不能省 — 这些选择器特异性比 § 8 高, 不写就还是源站的 PC 排布) */
  html.seo-nav-fullwidth body .navbox .nav,
  html.seo-nav-fullwidth body .navbox ul,
  html.seo-nav-fullwidth body .nav-menu ul,
  html.seo-nav-fullwidth body .navbar-collapse ul {
    display: grid !important;
    grid-template-columns: repeat(auto-fit, minmax(min(140px, 100%), 1fr)) !important;
    gap: 8px !important;
    width: 100% !important;
    max-width: 100vw !important;   /* 同 § 8.2: 100% 在 auto 宽父容器下不设限 */
    float: none !important;
    height: auto !important;
    right: auto !important;
    position: relative !important;
    background: transparent !important;
    padding: 8px 0 !important;
    margin: 0 !important;
    list-style: none !important;
    box-sizing: border-box !important}
  html body .navbox li ul,
  html body .nav-menu li ul {
    display: none !important}
  .navbox .nav li, .navbox ul li, .nav-menu li {
    display: block !important;
    width: auto !important;
    height: auto !important;
    border-bottom: none !important;
    margin: 0 !important;
    padding: 0 !important;
    float: none !important;
    line-height: normal !important}
  .navbox .nav li:empty, .navbox ul li:empty, .nav-menu li:empty,
  .navbox .nav li.hide, .navbox ul li.hide, .nav-menu li.hide {
    display: none !important}
  html.seo-nav-fullwidth .navbox .nav li > a,
  html.seo-nav-fullwidth .navbox ul li > a,
  html.seo-nav-fullwidth .nav-menu li > a {
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    width: 100% !important;
    min-height: 44px !important;
    padding: 10px 6px !important;
    box-sizing: border-box !important;
    line-height: 1.35 !important;
    font-size: 14px !important;
    color: #333 !important;
    text-decoration: none !important;
    text-align: center !important;
    border-radius: 8px !important;
    background: rgba(30,136,229,0.06) !important;
    white-space: normal !important;
    word-break: break-word !important}/*utils-t6aatwdiucqz*/

  /* 3. 相关推荐去重 · 5 段 → 1 段 (SEO 保留 1 段 · 用户体验) */
  section.related-posts:nth-of-type(n+2),
  .related-posts:nth-of-type(n+2),
  section[aria-label="相关推荐"]:nth-of-type(n+2),
  section[class*="related"]:nth-of-type(n+2) {
    display: none !important}

  /* 4. 悬浮 CTA 电话按钮 · v30.8 移除 (用户诉求 · tabbar 已含拨号按钮 · 悬浮多余)
   * 保留兼容: 若 HTML 已生成 .seo-mobile-cta-float · 强制隐藏
   */
  .seo-mobile-cta-float {
    display: none !important}
}

/* ============================================================
   ★ 暗色模式 (用户系统级偏好, 不强制)
   ============================================================ */
@media (prefers-color-scheme: dark) and (max-width: 768px) {
  /* 不动业务主题色, 只调中性色 */
  .seo-mobile-tabbar { background: #1e1e1e; border-top-color: #333}
  .seo-mobile-tabbar a { color: #999 !important}
  .seo-mobile-burger { background: rgba(30,30,30,0.95); border-color: #444}
  .seo-mobile-burger::before { color: #4fc3f7}
}


/* ==========================================================================
   ★ 源站固定宽度自适应覆盖 (读源站 CSS 自动生成, 命中 17 个选择器)
   原理: 源站这些选择器写死了 ≥720px 的 PC 宽度, 手机会横向溢出.
         这里统一压成流式 100%, 补通用名单覆盖不到的非常规 class.
   ========================================================================== */
@media screen and (max-width: 768px) {
  .menu,
  .menu .center,
  .yst ul,
  #nav,
  .nav,
  .about p,
  .about,
  .hf_n,
  .ys1,
  .ys2,
  .sitemap,
  .m2t,
  .main1,
  .synews dl dd,
  .container,
  .media-body,
  .modal-lg {
    width: 100% !important;
    min-width: 0 !important;
    max-width: 100% !important;
    float: none !important;
    margin-left: 0 !important;
    margin-right: 0 !important;
    /* ⚠️ OKA-258 · `left`/`right` 必须跟 `margin-left/right` 成对清
       ────────────────────────────────────────────────────────────
       病例 hanyatc.com: 源站 banner 用**标准 full-bleed 惯用法**居中 ——
         .FrontPublic_slideShow01-d3_c1 #slideshow {
             position:absolute; width:1920px; left:50%; margin-left:-960px}
       `left:50%` 把左边推到父容器中点, `margin-left:-半宽` 再拉回来, 净效果
       是"1920px 宽的图相对父容器居中、两边溢出被 overflow:hidden 裁掉".
       两个属性是**一对**, 少一个就错位.

       上面 `width:1920px` >= 阈值 720 → 这个选择器被 `分析固定宽度选择器`
       收进来, 于是我们把 width 压成 100%、margin-left 清成 0 —— **但没清
       `left`**, 于是 `left:50%` 变成"50% × 430 = 215px", 没有 margin 把它
       拉回来 → 整个 banner 被推到右半屏, 父容器 overflow:hidden 裁掉右边
       215px, 用户看到的是"banner 偏右、左半边空白".
       CDP getMatchedStylesForNode 实测 (移动 430):
         left=215px  margin-left=0px  width=430px  →  x=215  right=645
       补上这两行后: x=215 → 10 (剩的 10px 是父容器自己的 padding-left),
       横向溢出元素 10 → 6.

       为什么可以无条件加 (不做 position 过滤):
         · `position:static` 元素上 `left/right` **本来就无效** → 零影响
         · absolute/fixed 元素的 `left` 值是按 PC 宽度算的, 而这条规则已经把
           width 压成 100% 了, 那个 PC 定位无论如何都不再成立 —— 清掉是对的
       取舍: 少数"absolute + left 是真实定位值"的元素位置会变, 但它们的 width
       已经被本规则改掉了, 原定位早就失效. 宁可修好 full-bleed 这个高频形态.
       CSS 选择器没法按 computed position 过滤, 所以只能无条件加. */
    left: auto !important;
    right: auto !important;
    box-sizing: border-box !important}
}
