@charset "UTF-8";
/* ==========================================================================
   IVORY 白金 · 设计系统 v8
   单层权威样式表 —— 只允许改 :root 令牌与规则本身，严禁叠覆盖层
   影即边框：全站 box-shadow 透明度 ≤ 0.10，不用 border 画卡片边
   ========================================================================== */

/* @FONTFACE:BEGIN */
/* ---- @font-face: 由 tools/build_fonts.py 自动生成，请勿手改 ---- */
@font-face{font-family:"NotoSerifSC";font-style:normal;font-weight:900;font-display:swap;src:url("fonts/NotoSerifSC-900.woff2?v=1787909008") format("woff2")}
@font-face{font-family:"NotoSansSC";font-style:normal;font-weight:400;font-display:swap;src:url("fonts/NotoSansSC-400.woff2?v=1787909018") format("woff2")}
@font-face{font-family:"NotoSansSC";font-style:normal;font-weight:700;font-display:swap;src:url("fonts/NotoSansSC-700.woff2?v=1787909028") format("woff2")}
@font-face{font-family:"SpaceGrotesk";font-style:normal;font-weight:500;font-display:swap;src:url("fonts/SpaceGrotesk-500.woff2?v=1787909029") format("woff2")}
@font-face{font-family:"SpaceGrotesk";font-style:normal;font-weight:700;font-display:swap;src:url("fonts/SpaceGrotesk-700.woff2?v=1787909029") format("woff2")}
@font-face{font-family:"JetBrainsMono";font-style:normal;font-weight:500;font-display:swap;src:url("fonts/JetBrainsMono-500.woff2?v=1787909030") format("woff2")}
@font-face{font-family:"JetBrainsMono";font-style:normal;font-weight:700;font-display:swap;src:url("fonts/JetBrainsMono-700.woff2?v=1787909030") format("woff2")}
/* ---- /@font-face ---- */
  /* @FONTFACE:END */

/* --------------------------------------------------------------- 1. 令牌 */
:root{
  /* 纸面 */
  --paper:#FCFCFB;
  --card:#FFF;
  --wash:#F5F5F2;
  /* 墨色 */
  --ink:#171717;
  --ink-2:#4D4D4D;
  --ink-3:#8A8A86;
  /* 发丝线 */
  --hair:#E8E8E4;
  --hair-2:#D8D8D2;
  /* 唯一强调色 */
  --blue:#1D6FEB;
  --blue-hover:#1859C4;
  --blue-dim:rgba(29,111,235,.08);
  --blue-line:rgba(29,111,235,.28);
  /* 数据蓝阶 */
  --d1:#1D6FEB;
  --d2:#6FA8F5;
  --d3:#93B8F8;
  --d4:#B9D2F8;
  --d5:#D7E3F9;
  /* 旧令牌别名（供内联样式与 JS 消费） */
  --accent:var(--blue);
  --accent-hover:var(--blue-hover);
  --accent-dim:var(--blue-dim);
  --accent-line:var(--blue-line);
  --muted:var(--ink-3);
  --line:var(--hair);
  --line-2:var(--hair-2);
  --bg:var(--paper);
  --surface:var(--card);

  /* 字族四角色 */
  --font-serif:"NotoSerifSC","Songti SC","SimSun",serif;
  --font-sans:"NotoSansSC","PingFang SC","Microsoft YaHei",system-ui,-apple-system,sans-serif;
  --font-num:"SpaceGrotesk","NotoSansSC",system-ui,sans-serif;
  --font-mono:"JetBrainsMono",ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;

  /* 编排索引（由 JS 写入行内，:root 提供兜底值） */
  --i:0;

  /* 几何 */
  --r-sm:4px;
  --r-md:6px;
  --r-lg:8px;
  --r-xl:10px;
  --r-2xl:12px;
  --r-pill:999px;
  --s1:8px; --s2:16px; --s3:24px; --s4:32px; --s5:40px;
  --s6:48px; --s8:64px; --s10:80px; --s12:96px;
  --maxw:1180px;
  --maxw-text:880px;

  /* 影即边框 */
  --ring:0 0 0 1px rgba(23,23,23,.08);
  --ring-hover:0 0 0 1px rgba(23,23,23,.08), 0 2px 2px rgba(23,23,23,.04), 0 6px 12px -8px rgba(23,23,23,.03);
  --ring-lift:0 0 0 1px rgba(23,23,23,.08), 0 4px 6px rgba(23,23,23,.03), 0 14px 28px -16px rgba(23,23,23,.06);

  /* 缓动 */
  --e-out:cubic-bezier(.22,.61,.36,1);
  --e-expo:cubic-bezier(.16,1,.3,1);
  --e-soft:cubic-bezier(.4,0,.2,1);
}

/* --------------------------------------------------------------- 2. reset */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}
body{
  margin:0;
  background:var(--paper);
  color:var(--ink-2);
  font-family:var(--font-sans);
  font-size:15px;
  line-height:1.75;
  font-weight:400;
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
  overflow-x:hidden;
}
body.lock-scroll{overflow:hidden}
h1,h2,h3,h4,p,figure,blockquote,ul,ol,dl{margin:0}
ul,ol{padding:0;list-style:none}
img,svg,canvas{display:block;max-width:100%}
a{color:inherit;text-decoration:none}
button,input,select,textarea{font:inherit;color:inherit}
button{background:none;border:0;padding:0;cursor:pointer}
table{border-collapse:collapse;width:100%}
::selection{background:var(--blue-dim);color:var(--ink)}
:focus-visible{outline:2px solid var(--blue);outline-offset:3px;border-radius:var(--r-sm)}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
.skip-link{position:absolute;left:-9999px;top:0;z-index:200;padding:12px 20px;background:var(--card);box-shadow:var(--ring-lift);border-radius:var(--r-md);color:var(--blue);font-family:var(--font-mono);font-size:12px}
.skip-link:focus{left:16px;top:16px}

/* --------------------------------------------------------------- 3. 排版 */
.num{font-family:var(--font-num);font-weight:700;font-variant-numeric:tnum;font-feature-settings:"tnum" 1;letter-spacing:-.01em}
.kicker{
  font-family:var(--font-mono);
  font-size:11px;
  font-weight:500;
  letter-spacing:.2em;
  text-transform:uppercase;
  color:var(--ink-3);
  display:flex;
  align-items:center;
  gap:10px;
}
.kicker-bar{display:block;width:34px;height:2px;background:var(--blue);flex:none}
.kicker-line{flex:1;height:1px;background:var(--hair);min-width:24px}

