/* ============================================================
   《星潮長航》STARTIDE ODYSSEY — main.css
   設計正典：_design/design-spec.md（Fable 5）
   色票/字級/曲線一律照規格 B 部原文，不得自行調整。
   ============================================================ */

/* ---------- B-1 色票「磷光海」 ---------- */
:root {
  /* 底 — 夜海 */
  --abyss:        #050A08;
  --deep:         #0B1512;
  --raised:       #122019;
  --hairline:     #24362D;
  --hairline-lo:  #16241E;
  /* 磷光 — 安全/增長/主強調 */
  --phos:         #45F0B4;
  --phos-bright:  #8FFFD9;
  --phos-dim:     #1E8C6B;
  --phos-ghost:   rgba(69,240,180,0.12);
  /* 星白 — 標題/主文字 */
  --starlight:    #EDE8DA;
  --ink-body:     #B9C6BD;
  --ink-mute:     #7C8B82;
  /* 燈火 — 人/生活/CTA */
  --ember:        #FF8A4A;
  --ember-deep:   #C2551F;
  --ember-ghost:  rgba(255,138,74,0.14);
  /* 語意 — 風險刻度 */
  --warn:         #FFB02E;
  --danger:       #FF4E5E;
  --danger-deep:  #8C1F2B;
  --danger-ghost: rgba(255,78,94,0.12);
  /* 黎明 */
  --dawn-paper:   #F5EFE3;
  --dawn-ink:     #1C2B24;
  --dawn-ink-2:   #46584E;
  --dawn-line:    #D8CFBB;
  --dawn-ember:   #E06B2D;
  --dawn-phos:    #0E7A57;

  /* B-2.2 字級尺度（1.333 / base 17px） */
  --fs--1: 13px;
  --fs-0:  17px;
  --fs-1:  clamp(20px, 1.6vw, 23px);
  --fs-2:  clamp(26px, 2.4vw, 30px);
  --fs-3:  clamp(32px, 3.4vw, 40px);
  --fs-4:  clamp(40px, 4.6vw, 54px);
  --fs-5:  clamp(48px, 6.4vw, 72px);
  --fs-6:  clamp(60px, 9vw, 96px);
  --fs-hero: clamp(64px, 12vw, 160px);

  /* 動效曲線（B-5.1） */
  --e-quick: cubic-bezier(0.22,0.61,0.36,1);
  --e-base:  cubic-bezier(0.16,1,0.3,1);
  --e-slow:  cubic-bezier(0.19,1,0.22,1);
  --e-camera:cubic-bezier(0.87,0,0.13,1);

  /* 語意別名（黎明翻轉時只換這組） */
  --c-bg:    var(--abyss);
  --c-panel: var(--deep);
  --c-raise: var(--raised);
  --c-line:  var(--hairline);
  --c-line-lo: var(--hairline-lo);
  --c-title: var(--starlight);
  --c-body:  var(--ink-body);
  --c-mute:  var(--ink-mute);
  --c-phos:  var(--phos);
  --c-phos-dim: var(--phos-dim);
  --c-ember: var(--ember);
}

/* B-1.3 黎明翻轉（.is-dawn 掛在 <html>） */
.is-dawn {
  --c-bg:    var(--dawn-paper);
  --c-panel: #EFE7D6;
  --c-raise: #E9E0CC;
  --c-line:  var(--dawn-line);
  --c-line-lo: #E4DCC8;
  --c-title: var(--dawn-ink);
  --c-body:  var(--dawn-ink);
  --c-mute:  var(--dawn-ink-2);
  --c-phos:  var(--dawn-phos);
  --c-phos-dim: var(--dawn-phos);
  --c-ember: var(--dawn-ember);
}

/* ---------- Reset / base ---------- */
* { margin:0; padding:0; box-sizing:border-box; }
html { scroll-behavior:smooth; }
html, body { background: var(--c-bg); overflow-x: clip; } /* clip 不產生捲動容器，保 pin（review-2 P0-N1 保險） */
body {
  font-family: 'Noto Sans TC', sans-serif;
  font-size: var(--fs-0);
  color: var(--c-body);
  line-height: 1.95;
  letter-spacing: 0.02em;
  overflow-x: clip; /* hidden 會讓 body 變捲動容器、殺掉 sticky（Fable 驗證抓到）；clip 裁切同效且不建容器 */
  transition: background-color 1.2s var(--e-camera), color 1.2s var(--e-camera);
}
::selection { background: var(--phos-ghost); color: var(--phos-bright); }
.is-dawn ::selection { color: var(--dawn-phos); }

img, svg, canvas { max-width: 100%; display: block; }
img { height: auto; } /* width/height 屬性縮放時保持比例（review-images：IMG-3 橢圓、IMG-4 行動壓扁同源） */
button { font: inherit; cursor: pointer; background:none; border:none; color:inherit; }
input { font: inherit; color: inherit; }
a { color: var(--c-body); text-decoration: none; }

/* 文字連結：磷光底線從左 draw */
.lnk {
  position: relative; color: var(--c-body);
  transition: color .3s var(--e-quick);
  background-image: linear-gradient(var(--c-phos), var(--c-phos));
  background-repeat: no-repeat; background-position: 0 100%;
  background-size: 0% 1px;
  transition: color .3s var(--e-quick), background-size .3s var(--e-quick);
}
.lnk:hover { color: var(--phos-bright); background-size: 100% 1px; }
.is-dawn .lnk:hover { color: var(--dawn-phos); }

/* ---------- 3D 畫布與 grain ---------- */
#sea-canvas { position: fixed; inset: 0; z-index: 0; }
.grain {
  position: fixed; inset: 0; z-index: 50; pointer-events: none;
  opacity: 0.05; mix-blend-mode: overlay;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='240'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}
.is-dawn .grain { opacity: 0.035; }

