/* =============================================================================
   学习笔记 · 设计系统 v2
   单一样式表驱动全站 · 深色 / 浅色双主题 · 毛玻璃表面 · 零位图资源
   -----------------------------------------------------------------------------
   目录
   00  布局原语（@layer od-layout，结构性规则，产品样式永远优先）
   01  设计令牌（深色 / 浅色）
   02  基础重置与排版
   03  背景氛围层（极光 / 网格 / 颗粒）
   04  表面与玻璃
   05  顶栏
   06  目录侧栏 / 移动端抽屉
   07  阅读进度
   08  主内容与 Hero
   09  正文排版（标题 / 段落 / 列表 / 链接）
   10  代码
   11  提示框 .box
   12  对照卡 .compare
   13  步骤 .steps
   14  流程 .flow-diagram
   15  KPI
   16  问答 .qa
   17  表格
   18  网格与日程式卡片
   19  首页：工具条 / 卡片列表 / 难度级别
   20  Skill 明细（兼容旧页面）
   21  页脚与浮动控件
   22  响应式
   23  动效与可访问性收尾
   ============================================================================= */


/* ---------------------------------------------------------------------------
   00  布局原语 —— 只做结构：display / flex / grid / overflow / 换行 / 比例。
   放在最前，产品样式在 layer 之外，永远优先。用于承载变长文本与堆叠信息。
   --------------------------------------------------------------------------- */
@layer od-layout {
  :where(.od-stack,.od-row,.od-row-top,.od-cluster,.od-grid,.od-field,.od-stat,.od-cell,.od-tile) > :where(*) { min-width: 0; }

  /* containers */
  .od-stack   { display: flex; flex-direction: column; gap: var(--od-gap, 8px); }
  .od-row     { display: flex; align-items: center; gap: var(--od-gap, 8px); }
  .od-row-top { display: flex; align-items: flex-start; gap: var(--od-gap, 8px); }
  .od-cluster { display: flex; flex-wrap: wrap; align-items: center; gap: var(--od-gap, 8px); }
  .od-fill    { flex: 1 1 0; min-width: 0; }
  .od-fixed   { flex: none; }
  .od-grid    { display: grid; gap: var(--od-gap, 12px); grid-template-columns: repeat(var(--od-cols, 3), minmax(0, 1fr)); }

  /* stacked information: each piece is its own line — never sibling inline spans */
  .od-stat, .od-field, .od-cell { display: grid; gap: var(--od-gap, 2px); }
  :where(.od-stat,.od-field,.od-cell) > :where(*) { display: block; }
  .od-tile { display: grid; grid-template-rows: auto 1fr; }
  :where(.od-tile) > :where(*) { display: block; }

  /* media keeps its intrinsic ratio by default; never a distorted or cropped
     cover by accident. height:auto lets the ratio win over an <img height="…">
     attribute. Cropping to a uniform box is an explicit opt-in: set --od-ratio
     AND add .od-media-cover together (per the core rule, only where a crop is
     deliberate — tile thumbs, decorative fills — never on full-frame content). */
  .od-media { display: block; width: 100%; height: auto; aspect-ratio: var(--od-ratio, auto); }
  .od-media-cover { object-fit: cover; }

  /* data text only — authored copy is rewritten to its budget instead */
  .od-truncate { display: block; max-width: 100%; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
  .od-clamp-2, .od-clamp-3 { display: -webkit-box; -webkit-box-orient: vertical; overflow: hidden; overflow-wrap: anywhere; }
  .od-clamp-2 { -webkit-line-clamp: 2; }
  .od-clamp-3 { -webkit-line-clamp: 3; }
  .od-lines-2 { min-height: calc(2 * 1.4em); }   /* block-level reservation for a shared baseline */
  .od-nowrap  { white-space: nowrap; }           /* 数字+单位 · 价格+起 · 日期+星期 */
  .od-keep    { word-break: keep-all; overflow-wrap: anywhere; } /* CJK labels break at spaces / <wbr> first */

  /* screen skeleton (optional): bars take their own space, the middle scrolls — no padding guessed for chrome */
  .od-screen { display: grid; grid-template-rows: auto minmax(0, 1fr) auto; height: 100%; }
  .od-scroll { overflow-y: auto; overscroll-behavior: contain; min-height: 0; }

  /* horizontal rail: the next item peeks at the edge; trailing room survives overflow */
  .od-rail { display: flex; gap: var(--od-gap, 8px); overflow-x: auto; scroll-snap-type: x proximity; scrollbar-width: none;
             padding-inline: var(--od-rail-pad, 16px); scroll-padding-inline: var(--od-rail-pad, 16px); }
  .od-rail::-webkit-scrollbar { display: none; }
  :where(.od-rail) > :where(*) { flex: none; scroll-snap-align: start; }
  :where(.od-rail) > :where(:last-child) { margin-inline-end: var(--od-rail-pad, 16px); }

  .od-spacer { flex: none; visibility: hidden; pointer-events: none; }
  .od-touch  { min-width: 44px; min-height: 44px; }
}


/* ---------------------------------------------------------------------------
   01  设计令牌
   --------------------------------------------------------------------------- */
/* ==== OD-FONTS-START ==== */
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url('fonts/jetbrains-mono-400-700.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Space Grotesk';
  font-style: normal;
  font-weight: 300 700;
  font-display: swap;
  src: url('fonts/space-grotesk-300-700.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* ==== OD-FONTS-END ==== */

:root {
  color-scheme: dark;

  /* 底色与表面 */
  --bg:            #0A0C11;
  --bg-elev:       #0E1119;
  --surface:       rgba(255, 255, 255, .048);
  --surface-2:     rgba(255, 255, 255, .075);
  --surface-3:     rgba(255, 255, 255, .105);
  --surface-solid: #13161F;
  --bg-card:       rgba(255, 255, 255, .048);
  --bg-card-hover: rgba(255, 255, 255, .085);

  /* 描边 */
  --border:        rgba(255, 255, 255, .09);
  --border-strong: rgba(255, 255, 255, .17);
  --hairline:      rgba(255, 255, 255, .07);

  /* 文字 */
  --text:       #E9ECF3;
  --text-dim:   #A3ACBE;
  --text-muted: #7C8798;

  /* 强调色（青） */
  --accent:       #2DD4BF;
  --accent-light: #5EEAD4;
  --accent-deep:  #14B8A6;
  --accent-bg:    rgba(45, 212, 191, .12);
  --accent-line:  rgba(45, 212, 191, .34);
  --on-accent:    #04201C;

  /* 功能色 */
  --green:  #34D399;  --green-bg:  rgba(52, 211, 153, .13);  --green-line:  rgba(52, 211, 153, .30);
  --orange: #FBBF24;  --orange-bg: rgba(251, 191, 36, .13);  --orange-line: rgba(251, 191, 36, .30);
  --red:    #FB7185;  --red-bg:    rgba(251, 113, 133, .13); --red-line:    rgba(251, 113, 133, .30);
  --blue:   #60A5FA;  --blue-bg:   rgba(96, 165, 250, .13);  --blue-line:   rgba(96, 165, 250, .30);
  --purple: #C084FC;  --purple-bg: rgba(192, 132, 252, .13);
  --pink:   #F472B6;  --pink-bg:   rgba(244, 114, 182, .13);
  --cyan:   #22D3EE;  --cyan-bg:   rgba(34, 211, 238, .13);

  /* 难度级别 */
  --lv-easy:   var(--green);   --lv-easy-bg:   var(--green-bg);   --lv-easy-line:   var(--green-line);
  --lv-medium: var(--orange);  --lv-medium-bg: var(--orange-bg);  --lv-medium-line: var(--orange-line);
  --lv-hard:   var(--red);     --lv-hard-bg:   var(--red-bg);     --lv-hard-line:   var(--red-line);

  /* 玻璃 */
  --glass-bg:     rgba(255, 255, 255, .048);
  --glass-bg-2:   rgba(255, 255, 255, .072);
  --glass-border: rgba(255, 255, 255, .10);
  --glass-hi:     rgba(255, 255, 255, .11);
  --glass-blur:   20px;
  --glass-sat:    165%;

  /* 投影 */
  --shadow-1: 0 1px 2px rgba(0, 0, 0, .34), 0 10px 28px -14px rgba(0, 0, 0, .58);
  --shadow-2: 0 2px 6px rgba(0, 0, 0, .36), 0 22px 56px -22px rgba(0, 0, 0, .66);
  --glow:     0 0 0 1px var(--accent-line), 0 14px 36px -16px rgba(45, 212, 191, .40);

  /* 背景氛围 */
  --aurora-1: rgba(45, 212, 191, .17);
  --aurora-2: rgba(56, 189, 248, .12);
  --aurora-3: rgba(45, 212, 191, .09);
  --grid-line: rgba(255, 255, 255, .030);

  /* 代码 */
  --code-bg:     rgba(3, 6, 12, .58);
  --code-border: rgba(255, 255, 255, .075);
  --code-text:   #D8DEEA;
  --syn-cmd:     #5EEAD4;
  --syn-comment: #7A8798;   /* 4.46 → 5.31:1（叠在代码块实际底色上） */
  --syn-keyword: #C084FC;
  --syn-string:  #FCD34D;

  /* 几何 */
  --radius:      14px;
  --radius-sm:   10px;
  --radius-xs:   7px;
  --radius-pill: 999px;

  /* 间距（4 / 8 倍数） */
  --sp-1: 4px;  --sp-2: 8px;   --sp-3: 12px; --sp-4: 16px; --sp-5: 24px;
  --sp-6: 32px; --sp-7: 48px;  --sp-8: 64px; --sp-9: 96px;

  /* 字体 */
  --font-display: "Space Grotesk", -apple-system, BlinkMacSystemFont, "Segoe UI",
                  "PingFang SC", "HarmonyOS Sans SC", "Hiragino Sans GB",
                  "Microsoft YaHei", "Noto Sans SC", sans-serif;
  --font: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC",
          "HarmonyOS Sans SC", "Hiragino Sans GB", "Microsoft YaHei",
          "Noto Sans SC", "Source Han Sans SC", sans-serif;
  --mono: "JetBrains Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo,
          Consolas, "Liberation Mono", monospace;

  /* 动效 */
  --t-fast: 150ms;
  --t:      200ms;
  --t-slow: 320ms;
  --ease-out: cubic-bezier(.22, .75, .28, 1);
  --ease-in:  cubic-bezier(.55, 0, .75, .25);

  /* 布局 */
  --nav-h:        60px;      /* 顶栏为内容让出的总高度 */
  --nav-gap:      12px;      /* 浮动顶栏距视口顶边的距离（仅宽屏生效） */
  --nav-bar:      52px;      /* 浮动顶栏自身高度（仅宽屏生效） */
  --sidebar-w:    264px;
  --content-max:  880px;
  --gutter:       40px;
  /* 侧栏 + 正文作为一个整体在视口里居中时的总宽 */
  --layout-w:     calc(var(--sidebar-w) + var(--content-max) + var(--gutter) * 2);
  /* 顶栏左右边界对齐到哪一条边：文章页跟侧栏外沿对齐，首页跟内容容器外沿对齐 */
  --shell-w:      var(--layout-w);
}

/* 浅色主题：独立取值，不从深色推导 */
:root[data-theme="light"] {
  color-scheme: light;

  --bg:            #EEF1F6;
  --bg-elev:       #E7ECF4;
  --surface:       rgba(255, 255, 255, .58);
  --surface-2:     rgba(255, 255, 255, .78);
  --surface-3:     rgba(255, 255, 255, .94);
  --surface-solid: #FFFFFF;
  --bg-card:       rgba(255, 255, 255, .58);
  --bg-card-hover: rgba(255, 255, 255, .94);

  --border:        rgba(17, 26, 46, .10);
  --border-strong: rgba(17, 26, 46, .20);
  --hairline:      rgba(17, 26, 46, .07);

  --text:       #0D1524;
  --text-dim:   #46536B;
  --text-muted: #5E6B84;

  --accent:       #0F766E;
  --accent-light: #115E59;
  --accent-deep:  #0D9488;
  --accent-bg:    rgba(13, 148, 136, .11);
  --accent-line:  rgba(15, 118, 110, .30);
  --on-accent:    #FFFFFF;

  --green:  #065F46;  --green-bg:  rgba(6, 95, 70, .11);    --green-line:  rgba(6, 95, 70, .26);
  --orange: #854D0E;  --orange-bg: rgba(133, 77, 14, .12);  --orange-line: rgba(133, 77, 14, .26);
  --red:    #BE123C;  --red-bg:    rgba(190, 18, 60, .10);  --red-line:    rgba(190, 18, 60, .25);
  --blue:   #1D4ED8;  --blue-bg:   rgba(29, 78, 216, .10);  --blue-line:   rgba(29, 78, 216, .25);
  --purple: #6D28D9;  --purple-bg: rgba(109, 40, 217, .10);
  --pink:   #BE185D;  --pink-bg:   rgba(190, 24, 93, .10);
  --cyan:   #155E75;  --cyan-bg:   rgba(21, 94, 117, .10);

  --glass-bg:     rgba(255, 255, 255, .58);
  --glass-bg-2:   rgba(255, 255, 255, .78);
  --glass-border: rgba(17, 26, 46, .10);
  --glass-hi:     rgba(255, 255, 255, .92);

  --shadow-1: 0 1px 2px rgba(17, 26, 46, .06), 0 10px 26px -16px rgba(17, 26, 46, .24);
  --shadow-2: 0 2px 6px rgba(17, 26, 46, .07), 0 22px 52px -24px rgba(17, 26, 46, .28);
  --glow:     0 0 0 1px var(--accent-line), 0 14px 34px -18px rgba(15, 118, 110, .35);

  --aurora-1: rgba(13, 148, 136, .22);
  --aurora-2: rgba(56, 130, 210, .16);
  --aurora-3: rgba(13, 148, 136, .12);
  --grid-line: rgba(17, 26, 46, .045);

  --code-bg:     rgba(255, 255, 255, .72);
  --code-border: rgba(17, 26, 46, .11);
  --code-text:   #1B2436;
  --syn-cmd:     #0F766E;
  --syn-comment: #66728A;   /* 3.68 → 4.77:1（叠在代码块实际底色上） */
  --syn-keyword: #7C3AED;
  --syn-string:  #9A6700;
}

/* 默认深色：这里不再按 prefers-color-scheme 回退成浅色。
   浅色只由 :root[data-theme="light"] 触发，而 data-theme 由 head 的内联引导脚本写入
   （本地没有偏好记录时写 dark）。无 JS 访客因此也拿到深色。
   想要「没选过就跟随系统」，把这条媒体查询加回来即可。 */


/* ---------------------------------------------------------------------------
   02  基础重置与排版
   --------------------------------------------------------------------------- */
*, *::before, *::after { box-sizing: border-box; }

* { margin: 0; padding: 0; }

html {
  background-color: var(--bg);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3CfeComponentTransfer%3E%3CfeFuncA type='linear' slope='0.045'/%3E%3C/feComponentTransfer%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)'/%3E%3C/svg%3E");
  background-repeat: repeat;
  background-size: 160px 160px;
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
  scroll-padding-top: calc(var(--nav-h) + var(--sp-5));
}

body {
  font-family: var(--font);
  font-size: 16px;
  line-height: 1.75;
  color: var(--text);
  background: transparent;
  /* 正文默认 overflow-wrap: normal —— 遇到没有断行机会的长串（URL、哈希、长路径）就会
     直接溢出把页面撑破（obsidian 那篇的来源列表里一个 gist 链接就是实例）。
     放在 body 上让全站继承；`pre` 自带 white-space: pre、`code` 有各自的规则，
     都不会被这条误伤。 */
  overflow-wrap: break-word;
  min-height: 100vh;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  /* 用 clip 而不是 hidden：hidden 会让 body 变成滚动容器，吸顶的工具条会失效 */
  overflow-x: clip;
}

@supports (font-variation-settings: normal) {
  body { font-optical-sizing: auto; }
}

/* 选区与滚动条 */
::selection { background: var(--accent-bg); color: var(--text); }

* { scrollbar-width: thin; scrollbar-color: var(--border-strong) transparent; }
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
  background: var(--border-strong);
  border: 3px solid transparent;
  background-clip: content-box;
  border-radius: var(--radius-pill);
}
::-webkit-scrollbar-thumb:hover { background: var(--accent-line); background-clip: content-box; }

:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
  border-radius: var(--radius-xs);
}