/* --------------------------------------------------------------- 4. 布局 */
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 32px}
.wrap-narrow{max-width:var(--maxw-text);margin:0 auto;padding:0 32px}
.section{padding:var(--s12) 0}
.section-tight{padding:var(--s8) 0}

/* --------------------------------------------------------------- 5. 导航 */
.site-nav{
  position:fixed;top:0;left:0;right:0;z-index:80;
  background:rgba(252,252,251,.82);
  backdrop-filter:saturate(180%) blur(14px);
  -webkit-backdrop-filter:saturate(180%) blur(14px);
  box-shadow:0 0 0 1px rgba(23,23,23,.05);
  transform:translateY(0);
  transition:transform .4s var(--e-out), box-shadow .3s var(--e-out);
}
.site-nav.is-hidden{transform:translateY(-100%)}
.site-nav.is-stuck{box-shadow:0 0 0 1px rgba(23,23,23,.07), 0 6px 20px -14px rgba(23,23,23,.08)}
.nav-inner{max-width:var(--maxw);margin:0 auto;padding:0 32px;height:64px;display:flex;align-items:center;gap:24px}
.nav-logo{display:flex;align-items:center;gap:10px;font-family:var(--font-serif);font-weight:900;color:var(--ink);font-size:17px;letter-spacing:-.01em;flex:none}
.nav-mark{width:22px;height:22px;flex:none;transition:transform .6s var(--e-out)}
.nav-logo:hover .nav-mark{transform:rotate(360deg)}
.nav-links{display:flex;align-items:center;gap:4px;margin-left:auto}
.nav-link{
  position:relative;padding:8px 12px;font-size:13.5px;color:var(--ink-2);
  font-family:var(--font-mono);letter-spacing:.02em;transition:color .25s var(--e-out);
}
.nav-link::after{
  content:"";position:absolute;left:12px;right:12px;bottom:2px;height:1px;
  background:var(--blue);transform:scaleX(0);transform-origin:left;
  transition:transform .32s var(--e-out);
}
.nav-link:hover{color:var(--ink)}
.nav-link:hover::after,.nav-link.is-active::after{transform:scaleX(1)}
.nav-link.is-active{color:var(--blue)}
.nav-cta{
  margin-left:8px;padding:8px 16px;border-radius:var(--r-pill);
  background:var(--ink);color:var(--paper);font-family:var(--font-mono);
  font-size:11px;letter-spacing:.16em;text-transform:uppercase;
  transition:transform .25s var(--e-out), background .25s var(--e-out);
}
.nav-cta:hover{transform:translateY(-1px);background:var(--blue)}
.nav-burger{display:none;margin-left:auto;width:40px;height:40px;align-items:center;justify-content:center;flex-direction:column;gap:5px}
.nav-burger span{display:block;width:18px;height:1.5px;background:var(--ink);transition:transform .3s var(--e-out), opacity .2s}
.nav-burger.is-open span:nth-child(1){transform:translateY(6.5px) rotate(45deg)}
.nav-burger.is-open span:nth-child(2){opacity:0}
.nav-burger.is-open span:nth-child(3){transform:translateY(-6.5px) rotate(-45deg)}
.nav-drawer{
  position:fixed;inset:0;z-index:79;background:var(--paper);
  padding:96px 28px 40px;transform:translateY(-100%);
  transition:transform .5s var(--e-expo);overflow-y:auto;
}
.nav-drawer.is-open{transform:translateY(0)}
.nav-drawer a{
  display:block;padding:18px 0;font-family:var(--font-serif);font-weight:900;
  font-size:26px;color:var(--ink);box-shadow:0 1px 0 rgba(23,23,23,.07);
}
.nav-drawer .nav-drawer-sub{font-family:var(--font-mono);font-size:11px;letter-spacing:.2em;color:var(--ink-3);font-weight:400;display:block;margin-top:4px}

/* --------------------------------------------------------------- 6. 纸帘 */
#trCurtain{
  position:fixed;inset:0;z-index:300;pointer-events:none;
  display:flex;align-items:center;justify-content:center;
}
#trCurtain .curtain-layer{
  position:absolute;inset:0;transform:translateY(101%);
  will-change:transform;
}
#trCurtain .curtain-front{background:var(--paper);z-index:2}
#trCurtain .curtain-back{background:var(--wash);z-index:1}
#trCurtain .curtain-progress{
  position:absolute;top:0;left:0;height:2px;width:0;background:var(--blue);z-index:5;
  transition:width .5s var(--e-out);
}
#trCurtain .curtain-core{
  position:relative;z-index:4;text-align:center;opacity:0;
  transition:opacity .3s var(--e-out);
}
#trCurtain.is-cover .curtain-core{opacity:1}
#trCurtain.is-breathe .curtain-core{animation:curtainBreathe 1.8s ease-in-out infinite}
@keyframes curtainBreathe{0%,100%{opacity:.45}50%{opacity:1}}
.radar-logo{width:64px;height:64px;margin:0 auto 18px;overflow:visible}
.radar-logo .rl-ring{fill:none;stroke:var(--ink);stroke-width:1.25;opacity:.5}
.radar-logo .rl-track{fill:none;stroke:var(--ink-3);stroke-width:1;opacity:.4}
.radar-logo .rl-sweep{fill:none;stroke:var(--blue);stroke-width:2;stroke-linecap:round}
.radar-logo .rl-dot{fill:var(--blue)}
.radar-logo .rl-blip{fill:var(--blue);opacity:0}
.curtain-wordmark{
  font-family:var(--font-mono);font-size:13px;font-weight:500;letter-spacing:.6em;
  text-transform:uppercase;color:var(--ink-2);
}
#trCurtain.is-reveal .curtain-wordmark{letter-spacing:.34em;transition:letter-spacing .7s var(--e-expo)}

