/* ============================================================================
   night.css｜港町異頻事務所 專頁樣式
   ----------------------------------------------------------------------------
   來源：Claude Design 專案「港町夜版預售頁 v2.dc.html」（2026-08-23 匯入）
   v2 是 Design Canvas 的反應式模板（sc-for／sc-if／x-import），那套 runtime
   在純靜態站上沒有，所以這裡是**照著它的設計語言重寫**，不是複製。

   ⚠️ 站制口徑：v2 的文案寫「十一站任選六站」，但本案已於 07-26/27 改為
      「一店一本、選一間店」。本檔一律用單店口徑，不得出現「任選六站」。

   v2 的設計代幣（_ds/.../tokens/layout.css）對照：
      --content-max 1280 / --reading-max 720 / --page-gutter clamp(20,5vw,72)
      --radius-card 2px / --notch-size 14px / --ease-brand cubic-bezier(.22,.61,.36,1)
      --opacity-paper-grain .12 / --opacity-analog-noise .07
   ============================================================================ */

body[data-page='night'] {
  --km-content: 1280px;
  --km-reading: 720px;
  --km-gutter: clamp(20px, 5vw, 72px);
  --km-notch: 14px;
  --km-grain: .12;
  --km-noise: .07;
}

/* ══════════════════════════════════════════════════ HERO 三段式接入 ══ */
/* 階段由 <body data-hero="idle|tuning|desk"> 控制，app.js 切換。
   idle  → 港邊遠景，標題與「接入異頻」
   tuning→ 三張圖依序推進，右下角頻道讀數，可略過
   desk  → 檔案桌，浮出三個可點擊熱區 */

.km-hero {
  position: relative;
  min-height: max(620px, 100svh);
  overflow: hidden;
  background: var(--abyss-950);
  display: flex;
  align-items: flex-end;
}

/* 三張背景圖疊在一起，用 opacity + scale 交叉推進 */
.km-hero__plate {
  /* 三段接入移除後只剩一張圖，不再需要初始透明與交叉淡入 —— 直接顯示。 */
  position: absolute; inset: 0; z-index: 0;
}
.km-hero__plate img {
  width: 100%; height: 100%; object-fit: cover;
  object-position: var(--km-focus, 50% 58%);
  /* v2 的夜版影像處理：拉對比、退飽和、壓亮 */
  filter: contrast(1.14) saturate(.8) brightness(.9);
}
/* 遮罩維持全強度：標題壓在左半邊，靠這層斜向暗幕才讀得到。 */

.km-hero__inner {
  position: relative; z-index: 3;
  width: 100%;
  max-width: var(--km-content);
  margin-inline: auto;
  padding: clamp(96px, 14vh, 150px) var(--km-gutter) clamp(56px, 9vh, 96px);
}

/* ── 品牌鎖定組：調諧章 ＋ 事務所名 ＋ 座標行 ── */
.km-lockup { display: flex; align-items: center; gap: 16px; margin-bottom: 26px; }
.km-lockup img { height: 44px; width: auto; flex: none; }
.km-lockup__text { display: flex; flex-direction: column; gap: 5px; }
.km-lockup__name {
  font-family: var(--font-display); font-weight: 700;
  font-size: 14px; letter-spacing: .30em; color: var(--archive-200);
}
.km-lockup__coord {
  font-family: var(--font-mono); font-size: 10px;
  letter-spacing: .20em; color: var(--text-secondary);
}

.km-hero__title {
  font-family: var(--font-display); font-weight: 700;
  font-size: var(--size-display);
  line-height: 1.32; letter-spacing: var(--tracking-display);
  color: var(--archive-200);
  margin: 0; max-width: 16em;
  text-shadow: 0 18px 48px rgba(0, 0, 0, .7);
}
.km-hero__actions { display: flex; flex-wrap: wrap; gap: 14px; align-items: center; margin-top: 40px; }

/* 只在對應階段顯示 */
/* .km-only-* 的階段切換已隨三段接入一併移除（2026-08-23）。 */

/* tuning 讀數與 desk 熱區的樣式已隨三段接入一併移除（2026-08-23）。 */

@keyframes kmRise { from { opacity: 0; transform: translateY(12px) } to { opacity: 1; transform: none } }
@keyframes kmPulse {
  0%, 100% { opacity: .25; transform: scale(.8) }
  50%      { opacity: .95; transform: scale(1.15) }
}
@media (prefers-reduced-motion: reduce) {
  .km-hero__scrim { transition: none !important; }
}

