/* Formatting Box — 日月为易（DESIGN.md v2）
   唯一视觉依据：docs/DESIGN.md（双极色板 / 日月场景 / 母题 / 动效白名单） */

/* ---- 自托管 JetBrains Mono（仅拉丁子集，约 21KB；正文字体见 fonts/serif.css） ---- */
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('/_static/ea792af60e94ab58f4223c5a/fonts/JetBrainsMono-Regular.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;
}

:root {
  --bg: #1A1D23;
  --surface: #232830;
  --line: rgba(214, 219, 228, 0.12); /* 银色 hairline */
  --nav-height: 64px; /* 单源（v3.20 §2）：sticky 工具栏停于 nav 之下 */
  /* 可读信息的字号只有三档：操作、元信息、纯装饰。桌面旧貌可在具体语境中
     继续收细；窄屏与粗指针在文件末的语义规则里以此作为下限，而非机械放大全站。 */
  --type-action: 0.875rem;
  --type-meta: 0.8125rem;
  --type-decorative: 0.6875rem;
  /* viewport-fit=cover 启用后，所有固定器官只读这一组安全区；未启用时自然为 0。 */
  --safe-area-top: env(safe-area-inset-top, 0px);
  --safe-area-right: env(safe-area-inset-right, 0px);
  --safe-area-bottom: env(safe-area-inset-bottom, 0px);
  --safe-area-left: env(safe-area-inset-left, 0px);
  --nav-safe-height: calc(var(--nav-height) + var(--safe-area-top));
  --text: #E8EBF1;
  --text-dim: #98A0AD;
  --moon: #D3D9E4; /* 月极·寒光银：交互反馈 */
  --sun: #B5977A;  /* 日极·氧化铜：印记与警示 */
  --link: #AFA0D0; /* 正文外链·灰紫：可读去路，不借生命树青绿的非交互语义 */
  --sky: #14161B;  /* hero 天空层：比 --bg 深半档，夜空护月（DESIGN.md §1） */

  /* 独立站点字族始终读取同源网页字体，不因设备已有的同名字体而换脸。 */
  --font-serif: 'Formatting Box Latin', 'Formatting Box Serif', 'Noto Serif SC', 'Source Han Serif SC', 'Songti SC', serif;
  --font-sans: system-ui, -apple-system, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
  /* 小型界面字与主页文字同源：中文借站训「渐进风华，随遇而安」的字形，
     英文借主标题 Gloamirror 的字形；二者本来都由 --font-serif 承载。 */
  --font-meta: var(--font-serif);
  --font-meta-weight: 550;
  --font-mono: 'JetBrains Mono', ui-monospace, 'Cascadia Code', Consolas, monospace;

  --content: 760px; /* 阅读栏（v2.5 收窄）：正文/文章/留言 */
  --hero-col: 1100px; /* hero 内容栏：氛围区，允许比阅读栏宽 */
  --band-pad: clamp(1.25rem, 3vw, 2.5rem); /* nav/footer 与天同宽时的左右内边距 */
}

/* 日月权重与日弧升沉：@property 注册使 CSS 变量本身可过渡（DESIGN.md §4-5），
   指针互动与回落全程缓动无跳变。app.js 按时刻写基线、按指针距离加权。 */
@property --moon-w {
  syntax: '<number>';
  inherits: true;
  initial-value: 0.6;
}
@property --sun-w {
  syntax: '<number>';
  inherits: true;
  initial-value: 0.6;
}
@property --sun-lift {
  syntax: '<number>';
  inherits: true;
  initial-value: 0.6;
}

/* 权重变量挂在 :root（app.js 写入），.sky 与 .horizon--sky 均可继承；
   缓动在此统一（DESIGN.md §4-5） */
html {
  transition: --moon-w 1.4s ease, --sun-w 1.4s ease, --sun-lift 1.4s ease;
}
/* 触屏：触摸/滑动光变缓回更跟手（DESIGN.md §4-7），桌面 hover 保持 1.4s 不变 */
@media (pointer: coarse) {
  html { transition-duration: 0.7s; }
}

* { box-sizing: border-box; margin: 0; padding: 0; }

body {
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-sans);
  font-size: 1rem;
  line-height: 1.85;
}

/* 历史类名 `.mono` 实际承载的是全站微型界面文案；保留类名以免改动运行时 DOM，
   字体语义改由 --font-meta 接管。真正的代码与数字装饰仍显式读取 --font-mono。 */
.mono {
  font-family: var(--font-meta);
  font-weight: var(--font-meta-weight);
  font-optical-sizing: auto;
  font-kerning: normal;
  font-variant-numeric: tabular-nums;
}

a { color: inherit; text-decoration: none; }

/* 键盘跳过固定导航：默认维持读屏与 Tab 可达，只有 :focus-visible 时入画。 */
.skip-link:not(:focus-visible) {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}
.skip-link:focus-visible {
  position: fixed;
  z-index: 100;
  top: max(0.65rem, calc(var(--safe-area-top) + 0.35rem));
  left: 50%;
  min-height: 44px;
  padding: 0.55rem 1rem;
  display: inline-flex;
  align-items: center;
  transform: translateX(-50%);
  border: 1px solid var(--moon);
  border-radius: 2px;
  outline: 1px solid var(--moon);
  outline-offset: 2px;
  background: var(--surface);
  color: var(--moon);
  font-size: 0.76rem;
  line-height: 1;
  letter-spacing: 0.08em;
  white-space: nowrap;
}
#main-content:focus { outline: none; }

@media (forced-colors: active) {
  .skip-link:focus-visible {
    border-color: Highlight;
    outline: 2px solid Highlight;
    background: Canvas;
    color: CanvasText;
  }
}

/* ---- 入场淡入（DESIGN.md §4-2）。带静态 transform 的元素用 rise-fade ---- */
@keyframes rise {
  from { opacity: 0; transform: translateY(14px); }
}
@keyframes rise-fade {
  from { opacity: 0; }
}
.rise { animation: rise 0.9s ease both; animation-delay: calc(var(--d, 0) * 0.12s); }
.rise-fade { animation: rise-fade 0.9s ease both; animation-delay: calc(var(--d, 0) * 0.12s); }

/* ---- 导航 ---- */
.nav {
  position: fixed;
  inset: 0 0 auto 0;
  z-index: 10;
  transition: background 0.3s, border-color 0.3s;
  border-bottom: 1px solid transparent;
}
.nav.scrolled {
  background: rgba(22, 24, 28, 0.85); /* --surface 半透明 */
  -webkit-backdrop-filter: blur(10px); /* Safari ≤17 只认 -webkit- 前缀 */
  backdrop-filter: blur(10px);
  border-bottom-color: var(--line);
}
.nav-inner {
  /* v2.5：与天同宽，内边距跟随天空带 */
  position: relative;
  padding: 1rem var(--band-pad);
  display: flex;
  align-items: baseline;
  justify-content: space-between;
}

/* 全站唯一昼夜硬币：次级页常驻；主页在天空地平线越过固定导航后交接于此。
   可见面表示当前模式：太阳即浅、月亮即深；视觉声明保持全站同一实例。 */
.page-theme-coin {
  --coin-turn: 0deg;
  --coin-scale: 1;
  appearance: none;
  position: absolute;
  z-index: 3;
  top: calc(var(--safe-area-top) + 0.62rem);
  left: 50%;
  display: grid;
  width: 44px;
  height: 44px;
  padding: 0;
  place-items: center;
  transform: translateX(-50%);
  border: 0;
  background: transparent;
  color: var(--text);
  cursor: pointer;
  perspective: 260px;
  -webkit-tap-highlight-color: transparent;
}
.page-theme-coin[hidden] { display: none; }
.page-theme-coin[data-mode="dark"] { --coin-turn: 180deg; }
.page-theme-coin-disc {
  position: relative;
  display: block;
  width: 30px;
  height: 30px;
  transform: rotateY(var(--coin-turn)) scale(var(--coin-scale));
  transform-style: preserve-3d;
  transition: transform 0.5s cubic-bezier(0.22, 0.72, 0.16, 1);
  will-change: transform;
}
.page-theme-coin-face {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  overflow: hidden;
  border: 1px solid color-mix(in srgb, currentColor 58%, var(--line));
  border-radius: 50%;
  backface-visibility: hidden;
  box-shadow:
    inset 0 0 0 1px color-mix(in srgb, var(--bg) 36%, transparent),
    inset -3px -2px 5px color-mix(in srgb, var(--sky) 42%, transparent),
    0 2px 5px color-mix(in srgb, var(--sky) 36%, transparent);
}
.page-theme-coin-face svg { width: 21px; height: 21px; }
.page-theme-coin-face--sun {
  color: color-mix(in srgb, var(--sun) 90%, var(--text));
  background:
    radial-gradient(circle at 35% 30%, color-mix(in srgb, var(--surface) 42%, white), transparent 46%),
    color-mix(in srgb, var(--sun) 17%, var(--surface));
}
.page-theme-coin-face--sun circle { fill: currentColor; stroke: none; }
.page-theme-coin-face--sun path {
  fill: none;
  stroke: currentColor;
  stroke-width: 1.55;
  stroke-linecap: round;
}
.page-theme-coin-face--moon {
  transform: rotateY(180deg);
  color: color-mix(in srgb, var(--moon) 94%, var(--text));
  background:
    radial-gradient(circle at 34% 30%, color-mix(in srgb, var(--moon) 20%, var(--surface)), transparent 48%),
    color-mix(in srgb, var(--moon) 9%, var(--surface));
}
.page-theme-coin-face--moon path { fill: currentColor; stroke: none; }
.page-theme-coin:focus-visible {
  outline: 1px solid var(--moon);
  outline-offset: -5px;
  border-radius: 50%;
}
body.editor-open .page-theme-coin {
  visibility: hidden;
  pointer-events: none;
}
body.ai-composer-open .page-theme-coin {
  visibility: hidden;
  pointer-events: none;
}
body.search-open .page-theme-coin {
  visibility: hidden;
  pointer-events: none;
}
@media (hover: hover) and (pointer: fine) {
  .page-theme-coin:hover { --coin-scale: 1.06; }
}
@media (prefers-reduced-motion: reduce) {
  .page-theme-coin-disc { transition: none; }
}
@media (forced-colors: active) {
  .page-theme-coin-face {
    border: 2px solid ButtonText;
    background: ButtonFace;
    color: ButtonText;
    box-shadow: none;
  }
  .page-theme-coin:focus-visible { outline: 2px solid Highlight; }
}
.brand {
  font-family: var(--font-serif);
  font-size: 1.05rem;
  letter-spacing: 0.02em;
}
.nav-home-slot {
  position: relative;
  min-width: 7.1rem;
  display: inline-flex;
  align-items: baseline;
  flex: 0 0 auto;
}
.brand.is-away {
  visibility: hidden;
  pointer-events: none;
}
.nav-return {
  appearance: none;
  position: absolute;
  left: 0;
  top: 50%;
  min-width: 44px;
  height: 44px;
  max-width: min(13rem, calc(100vw - 8rem));
  padding: 0 0.15rem;
  display: inline-flex;
  align-items: center;
  gap: 0.42rem;
  transform: translateY(-50%);
  border: 0;
  border-radius: 2px;
  background: transparent;
  color: var(--text-dim);
  cursor: pointer;
  font: var(--font-meta-weight) 0.76rem/1 var(--font-meta);
  letter-spacing: 0.04em;
  white-space: nowrap;
  transition: color 0.25s ease, filter 0.25s ease;
}
.nav-return[hidden] { display: none; }
.nav-return-label {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
}
.nav-return-arrow {
  position: relative;
  width: 1.15em;
  height: 1em;
  display: inline-grid;
  place-items: center;
  flex: 0 0 auto;
  color: var(--moon);
  transition: transform 0.22s ease;
}
.nav-return-arrow::after {
  content: "";
  position: absolute;
  left: 0;
  top: 0.78em;
  width: 0.9em;
  height: 0.48em;
  background: var(--moon);
  opacity: 0.16;
  clip-path: polygon(0 50%, 34% 0, 34% 39%, 100% 39%, 100% 61%, 34% 61%, 34% 100%);
  transform: scaleY(-0.46);
  transform-origin: center top;
  transition: opacity 0.22s ease;
}
@media (hover: hover) and (pointer: fine) {
  .nav-return:hover { color: var(--moon); filter: none; }
  .nav-return:hover .nav-return-arrow { transform: translateX(-2px); }
  .nav-return:hover .nav-return-arrow::after { opacity: 0.28; }
}
.nav-return:focus-visible {
  color: var(--moon);
  outline: 2px solid var(--moon);
  outline-offset: 2px;
}
body.editor-open:not(.publish-surface-open) .nav-return {
  visibility: hidden;
  pointer-events: none;
}
.nav-menu-toggle {
  display: none;
  width: 44px;
  height: 44px;
  margin: -0.65rem -0.7rem -0.65rem 0;
  border: 0;
  background: transparent;
  color: var(--text-dim);
  align-items: center;
  justify-content: center;
  cursor: pointer;
}
.nav-menu-glyph {
  width: 18px;
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 4px;
}
.nav-menu-line {
  display: block;
  width: 18px;
  height: 1px;
  background: currentColor;
}
.nav-menu-line:nth-child(2) { width: 13px; }
.nav-menu-toggle:hover, .nav-menu-toggle:focus-visible { color: var(--moon); }
.nav-menu-toggle:focus-visible { outline: 1px solid var(--moon); outline-offset: -7px; }
.nav-links {
  display: flex;
  gap: 1.75rem;
  color: var(--text-dim);
  font-family: var(--font-meta);
  font-size: 0.88rem;
  font-weight: var(--font-meta-weight);
}
/* 720px 刚回到桌面直排时，右侧栏目主动收拢留出正中硬币的完整直径；
   不挪硬币，也不扩大既有移动菜单断点。 */
@media (min-width: 720px) and (max-width: 900px) {
  .nav .nav-links { gap: clamp(0.85rem, 2vw, 1.125rem); }
}
.nav.is-menu-open .page-theme-coin {
  visibility: hidden;
  pointer-events: none;
}
.nav-links a, .nav-links button { transition: color 0.3s; }
.nav-link {
  appearance: none;
  border: 0;
  padding: 0;
  background: transparent;
  color: inherit;
  font: inherit;
  line-height: inherit;
  cursor: pointer;
}
/* nav-search 入 mirror-touch 族：补 filter/transform 过渡（评审 medium：
   .nav-links 后代 (0,1,1) 特异性压过组的 (0,1,0)，否则起雾/微浮瞬跳无缓动） */
.nav-links .mirror-touch { transition: color 0.3s, filter 0.3s ease, transform 0.3s ease; }
.nav-links a:hover, .nav-links button:hover { color: var(--moon); }

@media (prefers-reduced-motion: reduce) {
  .nav-return, .nav-return-arrow, .nav-return-arrow::after { transition: none; }
  .nav-return:hover .nav-return-arrow { transform: none; }
}
@media (forced-colors: active) {
  .nav-return { color: ButtonText; forced-color-adjust: auto; }
  .nav-return-arrow { color: ButtonText; }
  .nav-return-arrow::after { display: none; }
  .nav-return:focus-visible { color: Highlight; outline: 2px solid Highlight; }
}

/* ---- Hero（v2.5 满幅天空带：.sky 挂 band 全视口宽；两侧留白即夜空）---- */
.hero-band {
  position: relative;
  background: var(--sky);
}
.hero {
  position: relative;
  min-height: 92vh;
  min-height: 92svh; /* 小视口稳定首屏；旧浏览器沿用上一行 vh */
  max-width: var(--hero-col);
  margin: 0 auto;
  padding: 0 max(1.5rem, var(--safe-area-right)) 0 max(1.5rem, var(--safe-area-left));
  display: flex;
  align-items: center;
  z-index: 1;
}
.hero-main { width: 100%; position: relative; z-index: 1; }

/* ---- 日月平衡场景（背景层满幅，DESIGN.md v2.5 §3b）---- */
.sky {
  position: absolute;
  inset: 0;
  overflow: hidden; /* 仅日盘沉于地平线之下的下缘属"沉日"本体；横向满幅无裁切 */
  pointer-events: none;
  z-index: 0;
}
/* ---- 天体锚点：唯一事实源（6.3.1，DESIGN.md §3b）——
   组容器落在锚点上，组内天体与光晕一律 translate(-50%,-50%) 对中，
   光随体走；改锚点只改这几个变量，禁止逐断点手调像素 ---- */
.sky {
  --moon-x: 20%; /* 桌面：视口左约 1/5 */
  --moon-y: calc(16% + 21px);
  --sun-x: 83%;  /* 桌面：视口右约 1/6 */
  --glow-moon: 222px;
  --glow-sun: 220px;
}
.celestial { position: absolute; width: 0; height: 0; }
.celestial--moon { left: var(--moon-x); top: var(--moon-y); }
/* 日组锚在地平线（band 底缘）上的 --sun-x 处 */
.celestial--sun { left: var(--sun-x); bottom: 0; }
.celestial-status-trigger {
  appearance: none;
  position: absolute;
  left: var(--moon-x);
  top: var(--moon-y);
  z-index: 1;
  width: 44px;
  height: 44px;
  padding: 0;
  transform: translate(-50%, -50%);
  border: 0;
  border-radius: 50%;
  background: transparent;
  color: var(--moon);
  pointer-events: auto;
  cursor: pointer;
}
.celestial-status-trigger:focus-visible {
  outline: 1px solid var(--moon);
  outline-offset: 3px;
}
.celestial-status-reveal {
  position: absolute;
  z-index: 4;
  box-sizing: border-box;
  width: min(20rem, calc(100vw - max(2.5rem, var(--safe-area-left)) - max(2.5rem, var(--safe-area-right))));
  padding: 0.42rem 0 0.5rem;
  /* 在场笺只容一瞥：长状态在其内滚动，不把首页门面变成覆盖层。 */
  max-height: min(6.5rem, calc(100% - var(--nav-safe-height) - 1.5rem));
  overflow-y: auto;
  overscroll-behavior: contain;
  border-bottom: 1px solid color-mix(in srgb, var(--line) 78%, transparent);
  background: transparent;
  opacity: 0;
  transform: translateY(-4px);
  transition: opacity 0.18s ease, transform 0.18s ease;
  pointer-events: auto;
}
.celestial-status-reveal[hidden] { display: none; }
.celestial-status-reveal.is-open { opacity: 1; transform: translateY(0); }
.celestial-status-reveal:focus-visible { outline: 1px solid var(--line); outline-offset: 4px; }
.celestial-status-line { margin: 0; overflow-wrap: anywhere; line-height: 1.5; color: var(--text-dim); }
.celestial-status-action { color: inherit; }
.celestial-status-detail { margin: 0.2rem 0 0; overflow-wrap: anywhere; color: var(--text); font-family: var(--font-serif); line-height: 1.55; }
@media (max-width: 719px) {
  .celestial-status-reveal {
    width: min(14rem, calc(100vw - max(1.5rem, var(--safe-area-left)) - max(1.5rem, var(--safe-area-right))));
    /* 让长态确实能收入固定导航与站名首行之间；其余内容在笺内滚动。 */
    max-height: min(4.5rem, calc(100% - var(--nav-safe-height) - 1.5rem));
  }
  .celestial-status-line { font-size: max(1rem, var(--type-body)); }
}
@media (prefers-reduced-motion: reduce) {
  .celestial-status-reveal { transform: none; transition: opacity 0.18s ease; }
}

/* 新月：圆 + 内侧偏移圆相叠挖出月牙；亮度随 --moon-w */
.moon {
  position: absolute;
  width: 42px;
  height: 42px;
  border-radius: 50%;
  box-shadow: inset -9px 7px 0 0 rgba(211, 217, 228, 0.9);
  transform: translate(-50%, -50%) rotate(-18deg);
  opacity: calc(0.45 + var(--moon-w) * 0.45);
}
.moon-glow {
  position: absolute;
  width: var(--glow-moon);
  height: var(--glow-moon);
  border-radius: 50%;
  background: radial-gradient(closest-side, rgba(211, 217, 228, 0.9), transparent 72%);
  /* 对中 + 冷晕半径随权重放大（scale 绕自身中心，不破坏对中） */
  transform: translate(-50%, -50%) scale(calc(0.55 + var(--moon-w) * 0.55));
  animation: breathe-moon 90s ease-in-out infinite;
}
/* 沉日：主体沉于地平线之下，只余线上一道弧；随 --sun-lift 升沉、--sun-w 明暗。
   静息态（lift=0.6）弧心在地平线下 7px；升沉项作用于组内偏移，光晕同锚不同摆 */
.sun-arc {
  position: absolute;
  width: 46px;
  height: 46px;
  border-radius: 50%;
  border: 1px solid rgba(181, 151, 122, 0.85);
  border-bottom-color: transparent;
  opacity: calc(0.35 + var(--sun-w) * 0.5);
  transform: translate(-50%, -50%) translateY(calc(7px + (0.6 - var(--sun-lift)) * 35px));
}
.sun-glow {
  position: absolute;
  width: var(--glow-sun);
  height: var(--glow-sun);
  border-radius: 50%;
  background: radial-gradient(closest-side, rgba(181, 151, 122, 0.9), transparent 72%);
  transform: translate(-50%, -50%);
  animation: breathe-sun 90s ease-in-out infinite;
}

/* 窄屏锚点与光晕半径（6.3.1）：两档单独定义，不沿用宽屏百分比 */
@media (max-width: 719px) {
  .sky {
    --moon-x: 18%;
    --moon-y: calc(14% + 15px);
    --sun-x: 81%;
    --glow-moon: 150px;
    --glow-sun: 150px;
  }
  .moon { width: 30px; height: 30px; box-shadow: inset -7px 5px 0 0 rgba(211, 217, 228, 0.9); }
  .sun-arc { width: 34px; height: 34px; }
}
@media (max-width: 480px) {
  .sky {
    --moon-x: 21%; /* 320px 视口：21%×320=67px ≥ 冷晕权重峰值半径 66px，零裁切 */
    --sun-x: 79%;
    --glow-moon: 120px;
    --glow-sun: 120px;
  }
}
/* 呼吸：~90s 极缓透明度起伏，权重来自 --moon-w / --sun-w（DESIGN.md §4-3） */
/* v2.2 加幅：冷晕峰值 0.20→0.30、暖晕 0.17→0.26 */
@keyframes breathe-moon {
  0%, 100% { opacity: calc(var(--moon-w) * 0.20); }
  50% { opacity: calc(var(--moon-w) * 0.30); }
}
@keyframes breathe-sun {
  0%, 100% { opacity: calc(var(--sun-w) * 0.18); }
  50% { opacity: calc(var(--sun-w) * 0.26); }
}

/* 母题 f：hero 头像（DESIGN.md v2.4 §3f）——纸白底圆形，暗底上呈月盘。
   v3.13 隐晦分级：内容类可供性——光标示意（B 批将赋予公共功能，先行） */
.hero-avatar {
  cursor: pointer;
  display: block;
  width: 88px;
  height: 88px;
  border-radius: 50%;
  border: 1px solid var(--line);
  margin-bottom: 1.6rem;
  transition: border-color 0.3s;
}
.hero-avatar:hover { border-color: var(--moon); }