/* WebGL 降級 CSS 星空 */
.css-sky {
  position: fixed; inset: 0; z-index: 0; display: none;
  background:
    linear-gradient(transparent 60%, #0E3B2C 140%),
    var(--abyss);
}
.no-webgl .css-sky { display: block; }
.no-webgl #sea-canvas { display: none; }
.css-sky::before, .css-sky::after {
  content:''; position:absolute; width:2px; height:2px; border-radius:50%;
  background: transparent;
}

/* ---------- 版式基準 ---------- */
.content { position: relative; z-index: 10; }
.wrap { max-width: 1120px; margin-inline: auto; padding-inline: 32px; }
.prose { max-width: 34em; }
.prose p { margin-bottom: 1.6em; }
.center { text-align:center; }
.breath { height: 240px; }  /* 章間呼吸段 */

section.chapter { position: relative; padding-block: 12vh; }

/* 章號背景水印 */
.ch-watermark {
  position: absolute; top: 4vh; right: -4vw; z-index: 1;
  font-family: 'Fraunces', serif; font-style: italic; font-weight: 350;
  font-size: 22vw; line-height: 1; color: var(--c-title); opacity: 0.04;
  pointer-events: none; user-select: none;
}

/* 章首 */
.ch-head { position: relative; z-index: 10; margin-bottom: 8vh; }
.ch-eyebrow {
  font-family: 'IBM Plex Mono', monospace; font-size: var(--fs--1);
  color: var(--c-phos-dim); letter-spacing: 0.15em; margin-bottom: 12px;
}
.ch-num {
  font-family: 'Fraunces', serif; font-style: italic; font-weight: 350;
  font-size: var(--fs-6); color: var(--c-phos-dim); opacity: 0.5; line-height: 1;
  clip-path: inset(0 100% 0 0);
}
.ch-title {
  font-family: 'Noto Serif TC', serif; font-weight: 900;
  font-size: var(--fs-5); color: var(--c-title);
  line-height: 1.15; letter-spacing: 0.06em; margin-top: 8px;
}
.ch-title-sm { font-size: var(--fs-4); }
.ch-lat {
  font-family:'Fraunces',serif; font-style:italic; font-weight:350;
  font-size: 0.6em; color: var(--c-phos-dim); vertical-align: middle;
}
/* 潮線 */
.tide {
  position: relative; height:1px; background: var(--c-line);
  margin-block: 28px; transform-origin: left;
}
.tide::after {
  content:''; position:absolute; left:50%; top:-3px; width:6px; height:6px;
  background: var(--c-phos); transform: translateX(-50%) rotate(45deg);
  opacity: 0;
}
.tide.shown::after { opacity: 1; transition: opacity .5s var(--e-base) .6s; }

/* 章首航線提示（船票） */
.route-hint {
  font-size: var(--fs--1); color: var(--c-mute); margin-top: 10px;
  font-family: 'IBM Plex Mono', monospace; display:none;
}
.route-hint.on { display:block; }

/* ---------- 文字元件 ---------- */
h3.subhead {
  font-family:'Noto Serif TC',serif; font-weight:600; font-size: var(--fs-2);
  color: var(--c-title); margin: 2.2em 0 0.8em; letter-spacing: 0.04em;
}

/* 金句（老師的聲音） */
.quote {
  position: relative; padding-left: 26px; margin: 3.2em 0;
  font-family: 'LXGW WenKai TC', serif;
  font-size: var(--fs-3); line-height: 1.7; letter-spacing: 0.04em;
  color: var(--c-title);
}
.quote.q-md { font-size: var(--fs-2); }
.quote.q-lg { font-size: var(--fs-4); }
.quote::before {
  content:''; position:absolute; left:0; top:6px; bottom:6px; width:2px;
  background: var(--c-phos); transform-origin: top; transform: scaleY(0);
}
.quote.shown::before { transform: scaleY(1); transition: transform 1.2s var(--e-slow); }
.quote .src {
  display:block; margin-top: 14px;
  font-family:'IBM Plex Mono',monospace; font-size: var(--fs--1);
  color: var(--c-mute); letter-spacing: 0.05em;
}
.quote em { font-style: normal; color: var(--c-ember); }

/* 出處標注（全域）——nowrap 只給行內短標；段落級一律可換行（review-2 P0-N1 真因） */
.src-tag {
  font-family:'IBM Plex Mono',monospace; font-size: var(--fs--1);
  color: var(--c-phos-dim); letter-spacing: 0.03em; white-space: nowrap;
}
p.src-tag, .duel .note, .two-valves .caption, figcaption.src-tag, .src-tag.wrapok {
  white-space: normal; overflow-wrap: anywhere;
}

/* 行內數字/代號 */
.num, .mono {
  font-family:'IBM Plex Mono',monospace; font-size: 0.88em;
  letter-spacing: 0.08em; margin-inline: 0.08em;
}
.tag {
  font-family:'IBM Plex Mono',monospace; font-size:0.88em;
  border:1px solid var(--c-line); padding:0 6px; border-radius:3px;
  color: var(--c-phos); white-space: nowrap; margin-inline: 2px;
}

/* 巨大數字 */
.bignum {
  font-family:'Fraunces',serif; font-weight:550; font-style: italic;
  font-variation-settings: 'opsz' 144;
  font-size: var(--fs-6); line-height:1.1; color: var(--c-phos);
  font-variant-numeric: tabular-nums;
}
.bignum.hero-size { font-size: var(--fs-hero); }
.bignum.neg { color: var(--danger); }
.bignum .unit { font-size: var(--fs-1); color: var(--c-title); font-style:normal; font-weight:400; font-family:'Noto Sans TC',sans-serif; }

/* 面板 */
.panel {
  background: var(--c-panel); border: 1px solid var(--c-line);
  border-radius: 4px; padding: 28px 32px;
  transition: background-color 1.2s var(--e-camera), border-color 1.2s var(--e-camera);
}

/* 卡片 */
.card {
  background: var(--c-panel); border:1px solid var(--c-line); border-radius:4px;
  padding: 22px 24px;
  transition: transform .3s var(--e-quick), border-color .3s var(--e-quick), box-shadow .3s var(--e-quick);
}
.card:hover {
  transform: translateY(-4px); border-color: var(--c-phos-dim);
  box-shadow: 0 0 24px rgba(69,240,180,0.18), 0 0 2px rgba(69,240,180,0.4);
}

/* 航海筆記 */
.lognote {
  margin-top: 6vh; max-width: 560px;
  background: var(--c-panel); border:1px solid var(--c-line); border-radius:4px;
  padding: 20px 26px;
}
.lognote .lbl {
  font-family:'IBM Plex Mono',monospace; font-size:var(--fs--1);
  color:var(--c-phos-dim); letter-spacing:.2em; display:block; margin-bottom:8px;
}
.lognote .txt { font-family:'LXGW WenKai TC',serif; font-size:var(--fs-1); color:var(--c-title); line-height:1.7; }

/* 免責 chip（不得縮小、不得摺疊） */
.disclaimer {
  font-size: var(--fs--1); color: var(--c-mute); line-height: 1.8;
  border-left: 2px solid var(--warn);
  background: var(--c-panel); padding: 12px 18px; border-radius: 0 4px 4px 0;
  max-width: 720px; margin-block: 4vh 0;
}
/* 免責微標記（Fable 裁決 c 案：完整版只留 hero+終章、加強版不動、儀器旁降級單行） */
.micro-disc {
  font-family: 'IBM Plex Mono', monospace; font-size: var(--fs--1);
  color: var(--c-mute); opacity: .55; margin-top: 3vh; letter-spacing: .04em;
}
.micro-disc a { color: inherit; text-decoration: underline; text-underline-offset: 3px; }
.micro-disc a:hover { color: var(--c-body); }

/* 加強版（新手切勿照抄） */
.disclaimer-strong {
  border: 1px solid var(--warn); border-left-width: 3px;
  color: var(--c-body); font-size: var(--fs--1);
  background: var(--c-panel); padding: 14px 20px; border-radius: 4px;
  line-height: 1.9; max-width: 720px; margin-block: 3vh;
}
.disclaimer-strong strong { color: var(--warn); }

/* CTA */
.btn-ember {
  display:inline-block; background: var(--c-ember); color: var(--abyss);
  font-weight: 700; font-size: var(--fs-0); letter-spacing: .06em;
  padding: 14px 36px; border-radius: 4px;
  transition: filter .3s var(--e-quick), box-shadow .3s var(--e-quick), transform .1s;
}
.btn-ember:hover { filter: brightness(1.08); box-shadow: 0 0 28px var(--ember-ghost), 0 0 3px rgba(255,138,74,.5); }
.btn-ember:active { transform: scale(.98); }
.btn-ghost {
  display:inline-block; border:1px solid var(--c-line); color: var(--c-body);
  padding: 13px 30px; border-radius:4px; font-size: var(--fs-0); letter-spacing:.04em;
  transition: border-color .3s var(--e-quick), color .3s var(--e-quick), box-shadow .3s var(--e-quick);
}
.btn-ghost:hover { border-color: var(--c-phos-dim); color: var(--phos-bright); box-shadow: 0 0 20px rgba(69,240,180,.12); }
.is-dawn .btn-ghost:hover { color: var(--dawn-phos); }
.btn-phos {
  display:inline-block; border:1px solid var(--phos-dim); color: var(--phos);
  padding: 13px 34px; border-radius:4px; letter-spacing:.04em;
  transition: box-shadow .3s var(--e-quick), border-color .3s var(--e-quick);
}
.btn-phos:hover { border-color: var(--phos); box-shadow: 0 0 24px rgba(69,240,180,.25), 0 0 2px rgba(69,240,180,.6); }
.btn-mute {
  display:inline-block; border:1px solid var(--c-line); color: var(--c-mute);
  padding: 13px 34px; border-radius:4px; letter-spacing:.04em;
  transition: color .3s var(--e-quick), border-color .3s var(--e-quick);
}
.btn-mute:hover { color: var(--c-body); border-color: var(--c-mute); }

/* ---------- 進場動效初始狀態（JS 掛 gsap） ---------- */
.will-ink { opacity: 0; filter: blur(10px); }
.will-rise { opacity: 0; transform: translateY(28px); }
.will-line { transform: scaleX(0); transform-origin: left; }
.will-fade { opacity: 0; }
.reduced-motion .will-ink, .reduced-motion .will-rise,
.reduced-motion .will-fade { opacity:1; transform:none; filter:none; }
.reduced-motion .will-line { transform: scaleX(1); }

/* ============================================================
   D-0 載入序列
   ============================================================ */
#loader {
  position: fixed; inset:0; z-index: 100; background: var(--abyss);
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 28px;
}
#loader .line {
  width: min(420px, 70vw); height: 1px; background: var(--phos);
  transform: scaleX(0); box-shadow: 0 0 16px rgba(69,240,180,.5);
}
#loader .motto {
  font-family: 'LXGW WenKai TC', serif; font-size: var(--fs-2);
  color: var(--starlight); letter-spacing: 0.5em; opacity: 0;
  padding-left: 0.5em; /* 平衡字距 */
}
#loader.done { pointer-events: none; }

/* ============================================================
   NAV / HUD
   ============================================================ */
.nav {
  position: fixed; top:0; left:0; right:0; z-index: 60;
  display:flex; justify-content: space-between; align-items:center;
  padding: 20px 32px; pointer-events: none;
}
.nav > * { pointer-events: auto; }
.nav .brand { display:flex; align-items: baseline; gap: 10px; }
.nav .brand .zh {
  font-family:'Noto Serif TC',serif; font-weight:900; font-size: var(--fs-1);
  color: var(--c-title); letter-spacing: .12em;
}
.nav .brand .en {
  font-family:'Fraunces',serif; font-style:italic; font-size: var(--fs--1);
  color: var(--c-phos-dim); letter-spacing: .2em;
}
.nav .links { display:flex; gap: 24px; font-size: var(--fs--1); font-weight:500; }
.nav .links a { color: var(--c-mute); transition: color .3s var(--e-quick); }
.nav .links a:hover { color: var(--phos-bright); }
.is-dawn .nav .links a:hover { color: var(--dawn-phos); }

/* 羅盤 HUD */
#hud {
  position: fixed; left: 28px; bottom: 28px; z-index: 60;
  display:flex; flex-direction:column; gap:8px; align-items:flex-start;
}
/* .dial 已改為原生 <button>：中和瀏覽器預設外觀，但**不動焦點指示**（見檔尾 :focus-visible） */
#hud .dial {
  width:56px; height:56px; cursor:pointer; position:relative;
  background:none; border:0; padding:0; color:inherit; font:inherit; display:block;
}
#hud .dial svg { width:100%; height:100%; overflow:visible; }
#hud .dial .arc { stroke: var(--c-line); stroke-width:3; fill:none; transition: stroke .4s; }
#hud .dial .arc.done { stroke: var(--phos); }
#hud .dial .arc.now { stroke: var(--ember); }
#hud .dial .cur {
  position:absolute; inset:0; display:flex; align-items:center; justify-content:center;
  font-family:'Fraunces',serif; font-style:italic; font-size:18px; color: var(--c-title);
}
#hud .meta {
  font-family:'IBM Plex Mono',monospace; font-size: 11px; line-height:1.6;
  color: var(--c-mute); letter-spacing:.05em;
}
/* 快速道：「下一章」鈕（桌面限定）＋星圖提示氣泡 */
#next-ch-btn {
  position: fixed; right: 28px; bottom: 28px; z-index: 60;
  font-family: 'Noto Sans TC', sans-serif; font-size: var(--fs--1); letter-spacing: .08em;
  color: var(--c-mute); background: var(--c-panel);
  border: 1px solid var(--c-line); border-radius: 999px;
  padding: 10px 20px;
  transition: color .3s var(--e-quick), border-color .3s var(--e-quick), box-shadow .3s var(--e-quick),
              background-color 1.2s var(--e-camera);
}
#next-ch-btn:hover {
  color: var(--phos-bright); border-color: var(--c-phos-dim);
  box-shadow: 0 0 20px rgba(69,240,180,.15);
}
.is-dawn #next-ch-btn:hover { color: var(--dawn-phos); }
@media (max-width: 768px) { #next-ch-btn { display: none; } }
#map-hint {
  position: absolute; left: 64px; bottom: 8px; white-space: nowrap;
  font-size: var(--fs--1); color: var(--c-body);
  background: var(--c-raise); border: 1px solid var(--c-phos-dim); border-radius: 4px;
  padding: 8px 14px;
}

