/* ============================================================
   炸猪 ZZHU-ZHAZHU 官网 · 全站样式（设计令牌 + 组件 + 页面）
   ------------------------------------------------------------
   改配色/字号只改下面 :root 一处，四个页面一起生效。
   令牌 2026-09-03 起换成「粉紫霓虹」方向（主人按设计稿拍板），琥珀原型作废。
   ★色值不是配出来的，是从主人的两张设计稿上【量】出来的★
   （_设计稿/board-a.jpg 暗版 / board-b.jpg 亮版，取色脚本只扫左侧 UI 区、避开那个 3D Z，
     因为 Z 是渲染图、满是渐变高光，它的颜色不代表 UI 该用什么色）。
   稿子实测：暗版底 #181828、强调 #E375AA；亮版底 #F8F8F8、强调 #843B94 / #A4397C。
   下面每条注释里的对比度都是实跑出来的（palette-check），不是手算 —— 改色时请重跑再改注释。
   ============================================================ */

:root{
  color-scheme:dark;
  /* —— 面：深紫灰。比稿子的 #181828 再压深半档做页面底，卡片才浮得起来 —— */
  --ground:#14141E;
  --ground-2:#191926;
  --surface:#1C1C2B;
  --surface-2:#25253A;
  --line:#2E2E45;        /* 装饰性分隔线（表格行、区块之间），不是控件边界 */
  --line-soft:#232335;
  --line-strong:#3D3D5A; /* 卡片 hover 边 */
  /* 交互控件的边框单独一个令牌：WCAG 1.4.11 要求 3:1；装饰性的 --line 不受此约束 */
  --line-ui:#707094;     /* on --ground 3.86:1，on 卡片 3.55:1（WCAG 1.4.11 要 ≥3） */

  /* —— 文字：三级灰阶 —— */
  --ink:#F5F5FA;
  --ink-dim:#AEAEC6;      /* 正文次级：on 底 8.42:1 / on 卡片 7.73:1 / on hover 6.89:1 */
  --ink-faint:#9494AE;    /* 标签脚注：on 底 6.19:1 / on 卡片 5.68:1 / on hover 5.06:1 */

  /* —— 强调：品红→紫渐变；青色只做光环，永不当文字色 —— */
  --accent:#E86FC4;       /* 图形用：描边 / 光环 / 色块混合。对齐稿子的 #E375AA，比原来那版粉色更柔 */
  --accent-ink:#E86FC4;   /* 文字与图标：on 底 6.53:1 / on 卡片 6.00:1（亮色主题另配深一档） */
  --accent-a:#C2459E;     /* 渐变亮端：白字压上去 4.53:1 —— 只比 4.5 高一点点，再调亮就过不了 */
  --accent-b:#7A3BA8;     /* 渐变暗端：对齐稿子的 #753CA2 */
  --on-accent:#FFFFFF;    /* 压在强调色/渐变上的文字 */
  --accent-hover:#D95FB6;
  --accent-line:#4A2352;  /* 暗淡强调描边：tag.ok / kind.new / glyph hover */
  --cyan:#22D3EE;
  --live:#3ECF8E;
  --warn:#E8734A;
  --hi:#FFFFFF;         /* 纯高光：棱边反光、发光环的亮部。两个主题下都是白的 */
  --z-deep:#2A0B2E;     /* Z 字标的厚度色，比主体暗两档，做出体积 */

  /* —— 形：圆角 / 阴影 / 发光 / 渐变 —— */
  --r-sm:8px; --r-md:12px; --r-lg:18px; --r-pill:999px;
  --shadow-sm:0 1px 2px rgba(0,0,0,.35);
  --shadow-lg:0 30px 70px -24px rgba(0,0,0,.65);
  --shadow-edge:rgba(0,0,0,.5);
  /* 首屏流光扫过 Z 时的那道高光。暗色主题下 Z 是发亮的，用白光提亮；
     亮色主题下 Z 是深色的，白光看不见，所以那边换成压暗的一道（见 light 块）。
     ★这个值必须是令牌★：它是"随主题变的颜色"，写死会被自检 A7 拦（09-04 实际被拦过一次）。 */
  --sheen:rgba(255,255,255,.5);
  --glow-accent:0 0 24px color-mix(in srgb,var(--accent) 45%,transparent);
  --glow-cyan:0 0 90px color-mix(in srgb,var(--cyan) 35%,transparent);
  --grad-accent:linear-gradient(135deg,var(--accent-a) 0%,var(--accent-b) 100%);
  --grad-halo:radial-gradient(closest-side,color-mix(in srgb,var(--cyan) 28%,transparent),transparent 72%);

  /* —— 字体：先给默认值，主人在预览里逐条调；只改这三处 —— */
  --display:"Manrope","Noto Sans SC","PingFang SC","Microsoft YaHei",sans-serif;
  --body:"Manrope","Noto Sans SC","PingFang SC","Microsoft YaHei",system-ui,sans-serif;
  --mono:"JetBrains Mono",ui-monospace,"SFMono-Regular",Consolas,monospace;

  --gutter:clamp(20px,5vw,72px);
  --maxw:1320px;
}

/* —— 亮色主题：只重定义颜色类令牌；圆角/字体/渐变公式沿用 :root。
   令牌名集合必须与 :root 的颜色令牌一致（check-astro 第 11 节 A3 会比对，漏一个 = 亮色下漏出深色残片）—— */
[data-theme="light"]{
  color-scheme:light;
  --ground:#F6F6F8;
  --ground-2:#EDEDF2;
  --surface:#FFFFFF;
  --surface-2:#F2F2F7;
  --line:#E2E2E9;
  --line-soft:#ECECF1;
  --line-strong:#D0D0DC;
  --line-ui:#82829C;      /* on 底 3.46:1 / on 白卡 3.74:1 */
  --ink:#141420;
  --ink-dim:#575770;      /* on 底 6.48:1 / on 白卡 6.99:1 */
  --ink-faint:#616178;    /* on 底 5.58:1 / on 白卡 6.02:1 */
  --accent:#C2459E;       /* 亮底上对比度不够当文字，只做图形（描边/光环） */
  --accent-ink:#8E3A9E;   /* on 底 5.99:1 / on 白卡 6.46:1。对齐稿子的 #843B94（比原来那版更紫） */
  --accent-a:#A63C86;
  --accent-b:#6D3095;
  --on-accent:#FFFFFF;
  --accent-hover:#7C3189;
  --accent-line:#EBC9E8;
  --cyan:#22D3EE;
  --live:#1B8F5E;         /* on 底 3.79:1 */
  --warn:#C2410C;
  --hi:#FFFFFF;
  --z-deep:#D9CFEC;     /* 亮底上厚度是淡紫灰，不能用深色否则像脏了一块 */
  --shadow-sm:0 1px 2px rgba(20,20,31,.08);
  --shadow-lg:0 30px 70px -24px rgba(20,20,31,.20);
  --shadow-edge:rgba(20,20,31,.18);
  --sheen:rgba(0,0,0,.22);
  --glow-accent:0 0 24px color-mix(in srgb,var(--accent) 22%,transparent);
  --glow-cyan:0 0 90px color-mix(in srgb,var(--cyan) 22%,transparent);
}

