/* XLX portal v5 — leather survivor journal, real page-flip (StPageFlip) */

:root {
  --desk: #241d19;
  --desk2: #1a1512;
  --paper0: #f5efe2;
  --paper1: #ece1cc;
  --aged0: #eadbb9;
  --aged1: #dcc79c;
  --kraft: #c9a876;
  --kraft-deep: #a8845a;
  --ink: #2b2622;
  --pen: #31406b;
  --redpen: #b4362a;
  --blood: #7a1a12;
  --pencil: #6b655c;
  --line-blue: rgba(49, 64, 107, 0.22);
  --grid-line: rgba(107, 101, 92, 0.16);
  --tape: rgba(228, 216, 184, 0.72);
  --hand: "Caveat", "Ma Shan Zheng", KaiTi, STKaiti, STXingkai, serif;
  --body: "Caveat", KaiTi, STKaiti, "Kaiti SC", serif;
}

* { box-sizing: border-box; margin: 0; padding: 0; }

html, body { height: 100%; overflow: hidden; }

body {
  background:
    radial-gradient(1100px 560px at 30% -5%, #332920 0%, transparent 60%),
    repeating-linear-gradient(45deg, rgba(0,0,0,0.06) 0 2px, transparent 2px 7px),
    repeating-linear-gradient(-35deg, rgba(255,255,255,0.014) 0 3px, transparent 3px 9px),
    linear-gradient(160deg, var(--desk) 0%, var(--desk2) 100%);
  color: var(--ink);
  font-family: var(--body);
  font-size: 1.02rem;
  line-height: 1.7;
}

/* ---------------- nav ---------------- */
/* ---------------- 左侧导航栏（2026-10-11 终版：最初顶栏设计语言移至左侧竖排） ----------------
 * 保留原顶栏全部视觉基因：深色半透明条 rgba(26,21,18,.92)/手写体链接/红涂鸦标记/品牌徽标+防化三叶标；
 * 变化仅几何：fixed 左缘竖排、下边框改右边框、红涂鸦下划线转竖置于链接右侧。空间收益保留（书高 3.2rem 公式不动） */
.nav {
  position: fixed;
  left: 0; top: 0; bottom: 0;
  z-index: 100;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 1.1rem;
  padding: 1.3rem 1.1rem;
  width: max-content;
  background: rgba(26, 21, 18, 0.92);
  border-right: 1px solid rgba(0, 0, 0, 0.55);
  box-shadow: 4px 0 14px rgba(0, 0, 0, 0.4);
}
/* 品牌两行制（2026-10-12 用户裁定：XLX 大写拉丁一行+机密档案一行，黄色三叶标移除） */
.nav-brand {
  font-family: var(--hand);
  color: var(--paper0);
  transform: rotate(-2deg);
  margin-bottom: 0.6rem;
  display: block;
  text-align: center;
  line-height: 1.28;
}
.nav-brand b { display: block; font-weight: 700; font-size: calc(1.5rem * var(--pgscale, 1)); letter-spacing: 0.04em; }
.nav-brand i { display: block; font-style: normal; font-size: calc(0.92rem * var(--pgscale, 1)); letter-spacing: 0.18em; color: #c9b98f; margin-top: 2px; }
.nav a {
  font-family: var(--hand);
  font-size: 1.15rem;
  color: #b0a189;
  text-decoration: none;
  padding: 0.1rem 0.5rem 0.1rem 0.4rem;
  position: relative;
  transition: color 0.2s;
}
.nav a:hover { color: var(--paper0); }
.nav a.active { color: var(--paper0); }
.nav a.active::after {
  content: "";
  position: absolute;
  right: -0.55rem; top: 8%;
  bottom: 8%;
  width: 7px;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 7 100' preserveAspectRatio='none'%3E%3Cpath d='M4 2 Q 1 25 4 50 T 3 98' fill='none' stroke='%23b4362a' stroke-width='2.4' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center / 100% 100%;
}

/* 导航防化三叶标——2026-10-12 用户裁定移除（DOM 已删，留档勿复用） */
.nav-haz {
  width: 15px; height: 15px;
  vertical-align: -2px;
  margin-left: 0.3rem;
  opacity: 0.55;
  filter: sepia(0.15);
}

/* ---------------- book stage ---------------- */
.book-stage {
  height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1.4rem 1.5rem 1.6rem 5.2rem; /* 左侧留导航栏宽度（约 88px），纵向收益保留 */
  visibility: hidden;
  position: relative;
  z-index: 1;
}
.book-stage.ready { visibility: visible; }
#book {
  /* F1 投影静态化的必要补充（2026-10-04 灰屏崩溃根治）：F1 删除 drop-shadow 后
   * #book 子树失去分组属性不再 flatten——库 .stf__block perspective:2000px 的翻页
   * 3D 与外层 .book-tilt preserve-3d 盒体直接复合成嵌套 3D 上下文，真实 GPU 下
   * 开合循环中合成器层树爆炸→GPU 进程崩（0xe0000008，3440×1440 档实测复现，
   * "The GPU process has crashed"）。opacity<1 是零 blur 成本的 flatten 手段
   *（视觉差 0.1% 不可感知；与 F1 前 filter 的叠放语义一致）；盒体 b3 面在
   * wrapper 内 #book 外，不受影响。实测：加回后连续开合循环 3 次零崩溃。 */
  opacity: 0.999;
  width: min(1240px, 96vw);
  /* 2026-10-03 整体放大 25%：790→988（小屏由 100vh 钳制自适应）。
   * 2026-10-11 导航书签化：6.6→3.2rem——旧值含顶栏让位（54px 栏+间隙），顶栏退役后
   * 书高纵向空间回收（1366×768 实测书高 662→717，+8.3%，字身随 pgscale 等比） */
  height: min(988px, calc(100vh - 3.2rem));
}
/* 全分辨率适配（2026-10-03 用户反馈 3440x1440 书主体太小）：
 * 书宽交给库 autoSize（UI 构造即写 inline width:100% + max-width 2×1025=2050，
 * 随视口自适应）——高分辨率屏自然放大到 2050 宽；此处仅在高屏档提高 CSS 高度
 * 上限释放纵向空间。教训（实测）：CSS 定 width 与库 inline width:100% 不一致
 * 会触发库重渲染缺陷（stf__item 全 0 宽，同下方 720p 容器突变判例）——width 档禁写。 */
@media (min-height: 1300px) and (min-width: 1600px) {
  #book { height: 1200px; }
}
@media (min-height: 2000px) and (min-width: 2000px) {
  #book { height: 1475px; }
}
/* 超宽屏(≥2200px)氛围补强：油灯径向光半径放大，覆盖书两侧大空白 */
@media (min-width: 2200px) {
  .lamp-glow {
    background:
      radial-gradient(122% 92% at 50% 42%, transparent 54%, rgba(8, 5, 3, 0.44) 100%),
      radial-gradient(900px 640px at calc(34% + var(--mx, 0) * 3%) calc(20% + var(--my, 0) * 3%), rgba(255, 190, 96, 0.13), transparent 70%),
      radial-gradient(1500px 1100px at calc(40% + var(--mx, 0) * 2%) calc(32% + var(--my, 0) * 2%), rgba(255, 160, 70, 0.07), transparent 75%);
  }
}
/* 批5 探查记录（2026-10-02，按方案裁定 4a 记录关闭）：窄竖屏(≤860px)下 StPageFlip
 * portrait 单页模式把页渲染在容器右半（PIL 像素仲裁：720p 亮区 365..697 右贴边）。
 * 尝试收窄 #book 到 380px 居中——库 resize 后页面渲染归零（stf__item 全 0 宽），
 * 回滚。根因在库 portrait 布局对容器宽度突变的重渲染缺陷，升级/换库时再议。 */

/* ---------------- pages ---------------- */
/* western skin: ambientCG CC0 — Paper005 parchment (pages), Leather001 brown tint (cover) */
.page {
  background:
    linear-gradient(rgba(240, 226, 192, 0.18), rgba(226, 205, 162, 0.18)),
    url("/img/tex/styles/western/paper.jpg") center / cover;
  overflow: hidden;
}
/* paper grain + burnt parchment edges + 烟熏黄化（页顶向下的烟气熏染） */
.page::before {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  box-shadow: inset 0 0 46px 16px rgba(96, 58, 20, 0.30);
  background:
    linear-gradient(180deg, rgba(122, 88, 38, 0.14) 0%, transparent 26%),
    radial-gradient(120% 95% at 50% 45%, transparent 52%, rgba(96, 58, 20, 0.28) 100%),
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3'/%3E%3CfeColorMatrix values='0 0 0 0 0.35 0 0 0 0 0.28 0 0 0 0 0.18 0 0 0 0.05 0'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)'/%3E%3C/svg%3E");
}
.page.--left { box-shadow: inset -34px 0 42px -34px rgba(40, 25, 12, 0.5); }
.page.--right { box-shadow: inset 34px 0 42px -34px rgba(40, 25, 12, 0.5); }
/* page-stack thickness lines on the outer edge */
.page.--right:not(.cover)::after {
  content: "";
  position: absolute;
  top: 8px; bottom: 8px; right: 0;
  width: 5px;
  background: repeating-linear-gradient(180deg, #d9cbaa 0 1px, #b3a384 1px 3px);
  opacity: 0.75;
  pointer-events: none;
}

/* inner scroll layer stays transparent so paper texture and stains show through */
.page-inner {
  position: relative;
  z-index: 1;
  height: 100%;
  overflow-y: auto;
  padding: 1.7rem 1.7rem 1.5rem 2.1rem;
  background: transparent;
  scrollbar-width: thin;
  scrollbar-color: var(--pencil) transparent;
}
.page-inner.split { display: flex; gap: 1.2rem; }
.split-main { flex: 1 1 auto; min-width: 0; }

/* ---------------- cover ---------------- */
.cover {
  background:
    radial-gradient(90% 80% at 40% 35%, rgba(84, 52, 24, 0.30) 0%, transparent 70%),
    linear-gradient(155deg, rgba(40, 24, 10, 0.50) 0%, rgba(26, 16, 8, 0.68) 100%),
    url("/img/tex/styles/western/cover.jpg") center / cover;
  border: 6px solid #241505;
  outline: 2px solid rgba(190, 150, 70, 0.4);
  outline-offset: -12px;
  border-radius: 6px 14px 14px 6px;
}
/* newspaper-clipping cover */
.cover.cover-news {
  background:
    radial-gradient(90% 70% at 50% 30%, rgba(74, 46, 20, 0.30) 0%, transparent 75%),
    linear-gradient(160deg, rgba(36, 22, 10, 0.60) 0%, rgba(22, 13, 6, 0.76) 100%),
    url("/img/tex/styles/western/cover.jpg") center / cover;
  border-color: #1a0f04;
}
.cover-clip {
  position: relative;
  width: 68%;
  margin-bottom: 1.4rem;
  background: #f2ecdd;
  padding: 0.55rem 0.55rem 0.8rem;
  transform: rotate(-2.2deg);
  box-shadow: 5px 8px 18px rgba(0, 0, 0, 0.55);
}
.cover-clip img { display: block; width: 100%; filter: grayscale(0.2) sepia(0.22) contrast(1.05); }
.cover-clip::before { /* tape strip */
  content: "";
  position: absolute;
  top: -13px; left: 50%;
  width: 96px; height: 27px;
  transform: translateX(-50%) rotate(-4deg);
  background: var(--tape);
  clip-path: polygon(3% 0, 97% 4%, 100% 88%, 95% 100%, 4% 96%, 0 10%);
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
}
.cover.cover-news .cover-title {
  font-family: Georgia, "Times New Roman", "Songti SC", SimSun, serif;
  font-weight: 700;
  font-size: clamp(1.9rem, 3.6vw, 2.9rem);
  letter-spacing: 0.08em;
  text-shadow: 0 2px 10px rgba(0, 0, 0, 0.8);
}
.cover.cover-news .cover-sub { letter-spacing: 0.22em; font-size: 1.05rem; }
.cover.cover-news .duct { opacity: 0.55; }
.back-logo { width: 150px; opacity: 0.75; transform: rotate(-2deg); filter: drop-shadow(2px 3px 4px rgba(0,0,0,0.5)); }
/* 批1b 封底署名（2026-10-02）：CC BY 4.0 署名义务落点，小字铅笔灰 */
.credits-line { margin-top: 1.4rem; font-family: var(--hand); font-size: 0.85rem; }
.credits-line a { color: var(--pencil); text-decoration: underline dotted rgba(139,127,106,.7); text-underline-offset: 3px; }
.credits-line a:hover { color: var(--ink); }
.cover .cover-inner {
  position: relative;
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: 2rem 2rem 4.6rem;
}
.cover-title {
  font-family: var(--hand);
  font-size: clamp(2.2rem, 4.2vw, 3.4rem);
  font-weight: 700;
  color: #d8b36a;
  letter-spacing: 0.08em;
  text-shadow: 0 1px 0 #120d08, 0 0 22px rgba(216, 178, 106, 0.3);
}
/* 烫金逐字渐变（标题经 splitWrite 拆成 .ch 单字，渐变须落在字级，避免父级 background-clip:text 被子元素 transform 破坏） */
.cover-title .ch,
.hero-title .ch,
.section-title .ch {
  background: linear-gradient(180deg, #eccf8a 0%, #c89a3a 55%, #8a5c18 100%);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}
/* 精装化 P3 烫金 deboss（2026-10-03，裁定 2a）：1px 错位双色凹陷——上暗下亮，色调不变 */
.cover-title .ch { filter: drop-shadow(0 -1px 1px rgba(20, 10, 4, 0.6)) drop-shadow(0 1px 1px rgba(255, 222, 158, 0.3)); }
.cover-sub {
  margin-top: 1rem;
  font-family: var(--hand);
  font-size: 1.15rem;
  color: #a5916f;
  letter-spacing: 0.3em;
}
/* ===== 封面铅印重做（2026-10-12 缺页修复批）=====
 * 主标题由手写日志名改为官方档案名（宋体铅印），手写降级为一行涂写批注。
 * 旧 .cover-title / .cover-sub 规则自此无消费者，留档不删（历史视觉基线）。 */
/* 公文头：打字机体双线表头（上细下双粗），公司名与表单号两端对齐，表单号红墨；
 * 绝对定位贴页顶（不随内容块垂直居中——档案封表头出厂就该在顶） */
.cover-official {
  position: absolute; top: 2.2rem; left: 2rem; right: 2rem;
  display: flex; justify-content: space-between; align-items: baseline;
  font-family: SpecialElite, "Courier New", monospace;
  font-size: calc(10.5px * var(--pgscale, 1)); letter-spacing: 0.14em;
  color: #c9b98f;
  border-top: 1px solid rgba(201, 185, 143, 0.5);
  border-bottom: 3px double rgba(201, 185, 143, 0.5);
  padding: 0.4rem 0.2rem 0.5rem;
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.65);
}
.cover-official .co-form { color: #c05a3a; letter-spacing: 0.1em; }
/* 封面精修批（2026-10-12 用户裁定：颜色/排版/照片保留，只优化字号与节奏）：
 * 小字下限 9.5px、垂直间距拉开呼吸感 */
.cover-clip { margin-bottom: 1.8rem; }
.cover-printed-h1 {
  /* 排版修正（2026-10-12 用户裁定"字体歪"）：SimSun 无 900 真字重，合成伪粗体
   * 在高分屏近看笔画毛糙错落——改 400 真字重+同色细描边受控加粗（铅印版画感）；
   * 字距收敛 0.22→0.14em 减小 XLX/中文宽度悬殊的错落观感 */
  font-family: SimSun, serif; font-weight: 400;
  -webkit-text-stroke: calc(1.1px * var(--pgscale, 1)) #e6d9b8;
  font-size: clamp(2.3rem, 4.6vw, 3.6rem);
  letter-spacing: 0.14em; text-indent: 0.14em;
  color: #e6d9b8;
  line-height: 1.3;
  margin: 0.55rem 0 0.75rem;
  text-shadow: 0 1px 0 #14100a, 0 3px 10px rgba(0, 0, 0, 0.8);
}
/* 铅印副题行：打字机体小字，上下细线夹行 */
.cover-printed-sub {
  font-family: SpecialElite, "Courier New", monospace;
  font-size: calc(11px * var(--pgscale, 1)); letter-spacing: 0.28em;
  color: #b7a67c;
  padding: 0.34rem 1rem;
  border-top: 1px solid rgba(183, 166, 124, 0.45);
  border-bottom: 1px solid rgba(183, 166, 124, 0.45);
}
/* 手写批注降级：幸存者涂写在官方封上的一行；
 * 2026-10-12 用户裁定拉正——整行倾斜与逐字随机旋转全部归零（保留手写字体笔迹与入场动画） */
.cover-hand-note {
  margin-top: 1.5rem;
  font-family: var(--hand);
  font-size: calc(14px * var(--pgscale, 1));
  color: #cfa870;
  letter-spacing: 0.1em;
  transform: none;
  opacity: 0.92;
  text-shadow: 0 1px 3px rgba(0, 0, 0, 0.55);
}
.cover-hand-note .ch { --r: 0deg; }
/* 机密章：红印双框斜盖——2026-10-12 用户裁定迁至环衬（.flyleaf-stamp），封面无消费者留档 */
.cover-stamp {
  position: absolute; right: 8%; top: 30%;
  font-family: SimSun, serif; font-weight: 900;
  font-size: calc(15px * var(--pgscale, 1)); letter-spacing: 0.26em;
  text-align: center; line-height: 1.55;
  color: #c2372a;
  border: 3px solid #c2372a;
  outline: 1px solid rgba(194, 55, 42, 0.6); outline-offset: 3px;
  border-radius: 3px;
  padding: 0.45rem 0.7rem 0.5rem;
  transform: rotate(-12deg);
  opacity: 0.9;
  text-shadow: 0 0 1px rgba(194, 55, 42, 0.7), 0 1px 6px rgba(120, 20, 10, 0.5);
  pointer-events: none;
  z-index: 3;
}
/* 档案登记栏：封面下部出厂登记信息，细表格线+打字机体 */
.cover-regform {
  margin-top: 1.85rem;
  width: min(460px, 92%);
  display: grid; grid-template-columns: repeat(4, 1fr);
  border: 1px solid rgba(183, 166, 124, 0.38);
  background: rgba(20, 12, 5, 0.35);
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.4);
}
.cover-regform .rg-cell {
  display: flex; flex-direction: column; gap: 0.24rem;
  padding: 0.55rem 0.6rem 0.6rem;
  border-left: 1px solid rgba(183, 166, 124, 0.25);
}
.cover-regform .rg-cell:first-child { border-left: none; }
.cover-regform i {
  font-style: normal;
  font-family: SimSun, serif;
  font-size: calc(9.5px * var(--pgscale, 1)); letter-spacing: 0.2em;
  color: #9a8a63;
}
.cover-regform b {
  font-weight: 400;
  font-family: SpecialElite, "Courier New", monospace;
  font-size: calc(11.5px * var(--pgscale, 1));
  color: #d8c9a0;
  white-space: nowrap;
}
/* 销毁日期涂黑条（机密档案永久保管彩蛋；2026-10-12 优化：弃 █ 字符——四块间隙不均，
 * 改连续整条涂销带（档案馆涂黑笔一次性划过满栏的形态） */
.cover-regform .rg-redact {
  display: block;
  width: 100%;
  height: calc(9px * var(--pgscale, 1));
  background: linear-gradient(180deg, #241a0d, #2e2212 55%, #1d1409);
  border-radius: 1px;
  margin-top: calc(4px * var(--pgscale, 1));
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
}
/* 封底收尾带：条码+封存说明 */
.back-filebar {
  display: flex; align-items: center; gap: 0.9rem;
  margin-top: 1.5rem;
  font-family: SpecialElite, "Courier New", monospace;
  font-size: calc(8.5px * var(--pgscale, 1)); letter-spacing: 0.14em;
  color: #b7a67c;
  border-top: 1px solid rgba(183, 166, 124, 0.4);
  padding-top: 0.7rem;
}
.back-filebar .barcode {
  flex: 0 0 92px; height: 26px;
  background: repeating-linear-gradient(90deg,
    #c9b98f 0 2px, transparent 2px 4px, #c9b98f 4px 7px, transparent 7px 9px,
    #c9b98f 9px 10px, transparent 10px 13px, #c9b98f 13px 15px, transparent 15px 16px);
  opacity: 0.75;
}
/* U4（2026-10-04）：warn-tape 黄黑警戒条与 corner-guard 金属包角按方案精简移除（DOM 已删） */
.duct {
  position: absolute;
  width: 110px; height: 34px;
  background: linear-gradient(180deg, #8d8d8f, #6f6f72 55%, #858587);
  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.5);
  opacity: 0.9;
  clip-path: polygon(2% 0, 98% 4%, 100% 92%, 95% 100%, 3% 96%, 0 8%);
}
/* 2026-10-12 用户裁定：封面两枚胶带贴条（dt-tl/dt-br）移除，留档勿复用（铅印档案封不走手账胶带语汇） */
.dt-tl { top: 16px; left: -30px; transform: rotate(var(--r, -42deg)); }
.dt-br { bottom: 20px; right: -28px; transform: rotate(var(--r, -40deg)); }

/* 批3 封面金属包角已于 U4（2026-10-04）按方案精简移除（DOM/CSS 同清） */
.back-cover .cover-inner { justify-content: center; padding: 2rem; }

/* ---------------- collage (left) pages ---------------- */
.collage {
  background:
    linear-gradient(rgba(226, 205, 162, 0.24), rgba(205, 178, 132, 0.24)),
    url("/img/tex/styles/western/paper.jpg") center / cover;
}
.collage-body {
  position: relative;
  height: 100%;
  padding: 1.2rem 1.4rem;
  overflow-y: auto;
  scrollbar-width: thin;
  scrollbar-color: var(--pencil) transparent;
}

/* taped in-game flyer (polaroid-style frame) */
.cl-flyer {
  position: relative;
  width: 66%;
  margin: 0.2rem auto 0.8rem;
  background: #fbf7ec;
  padding: 0.5rem 0.5rem 0.65rem;
  box-shadow: 4px 6px 14px rgba(30, 20, 10, 0.35);
  transform: rotate(-2deg);
  transition: transform 0.22s ease, box-shadow 0.22s ease;
}
.cl-flyer:hover { transform: rotate(-0.6deg) translateY(-3px); box-shadow: 6px 10px 18px rgba(30, 20, 10, 0.42); }
.cl-flyer img { display: block; width: 100%; }
.cl-flyer::before { /* tape strip */
  content: "";
  position: absolute;
  top: -12px; left: 50%;
  width: 88px; height: 25px;
  transform: translateX(-50%) rotate(-3deg);
  background: var(--tape);
  clip-path: polygon(3% 0, 97% 4%, 100% 88%, 95% 100%, 4% 96%, 0 10%);
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.18);
}
.cl-flyer::after { /* staple */
  content: "";
  position: absolute;
  top: -4px; right: 14px;
  width: 24px; height: 8px;
  border-radius: 4px;
  background: linear-gradient(180deg, #c8c8cc, #7d7d83 55%, #a9a9ae);
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
  transform: rotate(8deg);
}

/* newspaper photo clipping */
.cl-clip {
  position: relative;
  width: 40%;
  margin: 0.2rem 0 0.8rem auto;
  background: #f2ecdd;
  padding: 0.4rem;
  border: 1px solid rgba(60, 50, 35, 0.28);
  box-shadow: 3px 5px 10px rgba(30, 20, 10, 0.3);
  transform: rotate(2.4deg);
  transition: transform 0.22s ease, box-shadow 0.22s ease;
}
.cl-clip:hover { transform: rotate(1deg) translateY(-2px); box-shadow: 5px 8px 14px rgba(30, 20, 10, 0.36); }
.cl-clip img { display: block; width: 100%; filter: grayscale(0.15) sepia(0.18) contrast(1.03); }
.cl-clip::before { /* tape on corner */
  content: "";
  position: absolute;
  top: -10px; right: -14px;
  width: 74px; height: 24px;
  transform: rotate(38deg);
  background: var(--tape);
  clip-path: polygon(3% 0, 97% 4%, 100% 88%, 95% 100%, 4% 96%, 0 10%);
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
}

/* small sticker (logo / icon) */
.cl-sticker {
  display: block;
  width: 68px;
  margin: 0.1rem auto 0;
  transform: rotate(-4deg);
  filter: drop-shadow(2px 3px 3px rgba(30, 20, 10, 0.3));
}

/* 中大型海报贴纸（2026-10-03 用户裁定：名人堂小贴纸换 Delilah 原版海报）
 * 白衬边相框+顶部图钉+52% 宽，与传单/剪报构成三件套；hover 摆正 */
.cl-poster {
  position: relative;
  width: 52%;
  margin: 0.1rem auto 0.7rem;
  background: #fbf7ec;
  padding: 0.35rem 0.35rem 0.5rem;
  box-shadow: 4px 6px 14px rgba(30, 20, 10, 0.38);
  transform: rotate(-3deg);
  transition: transform 0.22s ease, box-shadow 0.22s ease;
}
.cl-poster:hover { transform: rotate(-1deg) translateY(-3px); box-shadow: 6px 10px 18px rgba(30, 20, 10, 0.45); }
.cl-poster img { display: block; width: 100%; }
.cl-poster .pin {
  position: absolute;
  top: -8px;
  left: 50%;
  transform: translateX(-50%);
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: radial-gradient(circle at 35% 30%, #d8d2c4 0 20%, #8f8578 60%, #55503f 100%);
  box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4);
}

/* ===== 海报展示墙（2026-10-03 方案_左页海报轮播展示墙，裁定 1a/2c/4b；
 * 2026-10-03 用户复验修正：白衬边撤除（横版海报 contain 留白放大白边观感差）——
 * 纯海报直贴纸面，槽比例由 JS 按首张海报比例自适应（fallback 竖 A 比） ===== */
.pslot {
  position: relative;
  margin: 0.2rem auto 0.8rem;
  box-shadow: 4px 6px 14px rgba(30, 20, 10, 0.35);
  transform: rotate(var(--pr, -2deg));
  transition: transform 0.22s ease, box-shadow 0.22s ease;
  display: grid;
}
.pslot:hover { transform: rotate(calc(var(--pr) + 1deg)) translateY(-3px); box-shadow: 6px 10px 18px rgba(30, 20, 10, 0.42); }
.pslot.large { width: 66%; --pr: -2deg; aspect-ratio: 1240 / 1754; }
.pslot.medium { width: 52%; --pr: -3deg; aspect-ratio: 1240 / 1754; }
.pslot.large::before { /* 顶部胶带（直接压海报顶边） */
  content: "";
  position: absolute;
  top: -10px; left: 50%;
  width: 88px; height: 25px;
  transform: translateX(-50%) rotate(-3deg);
  background: var(--tape);
  clip-path: polygon(3% 0, 97% 4%, 100% 88%, 95% 100%, 4% 96%, 0 10%);
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.18);
  z-index: 2;
}
.pslot.medium .pin {
  position: absolute;
  top: -7px; left: 50%;
  transform: translateX(-50%);
  width: 15px; height: 15px;
  border-radius: 50%;
  background: radial-gradient(circle at 35% 30%, #d8d2c4 0 20%, #8f8578 60%, #55503f 100%);
  box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.4);
  z-index: 2;
}
.pframe {
  grid-area: 1 / 1;
  width: 100%;
  height: 100%;
  object-fit: contain;
  opacity: 1;
  transform: none;
}
.pframe.back { opacity: 0; }
.pframe.out { opacity: 0; transform: rotate(3.5deg) scale(0.97); transition: opacity 0.45s ease-in, transform 0.45s ease-in; }
.pframe.in { opacity: 1; transform: none; transition: opacity 0.55s ease-out, transform 0.55s cubic-bezier(0.3, 1.4, 0.6, 1); }

/* 海报集抽屉（裁定 3a：右下角图钉彩蛋按钮+套件纸片面板） */
#poster-drawer-root { position: fixed; right: 18px; bottom: 16px; z-index: 60; }
.pd-btn {
  display: flex;
  align-items: center;
  gap: 6px;
  background: #f6edd6;
  border: 1.5px solid rgba(74, 58, 32, 0.55);
  border-radius: 999px 10px 12px 8px / 10px 12px 8px 999px;
  padding: 6px 12px 6px 9px;
  font-family: var(--hand);
  font-size: 0.95rem;
  color: var(--ink);
  cursor: pointer;
  box-shadow: 2px 3px 8px rgba(30, 20, 10, 0.35);
  transform: rotate(-2deg);
}
.pd-btn:hover { transform: rotate(-0.5deg) translateY(-1px); }
.pd-pin {
  width: 12px; height: 12px;
  border-radius: 50%;
  background: radial-gradient(circle at 35% 30%, #e5dcc8, #9a8f7c 60%, #5d564a);
  box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.4);
}
.pd-panel {
  position: absolute;
  right: 0;
  bottom: calc(100% + 8px);
  background: #f6edd6;
  border: 1.5px solid rgba(74, 58, 32, 0.55);
  border-radius: 10px 4px 12px 5px / 5px 12px 4px 10px;
  padding: 0.45rem 0.55rem;
  min-width: 150px;
  box-shadow: 3px 5px 12px rgba(30, 20, 10, 0.35);
  transform: rotate(1deg);
}
.pd-item {
  display: block;
  width: 100%;
  text-align: left;
  background: none;
  border: none;
  font-family: var(--hand);
  font-size: 1.05rem;
  color: var(--ink);
  padding: 0.3rem 0.5rem;
  cursor: pointer;
  border-radius: 6px;
}
.pd-item:hover { background: rgba(120, 96, 58, 0.12); }
.pd-item.active { color: var(--redpen); font-weight: 700; }
.pd-item.active::after { content: " ✓"; }

/* ---------------- 铅印公文标题 + 打字机入场（整体档案化批3，2026-10-12 裁定2） ---------------- */
.eyebrow { font-family: SpecialElite, monospace; font-size: calc(9px * var(--pgscale, 1));
  letter-spacing: 3px; color: #6b5d42; margin-bottom: 2px; }
.file-title .ch { display: inline-block; opacity: 0; white-space: pre; }
.page.play .file-title .ch {
  /* 打字机入场。原 0.01s steps(1,end) 瞬跳方案在 Chrome 有确定性缺字缺陷
   *（矩阵实验实锤：60ms 递延+超短 steps 动画=最终态丢失，"务"字消失），
   * 改 0.2s ease-out 快淡入：逐字节奏保留，动画窗口放大后缺陷消失（矩阵 D 组全显） */
  animation: twChar 0.2s ease-out both;
  animation-delay: var(--d, 0ms);
}
@keyframes twChar { from { opacity: 0; } to { opacity: 1; } }

/* ---------------- handwriting entrance ---------------- */
.handwrite .ch { display: inline-block; opacity: 0; white-space: pre; }
.page.play .handwrite .ch {
  animation: write 0.45s cubic-bezier(0.3, 1.4, 0.6, 1) both;
  animation-delay: var(--d, 0ms);
}
@keyframes write {
  from { opacity: 0; transform: translateY(9px) rotate(calc(var(--r, 0deg) * 3)) scale(1.25); }
  to { opacity: 1; transform: translateY(0) rotate(var(--r, 0deg)) scale(1); }
}
/* 兜底保险（2026-10-12 缺字修复）：playPage 1.5s 后加 .typed，动画卡死场景强制可见。
 * 必须置于 write/twChar 两条 play 规则之后（同特异性，后来者赢）；
 * 必须 animation:none——冻结动画的当前值优先级高于普通 opacity 声明（IAB 冻结态实测） */
.page.typed .file-title .ch,
.page.typed .handwrite .ch { animation: none; opacity: 1; }
.anim { opacity: 0; transform: translateY(10px) rotate(var(--r, 0deg)); }
.page.play .anim {
  opacity: 1;
  transform: translateY(0) rotate(var(--r, 0deg));
  transition: opacity 0.45s ease, transform 0.45s ease;
  transition-delay: var(--d, 0ms);
}
.draw > *, .draw { stroke-dasharray: 100; stroke-dashoffset: 100; }
.page.play .draw > *, .page.play .draw {
  animation: drawline 1.1s ease-out forwards;
  animation-delay: var(--dd, 300ms);
}
@keyframes drawline { to { stroke-dashoffset: 0; } }

/* ---------------- hero page（2026-10-12 H2 通令页重排：左=重建通令） ---------------- */
.hero-inner { text-align: left; padding-top: 0.8rem; position: relative; }
/* 铅印主标题（原手写烫金改宋体 900 铅印，与全书公文语言统一） */
.hero-title {
  font-family: SimSun, serif;
  font-size: calc(28px * var(--pgscale, 1));
  font-weight: 900;
  color: #2b2419;
  letter-spacing: calc(6px * var(--pgscale, 1));
  margin: calc(9px * var(--pgscale, 1)) 0 5px;
}
.hero-title .ch { background: none; color: #2b2419; filter: none; }
.hero-subline {
  font-family: SpecialElite, "Courier New", monospace;
  font-size: calc(10px * var(--pgscale, 1)); letter-spacing: calc(2px * var(--pgscale, 1));
  color: #4a4030;
  border-top: 1px solid rgba(74, 64, 48, 0.4);
  border-bottom: 3px double rgba(74, 64, 48, 0.4);
  padding: 5px 2px 6px;
  margin-bottom: calc(18px * var(--pgscale, 1));
}
/* 重建通令框（双线框公文） */
.hero-notice {
  border: calc(2px * var(--pgscale, 1)) solid rgba(43, 36, 25, 0.75);
  padding: calc(20px * var(--pgscale, 1)) calc(22px * var(--pgscale, 1)) calc(18px * var(--pgscale, 1));
  position: relative;
}
.hero-notice::after { content: ""; position: absolute; inset: 4px; border: 1px solid rgba(43, 36, 25, 0.4); pointer-events: none; }
.hero-notice .hn-no { text-align: center; font-family: SpecialElite, "Courier New", monospace;
  font-size: calc(10px * var(--pgscale, 1)); letter-spacing: calc(3px * var(--pgscale, 1));
  color: #7c2d20; margin-bottom: calc(10px * var(--pgscale, 1)); }
.hero-notice .hn-title { text-align: center; font-family: SimSun, serif; font-weight: 900;
  font-size: calc(20px * var(--pgscale, 1)); letter-spacing: calc(10px * var(--pgscale, 1)); text-indent: calc(10px * var(--pgscale, 1));
  margin-bottom: calc(13px * var(--pgscale, 1)); }
.hero-notice p { font-family: SpecialElite, "Courier New", SimSun, monospace;
  font-size: calc(11.5px * var(--pgscale, 1)); line-height: 2.0; color: #33291a;
  letter-spacing: 0.5px; text-align: justify; }
.hero-notice p + p { margin-top: calc(7px * var(--pgscale, 1)); text-indent: 2em; }
.hero-notice .hn-motto { text-align: center; font-family: SimSun, serif; font-weight: 900;
  font-size: calc(15px * var(--pgscale, 1)); letter-spacing: calc(4px * var(--pgscale, 1));
  color: #2b2419; border-top: 1px solid rgba(43, 36, 25, 0.35);
  padding-top: calc(11px * var(--pgscale, 1)); margin-top: calc(12px * var(--pgscale, 1)); }
/* 已颁布红章（fx：通令落定后盖） */
.hn-stamp { position: absolute; right: calc(34px * var(--pgscale, 1)); bottom: calc(56px * var(--pgscale, 1));
  color: #c2372a; font-family: SimSun, serif; font-weight: 900;
  font-size: calc(14px * var(--pgscale, 1)); letter-spacing: calc(4px * var(--pgscale, 1));
  border: calc(3px * var(--pgscale, 1)) double #c2372a; padding: 3px 10px 4px;
  transform: rotate(-11deg); opacity: 0.8; pointer-events: none; z-index: 3; }
/* 签发行 */
.hero-sigrow { display: flex; justify-content: space-between; margin-top: calc(14px * var(--pgscale, 1));
  font-family: SpecialElite, "Courier New", SimSun, monospace;
  font-size: calc(11px * var(--pgscale, 1)); color: #4a4030; letter-spacing: 1px; }
/* slogan/hero-arrow 2026-10-12 H2 重排后无消费者（口号入通令结束语），留档勿复用 */
.slogan {
  margin-top: 0.5rem;
  font-family: var(--hand);
  font-size: 1.25rem;
  color: var(--pen);
  letter-spacing: 0.3em;
}
/* taped newspaper clipping on hero page (img: no pseudo-elements, so plain cut style) */
.hero-clip {
  width: min(240px, 52%);
  margin: 1rem auto 0.2rem;
  display: block;
  transform: rotate(1.6deg);
  box-shadow: 3px 5px 12px rgba(30, 20, 10, 0.3);
  filter: grayscale(0.15) sepia(0.18) contrast(1.03);
  border: 4px solid #f2ecdd;
}
/* 电报纸数据徽章（2026-10-03 v2 用户裁定重设计：原横线纹+锯齿+红字贴条突兀——
 * 融入 stat-card/tp-card 同语汇：浅纸底+细边框+小圆角+墨色标签；保留 VERIFIED 章叙事） */
.annotations { display: flex; gap: 1.6rem; justify-content: center; margin-top: 1.3rem; flex-wrap: wrap; position: relative; }
.annotations::after {
  content: "已核实 VERIFIED";
  position: absolute;
  right: -6px; top: -22px;
  font-family: var(--hand);
  font-size: 0.72rem;
  letter-spacing: 0.08em;
  color: #2c3a55;
  border: 2.5px solid #2c3a55;
  border-radius: 3px;
  padding: 0.1rem 0.35rem;
  transform: rotate(7deg);
  opacity: 0.66;
  mix-blend-mode: multiply;
  pointer-events: none;
}
.note-anno {
  font-family: var(--hand);
  font-size: clamp(0.95rem, 1.5vh, 1.5rem);
  color: var(--pen);
  display: flex;
  align-items: baseline;
  gap: 0.35rem;
  padding: 0.5rem 0.95rem 0.55rem;
  background: rgba(251, 247, 236, 0.62);
  border: 1.5px solid rgba(74, 58, 32, 0.42);
  border-radius: 8px 12px 6px 10px;
  box-shadow: 2px 3px 8px rgba(30, 20, 10, 0.18);
}
.anno-num { font-size: clamp(1.5rem, 2.6vh, 2.6rem); color: #7a4d12; padding: 0 0.25rem; font-family: var(--hand); font-weight: 700; }
.online-names {
  margin-top: 0.9rem;
  font-family: var(--hand);
  font-size: 0.98rem;
  color: var(--pencil);
}
.online-names::before { content: "无线电监听｜"; color: #8b7f6a; }

/* ---------------- section titles ---------------- */
/* 深金棕墨水：深金渐变字（近手写金墨 #8a5f1c 系，与羊皮纸对比足）+ 暖棕柔影出墨层厚度 */
.section-title {
  /* 整体档案化批3（2026-10-12）：手写金墨 → 铅印宋体公文（全书无手写栏目标题残余） */
  font-family: SimSun, serif;
  font-size: 1.7rem;
  font-weight: 900;
  letter-spacing: 4px;
  color: #2b2419;
  margin-bottom: 1rem;
  display: inline-block;
  border-bottom: 3px double #2b2419;
  padding-bottom: 4px;
  position: relative;
}
/* 批1b 图案语汇（2026-10-02）：双线下沿嵌锯齿装饰带，墨染 zig-zag 平铺，
 * 左右出头一点，手账胶版印刷感；透明度压到"第二眼才看见" */
.section-title::after {
  content: "";
  position: absolute;
  top: calc(100% + 6px);
  left: -8px;
  right: -26px;
  height: 11px;
  background: url("/img/patterns/tex-zigzag.svg") left center / auto 11px repeat-x;
  opacity: 0.34;
  pointer-events: none;
}
.hero-title .ch, .section-title .ch {
  background: linear-gradient(180deg, #b3852f 0%, #8a5f1c 55%, #664310 100%);
  -webkit-background-clip: text;
  background-clip: text;
  filter:
    drop-shadow(0 1px 0 rgba(70, 45, 10, 0.6))
    drop-shadow(0 2px 3px rgba(60, 38, 8, 0.35));
}
/* 分区标题与扉页大标题同规（用户裁定：颜色字感对齐第一页，2026-09-21） */
/* 小字号下渐变亮部吃笔画显"虚"：分区标题改实色墨 #7a4d12（纯色渲染最锐利）+ 清晰单投影（用户定稿） */
.section-title .ch {
  background: none;
  color: #7a4d12;
  filter: drop-shadow(0 1px 0 rgba(90, 58, 12, 0.5));
}

/* ---------------- features ---------------- */
.entries { display: grid; grid-template-columns: 1fr 1fr; gap: 0.9rem 1.3rem; }
.entry { display: flex; gap: 0.7rem; align-items: flex-start; }
.entry-icon { flex: 0 0 32px; width: 32px; height: 32px; }
.entry-icon svg { width: 100%; height: 100%; }
.entry-no { font-family: var(--hand); color: var(--redpen); font-size: 0.92rem; }
.entry h3 { font-family: var(--hand); font-size: 1.2rem; color: var(--ink); margin-bottom: 0.02rem; }
.entry p { color: var(--pen); font-size: 0.9rem; line-height: 1.45; }

/* ---------------- events TODO ---------------- */
.todo { max-width: 100%; }
.todo-item { position: relative; display: flex; gap: 0.7rem; align-items: flex-start; padding: 0.45rem 0.3rem; }
.todo-no { font-family: var(--hand); font-size: 1.3rem; color: var(--redpen); min-width: 1.7rem; }
.todo-icon { flex: 0 0 28px; width: 28px; height: 28px; margin-top: 0.12rem; }
.todo-icon svg { width: 100%; height: 100%; }
.todo-body { flex: 1; }
.todo-title { font-family: var(--hand); font-size: 1.2rem; color: var(--ink); }
.todo-date { font-family: var(--hand); font-size: 0.85rem; color: var(--pencil); }
.todo-desc { color: var(--pen); font-size: 0.88rem; line-height: 1.5; }
.todo-item.active::after {
  content: "";
  position: absolute;
  inset: 0 -12px;
  border: 3px solid var(--redpen);
  border-radius: 48% 52% 51% 49% / 58% 46% 54% 42%;
  transform: rotate(-0.8deg);
  opacity: 0.85;
  pointer-events: none;
}
.todo-item.upcoming .todo-title, .todo-item.upcoming .todo-desc { color: var(--pencil); }
.todo-item.ended .todo-title, .todo-item.ended .todo-desc, .todo-item.ended .todo-date { color: #9a917e; }
.todo-item.ended .todo-body { position: relative; }
.todo-item.ended .todo-body::after {
  content: "";
  position: absolute;
  left: -2%; right: -2%; top: 0.95rem;
  height: 6px;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 6' preserveAspectRatio='none'%3E%3Cpath d='M1 4 Q 20 1 40 3 T 75 3 T 99 2' fill='none' stroke='%23b4362a' stroke-width='2.6' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center / 100% 100%;
  transform: rotate(-0.6deg);
  opacity: 0.8;
}
.tl-tag {
  display: inline-block;
  font-family: var(--hand);
  font-size: 0.82rem;
  padding: 0 0.5rem;
  margin-left: 0.5rem;
  border: 2px solid currentColor;
  border-radius: 40% 60% 55% 45% / 60% 45% 55% 40%;
  vertical-align: middle;
}
.todo-item.active .tl-tag { color: var(--redpen); }
.todo-item.upcoming .tl-tag { color: var(--pencil); }
.todo-item.ended .tl-tag { color: #9a917e; }

/* ---------------- season rail: paper index tabs on page edge ---------------- */
.season-rail {
  flex: 0 0 auto;
  display: flex;
  flex-direction: column;
  gap: 0.8rem;
  padding-top: 4rem;      /* 名人堂右页 rail 用（rank 页已被 .board-row>.season-rail 归零） */
  align-self: flex-start;
}
/* 赛季书签（2026-10-17 用户裁定 S2·牛皮纸打孔签，预览 v1）：牛皮纸渐变+顶孔挂签，
 * 选深棕反白；替换旧金黄签+歪斜系（风格不搭被否） */
.season-btn {
  font-family: "Ma Shan Zheng", KaiTi, serif;
  writing-mode: vertical-rl;
  font-size: calc(15px * var(--pgscale, 1));
  letter-spacing: 0.14em;
  padding: calc(22px * var(--pgscale, 1)) calc(9px * var(--pgscale, 1)) calc(12px * var(--pgscale, 1));
  color: #4a3313;
  background: linear-gradient(180deg, #d8b98a, #c9a876);
  border: 1px solid rgba(90, 58, 20, 0.5);
  border-radius: 0 7px 7px 0;
  box-shadow: 2px 3px 6px rgba(30, 20, 10, 0.3);
  cursor: pointer;
  position: relative;
  transition: transform 0.18s ease;
}
/* 挂签打孔 */
.season-btn::before {
  content: ""; position: absolute; top: calc(8px * var(--pgscale, 1)); left: 50%;
  transform: translateX(-50%);
  width: calc(7px * var(--pgscale, 1)); height: calc(7px * var(--pgscale, 1));
  border-radius: 50%; background: #241d19;
  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.6), 0 1px 0 rgba(255, 255, 255, 0.25);
}
.season-btn:nth-child(even) { background: linear-gradient(180deg, #d2b083, #c19c6a); }
.season-btn:hover { transform: translateX(4px); }
.season-btn.active {
  background: linear-gradient(180deg, #b5854a, #9a6c34);
  color: #f7efdc;
  transform: translateX(6px);
}
.season-btn.current-tag::after { content: " ●"; color: var(--redpen); }
.season-btn.active.current-tag::after { color: #f7efdc; }
/* swapZone 过渡规则移至文件尾部"动效扩充"区（纸片翻起增强版） */

/* ---------------- stain textures (multiply-blended, under content layer) ---------------- */
.tex {
  position: absolute;
  pointer-events: none;
  mix-blend-mode: multiply;
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
  z-index: 0;
}
.tex-blood {
  width: 200px; height: 200px;
  background-image: url("/img/tex/blood.webp");
  top: auto; bottom: -2%; right: -3%;
  transform: rotate(8deg);
  opacity: 0.45;
}
.tex-coffee {
  width: 180px; height: 180px;
  background-image: url("/img/tex/coffee.webp");
  top: auto; bottom: 2%; left: auto; right: 2%;
  transform: rotate(-14deg);
  opacity: 0.5;
}
.tex-coffee.br { top: auto; left: auto; bottom: 3.5%; right: 2.5%; transform: rotate(22deg); }
.tex-ink {
  width: 160px; height: 160px;
  background-image: url("/img/tex/inkblot.webp");
  bottom: 1.5%; left: 0.5%;
  transform: rotate(-6deg);
  opacity: 0.38;
}
.tex-ink.tr { bottom: 2%; left: auto; top: auto; right: 0.5%; transform: rotate(15deg); opacity: 0.34; }

/* hand-drawn annotation arrow on hero page */
.hero-arrow {
  position: absolute;
  left: 6%; bottom: 13%;
  width: 108px;
  transform: rotate(-5deg);
  pointer-events: none;
  z-index: 2;
}

/* ---------------- leaderboard ---------------- */
.tabs { display: flex; gap: 0.4rem; flex-wrap: nowrap; margin-bottom: 1rem; }
.tab {
  font-family: var(--hand);
  font-size: 1.02rem;
  padding: 0.12rem 0.6rem;
  white-space: nowrap;
  background: transparent;
  color: #6e4a1e;
  border: 2px solid #8a6a3a;
  border-radius: 255px 15px 225px 15px / 15px 225px 15px 255px;
  cursor: pointer;
  transition: transform 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
.tab:hover { transform: rotate(-1deg) scale(1.04); }
.tab.active { color: var(--redpen); border-color: var(--redpen); font-weight: 700; transform: rotate(-1.2deg); }
/* 排行榜容器（用户裁定 2026-10-02 C 案：去底+钢笔描线框）——白感归零，
 * 表格直坐羊皮纸，双线手绘框圈定聚焦；可读性靠字号/颜色层级（v1 已建立）；
 * 微旋转经 --r 变量走 .anim 体系 */
.board-wrap {
  --r: -0.3deg;
  overflow-x: auto;
  position: relative;
  /* 底纹（用户裁定 2026-10-03 B 案：格子图案撤下换纸色衬底）——
   * 暖棕衬色深半档无图案，"衬卡纸"层次；原批1b 微格点阵因几何格子感被否 */
  background-color: rgba(120, 96, 58, 0.07);
  border: 2px solid rgba(74, 58, 32, 0.75);
  outline: 1px solid rgba(74, 58, 32, 0.4);
  outline-offset: 3px;
  border-radius: 10px 4px 12px 5px / 5px 12px 4px 10px;
  padding: 0.9rem 0.85rem 0.55rem;
  margin: 0.45rem -0.15rem 0.3rem 0;
}
.board-table { width: 100%; border-collapse: collapse; }
.board-table th, .board-table td { padding: 0.46rem 0.7rem; text-align: left; font-size: 1rem; }
.board-table th {
  font-family: var(--hand);
  color: var(--pencil);
  font-weight: 400;
  font-size: 0.8rem;
  letter-spacing: 0.12em;
  border-bottom: 1px solid rgba(107, 101, 92, 0.35);
}
.board-table th:last-child { text-align: right; }
.board-table td { color: var(--ink); border-bottom: 1.5px dashed rgba(107, 101, 92, 0.22); }
/* 阅读层级（用户裁定 2026-09-30 回退：换回最初手写体 var(--hand)=Caveat/马善政，与全站标题同族；
 * 保留 v1 起的字号层级/右对齐/千分位/金银铜——仅字体回退，龙藏自托管文件留档备选） */
td.c-name {
  font-family: var(--hand);
  font-size: 1.22rem;
  font-weight: 600;
  color: #2b2622;
}
td.c-name.latin { font-size: 1.34rem; }
td.c-val {
  font-family: var(--hand);
  font-size: 1.2rem;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  text-align: right;
  color: #1d1915;
  white-space: nowrap;
}
/* 前三名金银铜体系（用户裁定 2026-09-30）：数值/星标/行底 tint/左边条随档（徽章圈在 .rank-badge 段） */
tr.top1 td.c-val { color: #8a5c18; }  /* 古金 */
tr.top2 td.c-val { color: #5f6773; }  /* 旧银 */
tr.top3 td.c-val { color: #7d4a1e; }  /* 古铜 */
/* 人名随档换色（用户裁定 2026-10-03）：前三名人名与数值同源档色，
 * 名字字号大，用与 c-val 一致的深档色保对比度 */
tr.top1 td.c-name { color: #8a5c18; }
tr.top2 td.c-name { color: #5f6773; }
tr.top3 td.c-name { color: #7d4a1e; }
tr.top1 .star-doodle path { stroke: #a87b1e; }
tr.top2 .star-doodle path { stroke: #6e7480; }
tr.top3 .star-doodle path { stroke: #9a6430; }
/* 首格档色左边条：去底化后仅存的行级档位标记（3px 竖条 currentColor） */
tr.top1 td:first-child, tr.top2 td:first-child, tr.top3 td:first-child {
  box-shadow: inset 3px 0 0 -1px currentColor;
}
tr.top1 td:first-child { color: #a87b1e; }
tr.top2 td:first-child { color: #6e7480; }
tr.top3 td:first-child { color: #9a6430; }
.board-table tbody tr.row-in { animation: rowIn 0.4s ease both; }
@keyframes rowIn { from { opacity: 0; transform: translateX(-8px); } to { opacity: 1; transform: translateX(0); } }
.rank-badge { position: relative; display: inline-block; min-width: 2rem; text-align: center; font-family: var(--hand); font-size: 1.1rem; color: var(--pen); }
/* 前三名徽章圈/文字随金银铜分档（用户裁定 2026-09-30） */
tr.top1 .rank-badge { color: #a87b1e; font-size: 1.3rem; font-weight: 700; }
tr.top2 .rank-badge { color: #6e7480; font-size: 1.3rem; font-weight: 700; }
tr.top3 .rank-badge { color: #9a6430; font-size: 1.3rem; font-weight: 700; }
tr.top1 .rank-badge::after, tr.top2 .rank-badge::after, tr.top3 .rank-badge::after {
  content: "";
  position: absolute;
  inset: -6px -8px;
  border: 2.5px solid currentColor;
  border-radius: 48% 52% 50% 50% / 55% 45% 55% 45%;
  transform: rotate(-2deg);
  opacity: 0.85;
}
/* 前三名"幸存者档案卡"（C 案去底化）：行底 tint 全部移除，层级靠档色徽章圈/数值/
 * 星标/图钉/胶带角+行底虚线档色变化（2026-10-02） */
.board-table tbody tr.top1 td { border-bottom-color: rgba(168, 123, 30, 0.5); }
.board-table tbody tr.top2 td { border-bottom-color: rgba(110, 116, 128, 0.45); }
.board-table tbody tr.top3 td { border-bottom-color: rgba(154, 100, 48, 0.5); }
.board-table tbody tr.top1 td:first-child,
.board-table tbody tr.top2 td:first-child,
.board-table tbody tr.top3 td:first-child {
  position: relative;
  box-shadow:
    inset 0 0 0 1px rgba(138, 106, 58, 0.22),
    inset 3px 0 6px -3px rgba(30, 20, 10, 0.25);
}
.board-table tbody tr.top1 td:first-child::before,
.board-table tbody tr.top2 td:first-child::before,
.board-table tbody tr.top3 td:first-child::before {
  content: "";
  position: absolute;
  top: -7px; left: 6px;
  width: 44px; height: 15px;
  background: var(--tape);
  clip-path: polygon(3% 0, 97% 6%, 100% 90%, 94% 100%, 4% 94%, 0 12%);
  transform: rotate(-4deg);
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
  pointer-events: none;
}
@media (hover: hover) {
  .board-table tbody tr.top1 td,
  .board-table tbody tr.top2 td,
  .board-table tbody tr.top3 td { transition: transform 0.18s ease; }
  .board-table tbody tr.top1:hover td,
  .board-table tbody tr.top2:hover td,
  .board-table tbody tr.top3:hover td { transform: translateY(-1px); }
}
/* 死亡榜行首铅笔十字（阵亡记录标注，app.js 按榜 key 注入） */
.death-mark { display: inline-block; width: 14px; height: 14px; margin-left: 0.28rem; vertical-align: -2px; opacity: 0.8; }
.star-doodle { display: inline-block; width: 17px; height: 17px; margin-left: 0.3rem; vertical-align: -3px; }
.board-meta { margin-top: 0.8rem; font-family: var(--hand); font-size: 0.92rem; color: var(--pencil); }
.board-meta.error { color: var(--redpen); }
/* D3'（2026-10-05 优化批次）：榜单分页「显示更多」按钮——TOP50 起步步进展开 */
.board-more {
  display: block;
  margin: 10px auto 4px;
  padding: 5px 22px;
  font: inherit;
  font-size: 13px;
  letter-spacing: 0.12em;
  color: #5b4326;
  background: linear-gradient(180deg, rgba(233, 219, 186, 0.9), rgba(214, 196, 158, 0.9));
  border: 1px solid rgba(122, 92, 51, 0.45);
  border-radius: 4px;
  box-shadow: 1px 2px 4px rgba(46, 30, 12, 0.18);
  cursor: pointer;
}
.board-more:hover { background: linear-gradient(180deg, rgba(240, 228, 198, 0.95), rgba(222, 205, 168, 0.95)); }

.board-note { margin-top: 0.25rem; font-family: var(--hand); font-size: 0.88rem; color: #968b76; }

/* ---------------- hall polaroids（C 案去底化 2026-10-02：拍立得白底移除，
 * 改"胶带贴角"无底照片式，奖章区羊皮微底圆角；文字直坐纸面与全站一致） ---------------- */
.hall-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); gap: 1.2rem; padding-top: 0.8rem; }
.polaroid {
  position: relative;
  padding: 0.5rem 0.6rem 1rem;
  text-align: center;
  transform: rotate(var(--r, 0deg));
  transition: transform 0.2s ease;
}
.polaroid:hover { transform: rotate(0deg) scale(1.03); }
.polaroid::before {
  content: "";
  position: absolute;
  top: -12px; left: 50%;
  width: 82px; height: 24px;
  transform: translateX(-50%) rotate(-2deg);
  background: var(--tape);
  clip-path: polygon(3% 0, 97% 4%, 100% 88%, 95% 100%, 4% 96%, 0 10%);
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
}
.avatar {
  width: 100%;
  height: 96px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(240, 226, 192, 0.25);
  border-radius: 6px;
}
.avatar img {
  width: 62px;
  height: 62px;
  object-fit: contain;
  filter: sepia(0.2) drop-shadow(2px 3px 3px rgba(30, 20, 10, 0.35));
}
.polaroid h3 { font-family: var(--hand); font-size: 1.25rem; margin-top: 0.6rem; color: var(--ink); }
.polaroid p { color: var(--pen); font-size: 0.92rem; line-height: 1.5; }
.hall-date { font-family: var(--hand); font-size: 0.85rem; color: var(--pencil); margin-top: 0.25rem; }
.hall-empty { font-family: var(--hand); color: var(--pencil); font-size: 1.25rem; padding: 3rem 0; text-align: center; transform: rotate(-1deg); }

/* ---------------- donation tiers ---------------- */
.tier-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0.7rem; align-items: stretch; }
/* 批2 捐赠页质感化（2026-10-02，方案_网站视觉迭代三轮 批2）：
 * 锈角标=Rust001 Color 裁片（素材库 CC0，11.8KB）半出血铆在左上，金属补丁感；
 * 底纹（用户裁定 2026-10-03 B 案）：原三档分密度格子底纹撤下，换统一纸色衬底（与排行榜同语汇） */
.tier { background-color: rgba(120, 96, 58, 0.09); }
.tier::before {
  content: "";
  position: absolute;
  top: -7px;
  left: -9px;
  width: 46px;
  height: 34px;
  background: url("/img/tex/rust-tag.jpg") center / cover no-repeat;
  border-radius: 3px 5px 4px 6px;
  transform: rotate(-5deg);
  box-shadow: 1px 2px 3px rgba(20, 12, 4, 0.45);
  pointer-events: none;
}
.tier {
  position: relative;
  padding: 1rem 0.7rem;
  border: 2.5px solid #8a6a3a;
  border-radius: 255px 18px 225px 18px / 18px 225px 18px 255px;
  display: flex;
  flex-direction: column;
  min-width: 0;
  transition: transform 0.2s ease;
}
.tier:hover { transform: rotate(-0.6deg) translateY(-4px); }
.tier.recommended { border-color: var(--redpen); transform: rotate(0.6deg); }
.tier.recommended::after {
  content: "";
  position: absolute;
  inset: -10px -12px;
  border: 4px solid var(--redpen);
  border-radius: 50% 48% 52% 50% / 46% 52% 48% 54%;
  transform: rotate(-1.5deg);
  opacity: 0.8;
  pointer-events: none;
}
.tier-name { font-family: var(--hand); font-size: 1.3rem; color: var(--ink); white-space: nowrap; }
.tier-rec-tag {
  align-self: flex-start;
  font-family: var(--hand);
  font-size: 0.92rem;
  color: var(--redpen);
  border-bottom: 2px solid var(--redpen);
  transform: rotate(-2deg);
  margin-bottom: 0.3rem;
}
.tier-price {
  font-family: var(--hand); color: var(--pen); font-size: 1.1rem; margin: 0.2rem 0 0.7rem; white-space: nowrap;
  /* 批2 价格手绘圈划（2026-10-02）：红笔椭圆圈价签，收窄为 inline 便于圈 */
  position: relative;
  display: inline-block;
  align-self: flex-start;
  padding: 0 0.3rem;
}
.tier-price::after {
  content: "";
  position: absolute;
  inset: -1px -7px;
  border: 2.5px solid var(--redpen);
  border-radius: 48% 52% 50% 50% / 62% 58% 42% 38%;
  transform: rotate(-2.5deg);
  opacity: 0.75;
  pointer-events: none;
}
.tier ul { list-style: none; }
.tier li {
  padding: 0.15rem 0;
  font-size: 0.85rem;
  line-height: 1.4;
  color: var(--ink);
  overflow-wrap: break-word;
}
.tier li.no { color: #a29781; }
.tier li .yes { color: var(--redpen); font-family: var(--hand); margin-right: 0.35rem; }
.tier li .no-mark { color: #a29781; margin-right: 0.35rem; }

/* ---------------- no-flip fallback ---------------- */
body.no-flip { overflow: auto; }
body.no-flip .book-stage { visibility: visible; height: auto; display: block; padding-top: 3.2rem; } /* 2026-10-11 书签化：5→3.2rem */
body.no-flip .page { position: relative; width: min(920px, 94vw); min-height: 60vh; margin: 0 auto 2rem; }
body.no-flip .page-inner { overflow: visible; }
body.no-flip .anim, body.no-flip .handwrite .ch, body.no-flip .file-title .ch { opacity: 1; transform: none; }
body.no-flip .draw > *, body.no-flip .draw { stroke-dashoffset: 0; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation: none !important; transition: none !important; }
  .anim, .handwrite .ch, .file-title .ch { opacity: 1 !important; transform: none !important; }
  .draw > *, .draw { stroke-dashoffset: 0 !important; }
  .fx { opacity: var(--fx-op, 0.75) !important; }
  #ash-layer { display: none; }
}

/* ======================================================================
 * 末世沉浸层（方案_服务器网站末世沉浸感美化_2026-09-30）
 * 分四层：氛围层 / 做旧层 / 叙事层 / 动效层。全部装饰元素 aria-hidden。
 * ==================================================================== */

/* 批1 氛围层：末日避难所的灯光。
 * G2（2026-10-04）：body::after 暗角与油灯光斑合并为单层（全屏 fixed 层 -1），
 * 暗角作顶层渐变保原观感，油灯光斑在下；--mx/--my 指针视差照旧，lampBreath 保留 */
.lamp-glow {
  position: fixed;
  inset: 0;
  pointer-events: none;
  z-index: 90;
  background:
    radial-gradient(122% 92% at 50% 42%, transparent 54%, rgba(8, 5, 3, 0.44) 100%),
    radial-gradient(560px 420px at calc(34% + var(--mx, 0) * 3%) calc(20% + var(--my, 0) * 3%), rgba(255, 190, 96, 0.13), transparent 70%),
    radial-gradient(920px 720px at calc(40% + var(--mx, 0) * 2%) calc(32% + var(--my, 0) * 2%), rgba(255, 160, 70, 0.07), transparent 75%);
  animation: lampBreath 4.2s ease-in-out infinite;
}
@keyframes lampBreath { 0%, 100% { opacity: 0.8; } 50% { opacity: 1; } }
/* 地面雾气：极低透明度缓速横漂 */
.mist-layer {
  position: fixed;
  inset: -12%;
  pointer-events: none;
  z-index: 0;
  background:
    radial-gradient(48% 38% at 18% 86%, rgba(128, 116, 104, 0.055), transparent 70%),
    radial-gradient(44% 34% at 76% 82%, rgba(128, 116, 104, 0.05), transparent 70%);
  animation: mistDrift 56s ease-in-out infinite alternate;
}
@keyframes mistDrift { from { transform: translateX(-2.6%); } to { transform: translateX(2.6%); } }
/* 灰烬粒子画布：app.js 绘制（灰烬下落+光锥浮尘双形态），书下层 */
#ash-layer {
  position: fixed;
  inset: 0;
  pointer-events: none;
  z-index: 0;
}
/* 入场光圈：一盏灯点亮摊开的书，一次性 */
.stage-halo {
  position: fixed;
  inset: 0;
  pointer-events: none;
  z-index: 200;
  background: radial-gradient(46% 46% at 50% 46%, rgba(255, 214, 140, 0.2), transparent 70%);
  opacity: 0;
  animation: haloIn 1.15s ease-out 0.15s forwards;
}
@keyframes haloIn {
  0% { opacity: 0; transform: scale(1.35); }
  35% { opacity: 1; }
  100% { opacity: 0; transform: scale(1); }
}
/* 翻页灰尘：app.js 在书脊处生成，上浮消散 */
.dust-puff {
  position: fixed;
  width: 5px; height: 5px;
  border-radius: 50%;
  background: #c9b795;
  pointer-events: none;
  z-index: 150;
  opacity: 0;
  animation: dustPuff 1.05s ease-out var(--dd, 0ms) forwards;
}
@keyframes dustPuff {
  0% { opacity: 0; transform: translate(0, 0) scale(var(--ds, 1)); }
  18% { opacity: 0.5; }
  100% { opacity: 0; transform: translate(var(--dx, 0px), -48px) scale(var(--ds, 1)); }
}

/* ---------------- 批2 做旧层：被翻过很多次的幸存者日志 ---------------- */
/* 封面血手印（半透明压右下，避开警示带视觉焦点略下移） */
/* 右下角收讫章（2026-10-12 用户裁定替换血手印+右下弹孔）：蓝墨双环圆章，
 * 与红机密章配对——红章定密级、蓝章记收讫；印泥做旧半透+微斜 */
.cover-received {
  position: absolute; right: 5%; bottom: 5.5%;
  width: 126px; height: 126px;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 1px;
  border: 2px solid rgba(76, 98, 158, 0.85);
  border-radius: 50%;
  box-shadow: inset 0 0 0 2.5px transparent, inset 0 0 0 4px rgba(76, 98, 158, 0.55);
  transform: rotate(7deg);
  color: #4c629e;
  opacity: 0.78;
  text-shadow: 0 0 1px rgba(76, 98, 158, 0.6);
  pointer-events: none;
  z-index: 3;
}
.cover-received .cr-dept {
  font-family: SimSun, serif; font-weight: 700;
  font-size: calc(10.5px * var(--pgscale, 1)); letter-spacing: 0.22em; text-indent: 0.22em;
  white-space: nowrap; /* 2026-10-12 修正：部门名过长折行溢出圆环——章内改短名+禁折行 */
}
.cover-received .cr-word {
  font-family: SimSun, serif; font-weight: 900;
  font-size: calc(19px * var(--pgscale, 1)); letter-spacing: 0.3em; text-indent: 0.3em;
  margin: 1px 0 0;
  white-space: nowrap;
}
.cover-received .cr-date {
  font-family: SpecialElite, "Courier New", monospace;
  font-size: calc(8.5px * var(--pgscale, 1)); letter-spacing: 0.1em;
}
/* 血手印（2026-10-12 用户裁定移除，规则体已删，勿复用） */
/* 弹孔：bh-a 已随右下角改造移除（2026-10-12），bh-b 封面中部保留 */
.bullet-hole {
  position: absolute;
  z-index: 3;
  pointer-events: none;
}
.bh-a { right: 13%; bottom: 2.5%; width: 56px; }
.bh-b { right: 20%; top: 27%; width: 34px; }
/* “已隔离 QUARANTINE”红章：盖在活动预告页右上 */
.stamp-quarantine {
  position: absolute;
  right: 9%; top: 8%;
  width: 118px;
  z-index: 2;
  pointer-events: none;
  mix-blend-mode: multiply;
}
/* “已核实 VERIFIED”章：排行榜区右上（hero 电文组的章在 .annotations::after） */
/* 名单独立滚动框（2026-10-07 用户需求）：rank 页不再整页滚动——rank-main 改纵向
 * 弹性布局，board-wrap 吃剩余高度自成滚动区（细滚动条与 mod-grid 同款），
 * 标题/赛季标签/注脚固定，meta 锚在页底；作用域限定 data-section="rank"，
 * 其余页 .page-inner 整页滚动行为不变 */
.rank-main { position: relative; display: flex; flex-direction: column; min-height: 0; }
.page[data-section="rank"] .page-inner { overflow-y: visible; }
.page[data-section="rank"] .split { height: 100%; }
.rank-main > .section-title, .rank-main > .tabs,
.rank-main > .board-meta, .rank-main > .board-note { flex: 0 0 auto; }
/* v8 结构正解（2026-10-17）：board-wrap 与赛季书签同入 board-row——flex 同行顶天然对齐
 * （替代 JS 动态校准 v1-v7）；board-row 承接原 board-wrap 的 flex:1 内滚规格 */
.rank-main > .board-row {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  gap: 8px;
  align-items: flex-start;
}
.board-row > .board-wrap { flex: 1 1 auto; min-width: 0; }
.board-row > .season-rail { padding-top: 0; margin-top: 6px; }  /* 实测框体上边距 6px 补齐视觉顶 */
.rank-main > .board-wrap {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  scrollbar-width: thin;
  scrollbar-color: var(--pencil) transparent;
}
.rank-main::after {
  content: "已核实 VERIFIED";
  position: absolute;
  right: 2px; top: -16px;
  font-family: var(--hand);
  font-size: 0.78rem;
  letter-spacing: 0.08em;
  color: #2c3a55;
  border: 2.5px solid #2c3a55;
  border-radius: 3px;
  padding: 0.12rem 0.4rem;
  transform: rotate(6deg);
  opacity: 0.66;
  mix-blend-mode: multiply;
  pointer-events: none;
  z-index: 3;
}
/* 拖拽血痕：主血渍(blood.png)向左上被抹开的一道 */
.tex-blood-smear {
  width: 300px; height: 84px;
  background-image: url("/img/tex/blood.webp");
  background-size: 100% 100%;
  top: 58%; left: 22%;
  transform: rotate(-26deg);
  opacity: 0.26;
  filter: blur(1px);
}
/* 铅笔批注：幸存者随手写下的字条（逐字写出动画复用 .handwrite 体系） */
.pencil-note {
  position: absolute;
  font-family: KaiTi, "楷体", var(--hand);
  font-size: 1.02rem;
  color: #a52a1e;   /* 2026-10-12 H2 通令页：铅笔灰改幸存者红墨批注 */
  opacity: 0.88;
  z-index: 2;
  pointer-events: none;
  max-width: 60%;
}
/* 左页外缘虫蛀小缺口——2026-10-12 用户裁定移除（用户指认"每页左侧三个圆圈"；
 * 曾是 3 处蛀斑装饰洞+纤维晕边，规则体已删，勿复用） */
/* 导航防化三叶标——已随顶栏退役（2026-10-11 书签化），规则移除 */

/* ---------------- 批4 动效层 ---------------- */
/* 一次性效果基类：初始隐身，.page.play 后按各自 keyframes 登场；
 * --d 延迟由 app.js playPage 统一排程（内容先入场，章/血/弹孔随后落下） */
.fx { opacity: 0; }
.page.play .fx-stamp {
  animation: stampSlam 0.3s cubic-bezier(0.2, 1.9, 0.4, 1) var(--d, 700ms) both;
}
@keyframes stampSlam {
  from { opacity: 0; transform: rotate(var(--r, -10deg)) scale(1.7); }
  to { opacity: 0.75; transform: rotate(var(--r, -10deg)) scale(1); }
}
.page.play .fx-hand {
  animation: handSlap 0.38s cubic-bezier(0.25, 1.6, 0.45, 1) var(--d, 900ms) both;
}
@keyframes handSlap {
  from { opacity: 0; transform: rotate(var(--r, 0deg)) scale(1.45); }
  62% { opacity: 0.42; transform: rotate(var(--r, 0deg)) scale(0.94); }
  to { opacity: 0.38; transform: rotate(var(--r, 0deg)) scale(1); }
}
.page.play .fx-bullet {
  animation: bulletPop 0.26s cubic-bezier(0.2, 1.8, 0.4, 1) var(--d, 1100ms) both;
}
@keyframes bulletPop {
  from { opacity: 0; transform: scale(1.9); }
  to { opacity: 0.92; transform: scale(1); }
}
/* 烫金光泽扫过：扉页/封面大标题，低频循环（9s 一次），克制的金属反光 */
.sheen {
  position: absolute;
  top: -18%; bottom: -18%;
  left: -34%;
  width: 24%;
  background: linear-gradient(105deg, transparent, rgba(255, 240, 200, 0.22), transparent);
  transform: skewX(-18deg);
  pointer-events: none;
  opacity: 0;
  z-index: 4;
  animation: sheenSweep 9s ease-in-out infinite;
}
@keyframes sheenSweep {
  0%, 58% { transform: translateX(0) skewX(-18deg); opacity: 0; }
  62% { opacity: 1; }
  100% { transform: translateX(660%) skewX(-18deg); opacity: 0; }
}

/* ---------------- no-flip 兜底：一次性效果直接可见 ---------------- */
body.no-flip .fx { opacity: var(--fx-op, 0.75); }
body.no-flip .fx-hand { opacity: 0.38; }
body.no-flip .fx-bullet { opacity: 0.92; }

/* ======================================================================
 * 名人堂自绘奖章 + 图标库 + 动效扩充（方案_服务器网站名人堂奖章与图标库_2026-09-30）
 * ==================================================================== */

/* ---------------- 名人堂奖章三连：掉落 / 微摆 / 光泽 ---------------- */
.medal-slot { padding-top: 0.2rem; }
.medal-wrap {
  position: relative;
  display: inline-block;
  transform-origin: 50% 5%; /* 吊点在挂绳顶 */
  animation: medalDrop 0.55s cubic-bezier(0.25, 1.5, 0.45, 1) var(--d, 500ms) both,
             medalSway 7s ease-in-out calc(var(--d, 500ms) + 0.55s + var(--ph, 0s)) infinite;
}
.medal-wrap .medal {
  display: block;
  width: 64px; height: 84px;
  filter: drop-shadow(3px 5px 6px rgba(30, 20, 10, 0.4));
}
@keyframes medalDrop {
  from { opacity: 0; transform: translateY(-44px) rotate(-7deg); }
  72% { opacity: 1; transform: translateY(2px) rotate(1.2deg); }
  to { opacity: 1; transform: translateY(0) rotate(0deg); }
}
@keyframes medalSway {
  0%, 100% { transform: rotate(-1.6deg); }
  50% { transform: rotate(1.6deg); }
}
.medal-hi { animation: medalHi 4.4s ease-in-out infinite; }
@keyframes medalHi { 0%, 100% { opacity: 0.32; } 50% { opacity: 0.62; } }
/* 盘体光泽：圆形 clip 内斜光条低频扫过（盘体区=奖章下 60%，随典藏版加高调位） */
.medal-shine {
  position: absolute;
  top: 41%; bottom: 7%;
  left: 9%; right: 9%;
  border-radius: 50%;
  overflow: hidden;
  pointer-events: none;
}
.medal-shine::before {
  content: "";
  position: absolute;
  top: -20%; bottom: -20%;
  left: -45%;
  width: 55%;
  background: linear-gradient(105deg, transparent, rgba(255, 248, 226, 0.34), transparent);
  transform: skewX(-18deg);
  animation: medalSweep 8s ease-in-out infinite;
}
@keyframes medalSweep {
  0%, 62% { transform: translateX(0) skewX(-18deg); }
  70% { opacity: 1; }
  100% { transform: translateX(320%) skewX(-18deg); opacity: 0; }
}
@media (hover: hover) {
  .polaroid:hover .medal-wrap { animation-duration: 0.55s, 1.9s; }
  .polaroid:hover .medal { filter: drop-shadow(4px 7px 9px rgba(30, 20, 10, 0.48)); }
}

/* ---------------- 前三名档案卡图钉：行滑入落定后钉入 ---------------- */
tr.pin-in td:first-child::after {
  content: "";
  position: absolute;
  top: -9px; right: 13px;
  width: 12px; height: 12px;
  border-radius: 50%;
  background: radial-gradient(circle at 35% 30%, #e05a4a, #8a1f14 68%);
  box-shadow: 0 2px 3px rgba(0, 0, 0, 0.42);
  animation: pinIn 0.26s cubic-bezier(0.2, 1.8, 0.4, 1) var(--pd, 500ms) both;
}
@keyframes pinIn {
  from { opacity: 0; transform: scale(1.55); }
  to { opacity: 1; transform: scale(1); }
}

/* ---------------- 导航红蜡笔划线描线出场（左移版恢复，方向改纵向） ---------------- */
@keyframes navDraw {
  from { clip-path: inset(0 0 100% 0); }
  to { clip-path: inset(0 0 0 0); }
}
.nav a.active::after { animation: navDraw 0.4s ease-out; }

/* ---------------- 点击墨点涟漪 ---------------- */
.ink-ripple {
  position: fixed;
  width: 9px; height: 9px;
  margin: -4.5px 0 0 -4.5px;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(43, 38, 34, 0.5) 0 38%, rgba(43, 38, 34, 0.24) 58%, transparent 70%);
  pointer-events: none;
  z-index: 150;
  animation: inkSpread 0.62s ease-out forwards;
}
@keyframes inkSpread {
  from { transform: scale(0.4); opacity: 0.9; }
  to { transform: scale(4.6); opacity: 0; }
}

/* ---------------- 封面警示带/胶带"贴上"：从画外滑入带回弹 ---------------- */
.page.play .fx-tape {
  animation: tapeOn 0.5s cubic-bezier(0.2, 1.55, 0.4, 1) var(--d, 650ms) both;
}
@keyframes tapeOn {
  from { opacity: 0; transform: rotate(var(--r, 0deg)) translateX(-130%); }
  68% { opacity: 1; transform: rotate(var(--r, 0deg)) translateX(5%); }
  to { opacity: var(--fx-op, 0.92); transform: rotate(var(--r, 0deg)) translateX(0); }
}

/* ---------------- 赛季/tab 切换"纸片翻起"过渡（swapZone 增强） ---------------- */
.swap-zone { transition: opacity 0.26s ease, transform 0.26s ease; }
.swap-zone.swapping { opacity: 0; transform: translateY(9px) rotate(-1.1deg) scale(0.985); }

/* ==================== 信息架构改版（2026-10-03 方案_门户信息架构改版_功能页双页化） ====================
 * 基调：功能卡简洁化——浅纸底+细边框+小圆角+微旋转（--r 走 .anim 体系）；
 * 手账装饰克制（手写标题/单贴纸/一处批注），重装饰不进功能页 */

/* 扉页左：登记卡（2026-10-12 H2 通令页：便签卡档案化——直角表格线+批注带浅罩，去圆角阴影） */
.titlepage-cards { display: flex; gap: 14px; margin-top: calc(16px * var(--pgscale, 1)); }
.tp-card {
  flex: 1; display: flex; flex-direction: column; gap: 0.16rem;
  border: 1.5px solid rgba(74, 64, 48, 0.55);
  border-radius: 0;
  background: rgba(210, 195, 158, 0.22);
  padding: calc(11px * var(--pgscale, 1)) calc(13px * var(--pgscale, 1)) calc(12px * var(--pgscale, 1));
  box-shadow: none;
}
.tp-label { font-family: SimSun, serif; font-size: calc(10px * var(--pgscale, 1)); font-weight: 700;
  letter-spacing: calc(3px * var(--pgscale, 1)); color: #6a5c42;
  border-bottom: 1px solid rgba(74, 64, 48, 0.35); padding-bottom: calc(6px * var(--pgscale, 1)); }
.tp-value { font-family: SpecialElite, "Courier New", SimSun, monospace;
  font-size: calc(14px * var(--pgscale, 1)); color: #2b2419; line-height: 1.3;
  margin-top: calc(8px * var(--pgscale, 1)); }
.tp-sub { font-family: SpecialElite, "Courier New", SimSun, monospace;
  font-size: calc(9.5px * var(--pgscale, 1)); color: #7a6a4c; margin-top: calc(4px * var(--pgscale, 1)); letter-spacing: 0.5px; }

/* 扉页右：状态大数字卡 + 在线名单 */
.stat-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.7rem; margin: 0.4rem 0 1rem; }
.stat-card {
  display: flex; flex-direction: column; align-items: center; gap: 0.05rem;
  background: rgba(251, 247, 236, 0.62);
  border: 1.5px solid rgba(74, 58, 32, 0.42);
  border-radius: 8px 12px 6px 10px;
  padding: 0.65rem 0.4rem 0.55rem;
  box-shadow: 2px 3px 8px rgba(30, 20, 10, 0.18);
}
.stat-num { font-size: 2.2rem; color: #7a4d12; line-height: 1.1; font-variant-numeric: tabular-nums; }
.stat-label { font-size: 0.78rem; color: var(--pencil); letter-spacing: 0.1em; }
.online-panel {
  background: rgba(251, 247, 236, 0.5);
  border: 1.5px solid rgba(74, 58, 32, 0.38);
  border-radius: 10px 4px 12px 6px;
  padding: 0.6rem 0.9rem 0.7rem;
  max-height: 300px;
  overflow-y: auto;
  scrollbar-width: thin;
  scrollbar-color: var(--pencil) transparent;
}
.online-title { font-family: SimSun, serif; font-weight: 700; letter-spacing: 2px; font-size: 1.1rem; color: #2b2419; margin-bottom: 0.3rem; }
/* 最近阵亡面板（拉案 2026-10-09）：与在线面板同壳；行=名·死因·相对时间三段 */
.deaths-panel { margin-top: 0.8rem; background: rgba(251, 247, 236, 0.5); border: 1.5px solid rgba(74, 58, 32, 0.38); border-radius: 10px 4px 12px 6px; padding: 0.55rem 0.9rem 0.65rem; }
.deaths-panel .online-title { font-size: calc(1.1rem * var(--pgscale, 1)); color: #7a2e20; }
.deaths-list { list-style: none; margin: 0; padding: 0; max-height: 168px; overflow-y: auto; scrollbar-width: thin; scrollbar-color: var(--pencil) transparent; }
.deaths-list li { display: flex; gap: 0.5rem; align-items: baseline; font-size: calc(0.9rem * var(--pgscale, 1)); padding: 0.13rem 0; border-bottom: 1px dashed rgba(107, 101, 92, 0.18); }
.deaths-list li:last-child { border-bottom: none; }
.deaths-list .d-name { font-family: var(--hand); color: var(--ink); font-weight: 700; flex: 0 0 auto; max-width: 42%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.deaths-list .d-cause { color: var(--pencil); flex: 1 1 auto; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.deaths-list .d-ago { color: #968b76; font-size: calc(0.72rem * var(--pgscale, 1)); flex: 0 0 auto; font-variant-numeric: tabular-nums; }
.online-list { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 0.3rem 0.5rem; }
.online-list li {
  font-family: var(--hand); font-size: 1rem; color: var(--ink);
  background: rgba(120, 96, 58, 0.1);
  border-radius: 999px;
  padding: 0.05rem 0.65rem;
}
.online-list .online-none { background: none; color: var(--pencil); font-family: inherit; font-size: 0.88rem; }
.online-foot { font-size: 0.72rem; color: var(--pencil); margin: 0.35rem 0 0; }

/* 特色模组墙：分类 tab + 模组卡（v2 反馈 2：高度视口相对——原 560px 固定上限在放大后的书上只占半页） */
.mod-tabs { display: flex; flex-wrap: nowrap; gap: 0.45rem; margin-bottom: 0.7rem; overflow-x: auto; scrollbar-width: none; }
.mod-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.7rem; max-height: calc(100vh - 16rem); overflow-y: auto; scrollbar-width: thin; scrollbar-color: var(--pencil) transparent; padding-right: 0.2rem; }
.mod-card {
  display: flex; gap: 0.6rem; align-items: flex-start;
  background: rgba(251, 247, 236, 0.62);
  border: 1.5px solid rgba(74, 58, 32, 0.42);
  border-radius: 8px 12px 6px 10px;
  padding: 0.55rem 0.6rem;
  box-shadow: 2px 3px 8px rgba(30, 20, 10, 0.18);
}
.mod-img { flex: 0 0 92px; width: 92px; height: 92px; object-fit: cover; border-radius: 4px; border: 1px solid rgba(74, 58, 32, 0.3); }
.mod-img-blank { display: flex; align-items: center; justify-content: center; font-size: 0.7rem; color: var(--pencil); background: rgba(120, 96, 58, 0.08); }
.mod-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 0.12rem; }
.mod-cat { font-size: 0.66rem; color: #8a6d3b; letter-spacing: 0.12em; }
.mod-title { font-size: 1.06rem; color: var(--ink); line-height: 1.2; overflow-wrap: anywhere; }
.mod-author { font-size: 0.74rem; color: var(--pencil); }
.mod-desc { font-size: 0.78rem; color: var(--pen); line-height: 1.42; margin: 0; }
.mod-link { font-size: 0.76rem; color: #7a4d12; margin-top: auto; text-decoration: underline dotted rgba(122, 77, 18, 0.6); text-underline-offset: 3px; }
.mod-empty { grid-column: 1 / -1; color: var(--pencil); font-size: 0.9rem; text-align: center; padding: 2.2rem 0; }

/* 活动页留空骨架（裁定 3b） */
.empty-block { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 0.4rem; padding: 3.2rem 1rem; border: 1.5px dashed rgba(74, 58, 32, 0.35); border-radius: 12px; margin-top: 1rem; }
.empty-title { font-size: 1.5rem; color: var(--pencil); transform: rotate(-1.2deg); }
.empty-desc { font-size: 0.85rem; color: var(--pencil); margin: 0; }

/* 排行榜右：前三焦点卡（占位） */
.top3-grid { padding: 1rem 0; }

/* 捐赠右：未开放卡 + 名单 */
.donor-closed {
  display: flex; flex-direction: column; gap: 0.35rem;
  background: rgba(251, 247, 236, 0.62);
  border: 1.5px solid rgba(74, 58, 32, 0.42);
  border-radius: 10px 4px 12px 6px;
  padding: 1rem 1.1rem;
  box-shadow: 2px 3px 8px rgba(30, 20, 10, 0.18);
  margin-bottom: 0.9rem;
}
.dc-title { font-size: 1.4rem; color: var(--ink); }
.dc-sub { font-size: 0.82rem; color: var(--pen); }
.donor-list { border: 1.5px solid rgba(74, 58, 32, 0.38); border-radius: 8px; overflow: hidden; }
/* 2026-09-30 捐赠页恢复（用户澄清：保留页面去档位内容）——两列=捐赠者/金额 */
.donor-row { display: grid; grid-template-columns: 2.4fr 1fr; gap: 0.4rem; padding: 0.42rem 0.8rem; font-size: 0.88rem; color: var(--ink); border-bottom: 1px dashed rgba(107, 101, 92, 0.25); }
.donor-row:last-child { border-bottom: none; }
.donor-row span:nth-child(2) { text-align: right; font-variant-numeric: tabular-nums; }
.donate-intro { font-size: clamp(0.9rem, 1.5vh, 1.5rem); line-height: 1.75; color: var(--pen); margin: 0.6rem 0 1.2rem; }
.donor-head { background: rgba(120, 96, 58, 0.1); font-size: 0.76rem; color: var(--pencil); letter-spacing: 0.1em; }
.donor-none { color: var(--pencil); text-align: center; display: block; }

/* ==================== v2 七项反馈（2026-10-03） ==================== */
/* 反馈 3：特色玩法轮切栏目（特色页左页下半，六卡收紧为单列腾空间） */
.entries-compact { grid-template-columns: 1fr; gap: 0.45rem; }
.entries-compact .entry p { font-size: 0.82rem; }
.gameplay-box {
  margin-top: 0.8rem;
  background: rgba(251, 247, 236, 0.5);
  border: 1.5px solid rgba(74, 58, 32, 0.4);
  border-radius: 10px 4px 12px 6px;
  padding: 0.6rem 0.8rem 0.7rem;
  box-shadow: 2px 3px 8px rgba(30, 20, 10, 0.18);
}
.gameplay-title { font-size: 1.15rem; color: var(--ink); margin: 0 0 0.4rem; }
.gameplay-stage { display: flex; gap: 0.7rem; align-items: stretch; min-height: 120px; }
.gameplay-stage.gp-in { animation: gpFade 0.5s ease; }
@keyframes gpFade { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
.gp-img { flex: 0 0 150px; width: 150px; min-height: 100px; object-fit: cover; border-radius: 4px; border: 1px solid rgba(74, 58, 32, 0.3); }
.gp-placeholder { display: flex; align-items: center; justify-content: center; background: rgba(120, 96, 58, 0.08); color: var(--pencil); font-size: 0.75rem; }
.gp-body { flex: 1; display: flex; flex-direction: column; gap: 0.2rem; min-width: 0; }
.gp-title { font-size: 1.2rem; color: var(--ink); font-family: "Ma Shan Zheng", KaiTi, serif; }
.gp-desc { font-size: 0.85rem; color: var(--pen); line-height: 1.5; margin: 0; }
.gameplay-dots { display: flex; gap: 0.4rem; margin-top: 0.45rem; }
.gp-dot { width: 10px; height: 10px; border-radius: 50%; border: 1.5px solid rgba(74, 58, 32, 0.55); background: transparent; padding: 0; cursor: pointer; }
.gp-dot.active { background: #7a4d12; }

/* v4 字号根治（2026-10-09 多分辨率适配方案批1，取代 2026-10-03 v3 vh 制）：
 * v3 量纲=视口高，与书页宽（随视口宽）反相——高瘦视口（平板竖屏 820×1180 实测）
 * hero 65px×页宽 386px，相对设计基准（775 页宽）过大约 2.6 倍=叠压根因。
 * v4 改页宽相对制：app.js updatePgScale 挂 --pgscale=库页宽/775（clamp 0.62~1.45），
 * 本块及下方补集统一吃该因子——字号恒与书页同比例，任何视口回归设计密度。
 * 基准值=各元素在 775 页宽的设计值（v3 clamp 下界）；大屏随书等比放大。 */
.section-title { font-size: calc(1.7rem * var(--pgscale, 1)); }
/* 2026-10-12 H2 通令页：hero-title/tp-* 已在新规则内自带 calc(pgscale)，此处旧覆盖退役
 *（同特异性后位会压回旧值——留此注防复发）；cover-title 无消费者留档 */
.cover-title { font-size: calc(3.4rem * var(--pgscale, 1)); }
.stat-num { font-size: calc(2.2rem * var(--pgscale, 1)); }
.stat-label { font-size: calc(0.78rem * var(--pgscale, 1)); }
.online-title { font-size: calc(1.1rem * var(--pgscale, 1)); }
.online-list li { font-size: calc(1rem * var(--pgscale, 1)); }
.entry h3 { font-size: calc(1.2rem * var(--pgscale, 1)); }
.entry p { font-size: calc(0.9rem * var(--pgscale, 1)); }
.entries-compact .entry p { font-size: calc(0.82rem * var(--pgscale, 1)); }
.entry-no { font-size: calc(0.92rem * var(--pgscale, 1)); }
.mod-cat, .mod-author { font-size: calc(0.66rem * var(--pgscale, 1)); }
.mod-title { font-size: calc(1.06rem * var(--pgscale, 1)); }
.mod-desc { font-size: calc(0.78rem * var(--pgscale, 1)); }
.mod-link { font-size: calc(0.76rem * var(--pgscale, 1)); }
.mod-img { flex-basis: calc(92px * var(--pgscale, 1)); width: calc(92px * var(--pgscale, 1)); height: calc(92px * var(--pgscale, 1)); }
.board-table th { font-size: calc(0.8rem * var(--pgscale, 1)); }
.board-table td { font-size: calc(1rem * var(--pgscale, 1)); }
td.c-name { font-size: calc(1.22rem * var(--pgscale, 1)); }
td.c-name.latin { font-size: calc(1.34rem * var(--pgscale, 1)); }
td.c-val { font-size: calc(1.15rem * var(--pgscale, 1)); }
.gameplay-title { font-size: calc(1.15rem * var(--pgscale, 1)); }
.gp-title { font-size: calc(1.2rem * var(--pgscale, 1)); }
.gp-desc { font-size: calc(0.85rem * var(--pgscale, 1)); }
.gp-img { flex-basis: calc(150px * var(--pgscale, 1)); width: calc(150px * var(--pgscale, 1)); }
.todo-title { font-size: calc(1.2rem * var(--pgscale, 1)); }
.todo-date { font-size: calc(0.85rem * var(--pgscale, 1)); }
.todo-desc { font-size: calc(0.88rem * var(--pgscale, 1)); }
.todo-no { font-size: calc(1.3rem * var(--pgscale, 1)); }
.empty-title { font-size: calc(1.5rem * var(--pgscale, 1)); }
.empty-desc { font-size: calc(0.85rem * var(--pgscale, 1)); }
.mod-empty { font-size: calc(0.9rem * var(--pgscale, 1)); }
.online-foot { font-size: calc(0.72rem * var(--pgscale, 1)); }
/* v4 补集：v3 未覆盖的固定 rem 内容元素并入同律（同块后位胜） */
.slogan { font-size: calc(1.25rem * var(--pgscale, 1)); }
.note-anno { font-size: calc(0.95rem * var(--pgscale, 1)); }
.anno-num { font-size: calc(1.5rem * var(--pgscale, 1)); }
.online-names { font-size: calc(0.98rem * var(--pgscale, 1)); }
.tab { font-size: calc(1.02rem * var(--pgscale, 1)); }
.board-meta { font-size: calc(0.92rem * var(--pgscale, 1)); }
.board-note { font-size: calc(0.88rem * var(--pgscale, 1)); }
.pencil-note { font-size: calc(1.02rem * var(--pgscale, 1)); }
.tl-tag { font-size: calc(0.82rem * var(--pgscale, 1)); }
.polaroid h3 { font-size: calc(1.25rem * var(--pgscale, 1)); }
.polaroid p { font-size: calc(0.92rem * var(--pgscale, 1)); }
.hall-date { font-size: calc(0.85rem * var(--pgscale, 1)); }
.hall-empty { font-size: calc(1.25rem * var(--pgscale, 1)); }
.tier-name { font-size: calc(1.3rem * var(--pgscale, 1)); }
.tier-price { font-size: calc(1.1rem * var(--pgscale, 1)); }
.tier li { font-size: calc(0.85rem * var(--pgscale, 1)); }
.rank-badge { font-size: calc(1rem * var(--pgscale, 1)); }
tr.top1 .rank-badge, tr.top2 .rank-badge, tr.top3 .rank-badge { font-size: calc(1.3rem * var(--pgscale, 1)); }
.flyleaf-title { font-size: calc(1.05rem * var(--pgscale, 1)); }
.flyleaf-motto { font-size: calc(0.8rem * var(--pgscale, 1)); }
.mod-img-blank { font-size: calc(0.7rem * var(--pgscale, 1)); }
.gp-dot { width: calc(10px * var(--pgscale, 1)); height: calc(10px * var(--pgscale, 1)); }
/* 左侧导航同律（与书同步缩放保持视觉一致，2026-10-11 左移版恢复） */
.nav a { font-size: calc(1.15rem * var(--pgscale, 1)); }
.nav-brand { font-size: calc(1.35rem * var(--pgscale, 1)); }

/* 装饰小屏降级阶梯（方案 T3，2026-10-09 批1；pg-s/pg-xs 由 updatePgScale 挂卸）：
 * pg-s(<0.85 笔记本/平板)：藏手绘箭头+铅笔注脚，血手印/弹孔减淡过半；
 * pg-xs(<0.72 极窄)：fx 装饰全家隐藏（做旧件在缩页上只剩噪声） */
body.pg-s .hero-arrow, body.pg-s .pencil-note { display: none; }
body.pg-s .fx-hand { opacity: 0.18 !important; }
body.pg-s .fx-bullet { opacity: 0.22 !important; }
body.pg-xs .fx { display: none !important; }

/* ==================== 竖排单页适配包（2026-10-09 方案批2；块宽<950 进竖排=vendor ⑬） ==================== */
/* 竖排页宽≈块宽(772~950)≈设计基准 775——组件天然回归设计密度（pgscale≈1），
 * 仅跨页级布局需重排：split 纵堆/赛季书签横排化/tabs 换行/电报卡限宽解除 */
.stf__wrapper.--portrait .split { flex-direction: column; }
.stf__wrapper.--portrait .board-row { flex-direction: column; }
.stf__wrapper.--portrait .season-rail { position: static; top: auto; flex-direction: row; flex-wrap: wrap; padding-top: 0; gap: 0.45rem; }
.stf__wrapper.--portrait .season-btn { writing-mode: horizontal-tb; padding: 0.3rem 0.85rem; letter-spacing: 0.08em; }
.stf__wrapper.--portrait .season-btn:hover { transform: translateY(-1px); }
.stf__wrapper.--portrait .season-btn.active { transform: none; }
.stf__wrapper.--portrait .tabs { flex-wrap: wrap; }
.stf__wrapper.--portrait .titlepage-cards { max-width: none; }
.stf__wrapper.--portrait .online-panel { max-height: 260px; }

/* ==================== XLX 机密档案皮肤层（2026-10-10 家族化 B 档） ====================
 * 设计正本=QQbot kill_board_template.html（机密档案·回收协议风）——纸底渐变/墨色系/
 * 密级红/章蓝/结构件全部正本原值；字号一律 calc(var(--pgscale)) 因子。
 * 适用页：排行榜跨页（.paper-file）；名人间隔性沿用（批2） */
/* 整体档案化批1（2026-10-12）：纸基回归原版手账纸（.page 同款 western paper.jpg + 米色罩），
 * 仅保留极淡印刷横线（0.02 档）作档案纸暗示；bot 牛皮黄纸/重暗角弃用（用户裁定纸基=原版质感） */
.paper-file {
  background:
    repeating-linear-gradient(0deg, rgba(120, 100, 60, .02) 0 2px, transparent 2px 4px),
    linear-gradient(rgba(240, 226, 192, 0.18), rgba(226, 205, 162, 0.18)),
    url("/img/tex/styles/western/paper.jpg") center / cover;
}
.paper-file .page-inner { color: #2b2419; }
.paper-file .page-inner > * { position: relative; z-index: 1; }
.paper-file .rank-main::after { display: none; } /* 手账版 VERIFIED 章退役（红斜章接替） */

/* 装订孔（左缘三枚）——2026-10-12 用户裁定移除（DOM 已删，留档勿复用） */
.file-holes { position: absolute; left: 4px; top: 0; bottom: 0; width: 16px; z-index: 2; pointer-events: none; }
.file-holes i { position: absolute; left: 0; width: 13px; height: 13px; border-radius: 50%;
  background: #a2916f; box-shadow: inset 1px 2px 3px rgba(60, 45, 20, .6), 0 0 0 2px rgba(170, 150, 110, .4); }
.file-holes i:nth-child(1) { top: 14%; } .file-holes i:nth-child(2) { top: 46%; } .file-holes i:nth-child(3) { top: 78%; }

/* 双线抬头（公司名/表单号/副本） */
.file-topbar { border-bottom: 3px double #2b2419; padding-bottom: calc(8px * var(--pgscale, 1));
  display: flex; justify-content: space-between; align-items: flex-end; gap: 8px; }
.file-topbar .l .cn { font-family: SimSun, serif; font-weight: 700; letter-spacing: 2px;
  font-size: calc(15px * var(--pgscale, 1)); color: #2b2419; }
.file-topbar .l .en { font-family: SpecialElite, monospace; font-size: calc(8.5px * var(--pgscale, 1));
  letter-spacing: 1.2px; color: #4a4030; margin-top: 2px; }
.file-topbar .r { text-align: right; font-size: calc(9px * var(--pgscale, 1)); letter-spacing: 1px;
  color: #4a4030; line-height: 1.65; font-family: SpecialElite, SimSun, monospace; }
.file-topbar .r b { color: #2b2419; font-family: SpecialElite, monospace; }

/* 标题区（eyebrow/H1/副题/密级行/红斜章） */
.file-titlewrap { position: relative; margin-top: calc(10px * var(--pgscale, 1)); }
.file-titlewrap .eyebrow { font-size: calc(9.5px * var(--pgscale, 1)); letter-spacing: 4px; color: #4a4030; }
.file-h1 { font-family: SimSun, serif; font-weight: 900; letter-spacing: 10px; text-indent: 10px;
  font-size: calc(26px * var(--pgscale, 1)); margin: 4px 0 0; color: #1e1912; }
.file-sub { font-family: SpecialElite, monospace; font-size: calc(8.5px * var(--pgscale, 1));
  letter-spacing: 1.2px; color: #4a4030; margin-top: 3px; }
.file-classline { font-size: calc(9px * var(--pgscale, 1)); letter-spacing: 2px; color: #7c2d20; margin-top: 6px; }
.file-stamp { position: absolute; right: 2px; top: -4px; border: 3px double #a03a2a; color: #a03a2a;
  padding: calc(5px * var(--pgscale, 1)) calc(9px * var(--pgscale, 1));
  font-size: calc(13px * var(--pgscale, 1)); font-weight: 900; letter-spacing: 4px;
  font-family: SimSun, serif; transform: rotate(9deg); text-align: center; line-height: 1.35;
  opacity: .88; background: rgba(230, 220, 196, .2); box-shadow: 0 0 0 1px rgba(160, 58, 42, .25); }

/* 档案表格（覆盖 board-table 手账样式：仅 .paper-file 作用域内） */
.paper-file .board-table { width: 100%; border-collapse: collapse; table-layout: fixed; }
.paper-file .board-table thead th { font-family: SimSun, serif; font-size: calc(9.5px * var(--pgscale, 1));
  font-weight: 700; letter-spacing: 2px; color: #2b2419; text-align: left;
  border-top: 2.5px solid #2b2419; border-bottom: 1.5px solid #2b2419;
  padding: calc(6px * var(--pgscale, 1)) calc(5px * var(--pgscale, 1));
  background: repeating-linear-gradient(-45deg, rgba(43, 36, 25, .07) 0 5px, transparent 5px 10px), rgba(236, 225, 204, .5); }
.paper-file .board-table thead th.fval { text-align: right; }
.paper-file .board-table td { padding: calc(5px * var(--pgscale, 1)) calc(5px * var(--pgscale, 1));
  border-bottom: 1px dashed rgba(43, 36, 25, .42); vertical-align: middle;
  background: rgba(236, 225, 204, .5); color: #2b2419; }
.paper-file .board-table td.no { width: 30px; font-family: SpecialElite, monospace;
  font-size: calc(11px * var(--pgscale, 1)); color: #6b5d42; } /* 修复(2026-10-11)：去掉误加的 background:none——行底纹须整行铺满含序号列（bot 正本语义），否则左侧缺块 */
.paper-file .board-table td.who { overflow: hidden; }
.paper-file .board-table .nmrow { display: flex; align-items: baseline; white-space: nowrap; }
.paper-file .board-table .nm { font-family: SimSun, serif; font-weight: 700; color: #1e1912;
  font-size: calc(14px * var(--pgscale, 1)); letter-spacing: 1px; }
.paper-file .board-table .nm.latin { font-family: SpecialElite, monospace; font-size: calc(12px * var(--pgscale, 1)); }
.paper-file .board-table .tg { font-size: calc(8.5px * var(--pgscale, 1)); color: #7c2d20; margin-left: 5px; letter-spacing: 1px; }
.paper-file .board-table td.fval { text-align: right; font-family: SpecialElite, monospace;
  font-size: calc(13px * var(--pgscale, 1)); color: #1e1912; }
.paper-file .board-table td.fgrid { width: 132px; }
/* 头三席亮窗行（bot 方案 C：上下粗线围合+深一档亮底） */
.paper-file .board-table tr.win td { background: rgba(236, 225, 204, .78); }
.paper-file .board-table tr.win-first td { border-top: 2.5px solid #2b2419; }
.paper-file .board-table tr.win-last td { border-bottom: 2.5px solid #2b2419; }
/* 战果核销格（12 格点阵：实心/半格/空心——墨黑统一，bot 正本） */
.paper-file .cells { display: flex; gap: 3px; align-items: center; }
.paper-file .cells i { display: block; width: calc(8px * var(--pgscale, 1)); height: calc(13px * var(--pgscale, 1));
  border: 1px solid #6b5d42; background: transparent; }
.paper-file .cells i.on { background: #2b2419; border-color: #6b5d42; }
.paper-file .cells i.half { background: linear-gradient(90deg, #2b2419 50%, transparent 50%); border-color: #6b5d42; }

/* tabs → 档案夹标签（.paper-file 作用域内换皮） */
.paper-file .tabs { display: flex; gap: 4px; flex-wrap: nowrap; margin: calc(8px * var(--pgscale, 1)) 0 6px; overflow-x: auto; scrollbar-width: none; }
.paper-file .tab { font-family: "Ma Shan Zheng", KaiTi, serif; font-size: calc(12px * var(--pgscale, 1)); letter-spacing: 1.5px;
  padding: calc(3px * var(--pgscale, 1)) calc(8px * var(--pgscale, 1)); white-space: nowrap;
  background: rgba(236, 225, 204, .55); color: #4a4030; border: 1px solid #9c8d70;
  border-bottom: 2px solid #2b2419; cursor: pointer; }
.paper-file .tab.active { background: rgba(236, 225, 204, .95); color: #1e1912; font-weight: 700;
  border-color: #2b2419; box-shadow: inset 0 -2px 0 #a03a2a; }

/* 条码收尾带（归档时间） */
.file-bottombar { margin-top: calc(8px * var(--pgscale, 1)); border-top: 3px double #2b2419;
  padding-top: calc(6px * var(--pgscale, 1)); display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.file-bottombar .bcr { display: flex; align-items: center; gap: 8px; }
.file-bottombar .barcode { width: calc(88px * var(--pgscale, 1)); height: calc(20px * var(--pgscale, 1)); flex: none;
  background: repeating-linear-gradient(90deg, #1e1912 0 2px, transparent 2px 5px, #1e1912 5px 6px,
    transparent 6px 8px, #1e1912 8px 11px, transparent 11px 13px, #1e1912 13px 14px, transparent 14px 18px); }
.file-bottombar .meta { font-family: SpecialElite, monospace; font-size: calc(7.5px * var(--pgscale, 1));
  letter-spacing: 1px; color: #4a4030; line-height: 1.6; }
.file-bottombar .meta b { color: #1e1912; }
.file-bottombar .archived { text-align: right; }
.file-bottombar .archived .k { font-size: calc(7.5px * var(--pgscale, 1)); letter-spacing: 1.5px; color: #6b5d42; }
.file-bottombar .archived .v { font-family: SpecialElite, monospace; font-size: calc(9.5px * var(--pgscale, 1));
  letter-spacing: 1px; color: #2b2419; margin-top: 2px; }

/* 右页：统计行 + 头三席卡 + 便条 + 签字线 + 圆审讫章 */
.file-statline { display: flex; margin-top: calc(10px * var(--pgscale, 1)); border: 2px solid #2b2419; }
.file-statline .cell { flex: 1; text-align: center; padding: calc(6px * var(--pgscale, 1)) 4px calc(5px * var(--pgscale, 1)); border-right: 2px solid #2b2419; }
.file-statline .cell:last-child { border-right: none; }
.file-statline .k { font-family: SimSun, serif; font-size: calc(9px * var(--pgscale, 1)); font-weight: 700; letter-spacing: 2px; color: #4a4030; }
.file-statline .v { font-family: SpecialElite, monospace; font-size: calc(16px * var(--pgscale, 1)); margin-top: 2px; color: #1e1912; }
.paper-file .top3-grid { display: flex; flex-direction: column; gap: calc(7px * var(--pgscale, 1));
  margin-top: calc(10px * var(--pgscale, 1)); }
.top3-card { border: 1px dashed #9c8d70; background: rgba(236, 225, 204, .72); padding: calc(7px * var(--pgscale, 1)) calc(10px * var(--pgscale, 1)); }
.top3-card.win-first { border-top: 2.5px solid #2b2419; }
.top3-card.win-last { border-bottom: 2.5px solid #2b2419; }
.top3-card .t3-head { display: flex; align-items: baseline; gap: 8px; }
.top3-card .t3-rank { font-family: SpecialElite, monospace; font-size: calc(15px * var(--pgscale, 1)); color: #a03a2a; }
.top3-card .t3-tag { font-family: SimSun, serif; font-size: calc(9px * var(--pgscale, 1)); letter-spacing: 2px; color: #7c2d20; }
.top3-card .t3-name { font-family: SimSun, serif; font-weight: 700; font-size: calc(17px * var(--pgscale, 1));
  color: #1e1912; letter-spacing: 1px; margin-top: 2px; }
.top3-card .cells { margin-top: calc(4px * var(--pgscale, 1)); }
.top3-card .t3-val { font-family: SpecialElite, monospace; font-size: calc(19px * var(--pgscale, 1)); color: #1e1912; margin-top: 3px; }
.top3-card .t3-sub { font-family: SpecialElite, monospace; font-size: calc(8.5px * var(--pgscale, 1)); color: #4a4030; margin-top: 2px; }
/* 批注带（2026-10-12 用户裁定方案2融氛围版）：弃"贴纸便条"形态——半透明棕罩
 * 透纸纹（与纸底零明度跳变）+上下电头线（上粗下细）+打字机体；不投影不内框（印刷在纸上非贴上去） */
.file-note { margin-top: calc(10px * var(--pgscale, 1)); position: relative;
  background: linear-gradient(90deg, rgba(74,56,28,.16), rgba(74,56,28,.10) 12%, rgba(74,56,28,.10) 88%, rgba(74,56,28,.16));
  border-top: 1.5px solid rgba(74,56,28,.5); border-bottom: 1px solid rgba(74,56,28,.35);
  padding: calc(6px * var(--pgscale, 1)) calc(12px * var(--pgscale, 1));
  font-family: SpecialElite, "Courier New", SimSun, monospace;
  font-size: calc(10px * var(--pgscale, 1)); line-height: 1.7; color: #43351e; }
.file-note .sig { color: #5d4a2a; }
/* 签字线（Caveat 花押=站内已载字体） */
.file-sigrow { display: flex; justify-content: space-around; margin-top: calc(8px * var(--pgscale, 1)); }
.file-sigrow .ink { font-family: Caveat, cursive; font-weight: 600; font-size: calc(17px * var(--pgscale, 1));
  color: #24325c; display: block; line-height: 1; padding: 0 0 2px; min-width: 110px;
  border-bottom: 1px solid #2b2419; letter-spacing: 2px; text-align: center; }
.file-sigrow .ink.zh { font-family: KaiTi, SimSun, serif; font-size: calc(13px * var(--pgscale, 1)); }
.file-sigrow .who { font-family: SpecialElite, monospace; font-size: calc(7.5px * var(--pgscale, 1));
  letter-spacing: 1.5px; color: #4a4030; margin-top: 3px; text-align: center; }
/* 圆形审讫章（右下，bot 同款） */
.file-roundstamp { position: absolute; right: calc(20px * var(--pgscale, 1)); bottom: calc(84px * var(--pgscale, 1));
  width: calc(78px * var(--pgscale, 1)); height: calc(78px * var(--pgscale, 1));
  border: 3px solid rgba(42, 53, 80, .75); border-radius: 50%; color: #2a3550;
  transform: rotate(-14deg); opacity: .78; display: flex; flex-direction: column;
  align-items: center; justify-content: center; text-align: center; pointer-events: none; }
.file-roundstamp::before { content: ''; position: absolute; inset: 5px; border: 1px solid rgba(42, 53, 80, .6); border-radius: 50%; }
.file-roundstamp .a { font-family: SimSun, serif; font-size: calc(9px * var(--pgscale, 1)); letter-spacing: 2px; }
.file-roundstamp .b { font-family: SimSun, serif; font-size: calc(20px * var(--pgscale, 1)); font-weight: 900; letter-spacing: 5px; margin: 2px 0; }
.file-roundstamp .c { font-family: SpecialElite, monospace; font-size: calc(6.5px * var(--pgscale, 1)); letter-spacing: 1px; }
/* 便条纸化 pencil-note 在档案页上的落点微调（幸存者层保留） */
.paper-file .pencil-note { color: #5a4a30; }
/* 显示更多按钮（档案页作用域换皮） */
.paper-file .board-more { font-family: SimSun, serif; letter-spacing: 2px; background: rgba(236, 225, 204, .6);
  border: 1px solid #6b5d42; color: #2b2419; }

/* ---- 批2 件（2026-10-10）：环衬便条 / 扉页表单号水印 / 名人堂档案适配 ---- */
/* 环衬批注带布局（2026-10-12 方案2 融氛围版）：去旋转去 max-width——印刷带全宽正排 */
.flyleaf-note { margin: calc(14px * var(--pgscale, 1)) 0 0; }
.form-watermark { position: absolute; left: 1.2rem; top: 0.9rem; z-index: 1; pointer-events: none;
  font-family: SpecialElite, monospace; font-size: calc(8.5px * var(--pgscale, 1)); letter-spacing: 2px;
  color: #5a4a30; opacity: .38; transform: rotate(-2deg); }
.paper-file .split-main { position: relative; } /* 圆审讫章定位锚（名人堂右页） */
.hall-stamp { bottom: calc(30px * var(--pgscale, 1)) !important; right: calc(14px * var(--pgscale, 1)) !important; }
.paper-file .hall-empty { color: #6b5d42; }
.paper-file .file-titlewrap { margin-bottom: calc(8px * var(--pgscale, 1)); }


/* ==================== 书籍立体化（2026-09-30 方案，裁定：三层全做/18px/轻/等比；色调冻结） ==================== */
/* L1-页面弯曲感与光影包裹：顶缘受光/底缘AO/水平中带微拱/柔光弧——全部对称层叠在 ::before，
 *    不分左右的中性光泽（左右差异由下方外缘亮线补充） */
.page::before {
  background:
    linear-gradient(180deg, rgba(255, 235, 200, 0.07) 0%, transparent 1.6%),
    linear-gradient(0deg, rgba(40, 25, 12, 0.05) 0%, transparent 4%),
    linear-gradient(180deg, transparent 33%, rgba(255, 246, 220, 0.03) 50%, transparent 67%),
    linear-gradient(180deg, rgba(122, 88, 38, 0.12) 0%, transparent 26%),
    radial-gradient(120% 95% at 50% 45%, transparent 58%, rgba(96, 58, 20, 0.22) 100%),
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3'/%3E%3CfeColorMatrix values='0 0 0 0 0.35 0 0 0 0 0.28 0 0 0 0 0.18 0 0 0 0.05 0'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)'/%3E%3C/svg%3E");
}
/* L1-纸面弯曲方向感：外缘微亮+中缝沉（在库中缝 inset 阴影上叠加，box-shadow 多层共存）。
 * 书本化重构 L1（2026-10-03）：中缝暗层 0.5→0.42 降档配合下方 page-shade 渐变 */
.page.--left { box-shadow: inset -46px 0 52px -38px rgba(40, 25, 12, 0.42), inset 10px 0 22px -14px rgba(255, 240, 210, 0.07); }
.page.--right { box-shadow: inset 46px 0 52px -38px rgba(40, 25, 12, 0.42), inset -10px 0 22px -14px rgba(255, 240, 210, 0.07); }

/* 书本化重构 L1-中缝凹陷曲面（2026-10-03，裁定 5b=18% 页宽）：多停点渐变模拟余弦亮度——
 * 中缝最深 → 7% 处"纸脊隆起"窄高光 → 18% 页宽内渐隐；左右页镜像。
 * 元素 <i class="page-shade"> 由 app.js 插入非封面页（z 低于 .page-inner，随页克隆/裁剪） */
.page-shade {
  position: absolute;
  inset: 0;
  pointer-events: none;
}
.page.--left .page-shade {
  background: linear-gradient(to left,
    rgba(40, 24, 10, 0.26) 0%, rgba(40, 24, 10, 0.09) 5%,
    rgba(255, 244, 220, 0.07) 7%, rgba(40, 24, 10, 0.05) 11%,
    transparent 18%);
}
.page.--right .page-shade {
  background: linear-gradient(to right,
    rgba(40, 24, 10, 0.26) 0%, rgba(40, 24, 10, 0.09) 5%,
    rgba(255, 244, 220, 0.07) 7%, rgba(40, 24, 10, 0.05) 11%,
    transparent 18%);
}

/* 书本化重构 L3-纸面颗粒与染色不均（2026-10-03，裁定 2a：multiply 颗粒放宽至 0.12-0.15）：
 * 颗粒=You-Bet 配方 baseFrequency 0.65/numOctaves 3 粗颗粒 multiply 0.13（同时修复大面积
 * 渐变的 banding）；云斑=低频 0.015 大块染色不均 multiply 0.07（≤0.08）。
 * multiply 需独占元素（::before 栈内为 normal 混合），元素由 app.js 插入非封面页 */
.page-grain, .page-cloud {
  position: absolute;
  inset: 0;
  pointer-events: none;
  mix-blend-mode: multiply;
}
.page-grain {
  opacity: 0.13;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3'/%3E%3CfeColorMatrix values='0 0 0 0 0.16 0 0 0 0 0.10 0 0 0 0 0.05 0 0 0 1 0'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23g)'/%3E%3C/svg%3E");
}
.page-cloud {
  opacity: 0.07;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='480'%3E%3Cfilter id='c'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.015' numOctaves='2'/%3E%3CfeColorMatrix values='0 0 0 0 0.45 0 0 0 0 0.32 0 0 0 0 0.16 0 0 0 0.9 0'/%3E%3C/filter%3E%3Crect width='480' height='480' filter='url(%23c)'/%3E%3C/svg%3E");
}

/* L1-封面表面弧：对角高光+四角AO（皮面微拱；cover.jpg/金线框/标题冻结不动） */
.cover::before {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  border-radius: inherit;
  /* 精装化 P3 + T3 皮革深化（2026-10-04）：四角磨浅取满 0.10/130px、铰链压痕加深一档、
   * 纵向细折痕 ×2（常开合位）、宽淡斜向蜡感光泽带（与左上全局光源同向，平涂 ≤0.10） */
  background:
    radial-gradient(130px 130px at 0 0, rgba(214, 186, 138, 0.10), transparent 70%),
    radial-gradient(130px 130px at 100% 0, rgba(214, 186, 138, 0.10), transparent 70%),
    radial-gradient(130px 130px at 0 100%, rgba(214, 186, 138, 0.10), transparent 70%),
    radial-gradient(130px 130px at 100% 100%, rgba(214, 186, 138, 0.10), transparent 70%),
    linear-gradient(115deg, transparent 26%, rgba(255, 236, 190, 0.08) 42%, rgba(255, 236, 190, 0.03) 52%, transparent 66%),
    linear-gradient(90deg, transparent 8px, rgba(22, 12, 5, 0.40) 9px, transparent 10.5px,
      transparent 12px, rgba(22, 12, 5, 0.30) 13px, transparent 14.5px),
    linear-gradient(90deg, transparent 29.6%, rgba(22, 12, 5, 0.20) 30%, transparent 30.5%,
      transparent 54.5%, rgba(22, 12, 5, 0.16) 55%, transparent 55.5%),
    linear-gradient(115deg, transparent 34%, rgba(255, 236, 190, 0.05) 47%, transparent 58%),
    radial-gradient(130% 100% at 50% 45%, transparent 62%, rgba(6, 3, 1, 0.22) 100%);
}

/* L2-书体厚度侧边（app.js 挂 .stf__parent 内、.stf__block 之前=同z下层；右书口18px+顶底6px） */
.stf__parent { position: relative; }
.book-side { position: absolute; pointer-events: none; z-index: 0; }
/* v2（用户截图反馈）：撤顶底横条（正视角下书顶底面不可见，6px 突兀横贯=贴条感）；
 * 右书口 18→14px，左缘用页面底色渐入+阴影过渡根治"贴片"硬边界 */
.book-side.side-r {
  /* 精装化 P0：锚从容器右缘改为书 rect 右缘（--bx+--bw）；P4：盖板外挑——
   * 书口条相对内页 rect 内缩 3px（盖板大于书芯 3px 的精装特征） */
  top: calc(var(--by, 0px) + 4px);
  left: calc(var(--bx, 0px) + var(--bw, 100%) - 3px);
  width: 14px;
  height: calc(var(--bh, 100%) - 8px);
  border-radius: 0 10px 10px 0;
  /* 书本化重构 L2（2026-10-03）：纵向受光渐变（顶亮底 AO）+ 条纹周期 3px→2px、
   * alpha 0.20/0.16→0.14/0.10（细周期更接近真书书口）+ 左缘渐入保留（v2 判例）；
   * 阴影纯黑→暖棕黑、单层 ≤0.12 */
  background:
    linear-gradient(180deg, rgba(255, 240, 210, 0.10) 0%, transparent 20%, transparent 72%, rgba(30, 18, 8, 0.20) 100%),
    repeating-linear-gradient(180deg,
      rgba(232, 220, 192, 0.14) 0 1px, rgba(120, 100, 70, 0.10) 1px 2px),
    linear-gradient(90deg, rgba(36, 21, 5, 0.55) 0%, #3a250f 40%, #160c02 100%);
  box-shadow:
    inset 2px 0 3px rgba(40, 24, 10, 0.12),
    inset -3px 0 5px rgba(40, 24, 10, 0.12),
    inset -1px 0 0 rgba(255, 228, 185, 0.30),
    3px 4px 9px rgba(40, 24, 10, 0.12);
  /* 上下端 4px 羽化收头，消除直边截断感 */
  -webkit-mask-image: linear-gradient(180deg, transparent 0, #000 4px, #000 calc(100% - 4px), transparent 100%);
  mask-image: linear-gradient(180deg, transparent 0, #000 4px, #000 calc(100% - 4px), transparent 100%);
}

/* L3-落地感：书正下方桌面接触影（随书 autoSize 等比，裁定 4）+外扩环境暗晕 */
.book-ground {
  /* v2（用户截图反馈）：底缘贴书+收窄到书宽+加深——上缘浓（贴书线）向下快速衰减。
   * 精装化 P0：锚改书 rect（--bx/--by/--bw/--bh），底缘=rect 底（by+bh）。
   * F1（2026-10-04）：blur(7px) 移除——filter 是帧成本源，柔化由渐变停点烘焙 */
  position: absolute;
  left: var(--bx, 1%);
  top: calc(var(--by, 0px) + var(--bh, 87%));
  width: var(--bw, 98%);
  height: 13%;
  background: radial-gradient(62% 100% at 50% 0%,
    rgba(30, 18, 8, 0.30), rgba(30, 18, 8, 0.13) 42%, rgba(30, 18, 8, 0.05) 62%, transparent 80%);
  pointer-events: none;
}
/* F1（2026-10-04 方案_门户翻页性能与残留缺陷修复）：#book 四层 drop-shadow 移除——
 * 库 rAF 每帧重写页面 cssText，filter 迫使 ~1900×1000 子树每帧重光栅化+4 趟模糊
 * （帧成本头号源，症状 3"消失 1s"高度疑似其爆发）。静态投影改由 .book-tilt::before
 * 承担（不随翻页板形变化；板形阴影由库 innerShadow 承担）；
 * 摊开态 filter 同时清空（base 规则的单层 drop-shadow 一并移除） */
/* 书本化重构 L4-书体 vignette：书级光线围拢（中心 55% 透明→边缘暖棕黑 0.12，
 * 光心 50% 40% 与 lamp-glow 左上光源同向）；元素由 app.js 挂 .stf__parent 尾部，
 * z-index 压过页面与库阴影层（边缘-only 罩层，不遮阅读区） */
.book-vignette {
  position: absolute;
  /* 精装化 P0：锚书 rect（原 inset:0 罩整个容器，宽屏下暗角偏心到容器缘） */
  left: var(--bx, 0px); top: var(--by, 0px);
  width: var(--bw, 100%); height: var(--bh, 100%);
  z-index: 12;
  pointer-events: none;
  background: radial-gradient(ellipse at 50% 40%, transparent 55%, rgba(30, 18, 8, 0.12) 100%);
}

/* ==================== 书本化重构 L5-页面微圆角与外缘收边（2026-10-03，裁定 3a=4px 仅外缘） ==================== */
/* 中缝侧保持直角（方案假设 B：避免双页间露出背景细缝）；cover 自带圆角冻结，:not(.cover) 排除。
 * 回退预案：若翻页中圆角与库 clip-path 边界错位，单层回退本段 */
.page.--left:not(.cover) { border-radius: 4px 0 0 4px; }
.page.--right:not(.cover) { border-radius: 0 4px 4px 0; }
/* 外缘 1px 暖暗线 + 向外 4% 页宽微暗渐变（纸边微翘暗示）——并入 page-shade 承载
 * （background 不可增量叠加，中缝凹陷层按 L1 原值在此重述，调参需两处同步） */
.page.--left:not(.cover) .page-shade {
  background:
    linear-gradient(to left,
      rgba(40, 24, 10, 0.26) 0%, rgba(40, 24, 10, 0.09) 5%,
      rgba(255, 244, 220, 0.07) 7%, rgba(40, 24, 10, 0.05) 11%,
      transparent 18%),
    linear-gradient(to right, rgba(40, 24, 10, 0.10) 0%, transparent 4%);
  box-shadow: inset 1px 0 0 rgba(30, 18, 8, 0.30);
}
.page.--right:not(.cover) .page-shade {
  background:
    linear-gradient(to right,
      rgba(40, 24, 10, 0.26) 0%, rgba(40, 24, 10, 0.09) 5%,
      rgba(255, 244, 220, 0.07) 7%, rgba(40, 24, 10, 0.05) 11%,
      transparent 18%),
    linear-gradient(to left, rgba(40, 24, 10, 0.10) 0%, transparent 4%);
  box-shadow: inset -1px 0 0 rgba(30, 18, 8, 0.30);
}

/* ==================== 书本化重构 L6-翻页动态联动（2026-10-03，裁定 4 本轮做） ==================== */
/* changeState≠read 时 app.js 给 #book 挂 .is-flipping：
 * ① 书页渐变罩层淡入（BookBlock overlay 思路：翻页中纸面随翻起页失去直射光转暗；
 *    峰值 0.10 守平涂罩层红线，transition 平滑进出；库自身 innerShadow 管翻起页正下方，
 *    本层补全局光感变化）；
 * ② 右书口 14→11px 瞬时减薄（页从垛里抽起）——width/right 同步改保左缘贴书无缝 */
/* L1b（2026-10-05 翻页性能深度优化；L1a 同款纹理免绘已次日撤销——用户录屏实锤翻页起止
 * 整页亮度跳变 ±10 级闪眼：纹理层是页面质感压暗的一部分，免绘=净变亮；30fps 已批提供
 * 帧成本减半，L1a 边际收益不值亮度代价，纹理全程保留）：封面标题逐字符双层 drop-shadow
 * 滤波（封面打开动画重灾区），动画窗口关闭落地恢复——细节级效果运动中难辨，保留。 */
#book.is-flipping .cover-title .ch { filter: none; }

/* K2（2026-10-06 架构优化甲批）：可见但失焦（win-blur，app.js blur/focus 挂类）时统一
 * 暂停 5 处 CSS 无限动画（红队二轮实锤：失焦可见态动画照跑驱动重绘，灰烬降档治不完整）
 * ——灯光呼吸/雾漂/光泽扫/奖章高光×2；粒子慢速漂浮暂停无感，焦点恢复自动续播 */
body.win-blur .lamp-glow, body.win-blur .mist-layer, body.win-blur .sheen,
body.win-blur .medal-hi, body.win-blur .medal-shine::before { animation-play-state: paused; }

.page-shade::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  opacity: 0;
  transition: opacity 0.28s ease;
}
.page.--left .page-shade::after {
  background: linear-gradient(to left, rgba(40, 24, 10, 0.14) 0%, rgba(40, 24, 10, 0.06) 40%, transparent 75%);
}
.page.--right .page-shade::after {
  background: linear-gradient(to right, rgba(40, 24, 10, 0.14) 0%, rgba(40, 24, 10, 0.06) 40%, transparent 75%);
}
#book.is-flipping .page-shade::after { opacity: 1; }
/* flipping 窗口（changeState≠read）隐藏 vignette 非必要合成层，
 * read 恢复——与库翻页 3D 互斥，防层树重排峰值（coverface/flyleaf 已随减法方案拆除） */
.book-tilt.is-flipping .book-vignette { visibility: hidden !important; }
.book-side.side-r { transition: width 0.28s ease, left 0.3s ease; }
/* 装饰禁用窗口（2026-10-05 用户四轮裁定：翻页触发即禁用装饰、不参与动画——同步扫动
 * 编排三轮未调平（fork 动画节奏真机偏差），隐藏式一劳永逸）：app.js 在 changeState
 * flipping/user_fold 给 #book 挂 .deco-hide、read 摘除。翻页窗口内位置类（side-r/side-b/
 * ground/spine）强制透明（0.12s 快速淡出防硬切感），落地后按各自基础 opacity 过渡淡入
 * （此时位置已在目标态=无扫动）。fold_corner 不隐藏防 hover 卷角频繁闪烁 */
#book.deco-hide .book-side, #book.deco-hide .book-ground, #book.deco-hide .book-spine {
  opacity: 0 !important;
  transition: opacity 0.12s ease !important;
}
/* P0 锚改 left 后减薄只动 width（左缘贴书，外侧收 3px） */
#book.is-flipping .book-side.side-r { width: 11px; }

/* ==================== 精装化 P0-装饰层三状态对齐（2026-10-03） ==================== */
/* 锚点变量 --bx/--by/--bw/--bh/--bpw 由 app.js syncBookRect 随 flip/init/resize/
 * changeOrientation 写入 #book（库 getBoundsRect）。状态类 syncBookState 维护。
 * showCover 取证：封面态封面占 rect 右半、封底态占左半 */
#book.st-closed-front .book-ground, #book.st-closed-front .book-vignette {
  left: calc(var(--bx) + var(--bpw)); width: var(--bpw);
}
#book.st-closed-back .book-ground, #book.st-closed-back .book-vignette {
  left: var(--bx); width: var(--bpw);
}
/* 封底态书口条贴封底右缘（rect 中线，P4 内缩 3px） */
#book.st-closed-back .book-side.side-r { left: calc(var(--bx) + var(--bpw) - 3px); }
/* portrait 竖屏档：库把唯一页渲染在 rect 右半（批5 探查判例），装饰层一律按右半对齐，
 * 规则置后以同特异性覆盖上面两条 */
#book.st-portrait .book-ground, #book.st-portrait .book-vignette {
  left: calc(var(--bx) + var(--bpw)); width: var(--bpw);
}
#book.st-portrait .book-side.side-r { left: calc(var(--bx) + var(--bw) - 3px); }
/* 三状态切换平滑（side-r 的 transition 由 L6 规则单独定义，含 width；位置过渡在
 * deco-hide 窗口内进行=无视觉，恢复时已到位——0.3s 仅覆盖 resize 等非翻页位置变化） */
.book-ground, .book-vignette { transition: left .3s ease, width .3s ease, opacity .3s ease; }

/* ==================== 精装化 P2-环衬页（2026-10-03） ==================== */
/* 环衬=比内页深一档的暖棕做旧厚纸，无正文；page-shade/grain/cloud 三层由 app.js
 * 照常插入（非 cover 即覆盖），::before 做旧渐变同样生效 */
.page.endsheet {
  background:
    linear-gradient(rgba(198, 170, 126, 0.55), rgba(178, 148, 104, 0.58)),
    url("/img/tex/styles/western/paper.jpg") center / cover;
}
/* 前环衬左页 pastedown 再深半档（贴封面里侧） */
.page.endsheet-front {
  background:
    linear-gradient(rgba(150, 120, 78, 0.62), rgba(128, 100, 62, 0.66)),
    url("/img/tex/styles/western/paper.jpg") center / cover;
}
/* ===== 环衬扩充定稿（2026-10-12 用户裁定 A+B 综合+黑条脱敏）：
 * 上=卷内目录 / 下=调阅记录（mockE 转正），公文页排版替换旧居中烫金题字 ===== */
.flyleaf-inner {
  display: block;
  text-align: left;
}
.flyleaf-title {
  font-family: SimSun, serif; font-weight: 900;
  font-size: calc(25px * var(--pgscale, 1));
  letter-spacing: calc(9px * var(--pgscale, 1));
  color: #2b2419;
  margin: calc(7px * var(--pgscale, 1)) 0 4px;
}
.flyleaf-subline {
  font-family: SpecialElite, "Courier New", monospace;
  font-size: calc(9px * var(--pgscale, 1)); letter-spacing: calc(2px * var(--pgscale, 1));
  color: #4a4030;
  border-top: 1px solid rgba(74, 64, 48, 0.4);
  border-bottom: 3px double rgba(74, 64, 48, 0.4);
  padding: 4px 2px 5px;
  margin-bottom: calc(16px * var(--pgscale, 1));
}
.flyleaf-toc, .flyleaf-register {
  width: 100%; border-collapse: collapse;
  font-size: calc(11.5px * var(--pgscale, 1));
}
.flyleaf-toc th, .flyleaf-register th {
  font-weight: 900; letter-spacing: calc(2px * var(--pgscale, 1));
  background: rgba(210, 195, 158, 0.75);
  padding: calc(5px * var(--pgscale, 1)) 6px;
  border: 1px solid rgba(74, 64, 48, 0.45);
  font-size: calc(10px * var(--pgscale, 1));
}
.flyleaf-toc td, .flyleaf-register td {
  padding: calc(5.5px * var(--pgscale, 1)) 6px;
  border: 1px solid rgba(74, 64, 48, 0.4);
}
.flyleaf-toc .no, .flyleaf-register .date {
  font-family: SpecialElite, "Courier New", monospace;
  font-size: calc(9.5px * var(--pgscale, 1)); color: #33291a;
}
.flyleaf-toc .pg { text-align: center; letter-spacing: 2px; font-size: calc(11px * var(--pgscale, 1)); }
.flyleaf-toc .c-no { width: calc(88px * var(--pgscale, 1)); }
.flyleaf-toc .c-pg { width: calc(52px * var(--pgscale, 1)); }
.flyleaf-toc-note {
  margin: calc(8px * var(--pgscale, 1)) 0 calc(14px * var(--pgscale, 1));
  font-family: SpecialElite, "Courier New", monospace;
  font-size: calc(8.5px * var(--pgscale, 1)); letter-spacing: calc(2px * var(--pgscale, 1));
  color: #6a5c42;
}
.flyleaf-sec-title {
  font-family: SimSun, serif; font-weight: 900;
  font-size: calc(16px * var(--pgscale, 1));
  letter-spacing: calc(6px * var(--pgscale, 1));
  color: #2b2419;
  margin: 2px 0 calc(8px * var(--pgscale, 1));
}
.flyleaf-register .c-date { width: calc(78px * var(--pgscale, 1)); }
.flyleaf-register .c-name { width: calc(96px * var(--pgscale, 1)); }
.flyleaf-register .c-dept { width: calc(104px * var(--pgscale, 1)); }
.flyleaf-register .name { white-space: nowrap; }
/* 黑条脱敏（用户裁定①）：名字仍在 DOM、视觉纯黑条盖住——解密档案形态 */
.flyleaf-register .redact {
  background: #1c1712; color: transparent;
  padding: 1px 4px; border-radius: 1px;
  user-select: none;
}
/* 末两行幸存者手写原迹（不脱敏）：楷体歪斜，r2 更歪 */
.flyleaf-register .hand-row td {
  font-family: KaiTi, "楷体", serif;
  font-size: calc(13.5px * var(--pgscale, 1));
  color: #55432a;
}
/* 末日面包签名（2026-10-12 用户裁定替换歪斜签名）：bot 榜单同款形态
 * =楷体深蓝墨 #24325c 字距 2px（kill_board_template .sig .ink.zh 实样）；
 * 选择器须压过 .hand-row td（0,2,2）——级联顺序教训再现 */
.flyleaf-register .hand-row td.sig-bread {
  color: #24325c;
  font-size: calc(16px * var(--pgscale, 1));
  letter-spacing: 2px;
}
.flyleaf-register .hand-row.r2 td { transform: rotate(-1.2deg); }
/* 机密章（2026-10-12 用户裁定：自封面迁来替换逾期未还章；fx 入场=内容落定后斜盖） */
.flyleaf-stamp {
  position: absolute; right: calc(54px * var(--pgscale, 1)); bottom: calc(200px * var(--pgscale, 1));
  color: #c2372a; font-family: SimSun, serif; font-weight: 900;
  font-size: calc(16px * var(--pgscale, 1)); letter-spacing: calc(4.5px * var(--pgscale, 1));
  text-align: center; line-height: 1.6;
  border: 3px solid #c2372a;
  outline: 1px solid rgba(194, 55, 42, 0.6); outline-offset: 3px;
  border-radius: 3px;
  padding: calc(5px * var(--pgscale, 1)) calc(10px * var(--pgscale, 1)) calc(6px * var(--pgscale, 1));
  transform: rotate(-11deg); opacity: 0.85;
  text-shadow: 0 0 1px rgba(194, 55, 42, 0.7);
  pointer-events: none; z-index: 3;
}
.flyleaf-pageno {
  text-align: center;
  font-family: SpecialElite, "Courier New", monospace;
  font-size: calc(9px * var(--pgscale, 1)); letter-spacing: calc(3px * var(--pgscale, 1));
  color: #6a5c42;
  margin-top: calc(10px * var(--pgscale, 1));
}

/* ==================== 精装化 P3-封面皮革深化（2026-10-03，裁定 1a 叠层深化/2a deboss） ==================== */
/* 暗底 multiply 无效 → 封面颗粒/云斑改 soft-light，opacity 独立参数（假设 C：嫌弱可调 0.18 或 overlay） */
.cover .page-grain { mix-blend-mode: soft-light; opacity: 0.12; }
.cover .page-cloud { mix-blend-mode: soft-light; opacity: 0.10; }
/* 皮革压花平铺：leather-emboss.webp=离线渲染凹凸图（gen_leather_texture.py，feTurbulence 思路），
 * 运行时不挂 SVG 滤镜（翻页动画性能红线）；overlay 混合 128 中灰=不影响底色 */
.cover-emboss {
  position: absolute;
  inset: 0;
  pointer-events: none;
  mix-blend-mode: overlay;
  /* T3（2026-10-04）：gen v2 双层纹理（细皱+龟裂）对比 ±32，斜视角下读到皮革颗粒 */
  opacity: 0.55;
  background: url("/img/tex/styles/western/leather-emboss.webp") repeat;
  background-size: 340px 340px;
  border-radius: inherit;
}
/* 封底铰链压痕镜像（书脊在其右缘），其余磨损/弧光层同 .cover::before 重述 */
.back-cover::before {
  /* T3 封底镜像：同封面深化（铰链在其右缘=270deg） */
  background:
    radial-gradient(130px 130px at 0 0, rgba(214, 186, 138, 0.10), transparent 70%),
    radial-gradient(130px 130px at 100% 0, rgba(214, 186, 138, 0.10), transparent 70%),
    radial-gradient(130px 130px at 0 100%, rgba(214, 186, 138, 0.10), transparent 70%),
    radial-gradient(130px 130px at 100% 100%, rgba(214, 186, 138, 0.10), transparent 70%),
    linear-gradient(115deg, transparent 26%, rgba(255, 236, 190, 0.08) 42%, rgba(255, 236, 190, 0.03) 52%, transparent 66%),
    linear-gradient(270deg, transparent 8px, rgba(22, 12, 5, 0.40) 9px, transparent 10.5px,
      transparent 12px, rgba(22, 12, 5, 0.30) 13px, transparent 14.5px),
    linear-gradient(270deg, transparent 29.6%, rgba(22, 12, 5, 0.20) 30%, transparent 30.5%,
      transparent 54.5%, rgba(22, 12, 5, 0.16) 55%, transparent 55.5%),
    linear-gradient(115deg, transparent 34%, rgba(255, 236, 190, 0.05) 47%, transparent 58%),
    radial-gradient(130% 100% at 50% 45%, transparent 62%, rgba(6, 3, 1, 0.22) 100%);
}
/* 金框 deboss：outline 位于 border 内 12px（outline-offset:-12px），::after 对齐同位，
 * 上/左暗、下/右亮=压凹烫金框（光源左上，色调不动） */
.cover::after {
  content: "";
  position: absolute;
  inset: 12px;
  border-radius: 4px 11px 11px 4px;
  pointer-events: none;
  border-top: 1px solid rgba(22, 12, 4, 0.5);
  border-left: 1px solid rgba(22, 12, 4, 0.42);
  border-bottom: 1px solid rgba(255, 222, 158, 0.16);
  border-right: 1px solid rgba(255, 222, 158, 0.12);
}

/* ==================== 精装化 P4-全套精装几何（2026-10-03，裁定 3 全套/4 右侧+底边） ==================== */
/* 独立书脊面：合书态封面左缘外 13px 竖条（封底态镜像到封底右缘外——背面看书脊在右），
 * 圆背弧渐变=中间受光亮、两侧转阴影；上下端 4px 羽化收头；摊开态 opacity 0 隐藏 */
.book-spine {
  position: absolute;
  top: calc(var(--by, 0px) + 2px);
  height: calc(var(--bh, 100%) - 4px);
  width: 13px;
  left: calc(var(--bx, 0px) + var(--bpw, 50%) - 13px);
  border-radius: 7px;
  background: linear-gradient(90deg,
    rgba(24, 14, 6, 0.62) 0%, rgba(72, 46, 22, 0.55) 35%,
    rgba(150, 110, 60, 0.45) 50%, rgba(72, 46, 22, 0.55) 65%, rgba(20, 11, 4, 0.66) 100%);
  box-shadow: 2px 3px 6px rgba(30, 18, 8, 0.12);
  -webkit-mask-image: linear-gradient(180deg, transparent 0, #000 4px, #000 calc(100% - 4px), transparent 100%);
  mask-image: linear-gradient(180deg, transparent 0, #000 4px, #000 calc(100% - 4px), transparent 100%);
  opacity: 0;
  transition: opacity .3s ease, left .3s ease;
  pointer-events: none;
  z-index: 0;
}
#book.st-closed-front .book-spine { opacity: 1; }
#book.st-closed-back .book-spine { left: calc(var(--bx) + var(--bpw)); opacity: 1; }
#book.st-portrait .book-spine { left: calc(var(--bx) + var(--bpw) - 13px); }

/* 底边页块条：高 10px、2px 细纹（同 L2 书口降档 alpha）、顶缘贴盖板内缩 3px、
 * 左端随书脊 18px 羽化；封面/封底态显示，摊开态（st-open=默认 opacity 0）收起。
 * 外缘宽度与右书口条齐（+11px=书口条露出盖板的部分） */
.book-side.side-b {
  top: calc(var(--by, 0px) + var(--bh, 100%) - 3px);
  left: calc(var(--bx, 0px) + var(--bpw, 50%));
  width: calc(var(--bpw, 50%) + 11px);
  height: 10px;
  border-radius: 0 0 4px 4px;
  background:
    linear-gradient(180deg, rgba(20, 12, 4, 0.5) 0%, transparent 45%),
    repeating-linear-gradient(180deg,
      rgba(232, 220, 192, 0.14) 0 1px, rgba(120, 100, 70, 0.10) 1px 2px),
    linear-gradient(90deg, #241606 0%, #3a2812 60%, #4a3418 100%);
  box-shadow: 0 3px 6px rgba(30, 18, 8, 0.12);
  -webkit-mask-image: linear-gradient(90deg, transparent 0, #000 18px);
  mask-image: linear-gradient(90deg, transparent 0, #000 18px);
  opacity: 0;
  transition: opacity .3s ease, left .3s ease, width .3s ease;
}
#book.st-closed-front .book-side.side-b { opacity: 1; }
/* 封底态：页块条在左半，书脊端在右——羽化镜像 */
#book.st-closed-back .book-side.side-b {
  left: calc(var(--bx) - 11px);
  opacity: 1;
  -webkit-mask-image: linear-gradient(270deg, transparent 0, #000 18px);
  mask-image: linear-gradient(270deg, transparent 0, #000 18px);
}

/* ==================== 竖立3D Q2-合书扫动同步（2026-10-03） ==================== */
/* 进入合书态时装饰层 transition 时长对齐 flippingTime（--flip-dur 由 app.js 按
 * reducedMotion 写 0.9s/0.22s）——盖板扫多远，书口/书脊/落地影同步扫多远；
 * 离开合书态（打开）回基线 0.3s 速归位 */
#book.st-closed-front .book-side, #book.st-closed-front .book-ground,
#book.st-closed-front .book-vignette, #book.st-closed-front .book-spine,
#book.st-closed-back .book-side, #book.st-closed-back .book-ground,
#book.st-closed-back .book-vignette, #book.st-closed-back .book-spine {
  transition-duration: var(--flip-dur, 0.9s);
}

/* ==================== 竖立3D Q3a-合书态 3D 展示（2026-10-03，裁定 1a/2a/3a/4a；v2 立姿重做） ==================== */
/* 倾斜参数调参口（角度/透视/缩放/厚度全部 CSS 变量，验收微调不算新裁定）。
 * v2：姿态从斜躺 28° 改为 Codrops AnimatedBooks 立姿（小 rotateX+大 rotateY 露左书脊） */
:root {
  --tilt-persp: 4000px;
  /* v2.1 根因①：CSS rotateY 正角才把书左缘转向观者（露左书脊），负角露的是右侧书口
   * （v2 的 -30° 使 spine 面法线背对观者+backface:hidden=厚度面全灭）；
   * rotateX 负小角=微俯视露顶面（正角会把顶面法线转离观者） */
  --tilt-x: -8deg;
  --tilt-y: -22deg;
  --tilt-scale: 0.9;
  --book-depth: 140px;
}
/* wrapper 几何与 #book 原 flex 项行为一致（库 inline width:100%+max-width 照旧生效）。
 * v2：preserve-3d 盒体宿主——厚度面是其直接子元素（#book filter flatten 约束） */
.book-tilt {
  position: relative;
  width: 100%;
  max-width: 2050px;
  display: flex;
  justify-content: center;
  align-items: center;
  transform: none;
  transform-style: preserve-3d;
  transform-origin: 50% 75%;
  opacity: 1;
  /* 2026-10-05 用户裁定：3D↔平面切换改瞬时（删 transform 过渡）——过渡窗口内
   * fork 矩形计算 overshoot+坐标变量瞬更 vs transform 插值+b3 面淡出交叠=
   * 闪屏/多书/纯色覆盖（用户录屏实锤）。静态两态各自正确，过渡动画是全部乱源 */
}
/* 2026-10-05 移除 F1 tilt-enter 淡入：立起交接时整书从 opacity 0 淡入=软渲染下
 * 封面消失的黑闪帧+幽灵帧实锤（screencast 取证），立起改即时可见+transform 过渡 */
/* 合书态立姿：rotateY(+30°) 左缘转向观者露左书脊+前封面；
 * v2.1 根因②：封面占 rect 右半（showCover），视觉物体在 wrapper 右半=偏右裁切——
 * translateX 把封面中心（bx+1.5pw）补偿回 wrapper 中心（50%），封底态按左半镜像 */
.book-tilt.is-3d {
  transform: translateX(calc(50% - var(--bx, 0px) - var(--bpw, 50%) * 1.47))
    perspective(var(--tilt-persp)) rotateX(var(--tilt-x)) rotateY(var(--tilt-y)) scale(var(--tilt-scale));
  cursor: pointer;
}
/* hover 轻转 6° 给可点暗示（AnimatedBooks hover rotate 35° 的克制版） */
.book-tilt.is-3d:hover {
  transform: translateX(calc(50% - var(--bx, 0px) - var(--bpw, 50%) * 1.47))
    perspective(var(--tilt-persp)) rotateX(var(--tilt-x)) rotateY(calc(var(--tilt-y) + 4deg)) scale(var(--tilt-scale));
}
/* 封底态镜像（书脊在右；封面/封底中心=bx+0.5pw） */
.book-tilt.is-3d.is-3d-back {
  transform: translateX(calc(50% - var(--bx, 0px) - var(--bpw, 50%) * 0.53))
    perspective(var(--tilt-persp)) rotateX(var(--tilt-x)) rotateY(calc(var(--tilt-y) * -1)) scale(var(--tilt-scale));
}
.book-tilt.is-3d.is-3d-back:hover {
  transform: translateX(calc(50% - var(--bx, 0px) - var(--bpw, 50%) * 0.53))
    perspective(var(--tilt-persp)) rotateX(var(--tilt-x)) rotateY(calc(var(--tilt-y) * -1 - 4deg)) scale(var(--tilt-scale));
}
/* 3D 态关闭库坐标通道（点击代理在 wrapper）；装饰层在 #book 内随书一起倾斜，
 * P0 的 rect 变量坐标系是内部坐标，不受外层 transform 影响 */

/* ==================== 3D合书态 v2-真厚度盒体（2026-10-03，Codrops AnimatedBooks 立姿复刻） ====================
 * 用户验收反馈：Q3b 的 2D 条带画在书面平面内，倾斜后仍是"斜躺的一块板"——
 * 重做：每个厚度面独立 transform（preserve-3d 盒体），side-t 随之退役。
 * demo 造型参数（AnimatedBooks component.css，bk-* 结构）：
 *   容器 perspective:1800px；厚度 40px（front translateZ(+20)/back translateZ(-20)）；
 *   书脊 rotate3d(0,1,0,-90deg)、书口 rotate3d(0,1,0,90deg) translate3d(0,0,W)、
 *   顶 rotate3d(1,0,0,90deg)、底 rotate3d(1,0,0,-90deg) translate3d(0,0,H)、
 *   右/顶/底面 backface-visibility:hidden；transition .5s。
 * 本站映射：前封面=#book 平面自身（z=0），五面+桌影向 -z 延伸 --book-depth，
 * 几何锚=P0 rect 变量（封面占 rect 右半 [bx+bpw, by, bpw, bh]；封底态 is-3d-back 镜像） */
.b3 {
  position: absolute;
  pointer-events: none;
  opacity: 0;
  transition: opacity 0.35s ease;
  backface-visibility: hidden;
  -webkit-backface-visibility: hidden;
}
.book-tilt.is-3d .b3 { opacity: 1; }
/* 编排窗口 b3 瞬隐（2026-10-05 五回执"封面打开时的阴影还在"）：打开编排 3D→平面
 * 切换时 b3 面（厚度盒体+桌影）0.35s 淡出拖影=书已翻开、立体阴影还挂在底部；平面
 * 装饰的 deco-hide 四轮已治，b3 是漏网面。is-opening（打开编排窗口）/is-flipping
 * （翻页动画窗口）强制瞬隐；合书立起方向不挂这两个类，b3 淡入 0.35s 保持 */
.book-tilt.is-opening .b3, .book-tilt.is-flipping .b3 {
  opacity: 0 !important;
  transition: none !important;
}
/* 封底面（z=-T，rotateY(180) 正面朝外；合书态被书体自身遮挡，供大角度调参时补面） */
.b3-back {
  left: calc(var(--bx, 0px) + var(--bpw, 50%));
  top: var(--by, 0px);
  width: var(--bpw, 50%);
  height: var(--bh, 100%);
  transform: translate3d(0, 0, calc(var(--book-depth, 140px) * -1)) rotateY(180deg);
  border-radius: 6px;
  background:
    linear-gradient(155deg, rgba(40, 24, 10, 0.55) 0%, rgba(26, 16, 8, 0.70) 100%),
    url("/img/tex/styles/western/cover.jpg") center / cover;
}
/* 书脊面：左缘 rotateY(-90°)，深皮革+圆背弧渐变（沿用 P4 spine 渐变配方） */
.b3-spine {
  left: calc(var(--bx, 0px) + var(--bpw, 50%) - var(--book-depth, 140px) / 2);
  top: var(--by, 0px);
  width: var(--book-depth, 140px);
  height: var(--bh, 100%);
  transform: translate3d(0, 0, calc(var(--book-depth, 140px) / -2)) rotateY(-90deg);
  border-radius: 6px;
  /* T3：overlay 平铺皮革压花（gen v2 龟裂+细皱）+ 弧面高光提亮一档（竹节凸棱保留） */
  background:
    url("/img/tex/styles/western/leather-emboss.webp") repeat 0 0 / 180px 180px,
    repeating-linear-gradient(180deg,
      transparent 0 15%, rgba(255, 222, 158, 0.08) 17% 18.5%,
      rgba(18, 10, 4, 0.30) 19% 20.5%, transparent 22%),
    linear-gradient(90deg,
      rgba(24, 14, 6, 0.62) 0%, rgba(72, 46, 22, 0.50) 35%,
      rgba(196, 152, 92, 0.52) 50%, rgba(72, 46, 22, 0.50) 65%, rgba(20, 11, 4, 0.66) 100%),
    url("/img/tex/styles/western/cover.jpg") center / cover;
  background-blend-mode: overlay, normal, normal, normal;
}
/* 书口页块面：右缘 rotateY(90°)，2px 细纹+纵向受光（沿用 L2 书口工艺） */
.b3-fore {
  left: calc(var(--bx, 0px) + var(--bw, 100%) - var(--book-depth, 140px) / 2);
  top: calc(var(--by, 0px) + 4px);
  width: var(--book-depth, 140px);
  height: calc(var(--bh, 100%) - 8px);
  transform: translate3d(0, 0, calc(var(--book-depth, 140px) / -2)) rotateY(90deg);
  /* U2（2026-10-04）：书口升为主角侧面——0.5px 毛边细纹+2px 层纹双堆叠、低频泛黄云斑、
   * 顶缘受光/底缘 AO（真书书口三件事：细、不匀、顶亮底暗） */
  background:
    radial-gradient(120% 58% at 50% 50%, rgba(255, 246, 224, 0.12), transparent 62%),
    linear-gradient(180deg, rgba(255, 244, 220, 0.30) 0%, transparent 22%, transparent 66%, rgba(90, 66, 32, 0.36) 100%),
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='480'%3E%3Cfilter id='c'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.015' numOctaves='2'/%3E%3CfeColorMatrix values='0 0 0 0 0.55 0 0 0 0 0.42 0 0 0 0 0.24 0 0 0 0.24 0'/%3E%3C/filter%3E%3Crect width='480' height='480' filter='url(%23c)'/%3E%3C/svg%3E") repeat 0 0 / 260px 260px,
    repeating-linear-gradient(180deg,
      rgba(250, 242, 218, 0.85) 0 0.5px, rgba(190, 168, 130, 0.85) 0.5px 1px),
    repeating-linear-gradient(180deg,
      rgba(246, 236, 205, 0.9) 0 1px, rgba(146, 124, 88, 0.9) 1px 2px),
    linear-gradient(90deg, #f0e4c2 0%, #e2d3aa 100%);
}
/* 顶面：rotateX(90°) 法线朝上（CSS y 轴向下），受光页块色 */
.b3-top {
  left: calc(var(--bx, 0px) + var(--bpw, 50%));
  top: calc(var(--by, 0px) - var(--book-depth, 140px) / 2);
  width: var(--bpw, 50%);
  height: var(--book-depth, 140px);
  transform: translate3d(0, 0, calc(var(--book-depth, 140px) / -2)) rotateX(90deg);
  background:
    repeating-linear-gradient(90deg,
      rgba(250, 242, 218, 0.85) 0 0.5px, rgba(190, 168, 130, 0.85) 0.5px 1px),
    repeating-linear-gradient(90deg,
      rgba(246, 236, 205, 0.9) 0 1px, rgba(146, 124, 88, 0.9) 1px 2px),
    linear-gradient(90deg, #f6eed4 0%, #ecdfba 55%, #dfd0a6 100%);
}
/* 底面：rotateX(-90°) 法线朝下，背光页块色 */
.b3-bottom {
  left: calc(var(--bx, 0px) + var(--bpw, 50%));
  top: calc(var(--by, 0px) + var(--bh, 100%) - var(--book-depth, 140px) / 2);
  width: var(--bpw, 50%);
  height: var(--book-depth, 140px);
  transform: translate3d(0, 0, calc(var(--book-depth, 140px) / -2)) rotateX(-90deg);
  background:
    repeating-linear-gradient(90deg,
      rgba(250, 242, 218, 0.8) 0 0.5px, rgba(190, 168, 130, 0.8) 0.5px 1px),
    repeating-linear-gradient(90deg,
      rgba(246, 236, 205, 0.85) 0 1px, rgba(146, 124, 88, 0.85) 1px 2px),
    linear-gradient(90deg, #c6b48a 0%, #b9a67a 55%, #ac9668 100%);
}
/* 桌面投影：立姿书立桌面→影子铺在桌面平面（rotateX(90°)），书底后方狭长椭圆 */
.b3-shadow {
  left: calc(var(--bx, 0px) + var(--bpw, 50%) - 60px);
  top: calc(var(--by, 0px) + var(--bh, 100%) - 110px);
  width: calc(var(--bpw, 50%) + 120px);
  height: 220px;
  transform: translate3d(0, 0, calc(var(--book-depth, 140px) / -2)) rotateX(90deg);
  /* 局部 y 映射深度：y=+T/2 处=书底接触线（z=0）——接触线浓黑实、向后（远端）快速衰减、
   * 向前（观者侧）浅带一点；径向控制两端淡出。暗色场景靠浓度差读"压桌" */
  background:
    radial-gradient(58% 64% at 50% 54%, rgba(12, 7, 3, 0.55), transparent 82%),
    linear-gradient(180deg,
      transparent 0%, rgba(12, 7, 3, 0.34) 56%, rgba(8, 4, 2, 0.62) 70%,
      rgba(4, 2, 1, 0.95) 82%, rgba(8, 4, 2, 0.45) 96%, transparent 100%);
  /* F1：blur(6px) 移除（帧成本源），衰减尾段放宽补偿 */
}
/* 封底态镜像：书脊在左半 rect 的右缘（x 与封面态书脊同位=rect 中线，改朝右），
 * 书口面移到左缘，顶/底/封底/桌影锚左半 */
.book-tilt.is-3d.is-3d-back .b3-back { left: var(--bx); }
.book-tilt.is-3d.is-3d-back .b3-spine {
  transform: translate3d(0, 0, calc(var(--book-depth, 140px) / -2)) rotateY(90deg);
}
.book-tilt.is-3d.is-3d-back .b3-fore {
  left: calc(var(--bx, 0px) - var(--book-depth, 140px) / 2);
  transform: translate3d(0, 0, calc(var(--book-depth, 140px) / -2)) rotateY(-90deg);
}
.book-tilt.is-3d.is-3d-back .b3-top,
.book-tilt.is-3d.is-3d-back .b3-bottom { left: var(--bx); }
.book-tilt.is-3d.is-3d-back .b3-shadow { left: calc(var(--bx, 0px) - 40px); }
/* v2：3D 态下 P4/Q3b 的 2D 厚度条带与书面内落地影全部退役（真厚度面+桌影接管）；
 * 平面合书态（reduced-motion/放平过渡）它们照常工作 */
.book-tilt.is-3d .book-side, .book-tilt.is-3d .book-spine, .book-tilt.is-3d .book-ground { opacity: 0 !important; }

/* ==================== F1-静态投影（2026-10-04，替代 #book filter:drop-shadow） ==================== */
/* 定位=P0 rect 变量；多层 box-shadow 单层 ≤0.12 叠加；不随翻页板形变化
 *（板形阴影由库 innerShadow 承担）。3D 合书态退役（.b3-shadow 桌影接管） */
.book-tilt::before {
  content: "";
  position: absolute;
  left: calc(var(--bx, 0px) + var(--bpw, 50%) * 0.45);
  top: calc(var(--by, 0px) + var(--bh, 100%) * 0.5);
  width: calc(var(--bw, 100%) * 0.92);
  height: calc(var(--bh, 100%) * 0.86);
  z-index: 0;
  pointer-events: none;
  box-shadow:
    10px 14px 22px rgba(40, 24, 10, 0.12),
    20px 34px 52px rgba(30, 18, 8, 0.11),
    34px 60px 96px rgba(30, 18, 8, 0.10);
  opacity: 1;
  transition: opacity .35s ease, left .3s ease, top .3s ease, width .3s ease, height .3s ease;
}
.book-tilt.is-3d::before { opacity: 0; }





/* ==================== 调试徽标（2026-10-04 v3 现场取证） ==================== */
/* 右下角极简深棕小条（2026-10-07 公网分级）：致命异常=常驻"请刷新"文案；
   已自愈=5s 一闪；漂移修复计数不上屏（诊断走 console/localStorage/?debug=1） */
.debug-badge {
  position: fixed;
  right: 10px;
  bottom: 10px;
  z-index: 99999;
  display: none;
  max-width: 46vw;
  padding: 4px 10px;
  border-radius: 4px;
  border: 1px solid rgba(190, 150, 70, 0.4);
  background: rgba(34, 22, 12, 0.92);
  color: #f2e7cb;
  font: 12px/1.5 monospace;
  pointer-events: none;
}
.debug-badge.on { display: block; }

/* ==================== G4/G5 fx 开关族样式（2026-10-04） ==================== */
/* ?fx=low 手动流畅档：关灰烬/雾/呼吸灯/sheen/翻页灰尘，3D 盒体由 JS 退平面 */
.fx-low #ash-layer, .fx-low .mist-layer, .fx-low .lamp-glow,
.fx-low .sheen, .fx-low .dust-puff { display: none !important; }
/* G5 实验开关：?fx=off:ash|fixed|3dbox|decor（逗号叠加；coverface 已随减法方案拆除，传参为无害 no-op） */
.fx-off-ash #ash-layer { display: none !important; }
.fx-off-fixed .lamp-glow, .fx-off-fixed .mist-layer { display: none !important; }
.fx-off-decor .book-side, .fx-off-decor .book-ground, .fx-off-decor .book-vignette,
.fx-off-decor .book-spine, .fx-off-decor .b3, .fx-off-decor .page-shade { display: none !important; }
/* fx-auto-note：复用 debug-badge 基底，按钮可点 */
.debug-badge.fx-auto-note button {
  pointer-events: auto;
  margin-left: 8px;
  padding: 1px 8px;
  border: 1px solid rgba(190, 150, 70, 0.55);
  border-radius: 3px;
  background: rgba(190, 150, 70, 0.18);
  color: #f2e7cb;
  font: inherit;
  cursor: pointer;
}
.debug-badge.fx-auto-note button:hover { background: rgba(190, 150, 70, 0.35); }

/* ==================== 栏目分离批2（2026-10-16）：特色/模组分立 ====================
 * 特色左页=特色条目全页单列；右页=玩法卡列+联动介绍；模组左页=分类清册；右页=大模组精选。
 * 批4 档案化精修前，先以现有纸面语汇（hand 标题/档案表格/红笔 accent）搭骨架。 */

/* 特色左页：条目全页单列（8 条） */
.entries-full { grid-template-columns: 1fr; gap: 0.55rem; }
.entries-full .entry { padding-bottom: 0.45rem; border-bottom: 1px dashed rgba(74, 58, 32, 0.22); }
.entries-full .entry:last-child { border-bottom: none; }
.entries-full .entry p { font-size: 0.86rem; }

/* 特色右页：玩法卡片列 + 联动介绍区 */
.gp-list { display: flex; flex-direction: column; gap: 0.5rem; margin-bottom: 0.8rem; }
.gp-card {
  display: flex; flex-direction: column; gap: 0.1rem; text-align: left;
  background: rgba(251, 247, 236, 0.55);
  border: 1.5px solid rgba(74, 58, 32, 0.35);
  border-radius: 8px 3px 10px 5px;
  padding: 0.5rem 0.75rem;
  cursor: pointer;
  box-shadow: 1px 2px 6px rgba(30, 20, 10, 0.14);
  transition: transform 0.18s ease, border-color 0.18s ease;
}
.gp-card:hover { transform: rotate(-0.5deg) translateY(-1px); }
.gp-card.active { border-color: var(--redpen); background: rgba(251, 247, 236, 0.85); transform: rotate(-0.6deg); }
/* 三条回执②定音（2026-10-16 二轮，字体选 3）：玩法卡标题/一行简介弃宋体（方正尖锐被否）
 * 改马善政毛笔楷（站内自托管 webfont，与封面题字同款）；无 700 字重，去伪粗 */
.gp-card-title { font-size: 1.15rem; color: var(--ink); font-family: "Ma Shan Zheng", KaiTi, serif; }
.gp-card.active .gp-card-title { color: var(--redpen); }
.gp-card-blurb { font-size: 0.8rem; color: var(--pen); font-family: "Ma Shan Zheng", KaiTi, serif; }
.gp-detail {
  display: flex; flex-wrap: wrap; gap: 0.7rem; align-items: stretch;
  background: rgba(251, 247, 236, 0.5);
  border: 1.5px solid rgba(74, 58, 32, 0.4);
  border-radius: 10px 4px 12px 6px;
  padding: 0.6rem 0.8rem 0.7rem;
  box-shadow: 2px 3px 8px rgba(30, 20, 10, 0.18);
}
/* 批3 guide 上墙暴露（2026-10-16）：guide ul 是 gp-detail（横排 flex）第三子项，
 * 无 wrap 时被挤成右侧窄竖列——guide 强制整行换行到图+正文下方全宽 */
.gp-detail .gp-guide { flex: 1 1 100%; }
.gp-guide { margin: 0.5rem 0 0; padding-left: 1.1rem; display: flex; flex-direction: column; gap: 0.3rem; }
.gp-guide li { font-size: 0.82rem; color: var(--pen); line-height: 1.45; }
.gp-guide li::marker { color: var(--redpen); }
.swap-zone { position: relative; }
.swap-zone.swapping .gp-img, .swap-zone.swapping .gp-body,
.swap-zone.swapping .gp-guide { animation: gpSwap 0.2s ease; }
@keyframes gpSwap { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }

/* ==================== 审阅修复批（2026-10-16 用户五条）====================
 * ①四页公文头化（file-topbar 家族，标题不再顶格）②清册框体化（board-wrap 同款框+页高内滚，
 * 废除 100vh 视口基准=中缝滚动条与底部截断同根拔除）③wheel 非 passive 接管（app.js 侧） */

.feats-inner, .gp-inner, .mods-inner, .picks-inner {
  display: flex;
  flex-direction: column;
  overflow: hidden;          /* 内滚下沉到各区容器，页体自身永不出现滚动条 */
}
.feats-inner .file-titlewrap, .gp-inner .file-titlewrap,
.mods-inner .file-titlewrap, .picks-inner .file-titlewrap { flex: 0 0 auto; }

/* 特色左页：条目区页高内滚 */
.feats-inner .entries-full { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding-right: 0.3rem; }
/* 五条回执①（2026-10-16 DOM 量测实锤）：gp-detail flex:1 把短内容强拉成 358px 巨型空框，
 * 占位图被 align-items:stretch 竖拉成 154×336 瘦长条=「页面变得很奇怪」根因。
 * 两区改自然高度（内容短不硬撑满页，与回执②同美学），溢出时各自内滚；
 * 详情图纵横比钉死不再随框体拉伸 */
.gp-inner .gp-list { flex: 0 1 auto; min-height: 0; overflow-y: auto; }
.gp-inner .gp-detail { flex: 0 1 auto; min-height: 0; overflow-y: auto; align-items: flex-start; }
/* 三轮回执（2026-10-16）：玩法截图素材实为 300×300 正方形，3:2 框+cover 裁掉上下各 1/6
 * （「图片被截断」）——比例框跟素材走 1:1 完整显示，占位框同步 */
.gp-detail .gp-img { height: auto; min-height: 0; aspect-ratio: 1 / 1; }

/* 模组左页：清册=排行榜同款框体，页高 flex 内滚 */
.catalog-list {
  flex: 1 1 auto;
  min-height: 0;
  max-height: none;          /* 废除 .mod-grid 的 100vh-16rem 视口基准（书页高≠视口高=截断根源） */
  overflow-y: auto;
  background-color: rgba(120, 96, 58, 0.07);
  border: 2px solid rgba(74, 58, 32, 0.75);
  outline: 1px solid rgba(74, 58, 32, 0.4);
  outline-offset: 3px;
  border-radius: 10px 4px 12px 5px / 5px 12px 4px 10px;
  padding: 0.7rem 0.7rem 0.55rem;
  margin: 0.45rem -0.15rem 0.3rem 0;
  row-gap: 0.7rem;
  /* 三条回执①（2026-10-16 三轮探针实锤）：定高 flex 页内 grid 的 auto 行在内容总高超容器时
   * 不撑开而是压缩到 min-content——.mod-card 的 overflow:hidden 又使最小高度归零 →
   * 行高塌到 79px、内容被裁、scrollHeight 不涨=滚动条消失（「都截断+下拉没了」根因）。
   * grid-auto-rows: max-content = 行高取内容完整高度永不压缩：内容完整+同行等高+容器滚动回归 */
  align-content: start;
  grid-auto-rows: max-content;
}
/* 统一卡的文本预算保留：显式行高（不继承 body 1.7 松行距）。
 * 二轮回执②（字体选 3 同批）：撤两行截断——长标题/长描述被裁=「未完全包裹模组内容」；
 * grid 同行 stretch 等高只加空白不裁内容，自然包裹=初版形态 */
.mod-card { overflow: hidden; }
.mod-cat { line-height: 1.3; }
.mod-title { line-height: 1.25; overflow-wrap: anywhere; }
.mod-author { line-height: 1.3; }
.mod-desc { line-height: 1.4; }
.mod-link { line-height: 1.3; }
.mods-inner .mod-tabs { flex: 0 0 auto; }

/* 模组右页：精选区页高内滚（批3 卡片填充后生效） */
.picks-inner .mod-picks { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding-right: 0.3rem; }

/* 三条回执③（2026-10-16 二轮）：特色/模组四页标题区横排化——eyebrow/英文副题从大标题
 * 下方堆叠改为移到标题右侧（底对齐），主体区上移回收两行纵向空间。
 * 2026-10-17 用户裁定全站推广（榜单/赛季本体保留现格式）：排行/名人堂三处同款重排——
 * 印章（file-stamp 绝对定位右上）改为叠印在右列上方，歪章叠印=档案风。
 * 选择器取 .paper-file 全局=七处 titlewrap（features×2/mods×2/rank×1/hall×2）统一 */
.paper-file .file-titlewrap {
  display: flex; align-items: flex-end; gap: 0.75rem;
}
.paper-file .file-h1 { margin: 0; }
.file-side {
  margin-left: auto; text-align: right;
  display: flex; flex-direction: column; align-items: flex-end;
  gap: calc(2px * var(--pgscale, 1));
  padding-bottom: calc(4px * var(--pgscale, 1));
  min-width: 0;
}
.file-side .file-sub { margin-top: 0; }
.file-side .file-classline { margin-top: 0; }

.cat-row {
  background: rgba(251, 247, 236, 0.5);
  border: 1px solid rgba(74, 58, 32, 0.28);
  border-left: 3px solid rgba(74, 58, 32, 0.35);
  border-radius: 3px 6px 4px 7px;
  padding: 0.3rem 0.55rem 0.32rem;
}
.cat-row.in-series { border-left-color: rgba(160, 110, 40, 0.65); }
.cat-row.is-xlx { border-left-color: rgba(120, 120, 130, 0.55); background: rgba(245, 242, 233, 0.42); }
.cat-line { display: flex; align-items: baseline; gap: 0.5rem; }
.cat-name { font-size: 0.95rem; color: var(--ink); font-weight: 600; min-width: 0; }
.cat-family { font-size: 0.68rem; color: #7a4d12; border: 1px solid rgba(160, 110, 40, 0.5); border-radius: 3px; padding: 0 4px; white-space: nowrap; }
.cat-size { font-size: 0.68rem; color: var(--pencil); white-space: nowrap; }
.cat-size.s-巨 { color: #8c2f24; font-weight: 700; }
.cat-size.s-大 { color: #7a4d12; }
.cat-link { margin-left: auto; font-size: 0.72rem; color: #3d5a80; text-decoration: none; white-space: nowrap; }
.cat-link:hover { text-decoration: underline; color: var(--redpen); }
.cat-desc { font-size: 0.78rem; color: var(--pen); line-height: 1.4; margin: 0.12rem 0 0; }
/* 视觉验收采纳（2026-10-16）：清册可滚动时底部渐隐，暗示未完 */
.catalog-list.scrollable {
  -webkit-mask-image: linear-gradient(to bottom, #000 0, #000 calc(100% - 14px), rgba(0, 0, 0, 0.25) 100%);
  mask-image: linear-gradient(to bottom, #000 0, #000 calc(100% - 14px), rgba(0, 0, 0, 0.25) 100%);
}

/* 模组右页：大模组精选——R4 域格网+H2 借阅按钮卷首（用户裁定 2026-10-16 预览 v4/v5）：
 * 卡身=左图+功能域两列格网（治"过于分散+左图下空旷"）；卷首=标签章+标题+右侧借阅按钮块
 * （治卷首右侧空旷）；配色=左侧 mod-card 同底+框体规格；字体=标题马善政/介绍区霞鹜文楷；
 * 玩法说明源=研判档案（玩家口吻+玩家可见筛选） */
.mod-picks { display: flex; flex-direction: column; gap: calc(14px * var(--pgscale, 1)); }
/* 三轮回执（2026-10-16）：R4 卡变高后两张总高超容器——定高 flex 容器内子项被 shrink 压缩
 * +卡级 overflow:hidden 使最小高度归零 → 卡截断且 scrollHeight 不涨=滚动消失（与清册 grid
 * 行塌缩同族根因）。flex:0 0 auto 卡片保持完整自然高，容器 overflow-y:auto 内滚回归 */
.pick-card {
  flex: 0 0 auto;
  background: rgba(251, 247, 236, 0.62);        /* =左侧 mod-card 卡片同底（羊皮纸） */
  border: 2px solid rgba(74, 58, 32, 0.75);     /* =左页框体主边 */
  outline: 1px solid rgba(74, 58, 32, 0.4);
  outline-offset: 3px;
  border-radius: 10px 4px 12px 5px / 5px 12px 4px 10px;
  box-shadow: 2px 3px 10px rgba(30, 20, 10, 0.25);
  overflow: hidden;
}
.pick-vhead {
  display: flex; align-items: center; gap: calc(12px * var(--pgscale, 1));
  padding: calc(8px * var(--pgscale, 1)) calc(16px * var(--pgscale, 1));
  border-bottom: 2px solid rgba(43, 36, 25, 0.55);
  background: rgba(236, 225, 204, 0.6);
}
/* H2 借阅按钮块（用户裁定）：替代细链接填充卷首右侧（档案借阅钮造型） */
.pick-btn {
  margin-left: auto; display: flex; align-items: center; gap: calc(8px * var(--pgscale, 1));
  border: 1.5px solid rgba(74, 58, 32, 0.6); border-radius: 3px;
  padding: calc(5px * var(--pgscale, 1)) calc(12px * var(--pgscale, 1)) calc(6px * var(--pgscale, 1));
  background: rgba(251, 247, 236, 0.7); color: #4a4030; text-decoration: none;
  font-family: SimSun, serif; font-size: calc(12.5px * var(--pgscale, 1)); letter-spacing: 1.5px; white-space: nowrap;
}
.pick-btn b { font-family: SpecialElite, monospace; font-weight: 400; font-size: calc(10px * var(--pgscale, 1)); color: #7c2d20; letter-spacing: 1px; }
.pick-link { margin-left: auto; font-size: calc(13px * var(--pgscale, 1)); color: #3d5a80; text-decoration: underline dotted; white-space: nowrap; }
/* 介绍区字体（用户裁定）：定位句/玩法句/功能域小标题=霞鹜文楷 Screen（站内自托管），回退 KaiTi */
.pick-intro {
  font-family: "LXGW WenKai Screen", KaiTi, serif; font-size: calc(14px * var(--pgscale, 1)); color: var(--pen); margin: 0;
  padding: calc(9px * var(--pgscale, 1)) calc(16px * var(--pgscale, 1)) calc(8px * var(--pgscale, 1));
  border-bottom: 1px dashed rgba(74, 58, 32, 0.3);
}
.pick-body { display: flex; padding: calc(10px * var(--pgscale, 1)) calc(14px * var(--pgscale, 1)) calc(12px * var(--pgscale, 1)); gap: calc(14px * var(--pgscale, 1)); }
.pick-side { flex: 0 0 calc(116px * var(--pgscale, 1)); }
.pick-img {
  width: calc(116px * var(--pgscale, 1)); height: calc(116px * var(--pgscale, 1));
  object-fit: cover; border: 1px solid rgba(74, 58, 32, 0.42); border-radius: 3px;
  transform: rotate(-1.5deg); background: rgba(251, 247, 236, 0.6);
  box-shadow: 1px 2px 6px rgba(30, 20, 10, 0.3);
}
.pick-grid { flex: 1; min-width: 0; display: grid; grid-template-columns: 1fr 1fr; gap: calc(8px * var(--pgscale, 1)) calc(12px * var(--pgscale, 1)); }
.pick-cell {
  background: rgba(236, 225, 204, 0.45); border: 1px solid rgba(74, 58, 32, 0.3);
  border-radius: 3px 6px 4px 5px; padding: calc(6px * var(--pgscale, 1)) calc(9px * var(--pgscale, 1)) calc(7px * var(--pgscale, 1));
}
.pick-tag {
  font-family: SimSun, serif; font-size: calc(11.5px * var(--pgscale, 1)); letter-spacing: 2px;
  color: #7c2d20; border: 1.5px solid rgba(160, 58, 42, 0.55); border-radius: 2px;
  padding: 2px calc(8px * var(--pgscale, 1)) 2.5px; background: rgba(251, 247, 236, 0.55); white-space: nowrap;
}
.pick-title { font-family: "Ma Shan Zheng", KaiTi, serif; font-size: calc(24px * var(--pgscale, 1)); color: var(--ink); letter-spacing: calc(1.5px * var(--pgscale, 1)); }
.pick-dname {
  display: block; font-family: "LXGW WenKai Screen", KaiTi, serif;
  font-size: calc(13.5px * var(--pgscale, 1)); font-weight: 700; color: #7c2d20;
  border-bottom: 1px dotted rgba(122, 77, 18, 0.4);
  padding-bottom: calc(2.5px * var(--pgscale, 1)); margin-bottom: calc(3.5px * var(--pgscale, 1));
}
.pick-dtext { font-family: "LXGW WenKai Screen", KaiTi, serif; font-size: calc(12.8px * var(--pgscale, 1)); color: #3a3126; line-height: 1.5; }

/* 批2 组件 pgscale 补集（v4 页宽相对制同规则） */
.gp-card-title { font-size: calc(1.15rem * var(--pgscale, 1)); }
.gp-card-blurb { font-size: calc(0.8rem * var(--pgscale, 1)); }
.gp-detail .gp-title { font-size: calc(1.2rem * var(--pgscale, 1)); }
.gp-detail .gp-desc { font-size: calc(0.85rem * var(--pgscale, 1)); }
.gp-guide li { font-size: calc(0.82rem * var(--pgscale, 1)); }
.entries-full .entry p { font-size: calc(0.86rem * var(--pgscale, 1)); }
.cat-name { font-size: calc(0.95rem * var(--pgscale, 1)); }
.cat-desc { font-size: calc(0.78rem * var(--pgscale, 1)); }
.cat-size, .cat-family, .cat-link { font-size: calc(0.7rem * var(--pgscale, 1)); }
.pick-title { font-size: calc(1.2rem * var(--pgscale, 1)); }
.pick-intro { font-size: calc(0.85rem * var(--pgscale, 1)); }
