/* =================================================================
   永乐教育 · 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}
}

/* =================================================================
   MERMAID v3 · 紧凑（compact docs preview）
   2026-05-28 精修 · 容器比之前更紧凑，配合文档双栏布局
   ================================================================= */
.ds-mermaid{
  background:var(--paper);
  border:1px solid var(--line-soft);
  border-radius:var(--r-lg);
  padding:42px 32px 28px;
  margin:var(--s-5) 0;
  overflow:auto;position:relative;
  max-height:520px;
  /* 上下两条 hairline 编辑装饰（Stripe Press 文章感）*/
  background-image:
    linear-gradient(to right, var(--line-soft), var(--line-soft)),
    linear-gradient(to right, var(--line-soft), var(--line-soft));
  background-position:0 28px, 0 calc(100% - 28px);
  background-size:48px 1px;
  background-repeat:no-repeat;
}
.ds-mermaid::before{
  content:attr(data-kind);
  position:absolute;top:14px;left:32px;
  font-family:var(--mono);font-size:10px;letter-spacing:.28em;
  color:var(--ink-mute);text-transform:uppercase;
  pointer-events:none;
}
.ds-mermaid::after{
  content:"FIG.";
  position:absolute;top:14px;right:32px;
  font-family:var(--mono);font-size:10px;letter-spacing:.28em;
  color:var(--ink-mute);opacity:.5;text-transform:uppercase;
  pointer-events:none;
}
.ds-mermaid.dark{background:var(--night-1);border-color:rgba(255,255,255,.08)}
.ds-mermaid.dark::before,.ds-mermaid.dark::after{color:rgba(255,255,255,.4)}
.ds-mermaid .mermaid,.ds-mermaid svg{display:block;margin:0 auto;max-width:100%;height:auto}
/* state diagram + small mermaids 默认宽度太窄，强制按容器宽度 fit */
.ds-mermaid > .mermaid > svg,
.ds-mermaid svg[id^="mermaid-"]{width:100%!important;max-width:100%!important}

/* ── 节点（默认）：outline-only · 白底 · 1px hairline ── */
.ds-mermaid svg .node rect,
.ds-mermaid svg .node polygon{
  fill:#fff!important;
  stroke:var(--ink)!important;
  stroke-width:1px!important;
  rx:6;ry:6;
}
/* 圆角 stadium 节点 [(...)] */
.ds-mermaid svg .node rect.basic{rx:18;ry:18}

/* ── 节点文字 ── */
.ds-mermaid svg .nodeLabel,
.ds-mermaid svg .label,
.ds-mermaid svg foreignObject div{
  font-family:var(--sans)!important;
  font-weight:400!important;letter-spacing:.005em!important;
  color:var(--ink)!important;font-size:12.5px!important;line-height:1.4!important;
}

/* ── 边/线（极细 hairline） ── */
.ds-mermaid svg .edgePath path,
.ds-mermaid svg .flowchart-link{
  stroke:var(--ink-soft)!important;
  stroke-width:1px!important;
  fill:none!important;
}
/* 箭头 — 默认偏粗，缩小并变细 */
.ds-mermaid svg marker path,
.ds-mermaid svg #arrowhead path,
.ds-mermaid svg defs marker path{
  stroke:var(--ink-soft)!important;
  fill:var(--ink-soft)!important;
  stroke-width:.5px!important;
}
.ds-mermaid svg defs marker{markerWidth:8;markerHeight:8}

/* ── 边缘 label（小 mono · 浅色 · 透明背景） ── */
.ds-mermaid svg .edgeLabel{
  background:var(--paper)!important;
  font-family:var(--mono)!important;font-size:10px!important;
  letter-spacing:.16em!important;color:var(--ink-mute)!important;
  padding:1px 6px!important;border-radius:0!important;
  text-transform:uppercase;font-weight:500!important;
}
.ds-mermaid svg .edgeLabel rect{fill:var(--paper)!important;stroke:none!important}

/* ── subgraph cluster（dashed 框，不填色） ── */
.ds-mermaid svg .cluster rect{
  fill:transparent!important;
  stroke:var(--line)!important;stroke-width:1px!important;stroke-dasharray:3 3!important;
  rx:12;ry:12;
}
.ds-mermaid svg .cluster .nodeLabel{
  font-family:var(--mono)!important;font-size:10px!important;
  letter-spacing:.28em!important;text-transform:uppercase;color:var(--ink-mute)!important;font-weight:500!important;
}

/* ──────── classDef 语义类 · 全部 outline-only + 微 tinted bg ────────
   原则：accent / gold / muted 只改 stroke + 极淡 bg；不让任何节点变"实心方块"
   只有 :::dark 是 fill 黑底（用于结束/重要节点） */

/* :::accent — 蓝色细描边 + 6% 蓝底 */
.ds-mermaid svg .accent > rect,
.ds-mermaid svg .accent > polygon,
.ds-mermaid svg .accent > circle{
  fill:rgba(74,117,229,.06)!important;
  stroke:var(--accent)!important;stroke-width:1.25px!important;
}
.ds-mermaid svg .accent .nodeLabel,
.ds-mermaid svg .accent foreignObject div{color:var(--accent-deep)!important;font-weight:500!important}