*,*::before,*::after{box-sizing:border-box}
html{scroll-behavior:smooth}
body{
  margin:0;
  background:var(--ground);
  color:var(--ink);
  font-family:var(--body);
  font-size:16px;
  line-height:1.6;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}
a{color:inherit;text-decoration:none}
img{max-width:100%;height:auto}
:focus-visible{outline:2px solid var(--accent-ink);outline-offset:3px;border-radius:6px}

.wrap{max-width:var(--maxw);margin:0 auto;padding-inline:var(--gutter)}
.skip{
  position:absolute;left:-9999px;top:0;z-index:100;
  background:var(--accent-a);color:var(--on-accent);padding:10px 18px;
  font-family:var(--mono);font-size:13px;
}
.skip:focus{left:12px;top:10px}

/* 只给读屏软件念，视觉上不占位 */
.sr-only{
  position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;
}

/* 能横滚的容器要能拿到键盘焦点，否则键盘用户滚不动它 */
.matrix-scroll:focus-visible{outline:2px solid var(--accent-ink);outline-offset:-2px}

.label{
  font-family:var(--mono);
  font-size:11px;
  letter-spacing:.18em;
  text-transform:uppercase;
  color:var(--ink-faint);
}

/* ============================================================
   导航（全站共用）
   ============================================================ */
header{
  position:sticky;top:0;z-index:50;
  background:color-mix(in srgb,var(--ground) 88%,transparent);
  backdrop-filter:blur(14px) saturate(140%);
  border-bottom:1px solid var(--line-soft);
}
.nav{display:flex;align-items:center;gap:clamp(14px,2.6vw,36px);height:62px}
.brand{display:flex;align-items:center;gap:10px;font-family:var(--display);font-weight:800;letter-spacing:-.01em;font-size:17px;flex:none}
/* 顶栏 logo（2026-09-08 起是位图徽章，不再是矢量 Z）。
   源图是主人给的 2048 原图，裁切 + 圆角 + 各档尺寸都由 tools/brand-tile.ps1 一次生成，
   顶栏 / 浏览器标签图标 / 分享大图共用同一套产物（check-astro A18 盯着它们别各改各的）。
   徽章自带深色底，暗色顶栏上补一圈微光让它不至于糊进背景；亮底加辉光会晕成粉雾，所以亮色不发光。 */
.brand img{width:30px;height:30px;flex:none;display:block;border-radius:7px;
  filter:drop-shadow(0 0 6px color-mix(in srgb,var(--accent) 40%,transparent))}
[data-theme="light"] .brand img{filter:none}

.nav nav{display:flex;gap:clamp(16px,2vw,26px);margin-left:6px;min-width:0}
.nav nav a{font-size:13.5px;color:var(--ink-dim);transition:color .18s;white-space:nowrap;padding:6px 2px}
.nav nav a:hover{color:var(--ink)}
.nav nav a[aria-current="page"]{color:var(--accent-ink)}
.nav .spacer{flex:1 1 auto;min-width:0}

.lang{display:flex;font-family:var(--mono);font-size:11.5px;border:1px solid var(--line-ui);flex:none;border-radius:var(--r-sm);overflow:hidden}
.lang button{
  background:none;border:0;color:var(--ink-faint);
  font:inherit;padding:7px 10px;cursor:pointer;transition:.18s;min-width:34px;
}
.lang button:hover{color:var(--ink)}
.lang button[aria-pressed="true"]{background:var(--accent-a);color:var(--on-accent);font-weight:500}

.nav .enter{
  font-family:var(--mono);font-size:12px;letter-spacing:.06em;
  border:1px solid var(--line-ui);padding:8px 15px;color:var(--ink);border-radius:var(--r-sm);
  transition:border-color .18s,color .18s;white-space:nowrap;flex:none;
}
.nav .enter:hover{border-color:var(--accent-ink);color:var(--accent-ink)}
/* 顶栏购买入口（2026-09-07）。站上原有 9 个购买按钮全在页面深处，顶栏一个都没有。
   实心渐变是全站最高优先级动作的样式（同 .btn-primary），顶栏只有它一个实心块，
   不会跟旁边的描边按钮抢注意力。≤1040px 收进抽屉，见下面那个单独的 media 块。 */
.nav .nav-buy{
  font-size:13px;font-weight:600;padding:8px 16px;border-radius:var(--r-sm);
  background:var(--grad-accent);color:var(--on-accent);
  white-space:nowrap;flex:none;transition:filter .18s;
}
.nav .nav-buy:hover{filter:brightness(1.08)}
/* 主题切换按钮（顶栏）：暗色下显示太阳（点了变亮），亮色下显示月亮 */
.theme{display:grid;place-items:center;width:36px;height:32px;background:none;border:1px solid var(--line-ui);color:var(--ink-dim);cursor:pointer;flex:none;padding:0;border-radius:var(--r-sm);transition:color .18s,border-color .18s}
.theme:hover{color:var(--accent-ink);border-color:var(--accent-ink)}
.theme svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;display:block}
.theme .moon{display:none}
[data-theme="light"] .theme .sun{display:none}
[data-theme="light"] .theme .moon{display:block}
.burger{display:none;background:none;border:1px solid var(--line-ui);color:var(--ink-dim);font:inherit;padding:8px 12px;cursor:pointer;flex:none;min-width:40px;min-height:32px;border-radius:var(--r-sm)}

/* 手机抽屉 */
.drawer{display:none;border-bottom:1px solid var(--line-soft);background:var(--ground-2)}
.drawer.open{display:block}
.drawer a{display:block;padding:14px var(--gutter);border-top:1px solid var(--line-soft);font-size:15px;color:var(--ink-dim)}
.drawer a:first-child{border-top:0}
.drawer a[aria-current="page"]{color:var(--accent-ink)}
/* 抽屉里的购买入口：窄屏顶栏那个已隐藏，这里是唯一的入口，所以做成实心块最显眼 */
.drawer .nav-buy{background:var(--grad-accent);color:var(--on-accent);font-weight:600;text-align:center;border-top:0}

