/* ============================================================
   张艺的作品集 · 2026
   纸张、水色、墨绿与一点暖赭。
   A quiet exhibition that responds to the hand.
   ============================================================ */

/* 两个文楷包，按需加载。
   A 标题包：页眉、章页大字、标题、题记、引语、图注，865 字 / 179KB。
   B 台词包：A 的全部 + 剧本正文，2482 字 / 550KB。
   浏览器只在页面上真有元素解析到某个 family 时才发请求。
   2026-10-31 起阅读页（work.html）正文也用 B：work.html 内联把 --serif
   提到 WenKaiText 并 preload——13 篇共享一个文件、跨篇缓存，
   Windows 访客正文不再掉进中易宋体。首页不声明该覆盖，正文仍系统宋体、零下载。 */
@font-face{
  font-family:WenKai;
  src:url('./fonts/wenkai-title.woff2') format('woff2');
  font-weight:400;
  font-style:normal;
  font-display:swap;
}

@font-face{
  font-family:WenKaiText;
  src:url('./fonts/wenkai-text.woff2') format('woff2');
  font-weight:400;
  font-style:normal;
  font-display:swap;
}

:root{
  color-scheme:light;
  --paper:#f7f3e9;
  --paper-soft:#fdfaf3;
  --paper-deep:#efe3cf;
  --tint:#e9efe3;
  --ink:#1e2f2a;
  --ink-soft:#3b4f47;
  --muted:#56685f;
  --green:#35655a;
  --green-deep:#12302b;
  --accent:#b4553a;
  --green-ink:#1f5348;
  /* 舞台「开灯」灯光专属：发光点 + 暖沙晕。全站仅此一处用金，
     176,154,120 系 alpha 是它的晕家族，别拿去做通用强调色。 */
  --gold:#c08a4b;
  /* 与 --room-scripts 同值：赭红强调与剧本房间色是同一支色，
     RGB 各差 1 的两支定义已合并，改色时一起改。 */
  --accent-ink:#9b4932;
  --line:rgba(30,47,42,.16);
  --line-soft:rgba(30,47,42,.09);
  --film:#0e2723;

  /* 深色表面：文字、细线、焦点环。
     深色段的底色有 --film / --green-deep / 半透明叠层三种，
     所以这里用带 alpha 的暖白，一支到底，不再逐处手写。 */
  --on-dark-1:#f7f3e9;
  --on-dark-2:rgba(247,243,233,.78);
  --on-dark-3:rgba(247,243,233,.6);
  --on-dark-line:rgba(247,243,233,.18);
  --on-dark-line-soft:rgba(247,243,233,.1);
  --on-dark-focus:#f7f3e9;
  --on-dark-accent:#a9c2b6;

  /* 房间色：色相不变，明度统一压到 ×0.86，
     对 --paper 全部 ≥4.5:1（原 02 / 05 / 06 三色不达标）。 */
  --room-scripts:#9b4932;
  --room-essays:#3c606b;
  --room-papers:#695b47;
  --room-sound:#4f6947;
  --room-showcase:#6c5660;

  --hand:WenKai,'Kaiti SC',KaiTi,serif;
  /* 只被剧本正文的三条选择器引用。别处不要用——用一次就把 549KB 拉进那一页。 */
  --hand-text:WenKaiText,WenKai,'Kaiti SC',KaiTi,serif;
  --serif:'Songti SC','Noto Serif SC','Source Han Serif SC','SimSun',serif;
  --sans:-apple-system,BlinkMacSystemFont,'Segoe UI','PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif;
  --display:'Bodoni 72','Didot','Bodoni MT','Times New Roman',serif;
  /* 字号九档。
     --fs-body 拆成「基数 × 倍率」：倍率由详情页的字号开关写在 html 内联样式上，
     窄屏只改基数。这样内联值只覆盖一个输入，不会像直接写 --fs-body 那样压过媒体查询。
     窄屏块里还留着几处一次性字号（14/16/19/23/29/32/36/38/42/52），
     那是移动端的角色切换，不是遗漏：编号从文字标签变成版面图形（.chapter-no 42、
     .essay-no 52），首屏与致谢跟着视口缩，卡标题降一档让一屏能放下两张卡。
     这些值不进令牌——进了就变成「四档大字」，反而丢掉移动端的独立尺度。 */
  --fs-xs:11px;
  --fs-sm:13px;
  --fs-base:15px;
  --fs-body-base:17px;
  --fs-scale:1;
  --fs-body:calc(var(--fs-body-base) * var(--fs-scale));
  --fs-md:22px;
  --fs-row:26px;
  --fs-lg:34px;
  --fs-work:56px;
  --fs-chapter:68px;
  /* 小字档位跟着正文档位走，但只在详情页。
     开关只出现在详情页（body[data-page="work"]），首页也没有它要联动的东西：
     首页正文用的是固定的 --fs-base，如果标签跟着 --fs-scale 变而正文不变，
     等于在首页制造另一种「标签相对正文变大」的错位。
     --fs-xs 兜了 11px 的下限：0.882 档下 11px × 0.882 = 9.7px，
     低于全站字号下限，所以小档不降，只在中/大档升到 11 / 12.3px。
     --fs-sm 13px → 11.5 / 13 / 14.5px，与正文的比值恒为 0.765，
     跟剧本里 --script-small 用的是同一个倍数。 */
  /* 行高七档：单行巨字 / 多行巨字 / 标题 / 小标签 / 引语导语 / 正文 / 台词。
     「引语导语」这一档是计划外补的：19–31px 的题记与导语原本散在 1.75 与 1.8，
     并进 1.6 会让每段引语收 8%，超出「差异 ≤2px」的验收线，所以留一档 1.75。 */
  --lh-display:1.02;
  --lh-tight:1.12;
  --lh-heading:1.28;
  --lh-label:1.6;
  --lh-lead:1.75;
  --lh-body:1.9;
  --lh-script:1.95;
  /* 字距四档。归属按角色判，不按数值就近：
     ≤13px 中文标签 .08 / 次级标签与目录 .12 / 纯数字·全大写·编号 .16 / 中文标题 .02 */
  --ls-title:.02em;
  --ls-label:.08em;
  --ls-wide:.12em;
  --ls-caps:.16em;
  /* 动效三档：颜色 / 位移 / 场景 */
  --t-fast:120ms;
  --t-mid:320ms;
  --t-slow:700ms;
  /* 间距八档：先做首页，逐步把离散 px 收进来 */
  --space-1:4px;
  --space-2:8px;
  --space-3:12px;
  --space-4:16px;
  --space-5:24px;
  --space-6:32px;
  --space-7:48px;
  --space-8:64px;
  /* 段落间距五档：章页后 / 分组 / 分组底 / 段落 / 收尾 */
  --gap-chapter:clamp(44px,6.5vw,86px);
  --band-y:clamp(52px,6.5vw,88px);
  --band-y-end:clamp(60px,7.5vw,104px);
  --section-y:clamp(76px,10vw,138px);
  --finale-y:clamp(90px,13vw,170px);
  /* 深浅两段相接时，深色一侧压暗的高度。纸色和墨绿之间没有好看的中点，
     所以不做色相过渡，只做「上一块亮面投下的影子」。 */
  --dissolve:clamp(96px,11vw,150px);
  /* 阴影四档：静置小件 / 版面 / 大图版 / 深色底。
     悬停抬升直接复用最小一档，不要再手写一组差 2px 的 rgba。 */
  --shadow-1:0 18px 30px -24px rgba(31,54,46,.55);
  --shadow-2:0 30px 55px -42px rgba(31,54,46,.55);
  --shadow-3:0 34px 60px -46px rgba(31,54,46,.55);
  --shadow-dark:0 30px 80px -30px rgba(0,0,0,.7);
  /* 图片比例五档。影像播放框另有 --ar，由数据里的原图尺寸算，不走这里。 */
  --ar-photo:4/3;
  --ar-film:16/9;
  --ar-wide:3/2;
  --ar-portrait:3/4;
  --ar-square:1/1;
  /* 媒体框描边：outline 不占布局，换实现不会引起重排 */
  --hairline:var(--line-soft);
  --gutter:clamp(20px,4.6vw,74px);
  --shell:1320px;
  /* 行宽用 em 不用 px：字号档位一变，每行汉字数必须不变。
     36em → 40em：每行 36 → 40 字，仍在中文舒适上限（30–40 字）内；
     配合侧栏收窄，正文在整栏里的占比从 56% 提到 65%。 */
  --measure:40em;
  /* 刘海屏安全区。两页的 viewport 都写了 viewport-fit=cover，
     意思是「让页面铺到刘海和 Home 指示条下面」，那就要自己把内容让开——
     在这之前全站没有一处 env(safe-area-inset-*)，等于在刘海屏上
     页眉压着状态栏、页脚压着指示条。
     先给 0 兜底，再用 @supports 覆盖：不支持 env() 的浏览器里
     --safe-* 是 0px，calc 照常成立，不会因为「无效值」把整条声明打掉。 */
  --safe-t:0px;
  --safe-b:0px;
  --safe-l:0px;
  --safe-r:0px;
  --header:84px;
  /* 页眉的实际占位＝栏高 + 顶部安全区。滚动锚点、滚动留白、侧栏 sticky
     都要按这个总量算，否则刘海屏上锚点会落在页眉底下。 */
  --header-total:calc(var(--header) + var(--safe-t));
  --ease:cubic-bezier(.19,1,.22,1);
  --ease-soft:cubic-bezier(.33,1,.68,1);
}

/* 只有真的支持 env() 才覆盖。写成 @supports 而不是直接 env(...,0px)：
   后者在不支持的浏览器里是「解析期无效声明」，
   会让依赖它的 calc 整条失效，版面直接塌。 */
@supports (top:env(safe-area-inset-top)){
  :root{
    --safe-t:env(safe-area-inset-top);
    --safe-b:env(safe-area-inset-bottom);
    --safe-l:env(safe-area-inset-left);
    --safe-r:env(safe-area-inset-right);
  }
}

body[data-page="work"]{
  --fs-xs:max(11px,calc(11px * var(--fs-scale)));
  --fs-sm:calc(13px * var(--fs-scale));
}

*{box-sizing:border-box}
html{
  scroll-behavior:smooth;
  scroll-padding-top:calc(var(--header-total) + 18px);
  -webkit-text-size-adjust:100%;
  text-size-adjust:100%;
}
body{
  margin:0;
  min-height:100svh;
  /* 横屏时刘海只在一边（左或右），安全区不对称，所以左右分开给 */
  padding-left:var(--safe-l);
  padding-right:var(--safe-r);
  background:var(--paper);
  color:var(--ink);
  font:400 var(--fs-body)/var(--lh-body) var(--serif);
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
  text-rendering:optimizeLegibility;
  overflow-x:hidden;
}
body.is-locked{overflow:hidden}
::selection{background:rgba(87,126,112,.24);color:var(--ink)}
a{color:inherit;text-decoration:none;text-underline-offset:6px}
button{font:inherit;color:inherit;cursor:pointer}
button,a{-webkit-tap-highlight-color:transparent}
a:focus-visible,button:focus-visible,video:focus-visible,audio:focus-visible,[tabindex]:focus-visible{
  outline:2px solid var(--green);
  outline-offset:5px;
}
/* 深色段：--green 对 --film 只有 2.37:1，焦点环必须换色。
   深色块统一挂 data-dark，页眉反色与焦点环都认这一个标记。 */
:is([data-dark],.site-header.is-on-dark) :is(a,button,video,audio,[tabindex]):focus-visible{
  outline-color:var(--on-dark-focus);
}
img{display:block;max-width:100%;height:auto}
figure,p,h1,h2,h3,h4,blockquote,dl,dd{margin:0}
h1,h2,h3{font-family:var(--hand);font-weight:400;line-height:var(--lh-heading);text-wrap:balance}
p{text-wrap:pretty}
[hidden]{display:none!important}
main{display:block}
main section:focus{outline:none}

/* ---------- 基础容器与眉题 ---------- */

.shell{
  width:min(var(--shell),calc(100% - var(--gutter) * 2));
  margin-inline:auto;
}
.section{
  position:relative;
  padding-block:var(--section-y);
}
.eyebrow{
  display:flex;
  align-items:center;
  gap:var(--space-3);
  font:500 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  text-transform:uppercase;
  color:var(--green-ink);
}
.eyebrow span{color:var(--muted)}
.skip-link{
  position:fixed;
  top:-100px;
  left:calc(20px + var(--safe-l));
  padding:var(--space-2) var(--space-4);
  background:var(--green-ink);
  color:var(--paper);
  z-index:300;
  font:500 var(--fs-sm)/var(--lh-label) var(--sans);
}
.skip-link:focus{top:12px}

.paper-grain{
  position:fixed;
  inset:-20%;
  pointer-events:none;
  z-index:90;
  opacity:.035;
  background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 300 300' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.82' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.55'/%3E%3C/svg%3E");
  background-size:260px 260px;
  mix-blend-mode:multiply;
}

.page-fade{
  position:fixed;
  inset:0;
  z-index:210;
  background:var(--paper);
  pointer-events:none;
  opacity:0;
  transition:opacity .38s ease;
}
body.is-leaving .page-fade{opacity:1;pointer-events:auto}

/* ---------- 页头 ---------- */

.site-header{
  position:fixed;
  top:0;
  left:0;
  right:0;
  /* 背景通栏铺到屏幕边（含刘海下方），但内容让开安全区。
     min-height 走 --header（栏高本身），padding-top 走 --safe-t，
     两者相加正好是 --header-total，锚点才对得上。 */
  padding-top:var(--safe-t);
  padding-left:var(--safe-l);
  padding-right:var(--safe-r);
  z-index:60;
  color:var(--ink);
  transition:background .4s ease,border-color .4s ease,box-shadow .4s ease;
  border-bottom:1px solid transparent;
}
.site-header.is-scrolled{
  background:rgba(247,243,233,.86);
  -webkit-backdrop-filter:blur(16px) saturate(1.1);
  backdrop-filter:blur(16px) saturate(1.1);
  border-bottom-color:var(--line-soft);
}
/* 深色段落：页眉反色，避免奶白横条切断画面 */
.site-header.is-on-dark{
  color:var(--on-dark-1);
  background:rgba(19,40,36,.72);
  -webkit-backdrop-filter:blur(18px) saturate(1.05);
  backdrop-filter:blur(18px) saturate(1.05);
  border-bottom-color:var(--on-dark-line);
}
.site-header.is-on-dark .wordmark{color:var(--on-dark-1)}
.site-header.is-on-dark .wordmark span{color:var(--on-dark-2)}
.site-header.is-on-dark .back-link{color:var(--on-dark-2)}
.site-header.is-on-dark .back-link span{color:var(--on-dark-1)}
.site-header.is-on-dark .back-link:hover{color:var(--on-dark-1)}
.site-header.is-on-dark .header-nav{color:var(--on-dark-2)}
.site-header.is-on-dark .header-nav a:hover,
.site-header.is-on-dark .header-nav a[aria-current]{color:var(--on-dark-1)}
.site-header.is-on-dark .header-nav a::after{background:var(--on-dark-2)}
.site-header.is-on-dark .header-edition{color:var(--on-dark-3)}
.site-header.is-on-dark .header-edition span{color:var(--on-dark-2)}
.site-header.is-on-dark .menu-toggle{color:var(--on-dark-1)}
.site-header.is-on-dark .scroll-progress span{background:var(--on-dark-2)}
.header-inner{
  width:min(1440px,calc(100% - var(--gutter) * 2));
  margin-inline:auto;
  min-height:var(--header);
  display:grid;
  grid-template-columns:1fr auto 1fr;
  align-items:center;
  gap:var(--space-5);
}
.wordmark{
  justify-self:start;
  font:400 21px/var(--lh-heading) var(--hand);
  letter-spacing:var(--ls-label);
  white-space:nowrap;
  display:flex;
  align-items:baseline;
  gap:var(--space-2);
}
.wordmark span{
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  color:var(--muted);
}
/* 站名本身是链接，但它是页眉里唯一没有任何反馈的可点元素。
   只动后面那个小字，不动 21px 的主标题——主标题变朱砂太吵。 */
.wordmark:hover span{color:var(--accent-ink)}
.site-header.is-on-dark .wordmark:hover span{color:var(--on-dark-accent)}
.header-nav{
  display:flex;
  align-items:center;
  gap:clamp(16px,2.2vw,30px);
  font:400 var(--fs-sm)/var(--lh-label) var(--sans);
  color:var(--ink-soft);
}
.header-nav a{
  position:relative;
  padding:var(--space-2) 0;
  white-space:nowrap;
  transition:color .2s ease;
}
.header-nav a::after{
  content:'';
  position:absolute;
  left:0;
  right:0;
  bottom:2px;
  height:1px;
  background:var(--accent);
  transform:scaleX(0);
  transform-origin:left;
  transition:transform .35s var(--ease);
}
.header-nav a:hover,.header-nav a[aria-current]{color:var(--ink)}
.header-nav a:hover::after,.header-nav a[aria-current]::after{transform:scaleX(1)}
.header-tools{
  justify-self:end;
  display:flex;
  align-items:center;
  gap:var(--space-5);
}
.header-edition{
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  color:var(--muted);
  display:flex;
  gap:var(--space-2);
  white-space:nowrap;
}
.header-edition span{color:var(--accent-ink)}
.menu-toggle{
  display:flex;
  align-items:center;
  gap:var(--space-3);
  border:0;
  background:none;
  padding:var(--space-2) 0;
  font:400 var(--fs-sm)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
}
.menu-icon{
  width:22px;
  height:10px;
  display:grid;
  align-content:space-between;
}
.menu-icon i{
  display:block;
  height:1px;
  background:currentColor;
  transform-origin:right;
  transition:transform .35s var(--ease),width .35s var(--ease);
}
.menu-icon i:last-child{width:70%;justify-self:end}
.menu-toggle:hover .menu-icon i:first-child{transform:scaleX(.7);transform-origin:left}
.menu-toggle:hover .menu-icon i:last-child{width:100%}
.back-link{
  grid-column:3;
  justify-self:end;
  display:flex;
  align-items:center;
  gap:var(--space-2);
  font:400 var(--fs-sm)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  color:var(--muted);
  padding:var(--space-2) 0;
  transition:color .25s ease;
}
.back-link span{color:var(--green-ink);transition:transform .35s var(--ease)}
.back-link:hover{color:var(--green-ink)}
.back-link:hover span{transform:translateX(-4px)}
.scroll-progress{
  position:absolute;
  left:0;
  right:0;
  bottom:-1px;
  height:1px;
  overflow:hidden;
}
.scroll-progress span{
  display:block;
  height:100%;
  background:var(--accent);
  transform:scaleX(0);
  transform-origin:left;
  transition:transform .1s linear;
}

/* ---------- 全屏目录 ---------- */

.index-dialog{
  border:0;
  /* 它铺满整屏，四边都要让开安全区；box-sizing:border-box 已全局生效，
     height:100% 会把 padding 算在里面，不会溢出。 */
  padding:var(--safe-t) var(--safe-r) var(--safe-b) var(--safe-l);
  margin:0;
  width:100%;
  max-width:100%;
  height:100%;
  max-height:100%;
  background:var(--paper);
  color:var(--ink);
  overflow:hidden;
}
.index-dialog::backdrop{
  background:rgba(12,27,23,.55);
  -webkit-backdrop-filter:blur(4px);
  backdrop-filter:blur(4px);
}
.index-dialog:focus{outline:none}
.no-ring:focus-visible{outline:none!important}
.index-dialog__inner{
  height:100%;
  padding:clamp(20px,3vw,42px) var(--gutter) 24px;
  overflow:auto;
  display:flex;
  flex-direction:column;
  gap:clamp(18px,3vh,36px);
  background:
    radial-gradient(ellipse 60% 50% at 88% 8%,rgba(160,193,176,.28),transparent 65%),
    radial-gradient(ellipse 50% 45% at 0% 92%,rgba(169,193,186,.15),transparent 70%),
    var(--paper);
}
.index-dialog__top{
  display:flex;
  justify-content:space-between;
  align-items:center;
  border-bottom:1px solid var(--line);
  padding-bottom:var(--space-4);
}
.index-close{
  display:flex;
  align-items:center;
  gap:var(--space-3);
  border:0;
  background:none;
  font:400 var(--fs-sm)/1 var(--sans);
  letter-spacing:var(--ls-wide);
  padding:var(--space-2) 0;
}
.index-close i{
  position:relative;
  width:22px;
  height:22px;
  display:block;
}
.index-close i::before,.index-close i::after{
  content:'';
  position:absolute;
  left:3px;
  right:3px;
  top:50%;
  height:1px;
  background:currentColor;
  transition:transform .35s var(--ease);
}
.index-close i::before{transform:rotate(45deg)}
.index-close i::after{transform:rotate(-45deg)}
.index-close:hover i::before{transform:rotate(135deg)}
.index-close:hover i::after{transform:rotate(45deg)}
.index-dialog__layout{
  flex:1 0 auto;
  display:grid;
  grid-template-columns:minmax(240px,.85fr) minmax(380px,1.15fr) minmax(240px,.9fr);
  gap:clamp(28px,4vw,80px);
  align-items:start;
  min-height:0;
}
.index-dialog__head{position:relative;padding-top:8px}
.index-dialog__head h2{
  font-size:clamp(40px,4.7vw,72px);
  line-height:var(--lh-heading);
  letter-spacing:var(--ls-title);
}
.index-dialog__head p{
  margin-top:var(--space-5);
  max-width:24em;
  font-size:var(--fs-sm);
  line-height:var(--lh-body);
  color:var(--muted);
}
.index-list{
  display:flex;
  flex-direction:column;
  border-top:1px solid var(--line);
}
.index-list a{
  position:relative;
  display:grid;
  grid-template-columns:42px minmax(0,1fr) 18px;
  grid-template-rows:auto auto;
  column-gap:var(--space-4);
  align-items:center;
  padding:clamp(12px,1.8vh,20px) 0;
  border-bottom:1px solid var(--line);
  transition:padding-left .4s var(--ease),color .25s ease;
}
.index-list__no{
  grid-row:1 / 3;
  font:400 var(--fs-xs)/1 var(--sans);
  letter-spacing:var(--ls-wide);
  color:var(--muted);
  align-self:start;
  padding-top:var(--space-2);
}
.index-list__title{
  grid-column:2;
  grid-row:1;
  font:400 clamp(23px,2.1vw,31px)/var(--lh-heading) var(--hand);
  letter-spacing:var(--ls-title);
}
.index-list__note{
  grid-column:2;
  grid-row:2;
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  color:var(--muted);
  margin-top:2px;
}
.index-list__arrow{
  grid-column:3;
  grid-row:1 / 3;
  font-size:var(--fs-base);
  color:var(--green-ink);
  opacity:0;
  transform:translate(-6px,6px);
  transition:opacity .3s ease,transform .4s var(--ease);
}
.index-list a:hover{padding-left:14px;color:var(--green-ink)}
.index-list a:hover .index-list__arrow{opacity:1;transform:none}
.index-list a:hover .index-list__title{color:var(--accent-ink)}
/* 卡随图走，不写死框比例。
   七张预览图的真实比例从 0.686（竖版海报）到 1.862（横幅剧照）分成两簇，
   中间没有公约数：写死 4/3 时竖图左右各空掉近一半，改成 3/4 就轮到两张横图
   上下空掉一半，换哪个比例都只是把留空从一组条目搬到另一组。
   所以让卡片裹住图本身——没有留白，也不用裁掉封面上的字；
   代价是卡片高度会随条目变（实测 1440 下 227–360px），
   用 max-height 把它压在弹层里，用 margin-inline:auto 让它始终居中。 */