/* --------------------------------------------------------------- 7. Cover */
.cover{
  min-height:100vh;display:flex;flex-direction:column;justify-content:center;
  padding:120px 0 64px;position:relative;
}
.cover-inner{max-width:var(--maxw);margin:0 auto;padding:0 32px;width:100%}
.cover-kicker{justify-content:center;margin-bottom:36px}
.cover-stage{
  position:relative;width:100%;height:clamp(140px,17vw,220px);
  margin:0 auto 8px;
}
#heroCanvas{position:absolute;inset:0;width:100%;height:100%}
.cover-fallback{display:none;font-family:var(--font-serif);font-weight:900;font-size:clamp(38px,7vw,86px);color:var(--ink);line-height:1.2;text-align:center}
.no-canvas .cover-fallback{display:block}
.no-canvas .cover-stage{height:auto}
.cover-deck{
  max-width:600px;margin:0 auto;text-align:center;font-size:16px;
  color:var(--ink-2);line-height:1.8;
}
.cover-cta{display:flex;gap:12px;justify-content:center;margin-top:36px;flex-wrap:wrap}
.btn{
  display:inline-flex;align-items:center;gap:10px;
  padding:13px 26px;border-radius:var(--r-pill);
  font-family:var(--font-mono);font-size:11.5px;font-weight:500;
  letter-spacing:.16em;text-transform:uppercase;
  transition:transform .25s var(--e-out), box-shadow .3s var(--e-out), background .25s var(--e-out), color .25s var(--e-out);
}
.btn-solid{background:var(--ink);color:var(--paper);box-shadow:0 0 0 1px rgba(23,23,23,.08)}
.btn-solid:hover{transform:translateY(-1px);background:var(--ink);box-shadow:0 0 0 1px rgba(23,23,23,.08), 0 4px 10px rgba(23,23,23,.06)}
.btn-ghost{background:var(--card);color:var(--ink);box-shadow:var(--ring)}
.btn-ghost:hover{transform:translateY(-1px);box-shadow:var(--ring-hover)}
.btn-arrow{transition:transform .3s var(--e-out)}
.btn:hover .btn-arrow{transform:translateX(3px)}

.data-band{
  display:grid;grid-template-columns:repeat(4,1fr);gap:1px;
  background:var(--hair);margin-top:64px;
  box-shadow:var(--ring);border-radius:var(--r-2xl);overflow:hidden;
}
.band-item{background:var(--card);padding:26px 24px;text-align:center}
.band-num{font-family:var(--font-num);font-weight:700;font-size:clamp(24px,3vw,34px);color:var(--ink);font-variant-numeric:tnum;line-height:1.1}
.band-label{font-family:var(--font-mono);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--ink-3);margin-top:8px}
.scroll-hint{
  display:flex;flex-direction:column;align-items:center;gap:8px;margin-top:40px;
  font-family:var(--font-mono);font-size:10px;letter-spacing:.24em;color:var(--ink-3);text-transform:uppercase;
}
.scroll-hint i{display:block;width:1px;height:34px;background:linear-gradient(to bottom,var(--hair-2),transparent);animation:hintSlide 2.2s var(--e-soft) infinite}
@keyframes hintSlide{0%{transform:scaleY(0);transform-origin:top}55%{transform:scaleY(1);transform-origin:top}56%{transform-origin:bottom}100%{transform:scaleY(0);transform-origin:bottom}}

/* --------------------------------------------------------------- 8. 跑马灯 */
.marquee{
  position:relative;overflow:hidden;padding:18px 0;
  background:var(--wash);box-shadow:0 0 0 1px rgba(23,23,23,.05);
}
.marquee::before,.marquee::after{
  content:"";position:absolute;top:0;bottom:0;width:140px;z-index:2;pointer-events:none;
}
.marquee::before{left:0;background:linear-gradient(90deg,var(--wash),rgba(245,245,242,0))}
.marquee::after{right:0;background:linear-gradient(270deg,var(--wash),rgba(245,245,242,0))}
.marquee-track{display:flex;width:max-content;animation:marqueeRun 90s linear infinite}
.marquee:hover .marquee-track{animation-play-state:paused}
.marquee-item{
  font-family:var(--font-mono);font-size:11.5px;letter-spacing:.06em;color:var(--ink-3);
  padding:0 22px;white-space:nowrap;display:inline-flex;align-items:center;gap:22px;
}
.marquee-item::after{content:"";width:3px;height:3px;border-radius:50%;background:var(--hair-2)}
@keyframes marqueeRun{from{transform:translateX(0)}to{transform:translateX(-50%)}}

/* --------------------------------------------------------------- 9. 章节头 C1 */
.sec-head{position:relative;margin-bottom:var(--s8);overflow:hidden}
.sec-head-top{display:flex;align-items:center;gap:16px;margin-bottom:20px}
.sec-title{
  font-family:var(--font-serif);font-weight:900;color:var(--ink);
  font-size:clamp(30px,4.4vw,50px);line-height:1.22;letter-spacing:-.015em;
  max-width:16em;position:relative;z-index:2;
}
.sec-sub{margin-top:16px;max-width:52em;color:var(--ink-2);font-size:15px;position:relative;z-index:2}
.fig-note{
  font-family:var(--font-mono);font-size:10px;letter-spacing:.2em;text-transform:uppercase;
  color:var(--ink-3);position:relative;z-index:2;
}
.wm-num{
  position:absolute;right:-.06em;top:-.24em;z-index:1;pointer-events:none;
  font-family:var(--font-num);font-weight:700;font-size:clamp(120px,17vw,240px);
  line-height:.8;color:rgba(29,111,235,.055);letter-spacing:-.04em;
  will-change:transform;
}
.head-row{display:flex;align-items:flex-end;justify-content:space-between;gap:24px}

/* --------------------------------------------------------------- 10. TL;DR */
.tldr-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:20px}
.concl-card{
  position:relative;background:var(--card);border-radius:var(--r-2xl);
  padding:32px 28px 34px;box-shadow:var(--ring);overflow:hidden;
  transition:transform .35s var(--e-out), box-shadow .35s var(--e-out);
}
.concl-card:hover{transform:translateY(-2px);box-shadow:var(--ring-lift)}
.concl-no{
  position:absolute;right:-10px;bottom:-30px;z-index:0;pointer-events:none;
  font-family:var(--font-num);font-weight:700;font-size:132px;line-height:1;
  color:rgba(23,23,23,.035);letter-spacing:-.05em;
}
.concl-inner{position:relative;z-index:1}
.concl-metric{
  font-family:var(--font-num);font-weight:700;font-size:34px;color:var(--blue);
  line-height:1;font-variant-numeric:tnum;letter-spacing:-.02em;
}
.concl-metric-label{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--ink-3);margin-top:8px}
.concl-title{
  font-family:var(--font-serif);font-weight:900;font-size:19px;line-height:1.45;
  color:var(--ink);margin:22px 0 12px;letter-spacing:-.005em;
}
.concl-body{font-size:14px;line-height:1.85;color:var(--ink-2)}
.concl-body strong{color:var(--ink);font-weight:700;font-family:var(--font-num)}
.concl-link{
  display:inline-flex;align-items:center;gap:8px;margin-top:20px;
  font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--blue);
}
.concl-link span{transition:transform .3s var(--e-out)}
.concl-link:hover span{transform:translateX(4px)}