/* 脚本用 hidden 属性控制显隐，必须压过组件自身的 display */
[hidden] { display: none !important; }

/* 只给读屏的播报文本 */
.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: fixed;
  top: var(--sp-2); left: var(--sp-2);
  z-index: 200;
  padding: var(--sp-2) var(--sp-4);
  border-radius: var(--radius-sm);
  background: var(--accent-deep);
  color: var(--on-accent);
  font-size: 14px;
  font-weight: 600;
  text-decoration: none;
  transform: translateY(-160%);
  transition: transform var(--t) var(--ease-out);
}
.skip-link:focus-visible { transform: none; }


/* ---------------------------------------------------------------------------
   03  背景氛围层 —— 极光光晕 + 精密网格。纯 CSS，无位图。
   --------------------------------------------------------------------------- */
body::before,
body::after {
  content: "";
  position: fixed;
  pointer-events: none;
  z-index: -1;
}

/* 极光：玻璃面板背后必须有东西可以折射 */
body::before {
  inset: -30%;
  background:
    radial-gradient(46rem 32rem at 14% -6%,  var(--aurora-1), transparent 62%),
    radial-gradient(52rem 38rem at 92% 4%,   var(--aurora-2), transparent 64%),
    radial-gradient(40rem 30rem at 46% 104%, var(--aurora-3), transparent 62%);
  filter: blur(26px);
}

