@import url('https://fonts.googleapis.com/css2?family=DM+Mono:wght@400;500&family=Manrope:wght@400;500;600;700;800&display=swap');
/* 参考 shopb2bfly.fecshop.cn（Fecify B2B 演示站）的视觉体系：
   白底 + 深蓝灰墨色 + 橙色强调 + 深色 footer；大图 hero 居中排版。 */
/* 内容容器：与竞品 shopb2bfly 一致，固定 1400px 居中（1920 视口下内容区正好 1400px、
   4 列卡片各 335px —— 竞品实测值）。这里用 % 而不是 vw：padding/margin 的百分比按
   「包含块宽度」解析，天然排除滚动条，能精确得到 1400 而不是 1385。视口 ≤1400 时
   退化为 24px 安全边距，移动端也正好是合适的边距。 */
/* ---------- 设计 token：圆角（2026-09-27） ----------
   背景：改造前**没有统一的圆角变量** —— 各主题只能在 主题样式文件 里逐条写
   `border-radius`（b2b-new-birox 逐条 0、b2b-sky 逐条 12/16/24px…）。
   后果：想做「13 套模板靠视觉变量表达差异」时，"每套不同的圆角"会退化成 13 份逐条覆盖。
   做法：把基座里**取值恰好等于 token 的那几档**（4 / 8 / 12 / 999px）收口成变量；
   其余"一次性微调"（3/6/10/14/16px、50%、`6px 0 0 6px` 这类多值）**保持字面量不动** ——
   它们本来就不是一套语言的组成，硬抽只会把 token 变成杂物袋。
   ★ 本批只做"收口"，**不改任何视觉**：各主题声明的 token 值 = 基座值（见各主题 主题样式文件）。
     以后要让某套主题换圆角语言，只改该主题 主题样式文件 里的这几个变量即可。
   ★ `--radius-btn` 单独一档：5 套 B2B 的按钮圆角本就各不相同（基座 4 / fly 2 / birox 0 /
     sky 999 / corp 2），是"用 token 表达差异"最有价值的一档。 */