/* 星圖導航面板 */
#starmap {
  position: fixed; left: 28px; bottom: 100px; z-index: 70;
  width: 360px; height: 420px;
  background: var(--c-panel); border:1px solid var(--c-line); border-radius:4px;
  opacity:0; visibility:hidden; transform: translateY(8px);
  transition: opacity .3s var(--e-quick), transform .3s var(--e-quick), visibility .3s;
  padding: 18px;
}
#starmap.open { opacity:1; visibility:visible; transform:none; }
#starmap .ttl {
  font-family:'IBM Plex Mono',monospace; font-size: var(--fs--1);
  color: var(--c-phos-dim); letter-spacing:.2em; margin-bottom:6px;
}
#starmap svg { width:100%; height: 340px; }
#starmap .st-dot { fill: var(--c-mute); cursor:pointer; transition: fill .3s; }
#starmap .st-dot.done { fill: var(--phos); }
#starmap .st-dot.now { fill: var(--ember); }
#starmap .st-dot:hover { fill: var(--phos-bright); }
#starmap .st-line { stroke: var(--c-line); stroke-dasharray: 2 6; fill:none; }
#starmap .st-route { stroke: var(--phos-dim); stroke-dasharray: 2 6; fill:none; }
#starmap .st-lbl { font-family:'IBM Plex Mono',monospace; font-size:9px; fill: var(--c-mute); }
#starmap .st-lock { fill: var(--warn); font-size: 10px; }
#starmap .tooltip {
  position:absolute; background: var(--c-raise); border:1px solid var(--c-line);
  padding: 4px 10px; border-radius:3px; font-size: var(--fs--1); color: var(--c-body);
  pointer-events:none; opacity:0; transition: opacity .2s; white-space:nowrap;
}

/* ============================================================
   HERO
   ============================================================ */
#hero { min-height: 100vh; display:flex; flex-direction:column; justify-content:center; position:relative; }
#hero .vert {
  position:absolute; left: 32px; top: 50%; transform: translateY(-52%);
  writing-mode: vertical-rl; font-family:'Noto Serif TC',serif; font-weight:900;
  /* vh 上限：矮視口自動縮，末字「航」不撞左下 HUD（Fable 裁決 A 案；1440×900 像素級零變動） */
  font-size: min(clamp(40px, 5.4vw, 76px), 8.5vh);
  letter-spacing: 0.34em; color: var(--starlight);
  user-select:none;
}
@media (max-height: 720px) {
  /* 矮視口：#hero 實高會超過視口（內容撐高），top:50% 錨到區塊會下沉——改錨視口（Fable 驗證回饋） */
  #hero .vert { top: 50svh; }
}
@media (max-height: 520px) {
  #hud .meta { display: none; } /* 極端矮視口保險絲：收掉兩行小字、羅盤保留 */
}
#hero .vert .chao {
  background: linear-gradient(180deg, var(--starlight) 0%, var(--phos) 100%);
  -webkit-background-clip: text; background-clip: text; color: transparent;
}
#hero .hero-main { padding-left: clamp(90px, 12vw, 180px); }
#hero .kicker {
  font-family:'Fraunces',serif; font-style:italic; font-weight:350;
  font-size: var(--fs-1); color: var(--c-phos-dim); letter-spacing:.28em; margin-bottom: 2vh;
}
#hero h1 {
  font-family:'Noto Serif TC',serif; font-weight:900;
  font-size: clamp(40px, 6.6vw, 96px); line-height:1.25; letter-spacing:.06em;
  color: var(--starlight); max-width: 12em;
}
#hero h1 .ch { display:inline-block; }
#hero .sub { margin-top: 3.5vh; font-size: var(--fs-1); color: var(--c-body); }
#hero .sub .en { font-family:'IBM Plex Mono',monospace; font-size:.8em; color:var(--c-mute); display:block; margin-top:4px; letter-spacing:.1em; }
#hero .foot-src { margin-top: 2vh; }
#hero .ctas { margin-top: 5vh; display:flex; gap:18px; flex-wrap:wrap; }
#hero .resume-line { margin-top: 2.5vh; font-size: var(--fs--1); }
#hero .resume-line a { color: var(--ember); }
#hero .scroll-cue {
  position:absolute; bottom: 26px; left:50%; transform:translateX(-50%);
  font-size: var(--fs--1); color: var(--c-mute); letter-spacing:.2em;
}

/* ============================================================
   序章・滾輪（pin 三金句）
   ============================================================ */
/* 序章＝置中舞台章：收尾內文與筆記卡沿置中軸（Fable 裁決 B-a；Ⅰ章起才進左錨文章流） */
#prologue .prose, #prologue .lognote { margin-inline: auto; }
#prologue .pin-quotes { min-height: 100vh; display:flex; align-items:center; }
#prologue .q-stage { position:relative; width:100%; max-width: 30em; margin-inline:auto; }
/* display:block＋translate 置中（Fable 裁決：flex 會把 <em> 拆成獨立 item 碎行；
   inset 先宣告、top 後蓋；translate 屬性與 transform 分軌，GSAP tween 免疫） */
#prologue .q-stage .quote {
  position:absolute; inset:auto 0 auto 0;
  top:50%; translate: 0 -50%;
  display:block; margin:0; opacity:0;
}
.quote { line-break: strict; } /* 中文標點不落行首 */
@media (max-width: 768px) {
  /* 手機：金句堆疊流（JS 設 position:relative），歸零置中位移、取消桌機手動斷行 */
  #prologue .q-stage .quote { translate: none; top: auto; }
  #prologue .quote br { display: none; }
}

/* ============================================================
   檢票口・六張船票
   ============================================================ */
#tickets .ticket-grid {
  display:grid; grid-template-columns: repeat(6, 1fr); gap: 16px; margin-top: 6vh;
}
.ticket {
  position:relative; height: 240px; background: var(--c-panel);
  border:1px solid var(--c-line); border-radius:4px;
  padding: 26px 16px 18px; text-align:center; cursor:pointer;
  transition: border-color .3s var(--e-quick), transform .3s var(--e-quick), opacity .4s, box-shadow .3s;
  overflow:hidden;
}
.ticket::before { /* 齒孔 */
  content:''; position:absolute; top:14px; left:10px; right:10px; height:1px;
  border-top: 1px dashed var(--c-line);
}
.ticket .big {
  font-family:'Fraunces',serif; font-style:italic; font-weight:550;
  font-size: var(--fs-6); line-height:1; color: var(--c-phos-dim);
}
.ticket .name { margin-top:8px; font-weight:500; color: var(--c-title); font-size: var(--fs-0); }
.ticket .desc { margin-top:6px; font-size: var(--fs--1); color: var(--c-mute); line-height:1.6; }
.ticket:hover { transform: translateY(-4px); border-color: var(--c-phos-dim); }
.ticket.sel { border-color: var(--phos); box-shadow: 0 0 24px rgba(69,240,180,.2); transform: rotate(-1deg); }
.ticket.dim { opacity: .45; }
.ticket .stamp {
  position:absolute; top:10px; left:10px; width:64px; height:64px;
  transform: rotate(-12deg); opacity:0;
}
.ticket.sel .stamp { opacity:1; }
#ticket-result { margin-top: 4vh; min-height: 60px; }
#ticket-result .msg { font-family:'LXGW WenKai TC',serif; font-size: var(--fs-1); color: var(--c-title); }

/* ============================================================
   第Ⅰ章 融化的紙
   ============================================================ */
#melt-note { margin-block: 6vh; }
#melt-canvas { width: 480px; max-width:100%; height: 300px; }
#melt-note .cap { margin-top: 10px; font-family:'IBM Plex Mono',monospace; font-size: var(--fs--1); color: var(--c-mute); }

/* 紅綠點陣 */
#dots-belt { margin-block: 8vh; }
#dots-grid {
  display:grid; grid-template-columns: repeat(50, 1fr); gap: 6px;
  margin-block: 4vh;
}
#dots-grid i {
  width: 4px; height: 4px; border-radius: 50%;
  background: var(--c-line); justify-self:center;
  transition: background .4s;
}
#dots-grid i.up.lit { background: var(--phos); }
#dots-grid i.down.lit { background: var(--danger); }
#dots-grid.only-red i.up.lit { background: var(--c-line-lo); }
#dots-grid.only-red i.down.lit { animation: redblink 1.2s infinite alternate; }
@keyframes redblink { from{opacity:.5} to{opacity:1} }
#dots-belt .stat { text-align:center; margin-block: 3vh; }
#dots-wait-msg { max-width: 34em; margin: 3vh auto 0; text-align:center; color: var(--c-body); min-height: 4em; }

/* ============================================================
   第Ⅱ章 星空名冊
   ============================================================ */
.roster-note { margin-block: 5vh; }
.three-lines { margin-block: 8vh; }
.three-lines .ln {
  font-family:'Noto Serif TC',serif; font-weight:900; font-size: var(--fs-4);
  color: var(--c-title); line-height: 1.5; letter-spacing:.08em;
}
.three-lines .ln:last-child { color: var(--phos); }
.tickers { margin-top: 4vh; font-size: var(--fs-1); }

/* 對比大字 */
.duel { display:grid; grid-template-columns: 1fr 1fr; gap: 40px; margin-block: 8vh; }
.duel .side .bignum { display:block; }
.duel .side .lbl { font-size: var(--fs-1); color: var(--c-title); margin-top:6px; }
.duel .side .bar { height: 3px; background: var(--phos); margin-top: 16px; transform-origin:left; }
.duel .side.rhs .bar { background: var(--c-mute); }
.duel .side.rhs .bignum { color: var(--starlight); }
.duel .note { grid-column: 1/-1; }

/* ============================================================
   第Ⅲ章 複利儀（V1）
   ============================================================ */