/* 精密网格：径向遮罩，越往边缘越淡 */
body::after {
  inset: 0;
  background-image:
    linear-gradient(var(--grid-line) 1px, transparent 1px),
    linear-gradient(90deg, var(--grid-line) 1px, transparent 1px);
  background-size: 64px 64px, 64px 64px;
  -webkit-mask-image: radial-gradient(130% 78% at 50% -4%, #000 0%, rgba(0, 0, 0, .55) 52%, transparent 84%);
  mask-image: radial-gradient(130% 78% at 50% -4%, #000 0%, rgba(0, 0, 0, .55) 52%, transparent 84%);
}


/* ---------------------------------------------------------------------------
   04  表面与玻璃
   统一配方：半透明底 + 背景模糊与饱和 + 1px 发丝边框 + 顶部内高光 + 柔和投影
   --------------------------------------------------------------------------- */
.glass,
.box,
.kpi,
.qa,
.compare-box,
.step-item,
.flow-step,
.skill-detail,
.card,
.stat,
.table-wrap,
.toolbar,
.sidebar,
.hero-panel {
  background: var(--glass-bg);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  border: 1px solid var(--glass-border);
  box-shadow: inset 0 1px 0 var(--glass-hi), var(--shadow-1);
}

/* 不支持背景模糊时退回不透明表面，布局不变 */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .glass, .box, .kpi, .qa, .compare-box, .step-item, .flow-step,
  .skill-detail, .card, .stat, .toolbar, .sidebar, .hero-panel {
    background: var(--surface-solid);
  }
}


/* ---------------------------------------------------------------------------
   05  顶栏
   --------------------------------------------------------------------------- */
.top-nav {
  position: fixed;
  inset: 0 0 auto 0;
  z-index: 100;
  height: var(--nav-h);
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  padding: 0 var(--sp-5);
  background: var(--glass-bg-2);
  -webkit-backdrop-filter: blur(24px) saturate(180%);
  backdrop-filter: blur(24px) saturate(180%);
  border-bottom: 1px solid var(--glass-border);
  transition: box-shadow var(--t) var(--ease-out), background var(--t) linear;
}
.top-nav.is-scrolled { box-shadow: var(--shadow-1); }

.top-nav .logo {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 15px;
  letter-spacing: -.01em;
  color: var(--text);
  white-space: nowrap;
  flex: none;
}
.top-nav .logo a { display: inherit; align-items: inherit; gap: inherit; color: inherit; text-decoration: none; }
.top-nav .logo svg { display: block; color: var(--accent); flex: none; }

/* 顶栏锚点导航：仅在「没有目录侧栏」的页面上承担导航职责 */
.top-nav .nav-links {
  display: flex;
  align-items: center;
  gap: 2px;
  flex: 1 1 auto;
  min-width: 0;
  overflow-x: auto;
  scrollbar-width: none;
  -webkit-mask-image: linear-gradient(90deg, #000 0, #000 calc(100% - 32px), transparent 100%);
  mask-image: linear-gradient(90deg, #000 0, #000 calc(100% - 32px), transparent 100%);
}
.top-nav .nav-links::-webkit-scrollbar { display: none; }
.top-nav .nav-links a {
  flex: none;
  padding: 6px 11px;
  border-radius: var(--radius-pill);
  font-size: 13px;
  color: var(--text-dim);
  text-decoration: none;
  white-space: nowrap;
  transition: color var(--t-fast) linear, background var(--t-fast) linear;
}
@media (hover: hover) {
  .top-nav .nav-links a:hover { color: var(--text); background: var(--surface-2); }
}
.top-nav .nav-links a[aria-current="true"] { color: var(--accent); background: var(--accent-bg); }

/* 文章页（有目录侧栏）的导航交给侧栏与抽屉，顶栏只留品牌与控件。
   用 body.index 区分页面类型，不依赖 :has()——旧浏览器不支持 :has() 时整条规则会失效。 */
body:not(.index) .top-nav .nav-links { display: none; }
body:not(.index) .top-nav .logo { flex: 1 1 auto; }

/* 顶栏控件 */
.nav-actions { display: flex; align-items: center; gap: var(--sp-2); flex: none; }

.icon-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--sp-2);
  width: 38px;
  height: 38px;
  padding: 0;
  border: 1px solid var(--glass-border);
  border-radius: var(--radius-sm);
  background: var(--surface);
  color: var(--text-dim);
  font: inherit;
  font-size: 13px;
  cursor: pointer;
  -webkit-backdrop-filter: blur(12px);
  backdrop-filter: blur(12px);
  transition: color var(--t-fast) linear, background var(--t-fast) linear,
              border-color var(--t-fast) linear, transform var(--t-fast) var(--ease-out);
}
@media (hover: hover) {
  .icon-btn:hover { color: var(--text); background: var(--surface-3); border-color: var(--border-strong); }
}
.icon-btn:active { transform: scale(.94); }
.icon-btn svg { display: block; }

/* 主题按钮与目录按钮只有在脚本就绪后才出现 —— 不做点了没反应的死按钮。
   目录按钮还要再限定在窄屏：≥1024px 时侧边栏本来就常驻，没有可开合的东西，
   留着它就正好是这里说的"死按钮"。特异性必须与下面那条相等（:root.js-ready = 0,3,0）
   且更靠后，写成裸 .toc-toggle 是压不住的。 */
.theme-toggle, .toc-toggle { display: none; }
:root.js-ready .theme-toggle,
:root.js-ready .toc-toggle { display: inline-flex; }
@media (min-width: 1024px) {
  :root.js-ready .toc-toggle { display: none; }
}
.icon-btn .icon-btn-label { display: none; }
@media (min-width: 640px) {
  .icon-btn.wide { width: auto; padding: 0 var(--sp-3); }
  .icon-btn.wide .icon-btn-label { display: inline; }
}

/* 主题切换：一个按钮三枚图标（日 / 月 / 跟随系统），按 data-theme-mode 切换。
   三枚叠在一起，靠 opacity + rotate + scale 完成过渡。
   图标必须显式声明为块级——inline 元素上的 transform 会被整条忽略。 */
.theme-toggle { position: relative; overflow: hidden; }

.theme-toggle .icon-sun,
.theme-toggle .icon-moon,
.theme-toggle .icon-system {
  display: block;
  position: absolute;
  transform-origin: 50% 50%;
  opacity: 0;
  transform: rotate(-90deg) scale(.35);
  transition: opacity var(--t) linear, transform var(--t-slow) var(--ease-out);
}
.theme-toggle .icon-moon   { transform: rotate(90deg) scale(.35); }
.theme-toggle .icon-system { transform: scale(.35); }

:root[data-theme-mode="light"]  .theme-toggle .icon-sun,
:root[data-theme-mode="dark"]   .theme-toggle .icon-moon,
:root[data-theme-mode="system"] .theme-toggle .icon-system {
  opacity: 1;
  transform: none;
}
/* 兜底：万一某个页面只有 data-theme 没有 data-theme-mode，图标也要对得上 */
:root:not([data-theme-mode])[data-theme="light"] .theme-toggle .icon-sun,
:root:not([data-theme-mode])[data-theme="dark"]  .theme-toggle .icon-moon {
  opacity: 1;
  transform: none;
}


/* ---------------------------------------------------------------------------
   06  目录侧栏 / 移动端抽屉
   --------------------------------------------------------------------------- */
.sidebar {
  position: fixed;
  top: var(--nav-h);
  left: 0;
  z-index: 90;
  width: var(--sidebar-w);
  height: calc(100vh - var(--nav-h));
  height: calc(100dvh - var(--nav-h));
  overflow-y: auto;
  overscroll-behavior: contain;
  padding: var(--sp-6) var(--sp-3) var(--sp-8);
  border: 0;
  border-right: 1px solid var(--glass-border);
  border-radius: 0;
  box-shadow: none;
  background: var(--glass-bg);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  scroll-behavior: smooth;
}
.sidebar::-webkit-scrollbar { width: 6px; }
.sidebar::-webkit-scrollbar-thumb { background: var(--border); border: 0; border-radius: var(--radius-pill); }

.sidebar-group { margin-bottom: var(--sp-5); }
.sidebar-group:last-child { margin-bottom: 0; }

.sidebar-group-title {
  padding: 0 var(--sp-3) var(--sp-2);
  font-family: var(--mono);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--text-muted);
}

.sidebar a {
  display: block;
  padding: 7px var(--sp-3);
  margin-bottom: 2px;
  border-radius: var(--radius-sm);
  font-size: 13.5px;
  line-height: 1.5;
  color: var(--text-dim);
  text-decoration: none;
  border-left: 2px solid transparent;
  transition: color var(--t-fast) linear, background var(--t-fast) linear,
              border-color var(--t-fast) linear, padding-left var(--t-fast) var(--ease-out);
}
@media (hover: hover) {
  .sidebar a:hover { color: var(--text); background: var(--surface-2); }
}
.sidebar a[aria-current="true"] {
  color: var(--accent);
  background: var(--accent-bg);
  border-left-color: var(--accent);
  font-weight: 600;
  padding-left: calc(var(--sp-3) + 4px);
}