/* 面包屑（2026-09-07）：子页正文第一行的「首页 › 产品」。
   多页结构下滚轮回不到首页，这行字负责回答"我在哪、怎么回去"。
   刻意做得轻：它是路标不是导航，抢了 h1 的注意力就本末倒置了。 */
.crumb{display:flex;align-items:center;gap:7px;margin:0 0 18px;font-size:12.5px}
.crumb a{color:var(--ink-faint);transition:color .18s}
.crumb a:hover{color:var(--accent-ink)}
.crumb .sep{color:var(--line-ui)}
.crumb [aria-current="page"]{color:var(--ink-dim)}
/* 抽屉里的主题开关：≤600px 顶栏那个收起来，这里补一个（同一个 data-theme-toggle，site.js 一起绑） */
.drawer .theme{width:100%;height:auto;display:flex;align-items:center;gap:10px;padding:14px var(--gutter);border:0;border-top:1px solid var(--line-soft);font:inherit;font-size:15px;color:var(--ink-dim);text-align:left}
.drawer .theme:hover{color:var(--ink)}

.social{display:flex;align-items:center;gap:4px;flex:none}
.social a{
  display:grid;place-items:center;width:32px;height:32px;
  color:var(--ink-faint);border:1px solid transparent;border-radius:var(--r-sm);transition:.18s;
}
.social a:hover{color:var(--accent-ink);border-color:var(--line)}
.social svg{width:17px;height:17px;fill:currentColor;display:block}

/* ============================================================
   通用区块 / 标题 / 按钮
   ============================================================ */
section{padding-block:clamp(56px,8vw,110px)}
.sec-head{display:flex;align-items:flex-end;justify-content:space-between;gap:20px;flex-wrap:wrap;margin-bottom:30px}
h2{
  font-family:var(--display);font-weight:800;
  font-size:clamp(1.6rem,3.2vw,2.5rem);letter-spacing:-.03em;
  margin:8px 0 0;
}
h3{font-family:var(--display);font-weight:600;letter-spacing:-.02em}

.btn{
  font-family:var(--mono);font-size:13px;letter-spacing:.05em;
  padding:13px 24px;border:1px solid transparent;cursor:pointer;border-radius:10px;
  display:inline-flex;align-items:center;gap:10px;transition:.2s;
  min-height:44px;white-space:nowrap;
}
.btn-primary{background:var(--grad-accent);color:var(--on-accent);font-weight:600;box-shadow:var(--shadow-sm)}
.btn-primary:hover{filter:brightness(1.08);transform:translateY(-1px);box-shadow:var(--glow-accent)}
.btn-ghost{border-color:var(--accent-ink);color:var(--accent-ink)}
.btn-ghost:hover{background:color-mix(in srgb,var(--accent) 12%,transparent);border-color:var(--accent-ink);color:var(--accent-ink)}
.arrow{font-family:var(--mono);font-size:12.5px;color:var(--accent-ink);letter-spacing:.05em;white-space:nowrap;display:inline-flex;align-items:center;gap:6px;min-height:32px}

.tag{
  font-family:var(--mono);font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;
  border:1px solid var(--line-ui);padding:4px 9px;color:var(--ink-dim);align-self:flex-start;border-radius:6px;
  display:inline-block;
}
.tag.ok{border-color:var(--accent-line);color:var(--accent-ink)}
.tag.soon{color:var(--ink-faint)}

/* 页头（内页统一的标题带） */
.page-head{padding-block:clamp(44px,6vw,78px) clamp(24px,3vw,38px);border-bottom:1px solid var(--line-soft)}
.page-head h1{
  font-family:var(--display);font-weight:800;
  font-size:clamp(2rem,4.6vw,3.3rem);line-height:1.02;letter-spacing:-.035em;
  margin:10px 0 16px;text-wrap:balance;
}
.page-head p{color:var(--ink-dim);max-width:56ch;margin:0;font-size:clamp(14.5px,1.2vw,16px)}

/* ============================================================
   法务长文（条款 / 隐私）
   ------------------------------------------------------------
   行宽用 ch：中文一个字约 2ch，74ch 折合约 37 字/行；英文约 74 字符/行。
   两种语言都落在舒适区，所以不为中英分别写两套。
   编号 .num 用等宽琥珀，做成仪器面板的通道号，跟全站气质对齐。
   ============================================================ */
.legal{padding-block:clamp(30px,4vw,52px) clamp(48px,7vw,96px)}
.legal section{padding-block:clamp(22px,2.6vw,32px);border-bottom:1px solid var(--line-soft)}
.legal section:last-of-type{border-bottom:0}
.legal h2{
  font-family:var(--display);font-weight:600;
  font-size:clamp(17px,1.7vw,21px);line-height:1.25;letter-spacing:-.015em;
  margin:0 0 14px;display:flex;gap:14px;align-items:baseline;
}
.legal h2 .num{
  font-family:var(--mono);font-weight:500;font-size:12px;
  color:var(--accent-ink);letter-spacing:.06em;flex:none;
}
.legal p{
  color:var(--ink-dim);max-width:74ch;margin:0 0 12px;
  font-size:clamp(14.5px,1.15vw,15.5px);line-height:1.75;
}
.legal p:last-child{margin-bottom:0}
.legal b{color:var(--ink);font-weight:600}
.legal ul{margin:0 0 12px;padding-left:0;list-style:none;max-width:74ch}
.legal li{
  color:var(--ink-dim);position:relative;padding-left:20px;margin-bottom:10px;
  font-size:clamp(14.5px,1.15vw,15.5px);line-height:1.75;
}
.legal li::before{
  content:"";position:absolute;left:2px;top:.72em;
  width:5px;height:5px;background:var(--accent);border-radius:50%;
}
.legal a:not(.arrow){color:var(--accent-ink);text-decoration:underline;text-underline-offset:3px}
.legal a:not(.arrow):hover{color:var(--ink)}
.legal-date{
  font-family:var(--mono);font-size:12px;color:var(--ink-faint);
  margin-top:18px;letter-spacing:.04em;
}
.legal-foot{
  margin-top:clamp(30px,4vw,44px);padding-top:20px;
  border-top:1px solid var(--line);
  color:var(--ink-faint);font-size:13.5px;
}

/* ============================================================
   首页 · hero 面板（HUD 取景框 + 左文案 + 右视觉）
   右视觉 = 青色光环 + 品牌 Z 字标 + Launcher 窗口示意（设计图 2026-09-03）
   窗口里的"屏幕"是插槽：public/assets/img/launcher.png 存在就放真截图（构建期判定），
   没有就用 .mock 画几块无文字色块 —— 不编界面文案。
   ============================================================ */
