/* ==========================================================================
   南京乡土文化数字展陈 · 前端预览（古风文化版）
   方案一 A「卷帙·展墙延续」：宣纸、墨色、朱砂印、双线版框、竖排签条、回纹、水墨远山。
   参照场馆实景：书标签墙、墙面立轴、冰裂锦地纹、水墨山水。
   注：首页已按 2026-09-19 决定移除线装书与卷轴签，"首页不放具象物"。
   B / C 两方向保留原气质，共用同一信息结构。
   ========================================================================== */

:root {
  color-scheme: dark;
  --studio-bg: #171410;
  --studio-panel: #201c16;
  --studio-line: rgba(230, 214, 178, .16);
  --studio-muted: #948a76;
  --studio-text: #ece2cb;
  --screen-ink: #1b2721;
  --screen-paper: #e8e4d4;
  --screen-muted: #718276;
  --screen-accent: #a8784e;
  --screen-deep: #263e35;
  --screen-red: #9f493b;
  --screen-shadow: 0 30px 80px rgba(0,0,0,.5), inset 0 1px 0 rgba(255,255,255,.07);
  --serif: "STSong", "SimSun", "NSimSun", "Noto Serif CJK SC", serif;
  /* 回纹（数据 URI 内联 SVG，无外部资源） */
  --meander: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='26' height='26' viewBox='0 0 26 26'%3E%3Cpath d='M3 23V3h20v20H7V7h12v12h-8v-8h4' fill='none' stroke='%239a6b41' stroke-width='1.4'/%3E%3C/svg%3E");
  font-family: var(--serif);
}