/* 母题 c（v2.5 反转）：主体朦胧、镜像清晰，hover 互换（DESIGN.md §3c / §4-6） */
.site-title {
  font-family: var(--font-serif);
  font-weight: 700; /* Cormorant Infant 与宋体粗体的标题笔画接近。 */
  font-size: clamp(3.4rem, 9vw, 8.2rem); /* v2.5：随视口适度放大 */
  line-height: 1.04;
  letter-spacing: 0.01em;
  /* 主体是幻影：轻度朦胧 + 柔和寒银辉光，保持可读可选中 */
  filter: blur(1.75px);
  text-shadow: 0 0 18px rgba(211, 217, 228, 0.28);
}
.waterline {
  height: 1px;
  background: rgba(211, 217, 228, 0.16); /* 水线：极细银色衔接 */
  margin: 0.15em 0 0;
}
.mirror {
  font-family: var(--font-serif);
  font-weight: 700;
  font-size: clamp(3.4rem, 9vw, 8.2rem);
  line-height: 1.04;
  letter-spacing: 0.01em;
  transform: scaleY(-1);
  /* 镜中才是实相：零 blur、高不透明度、约 0.65 字高，底部渐隐收束 */
  opacity: 0.85;
  height: 0.65em;
  overflow: hidden;
  -webkit-user-select: none; /* Safari ≤18.3 只认 -webkit- 前缀 */
  user-select: none;
  pointer-events: none;
  -webkit-mask-image: linear-gradient(to bottom, #000 0%, transparent 92%);
  mask-image: linear-gradient(to bottom, #000 0%, transparent 92%);
}
/* 悬停互换：主体渐清、镜像渐朦（0.6s 双向）；reduced-motion 静态"主朦镜清" */
@media (prefers-reduced-motion: no-preference) {
  .site-title, .mirror { transition: filter 0.6s ease, opacity 0.6s ease; }
  .mirror-set:hover .site-title { filter: blur(0); }
  .mirror-set:hover .mirror { filter: blur(2px); opacity: 0.55; }
}

.motto {
  margin-top: 2.2rem;
  font-family: var(--font-serif);
  color: var(--text-dim);
  font-size: 1.02rem;
  letter-spacing: 0.06em;
}

/* 母题 e：竖排「且易生」+ 生印（旧铜底） */
.vertical-motto {
  position: absolute;
  right: 1.5rem;
  top: 50%;
  transform: translateY(-50%);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1.1rem;
  z-index: 1;
}
.v-text {
  writing-mode: vertical-rl;
  font-family: var(--font-serif);
  font-size: 1.15rem;
  letter-spacing: 0.55em;
  color: var(--text-dim);
}
/* 生印动静提醒（§3e v3.23）：印即凭证——有未读时微光呼吸（~4s，借天体 90s 呼吸语言、
   更轻更慢；动效白名单增补）；红线无红点角标数字；访客态零变化（类仅解锁态由 JS 加） */
@keyframes seal-breathe {
  0%, 100% { box-shadow: 0 0 0 0 rgba(181, 151, 122, 0); }
  50% { box-shadow: 0 0 10px 2px rgba(181, 151, 122, 0.4); }
}
/* v3.23R：解锁态生印永远可点（seal-awake，光标即全部可供性）；呼吸（seal-alive）只表示「有新」 */
.seal.seal-awake { cursor: pointer; }
.seal.seal-alive { animation: seal-breathe 4s ease-in-out infinite; }
html.day .seal.seal-alive { animation-name: seal-breathe-day; }
@keyframes seal-breathe-day {
  0%, 100% { box-shadow: 0 0 0 0 rgba(122, 92, 61, 0); }
  50% { box-shadow: 0 0 10px 2px rgba(122, 92, 61, 0.42); }
}
@media (prefers-reduced-motion: reduce) { /* 降级：静态微亮不起伏 */
  .seal.seal-alive { animation: none; box-shadow: 0 0 8px 1.5px rgba(181, 151, 122, 0.35); }
  html.day .seal.seal-alive { box-shadow: 0 0 8px 1.5px rgba(122, 92, 61, 0.38); }
}
/* 清单笺：气泡卡语言；桌面自生印向左浮（.vertical-motto 绝对定位即锚），倒序清单 */
.seal-pings {
  position: absolute;
  right: calc(100% + 0.6rem); top: 50%; transform: translateY(-50%);
  width: min(19rem, 78vw);
  background: color-mix(in srgb, var(--surface) 88%, transparent);
  -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
  border: 1px solid var(--line); border-radius: 12px;
  padding: 0.5rem 0.65rem;
  display: flex; flex-direction: column; gap: 0.35rem;
  z-index: 5;
}
.ping-row {
  font-size: 0.72rem; color: var(--text); text-decoration: none;
  display: flex; align-items: baseline; gap: 0.5rem; /* v3.24：正文省略、短时右靠不被吃掉 */
}
.ping-row .pr-text { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ping-row .pr-time { flex: 0 0 auto; font-size: 0.6rem; color: var(--text-dim); }
.ping-row:hover, .ping-row:focus-visible { color: var(--moon); outline: none; }
.ping-empty { color: var(--text-dim); } /* 空日志一行「近来无事。」（v3.23R） */
.ping-divider { /* 新旧之间极淡 hairline +「上次看到这里」（v3.23R：水位的第二职责） */
  display: flex; align-items: center; gap: 0.5rem;
  font-size: 0.6rem; color: var(--text-dim); opacity: 0.75;
}
.ping-divider::before, .ping-divider::after { content: ""; flex: 1; border-top: 1px solid var(--line); }
@media (max-width: 719px) { /* 移动横排小签：同印同享；笺向上浮出，视口钳制零溢出。
   锚点（position:relative）设在文件后段既有移动块上——此处再写会被其压死（评审修 HIGH） */
  .seal-pings { right: auto; left: 0; top: auto; bottom: calc(100% + 0.5rem); transform: none; max-width: calc(100vw - 2.5rem); }
}

.seal {
  width: 28px;
  height: 28px;
  border-radius: 2px;
  background: var(--sun);
  color: var(--bg);
  font-family: var(--font-serif);
  font-size: 1rem;
  font-weight: 600;
  display: grid;
  place-items: center;
  line-height: 1;
}

/* 母题 a：地平线（日月分野 / 明度分界）—— 左寒银右旧铜，均衡交汇点约 58% */
.horizon {
  height: 1px;
  background: linear-gradient(90deg,
    transparent 0%,
    rgba(211, 217, 228, 0.9) 26%,
    rgba(211, 217, 228, 0.15) 57%,
    rgba(181, 151, 122, 0.15) 59%,
    rgba(181, 151, 122, 0.85) 82%,
    transparent 100%);
}
/* hero 侧地平线：双色明度随权重向所悬停一极偏移（v2.2，DESIGN.md §3b） */
.horizon--sky { position: relative; background: none; }
.horizon--sky::before,
.horizon--sky::after {
  content: "";
  position: absolute;
  inset: 0;
}
/* 两端像素制透明引道（§3a v3.11）：两极栖词无论视口宽窄都真正落在
   透明区、不压线体（百分比停靠在窄屏会穿词——评审项） */
.horizon--sky::before {
  background: linear-gradient(90deg,
    transparent 0, transparent calc(var(--band-pad) + 2.8rem),
    rgba(211, 217, 228, 0.9) 26%, rgba(211, 217, 228, 0.12) 58%, transparent 62%);
  opacity: calc(0.3 + var(--moon-w) * 0.35);
}
.horizon--sky::after {
  background: linear-gradient(90deg,
    transparent 54%, rgba(181, 151, 122, 0.12) 58%, rgba(181, 151, 122, 0.85) 82%,
    transparent calc(100% - var(--band-pad) - 2.8rem), transparent 100%);
  opacity: calc(0.3 + var(--sun-w) * 0.35);
}

/* ---- 地平线两极栖词（DESIGN §3a v3.11）：摘抄居月侧（左）、笔记居日侧（右）。
   词恰落在渐变两端透明区，不压线体；hover 各随其极亮起 ≤0.3s（白名单 1）。 ---- */
.horizon-pole {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 2; /* hero 内容层为 1：不抬则词的上半可点区被其截胡（评审 high 项） */
  font-size: 0.72rem;
  line-height: 1;
  color: var(--text-dim);
  padding: 0.45rem 0.5rem; /* 扩大可点区，不改变视觉尺寸 */
  transition: color 0.3s;
}
.horizon-pole--moon { left: calc(var(--band-pad) - 0.5rem); }
.horizon-pole--sun { right: calc(var(--band-pad) - 0.5rem); }
.horizon-pole--moon:hover { color: var(--moon); }
.horizon-pole--sun:hover { color: var(--sun); }

/* ---- 主页双拣选区。虚张声势是小幅编辑活页；下方单图区仍是图片卡。
   二者只共享原生横轨的吸附骨架，不共享卡面与交互语义。 ---- */
.box-zone { display: none; }
.box-zone:not([hidden]):not(.is-empty) {
  display: block;
  max-width: var(--content);
  margin: 3.2rem auto 0;
  padding: 0 1.5rem;
}
.box-frame {
  position: relative;
  border: 1px solid var(--line);
  border-radius: 4px;
  padding: 1.3rem 0 1rem;
  overflow: hidden;
  text-align: center;
}
.box-label {
  position: relative;
  isolation: isolate;
  display: inline-grid;
  place-items: center;
  font-family: var(--font-serif);
  font-size: clamp(1.72rem, 4vw, 2.15rem);
  font-weight: 600;
  font-kerning: normal;
  line-height: 1;
  color: var(--text);
  letter-spacing: 0;
  text-indent: 0;
  padding: 0.24rem 0.58rem 0.58rem;
  margin: 0 1.3rem 0.92rem;
}
.box-label::before {
  content: "";
  position: absolute;
  z-index: 0;
  top: 52%;
  left: 50%;
  width: min(24rem, calc(100vw - 5rem));
  height: 1px;
  transform: translate(-50%, -50%) rotate(-1.2deg);
  transform-origin: center;
  background: linear-gradient(90deg,
    transparent,
    color-mix(in srgb, var(--moon) 68%, transparent) 24%,
    var(--line) 48%, var(--line) 52%,
    color-mix(in srgb, var(--sun) 72%, transparent) 76%,
    transparent);
}
.box-label-word {
  position: relative;
  z-index: 1;
  display: inline-grid;
  grid-template-columns: repeat(4, 1em);
  place-items: center;
  column-gap: 0.08em;
}
.box-label-char {
  position: relative;
  display: grid;
  width: 1em;
  min-height: 1.08em;
  place-items: center;
}
.box-label-char--void {
  color: color-mix(in srgb, var(--moon) 76%, var(--text));
  font-weight: 600;
}
@supports (-webkit-text-stroke: 1px black) {
  .box-label-char--void {
    color: transparent;
    -webkit-text-stroke: max(1px, 0.035em) var(--moon);
    text-shadow: 0 0 0.55em color-mix(in srgb, var(--moon) 18%, transparent);
  }
}
.box-label-char--stretch {
  color: var(--text);
  font-weight: 700;
  transform: translateY(-0.1em) scaleX(1.18);
  transform-origin: center;
}
.box-label-char--echo {
  isolation: isolate;
  color: var(--text);
  font-family: var(--font-sans);
  font-weight: 500;
  transform: translateY(0.035em);
}
.box-label-char--echo::after {
  content: attr(data-glyph);
  position: absolute;
  inset: 0;
  z-index: -1;
  display: grid;
  place-items: center;
  color: transparent;
  opacity: 0.5;
  transform: translate(0.1em, 0.1em);
  -webkit-text-stroke: max(1px, 0.028em) var(--sun);
}
.box-label-char--force {
  width: 1em;
  min-height: 1.04em;
  color: var(--bg);
  background: var(--sun);
  font-weight: 700;
  transform: translate(0.045em, 0.09em) rotate(2deg);
  box-shadow: 0.07em 0.07em 0 color-mix(in srgb, var(--moon) 18%, transparent);
}
@media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) {
  .box-label-char--stretch,
  .box-label-char--echo::after,
  .box-label-char--force { transition: transform 0.32s ease; }
  .box-frame:hover .box-label-char--stretch { transform: translateY(-0.1em) scaleX(1.24); }
  .box-frame:hover .box-label-char--echo::after { transform: translate(0.14em, 0.1em); }
  .box-frame:hover .box-label-char--force { transform: translate(0.045em, 0.09em) rotate(-1deg); }
}
@media (prefers-reduced-motion: reduce) {
  .box-label-char--stretch,
  .box-label-char--echo::after,
  .box-label-char--force { transition: none; }
}
@media (forced-colors: active) {
  .box-label::before { background: CanvasText; }
  .box-label-char { color: CanvasText; background: Canvas; box-shadow: none; -webkit-text-stroke: 0; text-shadow: none; }
  .box-label-char--echo::after { content: none; }
  .box-label-char--force { border: 1px solid CanvasText; }
}
.box-list { display: flex; flex-direction: column; gap: 0.75rem; text-align: left; }
.showcase-stage { position: relative; min-width: 0; }
.showcase-stage--box { --step-gutter: clamp(4.75rem, 16vw, 7.5rem); }
.showcase-stage--life-tree { --step-gutter: clamp(2rem, 8vw, 4rem); }
.showcase-step { display: none; }
.box-rail {
  /* 宽屏把活页收回约 470px；窄屏另以原有小露角覆盖，保留用户认可的滑感。 */
  --showcase-peek: clamp(4.75rem, 16vw, 7.5rem);
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: 100%;
  gap: 0.7rem;
  overflow-x: auto;
  overscroll-behavior-inline: contain;
  scroll-snap-type: x mandatory;
  scroll-padding-inline: var(--showcase-peek);
  scrollbar-width: none;
  padding: 0 var(--showcase-peek) 0.2rem;
  -webkit-overflow-scrolling: touch;
}
.box-rail::-webkit-scrollbar { display: none; width: 0; height: 0; }
.box-rail:focus-visible,
.life-tree-rail:focus-visible {
  outline: 1px solid color-mix(in srgb, var(--moon) 52%, var(--line));
  outline-offset: -1px;
}
.box-card {
  --box-accent: color-mix(in srgb, var(--moon) 58%, transparent);
  position: relative;
  display: grid;
  height: 11rem;
  min-height: 0;
  min-width: 0;
  overflow: hidden;
  scroll-snap-align: center;
  scroll-snap-stop: always;
  background: color-mix(in srgb, var(--surface) 15%, transparent);
  box-shadow: inset 0 1px var(--line), inset 0 -1px var(--line);
}
.box-card.is-reverse { --box-accent: color-mix(in srgb, var(--sun) 62%, transparent); }
.box-card::before {
  content: "";
  position: absolute;
  z-index: 2;
  top: 0.75rem;
  left: 0;
  width: 1px;
  height: 2.25rem;
  background: var(--box-accent);
}
.box-card.is-reverse::before { right: 0; left: auto; }
.box-card.is-text { grid-template-columns: 1fr; }
.box-card.is-mixed {
  grid-template-columns: minmax(0, 42%) minmax(0, 58%);
  grid-template-rows: minmax(0, 1fr);
  min-height: 0;
}
.box-card.is-image { grid-template-rows: minmax(0, 1fr) auto; min-height: 0; }
.box-card-media {
  position: relative;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  grid-template-rows: minmax(0, 1fr);
  gap: 0.35rem;
  min-height: 0;
  overflow: hidden;
  padding: 0.55rem 0.65rem 0;
  background: transparent;
}
.box-card-media[data-count="1"] { grid-template-columns: 1fr; }
.box-card-media[data-count="3"] { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.box-card.is-mixed .box-card-media {
  grid-column: 1;
  grid-row: 1;
  padding: 0.65rem 0 0.65rem 0.7rem;
}
.box-card.is-mixed.is-reverse .box-card-media {
  grid-column: 2;
  padding: 0.65rem 0.7rem 0.65rem 0;
}
.showcase-media {
  position: relative;
  display: block;
  overflow: hidden;
  border: 1px solid var(--line);
  background: var(--surface);
  isolation: isolate;
}
.box-card.is-image .box-card-frame,
.box-card.is-mixed .box-card-frame { height: 100%; min-height: 0; }
.box-card-frame .showcase-image { position: absolute; inset: 0; }
.showcase-loading {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  padding: 1rem;
  color: var(--text-dim);
  font-size: 0.7rem;
}
.showcase-image {
  position: relative;
  z-index: 1;
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  opacity: 0;
  transition: opacity 0.3s;
}
.showcase-media.is-loaded .showcase-image { opacity: 1; }
.showcase-media.is-loaded .showcase-loading { visibility: hidden; }
.showcase-media.is-error .showcase-image { display: none; }
.box-card-count {
  position: absolute;
  z-index: 2;
  right: 0.55rem;
  bottom: 0.5rem;
  display: grid;
  place-items: center;
  min-width: 1.75rem;
  height: 1.75rem;
  padding: 0 0.45rem;
  border: 1px solid color-mix(in srgb, var(--text) 28%, transparent);
  border-radius: 999px;
  background: color-mix(in srgb, var(--bg) 76%, transparent);
  color: var(--text);
  font-size: 0.68rem;
  backdrop-filter: blur(6px);
}
.box-card-copy {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  gap: 0.75rem;
  min-width: 0;
  padding: 0.95rem 1rem 0.55rem;
}
.box-card.is-text .box-card-copy { height: 100%; min-height: 0; padding: 1rem 1.15rem 0.45rem; }
.box-card.is-mixed .box-card-copy { grid-column: 2; grid-row: 1; }
.box-card.is-mixed.is-reverse .box-card-copy { grid-column: 1; }
.box-card.is-image .box-card-copy { padding: 0.15rem 0.75rem 0.15rem; }
.box-card-text {
  min-width: 0;
  overflow: hidden;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
  font-family: var(--font-serif);
  font-size: 1.02rem;
  line-height: 1.65;
}
.box-card-foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.6rem;
  min-width: 0;
}
.box-card-meta {
  display: flex;
  min-width: 0;
  gap: 0.65rem;
  color: var(--text-dim);
  font-size: 0.68rem;
}
.box-card-categories {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.box-card-entry {
  flex: none;
  display: inline-grid;
  width: 44px;
  height: 44px;
  place-items: center;
  color: var(--text-dim);
  font-size: 0.82rem;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transform: translateX(-2px);
  transition: color 0.3s, opacity 0.25s, transform 0.2s ease;
}
.box-card.is-current .box-card-entry { opacity: 1; visibility: visible; pointer-events: auto; transform: none; }
.box-card-entry:hover { color: var(--box-accent); transform: translateX(2px); }
.box-card-entry:focus-visible {
  color: var(--box-accent);
  outline: 1px solid var(--box-accent);
  outline-offset: -5px;
}
.box-switch { display: flex; align-items: center; justify-content: center; gap: 0; }
.box-dot {
  position: relative;
  width: 44px; height: 44px; padding: 0;
  border: 0; border-radius: 50%;
  background: transparent; cursor: pointer;
}
.box-dot::before {
  content: ""; position: absolute; left: 50%; top: 50%; width: 12px; height: 12px;
  border: 1.5px solid var(--text-dim); border-radius: 50%; background: transparent;
  transform: translate(-50%, -50%);
  transition: background 0.3s, border-color 0.3s, transform 0.2s ease;
}
.box-dot:hover::before { border-color: var(--text); transform: translate(-50%, -50%) scale(1.35); }
.box-dot.is-on::before { background: var(--moon); border-color: var(--moon); }
.box-dot:focus-visible { outline: 1px solid var(--moon); outline-offset: 3px; }
@media (prefers-reduced-motion: reduce) {
  .showcase-image, .box-card-entry, .life-tree-item, .showcase-step { transition: none; }
  .box-dot::before { transition: background 0.3s, border-color 0.3s; }
  .box-dot:hover::before { transform: translate(-50%, -50%); }
  .box-card-entry:hover { transform: none; }
}

.life-tree-zone { display: none; }
.life-tree-zone:not([hidden]):not(.is-empty) {
  display: block;
  max-width: var(--content);
  margin: 0 auto;
  padding: 1.5rem 1.5rem 2.3rem;
}
.life-tree-label {
  --life-root: #78A08E;
  --life-trunk: #A6D2B8;
  --life-crown: #7FBF9E;
  --life-glow: rgba(91, 171, 128, 0.18);
  --life-vein: rgba(166, 210, 184, 0.28);
  position: relative;
  isolation: isolate;
  max-width: 24em;
  margin: 0 auto 1.45rem;
  color: var(--text);
  font-family: var(--font-serif);
  font-size: clamp(1.24rem, 3.2vw, 1.7rem);
  font-weight: 500;
  line-height: 1.2;
  text-align: center;
}
html.day .life-tree-label {
  --life-root: #48695C;
  --life-trunk: #275A49;
  --life-crown: #36735A;
  --life-glow: rgba(54, 115, 90, 0.13);
  --life-vein: rgba(39, 90, 73, 0.2);
}
.life-tree-title-word {
  position: relative;
  isolation: isolate;
  display: inline-flex;
  align-items: center;
  gap: 0.07em;
  padding: 0.42em 0.66em 0.52em;
  white-space: nowrap;
}
.life-tree-title-part {
  position: relative;
  z-index: 1;
  display: inline-block;
  text-shadow: 0 0 0.72em var(--life-glow);
}
.life-tree-title-part--root {
  color: var(--life-root);
  font-size: 0.9em;
  font-weight: 500;
  letter-spacing: 0.1em;
  transform: translateY(0.07em);
}
.life-tree-title-part--trunk {
  color: var(--life-trunk);
  font-size: 1.12em;
  font-weight: 600;
  line-height: 0.96;
  transform: translateY(-0.025em);
}
.life-tree-title-part--trunk::before {
  content: "";
  position: absolute;
  z-index: -1;
  top: 58%;
  bottom: -0.46em;
  left: 50%;
  width: 0.42em;
  border-radius: 50%;
  background: linear-gradient(180deg, var(--life-vein), transparent);
  filter: blur(2.5px);
  transform: translateX(-50%) rotate(1deg);
}
.life-tree-title-part--crown {
  color: var(--life-crown);
  font-size: 0.98em;
  font-weight: 500;
  letter-spacing: 0.14em;
  transform: translateY(-0.08em);
}
.life-tree-title-part--crown::after {
  content: "";
  position: absolute;
  z-index: -1;
  top: -0.08em;
  right: -0.02em;
  width: 0.32em;
  height: 0.17em;
  border-radius: 78% 22% 72% 28%;
  background: color-mix(in srgb, var(--life-crown) 72%, transparent);
  opacity: 0.78;
  transform: rotate(-24deg);
  transform-origin: left bottom;
}
@media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) {
  .life-tree-title-part--crown,
  .life-tree-title-part--crown::after { transition: opacity 0.28s ease-out, transform 0.28s ease-out; }
  .life-tree-label:hover .life-tree-title-part--crown { transform: translateY(-0.11em); }
  .life-tree-label:hover .life-tree-title-part--crown::after { transform: rotate(-14deg) scale(1.04); }
}
@media (prefers-reduced-motion: reduce) {
  .life-tree-title-part--crown,
  .life-tree-title-part--crown::after { transition: none; }
}
@media (forced-colors: active) {
  .life-tree-title-part--trunk::before,
  .life-tree-title-part--crown::after { content: none; }
  .life-tree-title-part { color: CanvasText; text-shadow: none; transform: none; }
}
.life-tree-list { overflow: hidden; }
.life-tree-rail {
  --showcase-peek: clamp(2rem, 8vw, 4rem);
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: 100%;
  gap: 0.7rem;
  overflow-x: auto;
  overscroll-behavior-inline: contain;
  scroll-snap-type: x mandatory;
  scroll-padding-inline: var(--showcase-peek);
  scrollbar-width: none;
  padding: 0 var(--showcase-peek) 0.2rem;
  align-items: start;
  -webkit-overflow-scrolling: touch;
}
.life-tree-rail::-webkit-scrollbar { display: none; width: 0; height: 0; }
.life-tree-item {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  grid-template-rows: max-content max-content;
  align-self: start;
  align-content: start;
  width: 100%;
  height: max-content;
  min-width: 0;
  overflow: hidden;
  scroll-snap-align: center;
  scroll-snap-stop: always;
  border: 1px solid var(--line);
  border-radius: 5px;
  background: color-mix(in srgb, var(--surface) 42%, transparent);
  transition: border-color 0.3s, background 0.3s;
}
.life-tree-item:hover,
.life-tree-item:focus-visible {
  border-color: color-mix(in srgb, var(--moon) 55%, var(--line));
  background: color-mix(in srgb, var(--surface) 62%, transparent);
  outline: none;
}
.life-tree-frame {
  position: relative;
  width: 100%;
  max-width: 100%;
  min-width: 0;
  min-height: 0;
  aspect-ratio: 4 / 3;
}
.life-tree-frame .showcase-image { position: absolute; inset: 0; }
.life-tree-origin {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  min-width: 0;
  max-width: 100%;
  height: 3.125rem;
  min-height: 0;
  padding: 0.72rem 0.85rem 0.75rem;
  border-top: 1px solid var(--line);
}
.life-tree-source {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-family: var(--font-serif);
  font-size: 0.86rem;
}
.life-tree-meta { display: flex; flex: none; align-items: center; gap: 0.65rem; margin-left: auto; color: var(--text-dim); font-size: 0.67rem; }
.life-tree-arrow { color: var(--moon); transition: transform 0.3s; }
.life-tree-item:hover .life-tree-arrow { transform: translateX(2px); }

@media (min-width: 720px) {
  .showcase-step {
    position: absolute;
    z-index: 4;
    top: 50%;
    display: grid;
    width: 44px;
    height: 44px;
    padding: 0;
    place-items: center;
    transform: translateY(-50%);
    border: 0;
    border-radius: 2px;
    background: color-mix(in srgb, var(--bg) 76%, transparent);
    box-shadow: inset 0 1px var(--line), inset 0 -1px var(--line);
    color: var(--text-dim);
    font-size: 1.25rem;
    line-height: 1;
    opacity: 0.62;
    cursor: pointer;
    transition: color 0.25s, opacity 0.25s, background 0.25s;
  }
  .showcase-step--previous { left: max(0.2rem, calc((var(--step-gutter) - 44px) / 2)); }
  .showcase-step--next { right: max(0.2rem, calc((var(--step-gutter) - 44px) / 2)); }
  .showcase-step:hover:not(:disabled) {
    color: var(--moon);
    opacity: 1;
    background: color-mix(in srgb, var(--surface) 38%, transparent);
  }
  .showcase-step:focus-visible {
    color: var(--moon);
    opacity: 1;
    outline: 1px solid var(--moon);
    outline-offset: -5px;
  }
  .showcase-step:disabled {
    box-shadow: none;
    opacity: 0.14;
    cursor: default;
  }
}

/* ---- 流视图（DESIGN §5-09.2：笔记/摘抄独立账本）。
   复合选择器：裸 .stream-title 会被源序靠后的 .section-title 压过（评审项） ---- */
.section-title.stream-title { margin-bottom: 1.6rem; }

/* ---- 摘抄出处（§5-09.4：文末右对齐，dim serif，比照传统引文排版）---- */
.view-source {
  text-align: right;
  font-family: var(--font-serif);
  font-size: 0.9rem;
  color: var(--text-dim);
  margin: 1.2rem 0 0.3rem;
}

/* ---- 编辑器 kind 选择（§5-09.6：三枚 mono 字按钮，radio 语义）---- */
.editor-kind-row { display: flex; gap: 0.5rem; }
.kind-btn {
  background: none;
  border: 1px solid transparent;
  border-radius: 3px;
  padding: 0.15rem 0.6rem;
  font-size: 0.78rem;
  color: var(--text-dim);
  cursor: pointer;
  transition: color 0.3s, border-color 0.3s;
}
.kind-btn:hover:not(:disabled) { color: var(--text); }
.kind-btn.is-on { color: var(--moon); border-color: var(--line); }
/* 忆界锁（§5-13.1 v3.32，评审修）：编辑态跨忆界的 kind 钮可辨——降明度、去手型 */
.kind-btn:disabled { opacity: 0.35; cursor: default; }

/* ---- 区块 ---- */
.section {
  max-width: var(--content);
  margin: 0 auto;
  padding: 5.5rem 1.5rem 4.5rem;
}

/* ---- 统一发布案头（v3.104）：主页只保留一枚发布入口，先按知识域分流。
   这是独立次级页面，不是覆盖层；账本两行只负责导航，文章形态仍由原编辑器裁决。 ---- */
body.publish-surface-open .moon-mark,
body.publish-surface-open .fan { display: none !important; }
body.publish-surface-open #nav-publish { display: none !important; }

/* 选择页与两个最终案头共用同一安全起笔线。仅给 .publish-index 补 safe-area
   会在进入编辑器、该节点被替换后重新让题头钻进固定导航。 */
body.publish-surface-open #article-view {
  padding-top: calc(5.5rem + var(--safe-area-top));
  padding-right: max(1.5rem, var(--safe-area-right));
  padding-left: max(1.5rem, var(--safe-area-left));
}

.publish-index {
  width: min(100%, 42rem);
  margin-inline: auto;
  padding-block: clamp(1rem, 4vh, 3rem);
  padding-top: max(clamp(1rem, 4vh, 3rem), env(safe-area-inset-top));
}
.publish-index-head {
  padding-bottom: 1.5rem;
  border-bottom: 1px solid var(--line);
}
.publish-index-title {
  margin: 0;
  font-family: var(--font-serif);
  font-size: clamp(1.7rem, 3vw, 2.25rem);
  font-weight: 500;
  line-height: 1.25;
}
.publish-index-title:focus { outline: none; }
.publish-index-intro {
  margin: 0.75rem 0 0;
  color: var(--text-dim);
  font-size: 0.75rem;
  line-height: 1.7;
}
.publish-index-nav { width: 100%; }
.publish-index-list {
  margin: 0;
  padding: 0;
  list-style: none;
}
.publish-index-item { margin: 0; }
.publish-choice {
  display: grid;
  grid-template-columns: minmax(6.5rem, 0.32fr) minmax(0, 1fr) auto;
  align-items: center;
  gap: 1rem 1.5rem;
  min-width: 0;
  min-height: 4.75rem;
  padding: 1.2rem 0.15rem;
  border-bottom: 1px solid var(--line);
  color: var(--text);
  text-decoration: none;
  transition: color 0.22s ease, border-color 0.22s ease;
}
.publish-choice-name {
  min-width: 0;
  font-family: var(--font-serif);
  font-size: 1.15rem;
  line-height: 1.35;
}
.publish-choice-name--ai {
  display: inline-flex;
  align-items: baseline;
  gap: 0.45rem;
}
.publish-choice-human { color: var(--sun); }
.publish-choice-assistant { color: var(--moon); }
.publish-choice-arrow { color: var(--text-dim); font-size: 0.86rem; }
.publish-choice-description {
  min-width: 0;
  color: var(--text-dim);
  font-size: 0.75rem;
  line-height: 1.65;
  overflow-wrap: anywhere;
}
.publish-choice-enter {
  color: var(--text-dim);
  font-size: 0.75rem;
  letter-spacing: 0.08em;
}
.publish-choice:focus-visible {
  border-bottom-color: var(--moon);
  color: var(--moon);
  outline: 2px solid var(--moon);
  outline-offset: 3px;
}
.publish-index--loading,
.publish-index--failure { min-height: 16rem; }
.publish-index--loading > .state-line,
.publish-index--failure > .state-line { margin-top: 2rem; }
.publish-failure-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem 1.25rem;
  margin-top: 2rem;
}
.publish-failure-action {
  min-height: 2.75rem;
  padding: 0;
  border: 0;
  border-bottom: 1px solid var(--line);
  background: transparent;
  color: var(--text-dim);
  font-size: 0.75rem;
  line-height: 2.75rem;
  text-decoration: none;
  cursor: pointer;
}
.publish-failure-action:hover {
  border-bottom-color: var(--moon);
  color: var(--moon);
}
.publish-failure-action:focus-visible {
  border-bottom-color: var(--moon);
  color: var(--moon);
  outline: 2px solid var(--moon);
  outline-offset: 3px;
}
.status-composer {
  width: min(100%, 38rem);
  margin-inline: auto;
  padding-block: clamp(1rem, 4vh, 3rem);
}
.status-composer-title {
  margin: 0;
  padding-bottom: 1.1rem;
  border-bottom: 1px solid var(--line);
  font-family: var(--font-serif);
  font-size: clamp(1.7rem, 3vw, 2.25rem);
  font-weight: 500;
  line-height: 1.25;
}
.status-composer-title:focus { outline: none; }
.status-composer-preview {
  min-height: 4.75rem;
  margin-top: 1.8rem;
  padding-bottom: 0.75rem;
  border-bottom: 1px solid var(--line);
}
.status-composer-preview .celestial-status-line { font-size: 0.82rem; }
.status-composer-preview .celestial-status-detail { font-size: clamp(1rem, 2.4vw, 1.18rem); }
.status-composer-form { display: grid; gap: 0.65rem; margin-top: 2rem; }
.status-composer-label {
  margin-top: 0.55rem;
  color: var(--text-dim);
  font-family: var(--font-meta);
  font-weight: var(--font-meta-weight);
  font-size: 0.75rem;
  letter-spacing: 0.04em;
}
.status-composer-input {
  box-sizing: border-box;
  width: 100%;
  min-width: 0;
  border: 0;
  border-bottom: 1px solid var(--line);
  border-radius: 0;
  background: transparent;
  color: var(--text);
  font: inherit;
  font-size: max(1rem, var(--type-body));
  line-height: 1.65;
  outline: none;
  resize: none;
}
.status-composer-input:focus { border-bottom-color: var(--moon); }
.status-composer-actions { display: flex; justify-content: flex-end; gap: 1.25rem; margin-top: 1.5rem; }
.status-composer-actions button {
  min-height: 2.75rem;
  padding: 0;
  border: 0;
  border-bottom: 1px solid var(--line);
  background: transparent;
  color: var(--text-dim);
  cursor: pointer;
}
.status-composer-actions button:hover:not(:disabled) { color: var(--moon); border-bottom-color: var(--moon); }
.status-composer-actions button:focus-visible { outline: 2px solid var(--moon); outline-offset: 3px; }
.status-composer-actions button:disabled { cursor: default; opacity: 0.45; }
@media (hover: hover) and (pointer: fine) {
  .publish-choice:hover { border-bottom-color: var(--moon); color: var(--moon); }
}
@media (max-width: 520px) {
  .publish-index {
    padding-block: 0.35rem 2rem;
    padding-top: max(0.35rem, env(safe-area-inset-top));
  }
  .publish-choice {
    grid-template-columns: minmax(0, 1fr) auto;
    gap: 0.35rem 0.8rem;
    min-height: 4.5rem;
    padding-block: 1rem;
  }
  .publish-choice-description { grid-column: 1 / -1; grid-row: 2; }
  .publish-choice-enter { grid-column: 2; grid-row: 1; }
}
@media (max-width: 719px) {
  body.publish-surface-open #article-view {
    padding-top: calc(4rem + var(--safe-area-top));
    padding-right: max(1.25rem, var(--safe-area-right));
    padding-left: max(1.25rem, var(--safe-area-left));
  }
}
@media (prefers-reduced-motion: reduce) {
  .publish-choice { transition: none; }
}
@media (forced-colors: active) {
  .publish-choice:focus-visible { border-color: Highlight; color: Highlight; outline-color: Highlight; }
  .publish-failure-action:focus-visible { border-color: Highlight; color: Highlight; outline-color: Highlight; }
  .publish-choice-human,
  .publish-choice-assistant { color: CanvasText; }
}
.section-title {
  font-family: var(--font-serif);
  font-weight: 600;
  font-size: 1.35rem;
  letter-spacing: 0.12em;
  margin-bottom: 2.4rem;
}

/* 母题 d：爻线 —— 阴爻即月，阳爻即日。
   display 拆出并加 :not([hidden])：作者层 display:flex 会压过 UA 的
   [hidden]{display:none}，独立视图的 listChrome 隐藏集才能真正隐掉爻线
   （本库同坑第四修——v2.7 两处、Phase 15 编辑器、此处基类，评审确认项） */
.yao {
  align-items: center;
  justify-content: center;
  gap: 18px;
  padding: 0.4rem 0;
}
.yao:not([hidden]) { display: flex; }
/* Box 随行爻线（§5-09.2）：默认藏（(0,2,0) 平权靠后赢基类）、
   非空且未被视图隐藏才现（(0,3,0) 赢一切）——三态枚举实测为准 */