.pin-stage { position: relative; }
.instrument { max-width: 860px; margin-inline:auto; }
.inst-title {
  font-family:'IBM Plex Mono',monospace; font-size: var(--fs--1);
  color: var(--c-phos-dim); letter-spacing:.25em; margin-bottom: 18px;
}
.ctrl-row { display:flex; align-items:center; gap: 18px; margin-block: 18px; flex-wrap:wrap; }
.ctrl-row .lbl { min-width: 92px; font-size: var(--fs--1); color: var(--c-mute); font-weight:500; }
.ctrl-row output { font-family:'IBM Plex Mono',monospace; color: var(--c-title); min-width: 130px; }
input[type=range] {
  -webkit-appearance:none; appearance:none; flex:1; min-width: 180px; height: 2px;
  background: linear-gradient(to right, var(--phos) var(--fill,50%), var(--c-line) var(--fill,50%));
  border-radius:1px; outline:none;
}
input[type=range]::-webkit-slider-thumb {
  -webkit-appearance:none; appearance:none; width:14px; height:14px; border-radius:50%;
  background: var(--phos); box-shadow: 0 0 12px rgba(69,240,180,.6);
  cursor:grab; border:none;
}
input[type=range]::-moz-range-thumb {
  width:14px; height:14px; border-radius:50%; background: var(--phos);
  box-shadow: 0 0 12px rgba(69,240,180,.6); cursor:grab; border:none;
}
/* 檔位滑桿（年化四檔） */
.rate-steps { display:flex; gap:10px; flex-wrap:wrap; }
.rate-steps button {
  font-family:'IBM Plex Mono',monospace; font-size: var(--fs--1);
  border:1px solid var(--c-line); border-radius:3px; padding: 6px 14px; color: var(--c-mute);
  transition: all .3s var(--e-quick);
}
.rate-steps button.on { border-color: var(--phos); color: var(--phos); box-shadow: 0 0 14px rgba(69,240,180,.2); }
.rate-steps .rsrc { display:block; font-size: 10px; color: var(--c-mute); margin-top:2px; }
#v1-result { margin-block: 3vh 1vh; }
#v1-result .lead { font-size: var(--fs-1); color: var(--c-body); }
#v1-value {
  font-family:'Fraunces',serif; font-style:italic; font-weight:550;
  font-size: clamp(48px, 7vw, 110px); color: var(--phos); line-height: 1.15;
  font-variant-numeric: tabular-nums;
}
#v1-koan { font-family:'IBM Plex Mono',monospace; font-size: var(--fs--1); color: var(--c-mute); margin-top: 8px; }
.scale-toggle { display:inline-flex; border:1px solid var(--c-line); border-radius:3px; overflow:hidden; margin-top: 14px; }
.scale-toggle button { padding: 6px 16px; font-size: var(--fs--1); color: var(--c-mute); font-family:'IBM Plex Mono',monospace; }
.scale-toggle button.on { background: var(--phos-ghost); color: var(--phos); }
#v1-lograte { margin-top: 3vh; min-height: 3em; max-width: 34em; }
/* 星軌 chart 疊字層 */
.trail-labels { position: relative; height: 0; }
.trail-lbl {
  position:absolute; font-family:'IBM Plex Mono',monospace; font-size: var(--fs--1);
  color: var(--c-mute); white-space:nowrap;
}
.trail-lbl b { color: var(--phos); font-weight:500; }

/* 快門警告 */
#shutter-warn { margin-block: 10vh; }
#shutter-svg { width: 100%; height: 220px; }

/* ============================================================
   第Ⅳ章 壓艙石與帆
   ============================================================ */
#ship-fig { margin-block: 6vh; }
#ship-fig svg { width: min(680px, 100%); height:auto; margin-inline:auto; }
#ship-fig .lbl { font-family:'IBM Plex Mono',monospace; font-size: 12px; }

/* 陣型架（橫向 scroll-snap） */
/* 動態三態遮罩：捲到端點放開該側漸隱，442 卡左邊線可見（Fable 裁決 a 案） */
@property --mL { syntax: '<length>'; initial-value: 40px; inherits: false; }
@property --mR { syntax: '<length>'; initial-value: 40px; inherits: false; }
#formation-rack {
  --mL: 40px; --mR: 40px;
  display:flex; gap: 18px; overflow-x:auto; scroll-snap-type: x mandatory;
  padding-block: 20px; margin-block: 4vh;
  scrollbar-width: thin; scrollbar-color: var(--phos-dim) transparent;
  mask: linear-gradient(to right, transparent, #000 var(--mL), #000 calc(100% - var(--mR)), transparent);
  -webkit-mask: linear-gradient(to right, transparent, #000 var(--mL), #000 calc(100% - var(--mR)), transparent);
  padding-inline: 40px;
  scroll-padding-inline: 40px; /* snap 靜止點回到 scrollLeft=0，at-start 才掛得上（Fable 現場實測值） */
  transition: --mL .25s, --mR .25s;
}
#formation-rack.at-start { --mL: 0px; }
#formation-rack.at-end { --mR: 0px; }
#formation-rack::-webkit-scrollbar { height: 4px; }
#formation-rack::-webkit-scrollbar-thumb { background: var(--phos-dim); border-radius: 2px; }
/* 433 黃金比例：緩慢呼吸 glow（全站唯二循環動畫，review-1 P2-4） */
.form-card.star { animation: goldbreath 3s ease-in-out 0s infinite alternate; }
@keyframes goldbreath {
  from { box-shadow: 0 0 12px rgba(69,240,180,.12); }
  to   { box-shadow: 0 0 28px rgba(69,240,180,.3); }
}
.reduced-motion .form-card.star { animation: none; }
.form-card {
  flex: 0 0 240px; height: 340px; scroll-snap-align: start;
  background: var(--c-panel); border:1px solid var(--c-line); border-radius:4px;
  padding: 22px 20px; position:relative; display:flex; flex-direction:column;
  transition: transform .3s var(--e-quick), border-color .3s var(--e-quick), box-shadow .3s;
}
.form-card:hover { transform: translateY(-4px); border-color: var(--c-phos-dim); box-shadow: 0 0 24px rgba(69,240,180,.15); }
.form-card.star { border-color: var(--phos); }
.form-card .code {
  font-family:'Fraunces',serif; font-style:italic; font-weight:550;
  font-size: 44px; color: var(--c-title);
}
.form-card .beta { font-family:'IBM Plex Mono',monospace; font-size: var(--fs--1); color: var(--c-phos-dim); margin-top:2px; }
.form-card .weightbar {
  width: 12px; flex: 1; margin: 16px 0; border-radius: 2px; overflow:hidden;
  display:flex; flex-direction:column; align-self:flex-start;
}
.form-card .weightbar i { display:block; width:100%; }
.form-card .weightbar .w-proto { background: var(--starlight); }
.form-card .weightbar .w-lev { background: var(--phos); }
.form-card .weightbar .w-cash { background: var(--ember); }
.form-card .pos { font-size: var(--fs--1); color: var(--c-body); line-height:1.7; }
.form-card .corner {
  position:absolute; top: 12px; right: 12px; font-size: 11px; font-weight:700;
  color: var(--phos); border:1px solid var(--phos-dim); border-radius:3px; padding: 1px 8px;
}
.form-card .corner.warnc { color: var(--warn); border-color: var(--warn); }
.rack-legend { display:flex; gap:20px; font-size: var(--fs--1); color: var(--c-mute); margin-bottom: 1vh; flex-wrap:wrap; }
.rack-legend i { display:inline-block; width:10px; height:10px; border-radius:2px; margin-right:6px; vertical-align:baseline; }

/* 三件套定義小卡（名詞先講清楚，真機回饋改排版） */
.trio-defs { display:grid; grid-template-columns: repeat(3, 1fr); gap: 14px; margin-bottom: 2vh; }
.trio-card {
  background: var(--c-panel); border:1px solid var(--c-line); border-radius:4px;
  padding: 16px 18px;
}
.trio-card .t-head { display:flex; align-items:center; gap:8px; font-size: var(--fs-1); color: var(--c-title); }
.trio-card .t-head i { width:10px; height:10px; border-radius:2px; flex:none; }
.trio-card .t-role { font-size: var(--fs--1); color: var(--c-mute); font-family:'LXGW WenKai TC',serif; }
.trio-card .t-def { font-size: var(--fs--1); color: var(--c-body); margin: 8px 0 12px; line-height:1.7; }
.trio-card .t-row {
  display:flex; align-items:center; gap:8px; padding: 6px 0;
  border-top: 1px solid var(--c-line-lo); flex-wrap: wrap;
}
.trio-card .t-mkt {
  font-family:'IBM Plex Mono',monospace; font-size: 11px; color: var(--c-mute);
  min-width: 34px; letter-spacing:.1em;
}
.trio-card .t-note { font-size: 11px; color: var(--c-mute); }
@media (max-width: 1023px) { .trio-defs { grid-template-columns: 1fr; } }

/* 陣型詳解面板（點卡展開） */
.form-card.picked { border-color: var(--phos); box-shadow: 0 0 24px rgba(69,240,180,.22); }
#form-detail { margin-block: 3vh 5vh; max-width: 860px; }
#form-detail .fd-head { display:flex; align-items:baseline; gap: 16px; margin-bottom: 14px; }
#form-detail .fd-code {
  font-family:'Fraunces',serif; font-style:italic; font-weight:550;
  font-size: var(--fs-4); color: var(--phos); line-height:1;
}
#form-detail .fd-list { display:flex; flex-direction:column; }
#form-detail .fd-row {
  display:grid; grid-template-columns: 140px 1fr; gap: 16px;
  padding: 13px 0; border-top: 1px solid var(--c-line-lo);
}
#form-detail .fd-row dt {
  font-family:'IBM Plex Mono',monospace; font-size: var(--fs--1);
  color: var(--c-phos-dim); letter-spacing:.08em;
}
#form-detail .fd-row dd { font-size: var(--fs-0); color: var(--c-body); line-height: 1.9; }
#form-detail .fd-row.fd-red dt { color: var(--warn); }
#form-detail .fd-row.fd-red dd { color: var(--c-body); }
#form-detail .fd-row.fd-red dd b, #form-detail .fd-row.fd-red { border-top-color: var(--c-line-lo); }
@media (max-width: 768px) {
  #form-detail .fd-row { grid-template-columns: 1fr; gap: 4px; }
}
/* 詳解面板底部：三件套商品對照（分行結構，真機回饋） */
.fd-trio { border-top: 1px solid var(--c-line-lo); margin-top: 14px; padding-top: 12px; }
.fd-trio-t {
  font-family:'IBM Plex Mono',monospace; font-size: var(--fs--1);
  color: var(--c-phos-dim); letter-spacing:.15em; margin-bottom: 6px;
}
.fd-trio-row {
  display:flex; align-items:center; gap: 8px; flex-wrap: wrap;
  padding: 7px 0; border-bottom: 1px solid var(--c-line-lo);
  font-size: var(--fs--1);
}
.fd-trio-row:last-child { border-bottom: none; }
.fd-trio-row > b { min-width: 44px; font-weight: 500; }
.fd-trio-row .t-mkt {
  font-family:'IBM Plex Mono',monospace; font-size: 11px; color: var(--c-mute); letter-spacing:.1em;
}
.fd-trio-row .t-note { font-size: 11px; color: var(--c-mute); }
.fd-trio-row .t-grp { display:inline-flex; align-items:center; gap:8px; white-space:nowrap; } /* 市場組整組換行不拆散 */

