/* ════════════════════════════════════════════════════════════════
   徕本 helloleiboo · 企业官网样式
   ════════════════════════════════════════════════════════════════
   色彩与用法依据 brand-vi/品牌规范与页面风格.html 与 tokens.css：
     · 品牌红 #E60012 是**强调色**，不是主色。白/黑为主体，红约占 5%。
     · 字体走系统字体栈，**不引任何外链字体**（与站点 0 外网请求原则一致）。
     · 圆角统一 12px，半径不拆档；**唯一直角例外是 3px 红色左竖条**。
     · 数字一律 tabular-nums，保证多行数字纵向对齐。
   ════════════════════════════════════════════════════════════════ */

:root {
  --brand-red: #E60012;
  --brand-red-d: #C40010;
  --brand-gray: #F1F3F2;
  --brand-black: #000000;

  --p2368: #6161D3;
  --p636:  #A1D9F3;
  --p7404: #F1DB65;
  --p2040: #D64565;

  /* ── 宠物线色板 ────────────────────────────────────────────────
     来源 brand-pet/tokens.css，色值取自《徕本宠物定位》PDF **渲染后的实测像素**
     （第 11 页色卡上的印刷标签是复制模板没改的占位文案，`#41D7FF` / `#304CB9`
       在整本 23 页里一个像素都不存在，不能抄）。
     ⚠️ 这里是**第二处**定义。改任一处必须同步另一处 ——
        build_site.py 会读 ../brand-pet/tokens.css 逐值比对，对不上直接报错。
     为什么不 <link> brand-pet/tokens.css：
        该目录在部署范围之外（deploy.sh 只同步 corporate-site/），
        而且本站原则是零外链、少请求，多一个 CSS 文件等于多一次往返。 */
  --pet-orange: #FF5A00;      /* 第一识别色  rgb(255, 90, 0)   18/23 页出现 */
  --pet-orange-d: #E64F00;    /* 按压态，由主色降明度派生 */
  --pet-orange-bg: #FFF1E9;   /* 浅底：标签 / 提示条 */
  --pet-yellow: #F9EF00;
  --pet-green: #31C77C;
  --pet-blue: #274BB7;
  --pet-blue-lt: #257DFA;
  --pet-grass: #006818;       /* Grassland Green，第 4 页印 R0 G104 B24 */
  --pet-ip-miaotang: #EDA6C1; /* 喵糖 · 猫系 / 粉底 */
  --pet-ip-wando: #0A508F;    /* 汪盾 · 狗系 / 蓝底 */

  --n0: #FFFFFF;   --n25: #FAFBFB;  --n50: #F3F5F4;  --n100: #E9EDEB;
  --n200: #DCE1DF; --n300: #C4CBC8; --n400: #9BA4A1; --n500: #6F7876;
  --n600: #4A5350; --n700: #2E3533; --n800: #1B2120; --n900: #000000;

  --bg: var(--n0);
  --alt: var(--n50);
  --line: var(--n200);
  --tx: var(--n800);
  --tx2: var(--n500);
  --tx3: var(--n400);

  --font: -apple-system, BlinkMacSystemFont, "PingFang SC", "PingFang HK",
          "HarmonyOS Sans SC", "Microsoft YaHei", "Segoe UI", Roboto, sans-serif;

  --r: 12px;
  --r-s: 8px;
  --sh-1: 0 1px 2px rgba(16, 24, 20, .04);
  --sh-2: 0 6px 24px rgba(16, 24, 20, .08);

  /* ★ 全站**唯一**的内容宽度。
     这里原来有两档（--wrap:1200px / --wrap-wide:1320px），两者在同一页里
     交替出现（页头/页脚/卡片网格用宽版，两栏图文用窄版），于是同一页
     「上半段」和「下半段」的左右边缘落在**两条竖线**上：
     1440 视口实测 76.5 / 136.5，1920 视口 316.5 / 376.5，**都差 60px**。
     .wrap 与 .wrap-wide 现在是同一个宽度的两个名字（HTML 不用改）。
     ⚠️ 不要再拆出第二档 —— 拆了就等于把这个 60px 的错位重新引回来。
     量它：`tools/align_compare.py`（方案对照）· `tools/probe_align.py`（验收断言）。 */
  --wrap: 1320px;
  /* ★ 文字行宽上限。原来只写在 .hd 上（760px），现在抽成变量给两处共用：
       .hd（区块标题）与 .narrow（失去配图的单栏文字块）。
     为什么要给 .narrow：这些文字块原来是 .split 的一半（≈608px），
     对侧图片一拿掉，它就变成整幅内容宽（1272px ≈ 一行 80+ 个汉字），
     读起来眼睛要来回扫。768 视口以下是满宽，这个上限自然不生效。 */
  --measure: 760px;
  /* 内容区左右内边距。之所以抽成变量，是因为 .band / .phero 要复用**同一对左右值**：
     那两处原来把 24px 直接写死，特异度(0,2,0)高于 620px 断点里的
     `.wrap{padding:0 18px}`(0,1,0)，压不住 → 小屏上它们仍是 24px、其余区块是 18px，
     手机上凭空多出 6px 错位（390 视口实测 18 / 24）。
     现在全站左右内边距只有这一个来源，断点里改它一处即可。 */
  --pad-x: 24px;
  --hdr: 68px;

  /* 邮箱/电话图标：尺寸与间距收在这里，**与说明文字的缩进共用同一对变量** ——
     否则改了图标大小、缩进不跟，两者就错开（这正是「没对齐」的常见来源）。 */
  --ico-mail-size: 15px;
  --ico-mail-gap: 8px;
  /* 图标底边相对文字基线的偏移。这个值不是拍出来的：
     跑 `tools/probe_mail_align.py` 量「图标几何中心 − 文字墨迹中心」，
     把偏差补进来即可（卡片 14.5px / 页脚 14px 两处共用，误差 <0.1px）。 */
  --ico-mail-y: -3.5px;
}