.hero-sec{padding-block:clamp(22px,3vw,36px) 0}
.hero{
  position:relative;
  display:grid;
  grid-template-columns:minmax(0,1fr) minmax(0,1.05fr);
  gap:clamp(28px,4vw,60px);
  align-items:center;
  padding:clamp(32px,4.5vw,64px) clamp(22px,3.5vw,56px) clamp(44px,5vw,64px);
  border:1px solid var(--line);border-radius:var(--r-lg);
  background:
    radial-gradient(80% 70% at 78% 40%,color-mix(in srgb,var(--accent-b) 16%,transparent),transparent 70%),
    linear-gradient(180deg,var(--surface) 0%,var(--ground) 100%);
  overflow:hidden;box-shadow:var(--shadow-sm);
}
.hero .corner{position:absolute;width:16px;height:16px;border:1.5px solid var(--accent-ink);opacity:.9}
.hero .c1{top:12px;left:12px;border-right:0;border-bottom:0}
.hero .c2{top:12px;right:12px;border-left:0;border-bottom:0}
.hero .c3{bottom:12px;left:12px;border-right:0;border-top:0}
.hero .c4{bottom:12px;right:12px;border-left:0;border-top:0}
.hero .corner-label{
  position:absolute;right:22px;bottom:14px;
  font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-faint);
}
.hero-copy{min-width:0;position:relative;z-index:1}
.status{
  display:inline-flex;align-items:center;gap:9px;
  font-family:var(--mono);font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--accent-ink);border:1px solid var(--accent-line);border-radius:var(--r-pill);padding:7px 14px;margin-bottom:26px;
  background:color-mix(in srgb,var(--accent) 8%,var(--surface));
}
.dot{width:7px;height:7px;background:var(--accent);border-radius:50%;flex:none;animation:pulse 2.6s ease-out infinite}
@keyframes pulse{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--accent) 55%,transparent)}70%{box-shadow:0 0 0 7px transparent}100%{box-shadow:0 0 0 0 transparent}}

h1{
  font-family:var(--display);
  font-weight:800;
  font-size:clamp(2.5rem,6.4vw,4.75rem);
  line-height:.98;
  letter-spacing:-.035em;
  margin:0 0 22px;
  text-wrap:balance;
}
h1 .thin{font-weight:500;color:var(--ink-dim);display:block}
.lede{
  font-size:clamp(15px,1.35vw,17px);
  color:var(--ink-dim);
  max-width:46ch;
  margin:0 0 34px;
}
.cta-row{display:flex;flex-wrap:wrap;gap:12px;align-items:center}

.hero-visual{position:relative;min-width:0;aspect-ratio:1/.8;isolation:isolate}
/* 位图 Z 自带霓虹光晕，我们这层只做很淡的底衬，浓了会跟图里的光叠成一团 */
.hero-visual .halo{
  position:absolute;left:12%;top:50%;width:min(58%,380px);aspect-ratio:1;transform:translateY(-50%);
  border-radius:50%;background:var(--grad-halo);filter:blur(14px);opacity:.35;
}
/* 设计稿里这是首屏第二显眼的元素：一个粗的发光圆环，Z 从它前面穿过去。
   原来是一道细青线，几乎看不见 —— 那正是"没有设计感"的一部分。 */
/* 圆环：图里已经画了一个发光环，所以这里【不再画环】，只留一点点环境光。
   两个环叠在一起会错位，看着像重影。 */
.hero-visual .ring{display:none}
/* Z 字标：三层叠出雕刻感（设计稿里它是有厚度、有棱边反光的立体字，不是一块平色）
     .z-deep 往右下偏一点的暗色 → 厚度和落影
     .z-body 渐变主体
     .z-edge 只描边不填充的细高光 → 棱边反光
   矢量的上限就在这儿：做得出体积感，做不出稿子里那种表面纹理。 */
/* 首屏主视觉的位图 Z。
   ★为什么用位图不用矢量★：Z 有表面纹理、流线和粒子，那是 3D 渲染出来的，
   矢量能做形状和体积，做不出这个质感。顶栏 26px 的 logo 仍走矢量（位图那个尺寸会糊）。
   ★2026-09-04 清掉了两段过时注释★：原来这里写着"左侧遮罩淡掉 20%"和"暗版 screen / 亮版 multiply"，
   那是从设计稿截图里裁图那一版的做法，现在的图是【主人单独给的高分原图，已抠成透明底】，
   两样都不用了（下面的规则里也确实没有）。留着会让下一个人照着改错。
   ★动效★：首屏的动效方案在 dist/_fx-lab.html 那个实验台里并排比过（2026-09-04），
   主人挑定哪一档之后再把对应的 CSS 落进这里，现在这里只有 .halo 的呼吸（见文件末尾动效段）。 */
.hero-z-img{
  position:absolute;right:0;top:50%;transform:translateY(-50%);
  width:min(96%,560px);height:auto;pointer-events:none;
  /* ★不用 mix-blend-mode、不用 mask★：图本身已经是透明背景 + 四边羽化的 WebP。
     旧做法（screen 混合）会把卡片底色提亮一整块矩形，那就是主人圈出来的"像被裁掉"的边。 */
}
.hero-z-img.z-light{display:none}
[data-theme="light"] .hero-z-img.z-dark{display:none}
[data-theme="light"] .hero-z-img.z-light{display:block}

/* ============ 首屏动效（主人 2026-09-04 在 dist/_fx-lab.html 实验台上并排比完拍的 A+B+C）============
   A 流光 · B 星尘 · C 鼠标视差（C 在 site.js 里，因为要读鼠标位置）
   ★为什么不要 D 扫描线★：A 的流光和 D 的扫描线都是"扫过"型效果，方向还不一样会互相抢；
   而且扫描线横跨整张卡片、会经过左边的标题文字。两个扫过型只留一个，留了只落在 Z 上的流光。
   ★无障碍★：动画全部挂在下面 @media (prefers-reduced-motion:no-preference) 段里；
   文件末尾另有一道全局 reduce 兜底把所有动画降到 0.001ms。.hero-visual 已是 aria-hidden，
   这两层是它的子元素，读屏软件不会念。 */

/* ============ 产品页 2026-09-04 改版用到的两个样式 ============
   .buy-note     购买按钮下面那行小字（「掏钱之前先看这三条」被砍后留下的替代）。
   .price.nodeal 未定价的产品（ZZHU(AI) 内测版）那行灰字，免得它看起来像个价格。

   ★这里原本还有个 .plans★ —— 我给产品页的价格四卡新造的容器。
   撤了：首页早就有 .pricing 在做同一件事，而且它三档响应式齐全
   （四列 → 1080px 两列 → 600px 一列），我造的那个漏了中间那档。
   造之前没查现成的，是我的错，记在 kb「不从零造轮子」那条。 */
