/* ============================================
   KV 首屏 — 精準還原做法
   底圖（地圖線稿／光暈圓圈／樹鳥飛輪／指北針／氣象站小圖示／溫度色階尺／
   「2026 ECO FAIR」造型字／底部漸層）已在 Figma 端整批烘焙成一張圖 kv-bg.jpg，
   確保任何裝置尺寸都不會裁切走樣。

   容器用 aspect-ratio 鎖死跟 Figma KV frame（1920×760）完全一致的比例，
   所有疊加在上面的「活文字」（溫度數字、標題、日期、說明、CTA按鈕）
   都用「相對這個鎖死比例容器」的百分比定位，因此不管螢幕多寬多窄，
   文字永遠精準對齊底圖裡的對應位置。
   ============================================ */

.kv {
  position: relative;
  width: 100%;
  aspect-ratio: 1920 / 760;
  max-height: 100vh;
  margin: 0 auto;
  overflow: hidden;
  /* 保險底色：只有在底圖還沒解碼完、或圖檔載入失敗時才會看到。
     ⚠️ 原本是深磚紅 #7a1f0f，進場時會先閃一下暗紅色很醜；
     改成從 kv-bg.jpg 左緣取樣的橘紅（桌機 rgb(234,82,43)、手機 rgb(225,72,38) 幾乎同色），
     這樣即使真的看到它，也跟底圖是同一個色調、察覺不出來。 */
  background: #ea522b;

  /* ---------- 疊加元素的座標系統（2026-09-10 重寫） ----------
     底圖是 1920×760 烘焙好的一張圖，上面疊的文字必須跟它「等比縮放」才不會錯位。
     所以這裡把 .kv 宣告成容器，內部一律使用 cqw 單位：
       1cqw = KV 寬度的 1%；KV 寬 1920 時，1cqw = 19.2 設計px
       → 設計稿的 X px 寫成 (X / 19.2) cqw
     位置、寬高、字級全部同一個基準，等比縮放，不可能變形。

     ⚠️ 千萬不要把其中一項換成固定 px 或跟寬度無關的單位。
     2026-09-10 曾經把 width 改成固定 480px 但 height 留百分比，
     框的長寬比隨視窗一路改變，裡面用百分比定位的 8 個字被橫向拉扁
     （1440px 時比例 2.606 vs 設計 1.955，等於扁了 33%）。 */
  container-type: inline-size;

  /* subtitle／標準字／日期／CTA 按鈕四者共用同一組左緣與寬度，左右兩端才會切齊。
     設計稿畫的是 365/366/366/367px（同一欄位的手繪微差），統一取標準字的 365px；
     寬度取 480px，四者右緣自然也會對齊。 */
  --kv-col-left: 19.0104cqw;   /* 365px  / 19.2 */
  --kv-col-width: 25cqw;       /* 480px  / 19.2 */

  /* ---------- 進場動畫時間軸（2026-09-10 分階段揭露） ----------
     ① 底色層：溫度漸層「一開始就在」，不做淡入
        （曾經讓它從 opacity:0 淡入，結果進站頭 0.7 秒是一片暗紅底，很醜；
          底色本身就是這個畫面的舞台，讓它直接到位，動畫從物件層才開始。）
     ② 物件層：白色線稿、匡線、地圖標籤接著淡入
     ③ 溫度感測點：三角標記與數字（數字同時開始跳動，由 js/kv.js 讀 --kv-t-pins）
     ④ 標準字：逐字進場
     ⑤ 日期地點　⑥ 兩顆 CTA 按鈕
     全部延遲集中在這裡，要調節奏只改這幾個數字，不用一條條翻下面的 animation。 */
  --kv-t-objects: 0.5s;
  --kv-t-pins: 1s;
  --kv-t-title: 1.3s;
  --kv-t-date: 1.8s;
  --kv-t-cta: 2s;
}

/* ---------- 兩層底圖 ---------- */
/* 物件層疊在底色層上，尺寸與定位完全相同（兩張圖同尺寸、同 frame 匯出）。
   pointer-events: none 讓它不會攔截點擊（下方沒有可點元素，但保險）。 */