.index-preview{
  padding:var(--space-2) var(--space-2) 0;
  background:var(--paper-soft);
  border:1px solid var(--line-soft);
  box-shadow:var(--shadow-1);
  transform:rotate(1.2deg);
  position:sticky;
  top:0;
  width:fit-content;
  max-width:100%;
  margin-inline:auto;
}
.index-preview img{
  display:block;
  width:auto;
  height:auto;
  max-width:100%;
  max-height:min(40vh,360px);
  transition:opacity .28s ease,transform .7s var(--ease);
}
.index-preview.is-changing img{opacity:.15;transform:scale(1.02)}
.index-preview figcaption{
  padding:var(--space-3) 2px var(--space-3);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  color:var(--muted);
  display:flex;
  justify-content:space-between;
  gap:var(--space-2);
}
.index-dialog__foot{
  display:flex;
  justify-content:space-between;
  gap:20px;
  border-top:1px solid var(--line);
  padding-top:var(--space-3);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  color:var(--muted);
  text-transform:uppercase;
}
.index-dialog[open] .index-dialog__head,
.index-dialog[open] .index-preview{
  animation:dialogIn .75s var(--ease) both;
}
.index-dialog[open] .index-preview{animation-delay:.16s}
.index-dialog[open] .index-list a{animation:dialogIn .6s var(--ease) both}
.index-dialog[open] .index-list a:nth-child(1){animation-delay:.07s}
.index-dialog[open] .index-list a:nth-child(2){animation-delay:.13s}
.index-dialog[open] .index-list a:nth-child(3){animation-delay:.19s}
.index-dialog[open] .index-list a:nth-child(4){animation-delay:.25s}
.index-dialog[open] .index-list a:nth-child(5){animation-delay:.31s}
.index-dialog[open] .index-list a:nth-child(6){animation-delay:.37s}
.index-dialog[open] .index-list a:nth-child(7){animation-delay:.43s}
@keyframes dialogIn{
  from{opacity:0;transform:translateY(24px)}
  to{opacity:1;transform:none}
}

/* ---------- 封面 ---------- */

.hero{
  position:relative;
  min-height:100svh;
  padding-top:var(--header);
  display:flex;
  flex-direction:column;
  overflow:hidden;
  isolation:isolate;
}
.hero-scene{
  position:absolute;
  inset:0;
  z-index:-3;
  overflow:hidden;
}
.hero-scene img{
  width:100%;
  height:100%;
  object-fit:cover;
  object-position:center 58%;
  opacity:1;
  filter:saturate(1.2) contrast(1.05) brightness(1.01);
}
.hero-scene::after{
  content:'';
  position:absolute;
  inset:0;
  background:
    linear-gradient(100deg,var(--paper) 0%,rgba(247,243,233,.97) 27%,rgba(247,243,233,.74) 44%,rgba(247,243,233,.22) 72%,rgba(247,243,233,0) 100%),
    linear-gradient(to top,var(--paper) 0%,rgba(247,243,233,.28) 9%,transparent 30%);
}
.hero-wash{
  position:absolute;
  inset:0;
  z-index:-2;
  pointer-events:none;
  background:
    radial-gradient(ellipse 40% 50% at 88% 28%,rgba(151,183,173,.16),transparent 68%),
    radial-gradient(ellipse 35% 40% at 12% 92%,rgba(167,193,185,.10),transparent 72%);
}
.hero-inner{
  width:min(var(--shell),calc(100% - var(--gutter) * 2));
  margin-inline:auto;
  flex:1;
  display:grid;
  grid-template-columns:minmax(0,.92fr) minmax(0,1.08fr);
  align-items:center;
  gap:clamp(20px,4vw,60px);
  padding-block:clamp(24px,4vh,56px) clamp(28px,5vh,58px);
}
.hero-copy{
  position:relative;
  z-index:4;
}
.hero-eyebrow{
  margin-bottom:clamp(20px,3.6vh,38px);
  font-size:var(--fs-sm);
  letter-spacing:var(--ls-caps);
  color:var(--green-ink);
}
.hero h1{
  font-size:clamp(60px,7.3vw,118px);
  line-height:var(--lh-display);
  letter-spacing:var(--ls-title);
  color:var(--ink);
  white-space:nowrap;
}
.hero-quote{
  margin-top:clamp(20px,3.5vh,34px);
  font:400 clamp(21px,2.2vw,29px)/var(--lh-lead) var(--hand);
  letter-spacing:var(--ls-title);
  color:var(--ink);
}
.hero-intro{
  margin-top:var(--space-4);
  max-width:24em;
  font-size:var(--fs-base);
  line-height:var(--lh-body);
  color:var(--muted);
}
.hero-actions{
  display:flex;
  align-items:center;
  flex-wrap:wrap;
  gap:var(--space-5);
  margin-top:clamp(26px,4.5vh,42px);
}
.round-link{
  position:relative;
  display:inline-flex;
  align-items:center;
  gap:var(--space-3);
  padding:var(--space-1) 0 var(--space-2);
  border:0;
  border-bottom:1px solid var(--line);
  border-radius:0;
  font:400 var(--fs-sm)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  background:none;
  transition:color .3s ease,border-color .3s ease;
}
.round-link i{
  font-style:normal;
  font-size:14px;
  transition:transform .4s var(--ease);
}
.round-link:hover{color:var(--green-ink);border-color:var(--accent-ink)}
.round-link:hover i{transform:translate(3px,3px)}
.quiet-link{
  font:400 var(--fs-sm)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  color:var(--green-ink);
  border:0;
  border-bottom:1px solid rgba(31,83,72,.32);
  border-radius:0;
  padding:var(--space-1) 0 var(--space-1);
  background:none;
  transition:color .25s ease,border-color .25s ease;
}
.quiet-link:hover{color:var(--accent-ink);border-color:var(--accent-ink)}

.hero-stage{
  position:relative;
  height:clamp(440px,62vh,600px);
  z-index:4;
}
.postcard{
  --px:0px;
  --py:0px;
  --rot:0deg;
  position:absolute;
  padding:var(--space-3) var(--space-3) 0;
  background:var(--paper-soft);
  box-shadow:var(--shadow-2);
  transform:translate3d(var(--px),var(--py),0) rotate(var(--rot));
  transition:transform .55s var(--ease-soft),box-shadow .4s ease;
  will-change:transform;
}
.postcard img{
  width:100%;
  height:auto;
  object-fit:cover;
}
.postcard__link,.cover-link{display:block;position:relative}
.postcard__cue{
  position:absolute;
  left:10px;
  bottom:10px;
  padding:var(--space-1) var(--space-2);
  background:rgba(253,250,243,.82);
  font:400 var(--fs-xs)/1 var(--sans);
  letter-spacing:var(--ls-wide);
  color:var(--green-ink);
  z-index:3;
  opacity:0;
  transform:translateY(4px);
  transition:opacity .3s ease,transform .35s var(--ease);
  pointer-events:none;
}
.postcard:hover .postcard__cue,
.postcard__link:focus-visible .postcard__cue,
.cover-link:focus-visible .postcard__cue,
.script-media:hover .postcard__cue,
.stage-visual:hover .postcard__cue,
.film-frame:hover .postcard__cue,
.sound-art:hover .postcard__cue,
.sound-art__link:focus-visible .postcard__cue{opacity:1;transform:none}
.postcard figcaption{
  display:flex;
  align-items:baseline;
  justify-content:space-between;
  gap:var(--space-2);
  padding:var(--space-2) 2px var(--space-3);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  color:var(--muted);
}
.postcard--main{
  --rot:-2deg;
  width:50%;
  left:14%;
  top:5%;
  z-index:3;
  padding-bottom:var(--space-3);
}
.postcard--small{
  --rot:4deg;
  width:33%;
  right:4%;
  bottom:6%;
  z-index:4;
}
.postcard:hover{z-index:8;transform:translate3d(var(--px),calc(var(--py) - 5px),0) rotate(0deg)}
.hero-index{
  display:flex;
  align-items:center;
  flex-wrap:wrap;
  gap:clamp(14px,2.6vw,34px);
  margin-right:auto;
}
.hero-index a{
  display:flex;
  align-items:center;
  gap:var(--space-2);
  min-height:2.9em;
  padding-bottom:var(--space-1);
  border-bottom:1px solid transparent;
  color:var(--muted);
  letter-spacing:var(--ls-caps);
  transition:color .3s ease,border-color .3s ease;
}
/* 房间色小色条：12×2px。房间的记号不是数字，是颜色。
   放大用 scaleX 而不是 width——不推动后面的字，悬停时不会抖。 */
.room-bar{
  display:block;
  flex:0 0 auto;
  width:12px;
  height:2px;
  background:var(--room-accent,var(--accent));
  transform-origin:left center;
  transition:transform var(--t-mid) var(--ease);
}
.hero-index a:hover{color:var(--green-ink);border-bottom-color:var(--accent)}
.hero-index a:hover .room-bar{transform:scaleX(1.7)}
.hero-foot{
  position:relative;
  width:min(1380px,calc(100% - var(--gutter) * 2));
  margin-inline:auto;
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--space-5);
  border-top:1px solid rgba(30,47,42,.14);
  padding-block:var(--space-4) 20px;
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  text-transform:uppercase;
  color:var(--ink-soft);
  background:linear-gradient(to top,var(--paper) 52%,rgba(247,243,233,.9) 78%,rgba(247,243,233,0) 100%);
  position:relative;
  z-index:4;
}
.hero-location span{color:var(--accent-ink);margin-left:10px}
.scroll-cue{
  display:flex;
  align-items:center;
  gap:var(--space-4);
  font:400 var(--fs-xs)/1 var(--sans);
  letter-spacing:var(--ls-caps);
  color:var(--green-ink);
}
.scroll-cue i{
  display:block;
  width:54px;
  height:1px;
  background:rgba(31,83,72,.28);
  position:relative;
  overflow:hidden;
}
.scroll-cue i::after{
  content:'';
  position:absolute;
  inset:0;
  background:var(--accent);
  transform:translateX(-100%);
  animation:cue 2.6s var(--ease) infinite;
}
@keyframes cue{
  0%{transform:translateX(-100%)}
  55%{transform:translateX(0)}
  100%{transform:translateX(100%)}
}

/* 封面入场 */
.js .hero-copy > *{animation:heroIn 1.1s var(--ease) both}
.js .hero-copy > :nth-child(2){animation-delay:.08s}
.js .hero-copy > :nth-child(3){animation-delay:.16s}
.js .hero-copy > :nth-child(4){animation-delay:.24s}
.js .hero-copy > :nth-child(5){animation-delay:.32s}
.js .postcard{animation:cardIn 1.25s var(--ease) both}
.js .postcard--main{animation-delay:.2s}
.js .postcard--small{animation-delay:.34s}
.js .hero-eyebrow{animation:softIn 1.3s var(--ease) both}
@keyframes heroIn{
  from{opacity:0;transform:translateY(26px)}
  to{opacity:1;transform:none}
}
@keyframes cardIn{
  from{opacity:0;transform:translate3d(var(--px),calc(var(--py) + 34px),0) rotate(calc(var(--rot) - 3deg))}
  to{opacity:1;transform:translate3d(var(--px),var(--py),0) rotate(var(--rot))}
}
@keyframes softIn{
  from{opacity:0}
  to{opacity:1}
}

/* ---------- 章节标题 ---------- */

.chapter-head{
  position:relative;
  display:grid;
  grid-template-columns:44px minmax(0,1fr) minmax(190px,.44fr);
  gap:clamp(20px,3vw,46px);
  align-items:end;
  padding-top:clamp(18px,2.4vw,28px);
  margin-bottom:clamp(42px,6vw,78px);
}
.chapter-head::before{
  content:'';
  position:absolute;
  left:0;
  right:0;
  top:0;
  height:1px;
  background:var(--line);
}
.js .chapter-head::before{
  transform:scaleX(0);
  transform-origin:left;
  transition:transform 1.2s var(--ease) .2s;
}
.js .chapter-head.is-inview::before{transform:scaleX(1)}
.chapter-no{
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  color:var(--muted);
  align-self:start;
  padding-top:var(--space-2);
}
.chapter-heading h2{
  font-size:clamp(36px,4.8vw,var(--fs-chapter));
  line-height:var(--lh-heading);
  letter-spacing:var(--ls-title);
  margin-top:var(--space-2);
}
.chapter-side{
  justify-self:end;
  max-width:20em;
  font-size:var(--fs-sm);
  line-height:var(--lh-body);
  color:var(--muted);
  text-align:left;
  padding-bottom:var(--space-1);
}

/* ---------- 房间色 ---------- */

/* 同一套映射服务三处：房间 section、首屏索引、关于房间表。
   任何带 data-room 的元素都能拿到 --room-accent。 */
#scripts,[data-room="scripts"]{--room-accent:var(--room-scripts)}
#essays,[data-room="essays"]{--room-accent:var(--room-essays)}
#papers,[data-room="papers"]{--room-accent:var(--room-papers)}
#sound,[data-room="sound"]{--room-accent:var(--room-sound)}
#showcase,[data-room="showcase"]{--room-accent:var(--room-showcase)}

/* ---------- 整幅水彩章页 ---------- */

.chapter-plate{
  position:relative;
  isolation:isolate;
  overflow:hidden;
  min-height:clamp(360px,48vh,560px);
  display:flex;
  align-items:flex-end;
  padding-block:clamp(80px,13vh,160px) clamp(38px,6vh,68px);
  background:var(--paper);
}
.chapter-plate__bg{position:absolute;inset:0;z-index:-2;background:var(--paper)}
.chapter-plate__bg img{
  width:100%;
  height:100%;
  object-fit:cover;
  opacity:.98;
  filter:saturate(1.2) contrast(1.15) brightness(1.01);
  transform:translate3d(0,var(--pl-y,0px),0) scale(1.08);
  will-change:transform;
}
@media(prefers-reduced-motion:reduce){
  .chapter-plate__bg img{transform:scale(1.04)}
}
.chapter-plate__bg::before{
  content:'';
  position:absolute;
  inset:0;
  z-index:1;
  background:var(--room-accent,transparent);
  opacity:.12;
  mix-blend-mode:multiply;
  pointer-events:none;
}
.chapter-plate__bg::after{
  content:'';
  position:absolute;
  inset:0;
  z-index:2;
  background:
    linear-gradient(100deg,var(--paper) 0%,rgba(247,243,233,.96) 30%,rgba(247,243,233,.72) 48%,rgba(247,243,233,.16) 80%,rgba(247,243,233,.02) 100%),
    linear-gradient(to top,var(--paper) 0%,rgba(247,243,233,.42) 10%,transparent 32%);
}
.chapter-plate__char{
  position:absolute;
  right:-.04em;
  bottom:-.12em;
  z-index:-1;
  font:400 clamp(220px,28vw,440px)/1 var(--hand);
  color:rgba(247,243,233,.62);
  mix-blend-mode:soft-light;
  pointer-events:none;
  user-select:none;
}
.chapter-plate__inner{
  position:relative;
  z-index:1;
  display:grid;
  grid-template-columns:44px minmax(0,1fr);
  gap:clamp(20px,3vw,46px);
  align-items:end;
}
.chapter-plate__no{
  font:400 var(--fs-sm)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  color:var(--room-accent,var(--accent-ink));
  align-self:start;
  padding-top:var(--space-1);
}
.chapter-plate .eyebrow{color:var(--room-accent,var(--accent-ink))}
.chapter-plate::after{
  content:'';
  position:absolute;
  left:0;
  right:0;
  bottom:0;
  height:2px;
  background:var(--room-accent,var(--accent));
  opacity:.6;
  z-index:2;
}
.chapter-plate__copy{
  grid-column:2;
  border-top:1px solid var(--room-accent,var(--accent));
  padding-top:var(--space-4);
}
.chapter-plate__copy h2{
  font-size:clamp(38px,5vw,var(--fs-chapter));
  line-height:var(--lh-heading);
  letter-spacing:var(--ls-title);
  margin-top:var(--space-2);
}
.chapter-plate .chapter-side{grid-column:2;justify-self:start;margin-top:14px;max-width:min(22em,46%);padding-bottom:0;color:var(--muted)}
.section--plated{padding-top:0}
.section--plated > .shell{padding-top:var(--gap-chapter)}
@media(max-width:980px){
  .chapter-plate{min-height:380px;padding-block:90px 40px}
  .chapter-plate__inner{grid-template-columns:32px minmax(0,1fr);align-items:start}
  .chapter-plate__copy{grid-column:2;border-top:0;padding-top:0}
  .chapter-plate .chapter-side{grid-column:2;justify-self:start;margin-top:12px;max-width:22em}
}
@media(max-width:767px){
  .chapter-plate{min-height:340px;padding-block:72px 34px}
  .chapter-plate__bg img{opacity:.45}
  .chapter-plate__bg::after{background:linear-gradient(to bottom,rgba(247,243,233,.9) 0%,rgba(247,243,233,.78) 58%,rgba(247,243,233,.36) 100%)}
  .chapter-plate__char{font-size:clamp(200px,48vw,340px);right:-.1em}
  .chapter-plate__inner{gap:14px}
  .chapter-plate__copy h2{font-size:clamp(32px,8.4vw,44px)}
  .chapter-plate .eyebrow{font-size:var(--fs-xs)}
  .chapter-plate .chapter-side{font-size:var(--fs-xs);margin-top:8px}
  .section--plated > .shell{padding-top:40px}
}
.section-heading-note{
  margin-top:var(--space-2);
  font-size:var(--fs-sm);
  color:var(--muted);
}

/* ---------- 关于 ---------- */

.about{background:linear-gradient(to bottom,rgba(253,250,243,.68),var(--paper))}
.about-grid{
  display:grid;
  grid-template-columns:minmax(0,1fr) minmax(0,1.02fr);
  gap:clamp(46px,7vw,110px);
  align-items:stretch;
}
.about-copy{padding-top:6px;display:flex;flex-direction:column}
.about-lead{
  font:400 clamp(24px,2.35vw,31px)/var(--lh-lead) var(--hand);
  letter-spacing:var(--ls-title);
  margin-bottom:var(--space-5);
}
.about-copy > p:not(.about-lead):not(.about-sign){
  max-width:32em;
  font-size:var(--fs-body);
  line-height:var(--lh-body);
  color:var(--ink-soft);
  margin-top:var(--space-4);
}
.about-meta{
  display:flex;
  flex-wrap:wrap;
  gap:var(--space-2);
  margin-top:var(--space-6);
}
.about-meta span{
  padding:var(--space-2) var(--space-3);
  border:1px solid var(--line);
  border-radius:999px;
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  color:var(--green-ink);
}
.about-quote{
  margin-top:auto;
  padding-top:clamp(30px,4.4vw,52px);
  max-width:19em;
  font:400 clamp(19px,1.9vw,25px)/var(--lh-lead) var(--hand);
  letter-spacing:var(--ls-title);
  color:var(--green-ink);
}
.about-quote::before{
  content:'“';
  color:var(--accent);
  font-size:1.5em;
  line-height:0;
  vertical-align:-.12em;
  margin-right:var(--space-1);
}
.about-quote small{
  display:block;
  margin-top:var(--space-4);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  color:var(--muted);
}
.about-sign{
  margin-top:clamp(30px,4vw,50px);
  padding-top:clamp(26px,3vw,38px);
  border-top:1px solid var(--line-soft);
  font:400 42px/var(--lh-heading) var(--hand);
  color:var(--green-ink);
  display:flex;
  align-items:baseline;
  gap:var(--space-4);
}
.about-sign em{
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  color:var(--muted);
}
.room-index{position:relative}
/* 房间索引 = 左目录 + 右相纸的并排单元。原来预览叠在列表下面，矮窗口下
   列表+预览高约 950px，滚到预览时列表已出屏，只剩一句引文加一张图，
   中间全是空纸。并排后整块约 450px，悬停与预览同屏，单元本身也密了。 */