.buy-note{margin-top:14px;text-align:center;font-size:13px;color:var(--ink-faint)}
/* 价格未定时的金额位：沿用 .amt 的位置和间距，但字号收到正文级别、颜色压淡。
   仍用 .amt 打底是为了让卡片高度和有价格时保持一致，定价后去掉 .tbd 就还原。 */
.plan .amt.tbd{font-size:1.05rem;font-weight:600;letter-spacing:0;color:var(--ink-dim)}
/* 「运行时长不设限」那一行：∞ 图标 + 文字。图标走 stroke 用主色，跟着主题变。
   ★不用主人那张 ∞ 位图★：原图 2816x1536 带宇宙背景，缩到 18px 只会是一团蓝色。 */
.uncap{display:flex;align-items:center;gap:7px;margin:8px 0 0;font-size:13px;color:var(--ink-dim)}
.uncap .ico{width:18px;height:18px;flex:none;fill:none;stroke:var(--accent);stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round}
.price.nodeal{opacity:.55;font-weight:400}

/* A · 流光：尺寸和定位要跟 .hero-z-img ★逐条一致★，否则遮罩和图对不上、高光会跑偏。
   两张图比例不同（暗 900x780 / 亮 900x838），所以 aspect-ratio 也要分开写。 */
.hero-sheen{
  position:absolute;right:0;top:50%;transform:translateY(-50%);
  width:min(96%,560px);aspect-ratio:900/780;pointer-events:none;
  -webkit-mask-image:url(/assets/img/hero-z-dark-v2.webp);mask-image:url(/assets/img/hero-z-dark-v2.webp);
  -webkit-mask-size:100% 100%;mask-size:100% 100%;
  -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
  background:linear-gradient(105deg,transparent 38%,var(--sheen) 47%,transparent 56%);
  background-size:260% 100%;background-position:-70% 0;
}
[data-theme="light"] .hero-sheen{
  aspect-ratio:900/838;
  -webkit-mask-image:url(/assets/img/hero-z-light-v2.webp);mask-image:url(/assets/img/hero-z-light-v2.webp);
  /* 高光颜色不用在这里重写：--sheen 在 light 令牌块里已经换成压暗的一道了 */
}
/* B · 星尘：只在 Z 所在的右侧 62% 区域内，不是满屏飘 */
.hero-dust{position:absolute;right:0;top:0;width:62%;height:100%;pointer-events:none;overflow:hidden}
.hero-dust i{
  position:absolute;bottom:-6px;width:3px;height:3px;border-radius:50%;
  background:var(--accent);opacity:0;filter:blur(.4px);
}
/* C · 鼠标视差：这里只写过渡曲线，位移由 site.js 的 wireParallax 写进 style */
.hero-z-img,.hero-visual .halo,.hero .corner{transition:transform .5s cubic-bezier(.16,1,.3,1)}
.launcher{
  position:absolute;right:0;top:50%;width:min(54%,420px);margin:0;
  transform:translateY(-50%) perspective(1200px) rotateY(-9deg) rotateX(3deg);
  background:var(--surface);border:1px solid var(--line-strong);border-radius:var(--r-md);
  box-shadow:var(--shadow-lg);overflow:hidden;
}
.launcher .titlebar{
  display:flex;align-items:center;gap:10px;padding:9px 12px;margin:0;
  border-bottom:1px solid var(--line);background:var(--surface-2);
  font-family:var(--mono);font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-faint);
}
.launcher .dots{display:inline-flex;gap:5px}
.launcher .dots i{width:8px;height:8px;border-radius:50%;background:var(--line-ui);display:block}
.launcher .screen{aspect-ratio:16/10;background:var(--ground-2);position:relative}
.launcher .screen img{display:block;width:100%;height:100%;object-fit:cover}
/* 启动器界面示意：侧栏 + 内容区 + 两张卡 + 底部进度条与主按钮。
   ★全程不写任何文字★ —— 编界面文案就是在编产品还没有的功能；等主人给真截图，
   把 public/assets/img/launcher.png 放进去，index.astro 构建期自动换成真图。 */
.launcher .mock{position:absolute;inset:10px;display:grid;grid-template-columns:26% 1fr;gap:10px}
.launcher .mock i{display:block;border-radius:5px;background:var(--surface-2);border:1px solid var(--line-soft)}
.launcher .m-side{display:flex;flex-direction:column;gap:7px;padding:8px;border-radius:7px;background:var(--surface);border:1px solid var(--line-soft)}
.launcher .m-side i{height:11px;border:0;background:var(--line)}
.launcher .m-side i.on{background:var(--grad-accent);opacity:.9}
.launcher .m-main{display:flex;flex-direction:column;gap:10px;min-width:0}
.launcher .m-head{display:flex;align-items:center;gap:8px}
.launcher .m-title{flex:1 1 auto;height:13px;border:0;background:var(--line-strong)}
.launcher .m-pill{width:26%;height:13px;border:0;border-radius:var(--r-pill);background:var(--grad-accent);opacity:.9}
.launcher .m-cards{flex:1 1 auto;display:grid;grid-template-columns:1fr 1fr;gap:10px;min-height:0}
.launcher .m-cards i{height:100%;background:var(--surface-2)}
.launcher .m-foot{display:flex;align-items:center;gap:8px}
.launcher .m-bar{flex:1 1 auto;height:9px;border:0;border-radius:var(--r-pill);
  background:linear-gradient(90deg,var(--accent-a) 0 62%,var(--line) 62% 100%)}
.launcher .m-btn{width:22%;height:15px;border:0;background:var(--grad-accent)}
/* 动效只在用户没要求减少动态时开；全局 reduced-motion 兜底规则另有一道 */
@media (prefers-reduced-motion:no-preference){
  .hero-visual .halo{animation:halo 7s ease-in-out infinite}
  .hero-sheen{animation:sheen 6s ease-in-out infinite}
  .hero-dust i{animation:dust var(--d) linear var(--t) infinite}
}
@keyframes halo{0%,100%{transform:translateY(-50%) scale(1);opacity:.85}50%{transform:translateY(-50%) scale(1.07);opacity:1}}
/* 高光斜着扫过 Z：起点在右侧画面外，停在左侧画面外，剩下 45% 的时间是间歇 —— 
   不留间歇的话它会变成一直在闪，那就从"偶尔一道高光"变成"这里有个特效"了 */