/* 正二的代價 */
.lev-cost { display:grid; grid-template-columns: 1fr 1fr; gap: 24px; margin-block: 5vh; }
.lev-cost .card .bignum { font-size: var(--fs-5); }
.lev-cost .card .bignum.amber { color: var(--warn); }

/* ============================================================
   第Ⅴ章 風暴之夜
   ============================================================ */
#storm { }
#storm .crash {
  min-height: 90vh; display:flex; flex-direction:column; justify-content:center; align-items:center;
  text-align:center; position:relative;
}
#crash-num {
  font-family:'Fraunces',serif; font-style:italic; font-weight:550;
  font-size: var(--fs-hero); color: var(--danger); line-height:1;
  font-variant-numeric: tabular-nums;
  text-shadow: 0 0 60px rgba(255,78,94,.35);
}
#storm .crash .cap { margin-top: 3vh; font-size: var(--fs-1); color: var(--c-title); }
#storm .crash .cap2 { color: var(--c-mute); font-size: var(--fs-0); }

/* V2 風暴裝備卡（白話度 P0-1：進儀器前先發裝備，複用 trio-defs 語言） */
.storm-defs {
  background: var(--c-raise); border: 1px solid var(--c-line); border-radius: 4px;
  padding: 6px 18px; margin-bottom: 3vh; max-width: 720px;
}
.storm-defs .sd-row {
  display: flex; gap: 14px; align-items: baseline;
  padding: 9px 0; border-bottom: 1px solid var(--c-line-lo);
  font-size: var(--fs--1); line-height: 1.8;
}
.storm-defs .sd-row:last-child { border-bottom: none; }
.storm-defs .sd-row > b { min-width: 52px; font-weight: 500; flex: none; }
.storm-defs .sd-row > span { color: var(--c-body); }

/* V2 斷頭台海圖 */
#v2 .grid-wrap { display:grid; grid-template-columns: 1fr 210px; gap: 32px; margin-top: 3vh; }
#v2 .grid-wrap > div:last-child { border-left: 1px solid var(--c-line-lo); padding-left: 24px; }
.matrix-scroll { overflow-x: auto; max-width: 100%; min-width: 0; scrollbar-width: thin; scrollbar-color: var(--c-line) transparent; }
#v2 .grid-wrap > div { min-width: 0; }
.matrix-hint { display:none; font-size: 11px; color: var(--c-mute); margin-bottom: 6px; }
#v2-matrix { display:grid; grid-template-columns: 70px repeat(9, 1fr); gap: 3px; font-family:'IBM Plex Mono',monospace; font-size: 11px; }
#v2-matrix .hcell, #v2-matrix .rcell {
  color: var(--c-mute); display:flex; align-items:center; justify-content:center; padding: 4px 0;
}
#v2-matrix .cell {
  position:relative; aspect-ratio: 1.6; display:flex; align-items:center; justify-content:center;
  border-radius: 2px; color: var(--c-body); cursor: default;
  border: 1px solid transparent; transition: border-color .3s, box-shadow .3s;
}
#v2-matrix .cell.safe   { background: var(--phos-ghost); color: var(--phos); }
#v2-matrix .cell.ok     { background: rgba(237,232,218,.07); color: var(--starlight); }
#v2-matrix .cell.warn1  { background: rgba(255,176,46,.16); color: var(--warn); }
#v2-matrix .cell.warn2  { background: rgba(255,176,46,.3); color: var(--warn); }
#v2-matrix .cell.dead   { background: var(--danger-ghost); color: var(--danger); }
#v2-matrix .cell.dead::after { content:'✂'; position:absolute; right:3px; top:1px; font-size: 9px; opacity:.7; }
#v2-matrix .cell.aim {
  border-color: var(--phos); box-shadow: 0 0 14px rgba(69,240,180,.35);
}
/* 燈塔儀表（review-1 P0-1：加寬、單行、錯開） */
#v2-tower { position:relative; height: 260px; width: 190px; }
#v2-tower .col { position:absolute; left: 18px; top:0; bottom:0; width: 2px; background: var(--c-line); }
#v2-tower .seg-safe { position:absolute; left:17px; width:4px; background: linear-gradient(to top, transparent, var(--phos)); opacity:.6; }
#v2-tower .tick { position:absolute; left: 4px; right: 0; display:flex; align-items:center; gap:8px; font-family:'IBM Plex Mono',monospace; font-size: 10.5px; color: var(--c-mute); white-space: nowrap; }
#v2-tower .tick i { display:block; width: 30px; height: 1px; background: var(--c-mute); flex:none; }
#v2-tower .tick.line-danger { color: var(--danger); }
#v2-tower .tick.line-danger i { background: var(--danger); height: 2px; }
#v2-tower .tick.line-warn { color: var(--warn); }
#v2-tower .tick.line-warn i { background: var(--warn); }
#v2-needle {
  position:absolute; left: 6px; width: 26px; height: 2px; background: var(--phos);
  box-shadow: 0 0 10px rgba(69,240,180,.7); transition: top .5s var(--e-base), background .3s;
}
#v2-needle.hot { background: var(--danger); box-shadow: 0 0 10px rgba(255,78,94,.7); }
#v2-verdict {
  margin-top: 3vh; font-family:'LXGW WenKai TC',serif; font-size: var(--fs-2);
  color: var(--c-title); min-height: 2.4em;
}
#v2-verdict.dead-v { color: var(--danger); }
#v2 .panel.alarm { animation: alarmflash .4s 1; }
@keyframes alarmflash { 0%{border-color:var(--danger); box-shadow:0 0 32px rgba(255,78,94,.4);} 100%{border-color:var(--c-line); box-shadow:none;} }
#v2-readout { display:flex; gap: 28px; font-family:'IBM Plex Mono',monospace; font-size: var(--fs-1); color: var(--c-title); margin-top: 1vh; flex-wrap:wrap; }
#v2-readout b { color: var(--phos); font-weight:500; }
#v2-readout b.hot { color: var(--danger); }

/* V3 壓力測試 */
#v3 .step { display:none; }
#v3 .step.on { display:block; }
#v3 .qtext { font-family:'LXGW WenKai TC',serif; font-size: var(--fs-2); color: var(--c-title); margin-bottom: 2vh; }
#v3 input[type=text] {
  background: var(--c-raise); border:1px solid var(--c-line); border-radius:4px;
  font-family:'IBM Plex Mono',monospace; font-size: var(--fs-1); color: var(--c-title);
  padding: 12px 18px; width: min(320px, 100%); outline: none;
  transition: border-color .3s;
}
#v3 input[type=text]:focus { border-color: var(--phos-dim); }
#v3 .privacy { font-size: var(--fs--1); color: var(--c-mute); margin-top: 10px; }
#v3 .nav-btns { margin-top: 3vh; display:flex; gap: 14px; }
#v3-verdict-panel { margin-top: 3vh; }
#v3-verdict-panel .verdict-line { font-family:'LXGW WenKai TC',serif; font-size: var(--fs-2); line-height:1.7; }
#v3-verdict-panel .pass { color: var(--phos); }
#v3-verdict-panel .fail { color: var(--danger); }
#v3-verdict-panel .detail { font-family:'IBM Plex Mono',monospace; font-size: var(--fs-0); color: var(--c-body); margin-top: 2vh; line-height: 2.1; }

/* 不要碰清單（黑水域） */
#blackwater {
  margin-block: 10vh; padding-block: 7vh;
  background: var(--danger-ghost);
  border-top: 1px solid var(--danger-deep); border-bottom: 1px solid var(--danger-deep);
}
#blackwater .buoys { display:flex; flex-wrap:wrap; justify-content:center; gap: 14px; margin-top: 4vh; }
.buoy {
  background: linear-gradient(rgba(255,255,255,0.02), rgba(0,0,0,0.14)), var(--c-panel);
  border:1px solid var(--c-line); border-radius:4px;
  padding: 18px 18px; flex: 0 1 236px;
  transition: transform .3s var(--e-quick), border-color .3s;
}
.buoy:hover { transform: translateY(2px); border-color: var(--danger-deep); } /* 反向 hover：往下拉 */
.buoy .x { color: var(--danger); font-size: var(--fs-1); font-weight:700; font-family:'IBM Plex Mono',monospace; }
.buoy .nm { color: var(--c-title); font-weight:500; margin-top:6px; }
.buoy .why { font-size: var(--fs--1); color: var(--c-mute); margin-top: 4px; line-height: 1.7; }
.buoy .why b { color: var(--danger); font-family:'IBM Plex Mono',monospace; font-weight:500; }
.twin-duel { display:grid; grid-template-columns:1fr 1fr; gap: 20px; margin-top: 5vh; }
.twin-duel .card:hover { transform:none; box-shadow:none; border-color: var(--c-line); }
.twin-duel h4 { font-family:'Noto Serif TC',serif; font-weight:600; color: var(--c-title); font-size: var(--fs-1); margin-bottom: 8px; }
.twin-duel .good h4 { color: var(--phos); }
.twin-duel .evil h4 { color: var(--danger); }

/* 靜態資訊卡：移除 hover 浮起（點了沒事就不該亮，真機回饋） */
.oxy-cards .card:hover, .lev-cost .card:hover, .law-cards .card:hover,
.stage-band .card:hover, .two-valves .card:hover {
  transform: none; box-shadow: none; border-color: var(--c-line);
}

/* 氧氣卡 */
.oxy-cards { display:grid; grid-template-columns: repeat(3, 1fr); gap: 20px; margin-block: 4vh; }
.oxy-cards .card .bignum { font-size: var(--fs-4); }

/* ============================================================
   三道水閘
   ============================================================ */