/* :::gold — 金色细描边 + 8% 金底 */
.ds-mermaid svg .gold > rect,
.ds-mermaid svg .gold > polygon,
.ds-mermaid svg .gold > circle{
  fill:rgba(212,168,88,.08)!important;
  stroke:var(--gold-deep)!important;stroke-width:1.25px!important;
}
.ds-mermaid svg .gold .nodeLabel,
.ds-mermaid svg .gold foreignObject div{color:var(--gold-deep)!important;font-weight:500!important}

/* :::dark — 深色实心（罕用：终点 / 关键结果） */
.ds-mermaid svg .dark > rect,
.ds-mermaid svg .dark > polygon,
.ds-mermaid svg .dark > circle{
  fill:var(--ink)!important;stroke:var(--ink)!important;stroke-width:1px!important;
}
.ds-mermaid svg .dark .nodeLabel,
.ds-mermaid svg .dark foreignObject div{color:#fff!important;font-weight:400!important}

/* :::muted — 浅色虚线（弱化节点 / 决策菱形 / 占位） */
.ds-mermaid svg .muted > rect,
.ds-mermaid svg .muted > polygon{
  fill:transparent!important;
  stroke:var(--ink-mute)!important;stroke-width:1px!important;stroke-dasharray:3 3!important;
}
.ds-mermaid svg .muted .nodeLabel,
.ds-mermaid svg .muted foreignObject div{color:var(--ink-mute)!important;font-style:italic;font-weight:400!important}

/* ── SEQUENCE diagram 精修 ── */
.ds-mermaid svg .actor{
  fill:#fff!important;stroke:var(--ink)!important;stroke-width:1px!important;
  rx:6;ry:6;
}
.ds-mermaid svg text.actor>tspan{
  fill:var(--ink)!important;font-family:var(--sans)!important;font-weight:500!important;font-size:12px!important;
}
.ds-mermaid svg line.actor-line{stroke:var(--line)!important;stroke-width:1px!important;stroke-dasharray:2 4!important}
.ds-mermaid svg .messageLine0,
.ds-mermaid svg .messageLine1{stroke:var(--ink-soft)!important;stroke-width:1px!important}
.ds-mermaid svg .messageText{fill:var(--ink-soft)!important;font-family:var(--sans)!important;font-size:11.5px!important;font-weight:400!important}
.ds-mermaid svg .noteText tspan{fill:var(--gold-deep)!important;font-family:var(--sans)!important;font-size:11px!important}
.ds-mermaid svg .note{
  fill:rgba(212,168,88,.10)!important;stroke:var(--gold-deep)!important;stroke-width:1px!important;rx:4;ry:4;
}
.ds-mermaid svg rect.activation0,
.ds-mermaid svg rect.activation1{
  fill:var(--accent)!important;stroke:none!important;opacity:.85;
}

/* ── STATE diagram 精修 ── */
.ds-mermaid svg .state-start,
.ds-mermaid svg .state-end{fill:var(--ink)!important;stroke:none!important}
.ds-mermaid svg g.stateGroup rect,
.ds-mermaid svg g.stateGroup polygon{
  fill:#fff!important;stroke:var(--ink)!important;stroke-width:1px!important;rx:16;ry:16;
}
.ds-mermaid svg .transition{stroke:var(--ink-soft)!important;stroke-width:1px!important;fill:none!important}

/* ── GANTT v2 · 单色调 / 编辑级 / Linear-Notion 风 ── */
.ds-mermaid svg .task{
  stroke-width:0!important;
  rx:2;ry:2;  /* 极小圆角 — 让矩形显得"图表"而非"按钮" */
}
/* 任务条增高 + 减弱默认 task border */
.ds-mermaid svg .task0,.ds-mermaid svg .task1,
.ds-mermaid svg .task2,.ds-mermaid svg .task3{stroke:none!important}
/* "active"（当前进行中）— 加左侧 3px gold 标记 */
.ds-mermaid svg .activeText0,.ds-mermaid svg .activeText1,
.ds-mermaid svg .activeText2,.ds-mermaid svg .activeText3{font-weight:500!important;fill:#fff!important}
.ds-mermaid svg rect.active0,.ds-mermaid svg rect.active1,
.ds-mermaid svg rect.active2,.ds-mermaid svg rect.active3{
  /* gold-light 内描边模拟"现在"小标记 */
  stroke:var(--gold-light)!important;stroke-width:1.5px!important;
}
/* "done"（已完成）— 文字也淡化 */
.ds-mermaid svg .doneText0,.ds-mermaid svg .doneText1,
.ds-mermaid svg .doneText2,.ds-mermaid svg .doneText3{fill:var(--ink-mute)!important;font-weight:400!important;opacity:.7}
/* section 标签 — serif italic */
.ds-mermaid svg .sectionTitle{
  font-family:var(--serif)!important;font-style:italic!important;
  font-size:12px!important;font-weight:400!important;letter-spacing:0!important;
  text-transform:none!important;fill:var(--ink-soft)!important;
}
.ds-mermaid svg .titleText{
  font-family:var(--serif)!important;font-size:18px!important;font-weight:400!important;
  letter-spacing:-.005em!important;fill:var(--ink)!important;
}
/* 任务条上的文字 */
.ds-mermaid svg .taskText{
  font-family:var(--sans)!important;font-size:11.5px!important;
  font-weight:400!important;fill:#fff!important;
}
.ds-mermaid svg .taskTextOutside,
.ds-mermaid svg .taskTextOutsideRight,
.ds-mermaid svg .taskTextOutsideLeft{
  fill:var(--ink-soft)!important;font-size:11px!important;
  font-family:var(--sans)!important;font-weight:400!important;
}
/* 网格 — 极细 hairline */
.ds-mermaid svg .grid .tick line{
  stroke:rgba(14,18,24,.06)!important;stroke-width:1px!important;shape-rendering:crispEdges;
}
.ds-mermaid svg .grid path{stroke:transparent!important}
.ds-mermaid svg .grid .tick text{
  font-family:var(--mono)!important;font-size:10px!important;
  fill:var(--ink-mute)!important;letter-spacing:.04em!important;font-weight:400!important;
}
.ds-mermaid svg .today{
  stroke:var(--red-bright)!important;stroke-width:1px!important;
  stroke-dasharray:2 3!important;opacity:.7;
}
/* section 交替背景 — 极淡 */
.ds-mermaid svg .section0,.ds-mermaid svg .section2{fill:transparent!important}
.ds-mermaid svg .section1,.ds-mermaid svg .section3{fill:rgba(14,18,24,.018)!important}
/* 节点（左侧 actor）边线 */
.ds-mermaid svg g.exclude-range{fill:rgba(14,18,24,.04)!important}

/* =================================================================
   .ds-gantt v3 · 自研纯 CSS 甘特（弃 mermaid gantt）
   设计：Linear roadmap / Notion timeline 风格
       - 单 hue (accent 蓝) + 透明度分状态
       - serif italic section / mono week ticks / sans task labels
       - 一根 1px today 虚红线
   ================================================================= */
.ds-gantt{
  background:var(--paper);
  border:1px solid var(--line-soft);
  border-radius:var(--r-lg);
  padding:42px 32px 32px;
  margin:var(--s-5) 0;
  position:relative;
  font-family:var(--sans);
}
.ds-gantt::before{
  content:attr(data-kind);
  position:absolute;top:14px;left:32px;
  font-family:var(--mono);font-size:10px;letter-spacing:.28em;
  color:var(--ink-mute);text-transform:uppercase;
}
.ds-gantt::after{
  content:"FIG.";
  position:absolute;top:14px;right:32px;
  font-family:var(--mono);font-size:10px;letter-spacing:.28em;
  color:var(--ink-mute);opacity:.5;text-transform:uppercase;
}
.ds-gantt .g-title{
  font-family:var(--serif);font-weight:400;font-size:18px;color:var(--ink);
  letter-spacing:-.005em;margin-bottom:20px;
}
/* 周次刻度行 */
.ds-gantt .g-weeks{
  display:grid;grid-template-columns:140px 1fr;gap:18px;
  align-items:end;margin-bottom:8px;padding-bottom:10px;
  border-bottom:1px solid var(--line-soft);
}
.ds-gantt .g-weeks .g-w-rail{
  display:grid;grid-template-columns:repeat(12,1fr);gap:0;
  font-family:var(--mono);font-size:10px;color:var(--ink-mute);
  letter-spacing:.06em;text-align:center;
}
.ds-gantt .g-weeks .g-w-rail span{position:relative;padding:0 0 8px}
.ds-gantt .g-weeks .g-w-rail span::after{
  content:"";position:absolute;left:50%;bottom:0;width:1px;height:5px;
  background:var(--line);transform:translateX(-50%);
}
/* section header */
.ds-gantt .g-section{
  display:grid;grid-template-columns:140px 1fr;gap:18px;align-items:center;
  margin:18px 0 8px;
}
.ds-gantt .g-section .g-s-label{
  font-family:var(--serif);font-style:italic;font-size:13px;color:var(--ink-soft);
  letter-spacing:0;
}
.ds-gantt .g-section .g-s-meta{
  font-family:var(--mono);font-size:10px;letter-spacing:.18em;color:var(--ink-mute);
  text-transform:uppercase;text-align:right;
}
/* task 行 */
.ds-gantt .g-row{
  display:grid;grid-template-columns:140px 1fr;gap:18px;align-items:center;
  padding:6px 0;
}
.ds-gantt .g-row .g-label{
  font-family:var(--sans);font-size:13px;color:var(--ink);font-weight:400;letter-spacing:.005em;
}
.ds-gantt .g-row .g-track{
  position:relative;height:14px;
  background:
    linear-gradient(to right,
      var(--line-soft) 1px,transparent 1px) 0 50% / calc(100%/12) 100% repeat-x;
}
.ds-gantt .g-bar{
  position:absolute;top:0;height:100%;border-radius:2px;
  display:flex;align-items:center;padding:0 10px;
  font-family:var(--sans);font-size:10.5px;color:#fff;letter-spacing:.02em;font-weight:400;
  transition:opacity .2s;
}
.ds-gantt .g-bar.done{background:rgba(74,117,229,.22);color:transparent}
.ds-gantt .g-bar.default{background:rgba(74,117,229,.7)}
.ds-gantt .g-bar.active{
  background:var(--accent);
  box-shadow:inset 0 0 0 1.5px var(--gold-light);  /* "现在"金色标记 */
}
.ds-gantt .g-bar.crit{background:rgba(225,54,28,.85)}
.ds-gantt .g-bar small{opacity:.75;margin-left:6px;font-family:var(--mono);font-size:9.5px}
/* today line */
.ds-gantt .g-today{
  position:absolute;top:60px;bottom:32px;width:1px;
  background:repeating-linear-gradient(to bottom,var(--red-bright) 0 3px,transparent 3px 6px);
  pointer-events:none;
}
.ds-gantt .g-today::after{
  content:"今";
  position:absolute;top:-22px;left:50%;transform:translateX(-50%);
  font-family:var(--mono);font-size:9.5px;letter-spacing:.18em;
  color:var(--red-bright);background:var(--paper);padding:0 4px;
}

/* =================================================================
   .ds-mindmap v3 · 自研 SVG 思维导图（弃 mermaid mindmap）
   设计：Stripe Press 章节图谱 / 学术插图风
       - 中心实心 ink 大圆
       - 5 个分支扇形展开
       - 二级用文字列表（无框）挂在分支末端
       - 极淡 curve 连接线
   ================================================================= */
.ds-mindmap{
  background:var(--paper);
  border:1px solid var(--line-soft);
  border-radius:var(--r-lg);
  padding:42px 32px 32px;
  margin:var(--s-5) 0;
  position:relative;
}
.ds-mindmap::before{
  content:attr(data-kind);
  position:absolute;top:14px;left:32px;
  font-family:var(--mono);font-size:10px;letter-spacing:.28em;
  color:var(--ink-mute);text-transform:uppercase;
}
.ds-mindmap::after{
  content:"FIG.";
  position:absolute;top:14px;right:32px;
  font-family:var(--mono);font-size:10px;letter-spacing:.28em;
  color:var(--ink-mute);opacity:.5;text-transform:uppercase;
}
.ds-mindmap svg{display:block;width:100%;max-width:920px;margin:0 auto;height:auto;font-family:var(--sans)}
.ds-mindmap .mm-root-circle{fill:var(--ink)}
.ds-mindmap .mm-root-text{fill:#fff;font-family:var(--serif);font-weight:500;font-size:16px;letter-spacing:.02em;text-anchor:middle}
.ds-mindmap .mm-root-text.sub{font-size:11px;font-weight:400;opacity:.7;letter-spacing:.04em}
.ds-mindmap .mm-link{fill:none;stroke:var(--ink-mute);stroke-width:1;opacity:.32}
.ds-mindmap .mm-node-pill{fill:#fff;stroke:var(--ink);stroke-width:1}
.ds-mindmap .mm-node-text{fill:var(--ink);font-family:var(--serif);font-weight:500;font-size:14px;letter-spacing:0;text-anchor:middle}
.ds-mindmap .mm-leaf{fill:var(--ink-mute);font-family:var(--mono);font-size:10.5px;letter-spacing:.04em}
.ds-mindmap .mm-leaf.dot::before{content:"·";margin-right:6px;color:var(--ink)}

/* =================================================================
   通用可视化容器（所有自研 viz 共用 paper 底 + FIG. 角标）
   ================================================================= */
.ds-viz{
  background:var(--paper);
  border:1px solid var(--line-soft);
  border-radius:var(--r-lg);
  padding:42px 32px 32px;
  margin:var(--s-5) 0;
  position:relative;
  font-family:var(--sans);
}
.ds-viz::before{
  content:attr(data-kind);
  position:absolute;top:14px;left:32px;
  font-family:var(--mono);font-size:10px;letter-spacing:.28em;
  color:var(--ink-mute);text-transform:uppercase;
}
.ds-viz::after{
  content:"FIG.";
  position:absolute;top:14px;right:32px;
  font-family:var(--mono);font-size:10px;letter-spacing:.28em;
  color:var(--ink-mute);opacity:.5;text-transform:uppercase;
}
.ds-viz .v-title{
  font-family:var(--serif);font-weight:400;font-size:18px;color:var(--ink);
  letter-spacing:-.005em;margin-bottom:24px;
}
.ds-viz .v-title em{font-style:normal;color:var(--accent);font-weight:500}

/* ──────────────────────────────────────────
   ① VS · 对比双栏（之前 / 之后 · A vs B）
   ────────────────────────────────────────── */
.ds-vs{display:grid;grid-template-columns:1fr 64px 1fr;gap:0;align-items:stretch}
.ds-vs .vs-col{padding:28px 30px;background:#fff;border-radius:var(--r-md)}
.ds-vs .vs-col.before{background:rgba(14,18,24,.025);opacity:.85}
.ds-vs .vs-col.after{background:#fff;box-shadow:0 1px 0 var(--accent)}
.ds-vs .vs-col .vs-lbl{
  font-family:var(--mono);font-size:10px;letter-spacing:.3em;
  color:var(--ink-mute);text-transform:uppercase;margin-bottom:14px;
}
.ds-vs .vs-col.after .vs-lbl{color:var(--accent)}
.ds-vs .vs-col h4{
  font-family:var(--serif);font-weight:400;font-size:22px;line-height:1.25;
  color:var(--ink);margin-bottom:14px;letter-spacing:-.005em;
}
.ds-vs .vs-col ul{list-style:none;display:grid;gap:8px;font-size:13.5px;color:var(--ink-soft);line-height:1.7}
.ds-vs .vs-col li{padding-left:14px;position:relative}
.ds-vs .vs-col li::before{content:"·";position:absolute;left:2px;color:var(--ink-mute)}
.ds-vs .vs-col.after li::before{color:var(--accent)}
.ds-vs .vs-arrow{
  display:flex;align-items:center;justify-content:center;
  font-family:var(--mono);font-size:9px;letter-spacing:.32em;
  color:var(--ink-mute);text-transform:uppercase;
  position:relative;
}
.ds-vs .vs-arrow::before{
  content:"→";font-size:28px;color:var(--accent);font-family:var(--latin);letter-spacing:0;line-height:1;
  position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-weight:300;
}
@media (max-width:700px){
  .ds-vs{grid-template-columns:1fr;gap:24px}
  .ds-vs .vs-arrow{height:32px;transform:rotate(90deg)}
}

/* ──────────────────────────────────────────
   ② STATS · 数据墙（4 大数字一字排开 · 编辑级）
   ────────────────────────────────────────── */
.ds-stats{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));
  gap:0;border-top:1px solid var(--line);border-bottom:1px solid var(--line);
  padding:32px 0;
}
.ds-stats .stat{
  padding:0 24px;text-align:left;
  position:relative;
}
.ds-stats .stat + .stat{border-left:1px solid var(--line-soft)}
.ds-stats .stat .n{
  font-family:var(--serif);font-weight:300;font-size:clamp(40px,5vw,72px);
  line-height:.95;letter-spacing:-.03em;color:var(--ink);margin-bottom:10px;
}
.ds-stats .stat .n em{font-style:normal;color:var(--accent);font-weight:400}
.ds-stats .stat .n sup{font-size:.4em;vertical-align:0.8em;font-weight:400;color:var(--ink-mute)}
.ds-stats .stat .lbl{
  font-family:var(--mono);font-size:10px;letter-spacing:.24em;
  color:var(--ink-mute);text-transform:uppercase;margin-bottom:4px;
}
.ds-stats .stat .note{font-size:12px;color:var(--ink-soft);line-height:1.5}
.ds-stats .stat .delta{
  font-family:var(--mono);font-size:11px;color:#1F7A3A;letter-spacing:.04em;
  margin-top:4px;display:inline-block;
}

/* ──────────────────────────────────────────
   ③ TIMELINE · 横向时间线（milestone 节点）
   ────────────────────────────────────────── */
.ds-timeline{position:relative;padding:40px 20px 16px}
.ds-timeline .tl-rail{
  position:absolute;top:64px;left:40px;right:40px;height:1px;background:var(--line);
}
.ds-timeline .tl-items{display:flex;justify-content:space-between;gap:14px;position:relative;z-index:2}
.ds-timeline .tl-item{flex:1;display:flex;flex-direction:column;align-items:center;text-align:center;max-width:160px}
.ds-timeline .tl-year{
  font-family:var(--latin);font-style:italic;font-size:12px;letter-spacing:.05em;
  color:var(--ink-mute);margin-bottom:14px;
}
.ds-timeline .tl-dot{
  width:11px;height:11px;border-radius:50%;
  background:#fff;border:1.5px solid var(--ink);
  margin-bottom:16px;flex-shrink:0;
}
.ds-timeline .tl-item.now .tl-dot{background:var(--accent);border-color:var(--accent);box-shadow:0 0 0 3px rgba(74,117,229,.15)}
.ds-timeline .tl-item.future .tl-dot{background:#fff;border-style:dashed;border-color:var(--ink-mute);opacity:.6}
.ds-timeline .tl-event{
  font-family:var(--serif);font-weight:500;font-size:14px;color:var(--ink);
  letter-spacing:-.005em;line-height:1.4;margin-bottom:4px;
}
.ds-timeline .tl-item.future .tl-event{color:var(--ink-mute);font-style:italic}
.ds-timeline .tl-note{font-family:var(--mono);font-size:10px;color:var(--ink-mute);letter-spacing:.1em}

/* ──────────────────────────────────────────
   ④ MATRIX · 2×2 决策矩阵（Eisenhower / SWOT）
   ────────────────────────────────────────── */
.ds-matrix{
  display:grid;grid-template-columns:60px 1fr 1fr;grid-template-rows:60px 1fr 1fr;
  gap:0;aspect-ratio:1.4 / 1;max-width:780px;margin:0 auto;
}
.ds-matrix .ax-label{
  font-family:var(--mono);font-size:10px;letter-spacing:.24em;
  color:var(--ink-mute);text-transform:uppercase;
  display:flex;align-items:center;
}
.ds-matrix .ax-y{writing-mode:vertical-rl;transform:rotate(180deg);justify-content:flex-end;padding:8px 0}
.ds-matrix .ax-x{justify-content:center;border-bottom:1px solid var(--line)}
.ds-matrix .corner{}
.ds-matrix .q{
  border:1px solid var(--line-soft);background:#fff;padding:22px;
  display:flex;flex-direction:column;gap:10px;
}
.ds-matrix .q + .q{margin-left:-1px}
.ds-matrix .q-row + .q-row{margin-top:-1px}
.ds-matrix .q .q-lbl{
  font-family:var(--mono);font-size:10px;letter-spacing:.22em;
  color:var(--ink-mute);text-transform:uppercase;
}
.ds-matrix .q.high-high .q-lbl{color:var(--accent)}
.ds-matrix .q.high-high{background:rgba(74,117,229,.04);border-color:var(--accent)}
.ds-matrix .q .q-title{
  font-family:var(--serif);font-weight:500;font-size:17px;color:var(--ink);
  letter-spacing:-.005em;line-height:1.3;
}
.ds-matrix .q .q-list{font-size:12.5px;color:var(--ink-soft);line-height:1.7}
.ds-matrix .q .q-list .item{display:block}

/* ──────────────────────────────────────────
   ⑤ STEPS · 顺序步骤（1→2→3→4 编号流程）
   ────────────────────────────────────────── */
.ds-steps{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:0}
.ds-steps .step{
  position:relative;padding:0 28px 0 0;
}
.ds-steps .step + .step{padding-left:28px;border-left:1px solid var(--line-soft)}
.ds-steps .step .step-n{
  font-family:var(--latin);font-style:italic;font-weight:400;
  font-size:42px;line-height:1;color:var(--accent);
  margin-bottom:14px;letter-spacing:-.02em;
}
.ds-steps .step.done .step-n{color:var(--ink-mute);opacity:.5}
.ds-steps .step h4{
  font-family:var(--serif);font-weight:500;font-size:17px;color:var(--ink);
  letter-spacing:-.005em;margin-bottom:8px;line-height:1.3;
}
.ds-steps .step p{font-size:13px;color:var(--ink-soft);line-height:1.7}
.ds-steps .step .step-meta{
  font-family:var(--mono);font-size:10px;letter-spacing:.18em;
  color:var(--ink-mute);text-transform:uppercase;margin-top:10px;
}

/* ──────────────────────────────────────────
   ⑥ PULL-QUOTE · 大引言块（编辑级 callout）
   ────────────────────────────────────────── */
.ds-quote{
  padding:48px 60px;
  background:linear-gradient(180deg,#fff 0%,var(--paper) 100%);
  border-left:2px solid var(--ink);
  border-radius:0 var(--r-lg) var(--r-lg) 0;
  margin:var(--s-5) 0;
  position:relative;
}
.ds-quote::before{
  content:"\201C";  /* opening curly quote */
  position:absolute;top:14px;left:18px;
  font-family:var(--latin);font-style:italic;font-weight:300;
  font-size:96px;line-height:1;color:var(--ink-mute);opacity:.18;
}
.ds-quote blockquote{
  font-family:var(--serif);font-weight:400;font-size:clamp(22px,2.8vw,32px);
  line-height:1.5;letter-spacing:-.005em;color:var(--ink);max-width:780px;
  position:relative;z-index:1;
}
.ds-quote blockquote em{font-style:normal;color:var(--accent);font-weight:500}
.ds-quote cite{
  display:block;margin-top:24px;
  font-family:var(--mono);font-style:normal;font-size:11px;letter-spacing:.22em;
  color:var(--ink-mute);text-transform:uppercase;
}
.ds-quote cite strong{color:var(--ink);font-weight:500}

/* ── MINDMAP v2 · 三层视觉层级 ── */
/* root (level 0) — 实心 ink 大圆 */
.ds-mermaid svg .mindmap-node.section--1 > circle,
.ds-mermaid svg .mindmap-node[data-level="0"] > circle,
.ds-mermaid svg .sectionrootNode rect,
.ds-mermaid svg g.node.mindmap-node:first-child rect{
  fill:var(--ink)!important;stroke:var(--ink)!important;stroke-width:0!important;rx:99;ry:99;
}
.ds-mermaid svg .mindmap-node.section--1 text,
.ds-mermaid svg .mindmap-node[data-level="0"] text{
  fill:#fff!important;font-family:var(--serif)!important;
  font-weight:500!important;font-size:14px!important;letter-spacing:.02em!important;
}

/* level 1 — outline 大圆角矩形 + serif */
.ds-mermaid svg .mindmap-node.section-0 rect,
.ds-mermaid svg .mindmap-node.section-1 rect,
.ds-mermaid svg .mindmap-node.section-2 rect,
.ds-mermaid svg .mindmap-node.section-3 rect,
.ds-mermaid svg .mindmap-node.section-4 rect,
.ds-mermaid svg .mindmap-node[data-level="1"] rect{
  fill:#fff!important;stroke:var(--ink)!important;stroke-width:1px!important;rx:99;ry:99;
}
.ds-mermaid svg .mindmap-node.section-0 text,
.ds-mermaid svg .mindmap-node.section-1 text,
.ds-mermaid svg .mindmap-node.section-2 text,
.ds-mermaid svg .mindmap-node.section-3 text,
.ds-mermaid svg .mindmap-node.section-4 text,
.ds-mermaid svg .mindmap-node[data-level="1"] text{
  fill:var(--ink)!important;font-family:var(--serif)!important;
  font-weight:500!important;font-size:13px!important;
}

/* level 2+ — 无框，纯文字 mono */
.ds-mermaid svg .mindmap-node[data-level="2"] rect,
.ds-mermaid svg .mindmap-node[data-level="3"] rect{
  fill:transparent!important;stroke:transparent!important;
}
.ds-mermaid svg .mindmap-node[data-level="2"] text,
.ds-mermaid svg .mindmap-node[data-level="3"] text{
  fill:var(--ink-mute)!important;font-family:var(--mono)!important;
  font-weight:400!important;font-size:10.5px!important;letter-spacing:.04em!important;
}
/* 兜底（mermaid 不一定输出 data-level）—— 全 mindmap 字体统一 */
.ds-mermaid svg g.mindmap-node text{
  font-family:var(--serif)!important;font-weight:400!important;
}
/* 边/连接线 — 极淡 */
.ds-mermaid svg g.edges path,
.ds-mermaid svg .edge,
.ds-mermaid svg path.mindmap-edge{
  stroke:var(--ink-mute)!important;stroke-width:1px!important;
  opacity:.35!important;fill:none!important;
}

/* =================================================================
   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%);
}

/* === DEMO CARD COVER · 用真实截图 ===
   .preview.has-shot 用 background-image 显示项目实际截图
   隐藏原本的 emoji glyph，加底部暗色渐变让 badge 文字可读 */
.demo-card .preview.has-shot,
.featured-demo .preview.has-shot{
  position:relative;background-size:cover;background-position:top center;background-repeat:no-repeat;
}
.demo-card .preview.has-shot::before,
.featured-demo .preview.has-shot::before{
  content:"";position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(0,0,0,.06) 0%,rgba(0,0,0,.05) 50%,rgba(0,0,0,.35) 100%);
  pointer-events:none;z-index:1;
}
.demo-card .preview.has-shot .glyph,
.featured-demo .preview.has-shot .glyph{display:none}
.demo-card .preview.has-shot .badge,
.demo-card .preview.has-shot .ch,
.featured-demo .preview.has-shot > div{position:relative;z-index:2}

/* === 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}
}


/* =================================================================
   FT-SITEMAP · footer 完整网站地图组件
   插入位置：footer .ft-grid 之后、.ft-bottom 之前
   功能：让所有页面入口被搜索引擎 & 用户在底部一次看到 / 跳转
   ================================================================= */
footer.site .ft-sitemap{
  max-width:1400px;margin:0 auto;padding:40px 0 36px;
  border-top:1px solid rgba(255,255,255,.08);
}
footer.site .ft-sitemap h6{
  font-family:var(--mono);font-size:10.5px;letter-spacing:.28em;
  color:rgba(255,255,255,.45);text-transform:uppercase;
  font-weight:500;margin:0 0 22px;display:flex;align-items:center;gap:10px;
}
footer.site .ft-sitemap h6::after{
  content:"";flex:1;height:1px;background:rgba(255,255,255,.08);
}
footer.site .ft-sm-grid{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:22px 28px;
}
footer.site .ft-smcol{display:flex;flex-direction:column;gap:8px}
footer.site .ft-smcol .lbl{
  font-family:var(--mono);font-size:9.5px;letter-spacing:.24em;
  color:var(--gold-light);text-transform:uppercase;font-weight:500;margin-bottom:4px;
}
footer.site .ft-smcol a{
  font-family:var(--sans);font-size:12.5px;color:rgba(255,255,255,.65);
  letter-spacing:.02em;line-height:1.55;text-decoration:none;
  transition:color .2s ease,padding-left .2s ease;
}
footer.site .ft-smcol a:hover{color:#fff;padding-left:4px}
@media (max-width:560px){
  footer.site .ft-sitemap{padding:32px 0 28px}
  footer.site .ft-sm-grid{grid-template-columns:repeat(2,1fr);gap:18px 16px}
  footer.site .ft-smcol a{font-size:12px}
}

/* ============================================================
   MOBILE REVAMP · 第一〇九轮 · 移动端构图统一救护包
   ────────────────────────────────────────────────────────────
   解决问题：
   ① 4 列 grid 在 iPad/手机被挤成 3.x 列细长条
   ② 双栏卡片在窄屏每张只剩 130px 宽，单字成行
   ③ sticky 双列布局错位（图片占满 viewport / 文本被挤丝）
   ④ 首页 SCROLL 提示 与 CTA 按钮区域重叠
   ⑤ .preview 卡片有截图时 badge/ch/glyph 仍然遮挡画面
   ────────────────────────────────────────────────────────────
   规则：≤ 768 多列网格强制 1 列；按钮 row 例外保留横排
   ============================================================ */
@media (max-width:768px){
  /* —— 通用：所有 *-grid 卡片网格强制 1 列；保留按钮/徽章 row —— */
  [class$="-grid"]:not(.btn-grid):not(.shortcut-grid):not(.ft-sm-grid):not(.ft-smcol),
  .cap-rows,
  .factions,
  .six-anim,
  .six-mini,
  .stats-row,
  .product-grid,
  .five-figures,
  .h3-detail-wrap,
  .h3-row,
  .triangle-wrap,
  .invariant-wrap,
  .school-pillars,
  .ceo-split,
  .three-col,
  .anim-grid,
  .donts-row,
  .share-cards,
  .spirits-strip,
  .tv-channels,
  .tv-wrap,
  .taste-inner,
  .meta-list,
  .ds-bilingual,
  .ds-steps,
  .ds-vs,
  .fr-meta-row,
  .ai-row,
  .data-row,
  .alumni-row,
  .body-row,
  .pitch-row,
  .shift-grid,
  .var-grid,
  .demos-grid,
  .articles-grid,
  .related-grid,
  .cohort,
  .cohort-grid,
  .formula-block,
  .mech{
    grid-template-columns: 1fr !important;
    gap: 14px !important;
  }

  /* sticky 双列在移动端取消 sticky · 改普通流式 */
  .h3-sticky-side, .h3-sticky, .l1-sticky-side,
  [class*="sticky-side"]{
    position: static !important;
    height: auto !important;
    max-height: none !important;
    top: auto !important;
    margin: 0 0 24px 0 !important;
  }

  /* 卡片内边距收一点 + 字体降一档（不再单字成行） */
  .cap-row,
  .demo-card,
  .fct-card,
  .article-card,
  .spirit-card,
  .alumni-card{
    padding: 22px 20px !important;
  }
  .factions h3, .factions h4,
  .h3-card h3, .h3-card h4{
    font-size: clamp(22px, 6.5vw, 30px) !important;
    line-height: 1.25 !important;
    letter-spacing: 0 !important;
  }
  .factions p, .h3-card p{
    font-size: 14.5px !important;
    line-height: 1.7 !important;
  }

  /* 卡片嵌套小卡（如"文字→印刷→工业→AI"）也单列、字别再竖排 */
  .factions .arrow,
  .factions .arrow-ext{
    font-size: 18px !important;
    line-height: 1.4 !important;
    letter-spacing: .08em !important;
    word-break: keep-all !important;
    writing-mode: horizontal-tb !important;
  }

  /* —— 首页 SCROLL 提示与 CTA 不再重叠 —— */
  .scroll-cue{ display:none !important; }

  /* —— section padding 整体收 —— */
  section, .section, main > section{
    padding-left: 5vw !important;
    padding-right: 5vw !important;
  }

  /* —— hero 主标题在 360-414 视口不撑爆 —— */
  .hero h1{
    font-size: clamp(36px, 9.5vw, 60px) !important;
    line-height: 1.18 !important;
  }
  .hero h1 .l1, .hero h1 .l2{
    white-space: normal !important;
  }

  /* —— hero-badge 长字符串折行 + 字号缩 + max-width —— */
  .hero-badge{
    font-size: 9.5px !important;
    padding: 7px 14px !important;
    letter-spacing: .14em !important;
    flex-wrap: wrap !important;
    line-height: 1.5 !important;
    max-width: 90vw !important;
    text-align: center !important;
    margin-bottom: 38px !important;
  }

  /* —— hero p 段落字号收，line-height 紧 —— */
  .hero p, .hero .hero-sub, .hero .lead{
    font-size: 14.5px !important;
    line-height: 1.7 !important;
    max-width: 92vw !important;
    margin-left: auto !important;
    margin-right: auto !important;
    word-break: break-word !important;
  }

  /* —— 主 CTA 按钮 row 不撑爆 —— */
  .hero .cta-row, .hero-cta{
    flex-direction: column !important;
    align-items: stretch !important;
    gap: 12px !important;
    padding-left: 5vw !important;
    padding-right: 5vw !important;
  }
  .hero .btn, .hero-cta .btn{
    width: 100% !important;
    max-width: 360px !important;
    margin: 0 auto !important;
  }
}

/* ≤ 480px 极端兜底（iPhone SE / Android 小屏） */
@media (max-width:480px){
  .factions h3, .factions h4,
  .h3-card h3{
    font-size: clamp(22px, 7vw, 28px) !important;
  }
  /* 嵌套小卡完全平铺，不再竖排堆字 */
  .factions .arrow,
  .factions .arrow-ext{
    font-size: 16px !important;
    letter-spacing: .04em !important;
  }
  /* hero 标题继续收一档（防右边切到） */
  .hero h1{
    font-size: clamp(32px, 8.4vw, 46px) !important;
    margin-bottom: 28px !important;
  }
  .hero h1 .l1, .hero h1 .l2{
    white-space: normal !important;  /* 允许折行 */
  }
  .page-hero h1{
    font-size: clamp(28px, 8vw, 40px) !important;
    line-height: 1.2 !important;
  }
}

/* 全局：防止任何子元素撑爆 viewport 造成横向滚动 */
html, body{
  overflow-x: hidden;
  max-width: 100vw;
}
@media (max-width:768px){
  /* 子页 hero 同样压 */
  .page-hero h1{
    font-size: clamp(32px, 8.6vw, 52px) !important;
    line-height: 1.2 !important;
  }
  /* demo cover aspect 改 4:3，让 1600×1000 截图比例更接近不被裁太狠 */
  .demo-card .preview, .featured-demo .preview{
    aspect-ratio: 16/10 !important;
    min-height: 200px !important;
  }
}

/* ============================================================
   .is-placeholder · 占位卡片暂时隐藏（第一一四轮）
   将真实导师/校友/作品填上后，移除元素的 is-placeholder class 即可恢复
   ============================================================ */
.is-placeholder{display:none !important}

/* ============================================================
   .preview.has-shot 升级：有截图时彻底隐藏 badge / ch / glyph
   只剩纯图，背景定位改 center 让"核心区域"露出
   ============================================================ */
.demo-card .preview.has-shot,
.featured-demo .preview.has-shot{
  background-position: center top !important;
}
.demo-card .preview.has-shot .badge,
.demo-card .preview.has-shot .ch,
.featured-demo .preview.has-shot .badge,
.featured-demo .preview.has-shot .ch,
.demo-card .preview.has-shot .glyph,
.featured-demo .preview.has-shot .glyph{
  display: none !important;
}