/* --------------------------------------------------------------- 11. 目录 */
.toc-list{box-shadow:var(--ring);border-radius:var(--r-2xl);overflow:hidden;background:var(--card)}
.toc-row{
  display:grid;grid-template-columns:88px 1fr auto;align-items:center;gap:24px;
  padding:26px 32px;position:relative;
  box-shadow:0 1px 0 rgba(23,23,23,.06);
  transition:background .3s var(--e-out), box-shadow .3s var(--e-out);
}
.toc-row:last-child{box-shadow:none}
.toc-row::before{
  content:"";position:absolute;left:0;top:0;bottom:0;width:2px;background:var(--blue);
  transform:scaleY(0);transform-origin:center;transition:transform .35s var(--e-out);
}
.toc-row:hover{background:var(--blue-dim)}
.toc-row:hover::before{transform:scaleY(1)}
.toc-no{font-family:var(--font-num);font-weight:700;font-size:26px;color:var(--ink-3);font-variant-numeric:tnum;transition:color .3s var(--e-out)}
.toc-row:hover .toc-no{color:var(--blue)}
.toc-name{font-family:var(--font-serif);font-weight:900;font-size:23px;color:var(--ink);letter-spacing:-.01em}
.toc-desc{font-size:13.5px;color:var(--ink-3);margin-top:4px}
.toc-metric{font-family:var(--font-mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-3);text-align:right}
.toc-arrow{width:22px;height:22px;color:var(--ink-3);transition:transform .35s var(--e-out), color .3s var(--e-out);margin-left:16px}
.toc-row:hover .toc-arrow{transform:translateX(6px);color:var(--blue)}
.toc-right{display:flex;align-items:center}

/* --------------------------------------------------------------- 12. Bento */
.bento{display:grid;grid-template-columns:repeat(12,1fr);gap:20px}
.bento-card{
  background:var(--card);border-radius:var(--r-2xl);box-shadow:var(--ring);
  padding:28px;position:relative;overflow:hidden;
  transition:box-shadow .35s var(--e-out);
}
.bento-card:hover{box-shadow:var(--ring-hover)}
.span-5{grid-column:span 5}
.span-7{grid-column:span 7}
.card-title{font-family:var(--font-serif);font-weight:900;font-size:18px;color:var(--ink);letter-spacing:-.005em}
.card-note{font-size:12.5px;color:var(--ink-3);margin-top:6px;line-height:1.6}
.card-head{margin-bottom:20px}

/* 星图 */
.stars-in-wrap{display:flex;align-items:center;justify-content:center;min-height:220px}
.star-map{display:block;width:100%;max-width:380px;height:auto}
.star-dots{display:block}
.dot{transition:opacity .5s var(--e-out);opacity:0}
.js .stars-in .dot{opacity:1}
.dot-top{animation:dotPulse 2.6s var(--e-soft) infinite;transform-origin:center;transform-box:fill-box}
@keyframes dotPulse{0%,100%{opacity:1}50%{opacity:.55}}
.map-center-num{font-family:var(--font-num);font-weight:700;font-size:34px;fill:var(--ink);text-anchor:middle}
.map-center-lab{font-family:var(--font-mono);font-size:9px;letter-spacing:.18em;fill:var(--ink-3);text-anchor:middle}

/* 语言环 */
.lang-chart{display:flex;align-items:center;gap:24px;flex-wrap:wrap}
.donut{flex:none}
.donut-arcs{display:block}
.donut-hole{font-family:var(--font-num);font-weight:700;font-size:26px;fill:var(--ink);text-anchor:middle;transition:fill .25s}
.donut-lab{font-family:var(--font-mono);font-size:8.5px;letter-spacing:.16em;fill:var(--ink-3);text-anchor:middle}
.donut-arc{transition:opacity .3s var(--e-out), transform .3s var(--e-out);transform-origin:center;cursor:default}
.donut-arc.dim{opacity:.28}
.lang-legend{display:flex;flex-direction:column;gap:7px;flex:1;min-width:150px}
.legend-row{display:flex;align-items:center;gap:9px;font-size:12.5px;color:var(--ink-2);cursor:default;padding:2px 0;transition:color .2s}
.legend-row:hover,.legend-row.on{color:var(--ink)}
.legend-swatch{width:9px;height:9px;border-radius:2px;flex:none}
.legend-name{flex:1}
.legend-val{font-family:var(--font-num);font-weight:700;font-variant-numeric:tnum;color:var(--ink)}

/* 韦恩 */
.venn-wrap{position:relative;margin:0 auto;max-width:320px}
.venn{display:block;width:100%;height:auto}
.venn-lab-html{text-align:center;pointer-events:none;transition:transform .3s var(--e-out)}
.venn-wrap:hover .venn-lab-html{transform:translate(-50%,-50%) scale(1.04)}
.venn-x{
  font-family:var(--font-num);font-weight:700;font-size:12px;color:var(--blue);
  pointer-events:none;
}
.venn-circle{fill:none;stroke-width:1.25}
.venn-num{font-family:var(--font-num);font-weight:700;font-size:20px;fill:var(--ink);text-anchor:middle}
.venn-note{font-family:var(--font-mono);font-size:9px;fill:var(--ink-3);text-anchor:middle}

/* 直方图 */
.hist{display:flex;flex-direction:column;gap:12px}
.hist-row{display:grid;grid-template-columns:66px 1fr 44px;align-items:center;gap:12px}
.hist-lab{font-family:var(--font-mono);font-size:11px;color:var(--ink-3);letter-spacing:.04em}
.hist-track{height:8px;background:var(--wash);border-radius:var(--r-pill);overflow:hidden}
.hist-fill{height:100%;background:var(--blue);border-radius:var(--r-pill);width:0;transition:width .9s var(--e-expo)}
.hist-val{font-family:var(--font-num);font-weight:700;font-size:13px;color:var(--ink);text-align:right;font-variant-numeric:tnum}