*, *::before, *::after { box-sizing: border-box; }

html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  * { animation-duration: .001ms !important; transition-duration: .001ms !important; }
}

body {
  margin: 0;
  font-family: var(--font);
  font-size: 16px;
  line-height: 1.75;
  color: var(--tx);
  background: var(--bg);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

img { max-width: 100%; height: auto; display: block; border: 0; }
a { color: inherit; text-decoration: none; }
button { font: inherit; cursor: pointer; }

/* ── 图片：不让随手另存（摩擦层，**不是防护**）────────────────────
   ⚠️ 先把定位写清楚，免得以后被当成「防护失效」来查：
     图片一旦被渲染出来，字节就已经在访客设备上了，这是 HTTP 的性质。
     开发者工具、Ctrl+S 存整页、手机截图、地址栏直接敲图片 URL
     —— 四条路都拿得到原图，前端代码封不住。
     真正带**强制力**的只有服务器端的防盗链
     （deploy/www.leiboocar.com.conf 里的 valid_referers，挡的是
      「别的网站直接把我们的图引用过去」）。两层分工不同，缺一不可：
       这里挡「随手右键另存」，那里挡「别的网站盗链」。

   三条都是标准前缀属性，浏览器不认就整条忽略，**不会影响图片显示**：
     · -webkit-user-drag:none        —— 禁「把图拖到桌面」落盘
     · user-select:none              —— 禁长按选中（连带 iOS 长按菜单）
     · -webkit-touch-callout:none    —— 禁 iOS 长按「存储图像」

   ⚠️ 只作用于 img / svg / picture，**不作用于文字**：
     正文该怎么选中、怎么复制、怎么翻译，一切照旧。
     拦得越宽，伤到的越是正常访客 —— 而存心要拿的人按 F12 照样拿到。 */
img, svg, picture {
  -webkit-user-drag: none;
  user-select: none;
  -webkit-user-select: none;
  -webkit-touch-callout: none;
}

h1, h2, h3, h4 { margin: 0; font-weight: 700; letter-spacing: -.02em; line-height: 1.2; }
p { margin: 0; }
ul { margin: 0; padding: 0; list-style: none; }

.num { font-variant-numeric: tabular-nums; font-feature-settings: "tnum" 1; }

.wrap, .wrap-wide { width: 100%; max-width: var(--wrap); margin: 0 auto; padding: 0 var(--pad-x); }
.sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }

/* ── 页头 ───────────────────────────────────────────────────── */
.hdr {
  position: sticky; top: 0; z-index: 50;
  height: var(--hdr);
  background: rgba(255, 255, 255, .92);
  backdrop-filter: saturate(180%) blur(12px);
  border-bottom: 1px solid transparent;
  transition: border-color .2s, box-shadow .2s;
}
.hdr.on { border-bottom-color: var(--line); box-shadow: var(--sh-1); }
.hdr .wrap-wide { display: flex; align-items: center; gap: 32px; height: 100%; }

/* 品牌标志：<svg class="lk"> 本身即元素，高度在这里定，不要写 .lk svg */
.lk {
  flex: 0 0 auto; display: block;
  height: 30px; width: auto;
  --logo-ink: var(--brand-black);
  --logo-accent: var(--brand-red);
}
.lk.on-dark { --logo-ink: var(--n0); }

.nav { display: flex; align-items: center; gap: 4px; margin-left: auto;
       /* 导航项的横向内边距收成一个变量：**下划线定位与它共用同一个值**，
          否则改了内边距、活动项下划线不跟，就会左右错开（同一类 bug 在邮箱
          图标那边踩过一次，见 --ico-mail-size / --ico-mail-gap）。 */
       --nav-pad-x: 14px; }
.nav a {
  position: relative;
  padding: 8px var(--nav-pad-x); border-radius: var(--r-s);
  font-size: 15px; color: var(--tx2);
  transition: color .16s, background .16s;
}
.nav a:hover { color: var(--tx); background: var(--n50); }
.nav a.on { color: var(--tx); font-weight: 500; }
.nav a.on::after {
  content: ""; position: absolute; left: var(--nav-pad-x); right: var(--nav-pad-x);
  bottom: 2px; height: 3px;
  background: var(--brand-red); border-radius: 0;   /* 直角：不算品牌色块 */
}
.hdr .btn { margin-left: 12px; }

.burger { display: none; margin-left: auto; width: 44px; height: 44px; border: 0; background: none; padding: 11px; }
.burger i { display: block; height: 2px; background: var(--tx); border-radius: 2px; }
.burger i + i { margin-top: 5px; }

/* ⚠️ 移动端折叠面板必须在**基础层**就隐藏。
   只在 @media (max-width:900px) 里写 display:none 是不够的：
   桌面宽度下这条规则不生效，面板会作为普通块级元素照常渲染，
   菜单项与红色按钮溢出到 68px 高的页头之外、压在首屏上。
   （这个是靠整页截图看出来的 —— 读 CSS 很容易漏。） */
.nav-panel { display: none; }