/* 抽屉头部与遮罩（JS 注入，仅窄屏可见） */
.sidebar-head {
  display: none;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-3);
  padding: 0 var(--sp-3) var(--sp-4);
  margin-bottom: var(--sp-2);
  border-bottom: 1px solid var(--hairline);
}
.sidebar-head .sidebar-title {
  font-family: var(--mono);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--text-muted);
}
@media (max-width: 1023px) {
  /* 抽屉遮罩 —— **只服务于窄屏抽屉**，所以整块收在这个断点里。
     设计稿把它写成了全局规则（无断点，且 z-index: 120 高于侧栏的 90），
     于是宽屏下点目录按钮时遮罩会盖住侧栏，整页变暗、点击被拦。
     theme.js 只在开抽屉时才创建它，所以收进断点不会有其它副作用。 */
  .scrim {
    position: fixed;
    inset: 0;
    z-index: 120;
    background: rgba(4, 6, 11, .55);
    -webkit-backdrop-filter: blur(3px);
    backdrop-filter: blur(3px);
    opacity: 0;
    visibility: hidden;
    transition: opacity var(--t) linear, visibility var(--t) linear;
  }
  .scrim.is-open { opacity: 1; visibility: visible; }

  .sidebar {
    top: 0;
    z-index: 130;
    width: min(84vw, 320px);
    height: 100dvh;
    padding: var(--sp-5) var(--sp-3) var(--sp-9);
    background: var(--surface-solid);
    border-right: 1px solid var(--border);
    box-shadow: none;
    transform: translateX(-102%);
    transition: transform var(--t-slow) var(--ease-in), box-shadow var(--t-slow) linear;
  }
  .sidebar.is-open {
    transform: none;
    box-shadow: var(--shadow-2);
    transition-timing-function: var(--ease-out), linear;
  }
  .sidebar.is-open .sidebar-head { display: flex; }
  .sidebar-head { display: flex; }
  body.drawer-open { overflow: hidden; }
}


/* ---------------------------------------------------------------------------
   07  阅读进度
   --------------------------------------------------------------------------- */
.read-progress {
  position: fixed;
  top: var(--nav-h);
  left: 0;
  z-index: 101;
  width: 100%;
  height: 2px;
  background: transparent;
  pointer-events: none;
}
.read-progress i {
  display: block;
  height: 100%;
  width: 0;
  background: linear-gradient(90deg, var(--accent-deep), var(--accent-light));
  box-shadow: 0 0 12px var(--accent-line);
  transition: width 120ms linear;
}


/* ---------------------------------------------------------------------------
   08  主内容与 Hero
   --------------------------------------------------------------------------- */
.main {
  margin-left: var(--sidebar-w);
  margin-top: var(--nav-h);
  padding: var(--sp-7) var(--gutter) var(--sp-9);
  max-width: calc(var(--content-max) + var(--gutter) * 2);
}

.hero {
  padding-bottom: var(--sp-6);
  margin-bottom: var(--sp-7);
  border-bottom: 1px solid var(--hairline);
}
.hero .badge {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 12px 4px 10px;
  border-radius: var(--radius-pill);
  border: 1px solid var(--border);
  background: var(--surface);
  font-size: 12.5px;
  font-weight: 600;
  letter-spacing: .01em;
  color: var(--text-dim);
  margin-bottom: var(--sp-4);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
}
.hero .badge svg { display: block; flex: none; }

.hero h1 {
  font-family: var(--font-display);
  font-size: clamp(28px, 4.4vw, 42px);
  font-weight: 700;
  line-height: 1.22;
  letter-spacing: -.022em;
  color: var(--text);
  margin-bottom: var(--sp-4);
  text-wrap: balance;
}
.hero p {
  font-size: 16.5px;
  line-height: 1.8;
  color: var(--text-dim);
  max-width: 62ch;
  margin-bottom: var(--sp-4);
}
.hero .updated {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-family: var(--mono);
  font-size: 12.5px;
  letter-spacing: .02em;
  color: var(--text-muted);
  margin-bottom: var(--sp-3);
}
.hero .updated svg { display: block; flex: none; }
.hero .based-on {
  font-size: 13px;
  line-height: 1.7;
  color: var(--text-muted);
  max-width: 68ch;
  margin-bottom: var(--sp-5);
  padding-left: var(--sp-3);
  border-left: 2px solid var(--hairline);
}
.hero .based-on a { color: var(--accent); text-decoration: none; border-bottom: 1px solid var(--accent-line); }
@media (hover: hover) { .hero .based-on a:hover { border-bottom-color: var(--accent); } }

.hero .stats {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  gap: var(--sp-3);
}
.hero .stat {
  display: grid;
  gap: 2px;
  padding: var(--sp-4) var(--sp-4) calc(var(--sp-4) - 2px);
  border-radius: var(--radius-sm);
  transition: border-color var(--t) linear, transform var(--t) var(--ease-out);
}
.hero .stat .num {
  display: block;
  font-family: var(--font-display);
  font-size: clamp(26px, 3.4vw, 34px);
  font-weight: 700;
  line-height: 1.05;
  letter-spacing: -.03em;
  color: var(--accent);
  font-variant-numeric: tabular-nums;
}
.hero .stat .label {
  display: block;
  font-size: 13px;
  line-height: 1.5;
  color: var(--text-muted);
}


/* ---------------------------------------------------------------------------
   09  正文排版
   --------------------------------------------------------------------------- */
section { margin-bottom: var(--sp-8); scroll-margin-top: calc(var(--nav-h) + var(--sp-5)); }

h2 {
  display: flex;
  align-items: baseline;
  gap: var(--sp-3);
  font-family: var(--font-display);
  font-size: clamp(21px, 2.6vw, 26px);
  font-weight: 700;
  line-height: 1.35;
  letter-spacing: -.018em;
  color: var(--text);
  margin: var(--sp-8) 0 var(--sp-5);
  padding-bottom: var(--sp-3);
  border-bottom: 1px solid var(--hairline);
  scroll-margin-top: calc(var(--nav-h) + var(--sp-5));
  text-wrap: balance;
}
section > h2:first-child { margin-top: 0; }
h2 .section-num {
  flex: none;
  font-family: var(--mono);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: .04em;
  color: var(--accent);
  background: var(--accent-bg);
  border: 1px solid var(--accent-line);
  border-radius: var(--radius-xs);
  padding: 2px 8px;
  font-variant-numeric: tabular-nums;
}

h3 {
  font-family: var(--font-display);
  font-size: 18.5px;
  font-weight: 600;
  line-height: 1.45;
  letter-spacing: -.012em;
  color: var(--text);
  margin: var(--sp-6) 0 var(--sp-3);
  scroll-margin-top: calc(var(--nav-h) + var(--sp-5));
  text-wrap: pretty;
}

h4 {
  font-family: var(--font-display);
  font-size: 16px;
  font-weight: 600;
  line-height: 1.5;
  color: var(--text);
  margin: var(--sp-5) 0 var(--sp-2);
  text-wrap: pretty;
}

p { margin-bottom: var(--sp-4); color: var(--text); text-wrap: pretty; }
p:last-child { margin-bottom: 0; }
p strong, li strong { font-weight: 650; color: var(--text); }

ul, ol { margin: 0 0 var(--sp-4) 0; padding-left: 1.5em; }
li { margin-bottom: var(--sp-2); padding-left: .2em; }
li::marker { color: var(--text-muted); }
li:last-child { margin-bottom: 0; }
ul ul, ol ol, ul ol, ol ul { margin-top: var(--sp-2); }

a { color: var(--accent); text-decoration: none; }
@media (hover: hover) { a:hover { text-decoration: underline; text-underline-offset: 3px; } }


/* ---------------------------------------------------------------------------
   10  代码
   --------------------------------------------------------------------------- */
pre {
  position: relative;
  margin: 0 0 var(--sp-4);
  padding: var(--sp-4) var(--sp-4);
  background: var(--code-bg);
  border: 1px solid var(--code-border);
  border-radius: var(--radius-sm);
  overflow-x: auto;
  overscroll-behavior-x: contain;
  -webkit-backdrop-filter: blur(12px);
  backdrop-filter: blur(12px);
  box-shadow: inset 0 1px 0 var(--glass-hi), inset 0 0 40px rgba(0, 0, 0, .18);
  tab-size: 2;
}
pre code {
  display: block;
  padding: 0;
  background: none;
  border: 0;
  font-family: var(--mono);
  font-size: 13.5px;
  line-height: 1.72;
  color: var(--code-text);
  white-space: pre;
  -webkit-font-smoothing: auto;
}

code {
  font-family: var(--mono);
  font-size: .875em;
  background: var(--surface-2);
  border: 1px solid var(--hairline);
  border-radius: var(--radius-xs);
  padding: 1px 6px;
  color: var(--accent);
  word-break: break-word;
}