/* --------------------------------------------------------------- 13. 榜单 */
.board-head{padding:132px 0 40px}
.filter-bar{
  display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-bottom:24px;
}
.filter-box{
  position:relative;flex:1;min-width:220px;max-width:420px;
}
.filter-input{
  width:100%;padding:11px 16px 11px 38px;border-radius:var(--r-pill);
  background:var(--card);box-shadow:var(--ring);font-size:14px;color:var(--ink);
  transition:box-shadow .3s var(--e-out);
}
.filter-input::placeholder{color:var(--ink-3)}
.filter-input:focus{outline:none;box-shadow:0 0 0 1px var(--blue-line), 0 0 0 4px var(--blue-dim)}
.filter-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);width:15px;height:15px;color:var(--ink-3)}
.filter-chip{
  padding:8px 16px;border-radius:var(--r-pill);background:var(--card);box-shadow:var(--ring);
  font-family:var(--font-mono);font-size:11px;letter-spacing:.1em;color:var(--ink-2);
  transition:box-shadow .25s var(--e-out), color .25s var(--e-out);
}
.filter-chip:hover{box-shadow:var(--ring-hover);color:var(--ink)}
.filter-chip.is-active{box-shadow:0 0 0 1px var(--blue-line);color:var(--blue);background:var(--blue-dim)}
.filter-count{font-family:var(--font-mono);font-size:11px;letter-spacing:.12em;color:var(--ink-3);margin-left:auto}

.board-card{background:var(--card);border-radius:var(--r-2xl);box-shadow:var(--ring);overflow:hidden}
.board-thead{
  display:grid;grid-template-columns:56px minmax(0,1fr) 110px 96px 120px;
  gap:16px;padding:14px 24px;background:var(--wash);
  font-family:var(--font-mono);font-size:9.5px;letter-spacing:.16em;
  text-transform:uppercase;color:var(--ink-3);align-items:center;
}
.board-row{
  display:grid;grid-template-columns:56px minmax(0,1fr) 110px 96px 120px;
  gap:16px;padding:18px 24px;align-items:center;position:relative;cursor:pointer;
  box-shadow:0 1px 0 rgba(23,23,23,.055);
  transition:background .25s var(--e-out);
}
.board-row:last-child{box-shadow:none}
.board-row::before{
  content:"";position:absolute;left:0;top:0;bottom:0;width:2px;background:var(--blue);
  transform:scaleY(0);transform-origin:center;transition:transform .3s var(--e-out);
}
.board-row:hover{background:var(--blue-dim)}
.board-row:hover::before{transform:scaleY(1)}
.board-row:focus-visible{outline:2px solid var(--blue);outline-offset:-2px}
.board-row.r1{background:rgba(29,111,235,.045)}
.board-row.r2{background:rgba(29,111,235,.028)}
.board-row.r3{background:rgba(29,111,235,.018)}
.board-row.r1::before,.board-row.r2::before,.board-row.r3::before{transform:scaleY(1)}
.board-row.row-hidden{display:none}
.row-rank{font-family:var(--font-num);font-weight:700;font-size:16px;color:var(--ink-3);font-variant-numeric:tnum;display:flex;align-items:center;gap:8px}
.row-rank b{font-weight:700}
.badge-top{
  display:inline-flex;align-items:center;padding:2px 7px;border-radius:var(--r-sm);
  background:var(--blue);color:#FFF;font-family:var(--font-mono);font-size:8.5px;
  letter-spacing:.1em;font-weight:500;
}
.row-main{min-width:0}
.row-name{font-family:var(--font-mono);font-size:13.5px;color:var(--ink);letter-spacing:-.005em;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.row-name .row-owner{color:var(--ink-3)}
.row-desc{
  font-size:12.5px;color:var(--ink-3);margin-top:5px;line-height:1.55;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
.row-lang{display:flex;align-items:center;gap:7px;font-size:12px;color:var(--ink-2);font-family:var(--font-mono)}
.lang-dot{width:8px;height:8px;border-radius:50%;flex:none}
.row-star{font-family:var(--font-num);font-weight:700;font-size:14px;color:var(--ink);font-variant-numeric:tnum;text-align:right}
.row-star small{display:block;font-weight:700;font-size:11px;color:var(--blue);margin-top:2px}
.row-bar-col{display:flex;flex-direction:column;gap:6px}
.row-bar{height:5px;background:var(--wash);border-radius:var(--r-pill);overflow:hidden}
.row-bar i{display:block;height:100%;width:0;background:var(--blue);border-radius:var(--r-pill);transition:width .8s var(--e-expo)}
.row-bar-val{font-family:var(--font-mono);font-size:10px;color:var(--ink-3);letter-spacing:.06em}
.empty-state{
  padding:64px 24px;text-align:center;color:var(--ink-3);
  background-image:repeating-linear-gradient(45deg,rgba(23,23,23,.022) 0 10px,transparent 10px 20px);
  border-radius:var(--r-lg);
}
.empty-state p{font-family:var(--font-mono);font-size:12px;letter-spacing:.12em;margin-top:12px}

/* --------------------------------------------------------------- 14. 快览抽屉 */
#quick{
  position:fixed;inset:0;z-index:120;display:none;align-items:center;justify-content:center;
  padding:24px;
}
#quick.is-open{display:flex}
.qv-scrim{position:absolute;inset:0;background:rgba(23,23,23,.28);opacity:0;transition:opacity .3s var(--e-out)}
#quick.is-in .qv-scrim{opacity:1}
.qv-panel{
  position:relative;width:560px;max-width:100%;max-height:86vh;overflow-y:auto;
  background:var(--card);border-radius:var(--r-2xl);box-shadow:var(--ring-lift);
  transform:translateY(14px) scale(.985);opacity:0;
  transition:transform .4s var(--e-expo), opacity .3s var(--e-out);
}
#quick.is-in .qv-panel{transform:none;opacity:1}
.qv-top{height:3px;background:var(--blue);border-radius:var(--r-2xl) var(--r-2xl) 0 0}
.qv-scan{height:1px;background:linear-gradient(90deg,transparent,var(--blue-line),transparent);opacity:.7}
.qv-body{padding:28px 30px 30px}
.qv-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:6px}
.qv-name{font-family:var(--font-mono);font-size:17px;color:var(--ink);letter-spacing:-.01em;line-height:1.4}
.qv-brief{font-size:13.5px;color:var(--ink-2);line-height:1.7;margin-top:10px}
.qv-close{
  width:32px;height:32px;flex:none;border-radius:50%;display:flex;align-items:center;justify-content:center;
  box-shadow:var(--ring);transition:transform .3s var(--e-out), box-shadow .3s var(--e-out);
}
.qv-close:hover{transform:rotate(90deg);box-shadow:var(--ring-hover)}
.qv-grid{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:var(--hair);margin:24px 0;border-radius:var(--r-lg);overflow:hidden}
.qv-cell{background:var(--card);padding:16px 18px}
.qv-cell.wide{grid-column:1 / -1}
.qv-cell-lab{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-3)}
.qv-cell-val{font-family:var(--font-num);font-weight:700;font-size:22px;color:var(--ink);margin-top:6px;font-variant-numeric:tnum;line-height:1.2}
.qv-cell-sub{font-size:12px;color:var(--ink-3);margin-top:4px}
.qv-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:8px}
.qv-foot{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:24px;padding-top:18px;box-shadow:0 -1px 0 rgba(23,23,23,.06)}
.qv-pager{display:flex;align-items:center;gap:8px;font-family:var(--font-mono);font-size:11px;color:var(--ink-3);letter-spacing:.1em}
.qv-nav{width:34px;height:34px;border-radius:50%;display:flex;align-items:center;justify-content:center;box-shadow:var(--ring);transition:box-shadow .25s,transform .25s var(--e-out)}
.qv-nav:hover{box-shadow:var(--ring-hover);transform:translateY(-1px)}