.yao.yao--box,
.yao.yao--life-tree { display: none; }
.yao--box:not([hidden]):not(.is-empty),
.yao--life-tree:not([hidden]):not(.is-empty) { display: flex; }
.yao .yin { display: flex; gap: 6px; transition: gap 0.3s; }
.yao .yin i,
.yao .yang {
  display: block;
  height: 1px;
  transition: background 0.3s, opacity 0.3s;
}
.yao .yin i { width: 14px; background: var(--text-dim); opacity: 0.65; }
.yao .yang { width: 28px; background: var(--sun); opacity: 0.55; } /* 阳爻常态微含旧铜 */
.yao:hover .yin { gap: 0; }
.yao:hover .yin i { background: var(--moon); opacity: 1; } /* 月满则易 */

/* ---- 分类栏：桌面平铺；移动端由下方 v3.60 目录规则接管 ---- */
.cat-bar {
  margin-bottom: 1.8rem;
  scroll-margin-top: 6rem;
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  column-gap: 1rem;
  align-items: start;
}
.cat-options--desktop {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem 1.4rem;
}
.cat-drawer { display: none; }
.archive-entry { display: inline-flex; align-items: center; padding: 0.3rem 0; color: var(--text-dim); text-decoration: none; }
.archive-entry:hover, .archive-entry:focus-visible { color: var(--moon); }
.archive-view { max-width: 760px; margin: 0 auto; font-family: var(--font-serif); }
.archive-controls { border-block: 1px solid var(--line); margin-top: 1.8rem; padding-block: 0.7rem; }
.archive-kinds, .archive-years, .archive-months, .archive-tags { display: flex; flex-wrap: wrap; gap: 0.25rem 1.2rem; }
.archive-filter { display: inline-flex; align-items: center; max-width: 100%; min-height: 2.4rem; color: var(--text-dim); text-decoration: none; overflow-wrap: anywhere; }
.archive-filter[aria-current="true"] { color: var(--text); text-decoration: underline; text-underline-offset: 0.35rem; }
.archive-dates, .archive-topics { padding-block: 0.3rem; }
.archive-date-summary, .archive-topic-summary { min-height: 2.4rem; cursor: pointer; overflow-wrap: anywhere; }
.archive-years, .archive-tags { padding-bottom: 0.6rem; }
.archive-count { color: var(--text-dim); font-size: 0.8rem; margin: 1.2rem 0; }
.archive-group { margin-block: 1.7rem; }
.archive-month-title { font-size: 0.95rem; font-weight: 550; }
.archive-row { display: grid; grid-template-columns: 7.5rem minmax(0, 1fr); gap: 1.3rem; padding-block: 0.95rem; border-bottom: 1px solid var(--line); color: var(--text); text-decoration: none; }
.archive-row-date { font-size: 0.78rem; color: var(--text-dim); }
.archive-row-title { font-size: 1.05rem; line-height: 1.55; overflow-wrap: anywhere; }
.archive-row:hover .archive-row-title { color: var(--moon); }
@media (max-width: 719px) {
  .archive-entry { min-height: 48px; padding-block: 0; }
  .archive-row { grid-template-columns: 5.1rem minmax(0, 1fr); gap: 0.8rem; }
  .archive-filter, .archive-date-summary, .archive-topic-summary { min-height: 44px; }
  .archive-kinds, .archive-years, .archive-months, .archive-tags { gap: 0.125rem 1rem; }
}
.cat-item {
  background: none;
  border: none;
  padding: 0 0 2px;
  font-family: var(--font-meta);
  font-weight: var(--font-meta-weight);
  font-size: 0.8rem;
  color: var(--text-dim);
  cursor: pointer;
  border-bottom: 1px solid transparent;
  transition: color 0.3s, border-color 0.3s;
}
.cat-item:hover { color: var(--moon); }
.cat-item.is-selected { color: var(--moon); border-bottom-color: var(--moon); }

/* ---- 内嵌媒体与下载链接（v2.2，DESIGN.md §5-01）---- */
.entry-body .media-img {
  display: block;
  max-width: 100%;
  border-radius: 4px;
  border: 1px solid var(--line);
  margin: 1rem 0;
}
.entry-body .media-select-wrap {
  position: relative;
  display: block;
  width: fit-content;
  max-width: 100%;
  margin: 1rem 0;
}
.entry-body .media-select-wrap > .media-img { margin: 0; }
.entry-body > .media-select-wrap.is-tall {
  width: min(100%, 30rem);
  margin-inline: auto;
}
.entry-body > .media-select-wrap.is-tall > .media-img {
  width: 100%;
  height: clamp(16rem, 38svh, 21rem);
  max-width: 30rem;
  object-fit: cover;
  object-position: center;
}
.media-select-btn {
  position: absolute;
  z-index: 3;
  top: 0.55rem;
  right: 0.55rem;
  min-height: 2rem;
  padding: 0.25rem 0.7rem;
  border: 1px solid color-mix(in srgb, var(--text) 28%, transparent);
  border-radius: 999px;
  background: color-mix(in srgb, var(--bg) 76%, transparent);
  color: var(--text);
  font-size: 0.68rem;
  line-height: 1;
  cursor: pointer;
  backdrop-filter: blur(7px);
  transition: border-color 0.3s, color 0.3s, opacity 0.3s;
}
.media-select-btn:hover,
.media-select-btn:focus-visible { border-color: var(--moon); color: var(--moon); outline: none; }
.media-select-btn[aria-pressed="true"] { border-color: color-mix(in srgb, var(--sun) 60%, var(--line)); color: var(--sun); }
.media-select-btn:disabled { opacity: 0.45; cursor: default; }
.media-select-btn::after {
  content: "";
  position: absolute;
  left: 50%;
  top: 50%;
  width: 44px;
  height: 44px;
  transform: translate(-50%, -50%);
}
/* v3.60：高宽比 ≥1.6 的正文单图使用固定裁切预览窗，不再按原比例生成狭长缩略图。
   原媒体字节、自然分辨率与幕布原图均不动；点击后仍由 curtain 完整查看。图组子项
   不命中直接子选择器，继续使用下方统一 4:3 规则。 */