.room-index{
  display:grid;
  grid-template-columns:minmax(0,.92fr) minmax(0,1.08fr);
  column-gap:clamp(18px,2.4vw,36px);
  align-items:end;
}
.room-index__hint{grid-column:1/-1}
.room-list{grid-row:2;align-self:center}
.room-foot{grid-column:1/-1}
.room-index__hint{
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  color:var(--muted);
  margin-bottom:var(--space-4);
  display:flex;
  gap:var(--space-2);
  align-items:center;
}
.room-index__hint span{color:var(--accent-ink);font-size:var(--fs-sm)}
.room-list{border-top:1px solid var(--line)}
.room{
  display:grid;
  grid-template-columns:22px minmax(0,1fr) 18px;
  align-items:center;
  gap:var(--space-4);
  padding:clamp(13px,1.7vw,19px) 4px clamp(13px,1.7vw,19px) 0;
  border-bottom:1px solid var(--line);
  transition:padding-left .45s var(--ease),color .25s ease;
}
.room .room-bar{width:16px}
.room-title{
  font:400 clamp(23px,2.15vw,29px)/var(--lh-heading) var(--hand);
  letter-spacing:var(--ls-title);
}
.room-arrow{
  color:var(--green-ink);
  font-size:14px;
  opacity:0;
  transform:translateX(-6px);
  transition:opacity .3s ease,transform .4s var(--ease);
}
.room:hover,.room.is-active{padding-left:12px;color:var(--green-ink)}
.room:hover .room-bar,.room.is-active .room-bar{transform:scaleX(1.6)}
.room:hover .room-arrow,.room.is-active .room-arrow{opacity:1;transform:none}
.room-preview{
  grid-column:2;
  grid-row:2;
  justify-self:end;
  width:100%;
  max-width:none;
  margin:0 0 var(--space-2);
  padding:var(--space-2) var(--space-2) 0;
  background:var(--paper-soft);
  border:1px solid var(--line-soft);
  box-shadow:var(--shadow-2);
  transform:rotate(-.8deg);
}
.room-preview img{
  width:100%;
  aspect-ratio:var(--ar-portrait);
  object-fit:cover;
  object-position:center 22%;
  background:var(--paper-soft);
  transition:opacity .3s ease,transform .8s var(--ease);
}
.room-preview.is-changing img{opacity:.2;transform:scale(1.03)}
.room-preview figcaption{
  padding:var(--space-2) 2px var(--space-3);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  color:var(--muted);
}
.room-foot{
  margin-top:var(--space-4);
  text-align:right;
  font:400 var(--fs-base)/var(--lh-label) var(--hand);
  color:var(--muted);
  letter-spacing:var(--ls-label);
}
.about-strip{
  display:grid;
  grid-template-columns:repeat(3,minmax(0,1fr));
  gap:clamp(12px,1.6vw,20px);
  margin-top:clamp(44px,6vw,84px);
}
.about-strip figure{margin:0}
.about-strip img{
  display:block;
  width:100%;
  aspect-ratio:var(--ar-photo);
  object-fit:cover;
  filter:saturate(.92) contrast(1.02);
  transition:transform .9s var(--ease),filter .6s ease;
}
.about-strip figure{
  overflow:hidden;
  border:1px solid var(--line-soft);
  background:var(--paper-soft);
}
.about-strip figure:hover img{transform:scale(1.03);filter:saturate(1.05) contrast(1.02)}
.about-strip figcaption{
  padding:var(--space-3) var(--space-3) var(--space-3);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  color:var(--muted);
  border-top:1px solid var(--line-soft);
}
.demo-notice{
  margin-top:clamp(44px,6vw,72px);
  padding-left:var(--space-4);
  border-left:1px solid var(--accent);
  max-width:760px;
  font:400 var(--fs-xs)/var(--lh-body) var(--sans);
  letter-spacing:var(--ls-title);
  color:var(--muted);
}

/* ---------- 作品共通 ---------- */

.loading-message{
  font-size:var(--fs-base);
  color:var(--muted);
  padding:var(--space-5) 0;
}
.error-message{
  font-size:var(--fs-base);
  color:var(--ink);
  padding:var(--space-5);
  border:1px solid var(--line);
  background:var(--paper-soft);
}
.retry-button{
  display:block;
  margin-top:var(--space-3);
  border:0;
  background:var(--green);
  color:var(--paper);
  font:400 var(--fs-sm)/var(--lh-label) var(--sans);
  padding:var(--space-2) var(--space-4);
  transition:background var(--t-fast) var(--ease);
}
/* 只在图片加载失败时出现。既然出现了，就得像个按钮。 */
.retry-button:hover{background:var(--green-ink)}
.retry-button:active{background:var(--green-deep)}
.work-meta{
  display:flex;
  align-items:center;
  flex-wrap:wrap;
  gap:var(--space-2);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  color:var(--muted);
  text-transform:uppercase;
}
.demo-label{
  color:var(--accent-ink);
  letter-spacing:var(--ls-label);
}
.demo-label::before{content:'·';margin-right:6px}
.award-label{
  color:var(--accent-ink);
  letter-spacing:var(--ls-label);
}
.award-label::before{content:'·';margin-right:6px}
.line-link{
  display:inline-flex;
  align-items:center;
  gap:var(--space-3);
  font:400 var(--fs-sm)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  color:var(--green-ink);
  padding-bottom:var(--space-1);
  border-bottom:1px solid rgba(31,83,72,.32);
  transition:color .25s ease,border-color .25s ease;
}
.line-link span{transition:transform .4s var(--ease)}
.line-link:hover{color:var(--accent-ink);border-color:var(--accent-ink)}
.line-link:hover span{transform:translateX(5px)}
.work-image{
  position:relative;
  display:block;
  overflow:hidden;
  background:var(--paper-deep);
}
.work-image img{
  width:100%;
  aspect-ratio:var(--ar-wide);
  object-fit:cover;
  transition:transform .8s var(--ease);
}
.work-image:hover img{transform:scale(1.025)}
.caption-no{
  display:inline-block;
  margin-right:var(--space-2);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  color:var(--accent-ink);
}
.illustration-caption{
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  color:var(--muted);
}
.image-fallback{
  background:var(--tint);
  color:var(--muted);
  min-height:160px;
  display:grid;
  place-content:center;
  text-align:center;
  padding:var(--space-5);
  font-size:var(--fs-sm);
}
.image-fallback small{display:block;font-size:var(--fs-xs)}

/* ---------- 剧本 ---------- */

.scripts-layout{
  display:grid;
  gap:clamp(58px,7vw,96px);
}
.script-card{
  display:grid;
  gap:clamp(32px,4.6vw,68px);
  align-items:center;
  position:relative;
}
.script-card--feature{grid-template-columns:minmax(0,1.08fr) minmax(0,.92fr)}
.script-card--note{
  grid-template-columns:minmax(0,.94fr) minmax(0,1.06fr);
  align-items:stretch;
  border-top:1px solid var(--line);
  padding-top:clamp(36px,5vw,64px);
}
.script-media{
  position:relative;
  padding:var(--space-3) var(--space-3) 0;
  background:var(--paper-soft);
  border:1px solid var(--line-soft);
  box-shadow:var(--shadow-3);
}
.script-media.ratio-portrait,.script-media.ratio-square{
  width:100%;
  max-width:460px;
  justify-self:center;
}
.script-media.ratio-portrait img{
  aspect-ratio:var(--ar-portrait);
  object-fit:contain;
  background:var(--paper-soft);
}
.script-media.ratio-square img{
  aspect-ratio:var(--ar-square);
  object-fit:contain;
  background:var(--paper-soft);
}
.script-media.ratio-landscape img{
  aspect-ratio:var(--ar-photo);
  object-fit:cover;
}
.script-media img{
  width:100%;
  aspect-ratio:var(--ar-photo);
  object-fit:cover;
  transition:transform .9s var(--ease);
}
.script-media:hover img{transform:scale(1.02)}
.script-media figcaption{
  display:flex;
  justify-content:space-between;
  gap:var(--space-4);
  padding:var(--space-3) 2px var(--space-3);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  color:var(--muted);
}
.script-media figcaption span:last-child{color:var(--accent-ink);text-transform:uppercase;letter-spacing:var(--ls-caps)}
.script-media__tag{
  position:absolute;
  top:-12px;
  right:22px;
  z-index:2;
  padding:var(--space-1) var(--space-3);
  background:rgba(240,233,218,.92);
  border:1px solid rgba(31,83,72,.12);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  color:var(--green-ink);
  transform:rotate(1.5deg);
}
.script-body{position:relative;z-index:2;min-width:0}
.work-kicker{
  display:flex;
  align-items:center;
  gap:var(--space-3);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  text-transform:uppercase;
  color:var(--muted);
}
.work-kicker b{
  font:400 var(--fs-xs)/1 var(--sans);
  letter-spacing:var(--ls-label);
  color:var(--accent-ink);
}
.work-kicker::after{
  content:'';
  width:34px;
  height:1px;
  background:var(--line);
}
.script-title{
  font-size:clamp(34px,4vw,var(--fs-work));
  line-height:var(--lh-heading);
  letter-spacing:var(--ls-title);
  margin-top:var(--space-3);
}
.script-title a{transition:color .25s ease}
.script-title a:hover{color:var(--green-ink)}
.script-summary{
  margin-top:var(--space-4);
  max-width:26em;
  font-size:var(--fs-base);
  line-height:var(--lh-body);
  color:var(--muted);
}
.script-hook{
  margin-top:var(--space-4);
  max-width:26em;
  font:400 clamp(17px,1.35vw,20px)/var(--lh-body) var(--hand);
  letter-spacing:var(--ls-title);
  color:var(--ink-soft);
}
.script-pull{
  margin:28px 0 0;
  padding-left:var(--space-4);
  border-left:2px solid var(--accent);
  font:400 clamp(19px,1.7vw,24px)/var(--lh-lead) var(--hand);
  letter-spacing:var(--ls-title);
  color:var(--green-ink);
  max-width:19em;
}
.script-pull p{margin:0}
.script-pull cite{
  display:block;
  margin-top:var(--space-2);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  font-style:normal;
  letter-spacing:var(--ls-caps);
  color:var(--muted);
}
.script-excerpt{
  margin-top:var(--space-5);
  padding:clamp(20px,2.4vw,28px);
  background:rgba(253,250,243,.72);
  border:1px solid var(--line-soft);
  position:relative;
}
.script-excerpt::before{
  content:'剧本节选';
  position:absolute;
  right:15px;
  top:13px;
  font:400 var(--fs-xs)/1 var(--sans);
  letter-spacing:var(--ls-caps);
  color:var(--muted);
}
.script-scene-line{
  font:500 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  color:var(--green-ink);
  margin-bottom:var(--space-3);
}
.script-dialogue{
  display:grid;
  grid-template-columns:54px minmax(0,1fr);
  gap:var(--space-3);
  margin-top:var(--space-2);
  font-size:var(--fs-base);
  line-height:var(--lh-body);
}
.script-dialogue dt{
  font:400 var(--fs-sm)/var(--lh-body) var(--hand);
  color:var(--accent-ink);
  letter-spacing:var(--ls-label);
}
.script-dialogue dd{font:400 var(--fs-base)/var(--lh-body) var(--hand)}
.script-action{
  font-size:var(--fs-sm);
  line-height:var(--lh-body);
  color:var(--muted);
  margin-top:var(--space-2);
}
.script-body .line-link{margin-top:26px}
.script-pages{
  margin:var(--space-6) 0 0;
  padding-top:var(--space-5);
  border-top:1px solid var(--line-soft);
  display:flex;
  align-items:flex-end;
  gap:var(--space-4);
}
.script-pages__strip{display:flex;gap:14px;align-items:flex-start}
.script-page{
  width:148px;
  flex:0 0 auto;
  padding:var(--space-1) var(--space-1) 0;
  background:#fbfdfb;
  border:1px solid rgba(31,83,72,.2);
  box-shadow:var(--shadow-1);
  transition:transform .5s var(--ease),box-shadow .4s ease;
}
.script-page:nth-child(odd){transform:rotate(-1.2deg)}
.script-page:nth-child(even){transform:rotate(1.4deg)}
.script-page:hover{transform:translateY(-4px) rotate(0);box-shadow:var(--shadow-1)}
.script-page img{
  display:block;
  width:100%;
  aspect-ratio:var(--ar-portrait);
  object-fit:cover;
  object-position:top center;
  background:#fff;
}
.script-pages__caption{
  margin-left:auto;
  display:flex;
  flex-direction:column;
  align-items:flex-end;
  gap:var(--space-2);
  padding-bottom:var(--space-1);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  color:var(--muted);
  text-align:right;
}
.script-pages__pdf{
  color:var(--accent-ink);
  text-decoration:none;
  border-bottom:1px solid rgba(31,83,72,.32);
  padding-bottom:1px;
  transition:color .25s ease,border-color .25s ease;
}
.script-pages__pdf:hover{color:var(--green-ink);border-color:var(--green)}
.script-pages--work{
  margin-top:clamp(40px,5vw,62px);
  padding-top:var(--space-5);
  border-top:1px solid var(--line);
  flex-direction:column;
  align-items:flex-start;
  gap:var(--space-3);
}
.script-pages--work .script-page{width:132px}
.script-pages--work .script-pages__caption{
  width:auto;
  margin-left:0;
  flex-direction:row;
  text-align:left;
}
.script-quote-panel{
  position:relative;
  padding:clamp(38px,5vw,70px) clamp(26px,4vw,54px);
  background:
    linear-gradient(135deg,rgba(253,250,243,.86),rgba(240,233,218,.8));
  border:1px solid var(--line-soft);
  min-height:300px;
  display:flex;
  flex-direction:column;
  justify-content:center;
}
.script-quote-panel::before{
  content:'“';
  font:400 clamp(110px,13vw,190px)/.7 var(--display);
  color:rgba(31,83,72,.17);
  position:absolute;
  top:26px;
  left:24px;
}
.script-quote{
  position:relative;
  z-index:1;
  font:400 clamp(24px,2.7vw,38px)/var(--lh-body) var(--hand);
  letter-spacing:var(--ls-title);
  color:var(--ink);
  margin-left:clamp(16px,3vw,42px);
}
.script-quote-panel footer{
  margin-top:28px;
  display:flex;
  justify-content:space-between;
  gap:20px;
  border-top:1px solid var(--line);
  padding-top:var(--space-4);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  text-transform:uppercase;
  color:var(--muted);
}
.script-note .script-title{font-size:clamp(32px,3.6vw,50px)}

/* 02 剧本 · 双开
   两件作品各占一屏，左页是图、右页是字，中间一条中缝。
   第二件反过来排——像真的翻过去一页。读剧本本来就是翻页的动作。 */
.scripts-layout{display:grid;gap:0}
.script-card{
  position:relative;
  display:grid;
  grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  align-items:stretch;
  gap:0;
  border-top:1px solid var(--line);
}
.script-card:first-child{border-top:0}
.script-card::after{
  content:'';
  position:absolute;
  left:50%;
  top:clamp(26px,4vw,56px);
  bottom:clamp(26px,4vw,56px);
  width:1px;
  background:var(--line);
  pointer-events:none;
}
.script-card .script-media{
  order:1;
  width:auto;
  max-width:none;
  justify-self:stretch;
  align-self:stretch;
  min-height:clamp(420px,60vh,640px);
  /* 内侧留出中缝的呼吸，否则图片右边缘正好压在中缝线上，线就看不见了 */
  margin-inline-end:clamp(12px,2vw,28px);
  padding:0;
  border:0;
  box-shadow:none;
  background:var(--paper-deep);
  overflow:hidden;
}
.script-card .script-media img{
  width:100%;
  height:100%;
  aspect-ratio:auto;
  object-fit:cover;
  transition:transform var(--t-slow) var(--ease);
}
.script-card .script-media.ratio-portrait img,
.script-card .script-media.ratio-square img{object-fit:cover;background:none}
.script-card .script-media figcaption{
  position:absolute;
  left:0;
  right:0;
  bottom:0;
  padding:var(--space-4) 20px;
  background:linear-gradient(to top,rgba(14,39,35,.78),rgba(14,39,35,.3) 52%,transparent);
  color:var(--on-dark-2);
}
.script-card .script-media figcaption span:last-child{color:var(--on-dark-accent)}
.script-card .script-media__tag{top:16px;right:16px}
.script-card .script-body{
  order:2;
  align-self:center;
  max-width:34em;
  padding:var(--gap-chapter) 0 var(--gap-chapter) clamp(32px,5vw,76px);
}
.script-card:nth-child(even) .script-media{
  order:2;
  margin-inline-end:0;
  margin-inline-start:clamp(12px,2vw,28px);
}
.script-card:nth-child(even) .script-body{
  order:1;
  justify-self:end;
  padding:var(--gap-chapter) clamp(32px,5vw,76px) var(--gap-chapter) 0;
}
@media(max-width:980px){
  /* 窄屏没有左右两页，「双开」要换个轴成立：图在上、字在下，
     中缝转 90° 变成横缝，偶数卡的镜像也从「左右对调」改成「贴边方向对调」。
     --seam-gap 是图与字之间的距离，横缝落在它正中间。 */
  .script-card{
    grid-template-columns:1fr;
    min-height:0;
    --seam-gap:clamp(34px,4.6vw,52px);
    row-gap:var(--seam-gap);
  }
  /* 竖着的中缝在单列里没有意义（left:50% 会压在图的正中），必须关掉 */
  .script-card::after{display:none}
  .script-card .script-media,
  .script-card:nth-child(even) .script-media{order:1;min-height:clamp(300px,44vh,420px)}
  .script-card .script-body,
  .script-card:nth-child(even) .script-body{
    order:2;
    justify-self:start;
    padding:0;
  }
  /* 横缝不写在 .script-card::after 上：卡是单列网格，媒体高度由内容决定，
     ::after 没有一个可靠的 top 可写。挂在 .script-body 上、往上提半个 gap，
     缝就正好落在图与字中间。
     两端各缩 clamp(22px,6vw,48px)：顶到边的 1px 跟卡片自己的 border-top
     长得一模一样，会被读成卡片分隔线，而这是书页的订口。 */
  .script-card .script-body::before{
    content:'';
    position:absolute;
    left:clamp(22px,6vw,48px);
    right:clamp(22px,6vw,48px);
    top:calc(var(--seam-gap) / -2);
    height:1px;
    background:var(--line);
    pointer-events:none;
  }
  /* 反向偏移留下来：奇数卡图贴左（右侧留空），偶数卡图贴右（左侧留空）。
     原来是 clamp(12px,2vw,28px)，390 下只有 12px —— 在 350px 的栏里占 3.4%，
     读不出是故意的；放到 6vw（390 下 23.4px）两页的反相才看得出来。
     没有把图挪到文字后面（那才是严格意义上的「对调」）：两件作品的正文会
     连成一片，而且视觉顺序会和 DOM 顺序不一致——键盘和读屏仍然是图在前。 */
  .script-card .script-media{margin-inline-end:clamp(16px,6vw,34px);margin-inline-start:0}
  .script-card:nth-child(even) .script-media{margin-inline-start:clamp(16px,6vw,34px);margin-inline-end:0}
  /* 角标跟着挪到留空那一侧：两件作品的角标都压在订口上，方向才不飘 */
  .script-card:nth-child(even) .script-media__tag{right:auto;left:16px;transform:rotate(-1.5deg)}
}

/* ---------- 影评 ---------- */