/* --------------------------------------------------------------- 15. 详情页 */
.proj-hero{
  position:relative;margin:110px 0 0;background:var(--card);
  border-radius:var(--r-2xl);box-shadow:var(--ring);overflow:hidden;
}
.proj-hero-bg{position:absolute;inset:0;opacity:.5;pointer-events:none}
.proj-hero-in{position:relative;padding:44px 40px 40px}
.proj-badges{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:20px}
.pill{
  display:inline-flex;align-items:center;gap:7px;padding:5px 12px;border-radius:var(--r-pill);
  background:var(--blue-dim);color:var(--blue);
  font-family:var(--font-mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;
}
.pill-ink{background:rgba(23,23,23,.05);color:var(--ink-2)}
.proj-title{font-family:var(--font-mono);font-weight:700;font-size:clamp(22px,3.4vw,34px);color:var(--ink);line-height:1.25;letter-spacing:-.02em;word-break:break-word}
.proj-brief{font-size:16px;color:var(--ink-2);line-height:1.75;margin-top:14px;max-width:44em}
.info-grid{
  display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--hair);
  margin:32px 0 28px;border-radius:var(--r-lg);overflow:hidden;
}
.info-cell{background:var(--card);padding:16px 18px}
.info-lab{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-3)}
.info-val{font-family:var(--font-num);font-weight:700;font-size:19px;color:var(--ink);margin-top:5px;font-variant-numeric:tnum}
.info-val-sm{font-family:var(--font-sans);font-weight:400;font-size:14px;color:var(--ink-2)}
.proj-actions{display:flex;gap:10px;flex-wrap:wrap}

.doc-grid{display:grid;grid-template-columns:minmax(0,1fr) 200px;gap:48px;margin-top:var(--s8);align-items:start}
.article{background:var(--card);border-radius:var(--r-2xl);box-shadow:var(--ring);padding:52px 56px}
.article h2{
  font-family:var(--font-serif);font-weight:900;font-size:26px;color:var(--ink);
  line-height:1.35;letter-spacing:-.01em;margin:44px 0 18px;position:relative;padding-bottom:14px;
}
.article h2:first-child{margin-top:0}
.article h2::after{content:"";position:absolute;left:0;bottom:0;width:44px;height:2px;background:var(--blue)}
.article h2 .h-icon{display:inline-block;width:18px;height:18px;color:var(--blue);margin-right:10px;vertical-align:-2px}
.article h3{
  font-family:var(--font-serif);font-weight:900;font-size:18px;color:var(--ink);
  margin:32px 0 12px;letter-spacing:-.005em;
}
.article p{margin:0 0 16px;line-height:1.85}
.article strong{color:var(--ink);font-weight:700}
.article a{color:var(--blue);box-shadow:0 1px 0 var(--blue-line);transition:box-shadow .25s}
.article a:hover{box-shadow:0 1px 0 var(--blue)}
.article ul{margin:0 0 18px;padding-left:2px}
.article li{position:relative;padding-left:20px;margin-bottom:9px;line-height:1.8}
.article li::before{content:"";position:absolute;left:4px;top:13px;width:5px;height:1px;background:var(--ink-3)}
.article blockquote{
  margin:22px 0;padding:16px 22px;background:var(--blue-dim);
  border-radius:var(--r-lg);color:var(--ink-2);font-size:14.5px;line-height:1.75;
  box-shadow:inset 2px 0 0 var(--blue-line);
}
.article code{
  font-family:var(--font-mono);font-size:12.5px;background:var(--wash);
  padding:2px 6px;border-radius:var(--r-sm);color:var(--ink);
}
.article pre{
  background:var(--wash);border-radius:var(--r-lg);padding:20px 22px;overflow-x:auto;margin:0 0 18px;
  box-shadow:0 0 0 1px rgba(23,23,23,.05);
}
.article pre code{background:none;padding:0;font-size:12.5px;line-height:1.7}
.article table{margin:0 0 20px;font-size:13.5px;box-shadow:0 0 0 1px rgba(23,23,23,.06);border-radius:var(--r-lg);overflow:hidden}
.article th{
  background:var(--wash);text-align:left;padding:11px 16px;font-family:var(--font-mono);
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3);font-weight:500;
}
.article td{padding:12px 16px;box-shadow:0 1px 0 rgba(23,23,23,.05);vertical-align:top}
.article tr:last-child td{box-shadow:none}
.article hr{border:0;height:1px;background:var(--hair);margin:36px 0}
.article em{font-style:normal;color:var(--ink-3);font-size:13.5px}
.article figure{margin:24px 0}
.article figure img{width:100%;border-radius:var(--r-lg);box-shadow:var(--ring);cursor:zoom-in;transition:box-shadow .3s,transform .3s var(--e-out)}
.article figure img:hover{box-shadow:var(--ring-hover);transform:translateY(-1px)}
.article figcaption{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.1em;color:var(--ink-3);margin-top:10px;text-align:center}

.toc-float{position:sticky;top:96px}
.toc-float-lab{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--ink-3);margin-bottom:14px}
.toc-float a{
  display:block;padding:7px 0 7px 14px;font-size:13px;color:var(--ink-3);line-height:1.5;
  box-shadow:inset 1px 0 0 var(--hair);transition:color .25s var(--e-out), padding .25s var(--e-out), box-shadow .25s var(--e-out);
}
.toc-float a:hover{color:var(--ink);padding-left:20px;box-shadow:inset 1px 0 0 var(--blue)}
.toc-float a.is-active{color:var(--blue);box-shadow:inset 1px 0 0 var(--blue)}