#gates { min-height: 100vh; }
#gates .gate-stage { min-height: 100vh; display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center; position:relative; }
#gates .g-step { position:absolute; inset:0; display:flex; flex-direction:column; align-items:center; justify-content:center; gap: 5vh; opacity:0; visibility:hidden; padding-inline: 24px; }
#gates .g-step.on { opacity:1; visibility:visible; }
#gates .g-idx { font-family:'IBM Plex Mono',monospace; font-size: var(--fs--1); color: var(--c-phos-dim); letter-spacing:.3em; }
#gates .g-q { font-family:'LXGW WenKai TC',serif; font-size: var(--fs-4); color: var(--c-title); line-height: 1.6; max-width: 18em; }
#gates .g-btns { display:flex; gap: 20px; flex-wrap:wrap; justify-content:center; }
/* 閘門：整幕水閘柵欄（答「是」時向上抽開，review-1 P1-3） */
#gate-door {
  position:absolute; inset:0; pointer-events:none; opacity:0;
  background: repeating-linear-gradient(to bottom, var(--c-line) 0 1px, transparent 1px 14px);
  transform-origin: top;
}
#gates .g-final .quote { text-align:left; }
/* 回港整補面板 */
#harbor-panel { max-width: 620px; }
#harbor-panel .hp-title { font-family:'LXGW WenKai TC',serif; font-size: var(--fs-2); color: var(--c-title); margin-bottom: 2vh; }
#harbor-panel .hp-links { display:flex; flex-direction:column; gap: 12px; margin-top: 3vh; text-align:left; }

/* 鎖定章遮罩 */
.chapter.locked .ch-body { filter: blur(14px) saturate(0.4); pointer-events: none; user-select:none; }
.gate-sign {
  display:none; position: sticky; top: 30vh; z-index: 20;
  max-width: 460px; margin-inline:auto; text-align:center;
  background: var(--c-panel); border:1px solid var(--warn); border-radius:4px;
  padding: 30px 34px; margin-bottom: -180px;
}
.chapter.locked .gate-sign { display:block; }
.gate-sign .knot { font-size: 30px; margin-bottom: 12px; color: var(--warn); }
.gate-sign .gs-txt { font-family:'LXGW WenKai TC',serif; color: var(--c-title); font-size: var(--fs-1); line-height:1.8; }
.gate-sign .btn-phos { margin-top: 20px; }

/* ============================================================
   第Ⅵ章 不殺鵝的人
   ============================================================ */
.quote-duo { display:grid; grid-template-columns: 1fr 1fr; gap: 40px; margin-block: 5vh; }
.quote-duo .quote { margin:0; font-size: var(--fs-2); }
#fork-fig svg { width: min(760px,100%); margin-inline:auto; }
/* 大型燈塔 */
#tower-lg { position:relative; width: 300px; height: 460px; margin: 6vh auto; }
#tower-lg .col { position:absolute; left: 149px; top:0; bottom:0; width:2px; background: var(--c-line); }
#tower-lg .zone { position:absolute; left: 146px; width: 8px; border-radius:2px; }
#tower-lg .tick { position:absolute; display:flex; align-items:center; gap:10px; font-family:'IBM Plex Mono',monospace; font-size: 12px; }
#tower-lg .tick .pct { min-width: 46px; text-align:right; color: var(--c-title); }
#tower-lg .tick i { display:block; width: 26px; height:1px; background: var(--c-mute); }
#tower-lg .tick .act { font-size: 11px; color: var(--c-mute); max-width: 150px; line-height: 1.5; font-family:'Noto Sans TC',sans-serif; }
/* 140/130 錯位槽（左側直排標籤＋引線；修真機文字互疊） */
#tower-lg .tlg-mark { position:absolute; right:152px; width:26px; height:2px; }
#tower-lg .tlg-lead { position:absolute; right:177px; width:1px; opacity:.55; }
#tower-lg .tick.tlg-slot { flex-direction:column; align-items:flex-end; text-align:right; gap:2px; }
#tower-lg .tick.tlg-slot .pct { min-width:0; }
#tower-lg .tick.tlg-slot .act { max-width: 132px; }
.iron-rules { list-style:none; margin-block: 4vh; }
.iron-rules li {
  display:flex; gap: 20px; align-items: baseline; padding: 16px 0;
  border-bottom: 1px solid var(--c-line-lo);
}
.iron-rules .anchor {
  font-family:'IBM Plex Mono',monospace; font-size: var(--fs-2); color: var(--phos);
  min-width: 110px; font-weight:500;
}
.iron-rules li.fatal .anchor, .iron-rules li.fatal .rule { color: var(--danger); }
.iron-rules .rule { color: var(--c-body); }

/* ============================================================
   第Ⅶ章 韓信點兵
   ============================================================ */
.ladder-fig { margin-block: 5vh; }
.ladder-fig svg { width: min(720px,100%); }
.kelly-fig { margin-block: 5vh; }
.kelly-formula {
  font-family:'IBM Plex Mono',monospace; font-size: var(--fs-1); color: var(--c-title);
  background: var(--c-panel); border: 1px solid var(--c-line); border-radius:4px;
  padding: 18px 26px;
  /* 分段 flex：桌機一行、窄屏在子算式之間換行（不橫捲、不切斷 term）— v2.2 */
  display:flex; flex-wrap:wrap; align-items:baseline; gap: 2px 14px; overflow-wrap:anywhere;
}
.kelly-formula .seg { white-space: nowrap; }
/* 槓桿換算：三案例直式階梯——一眼看完、窄屏自動換行不橫捲（v2.1 真機回饋） */
.lev-mix { display:flex; flex-direction:column; gap:10px; }
.lev-mix .lev-row {
  display:flex; flex-wrap:wrap; align-items:baseline; gap: 4px 16px;
  font-family:'IBM Plex Mono',monospace; font-size: var(--fs-1);
  background: var(--c-panel); border: 1px solid var(--c-line); border-radius:4px;
  padding: 14px 18px;
}
.lev-mix .lev-row.hl { border-color: var(--phos); }
.lev-mix .cfg { color: var(--c-title); min-width: 8.5em; flex: 1 1 8.5em; }
.lev-mix .calc { color: var(--c-mute); }
.lev-mix .calc::before { content: "→ "; color: var(--c-line); }
.lev-mix .res { color: var(--c-title); font-weight:700; margin-inline-start:auto; }
.lev-mix .res.phos { color: var(--phos); }
.lev-mix .tagk {
  font-family:'IBM Plex Mono',monospace; font-size: var(--fs--1); color: var(--phos);
  border: 1px solid var(--phos); border-radius: 3px; padding: 1px 7px; flex: none;
}
@media (max-width: 640px) {
  .lev-mix .res { margin-inline-start: 0; }
}
#kelly-scale { position:relative; height: 90px; margin-top: 4vh; }
#kelly-scale .rail { position:absolute; left:0; right:0; top: 44px; height:1px; background: var(--c-line); }
#kelly-scale .kt { position:absolute; top: 36px; width:1px; height: 16px; background: var(--c-mute); }
#kelly-scale .kl { position:absolute; top: 60px; transform: translateX(-50%); font-family:'IBM Plex Mono',monospace; font-size: 11px; color: var(--c-mute); }
#kelly-scale .flag { position:absolute; top: 0; transform: translateX(-50%); text-align:center; font-family:'IBM Plex Mono',monospace; font-size: 11px; white-space: nowrap; }
#kelly-scale .flag.amber { transform: translateX(-82%); text-align:right; } /* 靠右旗標不出血（真機回饋） */
#kelly-scale .flag.amber i { margin-inline: auto 18%; } /* 指針線仍對準 2.66 錨點 */
@media (max-width: 768px) {
  /* 兩支旗標窄屏互撞：全 Kelly 移到標尺下方、指針朝上；刻度字再往下讓位（真機回饋） */
  #kelly-scale { height: 128px; }
  #kelly-scale .flag.amber { top: 52px; display: flex; flex-direction: column-reverse; }
  #kelly-scale .flag.amber i { height: 10px; margin-top: 0; margin-bottom: 3px; }
  #kelly-scale .kl { top: 96px; }
}
.kelly-legend {
  font-size: var(--fs--1); color: var(--c-mute); line-height: 1.9;
  margin-top: 12px; max-width: 40em;
}
#kelly-scale .flag i { display:block; width:1px; height: 40px; margin-inline:auto; margin-top:4px; }
#kelly-scale .flag.phos { color: var(--phos); } #kelly-scale .flag.phos i { background: var(--phos); }
#kelly-scale .flag.amber { color: var(--warn); } #kelly-scale .flag.amber i { background: var(--warn); }
.law-cards { display:grid; grid-template-columns: repeat(auto-fit, minmax(180px,1fr)); gap: 16px; margin-block: 4vh; }
.law-cards .card .bignum { font-size: var(--fs-3); }
.law-cards .card .cap { font-size: var(--fs--1); color: var(--c-mute); margin-top: 6px; }

/* Ⅶ 章右側海域豎排金句（Fable 預核後備方案：使用者三度指向寬屏右側後啟用）
   sticky 沿章伴讀——像海上遠處的一盞航標，不加圖、不加新資訊 */
#ch7 .sidequote { display: none; }
@media (min-width: 1200px) {
  #ch7 .sidequote {
    display: block; position: absolute; right: 7vw; top: 14%; bottom: 8%;
    width: 2.2em; pointer-events: none; z-index: 2;
  }
  #ch7 .sidequote span {
    position: sticky; top: 24vh; display: block;
    writing-mode: vertical-rl;
    font-family: 'LXGW WenKai TC', serif;
    font-size: clamp(18px, 1.4vw, 22px);
    letter-spacing: .5em; line-height: 1.6;
    color: var(--c-title); opacity: .35;
  }
}

/* ============================================================
   第Ⅷ章 十二月一日
   ============================================================ */
#rebalance { text-align:center; }
#rebalance .datestamp {
  font-family:'Fraunces',serif; font-style:italic; font-weight:550;
  font-size: var(--fs-6); color: var(--phos); line-height:1;
}
#rebalance .rit-duo { display:grid; grid-template-columns:1fr 1fr; gap: 24px; margin-block: 6vh; text-align:left; }
#rebalance .rit-duo h4 { font-family:'Noto Serif TC',serif; font-weight:600; font-size: var(--fs-1); margin-bottom: 10px; }
#rebalance .rit-duo .up h4 { color: var(--phos); }
#rebalance .rit-duo .down h4 { color: var(--ember); }
#rebalance .arrow { font-size: var(--fs-2); }