@keyframes sheen{0%{background-position:130% 0}55%,100%{background-position:-70% 0}}
/* 星尘上浮：出现时淡入、升到顶淡出，中途保持半透明。scale 从 .6 到 1.1 是为了做出"飘近"的错觉 */
@keyframes dust{
  0%{transform:translateY(0) scale(.6);opacity:0}
  12%{opacity:.85}
  70%{opacity:.55}
  100%{transform:translateY(calc(var(--rise) * -1)) scale(1.1);opacity:0}
}
@keyframes ring{from{transform:translateY(-50%) rotate(0deg)}to{transform:translateY(-50%) rotate(360deg)}}

/* 指标条 */
/* 指标：四张独立圆角卡（设计图是四个分开的小卡，不是连体条） */
.metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;margin-top:8px}
.metric{padding:22px clamp(14px,2vw,26px);border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface);box-shadow:var(--shadow-sm);min-width:0}
.metric .n{
  font-family:var(--display);font-weight:600;
  font-size:clamp(1.6rem,3.1vw,2.4rem);line-height:1;
  letter-spacing:-.02em;font-variant-numeric:tabular-nums;
  display:flex;align-items:baseline;gap:0;margin-bottom:7px;
}
/* 这里的 span 有两种用法，间距要求相反，所以不能用统一的 flex gap：
     单位型「7 天」「$54 /月」  → 数字和单位之间要有气口
     续写型「v3.1 + .4」        → 是同一串版本号被拆开的，中间不能有缝
   原先 .n 上挂 gap:5px 一视同仁，把版本号显示成了「v3.1 .4」。
   改成默认给 margin、续写型用 .join 取消。 */
.metric .n span{font-family:var(--mono);font-size:.44em;color:var(--ink-faint);letter-spacing:0;margin-left:5px}
.metric .n span.join{margin-left:0}
/* 四格里挑一格点亮：四个数字同等重量＝没有重点，等于四个都没被看见。
   「秒级发码」是这四条里唯一直接回答「我付了钱多久能用上」的，所以点它。
   只改颜色不改字号 —— 字号一动，四格的基线就参差了。 */
.metric.key .n{color:var(--accent-ink)}

/* 产品卡（仅首页用；目录页故意换成另一种结构，避免四页同一个骨架） */
/* 产品：两张大卡并排（真产品只有 8125 双转 / ZZHU(AI)，主人 2026-09-03 定） */
.pgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}
.card{
  border:1px solid var(--line);background:var(--surface);border-radius:var(--r-md);box-shadow:var(--shadow-sm);
  padding:clamp(20px,2.4vw,30px);
  display:flex;flex-direction:column;
  transition:border-color .22s,background .22s;
  min-width:0;
}
.card:hover{border-color:var(--line-strong);background:var(--surface-2)}
.pcard{position:relative;overflow:hidden;background:linear-gradient(180deg,color-mix(in srgb,var(--accent) 5%,var(--surface)) 0%,var(--surface) 46%);min-height:300px}
/* 产品图占卡片右半（设计图），文案留出右侧空间；≤520px 图改为流式放在文案上方 */
.pcard.has-img{padding-right:clamp(150px,43%,310px)}
.pcard .pimg{position:absolute;right:0;top:50%;transform:translateY(-50%);width:clamp(150px,45%,320px);height:auto;pointer-events:none;filter:drop-shadow(0 18px 30px var(--shadow-edge))}
/* 产品示意图（src/components/ProductArt.astro 画的 SVG）。
   ★样式必须写在这里、不能写在那个组件的 <style> 里★：实测 Astro 的 scoped style 配上那么大一坨
   SVG 会让构建卡死在 "Building static entrypoints"（2026-09-03）。其它组件本来也都没有 style 块。 */
.part{display:block;width:100%;height:auto}
/* 亮色主题：产品本体保持深色（实物就是深色的），只把落地投影调淡，免得白底上显脏 */
[data-theme="light"] .art-shadow{opacity:.3}
.ptop{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}
.picon{width:44px;height:44px;border-radius:var(--r-sm);border:1px solid var(--line);background:var(--surface-2);display:grid;place-items:center;color:var(--accent-ink);flex:none}
.picon svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.tag.new{border-color:var(--accent-line);color:var(--accent-ink);background:color-mix(in srgb,var(--accent) 10%,var(--surface))}
.card h3{font-size:clamp(1.15rem,2vw,1.6rem);margin:16px 0 8px}
.card p{color:var(--ink-dim);font-size:14.5px;margin:0;max-width:52ch}
.card .foot{margin-top:auto;padding-top:22px;display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap}
.price{font-family:var(--mono);font-size:13px;color:var(--ink-dim)}
.price b{font-family:var(--display);font-weight:800;font-size:1.75em;color:var(--ink);letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.tiers{display:flex;margin-top:18px;border:1px solid var(--line);border-radius:var(--r-sm);width:fit-content;max-width:100%;overflow-x:auto}
.tiers span{
  font-family:var(--mono);font-size:11.5px;padding:6px 13px;color:var(--ink-dim);
  border-right:1px solid var(--line);white-space:nowrap;
}
.tiers span:last-child{border-right:0}
.tiers span[data-on]{background:var(--accent-a);color:var(--on-accent)}

/* ============================================================
   产品目录页 · 规格对照（工具书气质，不用卡片墙）
   ============================================================ */
.spec{border:1px solid var(--line);margin-bottom:18px;background:var(--surface);border-radius:var(--r-md);overflow:clip;box-shadow:var(--shadow-sm)}
.spec-top{
  display:grid;grid-template-columns:minmax(0,1fr) auto;gap:clamp(16px,3vw,40px);
  padding:clamp(20px,2.6vw,32px);border-bottom:1px solid var(--line);align-items:start;
}
.spec-top h2{margin:14px 0 10px;font-size:clamp(1.3rem,2.4vw,1.85rem)}
.spec-top p{color:var(--ink-dim);font-size:14.5px;margin:0;max-width:58ch}
.spec-buy{display:flex;flex-direction:column;align-items:flex-end;gap:12px;flex:none;min-width:0}
.spec-buy .price{text-align:right;white-space:nowrap}

/* 档位价格矩阵：横向可滚，绝不撑破容器。
   ★2026-09-01 加滚动阴影★：实测 375px 手机上表宽 520 / 容器 333，能滑但
   ★屏幕上完全看不出来能滑★——而最右那列「说明」（先试试手感 / 买得最多的一档 …）
   恰恰是最有说服力的文案，用户不知道能滑就永远看不到。
   用纯 CSS 滚动阴影，零 JS、不用监听滚动事件：
     两层"遮罩"用 local 跟着内容滚，两层"阴影"用 scroll 钉在容器上不动；
     滚到某一头时遮罩正好压住那侧的阴影，阴影自动消失。
   遮罩色必须跟容器底色一致（这里是 --surface，见 .spec），否则会看见一条色差。 */
.matrix-scroll{
  overflow-x:auto;-webkit-overflow-scrolling:touch;
  background:
    linear-gradient(to right, var(--surface) 30%, transparent) left center,
    linear-gradient(to left,  var(--surface) 30%, transparent) right center,
    radial-gradient(farthest-side at 0 50%,   var(--shadow-edge), transparent) left center,
    radial-gradient(farthest-side at 100% 50%,var(--shadow-edge), transparent) right center;
  background-repeat:no-repeat;
  background-size:44px 100%, 44px 100%, 16px 100%, 16px 100%;
  background-attachment:local, local, scroll, scroll;
}
.matrix{width:100%;border-collapse:collapse;min-width:520px;font-size:14px}
.matrix caption{text-align:left;padding:16px clamp(16px,2.2vw,26px) 0;color:var(--ink-faint);font-family:var(--mono);font-size:11px;letter-spacing:.16em;text-transform:uppercase}
.matrix th,.matrix td{padding:13px clamp(12px,1.8vw,20px);text-align:left;border-bottom:1px solid var(--line-soft)}
.matrix thead th{
  font-family:var(--mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--ink-faint);font-weight:400;border-bottom:1px solid var(--line);
}
.matrix tbody th{font-weight:500;color:var(--ink);font-size:14.5px}
.matrix td{color:var(--ink-dim);font-variant-numeric:tabular-nums}
.matrix .amt{font-family:var(--display);font-weight:600;font-size:1.2rem;color:var(--ink);letter-spacing:-.02em}
.matrix tbody tr:hover{background:var(--surface-2)}
.matrix tbody tr:last-child th,.matrix tbody tr:last-child td{border-bottom:0}

/* 功能对照点 */
.feat{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(240px,100%),1fr));gap:1px;background:var(--line);border-top:1px solid var(--line)}
.feat div{background:var(--surface);padding:clamp(16px,2vw,24px);min-width:0}
.feat strong{display:block;font-family:var(--display);font-weight:600;font-size:15px;margin-bottom:6px}
.feat span{color:var(--ink-dim);font-size:13.5px}