/* 行内代码允许软折行。
   设计原稿这里是 `p code, li code { white-space: nowrap }`，但它在手机上会把页面撑破：
   全仓有 1000+ 处行内代码超过 44 字符（390px 屏大约只放得下这么多），docker 那篇里
   一句 74 字符的英文输出就是实例。
   选 `normal` 而不是 `pre-wrap`：源码里有 826 处 <code> 是跨行写的，pre-wrap 会把那些
   换行渲染成真的换行，而 normal 与原先的 nowrap 在空白处理上完全一致（都折叠成单个空格），
   只是额外允许在空格处断行。没有空格的长 token 由 code 规则里的 break-word 兜底。
   表格单元格同样受益——列宽被 table-layout: fixed 定死，代码不折行会压到邻列文字上。
   **必须写成 `:not(pre) > code`**：直接写裸 `code { white-space: normal }` 与 `pre` 的
   `white-space: pre` 同特异性，会按先后顺序把代码块的等宽排布一起改掉。 */
:not(pre) > code { white-space: normal; overflow-wrap: break-word; }

.cmd     { color: var(--syn-cmd); }
.comment { color: var(--syn-comment); font-style: italic; }
.keyword { color: var(--syn-keyword); }
.string  { color: var(--syn-string); }

/* 复制按钮：由脚本注入 */
.code-copy {
  position: absolute;
  top: var(--sp-2);
  right: var(--sp-2);
  z-index: 2;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-width: 34px;
  height: 30px;
  padding: 0 10px;
  border: 1px solid var(--glass-border);
  border-radius: var(--radius-xs);
  background: var(--surface-2);
  -webkit-backdrop-filter: blur(12px);
  backdrop-filter: blur(12px);
  color: var(--text-muted);
  font-family: var(--font);
  font-size: 12px;
  line-height: 1;
  cursor: pointer;
  opacity: 0;
  transition: opacity var(--t) linear, color var(--t-fast) linear,
              background var(--t-fast) linear, border-color var(--t-fast) linear;
}
.code-copy svg { display: block; flex: none; }
.code-copy .code-copy-label { display: none; }
@media (min-width: 640px) { .code-copy .code-copy-label { display: inline; } }
pre:hover .code-copy,
pre:focus-within .code-copy,
.code-copy:focus-visible { opacity: 1; }
@media (hover: none) { .code-copy { opacity: 1; } }
@media (hover: hover) {
  .code-copy:hover { color: var(--text); background: var(--surface-3); border-color: var(--border-strong); }
}
.code-copy.is-done { color: var(--green); border-color: var(--green-line); background: var(--green-bg); }


/* ---------------------------------------------------------------------------
   11  提示框 .box
   --------------------------------------------------------------------------- */
.box {
  position: relative;
  padding: var(--sp-4) var(--sp-4) var(--sp-4) var(--sp-5);
  margin: 0 0 var(--sp-4);
  border-radius: var(--radius-sm);
  font-size: 15px;
  line-height: 1.75;
  color: var(--text-dim);
  background: var(--glass-bg);
}
.box::before {
  content: "";
  position: absolute;
  top: 14px;
  bottom: 14px;
  left: 0;
  width: 3px;
  border-radius: var(--radius-pill);
  background: var(--border-strong);
}
.box .t {
  display: block;
  font-family: var(--font-display);
  font-size: 14px;
  font-weight: 650;
  letter-spacing: .01em;
  color: var(--text);
  margin-bottom: var(--sp-2);
}
.box p { font-size: 15px; color: var(--text-dim); margin-bottom: var(--sp-3); }
.box p:last-child { margin-bottom: 0; }
.box ul, .box ol { margin-bottom: var(--sp-3); }
.box li { color: var(--text-dim); }
.box code { color: var(--accent); }
.box > :first-child { margin-top: 0; }

.box.tip    { background: var(--green-bg);  border-color: var(--green-line); }
.box.tip::before    { background: var(--green); }
.box.tip .t    { color: var(--green); }

.box.warn   { background: var(--orange-bg); border-color: var(--orange-line); }
.box.warn::before   { background: var(--orange); }
.box.warn .t   { color: var(--orange); }

.box.danger { background: var(--red-bg);    border-color: var(--red-line); }
.box.danger::before { background: var(--red); }
.box.danger .t { color: var(--red); }

.box.note   { background: var(--blue-bg);   border-color: var(--blue-line); }
.box.note::before   { background: var(--blue); }
.box.note .t   { color: var(--blue); }

/* 彩色底上的正文要压回主文字色以保证对比度 */
.box.tip p, .box.tip li,
.box.warn p, .box.warn li,
.box.danger p, .box.danger li,
.box.note p, .box.note li { color: var(--text); }


/* ---------------------------------------------------------------------------
   12  对照卡 .compare
   --------------------------------------------------------------------------- */
.compare {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr));
  gap: var(--sp-3);
  margin: 0 0 var(--sp-4);
}
.compare-box {
  padding: var(--sp-4);
  border-radius: var(--radius-sm);
  font-size: 15px;
  line-height: 1.75;
  color: var(--text-dim);
}
.compare-box .compare-title {
  display: block;
  font-family: var(--font-display);
  font-size: 14px;
  font-weight: 650;
  color: var(--text);
  margin-bottom: var(--sp-3);
  padding-bottom: var(--sp-2);
  border-bottom: 1px solid var(--hairline);
}
.compare-box p, .compare-box li { font-size: 15px; color: var(--text-dim); }
.compare-box p { margin-bottom: var(--sp-2); }
.compare-box ul, .compare-box ol { margin-bottom: 0; }

.compare-bad  { background: var(--red-bg);   border-color: var(--red-line); }
.compare-bad .compare-title  { color: var(--red); border-bottom-color: var(--red-line); }
.compare-good { background: var(--green-bg); border-color: var(--green-line); }
.compare-good .compare-title { color: var(--green); border-bottom-color: var(--green-line); }
.compare-bad p, .compare-bad li, .compare-good p, .compare-good li { color: var(--text); }


/* ---------------------------------------------------------------------------
   13  步骤 .steps
   --------------------------------------------------------------------------- */
.steps { display: grid; gap: var(--sp-3); margin: 0 0 var(--sp-4); counter-reset: step; }

.step-item {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: var(--sp-4);
  padding: var(--sp-4);
  border-radius: var(--radius-sm);
}

.step-num {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  flex: none;
  border-radius: var(--radius-pill);
  background: var(--accent-bg);
  border: 1px solid var(--accent-line);
  color: var(--accent);
  font-family: var(--mono);
  font-size: 13px;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
}

.step-content { min-width: 0; }
.step-content .step-title {
  display: block;
  font-family: var(--font-display);
  font-size: 15.5px;
  font-weight: 650;
  color: var(--text);
  margin-bottom: var(--sp-2);
}
.step-content p { font-size: 15px; color: var(--text-dim); margin-bottom: var(--sp-3); }
.step-content p:last-child { margin-bottom: 0; }
.step-content pre { margin-bottom: var(--sp-3); }


/* ---------------------------------------------------------------------------
   14  流程 .flow-diagram
   --------------------------------------------------------------------------- */
.flow-diagram {
  margin: 0 0 var(--sp-4);
  padding: var(--sp-4);
  border-radius: var(--radius-sm);
  background: var(--glass-bg);
  border: 1px solid var(--glass-border);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  box-shadow: inset 0 1px 0 var(--glass-hi), var(--shadow-1);
}

.flow-steps {
  display: flex;
  align-items: stretch;
  gap: var(--sp-2);
  overflow-x: auto;
  overscroll-behavior-x: contain;
  padding-bottom: var(--sp-1);
  scrollbar-width: thin;
}

.flow-step {
  flex: none;
  display: grid;
  gap: var(--sp-1);
  min-width: 132px;
  padding: var(--sp-3);
  border-radius: var(--radius-xs);
  box-shadow: none;
}
.flow-step .step-cmd {
  display: block;
  font-family: var(--mono);
  font-size: 12.5px;
  font-weight: 600;
  color: var(--accent);
  white-space: nowrap;
}
.flow-step .step-name {
  display: block;
  font-size: 12.5px;
  line-height: 1.5;
  color: var(--text-muted);
}

.flow-arrow {
  flex: none;
  display: flex;
  align-items: center;
  color: var(--text-muted);
  opacity: .5;
  font-size: 14px;
  user-select: none;
}


/* ---------------------------------------------------------------------------
   15  KPI
   --------------------------------------------------------------------------- */
.kpi {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-2) var(--sp-6);
  padding: var(--sp-4) var(--sp-5);
  margin: 0 0 var(--sp-4);
  border-radius: var(--radius-sm);
}
.kpi div { display: grid; gap: 2px; }
.kpi b {
  display: block;
  font-family: var(--font-display);
  font-size: 22px;
  font-weight: 700;
  line-height: 1.15;
  letter-spacing: -.02em;
  color: var(--accent);
  font-variant-numeric: tabular-nums;
}
.kpi span {
  display: block;
  font-size: 12.5px;
  line-height: 1.5;
  color: var(--text-muted);
}


/* ---------------------------------------------------------------------------
   16  问答 .qa
   --------------------------------------------------------------------------- */
