/* ============================================================
   慧谷茗心 · 品牌官网 —— 组件样式
   ------------------------------------------------------------
   依赖 base.css 的变量。加载顺序：base.css → site.css。
   ⚠️ 顺序反了不会报错，但 --rock 之类的变量在 site.css 里
      解析时还没定义，颜色会全部退回浏览器默认（黑字白底）。
      每个 HTML 的 <head> 里两个 <link> 的顺序请勿调整。
   ============================================================ */

/* ============================================================
   一、页头导航
   ------------------------------------------------------------
   桌面：横向导航 + 下拉。手机：汉堡 + 全屏抽屉。
   ⚠️ position: sticky 而不是 fixed。fixed 需要给 body 加
      padding-top 补偿，而那个补偿值一旦与 --nav-h 不同步，
      首屏顶部就会多出一条空白 —— sticky 不占额外文档流处理。
   ============================================================ */
.site-nav {
  position: sticky; top: 0; z-index: 60;
  height: var(--nav-h);
  background: rgba(244, 239, 230, .92);
  backdrop-filter: saturate(1.6) blur(12px);
  -webkit-backdrop-filter: saturate(1.6) blur(12px);
  border-bottom: 1px solid var(--hairline-2);
}
.site-nav .in {
  height: 100%; max-width: var(--wrap); margin: 0 auto; padding: 0 24px;
  display: flex; align-items: center; gap: 28px;
}

/* 品牌位：纯文字。
   ⚠️ 不放 logo 图片 —— 客户此前明确要求小程序首页取消
      「logo + 文字」的组合。官网页头沿用同一口径：只用字。
      站点名来自 /api/site/info，不写死。 */
.brand { display: flex; align-items: baseline; gap: 10px; flex: none; }
.brand .zh {
  font-family: var(--f-display);
  font-size: 20px; font-weight: 700; letter-spacing: .12em;
  color: var(--ink);
}
.brand .en {
  font-family: var(--f-num);
  font-size: 10px; letter-spacing: .26em; text-transform: uppercase;
  color: var(--gold);
}

/* ------------------------------------------------------------
   一级导航
   ------------------------------------------------------------
   ⚠️ 这一行的可用宽度**不随屏幕变宽而增加**，因为 .in 被
      max-width: var(--wrap) = 1200px 钉死了。所以「大屏就放得下」
      是错的 —— 1440 和 1920 上留给导航的宽度和 1200 上一模一样：

        可用 = 1200 - 48(padding) - 392(品牌) - 92(扫码按钮) - 56(两个 gap)
             = 612px          ← 实测 .nav-list 宽度正是 612

      需要 = 所有标签的文字宽 + 每项左右 padding + 项间 gap
           = 29 个汉字 x 15px + 8 项 x 2 x padding + 7 x gap

      8 个栏目在 padding:14 / gap:4 时需要 659px（实测自然宽 659），
      **超出 612 共 47px**。超出后 .nav-list 作为 flex 项被压缩，
      每项内容盒只剩 45px 而文字要 60px —— 中文没有空格，
      于是「关于我们」折成「关于我」+「们」，
      而第二行落在 72px 页头**之外**，压在首屏 Banner 上。

   ⚠️ 这个塌版在 1440px 桌面宽度下就已经发生，不是窄屏问题。
      它控制台干净、请求全 200、四道闸门全绿；截图时如果只裁
      页头那 72px，第二行恰好在裁剪框外面 —— 看起来完全正常。
      （本轮就是这么漏过一次的：先量了 y0~74 的墨迹，只有一条带，
        误判为「没折行」；把扫描范围放到 y0~200 才看到第二条带。）

   ⚠️ 所以这里 padding 收到 10px、gap 收到 0：
        需要 = 435 + 160 + 0 = 595 ≤ 612，余量 17px。
      余量只有 17px，**再加一个四字栏目（+80px）必然塌版**。
      加栏目前请先按上面的公式算，或跑 deploy-website.sh 里的
      「页头宽度预算」检查（它会直接把构建判失败）。

   ⚠️ white-space: nowrap 是**兜底而非样式**：它保证即使将来
      预算又被撑破，结果也是「横向溢出」这种一眼能看见的坏，
      而不是「折到页头外面」这种只有裁全屏截图才看得见的坏。
      不要因为「反正现在放得下」把它删掉。
   ------------------------------------------------------------ */
.nav-list { display: flex; align-items: center; gap: 0; margin-left: auto; }
.nav-list > li { position: relative; }
.nav-list a {
  display: block; padding: 0 10px; height: var(--nav-h);
  line-height: var(--nav-h);
  font-size: 15px; color: var(--ink-2);
  white-space: nowrap;
  transition: color .18s ease;
}
.nav-list a:hover { color: var(--rock); }
/* 当前栏目：金色下划线。
   ⚠️ 高亮由 JS 按当前文件名加 .on，不是靠 CSS ——
      :target / :hover 都做不到「跨页面的当前项」。 */
.nav-list a.on { color: var(--rock); font-weight: 500; }
.nav-list a.on::after {
  content: ''; position: absolute; left: 14px; right: 14px; bottom: 18px;
  height: 2px; background: var(--gold-l); border-radius: 2px;
}

/* 下拉子菜单 */
.nav-list .sub {
  position: absolute; top: calc(var(--nav-h) - 8px); left: 0;
  min-width: 168px; padding: 8px;
  background: var(--card); border: 1px solid var(--hairline-2);
  border-radius: var(--r-m); box-shadow: var(--sh-m);
  opacity: 0; visibility: hidden; transform: translateY(6px);
  transition: opacity .18s ease, transform .18s ease, visibility .18s;
}
.nav-list > li:hover .sub,
/* ⚠️ :focus-within 必须留：只用 :hover 的话，用 Tab 键走到
   父项时子菜单不展开，键盘用户永远进不去子栏目。 */
.nav-list > li:focus-within .sub {
  opacity: 1; visibility: visible; transform: translateY(0);
}
.nav-list .sub a {
  height: auto; line-height: 1.7; padding: 8px 12px;
  border-radius: var(--r-s); font-size: 14px;
}
.nav-list .sub a:hover { background: var(--paper-2); }
.nav-list .sub a.on::after { display: none; }

/* 页头右侧的引流按钮 */
.nav-cta { flex: none; }

/* 汉堡按钮（手机端才显示） */
.burger {
  display: none; flex: none;
  width: 40px; height: 40px; margin-left: auto;
  align-items: center; justify-content: center;
  border-radius: var(--r-s);
}
.burger span {
  display: block; position: relative;
  width: 20px; height: 1.5px; background: var(--ink);
  transition: transform .2s ease, opacity .2s ease;
}
.burger span::before, .burger span::after {
  content: ''; position: absolute; left: 0; width: 20px; height: 1.5px;
  background: var(--ink); transition: transform .2s ease;
}
.burger span::before { top: -6px; }
.burger span::after { top: 6px; }
.burger.open span { background: transparent; }
.burger.open span::before { transform: translateY(6px) rotate(45deg); }
.burger.open span::after { transform: translateY(-6px) rotate(-45deg); }