.kv-objects {
  position: absolute;
  inset: 0;
  display: block;
  pointer-events: none;
}
.kv-objects img {
  width: 100%;
  height: 100%;
  object-fit: fill;   /* 與底色層同一套：容器比例已鎖定跟圖片一致，fill 不會變形 */
  display: block;
}

/* 只有物件層淡入，底色層一開始就是完整不透明的（見上面時間軸 ① 的說明），
   這樣才有「先看到溫度漸層、再浮現地圖物件」的層次，而且不會先閃一片底色。
   刻意用 opacity:0 起始而不是靠 JS 加 class 才藏起來，避免圖片載完瞬間先閃一下再消失。
   沒有 JavaScript 時由 index.html <head> 的 <noscript> 樣式還原成完整顯示。 */
.kv-objects { opacity: 0; }
.kv.play .kv-objects { animation: kvFadeIn 0.7s ease var(--kv-t-objects) forwards; }
@keyframes kvFadeIn { to { opacity: 1; } }

/* 溫度感測點：第 ③ 階段一起浮現（數字的跳動由 js/kv.js 在同一時間點觸發） */
.kv-pin { opacity: 0; }
.kv.play .kv-pin { animation: kvFadeIn 0.5s ease var(--kv-t-pins) forwards; }

.kv-bg {
  position: absolute;
  inset: 0;
  display: block;
}
.kv-bg img {
  width: 100%;
  height: 100%;
  object-fit: fill; /* 容器比例已鎖定跟圖片一致，fill 不會變形 */
  display: block;
}

/* ---------- 垂直節奏（2026-09-10 依需求重算） ----------
   兩個要求：① 日期文字底 → 按鈕頂 = 35px　② 整組文字＋按鈕在 KV 內垂直置中。

   注意「35px」量的是「看得到的文字底」而不是圖檔的框底——
   日期 SVG（432×73）內部上下各有留白，文字實際只佔框內的 y 466.0–512.8，
   框底在 528.8，兩者差 16px，量錯地方按鈕就會低 16px。

   由這兩個條件解出的一組座標（維持設計稿裡各元素之間的相對距離不變）：
     subtitle 115.93 / 標準字 194.18 / 日期 480.92 / 按鈕 581.90
   驗算：日期文字底 546.9 → 按鈕頂 581.9 = 35.0px；
        視覺範圍 126.1–633.9，上下留白各 126.1，置中。

   2026-09-10 後續調整：按鈕再往下移 10px（581.90 → 591.90），
   所以日期文字底到按鈕頂變成 45px，整組視覺範圍下緣也多 10px
   （上留白 126.1 / 下留白 116.1），刻意不再嚴格置中，以視覺手感為準。
   （KV 中心 380 與右側地圖插圖中心 379.9 幾乎重合，所以對 KV 置中＝對主圖置中。） */

/* ---------- 標準字（獨立圖層，保留逐字淡入動畫） ---------- */
.kv-title-lockup {
  position: absolute;
  left: var(--kv-col-left); top: 10.1135cqw; width: var(--kv-col-width); height: 12.7906cqw; /* y 194.18 / h 245.58 */
  filter: drop-shadow(0 4px 10px rgba(174, 42, 19, 0.55));
}
.kv-title-lockup .ch {
  position: absolute;
  display: block;
  opacity: 0;
  transform: translateY(18px);
}
.kv-title-lockup .ch img { width: 100%; height: 100%; display: block; }
.kv.play .kv-title-lockup .ch {
  animation: kvCharIn 0.6s cubic-bezier(0.16, 0.9, 0.3, 1) var(--kv-t-title) forwards;
}
@keyframes kvCharIn { to { opacity: 1; transform: translateY(0); } }

/* ---------- subtitle：「2026 ECO FAIR」造型字（原廠 SVG）+ 「生態博覽會」活文字，一起淡入 ---------- */
.kv-subtitle {
  position: absolute;
  left: var(--kv-col-left); top: 6.038cqw; width: var(--kv-col-width); height: 2.5521cqw;    /* y 115.93 / h 49 */
  opacity: 0;
  transform: translateY(14px);
}
.kv-subtitle .wordmark {
  position: absolute;
  left: 0; top: 0; width: 100%; height: 100%;
  display: block;
}
.kv.play .kv-subtitle {
  animation: kvCharIn 0.6s cubic-bezier(0.16, 0.9, 0.3, 1) var(--kv-t-title) forwards;
}