.qa {
  padding: var(--sp-4);
  margin: 0 0 var(--sp-3);
  border-radius: var(--radius-sm);
}
.qa .q {
  display: block;
  font-family: var(--font-display);
  font-size: 15.5px;
  font-weight: 650;
  line-height: 1.55;
  color: var(--text);
  margin-bottom: var(--sp-3);
  padding-bottom: var(--sp-3);
  border-bottom: 1px solid var(--hairline);
  text-wrap: pretty;
}
.qa .q::before { content: "Q "; font-family: var(--mono); font-size: 12px; color: var(--accent); letter-spacing: .06em; }
.qa .a { font-size: 15px; line-height: 1.8; color: var(--text-dim); }
.qa .a p { font-size: 15px; color: var(--text-dim); margin-bottom: var(--sp-3); }
.qa .a p:last-child { margin-bottom: 0; }
.qa .a strong { color: var(--text); }
.qa .a pre { margin-bottom: var(--sp-3); }


/* ---------------------------------------------------------------------------
   17  表格
   --------------------------------------------------------------------------- */
.table-wrap {
  margin: 0 0 var(--sp-4);
  border-radius: var(--radius-sm);
  overflow-x: auto;
  overscroll-behavior-x: contain;
}

table {
  width: 100%;
  table-layout: fixed;
  border-collapse: collapse;
  font-size: 14px;
  line-height: 1.65;
}
th, td {
  padding: 10px var(--sp-3);
  text-align: left;
  vertical-align: top;
  border-bottom: 1px solid var(--hairline);
  /* 别用 anywhere：它会把单元格的**最小宽度**压到 1 个字符，于是内容一长，别的列
     就被挤成一字一行（全仓有 60 张表含长命令，踩过）。break-word 只在真正溢出时才断词，
     不改变最小宽度。 */
  overflow-wrap: break-word;
}
th {
  font-family: var(--font-display);
  font-size: 12.5px;
  font-weight: 650;
  letter-spacing: .02em;
  color: var(--text-muted);
  background: var(--surface);
  border-bottom-color: var(--border);
}
/* 表头**始终允许折行**。原来用 `@media (min-width: 768px) { th { nowrap } }` 是为了
   免得长中文表头把表格撑宽——但 table-layout: fixed 已经从根上不按内容撑宽了，
   那条 nowrap 在等宽列里只会让长表头**溢出到邻列**（全仓最长的表头约 526px，而 4 列
   均分只有 306px），所以撤掉。 */
td { color: var(--text-dim); }
td strong { color: var(--text); }
tbody tr:last-child td { border-bottom: 0; }
@media (hover: hover) { tbody tr:hover td { background: var(--surface); } }
td code { color: var(--accent); }


/* ---------------------------------------------------------------------------
   18  网格与日程式卡片
   --------------------------------------------------------------------------- */
.grid2, .grid3 {
  display: grid;
  gap: var(--sp-3);
  margin: 0 0 var(--sp-4);
}
.grid2 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr)); }
.grid3 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 210px), 1fr)); }

/* 网格子项的自动最小尺寸默认是 `min-width: auto`——它**不能缩到比内容的最小宽度更窄**。
   子项里装着 <pre>（内部有超长行）时，子项会被撑到 800px 甚至 1050px，整个网格跟着把
   页面撑破（手机端实测：hermes 的 .compare-box 1049px、pi-coding-agent 的 .grid2 子项 801px）。
   设计稿的 @layer od-layout 给 `.od-*` 原语加过同一条，但本仓的组件类名不是 .od-*，所以漏了。
   置 0 之后子项缩到轨道宽度，格子里的 <pre> 由自己的 overflow-x 横滚承接。
   **不要**把 `.flow-steps` 加进来：它的子项有刻意的 `flex: none; min-width: 132px`，
   那是横滚流程图的排版，置 0 会把它压扁。 */
.compare > *, .grid2 > *, .grid3 > *, .steps > * { min-width: 0; }

.day {
  padding: var(--sp-4);
  border-radius: var(--radius-sm);
  background: var(--glass-bg);
  border: 1px solid var(--glass-border);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-sat));
  box-shadow: inset 0 1px 0 var(--glass-hi), var(--shadow-1);
}
.day h4 {
  display: block;
  margin: 0 0 var(--sp-3);
  padding-bottom: var(--sp-2);
  border-bottom: 1px solid var(--hairline);
  font-family: var(--mono);
  font-size: 12.5px;
  font-weight: 600;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--accent);
}
.day p, .day li { font-size: 14.5px; color: var(--text-dim); }


/* ---------------------------------------------------------------------------
   19  首页：工具条 / 卡片列表 / 难度级别
   --------------------------------------------------------------------------- */
/* 首页没有侧栏，容器宽度就是它自己的 1180，顶栏按这条外沿对齐 */
body.index { --shell-w: 1180px; }

body.index main {
  margin-left: 0;
  margin-inline: auto;
  width: 100%;
  max-width: 1180px;
  padding-top: var(--sp-6);
  padding-bottom: var(--sp-9);
}

body.index .top-nav .logo { font-size: 15.5px; }
body.index .top-nav .stats {
  display: none;
  margin-left: auto;
  padding-right: var(--sp-2);
  font-family: var(--mono);
  font-size: 12.5px;
  letter-spacing: .03em;
  color: var(--text-muted);
}
@media (min-width: 900px) { body.index .top-nav .stats { display: block; } }

/* Hero */
body.index .hero {
  padding: var(--sp-7) 0 var(--sp-6);
  margin-bottom: var(--sp-5);
  border-bottom: 0;
}
body.index .hero h1 {
  font-size: clamp(32px, 6vw, 54px);
  letter-spacing: -.03em;
  margin-bottom: var(--sp-4);
}
body.index .hero p { font-size: 17px; max-width: 58ch; }
body.index .hero code {
  font-size: .84em;
  background: var(--accent-bg);
  border-color: var(--accent-line);
  color: var(--accent);
  padding: 2px 8px;
}

/* 工具条：吸在顶栏下方的一整块玻璃 */
.toolbar {
  position: sticky;
  top: calc(var(--nav-h) + var(--sp-3));
  z-index: 60;
  display: grid;
  gap: var(--sp-3);
  padding: var(--sp-3);
  margin-bottom: var(--sp-5);
  border-radius: var(--radius);
  background: var(--glass-bg-2);
  -webkit-backdrop-filter: blur(24px) saturate(180%);
  backdrop-filter: blur(24px) saturate(180%);
}

.toolbar-row {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  flex-wrap: wrap;
}

.search-field {
  position: relative;
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  flex: 1 1 240px;
  min-width: 0;
  height: 40px;
  padding: 0 var(--sp-3);
  border: 1px solid var(--glass-border);
  border-radius: var(--radius-sm);
  background: var(--surface);
  transition: border-color var(--t-fast) linear, box-shadow var(--t-fast) linear, background var(--t-fast) linear;
}
.search-field:focus-within {
  border-color: var(--accent-line);
  box-shadow: 0 0 0 3px var(--accent-bg);
  background: var(--surface-2);
}
.search-field svg { display: block; flex: none; color: var(--text-muted); }
.search-field input {
  flex: 1 1 auto;
  min-width: 0;
  height: 100%;
  border: 0;
  background: none;
  color: var(--text);
  font: inherit;
  font-size: 14.5px;
  outline: none;
}
.search-field input::placeholder { color: var(--text-muted); }
.search-field kbd {
  flex: none;
  padding: 1px 6px;
  border: 1px solid var(--border);
  border-radius: var(--radius-xs);
  background: var(--surface-2);
  font-family: var(--mono);
  font-size: 11px;
  color: var(--text-muted);
}
.search-field.has-value kbd { display: none; }

