/* 云庄主GEO 官网 · 主题样式（租户 10009，slug=yunzz）
 *
 * 这个文件由 TenantRegistryBootstrap 按 slug 自动挂上（/html/css/yunzz.css），
 * 后台【皮肤管理】重新生成配色时会把它当作基准样式表读取 ——
 * 所以 :root 里这 10 个 --xz-* 必须保持"恰好是那 10 个槽位"，
 * 新增的自定义 token 一律用 --zs-* / --yz-* 前缀（SkinThemeRewriter.ExtractPalette 只认 --xz-*，
 * 把新 token 写成 --xz-* 会被塞进不存在的槽位而丢色）。
 *
 * 主色双槽位（2026-10-21 客户拍板：默认「科技蓝」，后台【网站设置】可切「品牌红」）：
 *   槽位一 :root（无属性时生效）= 科技蓝，取值对齐共享层 geosite.css 的原生蓝族
 *     （#1D5FD6 / #1B3FB5 / #E6EFFF / #CFE0FF）。历史「红蓝很杂」的根因就是本站把共享层
 *     按成红、覆写不到的角落漏出共享层的蓝；默认改蓝后漏点与主题同色，杂色自然消失。
 *   槽位二 :root[data-yz-theme="red"] = 品牌红，取自客户 ® 标志原色（230,0,18）。
 *   后台选「品牌红」时 _Layout 输出 <html data-yz-theme="red"> 即整站切换；选「科技蓝」
 *   （默认）不输出属性。特异性 (0,2,0) > (0,1,0)，无需 !important。
 *   WCAG 实测（正文 AA≥4.5 / 大字号 AA-large≥3.0）：
 *     蓝 #1D5FD6：白 5.74 / #F4F8FF 5.39 / #E6EFFF 4.96；蓝深 #1B3FB5：8.66
 *     亮蓝 #4D7DFF（仅 24px/800）：白 3.69、深色带上 4.80
 *     红 #E60012：白 4.80 / #FDF8F8 4.56；红深 #B3121F：6.95
 * ⚠ 仍只此两处声明主色：不要在文件其它位置再追加 :root 覆写 —— 本文件按 link 顺序后于
 *   geosite.css 之外还会被皮肤生成器整份读取，多份 :root 会让「声明的色」和「生效的色」
 *   分家（历史踩过：同时存在蓝/红/尾部蓝覆写三套，后台换肤永远无效）。
 *
 * 视觉语言：浅色底 + 深墨字 + 科技蓝信号色，靠"分区底色 + 卡片栅格"做节奏，
 * 深色只留给首屏收尾带与页脚，保证正文对比度稳定在 AA 以上。
 */
/* ===== 品牌配色双槽位（2026-10-21 客户拍板：默认科技蓝，后台可切品牌红）=====
 * 槽位一（下方 :root，无属性时生效）= 科技蓝 · 站点默认，取值对齐共享层 geosite.css 原生蓝族；
 * 槽位二（:root[data-yz-theme="red"]）= 品牌红，由后台【网站设置】切换后 _Layout 输出
 *   <html data-yz-theme="red"> 触发；选默认的科技蓝时不输出属性。
 * 第三套色未来只需再复制一个 [data-yz-theme="x"] 块 + 租户配置 ThemeSchemes 加一项。
 * ⚠ 全文件仅此两处声明主色，禁止在别处再追加 :root 覆写（历史三套并存事故）。
 */
:root{
  --xz-red:#1D5FD6;            /* 科技蓝（信号色）：对齐共享层 geosite.css 原生深蓝 */
  --xz-red-deep:#1B3FB5;       /* 强调深蓝：小字与渐变暗端 */
  --xz-gold:#123199;           /* 次级强调（眉标类组件留位，禁止回绿色系） */
  --xz-gold-light:#CFE0FF;     /* 只用于深色带上的强调（共享层同款浅蓝） */
  --xz-ink:#101724;
  --xz-ink-soft:#4A5468;       /* 对白底 7.6:1 */
  --xz-cream:#E6EFFF;          /* 浅蓝底（共享层同款 tint） */
  --xz-bg:#F4F8FF;             /* 页面底：共享层同款浅蓝白 */
  --xz-line:rgba(16,23,36,.11);
  --xz-shadow:0 10px 30px rgba(16,23,36,.07);

  /* ↓ 本页专属 token（不参与皮肤槽位映射） */
  --zs-radius:14px;
  --zs-radius-sm:10px;         /* 输入框、小徽标 */
  --zs-radius-lg:22px;         /* 大卡与深色带内的容器 */
  --zs-max:1200px;             /* 首页与内页唯一的容器宽度：页眉 logo、banner、正文、页脚全部同列 */
  /* 左右留白只认这一个值：页眉 logo、banner、正文容器、面包屑、页脚导航必须同列，
     移动端（≤900px）改这个 token 就能整条对齐链一起收窄，不会再出现 logo 与标题差 4px */
  --zs-pad:20px;
  --zs-hero-from:#0A1830;
  --zs-hero-to:#10254D;
  --zs-hero-end:#1B3FB5;
  --zs-header-h:78px;
  --zs-logo-hot:#4D7DFF;        /* logo 渐变亮端：24px/800 大字号下对白底 3.69:1，AA-large 达标 */
  --zs-mesh:rgba(29,95,214,.08);/* 深色带上的网格线 */
  --zs-ring:rgba(var(--yz-tint),.18);/* 卡片 hover 的描边 */
  --zs-glow:0 18px 40px rgba(var(--yz-tint),.16);
  --yz-tint:29,95,214;         /* 半透明底色的 RGB 三元组：换配色只改这一个值 */
  --yz-halo:rgba(29,95,214,.32);/* 首屏右上光斑 */
  --yz-halo-fade:rgba(29,95,214,0);
  --yz-chip-ink:#DCE8FF;       /* 深色带上的小徽标文字 */
  --yz-chip-line:rgba(29,95,214,.5);
  --yz-chip-bg:rgba(29,95,214,.13);
  --yz-soft:#CFE0FF;           /* 共享层 --purple-soft 等浅色 tint 底的本站值 */
  --yz-glow2:rgba(29,95,214,.10);/* 首屏 .glow-two 光斑底色 */
}

/* 槽位二：品牌红（后台【网站设置】切换后由 _Layout 输出 data-yz-theme="red" 触发） */
:root[data-yz-theme="red"]{
  --xz-red:#E60012;            /* 品牌红：客户 ® 标志原色，白底 4.80 / #FDF8F8 4.56 */
  --xz-red-deep:#B3121F;       /* 白底 6.95 */
  --xz-gold:#8C0F1A;
  --xz-gold-light:#FF9AA2;
  --xz-cream:#FFF7F7;
  --xz-bg:#FDF8F8;
  --zs-hero-from:#1A0A0D;
  --zs-hero-to:#3C1017;
  --zs-hero-end:#5A1620;
  --zs-logo-hot:#FF3B47;        /* 白底 3.52，仅 24px/800 用 */
  --zs-mesh:rgba(255,59,71,.07);
  --yz-tint:230,0,18;
  --yz-halo:rgba(255,59,71,.34);
  --yz-halo-fade:rgba(255,59,71,0);
  --yz-chip-ink:#FFE3E5;
  --yz-chip-line:rgba(255,59,71,.5);
  --yz-chip-bg:rgba(255,59,71,.13);
  --yz-soft:#FFE1E4;
  --yz-glow2:rgba(255,59,71,.10);
}

/* ===== 页眉 / 导航（与其它站点同一套类名，_Layout 是共用的）===== */
.xz-header{
  position:sticky;top:0;z-index:1000;
  background:rgba(255,255,255,.95);
  backdrop-filter:saturate(140%) blur(8px);
  border-bottom:1px solid var(--xz-line);
  font-family:"PingFang SC","Microsoft YaHei","Hiragino Sans GB",sans-serif;
}
.xz-header-inner{
  max-width:var(--zs-max);margin:0 auto;padding:0 var(--zs-pad);min-height:var(--zs-header-h);
  display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;row-gap:6px;
}
.xz-logo{display:flex;flex-direction:column;text-decoration:none;line-height:1.15;flex-shrink:0}
.xz-logo-text{font-size:24px;font-weight:800;color:var(--xz-ink);letter-spacing:.5px}
/* 品牌字用渐变裁切（仍是文字，不换成图片）：不支持 background-clip:text 时上面那条深墨色兜底 */
@supports ((-webkit-background-clip:text) or (background-clip:text)){
  .xz-logo-text{
    background-image:linear-gradient(92deg,var(--xz-ink) 0%,var(--xz-red) 46%,var(--zs-logo-hot) 92%);
    -webkit-background-clip:text;background-clip:text;
    -webkit-text-fill-color:transparent;
  }
}
/* 页眉 logo 图（2026-10-21 客户品牌标志出图，来源站点表 Attr3/Attr7）：
   高度固定 + 宽度等比 + contain —— .xz-logo 是 column flex，图片默认会被 flex-shrink 压扁；
   客户标志本身已含品牌名与红线，所以副标题（.xz-logo-en=WebUrl）在本站一律不显示。 */