.papers{background:var(--paper)}
.papers-layout{
  display:flex;
  flex-direction:column;
  border-top:1px solid var(--line-soft);
}
.paper-item{
  display:grid;
  grid-template-columns:96px minmax(0,1fr);
  gap:clamp(20px,2.6vw,38px);
  align-items:start;
  padding-block:clamp(26px,3.4vw,42px);
  border-bottom:1px solid var(--line-soft);
}
.paper-thumb{
  display:block;
  width:96px;
  aspect-ratio:var(--ar-portrait);
  overflow:hidden;
  background:var(--paper-soft);
  /* 描边改 outline：border 会从比例框里吃掉 2px，96px 宽的缩略图看不出，
     44px 的方形缩略图里那是 4.5% 的宽度。outline 不占布局，框还是准的。 */
  outline:1px solid var(--hairline);
  outline-offset:-1px;
}
.paper-thumb img{
  width:100%;
  height:100%;
  object-fit:cover;
  filter:saturate(1.06) contrast(1.02);
  transition:transform .6s var(--ease);
}
.paper-thumb:hover img{transform:scale(1.03)}
.paper-body{min-width:0}
.paper-title{
  margin-top:var(--space-1);
  font-size:clamp(20px,2.1vw,26px);
  line-height:var(--lh-label);
  letter-spacing:var(--ls-title);
}
.paper-title a{transition:color .25s}
.paper-title a:hover{color:var(--green-ink)}
.paper-summary{
  margin-top:var(--space-2);
  max-width:30em;
  font-size:var(--fs-sm);
  line-height:var(--lh-body);
  color:var(--muted);
}
.paper-foot{
  display:flex;
  align-items:center;
  gap:var(--space-4);
  margin-top:var(--space-4);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  color:var(--ink-soft);
}
.paper-foot .line-link{margin-left:auto}
.essays{
  background:
    radial-gradient(ellipse 55% 40% at 8% 10%,rgba(150,186,168,.22),transparent 70%),
    linear-gradient(to bottom,var(--paper),var(--paper-soft));
  border-top:1px solid var(--line-soft);
  border-bottom:1px solid var(--line-soft);
}
.essays-layout{
  display:grid;
  gap:0;
  border-top:1px solid var(--line);
}
.essay-card{
  position:relative;
  display:grid;
  grid-template-columns:minmax(0,.62fr) minmax(0,1.38fr);
  gap:clamp(26px,4vw,62px);
  align-items:stretch;
  padding:clamp(32px,4.2vw,56px) 0;
  border-bottom:1px solid var(--line);
}
.essay-card::before{
  content:'';
  position:absolute;
  left:0;
  top:0;
  width:100%;
  height:1px;
  background:var(--accent);
  transform:scaleX(0);
  transform-origin:left;
  transition:transform .6s var(--ease);
}
.essay-card:hover::before{transform:none}
.essay-content{display:flex;flex-direction:column;min-width:0}
.essay-visual{margin:0;position:relative}
.essay-visual__link{display:block;position:relative;overflow:hidden;background:var(--paper-soft);box-shadow:inset 0 0 0 1px rgba(31,83,72,.14)}
.essay-visual--landscape,
.essay-visual--landscape .essay-visual__link{height:100%}
.essay-visual--landscape .essay-visual__link{min-height:clamp(230px,24vw,330px)}
.essay-visual--landscape img{
  position:absolute;
  inset:0;
  width:100%;
  height:100%;
  object-fit:cover;
  transition:transform .9s var(--ease);
}
.essay-visual--portrait{
  max-width:340px;
  align-self:start;
  padding:var(--space-3) var(--space-3) 0;
  background:var(--paper-soft);
  border:1px solid var(--line-soft);
  box-shadow:var(--shadow-2);
  transform:rotate(-.9deg);
}
.essay-visual--portrait img{
  width:100%;
  aspect-ratio:var(--ar-portrait);
  object-fit:contain;
  background:var(--paper-soft);
  transition:transform .9s var(--ease);
}
.essay-visual:hover img{transform:scale(1.02)}
.essay-visual figcaption{
  padding-top:var(--space-3);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  color:var(--muted);
}
.essay-visual--portrait figcaption{padding:10px 2px 12px}
.essay-no{
  font:400 12px/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  color:var(--accent-ink);
  margin-bottom:var(--space-3);
}
.essay-card h3{
  text-wrap:balance;
  font-size:clamp(29px,3.2vw,43px);
  line-height:var(--lh-label);
  margin-top:var(--space-3);
  max-width:13em;
}
.essay-card h3 a{transition:color .25s ease}
.essay-card h3 a:hover{color:var(--green-ink)}
.essay-summary{
  margin-top:var(--space-4);
  max-width:26em;
  font-size:var(--fs-base);
  line-height:var(--lh-body);
  color:var(--muted);
}
.essay-quote{
  margin-top:var(--space-5);
  font:400 clamp(19px,2vw,25px)/var(--lh-lead) var(--hand);
  color:var(--green-ink);
  letter-spacing:var(--ls-title);
  max-width:18em;
  padding-left:var(--space-4);
  border-left:1px solid rgba(31,83,72,.25);
}
.essay-foot{
  margin-top:auto;
  display:flex;
  justify-content:space-between;
  align-items:center;
  gap:20px;
  border-top:1px solid var(--line-soft);
  padding-top:var(--space-4);
}
.essay-quote{margin-bottom:26px}
.essay-time{
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  color:var(--muted);
  text-transform:uppercase;
}

/* 03 影评 · 单栏杂志式
   封面通栏，标题压在图片下面，正文一栏到底。
   竖的封面不裁——整幅放在一块纸色版面上，像杂志里插的一页图版。 */
.essays-layout{display:grid;gap:0;border-top:1px solid var(--line)}
/* 03 影评：图左、字右，两件作品**同一套版式、同一个图版比例**。

   以前按封面横竖分流——横图走通栏「图在上、字在下」（占卡宽 100%），
   竖图走「图左、字右」（只占 26.9%）。同一房间里一件占满整幅、
   另一件缩成一条，读起来像两套版式在打架。

   改过两轮都不成立：
     ① 按面积对齐（横 560×306、竖 352×507）：面积接近，但 1.83 和 0.694
        并排放着，一个又扁又长一个又窄又高，卡片高度还差一倍。
     ② 按高度对齐（都是 330 高，宽 603 / 229）：顶底齐了，但竖版只剩 229px 宽，
        两件面积差 2.6 倍，看上去还是一大一小。
   1.83 ÷ 0.694 = 2.6，只要不裁切，怎么排都会留下这个落差。

   所以统一裁成 4:3，两件图版尺寸完全相同（560 × 420）。
   为什么是 4:3：它是横竖两个比例的中间值偏横一档，竖图损失 48%（上下各裁 24%）、
   横图损失 27%（左右各裁 13.5%）——两边都留着主体，也没有哪一边被砍掉一半。
   如果统一成 3:2，竖图要裁 54%；统一成 1:1，横图要裁 45%。

   代价：竖版封面上下各裁约四分之一。这是「两件看起来一样」必须付的钱，
   不裁就没有一致的版式——比例差 2.6 倍，不存在两边都不裁又一样大的排法。 */
.essay-card{
  display:grid;
  grid-template-columns:clamp(300px,43vw,560px) minmax(0,1fr);
  gap:clamp(26px,3.6vw,56px);
  align-items:start;
  padding:clamp(38px,4.8vw,68px) 0;
  border-bottom:1px solid var(--line);
}
.essay-card .essay-visual{
  width:100%;
  max-width:none;
  align-self:start;
  padding:0;
  border:0;
  background:none;
  box-shadow:none;
  transform:none;
}
/* 图版一律 4:3，横竖两件完全对称。img 用 cover 填满，
   比例由框决定，--ar 不再参与——两个原始比例差 2.6 倍，
   让框跟着图走就等于没有统一。 */
.essay-card .essay-visual__link{
  position:relative;
  display:block;
  width:100%;
  height:auto;
  min-height:0;
  aspect-ratio:var(--ar-essay,4/3);
  background:var(--paper-deep);
  box-shadow:inset 0 0 0 1px var(--line-soft);
}
.essay-card .essay-visual--landscape .essay-visual__link{
  width:100%;
  height:auto;
  min-height:0;
  aspect-ratio:var(--ar-essay,4/3);
}
.essay-card .essay-visual img{
  position:absolute;
  inset:0;
  width:100%;
  height:100%;
  aspect-ratio:auto;
  object-fit:cover;
}
.essay-card .essay-visual--portrait img{object-fit:cover;background:none}
.essay-card .essay-visual figcaption{padding-top:12px}

/* 图版比文字高时，右栏拉满、把「阅读全文」推到图版底部，
   两栏收在同一条基线上。横版竖版都要，否则一件齐底、一件齐顶。 */
.essay-card .essay-content{align-self:stretch;max-width:46em}
.essay-card .essay-foot{margin-top:auto}
.essay-card h3{font-size:clamp(30px,3.9vw,50px);line-height:var(--lh-heading);max-width:17em}
.essay-summary{max-width:34em}
.essay-foot{margin-top:clamp(22px,3vw,32px)}
/* 并排撑不住就回到单栏：560px 的图版 + 56px 间距，在 900 以下
   留给正文不到 300px，标题会挤成一条。 */
@media(max-width:900px){
  .essay-card{grid-template-columns:minmax(0,1fr);gap:clamp(22px,3.4vw,30px)}
  /* 单栏后图版撑满栏宽。比例仍是 4:3，所以两件在手机上也还是同一个形状，
     只是尺寸从「并排的一半」变成「整栏」，不另设比例。 */
  .essay-card .essay-visual{width:100%;max-width:none;margin-inline:0}
  .essay-card .essay-visual__link,
  .essay-card .essay-visual--landscape .essay-visual__link{width:100%;height:auto}
}
@media(max-width:767px){
  /* 4:3 在窄屏上偏高（350 宽 → 262 高），但仍比原比例的通栏横图更规矩，
     而且和另一件一致。这里不再单独改比例。 */
  .essay-card .essay-visual--landscape .essay-visual__link{height:auto}
}

/* ---------- 影像 ---------- */

.showcase-group{position:relative}
.showcase-head{
  display:flex;
  align-items:center;
  gap:var(--space-4);
  padding-bottom:var(--space-4);
  margin-bottom:clamp(26px,3.4vw,44px);
  border-bottom:1px solid var(--line);
  font:500 var(--fs-sm)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  color:var(--green-ink);
}
.showcase-head::after{
  content:'';
  flex:1;
  height:1px;
  background:currentColor;
  opacity:.18;
}
.showcase-group--films{
  background:
    linear-gradient(to bottom,var(--film) 0,transparent 150px),
    linear-gradient(to bottom,transparent calc(100% - 118px),var(--paper)),
    radial-gradient(ellipse 60% 50% at 85% 20%,rgba(72,108,98,.3),transparent 65%),
    radial-gradient(ellipse 55% 45% at 0% 100%,rgba(58,92,82,.26),transparent 70%),
    var(--film);
  color:var(--on-dark-1);
  overflow:hidden;
  padding-block:var(--band-y) var(--band-y-end);
}
/* 06 是一节两种视觉语言：章页水彩是浅的，影像组是深的。两处硬边都在这里化开——
   章页底边溶进深色，深色底边再溶回纸色，交给舞台组接住。
   顺带在文案下面晕一层很淡的暗色：这张画左半是浅帘子，浅字压不住。 */
.showcase .chapter-plate__bg::after{
  content:'';
  position:absolute;
  inset:0;
  background:
    linear-gradient(to bottom,var(--film) 0,transparent 130px),
    radial-gradient(ellipse 62% 58% at 10% 76%,rgba(14,39,35,.62),transparent 72%),
    linear-gradient(to bottom,transparent calc(100% - 160px),var(--film));
  pointer-events:none;
}
/* 06 的章页水彩是排练厅的暗墙，深字会陷进画面。这一章原先（合并前的 .films）
   就是浅字压深底，这里沿用同一套取值，别处章页不受影响。左半张是浅色帘子，
   浅字压不住，所以在文案那一条上再垫一层向右淡出的暗色。 */