/* 价格四档（首页）：月卡是买得最多的一档，用渐变描边点亮 */
.pricing{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px}
.plan{border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface);box-shadow:var(--shadow-sm);padding:clamp(18px,2.2vw,26px);display:flex;flex-direction:column;gap:8px;min-width:0}
.plan .amt{font-family:var(--display);font-weight:800;font-size:clamp(1.8rem,3vw,2.4rem);letter-spacing:-.03em;margin:2px 0 0;line-height:1;font-variant-numeric:tabular-nums}
.plan ul{margin:6px 0 14px;padding-left:18px;color:var(--ink-dim);font-size:13.5px}
.plan li{margin:5px 0}
.plan .btn{margin-top:auto;justify-content:center}
.plan.hot{border-color:transparent;background:linear-gradient(var(--surface),var(--surface)) padding-box,var(--grad-accent) border-box;box-shadow:var(--glow-accent)}
.dl-card h3{margin:14px 0 12px;font-size:clamp(1.3rem,2.4vw,1.8rem)}

/* 保障承诺条（评审提的"缺保障承诺"） */
.assure{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(230px,100%),1fr));gap:14px;margin-top:8px}
.assure div{border:1px solid var(--line);border-radius:var(--r-md);box-shadow:var(--shadow-sm);padding:clamp(18px,2.2vw,26px);min-width:0;background:var(--surface)}
.assure .label{margin-bottom:10px;display:block}
.assure strong{display:block;font-family:var(--display);font-weight:600;font-size:clamp(1rem,1.6vw,1.2rem);margin-bottom:6px;letter-spacing:-.02em}
.assure p{margin:0;color:var(--ink-dim);font-size:13.5px}

/* ============================================================
   更新日志页 · 时间线
   ============================================================ */
.filters{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:26px}
.filters button{
  font-family:var(--mono);font-size:12px;letter-spacing:.06em;
  background:none;border:1px solid var(--line-ui);color:var(--ink-dim);border-radius:var(--r-sm);
  padding:8px 15px;cursor:pointer;transition:.18s;min-height:36px;
}
.filters button:hover{color:var(--ink);border-color:var(--ink-faint)}
.filters button[aria-pressed="true"]{background:var(--accent-a);color:var(--on-accent);border-color:var(--accent-a);font-weight:500}

.log{border-top:1px solid var(--line)}
.entry{
  display:grid;grid-template-columns:96px 118px minmax(0,1fr);
  gap:clamp(12px,2vw,28px);align-items:baseline;
  padding:22px 0;border-bottom:1px solid var(--line-soft);
}
.entry[hidden]{display:none}
.entry time{font-family:var(--mono);font-size:12px;color:var(--ink-faint);font-variant-numeric:tabular-nums}
.entry .ver{font-family:var(--mono);font-size:12.5px;color:var(--accent-ink);white-space:nowrap}
.entry .body{min-width:0}
.entry p{margin:0;font-size:14.5px;color:var(--ink-dim)}
.entry .prod{color:var(--ink);font-weight:500}
.entry ul{margin:8px 0 0;padding-left:18px;color:var(--ink-dim);font-size:14px}
.entry li{margin:4px 0}
.entry .kind{
  font-family:var(--mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;
  border:1px solid var(--line);border-radius:4px;padding:2px 7px;color:var(--ink-faint);margin-right:8px;
  display:inline-block;vertical-align:1px;
}
.entry .kind.fix{border-color:var(--line-ui);color:var(--ink-dim)}
.entry .kind.new{border-color:var(--accent-line);color:var(--accent-ink)}
.entry .kind.perf{border-color:color-mix(in srgb,var(--live) 35%,var(--surface));color:var(--live)}
.empty{padding:40px 0;color:var(--ink-faint);font-family:var(--mono);font-size:13px}

/* ============================================================
   下载页 · 单主体 + 校验
   ============================================================ */
.dl-main{
  display:grid;grid-template-columns:minmax(0,1.35fr) minmax(0,1fr);
  gap:clamp(20px,3vw,40px);align-items:start;
}
.dl-card{
  border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--shadow-sm);
  background:linear-gradient(180deg,color-mix(in srgb,var(--accent) 6%,var(--surface)) 0%,var(--surface) 52%);
  padding:clamp(24px,3vw,40px);min-width:0;
}
.dl-card h2{margin:14px 0 12px;font-size:clamp(1.5rem,2.8vw,2.1rem)}
.dl-card>p{color:var(--ink-dim);margin:0 0 26px;max-width:52ch;font-size:14.5px}
.dl-meta{display:flex;flex-wrap:wrap;gap:clamp(14px,2.4vw,34px);margin-top:26px;padding-top:22px;border-top:1px solid var(--line)}
.dl-meta div{min-width:0}
.dl-meta .label{display:block;margin-bottom:5px}
.dl-meta b{font-family:var(--mono);font-size:13px;font-weight:400;color:var(--ink);word-break:break-all}