.entry-body > .media-img.is-tall {
  width: min(100%, 30rem);
  height: clamp(16rem, 38svh, 21rem);
  max-width: 30rem;
  object-fit: cover;
  object-position: center;
  margin-inline: auto;
}
.entry-body .media-group {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  align-items: start;
  gap: 0.65rem;
  max-width: 100%;
  margin: 1rem 0;
}
.entry-body .media-group[data-count="3"] { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.entry-body .media-group .media-img {
  width: 100%;
  max-width: none;
  min-width: 0;
  height: auto;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  object-position: center;
  margin: 0;
  scroll-snap-align: start;
}
.entry-body .media-group .media-select-wrap {
  width: 100%;
  max-width: none;
  margin: 0;
  scroll-snap-align: start;
}
.entry-body .media-group .media-select-wrap > .media-img {
  width: 100%;
  height: auto;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  object-position: center;
}
@media (max-width: 719px) {
  .entry-body .media-group,
  .entry-body .media-group[data-count="3"] {
    /* 居中卡片序列：首/末项由两端 padding 居中；中间项吸附居中后，左右相邻图各露
       一角作为唯一方向提示。100% 轨宽以扣除 padding 后的 content-box 计算。 */
    --media-peek: clamp(1.75rem, 9vw, 2.75rem);
    grid-template-columns: none;
    grid-auto-flow: column;
    grid-auto-columns: 100%;
    overflow-x: auto;
    overscroll-behavior-inline: contain;
    scroll-snap-type: x mandatory;
    scroll-padding-inline: var(--media-peek);
    scrollbar-width: none;
    padding: 0 var(--media-peek) 0.35rem;
    -webkit-overflow-scrolling: touch;
  }
  .entry-body .media-group::-webkit-scrollbar { display: none; width: 0; height: 0; }
  .entry-body .media-group .media-img {
    scroll-snap-align: center;
    scroll-snap-stop: always;
  }
  .entry-body .media-group .media-select-wrap {
    scroll-snap-align: center;
    scroll-snap-stop: always;
  }
  .entry-body .media-group .media-select-wrap > .media-img {
    scroll-snap-align: none;
    scroll-snap-stop: normal;
  }
}
.entry-body .media-file {
  display: block;
  margin: 0.6rem 0;
  font-size: 0.85rem;
  color: var(--text-dim);
  transition: color 0.3s;
}
.entry-body .media-file:hover { color: var(--moon); }

.list-status {
  font-size: 0.78rem;
  color: var(--text-dim);
}
.ui-state {
  display: flex;
  align-items: center;
  gap: 0.7rem;
  flex-wrap: wrap;
}
.ui-state-retry {
  min-width: 44px;
  min-height: 44px;
  padding: 0 0.35rem;
  border: 0;
  background: transparent;
  color: var(--text-dim);
  font-size: 0.72rem;
  cursor: pointer;
  transition: color 0.25s;
}
.ui-state-retry:hover,
.ui-state-retry:focus-visible { color: var(--moon); }
.ui-state-retry:focus-visible {
  outline: 1px solid var(--moon);
  outline-offset: -6px;
}
.th-status .ui-state-retry { pointer-events: auto; }

/* ---- 文章：账本式列表，行可展开（details/summary，纯 CSS）---- */
.ledger { display: flex; flex-direction: column; }
.entry-item { border-bottom: 1px solid var(--line); }
.entry-item:first-child { border-top: 1px solid var(--line); }
.entry {
  position: relative;
  display: flex;
  align-items: baseline;
  gap: 1.6rem;
  padding: 1.05rem 3px;
  cursor: pointer;
  list-style: none;
}
.entry::-webkit-details-marker { display: none; }
.entry time {
  font-size: 0.8rem;
  color: var(--text-dim);
  flex-shrink: 0;
}
.entry-meta {
  display: inline-flex;
  align-items: baseline;
  gap: 0.5rem;
  flex-shrink: 0;
  white-space: nowrap;
}
@media (min-width: 720px) {
  /* 格物与正心共享固定日期轴；正心投影继续保留既有 canonical 几何。
     普通主页账本还须在同轴容纳分钟时间与两字类型词，故只为 article-list
     扩足 2rem，避免笔记／摘抄溢出后侵入题名。移动端 meta 仍独占整行。 */
  .entry-meta { flex: 0 0 7.75rem; width: 7.75rem; }
  #article-list .entry-meta { flex-basis: 9.75rem; width: 9.75rem; }
}
.content-kind {
  color: var(--text-dim);
  font-size: 0.68rem;
  letter-spacing: 0.04em;
  opacity: 0.72;
}
.entry-title {
  font-family: var(--font-serif);
  font-size: 1.05rem;
  line-height: 1.55; /* 多行摘句用（§5-01 v3.15B）：比正文紧，四行仍可一瞥吞 */
  min-width: 0; /* 容 flex 收缩→长首行换行（否则 min-content 撑破 arrow 对齐） */
  overflow: hidden; /* 配 max-height 行数上限；单行不触发（box 缩到内容） */
  background-image: linear-gradient(var(--moon), var(--moon));
  background-repeat: no-repeat;
  background-position: 0 100%;
  background-size: 0% 1px;
  transition: background-size 0.3s;
  padding-bottom: 2px;
  max-width: 474px;
}
/* 三档行数上限 + 末行渐隐（§5-01/§5-09.4 v3.15B）：字数上限已在 JS 预截断，
   此处按行收束——先达者胜。渐隐用 mask 露 --bg（昼夜两态各自取值，不用省略号，
   与扇列同一语言）；is-clamped 由 checkClamps() 仅在真超行时挂载。 */
.entry-title.clamp2 { max-height: 3.1em; }  /* 2 × 1.55 */
.entry-title.clamp4 { max-height: 6.2em; }  /* 4 × 1.55（仅无标题长文，属少数） */
.entry-title.is-clamped {
  -webkit-mask-image: linear-gradient(180deg, #000 calc(100% - 1.2em), transparent);
  mask-image: linear-gradient(180deg, #000 calc(100% - 1.2em), transparent);
}
.entry-title--media {
  display: flex;
  align-items: center;
  gap: 0.7rem;
  padding-bottom: 0;
  background-image: none;
}
.entry-media-preview {
  position: relative;
  display: block;
  flex: none;
  width: 4.8rem;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  border: 1px solid var(--line);
  border-radius: 3px;
  background: var(--surface);
}
.entry-media-loading {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  color: var(--text-dim);
  font-size: 0.55rem;
  white-space: nowrap;
}
.entry-media-image {
  position: relative;
  z-index: 1;
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: 0;
  transition: opacity 0.3s;
}
.entry-media-preview.is-loaded .entry-media-image { opacity: 1; }
.entry-media-preview.is-loaded .entry-media-loading { visibility: hidden; }
.entry-media-preview.is-error .entry-media-loading { visibility: visible; }
.entry-media-count { color: var(--text-dim); font-size: 0.7rem; letter-spacing: 0.08em; }
.entry:hover .entry-title { background-size: 100% 1px; }
.entry-item[open] .entry-title { background-size: 100% 1px; } /* 展开态标记：寒银下划线 */
.entry .arrow {
  position: absolute;
  right: 3px;
  bottom: calc(1.05rem + 0.48em);
  margin-left: 0;
  color: var(--text-dim);
  font-size: 0.85rem;
  transition: color 0.3s, transform 0.3s; /* 展开过渡（DESIGN.md §4-4） */
}
.entry:hover .arrow { color: var(--moon); }
.entry-item[open] .arrow { color: var(--moon); transform: rotate(90deg); }
.entry-body {
  font-family: var(--font-serif);
  width: min(100%, 480px);
  max-width: 480px;
  padding: 0.2rem 3px 1.8rem;
  line-height: 2.05;
}
/* 普通公开账本与独立 Mirror 应使用阅读栏的真实可用宽度。480px 是正心
   三档 raster 的 wide 纸面，不再作为所有公开文字的第二道版心；否则
   414–719px 的折叠屏/小平板会被误锁在窄手机栏，认证快照水合后也会从
   满阅读栏突然缩成 480px。320/375px 因可用宽度本就更窄，视觉不变。 */
#home-public-stream .entry-title { max-width: none; }
#home-public-stream .entry-item:not([open]) > .entry .entry-title { margin-inline-end: 1.75rem; }
#home-public-stream .entry-body,
#article-view .view-body {
  box-sizing: border-box;
  width: 100%;
  max-width: none;
}
/* 桌面展开态延续收起行的日期轴：时间留在左栏，正文落到摘要原来的起线，
   而不是重新从时间下方起笔。移动端 meta 本就独占一行，正文继续用满可用宽度。 */
@media (min-width: 720px) {
  #article-list .entry-item[open] > .entry-body {
    width: calc(100% - 9.75rem - 1.6rem);
    margin-inline-start: calc(9.75rem + 1.6rem);
  }
}
/* 长串（如无空格 URL）折行，并抑制 min-content 撑宽——否则文章展开态横向溢出、
   把 fixed nav 拉出视口（Phase 13 §一 修复；overflow-wrap:anywhere 兼顾两者） */
.entry-body, .entry-body p, .md-quote, .md-list li,
.comment-text, .bubble-text, .view-title { overflow-wrap: anywhere; }
.entry-body p + p { margin-top: 1rem; }
/* 中文标点渐进增强（§5-01d v3.49）：text-spacing-trim（Chromium 123+）+
   hanging-punctuation（Safari）+ text-autospace（中西文气口）——不支持即忽略、
   零变化零成本；编辑器 overlay 对齐域不施（逐行一致红线优先） */
.entry-body, .gb-text, .comment-text {
  text-spacing-trim: trim-start;
  hanging-punctuation: first last;
  text-autospace: normal;
}
.entry-sub {
  color: var(--text-dim);
  font-size: 0.9rem;
  letter-spacing: 0.08em;
  margin-bottom: 1.2rem;
}
.entry-body .placeholder { color: var(--text-dim); }

/* ---- 联系 ---- */
.contact-line {
  font-size: 0.88rem;
  color: var(--text-dim);
  display: flex;
  flex-wrap: wrap;
  gap: 0.9rem;
  align-items: baseline;
}
.contact-line a { transition: color 0.3s; }
.contact-line a:hover { color: var(--moon); }
.contact-line .sep { opacity: 0.4; }

/* ---- 留言（输入聚焦寒银；错误旧铜）---- */
.gb-form { margin-bottom: 2.2rem; }
.gb-form textarea {
  width: 100%;
  resize: vertical;
  background: var(--surface);
  color: var(--text);
  border: 1px solid var(--line);
  border-radius: 4px;
  padding: 0.8rem 0.9rem;
  font-family: var(--font-sans);
  font-size: 0.95rem;
  line-height: 1.7;
  transition: border-color 0.3s;
}
.gb-form textarea:focus {
  outline: none;
  border-color: var(--moon);
}
.gb-actions {
  margin-top: 0.7rem;
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 1rem;
}
.gb-status { font-size: 0.78rem; color: var(--text-dim); min-height: 1.2em; }
.gb-status.is-error { color: var(--sun); }

/* 留言初隐折叠（DESIGN §02 v3.54 方案 A）：展开件素净 mono、hover 转寒银；
   折叠容器复用一线天 0fr→1fr 连续开合（§4 白名单，reduced 直切见下） */
.gb-reveal {
  position: relative;
  display: inline-block;
  margin-bottom: 1.4rem;
  padding: 0;
  background: none;
  border: none;
  font-size: 0.78rem;
  color: var(--text-dim);
  letter-spacing: 0.04em;
  cursor: pointer;
  transition: color 0.3s;
}
.gb-reveal::after {
  content: "";
  position: absolute;
  left: 50%;
  top: 50%;
  width: 44px;
  height: 44px;
  transform: translate(-50%, -50%);
}
.gb-reveal:hover, .gb-reveal:focus-visible { color: var(--moon); }
.gb-fold {
  display: grid;
  grid-template-rows: 0fr;
  transition: grid-template-rows 0.45s ease;
}
.gb-fold.is-open { grid-template-rows: 1fr; }
.gb-fold-inner { overflow: hidden; min-height: 0; }

/* ---- 文章独立视图（DESIGN.md v2.9 §5-01b；返程见固定导航左席 §5-00.1）---- */
.view-head { display: flex; align-items: baseline; gap: 0.9rem; flex-wrap: wrap; }
.view-title { font-size: 1.5rem; font-weight: 600; }
.view-meta { font-size: 0.78rem; color: var(--text-dim); margin: 0.35rem 0 1.4rem; }

/* 认证文章发现页在任何脚本运行前就是一篇完整正文，而不是首页骨架。该属性只存在
   于后端生成的模板；SPA 回到主页时 articles.js 会摘除它。 */
html[data-prerendered-route="article"] .hero-band,
html[data-prerendered-route="article"] .horizon--sky,
html[data-prerendered-route="article"] #rift,
html[data-prerendered-route="article"] main > :not(#article-view) { display: none !important; }
.prerendered-article-view {
  max-width: var(--content);
  margin: 0 auto;
  padding: calc(var(--nav-safe-height) + 3.5rem) 1.5rem 4.5rem;
}
.article-prerendered { min-width: 0; }
.article-prerendered-header { margin-bottom: 1.4rem; }
.article-prerendered-header h1 {
  font-family: var(--font-serif);
  font-size: 1.5rem;
  font-weight: 600;
  line-height: 1.5;
  overflow-wrap: anywhere;
}
.article-prerendered-header time,
.article-prerendered .article-kind {
  display: inline-block;
  margin-top: 0.35rem;
  color: var(--text-dim);
  font-family: var(--font-meta);
  font-weight: var(--font-meta-weight);
  font-size: 0.78rem;
}
.article-prerendered .article-kind { margin-right: 0.65rem; }
.article-prerendered-body {
  font-family: var(--font-serif);
  font-size: 1rem;
  line-height: 1.9;
  overflow-wrap: anywhere;
}
.article-prerendered-body > * + * { margin-top: 1.15rem; }
.article-prerendered-body h2,
.article-prerendered-body h3 {
  color: var(--text);
  font-weight: 600;
  line-height: 1.55;
}
.article-prerendered-body h2 { font-size: 1.18rem; margin-top: 2rem; }
.article-prerendered-body h3 { font-size: 1.05rem; margin-top: 1.65rem; }
.article-prerendered-body blockquote {
  margin-inline: 0;
  padding-left: 1rem;
  border-left: 1px solid var(--line);
  color: var(--text-dim);
}
.article-prerendered-body pre {
  max-width: 100%;
  overflow: auto;
  padding: 0.9rem 1rem;
  border: 1px solid var(--line);
  font: 0.82rem/1.7 var(--font-mono);
  white-space: pre-wrap;
}
.article-prerendered-media { margin: 0 0 1.75rem; }
.article-prerendered-media img {
  display: block;
  width: auto;
  max-width: 100%;
  max-height: 64vh;
  max-height: 64svh;
  margin: 0 auto;
  object-fit: contain;
}
.article-tombstone .article-prerendered-body,
.article-tombstone p { color: var(--text-dim); }
@media (max-width: 719px), (pointer: coarse) {
  .prerendered-article-view {
    padding: calc(var(--nav-safe-height) + 2.25rem)
      max(1.25rem, var(--safe-area-right))
      max(3.4rem, calc(var(--safe-area-bottom) + 2rem))
      max(1.25rem, var(--safe-area-left));
  }
  .article-prerendered-header time,
  .article-prerendered .article-kind { font-size: var(--type-meta); }
}
/* 展开后才显出独立去路；与收起箭头分开，放在展开区顶部右侧。 */
.single-link {
  display: none;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
  min-height: 2.25rem;
  padding: 0.25rem 0.65rem;
  margin-left: auto;
  margin-right: 1.5rem;
  border-left: 1px solid var(--line);
  font-size: 0.8rem;
  color: var(--text-dim);
  text-decoration: none;
  transition: color 0.3s;
}
.entry-item[open] > .entry .single-link { display: inline-flex; }
.single-link:hover { color: var(--moon); }
.single-link:focus-visible { outline: 1px solid var(--moon); outline-offset: 2px; }
/* 列表行评论徽记：极小 mono，零评论不渲染 */
.comment-badge { font-size: 0.68rem; color: var(--text-dim); }

/* ---- 文章评论「账本批注」（DESIGN.md v2.9 §5-01c）：较留言板小一级、行距紧 ---- */
.yao--comments { margin: 1.8rem auto 1.4rem; }
.comments { margin-top: 0.2rem; }
.comment-row { margin-bottom: 0.7rem; }
.comment-meta { font-size: 0.7rem; color: var(--text-dim); display: block; }
.comment-text { font-size: 0.82rem; line-height: 1.55; margin: 0.1rem 0 0; }
.comment-form { display: flex; align-items: baseline; gap: 0.6rem; margin-top: 1rem; flex-wrap: wrap; }
.comment-input {
  flex: 1 1 12rem;
  min-width: 0;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 4px;
  padding: 0.3rem 0.55rem;
  font-size: 0.8rem;
  color: var(--text);
  transition: border-color 0.3s;
}
.comment-input:focus { outline: none; border-color: var(--moon); }
.comment-btn {
  background: var(--surface);
  color: var(--text);
  border: 1px solid var(--line);
  border-radius: 4px;
  padding: 0.25rem 0.85rem;
  font-size: 0.78rem;
  cursor: pointer;
  transition: color 0.3s, border-color 0.3s;
}
.comment-btn:hover { color: var(--sun); border-color: var(--sun); }
.comment-status { font-size: 0.72rem; color: var(--text-dim); }

/* ---- 正文 Markdown（DESIGN.md v3.0 §5-01d）：serif 缩阶标题、寒银引线、mono 代码 ---- */
.entry-body .md-h2 { font-family: var(--font-serif); font-size: 1.3rem; font-weight: 600; margin: 1.4rem 0 0.5rem; }
.entry-body .md-h3 { font-family: var(--font-serif); font-size: 1.1rem; font-weight: 600; margin: 1.1rem 0 0.4rem; }
.md-quote {
  border-left: 2px solid var(--moon);
  padding-left: 0.9rem;
  color: var(--text-dim);
  margin: 1rem 0;
}
.md-pre {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 4px;
  padding: 0.7rem 0.9rem;
  overflow-x: auto;
  font-family: var(--font-mono);
  font-size: 0.82rem;
  line-height: 1.6;
  margin: 1rem 0;
}
.md-code {
  font-family: var(--font-mono);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 3px;
  padding: 0 0.3em;
  font-size: 0.85em;
}
.md-hr { border: none; height: 1px; background: var(--line); margin: 1.6rem 0; }
.md-list { padding-left: 1.4rem; margin: 0.8rem 0; }
.md-list li { margin: 0.25rem 0; }
.md-link {
  color: var(--link);
  text-decoration-line: underline;
  text-decoration-color: currentColor;
  text-decoration-thickness: 0.07em;
  text-underline-offset: 3px;
  transition: color 0.3s;
}
.md-link:not(.md-mirror):visited { color: var(--link); }
.md-link:hover, .md-link:focus-visible { color: var(--moon); }
.md-link:focus-visible { outline: 2px solid currentColor; outline-offset: 3px; border-radius: 2px; }
@media (forced-colors: active) {
  .md-link, .md-link:not(.md-mirror):visited {
    color: LinkText;
    text-decoration-color: LinkText;
  }
  .md-link:focus-visible {
    color: LinkText;
    outline: 2px solid Highlight;
  }
}
/* 站内互链（§5-10.8 v3.12）：目标行文本作链文字，行内截断防超长引文成巨链 */
.md-mirror {
  color: var(--moon);
  display: inline-block;
  max-width: 24ch;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  vertical-align: bottom;
}

/* Markdown 工具栏（v3.0 §5b）：一行 mono 小按钮 */
/* 工具栏（§5b R3/R3.5）：无边框无底色，全部常驻、留白分组；按钮 mirror-touch 起雾语言 */
.editor-tools { display: flex; flex-wrap: wrap; align-items: center; gap: 0.3rem 0.35rem; margin-bottom: 0.35rem; }
.tool-gap { flex: 0 0 auto; width: 0.8rem; } /* 组间留白（含两侧 flex gap ≈1.5rem，非竖线非边框，§5b R3.5）*/
.tool-history-first { margin-left: auto; } /* 历史组（撤销/重做）推至最右 */
.tool-btn {
  background: none;
  color: var(--text-dim);
  border: none;
  border-radius: 4px;
  min-width: 2rem; min-height: 2rem; /* ≥32px 触达区 */
  padding: 0.2rem 0.5rem;
  font-size: 0.82rem;
  cursor: pointer;
  filter: blur(0.3px); /* mirror-touch 起雾 */
  transition: color 0.3s, filter 0.3s ease, transform 0.3s ease;
}
.tool-btn:hover, .tool-btn:focus-visible { color: var(--moon); filter: blur(0); transform: translateY(-1px); outline: none; }
.tool-btn.is-on { color: var(--moon); filter: blur(0); }
@media (pointer: coarse) { .tool-btn { min-width: 2.75rem; min-height: 2.75rem; } } /* 触屏 ≥44px */
#gb-submit {
  background: var(--surface);
  color: var(--text);
  border: 1px solid var(--line);
  border-radius: 4px;
  padding: 0.35rem 1.1rem;
  font-size: 0.82rem;
  cursor: pointer;
  /* filter/transform 一并列入（评审 medium）：#gb-submit ID 特异性 (1,0,0)
     压过 mirror-touch 组，否则起雾/微浮瞬跳无缓动 */
  transition: border-color 0.3s, color 0.3s, filter 0.3s ease, transform 0.3s ease;
}
#gb-submit:hover:not(:disabled) { border-color: var(--sun); color: var(--sun); } /* 落笔即印记 */
#gb-submit:disabled { opacity: 0.45; cursor: default; }

.gb-entry {
  display: flex;
  align-items: baseline;
  gap: 1.4rem;
  padding: 1rem 0.2rem;
  border-bottom: 1px solid var(--line);
}
.gb-entry:first-child { border-top: 1px solid var(--line); }
.gb-meta {
  flex-shrink: 0;
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  font-size: 0.78rem;
  color: var(--text-dim);
}
.gb-text {
  font-family: var(--font-serif);
  font-size: 1rem;
  overflow-wrap: anywhere;
}
/* ---- Footer（左侧隐晦入口；v2.5 与天同宽）---- */
.footer {
  padding: 2.2rem var(--band-pad) 2.6rem;
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 1rem;
}
.footer-left { display: flex; align-items: baseline; gap: 0.8rem; flex-wrap: wrap; }

/* 口令解锁入口（DESIGN.md v2.3 §5b）：低调、双极规则 */
.lock-btn {
  background: none;
  border: none;
  padding: 0;
  font-size: 0.78rem;
  color: var(--text-dim);
  cursor: pointer;
  transition: color 0.3s;
}
.lock-btn:hover { color: var(--moon); }
/* :not([hidden]) 使 hidden 属性真正生效（类选择器的 display 不再覆盖 [hidden]） */
.lock-form:not([hidden]) { display: inline-flex; align-items: baseline; gap: 0.6rem; }
.lock-input {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 4px;
  padding: 0.25rem 0.5rem;
  font-size: 0.78rem;
  color: var(--text);
  width: 12rem;
  transition: border-color 0.3s;
}
.lock-input:focus { outline: none; border-color: var(--moon); }
.lock-msg { font-size: 0.75rem; color: var(--sun); }

/* ---- 主人回声（§5-01g v3.22）：留言/批注下的回应笺 ---- */
.echo-note { /* 缩进一格 + 左缘 2px --sun 短竖线（日极·印记，与「作者」同源；对照批注引用的 --moon 线）*/
  margin: 0.35rem 0 0 1.4rem;
  padding-left: 0.7rem;
  border-left: 2px solid var(--sun);
}
.echo-meta { font-size: 0.68rem; color: var(--text-dim); }
.echo-text {
  font-family: var(--font-serif);
  font-size: 0.85em; /* 比原文小半档 */
  color: var(--text);
  margin: 0.15rem 0 0;
  overflow-wrap: anywhere; /* 320/375 缩进后不溢出 */
}
/* 回声直发字钮（解锁态；hover 现身、触屏常显微透明）——v3.23R：点击即就地竖排编辑 */
.echo-btn {
  opacity: 0;
  font-size: 0.7rem; color: var(--text-dim);
  background: none; border: none; cursor: pointer; padding: 0.1rem 0.2rem;
  transition: opacity 0.2s, color 0.3s;
}
.gb-entry:hover .echo-btn, .comment-row:hover .echo-btn { opacity: 0.8; }
/* 键盘焦点要真环（评审修）：coarse 设备基透明度 0.5，仅靠透明度差辨焦点不达 WCAG 2.4.7 */
.echo-btn:focus-visible { opacity: 1; outline: 1px solid var(--moon); outline-offset: 2px; }
.echo-btn:hover { color: var(--moon); }
@media (any-pointer: coarse) { .echo-btn { opacity: 0.5; } } /* 触屏无 hover：常显低调 */
@media (prefers-reduced-motion: reduce) { .echo-btn { transition: none; } }
/* 直发编辑器（v3.23R §5-01g：竖排三步——textarea 一行、「回应」右置一行；gb 语言同源） */
.echo-editor { margin: 0.3rem 0 0 1.4rem; }
.echo-input-wrap { position: relative; }
.echo-input {
  width: 100%; display: block; resize: none;
  background: var(--surface); color: var(--text);
  border: 1px solid var(--line); border-radius: 4px;
  padding: 0.45rem 2.4rem 0.45rem 0.6rem; /* 右侧留计数位 */
  font-family: var(--font-sans); font-size: 0.85rem; line-height: 1.6;
  transition: border-color 0.3s;
}
.echo-input:focus { outline: none; border-color: var(--moon); }
.echo-count { /* 右下余字微计数 */
  position: absolute; right: 0.45rem; bottom: 0.3rem;
  font-size: 0.62rem; color: var(--text-dim); pointer-events: none;
}
.echo-count.is-low { color: var(--sun); }
.echo-actions { margin-top: 0.4rem; display: flex; justify-content: space-between; align-items: baseline; gap: 1rem; } /* gb-actions 同构 */
.echo-msg { font-size: 0.72rem; color: var(--sun); min-height: 1.1em; }
.echo-send {
  background: var(--surface); color: var(--text);
  border: 1px solid var(--line); border-radius: 4px;
  padding: 0.25rem 0.9rem; font-size: 0.78rem; cursor: pointer;
  transition: border-color 0.3s, color 0.3s, filter 0.3s ease, transform 0.3s ease;
}
.echo-send:hover:not(:disabled) { border-color: var(--sun); color: var(--sun); } /* 落笔即印记（gb-submit 同语） */
.echo-send:disabled { opacity: 0.45; cursor: default; }

/* ---- 批注楼层（§5-01c v3.25 回复大一统：回复即笺，单层缩进）---- */
.reply-note { margin: -0.25rem 0 0.7rem 1.4rem; } /* 楼下笺：贴楼首行、楼间距同 comment-row */
.reply-note.note-visitor { border-left-color: var(--line); } /* 访客笺银灰竖线（分自然身份不分权限） */
.reply-note:hover .echo-btn { opacity: 0.8; } /* 「回」钮 hover 现身（笺亦可被回） */
.reply-note .echo-editor { margin-left: 0; } /* 笺内编辑器不叠第二层缩进（评审修） */
.view-all { /* 主页速览入口「观全言 N ⟶」（>3 条才渲染；≤3 无入口） */
  display: inline-block; margin-top: 0.5rem;
  font-size: 0.7rem; color: var(--text-dim); text-decoration: none; transition: color 0.3s;
}
.view-all:hover { color: var(--moon); }
.comments-preview .comment-row { margin-bottom: 0.55rem; } /* 速览更紧一档 */

/* 折叠统一（v3.23R §2）：>4 行正文折至 4 行——line-clamp（账本三档同款）+ 末行 mask 渐隐
   （全站渐隐语言，不用省略号）；只折正文，meta/雅名/笺竖线不折；展开过渡由 JS max-height 驱动。
   类名 fold4：.clamp4 已被账本三档（.entry-title.clamp4）占用，撞名会误伤账本行（评审修 HIGH） */
.fold4 {
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 4; overflow: hidden;
  -webkit-mask-image: linear-gradient(180deg, #000 calc(100% - 1.3em), transparent 99%);
  mask-image: linear-gradient(180deg, #000 calc(100% - 1.3em), transparent 99%);
}
.clamp-toggle {
  display: block; background: none; border: none; padding: 0.1rem 0;
  font-size: 0.68rem; color: var(--text-dim); cursor: pointer; transition: color 0.3s;
}
.clamp-toggle:hover { color: var(--moon); }
.clamp-toggle:focus-visible { outline: 1px solid var(--moon); outline-offset: 2px; }
@media (prefers-reduced-motion: reduce) { .clamp-toggle { transition: none; } }
/* 留言板主列（v3.23R）：.gb-entry 是 flex——正文若直接当 flex 子项，折叠的 -webkit-box
   会被块化成 flow-root（320 实测高度归零）。.gb-main 承块级上下文：正文/回声笺/直发
   编辑器/折叠钮皆居其内，与批注侧同构。width:100% 兼治移动端 column+baseline 不拉伸 */
.gb-main { flex: 1 1 0; min-width: 0; width: 100%; }

/* ---- 发布/编辑器（DESIGN.md v2.3 §5b）---- */
.entry-edit {
  display: inline-block;
  margin-top: 1.2rem;
  background: none;
  border: none;
  padding: 0;
  font-size: 0.8rem;
  color: var(--text-dim);
  cursor: pointer;
  transition: color 0.3s;
}
.entry-edit:hover { color: var(--moon); }

.editor {
  position: relative; /* 「系」选文浮层的定位上下文（v3.12 R3） */
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 6px;
  padding: 1.8rem 1.6rem; /* §5b R3：案头留白 */
  margin-bottom: 2.2rem;
  gap: 1.25rem; /* §5b R3：字段间留白拉开 */
}
/* ---- 「系」选文浮层（§5b v3.12 R3；R3 改气泡卡语言）：不推挤正文 ---- */
.mirror-panel, .tbl-picker, .emoji-picker { /* 浮层统一气泡卡（.bubble 同款，§5b R3）*/
  backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
}
.mirror-panel {
  position: absolute;
  left: 1.5rem;
  right: 1.5rem;
  z-index: 5;
  background: color-mix(in srgb, var(--surface) 88%, transparent);
  border: 1px solid var(--line);
  border-radius: 12px;
  padding: 0.7rem;
  box-shadow: 0 8px 28px rgba(0, 0, 0, 0.32);
}
html.day .mirror-panel { box-shadow: 0 6px 24px rgba(35, 39, 47, 0.18); }
.mirror-panel[hidden] { display: none; }
/* 搜索框满宽收敛：input 固有宽会在 320px 撑破面板（验收实测） */
.mirror-panel > .editor-input { width: 100%; min-width: 0; }
.mirror-panel-list { max-height: 14rem; overflow-y: auto; margin-top: 0.5rem; }
.mirror-panel-row {
  display: flex;
  align-items: baseline;
  gap: 0.6rem;
  padding: 0.3rem 0.4rem;
  border-radius: 3px;
  cursor: pointer;
}
.mirror-panel-row:hover, .mirror-panel-row.is-active { background: var(--bg); }
.mp-t { flex: 1 1 auto; font-family: var(--font-serif); font-size: 0.85rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mp-d { font-size: 0.68rem; color: var(--text-dim); flex-shrink: 0; }

/* 链接案：与「系」同属作者工作台的轻浮层，但只承载两项可验证输入。 */
.link-panel {
  position: fixed;
  box-sizing: border-box;
  z-index: 7;
  display: grid;
  gap: 0.65rem;
  max-width: calc(100% - 2rem);
  padding: 0.8rem;
  background: color-mix(in srgb, var(--surface) 92%, transparent);
  border: 1px solid var(--line);
  border-radius: 12px;
  box-shadow: 0 8px 28px rgba(0, 0, 0, 0.32);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  overflow-y: auto;
  overscroll-behavior: contain;
}
html.day .link-panel { box-shadow: 0 6px 24px rgba(35, 39, 47, 0.18); }
.link-panel[hidden] { display: none; }
.link-panel-title { font-size: 0.82rem; font-weight: 400; color: var(--text); }
.link-field { display: grid; gap: 0.2rem; min-width: 0; }
.link-field-label { color: var(--text-dim); font-size: 0.72rem; }
.link-panel .link-input {
  width: 100%;
  min-width: 0;
  padding: 0.45rem 0.55rem;
  border: 1px solid var(--line);
  border-radius: 6px;
  background: color-mix(in srgb, var(--bg) 32%, transparent);
}
.link-panel .link-input:focus { border-color: var(--moon); }
.link-panel .link-input:focus-visible { outline: 2px solid var(--moon); outline-offset: 2px; }
.link-panel .link-input::placeholder { color: var(--text-dim); opacity: 1; }
.link-panel .link-input[aria-invalid="true"] { border-color: var(--sun); }
.link-panel-error { min-height: 1.35em; color: var(--sun); font-size: 0.72rem; }
.link-panel-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 0.45rem; }
.link-panel-btn {
  min-height: 2rem;
  padding: 0.25rem 0.5rem;
  border: 0;
  border-radius: 4px;
  background: none;
  color: var(--text-dim);
  cursor: pointer;
  font-size: 0.78rem;
}
.link-panel-btn:hover, .link-panel-btn:focus-visible { color: var(--moon); }
.link-panel-btn:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }
.link-panel-remove { margin-right: auto; }
.link-panel-submit { color: var(--moon); }
@media (forced-colors: active) {
  .link-panel { background: Canvas; border-color: CanvasText; forced-color-adjust: auto; }
  .link-panel .link-input:focus, .link-panel-btn:focus-visible { outline: 2px solid Highlight; }
  .link-panel .link-input[aria-invalid="true"] { border-color: Mark; }
}
@media (pointer: coarse) {
  .link-panel-btn { min-height: 2.75rem; padding-inline: 0.7rem; }
  .link-panel .link-input { min-height: 2.75rem; }
}
/* ---- kind 三形单源（§5-10 v3.19）：全站 kind 视觉语言，星图/系浮层/搜索共用 ----
   一个基准 + 两处偏离：文章=纯圆点；摘抄=月牙环（复用 hero .moon/表态 .react-ic--moon
   内切偏移 box-shadow）；笔记=印（.seal 缩影：实心方 + 一角微溢旧铜）。尺寸经 --kg 等比。
   灰度以形辨（WCAG 1.4.1，盘/牙/方不依赖色相）。 */
.kind-glyph { --kg: 8px; width: var(--kg); height: var(--kg); box-sizing: border-box; flex-shrink: 0; display: inline-block; position: relative; color: var(--text-dim); }
.kind-glyph--article { border-radius: 50%; background: currentColor; }
.kind-glyph--excerpt { /* 月牙环：内切偏移 box-shadow 挖月牙（值同 .moon 的 -9/7 ÷42 比例）+ -18° 倾角 */
  /* 月牙形本体即 box-shadow——抽成变量，便于 Box 强调层与光晕 box-shadow 叠加而非互斥 */
  --crescent: inset calc(var(--kg) * -0.21) calc(var(--kg) * 0.17) 0 0 color-mix(in srgb, var(--moon) 80%, var(--text-dim));
  border-radius: 50%;
  box-shadow: var(--crescent);
  transform: rotate(-18deg);
}
.kind-glyph--note { border-radius: 2px; background: color-mix(in srgb, var(--sun) 82%, var(--text-dim)); } /* 生印缩影 */
.kind-glyph--note::after { content: ""; position: absolute; width: calc(var(--kg) * 0.36); height: calc(var(--kg) * 0.36); right: calc(var(--kg) * -0.13); bottom: calc(var(--kg) * -0.13); border-radius: 50%; background: var(--sun); opacity: 0.85; } /* 一角微溢印泥 */
/* 记忆=空心环（§5-10 v3.32 第四形）：--text-dim 描边不填色、--kg 等比——实心圆掏空，
   形在而刻已逝，旧光今至；两轴落成：实↔空=今↔昔，月↔日=借光↔手迹 */
.kind-glyph--memory { border-radius: 50%; border: 1px solid currentColor; background: none; }
.mp-g { --kg: 7px; } /* 系浮层/搜索行的 kind-glyph 尺寸档 */
/* Box 入盒/出盒提示行（§5-09.3）：一行 mono、与编辑入口同排 */
.box-flip-msg { font-size: 0.72rem; color: var(--text-dim); }
/* :not([hidden]) 使 hidden 属性真正生效——否则 display:flex 覆盖 [hidden]，
   非 Mirror 态「取消」置 hidden 却不消失（Phase 15 §四 修复） */
.editor:not([hidden]) { display: flex; flex-direction: column; }
.editor-heading {
  font-family: var(--font-serif);
  font-weight: 600;
  font-size: 1.1rem;
}
/* 稿件路由：归处（谁能看见）与形态（内容如何归类）为两条正交轴。
   不用第五枚 kind 伪装正心，也不在换归处时改动形态或字段。 */
.editor-routing {
  display: grid;
  gap: 0.82rem;
  padding: 0.9rem 0 1rem;
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
}
.editor-routing[hidden] { display: none; }
.editor-routing-row,
.editor-kind-row {
  display: grid;
  grid-template-columns: 3.1rem minmax(0, 1fr);
  align-items: center;
  gap: 0.8rem;
}
.editor-routing-axis {
  color: var(--text-dim);
  font-size: 0.64rem;
  letter-spacing: 0.14em;
}
.editor-destination-choices {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  width: min(100%, 31rem);
  gap: 0.55rem;
}
.editor-destination-btn {
  appearance: none;
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  align-items: center;
  gap: 0.68rem;
  min-width: 0;
  min-height: 3rem;
  padding: 0.48rem 0.68rem;
  border: 0;
  border-bottom: 1px solid var(--line);
  border-radius: 3px 3px 0 0;
  background: transparent;
  color: var(--text-dim);
  cursor: pointer;
  text-align: left;
  transition: color 0.24s ease, border-color 0.24s ease, background 0.24s ease;
}
.editor-destination-mark {
  position: relative;
  display: block;
  width: 0.78rem;
  height: 0.78rem;
  box-sizing: border-box;
  border: 1px solid currentColor;
  border-radius: 50%;
  color: var(--text-dim);
  transition: color 0.24s ease, background 0.24s ease, box-shadow 0.24s ease, transform 0.24s ease;
}
.editor-destination-copy { min-width: 0; }
.editor-destination-name {
  display: block;
  color: inherit;
  font-family: var(--font-serif);
  font-size: 0.92rem;
  line-height: 1.2;
}
.editor-destination-note {
  display: block;
  margin-top: 0.24rem;
  overflow-wrap: anywhere;
  color: var(--text-dim);
  font-size: 0.61rem;
  letter-spacing: 0.055em;
  line-height: 1.35;
}
.editor-destination-btn--public[aria-pressed="true"] {
  border-bottom-color: var(--sun);
  color: var(--text);
  background: color-mix(in srgb, var(--sun) 4%, transparent);
}
.editor-destination-btn--public[aria-pressed="true"] .editor-destination-mark {
  border-color: var(--sun);
  background: var(--sun);
  box-shadow: 0 0 0.55rem color-mix(in srgb, var(--sun) 24%, transparent);
}
.editor-destination-btn--heart[aria-pressed="true"] {
  border-bottom-color: var(--moon);
  color: var(--text);
  background: color-mix(in srgb, var(--moon) 4%, transparent);
}
.editor-destination-btn--heart[aria-pressed="true"] .editor-destination-mark {
  border-color: var(--moon);
  color: var(--moon);
  box-shadow: inset -0.24rem 0 0 currentColor, 0 0 0.55rem color-mix(in srgb, var(--moon) 20%, transparent);
  transform: rotate(-18deg);
}
.editor-destination-btn:focus-visible {
  outline: 1px solid var(--moon);
  outline-offset: 2px;
}
.editor-destination-hint {
  min-height: 1.1em;
  margin: -0.28rem 0 0 3.9rem;
  color: var(--text-dim);
  font-size: 0.64rem;
  letter-spacing: 0.035em;
  line-height: 1.65;
}
.editor-kind-choices {
  display: flex;
  flex-wrap: wrap;
  gap: 0.45rem 0.55rem;
}
@media (hover: hover) and (pointer: fine) {
  .editor-destination-btn:hover { color: var(--text); }
  .editor-destination-btn--public:hover { border-bottom-color: color-mix(in srgb, var(--sun) 58%, var(--line)); }
  .editor-destination-btn--heart:hover { border-bottom-color: color-mix(in srgb, var(--moon) 62%, var(--line)); }
}
@media (max-width: 719px), (pointer: coarse) {
  .editor-routing { gap: 0.72rem; padding-block: 0.85rem; }
  .editor-routing-row,
  .editor-kind-row {
    grid-template-columns: minmax(0, 1fr);
    gap: 0.42rem;
  }
  .editor-routing-axis { font-size: var(--type-meta); }
  .editor-destination-choices { width: 100%; gap: 0.4rem; }
  .editor-destination-btn {
    min-height: 52px;
    padding: 0.52rem 0.58rem;
    gap: 0.52rem;
  }
  .editor-destination-name { font-size: 1rem; }
  .editor-destination-note { font-size: var(--type-meta); }
  .editor-destination-hint {
    min-height: 2.4em;
    margin: -0.18rem 0 0;
    font-size: var(--type-meta);
  }
  .editor-kind-choices {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 0.4rem;
  }
  .editor-kind-choices .kind-btn {
    min-width: 0;
    min-height: 44px;
    text-align: center;
  }
}
@media (prefers-reduced-motion: reduce) {
  .editor-destination-btn,
  .editor-destination-mark { transition: none; }
}
@media (forced-colors: active) {
  .editor-destination-btn[aria-pressed="true"] { border: 1px solid CanvasText; }
  .editor-destination-btn[aria-pressed="true"] .editor-destination-mark { background: CanvasText; }
  .editor--destination-heart .editor-submit { border-color: CanvasText; }
}
/* 字段行下划线化（§5b R3）：无框无底、底部 1px --line、聚焦转寒银——信笺抬头非登记表 */
.editor-input {
  background: none;
  border: none;
  border-bottom: 1px solid var(--line);
  border-radius: 0;
  padding: 0.4rem 0.15rem;
  font-size: 0.92rem;
  font-family: var(--font-serif);
  color: var(--text);
  transition: border-color 0.3s;
}
.editor-input:focus { outline: none; border-bottom-color: var(--moon); }
.editor-input::placeholder { color: var(--text-dim); opacity: 0.5; }
/* 「系」浮层内的搜索输入保留框式（在气泡卡内，下划线会突兀）*/
.mirror-panel .editor-input, .tbl-picker .editor-input { border: 1px solid var(--line); border-radius: 6px; padding: 0.4rem 0.6rem; }
/* 忆时四段（§5b v3.32 记忆脸；datetime-local 及其 320 兼容规则随三笔迹锁时退役）：
   固定短段宽 + 换行余地，320 天然零溢出 */
.editor-mem-row { display: none; align-items: center; gap: 0.45rem; flex-wrap: wrap; }
.mem-seg { flex: 0 0 auto; width: 3em; text-align: center; }
.mem-seg.mem-y { width: 4.4em; }
.mem-colon { color: var(--text-dim); margin: 0 -0.15rem; }
.editor-label { font-size: 0.78rem; color: var(--text-dim); flex-shrink: 0; }
/* 写作台正文 + 高亮层共享度量（§5b v3.18-R2）：font/size/line-height/letter-spacing/
   padding/border/white-space/word-break/width 逐项相同——逐像素对齐的前提 */
.editor-body, .md-overlay {
  box-sizing: border-box;
  width: 100%;
  margin: 0;
  padding: 1.6rem 1.3rem; /* §5b R3：稿纸上下留白再放宽 */
  border: 0;
  font-family: var(--font-serif); /* §5b R3：正文与主页内容（.entry-body/Mirror）同族 serif */
  font-size: 1rem;
  line-height: 1.8;
  letter-spacing: normal;
  white-space: pre-wrap;
  word-break: break-word;
  overflow-wrap: break-word;
  tab-size: 2;
  scrollbar-gutter: stable; /* 两者同留滚动条槽——超 60vh 出滚动条时宽度仍一致（逐行对齐，R2）*/
}
.editor-body {
  display: block;
  background: transparent; /* 稿纸底由 .editor-body-wrap 承载 */
  color: var(--text);
  resize: vertical;
  min-height: 20rem; /* §5b v3.18：写作台加长（autoGrow 于输入时接管高度） */
  position: relative;
  z-index: 1;
}
.editor-body:focus { outline: none; }
/* 高亮层就位时（§5b v3.18-R2）：textarea 文字透明、caret 保留，overlay 在其下显语法 */
.editor-body.has-overlay { color: transparent; caret-color: var(--text); }
/* 选区半透明底——透明字被选中时至少选区可见（评审 R2 LOW）*/
.editor-body.has-overlay::selection { background: color-mix(in srgb, var(--moon) 32%, transparent); }
.md-overlay {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: hidden; /* 滚动由 JS 同步 scrollTop/Left */
  pointer-events: none;
  color: var(--text);
  background: transparent;
}
.md-overlay[hidden] { display: none; }
/* 语法着色（不改 font-size/line-height——保逐行对齐；符号淡化，结构着色/衬底）*/
.md-ov-sym { color: var(--text-dim); opacity: 0.22; } /* ## ** * > ` 记号淡至几乎不可见（R3：写的字才是主角）*/
/* 加粗一律用 text-shadow 假粗（评审 R2 MEDIUM：font-weight 会改 ASCII 字宽、破坏与
   textarea 的逐行对齐——假粗视觉加粗而不改 advance，CJK/ASCII 皆逐像素对齐）*/
.md-ov-h { color: var(--moon); text-shadow: 0.02em 0 0 currentColor; } /* 标题：着色 + 假粗、不放大 */
.md-ov-strong { text-shadow: 0.02em 0 0 currentColor; }
.md-ov-em { color: var(--text); opacity: 0.9; } /* 斜体会改 ASCII 字宽——不施 font-style，改由淡记号提示 */
.md-ov-code { background: color-mix(in srgb, var(--moon) 12%, transparent); border-radius: 3px; color: var(--sun); } /* 衬底改月色淡染——稿纸底是 --surface，--surface 衬底会隐形（评审 R3）*/
.md-ov-quote { color: var(--text-dim); box-shadow: inset 2px 0 var(--moon); }
.md-ov-link { color: var(--link); text-decoration: underline; text-underline-offset: 3px; }
.md-ov-url { color: var(--text-dim); }
.md-ov-link.is-invalid, .md-ov-url.is-invalid {
  color: var(--sun);
  text-decoration-line: underline;
  text-decoration-style: wavy;
  text-decoration-thickness: 1px;
  opacity: 1;
}
.md-ov-token { background: color-mix(in srgb, var(--moon) 14%, transparent); border-radius: 3px; } /* [[media/mirror:]] 徽记 */
.md-ov-hr { color: var(--text-dim); opacity: 0.55; }
.md-ov-bullet { color: var(--moon); } /* - / 1. 符号微强调 */
/* 表格（§5-01d v3.18-R2）：hairline + surface 表头、窄屏横滚不撑破 */
.md-table-wrap { overflow-x: auto; max-width: 100%; margin: 1rem 0; }
.md-table { border-collapse: collapse; font-size: 0.92rem; }
.md-table th, .md-table td { border: 1px solid var(--line); padding: 0.4rem 0.75rem; text-align: left; vertical-align: top; }
.md-table th { background: var(--surface); font-weight: 600; }
/* 字数陪伴（§5b v3.18）：正文框右下角极小 mono，不夺注意 */
.editor-body-wrap { /* 稿纸：极轻 --surface 底 + 底部一道 hairline（聚焦转寒银，§5b R3）*/
  position: relative; max-width: 42em; margin-inline: auto; width: 100%;
  background: var(--surface);
  border-radius: 8px 8px 3px 3px;
  border-bottom: 1px solid var(--line);
  transition: border-color 0.3s;
}
.editor-body-wrap:focus-within { border-bottom-color: var(--moon); }
/* 选区浮动格式条（§5b v3.48）：气泡卡语言（--surface 半透 + blur + hairline + 大圆角，
   与 .bubble 同族）；显隐用 hidden 直切，零新增动效类别 */
.sel-pop {
  position: absolute; z-index: 5;
  display: flex; gap: 0.05rem; padding: 0.2rem 0.3rem;
  background: color-mix(in srgb, var(--surface) 88%, transparent);
  backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
  border: 1px solid var(--line); border-radius: 12px;
  box-shadow: 0 4px 18px rgba(0, 0, 0, 0.16);
}
.sel-pop[hidden] { display: none; }
.sel-pop-btn {
  background: none; border: none; padding: 0.2rem 0.45rem;
  font-family: var(--font-meta); font-size: 0.78rem; font-weight: var(--font-meta-weight); color: var(--text-dim);
  cursor: pointer; border-radius: 6px; transition: color 0.3s;
}
.sel-pop-btn:hover, .sel-pop-btn:focus-visible { color: var(--moon); }
@media (prefers-reduced-motion: reduce) { .sel-pop-btn { transition: none; } }
/* ---- 并排实时预览 + 高亮层 + 新工具（§5b v3.18-R2）---- */
.editor-split { display: block; }
.editor-split.is-split { display: flex; gap: 1rem; align-items: stretch; }
.editor-split.is-split .editor-body-wrap { max-width: none; margin: 0; flex: 1 1 50%; min-width: 0; }
.editor-live-preview {
  flex: 1 1 50%; min-width: 0;
  border: 1px solid var(--line); border-radius: 4px;
  padding: 1.2rem; overflow-y: auto; max-height: 60vh;
  background: var(--bg); /* 用页底 --bg（非 --surface）——渲染的代码衬底 --surface 才有对比（评审 R3）*/
}
.editor-live-preview[hidden] { display: none; }
@media (max-width: 719px) { /* 窄屏：预览不并排，改为下方块（切换即显/隐）*/
  .editor-split.is-split { flex-direction: column; }
  .editor-live-preview { max-height: 40vh; }
}
/* 表格选择器 */
.tbl-picker, .emoji-picker {
  position: absolute; z-index: 6; left: 0;
  background: color-mix(in srgb, var(--surface) 88%, transparent); border: 1px solid var(--line); border-radius: 12px;
  padding: 0.7rem; box-shadow: 0 8px 28px rgba(0,0,0,0.32);
}
.tbl-picker[hidden], .emoji-picker[hidden] { display: none; }
.tbl-grid { display: grid; grid-template-columns: repeat(6, 1fr); gap: 3px; }
.tbl-cell { width: 16px; height: 16px; border: 1px solid var(--line); border-radius: 2px; cursor: pointer; }
.tbl-cell.on { background: color-mix(in srgb, var(--moon) 40%, transparent); border-color: var(--moon); }
.tbl-label { margin-top: 0.4rem; font-size: 0.72rem; color: var(--text-dim); text-align: center; }
/* 草稿可达面板（§5b v3.49）：气泡卡语言（--surface 半透+hairline+大圆角，tbl-picker 同族） */
.draft-panel {
  position: absolute; z-index: 6;
  min-width: 15rem; max-width: min(22rem, 90vw); max-height: 42vh; overflow-y: auto;
  background: color-mix(in srgb, var(--surface) 88%, transparent); border: 1px solid var(--line); border-radius: 12px;
  padding: 0.5rem; box-shadow: 0 8px 28px rgba(0,0,0,0.32);
}
.draft-panel[hidden] { display: none; }
.draft-row {
  display: flex; gap: 0.6rem; width: 100%; text-align: left; align-items: baseline;
  background: none; border: none; padding: 0.35rem 0.45rem; border-radius: 8px;
  cursor: pointer; font-family: var(--font-serif); color: var(--text); transition: background 0.3s;
}
.draft-row:hover, .draft-row:focus-visible { background: color-mix(in srgb, var(--moon) 10%, transparent); }
.draft-time { font-size: 0.68rem; color: var(--text-dim); flex-shrink: 0; }
.draft-first { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.draft-empty { margin: 0.25rem 0.4rem; font-size: 0.75rem; color: var(--text-dim); }
@media (prefers-reduced-motion: reduce) { .draft-row { transition: none; } }
/* 表情选择器 */
.emoji-picker { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; max-width: 15rem; }
.emoji-picker[hidden] { display: none; }
.emoji-cell { background: none; border: none; font-size: 1.15rem; line-height: 1.4; padding: 0.1rem; cursor: pointer; border-radius: 4px; }
.emoji-cell:hover { background: color-mix(in srgb, var(--moon) 18%, transparent); }
.emoji-picker { gap: 4px; padding: 0.8rem; } /* R3：疏落留白 */
/* ---- 爻线入编辑器（§3d 母题，§5b R3）---- */
/* 爻线入工具栏作满宽末行"根"（§5b v3.20 §2；复用 editorYao，不新增元素）：
   随工具栏一体 sticky 冻结，给浮条一个下缘、与正文隔开 */
.editor-tools > .editor-yao { flex: 0 0 100%; width: 100%; margin: 0.4rem 0 0.05rem; opacity: 0.7; }
/* ---- 专注模式钮 + 铺开态（§5b R3）---- */
.editor-focus-btn {
  position: absolute; top: 1.1rem; right: 1.3rem; z-index: 3;
  background: none; border: none; color: var(--text-dim);
  font-size: 0.78rem; cursor: pointer;
  filter: blur(0.3px); transition: color 0.3s, filter 0.3s ease;
}
.editor-focus-btn:hover, .editor-focus-btn:focus-visible { color: var(--moon); filter: blur(0); outline: none; }
.editor-drafts-btn { right: 4.4rem; }
body.editor-focus-active { overflow: hidden; } /* 背景不滚 */
.editor.editor-fullscreen {
  position: fixed; inset: 0; z-index: 300;
  margin: 0; border: none; border-radius: 0;
  max-width: none; width: 100vw; height: 100vh;
  height: 100dvh;
  overflow-y: auto;
  padding:
    max(4vh, calc(var(--safe-area-top) + 1rem))
    max(2rem, calc((100vw - 1400px) / 2), var(--safe-area-right))
    max(4vh, calc(var(--safe-area-bottom) + 1rem))
    max(2rem, calc((100vw - 1400px) / 2), var(--safe-area-left)); /* 居中限宽 ≤1400px + 奢侈留白；横屏避开刘海 */
  background: var(--bg);
}
.editor.editor-fullscreen .editor-body { min-height: 62vh; } /* 铺开态正文更高 */
@media (prefers-reduced-motion: reduce) { .editor-focus-btn, .tool-btn { transition: none; } }
@media (max-width: 719px) {
  .editor-focus-toggle { display: none; } /* 移动端不提供铺开（窄屏本就全宽），「稿」仍须可达 */
  .editor-drafts-btn { right: 1.3rem; }
}
/* ---- 页面内工具栏冻结（§5b v3.20 §2）：三脸皆启（笔记脸经「更多」展开、工具栏 order:0 上移）；
   铺开态/窄屏不启 ---- */
.editor--article:not(.editor-fullscreen) .editor-tools,
.editor--excerpt:not(.editor-fullscreen) .editor-tools,
.editor--note:not(.editor-fullscreen) .editor-tools,
.editor--memory:not(.editor-fullscreen) .editor-tools {
  position: sticky; top: var(--nav-height); z-index: 4; /* nav=10、系浮层=5/6 之下；正文（z1）之上 */
  transition: background 0.3s, backdrop-filter 0.3s, border-color 0.3s;
}
.editor--article:not(.editor-fullscreen) .editor-tools.is-stuck,
.editor--excerpt:not(.editor-fullscreen) .editor-tools.is-stuck,
.editor--note:not(.editor-fullscreen) .editor-tools.is-stuck,
.editor--memory:not(.editor-fullscreen) .editor-tools.is-stuck { /* 冻结态：复用 nav.scrolled 语言 */
  background: color-mix(in srgb, var(--surface) 88%, transparent);
  -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
  border-bottom: 1px solid var(--line);
}
@media (prefers-reduced-motion: reduce) { /* 同特异性 (0,3,0) 方能覆盖 sticky 规则的 transition */
  .editor--article:not(.editor-fullscreen) .editor-tools,
  .editor--excerpt:not(.editor-fullscreen) .editor-tools,
  .editor--note:not(.editor-fullscreen) .editor-tools,
  .editor--memory:not(.editor-fullscreen) .editor-tools { transition: none; } /* 直切无过渡 */
}
@media (max-width: 719px) { /* 窄屏禁用冻结（§2 边界：换行占屏，写作走铺开/系统输入条）——
  须与 sticky 规则同特异性 (0,3,0) 且置于其后方能覆盖 */
  .editor--article:not(.editor-fullscreen) .editor-tools,
  .editor--excerpt:not(.editor-fullscreen) .editor-tools,
  .editor--note:not(.editor-fullscreen) .editor-tools,
  .editor--memory:not(.editor-fullscreen) .editor-tools { position: static; }
}
@media (pointer: coarse) and (min-width: 720px) {
  .editor--article:not(.editor-fullscreen) .editor-tools,
  .editor--excerpt:not(.editor-fullscreen) .editor-tools,
  .editor--note:not(.editor-fullscreen) .editor-tools,
  .editor--memory:not(.editor-fullscreen) .editor-tools { top: var(--nav-safe-height); }
}
.editor-wordcount {
  position: absolute;
  right: 0.55rem;
  bottom: 0.5rem;
  font-size: 0.68rem;
  color: var(--text-dim);
  opacity: 0.6;
  pointer-events: none;
  user-select: none;
}
/* 草稿自救横条（§5b v3.18）：静态一行，mirror-touch 语言的两枚字钮 */
.editor-draft-bar {
  display: flex;
  align-items: center;
  gap: 0.7rem;
  padding: 0.4rem 0.6rem;
  margin-bottom: 0.6rem;
  border: 1px solid var(--line);
  border-radius: 4px;
  background: color-mix(in srgb, var(--sun) 8%, transparent);
  font-size: 0.8rem;
}
.editor-draft-bar[hidden] { display: none; }
.editor-draft-msg { color: var(--text-dim); }
.editor-draft-btn {
  background: none;
  border: none;
  padding: 0.1rem 0.2rem;
  font-size: 0.8rem;
  color: var(--moon);
  cursor: pointer;
}
.editor-draft-btn:last-child { color: var(--text-dim); } /* 弃去更低调 */
.editor-actions { display: flex; flex-wrap: wrap; gap: 0.6rem; }
.editor-btn {
  background: var(--surface);
  color: var(--text);
  border: 1px solid var(--line);
  border-radius: 4px;
  padding: 0.35rem 1.1rem;
  font-size: 0.82rem;
  cursor: pointer;
  transition: border-color 0.3s, color 0.3s;
}
.editor-btn:hover:not(:disabled) { border-color: var(--sun); color: var(--sun); }
.editor-btn:disabled { opacity: 0.45; cursor: default; }
.editor-submit {
  border-color: color-mix(in srgb, var(--sun) 46%, var(--line));
  background: color-mix(in srgb, var(--sun) 5%, var(--surface));
}
.editor--destination-heart .editor-submit {
  border-color: color-mix(in srgb, var(--moon) 54%, var(--line));
  background: color-mix(in srgb, var(--moon) 6%, var(--surface));
}
.editor--destination-heart .editor-submit:hover:not(:disabled),
.editor--destination-heart .editor-submit:focus-visible {
  border-color: var(--moon);
  color: var(--moon);
}
.editor-status { font-size: 0.78rem; color: var(--text-dim); min-height: 1.1em; }
.editor-preview {
  border-top: 1px solid var(--line);
  padding-top: 1.2rem;
}

/* ===================== 一个编辑器，统一形态（§5b v3.48） =====================
   同一 DOM，kind 仅驱动领衔字段显隐/顺序（root flex column，gap 0.9rem）；
   四 kind 其余字段/全套工具栏/附件/「系」全部常显。v3.17「四张脸」与「更多」
   折叠机制、摘抄工具栏收敛（data-doc）均退役记档。 */
/* 首尾锚定：heading/routing 恒顶，actions/status/preview 恒底 */
.editor-heading { order: -20; }
.editor-routing { order: -10; }
.editor-actions { order: 90; }
.editor-status { order: 91; }
.editor-preview { order: 92; }
/* 摘抄/记忆专属件默认隐藏（base 低特异性，face 规则更高特异性覆盖显示） */
.editor-src-row { display: none; gap: 0.6rem; flex-wrap: wrap; }
.editor-src-row .editor-input { flex: 1 1 10rem; min-width: 0; } /* 作品/章节等分 */
@media (max-width: 460px) { .editor-src-row .editor-input { flex-basis: 100%; } } /* 窄屏堆叠 */

/* 摘抄：领衔 作者→作品+章节→（文章自然序） */
.editor--excerpt .editor-src-row { display: flex; }
.editor--excerpt .ed-title { order: 1; }
.editor--excerpt .editor-src-row { order: 2; }

/* 记忆：忆时四段领衔（它的脸面），其余与文章同 */
.editor--memory .editor-mem-row { display: flex; }
.editor--memory .editor-mem-row { order: -1; }

/* 笔记 = 文章（零专属规则；placeholder 由 JS 按 kind 注入） */

@media (max-width: 719px) {
  .footer { flex-direction: column; gap: 0.6rem; align-items: flex-start; }
  .lock-input { width: 9rem; }
}

/* ---- 降级动效（DESIGN.md §4：reduced-motion 关闭全部动效，日月静止于均衡态）---- */
@media (prefers-reduced-motion: reduce) {
  .rise, .rise-fade { animation: none; }
  html { transition: none; }
  .sky .moon-glow { animation: none; opacity: calc(var(--moon-w) * 0.16); }
  .sky .sun-glow { animation: none; opacity: calc(var(--sun-w) * 0.14); }
}

/* ---- 移动端（<720px，DESIGN.md §6）---- */
@media (max-width: 719px) {
  .hero {
    min-height: 86vh;
    min-height: 86svh;
    flex-direction: column;
    justify-content: center;
    align-items: flex-start;
    gap: 2.6rem;
    padding: 0 max(1.25rem, var(--safe-area-right)) 0 max(1.25rem, var(--safe-area-left)); /* v2.7：与 .section 内边距一致；横屏避开刘海 */
  }
  .vertical-motto {
    /* relative 兼作 .seal-pings 清单笺的定位锚（v3.23 评审修）。
       桌面规则的 top:50%/right:1.5rem 在 static 下被忽略、在 relative 下会变成
       真偏移（实测拽下 287px、左移 24px），必须显式归零 */
    position: relative;
    top: auto;
    right: auto;
    transform: none;
    flex-direction: row;
    align-items: center;
    gap: 0.9rem;
  }
  .v-text { writing-mode: horizontal-tb; letter-spacing: 0.4em; font-size: 1rem; }
  .seal { width: 24px; height: 24px; font-size: 0.85rem; }

  .hero-avatar { width: 64px; height: 64px; margin-bottom: 1.2rem; }

  /* 窄屏栏目收为一张下拉笺；字貌沿用站训 serif，三横线承担唯一常驻入口。 */
  .nav-inner {
    box-sizing: border-box;
    min-height: var(--nav-height);
    padding: 0.625rem var(--band-pad);
    align-items: center;
  }
  .nav:not(.nav-menu-ready) .nav-links {
    flex-wrap: wrap;
    justify-content: flex-end;
    gap: 0.35rem 0.8rem;
    font-size: 0.8rem;
  }
  /* JS 就绪后才收起横排链接；脚本失败时仍保留可访问的普通导航。 */
  .nav.nav-menu-ready .nav-menu-toggle { display: inline-flex; flex: 0 0 44px; }
  .nav.nav-menu-ready .nav-links {
    position: absolute;
    top: calc(100% + 0.45rem);
    right: var(--band-pad);
    display: none;
    width: min(12rem, calc(100vw - 2 * var(--band-pad)));
    max-height: calc(100vh - var(--nav-height) - 0.9rem - env(safe-area-inset-bottom, 0px));
    max-height: calc(100dvh - var(--nav-height) - 0.9rem - env(safe-area-inset-bottom, 0px));
    padding: 0.35rem;
    flex-direction: column;
    align-items: stretch;
    gap: 0;
    border: 1px solid var(--line);
    border-radius: 4px;
    background: color-mix(in srgb, var(--surface) 94%, var(--bg));
    box-shadow: 0 12px 32px color-mix(in srgb, var(--sky) 32%, transparent);
    overflow-y: auto;
    overscroll-behavior: contain;
    scrollbar-width: thin;
    -webkit-overflow-scrolling: touch;
    font-size: 1.02rem;
    line-height: 1.55;
    letter-spacing: 0.06em;
  }
  .nav.nav-menu-ready.is-menu-open {
    background: color-mix(in srgb, var(--surface) 88%, transparent);
    -webkit-backdrop-filter: blur(10px);
    backdrop-filter: blur(10px);
    border-bottom-color: var(--line);
  }
  .nav.nav-menu-ready.is-menu-open .nav-links { display: flex; }
  .nav.nav-menu-ready .nav-links a:not([hidden]),
  .nav.nav-menu-ready .nav-links button:not([hidden]) {
    min-height: 44px;
    display: flex;
    align-items: center;
    justify-content: flex-end;
    padding: 0.5rem 0.75rem;
    border-radius: 3px;
    white-space: nowrap;
    text-align: right;
  }
  .nav.nav-menu-ready .nav-links a:hover,
  .nav.nav-menu-ready .nav-links a:focus-visible,
  .nav.nav-menu-ready .nav-links button:hover,
  .nav.nav-menu-ready .nav-links button:focus-visible {
    background: color-mix(in srgb, var(--moon) 7%, transparent);
  }
  .nav.nav-menu-ready .nav-links a:focus-visible,
  .nav.nav-menu-ready .nav-links button:focus-visible {
    outline: 1px solid var(--moon);
    outline-offset: -3px;
  }
  .brand { font-size: 0.98rem; }

  /* 移动端标题缩到窄屏放得下（v2.7）：桌面 clamp 不变，仅此断点内覆盖；
     "Gloamirror" 文字墨迹须落在内容栏内，否则横向溢出（320 实测根因）。
     .mirror 同步，倒影与主体等宽。 */
  .site-title, .mirror { font-size: clamp(2.3rem, 11vw, 3.6rem); }

  /* 天体尺寸/锚点的窄屏定义统一在 .sky 锚点变量块（6.3.1），此处不再散落坐标 */

  .section { padding: 4rem 1.25rem 3.4rem; }

  .entry { flex-wrap: wrap; gap: 0.35rem 1rem; }
  .entry-meta { width: 100%; }
  .entry .arrow { right: 3px; bottom: calc(1.05rem + 0.48em); margin-left: 0; }

  .gb-entry { flex-direction: column; gap: 0.35rem; }
  .gb-meta { flex-direction: row; gap: 0.9rem; }

  /* Box 与账本左缘对齐：.section 本断点收 1.25rem，Box 同步（评审项；
     :not() 链保持特异性，裸类会被上方 (0,3,0) 规则压掉） */
  .box-zone:not([hidden]):not(.is-empty) { padding: 0 1.25rem; }
  .life-tree-zone:not([hidden]):not(.is-empty) { padding-inline: 1.25rem; }
  .box-frame { padding-bottom: 1rem; }
  .box-rail { --showcase-peek: clamp(1.45rem, 7vw, 2.25rem); }
  .life-tree-rail {
    --life-tree-card: min(17.5rem, calc(100vw - 7rem));
    --showcase-peek: calc((100% - var(--life-tree-card)) / 2);
    grid-auto-columns: var(--life-tree-card);
    gap: 0.65rem;
  }
  .box-card { height: 10.5rem; min-height: 0; }
  .box-card.is-text .box-card-copy { min-height: 0; padding: 0.85rem 0.85rem 0.3rem; }
  .box-card.is-mixed { min-height: 0; grid-template-columns: minmax(0, 43%) minmax(0, 57%); }
  .box-card-media { grid-template-columns: 1fr; }
  .box-card.is-image .box-card-media { grid-template-columns: 1fr; }
  .box-card-frame:nth-of-type(n + 2) { display: none; }
  .box-card.is-image .box-card-frame,
  .box-card.is-mixed .box-card-frame { height: 100%; min-height: 0; }
  .box-card.is-mixed .box-card-media { padding: 0.65rem 0 0.65rem 0.6rem; }
  .box-card.is-mixed.is-reverse .box-card-media { padding: 0.65rem 0.6rem 0.65rem 0; }
  .box-card-copy { padding: 0.72rem 0.72rem 0.2rem; }
  .box-card.is-image .box-card-copy { padding: 0.1rem 0.6rem 0; }
  .box-card-text { font-size: 0.93rem; -webkit-line-clamp: 2; }
  .box-card-meta { flex-direction: column; gap: 0.05rem; font-size: 0.61rem; }
  .box-card-categories { max-width: 6.5rem; }
  .life-tree-label { margin-bottom: 1.15rem; font-size: clamp(1.16rem, 5.2vw, 1.42rem); }
  .life-tree-origin {
    height: 2.75rem;
    min-height: 0;
    padding: 0.5rem 0.7rem;
  }
  .life-tree-source { color: var(--text-dim); font-size: 0.78rem; }
  .life-tree-meta { gap: 0.5rem; font-size: 0.62rem; }
  .entry-title--media { flex: 1 1 auto; }
  .entry-media-preview { width: 4.3rem; }
}
/* 正心三档固定内容列：320px 验收面给 274px；360–719px 给 344px；桌面给
   474px。只有 #home-heart-stream 需要与已经烘焙的 raster 严格 1:1；普通
   公开账本按 section 的真实可用宽度流动，不能把正心隐私投影的栅格外溢成
   折叠屏上的人为窄栏。 */
@media (max-width: 359px) {
  #home-heart-stream .ledger .entry,
  #home-heart-stream .ledger .entry-body { width: 280px; max-width: 280px; }
  #home-heart-stream .ledger .entry-title { max-width: 245px; }
}
@media (min-width: 360px) and (max-width: 719px) {
  #writing.section { padding-inline: min(1.25rem, max(5px, calc((100vw - 350px) / 2))); }
  #home-heart-stream .ledger .entry,
  #home-heart-stream .ledger .entry-body { width: 350px; max-width: 350px; }
  #home-heart-stream .ledger .entry-title { max-width: 315px; }
}
@media (max-width: 374px) {
  .box-label { font-size: 1.55rem; }
  .box-label::before { width: calc(100vw - 4rem); }
  .life-tree-title-word { gap: 0.06em; padding-right: 0.42em; padding-left: 0.42em; }
}

@media (max-width: 719px) and (prefers-reduced-motion: no-preference) {
  .nav.nav-menu-ready.is-menu-open .nav-links { animation: rise-fade 0.22s ease both; }
}

/* ===================== 昼态（DESIGN.md v3.0 §1b/§3g 第二皮肤） =====================
   触发：点击 hero 月亮（app.js 隐晦彩蛋，无任何提示）；默认永远是夜。
   原则：日月角色对调、文字对差色、光晕在亮底减半、镜面辉光换深投影。 */
html.day {
  --bg: #E9ECF1;
  --surface: #DDE2EA;
  --line: rgba(35, 39, 47, 0.16);
  --text: #23272F;
  --text-dim: #5A6372;
  --moon: #46536A; /* 月极转暮蓝灰（亮底可读 ≈6.6:1） */
  --sun: #7A5C3D; /* 日极转深铜（亮底可读 ≈5.2:1） */
  --link: #5D4779; /* 灰紫在浅底／surface 上仍保持 AA，并与暮蓝灰 hover 分层 */
  --sky: #F3F5F9; /* 昼空最亮，地平线仍是明度分界 */
}
/* 昼夜切换的平滑感由日月权重变量的既有缓动承担（月沉日升 1.4s/0.7s）；
   色彩直切——var 继承驱动的 color/background 过渡在 Chromium 会卡死（实测），不做 */
/* v3.2 昼夜交接几何：H/L 镜像坐标互换——昼态日在 H（夜的月锚）、月在 L（夜的日锚）。
   同一组锚点变量经类互换，升到的高度精确等于对方切换前的高度（DESIGN §3g 硬约束） */
html.day .celestial--moon { left: var(--sun-x); top: auto; bottom: 0; }
html.day .celestial--sun { left: var(--moon-x); top: var(--moon-y); bottom: auto; }
/* 天体：昼态月牙转暮蓝灰描边、日升为满圆日盘（不再半沉） */
html.day .moon { box-shadow: inset -9px 7px 0 0 rgba(70, 83, 106, 0.85); }
html.day .sun-arc { border-color: rgba(122, 92, 61, 0.95); border-bottom-color: rgba(122, 92, 61, 0.95); }
/* 落定微光脉冲：一次性，不循环（DESIGN §3g） */
@keyframes celestial-pulse {
  0%, 100% { filter: brightness(1); }
  35% { filter: brightness(2); }
}
/* 只脉冲天体本体：光晕的 opacity 全靠 breathe 关键帧驱动，
   animation 简写会顶掉 breathe 使晕跳到 opacity:1 硬闪（评审 #1） */
.celestial--pulse .moon,
.celestial--pulse .sun-arc { animation: celestial-pulse 0.45s ease-out 1; }
/* v3.44 昼夜自触处张开（§3g 圆启归位）：圆启改声明式——触点即圆心。
   --vt-x/y/r 由 app.js 于捕获前置写入（被击天体锚点=视口系=VT 伪元素系）。
   旧 WAAPI 路径退役：其挂载须候 vt.ready，异步缝内新快照无 clip 裸帧全屏
   闪现（old 又禁了淡出）——「闪后再张」即历次「错位」观感主犯；声明式自
   伪元素诞生即由 CSS 驱动，零缝。
   v3.45：坐标与半径改**视口百分比**——Chrome 150.0.7871 起 VT clip-path 的
   长度值在 dpr≠1 时按 1/dpr 缩放渲染（px 圆心随之错位；Edge 无此病）；
   百分比相对伪元素参照盒解析，与坐标系缩放无关；R=150%（以参照盒
   sqrt(w²+h²)/√2 为基）恒覆盖最远角，替 v3.44 px 实算。
   旧快照禁默认淡出、居下自然退场；时长曲线沿现制 0.9s ease-in-out 不改。 */
@media (prefers-reduced-motion: no-preference) {
  ::view-transition-old(root) { animation: none; }
  ::view-transition-new(root) { animation: vt-circle-open 0.9s ease-in-out both; }
}
@keyframes vt-circle-open {
  from { clip-path: circle(0% at var(--vt-x, 50%) var(--vt-y, 50%)); }
  to { clip-path: circle(var(--vt-r, 150%) at var(--vt-x, 50%) var(--vt-y, 50%)); }
}
/* reduced 直切（v3.44 批文令，改旧「保留默认淡化」）：双快照零动画即瞬换 */
@media (prefers-reduced-motion: reduce) {
  ::view-transition-old(root),
  ::view-transition-new(root) { animation: none; }
}
@media (max-width: 719px) {
  html.day .moon { box-shadow: inset -7px 5px 0 0 rgba(70, 83, 106, 0.85); }
}
/* 光晕：亮底减半（呼吸乘数减半 + 色相转对差） */
html.day .moon-glow {
  background: radial-gradient(closest-side, rgba(70, 83, 106, 0.7), transparent 72%);
  animation-name: breathe-moon-day;
}
html.day .sun-glow {
  background: radial-gradient(closest-side, rgba(160, 118, 68, 0.8), transparent 72%);
  animation-name: breathe-sun-day;
}
@keyframes breathe-moon-day {
  0%, 100% { opacity: calc(var(--moon-w) * 0.10); }
  50% { opacity: calc(var(--moon-w) * 0.15); }
}
@keyframes breathe-sun-day {
  0%, 100% { opacity: calc(var(--sun-w) * 0.11); }
  50% { opacity: calc(var(--sun-w) * 0.16); }
}
/* 地平线：昼态双色换深色调（亮底上线要深） */
html.day .horizon {
  background: linear-gradient(90deg,
    transparent 0%,
    rgba(70, 83, 106, 0.75) 26%,
    rgba(70, 83, 106, 0.15) 57%,
    rgba(122, 92, 61, 0.15) 59%,
    rgba(122, 92, 61, 0.8) 82%,
    transparent 100%);
}
html.day .horizon--sky::before {
  background: linear-gradient(90deg,
    transparent 0, transparent calc(var(--band-pad) + 2.8rem),
    rgba(70, 83, 106, 0.75) 26%, rgba(70, 83, 106, 0.12) 58%, transparent 62%);
}
html.day .horizon--sky::after {
  background: linear-gradient(90deg,
    transparent 54%, rgba(122, 92, 61, 0.12) 58%, rgba(122, 92, 61, 0.8) 82%,
    transparent calc(100% - var(--band-pad) - 2.8rem), transparent 100%);
}
/* 镜面：主朦镜清逻辑不变，辉光换深色弱投影、水线转深 */
html.day .site-title { text-shadow: 0 0 18px rgba(35, 39, 47, 0.22); }
html.day .waterline { background: rgba(35, 39, 47, 0.18); }
/* 导航滚动底：亮态半透明银白 */
html.day .nav.scrolled { background: rgba(233, 236, 241, 0.85); }

/* ===================== 言语「泡」 =====================
   头像摘句与历史详情共用的半透明圆角囊；夜清冷月银、昼暖白。 */
.bubble {
  background: rgba(35, 40, 48, 0.78);
  border: 1px solid var(--line);
  border-radius: 18px;
  padding: 0.6rem 0.9rem;
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
}
html.day .bubble { background: rgba(233, 236, 241, 0.85); }
.bubble-text {
  font-size: 0.85rem;
  line-height: 1.65;
  color: var(--text);
  margin: 0;
  white-space: pre-line;
}
.bubble-time {
  display: block;
  font-size: 0.62rem;
  color: var(--text-dim);
  margin-top: 0.3rem;
}

/* ===================== 镜面按钮语言 .mirror-touch（§4-10 v3.15） =====================
   动作按钮族极轻起雾、hover 渐清微浮——抽象自「格物致知」标题镜面暗示。
   适用族含 .mirror-touch 显式类 + 既有动作按钮类；排除阅读器官（链接/输入框/星图）。
   中门双题 .gate-title 不入此族（其 hover 是「起雾」反向语义，见 .title-mirror-link）。 */
.mirror-touch,
.editor-btn, .tool-btn, .cat-item, .comment-btn, .entry-edit,
.gate--moon, .gate--sun {
  transition: filter 0.3s ease, transform 0.3s ease, color 0.3s, border-color 0.3s, background-size 0.3s;
}
@media (prefers-reduced-motion: no-preference) {
  .mirror-touch,
  .editor-btn, .tool-btn, .cat-item, .comment-btn, .entry-edit,
  .gate--moon, .gate--sun { filter: blur(0.3px); } /* 常态极轻起雾（按钮须可读） */
  /* 渐清全族生效（filter 独立属性，无冲突） */
  .mirror-touch:hover, .mirror-touch:focus-visible,
  .editor-btn:hover, .editor-btn:focus-visible,
  .tool-btn:hover, .tool-btn:focus-visible,
  .cat-item:hover, .cat-item:focus-visible,
  .comment-btn:hover, .comment-btn:focus-visible,
  .entry-edit:hover, .entry-edit:focus-visible,
  .gate--moon:hover, .gate--moon:focus-visible,
  .gate--sun:hover, .gate--sun:focus-visible { filter: blur(0); }
  /* 微浮 translateY 仅给「无自有 transform」的按钮——门翼(scale)/扇条(translateX)
     各自在其规则内合成 translateY，避免 transform 单属性互斥（评审预判修） */
  .mirror-touch:hover, .mirror-touch:focus-visible,
  .editor-btn:hover, .editor-btn:focus-visible,
  .tool-btn:hover, .tool-btn:focus-visible,
  .cat-item:hover, .cat-item:focus-visible,
  .comment-btn:hover, .comment-btn:focus-visible,
  .entry-edit:hover, .entry-edit:focus-visible { transform: translateY(-1px); }
}

/* ===================== 两翼帘列（§5-12 v3.53「整格悬停带」） =====================
   门词正下方橱窗；绝对定位于满幅书写区两侧余白，不挤中央账本；≥1200px 才渲染。
   v3.53（owner 2026-07-29 判 v3.52 lead=1.5「太密不可分辨」＋「删模糊」＋「补截取视觉」）：
   帘条改流式列（flex column），行盒紧贴无死区 → hover 锁定整格背景带（Primer NavList 式）、
   不在缝隙锐化闪跳；截断改 CSS 省略号，hover/focus 解夹展开全文向外侧余白溢出（背离阅读栏，
   WCAG 1.4.12「聚焦即现全文」）；模糊 filter 已删，只余透明度后退承「入夜」。Dock 波移仍复用 --w。 */
.fan {
  position: absolute;
  top: calc(100% + 0.4rem);
  z-index: 1; /* 在侧余白，不与中央账本争 */
  display: flex;
  flex-direction: column;
  width: var(--fan-maxw, 200px); /* JS 实算余白宽（省略号夹取上限）；整格悬停带满此宽 */
}
.fan[hidden] { display: none; }
body.editor-open .fan { visibility: hidden; } /* 页面内编辑器推移账本首行：帘暂隐（评审修） */
.fan--left { left: var(--band-pad); --fan-accent: var(--moon); }
.fan--right { right: var(--band-pad); --fan-accent: var(--sun); }
/* 帘轴（§5-12「为帘立骨」）：纵向 hairline 立于**近阅读栏一侧**，帘自轴悬垂——爻线母题转纵。
   透明度随入夜连续淡出（线性渐变 → transparent，与条目衰减同向）；高由 JS 写 --fan-drop。
   文字贴轴（左翼右锚/右翼左锚），静态省略号收边，轴缘恒定。窄屏/空态帘不渲染，轴随之不见 */
.fan::before {
  content: "";
  position: absolute;
  top: 0;
  width: 1px;
  height: var(--fan-drop, 0);
  background: linear-gradient(to bottom,
    color-mix(in srgb, var(--fan-accent) 24%, var(--line)),
    var(--line) 18%, transparent);
}
.fan--left::before { right: 0; }  /* 左翼近栏侧=右缘 */
.fan--right::before { left: 0; }  /* 右翼近栏侧=左缘（镜像） */
.fan-item {
  --w: 0;
  --ct: 0; /* 衰减曲线值（JS 逐条写入，连续缓入 §1）：0=首条 1=末条 */
  --curMin: 0.4; /* 末端明度下限（夜）；相邻差 ≤ 全程 1/10——数不出换挡点（验收标准入档） */
  position: relative; /* hover 抬 z-index 令悬停带压邻行 */
  display: block;
  box-sizing: border-box;
  width: 100%;
  padding: 3px 10px;
  border-radius: 5px;
  color: var(--text);
  text-decoration: none;
  /* opacity 由曲线值合成（连续无段）；波移 --w 自静态值 lerp 向峰值（拂帘提亮，离开缓回） */
  --fop: calc(1 - (1 - var(--curMin)) * var(--ct));
  opacity: calc(var(--fop) + var(--w) * (1 - var(--fop)));
  transition: opacity 0.18s ease-out, color 0.18s ease-out,
    background-color 0.18s ease-out, transform 0.18s ease-out;
}
html.day .fan-item { --curMin: 0.48; } /* 昼态亮底融白：下限单调（域整体随之，曲线同一条） */
/* AA 口径（入档）：前 1/3 达标（n≤5 处 op≥0.89）；曲线反推 n≥11（op<0.62）为氛围层豁免 */
.fan--left .fan-item { text-align: right; transform: translateX(calc(var(--w) * -5px)); }  /* 波移外探（左） */
.fan--right .fan-item { text-align: left; transform: translateX(calc(var(--w) * 5px)); }    /* 镜像（右） */
/* 整格悬停带：整条亮起极淡寒银/旧铜背景带 → 命中即锁定，行间无死区可抖 */
.fan-item:hover, .fan-item:focus-visible {
  opacity: 1;
  z-index: 2;
  color: var(--fan-accent);
  background-color: color-mix(in srgb, var(--fan-accent) 13%, transparent);
}
html.day .fan-item:hover, html.day .fan-item:focus-visible {
  background-color: color-mix(in srgb, var(--fan-accent) 15%, transparent);
}
.fan-item:focus-visible { outline: 1px solid var(--fan-accent); outline-offset: 2px; }
.fan-text {
  display: block;
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis; /* 静态省略号收边（废渐隐蒙版：语义清晰、不似故障） */
  white-space: nowrap;
  font-family: var(--font-serif);
  font-kerning: normal;
  letter-spacing: 0.025em;
  line-height: 1.6; /* 条距承载：随字号微收自然渐密（§0），行盒紧贴无死区 */
}
@media (prefers-reduced-motion: reduce), (not (pointer: fine)) {
  .fan-item { transition: none; }
}

/* 独数加冕（§3g v3.26.1）：新主导天体的数值——脉冲的余韵，天体射出的最后一粒光。
   仅 transform/opacity；挂天体锚点组内随组走弧；辉光 color-mix 自色板取、静态值直切；
   落点体上外侧 64px（v3.50 改上：原体下 64px 在地平线下、部分视口高度落入居中头像区被遮，
   改置天体上方空侧，两天体皆离中央内容区；60px 命中圈外一丝、光晕边缘外） */
.glow-num {
  position: absolute; left: 0; top: -64px;
  font-family: var(--font-mono); font-weight: 400;
  font-variant-numeric: tabular-nums; letter-spacing: 0.04em; white-space: nowrap;
  color: var(--text);
  opacity: 0;
  transform: translate(-50%, var(--gslide, 14px)) scale(0.6);
  /* 落成曲线复用射光卡 cubic-bezier（血亲语言）：末端极轻过冲回稳 */
  transition: transform 0.45s cubic-bezier(0.2, 0.85, 0.25, 1.08), opacity 0.45s ease;
  pointer-events: none; z-index: 3;
}
.glow-num.gd1 { font-size: 1.15rem; } /* 位数三档单源：个位/两位/三位+ */
.glow-num.gd2 { font-size: 1.05rem; }
.glow-num.gd3 { font-size: 0.95rem; }
.glow-num.glow-sun { text-shadow: 0 0 12px color-mix(in srgb, var(--sun) 50%, transparent); } /* 铜辉 */
.glow-num.glow-moon { text-shadow: 0 0 12px color-mix(in srgb, var(--moon) 50%, transparent); } /* 银辉 */
html.day .glow-num.glow-sun,
html.day .glow-num.glow-moon { text-shadow: 0 0 6px color-mix(in srgb, var(--text) 28%, transparent); } /* 亮底光要收（§1b） */
.glow-num.is-in { opacity: 1; transform: translate(-50%, 0) scale(1); }
@keyframes glow-breath { 50% { opacity: 0.68; } } /* 驻留一息：≤0.8s 单次，呼应天体 90s 呼吸 */
.glow-num.is-breath { animation: glow-breath 0.8s ease-in-out 1; }
.glow-num.is-out { /* 归去：反向微缩回滑化入天体 */
  transition: transform 0.5s ease-in, opacity 0.5s ease-in;
  opacity: 0; transform: translate(-50%, calc(var(--gslide, 14px) * 0.7)) scale(0.7);
}
@media (max-width: 719px) { .glow-num { top: -60px; } } /* 窄屏光晕内收，落点随之 */
@media (prefers-reduced-motion: reduce) { /* 原地淡入淡出：无滑无呼吸无过冲 */
  .glow-num { transform: translate(-50%, 0) scale(1); transition: opacity 0.3s linear; }
  .glow-num.is-out { transition: opacity 0.4s linear; transform: translate(-50%, 0) scale(1); }
  .glow-num.is-breath { animation: none; }
}

/* 收起/继续并列条（§5-01 v3.29）与浮动收起件（v3.58） */
.more-bar { display: flex; gap: 0.5rem; }
.more-bar .load-more { flex: 1 1 0; }
.moon-mark {
  position: fixed; right: max(12px, env(safe-area-inset-right)); top: 50vh; transform: translateY(-50%);
  z-index: 40;
  display: inline-flex; align-items: center; justify-content: center; gap: 0.45rem;
  min-height: 44px; padding: 0.45rem 0.72rem;
  background: var(--surface); /* 不支持 color-mix 的浏览器回退 */
  background: color-mix(in srgb, var(--surface) 88%, transparent);
  -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
  border: 1px solid var(--line); border-radius: 4px;
  font-size: 0.74rem; letter-spacing: 0.12em; color: var(--text-dim);
  opacity: 0; pointer-events: none; cursor: pointer;
  transition: opacity 0.3s ease, color 0.3s, border-color 0.3s, background-color 0.3s;
}
.moon-mark::before {
  content: ""; display: block; width: 0.72rem; height: 1px;
  background: var(--moon); opacity: 0.72;
}
.moon-mark.is-on { opacity: 0.88; pointer-events: auto; }
.moon-mark.is-on:hover, .moon-mark.is-on:focus-visible {
  opacity: 1; color: var(--moon); border-color: color-mix(in srgb, var(--moon) 55%, var(--line));
  background: color-mix(in srgb, var(--surface) 96%, transparent);
}
.moon-mark:focus-visible { outline: 1px solid var(--moon); outline-offset: 2px; }
@media (max-width: 719px) {
  .moon-mark {
    top: auto; bottom: max(14px, env(safe-area-inset-bottom)); transform: none;
  }
} /* 移动右下角 */
@media (prefers-reduced-motion: reduce) { .moon-mark { transition: none; } } /* 直显直隐 */

/* 账本续载钮（§5-01 v3.28）：低调 mono + mirror-touch 起雾；到底整行消失不写"已到底" */
.load-more {
  display: block; width: 100%;
  min-height: 44px;
  margin: 0.9rem 0 0; padding: 0.55rem 0;
  background: none; border: none;
  font-size: 0.78rem; letter-spacing: 0.12em;
  color: var(--text-dim); cursor: pointer;
  transition: color 0.3s;
}
.load-more:hover:not(:disabled) { color: var(--moon); }
.load-more:disabled { cursor: default; }
.load-more:focus-visible { outline: 1px solid var(--moon); outline-offset: 2px; }

/* 星图渐次点亮（§5-10 v3.27）：补齐包新星自左错峰淡入——一次性入场，仅 opacity */
@keyframes th-lit { from { opacity: 0; } }
.th-node.th-lit { animation: th-lit 0.6s ease both; }
@media (prefers-reduced-motion: reduce) { .th-node.th-lit { animation: none; } }

/* 键盘速览卡（§4-9 v3.27）：气泡卡语言；界面零痕迹，按 ? 方知 */
.kbd-card {
  position: fixed; left: 50%; top: 50%; transform: translate(-50%, -50%);
  width: min(30rem, calc(100vw - 2.4rem));
  max-height: min(78vh, 34rem);
  max-height: min(78dvh, 34rem); overflow-y: auto;
  background: color-mix(in srgb, var(--surface) 90%, transparent);
  -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
  border: 1px solid var(--line); border-radius: 14px;
  padding: 1.1rem 1.3rem 1.2rem;
  z-index: 310; /* 高于铺开编辑器（300）——卡不隐身、Esc 先关最上层（评审修） */
  opacity: 0; transition: opacity 0.25s ease;
  display: grid; grid-template-columns: 1fr 1fr; gap: 0.4rem 1.6rem;
}
.kbd-card.is-on { opacity: 1; }
.kbd-card.kbd-still { transition: none; }
.kbd-title { grid-column: 1 / -1; font-size: 0.7rem; letter-spacing: 0.5em; color: var(--text-dim); margin-bottom: 0.3rem; }
.kbd-gname { font-size: 0.64rem; letter-spacing: 0.24em; color: var(--text-dim); opacity: 0.8; margin: 0.5rem 0 0.35rem; }
.kbd-row { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; padding: 0.16rem 0; }
.kbd-keys { display: inline-flex; align-items: baseline; gap: 0.25rem; font-size: 0.66rem; color: var(--text-dim); white-space: nowrap; }
.kbd-keys kbd {
  font-size: 0.64rem; line-height: 1;
  padding: 0.18rem 0.4rem;
  border: 1px solid var(--line); border-radius: 4px;
  color: var(--text); background: color-mix(in srgb, var(--line) 14%, transparent);
}
.kbd-what { font-size: 0.74rem; color: var(--text); }
/* 昼态巡礼（v3.27 §4）：亮底上 --line 底 wash 近不可见——键帽底与新旧分隔线各提半档 */
html.day .kbd-keys kbd { background: color-mix(in srgb, var(--text) 6%, transparent); }
html.day .ping-divider { opacity: 0.9; }
@media (max-width: 719px) {
  .kbd-card {
    grid-template-columns: 1fr;
    max-height: 72vh;
    max-height: 72dvh;
  }
} /* 窄屏单列 */

/* 留言板对齐 v3.18 书写语言（§4 v3.27 清扫；功能零改动）：稿纸化——去方框、底 hairline、
   聚焦转寒银；雅名立起来（字距+明度） */
.gb-form textarea {
  background: transparent;
  border: none; border-bottom: 1px solid var(--line); border-radius: 0;
  padding: 0.6rem 0.15rem;
}
.gb-form textarea:focus { border-bottom-color: var(--moon); }
.gb-who { letter-spacing: 0.08em; color: var(--text); opacity: 0.82; }

/* 视觉隐藏、读屏可达（v3.21 言语泡活区等） */
.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; }
/* ---- 头像言语泡（§3f v3.21）：单击头像迸射一只带尾巴的泡 ---- */
:root { --say-bg: rgba(35, 40, 48, 0.92); }
html.day { --say-bg: rgba(233, 236, 241, 0.94); }
.hero-say {
  position: absolute; z-index: 4; /* 高于镜面标题(z1)、低于 nav(z10) */
  width: min(20rem, 62vw);
  background: var(--say-bg); /* 覆盖 .bubble 半透明底，供尾巴同色 */
  border-radius: 16px;
  will-change: transform, opacity;
  cursor: pointer;
}
.hero-say-link { display: block; color: inherit; text-decoration: none; }
.hero-say-link:focus-visible { outline: 2px solid var(--moon); outline-offset: 3px; border-radius: 12px; }
.hero-say .bubble-text { margin: 0; }
.hero-say-text.is-faded { /* 60 字二次上限溢出：末尾 mask 渐隐（不用省略号，同账本/扇列——话没说完，点进去看）*/
  -webkit-mask-image: linear-gradient(180deg, #000 66%, transparent 100%);
  mask-image: linear-gradient(180deg, #000 66%, transparent 100%);
}
.hero-say--empty { font-size: 1.05rem; color: var(--text-dim); text-align: center; letter-spacing: 0.12em; }
/* 尾巴：CSS border 三角（无图标资源），恒指头像中心，随方向变朝 */
/* 尾巴规格单源（v3.21.1）：--say-tail-l 尾长（外露 l−2px ≈12px）、--say-tail-p 根部半宽
   （长而不针、根部与尾长协调不齿）；2px 嵌入泡内盖接缝；落位由 JS 按头像投影微调 */
.hero-say-tail { --say-tail-l: 14px; --say-tail-p: 8px; position: absolute; width: 0; height: 0; border: 0 solid transparent; }
.hero-say--e .hero-say-tail { /* 泡在头像右：左缘尾，指左 */
  left: calc(2px - var(--say-tail-l)); top: 50%; margin-top: calc(var(--say-tail-p) * -1);
  border-top-width: var(--say-tail-p); border-bottom-width: var(--say-tail-p);
  border-right-width: var(--say-tail-l); border-right-color: var(--say-bg);
}
.hero-say--ne .hero-say-tail { /* 泡在右上：下缘尾，指下 */
  left: 16px; bottom: calc(2px - var(--say-tail-l));
  border-left-width: var(--say-tail-p); border-right-width: var(--say-tail-p);
  border-top-width: var(--say-tail-l); border-top-color: var(--say-bg);
}
.hero-say--se .hero-say-tail, .hero-say--s .hero-say-tail { /* 泡在右下/下：上缘尾，指上 */
  left: 16px; top: calc(2px - var(--say-tail-l));
  border-left-width: var(--say-tail-p); border-right-width: var(--say-tail-p);
  border-bottom-width: var(--say-tail-l); border-bottom-color: var(--say-bg);
}
@media (max-width: 719px) { /* 窄屏尾巴随 64px 头像收一档（§3f v3.21.2）：长 11、根 14 */
  .hero-say-tail { --say-tail-l: 11px; --say-tail-p: 7px; }
}
@media (prefers-reduced-motion: reduce) { .hero-say { will-change: auto; } }

/* ---- 单条直达视图（#/bubble/<id>） ---- */
.bubble--view {
  max-width: 26rem;
  margin: 1rem 0;
}
.bubble--view .bubble-text { font-size: 0.95rem; }

/* ===================== 文脉星图（DESIGN §5-10 v3.12·第 1 轮） =====================
   满宽带底 --sky（§1 受控例外：第二片天穹）；序位等距、新在右；三形节点
   圆/方印/闭合整环（灰度可辨，色仅微染）；Box=唯一强调；年份界标=轴向标注全部。 */
/* ===================== 一线天（DESIGN §5-10 v3.40 重写） =====================
   北辰为门（v3.41 迁高更名，v3.40 立「长庚」），文脉入天缝：上线＝.horizon--sky 原位不动，下线（.rift-floor）裂离下移，
   线间迁入星图。grid-template-rows 0fr→1fr 连续开合（§4 白名单「一线天开合」，
   本批唯一新增；≤0.45s；reduced 直切）；不占 hash、不入历史（内联状态非模态）。 */
.rift {
  display: grid;
  grid-template-rows: 0fr;
  transition: grid-template-rows 0.45s ease;
  position: relative;
  background: var(--sky);
}
.rift.is-open { grid-template-rows: 1fr; }
.rift[hidden] { display: none; } /* listChrome 隐藏（Mirror/流）：显式 display 须让位 hidden */
/* min-width/height 双零：grid item 的 auto 最小尺寸以内容 max-content 作地板——
   缺 height 半边则 0fr 收不拢，缺 width 半边则星图 inner 宽把隐式列撑出视口（横滚）。
   恒 hidden：锁定卡已按实高账收带内（见下锁定态附则），「溢界放行」无受益者，
   v3.40 评审裁撤 is-settled 放行机制（strip 的 y-hidden 本就拦断放行链，虚设条款） */
.rift-clip { overflow: hidden; min-height: 0; min-width: 0; position: relative; }
/* 线间高（实测定值，DESIGN §5-10）：桌面 220px；≤887 190px（v3.46 自 170 改定——
   旧 170 账下 t2 卡顶恰 0px 与上线零净空，owner 截图实证；卡高实测 ~38px（非旧账 35），
   190 = 最顶行卡获 ≥13px 净空且层间间隙守 3px 下限的最小带高。
   天侧内衬 ≥13px：最顶行卡与上线恒有净空，与水平 24px 安全内衬同族。
   卡高单行制前提——v3.41 时缀制下由 .th-card 自设 0.55rem 字号压 strut 维持） */
.threads-band { height: 220px; }
@media (max-width: 887px) {
  .threads-band { height: 190px; }
}
/* 下线：地平线银铜渐变 hairline，静态 ~0.7 峰（界明于脉：界 0.7 > 脉 0.45）；
   合拢态高 0 且透明（评审修：1px 常驻高＋天色底会给主页添一条异色衬带、
   全站几何下移 1px——「Hero 其余几何不动」破口），开启即随缝下移并现身 */
.rift-floor {
  height: 0;
  background: linear-gradient(90deg,
    transparent 0%, rgba(211, 217, 228, 0.7) 26%, rgba(211, 217, 228, 0.12) 57%,
    rgba(181, 151, 122, 0.12) 59%, rgba(181, 151, 122, 0.66) 82%, transparent 100%);
  opacity: 0;
  transition: opacity 0.3s ease;
}
html.day .rift-floor {
  background: linear-gradient(90deg,
    transparent 0%, rgba(70, 83, 106, 0.7) 26%, rgba(70, 83, 106, 0.12) 57%,
    rgba(122, 92, 61, 0.12) 59%, rgba(122, 92, 61, 0.66) 82%, transparent 100%);
}
.rift.is-open .rift-floor { height: 1px; opacity: 1; } /* 高 0→1px 直切（1px 非动效） */
/* 合口（§5-10 v3.40）：一线天右端上下两线收拢之尖——线之收口即门之合扇，
   无图标无文字（aria-label 承名）；44px 透明热区；仅开态在场（合拢态不留悬钮） */
.rift-seam {
  position: absolute;
  right: 6px; top: 50%;
  width: 44px; height: 44px;
  transform: translateY(-50%);
  background: none; border: none; cursor: pointer;
  padding: 0;
  display: none;
  z-index: 2; /* 常态节点之上、锁定卡（z:3）之下 */
  opacity: 0.55;
  transition: opacity 0.3s ease; /* 悬停微亮，归既有淡入淡出族 */
}
.rift.is-open .rift-seam { display: block; }
.rift-seam:hover, .rift-seam:focus-visible { opacity: 1; }
.rift-seam:focus-visible { outline: 1px solid var(--moon); outline-offset: 2px; }
/* 尖形＝两条 hairline 自尖点向左张开（上线自左上收来、下线自左下收来） */
.rift-seam::before, .rift-seam::after {
  content: "";
  position: absolute;
  right: 12px; top: 50%;
  width: 16px; height: 1px;
  background: rgba(211, 217, 228, 0.75);
  transform-origin: right center;
}
.rift-seam::before { transform: rotate(14deg); }
.rift-seam::after { transform: rotate(-14deg); }
html.day .rift-seam::before, html.day .rift-seam::after { background: rgba(70, 83, 106, 0.75); }
/* 昼态静息对比补正（评审 LOW：0.55×0.75 在昼底上 ≈1.9:1 低于非文本 3:1；
   昼无北辰，合口是首要关途——静息提至 0.85 得 ≈3.1:1，隐晦与 AA 的折中） */
html.day .rift-seam { opacity: 0.85; }

/* ---- 北辰（§3b v3.40 立「长庚」·v3.41 迁高更名）：夜之独有一粒星，文脉之门——
   昼态 DOM 绝迹（JS 摘除）。「譬如北辰，居其所而众星共之」——迁位中天高处
   （题之上方偏右带），昏星旧名不再切位，北辰居所不移恰配常驻之门；
   启明／长庚旧名退役记档。热区 44px；与高位（当前状态揭示）/低位（换昼夜）双天体
   60px 热区圆边缘各距 ≥16px（中心距各 ≥107px 硬指标——v3.41 升级为对双天体各计；
   夜态高位=月锚分档〔桌面 20%/16%+21px·≤719 18%/14%+15px·≤480 21%〕：
   实测 320 档 127、375 档 146、1280 档 483（与 DESIGN §3b/手册 §18.1 同源）；
   低位=沉日锚 bottom:0：纵距 ≥0.68×hero 高，全档 ≥350px）。避题、避倒影、
   避竖排列、避头像（皆在其下方或远侧，实测零相交）。 ---- */
.polaris {
  position: absolute;
  left: 58%; top: 24%; /* 中天带 55–62%/20–28% 实测定值：58%/24%（百分比自适应，全档间距达标免分档） */
  width: 44px; height: 44px;
  transform: translate(-50%, -50%);
  background: none; border: none; cursor: pointer; padding: 0;
  z-index: 2; /* .sky 之上（z:0）、hero 内容同层（z:1）之上——星在最前才可点 */
}
.polaris:focus-visible { outline: 1px solid var(--moon); outline-offset: 2px; border-radius: 50%; }
/* v3.42 摘挂时序（§3b 昼夜切换条款）：主题过渡进行中只动 opacity——
   摘星先淡后摘、挂星先挂后淡（DOM 增删让位过渡窗 ≤1s，稳态「昼 DOM 绝迹」不破）；
   归既有淡入淡出族；reduced 直切（无淡即摘/挂） */
.polaris, .sky-stars { transition: opacity 0.3s ease; }
.polaris.night-fade, .sky-stars.night-fade { opacity: 0; }
@media (prefers-reduced-motion: reduce) {
  .polaris, .sky-stars { transition: none; }
}
/* 亮核 ~2.6px + 极淡晕（寒银白系；昼夜无关——昼不存在） */
.polaris-core {
  position: absolute; left: 50%; top: 50%;
  width: 2.6px; height: 2.6px;
  border-radius: 50%;
  background: rgba(226, 232, 240, 0.95);
  transform: translate(-50%, -50%);
  box-shadow: 0 0 6px 1.5px rgba(211, 217, 228, 0.5), 0 0 16px 5px rgba(211, 217, 228, 0.14);
}
/* 四向短芒：正交两条细线；悬停/开态 芒略长＋星微亮（transform/opacity ≤0.3s 既有族） */
.polaris-core::before, .polaris-core::after {
  content: "";
  position: absolute; left: 50%; top: 50%;
  background: rgba(211, 217, 228, 0.55);
  transform: translate(-50%, -50%);
  transition: transform 0.3s ease, opacity 0.3s ease;
}
.polaris-core::before { width: 11px; height: 1px; }
.polaris-core::after { width: 1px; height: 11px; }
/* 悬停组包能力门（评审 LOW：移动 Safari hover 粘滞会让合拢后的星仍呈
   与 .is-open 同貌的开态外观——此处 hover 终态即状态指示语义，异于全站裸 hover）；
   .is-open 常亮态不设门（真状态） */
.polaris.is-open .polaris-core::before { transform: translate(-50%, -50%) scaleX(1.5); }
.polaris.is-open .polaris-core::after { transform: translate(-50%, -50%) scaleY(1.5); }
.polaris.is-open .polaris-core {
  box-shadow: 0 0 7px 2px rgba(211, 217, 228, 0.65), 0 0 18px 6px rgba(211, 217, 228, 0.2);
}
@media (hover: hover) and (pointer: fine) {
  .polaris:hover .polaris-core::before { transform: translate(-50%, -50%) scaleX(1.5); }
  .polaris:hover .polaris-core::after { transform: translate(-50%, -50%) scaleY(1.5); }
  .polaris:hover .polaris-core {
    box-shadow: 0 0 7px 2px rgba(211, 217, 228, 0.65), 0 0 18px 6px rgba(211, 217, 228, 0.2);
  }
}
/* 悬停词现：「文脉」自星旁向内侧（左）浮现，淡入＋字距舒展 ≤0.3s，移离逆序退场；
   触屏无悬停即无词（一触即开）；词对 AT 静默（按钮 aria-label 已承名） */
.polaris-word {
  position: absolute;
  right: calc(100% + 6px); top: 50%;
  transform: translateY(-50%);
  font-size: 0.72rem;
  color: var(--text-dim);
  letter-spacing: 0.05em;
  white-space: nowrap;
  opacity: 0;
  transition: opacity 0.3s ease, letter-spacing 0.3s ease;
  pointer-events: none;
}
.polaris:focus-visible .polaris-word { opacity: 1; letter-spacing: 0.35em; }
/* v3.46 首见词现（§3b）：触屏唯一的词现机会（无悬停）——微闪落定后 JS 挂此类，
   驻留 ~2.4s 摘除；与 hover 终态同貌；开门/切昼即取消；reduced 随上方规则直切 */
.polaris-word.polaris-word--once { opacity: 1; letter-spacing: 0.35em; }
@media (hover: hover) and (pointer: fine) {
  .polaris:hover .polaris-word { opacity: 1; letter-spacing: 0.35em; }
}
/* 首见微闪（终生一次，localStorage 同款）：复用 celestial-pulse 既有帧（零白名单扩项） */
.polaris--hint .polaris-core { animation: celestial-pulse 0.45s ease-out 2; }

/* ---- 疏星（§3b v3.40 立·v3.41 改排）：三五粒极暗定点，夜态限定、纯装饰、
   不可点、无闪烁；环拱北辰之下——「北辰居上，疏星共之」（坐标由 JS 内联，义在 DESIGN） ---- */
.sky-star {
  position: absolute;
  width: 1.6px; height: 1.6px;
  border-radius: 50%;
  background: rgb(211, 217, 228);
  opacity: 0.24; /* ≤0.3 硬约束 */
}

@media (prefers-reduced-motion: reduce) {
  .rift { transition: none; } /* 一线天开合直切 */
  .rift-floor, .rift-seam { transition: none; }
  .gb-fold { transition: none; } /* 留言初隐折叠直切（v3.54，复用一线天语义） */
  .polaris-core::before, .polaris-core::after, .polaris-word { transition: none; } /* 词现/芒长直切 */
  .polaris--hint .polaris-core { animation: none; }
}

.threads-band {
  background: var(--sky);
  /* v3.42 重绘收束（§4 附注）：昼夜切换数百星子换色不外溢重绘面；
     paint 裁切与带内锁定卡归一（v3.41）语义一致，星色 var 直切非过渡（既有纪律） */
  contain: layout paint;
}
.threads-band[hidden] { display: none; }
/* 首开占位（v3.47 §5-10「首开有占位」）：取数在途/失败时带内一词——
   「让我镜镜…」/「链上未应，稍后再试。」；居中微字、不挡事件 */
.th-status {
  position: absolute; inset: 0;
  display: flex; align-items: center; justify-content: center;
  margin: 0; font-size: 0.72rem; color: var(--text-dim);
  pointer-events: none;
}
.th-status .ui-state-retry { pointer-events: auto; }
.th-strip {
  height: 100%; /* v3.40：百分比高度链 threads-band(定值)→strip→inner 不可断（100% of auto 即塌陷） */
  overflow-x: auto;
  overflow-y: hidden; /* 页面横向溢出由 strip 自身吸收（§6 不破） */
  /* v3.42 滚动条隐形（双轨）：位置感由年桩承担，仪表不入天缝（判入档）；
     漫游能力分毫不减（拖拽/滚轮/键盘照旧）——只隐不废 */
  scrollbar-width: none;
  /* v3.42 带内安全内衬：左右 24px（≥最宽年桩半宽 ~20px 与节点光晕半径），
     首年桩与末节点在任意漫游端点完整可见——「019」式裁字零容忍。
     用透明 border 而非 padding（衬不得入 clientWidth——constellation 锁定位移
     以 clientWidth/2 求带心，padding 会把锁定卡推偏 24px；border 外于滚动区，
     锁定恰居正中、端点衬视觉等效，机器零改） */
  border-left: 24px solid transparent;
  border-right: 24px solid transparent;
  -webkit-user-select: none;
  user-select: none; /* 拖拽平移不拉选区（评审项；星图非选文语境） */
  /* v3.43 漫游可供性与保证（§5-10 四通道）：grab 光标示可拖（v3.42 滚条隐形后
     纯鼠标通道「能力在而可知性亡」——判词修正记档）；touch-action 显式双轴 pan
     ——横滑漫游与带上纵滑翻页皆原生保证，无关手势（双击缩放）不启 */
  cursor: grab;
  touch-action: pan-x pan-y;
}
.th-strip.is-dragging { cursor: grabbing; } /* 星子命中区仍 pointer（既有规则；拖点互斥由 6px 死区承担） */
.th-strip::-webkit-scrollbar { display: none; } /* WebKit 轨（隐形双轨之二） */
/* 带高（v3.40 一线天）：构件按容器高自适应——高度由 .threads-band 语境定值
   （桌面 220px / ≤887 190px，实测定值见 .rift 块），旧 55vh「天空」制随独立视图退役 */
.th-inner { position: relative; height: 100%; }
/* 时间之线：1px 双极渐变（地平线母题延伸语言）。v3.40 明度 0.35→0.45 峰：
   三线分层「界明于脉」——上下界线 ~0.7、内时间线 ~0.45（§5-10 一线天条款） */
.th-line {
  position: absolute;
  left: 0; right: 0; top: 50%;
  height: 1px;
  background: linear-gradient(90deg,
    transparent 0, rgba(211, 217, 228, 0.45) 8%, rgba(211, 217, 228, 0.16) 55%,
    rgba(181, 151, 122, 0.16) 60%, rgba(181, 151, 122, 0.42) 92%, transparent 100%);
}
html.day .th-line {
  background: linear-gradient(90deg,
    transparent 0, rgba(70, 83, 106, 0.45) 8%, rgba(70, 83, 106, 0.16) 55%,
    rgba(122, 92, 61, 0.16) 60%, rgba(122, 92, 61, 0.42) 92%, transparent 100%);
}
/* 年份界标：独立基线带（带底缘），与错落卡分层零碰撞（5-10.1） */
.th-year {
  position: absolute;
  bottom: 0.5rem; /* v3.40：随 220/160 带高微收（年桩独立基线带不变） */
  transform: translateX(-50%);
  font-size: 0.62rem;
  color: var(--text-dim);
}
/* 节点：0 尺寸锚点（天体同法），组内 translate 对中。
   第 2 轮：role=button（单击=锁定）；transform/opacity 过渡入 §4-8 白名单 */
.th-node {
  position: absolute; top: 50%; width: 0; height: 0;
  color: var(--text-dim);
  cursor: pointer;
  will-change: transform;
  transition: transform 0.45s cubic-bezier(0.2, 0.8, 0.25, 1), opacity 0.3s ease;
}
/* 三形改单源 .kind-glyph--*（§5-10 v3.19）：文章纯圆点 / 摘抄月牙环 / 笔记印；
   --kg 放大一档至 10px（辨识度）；shape 由 JS 加 kind-glyph 类承载，此处仅定位与尺寸 */
.th-node .th-glyph { position: absolute; transform: translate(-50%, -50%); display: block; --kg: 10px; }
/* 星图月牙同保 -18° 倾角（transform 非叠加，须在 .th-node .th-glyph 之后复写）——
   与「系」/搜索的月牙同形，§5-10.1 单源改一处不分裂 */
.th-node .kind-glyph--excerpt { transform: translate(-50%, -50%) rotate(-18deg); }
/* Box 联动：唯一强调层级——微亮 + 微大 + 极淡光晕（5-10.2） */
.th-node.is-featured .th-glyph {
  transform: translate(-50%, -50%) scale(1.3);
  box-shadow: 0 0 9px 1px rgba(211, 217, 228, 0.28);
}
html.day .th-node.is-featured .th-glyph { box-shadow: 0 0 9px 1px rgba(70, 83, 106, 0.3); }
/* 摘抄入盒：光晕不得吞掉月牙本体（月牙即 box-shadow）——叠 --crescent 于光晕之前，
   并保住 -18° 倾角与 scale。置于上方 .th-glyph 规则之后：同 (0,3,0) 特指度按源序取胜 */
.th-node.is-featured .kind-glyph--excerpt {
  transform: translate(-50%, -50%) scale(1.3) rotate(-18deg);
  box-shadow: var(--crescent), 0 0 9px 1px rgba(211, 217, 228, 0.28);
}
html.day .th-node.is-featured .kind-glyph--excerpt { box-shadow: var(--crescent), 0 0 9px 1px rgba(70, 83, 106, 0.3); }
/* 入盒文章微亮：.kind-glyph 自带 color 阻断节点色继承，featured 圆点须显式取 --text
   才比常态 --text-dim 更亮（§3 Box 微亮不变；--text 随昼夜切换，无需 day 变体）*/
.th-node.is-featured .kind-glyph--article { color: var(--text); }
.th-node.is-featured { color: var(--text); }
/* 极简卡：serif 行文本 + mono 日期（卡上时间=账本 meta 的镜像，属内容非轴注）；
   上下交替错落如星座 */
.th-card {
  position: absolute;
  left: 0;
  bottom: 16px; /* t0：线上近层（v3.40 一线天 220px 带高语境重定，实测值入 §5-10） */
  transform: translateX(-50%);
  width: max-content;
  max-width: 11rem;
  text-align: center;
  /* v3.41 评审 HIGH 修：卡自设小字号压行盒 strut——.th-time inline-block 化后
     日期落入匿名行盒，行盒高按卡的继承字号（1rem×1.85≈29.6px）撑杆，卡高虚增
     ~11px 破 35px 账（t2 卡顶被带裁）。title/Mirror 链自带字号不受累 */
  font-size: 0.55rem;
}
/* 三层错落（用户决议）：t0 线上近 / t1 线下近（年份带之上）/ t2 线上远
   （v3.40：偏移按线间高 220/170 实测重定——卡单行制+浮字 absolute，三层全落带内、
   与年桩不挤；v3.46：卡高实测 ~38px，窄档带高 170→190、偏移 12/10/50→3/10/44、
   桌面 t2 61→59——两档 t2 卡顶同获 ≥13px 天侧内衬，见 §5-10/上方 @media 块；
   此覆写块须列于 base 规则之后，源序即特指度） */
.th-node--t1 .th-card { bottom: auto; top: 14px; }
.th-node--t2 .th-card { bottom: 59px; }
@media (max-width: 887px) {
  /* v3.46 窄档天侧内衬：带高 190（线 95）、卡高实测 ~38px——t2 卡顶 = 95−44−38 ≥13px、
     t0 占 54–92（t2/t0 间隙 3.2px 守 3px 下限、贴线 3px） */
  .th-card { bottom: 3px; }
  .th-node--t1 .th-card { bottom: auto; top: 10px; }
  .th-node--t2 .th-card { bottom: 44px; }
}
/* 锁定态附则（v3.40 评审 HIGH 修）：锁定卡实高 ≈61px（标题+时间+Mirror 链行）
   且随节点 scale(1.35) 绕线上锚放大——未锁错落偏移下 t2 卡顶必越带被裁。
   锁定态三层归一收带内：带高即锁定卡最小容器（220：顶 11/底 203；170：0~167）；
   「溢界浮层」原条款作废记档（strip 的 y-hidden 拦断放行链且 CSS 轴限制无解） */
.th-node.is-locked .th-card { bottom: 12px; top: auto; }
.th-node--t1.is-locked .th-card { top: 8px; bottom: auto; }
@media (max-width: 887px) {
  .th-node.is-locked .th-card { bottom: 2px; }
  /* bottom:auto 必须显式（同特指度源序后者胜——缺省则上行 bottom:2px 与 top:0 双钳，卡高被拉 0） */
  .th-node--t1.is-locked .th-card { top: 0; bottom: auto; }
}
.th-title {
  display: block;
  font-family: var(--font-serif);
  font-size: 0.8rem;
  line-height: 1.5;
  color: var(--text-dim);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  transition: color 0.3s; /* hover 变色 ≤0.3s（白名单 1） */
}
/* 日期微字降噪一档（用户决议 2026-07-08，DESIGN 5-10.1 已记：方位辅注
   非阅读文本，有意低于正文 AA；常显不隐，时间感知不丢）。
   v3.41：inline-block——kind 缀字与之同行（无缀字时独占行，视觉不变） */
.th-time { display: inline-block; font-size: 0.55rem; color: var(--text-dim); opacity: 0.62; margin-top: 0.15rem; }
/* kind 缀字（§5-10 v3.19 立浮字；v3.41 修订替 v3.40 absolute 浮字之判）：
   显形态（悬停/聚焦/锁定）缀于日期右侧同行——**卡框内即天然不叠**
   （v3.40 absolute 化把显形浮字抛出卡外，锁定卡收带内后「摘抄」「记忆」词
   落在时间线/年桩/邻卡上——窄屏重叠实证归因，v3.41 复现记档）。
   隐时 display:none 零占位（卡高 35px 账不变）；显形直切
   （display 无过渡；重叠与淡入不可兼得，淡入随 absolute 制退役，判入档） */
.th-kind { display: none; margin-left: 0.45em; font-size: 0.58rem; color: var(--text-dim); letter-spacing: 0.03em; }
.th-node:hover .th-kind, .th-node:focus-visible .th-kind, .th-node.is-locked .th-kind { display: inline-block; opacity: 0.85; }
.th-node:hover .th-title { color: var(--moon); }
.th-node.is-featured .th-title { color: var(--text); }
/* 键盘可达（评审项）：焦点与 hover 同语汇，零新动效 */
.th-node:focus-visible { outline: none; }
.th-node:focus-visible .th-title { color: var(--moon); }
.th-node:focus-visible .th-glyph { outline: 1px solid var(--moon); outline-offset: 4px; }

/* ---- 第 2 轮：锁定与放射线（§5-10.5/§5-10.6；§4-8 白名单） ---- */
.th-locked .th-node:not(.is-locked) { opacity: 0.25; pointer-events: none; } /* 余星退暗 */
.th-node.is-locked { z-index: 3; }
.th-node.is-locked .th-title { color: var(--text); }
/* 锁定卡的 Mirror 去路：仅锁定态可见（低调 mono，与列表行 single-link 同语言） */
.th-mirror-link { display: none; font-size: 0.66rem; color: var(--text-dim); text-decoration: none; margin-top: 0.25rem; transition: color 0.3s; }
.th-node.is-locked .th-mirror-link { display: block; }
.th-mirror-link:hover { color: var(--moon); }
/* 放射线层：盖于 inner、不可点（线端微光点由此天然不可点） */
.th-lines { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; }
.th-lines line { stroke-width: 1; }
/* 二源二式（§5-10.6 v3.12 增补：邻接撤出）：同分类实线日极 / 互链实线月极；
   孤星探询虚线（--text-dim 再降透明，氛围非信息）——颜色静态直切（禁令一） */
.th-l--cat { stroke: var(--sun); opacity: 0.5; }
.th-l--link { stroke: var(--moon); opacity: 0.8; }
.th-l--probe { stroke: var(--text-dim); stroke-dasharray: 3 4; opacity: 0.34; }
.th-dot--cat { fill: var(--sun); }
.th-dot--link { fill: var(--moon); }
/* reduced-motion：锁定直切、线直显（过渡全关；JS 侧同步直达终态） */
@media (prefers-reduced-motion: reduce) {
  .th-node { transition: none; }
}
/* 入场：一次性淡入（白名单 2 复用）；reduced 直接呈现 */
@media (prefers-reduced-motion: no-preference) {
  .threads-band.is-in .th-inner { animation: rise-fade 0.9s ease both; }
}
/* 起雾悬停（v3.34 语义改注）：旧为「标题即镜面」的门霭（§5-10.3 旧案 a，已退役），
   今为中门双题「雾起而景换」的切换之霭——视图将换的暗示；动效轨不变，白名单零扩 */
.title-mirror-link { color: inherit; }
@media (prefers-reduced-motion: no-preference) {
  .title-mirror-link { transition: filter 0.3s ease; }
  /* 活跃题不起雾（评审修）：景永远不换处不作「景将换」暗示——与 cursor:default/
     空操作自洽；属减动效，白名单零扩 */
  .title-mirror-link:not(.is-on):hover { filter: blur(1px); }
}

/* ===================== 三联门（§5-09.2b v3.14 几何改写） =====================
   满幅 gate-band（禁 100vw：普通块级 100%）：两翼 absolute 钉两端（--band-pad），
   中门置于与阅读栏同源的居中列（水平零漂移）；词间 Dock 已退役（波移见下） */
.gate-band {
  position: relative;
}
.gate-mid-col {
  max-width: var(--content);
  margin: 0 auto;
  padding: 0 1.5rem; /* 与 .section 内边距同源：中门水平位置与原 h2 零漂移 */
}
.gate-mid-col .section-title.gate-row {
  display: block;
  margin-bottom: 0;
  padding-top: 5.5rem;
}
.gate-primary-titles {
  display: flex;
  min-width: 0;
  min-height: 44px;
  align-items: center;
}
/* 锚点补偿（§5-09.2b）：标题移出 section 后，#writing 滚动落点仍含标题行 */
#writing { scroll-margin-top: 8.6rem; }
#writing.section { padding-top: 0.4rem; } /* 标题让位后收顶距（原 5.5rem 移入 band） */
.gate {
  display: inline-block;
  /* filter 保留（起雾过渡）；scale 为纯 CSS hover/focus（≤1.15） */
  transition: transform 0.25s ease, color 0.3s, filter 0.3s ease;
}
/* .gate--mid 已随「标题即镜面」题门退役（v3.34 §5-10.3：星图门改辖倒影；题转切换器 .gate-title） */
.gate--moon, .gate--sun {
  position: absolute;
  bottom: 0.1em;
  font-family: var(--font-serif);
  font-size: 0.95rem;
  color: var(--text-dim);
  display: inline-flex;
  /* 文字沉底对齐中门（评审实测：居中会浮高 ~7.6px——44px 盒内 center
     多出 (44-行盒)/2 上移）；底 padding 归零，tap 盒 44px 不变 */
  align-items: flex-end;
  min-height: 44px;
  padding: 0.3rem 0.45rem 0;
}
.gate--moon { left: max(var(--band-pad), var(--safe-area-left)); transform-origin: left bottom; }
.gate--sun { right: max(var(--band-pad), var(--safe-area-right)); transform-origin: right bottom; }
/* v3.53（owner 2026-07-29「题须落列正上、莫错位」）：宽屏两翼渲染时，门词占满帘宽
   并锚向近阅读栏一侧（左翼右锚/右翼左锚），与其下帘列文字共缘——「摘抄/笔记」恰居各列上方。
   内侧 padding 对齐 .fan-item 的 10px，令题字与列首字左/右缘精确共线。仅 ≥1200 取用（窄屏门词照旧钉两端）。 */
@media (min-width: 1200px) {
  .gate--moon, .gate--sun {
    box-sizing: border-box;
    width: var(--fan-maxw);
    font-size: 1.02rem;
    font-weight: 400;
    letter-spacing: 0.06em;
  }
  .gate--moon { justify-content: flex-end; transform-origin: right bottom; padding-right: 10px; }
  .gate--sun { justify-content: flex-start; transform-origin: left bottom; padding-left: 10px; }
}
/* 门翼 hover：极色 + scale + mirror-touch 微浮合成一处（transform 单属性，
   避免与 §4-10 组的 translateY 互斥——评审预判修） */
.gate--moon:hover, .gate--moon:focus-visible { color: var(--moon); transform: scale(1.12) translateY(-1px); }
.gate--sun:hover, .gate--sun:focus-visible { color: var(--sun); transform: scale(1.12) translateY(-1px); }
.gate--moon.is-on, .gate--sun.is-on { color: var(--text); }
.gate:focus-visible { outline: 1px solid var(--moon); outline-offset: 4px; }
@media (forced-colors: active) { .gate.is-on { text-decoration: underline; } }
@media (prefers-reduced-motion: reduce) {
  .gate { transition: none; }
  .gate--moon:hover, .gate--sun:hover, .gate--moon:focus-visible, .gate--sun:focus-visible { transform: none; } /* 无缩放、色瞬切 */
}
/* 中门居中的碰撞窗口全覆盖（评审 high：左对齐中门与左翼的重叠延伸至
   ~875px——iPad 竖屏 768/810/820/834 全中招，左翼劫走中门前两字点击）；
   零漂移语义仅 vw≥888 成立（DESIGN §5-09.2b 注明） */
@media (max-width: 887px) {
  .gate-mid-col .section-title.gate-row { text-align: center; }
  .gate-primary-titles { justify-content: center; }
}
@media (max-width: 719px) {
  .gate-mid-col { padding: 0 1.25rem; }
  .gate-mid-col .section-title.gate-row { padding-top: 4.75rem; }
  #writing { scroll-margin-top: 7.75rem; }
  .gate--moon, .gate--sun { font-size: 0.88rem; }
}
@media (max-width: 360px) {
  .gate--moon, .gate--sun { font-size: 0.78rem; } /* 320 降一阶不换行（下限 0.75） */
}
/* 手机端题门使用确定的两层：五个中轴入口同居首行，摘抄／笔记只在次行守住两翼。
   我与AI紧随正心，不依赖偶然换行，也不另造一个虚假的视觉中心。 */
@media (max-width: 719px) {
  /* 独立视图以 hidden 收起整道门；:not([hidden]) 防本层 display:grid
     盖过浏览器的 hidden 规则，让短书架/短 Mirror 页底不浮出主页门词。 */
  .gate-band:not([hidden]) {
    display: block;
    padding: 0 max(var(--band-pad), var(--safe-area-right)) 44px max(var(--band-pad), var(--safe-area-left));
  }
  .gate-mid-col {
    width: 100%;
    max-width: none;
    margin: 0;
    padding: 0;
  }
  .gate-mid-col .section-title.gate-row {
    display: block;
    min-width: 0;
    white-space: nowrap;
  }
  .gate-primary-titles {
    justify-content: center;
    gap: clamp(0.65rem, 4vw, 1rem);
  }
  .gate-row .gate-title + .gate-title { margin-left: 0; }
  .gate--moon, .gate--sun {
    position: absolute;
    bottom: 0;
    padding-left: 0;
    padding-right: 0;
  }
  .gate--moon { left: max(var(--band-pad), var(--safe-area-left)); justify-content: flex-start; }
  .gate--sun { right: max(var(--band-pad), var(--safe-area-right)); justify-content: flex-end; }
  /* v3.58 移动阅读节律：题簇下不再直接粘分类。标题→分类约 28–36px，
     分类→账本 32px；桌面沿用既有节律。 */
  #writing.section { padding-top: clamp(1.75rem, 8vw, 2.25rem); }
  .cat-bar { margin-bottom: 2rem; }
  .cat-options--desktop { display: none; }
  .cat-drawer {
    display: block;
    grid-column: 1 / -1;
    grid-row: 1;
    border-top: 1px solid var(--line);
    border-bottom: 1px solid var(--line);
  }
  .cat-bar > .archive-entry { grid-column: 2; grid-row: 1; align-self: start; }
  .cat-summary {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr) auto;
    align-items: center;
    gap: 0.85rem;
    min-height: 3rem;
    padding: 0.55rem 4.5rem 0.55rem 0;
    list-style: none;
    color: var(--text-dim);
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
  }
  .cat-summary::-webkit-details-marker { display: none; }
  .cat-summary:focus-visible { outline: 1px solid var(--moon); outline-offset: 4px; }
  .cat-summary-label {
    font-size: 0.7rem;
    letter-spacing: 0.18em;
  }
  .cat-summary-current {
    min-width: 0;
    overflow: hidden;
    color: var(--text);
    font-family: var(--font-serif);
    font-size: 0.92rem;
    text-align: right;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .cat-summary-action {
    min-width: 4.5rem;
    font-size: 0.66rem;
    letter-spacing: 0.04em;
    text-align: right;
    transition: color 0.25s;
  }
  .cat-drawer[open] .cat-summary-action { color: var(--moon); }
  .cat-drawer:not([open]) > .cat-options--mobile { display: none; }
  .cat-options--mobile {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    gap: 0.125rem 1rem;
    padding: 0.35rem 0;
    border-top: 1px solid var(--line);
  }
  .cat-options--mobile .cat-item {
    flex: 0 1 auto;
    min-width: 0;
    max-width: 100%;
    min-height: 2.75rem;
    padding: 0.35rem 0.125rem;
    border-bottom: 1px solid transparent;
    line-height: 1.35;
    text-align: left;
    white-space: normal;
    overflow-wrap: anywhere;
  }
  .cat-options--mobile .cat-item.is-selected { border-bottom-color: var(--moon); }
}

@media (max-width: 400px) {
  .gate-primary-titles {
    gap: clamp(0.42rem, 2.8vw, 0.65rem);
  }
  .gate-mid-col .section-title.gate-row {
    font-size: clamp(1.02rem, 5.5vw, 1.18rem);
    letter-spacing: 0.08em;
  }
}
/* ===================== 账本行波移（§5-01f/§4-9 v3.14） =====================
   --w 由 JS 数值直写（0..1），形变全 transform/background-size——布局零重排；
   数值变量过渡与颜色过渡冻结禁令无涉。幅度常量集中此处（检查点可调单源） */
:root { --wave-grow: 0.16; --wave-shift: 6px; }
.entry-item { --w: 0; }
.entry {
  transform: translateX(calc(var(--w) * var(--wave-shift))); /* ③右探如被波推离岸 */
  transition: transform 0.18s ease-out;
  will-change: transform;
}
.entry .entry-title {
  transform: scale(calc(1 + var(--w) * var(--wave-grow))); /* ①字号生长（origin 左中） */
  transform-origin: left center;
  display: inline-block;
  transition:
    transform 0.18s ease-out,
    background-size 0.18s ease-out,
    opacity 0.16s ease-out,
    max-height 0.18s ease-out,
    padding-bottom 0.18s ease-out,
    visibility 0s linear;
  /* ②寒银下划线连续展开（fine 指针；旧 hover 二值规则由下方媒体块让位） */
  background-size: calc(var(--w) * 100%) 1px;
}
/* 多行摘句免缩放（§5-01 v3.15B）：scale 会令高块垂直胀出、压邻行——多行行
   只保留整行 translateX 探出 + 下划线，不放大。(0,3,0) 压过上方 (0,2,0)。 */
.entry .entry-title.is-clamped { transform: none; }
/* fine 指针下旧 hover 满线规则退位给 w 驱动（评审项：(0,3,0) 压制连续值）；
   触屏/reduced 自然回退二值 hover */
@media (pointer: fine) and (prefers-reduced-motion: no-preference) {
  .entry:hover .entry-title { background-size: calc(var(--w) * 100%) 1px; }
}
/* 键盘 focus：单行等价反馈（w=1 无波及邻行，§5-01f） */
.entry:focus-visible { outline: none; transform: translateX(var(--wave-shift)); }
.entry:focus-visible .entry-title { transform: scale(calc(1 + var(--wave-grow))); background-size: 100% 1px; }
@media (forced-colors: active) {
  .entry:focus-visible { outline: 1px solid CanvasText; } /* 高对比下划线被剥时的焦点兜底（评审项） */
}
/* 展开态免疫完备化（评审项：整行位移与键盘路径都要兜住——源序在 focus
   规则之后，(0,3,0)+ 组合压过一切）：正在阅读的文章不受磁力拉扯 */
.entry-item[open] > .entry, .entry-item[open] > .entry:focus-visible { transform: none; }
.entry-item[open] .entry-title, .entry-item[open] .entry:focus-visible .entry-title {
  transform: none;
  background-size: 100% 1px; /* 展开态满线标记保留 */
}
@media (prefers-reduced-motion: reduce), (not (pointer: fine)) {
  .entry, .entry .entry-title { transition: none; }
}

/* 公开账本展开不是“摘要 + 重复正文”，而是摘要向正文交棒：标题保留在
   summary DOM 中供收起复原与 aria-label 命名，视觉上短促下沉、收束并退场；
   时间轴与 Mirror 留在原位，正文从同一题名起线进入。正心逐点 raster 不参与。 */
#home-public-stream .entry-item[open] > .entry .entry-title {
  max-height: 0;
  padding-bottom: 0;
  opacity: 0;
  visibility: hidden;
  transform: translateY(0.42rem);
  background-size: 0 1px;
  transition:
    opacity 0.16s ease-in,
    transform 0.18s ease-in,
    max-height 0.18s ease-in,
    padding-bottom 0.18s ease-in,
    visibility 0s linear 0.18s;
}
#home-public-stream .entry-item[open] > .entry-body {
  animation: public-entry-body-settle 0.22s 0.07s ease-out both;
}
@media (max-width: 719px) {
  #home-public-stream .entry-item[open] > .entry {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    column-gap: 0.5rem;
  }
  #home-public-stream .entry-item[open] > .entry .entry-meta,
  #home-public-stream .entry-item[open] > .entry .entry-title { grid-area: 1 / 1; }
  #home-public-stream .entry-item[open] > .entry .single-link { grid-area: 1 / 2; }
}
@keyframes public-entry-body-settle {
  from { opacity: 0; transform: translateY(-0.35rem); }
  to { opacity: 1; transform: none; }
}
@media (prefers-reduced-motion: reduce) {
  #home-public-stream .entry-item[open] > .entry .entry-title {
    transform: none;
    transition: none;
  }
  #home-public-stream .entry-item[open] > .entry-body { animation: none; }
}