.pager{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:var(--s8)}
.pager-link{
  background:var(--card);border-radius:var(--r-xl);box-shadow:var(--ring);padding:22px 24px;
  transition:transform .3s var(--e-out), box-shadow .3s var(--e-out);
}
.pager-link:hover{transform:translateY(-2px);box-shadow:var(--ring-hover)}
.pager-dir{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--ink-3)}
.pager-name{font-family:var(--font-mono);font-size:14px;color:var(--ink);margin-top:8px;word-break:break-all}
.pager-link.next{text-align:right}

.related-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.related-card{
  background:var(--card);border-radius:var(--r-xl);box-shadow:var(--ring);padding:22px;
  transition:transform .3s var(--e-out), box-shadow .3s var(--e-out);
}
.related-card:hover{transform:translateY(-2px);box-shadow:var(--ring-hover)}
.related-name{font-family:var(--font-mono);font-size:13px;color:var(--ink);word-break:break-all}
.related-brief{font-size:12.5px;color:var(--ink-3);margin-top:8px;line-height:1.6;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.related-meta{display:flex;align-items:center;gap:10px;margin-top:14px;font-family:var(--font-num);font-size:12px;color:var(--ink-2);font-weight:700}

.percent-bar{height:6px;background:var(--wash);border-radius:var(--r-pill);overflow:hidden;margin-top:14px}
.percent-bar i{display:block;height:100%;background:var(--blue);width:0;border-radius:var(--r-pill);transition:width 1s var(--e-expo)}

/* 灯箱 */
#lightbox{position:fixed;inset:0;z-index:150;display:none;align-items:center;justify-content:center;padding:40px;background:rgba(252,252,251,.96)}
#lightbox.is-open{display:flex}
#lightbox img{max-width:100%;max-height:86vh;border-radius:var(--r-lg);box-shadow:var(--ring-lift);transform:scale(.96);opacity:0;transition:transform .4s var(--e-expo),opacity .3s}
#lightbox.is-in img{transform:scale(1);opacity:1}
.lb-close{position:absolute;top:24px;right:24px;width:40px;height:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;box-shadow:var(--ring);background:var(--card);transition:transform .3s var(--e-out)}
.lb-close:hover{transform:rotate(90deg)}

/* --------------------------------------------------------------- 16. 附录 */
.tbl-wrap{background:var(--card);border-radius:var(--r-2xl);box-shadow:var(--ring);overflow:auto;max-height:78vh}
.tbl{font-size:13px}
.tbl thead th{
  position:sticky;top:0;z-index:2;background:var(--wash);text-align:left;padding:13px 16px;
  font-family:var(--font-mono);font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--ink-3);font-weight:500;cursor:pointer;white-space:nowrap;user-select:none;
  transition:color .2s;
}
.tbl thead th:hover{color:var(--blue)}
.tbl thead th .sort-ind{opacity:.35;margin-left:5px;font-size:9px}
.tbl thead th.sorted .sort-ind{opacity:1;color:var(--blue)}
.tbl tbody td{padding:12px 16px;box-shadow:0 1px 0 rgba(23,23,23,.045);vertical-align:middle}
.tbl tbody tr{transition:background .2s}
.tbl tbody tr:hover{background:var(--blue-dim)}
.tbl tbody tr.row-hidden{display:none}
.tbl .c-pid{font-family:var(--font-mono);font-size:11px;color:var(--ink-3);letter-spacing:.06em;white-space:nowrap}
.tbl .c-name{font-family:var(--font-mono);font-size:12.5px;color:var(--ink);word-break:break-all;min-width:210px}
.tbl .c-name a:hover{color:var(--blue)}
.tbl .c-num{font-family:var(--font-num);font-weight:700;font-variant-numeric:tnum;color:var(--ink);text-align:right;white-space:nowrap}
.tbl .c-brief{color:var(--ink-3);font-size:12px;max-width:340px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.tbl .c-boards{white-space:nowrap}
.board-tag{
  display:inline-block;padding:2px 7px;border-radius:var(--r-sm);margin-right:4px;
  background:var(--blue-dim);color:var(--blue);font-family:var(--font-mono);font-size:9.5px;letter-spacing:.08em;
}
.board-tag.grey{background:rgba(23,23,23,.045);color:var(--ink-3)}

/* --------------------------------------------------------------- 17. 搜索 */
.search-shell{max-width:var(--maxw-text);margin:0 auto}
.search-input-wrap{position:relative;margin-bottom:18px}
.search-input{
  width:100%;padding:18px 22px 18px 52px;border-radius:var(--r-2xl);background:var(--card);
  box-shadow:var(--ring);font-size:17px;color:var(--ink);transition:box-shadow .3s var(--e-out);
}
.search-input::placeholder{color:var(--ink-3)}
.search-input:focus{outline:none;box-shadow:0 0 0 1px var(--blue-line), 0 0 0 4px var(--blue-dim)}
.search-ico{position:absolute;left:20px;top:50%;transform:translateY(-50%);width:19px;height:19px;color:var(--ink-3)}
.search-count{
  font-family:var(--font-mono);font-size:11px;letter-spacing:.16em;text-transform:uppercase;
  color:var(--ink-3);margin-bottom:22px;display:flex;align-items:center;gap:10px;
}
.search-count b{color:var(--blue);font-weight:500}
.hit-card{
  display:block;background:var(--card);border-radius:var(--r-xl);box-shadow:var(--ring);
  padding:20px 22px;margin-bottom:12px;transition:transform .3s var(--e-out), box-shadow .3s var(--e-out);
}
.hit-card:hover{transform:translateY(-2px);box-shadow:var(--ring-hover)}
.hit-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.hit-name{font-family:var(--font-mono);font-size:14.5px;color:var(--ink);letter-spacing:-.005em}
.hit-pid{font-family:var(--font-mono);font-size:10px;color:var(--ink-3);letter-spacing:.1em;padding:2px 7px;border-radius:var(--r-sm);background:var(--wash)}
.hit-desc{font-size:13px;color:var(--ink-2);margin-top:8px;line-height:1.7}
.hit-meta{display:flex;align-items:center;gap:14px;margin-top:12px;font-family:var(--font-mono);font-size:10.5px;letter-spacing:.08em;color:var(--ink-3);flex-wrap:wrap}
.hit-meta .hit-star{font-family:var(--font-num);font-weight:700;color:var(--ink);font-size:12px}
mark{background:rgba(29,111,235,.14);color:var(--ink);border-radius:2px;padding:0 2px}

/* --------------------------------------------------------------- 18. 页脚 */
.footer-cta{
  margin-top:var(--s12);padding:var(--s10) 0;text-align:center;
  background:var(--wash);border-radius:var(--r-2xl);box-shadow:var(--ring);
}
.footer-cta h2{font-family:var(--font-serif);font-weight:900;font-size:clamp(28px,4vw,44px);color:var(--ink);line-height:1.25;letter-spacing:-.015em}
.footer-cta p{color:var(--ink-2);margin:18px auto 32px;max-width:34em}
.site-foot{padding:var(--s8) 0 var(--s6);margin-top:var(--s12);box-shadow:0 -1px 0 rgba(23,23,23,.06)}
.foot-grid{display:grid;grid-template-columns:1.4fr 1fr 1fr;gap:40px}
.foot-brand{font-family:var(--font-serif);font-weight:900;font-size:17px;color:var(--ink)}
.foot-note{font-size:12.5px;color:var(--ink-3);margin-top:12px;line-height:1.7;max-width:30em}
.foot-col-lab{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--ink-3);margin-bottom:14px}
.foot-col a{display:block;padding:5px 0;font-size:13px;color:var(--ink-2);transition:color .25s}
.foot-col a:hover{color:var(--blue)}
.foot-bottom{
  display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-top:var(--s6);
  padding-top:24px;box-shadow:0 -1px 0 rgba(23,23,23,.055);
  font-family:var(--font-mono);font-size:10.5px;letter-spacing:.1em;color:var(--ink-3);
}