/* 筛选胶囊 */
.filter-rail {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  overflow-x: auto;
  scrollbar-width: none;
  padding-inline: 2px;
  -webkit-mask-image: linear-gradient(90deg, #000 0, #000 calc(100% - 24px), transparent 100%);
  mask-image: linear-gradient(90deg, #000 0, #000 calc(100% - 24px), transparent 100%);
}
.filter-rail::-webkit-scrollbar { display: none; }

.chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  flex: none;
  height: 34px;
  padding: 0 var(--sp-3);
  border: 1px solid var(--glass-border);
  border-radius: var(--radius-pill);
  background: var(--surface);
  color: var(--text-dim);
  font: inherit;
  font-size: 13.5px;
  font-weight: 550;
  cursor: pointer;
  white-space: nowrap;
  transition: color var(--t-fast) linear, background var(--t-fast) linear,
              border-color var(--t-fast) linear, transform var(--t-fast) var(--ease-out);
}
@media (hover: hover) {
  .chip:hover { color: var(--text); background: var(--surface-3); border-color: var(--border-strong); }
}
.chip:active { transform: scale(.97); }
.chip[aria-pressed="true"] {
  color: var(--accent);
  background: var(--accent-bg);
  border-color: var(--accent-line);
  font-weight: 650;
}
.chip .chip-count {
  font-family: var(--mono);
  font-size: 11.5px;
  color: var(--text-muted);
  font-variant-numeric: tabular-nums;
}
.chip[aria-pressed="true"] .chip-count { color: var(--accent); opacity: .75; }

/* 排序分段控件 */
.segmented {
  display: inline-flex;
  flex: none;
  padding: 3px;
  gap: 2px;
  border: 1px solid var(--glass-border);
  border-radius: var(--radius-pill);
  background: var(--surface);
  margin-left: auto;
}
.segmented button {
  border: 0;
  border-radius: var(--radius-pill);
  background: none;
  color: var(--text-muted);
  font: inherit;
  font-size: 13px;
  font-weight: 550;
  padding: 5px 12px;
  cursor: pointer;
  white-space: nowrap;
  transition: color var(--t-fast) linear, background var(--t-fast) linear;
}
@media (hover: hover) { .segmented button:hover { color: var(--text); } }
.segmented button[aria-pressed="true"] { color: var(--accent); background: var(--accent-bg); font-weight: 650; }

.result-count {
  font-family: var(--mono);
  font-size: 12.5px;
  letter-spacing: .02em;
  color: var(--text-muted);
  margin-left: auto;
  white-space: nowrap;
}
.result-count b { color: var(--text); font-weight: 600; }

/* 卡片列表 */
body.index .card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 460px), 1fr));
  gap: var(--sp-4);
  /* 默认的 stretch：同一行的卡片等高。设计原稿写的是 `align-items: start`（各按内容高度），
     于是同一行底边参差——实测有 175/200、226/175 这样的行。等高还要靠下面 .card-title /
     .card-desc 的行数预留来消掉底部空带，两者缺一不可。 */
  align-items: stretch;
}

body.index .card {
  display: grid;
  gap: var(--sp-3);
  padding: var(--sp-5);
  border-radius: var(--radius);
  text-decoration: none;
  color: inherit;
  min-width: 0;
  transition: transform var(--t) var(--ease-out), border-color var(--t) linear,
              box-shadow var(--t) linear, background var(--t) linear;
}
@media (hover: hover) {
  body.index .card:hover {
    transform: translateY(-3px);
    border-color: var(--accent-line);
    background: var(--glass-bg-2);
    box-shadow: inset 0 1px 0 var(--glass-hi), var(--glow), var(--shadow-2);
  }
}
body.index .card:active { transform: translateY(-1px); }

.card-meta {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  flex-wrap: wrap;
}

.card-title {
  font-family: var(--font-display);
  font-size: 17px;
  font-weight: 650;
  line-height: 1.5;
  letter-spacing: -.012em;
  color: var(--text);
  text-wrap: pretty;
  /* 预留两行：标题长短不一会让同一行的卡片内容高度不齐，配合 .card-desc 的预留，
     整页卡片才会长得一样。实测标题最多占 2 行（1 行 ×28 张 / 2 行 ×3 张）。 */
  min-height: calc(2 * 1.5em);
}
@media (hover: hover) { body.index .card:hover .card-title { color: var(--accent-light); } }

.card-desc {
  font-size: 14.5px;
  line-height: 1.72;
  color: var(--text-dim);
  text-wrap: pretty;
  /* 预留三行：实测简介占 2–3 行（1440/1280 视口下 2 行 ×16 张、3 行 ×15 张）。
     用 min-height 而不是 line-clamp——宁可个别卡片略高，也不截断简介。 */
  min-height: calc(3 * 1.72em);
}

.card-date {
  font-family: var(--mono);
  font-size: 12px;
  letter-spacing: .02em;
  color: var(--text-muted);
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
}

.card-icon { display: none; }

/* 难度级别：颜色 + 文字 + 信号条，三重表意，不靠颜色单独传达 */
.card-tag,
.difficulty-easy,
.difficulty-medium,
.difficulty-hard {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  flex: none;
  padding: 3px 10px;
  border-radius: var(--radius-pill);
  border: 1px solid var(--border);
  background: var(--surface);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: .02em;
  line-height: 1.5;
  white-space: nowrap;
}
.card-tag svg, .difficulty-easy svg, .difficulty-medium svg, .difficulty-hard svg { display: block; flex: none; }

.difficulty-easy,
.card-tag.difficulty-easy {
  color: var(--lv-easy); background: var(--lv-easy-bg); border-color: var(--lv-easy-line);
}
.difficulty-medium,
.card-tag.difficulty-medium {
  color: var(--lv-medium); background: var(--lv-medium-bg); border-color: var(--lv-medium-line);
}
.difficulty-hard,
.card-tag.difficulty-hard {
  color: var(--lv-hard); background: var(--lv-hard-bg); border-color: var(--lv-hard-line);
}
/* 文章 Hero 里的级别徽章：盖子 .hero .badge 的基础配色，让级别色生效 */
.hero .badge.difficulty-easy,
.hero .badge.difficulty-medium,
.hero .badge.difficulty-hard {
  font-size: 12.5px;
  padding: 4px 12px 4px 10px;
}
.hero .badge.difficulty-easy   { color: var(--lv-easy);   background: var(--lv-easy-bg);   border-color: var(--lv-easy-line); }
.hero .badge.difficulty-medium { color: var(--lv-medium); background: var(--lv-medium-bg); border-color: var(--lv-medium-line); }
.hero .badge.difficulty-hard   { color: var(--lv-hard);   background: var(--lv-hard-bg);   border-color: var(--lv-hard-line); }

/* 空状态 */
.empty-state {
  display: grid;
  justify-items: center;
  gap: var(--sp-3);
  padding: var(--sp-9) var(--sp-5);
  text-align: center;
  border: 1px dashed var(--border-strong);
  border-radius: var(--radius);
  background: var(--surface);
}
.empty-state svg { color: var(--text-muted); opacity: .7; }
.empty-state .empty-title {
  font-family: var(--font-display);
  font-size: 16px;
  font-weight: 650;
  color: var(--text);
}
.empty-state .empty-hint { font-size: 14px; color: var(--text-muted); max-width: 40ch; }
.empty-state button {
  height: 36px;
  padding: 0 var(--sp-4);
  border: 1px solid var(--accent-line);
  border-radius: var(--radius-pill);
  background: var(--accent-bg);
  color: var(--accent);
  font: inherit;
  font-size: 13.5px;
  font-weight: 600;
  cursor: pointer;
}

/* 筛选进行中的卡片入场 */
@keyframes card-in {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: none; }
}
.card.is-entering { animation: card-in 260ms var(--ease-out) both; animation-delay: var(--stagger, 0ms); }


/* ---------------------------------------------------------------------------
   20  Skill 明细（兼容旧页面：humanlayer / mattpocock / ecc 等）
   --------------------------------------------------------------------------- */
.skill-detail {
  margin: 0 0 var(--sp-3);
  padding: var(--sp-4);
  border-radius: var(--radius-sm);
  font-size: 15px;
  line-height: 1.75;
}
.skill-detail .skill-header {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  flex-wrap: wrap;
  margin-bottom: var(--sp-3);
  padding-bottom: var(--sp-3);
  border-bottom: 1px solid var(--hairline);
}
.skill-detail .skill-cmd {
  font-family: var(--mono);
  font-size: 13px;
  font-weight: 600;
  color: var(--accent);
  background: var(--accent-bg);
  border: 1px solid var(--accent-line);
  border-radius: var(--radius-xs);
  padding: 2px 8px;
  white-space: nowrap;
}
.skill-detail .skill-meta { display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap; margin-left: auto; }
.skill-detail .skill-name {
  font-family: var(--font-display);
  font-size: 16px;
  font-weight: 650;
  color: var(--text);
}
.skill-detail .skill-type {
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: .04em;
  padding: 2px 8px;
  border-radius: var(--radius-pill);
  border: 1px solid var(--border);
  color: var(--text-muted);
  white-space: nowrap;
}
.skill-detail .skill-type.type-user  { color: var(--blue);  background: var(--blue-bg);  border-color: var(--blue-line); }
.skill-detail .skill-type.type-model { color: var(--purple); background: var(--purple-bg); border-color: var(--border); }
.skill-detail .skill-desc { font-size: 15px; color: var(--text-dim); margin-bottom: var(--sp-3); }
.skill-detail .skill-section { margin-top: var(--sp-3); }
.skill-detail .skill-section-title {
  display: block;
  font-family: var(--mono);
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--text-muted);
  margin-bottom: var(--sp-2);
}
.skill-detail .skill-section li { font-size: 14.5px; color: var(--text-dim); }


/* ---------------------------------------------------------------------------
   21  页脚与浮动控件
   --------------------------------------------------------------------------- */
footer {
  margin-top: var(--sp-8);
  padding: var(--sp-5) 0 var(--sp-2);
  border-top: 1px solid var(--hairline);
  font-size: 13px;
  line-height: 1.8;
  color: var(--text-muted);
}
footer p { font-size: 13px; color: var(--text-muted); margin-bottom: var(--sp-2); }
footer code {
  font-size: .88em;
  background: var(--accent-bg);
  border-color: var(--accent-line);
  color: var(--accent);
  padding: 1px 6px;
}
footer a { color: var(--text-dim); text-decoration: none; border-bottom: 1px solid var(--border); }
@media (hover: hover) { footer a:hover { color: var(--accent); border-bottom-color: var(--accent-line); } }