/* ── 按钮 ───────────────────────────────────────────────────── */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  padding: 11px 22px; border-radius: var(--r-s);
  font-size: 15px; font-weight: 500; line-height: 1.2;
  border: 1px solid transparent; white-space: nowrap;
  transition: background .16s, color .16s, border-color .16s, transform .16s;
}
.btn-red { background: var(--brand-red); color: #fff; }
.btn-red:hover { background: var(--brand-red-d); }
.btn-line { border-color: var(--brand-red); color: var(--brand-red); }
.btn-line:hover { background: var(--brand-red); color: #fff; }
.btn-dark { background: var(--brand-black); color: #fff; }
.btn-dark:hover { background: var(--n700); }
.btn-ghost-light { border-color: rgba(255,255,255,.45); color: #fff; }
.btn-ghost-light:hover { border-color: #fff; background: rgba(255,255,255,.1); }
.btn:active { transform: translateY(1px); }

/* ── 通用版式 ───────────────────────────────────────────────── */
.sec { padding: 96px 0; }
.sec.alt { background: var(--alt); }
.sec.tight { padding: 72px 0; }
.sec.dark { background: var(--brand-black); color: #fff; }
.sec.dark .lead, .sec.dark .eyebrow-sub { color: var(--n400); }

.eyebrow {
  display: inline-block; margin-bottom: 14px;
  font-size: 13px; font-weight: 500; letter-spacing: .06em;
  color: var(--brand-red); text-transform: uppercase;
}
.eyebrow-sub { color: var(--tx2); font-size: 13px; letter-spacing: .04em; }

/* ★ 区块头（.hd）全站统一**左对齐**。
   这里原来还有一条 .hd.center（margin:auto + text-align:center），只被
   strength 的「品牌数据」一处用到 —— 它与结构完全同构的 research「知识产权」
   区块头（左对齐）落在两条视觉中轴上，2026-09-23 被主人一眼看出来。
   已连 CSS 规则与生成器的 center 参数一起移除：**对齐只有一档，别再拆第二档**；
   `tools/build_site.py --check` 会拦下 `class="hd center`。 */
.hd { max-width: var(--measure); margin-bottom: 48px; }
.hd h2 { font-size: clamp(26px, 3vw, 38px); }
.hd h2 .bar { display: inline-block; vertical-align: middle; }

.lead { margin-top: 18px; font-size: 16.5px; line-height: 1.85; color: var(--tx2); }

/* 窄栏文字块：左对齐、宽度上限与 .hd 一致（--measure）。
   2026-09-22 新增。用在「原本是 .split 的一栏、对侧图片按需撤下」的位置 ——
   不收窄的话文字会横跨整幅内容区（1320 容器内实测 1272px），一行 80+ 个汉字。 */
.narrow { max-width: var(--measure); }

/* 品牌标题装置：3px 红色左竖条，直角 —— VI 标题的原样 */
.bar-h {
  position: relative; padding-left: 15px;
}
.bar-h::before {
  content: ""; position: absolute; left: 0; top: .18em; bottom: .18em;
  width: 3px; background: var(--brand-red); border-radius: 0;
}

.grid { display: grid; gap: 20px; }
.g2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.g3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.g4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }

/* ── 卡片 ───────────────────────────────────────────────────── */
.card {
  position: relative; background: var(--n0);
  border: 1px solid var(--line); border-radius: var(--r);
  padding: 28px 26px;
  transition: border-color .18s, box-shadow .18s, transform .18s;
}
.card:hover { border-color: var(--n300); box-shadow: var(--sh-2); transform: translateY(-2px); }
.card h3 { font-size: 19px; margin-bottom: 10px; }
.card p { font-size: 14.5px; line-height: 1.8; color: var(--tx2); }
.card .k { display: block; margin-bottom: 10px; font-size: 13px; font-weight: 500; color: var(--tx3); }

/* 品类卡：用 VI 产品标准色做顶部细条，四色分别对应四个品类 */
.cat { padding-top: 32px; overflow: hidden; }
.cat::before {
  content: ""; position: absolute; left: 0; right: 0; top: 0; height: 4px;
  background: var(--c, var(--brand-red));
}
.cat .pct { font-size: 40px; font-weight: 700; letter-spacing: -.03em; line-height: 1; color: var(--tx); }
.cat .pct small { font-size: 18px; font-weight: 500; margin-left: 2px; }
.cat .nm { margin-top: 8px; font-size: 17px; font-weight: 700; }
.cat .items { margin-top: 12px; font-size: 14px; color: var(--tx2); line-height: 1.8; }

/* ── Hero ───────────────────────────────────────────────────── */
.hero { position: relative; min-height: min(86vh, 720px); display: flex; align-items: flex-end; overflow: hidden; background: var(--n800); }
.hero-img { position: absolute; inset: 0; }
.hero-img img { width: 100%; height: 100%; object-fit: cover; object-position: 62% 50%; }
.hero-img::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(90deg, rgba(0,0,0,.78) 0%, rgba(0,0,0,.55) 42%, rgba(0,0,0,.12) 78%);
}
.hero .wrap { position: relative; padding-top: 90px; padding-bottom: 84px; color: #fff; }
.hero h1 { font-size: clamp(32px, 4.6vw, 58px); max-width: 15em; }
.hero .sub { margin-top: 22px; max-width: 34em; font-size: clamp(15px, 1.4vw, 18px); line-height: 1.8; color: rgba(255,255,255,.82); }
.hero .acts { margin-top: 34px; display: flex; flex-wrap: wrap; gap: 12px; }
.hero .tag {
  display: inline-flex; align-items: center; gap: 8px; margin-bottom: 20px;
  padding: 7px 14px; border-radius: 999px;
  background: rgba(255,255,255,.12); border: 1px solid rgba(255,255,255,.22);
  font-size: 13px; color: #fff;
}
.hero .tag b { color: #fff; font-weight: 500; }
.hero .tag s { width: 3px; height: 12px; background: var(--brand-red); display: inline-block; }

/* 数据条 */
.stats { background: var(--brand-black); color: #fff; }
.stats .grid { gap: 0; }
.stats .st { padding: 34px 22px; border-left: 1px solid rgba(255,255,255,.14); }
.stats .st:first-child { border-left: 0; }
.stats .v { font-size: clamp(30px, 3.4vw, 44px); font-weight: 700; letter-spacing: -.03em; line-height: 1; }
.stats .v i { font-style: normal; font-size: .55em; font-weight: 500; margin-left: 3px; }
.stats .k { margin-top: 12px; font-size: 14px; color: var(--n400); }

/* ── 图文分栏 ───────────────────────────────────────────────── */
.split { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 56px; align-items: center; }
.split.rev .fig { order: 2; }
/* ⚠️ 圆角与灰底必须挂在 img 上，**不能挂在 figure 上** —— 这不是风格偏好。
   figure 里除 img 还有 figcaption，把 border-radius / background / overflow
   放到 figure 上会一次制造三个缺陷（2026-09-22 全站 16 张图逐张实测）：
     ① 图片下方多出一条与图等宽的**灰带**（--n100），图注坐在带子上，
        看起来像渲染事故而不是图注 —— 页面「图片下面那段文字」不优雅的主因；
     ② 图注紧贴容器左缘与底缘（padding:0，容器底部余量实测 **0.00px**），
        下间距为 0、上间距 12px，文字"沉底"；
     ③ 13px 的 --tx3 在灰底上对比度只有 **2.16:1**，远低于 WCAG AA 的 4.5:1。
   同页 .kols img 早就是「圆角+灰底在 img 上」的写法，这里与它对齐。
   → 通用判据：**容器的装饰性外框（圆角/背景/裁切）只能包住它要装饰的那个元素。**
     一旦容器里还住了别的元素（图注、按钮、说明），外框就会顺带套到它们身上。
   （注：overflow:hidden 在原来那份里并没有真的切掉像素 —— 实测余量恰好 0，
     但「零内边距 + 裁切 + 贴边」三者叠加，风险与观感都已经不该留。） */
.fig img {
  width: 100%; height: auto;
  border-radius: var(--r);
  background: var(--n100);   /* 只做加载占位：挂在 img 上才不会溢成色带 */
}
.fig.tall img { aspect-ratio: 4 / 3; object-fit: cover; }
/* 图注色为什么是 --n600 而不是更浅的 --tx2 / --tx3 —— 由**背景**决定的，不是口味：
     --tx3(#9BA4A1) 白底 2.56:1 / 原灰底 2.16:1   ✗
     --tx2(#6F7876) 白底 4.54:1 ✓ 但 .sec.alt 的 --n50(#F3F5F4) 上只有 4.15:1 ✗
     --n600(#4A5350) 白底 7.94:1 / --n50 上 7.26:1  ✓✓
   图注有 5 处落在 .sec.alt 上，且**在 --n50 上，任何比正文(--tx2)更浅的颜色都过不了
   4.5:1** —— 因为正文本身就是 --tx2，台阶上没有可用的中间档。
   所以只能取色彩阶梯里第一个达标的 --n600。（原灰底 --n100 上更是只有 2.16:1。）
   顺带记一笔（本次**不改**）：.sec.alt 上的正文 --tx2 实测也才 4.15:1，
   属全站既有的边际对比度问题，动它等于动整体排版观感，留给主人定。
   line-height 显式给，避免继承值在多列窄格里把两行图注挤在一起。 */
.fig-cap { margin-top: 10px; font-size: 13px; line-height: 1.55; color: var(--n600); }

/* ── 大图横幅 ───────────────────────────────────────────────── */
.band { position: relative; overflow: hidden; background: var(--n800); color: #fff; }
.band img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.band::after { content: ""; position: absolute; inset: 0; background: linear-gradient(180deg, rgba(0,0,0,.55), rgba(0,0,0,.72)); }
/* ⚠️ z-index:1 不是可有可无的装饰，少一行就是「白字变灰字」。
   绘制顺序：.band::after 是**定位元素**（absolute），它生成在整段内容的**最后**；
   与之同层（z-index:auto）的定位内容按文档序绘制 → ::after 压在上面。
   实测：下面这行字的最亮像素只有 **112**（白字应为 255），.band 里的红按钮
   被压到 **72**（#E60012 应为 (230,0,18)）—— 整段被 55%~72% 的黑遮罩盖住。
   给内容层一个 z-index:1 就彻底解决（1 > auto）。
   ⚠️ 以及：.wrap 与 .wrap-wide 两种容器都要给 —— 原来只写了 .wrap，
      页面里用的却是 .wrap-wide，于是连 104px 的内边距都没生效，
      band 实测只有 **187px** 高（应有 ~310px），看着像条被压扁的色带。 */
.band .wrap, .band .wrap-wide { position: relative; z-index: 1; padding: 104px var(--pad-x); }
.band h2 { font-size: clamp(24px, 3vw, 36px); max-width: 20em; }
.band p { margin-top: 16px; max-width: 44em; color: rgba(255,255,255,.82); font-size: 16px; }

/* ── 历程 ───────────────────────────────────────────────────── */
/* ★ 2026-09-22 主人指示：撤掉「1. 2. 3. 4.」序号 —— 黑色 marker 与红色年份并排很难看。
   这几个序号**从来不是 HTML 文本**，是 <ol> 的浏览器默认 list marker（::marker）：
   全站 CSS 此前一条 list-style 都没有（只复位过 ul），它一直靠 UA 默认样式撑着，
   所以既改不了颜色（黑）也改不了字体，只能整条撤掉。
   用 list-style: none —— 不用 list-style-type: none（后者在部分浏览器仍留 marker 占位）。
   ⚠️ padding-left 与 .tl li::before 的 left 是**耦合**的：
      圆心 x = padding-left − 25（= padding-left − |left| + 圆点半径 6），竖线中心恒为 1px；
      现值 26 − 25 = 1，圆心正落在竖线中心。**改 padding-left 必须同步改 left**
      （left = −(padding-left + 5)），否则圆点与竖线错位 —— 而且不报错、量测脚本也只报偏移。
   撤掉 marker 后 padding-left 保持 26px 不变：这 26px 同时是「文字相对竖线」的位置，
   改它会牵动全条时间轴的文字左边界。 */
.tl { position: relative; padding-left: 26px; list-style: none; }
.tl::before { content: ""; position: absolute; left: 0; top: 6px; bottom: 6px; width: 2px; background: var(--line); }
.tl li { position: relative; padding-bottom: 34px; }
.tl li:last-child { padding-bottom: 0; }
.tl li::before {
  /* ★ 2026-09-22 主人指出「圆点与 1 2 3 4 没对齐」。
     实测（2x 截图逐像素 + 注入脚本双证）：横向是准的 —— 圆心恒在竖线中心
     （偏差 0.25 CSS px）；问题是**纵向偏高 3.0~3.5 物理 px = 1.5~1.75 CSS px**，
     圆点顶部与数字顶部平齐、而数字有下伸部分，视觉上圆点"飘"在左上方。
     top 7px → 8.5px 后圆心落在序号行的**汉字视觉中线**上。
     为什么是半像素：主人是 Retina（DPR 2），8.5 × 2 = 17 物理 px 恰好落整，
     零抗锯齿模糊；若改成 8px 或 9px 反而各偏 0.5 CSS px。 */
  content: ""; position: absolute; left: -31px; top: 8.5px;
  width: 12px; height: 12px; border-radius: 50%;
  background: var(--n0); border: 2px solid var(--n300);
}
.tl li.hi::before { background: var(--brand-red); border-color: var(--brand-red); }
.tl .yr { font-size: 15px; font-weight: 700; color: var(--brand-red); letter-spacing: -.01em; }
.tl .ti { margin-top: 4px; font-size: 18px; font-weight: 700; }
.tl .ds { margin-top: 8px; font-size: 14.5px; color: var(--tx2); line-height: 1.8; max-width: 46em; }

/* ── 数字格 ─────────────────────────────────────────────────── */
.nums { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 1px; background: var(--line); border: 1px solid var(--line); border-radius: var(--r); overflow: hidden; }
.nums .nu { background: var(--n0); padding: 26px 18px; text-align: center; }
.nums .v { font-size: clamp(26px, 2.6vw, 34px); font-weight: 700; letter-spacing: -.03em; line-height: 1; }
.nums .v i { font-style: normal; font-size: .5em; font-weight: 500; margin-left: 2px; color: var(--tx2); }
.nums .k { margin-top: 10px; font-size: 13.5px; color: var(--tx2); }
/* 6 格变体（首页「研发制造」区）。为什么需要单独一档：
   那一区原来是「3 列数字格 + 认证徽章图」的两栏；图片撤下后数字格变成整幅宽，
   若仍按 3 列，每格会撑到 ~424px，数字与标签居中在一片空里、明显发虚。
   1 行 6 格每格 ~212px，与它原来当半栏时的 ~202px 基本一致，密度不变。
   ⚠️ 原来这里是用**行内 style** 强写 3 列的。行内样式的特异度高于任何选择器，
      也高于媒体查询 → 这一区在 390px 屏上也是硬撑 3 列。改成类名，断点才管得住。 */
.nums.n6 { grid-template-columns: repeat(6, minmax(0, 1fr)); }

/* ── 达人 ───────────────────────────────────────────────────── */
.kols { display: grid; grid-template-columns: repeat(10, minmax(0, 1fr)); gap: 12px; }
.kols img { border-radius: var(--r); aspect-ratio: 1; object-fit: cover; background: var(--n100); }

/* ── 宠物线配色作用域 ───────────────────────────────────────────
   全站 20 多处强调色都写 var(--brand-red)（.eyebrow / .bar-h::before / .btn-red /
   .btn-line / .nav a.on::after / .tl / .ico-mail / .ent .role …）。与其为宠物页
   复制一整套类名，不如**在作用域内重定义这几个变量**：车品红 → 宠物橙。
   依据：宠物册 23 页里 #E60012 出现 **0 次**，宠物线第一识别色是 #FF5A00
   （18/23 页）。两条线混用会让人分不出是哪个业务。
   ⚠️ .pet-page 只加在 <main> 上：页头、页脚、回到顶部按钮都在 <main> 之外，
      刻意保持全站一致 —— 外壳属于「徕本」母品牌，不属于某条业务线。
   ⚠️ 不要写到 :root / body 上，那会把外壳一起染橙。 */
.pet-page { --brand-red: var(--pet-orange); --brand-red-d: var(--pet-orange-d); }

/* ── 宠物板块（产品体系页里的小穿插块）──────────────────────── */
/* 这一块讲的是宠物业务，所以块内用宠物橙 —— 它嵌在车品页里，
   本来就是「两条业务线并列出现」的地方，用色必须能分开。 */
.pet { position: relative; --brand-red: var(--pet-orange);
       background: var(--brand-black); color: #fff;
       border-radius: var(--r); overflow: hidden; }
.pet .in { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 40px; align-items: center; padding: 44px 44px 44px 47px; }
.pet::before { content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; background: var(--brand-red); }
.pet h3 { font-size: 24px; }
.pet p { margin-top: 14px; font-size: 15px; color: var(--n400); line-height: 1.85; }
.pet .nums2 { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 1px; background: rgba(255,255,255,.14); border-radius: var(--r-s); overflow: hidden; }
.pet .nums2 div { background: #0B0B0B; padding: 20px 12px; text-align: center; }
.pet .nums2 .v { font-size: 26px; font-weight: 700; letter-spacing: -.03em; line-height: 1; }
.pet .nums2 .v i { font-style: normal; font-size: .5em; font-weight: 500; margin-left: 2px; color: var(--n400); }
.pet .nums2 .k { margin-top: 8px; font-size: 12.5px; color: var(--n400); }

/* ── 联系页 ─────────────────────────────────────────────────── */
.ent { border: 1px solid var(--line); border-radius: var(--r); background: var(--n0); padding: 26px; }
.ent .role { font-size: 13px; font-weight: 500; color: var(--brand-red); }
.ent h3 { font-size: 18px; margin-top: 10px; }
.ent .city { margin-top: 6px; font-size: 14px; color: var(--tx2); }
.ent .desc { margin-top: 14px; font-size: 14px; color: var(--tx2); line-height: 1.8; }
.ent dl { margin: 18px 0 0; padding-top: 16px; border-top: 1px solid var(--n100); font-size: 14px; }
.ent dt { color: var(--tx3); font-size: 13px; margin-bottom: 2px; }
.ent dd { margin: 0 0 12px; }
.ent dd:last-child { margin-bottom: 0; }

/* 合作通道：本站是纯静态站、没有后端，所以**不做留言表单**
   （表单没有接收端，比没有表单更糟）。改成列出真实可用的联系入口。 */
.ways { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; }
.way { border: 1px solid var(--line); border-radius: var(--r); background: var(--n0); padding: 26px; }
.way h3 { font-size: 17px; }
.way p { margin-top: 10px; font-size: 14px; color: var(--tx2); line-height: 1.8; }
/* 邮箱：**刻意不做成链接**（反爬 + 避免「看着能点却点不动」的困惑）。
   @ 显示为 #，替换说明跟在**同一张卡片内** —— 提示若放到网格下方，
   会与卡片的 26px 内边距错开，看起来就是「没对齐」。 */
/* ⚠️ 原来是 `var(--tx1)` —— 这个变量**根本不存在**（本文件只定义 --tx/--tx2/--tx3），
   于是 color 声明静默失效、颜色靠继承碰巧正确。属于「看着对、其实没生效」，
   查悬空变量时被扫出来。已改为 --tx。 */
.way .mail { margin-top: 18px; font-size: 14.5px; color: var(--tx); }

/* ── 图标：内联进文本流，由 vertical-align 对齐 ──────────────────
   ★ 不要改回「flex + align-items: flex-start + 图标 margin-top 手调」。
   那样做是拿魔数去近似居中：图标顶边贴着行盒顶边，而文字在行盒中偏下
   （line-height 1.8 ≈ 26px 的行盒装 14.5px 的字），3px 补不回来 ——
   表现就是「图标比邮箱高出小半截」。改内联后图标与**第一行**基线对齐，
   换行、改字号、改行高三种情况都不会漂，也不需要魔数。 */
.ico-mail {
  width: var(--ico-mail-size); height: var(--ico-mail-size);
  display: inline-block;
  vertical-align: var(--ico-mail-y);
  margin-right: var(--ico-mail-gap);
  color: var(--brand-red);
}

/* 邮箱是纯文本、不能点，所以让单击即整段选中，省去拖选 */
.em { user-select: all; -webkit-user-select: all; word-break: break-all; }

/* 替换说明：**用括号，不用彩色胶囊**。
   原来的红底白字「提示」是整页视觉权重最高的元素之一（实心品牌红 + 白字），
   放在这种顺带一提的位置反而抢戏，主人反馈「很突兀」。
   括号本身就是排版里表达「附注」的符号，不需要额外装饰。
   缩进到地址文本下方 —— 缩进量 = 图标宽 + 间距，与地址左边缘严格对齐。 */
.mail-note {
  display: block;
  margin-top: 5px;
  margin-left: calc(var(--ico-mail-size) + var(--ico-mail-gap));
  font-size: 12.5px; line-height: 1.6;
  /* 用 --tx2(n500) 而不是更淡的 --tx3(n400)：
     n400 在白底上对比度只有 ~2.6:1，达不到 WCAG AA 的 4.5:1；
     而这行说明是**功能性必读** —— 看不到它就会把 # 当成真的 # 去发信。
     层次改由「小字号 + 括号 + 缩进」表达，不靠把字调淡。 */
  color: var(--tx2);
}
.mail-note b { color: var(--tx2); font-weight: 600; }

/* ── CTA 条 ─────────────────────────────────────────────────── */
.cta { background: var(--brand-black); color: #fff; }
.cta .in { display: flex; align-items: center; justify-content: space-between; gap: 32px; padding: 56px 0; flex-wrap: wrap; }
.cta h2 { font-size: clamp(22px, 2.6vw, 32px); }
.cta p { margin-top: 10px; color: var(--n400); font-size: 15px; }
.cta .acts { display: flex; gap: 12px; flex-wrap: wrap; }
/* CTA 区里的一行可选小字引导（补充入口，不与主按钮抢位） */
.cta .cta-more { margin-top: 14px; font-size: 14px; color: var(--n300); }
.cta .cta-more a { color: #fff; text-decoration: underline; text-underline-offset: 3px; }

/* ── 页脚 ───────────────────────────────────────────────────── */
.ft { background: var(--brand-black); color: var(--n400); padding: 64px 0 28px; }
.ft .top { display: grid; grid-template-columns: 1.4fr 1fr 1fr 1fr; gap: 40px; }
.ft .lk svg { height: 34px; }
.ft .about { margin-top: 18px; font-size: 14px; line-height: 1.85; max-width: 30em; }
.ft h4 { font-size: 14px; color: #fff; font-weight: 500; margin-bottom: 16px; }
.ft li { margin-bottom: 10px; }
.ft a { font-size: 14px; color: var(--n400); transition: color .16s; }
.ft a:hover { color: #fff; }
.ft .ct { font-size: 14px; }
/* 页脚是黑底，说明必须比正文更能看清 —— 它是「功能性必读」，
   看不到就会把 # 当成真的 # 去发信。故用 n400 而非更暗的 n500。 */
/* margin-left: 0 —— 页脚是窄栏（桌面 4 列中最窄的一列），
   地址本身已接近占满一行，说明再缩进 23px 会局促；
   这里让说明与图标共用同一条左边缘。 */
.ft .mail-note { margin-top: 3px; margin-left: 0; color: var(--n400); }
.ft .mail-note b { color: #fff; }
.ft .bot {
  margin-top: 48px; padding-top: 22px; border-top: 1px solid rgba(255,255,255,.12);
  display: flex; justify-content: space-between; gap: 16px; flex-wrap: wrap;
  font-size: 13px;
}
.ft .bot span { color: var(--n500); }

/* ── 内页首屏 ───────────────────────────────────────────────── */
.phero { position: relative; overflow: hidden; background: var(--n800); color: #fff; }
.phero img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.phero::after { content: ""; position: absolute; inset: 0; background: linear-gradient(90deg, rgba(0,0,0,.8), rgba(0,0,0,.45)); }
/* z-index:1 的理由与 .band 完全相同（::after 是定位元素、画在内容之上）。
   实测修前：phero 的 h1 最亮像素只有 **112**，白字被 80%→45% 的遮罩压成灰字；
   修后应为 255。 */
.phero .wrap { position: relative; z-index: 1; padding: 96px var(--pad-x) 84px; }
.phero h1 { font-size: clamp(28px, 3.6vw, 46px); }
.phero p { margin-top: 18px; max-width: 40em; color: rgba(255,255,255,.82); font-size: 16.5px; }
.crumb { margin-bottom: 18px; font-size: 13px; color: rgba(255,255,255,.6); }
.crumb a:hover { color: #fff; }

/* ── 滚动浮现 ─────────────────────────────────────────────────
   只在 <html class="js"> 时隐藏初始态。
   原因：若把 .rv 的 opacity:0 写死在 CSS 里，**JS 加载失败时整页内容会永远不可见**
   —— 页面看起来「空白」，而且控制台干净、极难排查。
   head 里那行内联脚本负责加 .js，所以「没 JS 就全部直出」。 */
.js .rv { opacity: 0; transform: translateY(18px); transition: opacity .6s ease, transform .6s ease; }
.js .rv.in { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) {
  .js .rv { opacity: 1; transform: none; transition: none; }
}

/* ── 回到顶部 ───────────────────────────────────────────────── */
.top-btn {
  position: fixed; right: 22px; bottom: 22px; z-index: 40;
  width: 44px; height: 44px; border-radius: 50%;
  border: 1px solid var(--line); background: rgba(255,255,255,.94);
  color: var(--tx); display: flex; align-items: center; justify-content: center;
  box-shadow: var(--sh-2);
  opacity: 0; visibility: hidden; transition: opacity .2s, visibility .2s;
}
.top-btn.on { opacity: 1; visibility: visible; }

/* ── 响应式 ─────────────────────────────────────────────────── */
/* ⚠️ 「中等宽度」901~1180px 这一段原来没有任何断点覆盖，是个盲区。
   导航 7 项 + 右侧「联系我们」按钮，而**按钮文案与导航最后一项完全重复**。
   实测（CDP 量 scrollWidth）：不收紧时页头要 ≈1058px 才放得下，
   而导航要到 900px 才折叠成汉堡 → 901~1058px 会横向溢出。
   （6 项时这个带是 901~966px，因为自检视口只有 390/500/768/1440/1920，
     这条带一直没被跑到；现在自检里补了 1024。）
   收口两步：先撤掉那个重复的按钮，再压缩导航项的内边距与间距。 */
@media (max-width: 1180px) {
  .hdr .btn { display: none; }
  .hdr .wrap-wide { gap: 22px; }
  .nav { gap: 2px; --nav-pad-x: 11px; }
}
@media (max-width: 1080px) {
  .g4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .nums { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .nums.n6 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .kols { grid-template-columns: repeat(5, minmax(0, 1fr)); }
  .ft .top { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 900px) {
  .nav, .hdr .btn { display: none; }
  .burger { display: block; }
  .hdr.open { background: #fff; }
  .nav-panel {
    display: none; position: absolute; left: 0; right: 0; top: var(--hdr);
    background: #fff; border-bottom: 1px solid var(--line); padding: 12px 24px 22px;
    box-shadow: var(--sh-2);
  }
  .hdr.open .nav-panel { display: block; }
  .nav-panel a { display: block; padding: 13px 2px; font-size: 16px; border-bottom: 1px solid var(--n100); color: var(--tx); }
  .nav-panel a:last-of-type { border-bottom: 0; }
  .nav-panel .btn { margin-top: 14px; width: 100%; }
  .split { grid-template-columns: minmax(0, 1fr); gap: 32px; }
  .split.rev .fig { order: 0; }
  .sec { padding: 68px 0; }
  .g3 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ways { grid-template-columns: minmax(0, 1fr); }
  .pet .in { grid-template-columns: minmax(0, 1fr); padding: 34px 28px 34px 31px; }
  .hero .wrap { padding-top: 64px; padding-bottom: 60px; }
  .hero-img::after { background: linear-gradient(180deg, rgba(0,0,0,.62), rgba(0,0,0,.72)); }
}
@media (max-width: 620px) {
  /* 左右内边距只改这一个变量 —— 收窄的是「内容区留白」，
     不是某几个容器。原来写的是 `.wrap, .wrap-wide { padding: 0 18px }`，
     压不住 .band / .phero 上特异度更高的硬写值（那两处当时写死 24px），
     于是同一屏上出现 18 / 24 两种左边缘。 */
  :root { --pad-x: 18px; }
  .g2, .g3, .g4 { grid-template-columns: minmax(0, 1fr); }
  .nums { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .nums.n6 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .kols { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .pet .nums2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ft .top { grid-template-columns: minmax(0, 1fr); gap: 30px; }
  .stats .st { padding: 24px 16px; border-left: 0; border-top: 1px solid rgba(255,255,255,.14); }
  .stats .st:first-child { border-top: 0; }
  .cat .pct { font-size: 34px; }
  .cta .in { padding: 42px 0; }
  .hero { min-height: auto; }
}

@media print {
  .hdr, .top-btn, .cta { display: none; }
  .sec { padding: 24px 0; break-inside: avoid; }
  body { font-size: 12pt; }
}


/* ════════════════════════════════════════════════════════════════
   品牌资源页（brand.html）专用：色板 / 标识展示 / 规则清单
   ────────────────────────────────────────────────────────────────
   为什么要单独加一块：brand 页要**展示**色值与标识，而这类「展示色块」
   的版式在别的页面里没有对应组件。写在这里而不是页面内联 <style>，
   是为了守住本站既有规矩：样式集中在 site.css，页面由 build_site.py 生成，
   直接改 .html 会被覆盖。

   ⚠️ 圆角一律 12px —— VI §4.3「半径不拆档」，本站现状就是 12px；
      不要在这里另起一套圆角档位。
   ⚠️ 色值只写 var()，不写十六进制。页面里出现的 hex 必须能在 site.css
      里找到（build_skills_page.py 的色值白名单闸门会验）；在 CSS 里
      新增 hex 会让那条闸门失去意义。
   ════════════════════════════════════════════════════════════════ */

/* 色板 */
.swatches{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:16px;list-style:none;padding:0;margin:18px 0 0}
.sw{border:1px solid var(--line);border-radius:12px;overflow:hidden;background:var(--bg)}
.sw-chip{height:88px}
.sw-meta{padding:14px 16px}
.sw-meta b{display:block;font-size:14px;font-weight:700;color:var(--tx)}
.sw-meta span{display:block;margin-top:3px;font-size:12px;color:var(--tx2)}
.sw-meta code{display:inline-block;margin-top:8px;font-size:12px;color:var(--tx);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}

/* 标识三态 */
.logo-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:20px}
.logo-card{margin:0}
.logo-stage{display:flex;align-items:center;justify-content:center;min-height:120px;padding:26px;background:var(--brand-gray);border-radius:12px}
.logo-stage.on-dark{background:var(--n800)}
.logo-stage .lk{height:42px;width:auto}
.logo-stage .lk-ico{height:56px;width:auto}
.logo-cap{padding-top:12px}
.logo-cap b{display:block;font-size:14px;font-weight:700;color:var(--tx)}
.logo-cap span{display:block;margin-top:4px;font-size:12px;color:var(--tx2)}

/* 规则清单：可以做（细线）/ 不要做（红色短线） */
.rule-list{list-style:none;padding:0;margin:18px 0 0}
.rule-list li{position:relative;padding:8px 0 8px 28px;font-size:14px;line-height:1.75;color:var(--tx)}
.rule-list li::before{content:"";position:absolute;left:0;top:17px;width:14px;height:1px;background:var(--tx3)}
.rule-list li.no::before{top:16px;height:2px;width:14px;background:var(--brand-red)}

/* 字号阶梯 */
.scale{display:grid;grid-template-columns:repeat(auto-fit,minmax(128px,1fr));gap:12px;list-style:none;padding:0;margin:18px 0 0}
.scale li{border:1px solid var(--line);border-radius:12px;padding:14px 16px;background:var(--bg)}
.scale .k{display:block;font-size:12px;color:var(--tx2)}
.scale .v{display:block;margin-top:6px;font-size:13px;color:var(--tx);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}

/* 区块内的**分组标题**（标题与上一组内容之间拉开一档）
   56px 取自 pet 页「上一个网格 → 新分组」的实测间距（见 build_site.py 里
   pet 页那处 style="margin-top:56px"）。品牌资源页的分组标题统一用它。 */
.bar-h.grp { margin-top: 56px; }