/* 纸帘揭示后正文接续入场 */
.js body.page-in main{opacity:0;transform:translateY(12px)}
main{transition:opacity .5s var(--e-out), transform .5s var(--e-out)}

/* --------------------------------------------------------------- 19. 动效编排 */
.js [data-stagger] > *{
  opacity:0;transform:translateY(14px) scale(.985);
  transition:opacity .62s var(--e-out), transform .62s var(--e-out);
  transition-delay:calc(var(--i,0) * 55ms);
}
.js [data-stagger].is-in > *{opacity:1;transform:none}
.js .reveal{opacity:0;transform:translateY(16px);transition:opacity .7s var(--e-out), transform .7s var(--e-out)}
.js .reveal.is-in{opacity:1;transform:none}
.js .board-row{opacity:0;transform:translateY(10px);transition:opacity .5s var(--e-out), transform .5s var(--e-out), background .25s var(--e-out)}
.js .board-row.is-in{opacity:1;transform:none;transition-delay:calc(var(--i,0) * 45ms)}
.sec-head .wm-num{transition:transform .1s linear}

/* --------------------------------------------------------------- 20. 响应式 */
@media (max-width:1080px){
  .doc-grid{grid-template-columns:1fr;gap:32px}
  .toc-float{position:static;order:-1}
  .toc-float a{display:inline-block;margin-right:16px}
  .tldr-grid{grid-template-columns:1fr 1fr}
}
@media (max-width:900px){
  .nav-links,.nav-cta{display:none}
  .nav-burger{display:flex}
  .bento{grid-template-columns:1fr}
  .span-5,.span-6,.span-7,.span-12{grid-column:span 1}
  .info-grid{grid-template-columns:1fr 1fr}
  .related-grid{grid-template-columns:1fr}
  .foot-grid{grid-template-columns:1fr 1fr}
  .board-thead,.board-row{grid-template-columns:44px minmax(0,1fr) 92px}
  .board-thead .th-lang,.board-thead .th-bar,.board-row .row-lang,.board-row .row-bar-col{display:none}
  .board-row .row-star{grid-column:3}
}
@media (max-width:640px){
  .wrap,.wrap-inner,.nav-inner,.cover-inner{padding:0 20px}
  .section{padding:var(--s8) 0}
  .section-tight{padding:var(--s6) 0}
  .tldr-grid{grid-template-columns:1fr}
  .data-band{grid-template-columns:1fr 1fr}
  .article{padding:32px 22px}
  .proj-hero-in{padding:32px 22px}
  .info-grid{grid-template-columns:1fr 1fr}
  .pager{grid-template-columns:1fr}
  .pager-link.next{text-align:left}
  .foot-grid{grid-template-columns:1fr}
  .wm-num{font-size:clamp(84px,26vw,150px);top:-.1em}
  .toc-row{grid-template-columns:56px 1fr;gap:14px;padding:20px}
  .toc-metric{display:none}
  .concl-no{font-size:96px;right:-6px;bottom:-22px}
  .qv-body{padding:22px 20px 24px}
  .qv-grid{grid-template-columns:1fr}
  #quick{padding:0;align-items:flex-end}
  .qv-panel{width:100%;max-height:90vh;border-radius:var(--r-2xl) var(--r-2xl) 0 0;transform:translateY(100%)}
  #quick.is-in .qv-panel{transform:none}
  .foot-bottom{flex-direction:column;gap:8px}
  .tbl .c-brief{display:none}
}

/* --------------------------------------------------------------- 21. 降级 */
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{
    animation-duration:.001ms !important;animation-iteration-count:1 !important;
    transition-duration:.001ms !important;scroll-behavior:auto !important;
  }
  .js [data-stagger] > *,.js .reveal,.js .board-row{opacity:1 !important;transform:none !important}
  .marquee-track{animation:none}
  .dot-top{animation:none}
  .scroll-hint i{animation:none}
  #trCurtain{display:none !important}
}
/* 无 JS / headless 自动化：内容必须可见 */
.no-js [data-stagger] > *,.no-js .reveal,.no-js .board-row,
.no-anim [data-stagger] > *,.no-anim .reveal,.no-anim .board-row,
.no-anim .js [data-stagger] > *,.no-anim .js .reveal,.no-anim .js .board-row{
  opacity:1 !important;transform:none !important;transition:none !important;
}

/* --------------------------------------------------------------- 22. 打印 */
@media print{
  .site-nav,#trCurtain,#quick,#lightbox,.scroll-hint,.marquee,.nav-drawer,.nav-burger,
  .qv-actions,.filter-bar,.footer-cta,.btn{display:none !important}
  body{background:#FFF;color:var(--ink);font-size:11pt}
  .wrap,.wrap-narrow,.article,.board-card,.tbl-wrap{max-width:100%;padding:0}
  .article,.board-card,.tbl-wrap,.concl-card,.bento-card{box-shadow:none}
  .sec-title,.concl-title,.card-title,.article h2,.article h3{color:var(--ink)}
  .wm-num,.concl-no{display:none}
  a{color:var(--ink)}
  .board-row{break-inside:avoid}
@page{margin:16mm}
}