body.index footer {
  max-width: 1180px;
  margin-inline: auto;
  width: 100%;
  padding-inline: var(--sp-6);
  padding-top: var(--sp-6);
  text-align: center;
}

/* 返回主页 */
.back-home {
  position: fixed;
  right: var(--sp-5);
  bottom: var(--sp-5);
  z-index: 70;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--sp-2);
  width: 44px;
  height: 44px;
  border: 1px solid var(--glass-border);
  border-radius: var(--radius-pill);
  background: var(--glass-bg-2);
  -webkit-backdrop-filter: blur(18px) saturate(170%);
  backdrop-filter: blur(18px) saturate(170%);
  color: var(--text-dim);
  font-size: 13px;
  font-weight: 600;
  text-decoration: none;
  box-shadow: var(--shadow-1);
  transition: color var(--t-fast) linear, border-color var(--t-fast) linear,
              transform var(--t) var(--ease-out), box-shadow var(--t) linear;
}
@media (min-width: 640px) {
  .back-home { width: auto; padding: 0 var(--sp-4); height: 42px; }
  .back-home .back-home-label { display: inline; }
}
.back-home .back-home-label { display: none; }
@media (hover: hover) {
  .back-home:hover {
    color: var(--accent);
    border-color: var(--accent-line);
    transform: translateY(-2px);
    box-shadow: var(--glow), var(--shadow-2);
  }
}

/* 回到顶部 */
.to-top {
  position: fixed;
  right: var(--sp-5);
  bottom: calc(var(--sp-5) + 56px);
  z-index: 70;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border: 1px solid var(--glass-border);
  border-radius: var(--radius-pill);
  background: var(--glass-bg-2);
  -webkit-backdrop-filter: blur(18px) saturate(170%);
  backdrop-filter: blur(18px) saturate(170%);
  color: var(--text-dim);
  cursor: pointer;
  box-shadow: var(--shadow-1);
  opacity: 0;
  visibility: hidden;
  transform: translateY(8px);
  transition: opacity var(--t) linear, visibility var(--t) linear,
              transform var(--t) var(--ease-out), color var(--t-fast) linear,
              border-color var(--t-fast) linear;
}
.to-top.is-visible { opacity: 1; visibility: visible; transform: none; }
@media (hover: hover) { .to-top:hover { color: var(--accent); border-color: var(--accent-line); } }


/* ---------------------------------------------------------------------------
   22  响应式 —— 375 / 768 / 1024 / 1440，重排内容而不是整体缩放
   --------------------------------------------------------------------------- */
@media (max-width: 1023px) {
  .main {
    margin-left: 0;
    padding: var(--sp-6) var(--sp-5) var(--sp-8);
    max-width: 100%;
  }
  .sidebar { padding-top: var(--sp-5); }
  body.index main { padding-inline: var(--sp-5); }
}

@media (max-width: 768px) {
  :root { --nav-h: 56px; }
  body { font-size: 16px; }
  .main { padding: var(--sp-5) var(--sp-4) var(--sp-8); }
  body.index main { padding-inline: var(--sp-4); }
  body.index footer { padding-inline: var(--sp-4); }
  .hero { padding-bottom: var(--sp-5); margin-bottom: var(--sp-6); }
  .hero p { font-size: 16px; }
  section { margin-bottom: var(--sp-7); }
  h2 { margin-top: var(--sp-7); }
  .hero .stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .hero .stat { padding: var(--sp-3); }
  .toolbar { top: calc(var(--nav-h) + var(--sp-2)); }
  .segmented { margin-left: 0; }
  .result-count { margin-left: auto; }
  .compare { grid-template-columns: 1fr; }
  .grid2, .grid3 { grid-template-columns: 1fr; }
  .table-wrap { margin-inline: calc(var(--sp-1) * -1); }
  .back-home { right: var(--sp-4); bottom: var(--sp-4); }
  .to-top { right: calc(var(--sp-4) + 52px); bottom: var(--sp-4); }
}

@media (max-width: 640px) {
  .top-nav { padding: 0 var(--sp-4); gap: var(--sp-3); }
  .top-nav .logo { font-size: 14.5px; }
  .hero h1 { font-size: clamp(26px, 7vw, 32px); }
  body.index .hero { padding-top: var(--sp-6); }
  body.index .hero h1 { font-size: clamp(30px, 9vw, 40px); }
  body.index .hero p { font-size: 16px; }
  body.index .card-grid { grid-template-columns: 1fr; gap: var(--sp-3); }
  body.index .card { padding: var(--sp-4); }
  .card-title { font-size: 16.5px; }
  .card-desc { font-size: 14px; }
  .toolbar { padding: var(--sp-2); gap: var(--sp-2); }
  .kpi { gap: var(--sp-3) var(--sp-5); padding: var(--sp-3) var(--sp-4); }
  .kpi b { font-size: 19px; }
  .box { padding: var(--sp-3) var(--sp-3) var(--sp-3) var(--sp-4); font-size: 14.5px; }
  .box p { font-size: 14.5px; }
  .qa { padding: var(--sp-3); }
  .qa .a, .qa .a p { font-size: 14.5px; }
  table { font-size: 13.5px; }
  th, td { padding: 8px var(--sp-2); }
  pre { padding: var(--sp-3); margin-bottom: var(--sp-3); }
  pre code { font-size: 12.5px; }
  .flow-step { min-width: 116px; }
  body.index footer { padding-inline: var(--sp-4); }
  .empty-state { padding: var(--sp-7) var(--sp-4); }
}

/* 宽屏：内容仍然收窄，让阅读行长稳定 */
@media (min-width: 1440px) {
  .main { padding-top: var(--sp-8); }
}

/* ---------------------------------------------------------------------------
   22b  大屏居中：侧栏与正文作为一个整体在视口里居中，而不是贴着左边
   窄屏（<1024px）侧栏是抽屉、正文通栏，完全不受这里影响。
   --------------------------------------------------------------------------- */
@media (min-width: 1024px) {
  :root {
    /* 顶栏浮动后，内容避让高度 = 上间隙 + 条高 + 下间隙 */
    --nav-h: calc(var(--nav-gap) + var(--nav-bar) + var(--sp-3));
    /* 正文栏左沿 = 容器左外沿 + 侧栏宽 */
    --main-x: max(var(--sidebar-w),
                  calc((100% - var(--layout-w)) / 2 + var(--sidebar-w)));
  }

  /* 顶栏：与居中容器同宽、脱离视口顶边的浮动玻璃条 */
  .top-nav,
  .top-nav.is-scrolled {
    top: var(--nav-gap);
    left: max(var(--sp-3), calc((100% - var(--shell-w)) / 2));
    right: max(var(--sp-3), calc((100% - var(--shell-w)) / 2));
    height: var(--nav-bar);
    padding-inline: var(--sp-4);
    border: 1px solid var(--glass-border);
    border-radius: var(--radius-pill);
    box-shadow: inset 0 1px 0 var(--glass-hi), var(--shadow-2);
  }

  /* 侧栏跟着整体右移同样的距离 */
  body:not(.index) .sidebar {
    left: max(0px, calc((100% - var(--layout-w)) / 2));
  }

  /* 正文与页脚：起点 = 正文栏左沿，宽度 = 阅读栏宽 + 两侧留白 */
  body:not(.index) .main,
  body:not(.index) > footer {
    margin-left: var(--main-x);
    margin-right: auto;
    max-width: calc(var(--content-max) + var(--gutter) * 2);
  }

  body:not(.index) > footer {
    padding-inline: var(--gutter);
  }

  /* 右下角的两个浮动控件也对齐到正文栏右沿，不留在视口最边上 */
  body:not(.index) .back-home,
  body:not(.index) .to-top {
    right: max(var(--sp-4), calc((100% - var(--layout-w)) / 2 + var(--gutter)));
  }

  /* 阅读进度条：与正文栏同起点同宽度，不再是通栏 */
  body:not(.index) .read-progress {
    left: calc(var(--main-x) + var(--gutter));
    width: min(var(--content-max),
               calc(100% - var(--main-x) - var(--gutter) * 2));
    border-radius: var(--radius-pill);
    overflow: hidden;
  }
}


/* ---------------------------------------------------------------------------
   23  动效与可访问性收尾
   --------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    scroll-behavior: auto !important;
  }
  .card.is-entering { animation: none; }
}

/* 高对比度偏好：发丝边框加粗一档，避免玻璃panel糊在一起 */
@media (prefers-contrast: more) {
  :root { --glass-border: rgba(255, 255, 255, .30); --hairline: rgba(255, 255, 255, .22); }
  :root[data-theme="light"] { --glass-border: rgba(17, 26, 46, .34); --hairline: rgba(17, 26, 46, .24); }
}