/* ---------- 溫度感測點與小標籤的尺寸（2026-09-10 改用容器單位） ----------
   這些小字原本用 clamp(最小值, vw, 最大值)，問題是 clamp 的「最小值」會在
   視窗約 1200～1286px 時就觸底、停止縮小，但它們的「位置」是百分比、
   會繼續跟著 KV 一起縮 —— 於是字相對地圖愈來愈大，擠成一團互相遮擋
   （901px 實測字級大了 1.48 倍、重疊配對從 3 組增加到 7 組）。

   改成 cqw（KV 寬度的 1%，.kv 已宣告 container-type: inline-size）之後，
   字級與位置同一個縮放基準，永遠維持設計稿的相對大小，不會再互相遮擋。
   數值 = 1920px 下的原尺寸 ÷ 19.2。 */
.kv-pin {
  position: absolute;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.1042cqw;             /* 2px */
  color: #fff;
  text-shadow: 0 1px 6px rgba(0,0,0,0.35);
}
.kv-pin img { width: 0.4688cqw; height: auto; display: block; }   /* 9px */
.kv-pin .val {
  font-variant-numeric: tabular-nums;
  font-family: var(--font-body);
  font-weight: 900;
  font-size: 0.625cqw;        /* 12px */
  letter-spacing: 0.04em;
}

/* ---------- 小標籤：指北 N／氣象站 Weather・Station／樹鳥飛輪標籤 ---------- */
.kv-caption {
  position: absolute;
  font-family: var(--font-display);
  font-weight: 700;
  color: #fff;
  font-size: 0.6771cqw;       /* 13px */
  white-space: nowrap;
}
.kv-caption.pill {
  background: #fff;
  color: #b8c52a;
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 0.5208cqw;       /* 10px */
  letter-spacing: 0.06em;
  text-transform: uppercase;
  padding: 0.1042cqw 0.3125cqw;   /* 2px 6px */
}

/* ---------- 日期地點（原廠 SVG 圖檔，含「11/07 Sat. @大安森林公園生態博覽會」）／說明／CTA：跟標準字一起淡入 ---------- */
.kv-date-block {
  position: absolute;
  left: var(--kv-col-left); top: 25.0479cqw; width: var(--kv-col-width); height: 4.2708cqw;  /* y 480.92 / h 82 */
  display: block;
  object-fit: contain;
  object-position: left center;
  opacity: 0;
  transform: translateY(10px);
}
.kv.play .kv-date-block { animation: kvCharIn 0.7s ease var(--kv-t-date) forwards; }

.kv-desc {
  position: absolute;
  left: 21.719%; top: 64.737%; width: 25%;
  font-family: var(--font-display);
  font-weight: 500;
  color: #fff;
  font-size: clamp(13px, 1.25vw, 18px);
  line-height: 1.6;
  opacity: 0;
  transform: translateY(10px);
}
.kv.play .kv-desc { animation: kvCharIn 0.7s ease var(--kv-t-date) forwards; }

/* 兩顆 CTA 按鈕：設計稿是各 232px + 間距 16px = 480px，剛好等於上方標題的寬度。
   這裡用 flex: 1 讓兩顆平分容器寬度（而不是各自寫死 232px），
   容器寬度一變（例如視窗縮放）兩顆會等比例跟著縮，永遠維持等寬且左右切齊標題。
   間距用 3.333%（= 480px 的 16px）而不是固定 px，才會跟按鈕一起等比縮放。 */
.kv-ctas {
  position: absolute;
  left: var(--kv-col-left); top: 30.8281cqw; width: var(--kv-col-width);                     /* y 591.90（581.90 + 依需求下移 10px） */
  display: flex;
  gap: 0.8333cqw;              /* 16px / 19.2 */
  opacity: 0;
  transform: translateY(10px);
}
.kv.play .kv-ctas { animation: kvCharIn 0.7s ease var(--kv-t-cta) forwards; }
.kv-ctas .btn-cta {
  flex: 1;
  min-width: 0;
  padding: 0;                 /* 寬度改由 flex 決定，不再靠左右內距撐開 */
  font-size: 0.9375cqw;       /* 18px / 19.2 */
  height: 2.7083cqw;          /* 52px / 19.2 */
  white-space: nowrap;
}