:root{--ink:#1c2733;--muted:#6f7a85;--paper:#ffffff;--accent:#f26b1d;--accent-dark:#d95c14;--line:#e7e8ea;--footer-bg:#1e2b38;--serif:Georgia,'Times New Roman',serif;--gutter:max(24px,calc((100% - 1400px)/2));--radius-sm:4px;--radius:8px;--radius-lg:12px;--radius-pill:999px;--radius-btn:4px}
*{box-sizing:border-box}
body{margin:0;background:var(--paper);color:var(--ink);font-family:Manrope,Arial,sans-serif}
a{color:inherit;text-decoration:none}
/* ★ 顶栏横向溢出（业主点名「英语不对齐 / 德语也坏了」的真身）—— 根因与修法：
   原规则是 `display:flex + justify-content:space-between`，但**没有 `flex-wrap`**，
   5 个子项（.brand / nav / 顶栏搜索 / 语言切换 / 货币切换）被强排在同一行；
   当 5 项自然宽度之和 > 容器宽（视口 ≲1400px 时必然）时，flex 不能折行 ⇒
     ① 各子项被压缩、导航项在**词内折行**（"CONNECTORS & CABLES" 断成两行）→ 导航参差；
     ② 整体横向溢出 ⇒ `documentElement.scrollWidth > innerWidth`，整页可左右拖动。
   修法（不用任何「藏溢出」的假修复）：
     · 允许折行（flex-wrap）+ 子项内不折行（brand 站名、nav 菜单项）。
     · 一行放不下时折成**两行**：第 1 行 brand + 控件，第 2 行 nav 独占整行（见下方 701–1439 规则）。
     · 顶栏高度保持 72px（min-height + align-content:center，两行也垂直居中，不跳高）。
   ★ 绝不使用 `overflow-x:hidden`：那只是把「整页可横向拖动」换成「右侧内容被直接裁掉」，
     溢出还在，只是看不见了。 */
/* ---------- 站点顶栏（top bar）新组件 · 2026-09-25 ----------
   业主口径：「导航条现在的『我的账户』移动到上面去吧，现在有点挤了」+「再加个询盘链接入口」。
   做法：主头部行上方加一条**细的深色条**，内容右对齐；左/中留空（没有内容就不硬塞占位）。
   ★ 只放两个入口：① 我的账户（b2c-member-nav，原样复用，只换挂载位置）
                  ② 询盘清单（指向 /inquiry-list，文案走语言包键 rfq.button）
   ★★ 整条由模板按「里面真有东西」判据输出（Liquid，不用 JS）——
      会员 / 询盘两个插件都关时**零 DOM**，页头外观与改造前一字不差。
   ★ 与下方 .site-header 同用 var(--gutter) 内边距 ⇒ 右缘与导航/LOGO 内容区右缘对齐。
   ★ 不写 overflow-x:hidden（与顶栏同一条纪律）：窄屏靠 flex-wrap 折行，绝不裁掉内容。 */
.site-topbar{background:var(--ink,#1c2733);color:rgba(255,255,255,.82);font-size:12.5px;line-height:1}
.site-topbar__inner{display:flex;align-items:center;justify-content:flex-end;gap:16px;min-height:34px;padding:5px var(--gutter);flex-wrap:wrap;row-gap:2px}
.site-topbar__actions{display:flex;align-items:center;justify-content:flex-end;gap:14px;flex-wrap:wrap;row-gap:4px;min-width:0}
/* 两个入口共用的链接外观；hover 提亮（保证深底上的对比度足够、不刺眼） */
.site-topbar__link{display:inline-flex;align-items:center;gap:6px;white-space:nowrap;color:rgba(255,255,255,.82);font-weight:600;letter-spacing:.02em;padding:2px 0}
.site-topbar__link:hover,.site-topbar__link:focus-visible{color:#fff}
/* 询盘入口：本项**自定义配色**（业主：「颜色你自己定哦」）——
   文字用满白（比账户项更醒目），图标点缀主题强调色 `--accent`（5 套主题各自的主题色，不写死）。
   为什么**不**把文字也刷成 accent：fly(#e8452c) / sky(#2f7df6) 这类中间调在深底上对比度只有 ~4:1，
   不达 AA 正文标准；纯白文字 ~15:1，兼顾「够醒目」与「不刺眼」。 */
.site-topbar__link--inquiry{color:#fff}
.site-topbar__link--inquiry:hover,.site-topbar__link--inquiry:focus-visible{color:var(--accent,#f26b1d)}
.site-topbar__ico{flex:none;color:var(--accent,#f26b1d)}
/* 两项之间的细分隔线（只在**两项都在**时由模板输出，见 5 套 主题布局模板） */
.site-topbar__sep{width:1px;height:13px;flex:none;background:rgba(255,255,255,.22)}
/* 会员入口（会员导航区块模板 里那枚 .member-nav-entry）在深底上收一档字号、去掉行内留白；
   ★ 只覆盖**外观**，不动它任何行为（登录态分流 / 未读角标脚本照旧）。 */
.site-topbar .member-nav-entry{font-size:12.5px;padding:2px 0}
.site-header{min-height:72px;padding:0 var(--gutter);display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:space-between;row-gap:6px;border-bottom:1px solid var(--line);background:#fff;position:sticky;top:0;z-index:60}
/* ★ 件① 顶栏：品牌与导航之间必须有**确定**的水平间距。
   根因（线上实测 "Xuanan TradingHOME" 中间零间距）：`.brand` 没有右外边距，而
   `@media(min-width:1024px)` 里 `nav{flex:1 1 auto;justify-content:flex-start}` ⇒ nav 撑满剩余空间、
   其首项从 nav 左边缘（= 品牌右边缘）起排，于是紧贴品牌。
   修法：只给 `.brand` 加右外边距（32px）——
     · 比给 `.site-header` 加 column-gap 更**外科**：容器 gap 会在 4 组相邻项（品牌|导航|搜索|语言|货币）
       各加一份，合计最多 +128px，白白抬高溢出风险；品牌外边距只加 1 份，直接把 nav 右推 32px。
     · flex 项外边距**不折叠**，故 ≥1024px 时 品牌右缘→导航首项左缘 恒为 32px（要求 ≥24px）。
   目标：任意语言 / 任意宽度下两者间距 ≥24px 且**绝不重叠**。 */
/* ★★ 2026-09-24 业主返工「站点名称以后不作为 LOGO 展示，统一用图片」——
   文字 wordmark 路径**整条删除**：站名前缀色块 `.brand::before`（原橙色小方块 / 各主题的圆点、
   方点覆盖）、字号 28px / 字距 -.03em / 字重 800，以及"英文站名换行"问题一并消失
   （页头现在只渲染图片 LOGO，无图则整块不输出，见 主题布局模板）。
   `.brand` 保留为**图片 LOGO 的布局容器**：右外边距是品牌区与导航的确定间距（见上，恒 32px）；
   字体相关属性对图片无意义（图片是替换元素、不继承文字样式），故不再保留。 */
.brand{display:inline-flex;align-items:center;margin-right:32px}
/* ★ 站点 LOGO 图片（站点设置 → 基本信息 → 站点 LOGO）：页头标识的**唯一来源**。
   （无图时模板整块不输出 —— 这里不负责占位，也不再有"文字站名"兜底。）

   ★★ 2026-09-23 业主返工「logo 显示得太小 / 不会按显示器分辨率自适应」——
   根因（先量后改，本地实例 + 真浏览器实测）：旧规则 `height:40px; width:auto; max-width:220px`
   把**高度写死**、且以高度定尺。横版长字标（1000×200，5:1）在 40px 高下只能摊到 200px 宽，
   1920 视口里仅占页头内容宽（1400px）的 **14.3%** —— 业主看就是「缩成一团」。

   修法：**不写死高度，只给上下限，由浏览器按图片原始宽高比自动定尺**。
     · `width:auto; height:auto` + `max-height`：横版长图吃满高度上限；
       方形图得等高正方形；竖版图等高 —— 任何宽高比都不变形、不撑破页头。
     · `max-width` 是**窄屏护栏**，长图绝不顶破页头。

   ★★ 2026-09-24 业主**再次**返工「LOGO 还是太小」⇒ 上限整体上调 **1.35×**（52→70px 封顶）。
     实测（真浏览器，图片路径用 5:1 长字标压测，1920/1440/1366/1024/375）：
     站头保持单行、导航不折行、375 视口零横向溢出（scrollWidth == innerWidth）。 */
.brand__logo{display:block;width:auto;height:auto;max-height:clamp(52px,1.8vw + 35px,70px);max-width:min(400px,68vw);object-fit:contain}
/* ★ 深色页头下的 LOGO 可读性（2026-09-27）：
   基座页头是**白底深字**，默认 LOGO 是一枚**纯黑字标**（透明底）—— 在把页头刷成深色的
   主题上（当前只有 b2b-fly：`.site-header{background:var(--ink)}`，--ink=#101820）就是
   **黑字压黑底**，实测对比度 1.17:1（远低于 3:1）。图片不继承 `color`，只能靠 filter。
   ★ 为什么做成变量而不是直接写死：`本样式文件` 是 **9 套主题共享的基座**，
     直接写 `filter:brightness(0) invert(1)` 会把另外 8 套**白底页头**上的黑 LOGO 一起刷白 ⇒
     白底白字，比现在还糟。所以基座只提供**默认 no-op 的开关**，由深色页头的主题自己开启：
     于 `各主题的样式文件` 写 `:root{--brand-logo-filter:brightness(0) invert(1)}`。
     `brightness(0)` 先把字标压成纯黑、`invert(1)` 再翻成纯白 ⇒ 深色页头上是干净的白字标。 */
.site-header .brand__logo{filter:var(--brand-logo-filter,none)}
/* ★★ 2026-09-23 同一批返工「导航条文字也很小 / 不随分辨率自适应」。
   旧规则把字号**写死**成 12px 主值，随后又被 701–1023 与 ≥1024 两段硬压到 11px ⇒
   1920 视口下导航仍是 11px（页头内容区却还是 1400px，看起来就"小"）。
   改为 `clamp()` 随屏宽缩放：下限 11px（≤1400 视口 —— 与改前**完全相同**，零回归）、
   上限 13px（≥1800 视口，比改前 +18%）。
   ★ 上限为什么是 13 而不是更大（实测，不是拍脑袋）：
   · 页头内容区在视口 ≥1424 后**恒定 1400px**，导航可用宽度不再增长；
   · 本地实例真浏览器压力实测（俄语 **9 项**菜单，比业主截图多 2 项 —— 用来吃掉
     "顶栏搜索/语言/货币"占的横向空间）：1920 视口下
       · 本项目（default/fly/birox）：导航盒 1038px，13.5px 时内容 1019px（只剩 19px 余量）；
       · 本主题 13px 时内容 911px，余量 127px —— 留足余量，业主再加菜单也不会挤成两行。
   宁可上限收 0.5px，也不接受"业主多填两个菜单项就折行"。
   ★ 绝不使用 overflow-x:hidden 掩盖 —— 那只是把溢出藏起来，问题还在。 */
.site-header nav{display:flex;gap:28px;font-size:clamp(11px,0.5vw + 4px,13px);font-weight:600;text-transform:uppercase;letter-spacing:.08em;align-items:center;white-space:nowrap}
.site-header nav a:hover{color:var(--accent)}
/* 当前页导航项：由 主题布局模板 输出 aria-current="page" */
.site-header nav a[aria-current="page"]{color:var(--accent)}
/* ── 顶栏响应式（细节A 修复「英文下 Account 掉到第二行」）─────────────────────────────
   旧逻辑两处问题：
     ① 701–1439px 无条件把 nav 折到第 2 行（flex:0 0 100%）——即便整行排得下也折，
        1366/1280 上顶栏永远是「两行」；
     ② ≥1440px 允许整行 flex-wrap：英文/德文/法文/俄文等每项更长，brand + nav + 搜索 +
        语言 + 货币 + 账号的自然宽度之和 > 内容区（最宽 1400px）时，**排在最后的账号被单独
        挤到第二行** —— 这正是业主截图「Account 掉到第二行」的真身。
   新逻辑（一行优先 + 绝不孤立换行 + 不隐藏任何功能项）：
     · ≤700px 走既有移动端 `display:block`（不变）。
     · 701–1023px 沿用「两行」：brand + 控件占第 1 行，nav 独占第 2 行（窄屏最稳）。
     · ≥1024px **一律单行**（`flex-wrap:nowrap`）：整行永不换行 ⇒ 账号**永远**留在第一行。
       空间不够时不藏功能项，而是让 **nav 自己收缩 / 按项折行**吸收（nav：flex:1 1 auto +
       min-width:0 + 自身 flex-wrap）：标准菜单下 nav 仍是整齐一行；菜单很长时导航按项折行，
       也远好过「账号被挤下去」或「横向溢出」。控件组与账号 `flex:0 0 auto`，稳稳留在右端。
   ★ 绝不使用 overflow-x:hidden（那只是把溢出藏起来，问题还在）。 */
@media (min-width:701px) and (max-width:1023px){
  /* ★ 件①：701–1023 两行布局里 nav 独占整行（flex:0 0 100%）⇒ 本行内也让它居中（原先左贴）。
     ★ 2026-09-23：原来的 `font-size:11px` 已删除 —— 基座 `.site-header nav` 的
       `clamp(11px,0.5vw + 4px,13px)` 在本区间正好落在下限 11px，结果与改前**逐像素一致**；
       保留硬编码反而会盖掉基座的自适应（"同一事实两个来源"）。 */
  .site-header>nav{order:2;flex:0 0 100%;gap:12px;letter-spacing:.05em;flex-wrap:wrap;row-gap:4px;justify-content:center}
  .site-header .site-search--header{margin-left:auto}
}
/* ≥1024px：单行优先。nav 弹性吸收、控件与账号固定，整行容器永不换行（账号绝不掉行）。
   ★ 件① 导航居中（2026-09-21）：菜单组在「品牌」与「右侧控件组」之间**水平居中**。
     根因：nav 被 flex:1 1 auto 撑满、justify-content 却是 flex-start ⇒ 菜单**左贴品牌**；
       英文菜单长所以看不出，中日文菜单短 ⇒ 右侧与搜索图标之间留一大块空白（业主点名）。
     修法：nav `justify-content:center`（菜单在 nav 内容盒内居中）+ nav 右外边距 **20px**。
     为什么是 20 而不是随便给：**让左右留白相等** ——
       左留白 = `.brand{margin-right:32px}` = 32px；
       右留白 = nav 右外边距 + 首个控件自带左外边距（`.site-search--header` / `.lang-switch` 均 12px）；
       32 − 12 = **20** ⇒ 左留白 = 右留白 = 32px ⇒ 菜单中心 = (品牌右缘 + 控件组左缘)/2，
       正是判据里「nav 盒子 = [brand.right, 控件组.left]」的中心（实测中心差 0）。
   ★★ 件④ 英文菜单折行（2026-09-22，业主「英文又换行了」）：**先量后改**的实测数字（隔离实例、
     7 项英文菜单、搜索/语言/货币/账号全开，CDP 真浏览器）：
     · 菜单最小单行宽度 = Σ子项宽 + (n-1)×gap：**734px**（font 12px / gap 14px / ls .05em）；
     · nav 可用宽度随视口线性变化：avail(w) = w − 765（1024→259、1200→435、1366→601、1440→675）；
     · 结论：**1024–1420px 物理放不下**（哪怕字号压到 11px 下限、gap 压到 8px，仍需 avail≥644，
       即视口 ≥1409）。因此采取分级策略：
       ① 1024–1439：font 12→**11px**（下限）、gap 14→**8px**、ls .05→.04em，尽量推迟折行；
       ② ≥1440：gap 8→**10px**（avail=675 ≥ 实测 en 656 / de 640 / ja 545 / zh 372 ⇒ 单行）；
       ③ 放不下的语言/宽度（如俄语长词菜单在 ≤1439、en 在 ≤1419）**允许按项折行**，但
          `justify-content:center` 保证**每一行都居中**（实测各行中心差恒 0）；
     · 不变量（改前 20 组实测 + 改后 20 组复测均满足）：整行 flex-wrap:nowrap ⇒ 账号**恒在首行**、
       **零横向溢出**、品牌↔首项 ≥32px（≥24 红线）。
     · ★ 绝不使用 overflow-x:hidden（那只是把溢出藏起来，问题还在）。
     · 取舍说明：若业主要求 1024–1439 也绝不折行，需再让出约 130px（隐藏 LANGUAGE/CURRENCY
       文字标签）或精简菜单项 —— 这是产品决策，不是 CSS 能无中生有的，待业主裁决。 */
@media (min-width:1024px){
  .site-header{flex-wrap:nowrap}
  /* ★ 2026-09-23：原 `font-size:11px` 已删除（见上方 `.site-header nav` 的 clamp 注释）——
     本区间 ≤1400 视口时 clamp 仍取 11px（与改前一致），≥1800 视口才随屏宽长到 13px。 */
  .site-header>nav{order:0;flex:1 1 auto;min-width:0;flex-wrap:wrap;justify-content:center;gap:8px;letter-spacing:.04em;row-gap:2px;margin-right:20px}
  .brand{flex:0 0 auto}
  .site-header .site-search--header{margin-left:12px;flex:0 0 auto}
  .site-header .lang-switch{margin-left:12px;flex:0 0 auto}
}
@media (min-width:1440px){
  .site-header>nav{gap:10px}
}

/* ══ 导航多级下拉（数据源 = 专辑树：`collections.parent_id`，见 服务端专辑模块）═════════
   业主口径：`Products ▾` 悬浮出三列级联分类（参考图），**按专辑树自动生成**，不让业主手填菜单。
   同一份 DOM 出两种形态：
     · ≥701px 且 (hover:hover)：级联浮层（绝对定位 —— **不占布局宽度**，三列向右展开）；
     · 手机 / 无 hover 设备：手风琴（展开后在导航行内向下推，**不盖住正文、不横向溢出**）。
   ★ 顶栏唯一新增的布局宽度 = 「有子级」的小三角（约 12px/项）——刻意做成 `::after` 伪元素，
     **不新增 DOM**；绝不用 overflow 裁切（那只是把溢出藏起来，问题还在）。
   ★ 子级文字强制 `text-transform:none`：导航是 uppercase，分类名不该跟着变大写
     （俄语等长词也靠 `white-space:normal` + 最大宽度换行，不撑破视口）。 */
.site-header .nav-item{position:relative;display:inline-flex;align-items:center;min-width:0}
.site-header .nav-item > a{display:inline-flex;align-items:center}
.site-header .nav-item--has-children > a::after{content:'';width:0;height:0;margin-left:5px;border-left:3.5px solid transparent;border-right:3.5px solid transparent;border-top:4.5px solid currentColor;opacity:.5;flex:none}
.site-header .nav-item--has-children > a[aria-current="page"]::after{opacity:.85}

/* 子级列表：默认关闭（display:none ⇒ 不占位、不可 Tab 到 —— 收起时不产生隐形焦点） */
.site-header .nav-sub{display:none;list-style:none;margin:0;padding:0;white-space:normal;min-width:0}
.site-header .nav-sub__item{position:relative;display:block;white-space:normal;list-style:none;margin-top:8px}
.site-header .nav-sub__item > a{display:inline-flex;align-items:center;text-transform:none;letter-spacing:.02em;color:inherit;text-decoration:none}
.site-header .nav-sub__item--has-children > a::after{content:'';width:0;height:0;margin-left:5px;border-left:3.5px solid transparent;border-right:3.5px solid transparent;border-top:4.5px solid currentColor;opacity:.45;flex:none}
.site-header .nav-item.is-open > .nav-sub,
.site-header .nav-sub__item.is-open > .nav-sub,
.site-header .nav-item:focus-within > .nav-sub,
.site-header .nav-sub__item:focus-within > .nav-sub{display:block}

/* 手机 / 无 hover 设备：手风琴。展开项独占一整行（nav 是 flex-wrap 的），子级竖直排、居中。 */
@media (max-width:700px), (hover:none){
  .site-header .nav-item.is-open{flex:0 0 100%;flex-direction:column;align-items:center;row-gap:8px}
  .site-header .nav-sub{padding:2px 0 0;text-align:center}
  .site-header .nav-sub__item{margin-top:8px}
  .site-header .nav-sub--2,.site-header .nav-sub--3{padding-left:14px}
}

/* 宽屏 + 可悬浮设备：级联浮层（三列）。绝对定位 ⇒ 对既有「单行不折行」口径零宽度影响。 */
@media (min-width:701px) and (hover:hover){
  .site-header .nav-sub{position:absolute;top:100%;left:-12px;display:block;min-width:210px;max-width:min(320px,42vw);padding:10px 8px;background:var(--b2b-nav-sub-bg,#fff);border:1px solid var(--line);border-radius:10px;box-shadow:0 16px 38px rgba(16,24,34,.15);opacity:0;visibility:hidden;pointer-events:none;transform:translateY(6px);transition:opacity .16s ease,transform .16s ease,visibility .16s;z-index:70}
  /* 触发器与浮层之间的「桥」：鼠标从菜单项移到浮层不会经过空白 ⇒ 不会误关 */
  .site-header .nav-sub::before{content:'';position:absolute;left:0;right:0;top:-14px;height:14px}
  /* 第 2 / 3 列：贴父项右侧展开（级联） */
  .site-header .nav-sub--2,
  .site-header .nav-sub--3{top:-11px;left:100%;margin-left:6px}
  .site-header .nav-item:hover > .nav-sub,
  .site-header .nav-item:focus-within > .nav-sub,
  .site-header .nav-item.is-open > .nav-sub,
  .site-header .nav-sub__item:hover > .nav-sub,
  .site-header .nav-sub__item:focus-within > .nav-sub,
  .site-header .nav-sub__item.is-open > .nav-sub{opacity:1;visibility:visible;pointer-events:auto;transform:none}
  /* Esc 收起：标记由脚本加（把焦点还给触发项时 :focus-within 会立刻又成立，靠它压制） */
  .site-header .nav-item--esc > .nav-sub{opacity:0 !important;visibility:hidden !important;pointer-events:none !important}
  .site-header .nav-sub__item{margin-top:0}
  .site-header .nav-sub__item > a{display:block;padding:8px 12px;border-radius:6px;font-size:13px;font-weight:500;line-height:1.35;color:var(--ink);letter-spacing:.01em}
  .site-header .nav-sub__item > a:hover{background:rgba(16,24,34,.05);color:var(--accent)}
  .site-header .nav-sub__item > a::after{content:none}
  /* 第 1/2 列里有下一级的项：右侧留出箭头位，箭头用绝对定位（不参与换行计算） */
  .site-header .nav-sub__item--has-children > a{padding-right:30px}
  .site-header .nav-sub__item--has-children > a::after{content:'';position:absolute;right:12px;top:50%;margin:-4px 0 0;border-left:5px solid currentColor;border-top:4px solid transparent;border-bottom:4px solid transparent;border-right:0;opacity:.45}
}

/* ── 专辑页的「子专辑入口」（模板 专辑页模板）────────────────────────────
   父专辑页聚合了子孙商品，这里给出**进入子专辑**的显式入口（两者都做，业主口径）。 */
.sub-collections{margin:0 var(--gutter) 40px;padding:22px 24px;border:1px solid var(--line);border-radius:var(--radius-lg);background:#fafbfc}
.sub-collections__title{margin:0 0 14px;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}
.sub-collections__list{display:flex;flex-wrap:wrap;gap:10px;margin:0;padding:0;list-style:none}
.sub-collection{display:inline-flex;align-items:baseline;gap:8px;padding:9px 16px;border:1px solid var(--line);border-radius:var(--radius-pill);background:#fff;color:var(--ink);text-decoration:none;font-size:13px;font-weight:600;transition:border-color .16s ease,color .16s ease}
.sub-collection:hover{border-color:var(--accent);color:var(--accent)}
.sub-collection__count{font-size:11px;font-weight:500;color:var(--muted)}
@media (max-width:700px){.sub-collections{margin:0 var(--gutter) 30px;padding:18px}.sub-collection{font-size:12px;padding:8px 13px}}
.hero{padding:9vw var(--gutter);min-height:560px;position:relative;background:linear-gradient(115deg,#f6f7f9 0%,#f6f7f9 60%,#e9edf2 100%)}
.eyebrow{font:500 11px 'DM Mono',monospace;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);font-weight:500}
.hero h1,.page-intro h1{font-size:clamp(40px,4.6vw,64px);line-height:1.04;letter-spacing:-.03em;margin:26px 0;font-weight:800}
.hero h1 em,.page-intro h1 em{font-family:var(--serif);font-weight:400;letter-spacing:-.02em}
.hero-copy{max-width:460px;color:var(--muted);line-height:1.75;font-size:15px}
.button{display:inline-flex;align-items:center;gap:12px;padding:15px 30px;margin-top:25px;font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.09em;cursor:pointer;border:0;border-radius:var(--radius-btn);transition:background .2s,color .2s}
.button span{font-size:16px;line-height:0}
.button-dark{background:var(--ink);color:#fff}
.button-dark:hover{background:#0e1620}
.button-light{background:#fff;color:var(--ink)}
.button-accent{background:var(--accent);color:#fff}
.button-accent:hover{background:var(--accent-dark)}
/* 描边按钮：详情页「Ask for samples」用；.button 自带 margin-top:25px，在 flex 行里必须归零 */
.button-light-outline{background:transparent;color:var(--ink);box-shadow:inset 0 0 0 1px var(--ink)}
.button-light-outline:hover{background:var(--ink);color:#fff}
/* 大图 hero（严格对标参考站：通栏背景图 + 深色遮罩 + 居中白色标题，高度 800px） */
.hero-banner{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;min-height:800px;padding:90px var(--gutter);background-size:cover;background-position:center;position:relative;color:#fff}
.hero-banner::after{content:'';position:absolute;inset:0;background:rgba(16,24,34,var(--hero-overlay,.55))}
.hero-banner>*{position:relative;z-index:1}
.hero-banner .eyebrow{color:#ffb98a}
.hero-banner h1{color:#fff;text-transform:uppercase;letter-spacing:.01em;font-size:clamp(28px,3vw,46px);margin:22px 0 14px;max-width:900px}
.hero-banner h1 em{font-style:normal}
.hero-banner .hero-copy{color:#e5e9ee;max-width:640px;margin:0 auto}
.hero-stat{position:absolute;right:var(--gutter);bottom:6vw;display:flex;align-items:center;gap:14px}
.hero-banner .hero-stat{position:relative;right:auto;bottom:auto;margin-top:38px}
.hero-stat strong{font-size:52px;letter-spacing:-.04em}
.hero-stat span{font:11px 'DM Mono',monospace;text-transform:uppercase;line-height:1.5;color:var(--muted)}
.hero-banner .hero-stat span{color:#c8d0d9}
.section{padding:72px var(--gutter)}
.section-products{background:#fff}
.section-heading{display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:38px}
.section-heading h2,.cta-section h2{font-size:clamp(28px,2.6vw,38px);line-height:1.06;letter-spacing:-.03em;margin:18px 0 0;font-weight:800}
.text-link{font:12px 'DM Mono',monospace;text-transform:uppercase;border-bottom:1px solid;padding-bottom:7px}
.text-link span{font-size:16px}
/* 商品网格：桌面 4 列起步。
   之前固定 2 列 → 1920 视口下单卡宽 785px、图片 581px 高，用户反馈「图片搞这么大」「布局太分散」。
   密排小卡才是 B2B 目录该有的密度（对标 shopb2bfly 首页）。 */
.product-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:40px 20px}
@media(max-width:1500px){.product-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(max-width:1100px){.product-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:640px){.product-grid{grid-template-columns:1fr;gap:30px}}
/* 空结果提示在网格里必须跨满整行，否则会被当成一个单元格挤在左上角 */
.product-grid .empty-state{grid-column:1/-1}
.product-grid-large{padding:0 var(--gutter) 72px}
.product-card{display:block}
/* 卡片图统一 1:1 方图：与详情页主图、竞品目录一致，避免同一批商品忽高忽低 */
.card-image{aspect-ratio:1;background-size:cover;background-position:center;position:relative;background-color:#eceef1;transition:transform .35s}
.product-card:hover .card-image{transform:translateY(-5px)}
.card-arrow{position:absolute;right:15px;top:15px;width:36px;height:36px;border-radius:50%;background:var(--accent);color:#fff;display:grid;place-items:center;font-size:18px;opacity:0;transition:opacity .2s}
.product-card:hover .card-arrow{opacity:1}
/* 无图占位：以前这里复用 .card-arrow，但箭头改成就绪才显示后会变成「什么都看不见」 */
.card-noimg{position:absolute;inset:0;display:grid;place-items:center;color:#98a1ab;font:11px 'DM Mono',monospace;text-transform:uppercase;letter-spacing:.1em}
/* 卡片文案：严格对标参考站商品卡（方图 → 标题两行）。
   参考站图下只有标题 + 价格；我们是 B2B 不放价格，因此图下只保留标题。
   原先这里还有一行 10px 等宽大写的 `SKU-xxx / INQUIRY ONLY` 和一段 12.5px 灰色摘要，
   用户反馈「下面为什么还有小字，排版很难看」，已整体移除（见 相关模块*.liquid）。 */
.product-card h3{font-size:16px;line-height:1.5;letter-spacing:-.01em;margin:10px 0 0;font-weight:600;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
/* ============================================================================
   Q7 展示类增强（插件 product-display）—— 基座样式骨架，**类名前缀统一、可被主题覆盖**
   ★ 5 套主题的 主题样式文件 是「风格身份」，**刻意不动**；主题可用下面这些
     `--pd-*` 变量在自己的 :root 里覆写颜色/圆角，无需重写规则。
   ★ 全部规则「默认关 ⇒ 零输出」：模板在子开关关闭时不产出任何元素，所以这些类
     在未开启时**不会命中任何节点**（不影响既有版式）。
   ============================================================================ */
/* ① 商品角标：绝对定位在图左上角（`.card-image` 已 position:relative + overflow:hidden）；
   右上角留给 `.card-arrow`，两者叠在一起会互相遮挡。
   ★★ 三色必须与后台预览**逐值一致**（`后台管理界面的徽标页签组件` 的 `.bt-preview-card`
     三色：默认 #1f2933 / 新品 #16a34a / 促销 #c0392b），由 `样式回归套件`
     的「颜色锁」断言双向守住 —— 只改一边、另一边没跟上就当场变红。
   ★ 为什么默认/促销用这两个值：它们是**前台原值**（商家与客户已经在看的样子），
     改前台属于客户可见的视觉变更；只有「新品」必须改（原先它回落默认色 ⇒ 与默认同色，
     后台选「新品」看不出一丁点差别，等于「配了没反应」）。
     主题若要贴自己的调色板，覆盖 `--pd-badge-*-bg` 即可，不必动规则。 */
.product-badge{position:absolute;z-index:2;top:10px;left:10px;display:inline-block;max-width:calc(100% - 20px);padding:4px 9px;border-radius:var(--pd-badge-radius,4px);background:var(--pd-badge-bg,#1f2933);color:var(--pd-badge-fg,#fff);font-size:11px;font-weight:600;line-height:1.4;letter-spacing:.02em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}
.product-badge--new{background:var(--pd-badge-new-bg,#16a34a)}
.product-badge--sale{background:var(--pd-badge-sale-bg,#c0392b)}
.product-badge--custom{background:var(--pd-badge-custom-bg,var(--pd-badge-bg,#1f2933))}
/* ② 列表卡片简介：图下标题下的一段小字（默认不产出） */
.product-card-desc{margin:6px 0 0;color:var(--muted,#6b7280);font-size:12.5px;line-height:1.6;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
/* GEO 文章里的商品卡片：业主 2026-09-25「卡片太大…**就显示图片加标题就行**」 ⇒ 只留 图 + 标题、尺寸收敛。
   ★ 一律挂在**专属** `.geo-media-card`（`GEO 配图模块` 注入时输出）上，**不碰** `.product-card` /
     `.card-image` 通用规则 ⇒ 前台商品列表、各主题商品卡**完全不受影响**（5 套主题的 主题样式文件 也不动）。
   ★ 通用 `.card-image` 是正方形；正文栏 `.article-detail` 左右各 22vw padding（内宽约 56vw），1440 视口下
     卡片图原来约 806×806 —— 这就是「太大」的真因。当时改成 16:9 + 宽度上限 360px；
     **2026-09-25 第二版业主返工为「横向卡」**（左 96px 方图 + 右标题、不带价格），见下方 `.geo-media-card` 段。
   ★ 卡片注入在文章 `<div class="body-html">` 内，故卡内 `<img>` 会吃到下方 `.body-html img{…height:auto;
     margin:18px 0…}`。这里用特异性更高的 `.geo-media-card .card-image img`(0,2,1) **压过**它(0,1,1)：
     `height:100%` 修「图与方框不贴合」，`margin:0` 修「绝对定位图被 18px 外边距顶出 18px 缝」。 */
/* ★★ 2026-09-25 业主返工（第二版）：「卡片改成**横向卡**，照我给的截图那样（左图 + 右标题），
   **但不显示价格**」—— 沿用站上「B2B 不展示价格」口径，所以这里**没有价格行、没有平台名、没有简介**。
   ★ 为什么要改版式：上一版是「图上一个 360px 窄卡」（`max-width:360px` + `aspect-ratio:16/9`），
     业主看过实效果后要求改成横向紧凑卡（与京东商品卡同构，但去掉价格）。
   ★ 不动 HTML 结构：卡片标记仍是 `<a class="product-card geo-media-card"><div class="card-image">
     <img></div><h3>标题</h3></a>`（见 `服务端 GEO 配图模块`）⇒ **纯 CSS 换版式**，
     因此同一个类将来用在**博客正文**里也会自动是同一张卡，不必两处各写一套。
   ★ 与容器无关：刻意**不依赖** `.article-detail` 等祖先选择器（博客正文与文章正文的容器不同）。
   ★ 回退点（改前值）：`.geo-media-card{max-width:360px;margin:0 0 28px}` /
     `.card-image{aspect-ratio:16/9;border-radius:var(--radius-sm)}` / `h3{font-size:15px;margin-top:8px}`。 */
.geo-media-card{
  display:flex;align-items:flex-start;gap:12px;
  max-width:560px;margin:0 0 28px;
}
/* 缩略图：96px 方图。`.card-image` 通用规则是 1:1 + `background-size:cover`，这里只收宽度与圆角 */
.geo-media-card .card-image{flex:0 0 96px;width:96px;aspect-ratio:1;border-radius:6px}
/* ★ 必须保留：压过 `.body-html img{margin:18px 0}`（否则图被 18px 外边距顶出缝） */
.geo-media-card .card-image img{height:100%;margin:0}
/* 标题：14px、两行截断。与 `.product-card h3` 同特异性(0,1,1)但**在本文件更靠后** ⇒ 由本规则生效 */
.geo-media-card h3{
  flex:1 1 auto;min-width:0;margin:0;
  font-size:14px;line-height:1.5;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
/* ★★ 2026-09-25 业主返工「GEO 文章里的商品卡片不要 hover 上浮」——
   根因：GEO 卡片复用 `.product-card`（`<a class="product-card geo-media-card">`，见 服务端 GEO 配图模块）
     ⇒ 被基座 `.product-card:hover .card-image{transform:translateY(-5px)}`（上方第 276 行）连带命中；
       3 套主题自带的 `.product-card:hover{transform:…}`（fly / new-birox 带位移）还会把**整卡**顶起。
   修法：**只对专属 `.geo-media-card` 取消位移**，绝不动 `.product-card` / `.card-image` 通用规则
     （红线：前台商品列表与各主题商品卡的观感必须**保持原样**）。
   ★ 为什么把类名写两遍（`.geo-media-card.geo-media-card`）= 刻意提高特异性：
     · 要压过基座 `.product-card:hover .card-image`(0,3,0) ⇒ 本规则取 (0,4,0)；
     · 还要压过**主题覆盖层**的 `.product-card:hover{transform:…}`(0,2,0) —— 主题 CSS 在基座之后加载，
       同特异性时主题赢，故必须抬到 (0,3,0) 才能**写在基座、5 套主题一次生效**
       （与仓库既有纪律一致：不逐主题抄一份，"抄漏一套 = 换个主题就复原"）。
   ★ 只取消 transform（位移/上浮）；主题的 box-shadow 变化不属于「上浮」，一律保留不动。 */
.geo-media-card.geo-media-card:hover{transform:none}
.geo-media-card.geo-media-card:hover .card-image{transform:none}
/* ③ 描述装修：按块排版的容器（默认不产出；原富文本口径保持不变） */
.desc-blocks{display:block;margin:0 0 16px}
.desc-block{margin:0 0 18px}
.desc-block:last-child{margin-bottom:0}
.desc-block-title{font-size:16px;font-weight:600;margin:0 0 8px;line-height:1.4}
.desc-block-text{margin:0;line-height:1.75;white-space:pre-wrap}
.desc-block-table{width:100%;border-collapse:collapse;font-size:13px}
.desc-block-table th,.desc-block-table td{border:1px solid var(--art-border-color,#ebeef5);padding:8px 10px;text-align:left}
.desc-block-table thead th{background:#fafafa;font-weight:600}
.desc-block-cta{display:inline-block;padding:10px 18px;border-radius:var(--pd-badge-radius,4px);background:var(--pd-badge-bg,#1f2933);color:#fff;text-decoration:none;font-weight:600;line-height:1.4}
.desc-block-cta:hover{opacity:.9}
/* ④ 尺码表：详情页固定结构的尺寸对照表（默认不产出） */
.size-chart{margin:8px 0 0}
.size-chart-title{font-size:16px;font-weight:600;margin:0 0 12px}
.size-chart-table{width:100%;border-collapse:collapse;font-size:13px}
.size-chart-table th,.size-chart-table td{border:1px solid var(--art-border-color,#ebeef5);padding:8px 10px;text-align:left}
.size-chart-table thead th{background:#fafafa;font-weight:600}
/* 特性图片网格（参考站 2×4 服务/能力卡片） */
.section-features{background:#fff}
.feature-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:26px 22px}
.feature-grid.cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}
.feature-grid.cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}
.feature-card{display:block}
/* 特性图用更扁的比例：8 张卡按 4 列排 2 行，1.4 的方图会让整段过高（曾达 1075px） */
.feature-card .feature-image{aspect-ratio:1.7;background-size:cover;background-position:center;background-color:#eceef1;margin-bottom:13px;transition:transform .3s}
.feature-card:hover .feature-image{transform:translateY(-4px)}
.feature-card h3{font-size:15px;font-weight:700;margin:0 0 6px;letter-spacing:-.01em}
.feature-card p{color:var(--muted);font-size:12px;line-height:1.65;margin:0}
.section-collections{background:#f4f6f8}
.collection-list{margin-top:40px;border-top:1px solid var(--line)}
.collection-row{display:grid;grid-template-columns:70px 1fr 200px 40px;align-items:center;gap:20px;padding:26px 0;border-bottom:1px solid var(--line)}
.collection-row:hover{background:#eceff2}
.collection-index{font:11px 'DM Mono',monospace;color:var(--muted)}
/* ★ 移动端横向溢出治理（320/375 实测；根因 = grid 子项 min-width:auto ⇒ min-content 撑破容器）：
   · 首页专辑行：.collection-name 允许收缩 + 断词 ⇒ 行内 1fr 轨道可缩到容器内，箭头列不再被顶出视口；
   · 联系页表单：.inquiry-form 是 .inquiry-wrap 的 grid 子项、.field 又是其 grid 子项，
     <input> 默认 size 的 min-content 把表单撑到 331.9px（容器仅 320）⇒ 溢出；对策见下方 .inquiry-* 规则。 */
.collection-name{font-size:25px;letter-spacing:-.02em;font-weight:700;min-width:0;overflow-wrap:anywhere;word-break:break-word}
.collection-count{font:11px 'DM Mono',monospace;text-transform:uppercase;color:var(--muted)}
.collection-arrow{font-size:20px;text-align:right;color:var(--accent)}
.cta-section{background:var(--ink);color:#fff;display:flex;justify-content:space-between;gap:60px}
.cta-section.cta-accent{background:linear-gradient(100deg,var(--accent) 0%,var(--accent-dark) 100%)}
.cta-section.cta-accent .eyebrow{color:#ffd9bd}
.cta-section .eyebrow{color:#9aa7b4}
.cta-copy{max-width:340px;color:#b7c1cb;line-height:1.7;font-size:14px}
.cta-section.cta-accent .cta-copy{color:#ffe3cf}
/* 深色多列 footer（参考站样式） */
footer{background:var(--footer-bg);color:#b9c3cd;padding:64px var(--gutter) 0;font-size:13px}
/* ★ 件② 页脚列宽（2026-09-21 二次收紧）：把 RESOURCES / CONTACT 再整体左移。
   业主口径「红框里的内容（RESOURCES）左边移动一点」——旧值 1.15fr 1fr 1fr 1.15fr + 60px 列间距，
   1366 实测 RESOURCES 左缘 ≈705（离内容左缘太远）。本次收窄前两列份额（1fr / .85fr）+ 列间距 60→40，
   使 RESOURCES 左缘落进 620–650 目标带；四列仍两两不相交、无横向溢出。
   ★ 本值必须与 5 套主题 `主题布局模板` 内 @media(min-width:901px) 的同名覆盖**逐字节一致**
     （那边才是 ≥901 的真正生效者；这里是 <901 的兜底 + 单一真相备忘）。 */
.footer-cols{display:grid;grid-template-columns:1.15fr .8fr 1.3fr .8fr auto 1.15fr;gap:40px;padding-bottom:48px}
/* 槽位本体：正常文档流（禁 absolute/fixed/固定高度/overflow），内容多只会把页脚往下推 */
.footer-slot{min-width:0}
/* 社媒块进槽后改为**左对齐**（与相邻栏目列的 h4+ul 对齐；底带兜底路径仍走居中规则） */
.footer-slot .b2b-fs{align-items:flex-start}
.footer-slot .b2b-fs__list{justify-content:flex-start}
.footer-brand strong{color:#fff;font-size:19px;letter-spacing:-.02em}
.footer-brand p{color:#8fa0af;margin:10px 0 0;line-height:1.7}
.footer-col h4{color:#fff;font-size:12px;text-transform:uppercase;letter-spacing:.12em;margin:4px 0 18px}
.footer-col ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:11px}
.footer-col a:hover{color:#fff}
.footer-bottom{border-top:1px solid rgba(255,255,255,.12);padding:20px 0;display:flex;justify-content:space-between;align-items:center;gap:16px;font-size:12px;color:#8fa0af}
.footer-bottom a{color:#8fa0af}
.footer-bottom a:hover{color:#fff}
footer p{color:#8fa0af;margin:8px 0 0}
.footer-links{display:flex;gap:24px;align-items:center;font:11px 'DM Mono',monospace;text-transform:uppercase}
/* 去掉 max-width:1000px：边距已由 --gutter 统一给到 1400 容器，
   再叠加 1000 上限会把正文列压到 ~500px（标题被迫折成窄柱）。 */
.page-intro{padding:64px var(--gutter) 40px}
/* 列表页标题不该跟首页 hero 一样大（hero 是 64px 的视觉锤，内页 64px 只会显得空） */
.page-intro h1{font-size:clamp(30px,3vw,44px);margin:18px 0}
.page-intro p{max-width:460px;line-height:1.7;color:var(--muted)}
/* ★★ 专辑/全部商品页的「专辑筛选条」（插件 collection-list-plus）。
   模板用的是 `.collection-filter` / `__list` / `__item`（见 专辑页模板），
   但**这三个类从来没有样式** ⇒ 页面上就是一排没样式的链接、与下面的商品网格挤在一起
   （业主截图实证：「前端还是一样，没有样式，排版还是错乱的」）。
   ⇒ 这里按站点既有视觉补：横向胶囊条、可横向滚动、命中项高亮、窄屏不溢出。 */
.collection-filter{margin:0 var(--gutter,24px) 28px}
.collection-filter__list{
  display:flex;flex-wrap:wrap;gap:10px;align-items:center;
}
.collection-filter__item{
  display:inline-flex;align-items:center;height:38px;padding:0 18px;
  border:1px solid var(--line,#e7e8ea);border-radius:var(--radius-pill);background:#fff;
  color:var(--ink,#1c2733);font-size:14px;line-height:1;text-decoration:none;
  white-space:nowrap;transition:border-color .18s,background .18s,color .18s;
}
.collection-filter__item:hover{border-color:var(--accent);color:var(--accent)}
.collection-filter__item.is-active{
  background:var(--accent);border-color:var(--accent);color:#fff;font-weight:600;
}
@media(max-width:700px){
  /* 窄屏：横向滚动而不是换行挤压（与站点其它 pills 条一致） */
  .collection-filter{margin-left:var(--gutter,16px);margin-right:0}
  .collection-filter__list{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:4px}
  .collection-filter__item{flex:0 0 auto}
}
.catalog-toolbar{margin:0 var(--gutter) 55px;border-top:1px solid var(--line);border-bottom:1px solid var(--line);padding:18px 0;display:flex;justify-content:space-between;align-items:center;font:11px 'DM Mono',monospace;text-transform:uppercase}
.catalog-toolbar form{display:flex;gap:8px}
.catalog-toolbar input{border:0;border-bottom:1px solid var(--ink);background:transparent;padding:6px 3px;font:12px Manrope;outline:0}
.catalog-toolbar button{border:0;background:transparent;font:11px 'DM Mono';text-transform:uppercase;cursor:pointer}
.empty-state{padding:60px 0;color:var(--muted);font-size:14px}
/* ===== 商品详情：对标 shopb2bfly 的紧凑双栏 =====
   旧值两栏间距按 8% 视口宽算（1920 下 153px），加上 h1 58px、上下留白 45/110px，
   整体非常松散（用户反馈「布局太分散」）。
   现改为左右各半、间距 56px，并补齐面包屑 / 卖点 / 保障条 / 分页签，提高信息密度。 */
.product-detail{padding:26px var(--gutter) 72px}
.breadcrumb{display:flex;gap:9px;align-items:center;font:11px 'DM Mono',monospace;text-transform:uppercase;color:#98a1ab;margin-bottom:22px;flex-wrap:wrap}
.breadcrumb a:hover{color:var(--ink)}
.breadcrumb .sep{color:#c9d1d9}
.back-link{font:11px 'DM Mono',monospace;text-transform:uppercase;color:var(--muted)}
.detail-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:56px;margin-top:0;align-items:start}
.detail-image{aspect-ratio:1;background-size:cover;background-position:center;background-color:#eceef1}
.detail-copy{padding:0;min-width:0}
/* 商品多图图库：主图固定 1:1，缩略图切换 */
/* 不要给图库加 position:sticky：主图 1:1 + 缩略图常常高于视口，sticky 会把缩略图裁在屏外 */
.detail-gallery{display:flex;flex-direction:column;gap:12px;min-width:0}
.gallery-main{position:relative;aspect-ratio:1;background:#eceef1;overflow:hidden;border-radius:var(--radius-sm);border:1px solid var(--line)}
.gallery-main img{width:100%;height:100%;object-fit:cover;display:block}
.gallery-placeholder{display:grid;place-items:center;color:#98a1ab;font:11px 'DM Mono',monospace;text-transform:uppercase;letter-spacing:.1em}
.gallery-thumbs{display:flex;gap:9px;flex-wrap:wrap}
.gallery-thumb{width:74px;height:74px;padding:0;border:2px solid transparent;border-radius:6px;overflow:hidden;cursor:pointer;background:#eceef1;transition:border-color .2s}
.gallery-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.gallery-thumb.is-active{border-color:var(--accent)}
/* 商品视频（并入主图区）：视频用 contain 保留完整画面、不裁切；缩略图叠播放角标。
   ★ 必须显式写 [hidden] 规则 —— `.gallery-main img` 已经设了 `display:block`，
     只写 `hidden` 属性会被它盖掉，导致"切到视频后图片还在旁边"。 */
.gallery-main video{width:100%;height:100%;object-fit:contain;display:block;background:#0b0d10}
.gallery-main img[hidden],.gallery-main video[hidden]{display:none}
.gallery-thumb-video{position:relative}
.gallery-thumb-play{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:28px;height:28px;border-radius:50%;background:rgba(0,0,0,.55);pointer-events:none}
.gallery-thumb-play::after{content:'';position:absolute;left:53%;top:50%;transform:translate(-50%,-50%);border-style:solid;border-width:6px 0 6px 10px;border-color:transparent transparent transparent #fff}
/* 远程引用视频（YouTube / Vimeo）：主区先给「封面+播放按钮」，点了才换成 iframe。
   ★ 这样页面加载时不发任何第三方请求（否则等于替访客把 cookie 种上了）。 */
.gallery-embed{position:absolute;inset:0}
.gallery-embed[hidden]{display:none}
.gallery-embed-frame{width:100%;height:100%;border:0;display:block;background:#000}
.gallery-embed-poster{position:absolute;inset:0;display:block;width:100%;height:100%;padding:0;border:0;background:#0b0d10;cursor:pointer}
.gallery-embed-poster[hidden]{display:none}
.gallery-embed-poster img{width:100%;height:100%;object-fit:cover;display:block;opacity:.92}
.gallery-embed-play{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:64px;height:64px;border-radius:50%;background:rgba(0,0,0,.6)}
.gallery-embed-play::after{content:'';position:absolute;left:54%;top:50%;transform:translate(-50%,-50%);border-style:solid;border-width:12px 0 12px 20px;border-color:transparent transparent transparent #fff}
/* 商品卡片图统一用 img + object-fit，保证尺寸一致、无图有占位 */
.card-image{overflow:hidden}
.card-image img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.detail-copy h1{font-size:clamp(24px,2.3vw,33px);line-height:1.16;letter-spacing:-.02em;margin:0 0 14px;font-weight:800}
.lead{font-size:15px;line-height:1.7;color:var(--muted);margin:0 0 20px}
/* 卖点要点（对标竞品价格下方的 bullet 列表） */
.spec-bullets{list-style:none;padding:0;margin:0 0 22px;display:grid;gap:9px}
.spec-bullets li{position:relative;padding-left:20px;font-size:13.5px;line-height:1.55;color:#3d4854}
.spec-bullets li::before{content:'';position:absolute;left:2px;top:7px;width:6px;height:6px;background:var(--accent);border-radius:50%}
/* 询盘操作区 */
.detail-actions{display:flex;gap:12px;flex-wrap:wrap;margin:22px 0 20px}
.detail-actions .button{flex:1 1 190px;justify-content:center;text-align:center;margin-top:0}
/* 保障条：对标竞品 Free Shipping / Warranty / Support 三格 */
.guarantee{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1px;background:var(--line);border:1px solid var(--line);margin:0 0 22px}
.guarantee div{background:#fff;padding:13px 10px;text-align:center}
.guarantee strong{display:block;font-size:12.5px;font-weight:700;letter-spacing:-.01em}
.guarantee span{display:block;font:10px 'DM Mono',monospace;text-transform:uppercase;color:#98a1ab;margin-top:5px}
.rule{border-top:1px solid var(--line);margin:24px 0}
/* 详情页的键值表（SPU / MOQ / Pricing）压紧行高，跟紧凑双栏保持一致 */
.fact-list{margin:0 0 20px}
.fact-list div{padding:10px 0}
/* 详情页分页签：描述 / 规格 / 物流 */
.detail-tabs{margin-top:52px;border-top:1px solid var(--line)}
.tab-nav{display:flex;gap:30px;flex-wrap:wrap;border-bottom:1px solid var(--line)}
.tab-nav button{background:none;border:0;padding:15px 0;font:12px 'DM Mono',monospace;text-transform:uppercase;letter-spacing:.08em;color:#98a1ab;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px}
.tab-nav button.is-active{color:var(--ink);border-bottom-color:var(--accent)}
.tab-panel{display:none;padding:30px 0 6px;max-width:940px}
.tab-panel.is-active{display:block}
/* 规格表：双列，避免长列表把页面拉得很长 */
.spec-table{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 44px;border-top:1px solid var(--line)}
.spec-table div{display:flex;justify-content:space-between;gap:18px;border-bottom:1px solid var(--line);padding:11px 0;font-size:13px}
.spec-table dt{color:var(--muted)}
.spec-table dd{text-align:right}
@media(max-width:900px){.spec-table{grid-template-columns:1fr}}
@media(max-width:640px){.guarantee{grid-template-columns:1fr}.detail-actions .button{flex:1 1 100%}}
.body-html{line-height:1.8;color:#4c5763}
/* 富文本内嵌媒体必须限宽：编辑器上传的原图动辄两三千像素，不限宽会按原始尺寸
   铺开，直接撑破详情/文章栏（用户报「这图片这么大」的根因）。历史数据里已存在
   这类大图，只靠上传时压缩救不了旧内容，所以必须在展示层兜住。 */
.body-html img,.body-html video,.body-html iframe{max-width:100%;height:auto;display:block;margin:18px 0;border-radius:var(--radius-sm)}
.body-html table{display:block;max-width:100%;overflow-x:auto}
.detail-copy h2{font-size:13px;text-transform:uppercase;letter-spacing:.1em;margin-top:45px}
dl{margin:0 0 35px;border-top:1px solid var(--line)}
dl div{display:flex;justify-content:space-between;border-bottom:1px solid var(--line);padding:13px 0;font-size:13px;gap:20px}
dt{color:var(--muted)}
dd{margin:0;text-align:right}
.fact-list{margin-top:0}
.faq-list details{border-bottom:1px solid var(--line);padding:16px 0}
.faq-list summary{cursor:pointer;font-size:14px;font-weight:600}
.faq-list p{color:var(--muted);font-size:13px;line-height:1.7}
.related-section{background:#fff}
.article-list{padding:0 var(--gutter) 110px}
.article-row{display:grid;grid-template-columns:120px 1.2fr 1.6fr 30px;gap:26px;align-items:baseline;padding:30px 0;border-bottom:1px solid var(--line)}
.article-row:hover{background:#f4f6f8}
.article-date{font:11px 'DM Mono',monospace;color:var(--muted)}
.article-title{font-size:22px;letter-spacing:-.02em;font-weight:700}
.article-summary{color:var(--muted);font-size:13px;line-height:1.6}
.article-arrow{text-align:right;color:var(--accent)}
/* ★ 件③ 博客列表翻页条**居中**（业主「博客文章翻页也不是居中的」）：
   旧版 nav.pagination 是裸块级元素，里面的行内链接天然从左侧起排（1366 实测内容中心
   偏离内容区中心 625px）。修法只动 CSS：外层 wrap 变 flex 居中、内层 nav 变 flex 行 ——
   分页链接的生成逻辑（服务端路由层）不属本文件，一字不动。 */
.pagination-wrap{display:flex;justify-content:center;padding:0 var(--gutter) 64px}
/* ★ 件① 翻页条「上移」（业主「下一页太靠下了…在上面一点」）：
   .article-list 的通用底部 padding 是 110px，它同时也是首页 insights 区块在用 ——
   **不能改通用值**（会波及首页）。这里只用**相邻兄弟**选择器：当翻页条紧跟在文章列表之后
   （文章列表区块模板 的 `</section>`+`<nav>` 与 文章页模板 的
   `.article-list`+`.pagination-wrap` 两种形态都覆盖）时，用负 margin-top 把它提上来，
   使「最后一行 → 翻页条」的间隔从 110px 收到 ~50px（1366 实测，见提交说明）。 */
.article-list + .pagination-wrap,.article-list + .pagination{margin-top:-60px}
/* ★ 件① 翻页文字放大（业主「文字大一点」）：11px → 13px。
   font 简写里 size 与 family 之外的项（line-height）会被重置为 normal —— 保持原样即可，
   大写/等宽风格、颜色、gap 结构、letter-spacing 全部保留。
   （justify-content:center 双形态兼容：nav.pagination 无论包在 .pagination-wrap 里还是直接
   躺在 <main> 下，内容都相对内容区居中。） */
.pagination{display:flex;align-items:center;justify-content:center;gap:18px;font:13px 'DM Mono',monospace;text-transform:uppercase;letter-spacing:.08em;color:var(--muted)}
.pagination a{color:var(--ink);border-bottom:1px solid var(--line);padding-bottom:2px}
.pagination a:hover{color:var(--accent);border-bottom-color:var(--accent)}
.article-detail{padding:45px 22vw 110px}
.article-header h1{font-size:clamp(36px,4vw,56px);line-height:1.02;letter-spacing:-.03em;margin:22px 0;font-weight:800}
.page-body{padding:0 22vw 110px}
.inquiry-wrap{display:grid;grid-template-columns:1.4fr .8fr;gap:56px;padding:0 var(--gutter) 90px;align-items:start}
.inquiry-form{display:grid;grid-template-columns:1fr 1fr;gap:26px 30px}
.field{display:flex;flex-direction:column;gap:9px}
.field-full{grid-column:1 / -1}
.field label{font:11px 'DM Mono',monospace;text-transform:uppercase;letter-spacing:.08em;color:var(--muted)}
.field input,.field textarea{border:0;border-bottom:1px solid var(--line);background:transparent;padding:11px 2px;font:14px Manrope;color:var(--ink);outline:0;resize:vertical}
.field input:focus,.field textarea:focus{border-bottom-color:var(--accent)}
/* ★ 联系页表单的收缩放行（配合 .collection-name 的同一条纪律）：
   .inquiry-wrap 是 grid，其子项 .inquiry-form、以及表单内的 .field 都默认 min-width:auto ——
   只要其中一个的 min-content 超过容器（<input> 的默认 size 即可），整行就被撑出视口。
   这里统一放行为可收缩，并让 input/textarea 取满列宽（不再靠默认 preferred width 定宽）。 */
.inquiry-wrap>*{min-width:0}
.inquiry-form{min-width:0}
.field{min-width:0}
.field input,.field textarea{width:100%;min-width:0}
.form-footer{grid-column:1 / -1;display:flex;justify-content:space-between;align-items:flex-end;gap:30px;margin-top:10px}
.form-note{color:var(--muted);font-size:12px;line-height:1.6;max-width:330px;margin:0}
.form-status{grid-column:1 / -1;font-size:13px;line-height:1.6;margin:0;min-height:20px}
.form-status.is-ok{color:#2f7d4f}
.form-status.is-error{color:#c0392b}
.inquiry-aside{background:#f7f9fb;padding:38px 34px;border:1px solid var(--line);min-width:0;overflow-wrap:anywhere}
.aside-strong{font-size:22px;letter-spacing:-.02em;margin:14px 0 0;font-weight:700}
.inquiry-aside dl{margin-top:26px;margin-bottom:0}
.inquiry-aside dd a{border-bottom:1px solid var(--line);word-break:break-word}
/* ★ 联系页右侧信息栏：邮箱/网址这类**不可断词**的长 token 会把 flex 行撑破
   （320 实测残留 1px 溢出：dd 的 min-content 210px 顶出 272px 的栏）。放行收缩 + 允许断词。 */
.inquiry-aside dd{min-width:0}
@media(max-width:900px){.detail-grid,.inquiry-wrap{grid-template-columns:1fr;gap:45px}.article-detail,.page-body{padding-left:6%;padding-right:6%}.collection-row{grid-template-columns:50px 1fr 30px;row-gap:8px}.collection-count{display:none}.article-row{grid-template-columns:1fr 30px;row-gap:8px}.article-date,.article-summary{grid-column:1/-1}.feature-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.footer-cols{grid-template-columns:1fr 1fr;column-gap:40px}
/* ★ ≤900px：页脚恢复 2×2 堆叠，社媒/二维码两个槽**整行铺满并排在全部栏目之后**（业主口径）——
   grid order 把两个槽挪到视觉末尾，任何内容高度都不会产生重叠（正常文档流）。 */
.footer-slot-social,.footer-slot-qr{grid-column:1/-1;order:10}}
/* ★★ 2026-09-23 页头高度兜底（修复「主题写死页头高度」导致的移动端/平板页头内容溢出边框）
   症状：手机端页头背景与下边框只包住上半截，导航条**溢出到页头外面**
        （b2b-fly 深色页头最明显：深色底只包住 LOGO，白底上的浅色导航几乎看不见）。
   根因（先量后改，本地实例 + 真浏览器，5 套主题 × 全断点实测）：
     4 套主题在 `各主题的样式文件` 里写了**固定高度**
       `.site-header{height:64/70/76/84px}`（b2b-fly / b2b-new-birox / b2b-sky / corp-site；
       b2b-default 没写，故只有它一直是好的）。
     而基座「≤700px 页头改 block、高度由内容撑开」的 `height:auto` 写在**基座文件**里，
     主题覆盖层在级联里排在后面 ⇒ 同为 (0,1,0) 特异性时**主题赢**，`height:auto` 被盖掉。
   ⇒ 实测溢出量（内容最低点超出页头盒子下边缘，375 视口 · 俄语 7 项菜单）：
       b2b-fly +125px、b2b-new-birox +128px、b2b-sky +133px、corp-site +161px；
       平板 701–1023 两行布局下 sky +4.5px、corp-site +14.5px（768 同样）。
   修法：**在 ≤1023 强制 `height:auto`，并用 `header.site-header` 提高特异性**（(0,1,1) > (0,1,0)），
        保证不被任何主题的单类选择器盖掉 —— 这是"基座的响应式契约不该被主题一行覆盖"的唯一实现位，
        写在这里 4 套主题一次生效；**不要**改成在 4 个主题里各抄一遍（抄漏一套 = 那套手机端就是破的）。
   ★ 为什么是 ≤1023 而不是只 ≤700：≤1023 页头是"会折行"的多行布局（≤700 块级 / ≤1023 两行，
     见上方注释），固定高度必然可能小于内容；≥1024 起基座强制 `flex-wrap:nowrap` 且实测
     5 套主题在本批全部屏宽下内容都放得下，故桌面**保持主题原有固定高度不变**（逐套实测确认）。
   ★ 绝不用 `overflow:hidden` 掩盖 —— 那只是把导航**裁掉**（内容消失），问题更严重。 */
@media (max-width:1023px){header.site-header{height:auto}}
@media(max-width:700px){.site-header{padding:0 6vw;height:auto;padding-top:16px;padding-bottom:16px;display:block;position:static}.site-header nav{gap:14px;font-size:clamp(10px,0.55vw + 8px,12px);margin-top:14px;flex-wrap:wrap}.hero{padding:16vw var(--gutter);min-height:0}.hero-stat{left:var(--gutter);bottom:auto;right:auto;margin-top:35px}.section{padding:70px var(--gutter)}.section-heading{display:block}.section-heading h2,.cta-section h2{font-size:36px}.section-heading .text-link{display:inline-block;margin-top:25px}.product-grid{grid-template-columns:1fr;gap:45px}.product-grid-large{padding:0 var(--gutter) 80px}.cta-section{display:block}.cta-copy{margin-top:35px}.page-intro{padding:70px var(--gutter) 45px}.page-intro h1{font-size:48px}.catalog-toolbar{margin:0 var(--gutter) 45px;display:block}.catalog-toolbar form{margin-top:15px}.product-detail{padding:30px var(--gutter) 80px}.inquiry-form{grid-template-columns:1fr}.form-footer{display:block}footer{display:block;padding-top:48px}.footer-cols{grid-template-columns:1fr;gap:30px}.footer-bottom{flex-direction:column}.footer-links{margin-top:20px;flex-wrap:wrap;gap:14px}.feature-grid{grid-template-columns:1fr}}
.announcement{display:flex;align-items:center;justify-content:center;gap:18px;padding:11px var(--gutter);font:500 11px 'DM Mono',monospace;text-transform:uppercase;letter-spacing:.1em;position:relative;background:var(--ink);color:#dfe5ea}
.announcement a{border-bottom:1px solid;padding-bottom:2px}
.announcement-close{background:transparent;border:0;font-size:17px;line-height:1;cursor:pointer;color:inherit;position:absolute;right:var(--gutter)}
.collection-heading,.faq-heading,.rich-heading{font-size:clamp(32px,3.4vw,46px);line-height:1.02;letter-spacing:-.03em;margin:20px 0 0;font-weight:800}
/* ★ 长词兜底（移动端横向溢出）：德语等语言的**长复合词**（如 Beschaffungsteams）无法在
   `overflow-wrap:normal` 下断行，窄屏会把标题容器撑破 —— 320px 实测 `.rich-heading`
   内容 299px > 容器 257px ⇒ 文档 scrollWidth 323 > 视口 305，整页可横向拖动。
   这里与既有 `.collection-name` 同口径（overflow-wrap:anywhere + word-break:break-word），
   仅在不折行就溢出时才断词，正常语言（中/英）观感不变。 */
.collection-heading,.faq-heading,.rich-heading,.section-heading h2,.cta-section h2,.page-intro h1,.rich-item h3{overflow-wrap:anywhere;word-break:break-word}
.section-rich .rich-head{margin-bottom:55px}
.section-rich .rich-head h2{margin-bottom:0}
.rich-grid{display:grid;gap:45px 32px}
.rich-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}
.rich-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}
.rich-item h3{font-size:21px;letter-spacing:-.02em;margin:0 0 12px;font-weight:700}
.rich-item p{color:var(--muted);font-size:14px;line-height:1.75;margin:0}
.rich-item-wide{grid-column:1/-1;max-width:640px}
.rich-image{aspect-ratio:1.6;background-size:cover;background-position:center;background-color:#eceef1;margin-bottom:22px}
.rich-foot{margin-top:55px}
.section-faq .faq-list{margin-top:45px;border-top:1px solid var(--line)}
.banner{display:flex;align-items:center;padding:90px var(--gutter);background-size:cover;background-position:center;background-color:#2a3644;position:relative}
.banner::after{content:'';position:absolute;inset:0;background:linear-gradient(90deg,rgba(16,24,34,.72) 0%,rgba(16,24,34,.28) 70%,rgba(16,24,34,.1) 100%)}
.banner-inner{position:relative;z-index:1;max-width:560px;color:#fff}
.banner-inner h2{font-size:clamp(34px,4vw,54px);line-height:1.02;letter-spacing:-.03em;margin:20px 0 18px;font-weight:800}
.banner-inner p{color:#d9dee4;line-height:1.7;font-size:15px;margin:0}
.banner-inner .eyebrow{color:#ffb98a}
.banner-align-center{margin:0 auto;text-align:center}
@media(max-width:900px){.rich-cols-2,.rich-cols-3{grid-template-columns:1fr}}

/* 语言切换器（前台界面多语言）。顶部在 header 右侧、底部在页脚，位置由后台设置控制。
   用原生 <select>（不用 appearance:none + 自制箭头），无 JS 也能用、移动端体验最好。 */
.lang-switch{display:inline-flex;align-items:center;gap:8px;margin-left:22px}
.lang-switch-label{font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);font-weight:600}
/* ★ 同一条陷阱的第二处：`font:600 12px/1.2 inherit` 里 `inherit` 非法 → 整条 font 声明被丢弃
   → 语言切换下拉框回落到 UA 默认（400 13.33px Arial），与同一行的 `.lang-switch-label` 字重不一致。
   改成显式长写（字体族单独写 `font-family:inherit` 才是合法的"继承"）。 */
.lang-switch select{border:1px solid var(--line);background:#fff;color:var(--ink);font-weight:600;font-size:12px;line-height:1.2;font-family:inherit;padding:7px 10px;border-radius:var(--radius-sm);cursor:pointer}
.lang-switch select:hover,.lang-switch select:focus{border-color:var(--accent);outline:none}
.lang-switch-footer{margin:14px 0 0}
.lang-switch-footer .lang-switch-label{color:rgba(255,255,255,.6)}
.lang-switch-footer select{background:transparent;color:#fff;border-color:rgba(255,255,255,.3)}
/* ★ ≤820px：窄屏也让「语言 / 货币」这几个字的**文字标签保持可见**（业主口径）。
   难点：手机端顶栏横向空间极窄 —— 320px 时 header 可用内容宽仅约 267px，而两个下拉并排本身就要 ~309px。
   所以光把 `display:none` 改成显示、其余不动，**必然把顶栏挤溢出**（顶栏溢出是刚修好的 P0）。
   做法是**三档收紧**，靠"缩字号/缩间距/极窄屏改上下两行"消化标签新增的宽度：
     ① ≤820px：恢复标签显示，同时收窄标签与下拉的间距（gap 8→5px）；
     ② ≤560px：进一步压到 9px 字号 + 更紧的 gap / select padding；
     ③ ≤360px：两个切换器各占一行（width:100% 强制换行）—— 从"并排"改"上下"，
        因为 320px 物理上放不下并排（下拉本身已 ~309px），换行是**唯一**不溢出的形态。
   ⚠️ 绝不引入 `overflow-x:hidden` 兜底：那是把溢出"藏起来"而非"消除"，会连带裁掉真正的内容。 */
/* ★★ 语言下拉：**每一项用它自己语言的字体**渲染。
   为什么必须这样（业主 2026-09-26 反复说「下拉里的日本語要用日语显示」）：
   同一个码点在不同字体下有**不同字形** —— 中文系统（PingFang SC / 微软雅黑）会把
   日文的 `語`（U+8A9E）按**中文字形**画出来，中日文母语者一眼就觉得"这不是日文"。
   数据是对的（码点 U+8A9E），问题在**字体回退**。
   ⇒ 给各语言显式指定首选字体（有则用，没有就继续回退，不会变空白）。 */
select#langSwitch option[value="ja"],
select#langSwitchFooter option[value="ja"]{
  font-family:'Yu Gothic UI','Yu Gothic',Meiryo,'Hiragino Kaku Gothic ProN','Noto Sans JP','MS PGothic',sans-serif;
}
select#langSwitch option[value="zh"],
select#langSwitchFooter option[value="zh"]{
  font-family:'PingFang SC','Microsoft YaHei','Noto Sans SC',sans-serif;
}
/* 俄语/德语/法语是西里尔-拉丁字形，用通用无衬线即可（避免落到中文宋体） */
select#langSwitch option[value="ru"],
select#langSwitchFooter option[value="ru"],
select#langSwitch option[value="de"],
select#langSwitchFooter option[value="de"],
select#langSwitch option[value="fr"],
select#langSwitchFooter option[value="fr"],
select#langSwitch option[value="en"],
select#langSwitchFooter option[value="en"]{
  font-family:'Segoe UI','Helvetica Neue',Arial,sans-serif;
}

@media (max-width:820px){.site-header .lang-switch{margin-left:10px;gap:5px}.site-header .lang-switch-label{display:inline;font-size:10px;letter-spacing:.04em}}
@media (max-width:560px){.site-header .lang-switch{margin-left:6px;gap:4px}.site-header .lang-switch-label{font-size:9px;letter-spacing:.02em}.site-header .lang-switch select{font-size:11px;padding:5px 7px}}
@media (max-width:360px){.site-header .lang-switch{display:flex;width:100%;margin:6px 0 0}}

/* 货币切换器：复用 .lang-switch 的外观（同一个 form 结构），只补一处细节：
   货币代码是等宽更有秩序感，且切换器的 select 比语言那个略窄（选项只有 3~4 个）。
   ⚠️ 货币与语言是两个**独立**的控件（各有各的 Cookie），只是长得一样。 */
.currency-switch select{font-family:'DM Mono',monospace;letter-spacing:.04em}

/* 站内搜索（插件 search-engine）：顶栏的单行搜索框 + 结果页里的同款。
   ★ 放在**基座** 本样式文件（不是逐主题 主题样式文件）：
     `/theme.css` 的分发是「基座 + 当前模板覆盖」，写在这里 5 个主题一次生效，
     不必在 5 份主题样式里各抄一遍（抄漏一份就是"换个主题搜索框变形"）。
   ★ 用原生 <form> GET 提交（/search?q=…）：无 JS 也能用，与语言/货币切换器同一范式。 */
.site-search{display:inline-flex;align-items:center;margin-left:22px;border:1px solid var(--line);border-radius:var(--radius-pill);background:#fff;padding:2px 3px 2px 12px}
/* ★ font 简写里写 `inherit` 是**非法值** —— 整条声明会被浏览器丢弃（实测计算值 = 400 13.3333px/normal Arial，
   字重/字号/行高/字体族全丢）⇒ 按钮高度随语言漂移（拉丁 33px / 中日韩 37px），各语言"控件与文案"对不齐。
   改成显式长写 + 固定高度 + flex 居中 ⇒ 任何语言都是同一个尺寸、同一条中线。 */
.site-search input{border:0;background:transparent;outline:0;font-weight:400;font-size:13px;line-height:normal;font-family:inherit;color:var(--ink);width:144px;height:32px;padding:0 6px;box-sizing:border-box}
.site-search input::placeholder{color:var(--muted)}
.site-search input:focus{width:180px;transition:width .18s ease}
.site-search button{border:0;background:var(--accent);color:#fff;border-radius:var(--radius-pill);font-weight:600;font-size:11px;line-height:1;font-family:inherit;letter-spacing:.06em;text-transform:uppercase;height:32px;padding:0 15px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center}
.site-search button:hover{background:var(--accent-dark)}
/* 结果页里的搜索框（在 .catalog-toolbar 里，靠左、更宽） */
.site-search-page{margin-left:0}
.site-search-page input{width:220px}
.site-search-page input:focus{width:260px}
/* 命中的专辑（结果页排在商品之前：买家常常先找"哪一类"） */
.search-collections{margin:0 var(--gutter) 55px;border-top:1px solid var(--line);padding-top:18px}
.search-collections h2{font:600 12px 'DM Mono',monospace;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin:0 0 12px}
.search-collections ul{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:10px}
.search-collections li a{display:inline-flex;align-items:baseline;gap:8px;border:1px solid var(--line);border-radius:var(--radius-pill);padding:8px 14px;font-size:13px}
.search-collections li a:hover{border-color:var(--accent);color:var(--accent)}
.search-count{font:11px 'DM Mono',monospace;color:var(--muted)}
@media (max-width:980px){.site-search{margin-left:10px}.site-search input,.site-search input:focus{width:96px}}
/* ≤700px 时 .site-header 已变成 display:block（见上面的移动端规则）⇒ 搜索框顺势铺满一行，
   **不能** display:none —— 手机端是主要流量，藏掉搜索入口等于把刚做出来的功能砍掉一半。 */
@media (max-width:700px){.site-search{display:flex;margin:14px 0 0;width:100%}.site-search input,.site-search input:focus{width:auto;flex:1}}

/* ── 顶栏搜索 · 收起态只露一个图标，点击展开（第一阶段；第二阶段"实时建议"不做）──────────
   桌面：点图标 → 浮层输入框（≈320px，带放大镜与清除）。浮层**绝对定位**，
         展开/收起**不改变导航布局**（业主痛点原话：搜索框一展开就把导航文字挤变形）。
   移动(≤700px)：点图标 → **全宽搜索层**，覆盖 header，可关闭 / ESC。
   ★ 展开/收起由 **纯 CSS** 完成（<label for> 切一个视觉隐藏的 checkbox）⇒ **无 JS 也能用**；
     站内搜索脚本 只做渐进增强（展开自动聚焦 / ESC / 点外部关闭）。
   ★ 与结果页的 `.site-search-page` 互不影响：那一支仍走上面的 `.site-search` 基础样式。
   ★ 放基座（不是逐主题 主题样式文件）：5 个主题一次生效，避免"换个主题搜索框就回退"。 */
.site-search--header{position:relative;display:inline-flex;align-items:center;margin-left:22px;padding:0;border:0;border-radius:0;background:transparent}
.site-search--header .site-search__state{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
.site-search--header .site-search__toggle{display:inline-flex;align-items:center;justify-content:center;width:38px;height:38px;border-radius:var(--radius-pill);color:var(--ink);cursor:pointer;transition:background .16s ease}
.site-search--header .site-search__toggle:hover{background:rgba(16,24,34,.06)}
.site-search--header .site-search__state:focus-visible ~ .site-search__toggle{outline:2px solid var(--accent);outline-offset:2px}
.site-search--header .site-search__ico{width:19px;height:19px;fill:currentColor;display:block}
.site-search--header .site-search__field{position:absolute;top:calc(100% + 10px);right:0;z-index:70;display:flex;align-items:center;gap:6px;width:320px;max-width:calc(100vw - 32px);padding:6px 6px 6px 14px;background:#fff;border:1px solid var(--line);border-radius:var(--radius-pill);box-shadow:0 18px 44px rgba(16,24,34,.18);opacity:0;visibility:hidden;pointer-events:none;transform:translateY(-6px);transition:opacity .16s ease,transform .16s ease,visibility .16s}
.site-search--header .site-search__state:checked ~ .site-search__field{opacity:1;visibility:visible;pointer-events:auto;transform:none}
.site-search--header .site-search__field input{border:0;background:transparent;outline:0;font-weight:400;font-size:14px;line-height:normal;font-family:inherit;color:var(--ink);flex:1 1 auto;min-width:0;width:auto;height:32px;padding:0 4px}
.site-search--header .site-search__field input::placeholder{color:var(--muted)}
.site-search--header .site-search__close{display:none}
.site-search--header .site-search__submit{border:0;background:var(--accent);color:#fff;border-radius:var(--radius-pill);font-weight:600;font-size:11px;line-height:1;font-family:inherit;letter-spacing:.06em;text-transform:uppercase;height:32px;padding:0 15px;cursor:pointer;flex:none;display:inline-flex;align-items:center;justify-content:center;white-space:nowrap}
.site-search--header .site-search__submit:hover{background:var(--accent-dark)}
@media (max-width:980px){.site-search--header{margin-left:12px}}
@media (max-width:700px){
  .site-search--header{display:flex;justify-content:flex-end;margin:14px 0 0;width:100%}
  .site-search--header .site-search__field{position:fixed;left:0;right:0;top:0;width:auto;max-width:none;border:0;border-bottom:1px solid var(--line);border-radius:0;padding:12px 16px;background:#fff;transform:translateY(-100%);transition:transform .18s ease,opacity .18s ease,visibility .18s}
  .site-search--header .site-search__state:checked ~ .site-search__field{transform:none}
  .site-search--header .site-search__close{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;flex:none;border:0;background:transparent;color:var(--muted);font:24px/1 system-ui,sans-serif;cursor:pointer}
}

/* 详情页价格。
   ★ 库里只存基准货币（CNY）的整数「分」，这里显示的是**经汇率换算后的值** ——
     所以非基准货币时必须跟一句「仅供参考」（B2B 报价场景，避免被当成正式报价）。
   数字用 tabular-nums 让不同位数的价格在列表里竖排对齐。 */
.product-price{display:flex;align-items:baseline;gap:12px;margin:0 0 14px;flex-wrap:wrap}
.price-now{font-size:34px;line-height:1.1;font-weight:800;letter-spacing:-.03em;font-variant-numeric:tabular-nums}
.price-was{font-size:15px;color:var(--muted);font-variant-numeric:tabular-nums}
.price-inquiry{font-size:17px;font-weight:700;letter-spacing:-.01em}
.price-note{margin:-8px 0 16px;font-size:12px;color:var(--muted)}
/* P0-5 批发阶梯价表（插件 wholesale-tiers）：数量区间 → 单价（单卖口径）。
   ★ 只在商品真的配了阶梯价时渲染（product.tiers.size>0），没有则一个字符都不多。 */
.tier-price{margin:0 0 20px;border:1px solid var(--line);border-radius:var(--radius);overflow:hidden}
.tier-head{padding:9px 14px;font-size:12.5px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;background:rgba(0,0,0,.03);color:#3d4854}
.tier-table{width:100%;border-collapse:collapse;font-size:13.5px}
.tier-table th,.tier-table td{padding:9px 14px;text-align:left;border-top:1px solid var(--line)}
.tier-table th{font-size:11.5px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}
.tier-table td{font-variant-numeric:tabular-nums}
.tier-table .tier-price-cell{font-weight:700;white-space:nowrap}
.tier-note{margin:0;padding:9px 14px;font-size:11.5px;color:var(--muted);border-top:1px solid var(--line)}
.currency-note{margin:10px 0 0;font-size:11px;color:rgba(255,255,255,.45)}
@media (max-width:700px){.price-now{font-size:28px}}

/* ===== 站点悬浮元素 · 基座默认样式（一键回到顶部 + 悬浮联系方式）=====
   ★★ 为什么放**基座**（而不是逐主题 主题样式文件）：
     `/theme.css` 的分发 = 基座 本样式文件 + 当前模板 主题样式文件 的叠加。
     两条硬理由：
       ① 5 个主题一次生效，不必各抄一遍（抄漏一份 = "换个主题按钮就没样式"）；
       ② **客户自带主题**（第三方主题，不含我们的 主题样式文件）也照样有样式 ——
          这正是此前「客户自带主题按钮无样式」缺口的根因。
     逐主题若要有差异，只在各自的 主题样式文件 里**覆盖 CSS 变量**即可。
   ★ 两个挂载点都是「独立 JS 路由」，按**实时配置**输出，关闭时零 DOM：
       · 一键回到顶部   GET /back-to-top.js       → .b2b-back-to-top
       · 悬浮联系方式   GET /悬浮联系脚本  → .b2b-fc / .b2b-fs
   ★ 可覆盖变量：
       --b2b-btt-{right,left,bottom,size,size-mobile,font,font-mobile,radius,bg,bg-hover}
       --b2b-fc-{offset,panel-w,bg,ink,muted,accent,toggle-bg,radius} */

/* ---------- 一键回到顶部（Back to Top） ---------- */
.b2b-back-to-top{position:fixed;right:var(--b2b-btt-right,16px);left:var(--b2b-btt-left,auto);bottom:var(--b2b-btt-bottom,16px);z-index:2147481999;width:var(--b2b-btt-size,48px);height:var(--b2b-btt-size,48px);padding:0;border:0;border-radius:var(--b2b-btt-radius,50%);background:var(--b2b-btt-bg,#0d9488);color:#fff;font-size:var(--b2b-btt-font,22px);line-height:1;font-family:system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;box-shadow:0 4px 12px rgba(0,0,0,.15);cursor:pointer;opacity:0;visibility:hidden;transform:translateY(10px);transition:opacity .2s ease,transform .2s ease,visibility .2s,background .2s ease}
.b2b-back-to-top.visible{opacity:1;visibility:visible;transform:translateY(0)}
.b2b-back-to-top:hover{background:var(--b2b-btt-bg-hover,#0b7d72);transform:translateY(-2px)}
.b2b-back-to-top:disabled{cursor:default;opacity:.7}
@media (max-width:768px){.b2b-back-to-top{width:var(--b2b-btt-size-mobile,40px);height:var(--b2b-btt-size-mobile,40px);font-size:var(--b2b-btt-font-mobile,18px)}}
@media (prefers-reduced-motion:reduce){.b2b-back-to-top,.b2b-back-to-top.visible{transition:none}}

/* ---------- 悬浮联系方式（Floating contact） ----------
   右侧/左侧一列 APP 图标的 pill 条；桌面 hover（含键盘 focus-within）弹出详情卡片，
   移动端点顶部「联系」按钮展开同一张卡片（同一套 DOM，只差尺寸）。
   详情卡片里每渠道一行「图标 + 名称 + 号码/账号 + 复制/打开」，二维码 160×160 居中收尾。 */
.b2b-fc{position:fixed;top:50%;transform:translateY(-50%);z-index:2147482000;display:flex;align-items:center;font-family:system-ui,-apple-system,'Segoe UI',Roboto,'PingFang SC','Microsoft YaHei',sans-serif;line-height:1.45;color:var(--b2b-fc-ink,var(--ink,#1c2733))}
.b2b-fc--right{right:var(--b2b-fc-offset,16px);flex-direction:row}
.b2b-fc--left{left:var(--b2b-fc-offset,16px);flex-direction:row-reverse}

/* pill 条（常驻）：一列 APP 图标 */
/* ★★ 这里**不要**设 max-height / overflow —— 详情卡片是挂在「条外」的（right:calc(100% + 12px)），
   bar 上只要有 overflow（×hidden 或 ×auto，含 max-height 引发的滚动），卡片就会被**横向裁掉**
   （业主实测：悬停只弹出一个名称 + 浏览器 title 气泡，整张卡片看不见）。
   高度让位改由脚本「收窄间距」（见 悬浮联系脚本 的 相关模块()）——**宁可轻微溢出，也绝不裁切**。 */
.b2b-fc__bar{display:flex;flex-direction:column;align-items:center;gap:8px;padding:8px;background:var(--b2b-fc-bg,#fff);border:1px solid rgba(16,24,34,.08);border-radius:var(--b2b-fc-radius,999px);box-shadow:0 8px 26px rgba(16,24,34,.16)}
.b2b-fc__bar::-webkit-scrollbar{width:0;height:0}

/* 单个 APP 图标（<a> 与 <button> 两种形态共用） */
/* ★ 业主参照图口径：**白底圆形按钮 + 各 APP 品牌色图标**（旧版是"品牌色实心圆 + 白色同一个气泡"，
   5 个渠道长得一模一样）。现在背景固定白、图标走品牌色 ⇒ 一眼能分出是哪个 APP。 */
.b2b-fc__app{display:flex;align-items:center;justify-content:center;width:44px;height:44px;padding:0;border:1px solid rgba(16,24,34,.08);border-radius:50%;background:var(--b2b-fc-app-bg,#fff);color:var(--fc-color,var(--b2b-fc-accent,var(--accent,#2f7df6)));cursor:pointer;text-decoration:none;flex:none;box-shadow:0 2px 8px rgba(16,24,34,.12);transition:transform .16s ease,box-shadow .16s ease}
.b2b-fc__app:hover{transform:scale(1.09);box-shadow:0 6px 16px rgba(16,24,34,.22)}
.b2b-fc__app:active{transform:scale(.96)}
.b2b-fc__app:focus-visible{outline:2px solid var(--fc-color,var(--b2b-fc-accent,var(--accent,#2f7df6)));outline-offset:2px}
.b2b-fc__app svg{width:23px;height:23px;display:block;fill:currentColor;pointer-events:none}

/* ---------- ★ 每个渠道一个**独立**卡片 ----------
   旧版：整列共用一个面板、把全部渠道堆成一列 ⇒ 业主实测"鼠标放 5 个图标任意一个，
   弹出来的内容完全一样（同一个号码出现 3 次）"。现在一个渠道 = 一张卡，只显示它自己。 */
.b2b-fc__item{position:relative;display:flex;justify-content:center;flex:none}
/* ★★ 详情卡片 = **独立层**：由脚本在「打开时」直接挂到 <body>（position:fixed），位置按图标的
   getBoundingClientRect() 现算。它**不在** .b2b-fc / .b2b-fc__bar 的盒子里 ⇒ 任何祖先的
   overflow（hidden/auto/scroll）或 transform/filter 都裁不到它 —— 这正是「卡片被裁没」的根因。
   （旧实现把卡片绝对定位在 .b2b-fc__item 内、伸到「条外」，只要 bar 上有 overflow 就被横向裁掉：
   业主实测悬停只弹出一个名称气泡，整张卡片看不见。） */
.b2b-fc__card{position:fixed;top:0;left:0;z-index:2147483500;width:var(--b2b-fc-card-w,236px);max-width:calc(100vw - 16px);padding:12px;background:var(--b2b-fc-bg,#fff);border:1px solid rgba(16,24,34,.08);border-radius:14px;box-shadow:0 16px 40px rgba(16,24,34,.2);opacity:0;visibility:hidden;pointer-events:none;transform:translateX(8px);transition:opacity .16s ease,transform .16s ease,visibility .16s}
.b2b-fc__card--left{transform:translateX(-8px)}
.b2b-fc__card.is-open{opacity:1;visibility:visible;pointer-events:auto;transform:none}
.b2b-fc__card-head{display:flex;align-items:center;gap:8px;margin:0 0 8px}
.b2b-fc__card-val{font-size:13px;font-weight:600;line-height:1.4;word-break:break-all;color:var(--b2b-fc-ink,#1c2733);margin:0 0 10px}
.b2b-fc__card .b2b-fc__go{display:flex;align-items:center;justify-content:center;width:100%;box-sizing:border-box}
.b2b-fc__card-qr{margin-top:10px;padding-top:10px;border-top:1px dashed rgba(16,24,34,.14);display:flex;flex-direction:column;align-items:center;gap:6px}
/* ★ 回到顶部落进这一列的最底部（青绿色圆钮）—— 不再独立悬浮去压住询价篮 */
.b2b-fc__btt-slot{display:flex;justify-content:center;flex:none;margin-top:2px}
.b2b-fc__btt{position:static;right:auto;left:auto;bottom:auto;display:none;width:44px;height:44px;font-size:19px;opacity:1;visibility:visible;transform:none;flex:none;background:var(--b2b-btt-bg,#0d9488)}
.b2b-fc__btt.visible{display:flex;align-items:center;justify-content:center}
.b2b-fc__btt:hover{transform:scale(1.08);background:var(--b2b-btt-bg-hover,#0b7d72)}

/* 详情卡片：桌面 hover / 移动 click 展开（同一张卡片） */
.b2b-fc__panel{--fc-tx:10px;position:absolute;top:50%;transform:translate(var(--fc-tx),-50%);width:var(--b2b-fc-panel-w,292px);max-height:min(76vh,600px);overflow-y:auto;background:var(--b2b-fc-bg,#fff);border:1px solid rgba(16,24,34,.08);border-radius:16px;box-shadow:0 18px 46px rgba(16,24,34,.22);padding:14px;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .18s ease,transform .18s ease,visibility .18s}
.b2b-fc--right .b2b-fc__panel{right:100%;margin-right:12px}
.b2b-fc--left .b2b-fc__panel{--fc-tx:-10px;left:100%;margin-left:12px}
.b2b-fc.is-open .b2b-fc__panel{--fc-tx:0px;opacity:1;visibility:visible;pointer-events:auto}
@media (min-width:769px){
  /* 桌面：hover 或键盘 focus 即弹出（不用点击） */
  .b2b-fc:hover .b2b-fc__panel,.b2b-fc:focus-within .b2b-fc__panel{--fc-tx:0px;opacity:1;visibility:visible;pointer-events:auto}
}

.b2b-fc__head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:0 0 10px}
.b2b-fc__title{font-size:14px;font-weight:700;letter-spacing:-.01em}
.b2b-fc__close{display:flex;align-items:center;justify-content:center;width:26px;height:26px;flex:none;padding:0;border:0;border-radius:50%;background:rgba(16,24,34,.06);color:var(--b2b-fc-muted,#6f7a85);font:16px/1 system-ui,sans-serif;cursor:pointer}
.b2b-fc__close:hover{background:rgba(16,24,34,.12)}
.b2b-fc__list{display:flex;flex-direction:column;gap:4px}
.b2b-fc__row{display:flex;align-items:center;gap:10px;padding:6px 8px;border-radius:10px}
.b2b-fc__row:hover{background:rgba(16,24,34,.04)}
.b2b-fc__ico{display:flex;align-items:center;justify-content:center;width:32px;height:32px;flex:none;border-radius:50%;background:var(--fc-color,var(--b2b-fc-accent,var(--accent,#2f7df6)));color:#fff}
.b2b-fc__ico svg{width:18px;height:18px;display:block;fill:currentColor}
.b2b-fc__meta{display:flex;flex-direction:column;min-width:0;flex:1 1 auto}
.b2b-fc__name{font-size:13px;font-weight:600;line-height:1.35}
.b2b-fc__val{font-size:12px;color:var(--b2b-fc-muted,#6f7a85);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.b2b-fc__go{flex:none;padding:6px 12px;border:0;border-radius:var(--radius-pill);background:rgba(16,24,34,.06);color:var(--b2b-fc-ink,#1c2733);font:600 12px/1.2 system-ui,sans-serif;cursor:pointer;text-decoration:none;white-space:nowrap;transition:background .16s ease,color .16s ease}
.b2b-fc__go:hover{background:var(--b2b-fc-accent,var(--accent,#f26b1d));color:#fff}
.b2b-fc__qr{margin-top:12px;padding-top:12px;border-top:1px dashed rgba(16,24,34,.14);display:flex;flex-direction:column;align-items:center;gap:6px}
.b2b-fc__qr-img{width:160px;height:160px;max-width:100%;object-fit:contain;display:block;background:#fff;border:1px solid rgba(16,24,34,.08);border-radius:10px;padding:6px}
.b2b-fc__qr-label{font-size:13px;font-weight:600;text-align:center}
.b2b-fc__qr-hint{font-size:11px;color:var(--b2b-fc-muted,#6f7a85)}

/* 复制反馈（挂在 <body> 上：不受 .b2b-fc 的 transform 影响，始终居中于视口） */
.b2b-fc__toast{position:fixed;left:50%;bottom:26px;transform:translateX(-50%) translateY(8px);z-index:2147482001;padding:8px 15px;border-radius:var(--radius-pill);background:rgba(16,24,34,.92);color:#fff;font:600 12.5px/1.2 system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .18s ease,transform .18s ease}
.b2b-fc__toast.show{opacity:1;transform:translateX(-50%) translateY(0)}

/* ★ 件③④ 页脚底部带（#b2b-footer-extra / .b2b-fe）：社媒 + 二维码同处一条**正常文档流**的带子。
   ★ 红线：全部在正常文档流 —— 禁 position:absolute/fixed、**不设固定高度**、不 overflow:hidden；
     栏目内容变多只会把这条带子往下推，**永不重叠**。分隔线由本条提供（.b2b-fs 不再重复画线，避免双线）。
   ★ 件④ 社媒**居中** + 件③ 二维码**靠右**（业主：二维码挪到红箭头指的右侧）：
     `grid-template-columns:1fr auto 1fr` —— 两翼 1fr 等宽 ⇒ 中间 auto 列（社媒）恒处于**整带正中**；
     二维码落第 3 列、`justify-self:end` ⇒ 靠右（右缘对齐内容右缘 = CONTACT 列右上方那一带）。
     网格本身是**正常文档流**，天然不重叠、不裁切、无固定高度。 */
.b2b-fe{display:grid;grid-template-columns:1fr auto 1fr;align-items:start;gap:32px;margin:34px 0 30px;padding-top:30px;border-top:1px solid rgba(255,255,255,.12)}
/* 社媒：落中间 auto 列并整体居中；块内标题与图标行都居中（否则标题居中、图标仍靠左）。 */
#b2b-footer-extra #b2b-footer-social{grid-column:2;justify-self:center}
/* margin/padding/border-top 归零（分隔线已由 .b2b-fe 提供）；min-width:0 让长文案可收缩不溢出。 */
.b2b-fs{display:flex;flex-direction:column;align-items:center;gap:12px;margin:0;padding:0;border-top:0;min-width:0}
.b2b-fs__title{font:600 12px system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;text-transform:uppercase;letter-spacing:.1em;color:rgba(255,255,255,.55)}
.b2b-fs__list{display:flex;align-items:center;justify-content:center;gap:10px;flex-wrap:wrap}
.b2b-fs__item{display:inline-flex;align-items:center;justify-content:center;height:34px;max-width:100%;padding:0 15px;border-radius:var(--radius-pill);background:rgba(255,255,255,.1);color:#fff;font:600 12px system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;text-decoration:none;overflow-wrap:anywhere;transition:background .16s ease,color .16s ease}
.b2b-fs__item:hover{background:var(--b2b-fc-accent,var(--accent,#f26b1d));color:#fff}
/* 页脚二维码块（#b2b-footer-qr / .b2b-fc-footer-qr）：落第 3 列并**靠右**（justify-self:end）。
   块内仍**左对齐** —— 图片与自己的标签/提示保持**同一左边缘**（刻意不 text-align:center：
   若图片居中、文字左对齐，视觉上会显得「歪」）。 */
#b2b-footer-extra #b2b-footer-qr{grid-column:3;justify-self:end}
.b2b-fc-footer-qr{display:flex;flex-direction:column;align-items:flex-start;gap:6px;min-width:0}
/* 二维码图：**正方形、不许变形**（160×160 + object-fit:contain）；display:block 消除行内基线间隙 */
.b2b-fc-footer-qr .b2b-fc__qr-img{width:160px;height:160px;max-width:100%;object-fit:contain;display:block;background:#fff;border-radius:var(--radius);padding:6px}
.b2b-fc-footer-qr .b2b-fc__qr-label{font-size:12px;font-weight:600;color:rgba(255,255,255,.55)}
.b2b-fc-footer-qr .b2b-fc__qr-hint{font-size:11px;color:rgba(255,255,255,.4)}
/* ★ 件② 商品页分享菜单：**图标右侧一排**展开（业主「我要的是点击后直接在右边一排展开」）。
   这里放**基座**规则（容器单行 nowrap、宽度由内容决定）；5 套 商品页模板 的同名规则
   只保留定位/外观，不再写 flex-direction:column —— 两边协同，客户自带主题也拿到单行基线。
   ⚠️ 单行 7 项实测宽 ~705px：只有超宽视口才容得下「图标右侧」这一形态；窄视口由
   商品页模板 里的降级 @media 兜底（回到「图标下方 + 允许换行」）。 */
.share-menu{flex-direction:row;flex-wrap:nowrap;gap:2px 4px;width:max-content}
.share-item{flex:0 0 auto}
.share-item span{white-space:nowrap}

/* 移动端：尺寸收一档（几何不变，仍是右侧居中 + 同一张卡片） */
@media (max-width:768px){
  .b2b-fc{--b2b-fc-offset:10px}
  .b2b-fc__app{width:40px;height:40px}
  .b2b-fc__app svg{width:21px;height:21px}
  /* ★ 回到顶部按钮已并入这一列，必须跟着一起收尺寸：否则 768 及以下是「40 的渠道钮 + 44 的回顶钮」，
     同一列里两个圆钮一大一小，视觉上像拼错了。 */
  .b2b-fc__btt{width:40px;height:40px;font-size:17px}
  /* 渠道卡片（.b2b-fc__card）已挂 <body>（position:fixed）⇒ 不再受 pill 条 58px 宽度限制，
     直接把「两侧各留 8px」作为宽度上限即可（脚本定位时也会把 left/right 夹在 8px 内）。 */
  .b2b-fc__card{width:min(86vw,300px,calc(100vw - 16px))}
  /* 卡片朝左（右栏时）展开，宽度必须同时让出「边距 10 + pill 条宽 58 + 间隙 12 + 左侧留白」，
     否则 375/360 这类窄屏上卡片左缘会被视口裁掉（真机 iPhone SE 375px 实测 -5px）。
     用 100vw 是因为卡片的包含块是 .b2b-fc（仅 58px 宽），百分比无意义；
     减去 104px 后即使浏览器reserve了 15px 经典滚动条（100vw 含滚动条）也仍有 ≥9px 余量。 */
  .b2b-fc--right .b2b-fc__panel,.b2b-fc--left .b2b-fc__panel{width:min(86vw,300px,calc(100vw - 104px));max-height:70vh}
}
@media (prefers-reduced-motion:reduce){
  .b2b-fc__panel,.b2b-fc__app,.b2b-fc__toast,.b2b-fs__item{transition:none}
}

/* ---------- ★ 首屏隐藏（业主第 7 批返工）----------
   业主口径：「这个第一屏不要出现这个联系方式，现在太丑了」。
   做法：根节点 .b2b-fc 加载即带 .b2b-fc--hidden（由脚本加）⇒ 首屏淡出隐藏；
   滚过第一屏（脚本判据 scrollY >= innerHeight * 0.7）去类 ⇒ 淡入。判据理由写在 悬浮联系脚本。
   ★ 只用 class + 过渡（**不**动 style.display —— 会打断既有布局 / 避让计算）；
     visibility 在淡出结束时才真正隐藏、淡入时立即可见，配合 opacity 过渡即得淡入效果。 */
.b2b-fc{transition:opacity .3s ease,visibility .3s ease}
.b2b-fc--hidden{opacity:0;visibility:hidden;pointer-events:none}
@media (prefers-reduced-motion:reduce){.b2b-fc{transition:none}}

/* ==========================================================================
   S1.5/PV3 变体选择器（商品详情页「款式」区）—— 基座样式，5 个主题共用
   ★ 业主口径（PV3，2026-09-19）：「维度值是可以多加的」⇒ **每个维度各渲染一行 chip**
     （淘宝「颜色分类 + 套餐」形态）：最左是维度名，右侧跟该维度的取值 chip。
   ★ 业主口径（返工 2026-09-18）：图只出现在**第一维度**（如「颜色分类」）chip 里
     （左缩略图 + 右自定义名称）；删掉下方多余的 SKU 清单块；点 chip 切主图；
     组合自定义名称显示在 SPU 行。**第二及以后维度（如「套餐」）= 纯文字 chip，无图。**
   ★ 数据契约（服务端 服务端路由层 挂到 product 上，模板 商品页模板 渲染）：
       · product.options[].values[] → { value, image_url }            ← 取值级图 ⇒ 首维 chip 内出缩略图
       · product.variants[]         → { combo, spu, image_url, name? } ← 组合级图/名称（首维 chip 文案 + 选中联动主图/SPU 行）
   ★ 隐藏规则在**模板**里落（首维无名无图的取值不进 DOM）；样式这里只负责布局。
   ★ 优雅降级：无图 ⇒ 只有文字；图 404 ⇒ 脚本加 .is-broken 隐藏；名称空 ⇒ 回退取值文本。
   ★ 绝不 overflow-x:hidden —— 用 flex-wrap + min-width:0 让长名称自然折行（与顶栏同一条纪律）。
   ========================================================================== */
.pv-options{margin:18px 0 6px}
/* 一行 = 一个维度：维度名在左、取值 chip 在右；窄屏时 chip 先换行、维度名可在极端长名下折行（不溢出）。 */
.pv-group{display:flex;flex-wrap:wrap;align-items:flex-start;gap:4px 12px;margin:0 0 14px}
.pv-label{flex:0 0 auto;max-width:100%;min-width:0;overflow-wrap:anywhere;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);line-height:34px;margin:0}
.pv-values{flex:1 1 auto;min-width:0;display:flex;flex-wrap:wrap;align-content:flex-start;gap:8px}
.pv-value{display:inline-flex;align-items:center;gap:8px;min-height:34px;max-width:100%;padding:4px 12px;border:1px solid var(--line);background:#fff;border-radius:6px;font:inherit;font-size:13px;line-height:1.25;color:var(--ink);cursor:pointer;transition:border-color .16s ease,color .16s ease,box-shadow .16s ease}
.pv-value:hover{border-color:#c8c9cc}
.pv-value.is-active{border-color:var(--accent);color:var(--accent);box-shadow:inset 0 0 0 1px var(--accent)}
.pv-value-thumb{width:28px;height:28px;flex:0 0 auto;object-fit:cover;border-radius:var(--radius-sm);display:block;background:#f1f2f4}
.pv-value-text{min-width:0;overflow-wrap:anywhere}
/* 破图兜底：脚本加 .is-broken 后彻底隐藏（不占位、不塌布局） */
.pv-value-thumb.is-broken{display:none}
/* SPU / 自定义组合名称行（PV2：名称挪到 SPU 行；两者皆空 ⇒ 整行 hidden，不留空档） */
.pv-meta{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 10px;margin:10px 0 0}
.pv-meta[hidden]{display:none}
.pv-spu{font-size:12px;color:var(--muted);margin:0}
.pv-spu:empty{display:none}
.pv-name{font-size:12px;color:var(--muted)}
.pv-name[hidden]{display:none}
@media (max-width:480px){
  .pv-value{font-size:12px}
  .pv-value-thumb{width:24px;height:24px}
}

/* ===== B2B 内容区块扩展（20 个） ===== */
/* 与既有 .section / .section-heading / .eyebrow / .button 同风格；
   网格统一 minmax(0,1fr) + 断点收敛，320px 亦无横向溢出。 */
.sec-cards{display:grid;gap:24px}
.sec-cards-2{grid-template-columns:repeat(2,minmax(0,1fr))}
.sec-cards-3{grid-template-columns:repeat(3,minmax(0,1fr))}
.sec-cards-4{grid-template-columns:repeat(4,minmax(0,1fr))}
@media(max-width:1100px){.sec-cards-3,.sec-cards-4{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:640px){.sec-cards-2,.sec-cards-3,.sec-cards-4{grid-template-columns:1fr}}
.sec-card{display:flex;flex-direction:column;gap:10px;background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:22px;min-width:0}
.sec-card-flush{padding:0;overflow:hidden}
.sec-card-pad{padding:20px;display:flex;flex-direction:column;gap:8px}
.sec-card h3,.sec-step h3,.sec-event h3,.sec-member h3,.sec-tl-item h3,.sec-sol h3,.sec-cat-tile h3,.sec-cert-item h3,.sec-dl-main h3{font-size:16px;font-weight:700;margin:0;letter-spacing:-.01em;overflow-wrap:anywhere;word-break:break-word}
.sec-card p,.sec-step p,.sec-event p,.sec-sol p{color:var(--muted);font-size:13px;line-height:1.7;margin:0;overflow-wrap:anywhere}
.sec-card-icon{width:46px;height:46px;border-radius:10px;background:#f4f6f8;display:flex;align-items:center;justify-content:center;font-size:20px;flex:0 0 auto}
.sec-card-icon img{width:26px;height:26px;object-fit:contain}
.sec-imgtop{width:100%;aspect-ratio:1.7;object-fit:cover;background:#eceef1;display:block}
.sec-h2{font-size:clamp(26px,2.6vw,38px);line-height:1.08;letter-spacing:-.03em;margin:16px 0 0;font-weight:800;overflow-wrap:anywhere;word-break:break-word}
.sec-lead{color:var(--muted);line-height:1.75;font-size:14px;margin:14px 0 0}
.sec-split{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:48px;align-items:center}
.sec-split-rev .sec-split-media{order:2}
@media(max-width:900px){.sec-split{grid-template-columns:1fr;gap:32px}.sec-split-rev .sec-split-media{order:0}}
.sec-split-media{min-width:0}
.sec-split-media img{width:100%;height:auto;display:block;border-radius:var(--radius);aspect-ratio:1.2;object-fit:cover;background:#eceef1}
.sec-map{width:100%;aspect-ratio:16/10;border:0;border-radius:var(--radius);display:block;background:#eceef1}
.sec-stat-row{display:flex;flex-wrap:wrap;gap:26px 40px;margin-top:28px}
.sec-stat{min-width:0}
.sec-stat strong{display:block;font-size:34px;letter-spacing:-.03em;font-weight:800;overflow-wrap:anywhere}
.sec-stat span{font:11px 'DM Mono',monospace;text-transform:uppercase;letter-spacing:.06em;color:var(--muted)}
.sec-list{margin:20px 0 0;padding:0;list-style:none;display:grid;gap:10px}
.sec-list li{position:relative;padding-left:22px;color:var(--muted);font-size:14px;line-height:1.6;overflow-wrap:anywhere}
.sec-list li::before{content:'\2713';position:absolute;left:0;color:var(--accent);font-weight:700}
.sec-metrics{}
.sec-metric{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:26px 22px;text-align:center;min-width:0}
.sec-metric strong{display:block;font-size:clamp(30px,3vw,44px);letter-spacing:-.04em;font-weight:800;line-height:1;overflow-wrap:anywhere}
.sec-metric span{display:block;margin-top:10px;font:11px 'DM Mono',monospace;text-transform:uppercase;letter-spacing:.06em;color:var(--muted)}
.sec-tl{list-style:none;margin:8px 0 0 8px;padding:0;border-left:2px solid var(--line)}
.sec-tl-item{position:relative;padding:0 0 34px 30px}
.sec-tl-item:last-child{padding-bottom:0}
.sec-tl-item::before{content:'';position:absolute;left:-7px;top:4px;width:12px;height:12px;border-radius:50%;background:var(--accent);box-shadow:0 0 0 4px #fff}
.sec-tl-year{display:block;font:600 12px 'DM Mono',monospace;letter-spacing:.06em;color:var(--accent);margin-bottom:6px}
.sec-tl-body p{margin:8px 0 0;color:var(--muted);font-size:13px;line-height:1.7;overflow-wrap:anywhere}
.sec-quote{background:var(--ink);color:#fff}
.sec-quote-inner{max-width:820px}
.sec-quote h2{font-size:clamp(26px,2.6vw,38px);line-height:1.08;letter-spacing:-.03em;margin:16px 0 0;font-weight:800;overflow-wrap:anywhere}
.sec-quote p{color:#c4cdd7;line-height:1.7;font-size:14px;max-width:520px;margin:14px 0 0}
.sec-quote .eyebrow{color:#ffb98a}
.sec-quote-actions{display:flex;flex-wrap:wrap;align-items:center;gap:14px 18px;margin-top:26px}
.sec-quote .button{margin-top:0}
.sec-quote .button-light-outline{color:#fff;box-shadow:inset 0 0 0 1px rgba(255,255,255,.5)}
.sec-quote .button-light-outline:hover{background:#fff;color:var(--ink)}
.sec-quote-phone{font:600 15px 'DM Mono',monospace;letter-spacing:.02em;color:#fff;overflow-wrap:anywhere}
.sec-cat-tile{position:relative;display:flex;align-items:flex-end;min-height:210px;border-radius:var(--radius);overflow:hidden;background:#2a3644;background-size:cover;background-position:center;color:#fff;text-decoration:none;min-width:0}
.sec-cat-tile::after{content:'';position:absolute;inset:0;background:linear-gradient(180deg,rgba(16,24,34,0) 30%,rgba(16,24,34,.74) 100%)}
.sec-cat-tile-inner{position:relative;z-index:1;padding:20px}
.sec-cat-tile span{display:block;margin-top:4px;font-size:12px;color:#d5dbe2;overflow-wrap:anywhere}
.sec-slider-wrap{padding-left:0;padding-right:0}
.sec-slider{display:flex;gap:16px;overflow-x:auto;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;padding:0 var(--gutter) 6px}
.sec-slide{position:relative;flex:0 0 min(920px,86%);min-height:380px;scroll-snap-align:start;border-radius:var(--radius);overflow:hidden;background:#2a3644;background-size:cover;background-position:center;display:flex;align-items:center}
.sec-slide::after{content:'';position:absolute;inset:0;background:rgba(16,24,34,.5)}
.sec-slide-inner{position:relative;z-index:1;padding:44px;max-width:620px;color:#fff}
.sec-slide h2{font-size:clamp(24px,2.6vw,40px);line-height:1.08;letter-spacing:-.03em;margin:14px 0 0;font-weight:800;overflow-wrap:anywhere}
.sec-slide p{color:#e5e9ee;line-height:1.7;font-size:14px;margin:12px 0 0}
.sec-slide .eyebrow{color:#ffb98a}
.sec-slide .button{margin-top:22px}
@media(max-width:640px){.sec-slide{flex-basis:88%;min-height:300px}.sec-slide-inner{padding:26px}}
.sec-dl-list{list-style:none;margin:0;padding:0;border-top:1px solid var(--line)}
.sec-dl-item{display:flex;align-items:center;justify-content:space-between;gap:18px;flex-wrap:wrap;padding:22px 0;border-bottom:1px solid var(--line)}
.sec-dl-main{min-width:0}
.sec-dl-main span{display:block;margin-top:4px;font:11px 'DM Mono',monospace;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);overflow-wrap:anywhere}
.sec-dl-item .button{margin-top:0}
.sec-step{position:relative;background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:26px 22px 22px;min-width:0}
.sec-step-no{display:inline-flex;align-items:center;justify-content:center;width:38px;height:38px;border-radius:50%;background:var(--accent);color:#fff;font:700 15px 'DM Mono',monospace;margin-bottom:14px}
.sec-step p{margin:8px 0 0}
.sec-sol{background:#fff;border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;display:flex;flex-direction:column;min-width:0}
.sec-sol img{width:100%;aspect-ratio:1.7;object-fit:cover;display:block;background:#eceef1}
.sec-sol-body{padding:20px;display:flex;flex-direction:column;gap:6px}
.sec-sol h3{margin:0 0 2px}
.sec-sol .button{margin-top:14px}
.sec-event{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:24px;min-width:0}
.sec-event-date{display:inline-block;font:600 11px 'DM Mono',monospace;letter-spacing:.08em;text-transform:uppercase;color:var(--accent);margin-bottom:10px}
.sec-event-meta{margin:14px 0 0;display:grid;gap:8px}
.sec-event-meta div{display:flex;gap:10px;min-width:0}
.sec-event-meta dt{color:var(--muted);font-size:12px;min-width:64px;overflow-wrap:anywhere}
.sec-event-meta dd{margin:0;font-size:13px;overflow-wrap:anywhere}
.sec-event .button{margin-top:18px}
.sec-member{text-align:center;min-width:0}
.sec-member-photo{width:100%;aspect-ratio:1;object-fit:cover;border-radius:var(--radius);background:#eceef1;display:block;margin-bottom:14px}
.sec-member span{display:block;margin-top:4px;color:var(--muted);font-size:12px;letter-spacing:.02em;overflow-wrap:anywhere}
.sec-member a{display:inline-block;margin-top:8px;font-size:12px;color:var(--accent);overflow-wrap:anywhere}
.sec-logo-grid{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:20px;align-items:stretch}
@media(max-width:1100px){.sec-logo-grid{grid-template-columns:repeat(4,minmax(0,1fr))}}
@media(max-width:640px){.sec-logo-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
.sec-logo{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;min-width:0;padding:16px;border:1px solid var(--line);border-radius:var(--radius);background:#fff;text-decoration:none;color:inherit}
.sec-logo img{max-width:100%;height:44px;object-fit:contain;filter:grayscale(1);opacity:.78}
.sec-logo span{font-size:11px;color:var(--muted);text-align:center;overflow-wrap:anywhere}
.sec-cert-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:22px}
@media(max-width:900px){.sec-cert-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:560px){.sec-cert-grid{grid-template-columns:1fr}}
.sec-cert-item{display:flex;flex-direction:column;align-items:center;text-align:center;gap:10px;padding:24px 16px;border:1px solid var(--line);border-radius:var(--radius);background:#fff;min-width:0}
.sec-cert-img{width:72px;height:72px;object-fit:contain}
.sec-cert-item p{margin:0;font-size:12px;color:var(--muted);line-height:1.6;overflow-wrap:anywhere}
.sec-badges-row{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:18px 30px}
.sec-badge{display:flex;flex-direction:column;align-items:center;gap:8px;min-width:0}
.sec-badge img{height:52px;max-width:100%;object-fit:contain}
.sec-badge span{font-size:11px;letter-spacing:.04em;text-transform:uppercase;color:var(--muted);text-align:center;overflow-wrap:anywhere}
.sec-compare-table{width:100%;border-collapse:collapse;font-size:13px;table-相关模块:fixed}
.sec-compare-table th,.sec-compare-table td{border:1px solid var(--line);padding:12px;text-align:left;vertical-align:top;overflow-wrap:anywhere;word-break:break-word}
.sec-compare-table thead th{background:#f4f6f8;font-weight:700;font-size:12px;letter-spacing:.02em}
.sec-compare-table tbody th{font-weight:600;background:#fbfcfd}
.sec-contact-list{list-style:none;margin:22px 0 0;padding:0;display:grid;gap:12px}
.sec-contact-list li{display:flex;gap:12px;align-items:baseline;min-width:0}
.sec-contact-k{flex:0 0 84px;font:11px 'DM Mono',monospace;text-transform:uppercase;letter-spacing:.06em;color:var(--muted)}
.sec-contact-v{overflow-wrap:anywhere;font-size:14px;min-width:0}
.sec-video-frame{max-width:960px;margin:0 auto;border-radius:var(--radius);overflow:hidden;background:#0e1620}
.sec-video-frame iframe{width:100%;aspect-ratio:16/9;border:0;display:block}
.sec-video-poster{width:100%;aspect-ratio:16/9;background-size:cover;background-position:center;display:flex;align-items:center;justify-content:center}
.sec-video-play{width:66px;height:66px;border-radius:50%;background:rgba(255,255,255,.9);position:relative}
.sec-video-play::after{content:'';position:absolute;left:26px;top:20px;border-left:20px solid var(--ink);border-top:13px solid transparent;border-bottom:13px solid transparent}

/* ---------- B2C 结账页「付款区」+ 支付结果页（S7 补：前台付款位） ----------
   业主口径：结账页要能真的付钱（选了支付方式 → 去支付）；付完钱要有一个结果页，
   不能落到 404。样式**只做基础可读性**（沿用基座的墨色/强调色变量），不抢主题风格。
   ★ 付款区在「没有任何已启用渠道」时**整段不渲染**（模板侧判断）⇒ 这里的样式也就无从生效，
     页面与改造前一样。 */
.b2c-checkout-pay{margin:22px 0 0;padding:18px;border:1px solid var(--line);border-radius:var(--radius);background:#fbfcfd}
.b2c-checkout-pay-title{margin:0 0 12px;font-size:15px;font-weight:700}
.b2c-checkout-pay-list{display:grid;gap:10px}
.b2c-checkout-pay-item{display:flex;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--line);border-radius:6px;background:#fff;cursor:pointer;font-size:14px}
.b2c-checkout-pay-item:has(input:checked){border-color:var(--accent);box-shadow:0 0 0 1px var(--accent) inset}
.b2c-checkout-pay-item input{margin:0}
/* ★ 支付品牌标（后端下发的内联 SVG）。`display:block` 去掉 inline 元素的基线间隙，
   `flex:0 0 auto` 保证在 flex 行里不被压扁（与后台 `PayChannelLogo` 同一处理）。 */
.b2c-checkout-pay-item svg{display:block;flex:0 0 auto}
/* ★ 「实际收款币种」标记：只在"通道收的币 ≠ 页面展示的币"时出现（后端判定）。
   `margin-left:auto` 推到行尾，不与平台名抢视线；只用 ISO 代码，语言无关。 */
.b2c-pay-cur{
  margin-left:auto;padding:1px 7px;border-radius:var(--radius-pill);
  background:rgba(127,127,127,.14);color:var(--muted);font-size:11px;font-weight:700;letter-spacing:.02em;
}

/* ★★ 付款按钮按通道品牌取样式（业主 2026-09-26：「点了 PayPal 支付，建议这种展示方式，
   这种比较官方的」）。PayPal 用它的品牌黄底 + 深蓝字；其它通道沿用主题色。
   ⚠️ 特异性必须带 id：主题文件里 `#b2c-checkout-pay-btn{background:var(--b2c-accent)}` 是 (1,0,0)，
      而 `.b2c-pay-btn[data-brand]` 只有 (0,2,0) ⇒ **会被主题色盖掉**。
      写成 `#b2c-checkout-pay-btn[data-brand="paypal"]` = (1,1,0) 才压得住。 */
#b2c-checkout-pay-btn[data-brand="paypal"]{background:#ffc439;border-color:#ffc439;color:#003087}
#b2c-checkout-pay-btn[data-brand="paypal"]:hover{filter:brightness(.96)}

/* ★ 按钮下方的「支持卡种小标 + 技术支持提供方」。
   尺寸刻意小（业主：「他们的太大了，到时候开启几个支付方式，那边就显示几个」）：
   小标只是"这一套支持哪些卡"的提示，**不是主视觉**；开几个通道就显示几组（脚本切换）。 */
.b2c-pay-foot{margin-top:12px}
.b2c-pay-foot[hidden]{display:none}
.b2c-pay-marks{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;margin:0 0 8px}
.b2c-pay-mark{
  display:inline-flex;align-items:center;height:20px;padding:0 7px;border:1px solid;
  border-radius:var(--radius-sm);background:#fff;font-size:10px;font-weight:700;letter-spacing:.02em;line-height:1;
}
.b2c-pay-powered{margin:0;color:var(--muted);font-size:12px;text-align:center}

/* ★ 未登录买家的「同时创建一个账号？」区块（2026-09-26）。
   与结账页网格分开成一块，勾选后才展开密码框（脚本控制 `hidden`）。 */
.b2c-checkout-account{
  margin:16px 0 0;padding:12px 14px;border:1px solid var(--line,#e7e9ee);border-radius:10px;background:#fff;
}
.b2c-checkout-account-toggle{display:flex;align-items:center;gap:8px;font-size:14px;color:var(--ink);cursor:pointer}
.b2c-checkout-account-toggle input{margin:0}
.b2c-checkout-account-pw{margin-top:10px}
.b2c-checkout-account-pw label{display:flex;flex-direction:column;gap:6px;font-size:13px;color:var(--muted)}
.b2c-checkout-account-pw input{
  width:100%;box-sizing:border-box;padding:10px 12px;border:1px solid var(--line,#dcdfe6);
  border-radius:var(--radius);font-size:14px;color:var(--ink);background:#fff;
}
.b2c-checkout-account-pw[hidden]{display:none}
.b2c-checkout-pay-qr{margin:14px 0 0;padding:14px;border:1px dashed var(--line);border-radius:6px;background:#fff;text-align:center}
.b2c-checkout-pay-qr-hint{margin:0 0 8px;color:var(--muted);font-size:13px}
.b2c-checkout-pay-qr-code{margin:0;font:12px/1.6 'DM Mono',monospace;word-break:break-all;color:var(--ink)}

/* 支付结果页：居中一段人话 + 一个出口链接（四段状态由页面脚本切换显示） */
.b2c-result-page{max-width:560px;margin:0 auto;padding:56px 24px;text-align:center}
.b2c-result-h1{margin:0 0 18px;font-size:22px;font-weight:700}
.b2c-result-order{margin:0 0 18px;color:var(--muted);font-size:13px;word-break:break-all}
.b2c-result-state{margin:0 0 22px;font-size:15px;line-height:1.8}
.b2c-result-state p{margin:0}
.b2c-result-paid{color:#177245;font-weight:600}
.b2c-result-failed{color:var(--accent-dark,#d95c14);font-weight:600}
.b2c-result-actions{display:flex;justify-content:center;gap:12px}

/* ══════════════════════════════════════════════════════════════════════════════
   手机端折叠导航（业主 2026-09-25 核心诉求，B2C / B2B 模板统一口径）
   —— ≤700px 顶部栏只留「① 汉堡 ② LOGO ③ 搜索 ④ 询盘」，其余（导航菜单 / 语言切换 /
      货币切换 / 「我的账户·询盘」深色条）全部收进左侧折叠抽屉。
   ★★ 桌面（>700px）**零变化**：下列类名全部是**新增**的，>700px 一律 `display:none`；
      并且**不改动任何现存桌面规则**（只新增规则 + 新增节点）。所有位移/显隐都写在
      `@media (max-width:700px)` 内 ⇒ 桌面端一个像素都不动。
   ★ 纯 CSS 开合（隐藏 checkbox + 两个 <label>）⇒ **无 JS 也能开/关**（键盘可直接操作那个
     视觉隐藏的 checkbox）；JS 只做渐进增强（同步 aria-expanded / Esc 关闭 / 打开时锁背景滚动）。
      与仓库既有 `.site-search` 收起态（checkbox+label）同一范式，不引入新依赖。
   ★ 语言 / 货币切换的 `<form action>` **一字不动**（只换显隐位置）—— 保持**干净路径**，
      否则 `<noscript>` 切语言会失效（既有铁律）。
   ★ 抽屉实现：让 header 自身在打开态变成「左侧面板」—— 它的 nav / lang / currency 天然就是
      抽屉内容；顶部那条深色 topbar（我的账户 / 询盘）钉成抽屉底栏。三者都是 <body> 的直接
      子元素 ⇒ 用 `#mobileNavOpen:checked ~ …` 一条状态统一驱动，**不搬 DOM、也不复制任何导航标记**
      （避免"两份菜单"漂移）。
   ★ 背景滚动锁：由 JS 加 `html.mobile-nav-lock`（同一条 ≤700px 规则，桌面无影响）。
   ══════════════════════════════════════════════════════════════════════════════ */
.mobile-nav-state,.mobile-nav-toggle,.mobile-nav-close,.mobile-nav-backdrop,.mobile-inquiry{display:none}
/* ★ 2026-09-27 手机端导航的「展开/收起」按钮：>700px 一律不显示（只在抽屉里出现）。
   单独一条、不并入上面那行 —— 上面那行是 `移动端菜单回归套件` 逐字断言的锚点。 */
.site-header .nav-item__toggle{display:none}

@media (max-width:700px){
  /* ── 顶部栏：汉堡 · LOGO · 搜索 · 询盘 ── */
  header.site-header{display:flex;flex-wrap:nowrap;align-items:center;gap:6px;padding:10px 5vw;height:auto;min-height:0;position:relative}
  .mobile-nav-state{position:fixed;width:1px;height:1px;opacity:0;pointer-events:none}
  .mobile-nav-toggle{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;flex:0 0 auto;cursor:pointer;color:inherit;border-radius:var(--radius);-webkit-tap-highlight-color:transparent}
  .mobile-nav-toggle:active{background:rgba(127,127,127,.16)}
  /* 键盘聚焦那个视觉隐藏的 checkbox 时，把焦点环画在汉堡上（否则"看不见焦点"） */
  .mobile-nav-state:focus-visible ~ .site-header .mobile-nav-toggle{outline:2px solid var(--accent);outline-offset:2px}
  /* ★★ 2026-09-27 业主返工「手机端 LOGO 要居中」：把品牌区**绝对定位到顶栏水平中线**，
     而不是让它在 flex 行里"伸缩占满剩余宽度"（那样只会停在汉堡右侧一点，永远偏左）。
     为什么不能用 flex 平衡左右：左侧只有汉堡（40px）、右侧是搜索 + 询盘（≈80px 起），
     两侧天然不等宽 ⇒ 居中只能靠绝对定位 + `translate(-50%,-50%)`（顺带垂直居中）。
     宽度上限 62% / 320px ⇒ 长 LOGO 会等比缩小，绝不压到右侧图标。
     ★ 只在 ≤700px 生效 ⇒ 桌面端布局一个像素都不动（桌面 .brand 仍是普通 flex 项）。 */
  .site-header .brand{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);margin:0;max-width:min(62%,320px);display:inline-flex;justify-content:center;overflow:hidden}
  .site-header .brand__logo{max-width:100%;max-height:clamp(28px,7vw + 14px,44px)}
  /* 搜索：收起态只露放大镜图标（展开后仍是既有"全宽搜索层"，见上方 .site-search--header 移动端规则）；
     `margin-left:auto` 把「搜索 + 询盘」一起推到右端。 */
  .site-header .site-search--header{display:inline-flex;justify-content:flex-end;margin:0 0 0 auto;width:auto;flex:0 0 auto}
  .mobile-inquiry{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;flex:0 0 auto;color:inherit;-webkit-tap-highlight-color:transparent}
  /* 以下四项顶部栏不显示（收进抽屉） */
  .site-header > nav,.site-header .lang-switch,.mobile-nav-close,.site-topbar{display:none}

  /* ── 抽屉（打开态）：header 变左侧面板 ── */
  #mobileNavOpen:checked ~ .site-header{
    position:fixed;top:0;left:0;bottom:0;right:auto;width:min(86vw,360px);height:auto;min-height:0;
    display:flex;flex-direction:column;flex-wrap:nowrap;align-items:stretch;justify-content:flex-start;gap:0;
    padding:0 0 76px;overflow-y:auto;overflow-x:hidden;z-index:80;
    box-shadow:0 0 40px rgba(16,24,34,.28);
  }
  #mobileNavOpen:checked ~ .site-header .brand,
  #mobileNavOpen:checked ~ .site-header .site-search--header,
  #mobileNavOpen:checked ~ .site-header .mobile-inquiry,
  #mobileNavOpen:checked ~ .site-header .mobile-nav-toggle{display:none}
  /* 关闭按钮（纯 label ⇒ 无 JS 也能关）；order:-1 让它排在抽屉最顶部 */
  #mobileNavOpen:checked ~ .site-header .mobile-nav-close{
    order:-1;
    display:flex;align-items:center;justify-content:flex-end;width:100%;box-sizing:border-box;
    padding:10px 5vw;background:transparent;color:inherit;cursor:pointer;
    font:400 30px/1 system-ui,Arial,sans-serif;
  }
  /* ★★ 2026-09-27 业主返工（手机端导航 · 两条原话）：「导航条要竖着排」「展开都乱七八糟的」。
     原实现：容器 `flex-wrap:wrap` + 项间 `gap:6px 20px` ⇒ 无子级的 `<a>` 与有子级的
     `.nav-item` 混着自动换行、展开后又把子级居中塞回来 —— 就是业主截图里"横七竖八挤成一团"。
     新实现：**纵向单列 + 层级**（整段只在 ≤700px 抽屉里生效 ⇒ 桌面端零变化）：
       · 单列：容器 `flex-direction:column`、每项 `width:100%` ⇒ 一项一行，不再横挤；
       · 层级：子级整块**左缩进 + 左侧竖线**，父项是 16px 加粗标题行、子项是 14px 常规行 ⇒ 一眼分层；
       · 间距：用行内 padding + 细分隔线（不再靠 gap 硬挤）；
       · 长菜单可滚：靠抽屉自身的 `overflow-y:auto`（见上方打开态），这里**不设** max-height，
         否则会出现"抽屉内、菜单里两条滚动条"。 */
  #mobileNavOpen:checked ~ .site-header > nav{
    display:flex;flex-direction:column;flex-wrap:nowrap;align-items:stretch;justify-content:flex-start;
    gap:0;margin:0;padding:6px 5vw 18px;
    font-size:16px;font-weight:600;letter-spacing:.01em;text-transform:none;white-space:normal;
  }
  /* 导航行：无子级的 <a> 与有子级的 .nav-item 都占"一整行"，行间一条细分隔线。
     `.nav-item` 用 row + wrap：标题与右侧按钮排第一行、子级 `<ul>` 因 width:100% 自动落到第二行。 */
  #mobileNavOpen:checked ~ .site-header > nav > a,
  #mobileNavOpen:checked ~ .site-header > nav > .nav-item{
    display:flex;flex:0 0 auto;flex-direction:row;flex-wrap:wrap;box-sizing:border-box;
    width:100%;align-items:center;justify-content:space-between;row-gap:0;
    padding:10px 2px;border-bottom:1px solid var(--line);
  }
  #mobileNavOpen:checked ~ .site-header > nav > a{color:inherit;text-decoration:none}
  /* 父项标题占满剩余宽度（长分类名可换行，不把右侧按钮挤出去） */
  #mobileNavOpen:checked ~ .site-header > nav > .nav-item > a{flex:1 1 auto;min-width:0}
  /* 手机抽屉里子级改由右侧 chevron 按钮切换 ⇒ 去掉标题后的三角，避免"两个箭头"并存 */
  #mobileNavOpen:checked ~ .site-header > nav .nav-item--has-children > a::after{content:none}
  /* 展开 / 收起按钮：40×40 命中区，chevron 朝下；展开时旋转 180° 朝上（状态一眼可见） */
  #mobileNavOpen:checked ~ .site-header > nav .nav-item__toggle{
    display:inline-flex;flex:0 0 auto;align-items:center;justify-content:center;
    width:40px;height:40px;margin:0 0 0 8px;padding:0;border:0;background:none;
    color:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent;
  }
  #mobileNavOpen:checked ~ .site-header > nav .nav-item__toggle::before{
    content:'';width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;
    border-top:6px solid currentColor;opacity:.6;transition:transform .2s ease;
  }
  #mobileNavOpen:checked ~ .site-header > nav .nav-item.is-open > .nav-item__toggle::before{transform:rotate(180deg)}
  #mobileNavOpen:checked ~ .site-header > nav .nav-item__toggle:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:6px}
  /* 子级列表：整块左缩进 + 左侧竖线（层级可视）；每个子项自己一行 */
  #mobileNavOpen:checked ~ .site-header > nav .nav-sub{
    display:none;box-sizing:border-box;width:100%;margin:2px 0 8px;padding-left:14px;
    border-left:2px solid var(--line);text-align:left;
  }
  #mobileNavOpen:checked ~ .site-header > nav .nav-sub__item{display:block;width:100%;margin:0}
  #mobileNavOpen:checked ~ .site-header > nav .nav-sub__item > a{
    display:flex;box-sizing:border-box;width:100%;align-items:center;justify-content:space-between;
    padding:10px 2px;font-size:14px;font-weight:500;line-height:1.4;color:var(--ink);
    text-decoration:none;border-bottom:1px solid var(--line);
  }
  #mobileNavOpen:checked ~ .site-header > nav .nav-sub--2,
  #mobileNavOpen:checked ~ .site-header > nav .nav-sub--3{padding-left:14px}
  /* 展开判定：既有 `.is-open`（脚本写）+ `:focus-within`（无 JS / 键盘也能开）都放行。
     ★ 必须在这里**原样补回** —— 上面的 `display:none` 特异性(1,3,0) 高过基座那条
       `.site-header .nav-item.is-open > .nav-sub`(0,3,0)，不补回就会被自己盖掉。 */
  #mobileNavOpen:checked ~ .site-header > nav .nav-item.is-open > .nav-sub,
  #mobileNavOpen:checked ~ .site-header > nav .nav-sub__item.is-open > .nav-sub,
  #mobileNavOpen:checked ~ .site-header > nav .nav-item:focus-within > .nav-sub,
  #mobileNavOpen:checked ~ .site-header > nav .nav-sub__item:focus-within > .nav-sub{display:block}
  /* 语言 / 货币切换（表单结构不动，只挪进抽屉并铺满面板宽） */
  #mobileNavOpen:checked ~ .site-header .lang-switch{
    display:flex;flex-direction:column;align-items:stretch;gap:6px;margin:0;padding:12px 5vw;
  }
  #mobileNavOpen:checked ~ .site-header .lang-switch-label{font-size:11px}
  #mobileNavOpen:checked ~ .site-header .lang-switch select{width:100%;box-sizing:border-box}
  /* 「我的账户 / 询盘」深色条：钉在抽屉底部（抽屉内容已用 padding-bottom 预留高度） */
  #mobileNavOpen:checked ~ .site-topbar{display:flex;position:fixed;left:0;bottom:0;width:min(86vw,360px);z-index:81}
  #mobileNavOpen:checked ~ .site-topbar .site-topbar__inner{width:100%}
  /* 遮罩：点它 = 关闭（纯 label，无 JS 亦可）；位于面板右侧可见区域 */
  #mobileNavOpen:checked ~ .mobile-nav-backdrop{
    display:block;position:fixed;inset:0;z-index:70;background:rgba(16,24,34,.45);
  }
  /* 打开时锁背景滚动（JS 加类；无 JS 时最多背景可滚，不影响开/合） */
  html.mobile-nav-lock,html.mobile-nav-lock body{overflow:hidden}
}

/* ============================================================================
 * B2C 模板区块（业主 2026-09-26 新增的 b2c-* 模板用）
 *   · 只在**有对应 DOM 时**命中 ⇒ 5 套 B2B 主题完全不受影响（零残留）；
 *   · 全部走 CSS 变量 ⇒ 4 套 B2C 主题各自只需在自己的 主题样式文件 里
 *     覆写 `--b2c-*` 就能换风格，**不用重写规则**（与既有 `--pd-*` 同一套纪律）。
 * ============================================================================ */
:root{
  --b2c-accent:#e4572e;
  --b2c-accent-ink:#fff;
  --b2c-ink:#101828;
  --b2c-muted:#667085;
  --b2c-line:#e7e9ee;
  --b2c-surface:#fff;
  --b2c-radius:14px;
  --b2c-gap:22px;
}
/* 商品橱窗：网格 + 卡片 */
.b2c-grid{display:grid;gap:var(--b2c-gap)}
.b2c-grid-3{grid-template-columns:repeat(3,minmax(0,1fr))}
.b2c-grid-4{grid-template-columns:repeat(4,minmax(0,1fr))}
.b2c-grid-5{grid-template-columns:repeat(5,minmax(0,1fr))}
@media(max-width:1200px){.b2c-grid-5{grid-template-columns:repeat(4,minmax(0,1fr))}}
@media(max-width:1000px){.b2c-grid-3,.b2c-grid-4,.b2c-grid-5{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(max-width:760px){.b2c-grid-3,.b2c-grid-4,.b2c-grid-5{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:460px){.b2c-grid-3,.b2c-grid-4,.b2c-grid-5{grid-template-columns:1fr}}
.b2c-card{background:var(--b2c-surface);border:1px solid var(--b2c-line);border-radius:var(--b2c-radius);overflow:hidden;display:flex;flex-direction:column}
.b2c-card-media{display:block;position:relative;aspect-ratio:1;background:#f2f3f6;overflow:hidden}
.b2c-card-media img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .5s ease}
.b2c-card:hover .b2c-card-media img{transform:scale(1.04)}
.b2c-card-noimg{position:absolute;inset:0;display:grid;place-items:center;color:#98a1ab;font-size:12px}
.b2c-card-body{padding:14px 14px 16px;display:flex;flex-direction:column;gap:8px;flex:1}
.b2c-card-title{color:var(--b2c-ink);font-weight:600;font-size:15px;line-height:1.45;text-decoration:none;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.b2c-card:hover .b2c-card-title{color:var(--b2c-accent)}
.b2c-card .product-price{margin:0;display:flex;align-items:baseline;gap:8px}
.b2c-card .price-now{color:var(--b2c-accent);font-weight:700;font-size:17px}
.b2c-card .price-was{color:var(--b2c-muted);font-size:13px}
.b2c-card .price-inquiry{color:var(--b2c-muted);font-size:14px}
.b2c-card-actions{margin-top:auto}
.b2c-card-actions .button{width:100%;justify-content:center;text-align:center}
/* 客户评价 */
.b2c-reviews-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--b2c-gap)}
@media(max-width:900px){.b2c-reviews-grid{grid-template-columns:1fr}}
.b2c-review{margin:0;padding:22px;background:var(--b2c-surface);border:1px solid var(--b2c-line);border-radius:var(--b2c-radius)}
.b2c-review-stars{color:#d0d5dd;font-size:15px;letter-spacing:2px}
.b2c-review-stars .is-on{color:#f5a524}
.b2c-review-title{margin:10px 0 6px;font-weight:600;color:var(--b2c-ink)}
.b2c-review-body{margin:0 0 14px;color:var(--b2c-muted);line-height:1.7;font-size:14px}
.b2c-review-who{display:flex;align-items:center;gap:10px;color:var(--b2c-ink);font-size:13px}
.b2c-review-who img{width:34px;height:34px;border-radius:50%;object-fit:cover}
.b2c-review-name{font-weight:600}
.b2c-review-place{color:var(--b2c-muted)}
/* 图片墙 */
.b2c-wall-grid{display:grid;gap:10px}
.b2c-wall-4{grid-template-columns:repeat(4,minmax(0,1fr))}
.b2c-wall-5{grid-template-columns:repeat(5,minmax(0,1fr))}
.b2c-wall-6{grid-template-columns:repeat(6,minmax(0,1fr))}
@media(max-width:900px){.b2c-wall-5,.b2c-wall-6{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(max-width:560px){.b2c-wall-4,.b2c-wall-5,.b2c-wall-6{grid-template-columns:repeat(2,minmax(0,1fr))}}
.b2c-wall-tile{display:block;position:relative;aspect-ratio:1;overflow:hidden;border-radius:calc(var(--b2c-radius) - 4px);background:#f2f3f6}
.b2c-wall-tile img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .5s ease}
.b2c-wall-tile:hover img{transform:scale(1.06)}

/* ============================================================================
 * ★★ B2C 页面骨架：购物车页 / 结算页 / 收藏页（2026-09-26 补齐）
 *
 * 业主反馈：「购物车都乱码了图片这么大」「结账这里也是乱码」「我的收藏 排版还是乱的」。
 * 根因：这三页的 **CSS 从来不存在** —— 全仓 grep `.b2c-cart-thumb` / `.favorites-page`
 *   只在模板里出现，`本样式文件` 与各主题 `主题样式文件` 里**一条规则都没有**
 *   ⇒ 缩略图按**原图尺寸**铺开（所以"图片这么大"）、结算表单的 label/input 挤成一行、
 *     收藏页没有页面容器（eyebrow 贴到屏幕最左边）。
 * ⇒ 这里补齐。放在基座的原因：这几页属于站点级功能页，与主题风格无关，
 *   放基座后**所有主题**（含 5 套 B2B）都一次修好；B2C 主题仍可用变量微调。
 *   ★ 全部用 `.b2c-cart-*` / `.b2c-checkout-*` / `.favorites-page` 前缀 ⇒
 *     只在对应页面命中，不影响任何既有页面。
 * ============================================================================ */

/* ① 三个页面的统一容器（原先没有容器 ⇒ 内容贴边、eyebrow 跑到屏幕最左）
   ★ 底部留白 72px→112px：浮动购物车条是 `position:fixed;right:20px;bottom:20px`
     （窄屏 12px），而这三页的操作按钮**也是右对齐**（购物车的「去结账」、结算页的
     「提交订单」）⇒ 实测 390px 下浮动条**压住「CHECKOUT」按钮**，文字被盖掉一半。
     多留的 40px 就是给它的安全距离（条高 ≈44px + 底距 12~20px）。 */
.b2c-cart-page,.b2c-checkout-page,.favorites-page{
  max-width:1240px;margin:0 auto;
  /* ★★ 2026-09-26 修（业主：「还是挤到一块了，你是怎么验证的」）。
     真因：`--gutter` 的定义是 `max(24px, calc((100% - 1400px)/2))` ——
     它是给**通栏页面**（hero / header）用的"两侧留白"。在 **1920px** 宽屏上它算出 **260px**
     ⇒ 这三页的左右内边距各 260px ⇒ 1240 的容器里只剩 720px ⇒ 购物车左栏只有 372px，
     而商品表格最少要 ~561px ⇒ 表格被右栏压住/裁掉（业主宽屏实测就是这个）。
     ⇒ 这三页是**应用型页面**（表格/表单），左右留白必须**有上限**：`min(gutter, 40px)`。
     ★ 用 `min()` 而不是写死 40px：窄屏仍沿用主题的 24px 下限，只有宽屏才被夹住。 */
  padding:34px min(var(--gutter,24px), 40px) 112px;
}
.b2c-cart-h1,.b2c-checkout-h1{font-size:26px;line-height:1.3;margin:0 0 20px;color:var(--ink)}
.b2c-cart-loading,.b2c-checkout-loading{padding:40px 0;text-align:center;color:var(--muted)}
.b2c-cart-empty,.b2c-checkout-empty{padding:56px 0;text-align:center;color:var(--muted)}

/* ②a ★★ 购物车两栏版式（2026-09-26 按业主给的参考图改）
   左栏 = 商品表格 + 优惠券；右栏 = 「Cart totals」侧栏。
   ★ 只在**表格区**生效（空态/加载态仍是单列）；窄屏塌成一列（见下方媒体查询）。 */
/* ★★ 2026-09-26 修（业主：「你这 2 边都挤到一块去了」）：
   原来是无条件两栏（左 1fr + 右 320px）。而**商品表格的 min-content ≈530px**
   （5 列 + 缩略图，且 ≤720px 才切成卡片）⇒ 在 861px 宽时左栏只剩约 513px，
   表格撑破左栏、被右栏压住（实测截图）。
   ⇒ 改成**移动优先**：默认单列；只有 ≥1024px（左栏至少 676px）才开两栏。 */
.b2c-cart-相关模块{display:grid;grid-template-columns:1fr;gap:18px;align-items:start}
@media(min-width:1024px){
  .b2c-cart-相关模块{grid-template-columns:minmax(0,1fr) 320px;gap:28px}
}
.b2c-cart-col-main{min-width:0}
.b2c-cart-col-totals{min-width:0}
.b2c-cart-totals{
  border:1px solid var(--line,#e7e9ee);border-radius:var(--radius-lg);padding:18px;background:#fff;
}
/* 只有真两栏时才"粘住"（单列时 sticky 会让它压住上方内容） */
@media(min-width:1024px){.b2c-cart-totals{position:sticky;top:16px}}
.b2c-cart-totals-title{font-size:16px;font-weight:700;margin:0 0 14px;color:var(--ink)}
.b2c-cart-row{display:flex;justify-content:space-between;gap:12px;font-size:14px;color:var(--muted);padding:7px 0}
.b2c-cart-row strong{color:var(--ink);font-weight:600}
.b2c-cart-row-grand{border-top:1px solid var(--line,#e7e9ee);margin-top:8px;padding-top:12px;font-size:15px}
.b2c-cart-row-grand strong{font-size:20px;color:var(--b2c-accent,var(--accent))}
.b2c-cart-col-totals .b2c-cart-actions{flex-direction:column;align-items:stretch;gap:10px;margin-top:14px}
.b2c-cart-col-totals .b2c-cart-actions .button{width:100%;text-align:center}
.b2c-cart-clear{background:#fff;color:var(--muted);border:1px solid var(--line,#e7e9ee)}
/* 优惠券：输入 + 应用（参考图里在表格下方） */
.b2c-cart-coupon{display:flex;gap:10px;margin-top:16px;max-width:520px}
.b2c-cart-coupon input{
  flex:1 1 auto;min-width:0;padding:10px 12px;border:1px solid var(--line,#dcdfe6);
  border-radius:var(--radius);font-size:14px;background:#fff;color:var(--ink);
}
.b2c-cart-coupon .button{flex:0 0 auto}
.b2c-cart-coupon-msg{margin:8px 0 0;font-size:13px}
.b2c-cart-coupon-msg.is-ok{color:#1f9d55}
.b2c-cart-coupon-msg.is-err{color:#c0392b}
/* 运费：国家 + 计算（参考图右栏那一块） */
.b2c-cart-ship{margin:10px 0 4px;padding:12px;border:1px dashed var(--line,#e7e9ee);border-radius:10px}
.b2c-cart-ship-label{display:block;font-size:12px;color:var(--muted);margin-bottom:6px}
.b2c-cart-ship input{
  width:100%;box-sizing:border-box;padding:9px 11px;border:1px solid var(--line,#dcdfe6);
  border-radius:var(--radius);font-size:14px;background:#fff;color:var(--ink);margin-bottom:8px;
}
.b2c-cart-ship .button{width:100%}
.b2c-cart-ship-hint{margin:8px 0 0;font-size:12px;color:var(--muted);line-height:1.5}
.b2c-cart-ship-hint[hidden]{display:none}

/* ★ 纵深防御：万一列宽仍不够（超长标题/自定义字号），让表格**自己横向滚动**,
   而不是被裁掉或被侧栏压住。正常情况下永远不会出现滚动条。 */
#b2c-cart-table-wrap{overflow-x:auto}
#b2c-cart-table-wrap[hidden]{overflow:visible}

/* ② 购物车表格 */
.b2c-cart-table{width:100%;border-collapse:collapse;font-size:14px}
.b2c-cart-table th{
  text-align:left;padding:0 12px 10px;font-size:12px;font-weight:600;
  color:var(--muted);border-bottom:1px solid var(--line,#e7e9ee);white-space:nowrap;
}
.b2c-cart-table td{padding:14px 12px;border-bottom:1px solid var(--line,#e7e9ee);vertical-align:middle}
.b2c-cart-table td:last-child,.b2c-cart-table th:last-child{text-align:right}
/* ★★ 缩略图：**必须给死尺寸** —— 原先没有规则 ⇒ 按原图（1000px+）铺开，整页就废了 */
.b2c-cart-thumb{
  width:64px;height:64px;flex:0 0 64px;object-fit:cover;
  border-radius:var(--radius);background:#f2f3f6;display:block;
}
.b2c-cart-cell{display:flex;align-items:center;gap:12px;min-width:0}
.b2c-cart-title{
  font-weight:600;color:var(--ink);line-height:1.45;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
.b2c-cart-meta,.b2c-cart-spu{color:var(--muted);font-size:12px;margin-top:3px}
.b2c-cart-reason{color:#c0392b;font-size:12px;margin-top:3px}
.b2c-cart-qty{display:inline-flex;align-items:center}
.b2c-cart-qty button{
  width:30px;height:32px;border:1px solid var(--line,#e7e9ee);background:#fff;color:var(--ink);
  cursor:pointer;font-size:15px;line-height:1;
}
.b2c-cart-qty button:first-child{border-radius:6px 0 0 6px}
.b2c-cart-qty button:last-child{border-radius:0 6px 6px 0}
.b2c-cart-qty input{
  width:58px;height:32px;text-align:center;border:1px solid var(--line,#e7e9ee);
  border-left:0;border-right:0;font-size:14px;color:var(--ink);background:#fff;
}
.b2c-cart-remove{background:none;border:0;color:#c0392b;cursor:pointer;font-size:13px;padding:4px 0}
/* ★★ 窄屏购物车：表格改「堆叠卡片」。
   实测（390px 视口，真 Chromium）：`.b2c-cart-table` 的 **min-content = 530px**
   ⇒ 整页 `scrollWidth` 554 ⇒ **横向溢出 164px**。
   根因：`<table>` 永远不会窄于内容（表格布局没有"压缩到容器宽"这回事），
   而 5 列（商品 / 单价 / 数量 / 小计 / 删除）在手机上本来就放不下。
   ⇒ 只加 `overflow-x:auto` 会让整张表变成横向滚动条（手机上极难用），
     所以这里改成：解除表格布局约束（`display:block`）+ 用 `grid-area` 把 5 列重排成
     「商品 → 单价 → 数量 →（小计 + 删除）」四行卡片，列名从 `data-label` 取（模板已注入，
     文案走语言包，不硬编码）。桌面端（>720px）**一个像素都不动**。 */
@media(max-width:720px){
  .b2c-cart-table{display:block;width:100%}
  .b2c-cart-table thead{display:none}
  .b2c-cart-table tbody{display:block}
  .b2c-cart-table tr{
    display:grid;grid-template-columns:1fr auto;
    grid-template-areas:"item item" "price price" "qty qty" "sub act";
    gap:10px;align-items:center;
    padding:14px;margin:0 0 12px;border:1px solid var(--line,#e7e9ee);border-radius:10px;background:#fff;
  }
  .b2c-cart-table td{padding:0;border:0}
  .b2c-cart-table td:nth-of-type(1){grid-area:item}
  .b2c-cart-table td:nth-of-type(2){grid-area:price}
  .b2c-cart-table td:nth-of-type(3){grid-area:qty}
  .b2c-cart-table td:nth-of-type(4){grid-area:sub}
  .b2c-cart-table td:nth-of-type(5){grid-area:act;text-align:right}
  .b2c-cart-table td[data-label]::before{
    content:attr(data-label);display:block;color:var(--muted);font-size:12px;margin-bottom:4px;
  }
  .b2c-cart-table td:nth-of-type(4)::before{display:inline;margin:0 8px 0 0}
  .b2c-cart-thumb{width:56px;height:56px;flex:0 0 56px}
  .b2c-cart-summary{margin-top:14px}
}
.b2c-cart-summary{
  display:flex;justify-content:flex-end;align-items:baseline;gap:14px;margin-top:18px;font-size:15px;
}
.b2c-cart-total{font-size:22px;font-weight:700;color:var(--b2c-accent,var(--accent))}
.b2c-cart-note{margin:6px 0 0;color:var(--muted);font-size:13px}
.b2c-cart-actions{display:flex;justify-content:flex-end;flex-wrap:wrap;gap:12px;margin-top:18px}

/* ③ 结算页表单（原先 label 与 input 同行挤在一起 ⇒ 看着像"乱码"） */
.b2c-checkout-form{margin-top:6px}
.b2c-checkout-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px 22px}
@media(max-width:760px){.b2c-checkout-grid{grid-template-columns:1fr}}
.b2c-checkout-grid label{display:flex;flex-direction:column;gap:6px;font-size:13px;color:var(--muted)}
.b2c-checkout-grid input,.b2c-checkout-grid textarea{
  width:100%;box-sizing:border-box;border:1px solid var(--line,#e7e9ee);border-radius:var(--radius);
  padding:10px 12px;font-size:14px;line-height:1.4;background:#fff;color:var(--ink);
  font-family:inherit; /* ★ 不继承的话 input 会用浏览器默认字体，跟页面不一致 */
}
.b2c-checkout-grid input:focus,.b2c-checkout-grid textarea:focus{
  outline:none;border-color:var(--b2c-accent,var(--accent));
}
.b2c-checkout-wide{grid-column:1/-1}
.b2c-checkout-summary{
  margin:24px 0 0;padding:16px 18px;border:1px solid var(--line,#e7e9ee);border-radius:10px;
  background:var(--b2c-surface,#fff);display:flex;justify-content:space-between;align-items:baseline;gap:12px;
  font-size:15px;flex-wrap:wrap;
}
/* ★ 结算页金额明细（小计 / 优惠 / 运费 / 总计）—— 2026-09-26 起把"钱"拆开显示，
   否则客户看到的是小计、实收是"小计−优惠+运费"，两者不一致。 */
.b2c-checkout-sum-row{display:flex;justify-content:space-between;gap:12px;font-size:14px;color:var(--muted);padding:4px 0}
.b2c-checkout-sum-row strong{color:var(--ink);font-weight:600}
.b2c-checkout-sum-row[hidden]{display:none}
.b2c-checkout-sum-grand{border-top:1px solid var(--line,#e7e9ee);margin-top:6px;padding-top:10px;font-size:15px}
.b2c-checkout-sum-grand strong{font-size:19px;color:var(--b2c-accent,var(--accent))}
.b2c-checkout-ship-hint{margin:6px 0 0;font-size:12px;color:#c0392b;line-height:1.5}
.b2c-checkout-ship-hint[hidden]{display:none}
.b2c-checkout-summary-note{color:var(--muted);font-size:12.5px;flex:1 1 260px}
.b2c-checkout-error{margin:14px 0 0;color:#c0392b;font-size:13.5px}
.b2c-checkout-actions{display:flex;justify-content:flex-end;flex-wrap:wrap;gap:12px;margin-top:20px}
.b2c-checkout-done{margin:14px 0 0;padding:18px;border:1px solid var(--line,#e7e9ee);border-radius:10px;background:var(--b2c-surface,#fff)}
.b2c-checkout-order-no-label{color:var(--muted);font-size:13px;margin:0 0 4px}
.b2c-checkout-order-no{margin:0;font-size:18px;font-weight:700;color:var(--ink)}
.b2c-checkout-token-hint{color:var(--muted);font-size:12.5px;margin:10px 0 4px}
.b2c-checkout-token{
  margin:0;padding:10px 12px;border:1px dashed var(--line,#e7e9ee);border-radius:var(--radius);
  background:#fafbfc;font:12px/1.6 'DM Mono',ui-monospace,monospace;word-break:break-all;color:var(--ink);
}

/* ④ 收藏页：列表容器已经有 product-grid 的样式，这里只补空态与标题间距 */
.favorites-page .page-intro{margin-bottom:22px}
.favorites-page .page-intro h1{margin:6px 0 10px;font-size:26px;color:var(--ink)}
.favorites-page .empty-state{padding:48px 0;text-align:center;color:var(--muted)}

/* ⑤ ★★ 浮动购物车条 + 「已加入购物车」提示条 —— 原先**完全没有样式**。
   业主原话：「现在点了购物车**什么提示都没有**」。真因：加购**成功**、提示条也真的被
   `hidden=false` 显示了，但两个 div 一条 CSS 都没有（基座与主题都 grep 不到）
   ⇒ 它们只是页面最底部的普通 inline 文本，客人视觉上等于不存在。
   ⇒ 这里给固定定位与可见样式。层级与既有悬浮元素同档（浮动联系方式是 2147482000）。 */
.b2c-cart-bar{
  /* ★★ 2026-09-26 业主：「购物车不要压到聊天的，把购物车向左移」。
     右下的悬浮聊天（含浮动联系方式 / 第三方聊天）也是贴右边缘的，
     购物车条原来 `right:20px` 正好压上去。
     ⇒ 让出一条"社交按钮带"：`--b2c-cart-bar-right`（默认 88px ≈ 聊天按钮 ~56px + 边距 16px + 间隙）。
       需要再挪只改这一个变量，不用翻规则。 */
  position:fixed;right:var(--b2c-cart-bar-right,88px);bottom:20px;z-index:2147482000;
  background:var(--b2c-accent,var(--accent));color:#fff;border-radius:var(--radius-pill);
  box-shadow:0 8px 24px rgba(16,24,40,.22);font-size:14px;
}
.b2c-cart-bar-link{display:inline-flex;align-items:center;gap:8px;padding:10px 16px;color:inherit;text-decoration:none;font-weight:600}
.b2c-cart-bar-count{
  display:inline-grid;place-items:center;min-width:20px;height:20px;padding:0 5px;border-radius:var(--radius-pill);
  background:#fff;color:var(--b2c-accent,var(--accent));font-size:12px;font-weight:700;
}
.b2c-cart-toast{
  position:fixed;left:50%;bottom:86px;transform:translateX(-50%);z-index:2147482001;
  max-width:min(86vw,420px);padding:10px 16px;border-radius:10px;text-align:center;
  background:rgba(16,24,40,.92);color:#fff;font-size:13.5px;line-height:1.5;
  box-shadow:0 10px 28px rgba(16,24,40,.28);
}
/* ★ `[hidden]` 要显式写：这两个元素靠 hidden 属性控制显隐，而一旦给容器设了 display 就会盖掉它 */
.b2c-cart-bar[hidden],.b2c-cart-toast[hidden]{display:none}
/* 窄屏：聊天按钮更小，让出 72px 即可（仍不与它重叠） */
@media(max-width:560px){.b2c-cart-bar{--b2c-cart-bar-right:72px;right:72px;bottom:12px}.b2c-cart-toast{bottom:74px}}

/* ⑥ 顶栏购物车入口的**数量角标**（业主 2026-09-26：「你加了购物车 不会显示个1吗？」）。
   数字由浮动条 section 的 `renderBar()` 统一更新（`#b2c-topbar-cart-count`），
   车空时带 `hidden` ⇒ 不显示、也不留一个"0"的疙瘩。 */
.site-topbar__count{
  display:inline-grid;place-items:center;min-width:16px;height:16px;padding:0 4px;margin-left:6px;
  border-radius:var(--radius-pill);background:var(--b2c-accent,var(--accent));color:#fff;
  font-size:11px;font-weight:700;line-height:1;
}
.site-topbar__count[hidden]{display:none}

/* ⑦ 会员**收货地址簿** + 结算页登录提示/已存地址选用（业主 2026-09-26）。
   全部 `.member-addr-*` / `.b2c-checkout-login` / `.b2c-checkout-addr` 前缀 ⇒ 只在对应位置命中。 */
.member-addr-list{list-style:none;margin:0 0 18px;padding:0;display:grid;gap:12px}
.member-addr{display:flex;justify-content:space-between;align-items:flex-start;gap:14px;padding:14px 16px;border:1px solid var(--line,#e7e9ee);border-radius:10px;background:#fff}
.member-addr-who{font-weight:600;color:var(--ink)}
.member-addr-where{color:var(--muted);font-size:13px;margin-top:4px;line-height:1.6;word-break:break-word}
.member-addr-tag{display:inline-block;margin-top:6px;padding:1px 8px;border-radius:var(--radius-pill);background:var(--b2c-accent,var(--accent));color:#fff;font-size:11px;font-weight:700}
.member-addr-acts{display:flex;gap:10px;flex:0 0 auto}
.member-link-danger{color:#c0392b}
.member-addr-form-card{margin-top:18px}
.member-addr-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px 18px}
.member-addr-wide{grid-column:1/-1}
.member-check{display:flex;align-items:center;gap:8px;margin:14px 0 0;color:var(--muted);font-size:13px}
.member-addr-actions{display:flex;align-items:center;gap:12px;margin-top:16px;flex-wrap:wrap}
.member-hint-error{color:#c0392b}
/* 未支付订单的「去支付」直通按钮 */
.member-order-paynow{display:inline-block;margin-left:10px;padding:3px 12px;border-radius:var(--radius-pill);background:var(--b2c-accent,var(--accent));color:#fff;font-size:12px;font-weight:700;text-decoration:none}
.member-order-paynow:hover{filter:brightness(.94)}
/* 结算页：登录提示（方案 C，不强制）+ 已存地址一键选用 */
.b2c-checkout-login{display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;margin:0 0 18px;padding:14px 16px;border:1px solid var(--line,#e7e9ee);border-radius:10px;background:#fff7ed}
.b2c-checkout-login-text{margin:0;color:var(--ink);font-size:14px}
.b2c-checkout-addr{margin:0 0 18px;padding:12px 14px;border:1px solid var(--line,#e7e9ee);border-radius:10px;background:#fff}
.b2c-checkout-addr-label{display:flex;align-items:center;gap:10px;font-size:13px;color:var(--muted);flex-wrap:wrap}
.b2c-checkout-addr select{flex:1 1 240px;min-width:0;padding:8px 10px;border:1px solid var(--line,#e7e9ee);border-radius:var(--radius);font-size:14px;color:var(--ink);background:#fff}
@media(max-width:760px){
  .member-addr{flex-direction:column}
  .member-addr-grid{grid-template-columns:1fr}
  .b2c-checkout-login{flex-direction:column;align-items:flex-start}
}

/* ============================================================================
   秒杀（flash sale）展示：秒杀标 + 倒计时 + 划线价。
   ★ 只有后端把商品标记为 flash_active 时模板才输出对应 DOM（整段包在 {% if product.flash_active %}），
     非活动商品**不多输出一个字符**。类名统一 .flash- 前缀，避免影响其它组件。
   ★ 倒计时数字由模板内联 JS（[data-flash-ends] 处理器）在客户端每秒填充；
     模板只输出结束时间 data-flash-ends（UTC ISO；空串=不限期），绝不服务端渲染剩余秒数。
   ============================================================================ */
.flash-line{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 10px}
.flash-badge{display:inline-block;background:var(--flash-badge-bg,#e02020);color:var(--flash-badge-fg,#fff);font-size:12px;font-weight:800;line-height:1;letter-spacing:.08em;padding:5px 9px;border-radius:var(--radius-sm);text-transform:uppercase;white-space:nowrap}
.flash-badge--card{position:absolute;z-index:3;top:10px;right:10px}
.flash-name{font-size:13px;font-weight:600;color:var(--muted,#6b7280)}
.flash-countdown{display:flex;align-items:center;gap:8px;flex-wrap:wrap;width:fit-content;margin:0 0 12px;font-variant-numeric:tabular-nums}
.flash-countdown[hidden]{display:none}
.flash-countdown-label{font-size:13px;color:var(--muted,#6b7280);white-space:nowrap}
.flash-clock{display:inline-flex;align-items:center;gap:2px}
.flash-n{display:inline-block;min-width:1.7em;text-align:center;background:var(--flash-countdown-bg,#1f2329);color:var(--flash-countdown-fg,#fff);border-radius:3px;padding:2px 4px;font-size:13px;font-weight:700;line-height:1.5}
.flash-u{font-size:11px;color:var(--muted,#6b7280);margin:0 3px 0 1px}
.product-price.flash-price .price-now{color:var(--flash-price,#e02020)}
.product-price.flash-price .price-was{color:var(--muted,#98a1ab);text-decoration:line-through}
@media (max-width:700px){.flash-countdown{margin-bottom:10px}}

/* ===== 购物车 · 赠品行与赠品进度（购物赠好礼，2026-09-26）=====
   赠品是 **0 元行**：视觉上要与买的东西区分开（左边一条绿边 + 标签），但不能喧宾夺主。 */
.b2c-cart-gift-hint{margin:8px 0 12px;padding:8px 12px;border-radius:var(--radius);
  background:rgba(103,194,58,.10);color:#3f7a24;font-size:13px;line-height:1.6}
.b2c-cart-gift td{background:rgba(103,194,58,.05)}
.b2c-cart-gift-tag{display:inline-block;margin-right:6px;padding:1px 6px;border-radius:var(--radius-sm);
  background:#67c23a;color:#fff;font-size:11px;vertical-align:middle}
.b2c-cart-gift-free{color:#67c23a;font-weight:600}
.b2c-cart-gift-reason{margin-top:2px;font-size:12px;color:#909399}

/* ============================================================
   赠品标记（插件 b2c-gift）：后端注入 product.gift_promo_name 时才由模板输出。
   类名前缀固定 gift-badge-*，选择器只作用于标记自身，不波及全局。
   ============================================================ */
.gift-badge{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:var(--radius-pill);background:rgba(242,107,29,.12);color:#b4530f;font-size:12px;line-height:1.7;font-weight:600;letter-spacing:.01em;cursor:help;vertical-align:middle;white-space:nowrap}
.gift-badge svg{width:14px;height:14px;display:block;flex:0 0 auto}
.gift-badge-line{margin:0 0 14px}
.gift-badge--card{font-size:11px;padding:1px 7px}
.gift-badge--card svg{width:12px;height:12px}

/* ============================================================
   运输方式选择（插件 b2c-shipping）：容器由页面 JS 创建，没有选项时**根本不存在**。
   类名前缀固定 ship-mode-*。
   ============================================================ */
.ship-mode{margin:10px 0 2px}
.ship-mode__title{margin:0 0 6px;font-size:12px;color:var(--muted,#6b7280)}
.ship-mode__list{display:grid;gap:6px}
.ship-mode__opt{display:flex;align-items:center;gap:8px;width:100%;padding:8px 10px;border:1px solid var(--line,#e7e9ee);border-radius:var(--radius);background:#fff;color:inherit;font:inherit;font-size:13px;line-height:1.3;text-align:left;cursor:pointer}
.ship-mode__opt:hover{border-color:var(--accent,#f26b1d)}
.ship-mode__opt.is-active{border-color:var(--accent,#f26b1d);box-shadow:inset 0 0 0 1px var(--accent,#f26b1d)}
.ship-mode__icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;color:var(--accent,#f26b1d)}
.ship-mode__icon svg{display:block}
.ship-mode__name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ship-mode__eta{flex:0 0 auto;color:var(--muted,#6b7280);font-size:12px;white-space:nowrap}
.ship-mode__price{flex:0 0 auto;font-weight:700;white-space:nowrap;font-variant-numeric:tabular-nums}
.ship-mode__price.is-free{color:#0f9d58}

/* 专辑筛选条同页切换时的过渡态（只作用于专辑页商品网格） */
.product-grid.is-swapping{opacity:.45;transition:opacity .15s ease}

@media (max-width:700px){.ship-mode__eta{display:none}}

/* ============================================================================
 * 新增区块样式（2026-09-27）—— marquee-strip / hero-cards / carousel-cards / inquiry-form
 * 以及 feature-grid · image-text-split 的「卡型 / 图型」变体。
 *
 * 三条纪律（与仓库既有的一模一样）：
 *   ① 全部走 CSS 变量（--radius* / --accent / --gutter / --line…）⇒ 各主题换风格只覆盖变量；
 *   ② 选择器**只命中新区块自己的类名**（.sec-marquee* / .sec-hero-cards* / .sec-carousel* /
 *      .sec-inquiry* / .feature-grid--* / .sec-split-media--*）⇒ 对既有页面零影响；
 *   ③ 断点沿用基座既有三档（≤700 手机 / ≤900 平板 / ≤1100 窄桌面），不新造一套。
 *
 * ★ prefers-reduced-motion：滚动文字条（唯一有自动动画的区块）在系统"减少动态"时整体静止，
 *   并且**不再重复第二组**（重复组只为无缝循环存在，静止时会变成同一句话出现两遍）。
 * ============================================================================ */

/* ---------- ① 滚动文字条 marquee-strip ---------- */
.sec-marquee{--marquee-size:22px;--marquee-gap:56px;overflow:hidden;padding:18px 0}
.sec-marquee--sm{--marquee-size:16px;--marquee-gap:40px}
.sec-marquee--lg{--marquee-size:34px;--marquee-gap:72px}
.sec-marquee__track{display:flex;width:max-content;animation:sec-marquee-scroll var(--marquee-duration,26s) linear infinite;animation-direction:var(--marquee-direction,normal)}
/* 无缝循环的关键：两组**内容完全一致**的 group 并排，位移 -50% 正好等于一组宽度。
   第二组 aria-hidden="true"，屏读器不会把同一句话读两遍。 */
.sec-marquee__group{display:flex;align-items:center;flex:0 0 auto;gap:var(--marquee-gap);padding-right:var(--marquee-gap);white-space:nowrap}
.sec-marquee__item{display:inline-flex;align-items:baseline;gap:16px;font-size:var(--marquee-size);letter-spacing:-.01em}
.sec-marquee__label{font:600 11px 'DM Mono',monospace;letter-spacing:.16em;text-transform:uppercase;opacity:.7}
.sec-marquee__divider{color:var(--accent);opacity:.85;font-size:calc(var(--marquee-size) * .55)}
@keyframes sec-marquee-scroll{from{transform:translateX(0)}to{transform:translateX(-50%)}}
/* 鼠标移入暂停（只影响桌面指针设备；触摸端不触发 hover，行为不变） */
.sec-marquee:hover .sec-marquee__track{animation-play-state:paused}
@media (prefers-reduced-motion:reduce){
  .sec-marquee{overflow:visible}
  .sec-marquee__track{animation:none;width:auto;flex-wrap:wrap;justify-content:center}
  .sec-marquee__group[aria-hidden="true"]{display:none}
  .sec-marquee__group{flex-wrap:wrap;justify-content:center;padding-right:0;row-gap:10px}
}
@media (max-width:700px){
  .sec-marquee{--marquee-size:17px;--marquee-gap:34px}
  .sec-marquee--lg{--marquee-size:24px}
  .sec-marquee--sm{--marquee-size:13px}
}

/* ---------- ② Hero 叠压卡片组 hero-cards ---------- */
.sec-hero-cards{padding:0}
.sec-hero-cards--tall{--hero-cards-h:640px;--hero-cards-h-m:460px}
.sec-hero-cards--short{--hero-cards-h:420px;--hero-cards-h-m:300px}
/* 无背景图时用深色渐变兜底（有图时行内 background-image 会覆盖它）—— 占位图铺满整屏会被遮罩压成灰带，不如深色渐变干净 */
.sec-hero-cards__hero{position:relative;display:flex;align-items:center;min-height:var(--hero-cards-h,520px);background-color:#2a3644;background-image:linear-gradient(135deg,#16222e 0%,#2b4257 58%,#1d3145 100%);background-size:cover;background-position:center;color:#fff}
.sec-hero-cards__hero::after{content:'';position:absolute;inset:0;background:rgba(16,24,34,var(--hero-cards-overlay,.52))}
.sec-hero-cards__inner{position:relative;z-index:1;padding:80px var(--gutter);max-width:900px;min-width:0}
.sec-hero-cards--center .sec-hero-cards__hero{justify-content:center;text-align:center}
.sec-hero-cards--center .sec-hero-cards__inner{margin:0 auto}
.sec-hero-cards__hero .eyebrow{color:#ffb98a}
.sec-hero-cards__hero h2{font-size:clamp(30px,4vw,54px);line-height:1.06;letter-spacing:-.03em;margin:18px 0 0;font-weight:800;overflow-wrap:anywhere}
.sec-hero-cards__hero h2 em{font-family:var(--serif);font-weight:400;font-style:normal}
.sec-hero-cards__hero .hero-copy{color:#e3e8ee;max-width:620px}
.sec-hero-cards--center .sec-hero-cards__hero .hero-copy{margin-left:auto;margin-right:auto}
/* 叠压：卡片组上移，压住 hero 底边（--lift 只在 hero 真的渲染时才加） */
.sec-hero-cards__cards{position:relative;z-index:2;display:grid;gap:24px;padding:0 var(--gutter);margin-top:40px}
.sec-hero-cards__cards--lift{margin-top:-84px}
.sec-hero-cards__cards--1{grid-template-columns:minmax(0,440px);justify-content:center}
.sec-hero-cards__cards--2{grid-template-columns:repeat(2,minmax(0,1fr))}
.sec-hero-cards__cards--3{grid-template-columns:repeat(3,minmax(0,1fr))}
.sec-hc-card{display:flex;flex-direction:column;gap:12px;min-width:0;background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:26px 24px;box-shadow:0 18px 40px rgba(16,24,34,.10)}
.sec-hc-card--image{padding:0;overflow:hidden}
.sec-hc-card__media{aspect-ratio:1.6;background-size:cover;background-position:center;background-color:#eceef1}
.sec-hc-card--image .sec-hc-card__body{padding:22px 24px 26px;display:flex;flex-direction:column;gap:10px}
.sec-hc-card__icon{width:56px;height:56px;border-radius:50%;display:grid;place-items:center;background:#f2f5f8;font-size:24px;line-height:1;overflow:hidden}
.sec-hc-card__icon img{width:30px;height:30px;object-fit:contain}
.sec-hc-card--stat{background:var(--accent);color:#fff;border-color:transparent;justify-content:center;gap:8px}
.sec-hc-card--stat .sec-hc-card__value{font-size:clamp(38px,4vw,58px);font-weight:800;letter-spacing:-.04em;line-height:1}
.sec-hc-card--stat .sec-hc-card__label{font-size:15px;font-weight:600;line-height:1.4}
.sec-hc-card--stat .sec-hc-card__sub{font-size:13px;opacity:.88;line-height:1.5}
.sec-hc-card h3{font-size:17px;font-weight:700;margin:0;letter-spacing:-.01em;overflow-wrap:anywhere}
.sec-hc-card p{margin:0;color:var(--muted);font-size:13.5px;line-height:1.7;overflow-wrap:anywhere}
.sec-hc-card--stat p,.sec-hc-card--stat h3{color:#fff}
.sec-hc-card__link{align-self:flex-start;margin-top:2px;font:600 11px 'DM Mono',monospace;letter-spacing:.12em;text-transform:uppercase;color:var(--ink);box-shadow:inset 0 0 0 1px var(--ink);padding:10px 16px;border-radius:var(--radius-btn)}
.sec-hc-card__link:hover{background:var(--ink);color:#fff}
@media(max-width:1100px){.sec-hero-cards__cards--3{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:900px){.sec-hero-cards__cards--2,.sec-hero-cards__cards--3{grid-template-columns:1fr}.sec-hero-cards__cards--lift{margin-top:-56px}}
@media(max-width:700px){
  .sec-hero-cards__hero{min-height:var(--hero-cards-h-m,360px)}
  .sec-hero-cards__inner{padding:56px var(--gutter)}
  .sec-hero-cards__cards{gap:16px;margin-top:28px}
  .sec-hero-cards__cards--lift{margin-top:-40px}
  .sec-hero-cards__cards--1{grid-template-columns:1fr}
}

/* ---------- ③ 通用卡片轮播 carousel-cards ---------- */
.sec-carousel{--car-card-w:340px;padding:72px 0;overflow:hidden}
.sec-carousel--w-sm{--car-card-w:250px}
.sec-carousel--w-lg{--car-card-w:420px}
.sec-carousel__inner{display:grid;grid-template-columns:minmax(0,340px) minmax(0,1fr);gap:44px;align-items:center}
.sec-carousel--no-intro .sec-carousel__inner{grid-template-columns:minmax(0,1fr)}
.sec-carousel__intro{padding-left:var(--gutter);min-width:0}
.sec-carousel__intro h2{font-size:clamp(26px,2.6vw,38px);line-height:1.08;letter-spacing:-.03em;margin:16px 0 0;font-weight:800}
.sec-carousel__nav{display:flex;gap:10px;margin-top:26px}
.sec-carousel__btn{width:46px;height:46px;border-radius:50%;border:1px solid var(--line);background:#fff;color:var(--ink);display:grid;place-items:center;font-size:18px;line-height:1;cursor:pointer;transition:background .18s,color .18s,border-color .18s}
.sec-carousel__btn:hover{background:var(--ink);color:#fff;border-color:var(--ink)}
.sec-carousel__btn[disabled]{opacity:.35;cursor:default}
.sec-carousel__btn[disabled]:hover{background:#fff;color:var(--ink);border-color:var(--line)}
.sec-carousel__rail{min-width:0}
.sec-carousel__track{display:flex;gap:20px;overflow-x:auto;scroll-snap-type:x proximity;scroll-behavior:smooth;-webkit-overflow-scrolling:touch;padding:6px var(--gutter) 14px 0}
.sec-carousel__track::-webkit-scrollbar{height:8px}
.sec-carousel__track::-webkit-scrollbar-thumb{background:var(--line);border-radius:var(--radius-pill)}
.sec-carousel__track::-webkit-scrollbar-track{background:transparent}
.sec-carousel__card{flex:0 0 var(--car-card-w);scroll-snap-align:start;min-width:0;display:flex;flex-direction:column;background:#fff;border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;text-decoration:none;color:inherit}
.sec-carousel__media{aspect-ratio:1.5;background-size:cover;background-position:center;background-color:#eceef1}
.sec-carousel__body{padding:20px 22px 24px;display:flex;flex-direction:column;gap:9px}
.sec-carousel__body h3{font-size:16.5px;font-weight:700;margin:0;letter-spacing:-.01em;overflow-wrap:anywhere}
.sec-carousel__body p{margin:0;color:var(--muted);font-size:13.5px;line-height:1.7;overflow-wrap:anywhere}
.sec-carousel__more{margin-top:6px;font:600 11px 'DM Mono',monospace;letter-spacing:.12em;text-transform:uppercase;color:var(--accent)}
.sec-carousel__no{font:700 13px 'DM Mono',monospace;letter-spacing:.1em;color:var(--accent)}
.sec-carousel__card--overlay{position:relative;justify-content:flex-end;min-height:var(--car-card-h,380px);background-size:cover;background-position:center;background-color:#2a3644;border-color:transparent;color:#fff}
.sec-carousel__card--overlay::after{content:'';position:absolute;inset:0;background:linear-gradient(180deg,rgba(16,24,34,.06) 30%,rgba(16,24,34,.78) 100%)}
.sec-carousel__card--overlay .sec-carousel__bg{position:absolute;inset:0;background-size:cover;background-position:center;background-color:#2a3644}
.sec-carousel__overlay-body{position:relative;z-index:1;padding:24px;display:flex;flex-direction:column;gap:8px}
.sec-carousel__card--overlay h3{color:#fff}
.sec-carousel__card--overlay p{color:#dfe5ec}
.sec-carousel__card--plain{background:transparent;border:0;padding:0}
/* 「商品」来源：直接把基座商品卡塞进轨道（不另造一套商品卡样式） */
.sec-carousel__track>.product-card{flex:0 0 var(--car-card-w);scroll-snap-align:start;min-width:0}
@media(max-width:900px){
  .sec-carousel{--car-card-w:300px}
  .sec-carousel__inner{grid-template-columns:minmax(0,1fr);gap:28px}
  .sec-carousel__intro{padding-right:var(--gutter)}
  .sec-carousel__track{padding-left:var(--gutter)}
  .sec-carousel__card,.sec-carousel__track>.product-card{flex-basis:min(var(--car-card-w),78%)}
}
@media(max-width:700px){
  .sec-carousel{--car-card-w:270px;padding:56px 0}
  .sec-carousel__card,.sec-carousel__track>.product-card{flex-basis:min(var(--car-card-w),84%)}
}

/* ---------- ④ 询价表单区块 inquiry-form ---------- */
.sec-inquiry{--inq-fg:var(--ink);--inq-muted:var(--muted);--inq-line:var(--line)}
.sec-inquiry--dark{--inq-fg:#fff;--inq-muted:#c4cdd7;--inq-line:rgba(255,255,255,.28)}
.sec-inquiry{color:var(--inq-fg)}
.sec-inquiry__inner{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,.7fr);gap:52px;align-items:start}
.sec-inquiry--solo .sec-inquiry__inner{grid-template-columns:minmax(0,1fr);max-width:820px;margin:0 auto}
.sec-inquiry__head{margin-bottom:34px}
.sec-inquiry__head h2{font-size:clamp(26px,2.8vw,40px);line-height:1.08;letter-spacing:-.03em;margin:16px 0 0;font-weight:800;overflow-wrap:anywhere}
.sec-inquiry__head p{color:var(--inq-muted);line-height:1.75;font-size:14px;margin:14px 0 0;max-width:620px}
.sec-inquiry__fields{display:grid;grid-template-columns:1fr 1fr;gap:24px 28px;min-width:0}
.sec-inquiry__field{display:flex;flex-direction:column;gap:9px;min-width:0}
.sec-inquiry__field--full{grid-column:1/-1}
.sec-inquiry__field label{font:11px 'DM Mono',monospace;text-transform:uppercase;letter-spacing:.08em;color:var(--inq-muted)}
.sec-inquiry__field input,.sec-inquiry__field textarea,.sec-inquiry__field select{border:0;border-bottom:1px solid var(--inq-line);background:transparent;padding:11px 2px;font:14px Manrope,Arial,sans-serif;color:var(--inq-fg);outline:0;resize:vertical;width:100%;min-width:0;border-radius:0}
.sec-inquiry__field input:focus,.sec-inquiry__field textarea:focus,.sec-inquiry__field select:focus{border-bottom-color:var(--accent)}
.sec-inquiry__field select option{color:#111}
.sec-inquiry__captcha{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:6px}
.sec-inquiry__captcha-img{display:inline-flex;line-height:0;border:1px solid var(--inq-line);overflow:hidden;background:#f4f4f5}
.sec-inquiry__captcha-refresh{background:#fff;border:1px solid #d1d5db;padding:8px 12px;cursor:pointer;font-size:15px;line-height:1}
.sec-inquiry__foot{grid-column:1/-1;display:flex;justify-content:space-between;align-items:flex-end;gap:30px;margin-top:10px;flex-wrap:wrap}
.sec-inquiry__note{color:var(--inq-muted);font-size:12px;line-height:1.6;max-width:330px;margin:0}
.sec-inquiry__foot .button{margin-top:0}
.sec-inquiry__status{grid-column:1/-1;font-size:13px;line-height:1.6;margin:0;min-height:20px}
.sec-inquiry__status.is-ok{color:#2f7d4f}
.sec-inquiry--dark .sec-inquiry__status.is-ok{color:#7ee2a8}
.sec-inquiry__status.is-error{color:#c0392b}
.sec-inquiry--dark .sec-inquiry__status.is-error{color:#ff9d8a}
.sec-inquiry__aside{background:rgba(15,28,46,.04);border:1px solid var(--inq-line);border-radius:var(--radius);padding:32px 28px;min-width:0;overflow-wrap:anywhere}
.sec-inquiry--dark .sec-inquiry__aside{background:rgba(255,255,255,.06)}
.sec-inquiry__aside .sec-inquiry__aside-strong{font-size:20px;font-weight:700;letter-spacing:-.02em;margin:12px 0 0}
.sec-inquiry__facts{list-style:none;margin:22px 0 0;padding:0;display:grid;gap:12px}
.sec-inquiry__facts li{display:flex;gap:12px;align-items:baseline;min-width:0}
.sec-inquiry__facts .k{flex:0 0 76px;font:11px 'DM Mono',monospace;text-transform:uppercase;letter-spacing:.06em;color:var(--inq-muted)}
.sec-inquiry__facts .v{min-width:0;font-size:14px}
.sec-inquiry__facts .v a{border-bottom:1px solid var(--inq-line);word-break:break-word}
@media(max-width:900px){.sec-inquiry__inner{grid-template-columns:minmax(0,1fr);gap:36px}}
@media(max-width:700px){
  .sec-inquiry__fields{grid-template-columns:1fr}
  .sec-inquiry__foot{display:block}
  .sec-inquiry__note{margin-bottom:16px}
}

/* ---------- ⑤ feature-grid 卡型变体（numbered / icon / overlay） ---------- */
.feature-grid--numbered .feature-card,.feature-grid--icon .feature-card{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:26px 22px;min-width:0}
.feature-grid--numbered .feature-card .feature-image,.feature-grid--icon .feature-card .feature-image{display:none}
.feature-grid--numbered .feature-no{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:50%;background:var(--accent);color:#fff;font:700 13px 'DM Mono',monospace;margin-bottom:14px}
.feature-grid--icon .feature-icon{width:54px;height:54px;border-radius:50%;display:grid;place-items:center;background:#f2f5f8;font-size:24px;line-height:1;margin-bottom:14px;overflow:hidden}
.feature-grid--icon .feature-icon img{width:30px;height:30px;object-fit:contain}
.feature-grid--overlay .feature-card{position:relative;display:flex;flex-direction:column;justify-content:flex-end;align-items:flex-start;min-height:320px;padding:24px;border-radius:var(--radius);overflow:hidden;background-color:#2a3644;background-size:cover;background-position:center;color:#fff}
.feature-grid--overlay .feature-card::after{content:'';position:absolute;inset:0;background:linear-gradient(180deg,rgba(16,24,34,.06) 35%,rgba(16,24,34,.8) 100%)}
.feature-grid--overlay .feature-card>*{position:relative;z-index:1}
.feature-grid--overlay .feature-image{display:none}
.feature-grid--overlay .feature-no{position:absolute;top:18px;left:18px;z-index:2;font:700 12px 'DM Mono',monospace;letter-spacing:.1em;background:var(--accent);color:#fff;padding:5px 11px;border-radius:var(--radius-sm)}
.feature-grid--overlay h3{color:#fff;font-size:18px}
.feature-grid--overlay p{color:#dfe5ec}

/* ---------- ⑥ image-text-split 图型变体（stacked / video） ---------- */
.sec-split-media--stacked{position:relative;margin-bottom:34px}
.sec-split-media--stacked .sec-split-img-main{width:78%;display:block;border-radius:var(--radius);aspect-ratio:1/1.05;object-fit:cover;background:#eceef1}
.sec-split-media--stacked .sec-split-img-alt{position:absolute;right:0;bottom:-34px;width:56%;display:block;border-radius:var(--radius);border:6px solid #fff;aspect-ratio:1.2;object-fit:cover;background:#eceef1;box-shadow:0 18px 40px rgba(16,24,34,.16)}
@media(max-width:900px){.sec-split-media--stacked{margin-bottom:48px}.sec-split-media--stacked .sec-split-img-alt{bottom:-28px}}
.sec-split-media--video{position:relative;display:block;width:100%}
.sec-split-media--video::before{content:'';position:absolute;left:-14px;top:-14px;width:76px;height:76px;border-left:3px solid var(--accent);border-top:3px solid var(--accent);z-index:2;pointer-events:none}
.sec-split-play{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:74px;height:74px;border-radius:50%;background:rgba(255,255,255,.92);display:grid;place-items:center;z-index:3;border:0;cursor:pointer;text-decoration:none}
.sec-split-play::after{content:'';margin-left:5px;border-left:20px solid var(--ink);border-top:12px solid transparent;border-bottom:12px solid transparent}
.sec-split-play:hover{background:#fff}
@media(max-width:700px){.sec-split-play{width:58px;height:58px}.sec-split-play::after{margin-left:4px;border-left:15px solid var(--ink);border-top:9px solid transparent;border-bottom:9px solid transparent}}

/* ============================================================================
   批次C 新区块样式（2026-09-30）—— 仅追加，不改既有规则一个字节。
   覆盖：.testimonials*（客户评价 · B2B）/ .newsletter*（邮件订阅 · B2C）/
         .pt-*（价格表 pricing-table · 全 28 套）。
   命名空间均为新增，与既有类无重名；配色沿用 :root 既有变量。
   ============================================================================ */
/* ---- 客户评价（sections/testimonials.liquid）---- */
.testimonials-grid{display:grid;gap:24px;grid-template-columns:repeat(3,minmax(0,1fr))}
.testimonials-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}
.testimonials-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}
.testimonials-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}
.testimonial{margin:0;padding:26px;border:1px solid var(--line);border-radius:var(--radius-lg);background:var(--paper);display:flex;flex-direction:column;gap:14px}
.testimonial-stars{display:flex;gap:3px;color:#c9d1d9;font-size:14px;line-height:1}
.testimonial-stars .is-on{color:#f2a33c}
.testimonial-quote{margin:0;font-size:15px;line-height:1.75;color:var(--ink)}
.testimonial-who{display:flex;flex-direction:column;gap:2px;font-size:13px;color:var(--muted)}
.testimonial-who img{max-height:28px;width:auto;margin-bottom:6px;object-fit:contain}
.testimonial-name{font-weight:600;color:var(--ink)}
.testimonial-role,.testimonial-company,.testimonial-country{font-size:12px}
@media (max-width:1024px){.testimonials-grid,.testimonials-cols-4{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:640px){.testimonials-grid,.testimonials-cols-2,.testimonials-cols-3,.testimonials-cols-4{grid-template-columns:minmax(0,1fr)}}
/* ---- 邮件订阅（sections/newsletter.liquid）---- */
.newsletter-inner{max-width:640px;margin:0 auto;display:flex;flex-direction:column;align-items:center;gap:12px}
.newsletter-inner h2{margin:0;font-size:clamp(24px,2.4vw,34px);line-height:1.1;letter-spacing:-.02em}
.newsletter-copy{margin:0;color:var(--muted);line-height:1.75;font-size:15px}
.newsletter-form{display:flex;gap:10px;width:100%;max-width:460px;margin-top:6px}
.newsletter-form input[type=email]{flex:1;min-width:0;padding:14px 16px;border:1px solid var(--line);border-radius:var(--radius-btn);font:inherit;font-size:14px;color:var(--ink);background:var(--paper)}
.newsletter-form input[type=email]:focus{outline:none;border-color:var(--accent)}
.newsletter-form .button{margin-top:0;flex:0 0 auto}
.newsletter-note{margin:0;font-size:12px;color:var(--muted)}
@media (max-width:560px){.newsletter-form{flex-direction:column}.newsletter-form .button{width:100%;justify-content:center}}
/* ---- 价格表（sections/pricing-table.liquid）---- */
.pricing-table-grid{display:grid;gap:24px;grid-template-columns:repeat(3,minmax(0,1fr));align-items:stretch}
.pt-card{position:relative;display:flex;flex-direction:column;gap:14px;padding:30px 26px;border:1px solid var(--line);border-radius:var(--radius-lg);background:var(--paper)}
.pt-card.is-featured{border-color:var(--ink);box-shadow:0 16px 40px rgba(28,39,51,.10)}
.pt-badge{align-self:flex-start;padding:4px 10px;border-radius:var(--radius-pill);background:var(--accent);color:#fff;font:600 10px 'DM Mono',monospace;letter-spacing:.12em;text-transform:uppercase}
.pt-name{margin:0;font-size:20px;font-weight:800;letter-spacing:-.02em}
.pt-for{margin:0;font-size:13px;color:var(--muted)}
.pt-price{display:flex;align-items:baseline;gap:4px;color:var(--ink);flex-wrap:wrap}
.pt-price .cur{font-size:18px;font-weight:700}
.pt-price .num{font-size:38px;line-height:1;font-weight:800;letter-spacing:-.03em;overflow-wrap:anywhere}
.pt-price .per{font-size:13px;color:var(--muted);font-weight:500}
.pt-fx{margin:0;font-size:12px;color:var(--muted)}
.pt-feats{list-style:none;margin:0;padding:0;display:grid;gap:9px;font-size:14px;line-height:1.5}
.pt-feats li{position:relative;padding-left:24px;color:var(--ink);overflow-wrap:anywhere}
.pt-feats li::before{content:'\2713';position:absolute;left:0;top:0;color:var(--accent);font-weight:700}
.pt-feats li.is-off{color:#a8b0b8}
.pt-feats li.is-off::before{content:'\2013';color:#c9d1d9}
.pt-card .button{margin-top:auto;width:100%;justify-content:center;text-align:center}
.pt-note{margin:18px 0 0;font-size:12px;color:var(--muted)}
@media (max-width:1024px){.pricing-table-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:640px){.pricing-table-grid{grid-template-columns:minmax(0,1fr)}}
/* B2B-A8 · 消费生活型 —— 暖色 + 大圆角 + 场景图。
   本文件只覆盖设计变量与少量版式表达，不新增类名、不改区块结构。 */

:root{
  --ink:#2b2320; --muted:#8a7a6e; --paper:#fffaf4;
  --accent:#f2a03d; --accent-dark:#d9862a;
  --line:#f0e4d8; --footer-bg:#2a211c;
  --serif:Georgia,'Times New Roman',serif;
  --gutter:max(24px,calc((100% - 1300px)/2));
}
body{background:var(--paper)}

.site-header{min-height:82px;background:#fffaf4;border-bottom:1px solid var(--line)}

/* 暖色渐变首屏：场景图未加载时也是一片暖光，不会露出冷灰 */
.hero{padding:92px var(--gutter);min-height:540px;background:linear-gradient(155deg,#fff2e0 0%,#fffaf4 60%,#fdeede 100%)}
.hero h1,.page-intro h1{font-size:clamp(38px,4vw,56px);font-weight:800;letter-spacing:-.012em}
.hero h1 em,.page-intro h1 em{font-style:italic}
.hero-copy{max-width:620px;font-size:16px;line-height:1.85}
.button{border-radius:var(--radius-btn);text-transform:none;letter-spacing:.02em;padding:15px 32px}
.section{padding:84px var(--gutter)}
.section-heading h2,.faq-heading,.rich-heading{font-weight:800;letter-spacing:-.012em}

/* 大圆角卡面 + 暖色投影：卡片像纸片一样浮在暖底上 */
.product-card,.feature-card,.rich-item{border:1px solid var(--line);background:#fff;border-radius:20px;overflow:hidden;box-shadow:0 10px 26px rgba(43,35,32,.06)}
.product-card:hover{box-shadow:0 20px 40px rgba(242,160,61,.20);transform:translateY(-3px)}
.card-image{border-radius:20px 20px 0 0}
details{border:1px solid var(--line);border-radius:18px;background:#fff;padding:14px 18px;margin-bottom:10px}
.cta-section{background:var(--footer-bg)}

/* 一键回到顶部：只覆盖 CSS 变量，规则本体在站点基座 */
:root{--b2b-btt-bg:var(--accent);--b2b-btt-bg-hover:var(--accent-dark)}

/* 商品移入换图：静止显主图，桌面端移入卡片淡入图库第 2 张（仅支持 hover 的设备） */
.card-img--alt{opacity:0;pointer-events:none;transition:opacity .25s ease}
@media (hover:hover){
  .product-card:hover .card-img--alt{opacity:1}
}

/* 设计 token：本套「圆润暖色」语言 —— pill 按钮，卡面 18 / 24px */
:root{--radius-sm:10px;--radius:18px;--radius-lg:24px;--radius-pill:999px;--radius-btn:999px}

/* ============================================================================
 * 页头「导航条文字 + LOGO」放大（2026-09-28 业主返工 · 第 2 批：全主题统一）
 *   第 1 批（提交 d5ff04a）只覆盖当时在用的两套（b2b-default / b2c-flagship）；
 *   第 2 批业主决定：**卖给客户的模板也全部放大** ⇒ 本主题补上与那两套**逐字相同**的一段，
 *   避免"同一个观感在别套主题上又是另一种尺码"。
 *   ★ 只改本主题的 assets/theme.css（基座 public/theme.css 一行不动）⇒ 只影响本主题站点。
 *   ★ 本文件在基座**之后**拼入（src/server.js 的 /theme.css 路由：先基座、后主题）⇒
 *     同特异性"后写胜出"，**不需要 !important**（基座也没用 !important 压这几条）。
 *   ★ 页头 DOM 与 b2b-default 同源（同一份 layout/theme.liquid）：
 *     `#mobileNavOpen` -> `<header class="site-header">` -> `<a class="brand brand--logo">` 里的
 *     `<img class="brand__logo">` -> `<nav>`（`<nav>` 是 `.site-header` 的直接子元素）。
 *     本块沿用同一批选择器（含复刻抽屉态的 id 选择器），**不改任何 HTML 模板、不新增类名**。
 *   ★ 改前 -> 改后（桌面）：导航字号 clamp(14px,.55vw+6px,17px)、字重 700、
 *     项间距 20 / 14 / 16px（701-1023 / >=1024 / >=1440）；LOGO 高 clamp(56px,2vw+40px,82px)；
 *     页头上下留白 6px。
 *   ★ 手机（<=700px 抽屉）：导航 18px（w700）、子项 15px；顶栏 LOGO 高 clamp(34px,8vw+16px,54px)。
 * ============================================================================ */
.site-header nav{font-size:clamp(14px, 0.55vw + 6px, 17px);font-weight:700}
@media (min-width:701px){
  .site-header{padding-top:6px;padding-bottom:6px}
  .site-header .brand__logo{max-height:clamp(56px, 2vw + 40px, 82px);max-width:min(520px, 70vw)}
}
@media (min-width:701px) and (max-width:1023px){
  .site-header>nav{gap:20px}
}
@media (min-width:1024px){
  .site-header>nav{gap:14px}
}
@media (min-width:1440px){
  .site-header>nav{gap:16px}
}
@media (max-width:700px){
  .site-header .brand__logo{max-height:clamp(34px, 8vw + 16px, 54px)}
  #mobileNavOpen:checked ~ .site-header > nav{font-size:18px;font-weight:700}
  #mobileNavOpen:checked ~ .site-header > nav .nav-sub__item > a{font-size:15px}
}