.hash{
  font-family:var(--mono);font-size:12px;color:var(--ink-dim);
  border:1px solid var(--line);border-radius:var(--r-sm);background:var(--ground-2);
  padding:12px 14px;margin-top:8px;word-break:break-all;line-height:1.7;
}
.side-note{border:1px solid var(--line);border-radius:var(--r-md);box-shadow:var(--shadow-sm);background:var(--surface);padding:clamp(20px,2.4vw,28px);min-width:0}
.side-note h3{font-size:1.05rem;margin:0 0 14px}
.side-note ol,.side-note ul{margin:0;padding-left:20px;color:var(--ink-dim);font-size:14px}
.side-note li{margin:9px 0}
.side-note li b{color:var(--ink);font-weight:500}

.req{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(200px,100%),1fr));gap:1px;background:var(--line);border:1px solid var(--line);border-radius:var(--r-md);overflow:clip}
.req div{background:var(--surface);padding:clamp(16px,2vw,22px);min-width:0}
.req .label{display:block;margin-bottom:8px}
.req b{font-family:var(--body);font-weight:500;font-size:14.5px;color:var(--ink)}

/* ============================================================
   社区 + 页脚
   ============================================================ */
.join{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}
.join a{
  border:1px solid var(--line);background:var(--surface);border-radius:var(--r-md);box-shadow:var(--shadow-sm);
  padding:clamp(22px,2.6vw,32px);
  display:flex;align-items:center;gap:20px;min-width:0;
  transition:border-color .22s,background .22s,transform .22s;
}
.join a:hover{border-color:var(--line-strong);background:var(--surface-2);transform:translateY(-2px)}
.join .glyph{width:52px;height:52px;flex:none;display:grid;place-items:center;border:1px solid var(--line);border-radius:var(--r-sm);color:var(--ink-dim);transition:.22s}
.join a:hover .glyph{color:var(--accent-ink);border-color:var(--accent-line)}
.join .glyph svg{width:24px;height:24px;fill:currentColor;display:block}
.join .txt{min-width:0}
.join .txt strong{display:block;font-family:var(--display);font-weight:600;font-size:clamp(1.05rem,1.7vw,1.3rem);letter-spacing:-.02em;margin-bottom:4px}
.join .txt span{display:block;font-size:13.5px;color:var(--ink-dim)}
.join .go{margin-left:auto;font-family:var(--mono);font-size:13px;color:var(--accent-ink);flex:none}

footer{border-top:1px solid var(--line);padding-block:34px 46px;margin-top:20px}
.foot-grid{display:flex;flex-wrap:wrap;gap:26px;align-items:center;justify-content:space-between}
.foot-links{display:flex;flex-wrap:wrap;gap:22px}
.foot-links a{font-size:13px;color:var(--ink-dim);transition:color .18s;min-height:32px;display:inline-flex;align-items:center}
.foot-links a:hover{color:var(--accent-ink)}
.copy{font-family:var(--mono);font-size:11.5px;color:var(--ink-faint)}

/* ============================================================
   响应式（断点按内容算，不是拍脑袋：
   1320 容器 + 两栏时每栏 ≥ 420px → 960 以下必须降单列）
   ============================================================ */
@media (max-width:1080px){
  .nav nav{gap:16px}
  .nav nav a{font-size:13px}
}
@media (max-width:960px){
  .hero{grid-template-columns:minmax(0,1fr);padding:28px 20px 56px}
  .hero-visual{aspect-ratio:1/.62;max-width:520px;margin-inline:auto;width:100%}
  .pgrid{grid-template-columns:minmax(0,1fr)}
  .pricing{grid-template-columns:repeat(2,minmax(0,1fr))}
  .metrics{grid-template-columns:repeat(2,minmax(0,1fr))}
  .join{grid-template-columns:minmax(0,1fr)}
  .dl-main{grid-template-columns:minmax(0,1fr)}
  .spec-top{grid-template-columns:minmax(0,1fr)}
  .spec-buy{align-items:flex-start;flex-direction:row;justify-content:space-between;width:100%;flex-wrap:wrap}
  .spec-buy .price{text-align:left}
  .nav nav{display:none}
  .burger{display:block}
  .entry{grid-template-columns:76px minmax(0,1fr);row-gap:4px}
  .entry .ver{grid-column:2}
  .entry .body{grid-column:1/-1}
}
/* 320-400px：顶栏固定宽的元素加起来超过可用宽度，最右的汉堡按钮会被
   overflow:hidden 裁到屏幕外 → 手机上导航直接没了。社交图标让位，
   页脚仍有同样的入口，功能不丢。（宽度算式见 _检查/check.js 第 6 节） */
@media (max-width:400px){
  header .social{display:none}
}
/* ≤600px：顶栏固定宽元素（品牌+社交+语言+主题+控制台+汉堡）加起来会超过可用宽度，
   主题按钮先收进抽屉（抽屉里有同款）。单独一个 media 块是为了让 check-astro 第 6 节的
   hidesTheme 正则能认出来 —— 它只看块里第一条规则。 */
@media (max-width:600px){
  header .theme{display:none}
}
/* ≤1040px：顶栏排不下「立即购买」了（品牌+四个导航+社交+语言+主题+控制台+购买），
   它收进抽屉，抽屉第一条就是同一个入口，购买路径不丢。
   单独成块的理由同上面 theme：check-astro 第 6 节的正则只看块里第一条规则。 */
@media (max-width:1040px){
  .nav .nav-buy{display:none}
}
/* ≤520px：控制台按钮收进抽屉。同样单独成块，好让宽度算式认出它。 */
@media (max-width:520px){
  .nav .enter{display:none}
}
@media (max-width:520px){
  .metrics{grid-template-columns:minmax(0,1fr)}
  .join a{gap:14px;padding:20px}
  .join .glyph{width:42px;height:42px}
  .join .go{display:none}
  .btn{width:100%;justify-content:center}
  .cta-row{gap:10px}
  .pricing{grid-template-columns:minmax(0,1fr)}
  .pcard.has-img{padding-right:clamp(20px,2.4vw,30px)}
  .pcard .pimg{position:static;transform:none;width:58%;margin:6px 0 4px}
}
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation-duration:.001ms!important;transition-duration:.001ms!important}
}
@media print{
  header,.hero-visual,footer .social,.filters{display:none}
  body{background:#fff;color:#000}
}