/* ===================== 全局搜索「搜索」（§5-11；v3.70 由隐语改为直称） =====================
   叠加非路由；开合仅 opacity。 */
.search-overlay {
  position: fixed;
  inset: 0;
  z-index: 13; /* nav(10) 之上 */
  background: color-mix(in srgb, var(--bg) 72%, transparent);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
  opacity: 0;
  transition: opacity 0.2s ease;
  overflow-y: auto;
}
.search-overlay.is-open { opacity: 1; }
.search-overlay[hidden] { display: none; }
.search-box {
  max-width: 560px;
  margin: 14vh auto 0;
  margin: max(14svh, calc(var(--safe-area-top) + 1rem)) auto 0;
  padding: 0 max(1.25rem, var(--safe-area-right)) max(3rem, calc(var(--safe-area-bottom) + 1rem)) max(1.25rem, var(--safe-area-left));
}
.search-input {
  width: 100%;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 4px;
  padding: 0.6rem 0.8rem;
  font-size: 0.95rem;
  color: var(--text);
  transition: border-color 0.3s;
}
.search-input:focus { outline: none; border-color: var(--moon); }
.search-exit-hint {
  margin: 0.55rem 0 0.85rem;
  color: var(--text-dim);
  font-size: 0.72rem;
  text-align: right;
}