/* ══════════════════════════════════════════════════ 六條守則 ══ */
.km-rules { display: grid; gap: var(--s4); }
@media (min-width: 700px)  { .km-rules { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1080px) { .km-rules { grid-template-columns: repeat(3, 1fr); } }
.km-rule {
  position: relative;
  border: 1px solid var(--border-default);
  border-radius: 2px;
  padding: var(--s5);
  background: var(--surface-card);
  display: grid; gap: var(--s2);
  clip-path: polygon(0 0, calc(100% - var(--km-notch)) 0, 100% var(--km-notch), 100% 100%, 0 100%);
}
/* 編號由 app.js 的 kmRules 樣板輸出，這裡只管樣式 */
.km-rule__no {
  font-family: var(--font-mono); font-size: 11px;
  letter-spacing: .2em; color: var(--brass-500);
}
.km-rule h4 { margin: 0; font-family: var(--font-display); font-size: var(--size-h3); font-weight: 500; }
.km-rule p { margin: 0; font-size: var(--size-small); color: var(--text-muted); }

/* ══════════════════════════════════════════════════ 事件檔案庫 ══ */
.km-files { display: grid; gap: var(--s4); }
@media (min-width: 760px) { .km-files { grid-template-columns: repeat(3, 1fr); } }
.km-file {
  border: 1px solid var(--border-default); border-radius: 2px;
  padding: var(--s5); background: var(--surface-card);
  display: grid; gap: var(--s3); align-content: start;
  clip-path: polygon(0 0, calc(100% - var(--km-notch)) 0, 100% var(--km-notch), 100% 100%, 0 100%);
}
.km-file--sealed { opacity: .48; }
.km-file__id {
  font-family: var(--font-mono); font-size: 11px;
  letter-spacing: .18em; color: var(--brass-500);
}
.km-file--sealed .km-file__id { color: var(--text-secondary); }
.km-file__stamp {
  justify-self: start;
  font-family: var(--font-mono); font-size: 10px; letter-spacing: .18em;
  border: 1px solid var(--alert-700); color: #b8756c;
  padding: 3px 8px; border-radius: 2px;
}

/* ══════════════════════════════════════════════════ 兩封委託函 ══ */
.km-letters { display: grid; gap: var(--s5); }
@media (min-width: 900px) { .km-letters { grid-template-columns: repeat(2, 1fr); } }
.km-letter {
  position: relative;
  border: 1px solid var(--border-default); border-radius: 2px;
  background: var(--surface-card);
  padding: var(--s6) var(--s5) var(--s5);
  display: grid; gap: var(--s4); align-content: start;
  clip-path: polygon(0 0, calc(100% - 22px) 0, 100% 22px, 100% 100%, 0 100%);
  transition: border-color .3s var(--ease), transform .3s var(--ease);
}
.km-letter:hover { border-color: var(--border-accent); transform: translateY(-2px); }
.km-letter__kicker {
  font-family: var(--font-mono); font-size: 10px;
  letter-spacing: .2em; color: var(--brass-500);
}
.km-letter h3 { margin: 0; font-family: var(--font-display); font-size: var(--size-h3); }
.km-letter__note { font-size: var(--size-label); color: var(--text-secondary); }
.km-letter__seal {
  position: absolute; right: var(--s5); top: var(--s5);
  font-family: var(--font-mono); font-size: 10px; letter-spacing: .18em;
  color: var(--brass-500); border: 1px solid var(--brass-500);
  border-radius: 999px; padding: 4px 10px;
  transform: rotate(-8deg);
}

/* ══════════════════════════════════════════════════ 單位露出 ══ */
/* 對外必要露出：輔導單位、城鄉島遊 LOGO、三個 hashtag、製作方 */
.km-partners {
  border-top: 1px solid var(--border-default);
  padding-top: var(--s6);
  display: grid; gap: var(--s6);
}
@media (min-width: 860px) { .km-partners { grid-template-columns: 1.1fr 1fr 1fr; } }
.km-partners__col { display: grid; gap: var(--s3); align-content: start; }
.km-partners__label {
  font-family: var(--font-mono); font-size: 10px;
  letter-spacing: .2em; color: var(--text-secondary);
}
/* 白底（2026-08-24）。四個 LOGO 全是深色印刷版——量過不透明像素的平均亮度：
   中小企業總會 8.6、城鄉島遊 0.0、果源創生 47.8，港町是深綠底＋米色字的完整標章。
   放在近黑底上等於看不見，而這四個是「缺一不可」的對外必要露出，
   看不見就等於沒露出。 */
.km-partners__logo {
  display: grid; place-items: center;
  min-height: 84px; padding: var(--s4) var(--s5);
  border: 1px solid rgba(255, 255, 255, .14); border-radius: 3px;
  background: #FFFFFF;
}
.km-partners__logo > * { grid-area: 1 / 1; }
/* max-width 是必要的：nasme-type.png 是 3489x194 的超寬圖，
   只給 max-height 會被撐成約 790px 寬、直接溢出欄位。 */
.km-partners__logo img {
  max-height: 56px; max-width: 100%; width: auto; height: auto;
  object-fit: contain; z-index: 1;
}
.km-partners__logo .media__note { font-size: 10px; }
.km-tags {
  font-family: var(--font-mono); font-size: var(--size-label);
  letter-spacing: .1em; color: var(--brass-500);
}

/* ══════════════════════════════════════════════════ 紙紋與雜訊 ══ */
/* v2 全頁疊一層紙纖與類比雜訊。這裡沿用既有的 textures 檔。 */
body[data-page='night']::after {
  content: ''; position: fixed; inset: 0; z-index: 999; pointer-events: none;
  background: url('../img/textures/類比雜訊港紙_方形.png') repeat;
  background-size: 480px 480px;
  opacity: var(--km-noise);
  mix-blend-mode: soft-light;
}

/* ══════════════════════════════════════════ v2 字級層級（僅夜版頁）══ */
/* 為什麼只在夜版頁改：你先前三次說「字太大」，那是對的——當時內文一行
   有 69 個中文字，是行寬問題。但量過 v2 之後發現真正的差別不是大小，
   是「對比」：
        v2   標題 40–92px ／ 內文 14–15px  → 對比 6.5 倍
        原本  標題 25–36px ／ 內文 16px     → 對比 2.25 倍
   對比垮掉，整頁就會像傳單而不像檔案室。所以這裡把標題拉回 v2 的比例，
   內文與行寬完全不動（仍然是你認可的大小）。其他三頁不受影響。 */
body[data-page='night'] {
  --size-display: clamp(40px, 6.5vw, 92px);   /* v2 hero 標題原值 */
  --size-h1:      clamp(40px, 6.5vw, 92px);
  --size-h2:      clamp(28px, 3.4vw, 52px);   /* v2 區塊標題原值 */
  --size-h3:      clamp(19px, 1.8vw, 24px);
  --size-lead:    clamp(15px, 1.4vw, 20px);
  --size-label:   max(10px, .625rem);          /* v2 標籤 10px */
  --tracking-channel: .2em;
  --tracking-station: .08em;
  --leading-heading: 1.25;
}
body[data-page='night'] h1,
body[data-page='night'] .km-hero__title {
  font-weight: 900; letter-spacing: .02em; line-height: 1.22;
}
body[data-page='night'] h2 { font-weight: 800; letter-spacing: .02em; line-height: 1.3; }

/* ══════════════════════════════════════ 設計系統元件（照 v2 原始碼）══ */
/* 以下四個元件的數值直接取自 Claude Design 的 _ds_bundle.js，不是估的。*/

/* ── ChannelLabel：頻道標籤，頂欄的 ON AIR 就是這個 ── */
.km-ch {
  font-family: var(--font-mono); font-size: 11px;
  letter-spacing: var(--tracking-channel, .2em); text-transform: uppercase;
  color: var(--text-muted);
  display: inline-flex; align-items: center; gap: 10px; white-space: nowrap;
}
.km-ch--brass   { color: var(--brass-500); }
.km-ch--archive { color: var(--archive-200); }
.km-ch__dot {                       /* live 指示燈 */
  width: 5px; height: 5px; border-radius: 50%;
  background: var(--alert-700, #78352F); flex: none;
}
.km-ch__code { font-weight: 500; color: var(--brass-500); }
.km-ch__sep  { opacity: .5; }

/* ── SignalDot：脈動訊號點 ── */
.km-sig { display: inline-flex; align-items: center; gap: 8px; }
.km-sig__dot {
  width: 6px; height: 6px; border-radius: 50%;
  background: var(--alert-700, #78352F); flex: none;
  animation: kmSignalPulse 2.4s var(--ease) infinite;
}
.km-sig__label {
  font-size: 12px; font-weight: 600;
  letter-spacing: var(--tracking-label, .18em); color: var(--text-muted);
}
@keyframes kmSignalPulse { 0%, 100% { opacity: 1 } 50% { opacity: .35 } }

/* ── TuningDial：十一格調諧轉盤（十一個頻道）── */
.km-dial { display: block; flex: none; }
.km-dial__tick   { stroke: rgba(210, 195, 162, .35); stroke-width: 1; }
.km-dial__tick--lit { stroke: var(--brass-500); stroke-width: 2; }
.km-dial__ring   { fill: none; stroke: rgba(210, 195, 162, .35); stroke-width: .5; opacity: .5; }
.km-dial__needle { stroke: var(--brass-500); stroke-width: 1.5;
                   transition: transform .6s var(--ease); transform-origin: center; }
.km-dial__hub    { fill: var(--brass-500); }

/* ── ArchiveCard 的切角：v2 用 clip-path 切掉一個 14px 的角 ── */
.km-notch--tr { clip-path: polygon(0 0, calc(100% - 14px) 0, 100% 14px, 100% 100%, 0 100%); }
.km-notch--bl { clip-path: polygon(0 0, 100% 0, 100% 100%, 14px 100%, 0 calc(100% - 14px)); }

/* ── Button：v2 的字距與 hover（黃銅反白＋光暈）── */
body[data-page='night'] .btn { letter-spacing: .18em; }
body[data-page='night'] .btn--primary:hover {
  background: var(--brass-500); color: var(--abyss-950);
  box-shadow: var(--focus-glow, 0 0 40px rgba(169, 129, 77, .18));
  transform: translateY(-1px);
}

/* ══════════════════════════════════════ v2 缺的四個動畫 keyframes ══ */
/* 定義原封不動取自 v2 檔頭的 <style>。 */
@keyframes kmInkIn { from { opacity: 0; transform: translateY(7px) } to { opacity: 1; transform: translateY(0) } }
@keyframes kmDrift { from { transform: translate3d(-1.5%, 0, 0) scale(1.05) }
                     to   { transform: translate3d( 1.5%, 0, 0) scale(1.05) } }
@keyframes kmDust  { 0%   { transform: translate3d(-1.5%, 0, 0) }
                     50%  { transform: translate3d( 1.5%, -1.2%, 0) }
                     100% { transform: translate3d(-1.5%, 0, 0) } }
@keyframes kmStamp { 0%   { transform: scale(1.12); opacity: 0 }
                     45%  { transform: scale(.96);  opacity: 1 }
                     100% { transform: scale(1);    opacity: 1 } }

/* ══════════════════════════════════ 夜版頁的小標＝v2 的 ChannelLabel ══ */
/* 母站的 .eyebrow 是 410 風格的 16px 中文；v2 用的是 10px 等寬黃銅小標。
   兩者差很多，這是「靜態畫面就看得出不一樣」的來源之一。只改夜版頁。 */
body[data-page='night'] .eyebrow {
  font-family: var(--font-mono); font-size: 10px; font-weight: 500;
  letter-spacing: var(--tracking-channel, .2em); text-transform: uppercase;
  color: var(--brass-500);
  display: inline-flex; align-items: center; gap: 10px;
}
body[data-page='night'] .eyebrow::before {   /* 黃銅短線，接上 v2 的節奏 */
  content: ''; width: 18px; height: 1px; background: currentColor;
  opacity: .55; flex: none;
}

/* ══════════════════════════════════════════════ 頂欄的 ON AIR 指示 ══ */
.nav__onair { display: inline-flex; align-items: center; }
@media (max-width: 900px) { .nav__onair { display: none; } }

/* 名錄手電筒已於 2026-08-24 依指示移除。
   底下保留的是卡片本身仍需要的樣式：訊號文字、了解更多、命中面、ALERT 徽章。 */
.station__signal {
  font-family: var(--font-mono); font-size: 9px; letter-spacing: .2em;
  color: var(--text-muted); text-transform: uppercase;
}
.station__more { margin-top: var(--s2); align-self: flex-start; }

/* ─── 店家卡新欄位（2026-08-24）───────────────────────────────
   卡面順序：區域 / 店名 / 《劇本名》/ 一句話 / 中繼列 / 營業日 / 提醒 / 按鈕
   中繼列（席次·時長·題材·年齡）用點分隔，是選店時真正會看的四項。 */
.station__area {
  font-family: var(--font-mono); font-size: 9px; letter-spacing: .2em;
  color: var(--brass-500); text-transform: uppercase;
}
.station__script {
  margin: 2px 0 0; font-family: var(--font-serif, var(--font-sans));
  font-size: var(--size-body-sm, 14px); color: var(--archive-200); line-height: 1.4;
}
.station__tag {
  margin: var(--s2) 0 0; font-size: var(--size-body-sm, 14px);
  color: var(--text-muted); line-height: 1.55;
}
.station__meta {
  list-style: none; margin: var(--s3) 0 0; padding: 0;
  display: flex; flex-wrap: wrap; align-items: center;
  gap: 0 10px;
  font-family: var(--font-mono); font-size: 10px; letter-spacing: .1em;
  color: var(--archive-200);
}
.station__meta li { display: inline-flex; align-items: center; }
.station__meta li + li::before {
  content: '·'; margin-right: 10px; opacity: .45; color: var(--text-muted);
}
.station__days {
  margin: 6px 0 0; font-family: var(--font-mono); font-size: 10px;
  letter-spacing: .08em; color: var(--text-muted);
}
/* 現場規則（目前只有翰品）——要看得見，但不是警告 */
.station__note {
  margin: var(--s2) 0 0; padding: 5px 9px;
  display: inline-block; align-self: flex-start;
  font-family: var(--font-mono); font-size: 10px; letter-spacing: .08em;
  color: var(--brass-500); border: 1px solid var(--brass-500);
  border-radius: var(--radius-sm, 2px); line-height: 1.4;
}
/* 內容提醒（2026-08-24 改低調）。原本是紅字加驚嘆號，讀起來像錯誤訊息，
   在選店的當下會直接勸退。改成和其他中繼資訊同一個灰階，只用一顆小圓點標記——
   看得到、但不製造緊張。文案本身也已改成強度標示而非情節描述。 */
.station__warn {
  margin: 6px 0 0; padding-left: 14px; position: relative;
  font-size: 11px; line-height: 1.5; color: var(--text-muted);
}
.station__warn::before {
  content: ''; position: absolute; left: 2px; top: .55em;
  width: 5px; height: 5px; border-radius: 50%;
  background: currentColor; opacity: .6;
}
.station__surface {
  position: absolute; inset: 0; z-index: 4; border: 0; background: transparent;
  cursor: pointer; padding: 0;
}
.station:hover { border-color: var(--border-accent); transform: translateY(-2px); }
.station__alert {
  position: absolute; left: 14px; top: 14px; z-index: 5;
  display: inline-flex; align-items: center; gap: 8px;
}
.station__alert i { width: 7px; height: 7px; border-radius: 50%; background: var(--alert-700, #78352F); }
.station__alert span {
  font-family: var(--font-mono); font-size: 9px; letter-spacing: .2em; color: var(--text-muted);
}

/* ══════════════════════════════════════════════ 站點檔案抽屜（對話框）══ */
.km-dlg { position: fixed; inset: 0; z-index: 200; }
.km-dlg[hidden] { display: none; }
.km-dlg__scrim {
  position: absolute; inset: 0; background: rgba(5, 9, 10, .80);
  animation: kmFadeIn .25s var(--ease) both;
}
.km-dlg__panel {
  position: absolute; right: 0; top: 0; bottom: 0;
  width: min(560px, 100%); overflow: auto; overscroll-behavior: contain;
  background: var(--surface-card); border-left: 1px solid var(--border-default);
  padding: var(--s6) var(--s6) var(--s8);
  animation: kmSlideIn .42s var(--ease) both;
}
.km-dlg__panel:focus-visible { outline: 2px solid var(--brass-500); outline-offset: -4px; }
@keyframes kmFadeIn  { from { opacity: 0 } to { opacity: 1 } }
@keyframes kmSlideIn { from { opacity: 0; transform: translateX(24px) } to { opacity: 1; transform: none } }
.km-dlg__close {
  position: absolute; right: var(--s4); top: var(--s4); z-index: 2;
  width: 44px; height: 44px; display: grid; place-items: center;
  background: transparent; border: 1px solid var(--border-default); border-radius: 2px;
  color: var(--text-body); font-size: 18px; cursor: pointer;
  transition: border-color .3s var(--ease), color .3s var(--ease);
}
.km-dlg__close:hover { border-color: var(--border-accent); color: var(--brass-500); }
.km-dlg__fig {
  position: relative; aspect-ratio: 3 / 4; margin: 0 0 var(--s5);
  border: 1px solid var(--hairline-faint, var(--border-default)); overflow: hidden;
  background: var(--abyss-950);
}
.km-dlg__img { position: absolute; inset: 0; background-size: cover; background-position: 50% 45%; }
.km-dlg__grain {                    /* complex 訊號才疊雜訊紙 */
  position: absolute; inset: 0; pointer-events: none;
  background: url('../img/textures/類比雜訊港紙_方形.png') center/cover;
  opacity: .09; mix-blend-mode: screen;
}
.km-dlg__ch { display: flex; align-items: center; gap: var(--s3); margin-bottom: var(--s3); }
.km-dlg__name {
  font-family: var(--font-display); font-weight: 800;
  font-size: clamp(26px, 3vw, 38px); letter-spacing: .08em; line-height: 1.25; margin: 0 0 var(--s4);
}
.km-dlg__tag { font-size: 17px; color: var(--text-muted); line-height: 1.8; margin: 0 0 var(--s5); text-wrap: pretty; }
.km-dlg__rows { display: grid; gap: var(--s4); margin-bottom: var(--s6); }
.km-dlg__row { display: grid; grid-template-columns: 6em 1fr; gap: var(--s3); align-items: baseline; }
.km-dlg__k {
  font-family: var(--font-mono); font-size: 10px; letter-spacing: .18em;
  color: var(--text-muted); text-transform: uppercase;
}
.km-dlg__v { font-size: 13px; color: var(--archive-200); }
.km-dlg__v--pending { font-family: var(--font-mono); font-size: 11px; letter-spacing: .12em; color: var(--brass-500); }
.km-dlg__nav { display: flex; align-items: center; gap: var(--s3); flex-wrap: wrap; }
.km-dlg__hint {
  font-family: var(--font-mono); font-size: 10px; letter-spacing: .12em;
  color: var(--text-muted); opacity: .7; margin-top: var(--s4);
}
@media (max-width: 680px) {
  .km-dlg__panel { width: 100%; border-left: 0; padding: var(--s5) var(--s4) var(--s7); }
  .km-dlg__row { grid-template-columns: 1fr; gap: 2px; }
}

/* ══════════════════════════════════════════════ 分層舞台（共用）══ */
/* v2 的拆封／遞交本來是影片。影片抓不下來，但 v2 自己就備了純圖退路
   （archLegacy / commLegacy）：把每個階段的靜態圖疊起來交叉淡入。
   數值全部照 v2：不透明度 .6s、位移 .9s；還沒輪到的層 scale(1.018)，
   已經過去的層 scale(1.008)——前進的收進來，退場的只輕輕推開。 */
.km-stage {
  position: relative; aspect-ratio: 16 / 9; overflow: hidden;
  border: 1px solid var(--border-default); background: var(--abyss-950);
  isolation: isolate;
}
.km-stage__layer {
  position: absolute; inset: 0; background-size: cover; background-position: center;
  opacity: 0; transform: scale(1.018);
  transition: opacity .6s var(--ease), transform .9s var(--ease);
  will-change: opacity, transform;
}
.km-stage__layer[data-on='1']   { opacity: 1; transform: scale(1); }
.km-stage__layer[data-on='past'] { opacity: 0; transform: scale(1.008); }
.km-stage__grain {
  position: absolute; inset: 0; z-index: 3; pointer-events: none;
  background: url('../img/textures/類比雜訊港紙_方形.png') center/cover;
  opacity: .07; mix-blend-mode: screen;
}
.km-stage__scrim {
  position: absolute; inset: 0; z-index: 2; pointer-events: none;
  background: linear-gradient(105deg, rgba(5,9,10,.72) 0%, rgba(5,9,10,.34) 48%, rgba(5,9,10,.06) 100%);
}
/* 「靜止時也要有呼吸」——不然每個階段看起來都像截圖。
   ⚠️ 這裡有個容易踩的坑：transition 與 animation 不能搶同一個元素的
      transform，誰把兩個寫在一起，呼吸會在每次階段切換時把位移清掉。
      所以交叉溶解（transition）留在外層 .km-stage__layer，
      呼吸推移（animation）掛在內層 <i>。 */
.km-stage__layer > i {
  position: absolute; inset: 0; display: block;
  background-size: cover; background-position: center;
  transform-origin: center;
}
.km-stage__layer[data-on='1'] > i {
  animation: kmBreathe 22s var(--ease) infinite alternate;
}
@keyframes kmBreathe {
  from { transform: scale(1) translate3d(0, 0, 0); }
  to   { transform: scale(1.035) translate3d(-.8%, -.6%, 0); }
}

/* 干擾閃爍：切換的那一瞬間亮一下。人眼在這 130ms 內無法查驗連續性，
   缺掉的中間幀就是被這一下蓋掉的。
   ⚠️ 光敏安全：峰值不超過 .30、單次不短於 100ms、一秒內不超過 3 次。 */
/* 干擾閃爍層與 kmInterfere 已於 2026-08-23 依指示整組移除。 */

/* 只在轉場當下提升合成層，1 秒後撤掉——四張 1600w 全程提層會吃爆中階手機 */
.km-stage[data-busy='1'] .km-stage__layer { will-change: opacity, transform; }

@media (prefers-reduced-motion: reduce) {
  .km-stage__layer { transition: none !important; }
  .km-stage__layer > i { animation: none !important; }
}

/* ── 檔案庫：紙卡 ── */
.km-paper {
  position: absolute; left: clamp(16px, 4%, 48px); bottom: clamp(16px, 6%, 44px);
  z-index: 4; width: min(420px, calc(100% - 32px));
  background: var(--archive-200); color: #2A241C;
  padding: var(--s5) var(--s5) var(--s4);
  clip-path: polygon(0 0, calc(100% - 14px) 0, 100% 14px, 100% 100%, 0 100%);
  animation: kmInkIn .4s var(--ease) both;
  box-shadow: 0 18px 48px rgba(0, 0, 0, .5);
}
.km-paper[hidden] { display: none; }
.km-paper > * { animation: kmInkIn .5s var(--ease) both; }
.km-paper > *:nth-child(1) { animation-delay:  60ms; }
.km-paper > *:nth-child(2) { animation-delay: 180ms; }
.km-paper > *:nth-child(3) { animation-delay: 320ms; }
.km-paper > *:nth-child(4) { animation-delay: 460ms; }
.km-paper__kicker {
  font-family: var(--font-mono); font-size: 10px; letter-spacing: .2em;
  color: #6B5D46; text-transform: uppercase; display: block; margin-bottom: var(--s2);
}
.km-paper__name {
  font-family: var(--font-display); font-weight: 800; font-size: 22px;
  letter-spacing: .04em; margin: 0 0 var(--s3); color: #2A241C; line-height: 1.35;
}
.km-paper__body { font-size: 13px; line-height: 1.85; margin: 0 0 var(--s4); color: #4A4032; max-width: 28em; }
.km-paper__more {
  font-family: var(--font-body); font-size: 12px; font-weight: 600; letter-spacing: .18em;
  background: transparent; border: 1px solid rgba(42, 36, 28, .4); color: #2A241C;
  padding: 8px 18px; cursor: pointer; transition: background .3s var(--ease);
}
.km-paper__more:hover { background: rgba(42, 36, 28, .1); }
@media (max-width: 680px) {
  .km-stage { aspect-ratio: 4 / 5; }
  .km-paper { left: 12px; right: 12px; width: auto; bottom: 12px; padding: var(--s4); }
  .km-paper__name { font-size: 18px; }
}

/* ── 委託函：遞函擠壓 ── */
.km-stage[data-handing='1'] { transform: scale(1.03) translateY(1.4%); }
.km-stage { transition: transform .6s var(--ease); }
.km-hot {                         /* 舞台上的拆閱熱區 */
  position: absolute; z-index: 5; transform: translate(-50%, -50%);
  left: var(--hs-l); top: var(--hs-t);
  background: transparent; border: 0; padding: 10px; cursor: pointer;
  text-align: center; animation: kmHotspotIn .5s var(--ease) both;
}
.km-hot__dot {
  display: block; width: 10px; height: 10px; border-radius: 50%; margin: 0 auto 8px;
  background: var(--brass-500); animation: kmPulse 2.6s var(--ease) infinite;
}
.km-hot__label {
  font-family: var(--font-mono); font-size: 10px; letter-spacing: .18em;
  color: var(--archive-200); text-shadow: 0 2px 12px rgba(5, 9, 10, .9);
  white-space: nowrap;
}
.km-hot:hover .km-hot__label { color: var(--brass-500); }
@media (max-width: 680px) { .km-hot { left: var(--hs-lm, var(--hs-l)); top: var(--hs-tm, var(--hs-t)); } }

.km-seal {                        /* 用印：調諧章 ＋ 已受理 */
  display: inline-flex; align-items: center; gap: 12px;
  animation: kmStamp .55s var(--ease) both;
}
.km-seal img { height: 40px; width: auto; }
.km-seal span {
  font-family: var(--font-mono); font-size: 11px; letter-spacing: .16em; color: var(--brass-500);
}

/* ── 世界觀補充抽屜 ── */
.km-more { position: fixed; inset: 0; z-index: 210; }
.km-more[hidden] { display: none; }
.km-more__scrim { position: absolute; inset: 0; background: rgba(5, 9, 10, .78); animation: kmFadeIn .25s var(--ease) both; }
.km-more__panel {
  position: absolute; right: 0; top: 0; bottom: 0; width: min(520px, 100%);
  overflow: auto; overscroll-behavior: contain;
  background: var(--surface-card); border-left: 1px solid var(--border-default);
  padding: var(--s6) var(--s6) var(--s8);
  animation: kmSlideIn .42s var(--ease) both;
}
.km-more__panel:focus-visible { outline: 2px solid var(--brass-500); outline-offset: -4px; }
.km-more__body > * { animation: kmInkIn .45s var(--ease) both; }
.km-more__body > *:nth-child(1) { animation-delay: 120ms; }
.km-more__body > *:nth-child(2) { animation-delay: 220ms; }
.km-more__body > *:nth-child(3) { animation-delay: 320ms; }
.km-more__body > *:nth-child(4) { animation-delay: 420ms; }
@media (max-width: 680px) { .km-more__panel { width: 100%; border-left: 0; padding: var(--s5) var(--s4) var(--s7); } }

.km-letter__accept { margin: var(--s4) 0 var(--s3); }
.km-letter__accept .km-seal { display: inline-flex; }

/* 雨層已於 2026-08-23 依指示移除（使用者不要）。
   如果之後要回來：git 或本檔 v0.11 版本裡有完整的兩層漸層實作。 */

/* Hero 大氣層已隨疊加材質一併移除（2026-08-23）。 */
/* 無線電干擾的閃爍也一併停掉 */

/* ══════════════════════════════ 站卡呼吸（取代 idle 循環影片）══ */
/* v2 每張卡有一支 30 幀循環影片。影片抓不下來，改用極慢的呼吸推移。
   用負的 animation-delay 讓 11 張卡一載入就已經在不同相位——
   19s 與 1.37s 互質，肉眼看不出週期重合。 */
.station .media img {
  animation: kmBreathe 19s var(--ease) infinite alternate;
  animation-delay: calc(var(--i, 0) * -1.37s);
}
@media (prefers-reduced-motion: reduce) { .station .media img { animation: none; } }

/* 鎖定上浮要贏過進場動畫的殘留位移（.reveal 也在動 transform） */

/* ══════════════════════════════════ 分頁在背景時停掉所有常駐動畫 ══ */
/* 夜版頁有 10 個 infinite 動畫。分頁切走還在跑只是白白耗電。 */
body.is-hidden *, body.is-hidden *::before, body.is-hidden *::after {
  animation-play-state: paused !important;
}

/* ══════════════════════════════════════════════════ 名錄訊號篩選 ══ */
/* 篩選抽屜：手機收起（兩排鈕會把店家卡擠掉），桌機預設展開。 */
.km-filters { margin: 0 0 var(--s5); }
.km-filter__toggle {
  font-family: var(--font-mono); font-size: 10px; letter-spacing: .16em;
  text-transform: uppercase;
  background: transparent; border: 1px solid var(--border-default);
  color: var(--archive-200); padding: 8px 16px; cursor: pointer;
  display: inline-flex; align-items: center; gap: 8px;
  transition: border-color .3s var(--ease), color .3s var(--ease);
}
.km-filter__toggle::after {
  content: '+'; font-size: 13px; line-height: 1; opacity: .7;
}
.km-filter__toggle[aria-expanded='true'] { border-color: var(--brass-500); color: var(--brass-500); }
.km-filter__toggle[aria-expanded='true']::after { content: '\2212'; }
.km-filter__panel { display: none; margin-top: var(--s3); }
.km-filter__toggle[aria-expanded='true'] + .km-filter__panel { display: block; }
.km-filter__group {
  display: flex; gap: var(--s2); flex-wrap: wrap; align-items: center;
  margin-bottom: var(--s2);
}
.km-filter__legend {
  font-family: var(--font-mono); font-size: 9px; letter-spacing: .2em;
  text-transform: uppercase; color: var(--text-muted);
  min-width: 4em;
}
@media (min-width: 900px) {
  .km-filter__toggle { display: none; }
  .km-filter__panel { display: block; margin-top: 0; }
}
.km-filter {
  font-family: var(--font-mono); font-size: 10px; letter-spacing: .16em;
  text-transform: uppercase;
  background: transparent; border: 1px solid var(--border-default);
  color: var(--text-muted); padding: 8px 16px; cursor: pointer;
  transition: border-color .3s var(--ease), color .3s var(--ease);
}
.km-filter:hover { border-color: rgba(210, 195, 162, .5); color: var(--archive-200); }
.km-filter[aria-pressed='true'] { border-color: var(--brass-500); color: var(--brass-500); }
.station[hidden] { display: none; }
.km-filter__empty {
  grid-column: 1 / -1; margin: var(--s5) 0; padding: var(--s5);
  border: 1px dashed var(--border-default); text-align: center;
  color: var(--text-muted); font-size: var(--size-body-sm, 14px);
  display: flex; flex-direction: column; align-items: center; gap: var(--s3);
}
.km-filter__empty[hidden] { display: none; }

/* ══════════════════════════════════════════════ Hero 排版收束 ══ */
/* 92px 的大標在寬螢幕上會橫貫整個畫面、壓到主圖的重點。
   限制在 15 個中文字的寬度內，讓它斷在該斷的地方。 */
.km-hero__title { max-width: 15em; }
@media (max-width: 900px) { .km-hero__title { max-width: 100%; } }

/* ══════════════════════════════ Hero：檔案桌版的分層排法 ══ */
/* 主標與熱區不能疊在同一塊畫面 —— 那是 2026-08-23 排版崩掉的原因。
   這裡把它們分成上下兩層：文字靠上、桌面留白給熱區。 */
.km-hero--desk { align-items: flex-start; }
.km-hero--desk .km-hero__inner {
  /* 貼左上角：母版的 .km-hero__inner 是 margin-inline:auto 置中的，
     在寬螢幕上會把字推到畫面中間。這裡取消置中，讓它從左側 gutter 起算。 */
  max-width: none;
  margin-inline: 0;
  padding-top: clamp(28px, 5vh, 56px);
  padding-bottom: 0;
}
.km-hero--desk .km-lockup { margin-bottom: 18px; }
.km-hero--desk .km-lockup img { height: 38px; }
/* 「簡單」的主標：從 92px 收到 48px 上限，讓它是標題而不是招牌。 */
/* 眉題與副標（2026-08-24 補回）。上次首屏爆版是因為主標 clamp 到 92px；
   這兩行最大 18px，不會重演。 */
.km-hero--desk .km-hero__eyebrow {
  margin: 0 0 var(--s3);
  font-family: var(--font-mono); font-size: clamp(10px, 1.1vw, 12px);
  letter-spacing: .2em; text-transform: uppercase;
  color: var(--brass-500);
}
.km-hero--desk .km-hero__sub {
  margin: var(--s3) 0 0; max-width: 22em;
  font-size: clamp(15px, 1.5vw, 18px); line-height: 1.6;
  color: var(--archive-200);
}
.km-hero--desk .km-hero__title {
  font-size: clamp(24px, 3vw, 44px);
  line-height: 1.32;
  max-width: 13em;
  margin-bottom: 0;
}
.km-hero--desk .km-hero__scrim {
  /* 暗幕改成上濃下淡：壓住上方的字，桌面維持看得見 */
  background: linear-gradient(to bottom,
    rgba(5, 9, 10, .88) 0%, rgba(5, 9, 10, .55) 32%,
    rgba(5, 9, 10, .26) 60%, rgba(5, 9, 10, .5) 100%);
}

/* ── 傳送按鈕（熱區）── */
.km-hotspots { position: absolute; inset: 0; z-index: 5; pointer-events: none; }
.km-hotspot {
  position: absolute; left: var(--hs-l); top: var(--hs-t);
  transform: translate(-50%, -50%);
  background: transparent; border: 0; padding: 0; cursor: pointer;
  pointer-events: auto; text-align: center;
  animation: kmHotspotIn .55s var(--ease) both;
}
@keyframes kmHotspotIn {
  from { opacity: 0; transform: translate(-50%, -50%) translateY(10px) }
  to   { opacity: 1; transform: translate(-50%, -50%) }
}
.km-hotspot__dot {
  display: block; width: 11px; height: 11px; border-radius: 50%; margin: 0 auto 10px;
  background: var(--brass-500);
  box-shadow: 0 0 0 6px rgba(169, 129, 77, .16), 0 0 22px rgba(169, 129, 77, .55);
  animation: kmPulse 2.6s var(--ease) infinite;
}
.km-hotspot__card {
  display: block; padding: 9px 15px;
  background: rgba(5, 9, 10, .82);
  border: 1px solid var(--border-default);
  transition: border-color .3s var(--ease), transform .3s var(--ease);
}
.km-hotspot:hover .km-hotspot__card,
.km-hotspot:focus-visible .km-hotspot__card {
  border-color: var(--brass-500); transform: translateY(-2px);
}
.km-hotspot__label {
  display: block; font-size: 13px; font-weight: 600;
  letter-spacing: .1em; color: var(--archive-200); white-space: nowrap;
}
.km-hotspot__sub {
  display: block; font-family: var(--font-mono); font-size: 10px;
  letter-spacing: .14em; color: var(--text-muted); margin-top: 3px; white-space: nowrap;
}
@media (max-width: 680px) {
  .km-hotspot { left: var(--hs-lm, var(--hs-l)); top: var(--hs-tm, var(--hs-t)); }
  .km-hotspot__card { padding: 7px 12px; }
  .km-hotspot__label { font-size: 12px; }
  .km-hotspot__sub { font-size: 9px; }
}
@media (prefers-reduced-motion: reduce) {
  .km-hotspot, .km-hotspot__dot { animation: none !important; }
}