* { box-sizing: border-box; }
html, body { margin: 0; min-width: 1120px; min-height: 100%; background: var(--studio-bg); color: var(--studio-text); }
body { background: radial-gradient(circle at 50% -20%, #3a3125 0, #1c1813 45%, #12100c 80%); }
button { font: inherit; }
button:focus-visible { outline: 2px solid #e9c684; outline-offset: 3px; }

/* ---------- 评审壳（深色胡桃木底，压住不作秀） ---------- */
.studio-shell { width: min(1680px, calc(100vw - 72px)); margin: 0 auto; padding: 28px 0 24px; }
.studio-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 28px; padding-bottom: 22px; border-bottom: 1px solid var(--studio-line); }
.brand-lockup { display: flex; align-items: center; gap: 14px; min-width: 310px; }
.brand-seal { display: grid; place-items: center; width: 42px; height: 42px; transform: rotate(45deg); border: 1px solid #b8a97f; color: #e6d7b4; font: 24px var(--serif); }
.brand-seal::first-letter { transform: rotate(-45deg); }
.brand-lockup h1 { margin: 5px 0 0; font-size: 18px; letter-spacing: .14em; font-weight: 500; font-family: var(--serif); }
.micro-label { margin: 0; color: var(--studio-muted); font-size: 10px; letter-spacing: .17em; text-transform: uppercase; }
.toolbar-controls { display: flex; align-items: center; justify-content: flex-end; gap: 9px; }
.view-switch, .direction-switch { display: flex; gap: 3px; padding: 4px; border: 1px solid var(--studio-line); background: rgba(255,248,230,.05); border-radius: 8px; }
.view-button, .direction-button, .utility-button { border: 0; border-radius: 5px; padding: 8px 11px; color: #a99f88; background: transparent; cursor: pointer; font-size: 11px; font-family: var(--serif); letter-spacing: .06em; transition: .2s ease; }
.view-button:hover, .direction-button:hover, .utility-button:hover { color: #f6eed8; background: rgba(255,248,230,.1); }
.view-button.is-active, .direction-button.is-active { color: #241f14; background: #ddd3ae; }
.utility-button { border: 1px solid var(--studio-line); white-space: nowrap; }
.utility-button[aria-pressed="true"] { color: #252516; border-color: #d5c681; background: #d5c681; }
.icon-button { min-width: 37px; padding: 8px 10px; font-size: 17px; line-height: 1; }
.preview-meta { display: grid; grid-template-columns: minmax(250px, .75fr) minmax(350px, 1.35fr) auto; align-items: end; gap: 28px; padding: 22px 2px 17px; }
.preview-meta h2 { margin: 5px 0 0; color: #f0e5cc; font: 500 28px/1.1 var(--serif); letter-spacing: .14em; }
.direction-note { max-width: 650px; margin: 0; color: #b0a892; font-size: 13px; line-height: 1.85; font-family: var(--serif); letter-spacing: .04em; }
.canvas-meta { display: flex; align-items: center; gap: 8px; color: #9d937e; font-size: 11px; white-space: nowrap; }
.canvas-meta i, .studio-footer i { display: inline-block; width: 3px; height: 3px; border-radius: 50%; background: #6b6350; }
.live-dot { width: 7px; height: 7px; border-radius: 50%; background: #8ca97e; box-shadow: 0 0 0 4px rgba(140,169,126,.12); }
.display-frame { position: relative; padding: 11px; border-radius: 15px; background: linear-gradient(145deg, #453b2b, #16130e 58%); box-shadow: var(--screen-shadow); }
.display-frame::before { content: ""; position: absolute; inset: 0; border: 1px solid rgba(255,244,214,.12); border-radius: 15px; pointer-events: none; }
.display-screen { position: relative; overflow: hidden; aspect-ratio: 4320 / 1920; border-radius: 6px; isolation: isolate; background: #111; }
.display-screen::after { content: ""; position: absolute; inset: 0; z-index: 40; pointer-events: none; border: 1px solid rgba(255,244,214,.16); }
.ambient-noise { position: absolute; inset: 0; z-index: 1; pointer-events: none; opacity: .24; background-image: radial-gradient(rgba(255,255,255,.5) .45px, transparent .55px); background-size: 5px 5px; mix-blend-mode: overlay; }
.screen-topbar { position: absolute; z-index: 20; left: 4.6%; right: 4.6%; top: 4.6%; display: flex; justify-content: space-between; align-items: center; color: var(--screen-muted); font-size: 10px; letter-spacing: .3em; pointer-events: none; font-family: var(--serif); }
.screen-brand, .screen-context { display: flex; align-items: center; gap: 8px; }
.screen-mark { display: grid; place-items: center; width: 20px; height: 20px; border: 1px solid currentColor; font: 12px var(--serif); }
.context-separator { opacity: .5; }
.screen-footer { position: absolute; z-index: 23; left: 4.6%; right: 4.6%; bottom: 4.2%; display: flex; justify-content: space-between; color: var(--screen-muted); font-size: 10px; letter-spacing: .22em; pointer-events: none; font-family: var(--serif); }
.reserved-slot { position: absolute; z-index: 25; bottom: 8.6%; width: 12.4%; min-height: 8.5%; padding: 7px 10px; border: 1px dashed rgba(84, 94, 70, .55); color: rgba(70, 90, 72, .85); background: rgba(239,239,222,.14); font-size: 9px; letter-spacing: .1em; pointer-events: none; font-family: var(--serif); }
.reserved-slot span, .reserved-slot small { display: block; }
.reserved-slot small { margin-top: 4px; opacity: .75; font-size: 8px; letter-spacing: .04em; }
.reserved-slot-left { left: 4.1%; text-align: left; }
/* 评审壳的右下预留位是 index.html 里的常驻节点（测试断言该元素存在），
   视频展播 / 深度浏览两类画面用这个类整个隐藏，而不是删节点。 */
.reserved-slot-right.is-hidden { display: none; }
.reserved-slot-right { right: 4.1%; text-align: right; border-color: rgba(120,90,50,.55); color: rgba(96,74,44,.9); background: rgba(246,241,226,.55); }
.qr-pair { display: flex !important; gap: 6px; justify-content: flex-end; }
/* 二维码占位图：0.964 比例，必须 contain —— 用 cover 会把码的上/下边各切掉约 3.6% */
.qr-pair img { display: block; width: 46px; height: 46px; object-fit: contain; background: #fff; padding: 3px; border: 1px solid rgba(90,70,40,.4); border-radius: 2px; }
.shuiyun .reserved-slot-right, .archive .reserved-slot-right { background: rgba(10,20,28,.35); border-color: rgba(200,220,215,.4); color: rgba(220,232,228,.8); }
.archive .reserved-slot-right { background: rgba(30,26,22,.4); border-color: rgba(233,201,139,.4); color: rgba(233,220,196,.85); }
.seam-lines { display: none; position: absolute; inset: 0; z-index: 45; pointer-events: none; }
.show-seams .seam-lines { display: block; }
.seam-lines span { position: absolute; top: 0; bottom: 0; width: 1px; background: rgba(239, 211, 147, .58); box-shadow: 0 0 16px rgba(239,211,147,.25); }
.seam-lines span:nth-child(1) { left: 25%; } .seam-lines span:nth-child(2) { left: 50%; } .seam-lines span:nth-child(3) { left: 75%; }
.seam-lines b { position: absolute; right: 1.8%; top: 7.5%; padding: 4px 7px; border: 1px solid rgba(239,211,147,.44); color: #edd493; background: rgba(39,30,17,.72); font-size: 9px; letter-spacing: .12em; font-weight: 400; }
.screen-view { position: absolute; inset: 0; z-index: 3; display: none; overflow: hidden; }
.screen-view.is-active { display: block; }

/* ==========================================================================
   观众端公共骨架
   ========================================================================== */
.audience-home, .audience-detail { position: absolute; inset: 0; overflow: hidden; color: var(--screen-ink); background: var(--screen-paper); animation: screen-in .55s cubic-bezier(.22,.8,.36,1) both; font-family: var(--serif); }
@keyframes screen-in { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }

.moyun .audience-home, .moyun .audience-detail {
  --screen-paper: #ede6d2;
  --screen-ink: #26422f;
  --screen-muted: #71806f;
  --screen-accent: #96683a;
  --screen-deep: #21473a;
  --screen-red: #a03c28;
  background:
    radial-gradient(ellipse 60% 46% at 86% 5%, rgba(255, 252, 238, .92), transparent 62%),
    radial-gradient(ellipse 52% 58% at 3% 97%, rgba(191, 178, 138, .36), transparent 60%),
    linear-gradient(168deg, #f1ebd9 0%, #eae2cb 48%, #e2d9bd 100%);
}
.shuiyun .audience-home, .shuiyun .audience-detail { --screen-paper: #132a3a; --screen-ink: #e6ece0; --screen-muted: #7da8a0; --screen-accent: #e2b36c; --screen-deep: #0c1d2a; --screen-red: #d68469; }
.archive .audience-home, .archive .audience-detail { --screen-paper: #171615; --screen-ink: #efe4cf; --screen-muted: #a39887; --screen-accent: #df7255; --screen-deep: #28231f; --screen-red: #e7795f; }

/* 宣纸肌理 + 帘纹 */
.moyun .audience-home::before, .moyun .audience-detail::before {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background:
    repeating-linear-gradient(0deg, rgba(104, 88, 58, .028) 0 1px, transparent 1px 4px),
    repeating-linear-gradient(90deg, rgba(104, 88, 58, .02) 0 1px, transparent 1px 6px),
    radial-gradient(ellipse 118% 88% at 50% 50%, transparent 70%, rgba(112, 90, 54, .13) 100%);
  mix-blend-mode: multiply;
}
.shuiyun .audience-home::before, .shuiyun .audience-detail::before { content: ""; position: absolute; inset: 0; opacity: .45; pointer-events: none; background: radial-gradient(ellipse at 93% 8%, rgba(255,255,245,.1), transparent 28%), repeating-linear-gradient(90deg, transparent 0 12px, rgba(230,240,235,.02) 13px 14px); }
.archive .audience-home::before, .archive .audience-detail::before { content: ""; position: absolute; inset: 0; opacity: .45; pointer-events: none; background: repeating-linear-gradient(90deg, transparent 0 12px, rgba(237,225,202,.03) 13px 14px); }
.shuiyun .audience-home::after, .shuiyun .audience-detail::after { content: ""; position: absolute; inset: 0; opacity: .35; background: radial-gradient(ellipse at 13% 80%, rgba(69,133,139,.6), transparent 35%), linear-gradient(110deg, rgba(8,20,32,.18), transparent 55%, rgba(221,170,102,.14)); pointer-events: none; }
.archive .audience-home::after, .archive .audience-detail::after { content: ""; position: absolute; inset: 0; opacity: .25; background-image: linear-gradient(rgba(237,225,202,.22) 1px, transparent 1px), linear-gradient(90deg, rgba(237,225,202,.22) 1px, transparent 1px); background-size: 9% 17%; mask-image: linear-gradient(90deg, black, transparent 88%); pointer-events: none; }

/* ==========================================================================
   A 稿 · 配色变体（2026-09-20）—— 排版与结构一律不变，只换「纸色 / 墨色 / 点缀 / 印章」
   -------------------------------------------------------------------------
   宣纸黄 = 上面的 .moyun（默认稿）。下列 4 个是浅色纸色系变体，每个只定义：
   ① 6 个 --screen-* token（纸/墨/灰/点缀/深/印章红）；
   ② 纸底三层渐变（高光 + 光晕 + 主纸色）；
   ③ 宣纸肌理纹（同 moyun 结构，只把纹色换成各色相的深调）。
   装置层、挂屏、书名签、金陵水岸卷、版框全部 color-mix 引 token，自动随色派生，无需逐条覆盖。
   后台 .is-admin 不走这些 token，保持不变。 */
/* 月白 · 冷调淡青米白 */
.yuebai .audience-home, .yuebai .audience-detail {
  --screen-paper: #ecefea; --screen-ink: #2a3a45; --screen-muted: #7a8a93;
  --screen-accent: #8a99a5; --screen-deep: #223a46; --screen-red: #a34e4a;
  background:
    radial-gradient(ellipse 60% 46% at 86% 5%, rgba(250, 252, 251, .92), transparent 62%),
    radial-gradient(ellipse 52% 58% at 3% 97%, rgba(148, 168, 180, .30), transparent 60%),
    linear-gradient(168deg, #f1f4f1 0%, #e7ece9 48%, #dde4e1 100%);
}
.yuebai .audience-home::before, .yuebai .audience-detail::before {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none; mix-blend-mode: multiply;
  background:
    repeating-linear-gradient(0deg, rgba(60, 82, 96, .026) 0 1px, transparent 1px 4px),
    repeating-linear-gradient(90deg, rgba(60, 82, 96, .018) 0 1px, transparent 1px 6px),
    radial-gradient(ellipse 118% 88% at 50% 50%, transparent 70%, rgba(70, 90, 105, .12) 100%);
}
.yuebai .audience-idle {
  --screen-paper: #ecefea; --screen-ink: #2a3a45; --screen-muted: #7a8a93;
  --screen-accent: #8a99a5; --screen-deep: #223a46; --screen-red: #a34e4a;
  background:
    radial-gradient(ellipse 60% 46% at 86% 5%, rgba(250, 252, 251, .92), transparent 62%),
    radial-gradient(ellipse 52% 58% at 3% 97%, rgba(148, 168, 180, .30), transparent 60%),
    linear-gradient(168deg, #f1f4f1 0%, #e7ece9 48%, #dde4e1 100%);
}
.yuebai .audience-idle::before {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none; mix-blend-mode: multiply;
  background:
    repeating-linear-gradient(0deg, rgba(60, 82, 96, .026) 0 1px, transparent 1px 4px),
    repeating-linear-gradient(90deg, rgba(60, 82, 96, .018) 0 1px, transparent 1px 6px),
    radial-gradient(ellipse 118% 88% at 50% 50%, transparent 70%, rgba(70, 90, 105, .12) 100%);
}
/* 竹青 · 淡青绿（水乡清润） */
.zhuqing .audience-home, .zhuqing .audience-detail {
  --screen-paper: #e8ede5; --screen-ink: #2d4035; --screen-muted: #6f8678;
  --screen-accent: #6c8f6e; --screen-deep: #214a34; --screen-red: #a2413a;
  background:
    radial-gradient(ellipse 60% 46% at 86% 5%, rgba(249, 252, 247, .92), transparent 62%),
    radial-gradient(ellipse 52% 58% at 3% 97%, rgba(150, 180, 158, .30), transparent 60%),
    linear-gradient(168deg, #edf1ea 0%, #e3eae0 48%, #d9e2d6 100%);
}
.zhuqing .audience-home::before, .zhuqing .audience-detail::before {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none; mix-blend-mode: multiply;
  background:
    repeating-linear-gradient(0deg, rgba(70, 92, 72, .026) 0 1px, transparent 1px 4px),
    repeating-linear-gradient(90deg, rgba(70, 92, 72, .018) 0 1px, transparent 1px 6px),
    radial-gradient(ellipse 118% 88% at 50% 50%, transparent 70%, rgba(78, 100, 80, .12) 100%);
}
.zhuqing .audience-idle {
  --screen-paper: #e8ede5; --screen-ink: #2d4035; --screen-muted: #6f8678;
  --screen-accent: #6c8f6e; --screen-deep: #214a34; --screen-red: #a2413a;
  background:
    radial-gradient(ellipse 60% 46% at 86% 5%, rgba(249, 252, 247, .92), transparent 62%),
    radial-gradient(ellipse 52% 58% at 3% 97%, rgba(150, 180, 158, .30), transparent 60%),
    linear-gradient(168deg, #edf1ea 0%, #e3eae0 48%, #d9e2d6 100%);
}
.zhuqing .audience-idle::before {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none; mix-blend-mode: multiply;
  background:
    repeating-linear-gradient(0deg, rgba(70, 92, 72, .026) 0 1px, transparent 1px 4px),
    repeating-linear-gradient(90deg, rgba(70, 92, 72, .018) 0 1px, transparent 1px 6px),
    radial-gradient(ellipse 118% 88% at 50% 50%, transparent 70%, rgba(78, 100, 80, .12) 100%);
}
/* 藕荷 · 淡紫灰（温婉古雅） */
.ouhe .audience-home, .ouhe .audience-detail {
  --screen-paper: #ece8ec; --screen-ink: #3d3441; --screen-muted: #867c8e;
  --screen-accent: #8d6f8a; --screen-deep: #3d2e4a; --screen-red: #a3444e;
  background:
    radial-gradient(ellipse 60% 46% at 86% 5%, rgba(252, 249, 252, .92), transparent 62%),
    radial-gradient(ellipse 52% 58% at 3% 97%, rgba(180, 160, 185, .30), transparent 60%),
    linear-gradient(168deg, #f1edf1 0%, #e8e3e9 48%, #dfd9e1 100%);
}
.ouhe .audience-home::before, .ouhe .audience-detail::before {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none; mix-blend-mode: multiply;
  background:
    repeating-linear-gradient(0deg, rgba(90, 72, 94, .026) 0 1px, transparent 1px 4px),
    repeating-linear-gradient(90deg, rgba(90, 72, 94, .018) 0 1px, transparent 1px 6px),
    radial-gradient(ellipse 118% 88% at 50% 50%, transparent 70%, rgba(100, 82, 104, .12) 100%);
}
.ouhe .audience-idle {
  --screen-paper: #ece8ec; --screen-ink: #3d3441; --screen-muted: #867c8e;
  --screen-accent: #8d6f8a; --screen-deep: #3d2e4a; --screen-red: #a3444e;
  background:
    radial-gradient(ellipse 60% 46% at 86% 5%, rgba(252, 249, 252, .92), transparent 62%),
    radial-gradient(ellipse 52% 58% at 3% 97%, rgba(180, 160, 185, .30), transparent 60%),
    linear-gradient(168deg, #f1edf1 0%, #e8e3e9 48%, #dfd9e1 100%);
}
.ouhe .audience-idle::before {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none; mix-blend-mode: multiply;
  background:
    repeating-linear-gradient(0deg, rgba(90, 72, 94, .026) 0 1px, transparent 1px 4px),
    repeating-linear-gradient(90deg, rgba(90, 72, 94, .018) 0 1px, transparent 1px 6px),
    radial-gradient(ellipse 118% 88% at 50% 50%, transparent 70%, rgba(100, 82, 104, .12) 100%);
}
/* 赭石 · 暖褐（厚重古卷） */
.zheshi .audience-home, .zheshi .audience-detail {
  --screen-paper: #ece0cd; --screen-ink: #3d2f21; --screen-muted: #87745f;
  --screen-accent: #a16b3a; --screen-deep: #4a3624; --screen-red: #a33d2d;
  background:
    radial-gradient(ellipse 60% 46% at 86% 5%, rgba(255, 250, 240, .92), transparent 62%),
    radial-gradient(ellipse 52% 58% at 3% 97%, rgba(192, 166, 128, .36), transparent 60%),
    linear-gradient(168deg, #f0e8d5 0%, #e9dec9 48%, #e0d3bb 100%);
}
.zheshi .audience-home::before, .zheshi .audience-detail::before {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none; mix-blend-mode: multiply;
  background:
    repeating-linear-gradient(0deg, rgba(110, 84, 54, .028) 0 1px, transparent 1px 4px),
    repeating-linear-gradient(90deg, rgba(110, 84, 54, .02) 0 1px, transparent 1px 6px),
    radial-gradient(ellipse 118% 88% at 50% 50%, transparent 70%, rgba(118, 92, 58, .13) 100%);
}
.zheshi .audience-idle {
  --screen-paper: #ece0cd; --screen-ink: #3d2f21; --screen-muted: #87745f;
  --screen-accent: #a16b3a; --screen-deep: #4a3624; --screen-red: #a33d2d;
  background:
    radial-gradient(ellipse 60% 46% at 86% 5%, rgba(255, 250, 240, .92), transparent 62%),
    radial-gradient(ellipse 52% 58% at 3% 97%, rgba(192, 166, 128, .36), transparent 60%),
    linear-gradient(168deg, #f0e8d5 0%, #e9dec9 48%, #e0d3bb 100%);
}
.zheshi .audience-idle::before {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none; mix-blend-mode: multiply;
  background:
    repeating-linear-gradient(0deg, rgba(110, 84, 54, .028) 0 1px, transparent 1px 4px),
    repeating-linear-gradient(90deg, rgba(110, 84, 54, .02) 0 1px, transparent 1px 6px),
    radial-gradient(ellipse 118% 88% at 50% 50%, transparent 70%, rgba(118, 92, 58, .13) 100%);
}

/* 版框：双线框 + 角隅线 */
.paper-frame { position: absolute; inset: 2.9% 3.2%; z-index: 2; pointer-events: none; border: 1.5px solid color-mix(in srgb, var(--screen-muted) 34%, transparent); }
.paper-frame::before { content: ""; position: absolute; inset: 5px; border: 1px solid color-mix(in srgb, var(--screen-muted) 20%, transparent); }
.paper-frame i { position: absolute; width: 16px; height: 16px; border: 0 solid color-mix(in srgb, var(--screen-accent) 70%, transparent); }
.paper-frame .tl { left: -2px; top: -2px; border-left-width: 2.5px; border-top-width: 2.5px; }
.paper-frame .tr { right: -2px; top: -2px; border-right-width: 2.5px; border-top-width: 2.5px; }
.paper-frame .bl { left: -2px; bottom: -2px; border-left-width: 2.5px; border-bottom-width: 2.5px; }
.paper-frame .br { right: -2px; bottom: -2px; border-right-width: 2.5px; border-bottom-width: 2.5px; }
.shuiyun .paper-frame, .archive .paper-frame { opacity: .5; }

/* 回纹缘饰带（上下各一，低调） */
.meander-band { position: absolute; left: 3.2%; right: 3.2%; height: 26px; z-index: 2; pointer-events: none; background-image: var(--meander); background-repeat: repeat-x; background-size: 26px 26px; opacity: .16; }
.band-top { top: 2.9%; }
.band-bottom { bottom: 2.9%; transform: scaleY(-1); }
.shuiyun .meander-band, .archive .meander-band { opacity: .08; }

/* 水墨远山 */
.ink-wash { position: absolute; z-index: 1; left: -3%; bottom: -2%; width: 62%; height: 24%; pointer-events: none; color: var(--screen-deep); }
.ink-wash path { fill: currentColor; opacity: .08; }
.ink-wash .wash-2 { opacity: .055; }
.ink-wash .wash-line { stroke: currentColor; stroke-width: 2; opacity: .13; }
.shuiyun .ink-wash { color: #63b3a6; } .shuiyun .ink-wash path { opacity: .16; }
.archive .ink-wash { color: #d99a4e; } .archive .ink-wash path { opacity: .1; }

/* 底部实景「金陵水岸」卷（去底留墨版）—— 观众端全页面共用底带（待机 P01 / 首页 P02 / 详情 P03–P07）。
   原 SVG 淡墨远山 .ink-wash 在观众端停用（DOM 保留，display:none），后台 admin-shell 不走 frame() 故不含本卷。
   素材：assets/landscape-jinling-ink.png —— 由 scripts/build-landscape-ink.py 从甲方原图
   landscape-jinling.png 派生（RGB 写死 --ink-xuan 松烟墨、只 alpha 变、逐列纸底归一化）。
   原图直贴已判失败：图自带纸底比页面亮 25 级 → 白带 + x≈47% 竖向接缝。改曲线/换图跑脚本，别手改 png。
   几何与取景见 docs/02-design/solution-a-canvas-review-2026-09-19.md §24；收进版框（§25.8）。
   详情页山水被半透明 .detail-panel 压着，主要从左右两侧与底部细带露出——内容优先、山水退为氛围底。 */
.audience-home .ink-wash, .audience-detail .ink-wash, .audience-idle .ink-wash { display: none; }
.home-scroll {
  position: absolute; z-index: 1; bottom: 2.9%; left: 3.2%; right: 3.2%; height: 26%;
  pointer-events: none; opacity: .5;   /* 档位实测：.35 发飘 / .85 压成一团灰 */
  background: url("assets/landscape-jinling-ink.png") center 40% / 100% auto no-repeat;
  mask-image:
    linear-gradient(90deg, transparent 0%, #000 7%, #000 93%, transparent 100%),
    linear-gradient(180deg, transparent 0%, #000 32%, #000 100%);
  mask-composite: intersect;
}
/* 深底两主题：去底后是"深墨+透明纸"，深底上深墨看不见 —— 先反相让 luminosity 抬成淡墨白描 */
.shuiyun .home-scroll, .archive .home-scroll {
  filter: invert(1); mix-blend-mode: luminosity; opacity: .42;
}

/* ==========================================================================
   首页装置层「挂签成列」（2026-09-19 夜定稿）—— 挂杆 + 两翼挂屏 + 两翼书名签
   -------------------------------------------------------------------------
   契约：① 全层 pointer-events:none，五签位置/热区/版式不变；
         ② 色值全 color-mix 引 token —— 木色随 --screen-accent 派生
           （墨韵＝栗木、水韵＝金木杆、档案＝赤褐木杆），签纸/挂屏底随 --screen-paper
           派生，深底两主题自动成暗色，无需另写覆盖；
         ③ 几何：挂杆 left/right 14%、bottom 63.6%、h 5px，五根吊线对齐五签中心
           （22/36/50/64/78%，轨内定位 (中心−14)/72）；挂屏两翼 x 7%/89.6%、y 14%、
           3.4%×20%、opacity .62；书名签中心 x 8.7%/91.3%（与挂屏同轴）、
           y 38.5/51/63.5%、h 10%、统一 opacity .5、无俯仰角；
         ④ 书名签底边最高到 y 73.5%，左下预留位顶边 82.9%，换书名必须复算互不侵入；
         ⑤ 吊线/木珠/轴头是刻意出血，三处 BLEED 白名单已登记
           （audit-canvas-layout / audit-preview-shell / verify-book-flow）。
   琳琅靠层次秩序（同一套"悬挂"语言），不靠数量；取舍过程见 p02-home-options.html，
   原委见 docs/02-design/solution-a-canvas-review-2026-09-19.md §20。 */
.home-rail {
  position: absolute; z-index: 6; left: 14%; right: 14%; bottom: 63.6%; height: 5px;
  border-radius: 3px; pointer-events: none;
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--screen-accent) 85%, #fff),
    color-mix(in srgb, var(--screen-accent) 55%, #241a10));
  box-shadow: 0 2px 5px color-mix(in srgb, var(--screen-deep) 28%, transparent),
    inset 0 1px 0 rgba(255, 244, 214, .2);
}
.home-rail::before, .home-rail::after {
  content: ""; position: absolute; top: 50%; width: 11px; height: 11px; border-radius: 50%;
  background: radial-gradient(circle at 35% 30%,
    color-mix(in srgb, var(--screen-accent) 88%, #fff),
    color-mix(in srgb, var(--screen-accent) 45%, #1d1409) 70%);
  box-shadow: 0 1px 3px rgba(24, 20, 12, .4);
}
.home-rail::before { left: -5px; transform: translateY(-50%); }
.home-rail::after { right: -5px; transform: translateY(-50%); }
.home-rail i {
  position: absolute; top: 5px; width: 1.5px; height: 15px;
  background: color-mix(in srgb, var(--screen-accent) 60%, var(--screen-deep));
  box-shadow: 0 1px 1px rgba(24, 20, 12, .2);
}
.home-rail i::after {
  content: ""; position: absolute; bottom: -4px; left: 50%; transform: translateX(-50%);
  width: 7px; height: 7px; border-radius: 50%;
  background: radial-gradient(circle at 35% 30%,
    color-mix(in srgb, var(--screen-accent) 88%, #fff),
    color-mix(in srgb, var(--screen-accent) 45%, #1d1409) 75%);
}
/* 五根吊线对齐五签中心：签中心在屏宽 22/36/50/64/78%，挂杆占 14%–86%（宽 72%） */
.home-rail i:nth-child(1) { left: 11.11%; }
.home-rail i:nth-child(2) { left: 30.56%; }
.home-rail i:nth-child(3) { left: 50%; transform: translateX(-50%); }
.home-rail i:nth-child(4) { left: 69.44%; }
.home-rail i:nth-child(5) { left: 88.89%; }
/* 回纹锦挂屏（纯纹样无文字）：顶部也带吊线，与挂杆同一套"悬挂"语言，不再是独立盒子 */
.home-hanging {
  position: absolute; z-index: 2; top: var(--y); left: var(--x); width: var(--w); height: var(--h);
  pointer-events: none; opacity: .62;
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--screen-paper) 92%, #fff),
    color-mix(in srgb, var(--screen-paper) 82%, var(--screen-muted)));
  border: 1px solid color-mix(in srgb, var(--screen-muted) 50%, transparent);
  box-shadow: 0 6px 14px color-mix(in srgb, var(--screen-deep) 16%, transparent),
    inset 0 0 0 4px color-mix(in srgb, var(--screen-paper) 85%, transparent),
    inset 0 0 0 5px color-mix(in srgb, var(--screen-accent) 40%, transparent);
}
.home-hanging::before {
  content: ""; position: absolute; inset: 9px;
  background-image: var(--meander); background-size: 17px 17px; opacity: .24;
}
.home-hanging::after {
  content: ""; position: absolute; left: 50%; bottom: -11px; transform: translateX(-50%);
  width: 58%; height: 7px; border-radius: 4px;
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--screen-accent) 85%, #fff),
    color-mix(in srgb, var(--screen-accent) 55%, #241a10));
  box-shadow: 0 1px 3px rgba(24, 20, 12, .3);
}
.home-hanging b {
  position: absolute; top: -7px; left: 50%; transform: translateX(-50%);
  width: 9px; height: 9px; border-radius: 50%;
  background: radial-gradient(circle at 35% 30%,
    color-mix(in srgb, var(--screen-accent) 88%, #fff),
    color-mix(in srgb, var(--screen-accent) 45%, #1d1409) 75%);
}
/* 挂屏顶部吊线：与挂杆吊线同源 */
.home-hanging b::before {
  content: ""; position: absolute; bottom: 8px; left: 50%; transform: translateX(-50%);
  width: 1.5px; height: 22px;
  background: color-mix(in srgb, var(--screen-accent) 60%, var(--screen-deep));
}
/* 两翼书名签：真实南京旧志名，属"文字纹样"而非居中具象物（口径边界见审查记录 §20.7）——
   统一 opacity .5、无俯仰角，安静成列；深底两主题随 token 自动派生暗色签纸 */
.home-tag-wall { position: absolute; inset: 0; z-index: 2; pointer-events: none; }
.home-tag {
  position: absolute; left: var(--x); top: var(--y); width: 3.1%; height: var(--h);
  display: flex; align-items: center; justify-content: center; padding: 8px 0;
  writing-mode: vertical-rl; white-space: nowrap; opacity: .5;
  font: 11.5px/1 var(--serif); letter-spacing: .2em;
  color: color-mix(in srgb, var(--screen-ink) 82%, transparent);
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--screen-paper) 92%, #fff),
    color-mix(in srgb, var(--screen-paper) 82%, var(--screen-muted)));
  border: 1px solid color-mix(in srgb, var(--screen-muted) 52%, transparent);
  box-shadow: 0 3px 9px color-mix(in srgb, var(--screen-deep) 16%, transparent),
    inset 0 0 0 2px color-mix(in srgb, var(--screen-paper) 80%, transparent);
}
.home-tag.sealed::after {
  content: ""; position: absolute; bottom: 4px; left: 50%; transform: translateX(-50%);
  width: 9px; height: 9px; background: var(--screen-red); opacity: .85;
}

/* ==========================================================================
   A 方向 · 首页（P02）

   首页主语＝五个模块入口本身：标题居中在上，五条签条放大居中在下。
   中央不再放具象物——三册线装书、书影、飞鸟与「正在展阅·景定建康志」卷轴签
   已移除（理由见 docs/02-design/solution-a-canvas-review-2026-09-19.md）。
   这是刻意的设计决定，不要"补"回书函组与卷轴签。
   ========================================================================== */
.home-copy { position: absolute; z-index: 4; left: 50%; top: 12%; width: 72%; transform: translateX(-50%); text-align: center; }
.kicker-cn { display: flex; align-items: center; justify-content: center; gap: 10px; margin: 0 0 16px; color: var(--screen-accent); font-size: 12px; letter-spacing: .34em; }
.kicker-rule { display: inline-block; width: 30px; height: 1px; background: color-mix(in srgb, var(--screen-accent) 60%, transparent); }
.home-title { display: flex; align-items: center; justify-content: center; gap: 24px; }
.home-copy h3 { margin: 0; font: 500 clamp(26px, 3.4vw, 52px)/1.1 var(--serif); letter-spacing: .18em; color: var(--screen-ink); text-shadow: 0 1px 0 rgba(255,252,240,.4); }
.home-copy h3 em { margin-left: .34em; color: var(--screen-muted); font-style: normal; }
.home-copy .intro { max-width: 640px; margin: 18px auto 0; color: var(--screen-muted); font-size: 13px; letter-spacing: .12em; line-height: 1.95; }

/* 朱砂白文印 */
.vermilion-seal {
  flex: none;
  display: grid; place-items: center; width: 54px; height: 54px;
  transform: rotate(-4deg);
  background: var(--screen-red); color: #f4ead2;
  font: 500 20px/1.3 var(--serif); letter-spacing: .06em; text-align: center;
  border-radius: 4px;
  box-shadow: inset 0 0 0 2px rgba(244,234,210,.55), inset 0 0 0 5px var(--screen-red), inset 0 0 0 6px rgba(244,234,210,.3), 0 6px 18px rgba(160, 60, 40, .32);
  opacity: .94;
}
.shuiyun .vermilion-seal { background: var(--screen-accent); color: #1c2833; box-shadow: inset 0 0 0 2px rgba(28,40,51,.4), 0 6px 18px rgba(0,0,0,.35); }
.archive .vermilion-seal { background: var(--screen-red); color: #f5ead2; }

/* 线装书函组 / 书影 / 飞鸟：已按"首页不放具象物"的决定整体移除。
   .book / .book-label / .cover-seal / .ink-birds 在 A 稿中不再有引用；
   如需恢复，请从 git 历史取回本段，不要在首页"顺手"补回。 */

/* 右侧「正在展阅」卷轴签：暂停使用（形制保留，暂不挂内容）。
   原内容写死《景定建康志》，会在首页把"方志"当成整屏主语；而现场立轴的形制本身
   是有依据的（现场参考照片），所以只停用、不废弃——待甲方确认立轴上该出现什么
   （展陈题解 / 内容范围 / 本期专题）后再挂回。
   恢复方式：把下面这段取消注释，并在模板里放回 <aside class="home-note scroll-note">。

.scroll-note { position: absolute; z-index: 4; right: 8%; top: 38.5%; width: 13.5%; padding: 26px 0; text-align: center; color: var(--screen-muted);
  background: linear-gradient(180deg, rgba(246,241,226,.65), rgba(240,233,211,.5));
  border-top: 1px solid rgba(96,72,40,.35); border-bottom: 1px solid rgba(96,72,40,.35);
  box-shadow: 0 10px 24px rgba(24,44,33,.1);
}
.rod { position: absolute; left: -7%; right: -7%; height: 12px; border-radius: 6px;
  background: linear-gradient(180deg, #7d5a33 0%, #54391c 55%, #3a2712 100%);
  box-shadow: 0 2px 5px rgba(24,20,10,.4), inset 0 1px 1px rgba(255,230,180,.35); }
.rod::before, .rod::after { content: ""; position: absolute; top: -2px; width: 16px; height: 16px; border-radius: 50%;
  background: radial-gradient(circle at 38% 32%, #8a663c, #452e15 70%); box-shadow: 0 2px 4px rgba(0,0,0,.35); }
.rod::before { left: -8px; } .rod::after { right: -8px; }
.rod-top { top: -6px; } .rod-bottom { bottom: -6px; }
.scroll-note p { margin: 0 0 10px; font-size: 11px; letter-spacing: .42em; color: var(--screen-accent); }
.scroll-note strong { display: block; font: 500 30px var(--serif); letter-spacing: .34em; color: var(--screen-ink); writing-mode: vertical-rl; margin: 0 auto; max-height: 62%; }
.scroll-note small { display: block; margin-top: 12px; font-size: 10px; letter-spacing: .22em; }
.shuiyun .scroll-note { background: rgba(19, 42, 58, .55); border-color: rgba(226,179,108,.35); }
.archive .scroll-note { background: rgba(35, 31, 26, .6); border-color: rgba(223,114,85,.35); }
*/

/* 目录 · 五张竖排签条（效法展墙书标签）——现在是首页主视觉，居中放大 */
.module-slips { position: absolute; z-index: 7; left: 0; right: 0; bottom: 0; top: 0; pointer-events: none; }
/* 原「目 录」竖排小签随布局居中而取消：五条签条自身已表明这是目录，再加一行是冗余 */
.module-slips .slip { pointer-events: auto; }
.module-slips .slip {
  position: absolute; bottom: 21.5%; width: 8%; min-width: 0; height: 40%;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 0;
  padding: 14px 8px;
  border: 1px solid color-mix(in srgb, var(--screen-muted) 40%, transparent);
  /* 签纸色随主题派生（与挂屏/书名签同源）：深底两主题另有覆盖，见下 */
  background: linear-gradient(180deg,
    color-mix(in srgb, var(--screen-paper) 92%, #fff),
    color-mix(in srgb, var(--screen-paper) 82%, var(--screen-muted)));
  box-shadow: 0 8px 18px color-mix(in srgb, var(--screen-deep) 10%, transparent), inset 0 0 0 3px color-mix(in srgb, var(--screen-paper) 80%, transparent), inset 0 0 0 4px color-mix(in srgb, var(--screen-muted) 22%, transparent);
  cursor: pointer;
  transition: transform .24s ease, box-shadow .24s ease, border-color .24s ease;
}
/* 五签等距居中：左起 18%，步进 14%，左右留白各 18% */
.module-slips .slip:nth-of-type(1) { left: 18%; }
.module-slips .slip:nth-of-type(2) { left: 32%; }
.module-slips .slip:nth-of-type(3) { left: 46%; }
.module-slips .slip:nth-of-type(4) { left: 60%; }
.module-slips .slip:nth-of-type(5) { left: 74%; }
.slip-no { flex: none; display: grid; place-items: center; width: 28px; height: 28px; margin-bottom: 10px; border: 1px solid color-mix(in srgb, var(--screen-accent) 55%, transparent); border-radius: 50%; color: var(--screen-accent); font: 500 14px var(--serif); }
/* nowrap 必须留：竖排文字一旦被 flex 压缩就会折成两列（"旧志/典籍"⇒"旧志｜典籍"会读错顺序） */
.slip strong, .slip small { flex: none; white-space: nowrap; writing-mode: vertical-rl; }
.slip strong { font: 500 24px/1.1 var(--serif); letter-spacing: .2em; color: var(--screen-ink); }
.slip small { margin-top: 9px; color: var(--screen-muted); font-size: 11px; letter-spacing: .18em; }
.slip-dot { display: none; }
.slip:hover { transform: translateY(-8px); border-color: color-mix(in srgb, var(--screen-accent) 70%, transparent); box-shadow: 0 18px 30px color-mix(in srgb, var(--screen-deep) 16%, transparent), inset 0 0 0 3px color-mix(in srgb, var(--screen-paper) 88%, transparent), inset 0 0 0 4px color-mix(in srgb, var(--screen-accent) 40%, transparent); }
.slip:active { transform: translateY(-3px) scale(.98); }
/* 五模块平级：红色文化不单独着色，五条签条共用同一套版式。
   这是刻意的设计决定，不要"补"回红色高亮。 */
.shuiyun .slip, .archive .slip { background: rgba(19, 42, 58, .8); }
.archive .slip { background: rgba(40, 34, 28, .85); }

/* ==========================================================================
   A 方向 · 详情页
   ========================================================================== */
/* 注意：% padding 以宽度为基准，详情页版心改用绝对定位分区，确保底边让出预留素材带 */
.audience-detail { padding: 0; }
/* 左栏＝竖排题名 + 提要，右栏＝册页面板。
   左栏只按「刚好装下 .detail-lead 的 300px 版心」取宽（内部画布 ≈324px），不再空转；
   网格间距同步收到 4%。改动前左栏 362px + 间距 84px：题名侧实际空出 230px，视觉上断开。
   改后提要到面板 92px ≈ 版心宽的 5.8%，是正常的栏间距而非空白带。
   用 fr 而非固定 px：画布稿（1586 内部宽）与评审壳屏宽不同，只有比例才能真正同构。 */
.detail-layout { position: absolute; z-index: 5; inset: 9.5% 7.5% 20.5%; display: grid; grid-template-columns: .25fr .75fr; gap: 4%; }
/* 视频展播 / 深度浏览：画面右下不设预留素材位，详情版心相应向下铺满。
   底边取 8.6%：面板底（内部 px 644.3）与「左下预留素材位」底边齐平，横向基准线不散；
   往下仍与屏幕底栏（顶 661.3）留 16.3 内部 px，不压字。
   代价：面板底到画面下缘的这段不再有预留区，这两类画面的右下角由内容自报（见审查记录第十八节）。 */
.display-screen.no-right-slot .detail-layout { inset: 9.5% 7.5% 8.6%; }
.detail-intro { align-self: start; padding-top: 1%; }
.detail-kicker { margin: 0 0 18px; color: var(--screen-accent); font-size: 13px; letter-spacing: .3em; }
/* 竖排题名：右列题名、左列题款（传统次序）；不设 max-height，避免换列乱序 */
.title-vertical { margin: 0; writing-mode: vertical-rl; font: 500 clamp(28px, 3.1vw, 44px)/1.2 var(--serif); letter-spacing: .24em; color: var(--screen-ink); }
.title-vertical em { color: var(--screen-muted); font-style: normal; }
.detail-lead { max-width: 300px; margin: 20px 0 0; color: var(--screen-muted); font-size: 13px; line-height: 2.05; letter-spacing: .1em; }
.back-button, .ghost-button, .primary-button { border: 1px solid color-mix(in srgb, var(--screen-accent) 62%, transparent); border-radius: 2px; color: var(--screen-ink); background: transparent; cursor: pointer; font-family: var(--serif); transition: background .2s ease, transform .15s ease; }
.back-button { margin-top: 24px; padding: 10px 18px; font-size: 13px; letter-spacing: .22em; }
.back-button:hover, .ghost-button:hover, .primary-button:hover { background: color-mix(in srgb, var(--screen-accent) 14%, transparent); }
.back-button:active { transform: scale(.97); }
.detail-hints { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 20px; max-width: 320px; }
.detail-hints span { padding: 5px 11px; border: 1px solid color-mix(in srgb, var(--screen-muted) 28%, transparent); border-radius: 999px; color: var(--screen-muted); font-size: 10px; letter-spacing: .18em; }

/* 册页面板 */
/* 册页面板：高度由版心锁定，内容区走 flex，禁止子元素把面板撑破 */
.detail-panel {
  position: relative; display: flex; flex-direction: column; min-height: 0; padding: 20px 26px;
  border: 1.5px solid color-mix(in srgb, var(--screen-muted) 44%, transparent);
  background: color-mix(in srgb, var(--screen-paper) 74%, transparent);
  box-shadow: inset 0 0 0 5px color-mix(in srgb, var(--screen-paper) 88%, transparent), inset 0 0 0 6px color-mix(in srgb, var(--screen-muted) 24%, transparent), 0 16px 34px rgba(24, 44, 33, .09);
}
.shuiyun .detail-panel { background: rgba(19, 36, 47, .7); box-shadow: none; }
.archive .detail-panel { background: rgba(42, 36, 31, .82); box-shadow: none; }
.panel-overline { display: flex; justify-content: space-between; padding-bottom: 10px; border-bottom: 1px solid color-mix(in srgb, var(--screen-muted) 26%, transparent); color: var(--screen-muted); font: 11px var(--serif); letter-spacing: .26em; }
.detail-panel h4 { margin: 14px 0 6px; font: 500 26px var(--serif); letter-spacing: .2em; color: var(--screen-ink); }
.detail-panel .lead { margin: 0; color: var(--screen-muted); font-size: 12px; line-height: 1.9; letter-spacing: .06em; }
/* 内容区：吃掉面板剩余高度；子块按此高度自适配，不允许外溢 */
.panel-body { flex: 1; min-height: 0; display: flex; flex-direction: column; margin-top: 14px; }
.panel-body > .state-card:only-child { margin-top: auto; margin-bottom: auto; }
/* 无右下预留位的画面（视频展播 / 深度浏览）：空态卡也吃满内容区，卡内内容垂直居中。
   只对这两类画面生效——评审壳的书目空态仍在有预留位的版面里，不该被拉高。 */
.display-screen.no-right-slot .panel-body > .state-card:only-child { flex: 1; min-height: 0; margin: 0; align-items: center; }
.panel-body > .deck-catalog { margin-top: 0; flex: 1; min-height: 0; }

/* 古籍封面框：仅「典籍介绍」层的封面列使用。
   原页阅读器（对开册页 / 鱼尾 / 翻页提示 / 原页缺失空态）已于 2026-09-19 按需求整体移除，
   本版没有原页阅读功能，不要把这些规则"补"回来。 */
.cover-frame { display: flex; flex-direction: column; align-items: center; gap: 8px; padding: 13px 14px; border: 1.5px solid rgba(96, 72, 40, .5); box-shadow: inset 0 0 0 3px #f2ecdb, inset 0 0 0 4px rgba(96, 72, 40, .22); }
.cover-frame strong { writing-mode: vertical-rl; font: 500 19px var(--serif); letter-spacing: .22em; color: #2b4c3d; }
.cover-frame small { color: #7a6444; font-size: 9px; letter-spacing: .2em; }
.cover-stamp { display: grid; place-items: center; width: 26px; height: 26px; transform: rotate(-3deg); background: var(--screen-red); color: #f4ead2; font: 11px/1.05 var(--serif); border-radius: 3px; box-shadow: inset 0 0 0 1.5px rgba(244,234,210,.5); opacity: .9; }

/* ---------- P03 旧志典籍 · 书目总览（列表层） ---------- */
.book-grid { flex: 1; min-height: 0; display: grid; grid-template-columns: repeat(3, 1fr); grid-auto-rows: minmax(0, 1fr); gap: 9px; margin-top: 11px; }
.book-card { display: flex; min-width: 0; overflow: hidden; padding: 0; border: 1px solid color-mix(in srgb, var(--screen-muted) 32%, transparent); border-radius: 2px; background: color-mix(in srgb, var(--screen-paper) 62%, transparent); box-shadow: inset 0 0 0 3px color-mix(in srgb, var(--screen-paper) 85%, transparent), inset 0 0 0 4px color-mix(in srgb, var(--screen-muted) 16%, transparent); cursor: pointer; text-align: left; font-family: var(--serif); transition: transform .2s ease, border-color .2s ease, box-shadow .2s ease; }
.book-card:hover { transform: translateY(-3px); border-color: color-mix(in srgb, var(--screen-accent) 62%, transparent); box-shadow: 0 12px 22px rgba(24, 44, 33, .12); }
.book-card:active { transform: scale(.985); }
/* 书脊：竖排书名。竖排元素不得被 flex 压缩，否则折成多列会变成读序错误 */
.book-spine { flex: none; width: 24px; display: grid; place-items: center; background: linear-gradient(165deg, #bdab78, #8b784c); box-shadow: inset -1px 0 0 rgba(74, 56, 30, .34), inset 1px 0 0 rgba(255, 247, 222, .32); }
.book-spine b { flex: none; white-space: nowrap; writing-mode: vertical-rl; color: #f7f1de; font: 500 12px var(--serif); letter-spacing: .18em; text-shadow: 0 1px 1px rgba(0, 0, 0, .3); }
.book-info { flex: 1; min-width: 0; display: flex; flex-direction: column; padding: 9px 11px 10px; }
.book-info b { display: block; color: var(--screen-ink); font: 500 15px var(--serif); letter-spacing: .1em; }
.book-info small { display: block; margin-top: 4px; color: var(--screen-muted); font-size: 9.5px; letter-spacing: .08em; }
.book-info em { display: block; margin-top: auto; padding-top: 7px; color: var(--screen-muted); font-style: normal; font-size: 9px; line-height: 1.65; letter-spacing: .04em; opacity: .85; }
.book-flag { align-self: flex-start; padding: 2px 6px; border: 1px solid color-mix(in srgb, var(--screen-red) 48%, transparent); color: var(--screen-red); font-size: 8.5px; letter-spacing: .12em; }
.book-flag.muted { border-color: color-mix(in srgb, var(--screen-muted) 42%, transparent); color: var(--screen-muted); }
/* 未录入槽位：虚线卡，明示"这条还缺内容"，不伪造书目 */
.book-card.is-pending { border-style: dashed; box-shadow: none; background: transparent; cursor: default; }
.book-card.is-pending .book-spine { background: transparent; box-shadow: none; }
.book-card.is-pending .book-spine b { color: color-mix(in srgb, var(--screen-muted) 58%, transparent); }
.shuiyun .book-spine, .archive .book-spine { background: linear-gradient(165deg, #6d5a3c, #47391f); }
.book-pager { flex: none; display: flex; align-items: center; justify-content: center; gap: 14px; margin-top: 9px; }
.book-pager span { color: var(--screen-muted); font-size: 10px; letter-spacing: .2em; }
.book-pager button { padding: 5px 12px; border: 1px solid color-mix(in srgb, var(--screen-muted) 38%, transparent); border-radius: 2px; color: var(--screen-muted); background: transparent; cursor: pointer; font: 10px var(--serif); letter-spacing: .14em; }
.book-pager button:hover:not(:disabled) { border-color: var(--screen-accent); color: var(--screen-ink); }
.book-pager button:disabled { opacity: .3; cursor: not-allowed; }

/* ---------- P03b 旧志典籍 · 典籍介绍（详情层） ---------- */
.book-intro { flex: 1; min-height: 0; display: grid; grid-template-columns: .78fr 1.72fr; gap: 4%; }
.book-cover { position: relative; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 13px; padding: 14px 12px; border: 1.5px solid rgba(96, 72, 40, .48); background: linear-gradient(155deg, #dcc897 0%, #cfb887 58%, #c4ac77 100%); box-shadow: inset 0 0 0 4px rgba(243, 236, 218, .5), inset 0 0 0 5px rgba(96, 72, 40, .2), 0 14px 28px rgba(24, 44, 33, .14); }
.book-cover .cover-frame { background: rgba(245, 239, 220, .76); }
.shuiyun .book-cover, .archive .book-cover { border-color: rgba(226, 200, 150, .32); box-shadow: inset 0 0 0 4px rgba(20, 26, 30, .5), inset 0 0 0 5px rgba(226, 200, 150, .16), 0 14px 28px rgba(0, 0, 0, .3); }
.shuiyun .book-cover { background: linear-gradient(155deg, #3d4a52, #2a343b 60%, #4a3628); }
.archive .book-cover { background: linear-gradient(155deg, #514536, #322a22 60%, #4a2f28); }
.shuiyun .book-cover .cover-frame, .archive .book-cover .cover-frame { background: rgba(20, 26, 30, .4); }
.archive .book-cover .cover-frame { background: rgba(30, 25, 20, .45); }
.shuiyun .book-cover .cover-frame strong, .archive .book-cover .cover-frame strong { color: #e8dcc0; }
.book-body { display: flex; flex-direction: column; min-width: 0; min-height: 0; }
.book-meta { display: grid; grid-template-columns: repeat(4, 1fr); flex: none; border: 1px solid color-mix(in srgb, var(--screen-muted) 28%, transparent); }
.meta-cell { padding: 8px 11px; }
.meta-cell + .meta-cell { border-left: 1px solid color-mix(in srgb, var(--screen-muted) 24%, transparent); }
.meta-cell span { display: block; color: var(--screen-muted); font-size: 9px; letter-spacing: .22em; }
.meta-cell strong { display: block; margin-top: 5px; color: var(--screen-ink); font: 500 15px var(--serif); letter-spacing: .1em; }
.meta-cell strong.is-todo { color: var(--screen-red); font-size: 13px; letter-spacing: .16em; }
.book-abstract { flex: 1; min-height: 0; margin-top: 12px; }
.book-abstract h5 { margin: 0 0 7px; color: var(--screen-accent); font: 500 11px var(--serif); letter-spacing: .3em; }
.book-abstract p { margin: 0; color: var(--screen-ink); font-size: 11.5px; line-height: 1.95; letter-spacing: .05em; }
.book-body .relate-grid { margin-top: 12px; }
.book-body .relate-card { padding: 9px 11px; }
.book-body .relate-card strong { margin-top: 4px; font-size: 14px; }
.book-body .relate-card small { margin-top: 3px; font-size: 9px; }
.book-body .panel-footnote { margin-top: 10px; }

/* 人物名帖（两行三列吃满内容区高度） */
.person-list, .video-list { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-top: 12px; }
.person-list { flex: 1; min-height: 0; }
.person-card { display: flex; gap: 12px; padding: 12px 14px; border: 1px solid color-mix(in srgb, var(--screen-muted) 32%, transparent); border-radius: 2px; background: color-mix(in srgb, var(--screen-paper) 62%, transparent); box-shadow: inset 0 0 0 3px color-mix(in srgb, var(--screen-paper) 85%, transparent), inset 0 0 0 4px color-mix(in srgb, var(--screen-muted) 16%, transparent); transition: transform .2s ease, border-color .2s ease, box-shadow .2s ease; }
.person-card:hover { transform: translateY(-3px); border-color: color-mix(in srgb, var(--screen-accent) 62%, transparent); box-shadow: 0 12px 22px rgba(24, 44, 33, .12); }
.person-seal { flex: none; display: grid; place-items: center; width: 40px; height: 40px; margin-top: 2px; border-radius: 50%; color: #f2ebd6; background: radial-gradient(circle at 34% 30%, #4c7263, var(--screen-deep) 72%); font: 500 19px var(--serif); box-shadow: inset 0 0 0 2px rgba(242, 235, 214, .38), 0 4px 10px rgba(24, 44, 33, .2); }
.person-info b { display: block; color: var(--screen-ink); font: 500 17px var(--serif); letter-spacing: .18em; }
.person-info small { display: block; margin-top: 6px; color: var(--screen-muted); font-size: 10px; line-height: 1.7; letter-spacing: .06em; }
.person-link { display: inline-block; margin-top: 9px; padding-top: 7px; width: 100%; border-top: 1px solid color-mix(in srgb, var(--screen-muted) 24%, transparent); color: var(--screen-accent); font-size: 10px; letter-spacing: .2em; }
.shuiyun .person-card, .shuiyun .video-card, .archive .person-card, .archive .video-card { background: rgba(29, 48, 58, .68); }
.archive .person-card, .archive .video-card { background: rgba(52, 44, 37, .6); }

/* 深度浏览：手卷展板（两端轴杆）。展板是这一页的主体，吃满面板内容区，竖排水印不得被裁。
   2026-09-19 下午：本层面板不再重复模块名（标题由展板自己的大标题承担，同第 15.2 节分层规则），
   省下的头部高度全部给展板（实测 288.6 → 358.4 内部 px，占面板 58.5% → 72.6%）。 */
.deck-page { position: relative; flex: 1; min-height: 0; overflow: hidden; margin: 0 14px; padding: 26px 38px; border-top: 1px solid rgba(120, 96, 52, .4); border-bottom: 1px solid rgba(120, 96, 52, .4); color: #f0e4c6; background: linear-gradient(118deg, #26312c 0%, #43584a 52%, #8f6f45 100%); box-shadow: 0 16px 30px rgba(24, 44, 33, .22); }
.deck-page::before { content: ""; position: absolute; inset: 7px 12px; border: 1px solid rgba(240, 228, 198, .26); pointer-events: none; }
.deck-rod { position: absolute; top: -8px; bottom: -8px; width: 14px; border-radius: 7px; background: linear-gradient(90deg, #7d5a33, #54391c 55%, #3a2712); box-shadow: 2px 0 6px rgba(24,20,10,.45), inset 0 1px 1px rgba(255,230,180,.3); z-index: 2; }
.rod-left { left: -7px; } .rod-right { right: -7px; }
.deck-vertical { position: absolute; right: 6%; top: 50%; transform: translateY(-50%); opacity: .18; writing-mode: vertical-rl; font: 34px var(--serif); letter-spacing: .18em; color: #f0e4c6; white-space: nowrap; }
/* 展板题头行＝「模块名 · 展卷 · 页码」。模块名从面板头挪到这里，页面仍能自报家门 */
.deck-page h5 { margin: 0; color: #efd28f; font: 500 15px var(--serif); letter-spacing: .3em; }
/* 展板大标题必须显式给色：只靠 .deck-page 的 color 继承会被 .detail-panel h4 的深墨色覆盖，
   在深绿底上等于看不见（改动前实测 rgb(38,66,47) 对深绿底，观众读不清）。 */
.deck-page h4 { margin: 15px 0 12px; max-width: 62%; font: 500 44px var(--serif); letter-spacing: .16em; color: #f0e4c6; }
.deck-page p { max-width: 50%; margin: 0; color: rgba(240, 228, 198, .84); font-size: 13px; line-height: 2; letter-spacing: .06em; }
.deck-controls { display: flex; align-items: center; gap: 10px; margin: 14px 14px 0; color: var(--screen-muted); font-size: 12px; }
/* 翻阅是这一页的首要动作：按钮加大到约 40 内部 px 高（现场 4320 屏约 109px），便于触摸 */
.deck-controls button { border: 1px solid color-mix(in srgb, var(--screen-accent) 68%, transparent); border-radius: 2px; padding: 11px 22px; color: var(--screen-ink); background: transparent; cursor: pointer; font: 13.5px var(--serif); letter-spacing: .2em; transition: background .2s ease; }
.deck-controls button:hover { background: color-mix(in srgb, var(--screen-accent) 14%, transparent); }
.deck-progress { letter-spacing: .26em; }

/* 视频卡（两行三列吃满内容区高度；16:9 缩略图同步收敛） */
.video-list { flex: 1; min-height: 0; }
/* 四条影像时改 2×2，避免 3+1 留下空格 */
.video-list.is-quad { grid-template-columns: repeat(2, 1fr); }
/* 内容吃满：卡片随网格行拉高后，缩略图吃掉剩余高度。原来缩略图固定 64px，
   面板下沿铺满后余量会全留成卡片内空白（卡高了、封面照旧小）。 */
.video-card { position: relative; display: flex; flex-direction: column; padding: 9px 10px 10px; border: 1px solid color-mix(in srgb, var(--screen-muted) 32%, transparent); border-radius: 2px; background: color-mix(in srgb, var(--screen-paper) 62%, transparent); box-shadow: inset 0 0 0 3px color-mix(in srgb, var(--screen-paper) 85%, transparent), inset 0 0 0 4px color-mix(in srgb, var(--screen-muted) 16%, transparent); cursor: pointer; text-align: left; transition: transform .2s ease, border-color .2s ease, box-shadow .2s ease; }
.video-card:hover { border-color: color-mix(in srgb, var(--screen-accent) 64%, transparent); transform: translateY(-3px); box-shadow: 0 12px 22px rgba(24, 44, 33, .14); }
.video-card:active { transform: scale(.98); }
.video-thumb { display: block; position: relative; flex: 1; min-height: 64px; margin-bottom: 9px; overflow: hidden; background: linear-gradient(130deg, var(--screen-deep), #43614f 58%, var(--screen-accent)); }
.video-thumb::before { content: ""; position: absolute; inset: 5px; border: 1px solid rgba(240, 230, 204, .3); }
.video-thumb::after { content: "▶"; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); display: grid; place-items: center; width: 34px; height: 34px; border: 1.5px solid rgba(245, 233, 202, .8); border-radius: 50%; color: #f5e9ca; font-size: 12px; padding-left: 2px; }
.vt-time { position: absolute; right: 6px; bottom: 6px; padding: 2px 7px; background: rgba(20, 32, 26, .68); color: #f0e6cc; font: 10px var(--serif); font-style: normal; letter-spacing: .14em; }
.video-card b { display: block; padding: 0 3px; color: var(--screen-ink); font: 500 16px var(--serif); letter-spacing: .14em; }
.video-card small { display: block; margin-top: 5px; padding: 0 3px; color: var(--screen-muted); font-size: 10px; letter-spacing: .1em; }
.playing-badge { position: absolute; inset: 0; z-index: 2; display: grid; place-items: center; background: rgba(24, 40, 33, .74); color: #f4e6c2; font: 12px var(--serif); letter-spacing: .2em; }

/* 红色文化：左侧「时间线 + 关联卡 + 待审核」、右侧档案卡。两栏并列，全部落在面板内 */
.red-body { flex: 1; min-height: 0; display: grid; grid-template-columns: 1fr 24%; gap: 16px; }
.red-main { display: flex; flex-direction: column; gap: 14px; min-width: 0; }
.timeline { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; }
.timeline-step { position: relative; padding: 12px 8px 8px; border-top: 2px solid color-mix(in srgb, var(--screen-red) 58%, transparent); color: var(--screen-muted); font-size: 10px; }
.timeline-step::before { content: ""; position: absolute; top: -6px; left: 0; width: 8px; height: 8px; border: 1.5px solid var(--screen-red); border-radius: 50%; background: var(--screen-paper); }
.timeline-step.is-active::before { background: var(--screen-red); box-shadow: 0 0 0 3px color-mix(in srgb, var(--screen-red) 18%, transparent); }
.timeline-step strong { display: block; margin-bottom: 6px; color: var(--screen-red); font: 500 14px var(--serif); letter-spacing: .14em; }
.timeline-step span { display: block; color: var(--screen-ink); font: 500 13px var(--serif); letter-spacing: .14em; }
.timeline-step small { display: block; margin-top: 6px; color: var(--screen-muted); font-size: 9px; letter-spacing: .12em; }
.red-main .relate-grid { margin-top: 0; grid-template-columns: repeat(3, 1fr); }
.red-note { display: flex; align-items: center; gap: 14px; margin-top: 0; padding: 12px 14px; border: 1px dashed color-mix(in srgb, var(--screen-red) 48%, transparent); background: color-mix(in srgb, var(--screen-red) 5%, transparent); }
.red-stamp { flex: none; display: grid; place-items: center; width: 50px; height: 28px; transform: rotate(-5deg); border: 1.5px solid var(--screen-red); border-radius: 3px; color: var(--screen-red); font: 500 12px var(--serif); letter-spacing: .24em; opacity: .88; }
.red-note p { margin: 0; color: var(--screen-muted); font-size: 10px; line-height: 1.8; letter-spacing: .06em; }
/* 档案卡：作为红页右栏的实体卡片，不再绝对定位压到面板上 */
.visual-card { position: relative; width: 100%; height: 100%; overflow: hidden; background: linear-gradient(160deg, var(--screen-deep), var(--screen-red) 130%); box-shadow: 0 18px 34px rgba(24, 44, 33, .24); }
.visual-card::before { content: ""; position: absolute; width: 74%; height: 58%; left: 13%; bottom: -9%; border: 2px solid rgba(244,224,177,.58); border-bottom: 0; border-radius: 50% 50% 0 0; }
.visual-card::after { content: "宁"; position: absolute; left: 50%; top: 36%; transform: translateX(-50%); color: rgba(244,224,177,.72); font: 58px var(--serif); }
.vc-no { position: absolute; left: 12px; top: 10px; color: rgba(244, 224, 177, .78); font: 10px var(--serif); letter-spacing: .22em; }
.vc-title { position: absolute; right: 12px; bottom: 10px; color: rgba(244, 224, 177, .88); font: 500 13px var(--serif); letter-spacing: .28em; }

/* ==========================================================================
   馆方后台（三方向共用工作台）
   配色统一收口在 .is-admin 的 --adm-* token 上——画布稿与评审壳共用同一份 styles.css，
   改这一处两边同时生效，不用去追散落的色值。
   明度基准（L*）：屏幕底 33 → 卡片 36 → 抬起块 39；侧栏上 36 / 下 26。
   原「近黑底」L*≈7 在展厅里就是一块黑斑，2026-09-19 按负责人要求整体提亮
   （底 Y 0.008→0.073，约 9 倍亮度），仍是暖中性工作台底色，与观众端宣纸屏（L*≈91）拉开区分。
   两条来自实测的约束（见 scripts/audit-admin-tone.mjs）：
     ① 底色越是往中间调走，小字对比度越难保。所以底色层次压得紧（33/36/39），
        文字阶梯反而要亮（主 7.6:1 / 次 6.7:1 / 辅 5.8:1，最亮的底上也 ≥4.6:1）；
     ② 高亮态用「压暗内嵌」--adm-inset，不用同色浅底：徽标、导航当前项、当前版本行
        若用色相自身的浅色打底，10px 小字会掉到 4:1 以下（实测 3.4~4.2），压暗后回到 6.4~8.8。
   ========================================================================== */
.is-admin {
  --adm-bg: #584d3b;
  --adm-bg-deep: #463c2d;
  --adm-side-top: #5e5340;
  --adm-panel: #605441;
  --adm-panel-hi: #665a45;
  --adm-inset: color-mix(in srgb, #000 20%, transparent);
  --adm-line: color-mix(in srgb, var(--adm-ink) 30%, transparent);
  --adm-line-strong: color-mix(in srgb, var(--adm-ink) 46%, transparent);
  --adm-ink: #fbf5e7;
  --adm-ink-soft: #efe7d3;
  --adm-ink-dim: #e2d8bf;
  --adm-accent: #f2d1a4;
  --adm-on-accent: #3a3120;
  --adm-green: #d3ecc4;
  --adm-amber: #fce9bb;
  --adm-red: #fdcbba;
}
/* 屏框顶栏/底栏原本取观众端的 --screen-muted（青灰），在提亮后的暖底上会发灰发脏，
   后台下改用工作台自己的辅助色。 */
.is-admin .screen-topbar, .is-admin .screen-footer { color: var(--adm-ink-dim); }
.admin-shell { position: absolute; inset: 0; display: grid; grid-template-columns: 23% 1fr; color: var(--adm-ink); background: var(--adm-bg); animation: screen-in .45s ease both; font-family: var(--serif); }
.admin-sidebar { padding: 12% 10% 10%; border-right: 1px solid var(--adm-line); background: linear-gradient(180deg, var(--adm-side-top), var(--adm-bg-deep)); }
.admin-sidebar h3 { margin: 10px 0 4px; color: var(--adm-ink); font: 500 22px var(--serif); letter-spacing: .16em; }
.admin-sidebar p { margin: 0 0 26px; color: var(--adm-ink-dim); font-size: 11px; line-height: 1.8; letter-spacing: .04em; }
.admin-nav { display: grid; gap: 4px; }
.admin-nav button { padding: 10px 12px; border: 0; border-left: 2px solid transparent; color: var(--adm-ink-dim); background: transparent; cursor: pointer; text-align: left; font-size: 12px; font-family: var(--serif); letter-spacing: .1em; }
.admin-nav button:hover, .admin-nav button.is-active { border-left-color: var(--adm-accent); color: var(--adm-ink); background: var(--adm-inset); }
.admin-main { position: relative; padding: 0; overflow: hidden; }
/* % padding 以宽度为基准会压塌纵向空间，后台版心改用绝对定位，底边让出预留素材带 */
.admin-inner { position: absolute; inset: 9.5% 7% 18.5% 7%; display: flex; flex-direction: column; min-height: 0; }
.admin-header { display: flex; justify-content: space-between; align-items: end; border-bottom: 1px solid var(--adm-line-strong); padding-bottom: 10px; }
.admin-header h4 { margin: 3px 0 0; color: var(--adm-ink); font: 500 24px var(--serif); letter-spacing: .18em; }
.admin-header .admin-status { color: var(--adm-green); font-size: 11px; letter-spacing: .08em; }
/* 后台内容区：宽而矮的屏，用两栏吃掉横向余量，避免竖向堆叠被裁 */
.admin-body { padding-top: 12px; flex: 1; min-height: 0; overflow: hidden; display: flex; flex-direction: column; }
.stat-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-bottom: 12px; }
.stat { padding: 9px 12px; border: 1px solid var(--adm-line); background: var(--adm-panel); }
.stat span { display: block; color: var(--adm-ink-dim); font-size: 11px; letter-spacing: .1em; }
.stat strong { display: block; margin-top: 3px; color: var(--adm-ink); font: 500 20px var(--serif); }
.admin-grid { flex: 1; min-height: 0; display: grid; grid-template-columns: 1.1fr 1fr; gap: 14px; align-items: stretch; }
.admin-col { display: flex; flex-direction: column; justify-content: space-between; gap: 11px; min-height: 0; }
.admin-col > .upload-drop { flex: 1 1 auto; min-height: 110px; }
.admin-col > .admin-card { flex: none; }
.upload-drop { display: flex; flex-direction: column; justify-content: center; align-items: center; padding: 10px 14px; border: 1px dashed var(--adm-accent); color: var(--adm-ink-soft); background: var(--adm-panel-hi); text-align: center; }
.upload-drop .upload-icon { display: grid; place-items: center; width: 26px; height: 26px; margin-bottom: 5px; border: 1px solid var(--adm-accent); border-radius: 50%; color: var(--adm-accent); font-size: 15px; }
.upload-drop b { color: var(--adm-ink); font-size: 13px; font-weight: 400; letter-spacing: .08em; }
.upload-drop small { margin-top: 4px; color: var(--adm-ink-dim); font-size: 10px; }
.admin-card { padding: 10px 12px; border: 1px solid var(--adm-line); background: var(--adm-panel); }
.admin-card h5 { margin: 0 0 6px; color: var(--adm-ink); font: 500 13px var(--serif); letter-spacing: .12em; }
.upload-item { display: flex; justify-content: space-between; gap: 10px; padding: 7px 0; border-top: 1px solid var(--adm-line); color: var(--adm-ink-dim); font-size: 10px; }
.upload-item strong { color: var(--adm-ink-soft); font-weight: 400; }
.status-badge { padding: 3px 7px; color: var(--adm-green); border: 1px solid color-mix(in srgb, var(--adm-green) 55%, transparent); background: var(--adm-inset); font-size: 10px; white-space: nowrap; letter-spacing: .06em; }
.status-badge.review { color: var(--adm-amber); border-color: color-mix(in srgb, var(--adm-amber) 55%, transparent); }
.status-badge.failed { color: var(--adm-red); border-color: color-mix(in srgb, var(--adm-red) 55%, transparent); }
.admin-flow { display: flex; gap: 5px; }
.flow-step { flex: 1; padding: 6px 6px; border-top: 1px solid var(--adm-line); color: var(--adm-ink-dim); font-size: 10px; text-align: center; letter-spacing: .06em; }
.flow-step.is-done { color: var(--adm-green); border-color: var(--adm-green); }
.flow-step.is-current { color: var(--adm-amber); border-color: var(--adm-accent); }
.admin-actions { display: flex; gap: 8px; margin-top: 8px; }
.admin-actions button { padding: 6px 10px; border: 1px solid var(--adm-accent); color: var(--adm-amber); background: transparent; cursor: pointer; font-size: 11px; font-family: var(--serif); letter-spacing: .08em; }
.admin-actions button.primary { color: var(--adm-on-accent); background: var(--adm-accent); }

/* 后台视图下预留素材区退成「线框提示」：原来是一块近黑方块，在提亮后的暖底上反而更扎眼，
   改为在底色上叠一层浅膜，左右同款。换 token 同时修掉一个老问题——槽位说明文字
   （扫码观看 / 语音介绍）用的是观众端深棕色，落在深底上一直不可见，现在能读出来了。 */
.is-admin .reserved-slot { opacity: .72; }
.is-admin .reserved-slot-left { background: color-mix(in srgb, var(--adm-ink) 8%, transparent); border-color: var(--adm-line-strong); color: var(--adm-ink-dim); }
.is-admin .reserved-slot-right { background: color-mix(in srgb, var(--adm-ink) 8%, transparent); border-color: var(--adm-line-strong); color: var(--adm-ink-dim); }
.is-admin .reserved-slot small { opacity: .85; }
.is-admin .qr-pair img { width: 34px; height: 34px; }

.studio-footer { display: flex; justify-content: space-between; gap: 20px; padding: 14px 2px 0; color: #7d7663; font-size: 11px; letter-spacing: .08em; font-family: var(--serif); }
.studio-footer kbd { display: inline-block; margin: 0 2px; padding: 2px 5px; border: 1px solid #57523f; border-radius: 3px; color: #b7ad92; background: rgba(255,248,230,.05); font-size: 10px; }
.studio-footer i { margin: 0 7px; }

/* ==========================================================================
   画布补充组件：P01 待机、空/异常状态、筛选签、播放态、处理进度、版本撤回
   只用既有 --screen-* token，三主题共用结构。
   ========================================================================== */

/* ---------- P01 待机/欢迎页 ---------- */
.audience-idle { position: absolute; inset: 0; overflow: hidden; color: var(--screen-ink); background: var(--screen-paper); animation: screen-in .7s ease both; font-family: var(--serif); cursor: pointer; }
.moyun .audience-idle {
  --screen-paper: #ede6d2; --screen-ink: #26422f; --screen-muted: #71806f;
  --screen-accent: #96683a; --screen-deep: #21473a; --screen-red: #a03c28;
  background:
    radial-gradient(ellipse 60% 46% at 86% 5%, rgba(255, 252, 238, .92), transparent 62%),
    radial-gradient(ellipse 52% 58% at 3% 97%, rgba(191, 178, 138, .36), transparent 60%),
    linear-gradient(168deg, #f1ebd9 0%, #eae2cb 48%, #e2d9bd 100%);
}
.shuiyun .audience-idle { --screen-paper: #132a3a; --screen-ink: #e6ece0; --screen-muted: #7da8a0; --screen-accent: #e2b36c; --screen-deep: #0c1d2a; --screen-red: #d68469; }
.archive .audience-idle { --screen-paper: #171615; --screen-ink: #efe4cf; --screen-muted: #a39887; --screen-accent: #df7255; --screen-deep: #28231f; --screen-red: #e7795f; }
.moyun .audience-idle::before {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none; mix-blend-mode: multiply;
  background:
    repeating-linear-gradient(0deg, rgba(104, 88, 58, .028) 0 1px, transparent 1px 4px),
    repeating-linear-gradient(90deg, rgba(104, 88, 58, .02) 0 1px, transparent 1px 6px),
    radial-gradient(ellipse 118% 88% at 50% 50%, transparent 70%, rgba(112, 90, 54, .13) 100%);
}
.shuiyun .audience-idle::before, .archive .audience-idle::before { content: ""; position: absolute; inset: 0; opacity: .4; pointer-events: none; background: repeating-linear-gradient(90deg, transparent 0 12px, rgba(237,225,202,.03) 13px 14px); }
.idle-core { position: absolute; z-index: 5; left: 50%; top: 46%; width: 66%; transform: translate(-50%, -50%); text-align: center; }
.idle-seal { display: grid; place-items: center; width: 62px; height: 62px; margin: 0 auto 30px; transform: rotate(45deg); border: 1.5px solid color-mix(in srgb, var(--screen-accent) 62%, transparent); color: var(--screen-accent); font: 500 30px var(--serif); }
.idle-core h3 { margin: 0; font: 500 clamp(34px, 4.6vw, 74px)/1.12 var(--serif); letter-spacing: .18em; color: var(--screen-ink); text-shadow: 0 1px 0 rgba(255,252,240,.38); }
.idle-core h3 em { display: block; margin-top: 8px; color: var(--screen-muted); font-style: normal; font-size: .58em; letter-spacing: .42em; }
.idle-lead { margin: 30px 0 0; color: var(--screen-muted); font-size: 14px; letter-spacing: .22em; }
.idle-cue { display: inline-flex; align-items: center; gap: 12px; margin-top: 46px; padding: 15px 30px; border: 1px solid color-mix(in srgb, var(--screen-accent) 56%, transparent); color: var(--screen-ink); font-size: 15px; letter-spacing: .3em; background: color-mix(in srgb, var(--screen-paper) 30%, transparent); }
.idle-pulse { width: 9px; height: 9px; border-radius: 50%; background: var(--screen-accent); box-shadow: 0 0 0 0 color-mix(in srgb, var(--screen-accent) 55%, transparent); animation: idle-pulse 2.4s ease-out infinite; }
@keyframes idle-pulse { 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--screen-accent) 55%, transparent); } 70% { box-shadow: 0 0 0 15px transparent; } 100% { box-shadow: 0 0 0 0 transparent; } }
.idle-foot { position: absolute; z-index: 5; left: 4.6%; right: 4.6%; bottom: 6.4%; display: flex; justify-content: space-between; color: var(--screen-muted); font-size: 11px; letter-spacing: .3em; }
.moyun .audience-idle .ink-wash { opacity: .7; }

/* ---------- 空状态 / 异常状态卡 ---------- */
.state-card { display: flex; gap: 18px; align-items: flex-start; margin-top: 0; padding: 22px 24px; border: 1px dashed color-mix(in srgb, var(--screen-muted) 46%, transparent); background: color-mix(in srgb, var(--screen-paper) 42%, transparent); }
.state-empty .state-mark { flex: none; display: grid; place-items: center; width: 46px; height: 46px; border: 1.5px solid color-mix(in srgb, var(--screen-muted) 52%, transparent); border-radius: 50%; color: var(--screen-muted); font: 500 19px var(--serif); }
.state-mark.small { width: 34px; height: 34px; border-color: color-mix(in srgb, var(--screen-red) 55%, transparent); color: var(--screen-red); font-size: 16px; }
.state-card strong { display: block; color: var(--screen-ink); font: 500 20px var(--serif); letter-spacing: .14em; }
.state-card p { margin: 12px 0 0; color: var(--screen-muted); font-size: 12px; line-height: 2; letter-spacing: .06em; max-width: 560px; }
.state-card .ghost-button { margin-top: 16px; }
.ghost-button, .primary-button { padding: 9px 16px; font-size: 12px; letter-spacing: .18em; border-radius: 2px; }
.ghost-button.tiny { padding: 5px 11px; font-size: 10px; letter-spacing: .1em; }
.ghost-button:disabled { opacity: .35; cursor: not-allowed; }
.primary-button { color: #241f14; background: color-mix(in srgb, var(--screen-accent) 78%, transparent); }
.panel-footnote { margin: 12px 0 0; color: var(--screen-muted); font-size: 10px; line-height: 1.9; letter-spacing: .1em; opacity: .85; }

/* ---------- 筛选签（人物索引 / 评审辅助） ---------- */
.filter-row { display: flex; align-items: center; gap: 7px; margin-top: 0; }
.filter-chip { padding: 8px 15px; border: 1px solid color-mix(in srgb, var(--screen-muted) 38%, transparent); border-radius: 999px; color: var(--screen-muted); background: transparent; cursor: pointer; font: 12px var(--serif); letter-spacing: .16em; transition: .2s ease; }
.filter-chip:hover { border-color: color-mix(in srgb, var(--screen-accent) 62%, transparent); color: var(--screen-ink); }
.filter-chip.is-active { border-color: var(--screen-accent); color: #f3ecd8; background: color-mix(in srgb, var(--screen-accent) 78%, transparent); }
.archive .filter-chip.is-active, .shuiyun .filter-chip.is-active { color: #14110d; }
.filter-count { margin-left: auto; color: var(--screen-muted); font-size: 11px; letter-spacing: .2em; }
button.person-card, button.timeline-step, button.video-card { width: 100%; text-align: left; font-family: var(--serif); }
button.timeline-step { border-left: 0; border-right: 0; border-bottom: 0; background: transparent; cursor: pointer; }

/* ---------- 人物详情 + 关联内容 ---------- */
/* 返回动作已从面板顶部移到下方动作条：顶部先放「退回」会打断
   「标题 → 提要 → 人物 → 关联」的阅读顺序，观众还没读就被告知怎么走。
   .person-detail 作为 .panel-body 的唯一子块，须显式 flex:1; min-height:0 才能吃满高度，
   底栏再用 margin-top:auto 贴住面板下缘（版心锁高，不允许靠 min-height 撑）。 */
.person-detail { flex: 1; min-height: 0; display: flex; flex-direction: column; }
.panel-footer { margin-top: auto; display: flex; align-items: center; justify-content: space-between; gap: 20px; padding-top: 14px; }
.panel-footer .panel-footnote { margin: 0; max-width: 64%; }
.panel-footer > button { flex: none; }
/* 面板标题去掉后（2026-09-19），内容区多出约 54 内部 px。
   这段余量分给人物名帖与关联卡片，而不是在面板下方留出一条空带——
   本条页的正文就是「这个人」，放大名帖与卡片正是「直接展示人物」的表达。 */
.person-hero { display: flex; gap: 20px; align-items: center; margin-top: 18px; padding: 12px 0 24px; border-bottom: 1px solid color-mix(in srgb, var(--screen-muted) 26%, transparent); }
.person-seal.large { width: 74px; height: 74px; font-size: 32px; }
.person-hero h5 { margin: 0; color: var(--screen-ink); font: 500 33px var(--serif); letter-spacing: .2em; }
.person-meta { margin: 9px 0 0; color: var(--screen-accent); font-size: 12px; letter-spacing: .22em; }
.person-note { margin: 7px 0 0; color: var(--screen-muted); font-size: 12px; letter-spacing: .08em; }
.relate-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-top: 16px; }
.relate-card { padding: 12px 13px; border: 1px solid color-mix(in srgb, var(--screen-muted) 30%, transparent); background: color-mix(in srgb, var(--screen-paper) 58%, transparent); }
.relate-card span { display: block; color: var(--screen-muted); font-size: 10px; letter-spacing: .24em; }
.relate-card strong { display: block; margin-top: 6px; color: var(--screen-ink); font: 500 16px var(--serif); letter-spacing: .12em; }
.relate-card small { display: block; margin-top: 5px; color: var(--screen-muted); font-size: 10px; line-height: 1.7; }
/* 只作用于人物详情：.relate-grid / .relate-card 的基样式还与典籍介绍（.book-body）、
   红色文化（.red-main）共用，那两处各有覆盖，不动基样式以免连带改到那两页。 */
.person-detail .relate-grid { margin-top: 22px; }
.person-detail .relate-card { padding: 17px 15px; }

/* ---------- 深度浏览：目录 / 工具条 ---------- */
/* 目录层：12 项吃掉整个内容区高度。行高不铺满会让「收起目录」上面空出一条大带 */
.deck-catalog { margin-top: 0; display: flex; flex-direction: column; }
.catalog-title { margin: 0 0 12px; color: var(--screen-accent); font-size: 12px; letter-spacing: .3em; }
.catalog-grid { flex: 1; min-height: 0; display: grid; grid-template-columns: repeat(4, 1fr); grid-auto-rows: 1fr; gap: 7px; }
.catalog-item { display: flex; flex-direction: column; justify-content: center; gap: 6px; padding: 11px 12px; border: 1px solid color-mix(in srgb, var(--screen-muted) 30%, transparent); border-radius: 2px; color: var(--screen-ink); background: color-mix(in srgb, var(--screen-paper) 52%, transparent); cursor: pointer; font: 12px var(--serif); letter-spacing: .14em; text-align: left; transition: .2s ease; }
.catalog-item small { color: var(--screen-muted); font-size: 10px; letter-spacing: .08em; }
.catalog-item:hover { border-color: color-mix(in srgb, var(--screen-accent) 62%, transparent); }
.catalog-item.is-active { border-color: var(--screen-accent); background: color-mix(in srgb, var(--screen-accent) 16%, transparent); }
.deck-tools { display: flex; gap: 6px; margin-left: auto; }
.deck-tools button { padding: 11px 16px; border: 1px solid color-mix(in srgb, var(--screen-muted) 42%, transparent); border-radius: 2px; color: var(--screen-ink); background: transparent; cursor: pointer; font: 12px var(--serif); letter-spacing: .16em; }
.deck-tools button:hover { border-color: color-mix(in srgb, var(--screen-accent) 62%, transparent); }
.deck-tools button[aria-pressed="true"] { border-color: var(--screen-accent); color: #f3ecd8; background: color-mix(in srgb, var(--screen-accent) 74%, transparent); }

/* ---------- P06 视频播放台（播放台吃满内容区，控制条与说明固定在下方） ---------- */
.video-stage { flex: 1; min-height: 0; display: flex; flex-direction: column; }
.stage-screen { position: relative; flex: 1; min-height: 190px; overflow: hidden; background: linear-gradient(130deg, var(--screen-deep), #43614f 58%, var(--screen-accent)); box-shadow: 0 14px 28px rgba(24, 44, 33, .16); }
.stage-frame { position: absolute; inset: 8px; border: 1px solid rgba(240, 230, 204, .3); }
.stage-overlay { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; background: rgba(20, 34, 27, .5); color: #f4e9cd; text-align: center; }
.stage-overlay strong { font: 500 22px var(--serif); letter-spacing: .26em; }
.stage-overlay small { color: rgba(244, 233, 205, .74); font-size: 11px; letter-spacing: .16em; }
.stage-overlay.is-failed { background: rgba(38, 22, 18, .68); }
.stage-reason { max-width: 62%; padding: 8px 14px; border: 1px dashed rgba(231, 156, 137, .6); color: #f0c7b6; font-size: 11px; letter-spacing: .1em; line-height: 1.8; }
.stage-actions { display: flex; gap: 10px; margin-top: 4px; }
.stage-actions .primary-button { border: 1px solid color-mix(in srgb, #e79c89 70%, transparent); color: #2a1a14; background: #e9b8a4; }
.stage-actions .ghost-button { border-color: rgba(244, 233, 205, .5); color: #f4e9cd; }
.stage-spinner { width: 34px; height: 34px; border: 2px solid rgba(244, 233, 205, .3); border-top-color: #f4e9cd; border-radius: 50%; animation: stage-spin 1.1s linear infinite; }
@keyframes stage-spin { to { transform: rotate(360deg); } }
.play-ring { display: grid; place-items: center; width: 44px; height: 44px; border: 1.5px solid rgba(245, 233, 202, .82); border-radius: 50%; color: #f5e9ca; font-size: 13px; }
.stage-bar { display: flex; align-items: center; gap: 14px; margin-top: 11px; }
.stage-progress { flex: 1; height: 4px; background: color-mix(in srgb, var(--screen-muted) 30%, transparent); }
.stage-progress i { display: block; height: 100%; background: var(--screen-accent); }
.stage-time { color: var(--screen-muted); font-size: 11px; letter-spacing: .16em; white-space: nowrap; }
.stage-caption { margin: 10px 0 0; color: var(--screen-muted); font-size: 12px; letter-spacing: .1em; }
.stage-caption b { color: var(--screen-ink); font-weight: 500; letter-spacing: .14em; }
.thumb-flag { position: absolute; left: 6px; top: 6px; padding: 2px 7px; background: rgba(160, 60, 40, .82); color: #f6e7d2; font: 10px var(--serif); font-style: normal; letter-spacing: .14em; }

/* ---------- P08–P10 后台：进度 / 错误分类 / 审核 / 版本 ---------- */
.progress-track { width: 62%; height: 4px; margin-top: 8px; background: var(--adm-line); }
.progress-track i { display: block; height: 100%; background: var(--adm-accent); transition: width .5s ease; }
.progress-caption { margin-top: 5px; }
.error-card { border-color: color-mix(in srgb, var(--adm-red) 50%, transparent); }
.error-head { margin-bottom: 5px; }
.error-detail { margin: 0; color: var(--adm-ink-soft); font-size: 11px; line-height: 1.8; }
.error-action { margin: 6px 0 0; color: var(--adm-ink-dim); font-size: 11px; line-height: 1.8; }
.error-action b { display: inline; margin-right: 6px; color: var(--adm-amber); font-weight: 400; letter-spacing: .12em; }
.error-catalog { margin-top: 8px; padding-top: 7px; border-top: 1px solid var(--adm-line); }
.error-catalog-list { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 5px; }
.error-chip { padding: 3px 7px; border: 1px solid var(--adm-line); color: var(--adm-ink-dim); font-size: 10px; letter-spacing: .06em; }
.error-chip.is-active { border-color: color-mix(in srgb, var(--adm-red) 70%, transparent); color: var(--adm-red); }
.flow-step.is-failed { color: var(--adm-red); border-color: var(--adm-red); }
.check-row { display: flex; align-items: center; gap: 10px; padding: 5px 0; border-top: 1px solid var(--adm-line); color: var(--adm-ink-dim); font-size: 10px; letter-spacing: .06em; }
.check-box { flex: none; position: relative; width: 13px; height: 13px; border: 1px solid color-mix(in srgb, var(--adm-green) 70%, transparent); }
.check-box::after { content: ""; position: absolute; left: 3px; top: 3px; width: 5px; height: 5px; background: var(--adm-green); }
.version-row { display: flex; align-items: center; gap: 8px; padding: 6px 0; border-top: 1px solid var(--adm-line); }
.version-row.is-current { background: var(--adm-inset); }
.version-tag { flex: none; min-width: 42px; color: var(--adm-accent); font-size: 11px; letter-spacing: .1em; }
.version-title { flex: 1; color: var(--adm-ink-soft); font-size: 11px; letter-spacing: .06em; }
.admin-notice { margin: 0 0 6px; padding: 6px 10px; border: 1px dashed color-mix(in srgb, var(--adm-green) 60%, transparent); color: var(--adm-green); font-size: 11px; letter-spacing: .06em; }
.admin-card .ghost-button { border: 1px solid var(--adm-line-strong); color: var(--adm-ink); background: transparent; cursor: pointer; font-family: var(--serif); }
.admin-card .ghost-button:hover { background: color-mix(in srgb, var(--adm-ink) 12%, transparent); }
.admin-card .panel-footnote { margin-top: 6px; color: var(--adm-ink-dim); }

@media (max-width: 1280px) {
  .studio-shell { width: calc(100vw - 42px); }
  .toolbar-controls { gap: 5px; }
  .direction-button { padding: 8px 8px; }
  .preview-meta { grid-template-columns: .8fr 1.2fr; }
  .canvas-meta { display: none; }
}
@media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation: none !important; transition-duration: .01ms !important; } }