/* 手机抽屉 */
.drawer {
  position: fixed; inset: var(--nav-h-m) 0 0 0; z-index: 55;
  background: var(--paper);
  padding: 12px 16px 32px;
  overflow-y: auto;
  /* ⚠️ 用 translateX 而不是 display:none 切换：
     display 切换没有过渡动画，抽屉会「闪」出来。
     同时必须配 visibility，否则隐藏状态下抽屉里的链接
     仍能被 Tab 聚焦（焦点跑到屏幕外，页面莫名滚动）。 */
  transform: translateX(100%); visibility: hidden;
  transition: transform .26s ease, visibility .26s;
}
.drawer.open { transform: translateX(0); visibility: visible; }
.drawer a {
  display: block; padding: 14px 4px;
  font-size: 16px; color: var(--ink-2);
  border-bottom: 1px solid var(--hairline-2);
}
.drawer a.on { color: var(--rock); font-weight: 500; }
.drawer .grp { padding: 18px 4px 6px; font-size: 12px; letter-spacing: .2em; color: var(--ink-4); }
.drawer .sub-a { padding-left: 18px; font-size: 15px; }

/* ============================================================
   二、首页 Banner（轮播）
   ------------------------------------------------------------
   ⚠️ 自己写而不引 swiper：swiper 压缩后 140KB+，
      而这里只需要「淡入淡出 + 圆点 + 自动播放」。
   ⚠️ 所有 slide 都渲染在 DOM 里、靠 opacity 切换，
      不是 display:none —— 后者会让浏览器在切换那一刻
      才开始加载图片，第一次轮播必然闪白。
   ============================================================ */
.hero { position: relative; overflow: hidden; background: var(--paper-2); }
.hero-track { position: relative; height: 560px; }
.hero-item {
  position: absolute; inset: 0;
  opacity: 0; transition: opacity .8s ease;
  /* ⚠️ pointer-events 必须跟着切：不切的话，看不见的那一张
     压在上面，访客点「了解详情」点不动。 */
  pointer-events: none;
}
.hero-item.on { opacity: 1; pointer-events: auto; }
.hero-item img { width: 100%; height: 100%; object-fit: cover; }

/* 图上的文字要压一层渐变，否则浅色照片上白字看不清。
   ⚠️ 渐变从下往上，不是整块半透明黑 —— 后者会让照片发灰。 */
.hero-item .mask {
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(30, 27, 23, .28) 0%,
              rgba(30, 27, 23, .04) 42%, rgba(30, 27, 23, .62) 100%);
}
.hero-item .txt {
  position: absolute; left: 0; right: 0; bottom: 88px;
  max-width: var(--wrap); margin: 0 auto; padding: 0 24px;
  color: #fff;
}
.hero-item .txt h2 {
  font-size: 40px; letter-spacing: .06em;
  text-shadow: 0 2px 20px rgba(0, 0, 0, .35);
}
.hero-item .txt p {
  margin-top: 12px; font-size: 16px; opacity: .92;
  text-shadow: 0 1px 12px rgba(0, 0, 0, .35);
}
.hero-item .txt .btn { margin-top: 22px; }

/* 没有 Banner 时的兜底：宣纸底纹 + 站点标语。
   ⚠️ 必须有这个兜底。运营还没上传 Banner 时首页顶部是
      一片空白，客户会以为网站没做完。 */
.hero-fallback {
  height: 460px; display: flex; align-items: center; justify-content: center;
  text-align: center;
  background:
    radial-gradient(1200px 400px at 50% -10%, var(--gold-wash), transparent 70%),
    linear-gradient(180deg, var(--paper-2), var(--paper));
}
.hero-fallback h2 { font-size: 36px; letter-spacing: .16em; }
.hero-fallback p { margin-top: 14px; color: var(--ink-3); letter-spacing: .1em; }
.hero-fallback .rule { width: 60px; height: 2px; margin: 20px auto 0; background: var(--gold-l); }

