/* =================================================================
   永乐教育 · SITE-WIDE STYLES
   shared tokens, nav, footer, buttons, common headers
   ================================================================= */

:root{
  /* ====================================================================
     DESIGN TOKENS · 单一可信源（design-system.html 必须 100% 反映此处）
     2026-05-24: 整合两套 token，全站统一引用。
     ==================================================================== */

  /* === SKY GRADIENT · 夜→晨 渐变色阶（hero / page-hero / deck dark） === */
  --night-0:#050B22;
  --night-1:#0E1F4D;
  --night-2:#1A3A7A;
  --night-3:#2E1F4D;       /* +新增：紫夜（grad-night 末段）*/
  --blue:#2D4FAF;
  --blue-2:#5984D6;
  --blue-soft:#8FAAD5;
  --dusk:#B59FBE;
  --sunset:#E89970;
  --sunset-2:#F2B58F;
  --dawn:#FAD0B0;

  /* === SURFACES · 纸面色阶 === */
  --paper:#F7F2E8;
  --paper-2:#EFE7D5;
  --paper-3:#E4DBC1;
  --bg:#F4EFE3;            /* +新增：design-system 自身底色 */
  --bg-2:#EDE6D3;          /* +新增 */

  /* === INK · 文字 3 档（cool 冷调，跟生产对齐） === */
  --ink:#0E1218;
  --ink-soft:#2A3142;
  --ink-mute:#5C6577;
  --line-soft:rgba(14,18,24,.10);
  --line:rgba(14,18,24,.16);

  /* === BRAND ACCENTS · 品牌色（蓝 / 金 / 红 三组各 3 档） === */
  --accent:#4A75E5;
  --accent-deep:#1E3A7A;
  --accent-light:#8FAAD5;  /* +新增 */
  --gold:#D4A858;
  --gold-light:#E8C97C;
  --gold-deep:#A8842E;     /* +新增 */
  --red:#C8472C;           /* ⚠ 仅限 logo / 印章 / Deck 转折页，不作 UI 主色 */
  --red-deep:#7A2818;      /* +新增 */
  --red-bright:#E1361C;    /* +新增（印刷头盔 logo 用） */

  /* === FONTS === */
  --serif:'Noto Serif SC','Source Han Serif SC',serif;
  --sans:'Noto Sans SC','Source Han Sans SC','PingFang SC','Inter',sans-serif;
  --latin:'Cormorant Garamond','Georgia',serif;
  --mono:'JetBrains Mono','SFMono-Regular',monospace;
  --hand:'Ma Shan Zheng',cursive;
  --hand-cn:'Ma Shan Zheng',cursive;  /* 兼容旧别名 */

  /* === SPACING · 8 倍数阶梯（所有 padding/margin/gap 从此处选） === */
  --s-1:4px;
  --s-2:8px;
  --s-3:12px;
  --s-4:16px;
  --s-5:24px;
  --s-6:32px;
  --s-7:48px;
  --s-8:64px;
  --s-9:96px;
  --s-10:128px;

  /* === RADIUS · 5 档圆角 === */
  --r-sm:4px;
  --r-md:8px;
  --r-lg:12px;
  --r-xl:18px;
  --r-pill:99px;

  /* === SHADOWS · 4 档投影（浮起强度） === */
  --sh-1:0 4px 12px -4px rgba(14,18,24,.12);
  --sh-2:0 8px 24px -10px rgba(14,18,24,.18);
  --sh-3:0 18px 50px -25px rgba(14,18,24,.25);
  --sh-4:0 30px 80px -30px rgba(14,18,24,.35);

  /* === MOTION · 3 档时长 + 2 种 ease */
  --t-fast:150ms;
  --t-base:250ms;
  --t-slow:400ms;
  --ease-default:cubic-bezier(.4,1,.6,1);
  --ease-bounce:cubic-bezier(.45,1.5,.55,1);

  /* === SIGNATURE GRADIENTS · 5 套签名渐变 === */
  --grad-night:linear-gradient(180deg,#06091A 0%,#0A1530 38%,#1A2B5E 70%,#2E1F4D 100%);
  --grad-dawn:linear-gradient(180deg,#1A2B5E 0%,#7A3C8A 55%,#E8A65C 85%,#F4E4BC 100%);
  --grad-gold:linear-gradient(135deg,#F4E4BC 0%,#E8C97C 45%,#D4A858 100%);
  --grad-accent:linear-gradient(135deg,#4A75E5 0%,#2D4FB3 100%);
  --grad-rainbow:conic-gradient(from 0deg,#00D4FF,#00FF87,#FFD700,#FF8A4C,#FF3DAF,#B400FF,#00D4FF);
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{
  background:var(--paper);color:var(--ink);
  font-family:var(--sans);font-weight:400;
  line-height:1.75;letter-spacing:.005em;
  -webkit-font-smoothing:antialiased;
}
a{color:inherit;text-decoration:none}
img{max-width:100%;display:block}
::selection{background:var(--accent);color:#fff}

/* =================================================================
   A11Y · 全站键盘聚焦环（金色 2px outline + 2px offset）
   只在键盘 tab 时显示（:focus-visible），鼠标点击不显示。
   ================================================================= */
:focus{outline:none}  /* 关闭浏览器默认聚焦环 */
a:focus-visible,
button:focus-visible,
[tabindex]:focus-visible,
input:focus-visible,
textarea:focus-visible,
select:focus-visible{
  outline:2px solid var(--gold-light);
  outline-offset:2px;
  border-radius:var(--r-sm);
  transition:outline-offset .15s ease;
}
/* 深色场景下加额外光晕，让金色环在 hero/dark bg 上更显眼 */
nav.top a:focus-visible,
nav.top button:focus-visible,
.hero a:focus-visible,
.hero button:focus-visible,
footer a:focus-visible,
footer button:focus-visible{
  box-shadow:0 0 0 4px rgba(232,201,124,.25);
}

/* =================================================================
   A11Y · 全站 :disabled 状态
   ================================================================= */
button:disabled,
input:disabled,
textarea:disabled,
select:disabled,
[aria-disabled="true"]{
  opacity:.45;
  cursor:not-allowed;
  pointer-events:none;
}
.btn:disabled,
.btn[aria-disabled="true"]{
  opacity:.45;cursor:not-allowed;pointer-events:none;
  filter:saturate(.6);
}

/* =================================================================
   NAV · pill, frosted (consistent across all pages)
   ================================================================= */
nav.top{
  position:fixed;top:18px;left:50%;transform:translateX(-50%);z-index:100;
  display:flex;align-items:center;gap:8px;
  padding:8px 10px 8px 18px;
  /* 更透 · 像悬浮的玻璃片，背景星空隐约可见 */
  background:rgba(14,24,55,.28);
  backdrop-filter:saturate(200%) blur(40px);
  -webkit-backdrop-filter:saturate(200%) blur(40px);
  border:1px solid rgba(255,255,255,.12);
  border-radius:99px;
  box-shadow:0 8px 30px -12px rgba(0,0,0,.30), inset 0 1px 0 rgba(255,255,255,.12);
  overflow:visible;
}
nav.top.on-paper{
  /* 更透：.7 → .45，让背后内容隐约可见，提升"漂浮玻璃"质感 */
  background:rgba(255,255,255,.45);
  border:1px solid rgba(14,18,24,.08);
  box-shadow:0 8px 30px -10px rgba(0,0,0,.10), inset 0 1px 0 rgba(255,255,255,.5);
  backdrop-filter:saturate(180%) blur(24px);
  -webkit-backdrop-filter:saturate(180%) blur(24px);
}
nav.top.on-paper .wordmark{color:var(--ink)}
nav.top.on-paper .wordmark .by{color:var(--ink-mute)}
nav.top.on-paper ul a{color:var(--ink-soft)}
nav.top.on-paper ul a:hover, nav.top.on-paper ul a.current{color:var(--ink);background:rgba(14,18,24,.06)}
nav.top.on-paper .wordmark{border-right-color:rgba(14,18,24,.15)}

nav .wordmark{
  display:flex;align-items:center;gap:10px;
  font-size:14px;color:#fff;font-weight:500;letter-spacing:.08em;line-height:1;
  padding-right:14px;margin-right:6px;
  border-right:1px solid rgba(255,255,255,.16);
  transition:color .25s ease, border-right-color .25s ease;
}
nav .wordmark{white-space:nowrap;flex-shrink:0}  /* 防止 wordmark 被挤压换行/竖排 */
nav .wordmark .brand-link{display:flex;align-items:center;gap:10px;color:inherit}  /* 内层 home link，包住 logo+品牌名 */
nav .wordmark .yongle-logo{margin-right:2px;flex-shrink:0}
nav .wordmark .by{
  align-self:center;line-height:1;
  font-family:var(--mono);font-size:10px;letter-spacing:.18em;
  color:rgba(255,255,255,.55);font-weight:400;text-transform:uppercase;
  padding-left:10px;border-left:1px solid rgba(255,255,255,.18);
  transition:color .25s ease;
  white-space:nowrap;flex-shrink:0;  /* 关键：永远不允许"造物云出品"竖排 */
}
/* nav .wordmark .by hidden at 1024px (in mobile nav rule above) */
nav ul{display:flex;list-style:none;gap:2px;align-items:center;flex-wrap:nowrap}
nav ul a{
  font-size:13px;color:rgba(255,255,255,.72);font-weight:400;
  padding:8px 14px;border-radius:99px;transition:all .25s ease;letter-spacing:.04em;
  white-space:nowrap; /* 关键：防止"培养"等双字标签竖排 */
}
nav ul a:hover{background:rgba(255,255,255,.1);color:#fff}
nav ul a.current{background:rgba(255,255,255,.14);color:#fff}

/* 中宽屏 + 平板竖屏（641-1480px）：保持完整 nav，但收紧 gap/padding/字号
   覆盖 iPad portrait / Pro 11"-12.9" portrait / 横屏小笔记本 / 中分辨率显示器 */
@media (min-width:641px) and (max-width:1480px){
  nav.top{padding:6px 8px 6px 14px;gap:4px}
  nav .wordmark{font-size:13px;padding-right:10px;margin-right:4px}
  nav .wordmark .by{font-size:9.5px;padding-left:8px;letter-spacing:.14em}
  nav ul{gap:1px}
  nav ul a{padding:7px 10px;font-size:12.5px;letter-spacing:.02em}
  nav .nav-cta{padding:8px 14px;font-size:12.5px}
}
/* 更窄一档（641-900px）：藏掉"造物云出品"badge 给 8 链接 + CTA 让位 */
@media (min-width:641px) and (max-width:900px){
  nav.top{padding:6px 6px 6px 12px;gap:2px}
  nav .wordmark{padding-right:8px;margin-right:2px;border-right:0}
  nav .wordmark .by{display:none}
  nav ul a{padding:6px 8px;font-size:12px}
  nav .nav-cta{padding:7px 12px;font-size:12px;letter-spacing:.02em}
}
nav .nav-cta{
  font-size:13px;padding:9px 18px;background:var(--accent);color:#fff;
  border-radius:99px;font-weight:500;letter-spacing:.04em;
  transition:background .25s ease;
  white-space:nowrap;flex-shrink:0;  /* 关键：报名 CTA 永不竖排/挤压 */
}
nav .nav-cta:hover{background:#3D60BD}

/* =================================================================
   COMMON BUTTONS
   ================================================================= */
.btn{
  display:inline-flex;align-items:center;gap:8px;
  padding:13px 26px;border-radius:99px;
  font-family:var(--sans);font-size:13.5px;font-weight:500;letter-spacing:.05em;
  transition:all .25s ease;cursor:pointer;border:none;
}
.btn.light{background:#fff;color:var(--ink)}
.btn.light:hover{background:var(--gold-light)}
.btn.frosted{
  background:rgba(255,255,255,.1);color:#fff;
  border:1px solid rgba(255,255,255,.25);
  backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);
}
.btn.frosted:hover{background:rgba(255,255,255,.22)}
.btn.accent{background:var(--accent);color:#fff}
.btn.accent:hover{background:#3D60BD}
.btn.ink{background:var(--ink);color:#fff}
.btn.ink:hover{background:var(--accent-deep)}
.btn.gold{background:var(--gold);color:var(--ink)}
.btn.gold:hover{background:var(--gold-light)}
.btn.ghost-ink{border:1px solid var(--ink);color:var(--ink);background:transparent}
.btn.ghost-ink:hover{background:var(--ink);color:#fff}

/* =================================================================
   COMMON SECTION HEADERS
   ================================================================= */
.chap-head{max-width:1400px;margin:0 auto 70px;position:relative;z-index:5}
.chap-num{font-family:var(--mono);font-size:11px;letter-spacing:.3em;color:var(--accent);margin-bottom:24px;text-transform:uppercase;font-weight:400}
.chap-num::before{content:"";display:inline-block;width:32px;height:1px;background:currentColor;vertical-align:middle;margin-right:14px;opacity:.7}
h2.chap-title{font-family:var(--sans);font-weight:500;font-size:clamp(38px,5.2vw,84px);line-height:1.1;letter-spacing:.01em;color:var(--ink);max-width:1100px}
h2.chap-title em{font-style:normal;color:var(--accent);font-weight:600}
.chap-sub{font-size:16px;color:var(--ink-soft);max-width:680px;margin-top:32px;line-height:1.9;font-weight:400}

/* =================================================================
   PAGE HERO (subpages)
   ================================================================= */
.page-hero{
  position:relative;
  background:linear-gradient(180deg,
    var(--night-1) 0%,
    var(--night-2) 30%,
    var(--blue) 60%,
    var(--blue-2) 85%,
    var(--blue-soft) 100%
  );
  color:#fff;padding:200px 8vw 120px;overflow:hidden;
}
.page-hero::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='240' height='240'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 1, 0 0 0 0 1, 0 0 0 0 1, 0 0 0 0.15 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>");
  mix-blend-mode:overlay;opacity:.4;
}
.page-hero::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  background-image:
    radial-gradient(1px 1px at 12% 28%, rgba(255,255,255,.7), transparent),
    radial-gradient(1px 1px at 32% 55%, rgba(255,255,255,.5), transparent),
    radial-gradient(1px 1px at 58% 18%, rgba(255,255,255,.7), transparent),
    radial-gradient(1px 1px at 80% 65%, rgba(255,255,255,.5), transparent),
    radial-gradient(1px 1px at 92% 32%, rgba(255,255,255,.6), transparent),
    radial-gradient(1px 1px at 45% 80%, rgba(255,255,255,.4), transparent),
    radial-gradient(1px 1px at 18% 88%, rgba(255,255,255,.55), transparent);
}
.page-hero-inner{position:relative;z-index:5;max-width:1400px;margin:0 auto}
.page-hero .crumb{
  font-family:var(--mono);font-size:11px;letter-spacing:.3em;color:rgba(255,255,255,.65);
  text-transform:uppercase;margin-bottom:30px;display:flex;align-items:center;gap:14px;
}
.page-hero .crumb a{color:rgba(255,255,255,.55);transition:color .2s}
.page-hero .crumb a:hover{color:#fff}
.page-hero .crumb .sep{color:rgba(255,255,255,.35)}
.page-hero h1{
  font-family:var(--sans);font-weight:500;
  font-size:clamp(48px,7vw,118px);line-height:1.05;letter-spacing:.01em;
  color:#fff;margin-bottom:30px;max-width:1100px;
}
.page-hero h1 em{font-style:normal;color:var(--gold-light);font-weight:600}
.page-hero .lede{
  font-family:var(--serif);font-size:clamp(17px,1.5vw,22px);line-height:1.85;
  color:rgba(255,255,255,.82);max-width:680px;
}
.page-hero .lede em{font-style:normal;color:#fff;font-weight:500}

/* =================================================================
   COMMON SECTION CONTAINERS
   ================================================================= */
section.chap{position:relative;padding:140px 8vw}
section.chap.paper{background:var(--paper);color:var(--ink)}
section.chap.paper-2{background:var(--paper-2);color:var(--ink)}
section.chap.ink{background:var(--ink);color:#fff}
section.chap.ink .chap-title{color:#fff}
section.chap.ink .chap-num{color:var(--gold-light)}
section.chap.ink .chap-sub{color:rgba(255,255,255,.75)}

/* =================================================================
   FOOTER (consistent across all pages)
   ================================================================= */
footer.site{background:var(--night-0);color:rgba(255,255,255,.6);padding:90px 8vw 40px;position:relative}
.ft-grid{display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr;gap:50px;max-width:1400px;margin:0 auto}
/* ============================================================
   FOOTER · BRAND BLOCK (重新设计 2026-05-25)
   层级：
     1. 主品牌行 — logo + 永乐教育 (大字 sans 600) + EN 副标 (mono 小字)
     2. 隔线
     3. 出品署名 — 造物云 链接 + SINCE 2026
     4. 使命陈述 — 来自 design-system #essence 的官方 mission
     5. 支撑文案 — 简短理念句
   ============================================================ */
.ft-brand{display:flex;flex-direction:column;gap:18px;max-width:380px}
/* 1. 主品牌行 */
.ft-brand-lock{display:flex;align-items:center;gap:16px;line-height:1}
.ft-brand-lock .yongle-logo{flex-shrink:0}
.ft-brand-name{
  display:flex;flex-direction:column;gap:6px;
}
.ft-brand-name .cn{
  font-family:var(--sans);font-weight:600;font-size:24px;color:#fff;
  letter-spacing:.06em;line-height:1;
}
.ft-brand-name .en{
  font-family:var(--mono);font-size:10px;letter-spacing:.28em;
  color:rgba(255,255,255,.4);text-transform:uppercase;font-weight:400;line-height:1;
}
/* 2. 出品署名 — gold accent，强化"造物云出品"的归属感 */
.ft-brand-by{
  display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  font-family:var(--mono);font-size:10.5px;letter-spacing:.18em;
  color:rgba(255,255,255,.5);text-transform:uppercase;line-height:1.4;
  padding-top:14px;
  border-top:1px solid rgba(255,255,255,.10);
}
.ft-brand-by a{
  color:var(--gold-light);font-weight:500;
  transition:opacity var(--t-fast);
}
.ft-brand-by a:hover{opacity:.75;text-decoration:underline;text-underline-offset:3px}
.ft-brand-by .ft-sep{color:rgba(255,255,255,.2);font-weight:300}
.ft-brand-by .ft-since{color:rgba(255,255,255,.35);letter-spacing:.22em}
/* 3. 使命陈述 — 跟 design-system #essence 完全一致 */
.ft-brand-mission{
  font-family:var(--serif);font-size:15.5px;line-height:1.85;
  color:rgba(255,255,255,.85);font-weight:400;letter-spacing:.01em;
  margin:0;
}
.ft-brand-mission em{
  font-style:normal;color:var(--gold-light);font-weight:500;
}
/* 4. 支撑文案 — 简短，理念注脚 */
.ft-brand-tagline{
  font-family:var(--sans);font-size:12.5px;line-height:1.7;
  color:rgba(255,255,255,.5);font-weight:400;
  margin:0;
}

/* === 旧标记兼容（部分页面尚未迁移）=== */
.ft-brand h4{display:none}  /* 旧 h4 模板隐藏，统一用新 .ft-brand-lock */
.ft-brand > p{font-size:13.5px;color:rgba(255,255,255,.6);line-height:1.75;max-width:340px}
.ft-brand .by{display:none}
.ft-col h5{font-family:var(--mono);font-size:11px;letter-spacing:.22em;color:var(--gold-light);text-transform:uppercase;margin-bottom:22px;font-weight:400}
.ft-col ul{list-style:none;display:grid;gap:11px}
.ft-col a{font-size:13.5px;color:rgba(255,255,255,.65);transition:color .2s;line-height:1.5}
.ft-col a:hover{color:var(--gold-light)}
.ft-col a small{display:block;font-family:var(--mono);font-size:10px;letter-spacing:.15em;color:rgba(255,255,255,.35);margin-top:3px;text-transform:uppercase}
.ft-bottom{
  max-width:1400px;margin:60px auto 0;padding-top:30px;
  border-top:1px solid rgba(255,255,255,.1);
  display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:20px;
  font-family:var(--mono);font-size:11px;letter-spacing:.18em;color:rgba(255,255,255,.4);text-transform:uppercase;
}
.ft-bottom .tech{color:var(--gold-light)}
/* 左侧：版权 + meta links（设计系统 / sitemap / llms.txt / robots.txt 等） */
.ft-bottom .ft-left{display:flex;flex-direction:column;gap:12px;flex:1;min-width:0}
.ft-bottom .ft-meta-links{
  display:flex;flex-wrap:wrap;gap:6px 18px;align-items:center;
  font-family:var(--mono);font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;
}
.ft-bottom .ft-meta-links a{
  color:rgba(255,255,255,.55);transition:color .2s ease;text-decoration:none;
  display:inline-flex;align-items:center;gap:5px;
}
.ft-bottom .ft-meta-links a:hover{color:var(--gold-light)}
.ft-bottom .ft-meta-links a::before{
  content:"";width:4px;height:4px;border-radius:50%;
  background:rgba(255,255,255,.25);transition:background .2s ease;
}
.ft-bottom .ft-meta-links a:hover::before{background:var(--gold-light)}
.ft-bottom .ft-meta-links a:first-child::before{display:none}
.ft-bottom .ft-meta-links .ft-tag{
  display:inline-block;padding:1px 6px;border-radius:99px;
  background:rgba(255,255,255,.10);color:rgba(255,255,255,.7);
  font-size:8.5px;letter-spacing:.14em;margin-left:5px;
}

/* =================================================================
   MOBILE NAV (hamburger) — shared across all pages
   ================================================================= */
.nav-burger{display:none}
.mobile-menu{display:none}

/* burger 只在真手机生效（≤640px）：iPhone / Android phone 竖屏 + 小窗
   平板竖屏（iPad / iPad Pro / Surface portrait 768-1366px）保持完整 nav（compact 样式由上方 641-1480 块负责）
   2026-05-25: 从 1180px+portrait 改成纯 ≤640px — 用户反馈"平板竖屏要完整 nav，不要 burger" */
@media (max-width:640px){
  nav.top{padding:6px 10px 6px 16px;max-width:calc(100vw - 24px);flex-wrap:nowrap}
  nav.top ul,nav.top .nav-cta{display:none}
  nav .wordmark{padding-right:0;margin-right:0;font-size:13.5px;border-right:0;white-space:nowrap;flex-shrink:0}
  nav .wordmark .by{display:none}  /* 隐藏"造物云出品"小字，避免挤压 */
  .nav-burger{
    display:flex;align-items:center;justify-content:center;
    width:38px;height:38px;border-radius:99px;
    background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.2);
    cursor:pointer;flex-shrink:0;margin-left:auto;
  }
  .nav-burger span{display:block;width:16px;height:1.5px;background:#fff;position:relative;border-radius:1px}
  .nav-burger span::before,.nav-burger span::after{content:"";position:absolute;left:0;width:16px;height:1.5px;background:#fff;border-radius:1px;transition:transform .3s ease}
  .nav-burger span::before{top:-5px}
  .nav-burger span::after{top:5px}
  .nav-burger.open span{background:transparent}
  .nav-burger.open span::before{transform:translateY(5px) rotate(45deg)}
  .nav-burger.open span::after{transform:translateY(-5px) rotate(-45deg)}
  nav.top.on-paper .nav-burger{background:rgba(14,18,24,.06);border-color:rgba(14,18,24,.15)}
  nav.top.on-paper .nav-burger span,
  nav.top.on-paper .nav-burger span::before,
  nav.top.on-paper .nav-burger span::after{background:var(--ink)}

  .mobile-menu{
    display:block;position:fixed;top:0;left:0;right:0;bottom:0;
    background:rgba(8,15,38,.96);backdrop-filter:blur(40px) saturate(180%);-webkit-backdrop-filter:blur(40px) saturate(180%);
    z-index:90;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease;
    padding:88px 28px 40px;overflow-y:auto;
  }
  .mobile-menu.open{opacity:1;visibility:visible}
  .mobile-menu .mlogo{font-family:var(--mono);font-size:11px;letter-spacing:.25em;color:var(--gold-light);text-transform:uppercase;margin-bottom:24px}
  .mobile-menu ul{list-style:none;display:grid;gap:2px;margin-bottom:24px}
  .mobile-menu ul a{
    display:flex;align-items:baseline;justify-content:space-between;gap:10px;
    padding:20px 4px;border-bottom:1px solid rgba(255,255,255,.08);
    font-family:var(--sans);font-size:18px;color:#fff;font-weight:400;letter-spacing:.04em;text-decoration:none;
  }
  .mobile-menu ul a small{font-family:var(--mono);font-size:10px;letter-spacing:.2em;color:rgba(255,255,255,.4);text-transform:uppercase;font-weight:400}
  .mobile-menu .cta-block{display:flex;flex-direction:column;gap:10px;margin-top:28px}
  .mobile-menu .cta-block a{padding:16px 22px;border-radius:99px;text-align:center;font-family:var(--sans);font-size:15px;font-weight:500;letter-spacing:.04em;text-decoration:none}
  .mobile-menu .cta-primary{background:var(--gold);color:var(--ink)}
  .mobile-menu .cta-secondary{background:rgba(255,255,255,.08);color:#fff;border:1px solid rgba(255,255,255,.18)}
}

/* =================================================================
   RESPONSIVE
   ================================================================= */
@media (max-width:1024px){
  .ft-grid{grid-template-columns:1fr 1fr;gap:30px}
  .page-hero{padding:160px 24px 100px}
  section.chap{padding:90px 24px}
}
@media (max-width:680px){
  .ft-grid{grid-template-columns:1fr;gap:24px}
  .page-hero{padding:140px 22px 80px}
  section.chap{padding:80px 22px}
  body{overflow-x:hidden}
}

/* reveal */
.reveal{opacity:0;transform:translateY(20px);transition:opacity .9s ease,transform .9s ease}
.reveal.in{opacity:1;transform:none}

/* =================================================================
   YONGLE MASCOT — floating smile-face gradient orb (永远快乐 symbol)
   inspired by vogel.haus/whistle little coach character
   ================================================================= */
/* yongle-mascot 已退役 — 2026-05-25 用户要求移除右下角小机器人，改为 .back-to-top 按钮 */
.yongle-mascot{display:none !important}

/* =================================================================
   BACK TO TOP · 回到顶部按钮（右下角固定 · 滚动 400px+ 才出现）
   ================================================================= */
.back-to-top{
  position:fixed;bottom:24px;right:24px;z-index:80;
  width:48px;height:48px;border-radius:50%;
  background:rgba(14,18,24,.85);
  backdrop-filter:saturate(180%) blur(20px);
  -webkit-backdrop-filter:saturate(180%) blur(20px);
  border:1px solid rgba(255,255,255,.15);
  color:#fff;cursor:pointer;
  display:inline-grid;place-items:center;
  box-shadow:0 8px 24px -8px rgba(0,0,0,.4);
  opacity:0;visibility:hidden;transform:translateY(8px);
  transition:opacity var(--t-base) var(--ease-default),
             visibility var(--t-base) var(--ease-default),
             transform var(--t-base) var(--ease-default),
             background var(--t-fast),
             box-shadow var(--t-fast);
  font-family:var(--mono);font-size:18px;line-height:1;
}
.back-to-top.is-visible{opacity:1;visibility:visible;transform:none}
.back-to-top:hover{
  background:var(--accent);
  box-shadow:0 12px 32px -8px rgba(74,117,229,.5);
}
.back-to-top:active{transform:translateY(1px)}
/* 浅色背景下版本（footer / paper 区） */
.back-to-top.on-paper{
  background:rgba(255,255,255,.85);color:var(--ink);
  border-color:var(--line);
  box-shadow:0 8px 24px -8px rgba(0,0,0,.15);
}
.back-to-top.on-paper:hover{background:var(--accent);color:#fff;border-color:var(--accent)}
/* 箭头用 unicode 简洁，比 SVG 更不易出错 */
.back-to-top::before{
  content:"↑";font-weight:400;line-height:1;
  display:inline-block;
}
@media (max-width:680px){
  .back-to-top{width:42px;height:42px;bottom:16px;right:16px;font-size:16px}
}
@media (prefers-reduced-motion:reduce){
  .back-to-top{transition:opacity .15s linear}
}

/* yongle-mascot 移动端规则已废弃 — 已被 .back-to-top 替代 */

/* =================================================================
   造物云 attribution link — inherit parent color, no underline
   ================================================================= */
.by a,.lk-by a,.ft-by a,.bs-by a,.brand-by a,.lock-by a{
  color:inherit;text-decoration:none;cursor:pointer;
  transition:opacity .2s ease,text-decoration-color .2s ease;
}
.by a:hover,.lk-by a:hover,.ft-by a:hover,.bs-by a:hover,.brand-by a:hover,.lock-by a:hover{
  opacity:.78;text-decoration:underline;text-decoration-color:currentColor;text-underline-offset:3px;
}

/* =================================================================
   YONGLE LOGO — RGB neon orb (inline brand mark, nav/footer)
   ================================================================= */
.yongle-logo{
  --logo-size:34px;  /* 改 size 变体时同步改这个变量，blur/inset 都按它缩放 */
  /* 笑脸 SVG（直接复用头盔 V07 path，统一品牌嘴型 — 给 .smile mask 引用） */
  --smile-svg:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='34 54 28 12'><path d='M48.79,65.38C44.17,65.16,40.13,63.82,36.87,60.57C36.35,60.04,35.82,59.44,35.59,58.78C35.12,57.43,35.59,56.21,36.70,55.37C37.73,54.59,38.75,54.79,39.76,55.64C41.52,57.16,43.41,58.43,45.77,58.99C49.94,59.98,53.49,58.91,56.64,56.19C57.94,55.06,59.19,54.20,60.73,55.72C62.02,56.99,61.90,58.78,60.38,60.31C57.18,63.60,53.22,65.14,48.79,65.38Z' fill='black'/></svg>");
  display:inline-grid;place-items:center;
  width:var(--logo-size);height:var(--logo-size);flex:0 0 var(--logo-size);
  vertical-align:middle;cursor:pointer;
  position:relative;
}
.yongle-logo .orb{
  width:100%;height:100%;border-radius:50%;position:relative;z-index:1;
  /* rainbow ring IS the orb background; ::after covers center to leave thin rim */
  background:conic-gradient(from 0deg,
    #00D4FF, #00FF87, #FFD700, #FF8A4C, #FF3DAF, #B400FF, #00D4FF);
  box-shadow:
    0 0 6px rgba(0,212,255,.45),
    0 0 12px rgba(255,0,170,.3),
    0 4px 10px -4px rgba(0,0,0,.5);
  transition:transform .3s cubic-bezier(.4,1.4,.6,1);
}
.yongle-logo:hover .orb{transform:scale(1.08)}
/* outer halo */
/* 外圈光晕 — blur 必须用 px（CSS blur 不接受 %），用 calc 按 --logo-size 缩放 */
.yongle-logo .orb::before{
  content:"";position:absolute;inset:-9%;border-radius:50%;
  background:conic-gradient(from 0deg,
    #00D4FF, #00FF87, #FFD700, #FF8A4C, #FF3DAF, #B400FF, #00D4FF);
  filter:blur(calc(var(--logo-size) * .14));  /* 34px → ~4.8px · 88px → ~12px */
  opacity:.85;z-index:-1;
  /* 用 logo 专属 keyframe，只动 opacity，不覆盖上面的 calc blur */
  animation:logo-halo 3.6s ease-in-out infinite;
}
@keyframes logo-halo{
  0%,100%{opacity:.7}
  50%{opacity:1}
}
/* 深色内圆 — box-shadow inset 用 calc 按 --logo-size 缩放（rgba 不能用 %）*/
.yongle-logo .orb::after{
  content:"";position:absolute;inset:8%;border-radius:50%;
  background:
    radial-gradient(circle at 32% 28%, rgba(255,255,255,.22) 0%, rgba(255,255,255,.05) 22%, transparent 50%),
    radial-gradient(circle at center, #1A1A26 0%, #06060E 100%);
  box-shadow:
    inset 0 calc(var(--logo-size) * -.06) calc(var(--logo-size) * .14) rgba(0,0,0,.55),
    inset 0 calc(var(--logo-size) * .04) calc(var(--logo-size) * .08) rgba(255,255,255,.10);
  z-index:1;
}
.yongle-logo .face{
  position:absolute;top:56%;left:50%;transform:translate(-50%,-50%);
  display:flex;flex-direction:column;align-items:center;z-index:3;pointer-events:none;
  width:100%;
}
/* eyes & smile sized as % of the orb wrapper — identical proportions at any size */
.yongle-logo .eyes{display:flex;gap:19%;align-items:center;justify-content:center;width:100%}
.yongle-logo .eye{
  width:12%;aspect-ratio:1/1.85;border-radius:99px;
  background:linear-gradient(180deg, #fff 0%, rgba(255,255,255,.9) 100%);
  box-shadow:
    inset 0 .8px .8px rgba(255,255,255,.95),
    inset 0 -.5px .8px rgba(180,180,200,.4),
    0 0 4px rgba(255,255,255,.6),
    0 0 7px rgba(0,212,255,.35);
  animation:logo-blink 5.5s ease-in-out infinite;
  transition:height .25s ease,transform .25s ease;
}
.yongle-logo .smile{
  /* 直接复用头盔 V07 的笑脸 path（同一个曲线，统一品牌嘴型） */
  width:22%;aspect-ratio:28/12;
  background:#fff;
  -webkit-mask:var(--smile-svg) no-repeat center / contain;
          mask:var(--smile-svg) no-repeat center / contain;
  border:0;border-radius:0;
  margin-top:9%;
  filter:drop-shadow(0 0 3px rgba(255,255,255,.5));
  opacity:0;transform:translateY(-2px) scale(.65);
  transition:opacity .3s ease,transform .3s ease;
}
.yongle-logo:hover .smile{opacity:1;transform:translateY(0) scale(1)}
.yongle-logo:hover .eye{animation:happy-blink 1.8s ease-in-out}
@keyframes logo-blink{
  0%,90%,100%{transform:scaleY(1)}
  94%,98%{transform:scaleY(.1)}
}
/* size variants — 只设 --logo-size，width/height/halo blur 全部自动跟随 */
.yongle-logo.sm{--logo-size:24px}
.yongle-logo.lg{--logo-size:46px}
.yongle-logo.xl{--logo-size:72px}
.yongle-logo.xxl{--logo-size:120px}
/* on dark bg — slightly brighter halo */
.yongle-logo.on-dark .orb::before{opacity:1;filter:blur(5px)}
@media (prefers-reduced-motion:reduce){
  .yongle-logo .orb::before,.yongle-logo .orb::after,.yongle-logo .eye,.yongle-mascot .orb::before,.yongle-mascot .orb::after,.yongle-mascot .eye{animation:none}
}

/* =================================================================
   MOBILE OPTIMIZATION · 全站统一移动端体验包
   - 平板 ≤768px：纵向排列、字号微调
   - 手机 ≤480px：最紧凑 padding、所有 grid 单列、字号收敛
   - 横向溢出防护、安全区域、字号下限
   =================================================================
   原则：① 移动端用 16px (1rem) 起步的字号下限（防 iOS 自动缩放）
        ② 左右 padding 不少于 18px（不贴边）
        ③ 大屏多列 grid 在手机统一变 1 列
        ④ 大字 clamp 在小屏给一个合理的最小值 */

@media (max-width:768px){
  /* 全局横向溢出防护 */
  html,body{overflow-x:hidden;max-width:100vw}

  /* section.chap 通用 padding 收紧 */
  section.chap{padding:60px 22px!important}
  .chap-head{margin:0 auto 36px!important}

  /* page-hero（子页面 hero）适配 */
  .page-hero{padding:140px 22px 70px!important}
  .page-hero .page-hero-inner{padding:0!important}
  .page-hero h1{font-size:clamp(34px,8vw,52px)!important;line-height:1.15!important;margin-bottom:24px!important}
  .page-hero .lede{font-size:15px!important;line-height:1.8!important}

  /* chap-title 适配 */
  h2.chap-title{font-size:clamp(28px,7vw,42px)!important;line-height:1.2!important}
  .chap-sub{font-size:14.5px!important;line-height:1.8!important}

  /* footer 适配 */
  footer{padding:60px 22px 40px!important}
  .ft-grid{grid-template-columns:1fr 1fr!important;gap:30px!important}

  /* 触摸目标至少 44×44pt（iOS HIG 标准）*/
  .btn,nav .nav-cta,.cta-primary,.cta-secondary{min-height:44px}
}

/* === 手机专属（小于平板）=== */
@media (max-width:480px){
  section.chap{padding:48px 18px!important}
  .page-hero{padding:120px 18px 60px!important}
  .page-hero h1{font-size:clamp(28px,9vw,42px)!important}
  .page-hero .lede{font-size:14.5px!important}

  h2.chap-title{font-size:clamp(24px,8vw,34px)!important}
  .chap-sub{font-size:14px!important}

  /* 所有大屏的多列 grid 强制单列（卡片类）*/
  .product-grid,.cap-rows,.spirits-grid,.five-figures,.four-p-grid,
  .six-anim,.six-mini,.school-pillars,.shift-grid,.var-grid,
  .factions,.story-grid,.mech,.h3-stack,.h3-detail-wrap,
  .lifelong-kg,.methodology-link,.invariant-wrap,.fund-grid,
  .product-card .specs,.product-card .actions{
    grid-template-columns:1fr!important;
  }
  .product-card .actions{display:flex!important;flex-direction:column;align-items:stretch}
  .product-card .actions .btn,.product-card .actions .more{width:100%;justify-content:center;text-align:center}

  /* 卡片内 padding 紧凑 */
  .product-card .body,.cap-row,.spirit,.fig-card .meta,
  .four-p,.six-mini .cell,.six-anim .cell,.pillar{
    padding:20px 18px!important;
  }

  /* footer 移动端单列 */
  .ft-grid{grid-template-columns:1fr!important;gap:24px!important}

  /* 大数字/装饰字号收一收，避免破版 */
  .stat .num,.four-card .idx,.journey-step .num,
  .six-anim .cell .num{font-size:38px!important}
}

/* === iPhone 横屏 / 小窗 / 触摸优化 === */
@media (hover:none) and (pointer:coarse){
  /* 触摸设备：禁用 hover 动效，避免"卡死在 hover 态"的视觉 bug */
  .product-card:hover,.cap-row:hover,.spirit:hover,.fig-card:hover,
  .four-p:hover,.six-mini .cell:hover,.six-anim .cell:hover,
  .pillar:hover{transform:none}
}

/* === safe-area: iPhone notch 适配 === */
@supports (padding:max(0px)){
  body{
    padding-left:env(safe-area-inset-left);
    padding-right:env(safe-area-inset-right);
  }
  nav.top{
    padding-left:max(18px, env(safe-area-inset-left));
    padding-right:max(10px, env(safe-area-inset-right));
  }
}

/* =================================================================
   FORM COMPONENTS · input / textarea / select / checkbox / radio
   完整状态：default · hover · focus-visible · disabled · error
   全部走 design tokens（--paper / --line / --accent / --r-md / --t-base）
   ================================================================= */
.field{display:grid;gap:6px;margin-bottom:var(--s-4)}
.field > label{
  font-family:var(--mono);font-size:11px;letter-spacing:.18em;
  text-transform:uppercase;color:var(--ink-soft);font-weight:500;
}
.field > label .req{color:var(--red-bright);margin-left:2px}
.field .help{
  font-size:12.5px;color:var(--ink-mute);line-height:1.55;
}
.field .err{
  display:none;font-size:12.5px;color:var(--red-bright);line-height:1.55;
  font-family:var(--sans);font-weight:500;
}
.field.has-error .err{display:block}
.field.has-error .help{display:none}

/* === text-style inputs（input/textarea/select 同一基线）=== */
.input,
.textarea,
.select{
  width:100%;
  padding:11px 14px;
  font-family:var(--sans);font-size:14px;line-height:1.4;color:var(--ink);
  background:var(--paper);
  border:1px solid var(--line);
  border-radius:var(--r-md);
  transition:border-color var(--t-base) var(--ease-default),
             background-color var(--t-base) var(--ease-default),
             box-shadow var(--t-base) var(--ease-default);
  appearance:none;-webkit-appearance:none;
}
.input::placeholder,
.textarea::placeholder{color:var(--ink-mute);opacity:.7}
.input:hover,
.textarea:hover,
.select:hover{border-color:rgba(14,18,24,.28);background:#fff}
.input:focus-visible,
.textarea:focus-visible,
.select:focus-visible{
  outline:none;
  border-color:var(--accent);
  background:#fff;
  box-shadow:0 0 0 3px rgba(74,117,229,.18);
}
.textarea{min-height:96px;resize:vertical;line-height:1.65}
.select{padding-right:36px;cursor:pointer;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='none' stroke='%235C6577' stroke-width='1.6'><path d='M1 1l5 5 5-5'/></svg>");
  background-repeat:no-repeat;background-position:right 14px center;background-size:10px 7px;
}

/* === error state === */
.field.has-error .input,
.field.has-error .textarea,
.field.has-error .select,
.input.is-error,
.textarea.is-error,
.select.is-error{
  border-color:var(--red-bright);
  background:rgba(225,54,28,.04);
}
.field.has-error .input:focus-visible,
.field.has-error .textarea:focus-visible,
.field.has-error .select:focus-visible{
  box-shadow:0 0 0 3px rgba(225,54,28,.18);
}

/* === sizes === */
.input.sm,.textarea.sm,.select.sm{padding:7px 10px;font-size:13px;border-radius:var(--r-sm)}
.input.lg,.textarea.lg,.select.lg{padding:14px 18px;font-size:16px;border-radius:var(--r-lg)}

/* === checkbox & radio · 自绘以便统一品牌色 === */
.check,
.radio{
  display:inline-flex;align-items:center;gap:10px;cursor:pointer;
  font-size:14px;color:var(--ink);line-height:1.5;
  user-select:none;
}
.check input,
.radio input{
  /* 隐藏原生但保留可访问性 */
  position:absolute;opacity:0;width:18px;height:18px;cursor:pointer;
}
.check .box,
.radio .box{
  width:18px;height:18px;flex-shrink:0;
  background:var(--paper);
  border:1.5px solid var(--line);
  transition:background var(--t-base) var(--ease-default),
             border-color var(--t-base) var(--ease-default);
  display:inline-grid;place-items:center;
  color:transparent;
}
.check .box{border-radius:var(--r-sm)}
.radio .box{border-radius:50%}
.check:hover .box,
.radio:hover .box{border-color:var(--accent)}
.check input:checked + .box,
.radio input:checked + .box{
  background:var(--accent);border-color:var(--accent);color:#fff;
}
.check input:checked + .box::before{
  content:"";width:10px;height:6px;
  border-left:2px solid currentColor;border-bottom:2px solid currentColor;
  transform:rotate(-45deg) translate(1px,-1px);
}
.radio input:checked + .box::before{
  content:"";width:8px;height:8px;border-radius:50%;background:currentColor;
}
.check input:focus-visible + .box,
.radio input:focus-visible + .box{
  outline:2px solid var(--gold-light);outline-offset:3px;
}
.check input:disabled ~ *,
.radio input:disabled ~ *{opacity:.45;cursor:not-allowed}

/* =================================================================
   TOAST · 临时通知（4 变体：success / info / warn / error）
   用法：<div class="toast-region" aria-live="polite">
           <div class="toast success" role="status">...</div>
         </div>
   ================================================================= */
.toast-region{
  position:fixed;top:90px;right:24px;z-index:9000;
  display:flex;flex-direction:column;gap:10px;
  pointer-events:none;
  max-width:min(380px, calc(100vw - 48px));
}
/* TOAST v2 · 干净卡片 + 圆角彩色 icon-pill（无侧色条 — Apple/Linear style） */
.toast{
  pointer-events:auto;
  display:grid;grid-template-columns:32px 1fr auto;align-items:center;gap:14px;
  padding:14px 16px 14px 14px;
  background:#fff;
  border:1px solid var(--line-soft);
  border-radius:var(--r-lg);
  box-shadow:var(--sh-3), 0 0 0 1px rgba(255,255,255,.6) inset;
  font-size:13.5px;color:var(--ink);line-height:1.55;
  animation:toast-in var(--t-base) var(--ease-bounce);
  backdrop-filter:saturate(180%);
}
/* icon = 圆角方块 pill，左对齐于卡片内 — 跟卡片融合更优雅 */
.toast .toast-ico{
  width:32px;height:32px;border-radius:var(--r-sm);
  display:inline-grid;place-items:center;
  color:var(--accent);font-size:14px;font-weight:600;line-height:1;
  background:rgba(74,117,229,.10);
  flex-shrink:0;
}
.toast .toast-body{padding-top:1px}
.toast .toast-body strong{display:block;font-weight:600;margin-bottom:2px;color:var(--ink)}
.toast .toast-body small{display:block;color:var(--ink-mute);font-size:12.5px;margin-top:2px}
.toast .toast-close{
  background:none;border:0;padding:4px 6px;margin:-4px -6px 0 0;
  font-size:16px;line-height:1;color:var(--ink-mute);cursor:pointer;
  border-radius:var(--r-sm);
  transition:color var(--t-fast),background var(--t-fast);
  align-self:flex-start;
}
.toast .toast-close:hover{color:var(--ink);background:rgba(14,18,24,.05)}
/* 变体 — 只换 icon 的 tinted background + color，卡片本身保持白底，不破坏整体节奏 */
.toast.success .toast-ico{color:#1F7A3A;background:rgba(52,168,83,.12)}
.toast.info .toast-ico{color:var(--accent-deep);background:rgba(74,117,229,.12)}
.toast.warn .toast-ico{color:var(--gold-deep);background:rgba(212,168,88,.18)}
.toast.error .toast-ico{color:var(--red-deep);background:rgba(225,54,28,.12)}
.toast.leaving{animation:toast-out var(--t-fast) var(--ease-default) forwards}
@keyframes toast-in{
  from{opacity:0;transform:translateX(20px) scale(.96)}
  to{opacity:1;transform:none}
}
@keyframes toast-out{
  from{opacity:1;transform:none}
  to{opacity:0;transform:translateX(20px) scale(.96)}
}

/* =================================================================
   MODAL · 居中卡片 + backdrop blur
   用法：<div class="modal-overlay" role="presentation">
           <div class="modal" role="dialog" aria-modal="true" aria-labelledby="...">
             <header class="modal-header">...
             <div class="modal-body">...
             <footer class="modal-footer">...
           </div>
         </div>
   ================================================================= */
.modal-overlay{
  position:fixed;inset:0;z-index:9500;
  background:rgba(14,18,24,.55);
  backdrop-filter:blur(8px) saturate(140%);
  -webkit-backdrop-filter:blur(8px) saturate(140%);
  display:grid;place-items:center;
  padding:24px;
  animation:overlay-in var(--t-base) var(--ease-default);
}
.modal-overlay.leaving{animation:overlay-out var(--t-base) var(--ease-default) forwards}
.modal{
  width:min(540px, 100%);max-height:calc(100vh - 48px);
  background:var(--paper);
  border:1px solid var(--line-soft);
  border-radius:var(--r-xl);
  box-shadow:var(--sh-4);
  display:flex;flex-direction:column;overflow:hidden;
  animation:modal-in var(--t-base) var(--ease-bounce);
}
.modal.sm{width:min(380px, 100%)}
.modal.lg{width:min(720px, 100%)}
.modal-header{
  padding:22px 26px 14px;
  display:flex;align-items:flex-start;gap:16px;
  border-bottom:1px solid var(--line-soft);
}
.modal-header .modal-title{
  font-family:var(--sans);font-weight:500;font-size:18px;color:var(--ink);
  line-height:1.4;flex:1;letter-spacing:.01em;
}
.modal-header .modal-sub{
  font-size:13px;color:var(--ink-mute);margin-top:4px;line-height:1.6;
}
.modal-header .modal-close{
  background:none;border:0;padding:6px;margin:-6px -10px 0 0;
  width:32px;height:32px;border-radius:var(--r-sm);
  font-size:18px;line-height:1;color:var(--ink-mute);cursor:pointer;
  transition:background var(--t-fast), color var(--t-fast);
  flex-shrink:0;
}
.modal-header .modal-close:hover{background:rgba(14,18,24,.06);color:var(--ink)}
.modal-body{
  padding:18px 26px 22px;
  overflow-y:auto;
  font-size:14.5px;color:var(--ink-soft);line-height:1.7;
}
.modal-footer{
  padding:16px 26px 22px;
  border-top:1px solid var(--line-soft);
  display:flex;justify-content:flex-end;align-items:center;gap:10px;flex-wrap:wrap;
}
.modal-footer .modal-helper{
  margin-right:auto;font-size:12px;color:var(--ink-mute);
}
@keyframes overlay-in{from{opacity:0} to{opacity:1}}
@keyframes overlay-out{from{opacity:1} to{opacity:0}}
@keyframes modal-in{
  from{opacity:0;transform:translateY(12px) scale(.97)}
  to{opacity:1;transform:none}
}
@media (max-width:600px){
  .modal-overlay{padding:0;align-items:flex-end}
  .modal{
    width:100%;max-width:none;max-height:90vh;
    border-radius:var(--r-xl) var(--r-xl) 0 0;
    animation:modal-in-mobile var(--t-base) var(--ease-bounce);
  }
  @keyframes modal-in-mobile{
    from{opacity:0;transform:translateY(100%)}
    to{opacity:1;transform:none}
  }
}

/* prefers-reduced-motion: disable all enter/exit animations */
@media (prefers-reduced-motion:reduce){
  .toast,.modal,.modal-overlay{animation:none}
}

/* =================================================================
   DECK COMPONENTS · 命名可复用的幻灯片组件
   提取自 beautiful-html-templates 模板库 + 永乐自研版式。
   每个组件按 class name 引用，跟 layouts L1-L25 配合使用。
   2026-05-25
   ================================================================= */

/* --- 5 套标准 enter 动画（取自 broadside template）-------- */
@keyframes ds-fade-up{from{opacity:0;transform:translateY(28px)}to{opacity:1;transform:none}}
@keyframes ds-fade-in{from{opacity:0}to{opacity:1}}
@keyframes ds-reveal-right{from{clip-path:inset(0 100% 0 0);opacity:1}to{clip-path:inset(0 0 0 0)}}
@keyframes ds-reveal-left{from{clip-path:inset(0 0 0 100%);opacity:1}to{clip-path:inset(0 0 0 0)}}
@keyframes ds-scale-in{from{opacity:0;transform:scale(.94)}to{opacity:1;transform:none}}
.ds-anim-fadeup{animation:ds-fade-up var(--t-slow) var(--ease-default) both}
.ds-anim-fade{animation:ds-fade-in var(--t-slow) var(--ease-default) both}
.ds-anim-reveal-r{animation:ds-reveal-right var(--t-slow) var(--ease-default) both}
.ds-anim-reveal-l{animation:ds-reveal-left var(--t-slow) var(--ease-default) both}
.ds-anim-scale{animation:ds-scale-in var(--t-slow) var(--ease-default) both}
/* stagger helper（用 inline --i 系数）*/
.ds-anim-fadeup[style*="--i"]{animation-delay:calc(var(--i) * 100ms)}

/* --- 1. MASTHEAD · 杂志双线刊头 -------- */
.ds-masthead{
  display:flex;flex-direction:column;align-items:center;gap:8px;
  padding:20px 0;width:100%;
}
.ds-masthead .ds-rule{height:1px;background:currentColor;width:100%}
.ds-masthead .ds-rule.thick{height:3px}
.ds-masthead .ds-issue{
  font-family:var(--mono);font-size:11px;letter-spacing:.32em;
  color:var(--ink-mute);text-transform:uppercase;font-weight:500;
}
.ds-masthead .ds-title{
  /* 精修 2026-05-26：900 → 400，配 tight letter-spacing 更优雅 */
  font-family:var(--serif);font-weight:400;
  font-size:clamp(54px,8vw,128px);line-height:.95;letter-spacing:-.02em;
  color:var(--ink);text-align:center;
}
.ds-masthead .ds-title em{font-style:normal;color:var(--accent);font-weight:500}
.ds-masthead .ds-sub{
  font-family:var(--latin);font-style:italic;
  font-size:clamp(16px,1.8vw,22px);color:var(--ink-soft);letter-spacing:.04em;
}

/* --- 2. PIN-NOTE · 便签 + 红胶带（取自 Pin & Paper）-------- */
.ds-pin-note{
  position:relative;display:inline-block;
  padding:24px 28px 28px;
  background:#FBF1C8;  /* 黄便签纸 */
  box-shadow:0 4px 14px -4px rgba(0,0,0,.18), 0 1px 2px rgba(0,0,0,.08);
  transform:rotate(-2deg);
  max-width:380px;
  transition:transform var(--t-base) var(--ease-bounce);
}
.ds-pin-note:hover{transform:rotate(0)}
.ds-pin-note.right{transform:rotate(2deg)}
.ds-pin-note.right:hover{transform:rotate(0)}
.ds-pin-note::before{
  /* 红色胶带 */
  content:"";position:absolute;top:-12px;left:50%;transform:translateX(-50%) rotate(-3deg);
  width:80px;height:24px;background:rgba(225,54,28,.78);
  box-shadow:0 1px 3px rgba(0,0,0,.15);
}
.ds-pin-note .ds-pn-text{
  font-family:var(--hand);font-size:24px;line-height:1.4;color:var(--ink);font-weight:400;
}
.ds-pin-note .ds-pn-attr{
  margin-top:14px;font-family:var(--mono);font-size:10.5px;letter-spacing:.18em;
  color:var(--ink-mute);text-transform:uppercase;font-weight:500;
}

/* --- 3. PILL-STACK · 堆叠胶囊卡片（取自 Capsule）-------- */
.ds-pill-stack{position:relative;display:flex;flex-direction:column;gap:0;width:100%;max-width:480px}
.ds-pill-stack .ds-pill{
  padding:14px 24px;border-radius:99px;
  font-family:var(--sans);font-size:15px;font-weight:500;color:var(--ink);
  background:var(--paper);border:1.5px solid var(--ink);
  box-shadow:2px 3px 0 rgba(14,18,24,.92);
  position:relative;z-index:1;
}
.ds-pill-stack .ds-pill + .ds-pill{margin-top:-6px}
.ds-pill-stack .ds-pill.accent{background:var(--accent);color:#fff;border-color:var(--accent-deep);box-shadow:2px 3px 0 var(--accent-deep)}
.ds-pill-stack .ds-pill.gold{background:var(--gold);color:var(--ink);border-color:var(--gold-deep);box-shadow:2px 3px 0 var(--gold-deep)}
.ds-pill-stack .ds-pill.dark{background:var(--ink);color:#fff;border-color:#000;box-shadow:2px 3px 0 #000}

/* --- 4. POSTER-HEAD · 海报标题（取自 Bold Poster）--------
   精修 2026-05-26：字重从 900 → 400，跟 tight letter-spacing 配合，
   达到 Apple/Vellum 级精致感（字越大、字重越轻、字距越紧）*/
.ds-poster{
  font-family:var(--serif);font-weight:400;
  font-size:clamp(64px,11vw,200px);line-height:.88;letter-spacing:-.025em;
  color:#fff;
}
.ds-poster em{font-style:normal;color:var(--gold-light);font-weight:500}
.ds-poster .light{color:rgba(255,255,255,.28);font-weight:400}
.ds-poster .red{color:var(--red-bright)}
.ds-poster + .ds-poster-sub{
  margin-top:36px;font-family:var(--latin);font-style:italic;
  font-size:clamp(20px,2vw,32px);color:rgba(255,255,255,.6);letter-spacing:.02em;
}

/* --- 5. BILINGUAL-SPLIT · 中英双栏分隔（取自 Broadside）-------- */
.ds-bilingual{
  display:grid;grid-template-columns:1fr 1px 1fr;gap:30px;
  align-items:center;width:100%;
}
.ds-bilingual .ds-bi-cn{
  /* 精修：700 → 500 */
  font-family:var(--serif);font-weight:500;
  font-size:clamp(28px,3.6vw,56px);line-height:1.3;color:var(--ink);letter-spacing:-.005em;
}
.ds-bilingual .ds-bi-divider{background:currentColor;align-self:stretch;opacity:.25}
.ds-bilingual .ds-bi-en{
  font-family:var(--latin);font-style:italic;
  font-size:clamp(20px,2.4vw,36px);line-height:1.35;color:var(--ink-soft);
}
.ds-bilingual.dark{color:#fff}
.ds-bilingual.dark .ds-bi-cn{color:#fff}
.ds-bilingual.dark .ds-bi-en{color:rgba(255,255,255,.7)}
@media (max-width:720px){
  .ds-bilingual{grid-template-columns:1fr;gap:18px}
  .ds-bilingual .ds-bi-divider{height:1px}
}

/* --- 6. NEO-FRAME · 偏移阴影框（取自 Raw Grid + BlockFrame）-------- */
.ds-frame{
  display:inline-block;padding:24px 28px;
  background:var(--paper);
  border:2px solid var(--ink);
  box-shadow:6px 6px 0 var(--ink);
  font-family:var(--sans);
  transition:transform var(--t-fast),box-shadow var(--t-fast);
}
.ds-frame:hover{transform:translate(-2px,-2px);box-shadow:8px 8px 0 var(--ink)}
.ds-frame.accent{box-shadow:6px 6px 0 var(--accent);border-color:var(--accent)}
.ds-frame.gold{box-shadow:6px 6px 0 var(--gold);border-color:var(--gold)}

/* --- 7. STAGE · slide 整体容器（标准 16:10 全屏 slide）-------- */
.ds-stage{
  min-height:100vh;padding:120px 8vw 100px;
  display:flex;flex-direction:column;justify-content:center;position:relative;
  font-family:var(--sans);overflow:hidden;
}
.ds-stage.paper{background:var(--paper);color:var(--ink)}
.ds-stage.dark{background:var(--night-0);color:#fff}
.ds-stage.dark::before{
  /* 星空层 — 跟 hero 同源 */
  content:"";position:absolute;inset:0;pointer-events:none;
  background-image:
    radial-gradient(1.5px 1.5px at 12% 22%, rgba(255,228,180,.7), transparent 60%),
    radial-gradient(1px 1px at 28% 65%, rgba(255,255,255,.5), transparent 60%),
    radial-gradient(1.5px 1.5px at 42% 15%, rgba(255,228,180,.6), transparent 60%),
    radial-gradient(1px 1px at 88% 28%, rgba(255,255,255,.55), transparent 60%),
    radial-gradient(1.5px 1.5px at 72% 78%, rgba(255,228,180,.5), transparent 60%);
}
.ds-stage.gold{background:var(--grad-gold);color:var(--ink)}
.ds-stage.red{background:linear-gradient(135deg,var(--red-deep) 0%,var(--red) 100%);color:#fff}
.ds-stage > .ds-stage-inner{position:relative;z-index:2;max-width:1400px;margin:0 auto;width:100%}
.ds-stage .ds-slide-num{
  position:absolute;top:38px;right:8vw;z-index:3;
  font-family:var(--mono);font-size:11px;letter-spacing:.3em;color:var(--ink-mute);
}
.ds-stage.dark .ds-slide-num,.ds-stage.red .ds-slide-num{color:rgba(255,255,255,.4)}

/* --- 8. KICKER · 章节标签 -------- */
.ds-kicker{
  font-family:var(--mono);font-size:12px;letter-spacing:.32em;
  text-transform:uppercase;color:var(--ink-mute);
  display:inline-flex;align-items:center;gap:14px;margin-bottom:24px;
}
.ds-stage.dark .ds-kicker{color:var(--gold-light)}
.ds-kicker::before{content:"";width:42px;height:1px;background:currentColor;opacity:.7}

@media (prefers-reduced-motion:reduce){
  .ds-anim-fadeup,.ds-anim-fade,.ds-anim-reveal-r,.ds-anim-reveal-l,.ds-anim-scale,
  .ds-pin-note{animation:none;transition:none}
}

/* =================================================================
   TERTIARY COMPONENTS · 次级组件库
   tabs / breadcrumbs / badge / chip / pagination / tooltip / progress-bar
   全部走 design tokens，可被任意页面 import 即用。
   ================================================================= */

/* === BADGE · 状态徽标（success/info/warn/error/neutral） === */
.badge{
  display:inline-flex;align-items:center;gap:5px;
  padding:3px 9px;border-radius:99px;
  font-family:var(--mono);font-size:10.5px;font-weight:500;
  letter-spacing:.12em;text-transform:uppercase;line-height:1.2;
  background:rgba(14,18,24,.06);color:var(--ink-soft);
}
.badge.success{background:rgba(52,168,83,.12);color:#1F7A3A}
.badge.info{background:rgba(74,117,229,.12);color:var(--accent-deep)}
.badge.warn{background:rgba(212,168,88,.18);color:var(--gold-deep)}
.badge.error{background:rgba(225,54,28,.12);color:var(--red-deep)}
.badge.dot::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor;flex-shrink:0}

/* === CHIP · 标签 / 筛选项（可删除） === */
.chip{
  display:inline-flex;align-items:center;gap:6px;
  padding:5px 10px 5px 12px;border-radius:99px;
  background:var(--paper-2);color:var(--ink);
  font-family:var(--sans);font-size:12.5px;font-weight:400;
  border:1px solid transparent;
  transition:background var(--t-fast),border-color var(--t-fast);
  cursor:pointer;
}
.chip:hover{background:#fff;border-color:var(--line)}
.chip.is-active{background:var(--accent);color:#fff}
.chip .x{
  display:inline-grid;place-items:center;width:14px;height:14px;border-radius:50%;
  background:rgba(14,18,24,.10);font-size:10px;line-height:1;color:inherit;
  margin-left:2px;
}
.chip.is-active .x{background:rgba(255,255,255,.20)}

/* === TABS · 选项卡 === */
.tabs{
  display:flex;gap:2px;border-bottom:1px solid var(--line);
  font-family:var(--sans);
}
.tabs .tab{
  padding:10px 18px;background:none;border:0;border-bottom:2px solid transparent;
  font-size:13.5px;color:var(--ink-mute);font-weight:400;letter-spacing:.04em;cursor:pointer;
  transition:color var(--t-fast),border-color var(--t-fast);
  margin-bottom:-1px;
}
.tabs .tab:hover{color:var(--ink-soft)}
.tabs .tab[aria-selected="true"],
.tabs .tab.is-active{color:var(--accent);border-bottom-color:var(--accent);font-weight:500}
.tab-panel{padding:22px 0;display:none}
.tab-panel.is-active,
.tab-panel[hidden="false"]{display:block}

/* === BREADCRUMBS · 面包屑 === */
.crumbs{
  display:flex;align-items:center;flex-wrap:wrap;gap:6px;
  font-family:var(--mono);font-size:11px;letter-spacing:.12em;
  color:var(--ink-mute);text-transform:uppercase;line-height:1.5;
}
.crumbs a{
  color:var(--ink-mute);text-decoration:none;
  transition:color var(--t-fast);
}
.crumbs a:hover{color:var(--accent)}
.crumbs .sep{color:rgba(92,101,119,.4);user-select:none}
.crumbs .current{color:var(--ink);font-weight:500}

/* === PAGINATION · 分页 === */
.pager{
  display:flex;gap:4px;align-items:center;justify-content:center;
  font-family:var(--mono);font-size:13px;
}
.pager a,.pager button{
  min-width:36px;height:36px;padding:0 12px;
  display:inline-grid;place-items:center;
  background:#fff;border:1px solid var(--line-soft);border-radius:var(--r-sm);
  color:var(--ink-soft);font-family:inherit;font-size:inherit;
  text-decoration:none;cursor:pointer;
  transition:border-color var(--t-fast),background var(--t-fast),color var(--t-fast);
}
.pager a:hover,.pager button:hover{border-color:var(--accent);color:var(--ink)}
.pager a[aria-current="page"],.pager .is-current{
  background:var(--accent);border-color:var(--accent);color:#fff;font-weight:500;
}
.pager .gap{color:var(--ink-mute);padding:0 4px;cursor:default}

/* === TOOLTIP · 悬浮提示 === */
.tip{position:relative;display:inline-block;cursor:help;border-bottom:1px dashed var(--line);}
.tip::after{
  content:attr(data-tip);
  position:absolute;bottom:calc(100% + 6px);left:50%;transform:translateX(-50%) translateY(4px);
  background:var(--ink);color:#fff;
  font-family:var(--sans);font-size:12px;font-weight:400;letter-spacing:.02em;
  padding:6px 10px;border-radius:var(--r-sm);
  white-space:nowrap;line-height:1.4;
  opacity:0;pointer-events:none;
  transition:opacity var(--t-fast) var(--ease-default), transform var(--t-fast) var(--ease-default);
  box-shadow:var(--sh-2);
  z-index:50;
}
.tip::before{
  content:"";position:absolute;bottom:100%;left:50%;transform:translateX(-50%);
  border:4px solid transparent;border-top-color:var(--ink);
  opacity:0;transition:opacity var(--t-fast);
  z-index:50;
}
.tip:hover::after,.tip:hover::before,
.tip:focus-visible::after,.tip:focus-visible::before{
  opacity:1;transform:translateX(-50%);
}

/* === PROGRESS BAR · 进度条（独立组件，非 chart） === */
.progress{
  width:100%;height:6px;background:var(--paper-2);border-radius:99px;overflow:hidden;
  position:relative;
}
.progress > .bar{
  height:100%;background:linear-gradient(90deg,var(--accent),var(--gold));
  border-radius:99px;transition:width var(--t-slow) var(--ease-default);
}
.progress.sm{height:3px}
.progress.lg{height:10px}
.progress.indeterminate > .bar{
  width:30%;animation:progress-indet 1.4s cubic-bezier(.4,0,.2,1) infinite;
}
@keyframes progress-indet{
  0%{transform:translateX(-100%)}
  100%{transform:translateX(380%)}
}

/* === DIVIDER · 分隔线（带文字） === */
.hr{display:flex;align-items:center;gap:14px;color:var(--ink-mute);
  font-family:var(--mono);font-size:10.5px;letter-spacing:.22em;text-transform:uppercase;
  margin:var(--s-6) 0;
}
.hr::before,.hr::after{content:"";flex:1;height:1px;background:var(--line-soft)}

@media (prefers-reduced-motion:reduce){
  .progress > .bar,.progress.indeterminate > .bar{animation:none;transition:none}
}