/* KV 按鈕跟底部懸浮導覽列的顯示邏輯要對齊（導覽列在 ≥901px 才隱藏，見 nav.css），
   不然 721px～900px 這段寬度會同時看到兩組按鈕，彼此重疊。
   這條刻意獨立成自己的 @media，不跟下面「手機版底圖」那個 720px 的區塊合併，
   因為底圖切換是在 720px，兩個斷點本來就不一樣。 */
@media (max-width: 900px) {
  .kv-ctas {
    display: none; /* 這個寬度以下已有底部懸浮導覽列可以切換頁面，KV 內的兩個按鈕不再重複顯示 */
  }
}

/* ---------- 手機：底圖換成手機版構圖，文字改回文件流排版 ----------
   座標依最新設計稿手機版 KV frame（390×758，已移除底部預留空白）重新換算。 */
@media (max-width: 720px) {
  /* 2026-09-10：引言移除後，手機版 KV 依新設計稿從 390×758 縮成 390×703，
     底部少了 55px 的空白。 */
  .kv {
    aspect-ratio: 390 / 703;
    max-height: none;
  }

  /* 2026-09-10：手機底圖已重新匯出成原生 390×703（780×1406 = 2x），
     所以先前為了套用舊 758 高底圖而加的兩個權宜措施都移除了：
       ・object-fit: cover + 上緣對齊（用來避免垂直壓縮 7.8%）→ 回到與桌機相同的 fill
       ・.kv::after 用 CSS 重畫底部漸層條 → 新底色層已內含（實測 y685/高18，與設計稿一致）
     現在手機與桌機用同一套 fill 邏輯，沒有特例。 */

  .kv-caption,
  .kv-pin {
    display: none; /* 手機版底圖解析度較低，小型輔助標籤先隱藏，避免擠成一團看不清 */
  }

  /* 元素座標依新設計稿（390×703）換算。subtitle 與標準字的實際像素位置沒變
     （62 / 97.3），只是分母從 758 換成 703；日期區塊則依新稿放大
     （276.5×47 → 310.8×53），所以寬高百分比一起更新。

     日期的 top 刻意比設計稿的 588 多 10.2px（→ 598.2 = 85.0925%）：
     設計稿裡「時間」是純文字圖層，框底 641 就是文字下緣，到漸層條剛好 44px；
     但網站用的是整張 kv-time-place.svg（432×73），檔案內部下緣還有約 10px 留白，
     照 588 擺會讓「看得到的文字下緣」只到 630.8，離漸層條變成 54.2px。
     下移這 10.2px 之後文字下緣落在 641，與設計稿的 44px 一致。
     ⚠️ 若日後重新匯出去掉留白的日期 SVG，要把這裡改回 83.642%。 */
  .kv-subtitle { left: 21.174%; top: 8.819%; width: 57.620%; height: 3.272%; }
  .kv-title-lockup { left: 20.769%; top: 13.844%; width: 58.405%; height: 16.577%; }
  .kv-date-block { left: 10.090%; top: 85.0925%; width: 79.701%; height: 7.539%; }
  .kv-desc { left: 10.090%; top: 91%; width: 79.701%; font-size: clamp(12px, 3.2vw, 15px); }
}

/* 使用者在系統設定開了「減少動態效果」時，整組分階段動畫直接跳過、全部以最終狀態顯示。
   這份清單必須涵蓋所有預設 opacity:0 的元素，漏掉任何一個都會讓它永遠看不見
   （.kv-bg / .kv-objects / .kv-pin / .kv-date-block 都是這次新加或原本漏掉的）。 */
@media (prefers-reduced-motion: reduce) {
  .kv-bg,
  .kv-objects,
  .kv-pin,
  .kv-title-lockup .ch,
  .kv-subtitle,
  .kv-date-block,
  .kv-desc,
  .kv-ctas { animation: none !important; opacity: 1; transform: none; }
}