.hero-dots {
  position: absolute; left: 0; right: 0; bottom: 28px;
  display: flex; justify-content: center; gap: 10px;
}
.hero-dots button {
  width: 28px; height: 3px; border-radius: 2px;
  background: rgba(255, 255, 255, .45);
  transition: background .2s ease;
}
.hero-dots button.on { background: #fff; }

/* ============================================================
   三、卡片：文章 / 产品
   ============================================================ */
.card {
  background: var(--card);
  border: 1px solid var(--hairline-2);
  border-radius: var(--r-l);
  overflow: hidden;
  transition: transform .22s ease, box-shadow .22s ease;
  display: flex; flex-direction: column;
}
.card:hover { transform: translateY(-3px); box-shadow: var(--sh-m); }

/* 图片位固定比例。
   ⚠️ 用 padding-top 撑高（而不是给 img 写死 height），
      这样图片没加载完时高度已经确定，不会发生
      「图到了之后整页往下跳」（CLS）。
      aspect-ratio 更优雅，但要兼容老一点的国产浏览器内核，
      padding-top 的支持面更宽。 */
.card .thumb { position: relative; padding-top: 62%; background: var(--paper-3); overflow: hidden; }
.card .thumb img {
  position: absolute; inset: 0;
  width: 100%; height: 100%; object-fit: cover;
  transition: transform .5s ease;
}
.card:hover .thumb img { transform: scale(1.045); }

/* 无封面时的替代块：不放「暂无图片」四个字，
   放一枚淡淡的印章底纹 —— 官网上出现「暂无图片」显得没做完。 */
.card .thumb.none {
  background:
    radial-gradient(400px 160px at 50% 0%, var(--gold-wash), transparent 70%),
    var(--paper-2);
}
.card .thumb.none::after {
  content: '茗'; position: absolute; inset: 0;
  display: flex; align-items: center; justify-content: center;
  /* 印章字必须是宋体：黑体的「茗」没有笔锋，看着像占位符而不是印记。 */
  font-family: var(--f-display);
  font-size: 46px; font-weight: 700; color: var(--ink-4); opacity: .3;
}

.card .body { padding: 18px 20px 20px; flex: 1; display: flex; flex-direction: column; }
/* ---- 卡片标题一律**黑体**，不跟 h1~h3 的宋体 ----
   ⚠️ 这不是漏改，是照抄小程序的分工。
      注意小程序**不是**「宋体用得少」（全端宋体声明 69 处），
      而是列表卡片标题那几个类里**根本没写 font-family** ——
      .pc-n（商品卡）、.al-n（文章行）只写字号字重行高，
      字族从 page{} 的 PingFang 继承下来。宋体铺得很广，
      但有意绕开了密集列表的卡片标题。
      （边界：activity.wxss 的 .ac-n 是宋体 28rpx/700 ——
       它是一屏两三张的主卡标题，不是密集列表。判据见 docs/09 §2.6。）
      两条理由，都成立：
        1. 一致性 —— 卡片是两端重复度最高的元素，字不一样最容易被看出来；
        2. 可读性 —— 卡片标题 15~17px 且常两行，中文宋体在这个字号下
           笔画发虚，密集列表里尤其累眼。这是「美观」与「使用」
           冲突时以使用为先的地方。
   ⚠️ 产品名与文章标题在 HTML 里是 <h3>（为了 SEO 与大纲正确），
      所以必须在这里显式覆盖回 --f-body，否则会被 h3 的宋体接管。 */
/* ⚠️ letter-spacing 也必须显式写回 normal，不能只改 font-family。
      h1~h3 那条规则里字族与字距是**一起**给的（宋体字面紧，需要 .06em），
      只覆盖字族的话字距会**继续继承** —— 黑体带着为宋体准备的字距，
      表现是「这一种卡片的标题比别处松一点」，肉眼刚好能觉得别扭
      但说不出哪里不对。三处卡片标题里另两处（.pcard .name / .arow .t）
      当时写了 normal，这一处漏了 —— 正是本文件上面警告的「少写一处」。
      查法：用浏览器读 computed style 比对三处，而不是读 CSS 源码。 */
.card .t {
  font-family: var(--f-body); letter-spacing: normal;
  font-size: 16px; font-weight: 600; line-height: 1.5;
}
.card .d { margin-top: 8px; font-size: 13px; color: var(--ink-3); line-height: 1.7; flex: 1; }
.card .m {
  margin-top: 14px; padding-top: 12px;
  border-top: 1px dashed var(--hairline);
  display: flex; align-items: center; justify-content: space-between;
  font-size: 12px; color: var(--ink-4);
}

/* 置顶角标 */
.card .top-flag {
  position: absolute; left: 0; top: 14px; z-index: 2;
  padding: 3px 12px 3px 10px;
  background: var(--seal); color: #fff;
  font-size: 11px; letter-spacing: .1em;
  border-radius: 0 999px 999px 0;
}

/* ---- 文章日期块 ----
   ⚠️ 选择器**不能**限定在 .card 下面。这里原先写的是 `.card .date`，
      而 js/render.js 的 articleLine()（首页「新闻动态 / 荣誉资质」
      两列用的模板）生成的 .date **不在** .card 里 ——
      于是那两列的日期完全没有样式：没有宽度、没有右分隔线，
      月日和标题挤在一起变成「11.12慧谷茗心受邀参加…」，
      年份被挤到下一行孤零零地掉在标题左边。
      这类错误不报错、控制台干净、自检也查不出（类名确实存在），
      只有人眼能看出来 —— 这次就是看图才发现的。
   ⚠️ 日期用 --f-num：月日是数字，等宽衬线才能让多行日期左对齐。 */
.date {
  flex: none; width: 58px; text-align: center;
  border-right: 1px solid var(--hairline);
  padding-right: 14px; margin-right: 14px;
}
.date .md {
  font-family: var(--f-num);
  font-size: 17px; font-weight: 700; color: var(--rock); letter-spacing: .04em;
}
.date .y {
  font-family: var(--f-num);
  font-size: 11px; color: var(--ink-4); margin-top: 2px;
}

/* 列表页的横排文章行（比卡片信息密度高，用于栏目页） */
.arow {
  display: flex; gap: 20px; align-items: stretch;
  padding: 20px; background: var(--card);
  border: 1px solid var(--hairline-2); border-radius: var(--r-l);
  transition: transform .2s ease, box-shadow .2s ease;
}
.arow:hover { transform: translateY(-2px); box-shadow: var(--sh-m); }
.arow .pic {
  flex: none; width: 208px; border-radius: var(--r-m);
  overflow: hidden; background: var(--paper-3);
  position: relative; align-self: stretch; min-height: 132px;
}
.arow .pic img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.arow .ct { flex: 1; min-width: 0; display: flex; flex-direction: column; }
/* 同 .card .t：这里也是 <h3>，需显式退回黑体（理由见上）。 */
.arow .t { font-family: var(--f-body); letter-spacing: normal; font-size: 17px; font-weight: 600; }
.arow .d { margin-top: 8px; font-size: 13.5px; color: var(--ink-3); flex: 1; }
.arow .m { margin-top: 12px; font-size: 12px; color: var(--ink-4); display: flex; gap: 16px; }

/* ---- 产品卡片 ---- */
.pcard .thumb { padding-top: 100%; }     /* 产品图用 1:1，茶叶产品照多为方图 */
.pcard .cat { font-size: 12px; color: var(--gold); letter-spacing: .1em; }
.pcard .name {
  font-family: var(--f-body); letter-spacing: normal;
  margin-top: 6px; font-size: 17px; font-weight: 600;
}
.pcard .sub { margin-top: 6px; font-size: 13px; color: var(--ink-3); }
/* 价格说明文字。
   ⚠️ 刻意**不**用醒目的红色大字：这不是电商价格，
      是「¥298 起 / 100g」这类说明。做成价格样式会让访客
      以为能在官网下单，然后找不到购物车。 */
.pcard .price { margin-top: 10px; font-size: 13px; color: var(--ink-2); }
.pcard .price em {
  font-style: normal; color: var(--rock); font-weight: 700;
  font-family: var(--f-num); font-variant-numeric: tabular-nums;
  font-size: 15px;
}

/* 「小程序可下单」提示 */
.pcard .buy {
  margin-top: 12px; font-size: 12px; color: var(--wt-d);
  display: inline-flex; align-items: center; gap: 5px;
}
.pcard .buy::before {
  content: ''; width: 6px; height: 6px; border-radius: 50%;
  background: var(--ok);
}

/* ---- 一亩茶园 · 地块卡片 ----
   ⚠️ 这张卡片里**没有价格、没有剩余份数、没有售罄进度条**。
      小程序的地块卡（plot.wxss）有这三样，官网刻意没有 ——
      服务端根本不下发（理由见 server/src/services/site.js
      sitePlotView 那一节）。所以这里也不会有 .price / .left /
      .progress 这类类名。以后有人来加，请先读那一节。

   ⚠️ 它比 .pcard 高：要放要素行 + 三行键值 + 三条权益。
      三列栅格里这是最高的一种卡片 —— 首页那一节因此**只给 3 个**
      （services/site.js 的 PLOT_N.home），4 个会在第二行留一张孤卡。 */
.plotcard .thumb { padding-top: 64%; }   /* 茶园照多为横幅，不用 1:1 */

/* 头部一行：产品线标签 + 地块编号 */
.plotcard .hd { display: flex; align-items: center; gap: 10px; }
/* ⚠️ .tag 在 flex 里必须 align-self:flex-start，否则被拉伸到
   整行高度（display:inline-block 挡不住 flex 的交叉轴 stretch）。
   这一条是 base.css 里已经踩过的坑，这里同一处置。 */
.plotcard .hd .tag { align-self: flex-start; }
.plotcard .hd .code {
  /* 地块编号是「TM-A07」这类半角数字字母，用等宽衬线才不歪。 */
  font-family: var(--f-num); font-variant-numeric: tabular-nums;
  font-size: 12px; color: var(--ink-4); letter-spacing: .08em;
}
.plotcard .name {
  font-family: var(--f-body); letter-spacing: normal;
  margin-top: 10px; font-size: 17px; font-weight: 600;
}
.plotcard .meta { margin-top: 7px; font-size: 13px; color: var(--ink-3); line-height: 1.75; }

/* 要素行：海拔 / 面积 / 株数，用「·」分隔 */
.plotcard .facts {
  margin-top: 12px; display: flex; flex-wrap: wrap;
  font-size: 12.5px; color: var(--ink-2);
}
.plotcard .facts span { font-variant-numeric: tabular-nums; }
/* ⚠️ 分隔符用 ::before 而不是在 JS 里 join('·')：
   换行时 join 出来的「·」会掉到行首，成为一行的第一个字符。 */
.plotcard .facts span + span::before {
  content: '·'; margin: 0 8px; color: var(--ink-4);
}

/* 键值行：制成 / 预计年产 / 管护人 */
.plotcard .kv {
  margin-top: 10px; padding-top: 10px;
  border-top: 1px dashed var(--hairline-2);
  font-size: 13px; color: var(--ink-2); line-height: 1.7;
}
.plotcard .kv i {
  font-style: normal; color: var(--ink-4);
  font-size: 12px; margin-right: 8px;
}
.plotcard .kv b { font-weight: 600; }
/* 免责/补充说明。
   ⚠️ 「实际产量以当年采摘加工为准」这一句必须**看得见**。
      做成 12px 的 --ink-4 已经是下限（对比度 2.0:1，见 docs/09 §2.7）——
      所以它不能是唯一承载信息的元素，只作为紧跟在产量后面的限定语。
      再压小或再压浅就变成「小字免责」，那是刻意让人看不见，
      与本项目对认购合规的处置相反。 */
.plotcard .kv em {
  display: block; margin-top: 3px;
  font-style: normal; font-size: 12px; color: var(--ink-3);
}

/* 权益清单 */
.plotcard .rights { margin-top: 12px; display: grid; gap: 6px; }
.plotcard .rights li {
  position: relative; padding-left: 15px;
  font-size: 12.5px; color: var(--ink-2); line-height: 1.7;
}
.plotcard .rights li::before {
  content: ''; position: absolute; left: 0; top: 8px;
  width: 5px; height: 5px; border-radius: 50%;
  background: var(--wt-l);
}
/* 「等 N 项权益」是提示而不是权益本身，去掉圆点、压浅一档。 */
.plotcard .rights li.more { padding-left: 15px; color: var(--ink-4); }
.plotcard .rights li.more::before { background: none; }

.plotcard .foot {
  margin-top: 14px; padding-top: 12px;
  border-top: 1px dashed var(--hairline);
  display: flex; align-items: center; justify-content: space-between;
  gap: 10px; font-size: 12px; color: var(--ink-4);
}
.plotcard .foot .mo {
  flex: none; display: inline-flex; align-items: center; gap: 5px;
  color: var(--wt-d);
}
.plotcard .foot .mo::before {
  content: ''; width: 6px; height: 6px; border-radius: 50%;
  background: var(--ok);
}

/* 专页顶部的说明条（garden.html 用）。
   ⚠️ 这一块承载「官网不做交易」的解释：告诉访客认购要在小程序里
      完成实名与签约。不写的话，一个通篇没有价格也没有按钮的
      展示页会让人以为「网站坏了」或「已经卖完了」。 */
.plot-note {
  margin-bottom: 30px; padding: 20px 24px;
  background: var(--card); border: 1px solid var(--hairline-2);
  border-left: 3px solid var(--wt-l);
  border-radius: var(--r-m);
  font-size: 13.5px; color: var(--ink-2); line-height: 1.9;
}
.plot-note b { font-weight: 600; color: var(--ink); }
.plot-note .steps {
  margin-top: 12px; display: flex; flex-wrap: wrap; gap: 8px 6px;
  font-size: 12.5px; color: var(--ink-3);
  counter-reset: st;
}
.plot-note .steps span {
  padding: 4px 12px; background: var(--paper-2);
  border-radius: 999px;
  counter-increment: st;
}
/* 步骤序号用 CSS 计数器。
   ⚠️ 原先写的是「步骤之间插一个 → 箭头」，用
      `span:not(:last-child)::after { content:'→' }` ——
      那是错的：::after 生成的内容在 span **内部**，
      于是箭头会连着 padding 一起被圆角药丸的背景包进去，
      看起来像「选地块→」是一个步骤名。
      要把箭头放到药丸之间，只能再加一层元素或用绝对定位，
      而序号本身就足以表达顺序，且换行时不会有孤立的箭头
      掉到行首。这一条是写 CSS 时当场推翻的，不是看图看出来的。 */
.plot-note .steps span::before {
  content: counter(st);
  margin-right: 6px; color: var(--ink-4);
  font-family: var(--f-num); font-variant-numeric: tabular-nums;
}

/* ============================================================
   四、页头横幅（非首页的内页页头）
   ============================================================ */
.phero {
  position: relative;
  padding: 64px 0 56px;
  background:
    radial-gradient(900px 300px at 20% -20%, var(--gold-wash), transparent 70%),
    linear-gradient(180deg, var(--paper-2), var(--paper));
  border-bottom: 1px solid var(--hairline-2);
  overflow: hidden;
}
/* 有头图时铺满，文字压在上面 */
.phero.has-img { background: var(--ink); }
.phero.has-img .bg {
  position: absolute; inset: 0;
  width: 100%; height: 100%; object-fit: cover; opacity: .58;
}
.phero.has-img .wrap { position: relative; }
.phero.has-img h1, .phero.has-img .sub { color: #fff; text-shadow: 0 2px 16px rgba(0, 0, 0, .4); }

.phero h1 { font-size: 32px; letter-spacing: .06em; }
.phero .sub { margin-top: 12px; font-size: 15px; color: var(--ink-3); }

/* 面包屑 */
.crumb { margin-bottom: 18px; font-size: 13px; color: var(--ink-4); }
.crumb a:hover { color: var(--rock); }
.crumb .sep { margin: 0 8px; opacity: .6; }
.phero.has-img .crumb, .phero.has-img .crumb a { color: rgba(255, 255, 255, .8); }

/* ============================================================
   五、筛选条（栏目页 / 产品页）
   ============================================================ */
.filter { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 28px; }
.filter button {
  padding: 7px 18px; border-radius: 999px;
  font-size: 14px; color: var(--ink-2);
  background: var(--card); border: 1px solid var(--hairline);
  transition: all .18s ease;
}
.filter button:hover { border-color: var(--rock-l); color: var(--rock); }
.filter button.on { background: var(--rock); border-color: var(--rock); color: #fff; }

/* ============================================================
   六、分页
   ------------------------------------------------------------
   ⚠️ 页码是 <button> 而不是 <a href="?page=2">：
      本站列表是 fetch 渲染的，用 <a> 会整页刷新，
      筛选条的选中状态会丢。翻页同时用 history.replaceState
      把 page 写进地址栏（见 js/list.js），既不刷新又能分享。
   ============================================================ */
.pager { margin-top: 40px; display: flex; justify-content: center; align-items: center; gap: 8px; }
.pager button {
  min-width: 38px; height: 38px; padding: 0 12px;
  border-radius: var(--r-s); font-size: 14px;
  background: var(--card); border: 1px solid var(--hairline); color: var(--ink-2);
  transition: all .16s ease;
}
.pager button:hover:not(:disabled) { border-color: var(--rock-l); color: var(--rock); }
.pager button.on { background: var(--rock); border-color: var(--rock); color: #fff; }
.pager button:disabled { opacity: .38; cursor: not-allowed; }
.pager .info { margin-left: 10px; font-size: 13px; color: var(--ink-4); }

/* ============================================================
   七、富文本正文
   ------------------------------------------------------------
   服务端 RT.toOutput() 已经把标签过白名单、把图片 key 换成
   完整地址。这里只管排版。
   ⚠️ 必须给 img 设 max-width:100%：运营从 Word 里粘贴的图片
      常带 width="1200" 属性，不限制会把手机端页面撑横。
   ============================================================ */
.rt { font-size: 15.5px; line-height: 1.95; color: var(--ink-2); }
.rt > * + * { margin-top: 1.1em; }
.rt h2 { font-size: 21px; color: var(--ink); margin-top: 1.8em; }
.rt h3 { font-size: 18px; color: var(--ink); margin-top: 1.6em; }
.rt p { text-align: justify; }
.rt img {
  max-width: 100%; height: auto;
  border-radius: var(--r-m); box-shadow: var(--sh-s);
  margin: 1.4em auto;
}
.rt a { color: var(--rock); border-bottom: 1px solid var(--rock-l); }
.rt blockquote {
  margin: 1.4em 0; padding: 14px 20px;
  background: var(--paper-2); border-left: 3px solid var(--gold-l);
  border-radius: 0 var(--r-m) var(--r-m) 0;
  color: var(--ink-2); font-size: 15px;
}
.rt ul, .rt ol { padding-left: 1.4em; }
.rt ul li { list-style: disc; }
.rt ol li { list-style: decimal; }
.rt li + li { margin-top: .5em; }
.rt table { width: 100%; border-collapse: collapse; font-size: 14px; }
.rt th, .rt td { padding: 10px 12px; border: 1px solid var(--hairline); }
.rt th { background: var(--paper-2); font-weight: 600; }
/* ⚠️ 表格在手机上必须能横向滚动，否则宽表会撑破布局。
   JS 会给 .rt table 包一层 .rt-scroll（见 js/render.js）。 */
.rt-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; }

/* 「内容整理中」——
   ⚠️ 这是一个**有意可见**的待办态，不是错误。
      样式上做得体面一点，但绝不能伪装成正文。 */
.rt-empty {
  padding: 48px 24px; text-align: center;
  background: var(--paper-2); border-radius: var(--r-l);
  color: var(--ink-3);
}
.rt-empty .ico { font-size: 26px; opacity: .45; }
.rt-empty p { margin-top: 10px; font-size: 14px; }

/* ============================================================
   八、小程序引流
   ------------------------------------------------------------
   这是官网存在的主要转化目标之一。三处出现：
     ① 首页独立一节（大二维码）
     ② 产品详情页侧栏
     ③ 右下角浮层（滚动一屏后出现）
   ⚠️ 网页**无法**直接唤起小程序页面（除非在微信内且用开放标签），
      所以入口永远是「扫码」。不要写「点击进入小程序」——
      那个按钮在浏览器里点了没反应，是纯粹的用户欺骗。
   ============================================================ */
.qr-sec {
  background:
    radial-gradient(700px 260px at 80% 0%, var(--wt-wash), transparent 70%),
    var(--paper-2);
}
.qr-box {
  display: flex; align-items: center; gap: 44px;
  padding: 40px 44px;
  background: var(--card);
  border-radius: var(--r-xl);
  border: 1px solid var(--hairline-2); box-shadow: var(--sh-s);
}
.qr-box .pic {
  flex: none; width: 176px; height: 176px; padding: 10px;
  background: #fff; border-radius: var(--r-m); box-shadow: var(--sh-s);
}
.qr-box .pic img { width: 100%; height: 100%; object-fit: contain; }
.qr-box .ct h3 { font-size: 22px; }
.qr-box .ct p { margin-top: 12px; font-size: 14.5px; color: var(--ink-3); }
.qr-box .ct ul { margin-top: 16px; display: flex; flex-wrap: wrap; gap: 10px 22px; }
.qr-box .ct li { font-size: 13.5px; color: var(--ink-2); display: flex; align-items: center; gap: 7px; }
.qr-box .ct li::before {
  content: ''; width: 5px; height: 5px; border-radius: 50%; background: var(--gold);
}

/* 二维码没上传时的替代块。
   ⚠️ 绝不渲染 <img src="">：那会得到一个裂图图标，
      访客会以为整站的图都坏了（服务端 qrReady 字段就是为这个）。 */
.qr-box .pic.none {
  display: flex; align-items: center; justify-content: center;
  background: var(--paper-2); box-shadow: none;
  border: 1px dashed var(--hairline);
  color: var(--ink-4); font-size: 12px; text-align: center; line-height: 1.7;
  padding: 18px;
}

/* 右下角浮层 */
.qr-float {
  position: fixed; right: 22px; bottom: 22px; z-index: 50;
  display: flex; flex-direction: column; align-items: center; gap: 8px;
  padding: 12px; width: 132px;
  background: var(--card); border: 1px solid var(--hairline-2);
  border-radius: var(--r-l); box-shadow: var(--sh-l);
  opacity: 0; transform: translateY(14px); pointer-events: none;
  transition: opacity .3s ease, transform .3s ease;
}
.qr-float.on { opacity: 1; transform: translateY(0); pointer-events: auto; }
.qr-float img { width: 106px; height: 106px; object-fit: contain; background: #fff; border-radius: var(--r-s); }
.qr-float .cap { font-size: 11.5px; color: var(--ink-3); text-align: center; line-height: 1.55; }
.qr-float .x {
  position: absolute; right: 4px; top: 4px;
  width: 22px; height: 22px; border-radius: 50%;
  color: var(--ink-4); font-size: 15px; line-height: 1;
  display: flex; align-items: center; justify-content: center;
}
.qr-float .x:hover { background: var(--paper-2); color: var(--ink-2); }

/* ---- 专属码弹层（地块卡片的「扫码查看与认养」）----
   ⚠️ 这是全站唯一一个弹层。刻意做得很小：一个遮罩 + 一个白框，
      没有动画队列、没有多层堆叠、没有 focus trap 库。
      理由与整站一致 —— 零构建、无依赖（见 README）。
      需要 focus trap 的场景是「弹层里有表单」，这里只有一张图。 */
.mpq-btn {
  margin-top: 14px; width: 100%;
  padding: 11px 14px;
  font-size: 13.5px; font-weight: 600;
  color: var(--wt-d); background: var(--wt-wash);
  border: 1px solid var(--wt-l); border-radius: var(--r-s);
  transition: background .18s ease, color .18s ease;
}
.mpq-btn:hover { background: var(--wt-l); color: #fff; }
/* ⚠️ 必须留可见的键盘焦点圈。按钮的 outline 被 base.css 的
   reset 去掉了，不补这一条，键盘用户在 12 张卡片之间 Tab
   时完全看不出焦点在哪。 */
.mpq-btn:focus-visible { outline: 2px solid var(--wt-l); outline-offset: 2px; }

.mpq-mask {
  position: fixed; inset: 0; z-index: 80;
  display: flex; align-items: center; justify-content: center;
  padding: 24px;
  background: rgba(20, 26, 22, .58);
  /* ⚠️ 不用 backdrop-filter：在低端安卓机上它会让整层掉到
     软件渲染，弹出时肉眼可见地卡一下。 */
}
.mpq-box {
  position: relative;
  width: 100%; max-width: 340px;
  padding: 30px 26px 24px;
  background: var(--card); border-radius: var(--r-xl);
  box-shadow: var(--sh-l); text-align: center;
}
.mpq-box h3 { font-size: 18px; line-height: 1.5; }
.mpq-box .sub {
  margin-top: 5px; font-size: 12px; color: var(--ink-4);
  font-family: var(--f-num); letter-spacing: .08em;
}
.mpq-box .pic {
  margin: 18px auto 0; width: 200px; height: 200px;
  display: flex; align-items: center; justify-content: center;
  background: #fff; border-radius: var(--r-m);
  border: 1px solid var(--hairline-2); padding: 8px;
}
.mpq-box .pic img { width: 100%; height: 100%; object-fit: contain; }
/* 加载中 / 无码时的文字。
   ⚠️ 与 .qr-box .pic.none 同一处置：绝不渲染 <img src="">。 */
.mpq-box .pic .ld {
  font-size: 12.5px; color: var(--ink-4); line-height: 1.75; padding: 10px;
}
.mpq-box .tip {
  margin-top: 14px; font-size: 12.5px; color: var(--ink-3); line-height: 1.7;
}
.mpq-box .x {
  position: absolute; right: 10px; top: 10px;
  width: 30px; height: 30px; border-radius: 50%;
  color: var(--ink-4); font-size: 19px; line-height: 1;
  display: flex; align-items: center; justify-content: center;
}
.mpq-box .x:hover { background: var(--paper-2); color: var(--ink-2); }

/* ============================================================
   九、关于我们（首页那一节）
   ============================================================ */
.about-split { display: grid; grid-template-columns: 1.05fr .95fr; gap: 48px; align-items: center; }
.about-split .pic {
  border-radius: var(--r-xl); overflow: hidden; box-shadow: var(--sh-m);
  position: relative; padding-top: 68%;
}
.about-split .pic img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.about-split .pic.none {
  background:
    radial-gradient(500px 200px at 30% 0%, var(--gold-wash), transparent 70%),
    linear-gradient(140deg, var(--paper-2), var(--paper-3));
  box-shadow: var(--sh-s);
}
.about-split .txt h2 { font-size: 27px; letter-spacing: .04em; }
.about-split .txt .st { margin-top: 8px; font-size: 14px; color: var(--gold); letter-spacing: .14em; }
.about-split .txt p { margin-top: 18px; font-size: 15px; color: var(--ink-2); line-height: 1.95; text-align: justify; }
.about-split .txt .btn { margin-top: 26px; }

/* 数字指标条 */
.stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px; margin-top: 36px; }
.stats li { text-align: center; padding: 20px 10px; background: var(--card); border-radius: var(--r-l); border: 1px solid var(--hairline-2); }
.stats .n {
  font-family: var(--f-num); font-variant-numeric: tabular-nums;
  font-size: 28px; font-weight: 700; color: var(--rock); letter-spacing: .02em;
}
/* 单位字（大 / 道 / 两季）是中文，跟着数字用衬线会显得很怪 —— 退回黑体。 */
.stats .n small {
  font-family: var(--f-body);
  font-size: 13px; font-weight: 400; margin-left: 3px;
}
.stats .l { margin-top: 6px; font-size: 12.5px; color: var(--ink-3); }

/* ============================================================
   十、联系我们
   ============================================================ */
.contact-split { display: grid; grid-template-columns: .95fr 1.05fr; gap: 44px; align-items: start; }
.info-list li {
  display: flex; gap: 14px; padding: 16px 0;
  border-bottom: 1px dashed var(--hairline);
}
.info-list .k { flex: none; width: 74px; font-size: 13.5px; color: var(--ink-4); }
.info-list .v { font-size: 15px; color: var(--ink); line-height: 1.7; word-break: break-all; }
/* 电话做成可点的 tel: 链接 —— 手机访客点一下就能拨。 */
.info-list .v a { color: var(--rock); }

/* 表单 */
.form { background: var(--card); border: 1px solid var(--hairline-2); border-radius: var(--r-xl); padding: 30px; }
.fitem { margin-bottom: 18px; }
.fitem label { display: block; font-size: 13.5px; color: var(--ink-2); margin-bottom: 7px; }
.fitem label .req { color: var(--seal); margin-left: 3px; }
.fitem input, .fitem textarea, .fitem select {
  width: 100%; padding: 11px 14px;
  background: var(--paper); border: 1px solid var(--hairline); border-radius: var(--r-m);
  font-size: 15px; transition: border-color .18s ease, background .18s ease;
}
.fitem textarea { min-height: 118px; resize: vertical; line-height: 1.7; }
.fitem input:focus, .fitem textarea:focus, .fitem select:focus {
  border-color: var(--rock-l); background: #fff; outline: none;
}
/* 校验失败态。
   ⚠️ 不能只靠红框表达错误：色盲用户看不出来。
      必须同时显示 .err 文字（见 js/contact.js）。 */
.fitem.bad input, .fitem.bad textarea { border-color: var(--seal); background: var(--seal-wash); }
.fitem .err { display: none; margin-top: 6px; font-size: 12.5px; color: var(--seal); }
.fitem.bad .err { display: block; }
.form .tip { margin-top: 14px; font-size: 12.5px; color: var(--ink-4); line-height: 1.7; }
.form-msg { margin-top: 16px; padding: 12px 16px; border-radius: var(--r-m); font-size: 14px; display: none; }
.form-msg.ok { display: block; background: var(--wt-wash); color: var(--wt-d); }
.form-msg.bad { display: block; background: var(--seal-wash); color: var(--seal); }

/* 表单关闭时的提示（后台可关掉留言） */
.form-off {
  padding: 34px 24px; text-align: center;
  background: var(--paper-2); border-radius: var(--r-xl); color: var(--ink-3);
}

/* ============================================================
   十一、详情页
   ============================================================ */
.detail { max-width: 820px; margin: 0 auto; }
.detail .head { text-align: center; padding-bottom: 26px; border-bottom: 1px solid var(--hairline); }
.detail .head h1 { font-size: 28px; line-height: 1.45; }
.detail .head .meta { margin-top: 14px; font-size: 13px; color: var(--ink-4); display: flex; justify-content: center; gap: 18px; flex-wrap: wrap; }
.detail .rt { margin-top: 32px; }

/* 上下篇 */
.pn { margin-top: 44px; padding-top: 24px; border-top: 1px solid var(--hairline); display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
.pn a, .pn span {
  display: block; padding: 16px 18px;
  background: var(--card); border: 1px solid var(--hairline-2); border-radius: var(--r-m);
  font-size: 14px; transition: border-color .18s ease;
}
.pn a:hover { border-color: var(--rock-l); }
.pn .k { font-size: 12px; color: var(--ink-4); margin-bottom: 5px; }
.pn .t { color: var(--ink); }
/* 没有上/下篇时是一个灰色的 <span>，不是隐藏。
   ⚠️ 隐藏会让剩下的那一个占满整行、位置左右乱跳；
      而且访客会以为「另一边还在加载」。 */
.pn span { opacity: .55; }
.pn span .t { color: var(--ink-3); }
.pn .next { text-align: right; }

/* 产品详情：左图右信息 */
.pdetail { display: grid; grid-template-columns: 1fr 1fr; gap: 48px; align-items: start; }
.pdetail .pic { border-radius: var(--r-xl); overflow: hidden; background: var(--paper-3); position: relative; padding-top: 100%; }
.pdetail .pic img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.pdetail .side h1 { font-size: 29px; }
.pdetail .side .sub { margin-top: 10px; font-size: 15px; color: var(--ink-3); }
.pdetail .side .rows { margin-top: 24px; }
.pdetail .side .rows li { display: flex; gap: 14px; padding: 12px 0; border-bottom: 1px dashed var(--hairline); font-size: 14.5px; }
.pdetail .side .rows .k { flex: none; width: 68px; color: var(--ink-4); }

/* ============================================================
   十二、页脚
   ============================================================ */
/* ⚠️ 底色是**暖墨渐变**，不是平铺的 #201D19；文字是暖白 #F6F1E8
      的透明档，不是 rgba(255,255,255,...)。
   小程序里唯一的深色块（秒杀条 .flash / 品线卡 .lc）用的是
   linear-gradient(152deg,#2A2621,#1C1915) + #F6F1E8 文字。
   官网原先用纯黑灰 + 纯白：并排看时官网页脚偏冷、发蓝，
   小程序的深色块偏褐 —— 同一个品牌出现两种「黑」。
   角度也沿用 152deg，保持光从左上来的一致感。 */
.site-foot {
  margin-top: 0;
  background: linear-gradient(152deg, #2A2621, #1C1915);
  color: rgba(246, 241, 232, .72);
}
.site-foot .top { padding: 52px 0 36px; display: grid; grid-template-columns: 1.4fr 1fr 1fr 1.2fr; gap: 36px; }
.site-foot h4 { font-size: 14px; color: #F6F1E8; margin-bottom: 16px; letter-spacing: .1em; }
.site-foot a { color: rgba(246, 241, 232, .68); font-size: 13.5px; line-height: 2.1; }
.site-foot a:hover { color: var(--gold-l); }
.site-foot .fb .zh {
  font-family: var(--f-display);
  font-size: 19px; font-weight: 700; color: #F6F1E8; letter-spacing: .12em;
}
.site-foot .fb .en {
  font-family: var(--f-num);
  margin-top: 6px; font-size: 10px; letter-spacing: .26em;
  /* 深底上的 --gold(#A8862F) 对比度只有约 2.6:1，换用亮一档的 --gold-l。 */
  color: var(--gold-l); text-transform: uppercase;
}
.site-foot .fb p { margin-top: 14px; font-size: 13px; line-height: 1.9; max-width: 300px; }
.site-foot .fqr { display: flex; gap: 16px; }
.site-foot .fqr .q { text-align: center; }
.site-foot .fqr img { width: 92px; height: 92px; background: #fff; padding: 5px; border-radius: var(--r-s); }
.site-foot .fqr .cap { margin-top: 7px; font-size: 11.5px; }
.site-foot .bot {
  padding: 18px 0; border-top: 1px solid rgba(246, 241, 232, .12);
  font-size: 12.5px; display: flex; flex-wrap: wrap; gap: 8px 20px;
  align-items: center; justify-content: center; text-align: center;
}
/* 备案号必须能点到工信部。
   ⚠️ 这是合规要求，不是装饰。链接缺失在年检时会被要求整改。 */
.site-foot .bot a { font-size: 12.5px; }

/* ============================================================
   十三、滚动淡入
   ------------------------------------------------------------
   ⚠️ 初始状态是 opacity:0，靠 JS 加 .in 显示。
      所以**必须**保证 JS 出错时也能看到内容 ——
      js/site.js 里 IntersectionObserver 不可用时会
      直接给所有 .fx 加 .in（见该文件）。
      不做这个兜底的后果是「JS 一炸整站白屏」。
   ============================================================ */
.fx { opacity: 0; transform: translateY(18px); transition: opacity .7s ease, transform .7s ease; }
.fx.in { opacity: 1; transform: none; }

/* ============================================================
   响应式
   ============================================================ */
/* ------------------------------------------------------------
   1180px：页头收紧
   ------------------------------------------------------------
   ⚠️ 这一档不是「为了好看」，是修一个真实的塌版：窄屏时
      导航作为 flex 项被压缩到内容宽度以下，而中文没有空格，
      压缩的结果是标签折行 —— 做法是**把这一行真的做窄**：
      去掉英文副标、缩小字号与内边距，让 595 → 550。

   ⚠️ 2026-08 修正（加「一亩茶园」这一轮）：这段注释原先写的
      「品牌名 390 + 导航 571 + 按钮 92 ≈ 1181px，所以断点取 1180」
      **推理方向是错的**，虽然结论数字恰好能用。
      真实情况是 .in 有 max-width: var(--wrap) = 1200px，
      所以留给导航的宽度**在 1200px 以上完全不变**（实测恒为 612）：
      屏幕再宽也不会多一个像素。塌版与视口宽度无关，
      只取决于「导航自然宽 vs 612」这一个不等式。
      按原来的写法去理解，会以为 1440 桌面天然安全 —— 而实测
      1440 上 8 个栏目正在折行。断点值不是这里的关键，预算才是。
      预算的公式与余量写在文件上方 .nav-list 那一段。

   ⚠️ 为什么这一档不能靠继续缩字号解决 ≤1024 的溢出：
      收紧后导航自然宽 550，而可用宽 = vw - 32 - 216(品牌)
      - 92(按钮) - 32(gap)，在 vw=906 时只剩 534 —— 已经不够。
      再缩到 12px/4px 也要 412px，到 769px 仍然溢出。
      **窄屏放不下 8 个中文栏目，这是算术，不是调参。**
      所以 ≤1024 直接切抽屉（见下一档），不再有「收紧但仍横排」
      的中间态。
   ------------------------------------------------------------ */
@media (max-width: 1180px) {
  .site-nav .in { gap: 16px; padding: 0 16px; }
  .brand .en { display: none; }
  .brand .zh { font-size: 17px; letter-spacing: .06em; }
  /* nowrap 已提到基础样式里（那里才是真正的兜底位置）。 */
  .nav-list a { padding: 0 9px; font-size: 14px; }
}

@media (max-width: 1024px) {
  /* ------------------------------------------------------------
     ≤1024px：一级导航收进抽屉
     ------------------------------------------------------------
     ⚠️ 这一档原先是 ≤768px 才切汉堡，769–1024 保留横排导航。
        那是个**真实的横向滚动条**：收紧后的导航自然宽 550，
        而 vw=900 时可用宽只有 528 —— 实测 document.scrollWidth
        恒为 906，比视口宽，整站可以左右拖动。
        7 个栏目时这个坏点在 ≤832px 才出现（也已经是坏的，
        只是更窄、更容易被当成「手机上本来就这样」）；
        加到 8 个栏目后边界升到 905px，正好盖住 iPad 竖屏
        （820 / 834）这个真实机型区间，于是必须处理。

     ⚠️ 原注释说「769–1180 是 iPad 横屏的主力区间，藏起导航
        反而降低可用性」—— iPad 横屏其实是 **1024×768**，
        落在这一档的边界上而不是里面；真正落在 769–1024 的是
        iPad **竖屏**。按错误的机型判断保留横排，换来的是
        竖屏 iPad 上一条横向滚动条。

     ⚠️ 抽屉的起始位置与页头高度是**一组耦合值**，而两者的断点
        不再重合：这一档页头仍是 72px（--nav-h），只有 ≤768px
        才收成 56px（--nav-h-m），而 .drawer 的 inset 原先写死
        var(--nav-h-m)。于是 769–1024 这一档里抽屉顶边会比页头
        底边高 16px，抽屉盖住页头下沿 —— 那 16px 正好压着
        汉堡按钮的下半截，点上去命中的是抽屉遮罩而不是按钮。
        所以这里改成 var(--nav-h)，并在 ≤768px 那一档改回
        var(--nav-h-m)（见下面）。
        ⚠️ 顺序不能反：≤768 的规则必须写在 ≤1024 之后，
           否则同等特异度下后者覆盖前者，手机端又会差 16px。
     ------------------------------------------------------------ */
  .nav-list, .nav-cta { display: none; }
  .burger { display: flex; }
  .drawer { inset: var(--nav-h) 0 0 0; }

  .hero-track { height: 420px; }
  .hero-item .txt h2 { font-size: 30px; }
  .hero-item .txt { bottom: 64px; }
  .about-split, .contact-split, .pdetail { grid-template-columns: 1fr; gap: 30px; }
  /* 页脚 4 列 → 2 列。
     ⚠️ 导航被拆成了两个 grid 项（为了桌面端并排两列）。
        在 2 列布局里它们会分别落到**不同的行、不同的列**：
        第一半在右列，第二半绕到下一行的**左列**（跑到品牌信息底下），
        看起来就是「网站导航只有 3 项，另外 3 项莫名挂在左边」。
     ⚠️ 所以这一档必须显式指定格位：把第二半钉在右列的下一行，
        紧接第一半；再隐藏对齐用的空标题、抵掉行间距，
        让 6 个链接重新变成一条连续的列表。
        （只靠 margin-top 负值是治不了的 —— 那只改行距，不改列。） */
  .site-foot .top { grid-template-columns: 1fr 1fr; }
  .site-foot .top > .fnav1 { grid-column: 2; grid-row: 1; }
  .site-foot .top > .fnav2 { grid-column: 2; grid-row: 2; margin-top: -36px; }
  /* 导航钉到右列两行之后，「关注我们」必须显式回到左列第二行，
     否则它会被挤到第三行、在品牌信息下方留一大片空白。 */
  .site-foot .top > .ffollow { grid-column: 1; grid-row: 2; }
  .site-foot h4.sp { display: none; }
  .stats { grid-template-columns: repeat(2, 1fr); }
  .qr-box { gap: 30px; padding: 30px; }
}

@media (max-width: 768px) {
  .site-nav { height: var(--nav-h-m); }
  .site-nav .in { padding: 0 16px; gap: 14px; }
  /* 导航与页头按钮的隐藏已提到 ≤1024 那一档，这里不再重复。
     ⚠️ 但抽屉的起始位置必须在这里改回 --nav-h-m：页头这一档
        收成 56px，而 ≤1024 把 inset 设成了 72px。
        不改的话抽屉顶边比页头底边低 16px，页头下方露出一条
        16px 的首屏内容，抽屉看起来「没盖严」。 */
  .drawer { inset: var(--nav-h-m) 0 0 0; }
  .brand .zh { font-size: 17px; letter-spacing: .08em; }
  .brand .en { display: none; }

  .hero-track { height: 300px; }
  .hero-item .txt { bottom: 44px; padding: 0 16px; }
  .hero-item .txt h2 { font-size: 22px; }
  .hero-item .txt p { margin-top: 8px; font-size: 13.5px; }
  .hero-item .txt .btn { margin-top: 16px; }
  .hero-fallback { height: 330px; }
  .hero-fallback h2 { font-size: 25px; }
  .hero-dots { bottom: 16px; }

  .phero { padding: 34px 0 30px; }
  .phero h1 { font-size: 23px; }
  .phero .sub { margin-top: 8px; font-size: 13.5px; }

  /* 横排文章行改上下堆叠 */
  .arow { flex-direction: column; padding: 14px; gap: 14px; }
  .arow .pic { width: 100%; padding-top: 56%; min-height: 0; }
  .arow .t { font-size: 16px; }

  .card .body { padding: 14px 16px 16px; }
  .detail .head h1 { font-size: 21px; }
  .detail .rt { margin-top: 24px; }
  .rt { font-size: 15px; }
  /* 上下篇在手机上一列，且「下一篇」不再右对齐 */
  .pn { grid-template-columns: 1fr; }
  .pn .next { text-align: left; }

  /* 产品详情右侧栏 */
  .pdetail .side h1 { font-size: 22px; }
  .pdetail .side .sub { margin-top: 8px; font-size: 14px; }
  .pdetail .side .rows li { font-size: 14px; padding: 10px 0; }

  /* 筛选条：手机上按钮缩小一档并允许横向排满换行。
     ⚠️ 不要改成横向滚动条 —— 茶文化有 5 个标签，
        滚动容器会把第 4、5 个藏在屏幕外，访客不知道还有。 */
  .filter { gap: 8px; margin-bottom: 20px; }
  .filter button { height: 32px; padding: 0 13px; font-size: 13px; }

  /* 分页条：一行放不下 7 个按钮（375 宽）。
     ⚠️ 允许换行而不是缩小按钮 —— 点击目标小于 32px
        在手机上很难点准。「共 N 条」单独一行。 */
  .pager { flex-wrap: wrap; gap: 6px; margin-top: 28px; }
  .pager button { min-width: 36px; height: 36px; padding: 0 10px; font-size: 13px; }
  .pager .info { width: 100%; margin: 6px 0 0; text-align: center; }

  /* 联系页信息清单：标签列在窄屏上占太宽 */
  .info-list .k { width: 56px; font-size: 13px; }
  .info-list .v { font-size: 14.5px; }

  /* 地块卡片：手机上是一列，卡片本来就宽，权益放全都不挤。
     ⚠️ 但仍然只放 3 条 —— 那是 render.js 里定的（slice(0,3)），
        CSS 改不了也不该改。这里只收紧内边距与字号。 */
  .plotcard .name { font-size: 16px; }
  .plotcard .facts { font-size: 12px; }
  /* 说明条：左边那条 3px 竖线在窄屏上和圆角叠在一起会显脏。 */
  .plot-note { padding: 16px 16px; font-size: 13px; }
  .plot-note .steps { gap: 6px 5px; }
  .plot-note .steps span { padding: 3px 10px; font-size: 12px; }

  .qr-box { flex-direction: column; text-align: center; padding: 26px 20px; }
  .qr-box .ct ul { justify-content: center; }
  /* ⚠️ 浮层在手机上直接不显示：屏幕小，它会压住正文；
     而且手机用户没法用另一台设备扫自己屏幕上的码 ——
     首页那一节的大二维码可以长按识别，浮层的太小。 */
  .qr-float { display: none; }

  .form { padding: 20px 16px; }
  .stats { grid-template-columns: repeat(2, 1fr); gap: 12px; }
  .stats .n { font-size: 22px; }

  .site-foot .top { grid-template-columns: 1fr; gap: 26px; padding: 34px 0 26px; }
  /* ⚠️ 必须把上一档（≤1024px）钉死的格位**还原成自动流**：
     单列布局里再指定 grid-column: 2 会造出一个不存在的第二列，
     表现是页脚右侧空出一整片、链接挤在左边一条。
     占位标题的 display:none 继承上一档，不用重复。
     间距按单列的 gap（26px）重算 —— 这两个数是一组耦合值，
     改 .site-foot .top 的 gap 必须同时改这里。 */
  .site-foot .top > .fnav1,
  .site-foot .top > .fnav2,
  .site-foot .top > .ffollow { grid-column: auto; grid-row: auto; }
  .site-foot .top > .fnav2 { margin-top: -26px; }
  .site-foot .fb p { max-width: none; }
  .site-foot .bot { padding: 16px 0; line-height: 1.9; }
}