.showcase .chapter-plate__inner::before{
  content:'';
  position:absolute;
  inset:-44px -4em -38px -7vw;
  z-index:-1;
  background:linear-gradient(to right,rgba(14,39,35,.88),rgba(14,39,35,.6) 58%,rgba(14,39,35,0));
  /* 羽化只占上下 12%，让编号与眉题落在实色区里，不然浅字压在浅墙上看不见 */
  -webkit-mask-image:linear-gradient(to bottom,transparent,#000 12%,#000 88%,transparent);
  mask-image:linear-gradient(to bottom,transparent,#000 12%,#000 88%,transparent);
  pointer-events:none;
}
.showcase .chapter-plate__no{color:var(--on-dark-2)}
.showcase .chapter-plate .eyebrow{color:var(--on-dark-accent)}
.showcase .chapter-plate__copy{border-top-color:var(--on-dark-line)}
.showcase .chapter-plate__copy h2{color:var(--on-dark-1)}
.showcase .chapter-side{color:var(--on-dark-2)}
.showcase .chapter-plate__char{color:var(--on-dark-1);opacity:.3}
.showcase .chapter-plate::after{background:var(--on-dark-accent);opacity:.45}
.showcase-group--films .showcase-head{color:var(--on-dark-2);border-bottom-color:var(--on-dark-line)}
.showcase-group--films .loading-message{color:var(--on-dark-2)}
/* P2-14 编辑式对页：画框不再通栏，改成 ~58% 宽图版 + 右侧文字栏，
   左右交替像画册跨页。topline 仍横贯两栏当分隔线。
   竖片（时间"贷"价）单独走窄图版列——画框窄、文字栏宽，
   原来那片黑底空场正好被文字填掉。 */
.film-card{
  position:relative;
  display:grid;
  grid-template-columns:minmax(0,1.5fr) minmax(0,1fr);
  gap:clamp(26px,4vw,58px);
  align-items:center;
}
.film-card + .film-card{margin-top:clamp(40px,6vw,72px)}
.film-topline{grid-column:1/-1}
.film-card:nth-of-type(even) .film-frame{order:2}
/* 只有三部片：even 换边被竖片的 order:0 抵消，三张会全落左边。
   让最后一部镜像到右，节奏是 标准→竖片特写→镜像。 */
.film-card:last-of-type .film-frame{order:2}
.film-card .film-copy{grid-template-columns:minmax(0,1fr);gap:var(--space-5);margin-top:0}
.film-topline{
  display:flex;
  justify-content:space-between;
  gap:var(--space-5);
  border-top:1px solid var(--on-dark-line);
  padding-top:var(--space-4);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  text-transform:uppercase;
  color:var(--on-dark-2);
}
.film-frame{
  position:relative;
  margin-top:clamp(22px,3vw,34px);
  padding:clamp(10px,1.2vw,18px);
  border:1px solid var(--on-dark-line);
  background:rgba(7,20,17,.32);
}
.film-frame::before{
  content:'';
  position:absolute;
  inset:6px;
  border:1px solid var(--on-dark-line-soft);
  pointer-events:none;
}
.film-frame img{
  width:100%;
  aspect-ratio:var(--ar,16/9);
  object-fit:cover;
  filter:saturate(.92) brightness(.94);
}
.film-frame.is-portrait{max-width:min(430px,64vw);margin-inline:auto}
.film-frame.is-portrait img{object-fit:contain;background:#08130f}
/* 竖片对页：窄图版列在左、宽文字栏在右。nth-of-type(even) 带伪类是 (0,3,0)，
   这里也提到 (0,3,0) 且写在其后，才能把换边压回去。 */
.film-card.film-card--portrait{grid-template-columns:minmax(0,.62fr) minmax(0,1.38fr)}
.film-card.film-card--portrait .film-frame{order:0;max-width:none;margin-inline:0}
.film-frame::after{
  content:'';
  position:absolute;
  inset:clamp(10px,1.2vw,18px);
  background:linear-gradient(to top,rgba(9,23,19,.4),transparent 45%);
  pointer-events:none;
}
.film-play{
  position:absolute;
  z-index:2;
  left:50%;
  top:50%;
  transform:translate(-50%,-50%);
  border:1px solid rgba(247,243,233,.58);
  background:rgba(19,40,36,.28);
  -webkit-backdrop-filter:blur(10px);
  backdrop-filter:blur(10px);
  color:var(--paper);
  border-radius:999px;
  display:flex;
  align-items:center;
  gap:var(--space-4);
  padding:var(--space-4) var(--space-5) var(--space-4) var(--space-4);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  transition:background .35s ease,transform .4s var(--ease),color .3s ease;
}
.film-play-icon{
  width:38px;
  height:38px;
  border-radius:50%;
  border:1px solid rgba(247,243,233,.55);
  display:grid;
  place-items:center;
  position:relative;
}
.film-play-icon::before{
  content:'';
  width:0;
  height:0;
  border-left:6px solid currentColor;
  border-top:4px solid transparent;
  border-bottom:4px solid transparent;
  margin-left:2px;
}
.film-play:hover{
  background:var(--paper);
  color:var(--ink);
  transform:translate(-50%,-50%) scale(1.03);
}
.film-frame-caption{
  display:flex;
  justify-content:space-between;
  gap:var(--space-5);
  margin-top:var(--space-3);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  color:var(--on-dark-2);
  text-transform:uppercase;
}
.film-copy{
  display:grid;
  grid-template-columns:minmax(0,1.3fr) minmax(240px,.7fr);
  gap:clamp(26px,5vw,80px);
  align-items:start;
  margin-top:clamp(26px,3.4vw,42px);
}
.film-copy .work-meta{color:var(--on-dark-2)}
.film-copy .award-label{color:var(--on-dark-accent)}
.film-copy h3{
  /* 对页右栏 ~440px，58px 的大标题一行只放 7 个字会叠四行，收一档 */
  font-size:clamp(28px,3vw,42px);
  line-height:var(--lh-heading);
  margin-top:var(--space-3);
}
.film-copy h3 a{transition:color .25s ease}
.film-copy h3 a:hover{color:var(--on-dark-accent)}
.film-summary{
  margin-top:var(--space-4);
  max-width:26em;
  font-size:var(--fs-base);
  line-height:var(--lh-body);
  color:var(--on-dark-2);
}
.film-summary + .film-summary{margin-top:10px}
.film-meta{
  border-top:1px solid var(--on-dark-line);
  padding-top:var(--space-4);
}
.film-meta dl{
  display:grid;
  grid-template-columns:auto 1fr;
  gap:var(--space-2) var(--space-4);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
}
.film-meta dt{color:var(--on-dark-3);text-transform:uppercase}
.film-meta dd{color:var(--on-dark-2)}
.film-meta .line-link{margin-top:22px;color:var(--on-dark-1);border-color:var(--on-dark-line)}
.film-meta .line-link:hover{color:var(--on-dark-accent);border-color:var(--on-dark-accent)}
.film-meta .demo-label{color:var(--on-dark-accent)}
.film-meta .work-meta{color:var(--on-dark-2)}
.media-status{
  display:flex;
  align-items:flex-start;
  gap:var(--space-4);
  background:rgba(247,243,233,.08);
  padding:var(--space-4) var(--space-4);
  margin-top:20px;
}
.status-mark{
  display:inline-flex;
  border:1px solid var(--on-dark-line);
  width:28px;
  height:28px;
  align-items:center;
  justify-content:center;
  flex-shrink:0;
  font-size:12px;
  line-height:1;
  color:var(--on-dark-2);
}
.media-status strong{display:block;font:400 12px/var(--lh-label) var(--sans);font-weight:400;color:var(--on-dark-1)}
.media-status p{font-size:var(--fs-xs);line-height:var(--lh-lead);color:var(--on-dark-2);margin-top:2px}
.media-block{margin:18px 0 26px}
.media-external{font-size:12px;display:inline-block;color:var(--on-dark-accent);text-decoration:underline}
.media-external:hover{color:var(--on-dark-1)}
video,audio{display:block;width:100%;max-width:100%;margin-block:18px}
video{aspect-ratio:var(--ar-film);background:#0c1a17}
.media-error{
  padding:var(--space-3) var(--space-4);
  background:rgba(164,97,84,.18);
  font-size:12px!important;
}

/* ---------- 舞台 ---------- */

.showcase-group--stage{
  background:linear-gradient(to bottom,var(--paper),var(--tint) 75%,var(--paper));
  /* 一件作品撑一节，band 收紧一点，别让留白替内容撑场面 */
  padding-block:clamp(40px,5.4vw,72px);
}
.stage-card{
  display:grid;
  grid-template-columns:minmax(0,1.14fr) minmax(0,.86fr);
  gap:clamp(34px,5vw,76px);
  align-items:center;
}
.stage-visual{
  position:relative;
  padding:var(--space-3);
  background:var(--paper-soft);
  border:1px solid var(--line-soft);
  box-shadow:var(--shadow-3);
  overflow:hidden;
}
.stage-visual.ratio-portrait{
  width:100%;
  max-width:470px;
  justify-self:center;
}
.stage-visual.ratio-portrait img{
  aspect-ratio:var(--ar-portrait);
  object-fit:contain;
  background:var(--paper-soft);
  filter:brightness(.9) saturate(.9);
}
.stage-visual img{
  width:100%;
  aspect-ratio:var(--ar-photo);
  object-fit:cover;
  filter:brightness(.73) saturate(.82);
  transition:filter 1.1s var(--ease),transform 1.2s var(--ease);
}
.stage-card.is-lit .stage-visual img{filter:brightness(1.01) saturate(.98);transform:scale(1.012)}
.stage-visual::after{
  content:'';
  position:absolute;
  inset:12px;
  background:
    radial-gradient(ellipse 60% 55% at 66% 45%,rgba(253,250,243,.18),transparent 62%),
    linear-gradient(to top,rgba(10,27,23,.56),rgba(10,27,23,.06) 60%);
  opacity:1;
  transition:opacity 1s var(--ease);
  pointer-events:none;
}
.stage-card.is-lit .stage-visual::after{opacity:.22}
.stage-caption{
  position:absolute;
  left:26px;
  bottom:26px;
  z-index:2;
  color:rgba(253,250,243,.8);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  text-transform:uppercase;
  transition:color .8s ease;
}
.stage-card.is-lit .stage-caption{color:rgba(34,57,50,.6)}
.stage-beat{
  position:absolute;
  right:24px;
  top:24px;
  z-index:2;
  width:32px;
  height:32px;
  border-radius:50%;
  border:1px solid rgba(253,250,243,.45);
  display:grid;
  place-items:center;
  font:400 var(--fs-xs)/1 var(--sans);
  letter-spacing:var(--ls-label);
  color:rgba(253,250,243,.8);
  transition:opacity 1s ease;
}
.stage-card.is-lit .stage-beat{opacity:0}
.stage-body{min-width:0}
.stage-title{
  font-size:clamp(36px,4.2vw,58px);
  line-height:var(--lh-heading);
  margin-top:var(--space-3);
}
.stage-title a{transition:color .25s}
.stage-title a:hover{color:var(--green-ink)}
.stage-summary{
  margin-top:var(--space-4);
  font-size:var(--fs-base);
  line-height:var(--lh-body);
  color:var(--muted);
  max-width:30em;
}
.stage-controls{
  display:flex;
  align-items:center;
  gap:var(--space-4);
  margin-top:var(--space-4);
}
.light-switch{
  display:flex;
  align-items:center;
  gap:var(--space-2);
  border:0;
  border-bottom:1px solid var(--line);
  background:none;
  border-radius:0;
  padding:2px 0 var(--space-2);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  transition:color .3s ease,border-color .3s ease;
}
.light-switch:hover{border-color:var(--accent-ink);color:var(--green-ink)}
.light-switch__dot{
  width:24px;
  height:24px;
  border-radius:50%;
  border:1px solid rgba(34,57,50,.22);
  display:grid;
  place-items:center;
  transition:background .5s ease,border-color .5s ease;
}
.light-switch__dot::before{
  content:'';
  width:7px;
  height:7px;
  border-radius:50%;
  background:var(--green);
  transition:background .5s ease,box-shadow .5s ease;
}
.light-switch[aria-pressed="true"]{background:none;border-color:var(--line)}
.light-switch[aria-pressed="true"] .light-switch__dot{background:rgba(176,154,120,.16);border-color:rgba(176,154,120,.5)}
.light-switch[aria-pressed="true"] .light-switch__dot::before{background:var(--gold);box-shadow:0 0 12px rgba(176,154,120,.55)}
.stage-hint{
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  color:var(--muted);
}
.stage-notes{
  margin-top:clamp(18px,2.4vw,26px);
  border-top:1px solid var(--line);
}
.stage-note{
  display:grid;
  grid-template-columns:34px minmax(0,1fr);
  gap:var(--space-3);
  padding:var(--space-3) 0;
  border-bottom:1px solid var(--line);
}
.stage-note-no{
  font:400 var(--fs-xs)/var(--lh-lead) var(--sans);
  letter-spacing:var(--ls-label);
  color:var(--accent-ink);
}
.stage-note h4{
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  color:var(--green-ink);
  text-transform:uppercase;
}
.stage-note p{
  margin-top:var(--space-1);
  font-size:var(--fs-sm);
  line-height:var(--lh-body);
  color:var(--muted);
  max-width:26em;
}
.stage-body .line-link{margin-top:18px}
.stage-strip{
  display:grid;
  grid-template-columns:repeat(3,minmax(0,1fr));
  gap:var(--space-2);
  margin-top:clamp(14px,1.8vw,20px);
}
.stage-strip__item{
  padding:var(--space-1);
  background:var(--paper-soft);
  border:1px solid var(--line-soft);
  overflow:hidden;
  transition:transform .5s var(--ease),box-shadow .4s ease;
}
.stage-strip__item img{
  display:block;
  width:100%;
  aspect-ratio:var(--ar-photo);
  object-fit:cover;
  transition:transform .9s var(--ease);
}
.stage-strip__item:hover{transform:translateY(-3px);box-shadow:var(--shadow-1)}
.stage-strip__item:hover img{transform:scale(1.03)}
.stage-quote{
  margin-top:clamp(24px,3.4vw,44px);
  padding-top:clamp(20px,3vw,32px);
  border-top:1px solid var(--line);
  font:400 clamp(24px,2.9vw,38px)/var(--lh-lead) var(--hand);
  color:var(--ink);
  text-align:right;
  letter-spacing:var(--ls-title);
}
.stage-quote small{
  display:block;
  margin-top:var(--space-3);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  color:var(--muted);
  text-transform:uppercase;
}

/* ---------- 转场 ---------- */

.pause{
  position:relative;
  overflow:hidden;
  /* 上一段是 --film，这一段是 --green-deep，下一段又是 --film；两头都化开 */
  background:linear-gradient(to bottom,var(--film) 0%,var(--green-deep) 22%,var(--green-deep) 78%,var(--film) 100%);
  color:var(--on-dark-1);
  /* 一句话的过场：原来是 11vw 的呼吸，太大，压到 6.4vw 仍够隔开亮—暗—亮 */
  padding-block:clamp(44px,6.4vw,84px);
}
.pause::before{
  content:'声';
  position:absolute;
  right:2%;
  top:50%;
  transform:translateY(-50%);
  font:400 clamp(200px,26vw,380px)/1 var(--hand);
  color:rgba(247,243,233,.05);
  pointer-events:none;
}
.pause::after{
  content:'';
  position:absolute;
  inset:0;
  pointer-events:none;
  background:radial-gradient(ellipse 60% 70% at 88% 20%,rgba(180,85,58,.18),transparent 68%);
}
.pause__inner{position:relative;z-index:1}
.pause__eyebrow{
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  color:rgba(240,201,168,.86);
  text-transform:uppercase;
}
.pause__line{
  margin-top:clamp(22px,3vw,34px);
  font:400 clamp(26px,3.9vw,50px)/var(--lh-lead) var(--hand);
  letter-spacing:var(--ls-title);
  color:var(--on-dark-1);
  max-width:20em;
}
.pause__from{
  margin-top:clamp(22px,3vw,32px);
  padding-top:var(--space-4);
  border-top:1px solid var(--on-dark-line);
  display:inline-block;
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  color:var(--on-dark-3);
}

/* ---------- 声音 ---------- */

/* 05 是全站第一次真正关灯：全宽暗场，波形铺底。
   声音本来就发生在暗处——把页面调暗，比加任何装饰都更贴近内容。 */
.sound{
  position:relative;
  isolation:isolate;
  background:var(--film);
}
/* 章页是纸的，正文才是暗的——关灯发生在章页之后。
   这条带子把纸色化进 --film，让「翻开这一页」有个过渡，
   也顺手抹掉了 papers 纸色直接撞 --film 的那道硬边。
   前 30% 保持实纸色再开始掉，否则中间那段会糊成一层灰雾。 */
.sound-fade{
  height:132px;
  background:linear-gradient(to bottom,
    var(--paper) 0%,
    rgba(247,243,233,.88) 22%,
    rgba(247,243,233,.55) 45%,
    rgba(247,243,233,.26) 68%,
    transparent 100%);
}
.sound-panel{position:relative;color:var(--on-dark-2)}
.sound::before{
  content:'';
  position:absolute;
  inset:0;
  z-index:-1;
  background-image:url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 260 180%27 preserveAspectRatio=%27xMidYMid%20meet%27%3E%3Cg fill=%27%23a9c2b6%27%3E%3Crect x=%272%27 y=%2762.5%27 width=%272%27 height=%2755.0%27/%3E%3Crect x=%277%27 y=%2762.0%27 width=%272%27 height=%2755.9%27/%3E%3Crect x=%2712%27 y=%2745.8%27 width=%272%27 height=%2788.3%27/%3E%3Crect x=%2717%27 y=%2755.0%27 width=%272%27 height=%2770.1%27/%3E%3Crect x=%2722%27 y=%2736.6%27 width=%272%27 height=%27106.7%27/%3E%3Crect x=%2727%27 y=%2737.6%27 width=%272%27 height=%27104.8%27/%3E%3Crect x=%2732%27 y=%2745.7%27 width=%272%27 height=%2788.6%27/%3E%3Crect x=%2737%27 y=%2729.6%27 width=%272%27 height=%27120.9%27/%3E%3Crect x=%2742%27 y=%2747.2%27 width=%272%27 height=%2785.7%27/%3E%3Crect x=%2747%27 y=%2737.1%27 width=%272%27 height=%27105.8%27/%3E%3Crect x=%2752%27 y=%2752.3%27 width=%272%27 height=%2775.4%27/%3E%3Crect x=%2757%27 y=%2755.7%27 width=%272%27 height=%2768.5%27/%3E%3Crect x=%2762%27 y=%2751.8%27 width=%272%27 height=%2776.5%27/%3E%3Crect x=%2767%27 y=%2747.1%27 width=%272%27 height=%2785.8%27/%3E%3Crect x=%2772%27 y=%2763.7%27 width=%272%27 height=%2752.5%27/%3E%3Crect x=%2777%27 y=%2762.5%27 width=%272%27 height=%2754.9%27/%3E%3Crect x=%2782%27 y=%2754.4%27 width=%272%27 height=%2771.2%27/%3E%3Crect x=%2787%27 y=%2746.6%27 width=%272%27 height=%2786.7%27/%3E%3Crect x=%2792%27 y=%2752.6%27 width=%272%27 height=%2774.8%27/%3E%3Crect x=%2797%27 y=%2755.7%27 width=%272%27 height=%2768.7%27/%3E%3Crect x=%27102%27 y=%2744.0%27 width=%272%27 height=%2792.0%27/%3E%3Crect x=%27107%27 y=%2765.0%27 width=%272%27 height=%2750.0%27/%3E%3Crect x=%27112%27 y=%2753.5%27 width=%272%27 height=%2773.1%27/%3E%3Crect x=%27117%27 y=%2760.7%27 width=%272%27 height=%2758.5%27/%3E%3Crect x=%27122%27 y=%2759.0%27 width=%272%27 height=%2761.9%27/%3E%3Crect x=%27127%27 y=%2755.3%27 width=%272%27 height=%2769.4%27/%3E%3Crect x=%27132%27 y=%2746.2%27 width=%272%27 height=%2787.6%27/%3E%3Crect x=%27137%27 y=%2728.0%27 width=%272%27 height=%27124.0%27/%3E%3Crect x=%27142%27 y=%2746.4%27 width=%272%27 height=%2787.2%27/%3E%3Crect x=%27147%27 y=%2734.9%27 width=%272%27 height=%27110.2%27/%3E%3Crect x=%27152%27 y=%2736.1%27 width=%272%27 height=%27107.8%27/%3E%3Crect x=%27157%27 y=%2747.4%27 width=%272%27 height=%2785.1%27/%3E%3Crect x=%27162%27 y=%2747.2%27 width=%272%27 height=%2785.6%27/%3E%3Crect x=%27167%27 y=%2761.9%27 width=%272%27 height=%2756.2%27/%3E%3Crect x=%27172%27 y=%2764.1%27 width=%272%27 height=%2751.7%27/%3E%3Crect x=%27177%27 y=%2762.4%27 width=%272%27 height=%2755.3%27/%3E%3Crect x=%27182%27 y=%2753.0%27 width=%272%27 height=%2774.0%27/%3E%3Crect x=%27187%27 y=%2756.4%27 width=%272%27 height=%2767.2%27/%3E%3Crect x=%27192%27 y=%2756.6%27 width=%272%27 height=%2766.8%27/%3E%3Crect x=%27197%27 y=%2748.1%27 width=%272%27 height=%2783.8%27/%3E%3Crect x=%27202%27 y=%2749.4%27 width=%272%27 height=%2781.3%27/%3E%3Crect x=%27207%27 y=%2752.6%27 width=%272%27 height=%2774.7%27/%3E%3Crect x=%27212%27 y=%2741.9%27 width=%272%27 height=%2796.3%27/%3E%3Crect x=%27217%27 y=%2747.5%27 width=%272%27 height=%2785.1%27/%3E%3Crect x=%27222%27 y=%2761.3%27 width=%272%27 height=%2757.3%27/%3E%3Crect x=%27227%27 y=%2758.4%27 width=%272%27 height=%2763.3%27/%3E%3Crect x=%27232%27 y=%2753.6%27 width=%272%27 height=%2772.8%27/%3E%3Crect x=%27237%27 y=%2740.3%27 width=%272%27 height=%2799.4%27/%3E%3Crect x=%27242%27 y=%2739.7%27 width=%272%27 height=%27100.6%27/%3E%3Crect x=%27247%27 y=%2749.5%27 width=%272%27 height=%2781.0%27/%3E%3Crect x=%27252%27 y=%2731.0%27 width=%272%27 height=%27117.9%27/%3E%3Crect x=%27257%27 y=%2755.5%27 width=%272%27 height=%2769.1%27/%3E%3C/g%3E%3C/svg%3E");
  /* 高度定死、宽度按原图比例算（260:180）：写两个 min() 会把比例拉坏，
     390 下是 202.8×300，竖向被拉 2.14×，波形退化成一片竖条纹。
     桌面原来就是 420×300（比例 1.40 vs 原图 1.444，差 3%），几乎没动；
     只有窄屏会变——tile 变成 433×300，一屏放不满一条，反而是想要的效果。 */
  background-size:auto min(46vh,300px);
  background-repeat:repeat-x;
  background-position:center 62%;
  opacity:.16;
  pointer-events:none;
  -webkit-mask-image:linear-gradient(to bottom,transparent,#000 26%,#000 74%,transparent);
  mask-image:linear-gradient(to bottom,transparent,#000 26%,#000 74%,transparent);
}
.sound-grid{
  display:grid;
  grid-template-columns:minmax(0,.9fr) minmax(0,.72fr) minmax(0,1.08fr);
  gap:clamp(26px,3.4vw,48px);
  align-items:stretch;
}
.sound-intro{display:flex;flex-direction:column;min-width:0}
.sound-intro .sound-preview{margin-top:auto}
.sound-lead{
  font:400 clamp(19px,2vw,24px)/var(--lh-lead) var(--hand);
  letter-spacing:var(--ls-title);
  max-width:18em;
}
.sound-note{
  margin-top:var(--space-4);
  max-width:24em;
  font-size:var(--fs-sm);
  line-height:var(--lh-body);
  color:var(--muted);
}
.sound-art{
  margin-top:0;
  align-self:start;
  justify-self:center;
  padding:var(--space-3) var(--space-3) 0;
  background:var(--paper-soft);
  border:1px solid var(--line-soft);
  box-shadow:var(--shadow-2);
  transform:rotate(-.7deg);
  cursor:pointer;
}
.sound-art__link{display:block;position:relative}
.sound-art.ratio-portrait{
  width:100%;
  max-width:380px;
}
.sound-art.ratio-portrait img{
  aspect-ratio:var(--ar-portrait);
  object-fit:contain;
  background:var(--paper-soft);
}
.sound-art img{
  width:100%;
  aspect-ratio:var(--ar-wide);
  object-fit:cover;
  transition:transform .8s var(--ease);
}
.sound-art:hover img{transform:scale(1.015)}
.sound-art figcaption{
  padding:var(--space-2) 2px var(--space-3);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  color:var(--muted);
}
.sound-preview{
  margin-top:var(--space-5);
  padding-top:var(--space-4);
  border-top:1px solid var(--line);
  display:flex;
  flex-direction:column;
  gap:var(--space-3);
}
.sound-preview__toggle{
  display:flex;
  align-items:center;
  gap:var(--space-3);
  width:fit-content;
  max-width:100%;
  border:0;
  border-bottom:1px solid var(--line);
  background:none;
  border-radius:0;
  padding:2px 0 var(--space-2);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  transition:color .3s ease,border-color .3s ease;
}
.sound-preview__toggle:hover{color:var(--green-ink);border-color:var(--accent-ink)}
.sound-preview.is-playing .sound-preview__toggle{background:none;color:var(--green-ink);border-color:var(--accent-ink)}
.sound-preview__icon{
  width:28px;
  height:28px;
  flex-shrink:0;
  border-radius:50%;
  border:1px solid currentColor;
  display:grid;
  place-items:center;
  opacity:.8;
}
.sound-preview__icon::before{
  content:'';
  width:0;
  height:0;
  border-left:5px solid currentColor;
  border-top:4px solid transparent;
  border-bottom:4px solid transparent;
  margin-left:2px;
}
.sound-preview.is-playing .sound-preview__icon::before{
  width:2px;
  height:9px;
  border:0;
  background:currentColor;
  box-shadow:4px 0 0 currentColor;
  margin-left:-var(--space-1);
}
.sound-preview__label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sound-preview__time{margin-left:auto;font-size:var(--fs-xs);letter-spacing:var(--ls-label);opacity:.6;white-space:nowrap}
.sound-preview__body{
  display:flex;
  align-items:center;
  gap:var(--space-3);
  flex-wrap:wrap;
}
.sound-preview__body p{
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  color:var(--muted);
}
.waveform{
  display:flex;
  align-items:center;
  gap:2px;
  height:18px;
  opacity:.34;
  transition:opacity .4s ease;
}
.sound-preview.is-playing .waveform{opacity:.85}
.waveform i{
  display:block;
  width:2px;
  height:var(--h,20%);
  background:var(--green);
  border-radius:1px;
  transform-origin:center;
}
.sound-preview.is-playing .waveform i{animation:wave 1.4s ease-in-out infinite alternate;animation-delay:calc(var(--i) * -60ms)}
@keyframes wave{
  from{transform:scaleY(.28)}
  to{transform:scaleY(1)}
}
.sound-list-wrap{display:flex;flex-direction:column;min-width:0}
.sound-list-head{
  display:flex;
  justify-content:space-between;
  gap:var(--space-4);
  border-bottom:1px solid var(--line);
  padding-bottom:var(--space-3);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  color:var(--muted);
  text-transform:uppercase;
}
.sound-item{border-bottom:1px solid var(--line)}
.sound-item__head{
  width:100%;
  display:grid;
  grid-template-columns:44px 24px minmax(0,1fr) auto 18px;
  align-items:center;
  gap:var(--space-3);
  padding:clamp(16px,2.2vw,22px) 2px;
  border:0;
  background:none;
  text-align:left;
  transition:padding-left .4s var(--ease),color .25s ease;
}
.sound-item__thumb{
  width:44px;
  aspect-ratio:var(--ar-square);
  overflow:hidden;
  background:var(--tint);
  outline:1px solid var(--hairline);
  outline-offset:-1px;
  display:block;
}
.sound-item__thumb.is-empty{background:none;border:0}
.sound-item__thumb img{width:100%;height:100%;object-fit:cover;transition:transform .8s var(--ease)}
.sound-item__head:hover .sound-item__thumb img{transform:scale(1.05)}
.sound-item__no{font:400 var(--fs-xs)/var(--lh-label) var(--sans);letter-spacing:var(--ls-label);color:var(--muted)}
.sound-item__title{font:400 clamp(20px,2vw,26px)/var(--lh-heading) var(--hand);letter-spacing:var(--ls-title);text-wrap:balance}
.sound-item__meta{font:400 var(--fs-xs)/var(--lh-label) var(--sans);letter-spacing:var(--ls-label);color:var(--muted);white-space:nowrap}
.sound-item__plus{position:relative;width:15px;height:15px;justify-self:end}
.sound-item__plus::before,.sound-item__plus::after{
  content:'';
  position:absolute;
  left:50%;
  top:50%;
  width:14px;
  height:1px;
  background:var(--green);
  transform:translate(-50%,-50%);
  transition:transform .45s var(--ease),background .25s ease;
}
.sound-item__plus::after{transform:translate(-50%,-50%) rotate(90deg)}
.sound-item.is-open .sound-item__plus::after{transform:translate(-50%,-50%) rotate(0deg)}
.sound-item__head:hover{padding-left:8px;color:var(--green-ink)}
.sound-item__head[aria-expanded="true"] .sound-item__title{color:var(--green-ink)}
.sound-item__body{
  display:grid;
  grid-template-rows:0fr;
  transition:grid-template-rows .55s var(--ease);
}
.sound-item.is-open .sound-item__body{grid-template-rows:1fr}
.sound-item__body > div{overflow:hidden}
.sound-item__inner{padding:0 2px 26px 94px}
.sound-item__summary{
  max-width:26em;
  font-size:var(--fs-sm);
  line-height:var(--lh-body);
  color:var(--muted);
}
.sound-item__layers{
  display:grid;
  gap:var(--space-1);
  margin-top:var(--space-3);
  font-size:var(--fs-xs);
  line-height:var(--lh-body);
  color:var(--ink-soft);
}
.sound-item__layers span{border-left:1px solid rgba(31,83,72,.25);padding-left:11px}
.sound-item__inner .line-link{margin-top:18px}

/* 05 暗场：同一套组件，换一套取值。封面仍是纸的——它像一张从暗处递过来的唱片封套。 */
.sound .sound-lead{color:var(--on-dark-1)}
.sound .sound-note{color:var(--on-dark-2)}
.sound .sound-preview{border-top-color:var(--on-dark-line)}
.sound .sound-preview__toggle{border-bottom-color:var(--on-dark-line)}
.sound .sound-preview__toggle:hover,
.sound .sound-preview.is-playing .sound-preview__toggle{color:var(--on-dark-1);border-color:var(--on-dark-accent)}
.sound .sound-preview__body p{color:var(--on-dark-3)}
.sound .waveform i{background:var(--on-dark-accent)}
.sound .sound-list-head{border-bottom-color:var(--on-dark-line);color:var(--on-dark-3)}
.sound .sound-item{border-bottom-color:var(--on-dark-line-soft)}
.sound .sound-item__no,
.sound .sound-item__meta{color:var(--on-dark-3)}
.sound .sound-item__title{color:var(--on-dark-1)}
.sound .sound-item__plus::before,
.sound .sound-item__plus::after{background:var(--on-dark-accent)}
.sound .sound-item__head:hover,
.sound .sound-item__head[aria-expanded="true"] .sound-item__title{color:var(--on-dark-accent)}
.sound .sound-item__summary{color:var(--on-dark-2)}
.sound .sound-item__layers{color:var(--on-dark-2)}
.sound .sound-item__layers span{border-left-color:var(--on-dark-line)}
.sound .sound-item__thumb{background:rgba(247,243,233,.06);border-color:var(--on-dark-line-soft)}
.sound .sound-quote{color:var(--on-dark-accent)}
.sound .sound-quote::before,.sound .sound-quote::after{color:var(--on-dark-3)}
.sound .sound-art{box-shadow:var(--shadow-dark)}
.sound .sound-art figcaption{color:var(--on-dark-3)}
.sound .line-link{color:var(--on-dark-accent);border-color:var(--on-dark-line)}
.sound .line-link:hover{color:var(--on-dark-1);border-color:var(--on-dark-1)}
.sound-quote{
  margin-top:auto;
  padding-top:clamp(38px,6vw,68px);
  font:400 clamp(21px,2.2vw,27px)/var(--lh-lead) var(--hand);
  color:var(--green-ink);
  text-align:right;
  letter-spacing:var(--ls-title);
}
.sound-quote::before{content:'“';color:var(--accent-ink);margin-right:4px}
.sound-quote::after{content:'”';color:var(--accent-ink);margin-left:4px}

/* ---------- 致谢 ---------- */

.thanks{
  background:
    /* 舞台组结尾是纸色，致谢是深墨绿，这里原来是一条直线切下去。
       试过在纸色和墨绿之间做线性渐变：150px 高的过渡会停在一段发灰的
       橄榄绿上，像一层雾压在页脚，比硬边还难看。所以边保持干净，
       只在深色内部压暗顶部 150px——读起来是上面那块亮面投下来的影子。 */
    /* 纸色和墨绿之间没有好看的中点：直接做线性混合，中段会停在一段
       发灰的橄榄绿上，150px 高，像一层雾压在页面底部——试过，比硬边还难看。
       所以不在两个色相之间过渡，只在深色内部压暗：顶部 150px 叠一层更深的墨，
       读起来是上面那块亮面投下来的影子，边还是那条干净的边。 */
    linear-gradient(to bottom,rgba(6,20,18,.5),transparent var(--dissolve)),
    radial-gradient(ellipse 55% 55% at 78% 24%,rgba(72,110,104,.32),transparent 68%),
    radial-gradient(ellipse 42% 40% at 4% 96%,rgba(90,124,117,.16),transparent 70%),
    var(--green-deep);
  color:var(--paper);
  overflow:hidden;
  padding-block:var(--finale-y);
}
.thanks::before{
  content:'谢';
  position:absolute;
  right:-4%;
  top:50%;
  transform:translateY(-50%);
  font:400 clamp(280px,42vw,620px)/1 var(--hand);
  color:rgba(247,243,233,.035);
  pointer-events:none;
  line-height:1;
}
.thanks .eyebrow{color:#b2c9bd}
.thanks h2{
  font-size:clamp(54px,8.4vw,120px);
  line-height:var(--lh-tight);
  letter-spacing:var(--ls-title);
  margin-top:clamp(22px,3vw,34px);
}
.thanks-text{
  max-width:28em;
  margin-top:var(--space-5);
  font-size:var(--fs-base);
  line-height:var(--lh-body);
  color:rgba(247,243,233,.78);
}
.thanks-text + .thanks-text{margin-top:8px}
.thanks-actions{
  display:flex;
  align-items:center;
  flex-wrap:wrap;
  gap:var(--space-5);
  margin-top:clamp(34px,5vw,52px);
}
.round-link--light{border-color:rgba(247,243,233,.35)}
.round-link--light:hover{color:var(--paper);border-color:rgba(247,243,233,.8)}
.quiet-link--light{color:rgba(247,243,233,.76);border-color:rgba(247,243,233,.32);background:none}
.quiet-link--light:hover{color:var(--paper);border-color:var(--paper)}
.thanks-strip{margin:clamp(44px,6vw,72px) 0 0;max-width:var(--shell)}
.thanks-strip__row{
  display:grid;
  grid-template-columns:repeat(4,minmax(0,1fr));
  gap:var(--space-3);
}
.thanks-strip__row button{
  display:block;
  padding:0;
  border:1px solid rgba(247,243,233,.16);
  overflow:hidden;
  background:none;
  transition:transform .6s var(--ease),border-color .4s ease;
}
.thanks-strip__row img{
  display:block;
  width:100%;
  aspect-ratio:var(--ar-photo);
  object-fit:cover;
  filter:brightness(.82) saturate(.62);
  transition:filter .6s ease,transform .9s var(--ease);
}
.thanks-strip__row button:hover{transform:translateY(-3px);border-color:rgba(247,243,233,.42)}
.thanks-strip__row button:hover img{filter:brightness(.98) saturate(.92);transform:scale(1.02)}
.thanks-strip figcaption{
  margin-top:var(--space-3);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  color:rgba(247,243,233,.62);
}
.thanks-sign{
  margin-top:clamp(64px,10vw,110px);
  display:flex;
  align-items:flex-end;
  justify-content:space-between;
  gap:var(--space-5);
  border-top:1px solid rgba(247,243,233,.16);
  padding-top:20px;
}
.thanks-sign span{font:400 clamp(38px,4.4vw,58px)/var(--lh-heading) var(--hand);letter-spacing:var(--ls-label)}
.thanks-sign small{
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  color:rgba(247,243,233,.68);
  text-transform:uppercase;
}
.colophon{
  margin-top:var(--space-4);
  font:400 var(--fs-xs)/var(--lh-lead) var(--sans);
  letter-spacing:var(--ls-label);
  color:rgba(247,243,233,.58);
}
.site-footer{
  background:var(--green-deep);
  color:rgba(247,243,233,.66);
  border-top:1px solid rgba(247,243,233,.12);
}
.site-footer .shell{
  display:flex;
  justify-content:space-between;
  gap:28px;
  padding-block:var(--space-5) calc(28px + var(--safe-b));
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  text-transform:uppercase;
}
.site-footer span:first-child{color:rgba(247,243,233,.8);letter-spacing:var(--ls-label)}

/* ---------- 灯箱 ---------- */

.lightbox{
  border:0;
  padding:0;
  margin:auto;
  max-width:min(1100px,92vw);
  max-height:92vh;
  background:none;
  color:var(--paper);
  overflow:visible;
}
.lightbox::backdrop{
  background:rgba(8,21,18,.9);
  -webkit-backdrop-filter:blur(8px);
  backdrop-filter:blur(8px);
}
.lightbox figure{margin:0;text-align:center}
.lightbox img{
  max-width:100%;
  max-height:80vh;
  width:auto;
  margin-inline:auto;
  box-shadow:var(--shadow-dark);
  background:var(--paper-soft);
}
.lightbox figcaption{
  margin-top:var(--space-3);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  color:rgba(247,243,233,.6);
}
.lightbox-close{
  position:fixed;
  top:22px;
  right:24px;
  display:flex;
  align-items:center;
  gap:var(--space-3);
  border:0;
  background:none;
  color:var(--paper);
  padding:var(--space-2);
  font:400 var(--fs-xs)/1 var(--sans);
  letter-spacing:var(--ls-wide);
  z-index:3;
}
.lightbox-close i{position:relative;width:20px;height:20px}
.lightbox-close i::before,.lightbox-close i::after{
  content:'';
  position:absolute;
  left:2px;
  right:2px;
  top:50%;
  height:1px;
  background:currentColor;
}
.lightbox-close i::before{transform:rotate(45deg)}
.lightbox-close i::after{transform:rotate(-45deg)}
/* 灯箱是全屏深色层，关掉按钮原来只有键盘焦点环、鼠标移上去毫无变化。
   给一点圆形底，让它看起来像可以按。 */
.lightbox-close{
  border-radius:999px;
  transition:background var(--t-fast) var(--ease),color var(--t-fast) var(--ease);
}
.lightbox-close:hover{background:rgba(247,243,233,.14)}
.lightbox-close:active{background:rgba(247,243,233,.24)}
.lightbox-close:focus-visible{outline:1px solid rgba(247,243,233,.65);outline-offset:8px}
.lightbox-nav{
  position:fixed;
  top:50%;
  transform:translateY(-50%);
  display:none;
  align-items:center;
  gap:var(--space-2);
  border:0;
  background:rgba(247,243,233,.08);
  color:var(--paper);
  font:400 var(--fs-xs)/1 var(--sans);
  letter-spacing:var(--ls-wide);
  padding:var(--space-3) var(--space-3);
  transition:background .25s ease,color .25s ease;
}
.lightbox-nav:hover{background:rgba(247,243,233,.16)}
.lightbox-nav span{font-size:var(--fs-sm)}
.lightbox-prev{left:24px}
.lightbox-next{right:24px}
.lightbox.has-group .lightbox-nav{display:flex}
.lightbox[open] figure{animation:lightboxIn .5s var(--ease) both}
@keyframes lightboxIn{from{opacity:0;transform:scale(.97)}to{opacity:1;transform:none}}

.video-lightbox{
  border:0;
  padding:0;
  margin:auto;
  max-width:min(1120px,92vw);
  max-height:88vh;
  background:none;
  color:var(--paper);
  overflow:visible;
}
.video-lightbox::backdrop{
  background:rgba(8,21,18,.92);
  -webkit-backdrop-filter:blur(8px);
  backdrop-filter:blur(8px);
}
.video-lightbox video{
  display:block;
  width:100%;
  max-height:84vh;
  background:#0b1a17;
  box-shadow:var(--shadow-dark);
}
.video-lightbox[open] video{animation:lightboxIn .5s var(--ease) both}

/* ---------- 提示 ---------- */

.toast{
  position:fixed;
  left:50%;
  bottom:26px;
  z-index:250;
  transform:translate(-50%,18px);
  background:var(--ink);
  color:var(--paper);
  padding:var(--space-3) 20px;
  border-radius:999px;
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  opacity:0;
  pointer-events:none;
  transition:opacity .3s ease,transform .4s var(--ease);
  box-shadow:var(--shadow-1);
}
.toast.is-visible{opacity:1;transform:translate(-50%,0)}

/* ---------- 渐显 ---------- */

.js .reveal{
  opacity:0;
  transform:translateY(26px);
  transition:opacity 1.05s var(--ease),transform 1.05s var(--ease);
  transition-delay:var(--delay,0s);
}
.js .reveal.is-inview{opacity:1;transform:none}
.js .reveal.is-inview .chapter-no{transition:color .8s ease}
.js .reveal-figure{
  opacity:0;
  clip-path:inset(6% 6% 6% 6%);
  transition:opacity .9s var(--ease),clip-path 1.15s var(--ease);
}
.js .reveal-figure.is-inview{
  opacity:1;
  clip-path:inset(0 0 0 0);
}

/* ---------- 详情页 ---------- */

.reading-progress{
  position:fixed;
  top:0;
  left:0;
  right:0;
  height:2px;
  z-index:70;
  background:transparent;
  pointer-events:none;
}
.reading-progress span{
  display:block;
  height:100%;
  background:var(--accent);
  transform:scaleX(0);
  transform-origin:left;
  transition:transform .1s linear;
}
.work-main{padding:calc(var(--header-total) + clamp(44px,7vw,80px)) 0 clamp(70px,10vw,120px);min-height:80vh}
.work-container{
  width:min(1180px,calc(100% - var(--gutter) * 2));
  margin-inline:auto;
}
.work-top{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--space-5);
  border-bottom:1px solid var(--line);
  padding-bottom:var(--space-4);
  margin-bottom:clamp(30px,4.4vw,54px);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  text-transform:uppercase;
  color:var(--muted);
}
.work-top a{color:var(--green-ink)}
.work-banner{
  position:relative;
  isolation:isolate;
  overflow:hidden;
  display:grid;
  grid-template-columns:minmax(0,1.16fr) minmax(0,.84fr);
  min-height:clamp(320px,44vh,480px);
  background:var(--green-deep);
  color:var(--paper);
  border:1px solid rgba(18,48,43,.28);
}
.work-banner__wash{
  position:absolute;
  inset:0;
  z-index:0;
  pointer-events:none;
  background:radial-gradient(ellipse 70% 90% at 6% 0%,rgba(180,85,58,.18),transparent 62%);
}
.work-banner__inner{
  position:relative;
  z-index:1;
  display:flex;
  flex-direction:column;
  justify-content:flex-end;
  padding:clamp(30px,4.4vw,56px) clamp(24px,3.6vw,52px);
}
.work-banner__kicker{
  display:flex;
  align-items:center;
  flex-wrap:wrap;
  gap:var(--space-2) var(--space-4);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  text-transform:uppercase;
  color:rgba(247,243,233,.72);
}
.work-banner__kicker span + span::before{
  content:'·';
  margin-right:var(--space-4);
  color:rgba(247,243,233,.4);
}
.work-banner__award{
  padding:var(--space-1) var(--space-2);
  border:1px solid rgba(232,179,140,.5);
  border-radius:999px;
  color:#f0c9a8;
  letter-spacing:var(--ls-wide);
}
.work-banner__award::before{content:none!important;margin:0!important}
.work-banner__title{
  font:400 clamp(34px,4.6vw,64px)/var(--lh-heading) var(--hand);
  letter-spacing:var(--ls-title);
  margin-top:var(--space-3);
  color:var(--paper);
  overflow-wrap:break-word;
}
.work-banner__lead{
  margin-top:var(--space-4);
  max-width:26em;
  font:400 clamp(15px,1.4vw,17px)/var(--lh-body) var(--hand);
  color:rgba(247,243,233,.82);
}
.work-banner__meta{
  display:flex;
  flex-wrap:wrap;
  gap:var(--space-2) 20px;
  margin-top:var(--space-5);
  padding-top:var(--space-4);
  border-top:1px solid rgba(247,243,233,.18);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  color:rgba(247,243,233,.6);
}
.font-size{
  display:inline-flex;
  align-items:center;
  gap:2px;
  margin-left:auto;
  padding:2px;
  border:1px solid rgba(247,243,233,.22);
  border-radius:999px;
}
.font-size button{
  /* 原来是 32px 宽、19px 高，触屏上根本点不准。
     三个字是「小 / 中 / 大」，是详情页唯一需要反复点的控件。 */
  min-width:40px;
  min-height:32px;
  display:grid;
  place-items:center;
  padding:0;
  border:0;
  border-radius:999px;
  background:none;
  color:rgba(247,243,233,.62);
  /* 11px 在 40×32 的格子里显得空，13px 才撑得住 */
  font:400 var(--fs-sm)/1 var(--sans);
  letter-spacing:var(--ls-label);
  transition:background .3s ease,color .3s ease;
}
.font-size button:hover{color:var(--paper)}
.font-size button[aria-pressed="true"]{background:rgba(247,243,233,.16);color:var(--paper)}
.work-banner__note{
  margin-top:var(--space-3);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  color:rgba(247,243,233,.55);
}
.work-banner__cover{
  position:relative;
  margin:0;
  z-index:1;
  overflow:hidden;
  display:flex;
  align-items:center;
  justify-content:center;
  padding:clamp(18px,2.6vw,34px);
  background:rgba(8,26,22,.42);
  box-shadow:inset 1px 0 0 rgba(247,243,233,.12);
}
.work-banner__cover .image-toggle{
  display:flex;
  align-items:center;
  justify-content:center;
  width:100%;
  height:100%;
  padding:0;
  border:0;
  background:none;
  cursor:zoom-in;
}
.work-banner__cover .image-toggle img{
  display:block;
  width:auto;
  height:auto;
  max-width:100%;
  max-height:clamp(240px,34vh,400px);
  aspect-ratio:auto;
  object-fit:contain;
  filter:saturate(1.04) contrast(1.02) drop-shadow(0 18px 34px rgba(0,0,0,.35));
  transition:transform 1.1s var(--ease);
}
.work-banner__cover:hover .image-toggle img{transform:scale(1.03)}
.work-banner__play{position:relative;cursor:pointer}
.banner-play{
  position:absolute;
  left:50%;
  top:50%;
  transform:translate(-50%,-50%);
  z-index:2;
  display:inline-flex;
  align-items:center;
  gap:var(--space-2);
  padding:var(--space-3) 20px var(--space-3) var(--space-4);
  border:1px solid rgba(247,243,233,.55);
  border-radius:999px;
  background:rgba(12,38,33,.62);
  backdrop-filter:blur(4px);
  font:400 12px/1 var(--sans);
  letter-spacing:var(--ls-caps);
  color:var(--paper);
  transition:background .35s ease,border-color .35s ease,transform .45s var(--ease);
}
.banner-play::before{
  content:'';
  width:0;
  height:0;
  border-left:9px solid currentColor;
  border-top:6px solid transparent;
  border-bottom:6px solid transparent;
}
.work-banner__play:hover .banner-play{
  background:rgba(180,85,58,.82);
  border-color:rgba(247,243,233,.85);
  transform:translate(-50%,-50%) scale(1.04);
}
.work-banner__caption{
  position:absolute;
  left:0;
  right:0;
  bottom:0;
  padding:var(--space-5) 20px var(--space-3);
  text-align:center;
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  color:rgba(247,243,233,.82);
}
.work-epigraph{
  display:grid;
  grid-template-columns:minmax(0,.92fr) minmax(0,1.08fr);
  gap:clamp(20px,3vw,48px);
  margin-top:clamp(28px,3.6vw,46px);
  padding:clamp(26px,3.4vw,42px) clamp(22px,3vw,40px);
  background:var(--tint);
  border:1px solid var(--line-soft);
}
.work-epigraph__text{
  font-size:clamp(21px,2.4vw,29px);
  line-height:var(--lh-label);
  letter-spacing:var(--ls-title);
}
.work-epigraph__from{
  display:block;
  margin-top:var(--space-3);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  font-style:normal;
  letter-spacing:var(--ls-caps);
  color:var(--muted);
}
.work-epigraph__note p{
  font-size:var(--fs-sm);
  line-height:var(--lh-body);
  color:var(--muted);
}
.work-epigraph__note p + p{margin-top:.85em}
/* 没有创作手记时题记只有一个子元素，两列会空掉一列 */
.work-epigraph--solo{grid-template-columns:minmax(0,1fr)}
.work-epigraph--solo .work-epigraph__inner{max-width:var(--measure)}
.work-layout{
  display:grid;
  /* 两侧栏 173px（12vw）→ 152px 上限（10.6vw），栏间距 64 → 44。
     没有收到评审建议的 140：左栏是场次目录，140 下《百元大钞》的短场名
     从「每条 1 行」变成「平均 1.75 行」，520px 框里可见条数 16.8 → 13.3，
     等于把 P1-3 要加回来的可见条数先扣掉了；两个剧本实测只有《她的秋》
     （49 场、场名本身就长）对栏宽不敏感，11.6 vs 10.6 条。
     152 是折中：占比 56% → 63%，同时两个剧本的可见场次都涨。
     左右仍等宽——正文现在精确居中（.work-article 与 .works-nav 中心偏移 0），
     改成左宽右窄会把它推离容器中心 35px。 */
  grid-template-columns:clamp(140px,10.6vw,152px) minmax(0,var(--measure)) clamp(140px,10.6vw,152px);
  justify-content:center;
  gap:clamp(28px,3vw,44px);
  align-items:start;
}
/* grid item 的 min-width:auto 会在大字号下把中栏撑破，
   显式给 0；font-size 显式写出来，让栏内 em 跟着档位走。 */
.work-article{min-width:0;font-size:var(--fs-body)}
.work-toc{
  position:sticky;
  top:calc(var(--header-total) + 28px);
  padding-top:var(--space-1);
}
.work-toc p{
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  color:var(--muted);
  text-transform:uppercase;
  margin-bottom:var(--space-3);
}
.work-toc a{
  display:block;
  padding:var(--space-2) 0;
  font-size:var(--fs-sm);
  line-height:var(--lh-label);
  color:var(--muted);
  border-left:1px solid transparent;
  padding-left:var(--space-3);
  transition:color .25s ease,border-color .25s ease;
}
.work-toc a:hover,.work-toc a.is-active{color:var(--green-ink);border-left-color:var(--accent-ink)}
.toc-scenes-readout{
  display:block;
  margin-top:var(--space-1);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  color:var(--accent-ink);
  text-transform:none;
}
.toc-scenes{
  list-style:none;
  margin:0 0 var(--space-3);
  padding:0;
  /* 34vh/280px 只放得下 10 条，一个剧本 49 场，要滚五次才到底。
     放宽到 70vh/640px，但还要减掉侧栏自己的开销：sticky 顶 112
     （--header + 28）+ 标签与章链实测 210px。矮屏不减会把列表底部
     顶出视口——900 高时侧栏底边只剩 58px 余量，1280×800 只剩 14px。
     三档取最小，1080 以上拿到满 640，900/800/768 自动让到 554/454/422。
     238 → 262 是给侧栏底部留 24px 呼吸，否则最后一条正好贴视口边缘。 */
  max-height:min(70vh,640px,calc(100vh - var(--header-total) - 262px));
  overflow-y:auto;
  overscroll-behavior:contain;
  scrollbar-width:thin;
  /* 3px/.22 对纸色只有约 1.2:1，等于没有滚动条；6px/.38 约 2.4:1 */
  scrollbar-color:rgba(30,47,42,.38) transparent;
}
.toc-scenes::-webkit-scrollbar{width:6px}
.toc-scenes::-webkit-scrollbar-thumb{background:rgba(30,47,42,.38);border-radius:3px}
.toc-scenes a{
  display:block;
  padding:var(--space-1) var(--space-1) var(--space-1) var(--space-2);
  /* 场次名不再截断：`1.2 付家张淑真卧室-日-内（回忆）` 17 字，
     180px 栏宽也放不下，截断后每条都长得一样，认不出是哪一场。 */
  overflow-wrap:break-word;
  border-left:1px solid var(--line-soft);
  font:400 var(--fs-sm)/var(--lh-label) var(--sans);
  color:var(--muted);
  transition:color .2s ease,border-color .2s ease;
}
.toc-scenes a:hover{color:var(--green-ink)}
.toc-scenes a.is-active{
  color:var(--green-ink);
  border-left-color:var(--accent);
  box-shadow:inset 1px 0 0 var(--accent);
}

/* 场次索引：≤980px 侧栏整列消失后，这是唯一的场次导航。
   在文档流里、可折叠、不跟随滚动——不做吸顶条也不做浮动按钮。 */
.scene-index{
  display:none;
  margin:0 0 clamp(28px,4vw,40px);
  border:1px solid var(--line-soft);
  background:var(--paper-soft);
}
.scene-index summary{
  padding:var(--space-3) var(--space-4);
  font:500 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  color:var(--green-ink);
  cursor:pointer;
  list-style:none;
}
.scene-index summary::-webkit-details-marker{display:none}
.scene-index summary::after{content:'＋';float:right;color:var(--accent-ink)}
.scene-index[open] summary::after{content:'−'}
.scene-index[open] summary{border-bottom:1px solid var(--line-soft)}
.scene-index__list{
  margin:0;
  padding:var(--space-2) var(--space-4) var(--space-3);
  list-style:none;
  max-height:min(62vh,560px);
  overflow-y:auto;
  overscroll-behavior:contain;
  scrollbar-width:thin;
  scrollbar-color:rgba(30,47,42,.38) transparent;
}
/* 场次名自带「1.」「2.1」编号，这里不再加一层计数器，否则会变成「1. 1.田埂-日-外」 */
.scene-index__list a{
  display:block;
  padding:var(--space-2) 0;
  font:400 var(--fs-sm)/var(--lh-label) var(--sans);
  color:var(--ink-soft);
  border-bottom:1px solid var(--line-soft);
}
.scene-index__list li:last-child a{border-bottom:0}
.scene-index__back{display:none}
@media(max-width:980px){
  .scene-index{display:block}
  .scene-index__back{
    display:inline-block;
    margin-top:var(--space-5);
    padding-bottom:2px;
    font:400 var(--fs-xs)/var(--lh-label) var(--sans);
    letter-spacing:var(--ls-label);
    color:var(--muted);
    border-bottom:1px solid var(--line-soft);
  }
}
.work-header{padding-top:4px}
.work-header h1{
  font-size:clamp(40px,5.6vw,72px);
  line-height:var(--lh-heading);
  letter-spacing:var(--ls-title);
  margin-top:var(--space-3);
  overflow-wrap:break-word;
}
.work-lead{
  font:400 clamp(19px,2vw,24px)/var(--lh-lead) var(--hand);
  color:var(--ink-soft);
  margin-top:20px;
  max-width:20em;
}
.work-head-meta{
  display:flex;
  flex-wrap:wrap;
  gap:var(--space-2) var(--space-5);
  border-top:1px solid var(--line);
  margin-top:28px;
  padding-top:var(--space-3);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  color:var(--muted);
  text-transform:uppercase;
}
.work-demo-note{
  font-size:var(--fs-sm);
  line-height:var(--lh-script);
  color:var(--muted);
  padding-left:var(--space-3);
  border-left:1px solid var(--accent);
  margin-top:var(--space-5);
}
.work-award{
  margin-top:var(--space-4);
  padding:var(--space-3) var(--space-4);
  border-left:2px solid var(--accent);
  background:rgba(124,153,144,.07);
  font:400 var(--fs-xs)/var(--lh-lead) var(--sans);
  letter-spacing:var(--ls-title);
  color:var(--ink-soft);
}
.work-award span{
  display:block;
  margin-bottom:var(--space-1);
  font-size:var(--fs-xs);
  letter-spacing:var(--ls-caps);
  color:var(--accent-ink);
}
.work-figure{margin:clamp(34px,4.6vw,52px) 0}
.work-figure .work-image{outline:1px solid var(--line-soft);outline-offset:-1px}
.work-figure img{aspect-ratio:var(--ar-film)}
.work-figure .illustration-caption{
  display:flex;
  justify-content:space-between;
  gap:var(--space-4);
  flex-wrap:wrap;
  margin-top:var(--space-2);
}
.image-toggle{
  display:block;
  width:100%;
  padding:0;
  border:0;
  background:none;
  text-align:inherit;
  cursor:zoom-in;
}
.image-toggle[aria-expanded="true"]{cursor:zoom-out}
.image-toggle img{
  width:100%;
  aspect-ratio:var(--ar-film);
  object-fit:cover;
  transition:filter .25s ease;
}
.image-toggle:hover img{filter:brightness(.98)}
.image-toggle[aria-expanded="true"] img{aspect-ratio:auto;object-fit:contain}
.image-hint{font:400 var(--fs-xs)/var(--lh-label) var(--sans);letter-spacing:var(--ls-label);color:var(--accent-ink)}
.work-figure.ratio-portrait,
.work-figure.ratio-square{
  width:100%;
  max-width:560px;
  margin-inline:auto;
}
.work-figure.ratio-portrait .image-toggle img{
  aspect-ratio:var(--ar-portrait);
  object-fit:contain;
  background:var(--paper-soft);
}
.work-figure.ratio-square .image-toggle img{
  aspect-ratio:var(--ar-square);
  object-fit:contain;
  background:var(--paper-soft);
}
.work-figure.ratio-landscape .image-toggle img{
  aspect-ratio:var(--ar-film);
  object-fit:cover;
}
.work-reading{padding-top:clamp(4px,1vw,12px)}
.work-reading .media-status{
  background:rgba(31,83,72,.06);
  border:1px solid var(--line-soft);
}
.work-reading .status-mark{border-color:rgba(31,83,72,.3);color:var(--green-ink)}
.work-reading .media-status strong{color:var(--ink-soft)}
.work-reading .media-status p{color:var(--muted)}
.reading-section + .reading-section{margin-top:clamp(38px,5vw,54px)}
.reading-section h2{
  font-size:clamp(22px,2.3vw,28px);
  margin-bottom:var(--space-4);
  position:relative;
  padding-left:var(--space-4);
}
.reading-section__no{
  display:inline-block;
  margin-right:var(--space-3);
  font:400 var(--fs-xs)/1 var(--sans);
  letter-spacing:var(--ls-wide);
  color:var(--accent-ink);
  vertical-align:2px;
}
.reading-section h2::before{
  content:'';
  position:absolute;
  left:0;
  top:.55em;
  width:7px;
  height:1px;
  background:var(--accent);
}
.js .reading-section h2::before{
  transform:scaleX(0);
  transform-origin:left;
  transition:transform .8s var(--ease) .15s;
}
.js .reading-section h2.is-inview::before{transform:scaleX(1)}
.reading-section p{
  font-size:var(--fs-body);
  line-height:var(--lh-body);
  /* 段距用 em：固定 16px 在 15px 下是 1.07em、19px 下只有 .84em，
     密度会跟着档位漂。.94em 三档都是同一个视觉间距。 */
  margin-top:.94em;
  overflow-wrap:break-word;
  color:var(--ink-soft);
}
/* 散文与研读正文：中文惯例首行缩进 2em。缩进本身已经把段切开，
   段距就可以从 .94em 收到 .85em——17px 下 16px → 14.45px。
   不再往下压：1.9 的行高下再收到 .75em（12.75px）整块字会糊成一片。
   剧本不缩进：舞台提示靠 padding-left 对齐台词列，再缩 2em 会脱离那一列。 */
.reading-section:not(.reading-section--script) > p{
  text-indent:2em;
  margin-top:.85em;
}
/* 中文书籍惯例：正文两端对齐。左对齐下纯中文每行右缘自然漂移 ±1 字
   （实测一段五行相差 27px），读感是「每行结尾不对应」；justify 后
   只有段末行例外，与纸书一致。text-spacing-trim 压缩相邻全角标点，
   防 justify 把引号空洞撑宽（Chrome 123+ 渐进增强，旧浏览器忽略）。 */
.reading-section:not(.reading-section--script) > p{
  text-align:justify;
  text-spacing-trim:space-first;
}
/* 剧本保持左对齐（台词列短行多，justify 会拉出大洞），
   用 pretty 避免段末一两个字孤悬成行；孤行防护全站生效。 */
.reading-section--script :is(p,dd){
  text-wrap:pretty;
}
.reading-section :is(p,dd){
  orphans:2;
  widows:2;
}
.reading-subhead{
  display:flex;
  align-items:baseline;
  gap:var(--space-2);
  margin-top:clamp(26px,3vw,34px);
  /* 上限 21px：19px 对 17px 正文只有 1.12 倍，层级全靠字体族硬撑；
     21px 后有 1.24 倍的尺寸差可依。 */
  font:400 clamp(17px,1.6vw,21px)/var(--lh-label) var(--hand);
  letter-spacing:var(--ls-title);
  color:var(--green-ink);
}
.reading-subhead::before{
  content:'';
  width:14px;
  height:1px;
  flex:0 0 auto;
  background:var(--accent);
  transform:translateY(-.32em);
}
/* 场次标题。这条是通配的（首页剧本卡也在用），不要写 !important：
   剧本正文里的覆盖规则靠选择器长度赢，不靠权重标记。 */
.script-scene{
  color:var(--green-ink);
  font:500 var(--fs-xs)/var(--lh-lead) var(--sans);
  letter-spacing:var(--ls-wide);
  margin-top:var(--space-6);
  margin-bottom:var(--space-4);
  padding-left:0;
}
.dialogue{
  margin:20px 0;
  padding-left:var(--space-5);
  border-left:1px solid var(--line);
}
.dialogue dt{
  font:400 12px/var(--lh-label) var(--hand);
  color:var(--accent-ink);
  letter-spacing:var(--ls-label);
}
.dialogue dd{
  margin:var(--space-1) 0 0;
  font:400 var(--fs-body)/var(--lh-body) var(--hand);
  overflow-wrap:break-word;
}

/* 剧本全文：角色名右对齐成一列，台词在右栏，场次与舞台提示与台词左边缘对齐。
   三层全部用 em，挂在 --fs-body 上：字号档位一变，三层的比例不变。
   17px 下 角色名/舞台提示 13px、场次标题 11px，与原来的固定值一致；
   19px 下变成 14.5 / 14.5 / 12.3，而不再被拉成 19 / 13 / 11。
   列宽 5.6em 而不是写死 88px：88÷13=6.8 字，四字名刚好、六字名要换行，
   但换成 em 后每一档都是 6.8 字，不会在大字号下突然放不下。 */
/* 写成 .reading-section.reading-section--script 而不是单类名：
   上面的 .reading-section + .reading-section 是 0-2-0，单类名只有 0-1-0，
   剧本分节会拿回散文的 54px，自己声明的 68px 永远不生效。
   同权重靠顺序赢——这条在后面，安全。 */
.reading-section.reading-section--script{
  margin-top:clamp(44px,6vw,68px);
  /* 列宽、列间距、缩进都用 --fs-body 的倍数算，不用 em。
     舞台提示自己只有 .765 倍字号，用 em 会按 13px 解析，缩进就比台词短一截
     ——三层的左边缘必须落在同一个 x 上。 */
  --script-col:calc(var(--fs-body) * 5.6);
  --script-gap:calc(var(--fs-body) * 1.06);
  --script-indent:calc(var(--fs-body) * 6.66);
  --script-small:calc(var(--fs-body) * .765);
}
.reading-section--script .dialogue{
  display:grid;
  grid-template-columns:var(--script-col) minmax(0,1fr);
  gap:0 var(--script-gap);
  margin:var(--space-3) 0;
  padding-left:0;
  border-left:0;
}
.reading-section--script .dialogue dt{
  text-align:right;
  font:400 var(--script-small)/var(--lh-label) var(--hand-text);
  color:var(--accent-ink);
  letter-spacing:var(--ls-title);
  /* 允许换行：全站 400 多个角色名里有 8 字的一个，截断不给 title 等于丢字 */
  white-space:normal;
  overflow-wrap:break-word;
}
.reading-section--script .dialogue dd{
  margin:0;
  font:400 var(--fs-body)/var(--lh-script) var(--hand-text);
}
/* 舞台提示。:not(.script-scene) 把场次标题摘出去，
   两条规则各管各的，就不需要用 !important 互相压。 */
.reading-section--script > p:not(.script-scene){
  padding-left:var(--script-indent);
  /* 舞台提示原来没有 font-family，一路继承 body 的宋体，
     和楷体台词混在一页里是两种笔迹。这里显式写文楷。 */
  font-family:var(--hand-text);
  font-size:var(--script-small);
  line-height:var(--lh-script);
  color:var(--muted);
  margin-top:var(--space-3);
}
.reading-section--script > p:first-of-type{color:var(--muted)}
.reading-section--script > .script-scene{
  padding-left:0;
  font-size:calc(var(--fs-body) * .647);
  /* 上 2.35em / 下 .35em：靠这段呼吸差把场次切开，不靠符号。
     分隔线用 --line 而不是 --line-soft——后者对纸色只有约 1.15:1，等于没有。 */
  margin-top:2.35em;
  margin-bottom:.35em;
  padding-bottom:.55em;
  border-bottom:1px solid var(--line);
}
.reading-section--script > .script-scene:first-child{margin-top:6px}
.work-end{
  margin-top:clamp(50px,7vw,76px);
  border-top:1px solid var(--line);
  padding-top:var(--space-5);
  display:flex;
  justify-content:space-between;
  gap:20px;
  align-items:center;
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-wide);
  color:var(--muted);
}
.work-end .line-link{font-size:var(--fs-sm)}
/* ≤1240px 右栏（含「回到顶部」）整列隐藏，文末补一个出口。
   只在需要时出现，宽屏上右栏已经有了，不重复。 */
.work-end__top{
  display:none;
  padding:0 0 2px;
  border:0;
  border-bottom:1px solid var(--line-soft);
  background:none;
  font:inherit;
  letter-spacing:var(--ls-label);
  color:var(--green-ink);
  transition:color var(--t-fast) var(--ease-soft);
}
.work-end__top:hover{color:var(--accent-ink)}
@media(max-width:1240px){.work-end__top{display:inline-block}}
.work-gallery{
  margin-top:clamp(42px,6vw,60px);
  padding-top:clamp(26px,4vw,38px);
  border-top:1px solid var(--line);
  display:grid;
  grid-template-columns:repeat(2,minmax(0,1fr));
  gap:clamp(14px,2vw,22px);
}
.work-gallery__item{min-width:0}
.work-gallery__button{
  display:block;
  width:100%;
  padding:0;
  border:0;
  background:var(--paper-soft);
  outline:1px solid var(--line-soft);
  outline-offset:-1px;
  overflow:hidden;
  cursor:zoom-in;
}
.work-gallery__button img{
  width:100%;
  aspect-ratio:var(--ar-photo);
  object-fit:cover;
  transition:transform .7s var(--ease),filter .3s ease;
}
.work-gallery__button:hover img{transform:scale(1.025);filter:brightness(.98)}
.work-gallery__item figcaption{
  margin-top:var(--space-2);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  color:var(--muted);
}
.work-gallery__item:last-child:nth-child(odd){grid-column:1/-1}
.work-gallery__item:last-child:nth-child(odd) .work-gallery__button img{aspect-ratio:var(--ar-film)}
.works-nav{
  margin-top:clamp(56px,8vw,90px);
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:clamp(28px,4vw,64px);
  border-top:1px solid var(--line);
  padding-top:clamp(22px,3vw,30px);
}
.works-nav__link{
  display:flex;
  flex-direction:column;
  gap:var(--space-2);
  min-width:0;
}
.works-nav__prev{align-items:flex-start;text-align:left}
.works-nav__next{align-items:flex-end;text-align:right}
.works-nav__link small{
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-caps);
  color:var(--muted);
  text-transform:uppercase;
  white-space:nowrap;
}
.works-nav__row{
  display:flex;
  align-items:baseline;
  gap:var(--space-3);
  min-width:0;
}
.works-nav__title{
  /* 30px 在 282px 的列里每行只放得下 9 个字，《日掛中天：日挂中天上 爱恨
     无尽时》会断成「日掛中天：日挂中天 / 上 爱恨无尽时」——把「天上」
     拆开。24px 后第一行能装到那个空格处再断。不要加 text-wrap:balance：
     它把两行拉平，反而断在「日挂中 / 天上」，比不处理更糟。 */
  font:400 clamp(19px,1.7vw,24px)/var(--lh-heading) var(--hand);
  letter-spacing:var(--ls-title);
  transition:color .25s ease;
  /* keep-all 让中文标题只在空格处断行：《日掛中天：日挂中天上 爱恨无尽时》
     于是断成「…日挂中天上 / 爱恨无尽时」，不再把「天上」或「爱恨」拆开。
     整串比一列还长时由 overflow-wrap 接回普通断行，不会溢出。
     不要加 text-wrap:balance——它会把两行拉平，反而断在「日挂中 / 天上」。 */
  word-break:keep-all;
  overflow-wrap:break-word;
}
.works-nav__arrow{
  color:var(--green-ink);
  font-size:16px;
  transition:transform .4s var(--ease);
}
.works-nav__link:hover .works-nav__title{color:var(--green-ink)}
.works-nav__prev:hover .works-nav__arrow{transform:translateX(-5px)}
.works-nav__next:hover .works-nav__arrow{transform:translateX(5px)}
.work-side{
  position:sticky;
  top:calc(var(--header-total) + 28px);
  display:flex;
  flex-direction:column;
  align-items:flex-end;
  gap:var(--space-4);
  padding-top:var(--space-1);
}
.work-side button{
  border:1px solid var(--line);
  background:rgba(253,250,243,.6);
  border-radius:50%;
  width:44px;
  height:44px;
  display:grid;
  place-items:center;
  font-size:14px;
  transition:background .3s ease,color .3s ease,transform .3s ease;
}
.work-side button:hover{background:var(--green);color:var(--paper);transform:translateY(-2px)}
.work-side-copy{font:400 var(--fs-xs)/1 var(--sans)!important;letter-spacing:var(--ls-label)}
.work-side-copy svg{width:15px;height:15px;display:block}
.work-side .side-label{
  writing-mode:vertical-rl;
  font:400 var(--fs-xs)/1 var(--sans);
  letter-spacing:var(--ls-caps);
  color:var(--muted);
  margin-top:var(--space-1);
}
.detail-sound-art{
  width:min(560px,100%);
  margin:0 auto clamp(34px,4vw,48px);
  padding:var(--space-2) var(--space-2) 0;
  background:var(--paper-soft);
  border:1px solid var(--line-soft);
}
.detail-sound-art img{width:100%}
.detail-sound-art figcaption{
  padding:var(--space-2) 2px var(--space-2);
  font:400 var(--fs-xs)/var(--lh-label) var(--sans);
  letter-spacing:var(--ls-label);
  color:var(--muted);
}
body[data-category="essays"] .work-header{
  border-top:1px solid var(--line);
  padding-top:var(--space-5);
}
body[data-category="essays"] .work-lead{font-family:var(--serif);font-style:normal}
body[data-category="films"] .work-figure{
  padding:var(--space-3);
  background:var(--film);
}
body[data-category="films"] .work-figure .illustration-caption,
body[data-category="films"] .image-hint{color:rgba(247,243,233,.7)}
body[data-category="scripts"] .work-header{
  border-left:1px solid var(--line);
  padding-left:clamp(18px,2.4vw,28px);
}
.download-link{margin-top:38px}
.not-found{
  padding-block:var(--space-8);
  max-width:var(--measure);
  margin:auto;
}
.not-found h1{font-size:var(--fs-lg)}
.not-found p{color:var(--muted);font-size:var(--fs-body);margin-top:18px}
.not-found a{margin-top:25px}

/* ---------- 按下 ---------- */

/* 全站此前没有任何 :active 反馈：悬停有 65 处，按下 0 处。
   触屏上点完毫无变化，会显得页面没反应。这里补最轻的一档：1px 下沉或一点底色。 */
.round-link:active,.quiet-link:active,.line-link:active{transform:translateY(1px)}
.header-nav a:active{opacity:.65}
.menu-toggle:active .menu-icon{transform:translateY(1px)}
.room:active{background:rgba(30,47,42,.045)}
.postcard:active{transform:translate3d(var(--px),calc(var(--py) + 1px),0) rotate(var(--rot)) scale(.994)}
.film-play:active{transform:translate(-50%,-50%) scale(.97)}
.sound-item__head:active{background:rgba(30,47,42,.045)}
.sound .sound-item__head:active{background:rgba(247,243,233,.06)}
.script-card .script-media:active img{transform:scale(1.008)}
.index-list a:active{background:rgba(30,47,42,.05)}

/* 兜底：上面逐条点名的是最常按的十几处，但全站还有二十来个可点元素
   （灯箱上一张 / 下一张、播放控制、复制链接、场次索引折叠头、致谢里那排
   照片……）都没有按下反馈。用 :where() 给零权重的一档统一补上，
   任何写了 :active 的地方都能原样压掉它，不需要 !important。
   不用 transform：很多元素身上已经有 translate，叠加会把位置挪错。 */
:where(a,button,summary,[role="button"]):active{opacity:.86}

/* ---------- 触控目标补到 44px ---------- */

/* 全站扫下来最短边 < 27px 的可点元素就这六类：页眉导航条目（「关于」只有
   26.6px 宽）、站名（27px 高）、详情页面包屑（18px 高）、文末「回到顶部」
   与「回到场次索引」（21px 高）、首屏「向下浏览」（11px 高）。
   一律用绝对定位的伪元素向外扩，不动内边距：加 padding 会把 .header-inner /
   .work-top / .work-end 这些容器一起撑高，版面要跟着挪；伪元素不参与布局。
   横向只扩到刚好不侵占相邻间隔的一半——页眉导航项间距 clamp(16px,2.2vw,30px)，
   ≥980px 时最小 21.6px，扩 9px 不会撞上邻居。 */
.header-nav a::before{content:'';position:absolute;inset:-6px -9px}
.wordmark{position:relative}
.wordmark::before{content:'';position:absolute;inset:-11px 0}
.work-top a{position:relative}
.work-top a::before{content:'';position:absolute;inset:-13px 0}
.scene-index__back{position:relative}
.scene-index__back::before{content:'';position:absolute;inset:-12px 0}
.work-end__top{position:relative}
.work-end__top::before{content:'';position:absolute;inset:-12px 0}
.scroll-cue{position:relative}
.scroll-cue::before{content:'';position:absolute;inset:-17px 0}

/* ---------- 断点 ---------- */

@media(min-width:1600px){
  :root{--shell:1400px;--gutter:84px}
  .hero-stage{height:clamp(500px,64vh,640px)}
}

@media(max-width:1240px){
  .header-edition{display:none}
  .hero-inner{grid-template-columns:minmax(0,.98fr) minmax(0,1.02fr)}
  .hero h1{font-size:clamp(58px,7.3vw,100px)}
  .about-grid{gap:48px}
  .chapter-head{grid-template-columns:70px minmax(0,1fr) minmax(180px,.4fr)}
  /* 横幅不在这里塌成单列：1240 这一档只是正文两侧栏站不住，
     横幅双列（1.16fr/.84fr）在 1024 下仍有 470/340 可用。
     塌成单列后封面区变成整幅 1124px 宽、里面只放一张 400px 的图，
     方形封面填充率掉到 35.6%，横幅高度却从 417px 涨到 778px。
     堆叠推到 ≤980，那时容器窄了，空洞比例自然小一半。 */
  /* 两栏档：右栏整列消失，左栏是唯一的场次导航，
     所以下限比三栏档宽一点（132 而不是 140 都不到时取 132）。 */
  .work-layout{grid-template-columns:clamp(132px,11vw,152px) minmax(0,var(--measure))}
  .work-side{display:none}
  .sound-item__meta{display:none}
}

@media(max-width:980px){
  :root{--header:72px;--fs-body-base:16px}
  .header-inner{grid-template-columns:1fr auto}
  .header-nav{display:none}
  .header-tools{gap:16px}
  .menu-toggle{display:flex}
  .hero-inner{
    grid-template-columns:1fr;
    align-content:center;
    gap:clamp(16px,3vh,28px);
    padding-top:clamp(18px,4vh,40px);
  }
  .hero-copy{padding-left:0}
  .hero h1{font-size:clamp(58px,12vw,112px)}
  .hero-quote{font-size:clamp(21px,3.4vw,28px)}
  .hero-intro{max-width:26em}
  .hero-stage{
    height:clamp(400px,54vh,540px);
    width:min(620px,100%);
    margin-inline:auto;
  }
  .hero-foot{padding-block:14px 16px}
  .hero-location{display:none}
  .chapter-head{
    grid-template-columns:58px minmax(0,1fr);
    align-items:start;
    gap:20px;
  }
  .chapter-side{
    grid-column:2;
    justify-self:start;
    margin-top:-8px;
    max-width:22em;
  }
  /* 原来取 var(--fs-work) = 56px，比标题还大（h2 在这段是 43–50px），
     而且 56px 的「01」字形宽 72px，58px 的轨道装不下，会挤进标题栏。
     --fs-work 是 .script-title 那种整行大标题的档位，不该用在编号上。 */
  .chapter-no{font-size:clamp(28px,4.4vw,38px)}
  .chapter-heading h2{font-size:clamp(34px,5.6vw,50px)}
  .about-grid{grid-template-columns:1fr;gap:56px}
  .about-copy > p:not(.about-lead):not(.about-sign){max-width:34em}
  .about-sign{margin-top:32px}
  .room-preview{max-width:560px}
  /* gap 换成 row-gap 并绑到 --seam-gap：原来写死的 32px 会按同权重、靠顺序
     盖掉前面 .script-card 里那条 row-gap，横缝就不落在图与字正中间了。
     两件剧本卡必然带 --feature 或 --note 之一，这条才是真正生效的那条。 */
  .script-card--feature{grid-template-columns:1fr;row-gap:var(--seam-gap)}
  .script-card--note{grid-template-columns:1fr;row-gap:var(--seam-gap)}
  .script-quote-panel{min-height:0}
  .essays-layout{grid-template-columns:1fr;border-top:0}
  .essay-card{
    /* 这里原有一行 grid-template-columns:1fr，是旧两栏影评卡留下的；
       .essay-card 现在已经是 flex，这行不生效，却会按同权重
       把 .essay-card--portrait 的网格压成单栏。删掉。 */
    gap:var(--space-5);
    padding-block:var(--space-6);
    border-top:1px solid var(--line);
    border-bottom:0;
  }
  .essay-card + .essay-card{border-left:0}
  .essay-card h3{max-width:13em}
  .essay-visual--landscape,
  .essay-visual--landscape .essay-visual__link{height:auto}
  .essay-visual--landscape .essay-visual__link{min-height:0}
  .essay-visual--landscape img{
    position:static;
    aspect-ratio:var(--ar-wide);
    height:auto;
  }
  .essay-visual--portrait{max-width:280px}
  .film-copy{grid-template-columns:1fr;gap:var(--space-6)}
  /* 对页在窄屏回退单栏：图版在上、文字在下，换边与竖片窄列全部还原。
     竖片要带上桌面的 .film-card 前缀——桌面那条是 (0,2,0)，
     裸写 .film-card--portrait 会被压掉，390 下会退回双栏窄图。 */
  .film-card,
  .film-card.film-card--portrait{grid-template-columns:1fr;gap:var(--space-5);align-items:start}
  .film-card:nth-of-type(even) .film-frame,
  .film-card:last-of-type .film-frame,
  .film-card.film-card--portrait .film-frame{order:0}
  .film-card.film-card--portrait .film-frame{max-width:min(430px,64vw);margin-inline:auto}
  .stage-card{grid-template-columns:1fr;gap:var(--space-6)}
  .stage-quote{text-align:left}
  .sound-grid{grid-template-columns:1fr;gap:48px}
  .sound-intro{order:1}
  .sound-list-wrap{order:2}
  .sound-art{order:3}
  .sound-art.ratio-portrait{max-width:430px}
  .thanks-sign{flex-direction:column;align-items:flex-start;gap:12px}
  .work-layout{grid-template-columns:1fr;max-width:var(--measure);margin-inline:auto}
  .work-toc{display:none}
  .works-nav{grid-template-columns:1fr 1fr}
}

@media(max-width:767px){
  /* 横幅到这里才堆叠。双列（1.16fr/.84fr）撑到 768 都还成立：
     768 下文字栏 377px、封面栏 320px，图片 261px 填充 82%，横幅 362px 高；
     一旦堆叠，封面区变成整幅宽、里面只放一张居中的图，填充率掉到 57%，
     横幅高度翻到 739px。手机上没有横向余量，堆叠才是唯一选择。 */
  .work-banner{grid-template-columns:1fr;min-height:0}
  .work-banner__inner{padding:26px 24px 32px}
  .work-banner__caption{position:static;padding:12px 2px 0;text-align:left}
  :root{
    --gutter:20px;
    --fs-body-base:16px;
    --fs-base:13px;
    --fs-md:20px;
    --header:64px;
  }
  .site-header .wordmark{font-size:19px}
  .wordmark span{font-size:var(--fs-xs)}
  .menu-toggle{font-size:var(--fs-xs)}
  .hero{min-height:auto;padding-top:calc(var(--header-total) + 8px)}
  .hero-inner{padding-block:22px 26px;gap:20px}
  .hero h1{font-size:clamp(54px,17vw,88px)}
  .hero-quote{font-size:var(--fs-md);margin-top:18px;line-height:var(--lh-lead)}
  .desktop-break{display:none}
  .hero-quote .desktop-break{display:initial}
  .hero-intro{margin-top:14px;line-height:var(--lh-body)}
  .hero-actions{gap:20px;margin-top:24px}
  .round-link{padding:var(--space-1) 0 var(--space-2);font-size:var(--fs-xs)}
  .hero-stage{height:340px;margin-top:var(--space-2);width:min(560px,100%)}
  .postcard{padding:8px 8px 0}
  .postcard figcaption{font-size:var(--fs-xs);padding:var(--space-2) 1px var(--space-2)}
  .postcard--main{width:56%;left:10%;top:2%}
  .postcard--small{width:34%;right:2%;bottom:2%}
  .hero-foot{padding-block:12px 14px;font-size:var(--fs-xs);flex-wrap:wrap;gap:10px 18px}
  /* 五格索引在 390px 里要排成一行：色条 10 + 内距 7 + 4 字 44 = 61，五格 305 + 四个 10px 间距。
     字距必须写在 a 上——`.hero-index a` 自己带 var(--ls-caps)，写在容器上会被它盖掉。 */
  .hero-index{gap:8px;width:100%}
  .hero-index a{gap:7px;letter-spacing:0}
  .hero-index .room-bar{width:10px}
  .scroll-cue{display:none}
  .section{padding-block:64px}
  /* 窄屏这条 .section 会把 padding-top 一起改掉，章页上方会多出一条纸色带 */
  .section--plated{padding-top:0}
  .sound-fade{height:88px}
  .chapter-head{grid-template-columns:42px minmax(0,1fr);gap:var(--space-3);margin-bottom:var(--space-6);padding-top:var(--space-4)}
  /* 42px 比标题还大（h2 在 390 下是 32.76px）——编号是装饰，标题是内容，
     层级倒了。28px 比 h2 小一档，仍然是版面图形而不是文字标签。 */
  /* 42px 比标题还大（h2 在 390 下是 32.76px）——编号是装饰，标题是内容，
     层级倒了。改成随视口收，上限 28px、与 h2 的比值稳定在 0.71 左右，
     仍然是版面图形而不是文字标签。写死 28px 的话 320 下是 28 vs h2 30，
     两个数几乎一样大，层级又糊了。 */
  .chapter-no{font-size:clamp(22px,6vw,28px)}
  .chapter-heading h2{font-size:clamp(30px,8.4vw,40px);line-height:var(--lh-heading)}
  .chapter-side{grid-column:1/-1;margin-top:4px;font-size:var(--fs-xs)}
  .eyebrow{font-size:var(--fs-xs);letter-spacing:var(--ls-caps)}
  .about-grid{gap:40px}
  .about-lead{font-size:23px;margin-bottom:var(--space-4)}
  .about-copy > p:not(.about-lead):not(.about-sign){line-height:var(--lh-body);margin-top:var(--space-3)}
  .about-meta{margin-top:24px}
  .about-sign{font-size:var(--fs-lg);margin-top:30px}
  .about-strip{grid-template-columns:1fr;gap:var(--space-3);margin-top:var(--space-6)}
  .about-strip img{aspect-ratio:var(--ar-photo)}
  .about-strip figcaption{display:block;padding:var(--space-2) var(--space-3) var(--space-3)}
  .room-title{font-size:var(--fs-md)}
  .room{padding-block:var(--space-4)}
  .room-index{display:block}
  .room-preview{max-width:82%;margin-left:auto;margin-top:var(--space-4)}
  .room-preview img{aspect-ratio:var(--ar-wide)}
  .demo-notice{margin-top:40px}
  /* 只改 --seam-gap 不改 gap：row-gap 在 980 断点里已经绑在它上面，
     这里再写 gap 会把 row-gap 顶掉，横缝就不再落在图与字中间。 */
  .script-card{--seam-gap:var(--space-6)}
  .script-title{font-size:clamp(30px,8.8vw,42px);margin-top:var(--space-2)}
  .script-summary{line-height:var(--lh-body);margin-top:var(--space-3)}
  .script-media{padding:var(--space-2) var(--space-2) 0}
  .script-media__tag{right:14px}
  .script-excerpt{margin-top:var(--space-5);padding:var(--space-4)}
  .script-pages{margin-top:var(--space-5);padding-top:var(--space-4);flex-wrap:wrap;gap:var(--space-3)}
  .script-page{width:96px}
  .script-pages__strip{gap:12px}
  .script-pages__caption{
    width:100%;
    margin-left:0;
    padding-bottom:0;
    flex-direction:row;
    align-items:baseline;
    justify-content:space-between;
    text-align:left;
  }
  .script-dialogue{grid-template-columns:44px minmax(0,1fr);font-size:14px}
  .script-dialogue dd{font-size:14px}
  .script-quote-panel{padding:var(--space-6) var(--space-4)}
  .script-quote{font-size:23px;margin-left:16px}
  .script-quote-panel footer{font-size:var(--fs-xs)}
  .essay-card{padding:var(--space-5) 0 var(--space-6)}
  .essay-visual--portrait{max-width:230px}
  .essay-no{font-size:52px;margin-bottom:var(--space-2)}
  .essay-card h3{font-size:29px;max-width:none}
  .essay-quote{font-size:19px;margin-top:var(--space-4)}
  .essay-foot{flex-wrap:wrap;margin-top:24px}
  .films{padding-bottom:64px}
  .film-topline{font-size:var(--fs-xs);flex-wrap:wrap;gap:8px 16px}
  .film-frame{padding:8px;margin-top:20px}
  .film-frame img{aspect-ratio:var(--ar-film)}
  /* 窄屏统一压成 16:9 只对横片成立；竖片要留住自己的比例，否则会被裁成横的 */
  .film-frame.is-portrait img{aspect-ratio:var(--ar,9/16)}
  .film-frame::after{inset:8px}
  .film-play{padding:var(--space-3) var(--space-4) var(--space-3) var(--space-3);gap:var(--space-2);font-size:var(--fs-xs)}
  .film-play-icon{width:32px;height:32px}
  .film-frame-caption{flex-wrap:wrap;font-size:var(--fs-xs)}
  .film-copy h3{font-size:32px}
  .film-summary{line-height:var(--lh-body)}
  .stage-visual{padding:8px}
  .stage-visual::after{inset:8px}
  .stage-caption{left:18px;bottom:18px;font-size:var(--fs-xs)}
  .stage-title{font-size:var(--fs-lg)}
  .stage-controls{flex-wrap:wrap;gap:var(--space-2)}
  .stage-notes{margin-top:var(--space-6)}
  .stage-quote{font-size:var(--fs-md)}
  .sound-lead{font-size:19px}
  .sound-art{padding:8px 8px 0}
  .sound-item__head{grid-template-columns:44px 20px minmax(0,1fr) 15px;gap:var(--space-2)}
  .sound-item__thumb{width:44px}
  .sound-item__meta{display:none}
  .sound-item__inner{padding-left:84px}
  .sound-list-wrap{min-width:0}
  .sound-list-head{font-size:var(--fs-xs)}
  .sound-preview__label{white-space:normal}
  .sound-preview__time{margin-left:0}
  .thanks h2{font-size:clamp(48px,14vw,76px)}
  .thanks-text{line-height:var(--lh-body)}
  .thanks-actions{gap:var(--space-4)}
  .thanks-strip__row{grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-2)}
  .thanks-sign span{font-size:36px}
  /* 底部要带安全区：这条 padding-block 是整条覆盖，桌面上那条
     calc(28px + var(--safe-b)) 到不了这里，写成 --space-4 会把 Home 指示条
     的让位一起抹掉。 */
  .site-footer .shell{flex-direction:column;gap:var(--space-2);padding-block:var(--space-4) calc(var(--space-4) + var(--safe-b))}
  .index-dialog__layout{grid-template-columns:1fr;gap:var(--space-5)}
  .index-dialog__head h2{font-size:38px}
  .index-dialog__head p{display:none}
  .index-preview{display:none}
  .index-list__title{font-size:23px}
  .index-list a{grid-template-columns:30px minmax(0,1fr) auto 16px;padding-block:var(--space-3)}
  .index-dialog__foot{flex-wrap:wrap;gap:var(--space-2) var(--space-4);font-size:var(--fs-xs)}
  .index-dialog__foot span:nth-child(2){display:none}
  .work-banner__cover{min-height:0;aspect-ratio:auto;padding:0 var(--space-4) var(--space-4)}
  .work-banner__cover .image-toggle img{max-height:min(56vh,400px)}
  .work-banner__caption{position:static;padding:12px 2px 0;text-align:left}
  .work-banner__title{font-size:clamp(32px,9vw,44px)}
  .work-banner__lead{font-size:var(--fs-base);line-height:var(--lh-body)}
  .work-banner__meta{margin-top:var(--space-4);padding-top:var(--space-3);gap:var(--space-2) var(--space-3)}
  .work-top{font-size:var(--fs-xs);flex-wrap:wrap;gap:8px}
  .work-header h1{font-size:clamp(34px,10vw,48px)}
  .work-lead{font-size:18px}
  .image-toggle img{aspect-ratio:var(--ar-photo)}
  .work-gallery{grid-template-columns:1fr;gap:var(--space-4)}
  .work-gallery__item:last-child:nth-child(odd){grid-column:auto}
  .work-gallery__item:last-child:nth-child(odd) .work-gallery__button img{aspect-ratio:var(--ar-photo)}
  /* 台词行高统一走 --lh-script，这里不再把 .dialogue dd 拉回 --lh-body */
  .reading-section p{line-height:var(--lh-body)}
  /* 窄屏只改三个输入，列宽/缩进/小字号全部跟着缩 */
  .reading-section--script{
    --script-col:calc(var(--fs-body) * 4.2);
    --script-gap:calc(var(--fs-body) * .6);
    --script-indent:calc(var(--fs-body) * 4.8);
    --script-small:calc(var(--fs-body) * .75);
  }
  .reading-section--script .dialogue{margin:var(--space-3) 0}
  .work-end{flex-wrap:wrap}
  .works-nav{grid-template-columns:1fr;gap:0}
  .works-nav__link{padding-block:16px}
  .works-nav__next{
    align-items:flex-start;
    text-align:left;
    border-top:1px solid var(--line);
  }
  .works-nav__link small{font-size:var(--fs-xs)}
  .lightbox{max-width:94vw}
  .lightbox-close{top:12px;right:12px}
  .lightbox-nav{top:auto;bottom:calc(var(--space-3) + var(--safe-b));transform:none;padding:var(--space-2) var(--space-3);font-size:var(--fs-xs)}
  .lightbox-prev{left:14px}
  .lightbox-next{right:14px}
}

@media(max-width:420px){
  .header-tools .menu-toggle span:first-child{display:none}
  .header-tools .menu-toggle{padding:16px 12px;margin:-16px -12px -16px 0}
  .hero-actions{gap:16px}
  .hero h1{font-size:clamp(54px,17vw,72px)}
  .hero-stage{height:300px}
  .postcard--small{width:36%}
  .room-title{font-size:21px}
}

@media(prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{
    animation-duration:.001ms!important;
    animation-iteration-count:1!important;
    transition-duration:.001ms!important;
    scroll-behavior:auto!important;
  }
  .js .reveal{opacity:1;transform:none}
  .cursor{display:none}
}

@media print{
  .site-header,.site-footer,.skip-link,.work-end,.image-hint,.media-status,
  .demo-notice,.menu-toggle,.line-link,.reading-progress,.work-toc,.work-side,.works-nav,
  .page-fade,.paper-grain,.cursor,.toast{display:none!important}
  body{background:#fff;color:#222;font-size:12pt}
  .work-main{padding:0}
  .work-container,.work-reading,.work-header{width:100%;max-width:none}
  .work-layout{grid-template-columns:1fr}
  .reading-section{break-inside:avoid}
  .work-header h1{font-size:24pt}
  .work-figure{max-width:60%;margin-inline:auto}
  .reading-section p,.dialogue dd{font-size:12pt}
  a{color:inherit}
}

@media(max-width:980px){
  .work-epigraph{grid-template-columns:minmax(0,1fr)}
  .paper-item{grid-template-columns:84px minmax(0,1fr);gap:var(--space-4)}
  .paper-thumb{width:84px}
}
@media(max-width:767px){
  .paper-item{grid-template-columns:72px minmax(0,1fr);gap:16px}
  .paper-thumb{width:72px}
  .paper-foot{flex-wrap:wrap;gap:12px}
  .paper-foot .line-link{margin-left:0}
  .work-epigraph{padding:var(--space-5) var(--space-4)}
  .showcase-head{margin-bottom:var(--space-5)}
}