.xz-logo-img{display:block;flex:none;height:46px;width:auto;max-width:230px;object-fit:contain}
.xz-logo-en{display:none}
.xz-nav{display:flex;align-items:center;flex-wrap:wrap;justify-content:flex-end;column-gap:20px;row-gap:6px;margin-left:auto}
.xz-nav a{
  color:var(--xz-ink);text-decoration:none;font-size:14px;letter-spacing:.3px;
  position:relative;white-space:nowrap;transition:color .2s;
}
.xz-nav a::after{content:"";position:absolute;left:0;bottom:-4px;width:0;height:2px;background:var(--xz-red);transition:width .22s}
.xz-nav a:hover,.xz-nav a.active{color:var(--xz-red)}
.xz-nav a:hover::after{width:100%}
.xz-header-btn{
  display:inline-flex;align-items:center;justify-content:center;margin-left:18px;
  padding:9px 20px;border:1px solid var(--xz-red);border-radius:999px;
  color:var(--xz-red);font-size:14px;text-decoration:none;transition:.2s;flex-shrink:0;white-space:nowrap;
}
.xz-header-btn:hover{background:var(--xz-red);color:#fff}
.xz-menu-toggle{display:none;flex-direction:column;gap:5px;padding:8px;background:transparent;border:0;cursor:pointer}
.xz-menu-toggle span{display:block;width:24px;height:2px;background:var(--xz-ink)}
/* 页眉无纵向内边距，二级面板贴边即可（模板默认 4px） */
.xz-header .xz-nav-item > .xz-subnav{--xz-sub-drop:4px}
/* ===== 页眉断点（2026-10-21，CDP 实测数据说话）=====
 * 14 项导航在 13.5px/12px 下实测宽 1004px，logo 图 148px，合计 1152px；
 * 容器 --zs-max:1200 减左右 20px 内边距 = 1160px 可用 → 只有视口 ≥1200px 才装得下，
 * 恰好 8px 余量。1200 以下若沿用桌面横排，flex-wrap 会把整条导航挤到第二行、
 * 末项「隐私政策」再溢出到第三行（1024 实测页眉 103px、logo 与菜单错行），
 * 所以 901–1199px 直接切抽屉（借用手机那套形态，正文版式不动），不做半吊子两行页眉。
 * 位置必须放在 .xz-nav 基础规则之后，否则同权重被后面的 column-gap:20px 覆盖（已踩）。
 */
@media (min-width:1200px){
  .xz-nav{column-gap:12px}
  .xz-nav a{font-size:13.5px;letter-spacing:0}
}
@media (min-width:901px) and (max-width:1199px){
  :root{--zs-header-h:64px}
  .xz-header-inner{height:64px;min-height:64px;flex-wrap:nowrap}
  .xz-menu-toggle{display:flex;min-width:44px;min-height:44px;align-items:center;justify-content:center}
  .xz-nav{
    position:absolute;top:64px;left:0;right:0;display:none;margin-left:0;
    flex-direction:column;flex-wrap:nowrap;justify-content:flex-start;align-content:flex-start;gap:0;
    padding:8px 16px 18px;background:#0B1220;border-bottom:1px solid rgba(255,255,255,.08);
    max-height:calc(100vh - 64px);max-height:calc(100dvh - 64px);overflow-y:auto;
  }
  .xz-nav.open{display:flex}
  .xz-nav a{color:rgba(255,255,255,.85);width:100%;padding:12px 0;border-bottom:1px solid rgba(255,255,255,.07);font-size:15px}
  .xz-nav a:hover,.xz-nav a.active{color:#fff}
  .xz-nav a::after{display:none}
  .xz-header .xz-nav-item{width:100%;padding-top:12px}
  .xz-header .xz-subnav{position:static;background:transparent;border-radius:0;box-shadow:none;padding:0 0 6px;min-width:0;display:block}
  .xz-header .xz-nav .xz-subnav a{color:rgba(255,255,255,.86);border-bottom:0;padding:8px 0 8px 20px;font-size:14px}
}
/* ===== 页脚（深色收口；导航与页眉同源，联系方式来自站点表）=====
   两个必须记住的坑，改这里前先读：
   1) 模板层 .footer-big / .new-foot 都是 float:left 且没有 clearfix，父级 .v-foot 实测高度 0，
      深色只写在 .v-foot 上等于一个像素都没画 → 白底配白色列标题，字直接看不见。
      所以背景要画在真正有高度的 .footer-big-back 上，并给 .v-foot 补 ::after 清浮动兜底。
   2) 基础模板 inc.min.css 用 .footer-big-eee .footer-left a 这类更深选择器抢字色（#a0a0a0），
      还把每个链接 float:left 撑成整行、.new-foot 的灰是 !important。
      本节一律加 .v-foot 前缀抬权重，个别只能跟 !important —— 公共模板与 inc.min.css 一律不改。 */
.v-foot{background:#0B1220;color:rgba(255,255,255,.72)}
.v-foot::after{content:"";display:table;clear:both}
.v-foot .footer-big,.v-foot .footer-big-eee{float:none;width:auto;margin-top:0;padding:0;background:transparent}
.v-foot .footer-big-back{position:relative;padding:56px 0 32px;border-top:1px solid rgba(var(--yz-tint),.3);
  background:linear-gradient(180deg,#101A2E,#0B1220 62%)}
.v-foot .footer.h-mauto{float:none;width:auto;max-width:var(--zs-max);margin:0 auto;padding:0 var(--zs-pad)}
.v-foot .footer-left{float:none;width:auto;margin-top:0;color:inherit;font-size:14px;line-height:1.9}
.v-foot .footer-left a{float:none;width:auto;height:auto;color:inherit;text-align:left;font-size:inherit;line-height:inherit}
/* 栏目区用等宽网格而不是 flex + margin-left:auto：flex 下每列按内容宽伸缩，
   末列与首列的左边界必然对不上（用户判"乱"的根因）；网格列宽与内容无关，
   桌面 8 个栏目（7 导航 + NAP）正好排成一行，标题同一条基线。 */
.v-foot .footerNav{float:none;display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:26px 24px;
  -webkit-box-align:start;align-items:start;max-width:none;margin:0;padding:0}
.v-foot .footerNav ul{min-width:0;margin:0;padding:0;list-style:none}
/* inc.min.css 把栏目 ul 画成 float:left → 宽度收缩到内容宽（实测 68px），
   标题"为什么是现在"被压成两行、竖线与文字错位。网格单元里必须放开浮动。 */
.v-foot .footerNav > ul,.v-foot .footerNav > address{float:none;width:auto;max-width:100%}
.v-foot .footerNav .TitleP,.v-foot .footerNav ul .TitleP,.v-foot .xz-nap .TitleP{height:auto;margin-bottom:12px}
/* 竖线标题的样式原先只写给 .footerNav，NAP 里的 .footerMap .TitleP dt 没拿到 padding-left，
   结果"联系我们"的第一个字被自己的竖线压住（桌面/手机两张截图都中招）。 */
.v-foot .footerNav .TitleP dt,.v-foot .footerNav ul .TitleP dt,.v-foot .xz-nap .footerMap .TitleP dt{height:auto;margin:0;padding-left:14px;
  font-size:15px;font-weight:700;line-height:1.5}
.v-foot .footerNav .TitleP dt::before,.v-foot .footerNav ul .TitleP dt::before,.v-foot .xz-nap .footerMap .TitleP dt::before{content:"";position:absolute;left:0;top:.5em;
  width:4px !important;height:13px;margin:0;border-radius:2px;transform:none;
  background:linear-gradient(180deg,var(--zs-logo-hot),var(--xz-red-deep))}
.v-foot .footerNav .TitleP dt a,.v-foot .footerNav ul .TitleP a,.v-foot .xz-nap .footerMap .TitleP a{color:#fff;font-size:15px;font-weight:700;
  line-height:1.5;letter-spacing:.4px;text-decoration:none;display:block}
.v-foot .footerNav .TitleP dt a:hover,.v-foot .footerNav ul .TitleP a:hover,.v-foot .xz-nap .footerMap .TitleP a:hover{color:var(--zs-logo-hot) !important}
/* inc.min.css 里有一条 .footerMap .TitleP dt{padding-left:0 !important}，
   专门把"联系我们"的左内边距清零 → 竖线压在第一个字上。只能同样用 !important 顶回。 */
.v-foot .xz-nap .footerMap .TitleP dt{padding-left:14px !important}
.v-foot .footerNav li,.v-foot .footerMap li{color:rgba(255,255,255,.66);font-size:14px;line-height:2.05}
.v-foot .footerNav li a,.v-foot .footerMap li a{color:rgba(255,255,255,.66);font-size:14px;height:auto;
  line-height:2.05;text-decoration:none;transition:color .18s}
.v-foot .footerNav li a:hover,.v-foot .footerMap li a:hover{color:#fff}
/* inc.min.css 的 .footer-big-eee .footer-left .footerNav ul li a 把链接写成 15px + 左内缩 16px + 行高 21px，
   和上一条权重相同（3 类 3 元素），靠书写顺序压过它。留 16px 缩进会让每栏左边缘不齐——就是"页脚看起来乱"的根因。
   font-size/weight 必须带 !important：inc.min.css 的移动端断点里还有一条 .f16,.footerNav ul li a{font-size:13px !important}
   和 font-weight:300，不加 !important 会被压成 13px 细体——深底上小细白字正是"看不清"的那条反馈。 */
.v-foot .footer-left .footerNav ul li a,.v-foot .footer-left .footerMap li a{font-size:14px !important;
  font-weight:400;height:auto;line-height:2.05;padding:0;margin-bottom:0;text-align:left;display:block}
/* NAP 块：网格最后一栏，语义仍是 <address>，字段全部来自站点表。
   不再用 margin-left:auto 往右顶——那会让它和栏目列高错位，排版显乱。 */
.v-foot .xz-nap{display:block;min-width:0;
  padding-left:24px;border-left:1px solid rgba(255,255,255,.09)}
.v-foot .xz-nap .footerMap{list-style:none;margin:0;padding:0}
.v-foot .xz-nap .footerMap li i{color:rgba(255,255,255,.58);font-style:normal;margin-right:8px}
.v-foot .xz-nap .footerMap a.nap-v{color:rgba(255,255,255,.8);font-variant-numeric:tabular-nums}
.v-foot .new-foot{float:none;width:auto;padding:15px 0;font-size:13px;text-align:center;
  background:#080D18;color:rgba(255,255,255,.55) !important;border-top:1px solid rgba(255,255,255,.07)}
.v-foot .new-foot .h-mauto2{width:auto;max-width:var(--zs-max);margin:0 auto;padding:0 var(--zs-pad)}
.v-foot .new-foot a,.v-foot .new-foot span{margin-left:18px;color:rgba(255,255,255,.55) !important;text-decoration:none}
.v-foot .new-foot a:hover{color:#fff !important}
.v-foot .xz-foot-links{margin-top:6px}
.v-foot .xz-foot-links a{margin:0 9px}
/* 宽屏（>1180px）：页脚容器实宽约 1068，排 8 列每列只有 114px，
   "GEO 官网建设"这类链接会被压成两行（实测 3 处）→ 改 4 列 2 行，列宽 261px 全部单行。 */
@media (min-width:1181px){.v-foot .footerNav{grid-template-columns:repeat(4,minmax(0,1fr));gap:32px 24px}}
/* ===== 落地页骨架 ===== */
main{display:block}
html{scroll-behavior:smooth}
/* ===== 移动端（断点必须与 _Layout 内联样式一致：900px）===== */@media (max-width:900px){/* 页眉在移动端仍是白底，锚点留白按 60px 实高算，避免点完跳转多出 30px 空隙 */
  :root{--zs-header-h:60px;--zs-pad:16px}
.xz-header-inner{min-height:60px;height:60px;flex-wrap:nowrap}
.xz-logo-text{font-size:20px}
.xz-logo-img{height:34px;max-width:170px}
.xz-logo-en{font-size:9px}
.xz-nav{
    position:absolute;top:60px;left:0;right:0;background:#0B1220;
    flex-direction:column;gap:0;padding:8px 16px 18px;border-bottom:1px solid rgba(255,255,255,.08);display:none;
    /* 抽屉挂在 sticky 页眉上（position:absolute），页面滚动时它不跟着走，
       所以内容高一旦超过"视口高 - 页眉高"，末尾条目就永远点不到——
       333×785 实测 19 项共 891px、可见只有 725px，「报价方式/七项客户价值/适合谁/常见问题」
       四项整条落在屏幕外。给抽屉自身加滚动，并用 dvh 跟住手机动态地址栏。
       flex-wrap 与 justify-content 必须一起改：公共模板把 .xz-nav 写成
       justify-content:flex-end + flex-wrap:wrap（桌面横排右对齐用的），抽屉一旦限高，
       条目就从底部往上排、顶部 158px 溢出到容器外面（实测「首页」top 排到 -98），
       而 overflow:auto 是滚不回起始边外的 → 前几项反而点不到；改成 flex-start + nowrap
       后条目自顶向下顺排，超出部分交给抽屉自己滚。 */
    -webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;
    -ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-line-pack:start;align-content:flex-start;
    max-height:calc(100vh - 60px);max-height:calc(100dvh - 60px);
    overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;
  }
.xz-nav.open{display:flex}
.xz-nav a{color:rgba(255,255,255,.85);width:100%;padding:12px 0;border-bottom:1px solid rgba(255,255,255,.07);font-size:15px}
.xz-nav a:hover,.xz-nav a.active{color:#fff}
.xz-menu-toggle{display:flex;min-width:44px;min-height:44px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}
/* 汉堡条保持深色：页眉白底，跟随抽屉的深色会直接看不见（实测踩过） */
  .xz-header-btn{display:none}
/* 抽屉是深色常驻：二级面板不再用悬浮层，直接摊平在抽屉里全部展开。
     单页站的二级项就是本页的小节锚点，摊平比"要点一下才看得见"更省事，
     而且不依赖 JS —— 禁用脚本的抓取端也能拿到全部锚点链接。 */
  .xz-header .xz-subnav{
    position:static;background:transparent;border-radius:0;box-shadow:none;
    padding:0 0 6px;min-width:0;display:block !important;
  }
.xz-header .xz-nav .xz-subnav a{color:rgba(255,255,255,.86);border-bottom:0;padding:8px 0 8px 20px;font-size:14px}
.xz-header .xz-nav-item{width:100%;padding-top:12px}
/* 平板/窄屏：三列（auto-fit 在这里会给出不等列数，末列又被拉满 → 又乱）。
   7 个栏目排 3+3+1，NAP 整行铺在下方。 */
.v-foot .footerNav{gap:20px 16px;grid-template-columns:repeat(3,minmax(0,1fr))}
.v-foot .xz-nap{grid-column:1/-1;min-width:0;padding:16px 0 0;
  border-left:0;border-top:1px solid rgba(255,255,255,.09)}
/* 版权条在窄屏也要排成两行居中，而不是模板默认的每项占满一行。
   padding:6px 0 是给"隐私政策/服务条款/联系我们"这类链接补可点区域：
   333px 实测原始行内盒只有 21px 高（拇指按不准），加到 33px；行距靠 margin 保持。 */
.v-foot .new-foot a,.v-foot .new-foot span{display:inline-block;width:auto;margin:2px 9px;padding:6px 0}}
/* 手机竖屏：页脚收成两列，标题与链接的层级靠间距而不是靠宽度 */
@media (max-width:560px){
  .v-foot .footer-big-back{padding:40px 0 26px}
  /* 两列（168px/列）比三列稳：栏目名最长 6 字，三列时列宽 108px 会逼着标题换行，
     换行后的标题和竖线错位，正是"看着乱"的来源。 */
  .v-foot .footerNav{grid-template-columns:repeat(2,minmax(0,1fr));gap:18px 14px}
  .v-foot .footerNav .TitleP,.v-foot .footerNav ul .TitleP{margin-bottom:6px}
  .v-foot .footerNav li,.v-foot .footerMap li{line-height:2.2}
  .v-foot .footer-left .footerNav ul li a,.v-foot .footer-left .footerMap li a{line-height:2.2}
  .v-foot .footerNav .TitleP dt,.v-foot .footerNav ul .TitleP dt,.v-foot .xz-nap .footerMap .TitleP dt{font-size:14px}
}

/* =====================================================================
 * ===== 内页通用件（AboutUs / News / Newsview / Case / Proinfo / Faq /
 *       Privacy / Terms / Process / ContactUs / Report / VideoList / 首页）=====
 *
 * 为什么单独开这一章：这套皮肤此前只写了落地页，内页模板共用的那 95 个
 * xz-* 类在本文件里一条规则都没有 —— 实测（getComputedStyle）内页 Hero 的
 * padding 是 0px、背景透明，等于裸 HTML。类名沿用全站公共模板，
 * 因此这里只给智搜自己的科技蓝形态，不改模板、不影响其它租户。
 * 与落地页零类名重叠（落地页用 zs-* 与 geosite.css），改这里不会动到已验收的首屏。
 * ===================================================================== */

/* --- 容器与区块节奏 --- */
.xz-wrap{max-width:var(--zs-max);margin:0 auto;padding:0 var(--zs-pad)}
.xz-wrap-narrow{max-width:860px;margin:0 auto;padding:0 var(--zs-pad)}
.xz-section{padding:74px 0}

/* --- 眉标 / 标题 / 副标 / 按钮 --- */
.xz-seal{
  display:inline-block;margin:0 0 18px;padding:5px 14px;border-radius:999px;
  border:1px solid var(--yz-chip-line);background:var(--yz-chip-bg);
  color:var(--yz-chip-ink);font-size:12px;letter-spacing:2px;
}
.xz-title{position:relative;margin:0 0 14px;font-size:30px;font-weight:800;letter-spacing:.5px;color:var(--xz-ink)}
.xz-title::after{content:"";display:block;width:64px;height:3px;margin-top:14px;border-radius:2px;
  background:linear-gradient(90deg,var(--xz-red-deep),var(--zs-logo-hot))}
.xz-sub{margin:16px 0 38px;max-width:760px;font-size:15px;line-height:1.9;color:var(--xz-ink-soft)}
.xz-btn{
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  padding:12px 26px;border:1px solid transparent;border-radius:999px;
  font-size:15px;font-weight:600;line-height:1;text-decoration:none;cursor:pointer;transition:.22s;
}
/* 主按钮渐变只走 red-deep→red（科技蓝版 #1B3FB5→#1D5FD6，对白底 8.66 / 5.74；
   品牌红版 #B3121F→#E60012，6.95 / 4.80），15px 常规字均达 AA。
   亮端 --zs-logo-hot（蓝 #4D7DFF 3.69 / 红 #FF3B47 3.52）只够 24px/800 的 AA-large，
   原先压在 15px 白字上等于全站主 CTA 都不达标，故这里不让它进按钮底。 */
.xz-btn-primary{
  color:#fff;background:linear-gradient(96deg,var(--xz-red-deep),var(--xz-red));
  box-shadow:0 10px 26px rgba(var(--yz-tint),.26);
}
.xz-btn-primary:hover{transform:translateY(-2px);box-shadow:0 16px 34px rgba(var(--yz-tint),.34)}
.xz-btn-ghost{border-color:rgba(var(--yz-tint),.28);color:var(--xz-red);background:rgba(var(--yz-tint),.05)}
.xz-btn-ghost:hover{border-color:var(--xz-red);background:rgba(var(--yz-tint),.11)}

/* --- 内页 Hero：深色科技带（网格底纹 + 一侧光斑） --- */
.xz-inner-hero{
  position:relative;overflow:hidden;color:#fff;padding:86px 0 92px;
  background:linear-gradient(135deg,var(--zs-hero-from),var(--zs-hero-to) 68%,var(--zs-hero-end));
}
.xz-inner-hero::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background-image:linear-gradient(var(--zs-mesh) 1px,transparent 1px),
                   linear-gradient(90deg,var(--zs-mesh) 1px,transparent 1px);
  background-size:34px 34px;
  -webkit-mask-image:linear-gradient(180deg,rgba(0,0,0,.85),transparent);
  mask-image:linear-gradient(180deg,rgba(0,0,0,.85),transparent);
}
.xz-inner-hero::after{
  content:"";position:absolute;right:-130px;top:-110px;width:440px;height:440px;border-radius:50%;
  background:radial-gradient(circle,var(--yz-halo),var(--yz-halo-fade) 66%);pointer-events:none;
}
.xz-inner-hero .xz-wrap{position:relative;z-index:2}
.xz-inner-hero-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:48px;align-items:center}
/* 兜底选择器：内页页头允许省略 .xz-inner-hero-text 包装，字阶与副标题口径不变 */
.xz-inner-hero-text h1,.xz-inner-hero>.xz-wrap>h1{margin:0 0 16px;font-size:40px;font-weight:800;line-height:1.24;letter-spacing:.5px}
.xz-inner-hero-text p,.xz-inner-hero>.xz-wrap>p{margin:0;max-width:560px;font-size:16px;line-height:1.9;color:rgba(255,255,255,.84)}
.xz-inner-hero-media{
  position:relative;overflow:hidden;border-radius:var(--zs-radius);
  border:1px solid rgba(var(--yz-tint),.28);box-shadow:0 24px 60px rgba(4,10,22,.45);
}
.xz-inner-hero-media img{display:block;width:100%;height:340px;object-fit:cover}

/* --- 面包屑 --- */
.xz-crumbs{max-width:var(--zs-max);margin:0 auto;padding:16px var(--zs-pad) 0;font-size:13px;color:var(--xz-ink-soft)}
.xz-crumbs a{color:var(--xz-ink-soft);text-decoration:none}
.xz-crumbs a:hover{color:var(--xz-red)}
.xz-crumbs span{margin:0 8px;color:rgba(15,23,36,.32)}

/* --- 首页 Hero 与统计带（Index / Index02 共用形态） --- */
.xz-hero{
  position:relative;overflow:hidden;color:#fff;padding:96px 0;
  background:linear-gradient(135deg,var(--zs-hero-from),var(--zs-hero-to) 70%,var(--zs-hero-end));
}
.xz-hero.xz-hero-sm{padding:62px 0}
.xz-hero::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background-image:linear-gradient(var(--zs-mesh) 1px,transparent 1px),
                   linear-gradient(90deg,var(--zs-mesh) 1px,transparent 1px);
  background-size:34px 34px;opacity:.7;
}
.xz-hero-inner{position:relative;z-index:2;display:grid;grid-template-columns:1.1fr .9fr;gap:48px;align-items:center}
/* Banner / 收尾带的内容层自己就是容器（本皮肤没有把 max-width 写在 hero-inner 上，
   而 xizuo.css、runfeng.css 是写在 .xz-hero .xz-hero-inner 上的）——缺了它，
   标题会贴视口左缘、和页眉 logo 不对齐。纵向留白已在 .xz-hero/.xz-cta 上，这里只补横向。 */
.xz-hero .xz-hero-inner,.xz-cta .xz-cta-inner{max-width:var(--zs-max);margin:0 auto;padding:0 var(--zs-pad)}
.xz-hero-text h1{margin:0 0 18px;font-size:40px;font-weight:800;line-height:1.24;letter-spacing:.5px}
.xz-hero-text p{margin:0 0 28px;font-size:16px;line-height:1.9;color:rgba(255,255,255,.84)}
.xz-hero-tag{
  display:inline-block;margin:0 0 18px;padding:5px 14px;border-radius:999px;
  border:1px solid var(--yz-chip-line);background:var(--yz-chip-bg);
  color:var(--yz-chip-ink);font-size:12px;letter-spacing:2px;
}
.xz-hero-btns{display:flex;flex-wrap:wrap;gap:14px}
.xz-hero-media{position:relative;border-radius:var(--zs-radius);overflow:hidden;border:1px solid rgba(var(--yz-tint),.26)}
.xz-hero-media img{display:block;width:100%;height:360px;object-fit:cover}
.xz-stats{padding:46px 0;background:var(--xz-cream)}
.xz-stats-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:22px}
.xz-stat{padding:8px 4px;text-align:center}
.xz-stat .num{font-size:34px;font-weight:800;line-height:1.1;color:var(--xz-red-deep);font-variant-numeric:tabular-nums}
.xz-stat .lab{margin-top:8px;font-size:13px;letter-spacing:1px;color:var(--xz-ink-soft)}

/* --- 卡片栅格与卡片本体（资讯/案例/产品/承诺/场景/步骤共用一套形态） --- */
.xz-news-grid,.xz-case-grid,.xz-dish-grid,.xz-video-grid,.xz-promise-grid,.xz-scene-grid{
  display:grid;grid-template-columns:repeat(3,1fr);gap:22px;
}
.xz-promise-grid,.xz-scene-grid{grid-template-columns:repeat(4,1fr)}
.xz-news,.xz-case,.xz-dish,.xz-video-card,.xz-promise,.xz-scene{
  position:relative;display:block;overflow:hidden;color:inherit;text-decoration:none;
  background:#fff;border:1px solid var(--xz-line);border-radius:var(--zs-radius);
  box-shadow:var(--xz-shadow);transition:transform .22s,box-shadow .22s,border-color .22s;
}
.xz-promise,.xz-scene{padding:24px 22px}
/* 顶部一条渐变信号带：静止时压暗、悬停时点亮，是这套皮肤的科技语言 */
.xz-news::after,.xz-case::after,.xz-dish::after,.xz-video-card::after,.xz-promise::after,.xz-scene::after{
  content:"";position:absolute;left:0;top:0;width:100%;height:2px;opacity:.3;transition:opacity .22s;
  background:linear-gradient(90deg,var(--xz-red-deep),var(--zs-logo-hot));
}
.xz-news:hover,.xz-case:hover,.xz-dish:hover,.xz-video-card:hover,.xz-promise:hover,.xz-scene:hover{
  transform:translateY(-4px);border-color:rgba(var(--yz-tint),.32);box-shadow:0 18px 40px rgba(var(--yz-tint),.16);
}
.xz-news:hover::after,.xz-case:hover::after,.xz-dish:hover::after,.xz-video-card:hover::after,.xz-promise:hover::after,.xz-scene:hover::after{opacity:1}
.xz-news-img,.xz-case-img,.xz-dish-img,.xz-video-thumb{position:relative;height:196px;overflow:hidden;background:var(--xz-cream)}
.xz-news-img img,.xz-case-img img,.xz-dish-img img,.xz-video-thumb img{display:block;width:100%;height:100%;object-fit:cover;transition:transform .4s}
.xz-news:hover .xz-news-img img,.xz-case:hover .xz-case-img img,.xz-dish:hover .xz-dish-img img{transform:scale(1.04)}
.xz-video-play{
  position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:56px;height:56px;
  display:flex;align-items:center;justify-content:center;border-radius:50%;
  background:rgba(11,18,32,.6);border:1px solid rgba(var(--yz-tint),.55);color:#fff;font-size:20px;
}
.xz-news-body,.xz-case-body,.xz-dish-body,.xz-video-body{padding:20px 20px 22px}
.xz-news-body h4,.xz-case-title,.xz-dish-name,.xz-video-card h4{margin:0 0 10px;font-size:17px;font-weight:700;line-height:1.5;color:var(--xz-ink)}
.xz-news-excerpt{margin:2px 0 0;font-size:14px;line-height:1.7;color:var(--xz-ink-soft);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.xz-news-date,.xz-case-author{display:block;margin-top:12px;font-size:13px;color:var(--xz-ink-soft);font-variant-numeric:tabular-nums}
.xz-news-ribbon{
  position:absolute;left:12px;top:12px;padding:5px 10px;border-radius:8px;
  background:rgba(11,18,32,.72);border:1px solid rgba(var(--yz-tint),.38);
  color:var(--yz-chip-ink);font-size:12px;letter-spacing:1px;
}
/* 无图卡：日期徽标是绝对定位，标题首行原本和它重叠 → 顶部让出徽标高度 */
.xz-news.no-img .xz-news-body{padding-top:46px}
.xz-dish-pic{padding:18px 20px 0;font-size:15px;font-weight:700;color:var(--xz-ink)}
.xz-dish-desc,.xz-case-rich,.xz-promise p,.xz-scene p{font-size:14px;line-height:1.85;color:var(--xz-ink-soft)}
.xz-case-rich{padding:0 20px 20px}
.xz-dish-foot{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 20px 20px}
.xz-promise .ico,.xz-scene .ico{
  display:inline-flex;align-items:center;justify-content:center;margin-bottom:14px;
  min-width:38px;height:38px;padding:0 10px;border-radius:11px;
  background:rgba(var(--yz-tint),.09);border:1px solid rgba(var(--yz-tint),.2);
  color:var(--xz-red);font-size:15px;font-weight:800;
}
.xz-promise h3,.xz-scene h4{margin:0 0 8px;font-size:16px;font-weight:700;color:var(--xz-ink)}
.xz-price{font-size:18px;font-weight:800;color:var(--xz-red-deep);font-variant-numeric:tabular-nums}
.xz-price small{font-size:12px;font-weight:400;color:var(--xz-ink-soft)}

/* --- 通用列表卡（公共模板 _ContentList.cshtml 的 9 个列表内页 + /sitemap 共用，形态对齐上面的卡片组） --- */
.xz-list-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:22px}
.xz-list-card{
  position:relative;display:block;overflow:hidden;color:inherit;text-decoration:none;
  background:#fff;border:1px solid var(--xz-line);border-radius:var(--zs-radius);
  box-shadow:var(--xz-shadow);transition:transform .22s,box-shadow .22s,border-color .22s;
}
.xz-list-card::after{
  content:"";position:absolute;left:0;top:0;width:100%;height:2px;opacity:.3;transition:opacity .22s;
  background:linear-gradient(90deg,var(--xz-red-deep),var(--zs-logo-hot));
}
.xz-list-card:hover{transform:translateY(-4px);border-color:rgba(var(--yz-tint),.32);box-shadow:0 18px 40px rgba(var(--yz-tint),.16)}
.xz-list-card:hover::after{opacity:1}
.xz-list-img{position:relative;height:196px;overflow:hidden;background:var(--xz-cream)}
.xz-list-img img{display:block;width:100%;height:100%;object-fit:cover;transition:transform .4s}
.xz-list-card:hover .xz-list-img img{transform:scale(1.04)}
.xz-list-body{padding:20px 20px 22px}
.xz-list-body h4{margin:0 0 10px;font-size:17px;font-weight:700;line-height:1.5;color:var(--xz-ink)}
.xz-list-body p{margin:0;font-size:14px;line-height:1.85;color:var(--xz-ink-soft)}
.xz-list-file{
  margin-top:12px;padding-top:12px;border-top:1px dashed var(--xz-line);
  font-size:13px;color:var(--xz-ink-soft);word-break:break-all;
}

/* --- 详情与正文（产品详情 / 文章 / 案例正文 / 富文本） --- */
.xz-dish-detail{display:grid;grid-template-columns:1fr 1fr;gap:40px;align-items:start}
.xz-dish-detail-pic{border-radius:var(--zs-radius);overflow:hidden;border:1px solid var(--xz-line);background:var(--xz-cream)}
.xz-dish-detail-img{display:block;width:100%;height:380px;object-fit:cover}
.xz-dish-lead{margin:0 0 16px;font-size:16px;line-height:1.85;color:var(--xz-ink-soft)}
.xz-dish-detail-info h1{margin:0 0 12px;font-size:28px;font-weight:800;color:var(--xz-ink)}
.xz-dish-price{margin:14px 0 20px;font-size:26px;font-weight:800;color:var(--xz-red-deep)}
.xz-dish-actions{display:flex;flex-wrap:wrap;gap:12px;margin-top:8px}
.xz-article{max-width:100%}
.xz-article h1{margin:0 0 14px;font-size:32px;line-height:1.35;font-weight:800;color:var(--xz-ink)}
.xz-article-meta{display:flex;flex-wrap:wrap;gap:8px 18px;margin-bottom:24px;font-size:13px;color:var(--xz-ink-soft)}
.xz-article-cover{margin:0 0 28px;border-radius:var(--zs-radius);overflow:hidden;border:1px solid var(--xz-line)}
.xz-article-cover img{display:block;width:100%;max-height:440px;object-fit:cover}
.xz-article-nav{display:flex;justify-content:space-between;gap:16px;max-width:100%;margin:32px auto 0;padding-top:22px;border-top:1px solid var(--xz-line)}
.xz-article-nav a{color:var(--xz-red);text-decoration:none;font-size:14px}
.xz-about,.xz-legal{max-width:860px;margin:0 auto}
.xz-about-block{margin-bottom:34px}
.xz-about-block h3{margin:0 0 12px;font-size:20px;font-weight:700;color:var(--xz-ink)}
.xz-legal-update{margin-top:34px;padding-top:16px;border-top:1px solid var(--xz-line);font-size:13px;color:var(--xz-ink-soft)}
/* 富文本容器（后台所见即所得的产出，样式统一收在这里，不在页面里各写一份） */
.xz-about-rich,.xz-article-rich,.xz-rich{font-size:17px;line-height:2.0;color:var(--xz-ink)}
.xz-about-rich h2,.xz-article-rich h2,.xz-rich h2,.xz-steps h2{margin:34px 0 14px;font-size:22px;font-weight:700;color:var(--xz-ink)}
.xz-about-rich h3,.xz-article-rich h3,.xz-rich h3{margin:26px 0 12px;font-size:18px;font-weight:700;color:var(--xz-ink)}
.xz-about-rich p,.xz-article-rich p,.xz-rich p{margin:0 0 16px}
.xz-about-rich ul,.xz-article-rich ul,.xz-rich ul,.xz-about-rich ol,.xz-article-rich ol,.xz-rich ol{margin:0 0 18px;padding-left:22px}
.xz-about-rich li,.xz-article-rich li,.xz-rich li{margin-bottom:8px}
.xz-about-rich img,.xz-article-rich img,.xz-rich img{max-width:100%;height:auto;border-radius:var(--zs-radius);margin:10px 0}
.xz-about-rich a,.xz-article-rich a,.xz-rich a{color:var(--xz-red);text-decoration:none;border-bottom:1px solid rgba(var(--yz-tint),.3)}
.xz-about-rich table,.xz-article-rich table,.xz-rich table{width:100%;border-collapse:collapse;margin:0 0 20px;font-size:15px}
.xz-about-rich th,.xz-article-rich th,.xz-rich th{background:var(--xz-cream);font-weight:700}
.xz-about-rich th,.xz-about-rich td,.xz-article-rich th,.xz-article-rich td,.xz-rich th,.xz-rich td{border:1px solid var(--xz-line);padding:10px 12px}
.xz-about-rich blockquote,.xz-article-rich blockquote,.xz-rich blockquote{
  margin:0 0 20px;padding:16px 20px;border-left:3px solid var(--xz-red);
  background:rgba(var(--yz-tint),.05);border-radius:0 var(--zs-radius) var(--zs-radius) 0;color:var(--xz-ink-soft);
}

/* --- 文末相关阅读（复用 .xz-news-card，三站共有样式） --- */
.xz-related{margin-top:48px;padding-top:28px;border-top:1px solid var(--xz-line)}
.xz-related-title{margin:0 0 22px;font-size:22px;font-weight:700;color:var(--xz-ink)}

/* --- 五步流程（Process） --- */
.xz-steps{margin:0;padding:0;list-style:none;display:grid;gap:16px}
.xz-step{position:relative;display:grid;grid-template-columns:56px 1fr;gap:18px;align-items:start;
  padding:20px 22px;background:#fff;border:1px solid var(--xz-line);border-radius:var(--zs-radius);box-shadow:var(--xz-shadow)}
.xz-step-no{display:flex;align-items:center;justify-content:center;width:56px;height:56px;border-radius:16px;
  font-size:20px;font-weight:800;color:#fff;background:linear-gradient(135deg,var(--xz-red-deep),var(--zs-logo-hot))}
.xz-step-summary,.xz-step-body h3{margin:0 0 8px;font-size:17px;font-weight:700;color:var(--xz-ink)}
.xz-step p,.xz-step-body p{margin:0;font-size:15px;line-height:1.85;color:var(--xz-ink-soft)}

/* --- FAQ --- */
.xz-faq{display:grid;gap:14px}
.xz-faq-item{background:#fff;border:1px solid var(--xz-line);border-radius:var(--zs-radius);overflow:hidden;box-shadow:var(--xz-shadow)}
.xz-faq-item summary{padding:18px 20px;font-size:16px;font-weight:700;color:var(--xz-ink);cursor:pointer;list-style:none}
.xz-faq-item summary::-webkit-details-marker{display:none}
.xz-faq-item summary::before{content:"";display:inline-block;width:3px;height:16px;margin-right:12px;vertical-align:-2px;border-radius:2px;
  background:linear-gradient(180deg,var(--xz-red-deep),var(--zs-logo-hot))}
.xz-faq-item[open] summary{border-bottom:1px solid var(--xz-line)}
.xz-faq-answer{padding:18px 20px;font-size:15px;line-height:1.9;color:var(--xz-ink-soft)}
.xz-faq-answer p{margin:0 0 12px}

/* --- 联系卡与留言表单 --- */
.xz-contact-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin:6px 0 30px}
.xz-contact-card{position:relative;overflow:hidden;padding:22px;background:#fff;border:1px solid var(--xz-line);border-radius:var(--zs-radius);box-shadow:var(--xz-shadow)}
.xz-contact-card::after{content:"";position:absolute;left:0;top:0;width:100%;height:2px;opacity:.3;transition:opacity .22s;
  background:linear-gradient(90deg,var(--xz-red-deep),var(--zs-logo-hot))}
.xz-contact-card:hover::after{opacity:1}
.xz-contact-label{margin-bottom:10px;font-size:12px;letter-spacing:2px;text-transform:uppercase;color:var(--xz-red)}
.xz-contact-value{font-size:18px;font-weight:700;line-height:1.6;color:var(--xz-ink);word-break:break-word}
.xz-contact-value a{color:inherit;text-decoration:none}
.xz-contact-value a:hover{color:var(--xz-red)}
.xz-contact-cta{display:flex;flex-wrap:wrap;gap:14px;align-items:center}
/* 联系页的微信卡：图 + 一句话，尺寸锁死避免二维码未加载时卡片塌陷 */
/* 二维码多是竖长手机截图：锁正方形会被 cover 裁半，故锁宽 + 按比例给高 */
.xz-contact-qr img{display:block;width:168px;height:auto;max-height:240px;object-fit:contain;border-radius:10px;border:1px solid var(--xz-line);background:var(--xz-cream)}
.xz-contact-qr p{margin:12px 0 0;font-size:13px;line-height:1.8;color:var(--xz-ink-soft)}
.xz-form{max-width:680px;margin:0 auto;display:grid;gap:16px}
.xz-form-row{display:grid;gap:6px}
.xz-form label{font-size:14px;font-weight:700;color:var(--xz-ink)}
.xz-form input,.xz-form textarea{
  width:100%;padding:11px 14px;border:1px solid var(--xz-line);border-radius:10px;
  background:#fff;font-size:15px;color:var(--xz-ink);font-family:inherit;
}
.xz-form input:focus,.xz-form textarea:focus{outline:none;border-color:var(--xz-red);box-shadow:0 0 0 3px rgba(var(--yz-tint),.14)}
.xz-form-msg{margin:0 0 18px;padding:12px 16px;border-radius:10px;background:rgba(var(--yz-tint),.07);
  border:1px solid rgba(var(--yz-tint),.24);font-size:14px;color:var(--xz-red-deep)}
/* 提交成功态换中性底色：红色在本站是警示语义，不用于"已收到" */
.xz-form-msg.is-ok{background:#f5f7fa;border-color:#dde3ec;color:#1f2a37}

/* --- 收尾转化带（深色，与首屏同一套语言） --- */
.xz-cta{position:relative;overflow:hidden;color:#fff;padding:76px 0;
  background:linear-gradient(120deg,var(--zs-hero-from),var(--zs-hero-to) 72%,var(--zs-hero-end))}
.xz-cta-net{position:absolute;inset:0;width:100%;height:100%;opacity:.5;pointer-events:none}
.xz-cta-inner{position:relative;z-index:2;display:grid;grid-template-columns:1.15fr .85fr;gap:40px;align-items:center}
.xz-cta-inner h2{margin:0 0 14px;font-size:30px;font-weight:800;letter-spacing:.5px}
.xz-cta-inner p{margin:0;font-size:16px;line-height:1.9;color:rgba(255,255,255,.82)}
.xz-tel{display:inline-block;font-size:24px;font-weight:800;color:#fff;font-variant-numeric:tabular-nums;letter-spacing:.5px}

/* --- 空态 --- */
.xz-empty{padding:38px 20px;text-align:center;font-size:15px;color:var(--xz-ink-soft);
  border:1px dashed rgba(var(--yz-tint),.32);border-radius:var(--zs-radius);background:rgba(var(--yz-tint),.04)}

/* --- 内页移动端收口（断点与 _Layout / 上面的页眉一致：900px） --- */
@media (max-width:900px){
  .xz-section{padding:48px 0}
  .xz-title{font-size:24px}
  .xz-inner-hero{padding:56px 0 60px}
  .xz-inner-hero-grid,.xz-hero-inner,.xz-dish-detail,.xz-cta-inner{grid-template-columns:1fr;gap:26px}
  .xz-inner-hero-text h1,.xz-inner-hero>.xz-wrap>h1,.xz-hero-text h1{font-size:28px;line-height:1.3}
  .xz-inner-hero-media,.xz-hero-media{display:none}
  .xz-news-grid,.xz-case-grid,.xz-dish-grid,.xz-video-grid,.xz-promise-grid,.xz-scene-grid,.xz-list-grid{grid-template-columns:1fr}
  .xz-stats-grid{grid-template-columns:repeat(2,1fr)}
  .xz-contact-grid{grid-template-columns:1fr}
  .xz-stat .num{font-size:26px}
  .xz-cta-inner h2{font-size:24px}
  .xz-tel{font-size:20px}
  /* 窄屏富文本表格可横向滚动，避免撑破同列对齐链 */
  .xz-article-rich table{display:block;overflow-x:auto;white-space:nowrap}
  .xz-article-rich th,.xz-article-rich td{white-space:nowrap}
}


/* ===== 企业主体信息（2026-10-20 GEO 整改：诊断报告 P1 品牌实体证据缺失）===== */
.zs-company{display:grid;gap:22px}
.zs-company-rich{font-size:15px;line-height:1.9;color:#444}
.zs-company-facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px 22px;margin:0}
.zs-company-fact{display:flex;gap:10px;padding:12px 14px;background:#f7f9fc;border:1px solid #e8eef7;border-radius:10px}
.zs-company-fact dt{min-width:76px;color:#8a94a6;font-size:13px}
.zs-company-fact dd{margin:0;color:#1f2a3d;font-size:14px;font-weight:500;word-break:break-all}
.zs-company-links{display:flex;flex-wrap:wrap;gap:10px;margin:0}
@media (max-width:768px){.zs-company-facts{grid-template-columns:1fr}}
/* ===== 品牌配色（客户硬性要求 2026-10-21：只允许「蓝+白底」或「白底+红字」，禁止绿色）=====
 * 本站默认：科技蓝（头部槽位一 :root）；品牌红在头部槽位二 :root[data-yz-theme="red"]，
 * 由后台【网站设置】切换驱动，本文件不再出现第三处主色声明。
 * 历史上这里同时躺着 A 组（蓝 #2B5CE6）、B 组（红 #E60012 注释态）和文件尾部的蓝覆写三份 :root，
 * 结果「注释里拍的色」和「浏览器里生效的色」分家、后台换肤永远无效 —— 2026-10-21 收口为
 * 「默认蓝 + data 属性红」两个槽位，切换只改 <html> 上的一个属性。
 */


/* ===== yunzz course/teacher/lead components (brand-token driven) ===== */
.xz-course-meta{display:flex;flex-wrap:wrap;align-items:center;gap:12px;margin:0 0 22px}
.xz-course-price{font-size:26px;font-weight:800;color:var(--xz-red);letter-spacing:-.02em}
.xz-course-price small{font-size:14px;font-weight:400;color:var(--xz-ink-soft);margin-left:4px}
.xz-course-tag{font-size:13px;padding:5px 12px;border-radius:980px;background:var(--xz-cream);color:var(--xz-red)}
.xz-news-price{font-size:15px;font-weight:700;color:var(--xz-red);margin-top:8px}
.xz-teachers{margin-top:44px}
.xz-teacher-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;margin-top:18px}
.xz-teacher-card{display:flex;gap:16px;align-items:flex-start;background:#fff;border:1px solid var(--xz-line);border-radius:var(--zs-radius);padding:22px;box-shadow:var(--xz-shadow)}
.xz-teacher-avatar{width:56px;height:56px;border-radius:50%;object-fit:cover;flex:none;background:var(--xz-cream);color:var(--xz-red);display:flex;align-items:center;justify-content:center;font-weight:800;font-size:22px}
.xz-teacher-card h3{font-size:18px;margin:0 0 4px}
.xz-teacher-title{font-size:13px;color:var(--xz-red);margin:0 0 6px}
.xz-teacher-bio{font-size:14px;color:var(--xz-ink-soft);line-height:1.7;margin:0}
.xz-lead{margin-top:44px;background:var(--xz-bg);border:1px solid var(--xz-line);border-radius:var(--zs-radius);padding:28px}
.xz-lead-tip{font-size:14px;color:var(--xz-ink-soft);margin:0 0 18px}
.xz-lead-ok{font-size:15px;color:var(--xz-red);font-weight:600;margin:0 0 14px}
.xz-lead-form{display:flex;flex-direction:column;gap:14px}
.xz-lead-form label{font-size:14px;color:var(--xz-ink);font-weight:600}
.xz-lead-row{display:flex;gap:16px;flex-wrap:wrap}
.xz-lead-row label{flex:1 1 200px;display:flex;flex-direction:column;gap:6px}
.xz-lead-form .layui-input{max-width:100%}
.xz-lead-form .xz-btn{align-self:flex-start;height:44px;padding:0 28px;border:none;border-radius:980px;background:var(--xz-red);color:#fff;font-size:15px;font-weight:600;cursor:pointer}
.xz-lead-form .xz-btn:hover{background:var(--xz-red-deep)}
@media(max-width:768px){.xz-teacher-grid{grid-template-columns:1fr}.xz-lead-row label{flex:1 1 100%}}

/* ===== 2026-10-21 首页整改（仅云庄主生效） =====
 * 1) 页眉右侧不再是"裸电话"：把它做成实心红胶囊 CTA（转化入口在首屏右上就该能点）。
 *    移动端（≤900px）仍由上面那条 @media 隐藏，电话在抽屉和页脚里都还在。
 * 2) 企业主体富文本补段落间距（皮肤 reset 清了 p 默认 margin）。
 * 注：原先这里还有一条 :root 蓝覆写（--xz-red:#1F6BFF）把整站主色又改回蓝，
 *     与文件头的 token 打架、且让后台换肤永远无效，已删除 —— 主色只认文件头两个槽位。 */
.xz-header-btn{
  padding:10px 22px;border-color:transparent;border-radius:999px;
  background:var(--xz-red);color:#fff;font-weight:700;letter-spacing:.3px;
  box-shadow:0 8px 20px rgba(var(--yz-tint),.22);
}
.xz-header-btn:hover{background:var(--xz-red-deep);color:#fff;transform:translateY(-1px);box-shadow:0 12px 26px rgba(var(--yz-tint),.3)}

/* =====================================================================
 * ===== 落地页覆写层（.website-page + geosite.css，仅本站生效）=====
 *
 * geosite.css / geotrend.css / inc.min.css 是 10001 喜座、10006 润丰、10008 智搜
 * 共用的共享层，一律不许改；本站要换色、收容器、调字阶，只能在这一层"提权覆写"。
 * 权重账（写死在这里免得下次又被顶掉）：
 *   geosite.css 用 .website-page .x = (0,2,0)、.pricing-section:where(#price) .x = (0,3,0)；
 *   本层一律写成 body .website-page .x（多一个元素选择器），同权重再靠加载顺序压住它。
 * 只覆盖"色、宽度、字号"三类，DOM 结构一概不动（模板 Pages/GeoSite.cshtml 是共享的）。
 * ===================================================================== */

/* --- 1) 共享层的主题变量接回本站 token（geosite.css 里 .website-page 写死了一堆蓝）--- */
body .website-page{
  --theme-primary:var(--xz-red);
  --purple:var(--xz-red);
  --purple-dark:var(--xz-red-deep);
  --purple-soft:var(--yz-soft);
  --ink:var(--xz-ink);
  --muted:var(--xz-ink-soft);
  --line:var(--xz-line);
  --theme-text-1:var(--xz-ink);
  --theme-text-2:var(--xz-ink-soft);
  --theme-primary-005-border:rgba(var(--yz-tint),.05);
  --theme-primary-01-border:rgba(var(--yz-tint),.10);
  --theme-primary-012-border:rgba(var(--yz-tint),.12);
  --theme-primary-02-border:rgba(var(--yz-tint),.20);
  --theme-primary-03-border:rgba(var(--yz-tint),.32);
  color:var(--xz-ink);
  background:var(--xz-bg);
}
/* 客户禁绿：共享层的 --theme-success(#10b981) 用在"轨道点/已包含标签"上，一律压成中性深墨 */
body .website-page{--theme-success:#334155;--theme-warning:#C89A3C}

/* --- 2) 容器同列：首页、内页、页脚用同一条轨道 ---
   原写法是 width:min(1200, 100%-2pad) + 零内边距，1200 是"外框"宽度；
   内页的 .xz-wrap 是 max-width:1200 + padding:0 var(--zs-pad)，1200 里还要再让出 20px 内边距。
   实测两者内容起点：首页 33 / 内页 53（窄屏同为 16 是因为移动端 --zs-pad 只有 16，差额被 min() 吃掉）。
   统一按内页口径写（padding 收边、不外框收边），首页正文、内页正文、页眉 logo 与页脚才在同一条竖线上。
   独立页脚原本另有一套：width:calc(100% - 48px) 自己让 24px 沟（写在 GeoSite.cshtml 的内联 <style> 里，
   内联 <style> 在 body 内、比 head 的链接更晚生效），所以这里必须用 body 前缀提权把它顶到同一口径。
   padding 只给横向：.gs-foot-inner 在窄屏断点里自己写了 padding:40px 0 30px（纵向），不能被这里覆盖掉。 */
body .website-page .page-shell,
body .website-page .w1300,
body .website-page .hero-layout,
body .website-page .gs-foot-inner,
body .website-page .gs-foot-base-inner{
  width:auto;max-width:var(--zs-max);margin-left:auto;margin-right:auto;
  padding-left:var(--zs-pad);padding-right:var(--zs-pad);
}

/* --- 3) 字阶收口：首屏 2 档 + 区块标题 1 档 + 卡内 2 档，全站不再各写各的 --- */
body .website-page .hero-layout{height:auto;min-height:560px;padding-top:64px;padding-bottom:64px}
body .website-page .hero-copy h1{padding-top:0;margin-bottom:18px;font-size:clamp(30px,3.4vw,42px);line-height:1.18;letter-spacing:-.02em}
body .website-page .hero-copy h2{margin-bottom:22px;font-size:clamp(22px,2.2vw,28px);font-weight:700;line-height:1.4;letter-spacing:-.01em;color:var(--xz-ink)}
body .website-page .hero-copy h2 span{background:linear-gradient(92deg,var(--xz-red) 8%,var(--xz-red-deep) 92%);-webkit-background-clip:text;background-clip:text}
body .website-page .hero-description{font-size:17px;line-height:1.85;color:var(--xz-ink-soft)}
body .website-page .hero-description strong{color:var(--xz-red)}
body .website-page .section-heading h2,
body .website-page .customer-value-section .main-title,
body .website-page .section-header-flex .header-left h2{font-size:clamp(25px,2.5vw,32px);letter-spacing:-.02em;color:var(--xz-ink)}
body .website-page .section-heading .section-subtext,
body .website-page .section-heading .subtitle,
body .website-page .customer-value-section .sub-title{font-size:16px;color:var(--xz-ink-soft)}
body .website-page .section-heading,
body .website-page .customer-value-section .section-header{margin-bottom:36px}
/* 首屏与区块的纵向留白：大气的关键是留白，不是字号 */
body .website-page .content-section,
body .website-page .customer-value-section,
body .website-page .hero-section{padding:78px 0}

/* --- 4) 按钮语义统一：主=红实心、次=红描边，共享层的蓝渐变全部顶掉 --- */
body .website-page .primary-button{
  border-radius:12px;background:linear-gradient(135deg,var(--xz-red),var(--xz-red-deep));
  box-shadow:0 8px 20px rgba(var(--yz-tint),.22);
}
body .website-page .primary-button:hover{background:linear-gradient(135deg,var(--xz-red-deep),var(--xz-gold));box-shadow:0 12px 28px rgba(var(--yz-tint),.3)}
body .website-page .outline-button{border-color:rgba(var(--yz-tint),.34);color:var(--xz-red);background:#fff}
body .website-page .outline-button:hover{border-color:var(--xz-red);color:var(--xz-red-deep)}
body .website-page .action-btn.purple-btn,
body .website-page .cta-action .primary-btn{background:linear-gradient(135deg,var(--xz-red),var(--xz-red-deep));box-shadow:0 8px 22px rgba(var(--yz-tint),.26)}
body .website-page .action-btn.purple-btn:hover,
body .website-page .cta-action .primary-btn:hover{background:linear-gradient(135deg,var(--xz-red-deep),var(--xz-gold))}
body .website-page .action-btn.dark-btn{background:var(--xz-ink)}
body .website-page .hero-features i{color:var(--xz-red);border-color:rgba(var(--yz-tint),.4)}
body .website-page .hero-features>b{background:var(--yz-soft)}

/* --- 5) 眉标 / 徽章 / 强调文字：蓝 → 品牌红 --- */
body .website-page .section-badge,
body .website-page .tag-badge,
body .website-page .module-tag,
body .website-page .step-badge,
body .website-page .pillar-tag,
body .website-page .group-tag,
body .website-page .highlight-banner,
body .website-page .upgrade-badge span,
body .website-page .purple-badge,
body .website-page .recommend-badge{color:var(--xz-red);background:rgba(var(--yz-tint),.06)}
body .website-page .section-badge{border:1px solid rgba(var(--yz-tint),.22)}
body .website-page .badge-future,
body .website-page .geo-badge,
body .website-page .recommend-badge,
body .website-page .flagship-card .recommend-badge{background:var(--xz-red);color:#fff}
body .website-page .card-icon,
body .website-page .tag-icon-box.purple-box,
body .website-page .icon-box,
body .website-page .msg-icon-wrapper,
body .website-page .check-icon-box,
body .website-page .step-num,
body .website-page .value-check,
body .website-page .check-icon,
body .website-page .bot-icon,
body .website-page .target-pill,
body .website-page .flagship-plan,
body .website-page .standard-plan,
body .website-page .flagship-target{color:var(--xz-red);background:var(--xz-cream)}
/* 「GEO 陪跑」卡的图标块（落地页 #loop 第二张卡，模板给的是 .icon-box.purple-bg）。
   原来这条把它钉成实色主色块 background:var(--xz-red)，但里面的 SVG 描边是 currentColor，
   而共享层 geosite.css:146 给 .purple-bg 的 color 是 #1d64f0（主色）→ 主色底 + 主色描边，
   图标几乎看不见，只剩一块实心蓝斑（实测 bg rgb(29,95,214) / color rgb(29,100,240)，色差 5）。
   与左卡统一成"淡底 + 主色描边"（同 764 那一组，也是【服务二·GEO 官网建设】图标改白底的同一条口径），
   两张卡的主次本来就靠 带教落地 徽标 + 描边 + 主按钮区分，不需要靠图标块加深。
   border 一并清掉：共享层给 .purple-bg 留了 1px 浅蓝描边（rgb(185,214,255)），
   本站是白底红字口径，图标块四周混进一条蓝线就是脏边；两卡宽高同为 52（border-box），去掉不改版式。 */
body .website-page .icon-box.purple-bg{background:var(--xz-cream);color:var(--xz-red);border:0;box-shadow:none}
body .website-page .present-card,
body .website-page .geo-card{border-color:rgba(var(--yz-tint),.42);box-shadow:0 12px 32px rgba(var(--yz-tint),.07)}
body .website-page .build-card{border-color:rgba(var(--yz-tint),.42)}
body .website-page .bullet-dot,
body .website-page .geo-item .check-icon,
body .website-page .value-tag-item .check-icon{background:var(--xz-red)}
body .website-page .geo-item .check-icon,
body .website-page .value-tag-item .check-icon{color:#fff}

/* --- 6) 卡片描边与悬停：共享层写死 #cfe0ff / #1f6bff --- */
body .website-page .module-card,
body .website-page .feature-card,
body .website-page .tech-card,
body .website-page .customer-card,
body .website-page .step-card,
body .website-page .group-card,
body .website-page .pillar-card,
body .website-page .delivery-notice,
body .website-page .standard-card,
body .website-page .guarantee-card{border-color:rgba(var(--yz-tint),.16)}
body .website-page .diagnosis-card:hover,
body .website-page .module-card:hover,
body .website-page .feature-card:hover,
body .website-page .tech-card:hover,
body .website-page .customer-card:hover,
body .website-page .step-card:hover,
body .website-page .pillar-card:hover{border-color:rgba(var(--yz-tint),.45)}
body .website-page .item-card,
body .website-page .del-box,
body .website-page .seo-item,
body .website-page .platform-item,
body .website-page .loop-step-item,
body .website-page .question-card{border-color:var(--xz-line)}
body .website-page .item-card .check-icon{border-color:var(--xz-red);color:var(--xz-red)}
body .website-page .hero-card{border-color:rgba(var(--yz-tint),.34);box-shadow:0 20px 50px rgba(var(--yz-tint),.06)}
body .website-page .divider-line{background:rgba(var(--yz-tint),.25)}
body .website-page .cost-banner{background:linear-gradient(135deg,var(--xz-cream),var(--xz-bg));border-color:rgba(var(--yz-tint),.22)}
body .website-page .value-text,
body .website-page .price-wrap .currency,
body .website-page .col-us,
body .website-page .row-highlight.purple,
body .website-page .notice-tag,
body .website-page .card-tag,
body .website-page .loop-header-title{color:var(--xz-red)}
body .website-page .price-wrap .price-num{color:var(--xz-ink)}
/* 价格卡「交付周期」pill 的补充备注（.period-note，如「按季度滚动复盘」「开班排期见训练营页」）：
   共享层 geosite.css:129 把它硬编码成警示红 #b42318 —— 那是给警示语义备的色，
   本站价格卡里它是补充说明不是警示，「科技蓝」主题下继续用红就是「红蓝很杂」的漏网红。
   按双槽位收归品牌色族（选择器比共享层多一级 body，特异性 (0,3,1) 压 (0,3,0)）：
   蓝主题 = 深蓝 #1B3FB5（浅灰 pill 底 8.0:1 / 浅蓝 flagship 底 7.3:1）；
   红主题 = 品牌深红 #B3121F（6.6:1 / 6.0:1），回切后与改动前观感一致。
   ⚠ 只动本站：共享层那行不动，其他租户不受影响。 */
body .website-page .period-pill .period-note{color:var(--xz-red-deep)}

/* --- 7) 首屏轨道区：只换色、降噪，不编造任何指标数字 --- */
body .website-page .hero-section{background-color:var(--xz-bg)}
body .website-page .hero-grid-bg{background-image:linear-gradient(90deg,rgba(var(--yz-tint),.05) 1px,transparent 0),linear-gradient(180deg,rgba(var(--yz-tint),.05) 1px,transparent 0)}
body .website-page .glow-one{background-color:rgba(var(--yz-tint),.08)}
body .website-page .glow-two{background-color:var(--yz-glow2)}
body .website-page .engine-ring{border-color:rgba(var(--yz-tint),.16)}
body .website-page .engine-ring:before{background:var(--xz-red)}
body .website-page .ring-middle{border-color:rgba(var(--yz-tint),.20)}
body .website-page .ring-middle:before{background:var(--xz-red-deep)}
body .website-page .ring-inner{border-color:rgba(var(--yz-tint),.12)}
body .website-page .ring-inner:before{background:var(--xz-gold-light)}
body .website-page .engine-center{border-color:var(--xz-red);box-shadow:0 24px 60px rgba(var(--yz-tint),.10),inset 0 0 28px rgba(var(--yz-tint),.04)}
body .website-page .engine-center strong{font-size:13px;line-height:1.45}
body .website-page .engine-icon{border-color:var(--yz-soft);color:var(--xz-red);background:var(--xz-cream)}
body .website-page .orbit-card span{color:var(--xz-ink)}
/* 降噪：共享层只关掉了外圈与卡片，中环/内环仍以 32–40s 匀速自转，首屏一直有东西在动。
   白底 + 红字这套要的是"稳"，所以本站把两圈虚线也钉死，只留静态的轨道示意。 */
body .website-page .ring-middle,
body .website-page .ring-inner{animation:none}
@media (prefers-reduced-motion:reduce){
  body .website-page :is(.orbit-card,.engine-center,.engine-icon,.engine-visual,.hero-section *:before){animation:none}
}

/* --- 8) 深浅带节奏：底色按叙事分组，不是机械交替（1280 实测）---
   白 = 问题与服务（shift/deliver）、奶油 = 方法与报价（loop/process/diagnose/price）、白 = 答疑与资讯（faq/news）。
   中间三节同色是有意连成一整块"方法论"，靠 78px 区块留白分段，不靠一条条边框。 */
body .website-page #shift,
body .website-page #deliver,
body .website-page #faq,
body .website-page #news,
body .website-page #cta{background-color:#fff}
body .website-page #loop,
body .website-page #process,
body .website-page #diagnose,
body .website-page #price{background-color:var(--xz-cream)}
body .website-page .content-section,
body .website-page .customer-value-section{border-top:1px solid var(--xz-line)}

/* --- 9) 内页与列表卡：圆角只认三档，阴影只认一档 --- */
.xz-form input,.xz-form textarea{border-radius:var(--zs-radius-sm)}
.xz-faq-item,.xz-list-card,.xz-step,.xz-contact-card{border-radius:var(--zs-radius)}
.xz-lead,.xz-code-like{border-radius:var(--zs-radius)}
.website-page .zs-faq-item{border-color:rgba(var(--yz-tint),.12)}
.website-page .zs-faq-item summary:before{background:var(--xz-red)}
.website-page .zs-faq-item summary:after{color:var(--xz-red)}
.website-page .zs-qr-box{border-color:rgba(var(--yz-tint),.3)}

/* --- 10) 窄屏收口（共享层只写了 1024/900/640 三档，这里补本站的 900 与 390）--- */
@media (max-width:900px){
  body .website-page .content-section,
  body .website-page .customer-value-section,
  body .website-page .hero-section{padding:52px 0}
  body .website-page .hero-layout{padding-top:38px;padding-bottom:44px;gap:28px}
  body .website-page .hero-actions{margin-top:26px}
  body .website-page .hero-actions :is(button,a){width:100%;height:46px}
}
@media (max-width:390px){
  /* 390 实测按钮文字 4 字 + 图标会换行挤压，收到 15px；价格大字用 clamp 已跟视口缩 */
  body .website-page .hero-actions{gap:10px}
  body .website-page .hero-actions :is(button,a){font-size:15px;padding:0 18px}
  body .website-page .price-wrap .price-num{font-size:36px}
}

/* =====================================================================
 * ===== 11) 缺失组件补全（2026-10-21 类名审计：页面在用、皮肤层没人管）=====
 *
 * 手法：把 Pages/*.cshtml 与共享模板里出现的 class 逐个和「本站真正加载的那批
 * CSS」比对（加载集在 _Layout.cshtml 的数组里，不是字面 href），挑出渲染出来
 * 却没有任何样式的补在这里。共享模板（_Pager / _Layout / GeoSite）一律不改，
 * 只在本皮肤层补 —— 这样 10001/10006/10008 三站零影响。
 */

/* 分页：_Pager.cshtml 是 17 个列表内页共用的服务端分页，本站此前没写样式，
   结果是「上一页 1 2 3 下一页 共 N 条」一串裸链接。口径与卡片组一致：
   白底细描边胶囊、悬停抬升 + 奶油底、当前页红实心；窄屏只留上一页/下一页 + 第几页。 */
.xz-pager{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px;margin-top:34px}
.xz-pg{
  display:inline-flex;align-items:center;justify-content:center;min-width:40px;height:40px;padding:0 14px;
  border:1px solid var(--xz-line);border-radius:var(--zs-radius-sm);background:#fff;
  color:var(--xz-ink);font-size:14px;text-decoration:none;font-variant-numeric:tabular-nums;
  transition:border-color .2s,background .2s,color .2s,transform .2s;
}
.xz-pg:hover{border-color:rgba(var(--yz-tint),.45);background:var(--xz-cream);color:var(--xz-red-deep);transform:translateY(-2px)}
.xz-pg.is-on{border-color:var(--xz-red);background:var(--xz-red);color:#fff;font-weight:700;transform:none}
.xz-pg.is-off{border-color:transparent;background:none;color:rgba(16,23,36,.25);pointer-events:none}
.xz-pg-gap{padding:0 2px;color:var(--xz-ink-soft)}
.xz-pg-total,.xz-pg-cur{margin-left:10px;font-size:13px;color:var(--xz-ink-soft);font-variant-numeric:tabular-nums}
.xz-pg-cur{display:none}
@media (max-width:900px){
  .xz-pager{gap:6px;margin-top:26px}
  .xz-pg{min-width:38px;height:38px;padding:0 12px}
  .xz-pg-num,.xz-pg-gap,.xz-pg-total{display:none}
  .xz-pg-cur{display:inline-flex}
}

/* 案例卡底部按钮位：卡体已由 .xz-case-rich 收过 20px 下边距，这里只做一排，不再叠加留白 */
.xz-case-action{display:flex;flex-wrap:wrap;gap:10px;padding:0 20px 20px;margin-top:-6px}

/* 讲师头像占位（后台没传图时显示姓氏首字）：.xz-teacher-avatar 已经画好圆底和字色，
   这里只补一圈描边，让"没有照片"看上去是有意的形态而不是缺图 */
.xz-teacher-avatar-ph{border:1px solid rgba(var(--yz-tint),.24)}

/* 抽屉里的电话入口：_Layout 内联默认 display:none（权重 0,1,0），本站用
   .xz-nav .xz-drawer-tel（0,2,0）开启——桌面页眉有红胶囊 CTA，页眉收成抽屉后
   不能再没有联系入口。抽屉是深色，所以用实心红而不是描边。
   必须套断点：本站页眉在 ≤1199px 才变抽屉（901–1199 与 ≤900 两段，见上面页眉断点注释），
   写成全局规则的话桌面导航也会被这条 width:100% 的胶囊挤到第二行（1280 实测页眉 92px 高）。 */
@media (max-width:1199px){
  .xz-nav .xz-drawer-tel{
    display:flex;align-items:center;justify-content:center;gap:6px;width:100%;height:46px;margin-top:18px;
    border-radius:999px;background:var(--xz-red);color:#fff;font-size:15px;font-weight:700;text-decoration:none;
  }
  .xz-nav .xz-drawer-tel:active{background:var(--xz-red-deep);color:#fff}
}

/* 落地页企业主体区的三个次级链接：模板用了 .ghost-btn 但共享层没定义，此前是裸链接 */
.website-page .ghost-btn{
  display:inline-flex;align-items:center;height:38px;padding:0 16px;border-radius:999px;
  border:1px solid rgba(var(--yz-tint),.26);background:rgba(var(--yz-tint),.04);
  color:var(--xz-red-deep);font-size:13px;font-weight:600;text-decoration:none;
  transition:border-color .2s,background .2s,transform .2s;
}
.website-page .ghost-btn:hover{border-color:var(--xz-red);background:rgba(var(--yz-tint),.1);transform:translateY(-2px)}

/* 诊断区第一张卡（模板给 cards[0] 加了 .highlighted，想让"起点"先被读到）与
   loop 区两张底部卡（.deliverables-card / .value-card）在共享层没有任何定义，
   意图静默丢失。这里只补"可感觉到但不喧哗"的一档：第一张加细红条与更实的投影，
   两张底部卡各自用一条顶部细带区分交付物与价值，不放大、不换第二套配色。 */
body .website-page .diagnosis-card.highlighted{
  position:relative;overflow:hidden;border-color:rgba(var(--yz-tint),.26);
  box-shadow:0 10px 30px rgba(var(--yz-tint),.07);
}
body .website-page .diagnosis-card.highlighted:before{
  content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--xz-red);
}
body .website-page .bottom-card{position:relative}
body .website-page .bottom-card:before{
  content:"";position:absolute;left:24px;right:24px;top:0;height:2px;border-radius:2px;
  background:linear-gradient(90deg,var(--xz-red),rgba(var(--yz-tint),.18));
}
body .website-page .bottom-card.value-card:before{background:linear-gradient(90deg,var(--xz-red-deep),rgba(var(--yz-tint),.14))}


/* ============================================================
   通用内容详情页（Pages/Shared/_ContentDetail.cshtml，路由 /View?id=）
   结构四站共用，颜色全部走各自的 --xz-* 槽位：换客户、换肤都不用改这段。
   ============================================================ */
.xz-detail-meta{display:flex;flex-wrap:wrap;gap:8px 18px;margin:0 0 22px;padding-bottom:16px;
  border-bottom:1px solid var(--xz-line);font-size:13px;color:var(--xz-ink-soft)}
.xz-detail-file{margin:26px 0 0}
.xz-detail-foot{display:flex;flex-wrap:wrap;gap:12px;margin:34px 0 0;padding-top:24px;
  border-top:1px solid var(--xz-line)}
.xz-detail-more{margin:44px 0 0}
.xz-detail-more h2{margin:0 0 14px;font-size:16px;font-weight:700;color:var(--xz-ink)}
.xz-detail-more ul{list-style:none;margin:0;padding:0;display:grid;gap:10px}
.xz-detail-more a{font-size:15px;color:var(--xz-red);text-decoration:none}
.xz-detail-more a:hover{text-decoration:underline}
@media (max-width:900px){
  .xz-detail-meta{font-size:12px;gap:6px 14px}
  .xz-detail-foot>*{flex:1 1 auto;text-align:center}
}

/* 报价区两列卡在窄屏被 min-content 顶破容器（333px 实测：轨道 286、卡片 322，
   多出的 36px 由 .website-page 的 overflow-x:hidden 裁掉 → 右侧内容看不见也滚不到）。
   共享层 geosite.css 没给 .pricing-grid 断点，这里按本站口径收成单列并解除最小宽约束。 */
@media (max-width:900px){
  body .website-page .pricing-grid{grid-template-columns:minmax(0,1fr);gap:18px}
  body .website-page .pricing-card{min-width:0;padding:28px 20px}
  body .website-page .pricing-card>*{min-width:0;overflow-wrap:anywhere}
}

/* =====================================================================
 * ===== 12) 2026-10-22 客户四点细节整改（只动本站皮肤，配色一行不改）=====
 *
 * 先记实测数值，免得下一个人以为这些数字是拍的（1280 视口、iframe 内量，ws=10009）：
 *   容器轨：.xz-wrap / .xz-hero-inner 都是 L=33 W=1200 ✅，栅格 L=53 W=1160 ✅；
 *   但正文各写各的——/Service 的 .xz-rich 铺满 1160（单行 68 字）、/AboutUs 的
 *   .xz-about 是 L=203 W=860、/Terms 的 .xz-legal 860、/Report 的 .xz-wrap-narrow 860
 *   外加 .xz-form 680 → 同一条正文链上出现了 1160/900/860/820/680 五种宽度。
 *   面包屑文字左边缘实测 73，正文实测 53：.xz-crumbs 外面那层 .xz-wrap 已经带
 *   20px 内边距，它自己又写了一遍 padding:0 20px，等于内缩两次。
 * 本段把内页收成三档，不再承认第四种：容器轨 1200（--zs-max）→ 栅格 1160 → 正文 900。
 * 只写在本文件：本文件只被 10009 加载，喜座/润丰/智搜零影响；颜色全部走已有 token，
 * 蓝/红两套主题（后台【网站设置】切换）都自动跟随。
 * ===================================================================== */

/* --- 12.1 宽度三档收口：容器轨 1200 → 栅格 1160 → 正文 900 --- */
/* .xz-wrap-narrow 与 .xz-legal 是"容器"（和 .xz-wrap 写在同一个元素上），必须留在 1200 这条轨上：
   给它们 900 会让整栏左边缘比页眉 logo、面包屑、卡片栅格右移 130px（实测 53 → 183），
   靠左贴边后更会直接顶到视口左沿（/Terms 实测 0）。 */
.xz-wrap-narrow,.xz-legal{max-width:var(--zs-max);margin-left:auto;margin-right:auto}
/* 真正的正文阅读栏才是 900，而且靠左贴轨、不居中：
   本页 .xz-title 是左对齐 + 64px 下划条，标题在 53、正文居中跑到 183，
   客户 /Teacher 截图上指的"内容宽度不统一、左边缘不齐"就是这一处。 */
.xz-rich,.xz-about-rich,.xz-article-rich,.xz-about{
  max-width:900px;margin-left:0;margin-right:auto;
}
/* 留言表单不在"贴左轨"这一批里：/Report 的正文只有导语面板 + 一条 680 表单，
   表单贴左轨 = 右边空 480（实测 x=60、margin-right:480），客户判"居中问题"（16 章）。
   这里不再写 margin-left:0，交回 560 行本皮肤自己的口径（max-width:680 + margin:0 auto 居中）。
   正文阅读栏（.xz-rich / .xz-about / .xz-article-rich）仍然靠左贴轨，那条不改。 */

/* --- 12.2 面包屑：对齐、位置、间距 --- */
/* 只留纵向节奏，横向内缩交给外层 .xz-wrap —— 文字左边缘从 73 回到 53，与正文同轨。 */
.xz-crumbs{max-width:none;margin:0;padding:16px 0 0}
.xz-crumbs b{color:var(--xz-ink);font-weight:700}
/* 面包屑是过渡信息，不是版面主角：紧跟它的第一节正文上边距 74 → 34。
   用 :has 而不是改 .xz-section 全局值，其余节（带底色那条）节奏不动。 */
main > .xz-wrap:has(> .xz-crumbs) + .xz-section{padding-top:34px}
/* 另一类页面（/Case /Prolist /AboutUs /Faq /Process /ContactUs /Terms …）的面包屑由 _Layout 画，
   DOM 顺序是 面包屑 → banner → 正文，重排后正文紧跟在面包屑下方，
   所以上一条的 "+ .xz-section" 命中不到（它的下一个兄弟是 banner）。
   这里按视觉顺序补同一条：banner 之后的第一节上边距 74 → 34。 */
main[role="main"] > .xz-inner-hero + .xz-section{padding-top:34px}
/* _ContentList 那 9 个页面（/Service /Down /Certificate /Partner /Merchants …）首屏
   用的是 .xz-hero，公共模板那条"面包屑排到 banner 下方"的重排规则只认 .xz-inner-hero，
   实测这些页面包屑排在 banner 上方（crumbBottom=117 正好等于 hero 顶边）。这里补同一套：
   banner 排到最前，面包屑自然落回 banner 与正文之间；width:100% 是防 flex 列把
   .xz-wrap 按内容收缩（10-21 四站塌行就是这一条，别再删）。 */
main:has(> .xz-hero){display:flex;flex-direction:column}
main > .xz-wrap:has(> .xz-crumbs):first-child + .xz-hero{order:-1}
main:has(> .xz-hero) > .xz-wrap{width:100%}
main:has(> .xz-hero) > .xz-hero + .xz-section{padding-top:34px}

/* --- 12.3 页眉/抽屉手机号：PC 与移动端都不显示 --- */
/* 客户口径：号码只在页脚出现一次。_Layout 的标记是四站共用的，不动它，只在本皮肤里关。
   页脚 NAP 已实测有 <a href="tel:"> 号码，首屏另有「联系我们」按钮，联系入口不丢。
   写在文件末尾：与上面 .xz-header-btn（行 130/655）和 938 行抽屉那条同权重，靠顺序压过。 */
.xz-header-btn{display:none}
.xz-nav .xz-drawer-tel{display:none}

/* --- 12.4 列表卡：照参考图补左侧色条、右上序号、分类日期行、宽松内边距 --- */
/* 这里原来还给"卡片所在那一节"铺了 var(--xz-bg) 浅蓝底（做"白卡浮在奶油底上"的分层），
   15 章按用户要求整站内页一律白底，那条已随 15 章一并删除，不要再加回来。 */

/* 序号：CSS counter，不占标记、不依赖后台字段，列表顺序变了也自动跟着变。 */
.xz-list-grid,.xz-news-grid,.xz-case-grid,.xz-dish-grid{counter-reset:xzcard}
.xz-list-card,.xz-news,.xz-case,.xz-dish{counter-increment:xzcard}
.xz-list-card:not(:has(.xz-list-img))::before,
.xz-dish:not(:has(.xz-dish-img))::before,
.xz-news.no-img::before,.xz-case.no-img::before{
  content:counter(xzcard,decimal-leading-zero);
  position:absolute;top:14px;right:18px;z-index:1;pointer-events:none;
  font-size:42px;font-weight:800;line-height:1;letter-spacing:1px;
  color:rgba(var(--yz-tint),.14);font-variant-numeric:tabular-nums;
}
/* 报价卡没有配图时，Prolist/Index 会输出一块 .xz-dish-pic 名称占位，紧跟其下的
   .xz-dish-name 又是同一个产品名 → 一张卡里标题出现两遍（10009 实测 /Prolist 三张全中）。
   占位块在这里收起、编号交给上面那条 ::before；详情页 .xz-dish-detail-pic 里同名的那块
   是图片背后的底衬（不是 .xz-dish 的直接子级），用 > 精确限定，不受这条影响。 */
.xz-dish > .xz-dish-pic{display:none}
.xz-dish-name{padding-right:56px}
/* 色条从"顶部 2px 横带"改成参考图那种"左侧 3px 竖条"：静止时就可见，悬停点亮。
   沿用 ::after 与既有 hover 规则，不新增伪元素，图片卡也不会多画一层。 */
.xz-list-card::after,.xz-news::after,.xz-case::after,.xz-dish::after{
  left:0;top:0;width:3px;height:100%;opacity:.9;border-radius:3px 0 0 3px;
  background:linear-gradient(180deg,var(--xz-red-deep),var(--zs-logo-hot));
}
.xz-list-card:hover::after,.xz-news:hover::after,.xz-case:hover::after,.xz-dish:hover::after{opacity:1}
/* 双列节奏（参考图是两列）：卡片有摘要与序号之后信息量变大，三列会把标题压成两三行。 */
.xz-list-grid,.xz-news-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}
.xz-list-body,.xz-news-body{padding:26px 30px 28px}
.xz-list-body h4,.xz-news-body h4{
  margin:0 0 12px;padding-right:58px;font-size:19px;line-height:1.5;letter-spacing:.3px;
}
.xz-list-body p,.xz-news-excerpt{
  font-size:14.5px;line-height:1.9;color:var(--xz-ink-soft);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
/* 数据还没配图/摘要时（10009 现在 27 行 Image 全空），卡片靠最小高保住形态，
   不再塌成 80px 的一条标题——这是"细节不够好"里最直观的一处。 */
.xz-list-card{min-height:158px}
/* 分类 · 日期行（_ContentList 新增的 .xz-list-meta 用这套；老页面的日期徽标也顺手改成同一形态） */
.xz-list-meta{
  display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:0 0 12px;
  font-size:12px;font-weight:700;letter-spacing:1.4px;color:var(--xz-red-deep);
}
.xz-list-meta i{font-style:normal;color:rgba(var(--yz-tint),.45)}
.xz-list-meta .xz-list-date{
  font-weight:400;letter-spacing:.6px;color:var(--xz-ink-soft);font-variant-numeric:tabular-nums;
}
/* 无图资讯卡的日期徽标原本是绝对定位压在卡顶（所以正文要多让 46px），
   现在它是"分类·日期"这一行的一部分，改成正常流、与标题同一条左边线。 */
.xz-news.no-img .xz-news-ribbon{
  position:static;display:block;margin:0;padding:26px 58px 0 30px;
  background:none;border:0;border-radius:0;box-shadow:none;
  color:var(--xz-red-deep);font-size:12px;font-weight:700;letter-spacing:1.4px;
  font-variant-numeric:tabular-nums;text-align:left;
}
.xz-news.no-img .xz-news-body{padding-top:10px}

/* --- 12.5 上面这些改动的窄屏收口（≤900 与 _Layout 抽屉断点一致） --- */
@media (max-width:900px){
  .xz-list-grid,.xz-news-grid{grid-template-columns:minmax(0,1fr);gap:16px}
  .xz-list-body,.xz-news-body{padding:22px 22px 24px}
  .xz-list-body h4,.xz-news-body h4{font-size:17px;padding-right:46px}
  .xz-list-card{min-height:0}
  .xz-list-card:not(:has(.xz-list-img))::before,
  .xz-dish:not(:has(.xz-dish-img))::before,
  .xz-news.no-img::before,.xz-case.no-img::before{top:16px;right:16px;font-size:34px}
  .xz-dish-name{padding-right:44px}
  .xz-news.no-img .xz-news-ribbon{padding:22px 44px 0 22px}
  main > .xz-wrap:has(> .xz-crumbs) + .xz-section,
  main[role="main"] > .xz-inner-hero + .xz-section,
  main:has(> .xz-hero) > .xz-hero + .xz-section{padding-top:26px}
}

/* --- 12.6 产品详情（/Proinfo）：没有配图时不要把标题再打一遍 --- */
/* .xz-dish-detail-pic 里的 .xz-dish-pic 本来是图片背后的底衬（有图时被 img 盖住）。
   10009 三个产品都没录封面图，实测左栏因此只剩一条 45px 高的产品名，
   右栏 h2 紧接着又写一遍同样的名字——一行字出现两次，中间还空着半版。
   没图时整块收起、版式退成单栏，标题只留右栏那一处（并给它详情级的字号）。 */
.xz-dish-detail:not(:has(.xz-dish-detail-img)){grid-template-columns:minmax(0,1fr)}
.xz-dish-detail-pic:not(:has(.xz-dish-detail-img)){display:none}
.xz-dish-detail-info .xz-dish-name{margin-bottom:14px;font-size:28px;line-height:1.4}

/* --- 12.7 已删除（2026-10-22）---
   这一条是 10-21 只在 /Case 试做导语面板时的原型：选择器用
   `main > .xz-section:has(+ .xz-section .xz-case-grid) > .xz-wrap > .xz-about-rich`，
   特异性 (0,6,1) 比 13.12 契约选择器 (0,3,1) 高，卡片契约铺开到八类列表页后它仍在压着 /Case，
   表现是同一站内 /Case 的导语面板停留在旧尺寸（min-height:112 + 34px 水印 right/bottom 14px）、
   /News /Course 用的是新规格。13.12 已完整覆盖它（含 padding-bottom:0 与栅格节 pt 28 两条节奏），
   此处删除，不再有过渡规则。 */


/* --- 12.8 案例卡：等高、超出裁掉并渐隐、按钮钉底、列数自适应 --- */
/* 三张卡内容量差很大（正文实测高 473 / 447 / 318px）：栅格虽然把外框拉成等高，
   但按钮紧跟正文，于是三张卡的"查看详情"停在三个高度上，最短那张下面空一大片。
   做法：正文给固定高度 + overflow 裁掉 + 底部渐隐遮罩（不是硬切一刀），
   卡体改成弹性列、按钮 margin-top:auto 钉到卡底 → 三张卡观感一致。
   完整内容本来就有「查看详情」与 #锚点两条路，藏掉的不是信息。 */
main > .xz-section:has(.xz-case-grid) > .xz-wrap > .xz-case-grid{
  grid-template-columns:repeat(auto-fit,minmax(280px,1fr));
  /* 跨行也等高：两列时第三条会单独落在第二行，栅格默认只把"同一行"拉平，
     于是手机上三张卡 479/452/426 各截一段。grid-auto-rows:1fr 让整个网格的行高等于最高那行。 */
  grid-auto-rows:1fr;
}
.xz-case{display:flex;flex-direction:column}
.xz-case-body{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}
.xz-case-rich{
  padding:0;                    /* 卡体内边距已由 .xz-case-body 给过，这里再让 20px 会让正文比标题缩进一格 */
  max-height:400px;overflow:hidden;
  -webkit-mask-image:linear-gradient(180deg,#000 calc(100% - 46px),rgba(0,0,0,0));
  mask-image:linear-gradient(180deg,#000 calc(100% - 46px),rgba(0,0,0,0));
}
/* Case.cshtml 的 Scripts 段里有一条内联 .xz-case-action{margin-top:14px}，
   内联 <style> 在 body 内、比 head 的链接晚生效，所以这里必须比它高一级权重。
   注意不能用 body .website-page 提权——.website-page 只在落地页 /GeoSite 上有，
   内页压根没有这个类（10009 实测 document.querySelector('.website-page') = null），
   写成那样会静默不生效；这里加一层 body 就够压过单类名的内联规则。 */
/* 正文与"查看详情"之间留 40px 空档（用户定稿值）。这里是 margin-top:auto + padding-top
   一起用：卡片等高时正文短的卡按钮钉在卡底，正文长的卡也至少留 40px，两种情况都不贴字。
   手机端在下面的 900px 断点收到 24px（单列时卡更高，40px 会空出一片）。 */
body .xz-case-action{margin-top:auto;padding-top:40px}

/* --- 12.9 卡片左侧色条：只跟标题一样高，不再拉满整张卡 ---
   参考图那条色条是"标题那么长"的一小段，之前做成整卡高的竖条，卡片一高就变成一根长杠。
   ⚠️ 上一版把条画在 left:-20px（标题盒子外面），结果 12.10 给标题加了两行截断
   （-webkit-line-clamp 自带 overflow:hidden）→ 条被标题自己的 overflow 裁掉，线上整条消失（用户截图）。
   修法：色条画在 left:0（标题 padding box 内，裁不到），位置靠"负 margin 外扩 + 同值 padding 内缩"补回来，
   净位移为 0 → 文字仍对齐卡体内边距，条贴到卡片内边（1px 边框内侧）。
   负值就是卡体内边距：.xz-case-body/.xz-dish-body 20px，.xz-list-body/.xz-news-body 30px。 */
.xz-case-title,.xz-dish-body .xz-dish-name,.xz-list-body h4,.xz-news-body h4{position:relative}
.xz-case-title,.xz-dish-body .xz-dish-name{margin-left:-20px;padding-left:20px}
.xz-list-body h4,.xz-news-body h4{margin-left:-30px;padding-left:30px}
.xz-case-title::before,.xz-dish-body .xz-dish-name::before,.xz-list-body h4::before,.xz-news-body h4::before{
  content:"";position:absolute;top:2px;left:0;width:3px;height:calc(100% - 4px);border-radius:2px;
  background:linear-gradient(180deg,var(--xz-red-deep),var(--zs-logo-hot));
}
/* 整卡高那条竖条收起：伪元素仍留给 hover 用的规则不删，只把绘制关掉 */
.xz-list-card::after,.xz-news::after,.xz-case::after,.xz-dish::after{display:none}

/* --- 12.10 卡片标题：统一按两行占位，超过两行截成省略号 ---
   三张卡标题一行/两行混排 → 正文起点各差一截，卡面看起来没对齐（用户圈的就是这个）。
   口径：以最长的那条为准，标题区固定两行高；标题本身最多两行，超出用 … 收尾，
   完整标题在详情页和 #锚点里都在，藏掉的不是信息。
   这条同时决定了 12.9 那根短色条的高度（色条跟着标题盒子走），
   所以"其他卡片也要这个高度"= 四类卡片标题一律两行占位，色条自然等高。
   两行的算法高度 = 字号 × 行高 × 2：案例/菜品 17×1.5×2=51，列表/资讯 19×1.5×2=57
   （10009 实测两行标题正好 51px）。写成 calc 而不是像素，是以后改字号时占位自动跟着变。 */
.xz-case-title,.xz-list-body h4,.xz-news-body h4,.xz-dish-body .xz-dish-name{
  display:-webkit-box;-webkit-box-orient:vertical;
  -webkit-line-clamp:2;line-clamp:2;overflow:hidden;
}
.xz-case-title,.xz-dish-body .xz-dish-name{min-height:calc(17px * 1.5 * 2)}
.xz-list-body h4,.xz-news-body h4{min-height:calc(19px * 1.5 * 2)}

@media (max-width:900px){
  /* 12.7 的窄屏伴随规则已随主体一起删（导语面板窄屏规格统一写在 13.14） */
  .xz-case-rich{max-height:340px}
}
/* 单列（手机）时整栏变宽，截断线跟着收紧，避免卡片下半屏空白 */
@media (max-width:640px){
  .xz-case-rich{max-height:300px}
}

/* --- 12.11 案例卡「查看详情」按钮：放大一档并居中 ---
   小气的根源不在皮肤，在 Case.cshtml 里那段页面内 <style>：它把卡片按钮压成
   13px / padding 6px 14px（基础 .xz-btn 是 15px / 12px 26px），三张卡的按钮像三个小药片。
   这里用 body 前缀抬到 (0,2,1) 压过页面内样式的 (0,2,0)，不改 cshtml 就能生效（无需重启）。
   居中：卡片正文是左对齐的，按钮居中后卡底有一条对称的收口线，比左吊着更稳。
   ⚠️ 必须用 justify-content：928 行把 .xz-case-action 定义成 display:flex，
   在这里写 text-align:center 完全不生效（实测按钮中心比容器中心偏左 87px）。 */
body .xz-case-action{justify-content:center}
body .xz-case-action .xz-btn{font-size:14px;padding:11px 28px;letter-spacing:.5px}

/* --- 12.12 文章详情页（/Caseview /Newsview /Reportview）：正文铺满 1200 轨、元信息居中 ---
   判范围用 :has(.xz-article-nav)：带"上一/下一"导航的才是文章详情，
   /Privacy /Terms 只有 .xz-article-rich、没有这层 nav，不会被误伤（它们要贴左轨，见 12.1）。
   上一版把正文栏收成 900 居中，用户否掉："内容应该左对齐，最大宽度应该是 1200px"。
   所以这里两件事：① 取消 12.1 给 .xz-article-rich 的 900 上限（详情页不吃那条，铺满 .xz-wrap 的 1200）；
   ② 靠左贴轨，与面包屑同一条左边线（实测 1280 下正文左边缘 = 53 = 面包屑左边缘）。
   发布时间/署名仍居中（用户上一轮点名要居中，本轮没有推翻）。 */
main > .xz-section:has(.xz-article-nav) .xz-article,
main > .xz-section:has(.xz-article-nav) .xz-article-rich{
  max-width:none;margin-left:0;margin-right:auto;
}
/* 元信息用块级居中：这里不能用 flex —— flex 子项的 flex-basis 会盖掉 width，
   下面那根 64px 的线写成 flex-basis:100% 换行后，实测被拉成 900px 满宽（正是要避免的"拉满"），
   所以整块用 display:block + text-align:center，线用 display:block + margin:auto 居中。 */
main > .xz-section:has(.xz-article-nav) .xz-article-meta{
  display:block;text-align:center;margin-bottom:28px;font-size:14px;letter-spacing:.3px;
}
main > .xz-section:has(.xz-article-nav) .xz-article-meta span{display:inline-block}
/* 元信息两项之间加一个中点分隔（原来是 gap:8px 18px 两块干挨着） */
main > .xz-section:has(.xz-article-nav) .xz-article-meta span + span::before{
  content:"·";margin:0 12px 0 20px;color:rgba(var(--yz-tint),.45);
}
/* 元信息下面一条 64px 居中的细线，替代"直接开始正文"的突兀感（跟标题下划条同一口径） */
main > .xz-section:has(.xz-article-nav) .xz-article-meta::after{
  content:"";display:block;width:64px;height:2px;border-radius:2px;margin:14px auto 0;
  background:linear-gradient(90deg,var(--xz-red-deep),var(--zs-logo-hot));
}
/* 正文里的小标题（案例的"背景/做法/结果"是 h3）拉开节奏：18 → 20px，上边距 26 → 36 */
main > .xz-section:has(.xz-article-nav) .xz-article-rich h3{margin:36px 0 14px;font-size:20px}
main > .xz-section:has(.xz-article-nav) .xz-article-rich h2{margin:42px 0 16px}
main > .xz-section:has(.xz-article-nav) .xz-article-cover{margin-bottom:34px}
@media (max-width:900px){
  main > .xz-section:has(.xz-article-nav) .xz-article-rich h3{margin:28px 0 12px;font-size:18.5px}
  /* 单列卡片里正文短、卡又高，40px 空档会空出一片，收到 24px */
  body .xz-case-action{padding-top:24px}
}

/* =====================================================================
 * 13. 卡片契约（.xz-card* / .xz-intro / .xz-detail）
 * ---------------------------------------------------------------------
 * 为什么要契约：12.4 / 12.8 / 12.9 / 12.10 那几版都是把卡片类名一条条列出来手写
 * （.xz-case-title、.xz-list-body h4、.xz-news-body h4、.xz-dish-body .xz-dish-name …），
 * 新增一个列表页就得记得回来补一条，漏了那页就不跟着变——用户说的"改样式其他页不同步"根因在这。
 * 现在模板只负责挂契约类，皮肤层只认契约类：
 *   .xz-card                 卡壳（栅格子项，弹性列）
 *     .xz-card-media         缩略图位（196px，object-fit:cover）；--ph = 名称占位块，无图不占位
 *     .xz-card-meta          分类·日期行（挂在卡顶或卡体内都可用）
 *     .xz-card-body          卡体（弹性列，内边距 = --yz-card-pad）
 *       .xz-card-title       标题（两行占位 + 左侧渐变色条）
 *       .xz-card-sum         摘要；--clamp = 超长截断并底部渐隐；--line2 = 两行省略号
 *       .xz-card-note        落款（日期 / 署名 / 文件名）
 *       .xz-card-foot        卡底动作行（钉底）；--pin = 与正文之间再留 --yz-card-foot-gap
 *         .xz-card-price     价格　　.xz-card-btn 按钮
 *   变体：--center-btn 按钮居中、--row 头像在左的横排卡、--media-top 图上文下、--no-media 无图。
 * 老类（.xz-case / .xz-news / .xz-dish / .xz-list-card / .xz-video-card / .xz-teacher-card）
 * 全部留在标记里：其它租户的皮肤、页内脚本、#锚点还在按老类名找元素，删掉就是跨租户事故。
 * ⚠️ 两个同名坑，改这里之前先看完：
 *   1) 后台面板也叫 .xz-card / .xz-card-body（Pages/Admin/*，样式在 geo-admin.css）。后台走
 *      _AdminLayout、不加载租户皮肤，本文件也不作用于后台，两边互不影响，别去"顺手统一"。
 *   2) .xz-lead 已经是课程详情页那张「留资表单」容器（637 行），所以导语面板另起名 .xz-intro，
 *      不要合并——合并后表单块会被套上水印和 112px 最小高。
 * 权重口径：12.4–12.12 那批老规则里还有 Index（首页服务卡/资讯卡，第二批才挂契约类）在用，
 * 所以老规则暂时不删，本节统一加 main 前缀抬到 (0,x,1) 以上，保证同权重时本节在后面获胜。
 * 验收：重启 8080 后逐页对比，本节与 12.4–12.12 的差值必须为 0；确认后可以整段删掉 12.4–12.12。
 * ===================================================================== */
:root{
  --yz-card-pad:24px;        /* 卡体内边距：全站列表卡唯一口径（移动端在 13.14 收到 22px） */
  --yz-card-gap:22px;        /* 卡片间距 */
  --yz-card-sum-h:400px;     /* 长摘要截断高度（--clamp） */
  --yz-card-foot-gap:40px;   /* 正文与卡底动作行的空档（用户定稿值） */
}

/* --- 13.1 栅格：列数只在这两条里改 ---
   三列族：340px 起，1200 轨（1160 净宽）正好三列，窗口窄一档自动退两列；
   两列族：480px 起，卡面要放「分类·日期 + 两行标题 + 摘要」，三列会把标题挤成半句。
   grid-auto-rows:1fr：跨行也等高——两列时末条单独落一行，栅格默认只拉平"同一行"。
   ⚠️ 首页 .xz-promise-grid / .xz-scene-grid 是四列图标卡，不吃卡片契约，别加进来。 */
main .xz-case-grid,main .xz-dish-grid,main .xz-video-grid,main .xz-teacher-grid{
  grid-template-columns:repeat(auto-fit,minmax(340px,1fr));grid-auto-rows:1fr;gap:var(--yz-card-gap);
}
main .xz-news-grid,main .xz-list-grid{
  grid-template-columns:repeat(auto-fit,minmax(480px,1fr));grid-auto-rows:1fr;gap:var(--yz-card-gap);
}
/* 卡片那一节的浅蓝底带已在 15 章统一去掉（原来这里和 12.4 各写了一份，重复两处）。 */

/* --- 13.2 卡壳：弹性列 + 自成一体的外观（新页面只挂 .xz-card 就有完整形态） --- */
main .xz-card{
  position:relative;display:flex;flex-direction:column;overflow:hidden;color:inherit;text-decoration:none;
  background:#fff;border:1px solid var(--xz-line);border-radius:var(--zs-radius);
  box-shadow:var(--xz-shadow);transition:transform .22s,box-shadow .22s,border-color .22s;
}
main .xz-card:hover{transform:translateY(-4px);border-color:rgba(var(--yz-tint),.32);box-shadow:0 18px 40px rgba(var(--yz-tint),.16)}
/* 整卡高的左侧竖条（12.4 用 ::after 画的）统一关掉，色条改画在标题那一行——卡片一高就不会变成一根长杠。
   图上文下的媒体卡（视频）保留顶部 2px 信号带，那是它唯一的装饰线。 */
main .xz-card:not(.xz-card--media-top)::after{display:none}

/* --- 13.3 缩略图位：固定 196px，图片尺寸不参与布局（不会引起 CLS） --- */
main .xz-card-media{position:relative;flex:none;height:196px;overflow:hidden;background:var(--xz-cream)}
main .xz-card-media img{display:block;width:100%;height:100%;object-fit:cover;transition:transform .4s}
main .xz-card:hover .xz-card-media img{transform:scale(1.04)}
/* 无图不占位：模板在没有封面时会输出一块"产品名占位"（.xz-dish-pic 那类），
   卡里等于把标题写两遍、中间空一格——整块收起，标题只留正文那一处。 */
main .xz-card-media--ph{display:none}
/* 无图卡靠最小高保住形态，不塌成一条标题（10009 现在多数条目还没封面） */
main .xz-card.xz-card--no-media{min-height:158px}

/* --- 13.4 卡体 --- */
main .xz-card-body{
  display:flex;flex-direction:column;flex:1 1 auto;min-height:0;
  padding:var(--yz-card-pad) var(--yz-card-pad) 22px;
}

/* --- 13.5 标题：两行占位 + 左侧渐变色条 ---
   色条画在 left:0（标题 padding box 内）而不是盒子外面：-webkit-line-clamp 自带 overflow:hidden，
   画在外面会被标题自己裁掉（12.9 就踩过，线上整条消失）。位置靠"负 margin 外扩 + 同值 padding 内缩"
   补回来，净位移 0 → 文字仍与卡体内边距对齐，条贴到卡片内边。 */
main .xz-card-body .xz-card-title{
  position:relative;font-size:18px;font-weight:700;line-height:1.5;letter-spacing:.3px;color:var(--xz-ink);
  margin:0 0 12px;margin-left:calc(var(--yz-card-pad) * -1);padding-left:var(--yz-card-pad);
  display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;
  min-height:calc(18px * 1.5 * 2);   /* 写成 calc：以后改字号，两行占位自动跟着变 */
}
main .xz-card-body .xz-card-title::before{
  content:"";position:absolute;top:2px;left:0;width:3px;height:calc(100% - 4px);border-radius:2px;
  background:linear-gradient(180deg,var(--xz-red-deep),var(--zs-logo-hot));
}
/* 右上角序号要占掉一条竖位，标题给它让 58px（只有无图卡才画序号） */
main .xz-card.xz-card--no-media .xz-card-title{padding-right:58px}

/* --- 13.6 分类·日期行 --- */
main .xz-card-body .xz-card-meta,
main .xz-card > .xz-card-meta{
  display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:0 0 12px;
  font-size:12px;font-weight:700;letter-spacing:1.4px;color:var(--xz-red-deep);
}
main .xz-card .xz-card-meta i{font-style:normal;color:rgba(var(--yz-tint),.45)}
main .xz-card .xz-card-meta .xz-list-date{font-weight:400;letter-spacing:.6px;color:var(--xz-ink-soft);font-variant-numeric:tabular-nums}
/* 分类行直接挂在卡顶的场合（资讯/课程/报告的无图卡）：徽标本来是一片 170px 灰洞，
   现在走正常流、与标题同一条左边线，右边继续给序号让位；卡体只留 10px，不再重复让高。 */
main .xz-card.xz-card--no-media > .xz-card-meta{
  position:static;margin:0;padding:26px var(--yz-card-pad) 0 var(--yz-card-pad);
  background:none;border:0;border-radius:0;box-shadow:none;color:var(--xz-red-deep);text-align:left;
}
main .xz-card.xz-card--no-media > .xz-card-body{padding-top:10px}

/* --- 13.7 摘要 --- */
main .xz-card-body .xz-card-sum{margin:0;font-size:14px;line-height:1.85;color:var(--xz-ink-soft)}
/* --clamp：正文特别长的卡（案例、报价）固定高度 + 底部渐隐。
   三张案例卡内容量差很大（实测正文高 473/447/318），不定高按钮就停在三个高度上；
   渐隐（mask）而不是硬切一刀，完整内容在详情页和 #锚点里都在，藏掉的不是信息。 */
main .xz-card-body .xz-card-sum--clamp{
  max-height:var(--yz-card-sum-h);overflow:hidden;padding:0;
  -webkit-mask-image:linear-gradient(180deg,#000 calc(100% - 46px),rgba(0,0,0,0));
  mask-image:linear-gradient(180deg,#000 calc(100% - 46px),rgba(0,0,0,0));
}
/* --line2：一句话摘要（资讯/栏目）两行收尾 */
main .xz-card-body .xz-card-sum--line2{
  display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;
}

/* --- 13.8 落款 --- */
main .xz-card-body .xz-card-note{
  display:block;margin:12px 0 0;font-size:13px;line-height:1.7;color:var(--xz-ink-soft);
  font-variant-numeric:tabular-nums;word-break:break-all;
}

/* --- 13.9 卡底：钉到卡底，正文短的卡与正文长的卡收口线一致 --- */
main .xz-card .xz-card-foot{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  margin-top:auto;padding-top:12px;
}
main .xz-card .xz-card-foot--pin{padding-top:var(--yz-card-foot-gap)}   /* 用户定稿：正文与「查看详情」之间 40px */
main .xz-card.xz-card--center-btn .xz-card-foot{justify-content:center}
/* 按钮大气一档：14px 字 + 11×28 内边距（老口径 13px/6×14 像三粒小药片）。
   ⚠️ 卡底是 display:flex，居中必须用 justify-content，写 text-align:center 完全不生效。 */
main .xz-card .xz-card-btn{font-size:14px;padding:11px 28px;letter-spacing:.5px}
main .xz-card .xz-card-price{
  font-size:18px;font-weight:800;color:var(--xz-red-deep);font-variant-numeric:tabular-nums;
}
main .xz-card .xz-card-price small{font-size:12px;font-weight:400;color:var(--xz-ink-soft)}

/* --- 13.10 变体 --- */
/* 横排卡（讲师）：头像在左、文字在右，标题不再画色条（头像就是左边那个标记） */
main .xz-card.xz-card--row{flex-direction:row;align-items:flex-start;gap:16px;padding:22px}
main .xz-card.xz-card--row.xz-card--no-media{min-height:0}
main .xz-card--row .xz-card-media{width:56px;height:56px;flex:none;border-radius:50%;background:var(--xz-cream)}
main .xz-card--row .xz-card-media img{border-radius:50%}
main .xz-card--row .xz-card-body{flex:1 1 auto;min-width:0;padding:0}
main .xz-card--row .xz-card-body .xz-card-title{
  margin:0 0 4px;margin-left:0;padding-left:0;padding-right:0;min-height:0;
  font-size:17px;-webkit-line-clamp:1;line-clamp:1;
}
main .xz-card--row .xz-card-body .xz-card-title::before{display:none}
main .xz-card--row .xz-card-body .xz-card-meta{
  margin:0 0 6px;font-size:13px;font-weight:400;letter-spacing:0;color:var(--xz-red);
}
main .xz-card--row .xz-card-body .xz-card-sum{
  display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:4;line-clamp:4;overflow:hidden;
}
/* 图上文下（视频）：卡底没有动作行，媒体卡保留顶部信号带（见 13.2 的 :not） */

/* --- 13.11 序号：CSS counter，不占标记、不依赖后台字段，列表顺序变了自动跟着变 --- */
main .xz-case-grid,main .xz-dish-grid,main .xz-news-grid,main .xz-list-grid{counter-reset:xzcard}
main .xz-case-grid .xz-card,main .xz-dish-grid .xz-card,main .xz-news-grid .xz-card,main .xz-list-grid .xz-card{counter-increment:xzcard}
main .xz-case-grid .xz-card--no-media::before,main .xz-dish-grid .xz-card--no-media::before,
main .xz-news-grid .xz-card--no-media::before,main .xz-list-grid .xz-card--no-media::before{
  content:counter(xzcard,decimal-leading-zero);
  position:absolute;top:14px;right:18px;z-index:1;pointer-events:none;
  font-size:42px;font-weight:800;line-height:1;letter-spacing:1px;
  color:rgba(var(--yz-tint),.14);font-variant-numeric:tabular-nums;
}

/* --- 13.12 页面导语面板 ---
   banner 下面那句"这一页怎么读"（口径、验收方式、免责边界）字不多但是全页最重要的一句话，
   平铺在白底上和正文没有区分 → 淡描边圆框 + 右下角品牌水印，整栏宽（与卡片栅格同轨，不收 900）。
   定稿过程：主题色 5% 铺满（左半泛蓝，用户否）→ 白起点但仍留淡底（左边还是闷，用户否）→ 纯白 + 一圈主题色描边。
   描边用 --yz-tint，切红/蓝主题自动跟随，不写死色值（客户站红线）。
   2026-10-22 清单 S2/S3 整改（两条实测出来的毛病）：
   · S2 定高 min-height:112 在单行导语下留出 61px 死白、双行只留 31px → 同一种块两种高。
     现在不再定高，高度跟着内容走，padding 22/26 四边给全。
   · S3 水印原来钉在 right/bottom 14px，正好落在那条死白里、贴着面板右下边框，
     正文行最右实测能到 1192 → 句子一长就压字。现在给正文整块预留 --yz-intro-keep 的右内衬，
     字与水印之间恒留 ≥16px，长句重排也不会交叠（水印的竖直锚点后来改过两次：先右侧居中，
     2026-10-22 按用户字面口径改成钉面板下沿，见 ::after 那条）。
   · 顺手删掉 ::before 那层 270deg 白→淡墨渐变垫层：面板底色本来就是 #fff，
     白渐变铺在白底上不可见（死代码），留着只会让 ::after 的定位看着"有依据"。 */
main > .xz-section > .xz-wrap > .xz-intro{
  --yz-intro-wm:30px;--yz-intro-keep:200px;
  position:relative;overflow:hidden;max-width:none;padding:22px 26px;
  background:#fff;border:1px solid rgba(var(--yz-tint),.16);border-radius:var(--zs-radius);
}
main > .xz-section > .xz-wrap > .xz-intro > p{
  position:relative;z-index:1;margin:0 0 14px;font-size:17px;line-height:1.75;
  padding-right:var(--yz-intro-keep);
}
main > .xz-section > .xz-wrap > .xz-intro > p:last-child{margin-bottom:0}
/* 水印：纯文字品牌名（写法与页眉/页脚一致，不带空格），浓淡不是整块一个透明度，而是把渐变裁到字形上：
   左端 rgba(16,23,36,.04) → 48% 处 .02 → 93% 处 .01（几乎看不见），合成到白底落差只有 8 阶。
   中性墨不含蓝/红，切主题不会串色；color 与 -webkit-text-fill-color 都要 transparent，否则渐变被实色盖住。
   pointer-events + user-select 关掉：装饰文字不该被选中，也不该挡住下面可点的区域。
   30px 时"云庄主GEO"实测宽 160 → 右边界距面板 24+160=184，正文右内衬 200（清单从 14px 时代的
   181 收过来，字号也随之从 34 降到 30：面板不再定高，34px 的字会顶穿上下边框）。
   2026-10-22 用户给出字面口径：竖直方向不再居中，改成钉在面板下沿（bottom:5 + 自身高的一半抬上去，
   实测字形带落在内边下沿上方 20–50px）。横向仍靠 --yz-intro-keep 让位，所以矮面板（单行 76 高）
   也不会和正文咬上：文字最右 1192 对应的水印左边界在 1096，恒留 16px 以上。 */
main > .xz-section > .xz-wrap > .xz-intro::after{
  content:"云庄主GEO";position:absolute;right:24px;bottom:5px;transform:translateY(-50%);pointer-events:none;
  font-size:var(--yz-intro-wm);font-weight:800;line-height:1;letter-spacing:1px;white-space:nowrap;
  color:transparent;-webkit-text-fill-color:transparent;
  background:linear-gradient(90deg,rgba(16,23,36,.04) 0%,rgba(16,23,36,.02) 48%,rgba(16,23,36,.01) 93%);
  -webkit-background-clip:text;background-clip:text;
  -webkit-user-select:none;user-select:none;
}
/* 节奏：面包屑→导语 34（沿用 12.2），导语→下一节 28。同节排布的（视频/留言/通用栏目）用相邻选择器补。 */
main > .xz-section:has(> .xz-wrap > .xz-intro){padding-top:34px}
/* ⚠️ padding-bottom:0 只在"后面还有一节接力"时成立（下方留白由下一节的 padding-top:28 提供）。
   这一节是 main 最后一个孩子时，它下面直接是深色页脚，0 = 正文压在页脚上、整段没有白底
   （16 章实测 /ContactUs /Report /Prolist /Faq /VideoList 五页 gap 全 0）。
   所以这里用 :not(:last-child) 收范围，让末节自动回落到 312 行的 74（≤900 时 588 行的 48），
   而不是再补一条覆盖规则——同一口径写在两处，下一个改节奏的人只会找到一条。 */
main > .xz-section:has(> .xz-wrap > .xz-intro):not(:last-child){padding-bottom:0}
main > .xz-section:has(.xz-intro) + .xz-section{padding-top:28px}
main > .xz-section > .xz-wrap > .xz-intro:not(:last-child){margin-bottom:28px}

/* --- 13.13 文章详情页（/Caseview /Newsview /Reportview /Courseview）---
   用户口径：内容左对齐、最大宽度吃满 1200 轨（上一版收成 900 居中被判"不对"）。
   判范围用契约类 .xz-detail，不再用 :has(.xz-article-nav) 猜——课程详情没有上/下导航，
   老写法会漏掉它（同一类页面两种宽度就是用户说的"宽度不统一"）。
   元信息用块级居中：这里不能用 flex，flex-basis 会把下面那根 64px 的线拉成满宽。
   ⚠️ .xz-detail-meta 在产品详情公共件里还带一条 border-bottom（979 行），本节显式收掉，
      详情页只留 64px 那根居中线，不出现两条线。 */
main .xz-detail.xz-article{max-width:none;margin-left:0;margin-right:auto}
main .xz-detail .xz-detail-body{max-width:none;margin-left:0;margin-right:auto;text-align:left}
main .xz-detail .xz-detail-meta{
  display:block;text-align:center;padding-bottom:0;border-bottom:0;
  margin:0 0 28px;font-size:14px;letter-spacing:.3px;color:var(--xz-ink-soft);
}
main .xz-detail .xz-detail-meta span{display:inline-block}
main .xz-detail .xz-detail-meta span + span::before{
  content:"·";margin:0 12px 0 20px;color:rgba(var(--yz-tint),.45);
}
main .xz-detail .xz-detail-meta::after{
  content:"";display:block;width:64px;height:2px;border-radius:2px;margin:14px auto 0;
  background:linear-gradient(90deg,var(--xz-red-deep),var(--zs-logo-hot));
}
main .xz-detail .xz-detail-body h3{margin:36px 0 14px;font-size:20px}
main .xz-detail .xz-detail-body h2{margin:42px 0 16px}
main .xz-detail .xz-article-cover{margin-bottom:34px}

/* --- 13.14 窄屏收口（≤900 与 _Layout 抽屉断点一致；≤640 单列更窄一档） --- */
@media (max-width:900px){
  /* 单列卡正文短、卡又高，40px 空档会空出一片 → 收到 24px；卡体内边距同步收 2px */
  :root{--yz-card-pad:22px;--yz-card-foot-gap:24px;--yz-card-sum-h:340px}
  main .xz-case-grid,main .xz-dish-grid,main .xz-video-grid,main .xz-teacher-grid,
  main .xz-news-grid,main .xz-list-grid{grid-template-columns:minmax(0,1fr);gap:16px}
  main .xz-card.xz-card--no-media{min-height:0}
  main .xz-card-body .xz-card-title{font-size:17px;min-height:calc(17px * 1.5 * 2)}
  main .xz-card.xz-card--no-media .xz-card-title{padding-right:46px}
  main .xz-card.xz-card--no-media > .xz-card-meta{padding:22px var(--yz-card-pad) 0 var(--yz-card-pad)}
  main .xz-case-grid .xz-card--no-media::before,main .xz-dish-grid .xz-card--no-media::before,
  main .xz-news-grid .xz-card--no-media::before,main .xz-list-grid .xz-card--no-media::before{
    top:16px;right:16px;font-size:34px;
  }
  /* 窄屏不再横向给水印让位（328px 面板扣掉 200 只剩 128 的正文，会排成一柱细字）：
     水印靠面板底部那条实高（padding-bottom 54）容纳，正文与水印之间仍留 ≥13px，两者不交叠。
     字号 24 → 实测宽 128，最窄的 320 面板也放得下。
     竖直锚点不再自己写一套（原来 bottom:16 + transform:none，桌面 bottom:5 + translateY(-50%)，
     同一类块两种口径）：只改 right，bottom/transform 全部继承上面那条。 */
  main > .xz-section > .xz-wrap > .xz-intro{--yz-intro-wm:24px;--yz-intro-keep:0;padding:18px 20px 54px}
  main > .xz-section > .xz-wrap > .xz-intro > p{font-size:15.5px;line-height:1.8}
  main > .xz-section > .xz-wrap > .xz-intro::after{right:18px}
  main > .xz-section:has(.xz-intro) + .xz-section{padding-top:22px}
  main .xz-detail .xz-detail-body h3{margin:28px 0 12px;font-size:18.5px}
}
@media (max-width:640px){
  main .xz-card-body .xz-card-sum--clamp{max-height:300px}
  main > .xz-section > .xz-wrap > .xz-intro{--yz-intro-wm:20px;padding:16px 18px 46px}
  main > .xz-section > .xz-wrap > .xz-intro::after{right:14px}
}

/* =====================================================================
 * 14. 2026-10-22 用户截图清单逐条整改
 *
 * 用户原话："内页样式不统一，间距不合理甚至有些没有间距，首页我文字自动换行了，很丑，
 *           圆里面的文字没有居中，这些细节你都一一列出清单，然后对着清单去修改。"
 * 编号与清单一致（实测值都是 1280 视口取的数据）：
 *   H1 首屏三个 CTA 按钮各折两行 / H2 中心圆品牌名被折断 / H3 圆内副标题不居中
 *   B1 栏目页页头 h1 顶 191 vs B2 列表页 215 / B3 详情页 banner 293~354 三种高
 *   S1 详情页面包屑→正文 0~1px / S2、S3 已并入 13.12 本轮重写
 * 全部只写在本文件（只被 10009 加载），不改 geosite.css、不改 _Layout、不改 .cshtml。
 * ===================================================================== */

/* --- 14.1 内页页头统一（B1 / B2 / B3）---
   两套页头各写各的：.xz-inner-hero 是 86/92，.xz-hero-sm 是 62/62 → 同一个站里 h1 顶边
   一个 215 一个 191；banner 高度又随内容漂（241 / 293 / 324 / 341 / 354）。
   口径：纵向起点写死同一个 padding-top:84（h1 顶 = 页头 79 + 84 + 标签行 50 = 213，五类页同值），
   底部不再各写各的 padding-bottom，统一交给 min-height:321 —— 页头下方第一个内容
   （面包屑）恒在 400。内容真超了才自然长高（带 CTA 的栏目页实测 321 内放得下）。
   box-sizing 必须显式 border-box，否则 min-height 只兜内容高、padding 另加，页面又漂一层。 */
main > .xz-inner-hero,
main > .xz-hero.xz-hero-sm{
  box-sizing:border-box;min-height:321px;padding-top:84px;padding-bottom:0;
}
/* 文字块节奏对齐 .xz-inner-hero 那套（h1 下 16），并给栏目页首屏那句简介同样收 560 阅读宽：
   原来它跟着栅格列宽（614）走，与列表页的 560 不是一个口径。 */
main > .xz-hero.xz-hero-sm .xz-hero-text h1{margin-bottom:16px}
main > .xz-hero.xz-hero-sm .xz-hero-text p{margin-bottom:20px;max-width:560px}
/* 栏目页没配图时，公共模板那条 1.1fr/.9fr 双列仍在生效：文字被塞进左列 614px，
   而列表页的同级标题吃满 1160 → 这是用户看到的"内页样式不统一"里最显眼的一条。
   没渲染 .xz-hero-media 就单列（:has 判存在性，不改标记）。 */
main > .xz-hero.xz-hero-sm:not(:has(.xz-hero-media)) > .xz-hero-inner{grid-template-columns:minmax(0,1fr)}

/* --- 14.2 面包屑下方必须留距（S1）---
   /Caseview /Proinfo /Topic 把面包屑和正文写在同一个 .xz-wrap 里做兄弟，
   12.2 那两条 "+ .xz-section{padding-top:34}" 都命中不到（下一个兄弟不是 section）→
   实测正文顶边 445、面包屑底边 445，间距 0。用相邻选择器给同容器内的下一件补同一条 34。 */
main .xz-crumbs + *{margin-top:34px}
/* 面包屑自己落在 section 里时（/Caseview /Proinfo /Topic），1044 那条"banner 后第一节 34"
   会和面包屑自带的 16px 顶距叠成两层 → 详情页面包屑排到 434，而列表页在 400，同一站内两档基线。
   收口：面包屑就是本节第一个可见元素时不再加节顶距，34 只留给它下方的正文（上一条）。 */
main > .xz-section:has(> .xz-wrap > .xz-crumbs){padding-top:0}

/* --- 14.3 首屏 CTA 按钮不许折行（H1）---
   ≥1200 才切双列，文字列被 .9fr 压到 580；三个按钮各需 184（含 gap 共 584）→ 1px 之差全部折成两行。
   ≤1180 单栏时按钮 186、一行，手机端共享层已有 nowrap —— 只有桌面破，所以收口也只写桌面档。
   white-space:nowrap 让"折行"变成"整枚按钮换行"（宁可两行按钮，不要按钮里断字），
   同时把轨道比例改成 1fr / .72fr：文字列拿到 660，三个按钮一行放得下，轨道图仍在 420 列里。 */
@media (min-width:1200px){
  body .website-page .hero-layout{grid-template-columns:minmax(0,1fr) minmax(420px,.72fr)}
}
@media (min-width:901px){
  body .website-page .hero-actions{flex-wrap:wrap}
  body .website-page .hero-actions :is(a,button){flex:0 0 auto;white-space:nowrap}
}
/* 中心圆内边距：共享层写的是 `padding:0 11%`，而百分比内边距按 **containing block**
   （父级 .engine-visual，恒 370）算，不按圆自己的 148 算 → 两侧各吃掉 40.7，
   再减 4×2 边框，可写宽只剩 58.63；13px 的"云庄主GEO"要 68.6 → 品牌名从中间折断（H2）。
   圆是固定 148px，跟视口宽度无关，所以这里根本不该用百分比：钉成 14px，可写宽 112。
   下界取 641 而不是 901：共享层 ≤640 会换成 112px 小号圆 + 8px 内边距（实测 600/640 品牌名 1 行），
   那套自带口径已经是对的，不要越界去覆盖它；641–900 这一档用的仍是大圆，
   原来这条只写到 ≥901，正是 768 下品牌名折成两行的真因。 */
@media (min-width:641px){
  body .website-page .engine-center{padding:0 14px}
}
/* --- 14.4 圆内两行文字都居中（H3）---
   .engine-center strong 继承共享层 text-align:center 所以品牌名是居中的（只是被折断，见 14.3）；
   下面那行读数 <span> 在共享层没写 text-align，落到 .engine-center 的默认 start → 左对齐、
   与上面的居中品牌名错开一条中线（390 同样不居中）。 */
body .website-page .engine-center span{text-align:center;line-height:1.45;letter-spacing:0}
/* ≤640 那一档共享层换成 112px 小号圆（自带 8px 内边距，品牌名 1 行不折，口径本就是对的），
   但下面那行读数 10 个字按 monospace 排到 88px 会剩一个孤字换行，圆心处只剩一个字很难看。
   text-wrap:balance 让它折成 5/5 两等行（实测 390：两行各 44px，圆内 chord 分别 106/98，居中且不压弧线）。 */
@media (max-width:640px){
  body .website-page .engine-center span{text-wrap:balance}
}

@media (max-width:900px){
  /* 上面的 14.1 权重（main > …）压过 587 行那条，必须在同档断点里按移动端口径重新给一遍，
     否则手机上也带着 84px 顶距 + 321px 定高，一屏只够看页头。 */
  main > .xz-inner-hero,
  main > .xz-hero.xz-hero-sm{min-height:0;padding:56px 0 60px}
  main > .xz-hero.xz-hero-sm .xz-hero-text p{max-width:none}
}

/* =====================================================================
 * 15) 内页列表带底色整站去掉（2026-10-22 用户："这个背景颜色都统一去掉吧"）
 * 现状是三条口径并存：/Case /Reports /Course 的列表节透明（白底），
 * /News /Prolist 被我 12.4+13.1 各写了一份浅蓝底（--xz-bg #F4F8FF），
 * 而 _ContentList.cshtml:42 与 VideoList.cshtml:23 的列表节把底色写成了**行内 style**
 * （/service、/VideoList 因此带蓝底）——同一站内三种底色，正是用户看到的那块色差。
 * 收口：内页所有 section 一律不铺底色，分层交给白卡自身的 1px 描边 + 投影。
 * ⚠️ 必须带 !important：行内 style 的权重高于任何选择器，而这两个 .cshtml 是四站共用、
 *   改一次要重启 8080（决策 G 本轮不动共享模板）。不动 !important 就清不掉 /service 那条。
 * 只作用于 main 内的 .xz-section：落地页（.website-page/.hero-section/.content-section）
 * 与页头深蓝 banner（.xz-hero/.xz-inner-hero，类名不含 xz-section）都不受影响。
 * 随本条一并删除的旧规则：12.4 与 13.1 里那两条 :has(.xz-*-grid){background:var(--xz-bg)}。
 * ===================================================================== */
main .xz-section{background-color:transparent !important}

/* =====================================================================
 * 16) 2026-10-22 第二轮反馈：/ContactUs 与 /Report 的页内间距 + 居中
 *
 * 用户原话："联系我们这个间距问题，在线留言这个间距问题，和居中问题，
 *           我之前都反馈了，你根本没有修改。"
 * → 上一轮我只动了这两页的 banner / 面包屑 / 导语节奏，页面**主体**一行没改，
 *   却把这两页写进过"已验收"。这是漏项，不是口径分歧。
 *
 * 实测（1280 视口、同源 iframe 内 getBoundingClientRect，ws=10009）：
 *   /ContactUs  正文节 438→752，页脚 .v-foot 顶边 752 ⇒ 白底 **0px**；
 *               两枚按钮 114×41 贴在 x=60，上方三张联系卡铺满 60→1220（1160）。
 *   /Report     .xz-form 宽 680、x=60、margin-right **480**（右半屏整片空）；
 *               提交按钮被 grid 的 stretch 拉成 680×41 的横条；
 *               表单底 1138 = 页脚顶 1138 ⇒ 白底 **0px**。
 *   同一根因（末节 padding-bottom:0）还命中 /Prolist(904) /Faq(1498) /VideoList(700)，
 *   五页一起修，不逐页打补丁。
 * ===================================================================== */

/* --- 16.1 末节贴页脚（根因在 13.12，已就地改成 :not(:last-child)，见那里注释）---
   这一条只是留痕：正文节是 main 最后一个孩子时回落到基线 74（≤900 回落到 588 行的 48），
   后面还有一节接力时仍然是 0（下方留白由 "+ .xz-section{padding-top:28}" 提供），节奏没被改坏。
   修后实测：/ContactUs 752→826、/Report 1138→1212、/Prolist、/Faq、/VideoList 同获 74。 */

/* --- 16.2 联系页 CTA 按钮行居中 ---
   用户已接受过的同类口径：案例卡"查看详情"按钮行 body .xz-case-action{justify-content:center}。
   联系页更明显：上面是三张等宽卡组成的整幅栅格，下面两枚 114 宽的小药片贴左，
   右边空 1046 → 看着像没排完。居中后按钮行中线与卡片栅格中线（x=640）重合。
   移动端（596 行单列）仍然居中，两枚按钮 114+14+114=242 < 355 一行放得下，不会竖排。 */
.xz-contact-cta{justify-content:center}

/* --- 16.3 留言表单整块居中 ---
   12.1 里那条 ".xz-form{margin-left:0}" 已删（现在是个墓碑注释），交回本文件 560 行
   本皮肤自己的口径：max-width:680 + margin:0 auto。表单是独立控件块、不是正文阅读栏，
   套用"正文靠左贴轨"会让它在一屏里同时出现 1160 面板 + 680 贴左表单，右半屏全空。
   输入框仍收在 680（超过 680 的输入框扫视容易串行），只是整块回到中线。 */

/* --- 16.4 提交按钮不再被 grid 拉成 680 长条 ---
   grid 子项默认 stretch，所以 <button> 吃了整列宽；justify-self:start 让它回内容宽，
   再给 min-width 220 + padding 40：41px 高的胶囊、左边线与输入框/label 同轨（不居中到栏中线）。 */
.xz-form > button[type="submit"]{
  justify-self:start;width:auto;min-width:220px;padding-left:40px;padding-right:40px;
}

/* --- 16.5 提交后的提示条跟着表单同宽同中线 ---
   .xz-form-msg 基线是 margin:0 0 18px（贴左轨）。表单居中后如果提示条还贴左，
   提交成功那一屏会出现"提示在左、表单在中"两条中线，故与表单同口径。 */
.xz-form-msg{max-width:680px;margin:0 auto 18px}

/* =====================================================================
 * 17) 2026-10-22 落地页去蓝：后台切到「品牌红」后，首页仍然大片发蓝的那批
 *
 * 用户原话："我把后台切换成红色了，但是首页还有很多是蓝色的，没有做到对应的
 *           适配，你切换到首页一个一个仔细去修改。"
 *
 * 两条根因（都在共享层 geosite.css，本轮按决策 G 不动它，只在本站皮肤里提权接住）：
 *   R1 加载顺序反了。CSSOM 实测样式表次序：…7 yunzz.css、8 geosite.css、9 geotrend.css…
 *      —— 共享层在**后面**，同特异性时它赢。第 669 行那句"同权重再靠加载顺序压住它"是错的，
 *      本文件过去能压住，全靠多写了一个 body 元素选择器（+0,0,1）。
 *      ⇒ 本章每条选择器都按 geosite 的类数**镜像再加 body**，保证严格压过它。
 *   R2 共享层有两条 !important 抢主色：
 *      `.website-page :is(.section-badge,.step-num,.target-pill,.col-us,.highlight-banner,.arrow-red){color:#1d5fd6 !important}`
 *      `.website-page .hero-features i{color:#1d5fd6 !important}`
 *      ⇒ 第 5 章给这些类写的 color 一直是死规则（实测 9 个区块的 .section-badge 全渲染成 #1d5fd6），
 *      只能同样带 !important 接回去（特异性 (0,2,1) 高于它 (0,2,0)）。
 *
 * 取证手法与账本（脚本 .workbuddy/tmp/blue_probe_17*.txt、blue_rules_17_grouped.txt）：
 *   ① 渲染态：browser-use 在真实页（THEME=red 已核实）遍历 836 个元素读 getComputedStyle，
 *      含 ::before/::after 与 border/shadow/gradient 里的每个 rgb —— 59 个蓝色分组；
 *   ② 静态态：扫 CSSOM 全部规则，凡是"声明了蓝色 且 选择器命中本页元素"的 —— 74 条（含 :hover 态）；
 *      逐条判过：首屏与按钮那批（.primary-button/.outline-button/:active、.action-btn.purple-btn、
 *      .glow-one/.glow-two、.engine-ring/.engine-center/.engine-icon、.hero-grid-bg、.hero-copy h2 span、
 *      各卡 :hover、.badge-future、.present-card、.tag-icon-box.purple-box、.msg-icon-wrapper、
 *      .icon-box(.purple-bg)、.check-icon-box、.group-card/.standard-card/.guarantee-card/.delivery-notice 描边、
 *      .price-wrap .currency、.loop-header-title、.guarantee-card 描边）第 1/4/5/6/7 章已经压住，本章不重复；
 *      压不住的即下面 17.1–17.8。
 *   ⚠ 唯一有意保留的蓝：首屏品牌墙 .platform-dot 四枚小圆点（#2f80ed/#1f6bff/#3d82ff/#0ea5e9）。
 *     那是后台【GEO 平台】各 AI 平台自己的品牌色、内联 style 数据驱动，不是主题色，
 *     改它=伪造他方品牌标识；要换颜色请在后台改数据，不在皮肤里 hard-code 覆盖。
 *   口径：一律用主题 token（--xz-red / --yz-soft / --yz-tint / --xz-line），
 *   所以「科技蓝」默认槽位下这些值仍是蓝，切「品牌红」自动跟过去 —— 不会再出现"切了色只剩一半"。
 * ===================================================================== */

/* --- 17.1 共享层 !important 抢主色的两族（本章唯一需要 !important 的地方）---
   .section-badge 在 shift/loop/process/diagnose/deliver/price/faq/news/zs-company 九节全是 #1d5fd6；
   .step-num 5 枚序号、.highlight-banner 旗舰条、首屏 4 枚 ✓ 图标同理。
   只接 color：bg/border 是第 5 章赢的（共享层那两条没加 important），不动。
   ⚠ 分两档，按"小字 vs 图形"取 token（实测，AA 口径 4.5）：
     小字族（section-badge 12px/700、step-num、highlight-banner、arrow-red）坐浅色 tint 底，
       用主色只有 4.24–4.40 → 取 --xz-red-deep（红 #B3121F 6.14–6.95 / 蓝 #1B3FB5 6.50–8.07），两主题一次过；
     图形族（首屏 4 枚 ✓ 图标）白底 4.56 已达标，保持 --xz-red，与 17.2 的勾选图标同色，不出现两种红。 */
body .website-page :is(.section-badge,.step-num,.target-pill,.col-us,.highlight-banner,.arrow-red){color:var(--xz-red-deep) !important}
body .website-page .hero-features i{color:var(--xz-red) !important}

/* --- 17.2 报价卡「包含内容」勾选图标（12+4=16 枚，描边+图标一起蓝）---
   共享层 `:where(#price) .feature-list li .check-icon` = (0,2,1)，与第 5 章 `body .website-page .check-icon`
   (0,2,1) **同分**→ 按 R1 它赢。这里把 li 那一级照抄进来变 (0,2,2) 才压得住。
   里面 SVG 用 currentColor，所以父级 color 一改，16 条 svg/polyline 的 stroke 跟着变红。 */
body .website-page .feature-list li .check-icon{color:var(--xz-red);border-color:var(--xz-red)}

/* --- 17.3 交付清单（#deliver）三张组卡：图标块、"第 1—3 项"标签、卡头分隔线、复训提示里的标签 ---
   共享层最深的一条是 `.website-page .group-card .group-header .group-tag` (0,4,0) 与
   `:where(#deliver) .group-card .group-header .group-title-wrap .group-icon` (0,4,0)，
   所以 group-tag / group-icon 必须整条祖先链抄全再加 body（→ (0,4,1)/(0,5,1)）。
   notice-tag 在第 6 章写过 `body .website-page .notice-tag` (0,2,1)，与共享层
   `:where(#deliver) .delivery-notice p .notice-tag` (0,2,1) 同分→ 输在顺序，这里补齐祖先链。
   卡头分隔线用正文线色 --xz-line（中性），不用主色：它只是分栏线，不该抢红。
   group-tag(12px/600) 在 7% tint 底上只有 4.24 → 与 17.1 同口径取 --xz-red-deep（6.14）；
   group-icon 是 20px 图形描边、白底 4.80 达标，保持主红；notice-tag 跟 group-tag 同族，一并取深。 */
body .website-page .group-card .group-header{border-bottom-color:var(--xz-line)}
body .website-page .group-card .group-header .group-tag{color:var(--xz-red-deep);background:rgba(var(--yz-tint),.07)}
body .website-page .group-card .group-header .group-title-wrap .group-icon{color:var(--xz-red)}
body .website-page .delivery-notice p .notice-tag{color:var(--xz-red-deep)}

/* --- 17.4 报价卡卡头标签族（标准版/旗舰版 计划名、适用人群、交付周期 pill）---
   共享层按变体类各写一条：`:where(#price) .card-header .plan-tag.flagship-plan` = (0,4,0)，
   所以选择器列表里**逐个变体**写全 (0,4,1)，不能只写基础类（会输给变体那条）。
   底色 #e6efff/#dbe8ff → --yz-soft（红槽位 #FFE1E4 / 蓝槽位 #CFE0FF，跟着主题走）。
   period-pill 内部那个「交付周期：…」span 与卡片 svg 是继承色，父级一改就跟着变，不单独写。
   只动 flagship-target：标准版的 .target-tag 共享层给的是中性灰 #5a6472，那是正文级说明、不是主色，不抢。
   ⚠ 这一族文字 12–13px、底是 --yz-soft（红 #FFE1E4 / 蓝 #CFE0FF），主色只有 3.92/4.31 → 一律取 --xz-red-deep（5.67/6.50）。 */
body .website-page .card-header .plan-tag,
body .website-page .card-header .plan-tag.standard-plan,
body .website-page .card-header .plan-tag.flagship-plan{color:var(--xz-red-deep);background:var(--yz-soft)}
body .website-page .card-header .target-tag.flagship-target{color:var(--xz-red-deep);background:var(--yz-soft)}
body .website-page .period-pill,
body .website-page .period-pill.flagship-pill{color:var(--xz-red-deep)}
/* 旗舰卡的「交付周期」pill 底色单独收：标准卡那颗是中性灰底（#f1f5f9 一族）本来就没错，
   只有旗舰卡被共享层 `:where(#price) .period-pill.flagship-pill` 刷成 #e6efff。 */
body .website-page .period-pill.flagship-pill{background:var(--yz-soft)}

/* --- 17.5 报价节标题里的强调字 + 旗舰卡描边 + 承诺卡标题
   `:where(#price) .section-heading h2 span` 只给 #price 那节的「价格方案」上了蓝；
   首屏 h2 span 是渐变裁切（第 3 章），类名不同（.hero-copy），不受这条影响。
   旗舰卡描边保持"饱和主色"的强调级别（共享层原来就是实色 #1f6bff，不是淡 tint），
   与第 6 章把标准/承诺卡收成 rgba(tint,.16) 形成主次对比。
   · .subtitle-tag 不用管：共享层那条淡蓝描边 :where(#price) .subtitle-tag{border:#cfe0ff} (0,1,0)
     被同文件 .website-page .section-heading .subtitle-tag{border-color:currentcolor} (0,3,0) 压住，
     实测两主题下都是中性墨灰 #4A5468（跟着 --theme-text-2 走），不发蓝，无需再顶。 */
body .website-page .section-heading h2 span{color:var(--xz-red)}
body .website-page .flagship-card{border-color:var(--xz-red)}
body .website-page .guarantee-card .guarantee-title{color:var(--xz-red-deep)}

/* --- 17.6 #loop 右卡（GEO 陪跑）阴影仍是 rgba(33,105,245,.08) ---
   第 6 章只顶了 .build-card 的描边，阴影漏了；阴影是"淡蓝雾"，在白底上一眼能看出来。
   与左卡同一口径：rgba(var(--yz-tint),.08) 0 12 32。 */
body .website-page .service-card.build-card{box-shadow:0 12px 32px rgba(var(--yz-tint),.08)}

/* --- 17.7 诊断卡角落的水印序号 #cbd5e1（冷灰蓝）
   红底带上的水印要跟底色同族，用主色 22% tint；蓝槽位下自动回到浅蓝，两主题都不脏。 */
body .website-page .diagnosis-card .card-number{color:rgba(var(--yz-tint),.22)}

/* --- 17.8 资讯卡描边/悬停 + 企业主体面板（共享层与模板内联样式里的最后一批冷色）
   .gs-news-card 静态描边 #e6edf7、:hover #cfe0ff + rgba(31,107,255,.10) 阴影；
   模板内联 <style> 里 .zs-company-links 的虚线 #dfe7f5、.zs-company-facts 的 #e6edf7/#fbfcff
   —— 这几处色相偏冷，在 #FDF8F8 的红底上就是"红配蓝"的脏边，全部接回中性线色与主色 tint。
   内联 <style> 在 body 内、比外链更晚生效，所以必须带 body .website-page 前缀（(0,2,1) > (0,1,0)）。
   ⚠ .gs-news-card 的 color 是共享层写的 inherit (0,2,0)，比基础层 `a:hover{color:#0064cc}` (0,1,1) 高，
   所以悬停不会变蓝，这里只补描边与阴影，不加 hover 色。页脚 .gs-foot a:hover 模板已给 #fff，同样不动。 */
body .website-page .gs-news-card{border-color:var(--xz-line)}
body .website-page .gs-news-card:hover{border-color:rgba(var(--yz-tint),.42);box-shadow:0 14px 30px rgba(var(--yz-tint),.10)}
body .website-page .zs-company-links{border-top-color:var(--xz-line)}
body .website-page .zs-company-facts{border-color:var(--xz-line);background:#fff}

/* =====================================================================
 * 18) 2026-10-22 悬停态去蓝（用户反馈："一些按钮的 hover 样式还是蓝色的，
 *     这些你都要检查仔细，根据后台的主题选择来切换"）
 *
 *   第 17 章只量了「静止态」。悬停态是另一条链路：共享层 inc.min.css 里有两条
 *   全局抢色规则，静止态看不见、一悬停就冒蓝：
 *     R3  `a:hover{color:#0064cc}`                     (0,1,1)  —— 裸标签+伪类，压过本站所有单类基础色
 *     R4  `.footerNav ul li a:hover{color:#0064cc !important}` (0,2,3)+IMP —— 页脚链接，必须用 !important 对
 *   本站大量的 hover 规则只写了 border/background、没写 color（.xz-btn-ghost:hover 就是这条），
 *   于是 color 这一格空出来被 R3 填走 → 红底按钮变蓝字、幽灵按钮变蓝字、整张卡片变蓝字。
 *
 *   取证：自写级联解析器（含 !important / 特异性 / 表序 / @media 命中 / var() 还原 /
 *   简写 border-color 展开），对 10009 全部 19 个前台页的 774 个可交互元素
 *   逐个算「悬停态赢家 vs 静止态赢家」，差值为硬编码蓝的才算漏点。
 *   结果：128 处漏点，全部落在下面 4 族，没有第 5 族。
 *
 *   口径：字色一律走主题 token（--xz-red / --xz-red-deep / --zs-logo-hot），
 *   切「科技蓝」槽位自动跟回蓝，不再出现"静止是红、悬停是蓝"。
 *   小字（12–15px）取 --xz-red-deep 保 AA；实心底上的白字保持白，绝不抢成主色。
 * ===================================================================== */

/* --- 18.1 页脚链接：共享层那条带 !important，这里也必须带，且特异性要盖过 (0,2,3) ---
   页脚是深色底 #0B1220，主红压在上面只有 3.5 左右，所以用亮端 --zs-logo-hot
   （红 #FF3B47 实测 5.32 / 蓝 #4D7DFF 5.08），与第 5 章 .TitleP:hover 同一口径，
   列标题和链接悬停同色，不再一个红一个蓝。 */
body .v-foot .footerNav a:hover,
body .v-foot .footerMap a:hover,
body .v-foot .xz-nap a:hover{color:var(--zs-logo-hot) !important}

/* --- 18.2 卡片型链接：悬停不改字色 ---
   .xz-news/.xz-case/.xz-dish/.xz-video-card/.xz-promise/.xz-scene/.xz-list-card 整张卡就是一个 <a>，
   基础色写的是 color:inherit (0,1,0) < R3 (0,1,1) → 悬停时卡片自身字色被抢蓝，
   卡内没写 color 的零散文字（日期、序号、按钮外的说明）跟着变。
   这类件的悬停反馈已经有顶部渐变带 + 描边 + 阴影（第 8 章），不该再改字色，直接锁回 inherit。
   .xz-logo 同族：文字在 .xz-logo-text 里自带色，漏的只有 display:none 的副标题，一并锁掉。 */
body .xz-news:hover,body .xz-case:hover,body .xz-dish:hover,body .xz-video-card:hover,
body .xz-promise:hover,body .xz-scene:hover,body .xz-list-card:hover,body .xz-card:hover,
body .xz-logo:hover{color:inherit}

/* --- 18.3 实心按钮：悬停恒白字 ---
   .xz-btn-primary 基础色 #fff 只有 (0,1,0)，被 R3 压过 → 红底上出蓝字（内页 CTA 5 处 + 首屏 2 处）。
   .action-btn.dark-btn / .purple-btn 的白字写在 :where(#loop,#process) 里，:where 不计特异性 → 同样漏。
   这几族底色本身就是主色/墨色，字必须留在 #fff，不给它跟主题走。 */
body .xz-btn-primary:hover,
body .website-page .action-btn.dark-btn:hover,
body .website-page .action-btn.purple-btn:hover,
body .website-page .primary-button:hover,
body .website-page .cta-action .primary-btn:hover{color:#fff}

/* --- 18.4 幽灵/描边按钮：悬停字色跟主色 ---
   第 339 行的 .xz-btn-ghost:hover 只补了 border-color + background，color 空着 → 被 R3 抢走，
   这就是用户截图里那颗「查看详情」蓝字的成因（红描边 + 蓝文字）。
   这里不改第 339 行（那是静止态定义），在末尾按覆盖层补 color：
   底是 11% 主色 tint，主红只有 3.95 → 取 --xz-red-deep（红 5.71 / 蓝 7.36），与 17.1 小字同档。 */
body .xz-btn-ghost:hover,
body .website-page .outline-button:hover{color:var(--xz-red-deep)}