/* ============================================================
   第Ⅸ章 對岸（V4/V5）
   ============================================================ */
#v4-chart { width:100%; height: 480px; overflow: visible; } /* 倍數印章不裁角（review-2 P1-N2） */
#v4-chart .lane-lbl { font-family:'IBM Plex Mono',monospace; font-size: 12px; fill: var(--c-body); }
#v4-chart .mult { font-family:'Fraunces',serif; font-style:italic; font-size: 22px; fill: var(--phos); }
#v4-chart .mult.sink { fill: var(--danger); }
#v4-chart .axis { font-family:'IBM Plex Mono',monospace; font-size: 10px; fill: var(--c-mute); }
#v4-note { font-family:'IBM Plex Mono',monospace; font-size: var(--fs--1); color: var(--c-mute); text-align:right; margin-top: 8px; }
#v4-sink-note { color: var(--danger); font-size: var(--fs--1); margin-top: 1vh; font-family:'IBM Plex Mono',monospace; }

/* V5 港階 */
#v5 .input-row { display:flex; align-items:center; gap: 16px; flex-wrap:wrap; margin-block: 3vh; }
#v5 input[type=text] {
  background: var(--c-raise); border:1px solid var(--c-line); border-radius:4px;
  font-family:'IBM Plex Mono',monospace; font-size: var(--fs-1); color: var(--c-title);
  padding: 12px 18px; width: 240px; outline:none; transition: border-color .3s;
}
#v5 input[type=text]:focus { border-color: var(--phos-dim); }
#v5-steps { margin-block: 4vh; }
.pstep {
  display:grid; grid-template-columns: 110px 70px 1fr 200px; gap: 18px; align-items:baseline;
  padding: 20px 22px; border:1px solid var(--c-line); border-radius: 4px; margin-bottom: 10px;
  background: var(--c-panel);
  transition: border-color .3s, box-shadow .3s;
}
/* 港階＝碼頭石階剖面：一層層退階（review-1 P1-7；行動端還原直列） */
@media (min-width: 769px) {
  #v5-steps .pstep:nth-child(1) { margin-right: 0; }
  #v5-steps .pstep:nth-child(2) { margin-right: 56px; }
  #v5-steps .pstep:nth-child(3) { margin-right: 112px; }
  #v5-steps .pstep:nth-child(4) { margin-right: 168px; }
  #v5-steps .pstep:nth-child(5) { margin-right: 224px; }
  #v5-steps .pstep { border-left-width: 3px; }
}
.pstep .mult { font-family:'Fraunces',serif; font-style:italic; font-weight:550; font-size: var(--fs-3); color: var(--c-title); }
.pstep .rate { font-family:'IBM Plex Mono',monospace; color: var(--c-mute); }
.pstep .pos { color: var(--c-body); font-size: var(--fs-0); }
.pstep .amt { font-family:'IBM Plex Mono',monospace; font-size: var(--fs-1); color: var(--c-title); text-align:right; }
.pstep.star { border-color: var(--phos); box-shadow: 0 0 22px rgba(69,240,180,.15); }
.pstep.star .mult, .pstep.star .amt { color: var(--phos); }
.pstep.ghost { border-style: dashed; cursor:pointer; }
.pstep .warn-note { grid-column: 3 / -1; font-size: var(--fs--1); color: var(--warn); }
#qqqi-detail { display:none; margin-block: 2vh; }
#qqqi-detail.open { display:block; }

/* 四大階段帶 */
.stage-band { display:grid; grid-template-columns: repeat(4, 1fr); gap: 14px; margin-block: 5vh; }
.stage-band .card h4 { font-family:'Noto Serif TC',serif; font-weight:600; color: var(--c-title); font-size: var(--fs-1); margin-bottom: 10px; }
.stage-band .card .cfg { font-family:'IBM Plex Mono',monospace; font-size: var(--fs--1); color: var(--phos); margin-bottom: 8px; }
.stage-band .card .act { font-size: var(--fs--1); color: var(--c-body); line-height: 1.8; }
.stage-band .card .red { font-size: var(--fs--1); color: var(--warn); margin-top: 8px; line-height:1.7; }

/* 兩套閘門 */
.two-valves { display:grid; grid-template-columns: 1fr 56px 1fr; gap: 14px; align-items:center; margin-block: 5vh; }
.two-valves .vx { font-size: var(--fs-3); color: var(--danger); text-align:center; font-weight:700; }
.two-valves .card b { color: var(--phos); }
.two-valves .caption { grid-column: 1/-1; }

/* ============================================================
   Ⅸ.5 引水人
   ============================================================ */
#pilot-zone { display:grid; grid-template-columns: 300px 1fr; gap: 40px; align-items:start; margin-top: 5vh; }
#pilot-compass { width: 100%; aspect-ratio: 1; }
#pilot-compass .pc-badge { cursor:pointer; }
#pilot-compass .pc-badge circle { fill: var(--c-panel); stroke: var(--c-line); transition: stroke .3s; }
#pilot-compass .pc-badge:hover circle, #pilot-compass .pc-badge.on circle { stroke: var(--phos); }
#pilot-compass .pc-badge text { fill: var(--c-body); font-family:'Noto Sans TC',sans-serif; font-size: 10px; }
#pilot-compass .pc-badge .n { fill: var(--c-phos-dim); font-family:'IBM Plex Mono',monospace; }
#pilot-compass #pc-needle { stroke: var(--ember); stroke-width: 2; transition: transform .5s var(--e-base); transform-origin: 150px 150px; }
#pilot-card { min-height: 380px; }
#pilot-card .pc-ask { font-family:'LXGW WenKai TC',serif; font-size: var(--fs-1); color: var(--c-title); line-height: 1.8; }
#pilot-card .pc-principle { margin-top: 2.5vh; }
#pilot-card .pc-case { margin-top: 2.5vh; font-size: var(--fs-0); color: var(--c-body); }
#pilot-card .pc-sec {
  font-family:'IBM Plex Mono',monospace; font-size: var(--fs--1); letter-spacing:.2em;
  color: var(--c-phos-dim); display:block; margin-bottom: 8px;
}
#pilot-card .region-chip {
  border:1px solid var(--warn); border-radius:3px; padding: 8px 14px;
  font-size: var(--fs--1); color: var(--warn); margin-top: 2vh; display:none;
}
#pilot-card .region-chip.on { display:block; }
#pilot-card .ext {
  margin-top: 2.5vh; font-size: var(--fs--1);
}

/* ============================================================
   第Ⅹ章 黎明 / 終章
   ============================================================ */
#dawn .prose p { margin-bottom: 2em; }
/* 金句海灘（Fable 裁決 b 案）：align-items:start 讓紙板貼合句長（貝殼多大、殼就多大），
   錯落幅度為「有實體紙板」重新校準——原 10vh/6vh 是無底板夜區的值 */
.shell-beach { margin-block: 8vh; display:grid; grid-template-columns: 1fr 1fr; gap: 3vh 8%; align-items: start; }
.shell-beach .quote { margin:0; }
.shell-beach .q-off { margin-top: 4vh; }
.dawn-warn-card {
  border:1px solid #B87A10; border-radius:4px; padding: 20px 26px;
  color: var(--dawn-ink);
  background: linear-gradient(rgba(184,122,16,0.06), rgba(184,122,16,0.06)), var(--dawn-paper);
  max-width: 620px; margin-block: 5vh;
}
/* 黎明可讀性：內容墊紙色底、粒子退到文字後（review-1 P0-2） */
.is-dawn #dawn .quote, .is-dawn #dawn .prose p, .is-dawn #dawn .ch-head {
  background: color-mix(in srgb, var(--dawn-paper) 86%, transparent);
  box-shadow: 0 0 24px 12px color-mix(in srgb, var(--dawn-paper) 86%, transparent);
  border-radius: 2px;
}
#finale .logpage {
  max-width: 720px; margin-inline:auto;
  border: 1px solid var(--c-line); border-radius: 4px;
  background: var(--c-panel); padding: 48px 52px;
}
#finale .datestamp {
  font-family:'IBM Plex Mono',monospace; font-size: var(--fs--1); color: var(--c-mute);
  letter-spacing:.2em; margin-bottom: 3vh; display:block;
}
#finale .memoir { font-family:'LXGW WenKai TC',serif; font-size: var(--fs-1); color: var(--c-title); line-height: 2; }
#finale .eight {
  font-family:'Noto Serif TC',serif; font-weight:900; font-size: var(--fs-3);
  color: var(--c-title); letter-spacing:.18em; margin-block: 4vh; text-align:center;
}
#finale .full-disclaimer {
  font-size: var(--fs-0); /* 正文字級——設計立場 */
  color: var(--c-body); line-height: 2;
  border-top: 1px solid var(--c-line); border-bottom: 1px solid var(--c-line);
  padding-block: 3vh; margin-block: 4vh;
}
#finale .tribute { font-size: var(--fs-0); }
#finale .tribute .btns { display:flex; gap: 14px; margin-top: 2vh; flex-wrap:wrap; }
#finale .relinks { display:flex; gap: 22px; margin-top: 4vh; flex-wrap:wrap; }
#finale .colophon {
  text-align:center; font-family:'IBM Plex Mono',monospace; font-size: var(--fs--1);
  color: var(--c-mute); margin-top: 8vh; letter-spacing:.15em;
}

/* ============================================================
   RWD（≤768px：零 pin、堆疊）
   ============================================================ */