/* 一面静置的镜，扫光只说明正在等待，不承担加载进度。 */
.ui-loading-mirror {
  display: inline-block;
  position: relative;
  width: 1.35rem;
  height: 1.65rem;
  margin: 0.3rem 0.2rem;
  overflow: hidden;
  vertical-align: middle;
  border: 1px solid color-mix(in srgb, var(--moon) 65%, transparent);
  border-radius: 0.65rem 0.65rem 0.12rem 0.12rem;
  background: linear-gradient(145deg, color-mix(in srgb, var(--moon) 12%, transparent), transparent 65%);
}
.ui-loading-mirror::after {
  content: "";
  position: absolute;
  inset: -25% -80%;
  background: linear-gradient(115deg, transparent 42%, color-mix(in srgb, var(--moon) 70%, transparent) 50%, transparent 58%);
  transform: translateX(-55%);
  animation: mirror-wait-glint 1.9s ease-in-out infinite;
}
@keyframes mirror-wait-glint {
  0%, 12% { transform: translateX(-55%); opacity: 0; }
  45% { opacity: 0.85; }
  82%, 100% { transform: translateX(55%); opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
  .ui-loading-mirror::after { animation: none; transform: none; opacity: 0.45; }
}
.search-results { margin-top: 1rem; }
.search-status { font-size: 0.78rem; color: var(--text-dim); }
.search-row {
  display: flex;
  align-items: baseline;
  gap: 0.6rem;
  flex-wrap: wrap;
  padding: 0.45rem 0.4rem;
  border-radius: 3px;
  cursor: pointer;
}
.search-row:hover, .search-row.is-active { background: var(--surface); }
.search-g { flex-shrink: 0; font-size: 0.62rem; color: var(--text-dim); }
.search-voice {
  flex-shrink: 0;
  font-size: 0.62rem;
  color: var(--text-dim);
  letter-spacing: 0.08em;
}
.search-t {
  font-family: var(--font-serif);
  font-size: 0.9rem;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 60%;
}
.search-d { font-size: 0.68rem; color: var(--text-dim); margin-left: auto; }
.search-frag {
  flex-basis: 100%;
  font-size: 0.76rem;
  color: var(--text-dim);
  padding-left: 1.2rem;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* 命中高亮：双极纪律（寒银=注意），不加底色 */
.search-hit { color: var(--moon); }
@media (prefers-reduced-motion: reduce) {
  .search-overlay { transition: none; }
}
/* ≤360：下拉笺仍保留站训字阶，只略收品牌与笺宽。 */
@media (max-width: 360px) {
  .nav-inner { gap: 0.5rem; }
  .brand { font-size: 0.9rem; }
  .nav.nav-menu-ready .nav-links {
    width: min(11.5rem, calc(100vw - 2 * var(--band-pad)));
    font-size: 0.96rem;
  }
}
/* 窄屏收敛（5-10.7；v3.40 带高改由 .rift 语境统一定值，此处只收卡与三形） */
@media (max-width: 719px) {
  .th-card { max-width: 8.5rem; }
  .th-title { font-size: 0.75rem; }
  .th-node .th-glyph { --kg: 8px; } /* 窄屏三形收一档（§5-10 v3.19，仍一眼可辨）*/
}

/* ===================== 地点旁注（DESIGN.md v3.65 §5-04） =====================
   极小 mono「· 发自 X」，随昼夜双态（--text-dim 两态均 AA）；无地点不渲染。
   v3.65：细点线只披露最低限度可供性；主动点击才新页打开地图。 */
.meta-loc { color: var(--text-dim); font-size: 0.92em; white-space: nowrap; }
.meta-loc[href] {
  position: relative;
  display: inline-flex;
  align-items: center;
  max-width: 100%;
  white-space: normal;
  overflow-wrap: anywhere;
  text-decoration-line: underline;
  text-decoration-style: dotted;
  text-decoration-thickness: 1px;
  text-decoration-color: var(--line);
  text-underline-offset: 0.24em;
  cursor: pointer;
}
.meta-loc[href]::after { content: " ↗"; font-size: 0.82em; opacity: 0.62; }
.meta-loc[href]:hover { color: var(--moon); text-decoration-color: currentColor; }
.meta-loc[href]:hover::after { opacity: 1; }
.meta-loc[href]:focus-visible { color: var(--moon); outline: 1px solid var(--moon); outline-offset: 0.25rem; }
.entry-loc-line { margin: 0 0 0.8rem; font-size: 0.75rem; }
/* 编辑器地点行：输入框 + 不起眼「定位」按钮（路 B） */
.editor-loc-row { display: flex; align-items: center; gap: 0.6rem; }
.editor-loc-row .editor-input { flex: 1 1 auto; min-width: 0; }

/* 作者附近地点选择（v3.66）：地图只在主动定位后进入 iframe；访客态零请求。 */
body.location-picker-open { overflow: hidden; }
.location-picker-layer {
  position: fixed;
  inset: 0;
  z-index: 1800;
  display: grid;
  place-items: center;
  padding: clamp(1rem, 4vw, 2.5rem);
  background: color-mix(in srgb, var(--bg) 82%, transparent);
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
}
.location-picker-card {
  width: min(35rem, 100%);
  height: min(46rem, calc(100vh - 2rem));
  height: min(46rem, calc(100dvh - 2rem));
  min-height: min(34rem, calc(100vh - 2rem));
  min-height: min(34rem, calc(100dvh - 2rem));
  display: grid;
  grid-template-rows: auto minmax(0, 1fr) auto;
  overflow: hidden;
  color: var(--text);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 1rem;
  box-shadow: 0 1.4rem 4rem color-mix(in srgb, var(--bg) 72%, transparent);
}
.location-picker-head {
  min-height: 3.35rem;
  display: flex;
  align-items: center;
  gap: 1rem;
  padding: 0.65rem 0.75rem 0.65rem 1.1rem;
  border-bottom: 1px solid var(--line);
}
.location-picker-title {
  margin: 0;
  flex: 1 1 auto;
  font-family: var(--font-serif);
  font-size: 1.03rem;
  font-weight: 400;
  letter-spacing: 0.14em;
}
.location-picker-close,
.location-picker-quiet {
  border: 0;
  color: var(--text-dim);
  background: transparent;
  cursor: pointer;
}
.location-picker-close {
  width: 2.5rem;
  height: 2.5rem;
  padding: 0;
  border-radius: 50%;
  font-size: 1.35rem;
  line-height: 1;
}
.location-picker-close:hover,
.location-picker-quiet:hover { color: var(--moon); }
.location-picker-close:focus-visible,
.location-picker-quiet:focus-visible,
.location-picker-console:focus-visible {
  outline: 1px solid var(--moon);
  outline-offset: 0.2rem;
}
.location-picker-frame {
  display: block;
  width: 100%;
  height: 100%;
  min-height: 0;
  border: 0;
  background: var(--bg);
}
.location-picker-foot {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  min-height: 3rem;
  padding: 0.55rem 0.9rem;
  border-top: 1px solid var(--line);
}
.location-picker-privacy {
  min-width: 0;
  margin: 0;
  flex: 1 1 auto;
  color: var(--text-dim);
  font-size: 0.68rem;
  line-height: 1.55;
}
.location-picker-foot-actions { display: flex; flex: 0 0 auto; gap: 0.7rem; }
.location-picker-quiet { min-height: 2rem; padding: 0 0.2rem; font-size: 0.68rem; }
.location-picker-layer--setup .location-picker-card {
  height: auto;
  min-height: 0;
  max-height: calc(100vh - 2rem);
  max-height: calc(100dvh - 2rem);
  grid-template-rows: auto auto;
  overflow-y: auto;
  overscroll-behavior: contain;
}
.location-picker-setup {
  display: grid;
  gap: 0.9rem;
  padding: clamp(1.1rem, 4vw, 1.65rem);
}
.location-picker-copy { margin: 0; color: var(--text); line-height: 1.8; }
.location-picker-key-label { color: var(--text-dim); font-size: 0.74rem; }
.location-picker-key { width: 100%; }
.location-picker-note,
.location-picker-status {
  min-height: 1.15em;
  margin: 0;
  color: var(--text-dim);
  font-size: 0.7rem;
  line-height: 1.65;
}
.location-picker-status { color: var(--sun); }
.location-picker-setup-actions { display: flex; align-items: center; gap: 0.7rem; }
.location-picker-console {
  margin-right: auto;
  color: var(--text-dim);
  font-size: 0.72rem;
  text-decoration: underline dotted var(--line);
  text-underline-offset: 0.22em;
}
.location-picker-console:hover { color: var(--moon); }
@media (pointer: coarse), (max-width: 719px) {
  .meta-loc[href] { min-height: 44px; }
  .editor-loc-row .editor-btn { min-width: 44px; min-height: 44px; }
  .location-picker-layer { padding: 0; place-items: stretch; }
  .location-picker-card {
    width: 100%;
    height: 100vh;
    height: 100dvh;
    min-height: 0;
    border-width: 0;
    border-radius: 0;
  }
  .location-picker-head {
    padding-top: max(0.65rem, env(safe-area-inset-top));
    padding-left: max(1rem, env(safe-area-inset-left));
    padding-right: max(0.75rem, env(safe-area-inset-right));
  }
  .location-picker-foot {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 0.15rem;
    padding-right: max(0.9rem, env(safe-area-inset-right));
    padding-bottom: max(0.55rem, env(safe-area-inset-bottom));
    padding-left: max(0.9rem, env(safe-area-inset-left));
  }
  .location-picker-privacy { font-size: 0.76rem; }
  .location-picker-foot-actions { justify-self: end; }
  .location-picker-close,
  .location-picker-quiet { min-width: 44px; min-height: 44px; }
  .location-picker-layer--setup {
    place-items: center;
    padding-top: max(1rem, env(safe-area-inset-top));
    padding-right: max(1rem, env(safe-area-inset-right));
    padding-bottom: max(1rem, env(safe-area-inset-bottom));
    padding-left: max(1rem, env(safe-area-inset-left));
  }
  .location-picker-layer--setup .location-picker-card {
    width: min(31rem, 100%);
    height: auto;
    max-height: calc(100dvh - max(2rem, env(safe-area-inset-top)) - max(2rem, env(safe-area-inset-bottom)));
    border-width: 1px;
    border-radius: 0.85rem;
  }
  .location-picker-setup-actions { flex-wrap: wrap; }
  .location-picker-setup-actions > a,
  .location-picker-setup-actions > button {
    min-height: 44px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
  }
  .location-picker-console { flex-basis: 100%; }
}

/* 编辑器动作按钮右置（DESIGN.md v3.5 §5b）：发布+取消靠右，附件/预览居左 */
.editor-btn--right { margin-left: auto; }

/* ===================== 文章日月表态（DESIGN.md §5-01e；v3.39 印随读处） =====================
   单源门面：Mirror 页正文末 + 列表展开行正文末共用同一构件；日月两枚，
   选中一极实心/常亮、另一极空心待选；昼夜双态 AA。 */
.reactions { display: flex; gap: 2rem; justify-content: center; align-items: center; flex-wrap: wrap; margin: 0.3rem 0; }
.reaction-status {
  flex-basis: 100%;
  min-height: 1em;
  color: var(--text-dim);
  font-size: 0.7rem;
  text-align: center;
}
.reaction-status:empty { display: none; }
.mirror-owner-controls { display: contents; }
/* 印随读处（v3.39）：行语境（.entry-body 内）门面自带上缘留白与正文隔开——行内不加
   爻线（爻线是区块语法，行不是区块）；Mirror 门面挂 viewEl 直系、不在 .entry-body 内，
   此规则零触碰 Mirror。 */
.entry-body > .reactions { margin-top: 1.6rem; }
/* 触屏命中 ≥44px（§5-01e 构件契约，透明扩域零视觉变化）：图标 24px + padding
   实高 ~33.6px，四向 -6px 补至 ~45.6px；两枚间距 2rem，扩域后余 20px 不相叠。 */
.react { position: relative; }
.react::after { content: ""; position: absolute; inset: -6px; }
/* 注意：color/fill/stroke 不加 transition——它们由 var(--sun/--moon/--text-dim) 驱动，
   Chromium 对"变量值变化触发的颜色过渡"会卡死（Phase 8 实证）；此处直切，
   选中态由 .is-on 即时呈现、脉冲给反馈，两态颜色恒正确。 */
/* 排布（v3.39 收尾根治，用户决议）：计数横陈于天体之右、同行基线、恒在常流——
   inline 流排布不倚 flex（真机 WebKit 对 <button> 作 flex 容器有怪癖：flex 失效时
   block 天体独占一行、计数坠到下一行被裁切/遮挡）；禁绝对定位下垂、禁 z-index
   遮盖式补丁；nowrap 双保险禁坠行。同源构件一处改，行与 Mirror 同沾。 */
.react {
  display: inline-block; white-space: nowrap;
  background: none; border: none; cursor: pointer; padding: 0.3rem 0.4rem;
  color: var(--text-dim);
}
/* 图标＝首页天体同款 CSS 形状源，currentColor 承接按钮颜色（未选 --text-dim、选中双极色）。
   月牙：内切偏移 box-shadow（同 .moon，值按 24/42 缩放、同 -18° 旋转）；
   日弧：环去底缘（同 .sun-arc）。选中态提亮 currentColor + 脉冲，一眼可辨。 */
.react-ic { width: 24px; height: 24px; display: inline-block; vertical-align: baseline; position: relative; } /* 无文字盒基线=盒底缘，与计数基线同线（v3.39 收尾） */
.react-ic--moon {
  border-radius: 50%;
  box-shadow: inset -5px 4px 0 0 currentColor; /* 首页 .moon 的 -9px 7px 按 24/42 缩放 */
  transform: rotate(-18deg);
}
.react-ic--sun {
  border-radius: 50%;
  border: 1.6px solid currentColor;
  border-bottom-color: transparent; /* 同首页 .sun-arc：环去底弧，呈升日 */
}
.react-count { font-size: 0.82rem; color: var(--text-dim); margin-left: 0.45rem; } /* 原 flex gap 改 margin（常流同值） */
.react:hover { color: var(--text); }
/* 待选 vs 常亮（§5-01e）：未选暗（0.5），选中亮（1）——非色彩线索，灰度/色盲亦可辨（WCAG 1.4.1）。
   叠加形状线索：选中太阳环闭合（实心感）、选中月牙 currentColor 提亮。 */
.react-ic { opacity: 0.5; }
.react.is-on .react-ic { opacity: 1; }
.react--sun.is-on { color: var(--sun); }
.react--sun.is-on .react-count { color: var(--sun); }
.react--sun.is-on .react-ic--sun { border-bottom-color: currentColor; } /* 选中：环闭合，空心→实心 */
.react--moon.is-on { color: var(--moon); }
.react--moon.is-on .react-count { color: var(--moon); }
/* 落定微脉冲（呼应日月落定，一次性；reduced 不动） */
@keyframes react-pulse { 0%, 100% { transform: scale(1); } 40% { transform: scale(1.28); } }
/* 月牙带静态 rotate(-18deg)：脉冲须组合旋转，否则 scale 覆盖旋转致月牙抖正（评审修） */
@keyframes react-pulse-moon { 0%, 100% { transform: rotate(-18deg) scale(1); } 40% { transform: rotate(-18deg) scale(1.28); } }
@media (prefers-reduced-motion: no-preference) {
  .react--pulse .react-ic { animation: react-pulse 0.4s ease-out 1; display: inline-block; }
  .react--moon.react--pulse .react-ic { animation-name: react-pulse-moon; }
}

/* ---- 中门双题（§5-09.2b v3.34；v3.33 伴词升座，其特调整套作废）——
   「格物致知」「记忆」同貌同级：font/letter-spacing 全数继承 h2 题级；
   仅字距分隔（无符号/下划线/指示条——题不是分类栏）；状态只用明度
   （活跃 --text 恒亮、非活跃 --text-dim，两翼既有明度语言）；
   共用起雾悬停（.title-mirror-link，雾义 v3.34 改注=雾起而景换）。
   不设 display——[hidden] 原生生效（空态「记忆」整词不渲染，回单题原貌） ---- */
.gate-title {
  background: none;
  border: none;
  padding: 0;
  font: inherit; /* 同貌同级：随 h2 题级（含字号/字重） */
  letter-spacing: inherit;
  color: var(--text-dim);
  cursor: pointer;
  position: relative; /* 供 ::after 透明命中扩展 */
}
.gate-title.is-on { color: var(--text); cursor: default; } /* 活跃题恒亮；点击为空操作 */
.gate-title:disabled { color: var(--text); cursor: default; } /* 空态单题：撤交互面只留题貌（applyMemGates） */
/* 高对比模式（评审修）：强制色下明度失效，活跃题以下划线可辨（forced-colors 保留 text-decoration） */
@media (forced-colors: active) { .gate-title.is-on { text-decoration: underline; } }
.gate-title + .gate-title { margin-left: 1em; } /* 字距分隔（0.9–1.2em 域内取 1em，实测无碰撞） */
.gate-title:focus-visible { outline: 1px solid var(--moon); outline-offset: 4px; }
/* 触屏命中 ≥44px：透明伪元素扩展，不改视觉几何与基线 */
.gate-title::after { content: ""; position: absolute; left: -4px; right: -4px; top: 50%; height: 44px; transform: translateY(-50%); }

/* ---- 星图之门：Gloamirror 倒影（§5-10.3 v3.34 改辖；机制建于 v3.32）——透明命中层
   押在清晰镜像上：原生 <a>（屏读信息完整、不 aria-hidden、aria-label=文脉星图）；
   min-height 保 ≥44px 触屏命中而不改视觉几何；cursor 即全部新增可供性（悬停暗示复用
   .mirror-set 主清镜朦，§4 白名单零新增）；**恒开**——站已有文，星图空态自理
   （v3.33「记忆空态门不开」条款随改辖作废）。站名之镜像开向书写之镜像 ---- */
.mirror-set { position: relative; }
.mirror-door-hit {
  background: none; border: none; padding: 0; /* v3.40 a→button（开合乃状态非导航）：钮素体重置 */
  position: absolute;
  left: 0; right: 0;
  /* 命中扩展向下（评审修）：向上撑满 44px 会盖住水线与标题下缘致误触——
     镜像之下是 motto 的 2.2rem 上边距留白，向下越界无邻居可误 */
  bottom: -14px;
  font-size: clamp(3.4rem, 9vw, 8.2rem); /* 与 .mirror 同源，height 随 em */
  height: calc(0.65em + 14px);
  min-height: 44px;
  cursor: pointer;
}
.mirror-door-hit:focus-visible { outline: 1px solid var(--moon); outline-offset: 3px; }
@media (max-width: 719px) { .mirror-door-hit { font-size: clamp(2.3rem, 11vw, 3.6rem); } }

/* Mirror 元行末「记于」微字（§5-13.3）：低调 mono——旧话今公开，如实示人 */
.mem-recorded { font-size: 0.72rem; color: var(--text-dim); }

/* ==================== 「幕」——图影沉浸观（DESIGN §5-14，v2「自然顺滑」） ====================
   幕布随昼夜（「恒夜」退役）：--curtain 昼夜双 token，取值自 §1 现行色板推导（禁生造色相），
   半透＋模糊——页在幕后隐约仍在（非另一应用）。幕内控件沿站内既有昼夜机制（不再重定义 token）。
   启幕生长/落幕回巢＝FLIP（transform+opacity，≤0.28s，JS 驱动）；纵拖跟手＝直接操纵无缓动；
   幕布随生长同步淡入、随纵拖比例淡出。以上皆白名单第 11 条（≤0.3s；reduced 一律直切）。 */
:root { --curtain: rgba(15, 17, 21, 0.94); }        /* 夜：--sky(#14161B) 再沉一档 */
html.day { --curtain: rgba(206, 211, 219, 0.92); }  /* 昼：--bg(#E9ECF1) 压一档「灰烟」——非黑非近黑 */
@supports not ((backdrop-filter: blur(10px)) or (-webkit-backdrop-filter: blur(10px))) {
  :root { --curtain: rgba(15, 17, 21, 0.97); }       /* 不支持模糊则提 alpha 兜底（特性探测，非 UA 嗅探） */
  html.day { --curtain: rgba(206, 211, 219, 0.97); }
}
.curtain {
  position: fixed;
  inset: 0;
  z-index: 40; /* nav(10)/浮层(5-6)之上 */
}
.curtain-backdrop { /* 幕布层：背景＋模糊在此，纵拖时单独淡出而图/影随指走 */
  position: absolute;
  inset: 0;
  background: var(--curtain);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
  opacity: 0; /* 开合/纵拖由 JS 以 inline opacity + transition 驱动 */
  will-change: opacity;
}
.curtain-stage {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  touch-action: pinch-zoom; /* 单指手势归状态机；双指 pinch 留给原生（§5-14 缩放归原生） */
  overflow: hidden;
  transition: opacity 0.24s ease; /* 图片翻页淡切换（同条） */
}
.curtain-stage.is-native-zoomed {
  touch-action: pan-x pan-y pinch-zoom; /* 放大后单指双轴查看原图各处 */
}
.curtain-stage.is-fading { opacity: 0; }
.curtain-img {
  max-width: 100vw;
  max-height: 100vh;
  max-height: 100dvh;
  user-select: none;
  -webkit-user-drag: none;
  cursor: zoom-out; /* 1× 单击落幕；原生放大态由常驻 ✕ 退出 */
  will-change: transform;
}
.curtain-video { max-width: 100vw; max-height: 100vh; max-height: 100dvh; will-change: transform; }
.curtain-count {
  position: absolute;
  top: max(0.9rem, calc(var(--safe-area-top) + 0.4rem));
  left: max(1.1rem, calc(var(--safe-area-left) + 0.6rem));
  font-size: 0.75rem;
  color: var(--text-dim);
}
.curtain-close {
  position: absolute;
  top: max(0.35rem, var(--safe-area-top));
  right: max(0.45rem, var(--safe-area-right));
  min-width: 46px; min-height: 46px; /* 触屏命中 ≥44px（46 留缩放舍入余量，320 实测 43 的教训） */
  background: none; border: none;
  color: var(--text-dim);
  font-size: 1rem;
  cursor: pointer;
  transition: color 0.3s;
}
.curtain-close:hover, .curtain-close:focus-visible { color: var(--moon); }
.curtain-close:focus-visible { outline: 1px solid var(--moon); outline-offset: 2px; }
/* 控制条：地平线进度（已播=寒银→旧铜渐变细线、未播=--line）＋ mono 时码；
   交互后 2.5s 自隐、任意触碰唤回（同条淡出） */
.curtain-bar {
  position: absolute;
  left: max(1.1rem, calc(var(--safe-area-left) + 0.6rem));
  right: max(1.1rem, calc(var(--safe-area-right) + 0.6rem));
  bottom: max(1.15rem, calc(var(--safe-area-bottom) + 0.65rem));
  display: flex; align-items: center; gap: 0.8rem;
  opacity: 0;
  transition: opacity 0.28s ease;
  pointer-events: none;
}
.curtain-bar.is-live { opacity: 1; pointer-events: auto; }
.curtain-track { position: relative; flex: 1 1 auto; height: 1px; background: var(--line); }
.curtain-played {
  position: absolute; left: 0; top: 0; bottom: 0; width: 0;
  background: linear-gradient(90deg, var(--moon), var(--sun)); /* 进度条即地平线（§1 同族） */
}
.curtain-track-hit { /* 44px 透明扩域：可点可拖 */
  position: absolute;
  left: 1.1rem; right: calc(1.1rem + 7ch); bottom: 0;
  height: 44px;
  cursor: pointer;
}
.curtain-time { flex: 0 0 auto; font-size: 0.72rem; color: var(--text-dim); }
/* 手势指示件（无数字仪表：量条不带数值） */
.curtain-bubble, .curtain-badge, .curtain-flash, .curtain-hint {
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  color: var(--text);
  opacity: 0;
  transition: opacity 0.24s ease;
  pointer-events: none;
}
.curtain-bubble { top: 50%; margin-top: -0.7em; font-size: 0.85rem; letter-spacing: 0.05em; }
.curtain-badge { top: 1rem; font-size: 0.85rem; }
.curtain-flash { top: 50%; margin-top: -0.8em; font-size: 1.5rem; }
.curtain-hint { bottom: max(4rem, calc(var(--safe-area-bottom) + 3rem)); font-size: 0.78rem; color: var(--text-dim); }
.curtain-bubble.is-live, .curtain-badge.is-live, .curtain-flash.is-live, .curtain-hint.is-live { opacity: 1; }
.curtain-gauge { /* 明度/音量：屏缘细竖 hairline 量条（克制，无数字） */
  position: absolute;
  top: 20%; bottom: 20%;
  width: 2px;
  background: var(--line);
  opacity: 0;
  transition: opacity 0.24s ease;
  pointer-events: none;
}
.curtain-gauge--l { left: 10px; }
.curtain-gauge--r { right: 10px; }
.curtain-gauge.is-live { opacity: 1; }
.curtain-gauge i {
  position: absolute; bottom: 0; left: 0; right: 0;
  height: 50%;
  background: var(--moon);
}
/* 画集跨到未取视频件：占位帧＋居中 ▶（点 ▶ 才取） */
.curtain-poster {
  background: none;
  border: 1px solid var(--line);
  border-radius: 4px;
  color: var(--text-dim);
  padding: 3rem 3.5rem;
  display: flex; flex-direction: column; align-items: center; gap: 0.9rem;
  cursor: pointer;
  transition: color 0.3s, border-color 0.3s;
}
.curtain-poster:hover, .curtain-poster:focus-visible { color: var(--moon); border-color: var(--moon); }
.curtain-poster-play { font-size: 1.6rem; }
.curtain-poster-name { font-size: 0.75rem; }
@media (prefers-reduced-motion: reduce) {
  .curtain, .curtain-stage, .curtain-img.is-settle, .curtain-bar,
  .curtain-bubble, .curtain-badge, .curtain-flash, .curtain-hint, .curtain-gauge,
  .curtain-close, .curtain-poster, .media-video-card { transition: none; }
}
@media (max-width: 719px) {
  .curtain-bar { left: 0.8rem; right: 0.8rem; }
  .curtain-track-hit { left: 0.8rem; right: calc(0.8rem + 7ch); }
}

/* 正文媒体的幕入口（§5-01 修订）：图片 zoom-in；视频观影占位卡（下载行同族形制） */
.media-img { cursor: zoom-in; }
/* v3.38 a11y：内嵌图片键盘可达（role=button）——焦点环仅键盘态现（:focus-visible），
   鼠标态无痕；沿站内寒银细描边约定（同 .curtain-close）。 */
.media-img:focus-visible { outline: 1px solid var(--moon); outline-offset: 2px; }
.media-video-card {
  display: inline-block;
  background: none;
  border: 1px solid var(--line);
  border-radius: 4px;
  padding: 0.55rem 0.9rem;
  margin: 1rem 0;
  font-size: 0.82rem;
  color: var(--text-dim);
  cursor: pointer;
  transition: color 0.3s, border-color 0.3s;
  max-width: 100%;
  overflow-wrap: anywhere;
  text-align: left;
}
.media-video-card:hover:not(:disabled), .media-video-card:focus-visible { color: var(--moon); border-color: var(--moon); }
.media-video-card:disabled { cursor: progress; }

/* ---- 移动承载契约（v3.93）----
   小字不按选择器数量一刀切：只有承担状态、方向、操作或内容判断的信息进入下限；
   天象、爻线与图形内题字等装饰仍可沿用各自字阶。粗指针即使处于横屏宽度，也应得到
   同样的触达与输入保护。PDF 透明文本层的排版例外定义在 local-materials.css。 */
@media (max-width: 719px), (pointer: coarse) {
  .mirror-touch,
  .editor-btn,
  .tool-btn,
  .cat-item,
  .comment-btn,
  .entry-edit,
  .editor-focus-btn,
  .gate--moon,
  .gate--sun { filter: none; }

  .nav-inner {
    min-height: var(--nav-safe-height);
    padding-top: calc(0.625rem + var(--safe-area-top));
    padding-right: max(var(--band-pad), var(--safe-area-right));
    padding-left: max(var(--band-pad), var(--safe-area-left));
  }
  .nav.nav-menu-ready .nav-links {
    right: max(var(--band-pad), var(--safe-area-right));
    max-height: calc(100dvh - var(--nav-safe-height) - 0.9rem - var(--safe-area-bottom));
  }
  .nav.nav-menu-ready .nav-links a:not([hidden]),
  .nav.nav-menu-ready .nav-links button:not([hidden]) {
    white-space: normal;
    overflow-wrap: anywhere;
  }

  .skip-link:focus-visible,
  .nav-return,
  .ui-state-retry,
  .comment-btn,
  #gb-submit,
  .lock-btn,
  .echo-btn,
  .echo-send,
  .clamp-toggle,
  .entry-edit,
  .kind-btn,
  .tool-btn,
  .editor-focus-btn,
  .editor-draft-btn,
  .editor-btn,
  .sel-pop-btn,
  .gb-reveal,
  .single-link,
  .cat-item,
  .cat-summary-action,
  .moon-mark,
  .location-picker-quiet,
  .location-picker-console,
  .media-select-btn,
  .media-video-card,
  .curtain-poster-name,
  .link-panel-btn,
  .gate--moon,
  .gate--sun,
  .publish-choice-enter,
  .publish-failure-action,
  .load-more,
  .th-title { font-size: var(--type-action); }

  .content-kind,
  .entry time,
  .entry-sub,
  .entry-media-loading,
  .entry-media-count,
  .showcase-loading,
  .box-card-count,
  .list-status,
  .gb-meta,
  .gb-status,
  .view-meta,
  .comment-meta,
  .comment-badge,
  .comment-status,
  .lock-msg,
  .echo-meta,
  .echo-count,
  .echo-msg,
  .view-all,
  .mp-d,
  .box-flip-msg,
  .box-card-meta,
  .life-tree-source,
  .life-tree-meta,
  .editor-label,
  .editor-wordcount,
  .editor-draft-msg,
  .editor-status,
  .link-panel-title,
  .link-field-label,
  .link-panel-error,
  .tbl-label,
  .draft-time,
  .draft-empty,
  .bubble-time,
  .th-status,
  .th-year,
  .th-time,
  .th-kind,
  .th-mirror-link,
  .cat-summary-label,
  .search-status,
  .search-g,
  .search-d,
  .search-frag,
  .entry-loc-line,
  .location-picker-privacy,
  .location-picker-key-label,
  .location-picker-note,
  .location-picker-status,
  .curtain-count,
  .curtain-time,
  .curtain-hint,
  .reaction-status,
  .ping-row,
  .ping-row .pr-time,
  .ping-divider,
  .react-count,
  .mem-recorded,
  .kbd-title,
  .kbd-gname,
  .kbd-keys,
  .kbd-keys kbd,
  .publish-index-intro,
  .publish-choice-description,
  .kbd-what { font-size: var(--type-meta); }

  /* iOS 会在聚焦小于 16px 的表单时强制放大；只抬真实输入，不改正文与装饰。 */
  .gb-form textarea,
  .lock-input,
  .echo-input,
  .comment-input,
  .editor-input,
  .editor-body,
  .search-input,
  .location-picker-key { font-size: 1rem; }

  .brand {
    min-height: 44px;
    display: inline-flex;
    align-items: center;
  }
  .gate--moon,
  .gate--sun { min-width: 44px; }

  #gb-submit,
  .load-more,
  .search-input,
  .lock-btn,
  .echo-btn,
  .echo-send,
  .clamp-toggle,
  .entry-edit,
  .media-select-btn,
  .cat-summary,
  .cat-options--mobile .cat-item,
  .search-row,
  .location-picker-quiet,
  .location-picker-console { min-height: 44px; }

  .entry-meta { flex-wrap: wrap; white-space: normal; }
  .box-card { height: auto; min-height: 10.5rem; }
  .box-card-meta { flex-flow: row wrap; gap: 0.2rem 0.55rem; }
  .life-tree-origin {
    height: auto;
    min-height: 2.75rem;
    flex-wrap: wrap;
  }
  .life-tree-source {
    flex: 1 1 10rem;
    overflow: visible;
    text-overflow: clip;
    white-space: normal;
    overflow-wrap: anywhere;
  }
  .life-tree-meta { margin-left: 0; flex-wrap: wrap; }

  .cat-summary {
    grid-template-columns: auto minmax(0, 1fr) auto;
    min-height: 48px;
    gap: 0.6rem;
    padding-block: 0.35rem;
  }
  .cat-summary-current {
    grid-column: auto;
    overflow: hidden;
    text-align: left;
    text-overflow: ellipsis;
    white-space: nowrap;
  }

  .mirror-panel-row,
  .search-row { align-items: flex-start; }
  .mp-t,
  .search-t,
  .search-frag {
    overflow: visible;
    text-overflow: clip;
    white-space: normal;
    overflow-wrap: anywhere;
  }
  .search-t { flex: 1 1 12rem; max-width: none; }
  .search-d { margin-left: 0; }
  .search-frag { padding-left: 0; }

  .kbd-row { align-items: flex-start; flex-wrap: wrap; }
  .kbd-keys { white-space: normal; flex-wrap: wrap; }
  .kbd-card {
    width: min(30rem, calc(100vw - 2.4rem - var(--safe-area-left) - var(--safe-area-right)));
    max-height: calc(100dvh - var(--safe-area-top) - var(--safe-area-bottom) - 1rem);
  }
  .ping-row { align-items: flex-start; flex-wrap: wrap; }
  .ping-row .pr-text {
    overflow: visible;
    text-overflow: clip;
    white-space: normal;
    overflow-wrap: anywhere;
  }

  .curtain-bar {
    left: max(0.8rem, calc(var(--safe-area-left) + 0.4rem));
    right: max(0.8rem, calc(var(--safe-area-right) + 0.4rem));
    bottom: max(1.15rem, calc(var(--safe-area-bottom) + 0.65rem));
  }
  .curtain-track-hit {
    left: max(0.8rem, calc(var(--safe-area-left) + 0.4rem));
    right: max(calc(0.8rem + 7ch), calc(var(--safe-area-right) + 0.4rem + 7ch));
  }
  .moon-mark {
    right: max(12px, var(--safe-area-right));
    bottom: max(14px, var(--safe-area-bottom));
  }
  /* 星图日期是方向信息而非装饰；字号抬升后给三层卡重新留出天然气口。 */
  .threads-band { height: clamp(13rem, 32svh, 14.375rem); }
  .th-node--t2 .th-card { bottom: 50px; }
}

/* 横屏短视口只收垂直留白，不牺牲字号与缩放能力。 */
@media (max-height: 500px) and (orientation: landscape) {
  .hero { min-height: 100vh; min-height: 100svh; }
  .search-box { margin-top: max(3rem, calc(var(--safe-area-top) + 0.75rem)); }
  .kbd-card { max-height: calc(100dvh - var(--safe-area-top) - var(--safe-area-bottom) - 1rem); }
}

.ai-prerendered-message { margin-block: 2.5rem; scroll-margin-top: 5rem; }
.ai-prerendered-text { white-space: pre-wrap; overflow-wrap: anywhere; line-height: 1.9; }