@media (max-width: 1023px) {
  #tickets .ticket-grid { grid-template-columns: repeat(3, 1fr); }
  .duel, .quote-duo, .lev-cost, .twin-duel, .shell-beach,
  #rebalance .rit-duo { grid-template-columns: 1fr; }
  .stage-band { grid-template-columns: repeat(2,1fr); }
  #pilot-zone { grid-template-columns: 1fr; }
  #pilot-compass { max-width: 340px; margin-inline:auto; }
}
@media (max-width: 768px) {
  :root { --fs-6: clamp(48px, 11vw, 64px); } /* 對比大字收斂，防溢出（review-2 P0-N1） */
  .wrap { padding-inline: 20px; }
  .breath { height: 140px; }
  .buoy { flex: 1 1 100%; } /* 沉船浮標手機滿寬，與下方對照卡齊（真機回饋） */
  .duel { grid-template-columns: 1fr; }
  .duel .side, .two-valves .card, .stage-band .card { max-width: 100%; min-width: 0; overflow-wrap: anywhere; }
  #tickets .ticket-grid { grid-template-columns: repeat(2, 1fr); }
  .oxy-cards { grid-template-columns: 1fr; }
  .stage-band { grid-template-columns: 1fr; }
  .two-valves { grid-template-columns: 1fr; }
  .two-valves .vx { transform: rotate(90deg); }
  #v2 .grid-wrap { grid-template-columns: 1fr; }
  #v2 .grid-wrap > div:last-child { border-left:none; padding-left:0; }
  #v2-matrix { font-size: 9px; min-width: 520px; }
  .matrix-hint { display:block; }
  .pstep { grid-template-columns: auto auto 1fr; grid-template-rows: auto auto; align-items:center; }
  .pstep .mult { grid-row: 1; }
  .pstep .rate { grid-row: 1; }
  .pstep .amt { grid-row: 1; text-align:right; }
  .pstep .pos { grid-row: 2; grid-column: 1 / -1; }
  .pstep .warn-note { grid-row: 3; grid-column: 1 / -1; }
  #hud { left: auto; right: 16px; bottom: 16px; }
  #hud .dial { width: 44px; height: 44px; }
  #hud .meta { display:none; }
  #starmap { left: 12px; right: 12px; bottom: 76px; width: auto; }
  #hero .vert { display: none; }
  #hero .hero-main { padding-left: 20px; } /* review-1 P0-6：勿貼死左緣 */
  #hero h1 { font-size: clamp(34px, 9vw, 44px); }
  .nav { padding: 14px 20px; }
  #finale .logpage { padding: 28px 22px; }
  .ch-watermark { font-size: 34vw; }
  .shell-beach .q-off { margin-top: 0; }
}

/* ============================================================
   [IMAGE-GEN] 換入圖層（design-spec §F：夜區 screen／黎明區 multiply）
   ============================================================ */
.imggen, .imggen img { pointer-events: none; user-select: none; }
/* IMG-1 hero 版畫：右下 1/3、opacity .5、screen */
.imggen-hero {
  position: absolute; right: 4vw; bottom: 5vh; z-index: 1;
  width: min(320px, 24vw);
}
.imggen-hero img { opacity: .5; mix-blend-mode: screen; border-radius: 4px; }
/* IMG-2 風暴滿屏版畫：−83% 巨字背後、opacity .25、screen */
#storm .crash { position: relative; overflow: hidden; }
#storm .crash .imggen-full {
  position: absolute; inset: 0; z-index: 0;
}
#storm .crash .imggen-full img {
  width: 100%; height: 100%; object-fit: cover;
  opacity: .25; mix-blend-mode: screen;
}
#storm .crash > *:not(.imggen-full) { position: relative; z-index: 1; }
/* IMG-3 不殺鵝寓意插畫：圓形遮罩＋髮絲框 */
.imggen-circle { width: min(300px, 70vw); margin: 5vh auto; }
.imggen-circle img {
  aspect-ratio: 1 / 1; width: 100%; object-fit: cover;
  border-radius: 50%; border: 1px solid rgba(154, 214, 184, .28);
  opacity: .9; mix-blend-mode: screen;
}
.imggen-circle figcaption { text-align: center; margin-top: 12px; }
/* IMG-4 黎明海面：滿寬、multiply */
.imggen-dawn { margin: 0 0 6vh; }
.imggen-dawn img {
  width: 100%; height: auto; border-radius: 4px;
  object-fit: cover; object-position: 50% 65%;
  mix-blend-mode: multiply; border: 1px solid var(--dawn-line);
}
@media (max-width: 768px) {
  .imggen-dawn img { height: clamp(180px, 48vw, 260px); } /* 行動端 cover 裁切，不壓扁 */
}
@media (max-width: 768px) {
  .imggen-hero { display: none; } /* 小屏 hero 留給文字與 3D */
}

/* reduced motion */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  #hero .scroll-cue { animation: none !important; }
}

/* ============================================================
   可見焦點（fix-verified：keyboard-navigation 5.1）

   為什麼要獨立成一節：站上原本有三處 `outline:none`，把瀏覽器的焦點框拿掉了，
   卻沒有給替代樣式——鍵盤使用者按 Tab 之後會**完全不知道自己在哪裡**。
   移除預設樣式是可以的，但那就欠一個替代品；沒有替代品的移除是缺陷不是設計。

   用 :focus-visible 而非 :focus：滑鼠點擊不該出現焦點框（那是視覺噪音），
   鍵盤操作則一定要有。這正是 :focus-visible 存在的理由。
   ============================================================ */
:where(a, button, [tabindex], input, select, textarea):focus-visible {
  outline: 2px solid var(--phos, #7fe3c0);
  outline-offset: 3px;
  border-radius: 2px;
}

/* 深色海面上，單靠 outline 對比可能不足，補一圈外暈 */
#hud .dial:focus-visible,
.ticket:focus-visible,
.star:focus-visible,
.badge:focus-visible {
  box-shadow: 0 0 0 4px rgba(127, 227, 192, .25);
}

/* 高對比模式下改用系統色，不要硬套品牌色 */
@media (forced-colors: active) {
  :where(a, button, [tabindex], input, select, textarea):focus-visible {
    outline: 2px solid CanvasText;
  }
}

/* 鍵盤使用者才需要的跳過連結：不是裝飾，是讓人不必 Tab 過整個 HUD 才進到內文 */
.skip-link {
  position: absolute; left: -9999px; top: 0; z-index: 999;
  padding: 10px 16px; background: var(--c-bg, #06131a); color: var(--c-title, #eaf4f2);
  border: 1px solid var(--phos, #7fe3c0);
}
.skip-link:focus-visible { left: 8px; top: 8px; }

/* ============================================================
   出處面板（strengthen-content-evidence）

   ⚠️ 用 fixed 疊層而非行內展開：行內展開會改變 pin 區段的高度，
   ScrollTrigger 的 pin 幾何會當場錯位（tasks 3.2 的硬條件就是這個）。
   ============================================================ */
.ev-cite {
  font: inherit; color: var(--phos, #7fe3c0);
  background: none; border: 0; padding: 0 .1em; cursor: pointer;
  text-decoration: underline dotted; text-underline-offset: 3px;
}
.ev-cite:hover { text-decoration-style: solid; }

#ev-panel {
  position: fixed; inset: 0; z-index: 900;
  display: flex; align-items: center; justify-content: center;
  background: rgba(3, 10, 14, .72); padding: 20px;
}
#ev-panel[hidden] { display: none; }
#ev-panel .ev-box {
  max-width: 560px; width: 100%; max-height: 82vh; overflow: auto;
  background: var(--c-bg, #06131a); color: var(--c-body, #cfe3e0);
  border: 1px solid var(--c-line, #2c4750); border-radius: 4px;
  padding: 22px 24px; box-shadow: 0 18px 60px rgba(0, 0, 0, .55);
}
#ev-panel h2 {
  font-family: 'Fraunces', serif; font-size: 20px;
  color: var(--c-title, #eaf4f2); margin: 0 0 14px;
}
#ev-panel .ev-claim {
  font-size: 15px; line-height: 1.75; margin: 0 0 16px;
  padding-left: 12px; border-left: 2px solid var(--phos, #7fe3c0);
}
#ev-panel .ev-meta { display: grid; grid-template-columns: 5.5em 1fr; gap: 6px 12px; margin: 0 0 16px; }
#ev-panel .ev-meta dt { color: var(--c-dim, #7f9aa0); font-size: 13px; }
#ev-panel .ev-meta dd { margin: 0; font-size: 14px; }
/* 未審核的狀態要顯眼——它的用途正是提醒讀者「先別當結論」 */
#ev-panel .ev-pending {
  border: 1px solid var(--ember, #e0603e); border-radius: 3px;
  padding: 10px 12px; font-size: 14px; line-height: 1.7; margin: 0 0 14px;
}
#ev-panel .ev-ok { color: var(--phos, #7fe3c0); font-size: 14px; margin: 0 0 14px; }
#ev-panel .ev-note { font-size: 12.5px; line-height: 1.7; color: var(--c-dim, #7f9aa0); margin: 0 0 16px; }
#ev-panel .ev-close {
  font: inherit; font-size: 14px; cursor: pointer;
  background: none; color: var(--c-title, #eaf4f2);
  border: 1px solid var(--c-line, #2c4750); border-radius: 3px; padding: 8px 18px;
}

@media (max-width: 768px) {
  #ev-panel .ev-box { padding: 18px 16px; max-height: 88vh; }
  #ev-panel .ev-meta { grid-template-columns: 4.5em 1fr; }
}

/* ============================================================
   /guide FIG.07 出處索引（strengthen-content-evidence 4.1／4.2）
   ============================================================ */
.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}
.ei-filters { display: flex; gap: 18px; align-items: center; flex-wrap: wrap; margin: 1.5vh 0; }
.ei-filters label { font-size: 13px; color: var(--c-dim, #7f9aa0); }
.ei-filters select {
  font: inherit; font-size: 13px; margin-left: 6px; padding: 4px 8px;
  background: var(--c-bg, #06131a); color: var(--c-body, #cfe3e0);
  border: 1px solid var(--c-line, #2c4750); border-radius: 3px;
}
.ei-count { font-size: 13px; color: var(--phos, #7fe3c0); }
/* 寬表在窄螢幕自己捲，不讓整個頁面橫捲 */
.ei-wrap { overflow-x: auto; }
.ei-table { width: 100%; border-collapse: collapse; font-size: 13px; line-height: 1.6; }
.ei-table th, .ei-table td {
  text-align: left; vertical-align: top; padding: 7px 10px;
  border-bottom: 1px solid var(--c-line, #2c4750);
}
.ei-table th { color: var(--c-dim, #7f9aa0); font-weight: normal; white-space: nowrap; }
.ei-table .ei-ch, .ei-table .ei-st { white-space: nowrap; }
.ei-table .ei-text { min-width: 20em; }
.ei-table .ei-src { color: var(--phos, #7fe3c0); white-space: nowrap; }
.ei-table .ei-st b { color: var(--ember, #e0603e); font-weight: normal; }
@media (max-width: 768px) {
  .ei-table { font-size: 12px; }
  .ei-table .ei-text { min-width: 14em; }
}
