/*
  Tavi 官網共用樣式
  ------------------------------------------------------------
  視覺風格直接沿用桌面 App 的 HUD 科技感(見 tavi-desktop/src/styles.css):
  深色海軍藍背景、青色發光邊框與文字、Segoe UI / Microsoft JhengHei 字體。
  這裡把同一組配色變數原封不動搬過來,只是把介面從「小型固定視窗」放大成
  「可以捲動的行銷網站版面」,盡量讓玩家在網站上跟在 App 裡看到的感覺一致。

  2026-09-21 更新(UI/UX 設計系統升級,以原本的深色青色 HUD 風格為基礎,
  往「有質感、有動態、參考 GSAP showcase / Behance 高分 web UI 作品」的
  方向精修):
    1. 色票系統化:原本的 --hud-* 變數全部保留(其餘 5 頁 features/
       download/subscribe/workshop/discussion 都還在用這些名稱,不能改
       名字,不然那幾頁會直接跑版),另外新增
       --accent-amber(「完整版/premium」語意色,取代原本共用 --hud-danger
       紅色的 .badge.locked,紅色改成專門留給警告/危險語意)、
       --hud-panel-elevated(卡片 hover 時的抬升層次)。
    2. 字體系統化:新增 --font-display(標題/按鈕/品牌字用)、--font-body
       (內文用)兩個變數。這兩個 Google Fonts 字體檔本身要靠各頁 <head>
       裡新增的 <link> 標籤載入(見 index.html 等檔案),沒載入到的頁面
       會自動退回原本的系統字體,不會壞版面,只是還沒套上新字體。
    3. 新增動態效果需要的樣式(捲動光點游標、主視覺背景光暈、導覽列捲動
       狀態、卡片 hover 抬升)——這些 class 平常不存在對應元素時完全不會
       產生任何視覺變化,所以就算其餘 5 頁還沒套用新版標記(markup),
       這裡新增的規則也不會影響那些頁面現有的樣子。
    4. 完整套用「動態進場效果」的 JS(assets/site-motion.js,用 GSAP +
       ScrollTrigger)目前只有 index.html 有載入,其餘 5 頁下一輪比照
       套用。

  2026-09-22 更新(使用者提供實際的 Behance/GSAP showcase 截圖當參考,
  依截圖內容微調上面的設計系統):
    1. 品牌色票正式定案為 4 色(主色 + 3 個相近色,詳見下面 :root 裡
       --hud-ice 那段的完整說明),新增 --hud-ice 這個變數;原本
       2026-09-21 加的 --accent-violet(次要強調色)拿掉,改用品牌色票
       裡本來就有的 Titanium 色(--hud-muted)做主視覺背景光暈的第二層
       顏色,確保網站上實際出現的顏色不會超出定案的 4 色品牌色票之外。
    2. 字體改成 Onest(標題)+ Manrope(內文)——這兩個字體直接對應
       使用者截圖裡其中兩個參考案例實際使用的字體,而且都是 Google
       Fonts 上真正免費、開源的版本(截圖裡另外出現的 Gilroy、
       Lyon Display、Suisse Int'l 是商業付費字體,不能沒有授權就用在
       正式網站上,所以沒有採用,詳見 --font-display 那段的說明)。
    3. 主視覺大改:使用者要求「Tavi 放正中間,旁邊隨機出現對話框,像是
       在跟看網站的人說話」——hero-orb 從裝飾小圖示放大成主視覺真正的
       視覺主角,新增 .hero-figure(定位容器)跟 .tavi-say(對話泡泡)
       這組樣式,實際的文字內容輪替、淡入淡出時機由
       assets/site-motion.js 控制。

  2026-09-22 更新(第二輪,使用者針對實際渲染出來的首頁截圖標註具體
  修改意見):
    1. 導覽列(.site-header)預設狀態改成透明,不再是一整條實色色塊,
       捲動離開頂端後(.is-scrolled)才變不透明、加上模糊背景維持可讀性。
    2. 導覽列內容(.nav-row)改用比內文更寬的上限(1680px)取代原本
       --max-width(1240px)的限制,讓品牌 icon/名稱貼近左邊緣、導覽連結
       貼近右邊緣;底線(border-bottom)也從整條 .site-header 移到
       .nav-row 上,寬度只跟著「icon 到最後一個導覽連結」的實際內容走,
       不是滿版寬度。
    3. .tavi-say 對話泡泡加寬(14rem → 19rem,手機版 17rem → 18rem),
       並明確設定 line-break: strict 等排版屬性,換行時盡量從標點符號等
       自然斷句處換,不會從詞的中間硬切。
    4. 新增「區塊堆疊捲動」效果(.stack-section,套用在 <main> 底下每個
       大區塊,包含 .hero):捲動時,目前區塊會先貼著導覽列下緣定住,
       接著下一個區塊從下方滑上來蓋過它,視覺上像前一個區塊被蓋住、往上
       滑走——純 CSS(position: sticky + 相同 z-index 讓瀏覽器照 DOM
       順序疊放)做法,不依賴 JavaScript,細節說明見該規則上方註解。
       6 個頁面的 <main> 底下所有 <section> 都已套用這個 class。

  2026-09-22 更新(第三輪,使用者指出第二輪的「區塊互相覆蓋」不是原本
  想要的效果,重新說明後修正):
    1. class 從 .stack-section 改名成 .screen-panel(HTML 標記沿用,只是
       改了 class 名稱跟對應的 CSS 定義),拿掉 position: sticky / 不透明
       背景這些造成「捲動時下一個區塊蓋住前一個區塊、前一個區塊被釘住」
       的規則——使用者要的其實是「網站背景維持單一、固定,捲動時前一個
       區塊可以正常捲出螢幕範圍,不會被釘住或蓋住」的一般捲動行為,只是
       希望每個區塊大概抓「螢幕高度三分之二」(min-height: 66vh)這個
       尺寸感、內容在區塊內垂直置中,細節說明見該規則上方註解。
    2. 背景維持 body 原本就有的固定漸層(background-attachment: fixed,
       捲動時背景本身不會跟著捲動),沒有另外新增動態背景效果——這是
       目前判斷跟整體 HUD 科技感風格最一致的做法,如果之後想要更明顯的
       動態背景(例如緩慢飄動的粒子或星點),可以再另外討論加上去。

  2026-09-22 更新(第四輪,使用者附圖進一步標註兩件事):
    1. min-height 從 66vh 再調整成 100vh——使用者反映「捲軸拉到最上面
       時,畫面裡不應該看到下一個區塊探頭出現」,66vh 會讓下一個區塊
       在初始畫面就先露出一小截,改成滿版一整個螢幕高度才能確保這件事。
       附帶影響:內容本身比較短的頁面(例如工作坊、討論版只有 hero +
       一個提示框),捲過 hero 內容之後、進入下一個區塊之前,會經過一段
       看起來空空的深色捲動距離——這是「每個區塊固定一整個螢幕高度」
       這個設計的自然取捨,不是排版跑掉,但這裡誠實記錄下來,如果之後
       覺得這段空白捲動感覺不舒服,可以再討論要不要讓內容較少的區塊
       改成不強制滿版高度。
    2. .tavi-say 對話泡泡的出現位置,從原本只有「同一個高度,左右輪流」
       兩種,改成「上/中/下 × 左/右」共 6 個位置隨機出現(見
       assets/site-motion.js 的 BUBBLE_POSITIONS、site.css 新增的
       .pos-mid / .pos-bottom),對應使用者附圖裡示意的多個位置。
*/

:root {
  --hud-bg-deep: #030c18;
  --hud-bg: rgba(3, 12, 24, 0.92);
  --hud-panel: rgba(6, 22, 40, 0.82);
  --hud-panel-solid: #0a2036;
  --hud-line: #4df0ff;
  --hud-line-bright: #7ef3ff;
  --hud-line-dim: rgba(77, 240, 255, 0.35);
  --hud-text: #d7f8ff;
  --hud-muted: #8ec9d8;
  --hud-danger: #c45c6e;
  /* 2026-09-19 調整:使用者反映版面偏窄,從 1080px 加寬到 1240px。
     2026-09-22 第六輪調整:使用者附圖標註內文區塊(卡片、提示框)兩側的
     留白「要一樣、不要那麼窄」——導覽列在同一輪稍早已經改用更寬的
     1680px(見 .nav-row 的說明),但內文的 .container 還停在 1240px,
     兩者並排時內文區塊比導覽列明顯窄一截、兩側留白明顯不一致,所以這裡
     一併加寬到 1600px,跟導覽列的寬度更接近,不會有「上面滿版、下面卡在
     中間一小條」的落差感。卡片格線(.card-grid-2x2 等)本身沒有寫死
     寬度,容器變寬後卡片會等比例變寬,不會跑版或擠壓。 */
  --max-width: 1600px;

  /* 2026-09-21 新增:色票系統擴充 ----------------------------------- */
  /* 卡片 hover、抬升狀態用的「更亮一階」面板色,跟 --hud-panel 同色相、
     只是不透明度跟亮度都高一點,製造出「浮起來」的層次感。 */
  --hud-panel-elevated: rgba(12, 40, 66, 0.92);
  /* 2026-09-22 調整:官方品牌色票正式定案為 4 色(使用者參考 Behance
     案例的做法——主色 + 3 個相近色,其中一個是近黑、一個是近白、一個是
     灰調,剛好對應下面這 4 個變數):
       1. Cyan Glow  --hud-line       #4df0ff  主色,已經在用,不動。
       2. Obsidian   --hud-bg-deep    #030c18  近黑,已經在用,不動。
       3. Titanium   --hud-muted      #8ec9d8  灰藍色調的「鈦色」,
          已經在用(原本是輔助文字色),不動,只是正式把它列進品牌色票。
       4. Ice White  --hud-ice        #eaf9ff  新增,亮白但帶一點點青色
          調(不是死板的 #ffffff),用在最需要跳出來的重點文字上(例如
          主視覺大標題、對話泡泡文字),呼應參考案例裡「Pure White」的
          角色。
     這 4 個是「品牌識別色票」,設計上刻意只有 4 色、不再擴充;至於下面
     --accent-amber(付費功能標籤)、--hud-danger(警告訊息)這兩個,
     屬於「功能性語意色」,跟品牌色票是分開的兩件事——品牌色票回答的是
     「Tavi 看起來是什麼顏色」,語意色回答的是「這個小標籤/提示框在講
     什麼種類的訊息」,兩者職責不同,不會互相取代。 */
  --hud-ice: #eaf9ff;
  /* 「完整版/付費限定」的語意色,改用金色系,跟原本借用的 --hud-danger
     紅色脫鉤——紅色之後專門留給警告/危險語意(例如 .callout.warning),
     金色代表「加值/解鎖」,兩種語意不會再共用同一個顏色,玩家一眼就能
     分辨「這是警告」還是「這是付費功能」。 */
  --accent-amber: #ffc266;
  /* 統一的緩動曲線,CSS transition 跟 JS(GSAP)動畫都用同一條曲線,
     手感才會一致——類似 expo-out,前段快、後段慢慢收尾,是目前多數
     高質感網站(包含 GSAP showcase 上的案例)偏好的手感,比瀏覽器預設的
     ease 更有「重量感」。 */
  --ease-premium: cubic-bezier(0.16, 1, 0.3, 1);

  /* 2026-09-21 新增,2026-09-22 依使用者提供的參考案例調整字體選擇:
     --font-display:標題、按鈕、品牌 Logo、數字用——英文/數字部分走
       Onest(使用者參考的其中一個案例就是用這個字體:幾何感、偏科技感的
       展示型字體,而且是 Google Fonts 上真正免費、開源的字體);中文
       字元 Onest 沒有對應字符,瀏覽器會自動 fallback 到下一個有該字符的
       字體(Noto Sans TC),所以同一行文字裡中英文自動各自用最適合的
       字體顯示,不需要另外拆兩個元素。
     --font-body:內文段落用——英文走 Manrope(使用者參考的另一個案例
       用的字體,一樣是 Google Fonts 免費字體,中性、好讀,跟 Onest
       搭配起來的風格跟參考案例接近),中文一樣 fallback 到 Noto Sans TC。
     補充說明(誠實告知,避免誤會):使用者附的截圖裡其實還有 Gilroy、
     Lyon Display、Suisse Int'l 這幾個字體,但這三個都是「商業付費字體」
     (要跟字體公司購買授權才能合法用在正式網站上),不是 Google Fonts
     這種免費開源字體,所以這裡沒有直接採用——改用風格相近、但完全免費
     合法、來源正當的 Onest + Manrope 組合,兩者剛好也是使用者截圖裡
     其中兩個案例(VOiD、Spora)實際採用的字體,不是憑空選的替代方案。
     兩者最後都還有 "Microsoft JhengHei", sans-serif 這兩層 fallback,
     萬一 Google Fonts 檔案還沒載入完成或載入失敗,不會整頁變成瀏覽器
     預設的無襯線字體,至少還是原本熟悉的視窗中文字體。 */
  --font-display: "Onest", "Noto Sans TC", "Microsoft JhengHei", sans-serif;
  --font-body: "Manrope", "Noto Sans TC", "Microsoft JhengHei", sans-serif;
}

* {
  box-sizing: border-box;
}

html {
  scroll-behavior: smooth;
  /* 2026-09-19 調整:使用者反映字級偏小。這幾頁的字級大多用 rem 寫
     (1rem = 這裡設定的 html font-size),把基準從瀏覽器預設的 16px
     調到 18px,等於整站文字統一放大約 12.5%,不用逐一調整每個地方的
     font-size 數值。
     2026-09-19 再次調整:使用者反映還是偏小,再往上調到 20px(比瀏覽器
     預設放大 25%)。
     2026-09-21 調整:改成 clamp(),桌面維持跟之前一樣的 20px(視窗夠寬時
     clamp 會取到上限 20px,不會比之前小),但手機窄螢幕會平滑縮小到
     17px 左右——原本固定 20px 在手機上偏大,标题、按鈕文字容易換行換得
     不好看,clamp 讓文字大小跟著螢幕寬度平滑過渡,不是「桌機/手機兩種
     斷點各自寫死一個數字」的跳躍式縮放。 */
  font-size: clamp(17px, 0.85vw + 14.6px, 20px);
}

/* 2026-09-27 新增:使用者反映用手機寬度看的時候字級還是偏大。原因是上面
   clamp() 換算成一般算式是「font-size = 0.0085 * 視窗寬度(px) + 14.6px,
   下限 17px、上限 20px」——上限 20px 在視窗寬度約 635px 就會頂到,下限
   17px 則要窄到約 282px 才會頂到,中間這段「慢慢縮小」的區間主要落在
   282px~635px。但漢堡選單、卡片改單欄這些「進入手機版面」的斷點是
   720px(見下面 @media (max-width: 720px)),所以在 635px~720px 這段
   「版面已經是手機版,但字級公式還沒真的縮小多少」的寬度,字級會非常
   接近 20px 上限,看起來偏大、跟版面的手機化程度不成比例。
   這裡在跟版面一致的 720px 斷點,直接把字級鎖定成 17px——原本設計
   clamp() 時的目標(見上面註解)就是「手機窄螢幕縮小到 17px 左右」,
   這裡只是讓它一進入手機版面就直接是這個目標值,不用再等到視窗窄到
   282px 才真的到位。跟其他手機斷點一樣用 720px,不額外新增數字,維持
   全站斷點一致。 */
@media (max-width: 720px) {
  html {
    font-size: 17px;
  }
}

html,
body {
  margin: 0;
  min-height: 100%;
}

body {
  font-family: var(--font-body);
  color: var(--hud-text);
  background:
    radial-gradient(ellipse 80% 50% at 50% -10%, rgba(77, 240, 255, 0.14), transparent),
    linear-gradient(180deg, #061a2c 0%, #030c18 55%, #020810 100%);
  background-attachment: fixed;
  line-height: 1.6;
}

a {
  color: var(--hud-line-bright);
}

img,
svg {
  max-width: 100%;
}

/* 2026-09-21 新增:選取文字時的顏色跟著品牌色走,而不是瀏覽器預設的
   藍底——這種小細節是「有沒有花心思做完整」的差別,但改動風險是零,
   純視覺、不影響任何版面。 */
::selection {
  background: rgba(77, 240, 255, 0.32);
  color: #ffffff;
}

.container {
  width: 100%;
  max-width: var(--max-width);
  margin: 0 auto;
  padding: 0 1.25rem;
}

/* ---------- 導覽列 ---------- */

/* 2026-09-22 調整:使用者反映導覽列在頁面最上方時希望是「透明」的,讓
   底下主視覺的深色/光暈背景直接透出來,不要一整條實心色塊——預設狀態
   background 改成 transparent、也拿掉 backdrop-filter 模糊(模糊效果
   移到下面 .is-scrolled 才加上,捲動離開頂端後才需要靠模糊/實色維持
   導覽文字的可讀性)。底線也從這裡移除,改畫在 .nav-row 上(見下面該
   規則的說明),讓底線只跟著「品牌 icon 到最後一個導覽連結」的實際內容
   寬度走,不是整條 bar 的滿版寬度。 */
.site-header {
  position: sticky;
  top: 0;
  z-index: 30;
  background: transparent;
  transition: background 0.25s ease;
}

/* 2026-09-21 新增,2026-09-22 調整,同日第五輪再調整:原本捲動後導覽列
   會變成幾乎不透明的實色色塊,使用者反映導覽列的透明度應該「永遠維持
   透明(12% 或完全透明都可以)」,不要捲動後又變回一整條實色——所以
   這裡改成捲動後只加一點點極淡的深色(12% 不透明度),讓文字在任何底下
   內容上都還能維持基本可讀性,但視覺上仍然感覺得到「透明」,不會變成
   先前那種明顯的實色面板;也拿掉了模糊背景跟陰影,維持整條導覽列一直
   是輕薄、透光的樣子。沒有載入 site-motion.js 的頁面(目前只有
   index.html 有載入)這個 class 永遠不會被加上,導覽列會維持一直完全
   透明,等同沒有這條規則,不影響那些頁面現有的樣子。 */
.site-header.is-scrolled {
  background: rgba(3, 10, 20, 0.12);
}

/* 2026-09-22 調整:使用者要求「icon/TAVI 名稱往左移、導覽連結整個往
   右移」,也就是讓導覽列的內容盡量貼近視窗左右邊緣,不要被原本文章內文
   用的 --max-width(1240px)限制住,所以這裡不繼承 .container 的
   max-width,改用一個明顯更寬的上限(1680px)——一般桌機視窗寬度大多
   落在 1680px 以內,實際上就是貼齊左右邊緣;只有超寬螢幕(>1680px)才
   會保留置中留白,避免 icon 跟導覽連結被拉到誇張地遠。同時底線
   (border-bottom)畫在這裡,寬度剛好等於「品牌 icon 左邊界」到「最後一個
   導覽連結右邊界」的實際內容範圍,不是滿版寬度。 */
.nav-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  max-width: 1680px;
  margin: 0 auto;
  padding: 0.85rem 2rem;
  border-bottom: 1px solid var(--hud-line-dim);
  transition: padding 0.25s ease;
}

.site-header.is-scrolled .nav-row {
  /* 只調上下內距,左右內距交給 .nav-row 自己的規則(桌機 2rem、手機
     1.25rem,見下面 @media (max-width: 720px))決定,這裡用 longhand
     只寫 padding-top/bottom,避免用 padding 簡寫誤蓋掉手機版的左右內距
     (簡寫一定會同時設定四個方向,即使只是想改上下)。 */
  padding-top: 0.6rem;
  padding-bottom: 0.6rem;
}

.brand {
  display: flex;
  align-items: center;
  gap: 0.55rem;
  text-decoration: none;
  color: var(--hud-text);
  font-family: var(--font-display);
  font-weight: 700;
  letter-spacing: 0.14em;
  font-size: 1.05rem;
}

.brand-orb {
  width: 1.9rem;
  height: 1.9rem;
  flex-shrink: 0;
}

.brand-orb .glow-layer {
  animation: glow-breathe 3.4s ease-in-out infinite;
  transform-origin: 110px 110px;
}

@keyframes glow-breathe {
  0%,
  100% {
    opacity: 0.56;
  }
  50% {
    opacity: 1;
  }
}

.nav-links {
  display: flex;
  align-items: center;
  gap: 1.6rem;
  list-style: none;
  margin: 0;
  padding: 0;
}

/* 2026-09-27 調整:使用者反映滑鼠移到導覽列連結上方(hover)時出現的
   底線不要了,改成單純的「變亮」效果就好。原本 hover / 當前頁面
   (aria-current="page")共用同一組規則,用 border-bottom-color 從
   transparent 變成 --hud-line 畫出底線,這裡把底線整個拿掉(連帶移除
   base 規則裡只是用來預留底線空間的 border-bottom: 2px solid
   transparent),改成加一圈跟全站其他發光文字(.section-title、
   .hero h1)同一色系的 text-shadow 柔光,搭配原本就有的文字變亮
   (color: var(--hud-muted) → --hud-text),讓 hover / 當前頁面看起來是
   「整個字亮起來」,不是底下多一條線。 */
.nav-links a {
  color: var(--hud-muted);
  text-decoration: none;
  font-size: 0.92rem;
  font-weight: 600;
  letter-spacing: 0.03em;
  padding-bottom: 0.3rem;
  transition: color 0.15s ease, text-shadow 0.15s ease;
}

.nav-links a:hover,
.nav-links a[aria-current="page"] {
  color: var(--hud-text);
  text-shadow: 0 0 10px rgba(77, 240, 255, 0.55);
}

.nav-toggle {
  display: none;
  width: 2.4rem;
  height: 2.4rem;
  border: 1px solid var(--hud-line-dim);
  border-radius: 6px;
  background: rgba(2, 12, 22, 0.9);
  color: var(--hud-text);
  cursor: pointer;
}

@media (max-width: 720px) {
  /* 2026-09-22 新增:桌機版把 .nav-row 的左右內距加大到 2rem,是為了讓
     icon/導覽連結在寬螢幕上貼近邊緣;手機螢幕本來就窄,維持原本較窄的
     1.25rem 內距,避免可用內容寬度被擠壓太多。 */
  .nav-row {
    padding-left: 1.25rem;
    padding-right: 1.25rem;
  }

  .nav-toggle {
    display: block;
  }

  /* 2026-09-27 調整:使用者要求手機版選單改成靠右(貼齊漢堡按鈕,不要
     整條滿版寬度),底色也要透明、拿掉底線——原本 left:0/right:0 讓選單
     撐滿整條 nav-row 寬度,改成只設 right:0(不設 left),讓選單依內容
     自然縮成貼齊右邊緣的窄面板,呼應漢堡按鈕本來就在右側的位置。
     background 從接近不透明的深色(0.97)改成完全透明,呼應
     .site-header 本身「永遠維持透明」的既有設計方向(見上面
     .site-header.is-scrolled 的說明)。同時拿掉選單容器跟每個連結各自
     的 border-bottom(原本是選單外框的底線,跟每個項目之間的分隔線),
     整體變成沒有面板感、單純文字懸浮的極簡風格。 */
  .nav-links {
    position: absolute;
    top: 100%;
    left: auto;
    right: 0;
    flex-direction: column;
    align-items: flex-start;
    gap: 0;
    background: transparent;
    max-height: 0;
    overflow: hidden;
    transition: max-height 0.2s ease;
  }

  .nav-links.open {
    max-height: 26rem;
  }

  /* 2026-10-04 調整:使用者回報手機版右上角的下拉選單「太小可能會點不到、
     點不乾淨」。實際量到的原因:這裡的 <a> 是行內元素(display: inline),
     行內元素的上下 padding 與 width: 100% 都不會撐開版面——每一項實際只佔
     一行字高(約 27px 間距),但各自「看得到的點擊範圍」(含 padding)卻有
     48px 高,相鄰兩項的點擊範圍互相重疊,點中間常常點到隔壁那一項;
     字級也只有 0.92rem(約 15.6px)。
     修法:
     (1) <a> 改成 display: block,上下 padding 才真的撐開每一項的高度,
         不再重疊;每一項最小高度 3.25rem(手機約 55px,超過一般建議的
         44~48px 最小點擊尺寸),整個矩形都可以點。
     (2) 字級放大到 1.2rem(約 20px),文字靠右(貼齊右邊的漢堡按鈕),
         最小寬度 10rem(約 170px),整排都是好點的大面積。
     (3) .nav-links.open 的 max-height 從 20rem 放寬到 26rem:5 項 x 約
         3.25rem = 16.3rem 以上,留足空間避免最後一項被 overflow: hidden
         切到。
     (4) 漢堡按鈕本身從 2.4rem(約 41px)加大到 2.8rem(約 48px),圖示
         字級也加大。
     這組規則在 720px 以下才生效,桌機版橫排導覽列完全不受影響;
     全站每一頁都共用這份 CSS 與同一個導覽列,所以所有頁面的手機選單一起
     變大。 */
  .nav-links {
    min-width: 10rem;
  }

  .nav-links li {
    display: block;
  }

  .nav-links a {
    display: block;
    box-sizing: border-box;
    width: 100%;
    min-height: 3.25rem;
    padding: 0.85rem 1.25rem;
    font-size: 1.2rem;
    line-height: 1.5;
    text-align: right;
  }

  .nav-toggle {
    width: 2.8rem;
    height: 2.8rem;
    font-size: 1.35rem;
    line-height: 1;
  }
}

/* ---------- 通用按鈕 ---------- */

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.4rem;
  padding: 0.75rem 1.5rem;
  border-radius: 8px;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.95rem;
  text-decoration: none;
  cursor: pointer;
  border: 1px solid transparent;
  transition: transform 0.25s var(--ease-premium), box-shadow 0.25s ease, opacity 0.12s ease;
  will-change: transform;
}

.btn:hover {
  transform: translateY(-1px);
}

.btn-primary {
  background: linear-gradient(180deg, #1ec8e6, #0a6f9a);
  color: #041018;
  box-shadow: 0 0 14px rgba(77, 240, 255, 0.35);
}

.btn-secondary {
  background: rgba(2, 12, 22, 0.7);
  border-color: var(--hud-line-dim);
  color: var(--hud-text);
}

.btn-secondary:hover {
  border-color: var(--hud-line);
}

.btn[disabled],
.btn.is-disabled {
  opacity: 0.5;
  cursor: not-allowed;
  transform: none;
}

/* ---------- Hero ---------- */

.hero {
  /* 2026-09-22 第六輪調整:使用者附圖標註「不能再往上,放這嗎」,原本
     4.5rem 的上內距搭配 .screen-panel 的垂直置中,在螢幕較高時置中點
     還是偏低——改成內容直接貼齊導覽列下方一小段距離(見下面新增的
     justify-content: flex-start 覆蓋規則),上內距也跟著收窄成 2.5rem。
     2026-09-22 第七輪調整:使用者接著附圖反映「整體都太偏上了」,並附了
     一張「調整成這樣的位置」的對照圖——比對兩張圖裡主視覺框線的垂直
     位置,大約要再往下移 30px 左右(這個螢幕寬度下根字體約 20px,約
     等於 1.5rem),所以上內距從 2.5rem 加回到 4rem,比第六輪鬆一點、
     但沒有完全退回原本 4.5rem 置中的做法(因為那個做法在螢幕較高時
     置中點會偏低的問題還是存在)。
     2026-09-22 第十六輪調整:使用者這次沒有附標註截圖,純文字要求
     「『桌面遊戲』這全部,可以一起往下一點嗎」——整個 hero 是
     justify-content: flex-start、內容緊接在這個上內距後面開始排,
     所以只要調這一個數字,標誌、標題、說明文字、按鈕、捲動提示會
     整組一起往下移,不會跑版或散開。這裡先加 1rem(4rem → 5rem,約
     20px 的估計值,不是精確量測),如果幅度還是不夠或太多,麻煩告訴
     我要再往下(或往上)多少,我再繼續微調。 */
  padding: 5rem 0 3.5rem;
  text-align: center;
  /* position:relative 當作 .scroll-cue、.container 內層 z-index 的定位
     基準;overflow:hidden / isolation:isolate 避免子元素(對話泡泡等)
     的堆疊順序或溢出跟頁面其他地方打架。
     2026-09-22 第七輪:原本這裡還提到要配合主視覺背景光暈
     (.aurora-blob)——使用者附圖反映那兩個光暈色塊「很明顯不是背景」、
     要求消除,已經整段移除(HTML 裡的 .aurora-blob 元素、這裡的
     .aurora-blob CSS 規則都拿掉了),這三個屬性維持不變是因為還有
     別的用途,不是專為光暈保留的。 */
  position: relative;
  overflow: hidden;
  isolation: isolate;
}

.hero .container {
  position: relative;
  z-index: 1;
}

/* ---------- 螢幕比例區塊(2026-09-22 第三輪,取代前一版「區塊互相
   覆蓋」的寫法) ---------- */
/* 使用者看過前一版「捲動時下一個區塊蓋住前一個區塊、前一個區塊被釘住」
   的做法後,說明實際要的不是這樣:
     1. 整個網站背景要維持「單一、固定」的背景——捲動時背景本身不會跟著
        內容一起捲動(見下面 body 的 background-attachment: fixed),
        所以這裡的區塊一律維持透明背景,不能再疊一層不透明色蓋掉它,
        不然固定背景就會被蓋住看不到。
     2. 會隨捲動變化的只有導覽列(捲動後從透明變不透明,見
        .site-header.is-scrolled)本身,以及每個區塊各自的進場動畫
        (標題、卡片淡入位移,見 assets/site-motion.js)——區塊本身要能
        正常往上捲出螢幕範圍,不會被「釘住」在原地、也不會被下一個區塊
        蓋住,是最自然的一般網頁捲動行為,不是「堆疊卡片」那種效果。
     3. 每個區塊高度抓「一整個螢幕」(min-height: 100vh)——使用者反映
        「捲軸拉到最上面時,畫面裡只應該看得到第一個區塊的內容,下一個
        區塊不該提早探頭出現(那需要留到實際往下捲、播放進場動畫時才
        出現)」,如果區塊只有螢幕高度的三分之二(先前 66vh 的寫法),
        下一個區塊會有一小截從畫面底部先冒出來,不符合這個要求,所以
        改成滿版一整個螢幕的高度,確保捲軸在最上面時畫面剛好只裝得下
        第一個區塊。區塊「內容」本身(標題、說明文字、卡片等)則垂直
        置中在這個滿版高度範圍內,視覺上大概占螢幕三分之二左右的份量、
        上下留白,不會頂天立地塞滿,也不會擠在最上方或最下方。
   這個 class 沿用之前的 HTML 標記(6 個頁面 <main> 底下每個 <section>
   都已經加上),只是拿掉了 position: sticky / z-index / 不透明背景這幾條
   造成「覆蓋」效果的規則,改成單純的高度比例 + 垂直置中。 */
/* 2026-09-22 第六輪調整:使用者附圖標註「滾動怎麼不見了」,指向 hero 區塊
   底部的捲動提示(.scroll-cue)。用 Playwright 實際量測 1907x1010 視窗後
   確認是真的 bug:.site-header 是 position: sticky,仍佔一般文件流的高度
   (量到 73px 高),所以 .hero 這個 <section> 的起始位置是 y:73,不是
   y:0;但 .screen-panel 的 min-height: 100vh 沒有扣掉這段高度,導致
   .hero 的底部落在 73 + 1010 = 1083,超出畫面 73px——而 .scroll-cue 是
   絕對定位貼齊 .hero 底部(bottom: 0.6rem),結果整個被推到畫面下緣之外,
   一開始完全看不到。
   修法:min-height 扣掉導覽列的高度,改用 calc(100vh - 3.6rem)。用 rem
   而不是寫死的 px,是因為導覽列的實際高度會隨 html 的 clamp() 響應式字
   體大小一起變化(見檔案開頭 html { font-size: clamp(...) } 那條),用
   rem 換算才能在不同螢幕寬度下都跟導覽列的實際高度對得上,不會只在某
   個寬度剛好準。3.6rem 是導覽列 padding(0.85rem 上下各一)+ brand-orb
   高度(1.9rem)估算出來的,量測視窗的根字體是 20px,3.6rem = 72px,跟
   實測的 73px 幾乎一致。
   這條套用到所有 .screen-panel(不只 hero),因為導覽列是 sticky、每個
   區塊往上捲到定位時,一樣會被導覽列疊在最上面一小截,統一扣掉才能維持
   「一個區塊剛好一個螢幕高」的節奏一致。 */
.screen-panel {
  min-height: calc(100vh - 3.6rem);
  display: flex;
  flex-direction: column;
  justify-content: center;
}

/* 2026-09-22 第六輪新增:.hero 不跟其他 .screen-panel 一樣垂直置中——
   使用者附圖明確要求主視覺(Tavi + 對話泡泡 + 標題)盡量往上貼齊導覽列,
   「不能再往上」,所以這裡蓋掉 .screen-panel 的 justify-content: center,
   改成 flex-start,內容從 .hero 自己的 padding-top(見上面 .hero 規則)
   那個位置開始往下排,不再置中;下面剩餘的空間自然留給捲動提示
   (.scroll-cue,原本就是貼齊 .hero 底部的絕對定位,不受這裡影響)。
   這條規則要寫在 .screen-panel 後面,才能靠後到的規則覆蓋掉它的
   justify-content。 */
.hero.screen-panel {
  justify-content: flex-start;
}

/* 2026-09-27 新增:特色頁(features.html)的頁首「產品特色」區塊只有一句
   eyebrow + 標題 + 一段說明,不像 index.html 的主視覺有 Tavi 圖示/對話
   泡泡撐內容——套用 .hero.screen-panel 原本的滿版高度
   (min-height: calc(100vh - 3.6rem))+ 靠上對齊之後,內容遠比可用高度
   矮,底下留一大截空白,導致跟下一個區塊的距離明顯比其他區塊之間的間距
   遠很多。這裡另外開一個只給「內容很短的頁首 hero」用的修飾用 class,
   不直接改 .hero.screen-panel 本身(index.html 那個主視覺還是需要滿版
   高度,不能動)。
   數值直接比照 .screen-panel:not(.hero) 那組一般區塊的高度/內距/垂直
   置中規則,並補上 .screen-panel:not(.hero):not(:last-of-type) 那條
   margin-bottom: 11rem——因為這個區塊本身仍然掛著 .hero 這個 class,
   :not(.hero) 選擇器選不到它,如果不補這一條,它跟下一個區塊之間就會少
   掉其他「中間區塊」都有的那 11rem 間距,套用這個 class 之後,它前後的
   間距節奏就會跟頁面其餘區塊完全一致。 */
.hero.hero-page {
  min-height: calc(72vh - 1rem);
  justify-content: center;
  padding-top: 1.5rem;
  padding-bottom: 1.5rem;
  margin-bottom: 11rem;
}

/* 2026-09-22 第十三輪新增:使用者附圖標註「滾輪提示與『牠能幫你做
   什麼』的距離太遠了,拉近一點」,同時明確表示「牠能幫你做什麼」這個
   區塊本身「先不做調整」——這裡的調整範圍限定在單純的留白/內距,完全
   不動它的淡入淡出動畫或任何 JS(那部分見 assets/site-motion.js 的
   2.5 節,這一輪沒有改)。
   用 Playwright 量測後確認:滾輪提示到「牠能幫你做什麼」標題之間,
   量到的 356px 距離裡,絕大部分(約 256px)不是 .hero 這邊造成的,而是
   這個區塊自己的內距(section 的預設 padding: 3rem 0,上面 60px)加上
   .screen-panel 的垂直置中(justify-content: center,量到的實際內容
   高度遠比 min-height 矮,置中留白就佔掉將近 200px)兩者加起來的。
   這裡把非 hero 區塊(這條、還有下面接著的「常見問題」共用同一個
   class)的 min-height 從跟 hero 一樣的「一整個螢幕高」收窄到
   calc(72vh - 1rem),並把上內距從共用的 section { padding: 3rem 0 }
   單獨收窄成 1.5rem——原本讓每個區塊都至少撐滿一個螢幕高,是為了避免
   「捲軸拉到最上面時,下一個區塊提早從畫面底部探頭」(見上面
   .screen-panel 那段第三輪的說明),但那個顧慮專屬於 hero 剛打開頁面
   的第一眼、這時候還沒有任何捲動動態介入;非 hero 區塊本來就已經套用
   assets/site-motion.js 的捲動淡入淡出(2.5 節)、預設 opacity: 0,
   捲動過程中就算區塊變矮、下一個區塊提早在視窗底部露出一點,也只會是
   「隨捲動慢慢淡入」的自然效果(這正是使用者原本就要的效果),不是
   「頁面一打開就看到破綻」那種問題,所以縮小這裡的 min-height 是安全
   的。
   這條規則刻意只對「常見問題」以外的效果沒有實際影響——「常見問題」
   本身的實際內容(卡片 + 提示框)高度已經超過原本的 min-height,一直
   都是內容本身撐開高度、min-height 從來沒有真的發揮作用,所以調低這個
   數字對它的實際版面沒有任何影響,只有「牠能幫你做什麼」這種內容比
   min-height 矮的區塊才會真的被拉近。 */
.screen-panel:not(.hero) {
  min-height: calc(72vh - 1rem);
  padding-top: 1.5rem;
}

/* 2026-09-22 第十四輪新增:使用者附圖標註(實際瀏覽器截圖)「『常見
   問題』與前區域(牠能幫你做什麼)離得太近了,導致會提早出現」——
   上一輪把「牠能幫你做什麼」的 min-height 收窄拉近跟 hero 的距離
   之後,連帶把它的總高度變矮,而「常見問題」緊接在它後面,兩個區塊之間
   完全沒有額外間距,原本用 Playwright 量到只剩 155px 左右;「常見
   問題」的捲動淡入(assets/site-motion.js 2.5 節,start: "top 92%")
   是抓「常見問題」自己頂部相對畫面的位置,區塊間距一變近,使用者還在
   舒服地看著「牠能幫你做什麼」的卡片時,「常見問題」的標題就已經在
   畫面最下緣開始淡入、隱約看得到,才會有「提早出現」的感覺。
   這裡不去動剛修好的 hero-to-牠能幫你做什麼距離(上面那條規則維持
   不變),而是單獨針對「中間」這個區塊(非 hero、也不是最後一個,也就
   是目前唯一的「牠能幫你做什麼」)加上 margin-bottom,把它跟下一個
   區塊之間的距離拉開,量到的間距會從 155px 左右加大到約 375px,讓
   「常見問題」開始淡入的時機延後到使用者已經捲過「牠能幫你做什麼」
   卡片、準備要離開這個區塊的時候,不會在還在看卡片時就先偷看到下一
   區塊。用 :not(:last-of-type) 而不是直接寫死選到「牠能幫你做什麼」,
   是因為目前 <main> 底下剛好只有 3 個 <section>(hero、牠能幫你做
   什麼、常見問題),這樣寫以後如果哪天在中間插入新的區塊,一樣會自動
   套用到「不是第一個也不是最後一個」的區塊,不用每次手動改選擇器。 */
.screen-panel:not(.hero):not(:last-of-type) {
  margin-bottom: 11rem;
}

/* 2026-09-27 新增:下載頁(download.html)內容比其他頁面少(只有頁首 +
   系統需求 + 安裝後怎麼開始 3 個區塊),使用者反映區塊之間維持跟其他頁
   一樣的 11rem 間距顯得太空,要求縮短大約一半。這裡刻意不去改上面
   .hero.hero-page / .screen-panel:not(.hero):not(:last-of-type) 這兩條
   全站共用的 11rem 規則本身(features.html、subscribe.html 已經用這個
   間距確認過,不能被連帶改掉),改成另外開一個「頁面內容較少」專用的
   修飾用 class(.page-compact),掛在 <main> 上,只在「這個 <main> 底下」
   用選擇器優先權覆蓋掉間距,不影響其他沒有加這個 class 的頁面。
   5.5rem 大約是 11rem 的一半,符合使用者「大概減少二分之一」的說法。 */
.page-compact .hero.hero-page,
.page-compact .screen-panel:not(.hero):not(:last-of-type) {
  margin-bottom: 5.5rem;
}

/* 2026-09-21 新增、2026-09-22 第七輪移除:主視覺背景原本放了兩塊柔和
   光暈色塊(.aurora-blob-a / .aurora-blob-b,純裝飾、aria-hidden),想
   營造深色背景上的「極光漸層」氛圍。使用者附圖標註「這兩個光圈要消除,
   很明顯不是背景阿!」——模糊、透明度沒有做到融入背景的效果,反而看
   起來是兩個突兀的獨立光圈,所以整組(HTML 的兩個 div、這裡的
   .aurora-blob / .aurora-blob-a / .aurora-blob-b 規則、手機版的寬高
   覆蓋)都移除,hero 背景還原成單純的深色底,不再有這層裝飾光暈。 */

/* 2026-09-22 新增:主視覺焦點區——使用者要求「tavi 放正中間,旁邊隨機
   出現對話框」,把原本單純當裝飾小圖示的 hero-orb 升級成整個主視覺真正
   的視覺主角,額外包一層 .hero-figure 當定位容器,讓對話泡泡
   (.tavi-say)可以用 position:absolute 準確地貼在 Tavi 旁邊。 */
.hero-figure {
  position: relative;
  width: fit-content;
  /* 2026-09-22 第五輪調整:下面跟「TAVI · 桌面遊戲 AI 助理」那行的間距
     從 1.5rem 收窄到 1rem;第六輪再次收窄到 0.6rem,使用者附圖反映還要
     再往上貼近一點。 */
  margin: 0 auto 0.6rem;
  z-index: 1;
}

.hero-orb {
  /* 原本固定 9.5rem,現在改成響應式、而且明顯放大——Tavi 是主視覺的
     主角,不是陪襯的小圖示。 */
  width: clamp(11rem, 22vw, 15rem);
  height: clamp(11rem, 22vw, 15rem);
  display: block;
}

.hero-orb .glow-layer {
  animation: glow-breathe 3.4s ease-in-out infinite;
  transform-origin: 110px 110px;
}

/* 2026-09-22 新增:Tavi 旁邊隨機出現的對話泡泡,由 assets/site-motion.js
   控制顯示時機跟文字內容(見該檔案「主視覺 Tavi 的隨機對話泡泡」那段)。
   預設 opacity:0、由 JS/GSAP 淡入淡出——就算 JS 沒執行,這個元素本來就
   不佔版面高度(absolute 定位),完全不影響頁面其他內容的正常顯示。 */
.tavi-say {
  position: absolute;
  /* 預設(上排)位置,見下面 .pos-mid / .pos-bottom 這兩個中/下排變化。 */
  top: 4%;
  left: 100%;
  margin-left: 1.1rem;
  width: max-content;
  /* 2026-09-22 調整:使用者反映泡泡太窄,長一點的台詞換行換得不好看,
     從 14rem 加寬到 19rem,大多數台詞單行或只換一次行就能顯示完。 */
  max-width: 19rem;
  padding: 0.65rem 0.95rem;
  border-radius: 14px;
  background: var(--hud-panel);
  border: 1px solid var(--hud-line-dim);
  box-shadow: 0 10px 26px rgba(0, 0, 0, 0.35), inset 0 0 18px rgba(0, 80, 120, 0.18);
  opacity: 0;
  pointer-events: none;
  z-index: 2;
}

.tavi-say-text {
  margin: 0;
  color: var(--hud-ice);
  font-family: var(--font-body);
  font-size: 0.86rem;
  line-height: 1.5;
  text-align: left;
  /* 2026-09-22 新增:真的需要換行時,盡量從標點符號(、,。！？等)這類
     自然的斷句處換,不要從一個詞的中間硬切——line-break: strict 是
     中文排版常用的「避頭尾」規則(標點符號不會被斷到下一行的開頭),
     word-break/overflow-wrap 維持瀏覽器預設的一般斷行邏輯,不做
     word-break: break-all 這種「滿寬就硬切」的粗暴斷行。 */
  word-break: normal;
  overflow-wrap: normal;
  line-break: strict;
}

.tavi-say::before {
  content: "";
  position: absolute;
  left: -0.5rem;
  top: 1.15rem;
  width: 0.9rem;
  height: 0.9rem;
  background: var(--hud-panel);
  border-left: 1px solid var(--hud-line-dim);
  border-bottom: 1px solid var(--hud-line-dim);
  transform: rotate(45deg);
}

/* assets/site-motion.js 每次換下一句台詞,會從「上/中/下 × 左/右」6 個
   位置裡隨機挑一個(見該檔案 BUBBLE_POSITIONS),讓泡泡不是只固定貼在
   同一個高度的左右兩側,而是繞著 Tavi 隨機出現在不同位置,看起來更生動
   ——.is-left 控制左右側(預設在右側),.pos-mid / .pos-bottom 控制垂直
   位置(預設在上方,對應 top: 4%)。 */
.tavi-say.is-left {
  left: auto;
  right: 100%;
  margin-left: 0;
  margin-right: 1.1rem;
}

.tavi-say.is-left .tavi-say-text {
  text-align: right;
}

.tavi-say.is-left::before {
  left: auto;
  right: -0.5rem;
  border-left: none;
  border-bottom: none;
  border-right: 1px solid var(--hud-line-dim);
  border-top: 1px solid var(--hud-line-dim);
}

.tavi-say.pos-mid {
  top: 40%;
}

.tavi-say.pos-bottom {
  top: 76%;
}

/* 手機窄螢幕:左右浮動的泡泡會超出螢幕寬度,改成貼在 Tavi 正下方、
   置中顯示,三角形尾巴為了避免額外處理旋轉角度的複雜度,直接不顯示,
   泡泡本身當成一個置中的說明文字卡片就已經清楚易讀。 */
@media (max-width: 640px) {
  /* 2026-09-27 調整:使用者要求手機版的對話泡泡統一出現在 Tavi 上方,
     不要隨機出現在不同位置。原本這裡只用單一 .tavi-say class 覆蓋
     (權重 0,1,0),蓋不掉 .tavi-say.pos-mid(top:40%)、
     .tavi-say.pos-bottom(top:76%)這兩條「中/下」隨機位置規則(權重
     0,2,0,兩個 class 疊加,權重比這裡原本的寫法高)——手機版如果剛好
     隨機到 pos-mid/pos-bottom,泡泡就會維持桌面版那組 top 數值,跟下面
     的文字重疊,而不是統一貼在 Tavi 上方。
     改用 .hero-figure .tavi-say(父層 .hero-figure + 本身,權重同樣是
     0,2,0)當選擇器——.tavi-say 本來就是 .hero-figure 的直接子元素(見
     index.html),這樣寫法權重打平,而這條規則寫在檔案比較後面、
     權重打平時後面蓋前面,才能真正蓋掉 pos-mid/pos-bottom,不受隨機到
     哪個位置影響。同時把泡泡從原本貼在 Tavi 下方(top:100%)改成貼在
     Tavi 上方(bottom:100%)。 */
  .hero-figure .tavi-say {
    left: 50%;
    right: auto;
    top: auto;
    bottom: 100%;
    margin: 0 0 0.85rem;
    /* 水平置中改由 assets/site-motion.js 用 GSAP 的 xPercent 處理
       (見該檔案說明)——GSAP 本來就會接管這個元素的 transform 屬性
       (要用 transform 做淡入時的位移/縮放動畫),這裡如果同時用 CSS
       的 transform: translateX(-50%) 做置中,兩邊會互相覆蓋掉,所以
       置中改成完全交給 JS 那邊統一管理,不在 CSS 這裡設定 transform。 */
    max-width: 18rem;
  }

  .hero-figure .tavi-say .tavi-say-text {
    text-align: center;
  }

  .hero-figure .tavi-say::before {
    display: none;
  }
}

.hero-eyebrow {
  color: var(--hud-line);
  font-family: var(--font-display);
  /* 2026-09-19 調整:使用者要求跟 h1 互換大小。原本 0.35em 字距是配合
     小字級設計的,直接套到放大後的字級會讓間距誇張到不好讀,所以這裡
     跟著字級縮小字距比例,維持放大後還算舒服的間距。
     2026-09-20 調整:使用者反映這行與下面的 h1 太擠,把下邊距加大,
     讓兩行標題之間留多一點呼吸空間。
     2026-09-22 第六輪調整:使用者附圖反映 h1 那句還要再往上貼近一點,
     下邊距從 1.2rem 收窄到 0.9rem——比 2026-09-20 調整前的間距(原本
     更小)寬一些,兩次反映的訴求各退一步,不會又擠回太緊的狀態。 */
  letter-spacing: 0.08em;
  font-size: clamp(2rem, 5vw, 3rem);
  font-weight: 700;
  margin: 0 0 0.9rem;
}

.hero h1 {
  /* 2026-09-20 調整:使用者反映互換後的 h1 太小,改成跟 .section-title
     (例如「牠能幫你做什麼」那個標題)同樣的字級跟間距——字級、
     margin 數值直接對齊 .section-title,兩邊都只設 margin-bottom、
     不設 margin-top,前面的間距一樣是由上一個元素自己的間距決定。 */
  font-family: var(--font-display);
  /* 2026-09-22 調整:明確指定用品牌色票裡的 Ice White,比原本沒設定、
     直接繼承 body 的 --hud-text 再亮一點,呼應參考案例裡標題文字用
     「接近純白」顏色跳出來的做法。 */
  color: var(--hud-ice);
  margin: 0 0 0.6rem;
  font-size: 1.7rem;
  font-weight: 800;
  text-shadow: 0 0 18px rgba(77, 240, 255, 0.55);
}

.hero p.lede {
  max-width: 38rem;
  margin: 0 auto 2rem;
  color: var(--hud-muted);
  font-size: 1.05rem;
}

.hero-actions {
  display: flex;
  gap: 1rem;
  justify-content: center;
  flex-wrap: wrap;
}

/* 2026-09-21 新增:捲動提示——原本是 position:absolute 貼齊 .hero 底部
   的小指示點,提示玩家「下面還有內容,可以往下滑」。
   2026-09-22 第七輪調整:使用者附圖標註「滾動放這」,位置在按鈕正下方
   不遠處——原本貼齊 .hero 底部的做法,在 .hero 改成
   min-height: calc(100vh - 3.6rem) + 內容靠上(justify-content:
   flex-start,見上面 .hero.screen-panel 規則)之後,按鈕跟畫面最底部
   之間會空出一大段,捲動提示被拉到很遠的下方,視覺上跟按鈕脫節。改成
   直接接在 .hero-actions(下載/了解特色按鈕)後面的一般文件流位置
   (見 index.html,.scroll-cue 現在是 .container 裡的最後一個子元素),
   不再用 position:absolute 對齊 .hero 底部,這樣不管畫面多高,捲動
   提示都會穩定貼在按鈕下方一小段距離,不會被拉遠。手機窄螢幕還是直接
   隱藏(手機使用者本來就慣於滑動探索,不需要這個提示,留著反而佔
   位置)。
   2026-09-22 第十三輪調整:使用者附圖標註「滾輪提示與『牠能幫你做
   什麼』的距離太遠了」。用 Playwright 量測 1907x1010 視窗後確認:
   .hero 用 min-height 撐滿一個螢幕、但實際內容(Tavi、標題、按鈕、
   這個提示點)沒有那麼高,justify-content: flex-start 又把內容整包
   往上貼齊,留下來的空間全部堆在提示點下方、變成看不見的一大截空白,
   把下一個區塊往下推遠。這裡把 margin-top 從 2.5rem 加到 4rem(多
   1.5rem = 30px,剛好等於量到的那段沒被用到的空白),讓提示點往下
   吃掉那段本來浪費掉的空間、更貼近 .hero 的實際下緣,藉此把距離縮短
   一點,不影響提示點跟上面按鈕的相對位置(margin-top 只吃「原本沒被
   佔用」的多餘空間,不會把 .hero 撐得更高,也不會讓下一個區塊提早
   探頭——.hero 的總高度本來就是 min-height 撐出來的下限,這裡最多
   只能把撐出來但沒被用到的空間填滿,不會反過來讓 .hero 變矮)。這一輪
   縮短的量不大,真正大宗的距離其實是下面「牠能幫你做什麼」自己的
   內距和垂直置中留白造成的,那部分另外調整(見 .screen-panel:not(.hero)
   規則)。 */
.scroll-cue {
  position: relative;
  display: block;
  margin: 5.3rem auto 0;
  width: 1.2rem;
  height: 2.4rem;
  z-index: 1;
  animation: scroll-cue-bounce 1.6s ease-in-out infinite;
}

.scroll-cue::before {
  content: "";
  position: absolute;
  top: 0;
  left: 50%;
  width: 2px;
  height: 1.6rem;
  background: var(--hud-line);
  transform: translateX(-50%);
}

.scroll-cue::after {
  content: "";
  position: absolute;
  bottom: 0;
  left: 50%;
  width: 0.85rem;
  height: 0.85rem;
  border-right: 2px solid var(--hud-line);
  border-bottom: 2px solid var(--hud-line);
  transform: translateX(-50%) rotate(45deg);
}

@keyframes scroll-cue-bounce {
  0%,
  100% {
    transform: translateY(0);
    opacity: 0.5;
  }
  50% {
    transform: translateY(0.55rem);
    opacity: 1;
  }
}

@media (max-width: 480px) {
  .scroll-cue {
    display: none;
  }
}

/* ---------- 區塊 / 卡片 ---------- */

section {
  padding: 3rem 0;
}

.section-title {
  text-align: center;
  font-family: var(--font-display);
  margin: 0 0 0.6rem;
  font-size: 1.7rem;
  font-weight: 800;
  /* 2026-09-27 新增:使用者反映所有「次標」(每個區塊自己的 h2 標題,
     例如「系統需求」「工作坊:Skin、語音分享區」)要統一都有光暈——
     跟 .hero h1 本來就用的 Ice White 顏色 + 青色發光 text-shadow 是
     同一組數值,直接照抄過來,讓「主標(hero h1)」跟「次標
     (.section-title)」的發光視覺一致。這個 class 全站共用,改這裡會
     讓所有頁面的區塊標題一起套用,不用逐頁個別加。 */
  color: var(--hud-ice);
  text-shadow: 0 0 18px rgba(77, 240, 255, 0.55);
}

.section-subtitle {
  text-align: center;
  color: var(--hud-muted);
  max-width: 34rem;
  margin: 0 auto 2.2rem;
}

.card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(15.5rem, 1fr));
  gap: 1.1rem;
}

/* 2026-09-20 新增:首頁的兩個 4 格區塊(牠能幫你做什麼 / 常見問題)
   改成固定 2x2 排列,比自動排版更整齊好看;螢幕較窄時收成單欄。 */
.card-grid-2x2 {
  grid-template-columns: repeat(2, 1fr);
}

@media (max-width: 640px) {
  .card-grid-2x2 {
    grid-template-columns: 1fr;
  }
}

/* 2026-09-27 新增:特色頁「基礎功能」原本跟「完整版限定」共用同一個
   auto-fit 的 .card-grid,卡片寬度會依當排卡片「數量」自動平分容器寬度
   ——基礎功能有 5 張、完整版限定只有 3 張,寬螢幕時兩邊卡片會分到不同
   寬度,看起來大小不一致。改成固定 3 欄(一行 3 個,多的自動換行),兩個
   區塊都套用同一個 class,卡片大小就會完全一樣,不受各自卡片數量影響。
   斷點沿用全站已經在用的 720px / 480px(跟上面 .nav-toggle 那組一致),
   而不是另外發明新的斷點。 */
.card-grid-3 {
  /* 2026-10-15:1fr 改成 minmax(0, 1fr)。1fr 的下限是「卡片內容的最小寬度」,
     英文版的標題 + 「Full version」標籤比中文長,在 721px 左右的視窗會把欄寬
     撐大、讓整個頁面出現橫向捲軸;minmax(0, 1fr) 讓三欄永遠平分,文字自己換行。 */
  grid-template-columns: repeat(3, minmax(0, 1fr));
}

@media (max-width: 720px) {
  .card-grid-3 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (max-width: 480px) {
  .card-grid-3 {
    grid-template-columns: 1fr;
  }
}

.card {
  background: var(--hud-panel);
  border: 1px solid var(--hud-line-dim);
  border-radius: 12px;
  padding: 1.4rem;
  box-shadow: inset 0 0 24px rgba(0, 80, 120, 0.18);
  /* 2026-09-21 新增:滑鼠移上去時輕輕抬升 + 邊框跟陰影一起變亮/變深,
     是卡片式版面最常見、也最低風險的「有沒有互動感」判斷依據之一,
     全站所有卡片(不管哪一頁)都會自動套用,不需要改任何 HTML。 */
  transition: transform 0.3s var(--ease-premium), border-color 0.3s ease,
    box-shadow 0.3s ease, background 0.3s ease;
}

.card:hover {
  transform: translateY(-4px);
  border-color: var(--hud-line);
  background: var(--hud-panel-elevated);
  box-shadow: 0 14px 30px rgba(0, 0, 0, 0.35), inset 0 0 24px rgba(0, 80, 120, 0.22);
}

/* 2026-10-04 新增:首頁四張功能卡片下面的循環示範影片(見 index.html 同日期的
   註解、assets/loopvideo.js)。
   - .card-with-media 把卡片改成直向 flex,.card-media 用 margin-top: auto 貼到
     卡片最底部——同一排兩張卡片的文字長度不同、卡片被格線拉成一樣高時,兩支
     影片的底部仍然對齊,不會一高一低。
   - 影片只放大到不超過 26rem 高(桌機約 520px、手機約 440px),也不超過卡片
     內容寬度;兩個限制同時生效時瀏覽器會保持原本比例縮小,不會變形。直式聊天
     視窗(584x778)會縮小到約 520px 高,接近正方形的設定視窗(482x496)幾乎維持
     原尺寸,所以四支影片的高度大致一致。
   - 影片是用 Tavi 視窗本身的邊界裁出來的(視窗自己有一圈青色邊框與圓角),
     這裡的圓角(0.35rem)略大於視窗原本的圓角,把裁切後四個角落多出來的一點
     背景藏起來;外圈加一層淡淡的青色光暈,跟全站其他發光元素一致。 */
.card-with-media {
  display: flex;
  flex-direction: column;
}

.card-media {
  margin-top: auto;
  padding-top: 1.3rem;
  display: flex;
  justify-content: center;
  align-items: flex-end;
}

.card-video {
  display: block;
  width: auto;
  height: auto;
  max-width: 100%;
  max-height: 26rem;
  border-radius: 0.35rem;
  background: #02101c;
  box-shadow: 0 0 18px rgba(77, 240, 255, 0.28);
}

.card h3 {
  font-family: var(--font-display);
  margin: 0 0 0.5rem;
  font-size: 1.05rem;
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

.card p {
  margin: 0;
  color: var(--hud-muted);
  font-size: 0.92rem;
}

/* 2026-09-20 新增:常見問題卡片原本是「是/不是」開頭直接接一整段解釋
   全部黏在同一段裡,使用者反映讀起來不順眼。拆成兩個 <p>:第一個是
   簡短的是非答案(加這個 class,加粗、跟主文字同色,和下面說明拉開
   一點距離),第二個才是完整說明,維持 .card p 原本的顏色/字級。 */
.card .faq-answer {
  margin: 0 0 0.5rem;
  font-weight: 700;
  color: var(--hud-text);
}

.badge {
  display: inline-block;
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.05em;
  padding: 0.15rem 0.5rem;
  border-radius: 999px;
  border: 1px solid var(--hud-line-dim);
  color: var(--hud-line);
  background: rgba(2, 12, 22, 0.6);
}

/* 2026-09-21 調整:「完整版」標籤原本借用 --hud-danger(紅色)當邊框色,
   跟警告/危險訊息共用同一個顏色,語意上容易混淆(紅色直覺上是「有問題」
   而不是「加值功能」)。改成金色系(--accent-amber),紅色之後專門留給
   真正的警告(.callout.warning),兩種語意各自有獨立的顏色,不再共用。 */
.badge.locked {
  color: var(--accent-amber);
  border-color: rgba(255, 194, 102, 0.55);
  background: rgba(255, 194, 102, 0.08);
}

/* 2026-09-27 新增:視覺上隱藏、但螢幕報讀軟體讀得到的輔助文字,給下面
   .compare-table 裡的 ✓ / ✗ 符號補充「免費版可用」/「完整版可用」這種
   文字說明用,避免只讀出「打勾」「打叉」符號、聽不出來是哪一欄。全站
   目前只有這裡需要,先開成通用的工具 class,之後有其他地方需要一樣可以
   直接套用。 */
.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;
}

/* 2026-09-27 新增:特色頁「基礎功能」上方新增的免費版/完整版功能對照表
   ——比照 .callout 用同一套面板底色/邊框(視覺上算「大方塊」的同一個
   語彙),裡面包一個真的 <table>,而不是用卡片或格線模擬表格,語意跟
   螢幕報讀軟體都比較正確。 */
.compare-table-wrap {
  background: var(--hud-panel);
  border: 1px solid var(--hud-line-dim);
  border-radius: 14px;
  padding: 0.4rem 1.3rem;
  overflow-x: auto;
}

.compare-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 0.92rem;
}

.compare-table th,
.compare-table td {
  padding: 0.85rem 0.6rem;
  text-align: center;
  border-bottom: 1px solid var(--hud-line-dim);
}

/* 2026-09-27 調整:原本這裡連 td 也是 white-space: nowrap,對特色頁那張
   純打勾/打叉的表格沒差(欄位內容都很短),但訂閱頁新增的次數上限對照表
   有幾格是完整的一句話(例如「依你自己 Anthropic 帳戶的用量計費」),
   nowrap 會硬撐出很寬的欄位、逼出不必要的水平捲動。拿掉 td 的 nowrap,
   讓長文字正常換行;短短一兩個字的徽章(.compare-yes/.compare-no/
   .limit-tag)另外自己設 nowrap(見下面),不會被拆成兩行。 */
.compare-table th {
  white-space: nowrap;
}

.compare-table tbody tr:last-child th,
.compare-table tbody tr:last-child td {
  border-bottom: none;
}

.compare-table th {
  font-family: var(--font-display);
  color: var(--hud-text);
  font-weight: 700;
}

.compare-table .compare-feature-col,
.compare-table td:first-child {
  text-align: left;
  white-space: normal;
}

.compare-table td:first-child {
  color: var(--hud-text);
}

.compare-yes,
.compare-no {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.7rem;
  height: 1.7rem;
  border-radius: 999px;
  font-weight: 700;
  font-size: 0.95rem;
  white-space: nowrap;
}

/* 「可用」沿用主色系(--hud-line 青色),跟「完整版限定」卡片標籤刻意
   用金色(--accent-amber)區隔開——這裡的重點是「有沒有」,不是「要不要
   付費」,用另一組顏色語意會比較清楚。 */
.compare-yes {
  color: var(--hud-bg-deep);
  background: var(--hud-line);
}

.compare-no {
  color: var(--hud-muted);
  background: rgba(142, 201, 216, 0.12);
}

/* 2026-09-27 新增:訂閱頁的「次數上限」對照表,格子裡放的是「有上限」/
   「無上限」這種文字徽章,不是單一符號,沿用 .compare-yes/.compare-no
   同一套配色邏輯(青色實心 = 好消息、淡色 = 有限制),但改成隨文字寬度
   自動撐開的藥丸形狀,而不是固定寬高的圓形。 */
.limit-tag {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0.3rem 0.9rem;
  border-radius: 999px;
  font-weight: 700;
  font-size: 0.85rem;
  white-space: nowrap;
}

.limit-tag.is-unlimited {
  color: var(--hud-bg-deep);
  background: var(--hud-line);
}

.limit-tag.is-capped {
  color: var(--hud-muted);
  background: rgba(142, 201, 216, 0.12);
}

/* 2026-09-27 新增:表頭裡「完整版」/「自己設定」下面那行小字補充說明
   (例如「未設定 API Key」),縮小、變細、變成 muted 色,跟上面主要的
   欄位名稱拉開視覺層級,同時強制換行(表頭本身還是 nowrap,靠這個 block
   自己起新行,不會把整個 th 撐更寬)。 */
.compare-table th .th-sub {
  display: block;
  font-family: var(--font-body);
  font-size: 0.68rem;
  font-weight: 500;
  color: var(--hud-muted);
  margin-top: 0.2rem;
}

@media (max-width: 480px) {
  .compare-table-wrap {
    padding: 0.4rem 0.8rem;
  }

  .compare-table th,
  .compare-table td {
    padding: 0.7rem 0.4rem;
    font-size: 0.85rem;
  }
}

/* ---------- 訂閱方案表 ---------- */

.plans-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
  gap: 1.1rem;
}

.plan-card {
  background: var(--hud-panel);
  border: 1px solid var(--hud-line-dim);
  border-radius: 14px;
  padding: 1.6rem 1.3rem;
  text-align: center;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  transition: transform 0.3s var(--ease-premium), box-shadow 0.3s ease;
}

.plan-card:hover {
  transform: translateY(-4px);
}

.plan-card.featured {
  border-color: var(--hud-line);
  box-shadow: 0 0 20px rgba(77, 240, 255, 0.25);
  position: relative;
}

.plan-card.featured::before {
  content: "最多人選";
  position: absolute;
  top: -0.65rem;
  left: 50%;
  transform: translateX(-50%);
  background: var(--hud-line);
  color: #041018;
  font-size: 0.7rem;
  font-weight: 800;
  padding: 0.2rem 0.7rem;
  border-radius: 999px;
}

.plan-name {
  font-family: var(--font-display);
  font-size: 1rem;
  color: var(--hud-muted);
  font-weight: 700;
  letter-spacing: 0.05em;
}

.plan-price {
  font-family: var(--font-display);
  font-size: 2rem;
  font-weight: 800;
  color: var(--hud-text);
}

.plan-price span {
  font-size: 0.95rem;
  color: var(--hud-muted);
  font-weight: 500;
}

/* ---------- 步驟清單 ---------- */

.steps {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.9rem;
}

.steps li {
  display: flex;
  gap: 0.9rem;
  background: var(--hud-panel);
  border: 1px solid var(--hud-line-dim);
  border-radius: 10px;
  padding: 0.9rem 1.1rem;
}

.step-index {
  flex-shrink: 0;
  width: 1.9rem;
  height: 1.9rem;
  border-radius: 50%;
  border: 1px solid var(--hud-line);
  color: var(--hud-line);
  font-family: var(--font-display);
  display: grid;
  place-items: center;
  font-weight: 800;
  font-size: 0.9rem;
}

.steps p {
  margin: 0;
  color: var(--hud-muted);
  font-size: 0.92rem;
}

.steps strong {
  color: var(--hud-text);
}

/* 2026-09-27 新增:工作坊頁面(workshop.html)的「怎麼下載，怎麼分享」
   區塊,一個 section 裡要放兩組各自獨立的 .steps 步驟清單(下載一組、
   分享一組),需要一個介於 .section-title(整個區塊的大標題)跟
   .steps(個別步驟)之間的小標題,標出「這一組步驟在講什麼」。字級比
   .section-title 小、置左(不像 .section-title 置中),第二組以後的
   小標題上方多留一點空間跟前一組步驟拉開距離。 */
.subsection-title {
  font-family: var(--font-display);
  color: var(--hud-text);
  font-size: 1.1rem;
  font-weight: 700;
  margin: 0 0 0.8rem;
}

.subsection-title:not(:first-child) {
  margin-top: 3rem;
}

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

.callout {
  border: 1px solid var(--hud-line-dim);
  background: var(--hud-panel);
  border-radius: 12px;
  padding: 1.1rem 1.3rem;
  font-size: 0.92rem;
  color: var(--hud-muted);
}

.callout strong {
  color: var(--hud-text);
}

.callout.warning {
  border-color: var(--hud-danger);
  background: rgba(90, 28, 36, 0.35);
  color: #f3c7cd;
}

.callout.warning strong {
  color: #fff;
}

/* 2026-09-22 第十輪新增:使用者要求把首頁「完整版與訂閱怎麼算」這個
   提示框改成標題/內文/連結各自獨立一行,跟其他頁面(工作坊、討論版等)
   共用的 .callout 預設「粗體字開頭直接接一整句」的行內排法不一樣。
   為了不影響其他頁面既有的 .callout 用法,這裡新增一個只給這個實例用
   的修飾用 class(.callout-stacked),而不是直接改 .callout strong 本身
   的顯示方式。 */
.callout-stacked strong {
  display: block;
  margin-bottom: 0.5rem;
  font-size: 1rem;
}

.callout-stacked p {
  margin: 0 0 0.6rem;
}

.callout-stacked p:last-child {
  margin-bottom: 0;
}

/* ---------- 特色頁:實機示範影片區塊(2026-10-03 新增、同日第二輪
   改成 YouTube 嵌入) ----------
   使用者想要的版面參考 Steam 遊戲頁面的「內介紹」:一個發光次標 +
   一段內文 + 一支影片/gif,中間空兩行(視覺上明顯的間距)再接下一組,
   最後一組直接是整個區塊的結尾(不用額外收尾裝飾)。
   次標/內文直接沿用全站共用的 .section-title / .section-subtitle
   (就是使用者截圖裡示意的「發光次標」樣式本身),不另外發明新的標題
   樣式,維持跟其他頁面「次標」視覺一致;.showcase-title /
   .showcase-body 這兩個修飾用 class 只負責「卡片之間的間距」,不覆蓋
   顏色/發光效果。(2026-10-04 更新:原本這裡還把 .showcase-title 的字級
   縮成 1.3rem「比一般區塊次標小一號」,使用者看過實際頁面後反映影片區的
   發光次標比其他區塊小太多,要求跟其他區塊一樣大,所以拿掉字級覆蓋,
   直接用 .section-title 的 1.7rem。內文 .showcase-body 本來就沒有另外設定
   字級,跟其他區塊的 .section-subtitle 一樣是 20px,不需要動。)
   .showcase-block 不設 max-width——文字(h3/p)靠 .section-subtitle
   自己的 max-width: 34rem 置中收窄,影片靠下面 .showcase-media-16x9
   自己的寬度設定,兩者各自決定自己要多寬,不用共用同一個容器寬度。

   第二輪改動(YouTube 嵌入)原因:原本這裡放的是另外剪出來、只框住
   Tavi 對話框的 8-10 秒無聲循環直式小片段,使用者決定把 1-3 分鐘的
   完整原始錄影改上傳到 YouTube 頻道,特色頁直接嵌入那份 YouTube 影片,
   不再自己另外託管一份裁切版本。原始錄影是桌面/遊戲全螢幕畫面
   (16:9),所以外框也從原本「依直式截圖比例、寬度 26rem 封頂」的
   .showcase-media,改成下面這組固定 16:9 比例、寬度可以放到 50rem
   的 .showcase-media-16x9。
   高度用 aspect-ratio: 16/9 撐出,不用「padding-bottom: 56.25% +
   height:0」那套舊式寫法——實測發現這裡會踩到那個寫法的經典陷阱:
   百分比 padding 是依「父層」的寬度計算,不是依自己這個元素被
   max-width 收窄後的寬度計算;.showcase-block 本身沒有設 max-width
   (見上面說明),所以父層寬度會比 .showcase-media-16x9 自己的 50rem
   寬很多,算出來的高度就會明顯偏高、不是正確的 16:9。aspect-ratio
   是直接依元素自己的寬度算比例,沒有這個「父層寬度」的陷阱,新版
   瀏覽器支援度也足夠,所以改用這個。iframe 用 position:absolute
   疊滿整個容器(容器本身設 position:relative)。邊框/內發光沿用
   .card 同一套視覺語言,讓嵌入的 YouTube 播放器看起來仍像網站自己的
   一塊面板,不是突兀貼上去的外部內容。
   沒有 autoplay:YouTube 影片是完整的 1-3 分鐘操作錄影,不是無聲
   循環小卡片,改成一般「點了才播放」,見 features.html 裡
   <iframe src> 那段註解。 */
.feature-showcase {
  text-align: center;
}

.showcase-block {
  margin: 6rem auto 0;
}

.showcase-block:first-of-type {
  margin-top: 0;
}

.showcase-title {
  margin-bottom: 0.7rem;
}

/* 2026-10-04 文案改寫:說明文字照使用者給的斷行(features.html 用 <br />
   強制換行),每一行約 40 個中文字,原本 .section-subtitle 的 34rem 寬度
   放不下一行,會變成每段折成 3 行;放寬到 46rem(桌面約 920px)讓每行
   完整放得進去。窄螢幕本來就放不下,會自然再折行,不會超出畫面。 */
.showcase-body {
  max-width: 46rem;
  margin-bottom: 2.2rem;
}

/* 2026-10-04 新增:手機上「在標點符號處換行」。
   使用者截圖(手機寬度)指出影片區的標題與說明會被瀏覽器從詞中間硬折,
   例如「Tavi 都會先／上網查證…」「憑印／象亂猜」「加／油」,標題最後還
   會單獨剩一個「吧」字。中文沒有空白可以當斷點,瀏覽器只能「一個字一個
   字」往下折,所以換行會落在任何地方。
   做法:features.html 裡每一句(逗號、頓號、分號之間的一段)都包成
   <span class="phrase">,這裡設成 inline-block——整個詞組是一個不可拆的
   單位,瀏覽器只能在「詞組與詞組之間」換行,也就是只會斷在標點符號後面。
   比一行還長的長句,在 HTML 裡再往下拆成兩層詞組(.phrase 裡面再包
   .phrase),窄螢幕時換行會落在詞組邊界,不會落在字中間;桌機寬度一行
   放得下,視覺上跟原本完全一樣。
   max-width: 100% 是保險:萬一螢幕窄到連單一詞組都放不下(約 300px 以下),
   詞組自己再折行,不會撐出橫向捲軸。
   重要:HTML 裡相鄰的詞組標籤之間刻意不留空白或換行(用 </span
   ><span> 的寫法),否則會多出一個空白字元,桌機版字距會被撐開。 */
.showcase-title .phrase,
.showcase-body .phrase {
  display: inline-block;
  max-width: 100%;
}

.showcase-media-16x9 {
  position: relative;
  width: 100%;
  max-width: 50rem;
  margin: 0 auto;
  aspect-ratio: 16 / 9;
  border-radius: 16px;
  overflow: hidden;
  border: 1px solid var(--hud-line-dim);
  background: var(--hud-panel);
  box-shadow: inset 0 0 24px rgba(0, 80, 120, 0.18),
    0 0 36px rgba(77, 240, 255, 0.1);
}

.showcase-media-16x9 iframe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
}

/* 2026-10-04 第四輪:影片區改成「固定大主視窗 + 下方小縮圖列」。
   (第三輪原本是每支影片各一個播放器、2 欄並排,已整個換掉。)
   使用者畫的版型草圖:發光次標 / 內文 / 中間一個大視窗 / 下面一排小
   縮圖,點小縮圖換上面大視窗的影片,點大視窗才播放。結構:
     .showcase-player            這一組(一個區塊)的容器
       .showcase-stage           大主視窗,assets/showcase.js 動態建立,
                                 同時掛 .showcase-media-16x9 沿用上面那組
                                 16:9 + 邊框 + 發光樣式
         .showcase-stage-btn     封面圖 + 播放鈕,整塊是一個 <button>
         <iframe>                按下播放後才取代掉上面的按鈕
       .showcase-thumbs          小縮圖列
         .showcase-thumb         每支影片一個 <a>(沒有 JS 時直接連去 YouTube)
   .showcase-player 把寬度收在 54rem 並置中;大主視窗原本自己帶的
   max-width: 50rem 在這裡要放掉(max-width: none),讓它填滿
   .showcase-player 的寬度,不然會比下面的縮圖列窄一截、置中後兩邊不齊。
   縮圖列用 flex + 置中 + 自動換行:2 支、4 支都能自然置中排好,不用為
   不同數量各寫一套版面。小縮圖固定 10.5rem 寬、16:9。
   「目前選中」狀態只有在 JS 成功執行之後(.is-enhanced)才會出現:
   沒被選中的縮圖調暗、選中的亮起 + 發光外框;沒有 JS 的時候縮圖只是一排
   普通連結,不要全部變暗讓人以為壞掉了。
   播放鈕用純 CSS 畫(圓形 + 三角形),不另外載入圖片。
   手機寬度(720px 以下)縮圖改成一列放 2 支(每支各占一半寬),否則
   寬度固定的縮圖會太小、太難點。 */
.showcase-player {
  max-width: 54rem;
  margin: 0 auto;
}

.showcase-player .showcase-media-16x9 {
  max-width: none;
  margin: 0 0 1.4rem;
}

.showcase-stage-btn {
  position: absolute;
  inset: 0;
  display: block;
  width: 100%;
  height: 100%;
  padding: 0;
  border: 0;
  background: transparent;
  cursor: pointer;
}

.showcase-stage-btn:focus-visible {
  outline: 2px solid var(--hud-line);
  outline-offset: -4px;
}

.showcase-poster {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.5s var(--ease-premium), filter 0.25s ease;
}

.showcase-stage-btn:hover .showcase-poster,
.showcase-stage-btn:focus-visible .showcase-poster {
  transform: scale(1.015);
  filter: brightness(1.08);
}

.showcase-play {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 4.6rem;
  height: 4.6rem;
  transform: translate(-50%, -50%);
  border-radius: 50%;
  background: rgba(2, 12, 22, 0.62);
  border: 2px solid var(--hud-line);
  box-shadow: 0 0 22px rgba(77, 240, 255, 0.4);
  transition: transform 0.25s var(--ease-premium), box-shadow 0.25s ease;
}

.showcase-play::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-32%, -50%);
  border-style: solid;
  border-width: 0.8rem 0 0.8rem 1.3rem;
  border-color: transparent transparent transparent var(--hud-ice);
}

.showcase-stage-btn:hover .showcase-play,
.showcase-stage-btn:focus-visible .showcase-play {
  transform: translate(-50%, -50%) scale(1.1);
  box-shadow: 0 0 34px rgba(77, 240, 255, 0.7);
}

.showcase-thumbs {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 1rem;
}

.showcase-thumb {
  position: relative;
  display: block;
  flex: 0 0 10.5rem;
  width: 10.5rem;
  aspect-ratio: 16 / 9;
  border-radius: 10px;
  overflow: hidden;
  border: 1px solid var(--hud-line-dim);
  background: var(--hud-panel);
  transition: opacity 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease,
    transform 0.25s var(--ease-premium);
}

.showcase-thumb img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.showcase-thumb:focus-visible {
  outline: 2px solid var(--hud-line);
  outline-offset: 2px;
}

.is-enhanced .showcase-thumb {
  opacity: 0.55;
}

.is-enhanced .showcase-thumb:hover {
  opacity: 0.9;
  border-color: var(--hud-line);
  transform: translateY(-2px);
}

.is-enhanced .showcase-thumb.is-active {
  opacity: 1;
  border-color: var(--hud-line);
  box-shadow: 0 0 18px rgba(77, 240, 255, 0.45);
}

/* 2026-10-04 第五輪:影片區塊結尾的標語(見 features.html 同日期的註解,
   說明為什麼要放、為什麼分兩個 <span>)。
   兩行都置中(text-align: center)。一開始第二行「但 Tavi 都在。」做成
   靠右對齊,使用者看過後要求也置中,所以拿掉原本的 .showcase-tagline-end
   靠右規則,整句統一置中。
   .feature-showcase 本來就是 text-align: center,這裡還是在 <p> 上明確寫一次,
   不依賴外層。max-width: 100% 避免超窄螢幕撐出橫向捲軸。
   顏色、發光沿用 .section-title 同一組(--hud-ice + 青色 text-shadow)。
   2026-10-04 調整:使用者要求「尾句要和發光次標一樣大」。原本字級用
   clamp(1.2rem, 2.4vw, 1.9rem)(桌機約 1.9rem、手機約 1.2rem),比
   .section-title 的 1.7rem 在手機上小很多、桌機上又略大。現在字級直接寫
   1.7rem,跟 .section-title 同一個數值(桌機 34px、手機約 28.9px,實測
   與標題一致);字距(原本 0.04em)也拿掉,.section-title 沒有加字距,
   留著會讓同樣字級的標語看起來比次標寬一圈。
   字級變大後,手機上第一行 15 個字(約 433px)超過可用寬度(約 356px),
   所以第一行在 features.html 裡拆成兩個 .phrase(「朋友不一定會陪你／
   玩每一款遊戲,」),換行只會落在詞組之間(見 .showcase-body 那段
   .phrase 的說明),不會從字中間折斷。
   如果之後次標(.section-title)的字級改了,記得這裡一併改成相同的值。 */
.showcase-tagline {
  display: block;
  max-width: 100%;
  margin: 6rem auto 0;
  text-align: center;
  font-family: var(--font-display);
  font-size: 1.7rem;
  font-weight: 800;
  line-height: 1.7;
  color: var(--hud-ice);
  text-shadow: 0 0 18px rgba(77, 240, 255, 0.55);
}

.showcase-tagline-line {
  display: block;
}

.showcase-tagline .phrase {
  display: inline-block;
  max-width: 100%;
}

@media (prefers-reduced-motion: reduce) {
  .showcase-poster,
  .showcase-play,
  .showcase-thumb {
    transition: none;
  }
}

@media (max-width: 720px) {
  .showcase-block {
    margin-top: 4.5rem;
  }

  .showcase-thumbs {
    gap: 0.8rem;
  }

  .showcase-thumb {
    flex: 0 0 calc(50% - 0.4rem);
    width: calc(50% - 0.4rem);
  }
}

/* ---------- Footer ---------- */

.site-footer {
  border-top: 1px solid var(--hud-line-dim);
  padding: 2rem 0;
  margin-top: 2rem;
  text-align: center;
  color: var(--hud-muted);
  font-size: 0.85rem;
}

.site-footer a {
  color: var(--hud-muted);
}

.site-footer .footer-tagline {
  color: var(--hud-line);
  font-family: var(--font-display);
  letter-spacing: 0.08em;
  font-weight: 700;
  margin-bottom: 0.4rem;
}

/* ---------- 跟隨游標的光點(2026-09-21 新增) ----------
   由 assets/site-motion.js 動態建立(不需要在 HTML 裡另外寫標籤),只在
   滑鼠類指標裝置(pointer:fine,例如桌機接滑鼠/觸控板)、且玩家系統沒有
   開啟「減少動態效果」時才會建立這個元素——手機、平板等觸控裝置的
   pointer 查詢結果不是 fine,site-motion.js 那段程式碼根本不會執行,
   不會佔用手機效能。純裝飾、pointer-events:none,不會擋到任何點擊。 */
.cursor-glow {
  position: fixed;
  top: 0;
  left: 0;
  width: 18rem;
  height: 18rem;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(77, 240, 255, 0.18), transparent 70%);
  pointer-events: none;
  z-index: 40;
  mix-blend-mode: screen;
}

@media (pointer: coarse) {
  .cursor-glow {
    display: none;
  }
}

/* ---------- 手機小螢幕微調(2026-09-19 新增) ----------
   版面本身大多用 rem/auto-fit grid,在手機上本來就會自動變成單欄、
   導覽列也會在 720px 以下收成漢堡選單(見上方 .nav-toggle),這裡
   額外針對「螢幕真的很窄」的情況微調間距,避免上下留白過多、
   精靈圖示佔比過大,讓手機瀏覽時更緊湊、不用一直往下滑。 */
@media (max-width: 480px) {
  .container {
    padding: 0 1rem;
  }

  .hero {
    padding: 3rem 0 2.25rem;
  }

  .hero-orb {
    width: 7rem;
    height: 7rem;
  }

  section {
    padding: 2.25rem 0;
  }
}

/* ---------- 減少動態效果(2026-09-21 新增) ----------
   玩家系統若開啟「減少動態效果」這項輔助功能偏好設定,這裡把捲動
   平滑捲動、呼吸光暈、捲動提示的動畫都關掉,只留最基本的靜態顯示——
   site-motion.js 裡的 GSAP 動畫也另外各自檢查了同一個偏好設定,兩邊
   一起確保有這項需求的玩家不會被閃爍或位移效果影響。 */
@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto;
  }

  .brand-orb .glow-layer,
  .hero-orb .glow-layer,
  .scroll-cue {
    animation: none;
  }
}

/* ---------- 條款/政策內文頁(2026-09-22 新增) ----------
   服務條款(terms.html)、隱私權政策(privacy.html)是長篇文字為主的頁面,
   直接套用 .container 的 --max-width(1600px)會讓每行字太長、很難讀。
   這裡加一個窄版內容容器,限制在接近一般書籍/文件的閱讀寬度,並且
   段落文字一律靠左對齊(.section-title 預設是置中,這兩頁的小節標題
   需要靠左讀起來才順,所以在 .legal-content 裡另外覆蓋)。
   這個 class 只有這兩頁會用到,不影響其他頁面既有的 .container 版面。 */
.legal-content {
  max-width: 42rem;
  margin: 0 auto;
}

.legal-content .section-title {
  text-align: left;
  font-size: 1.35rem;
  margin-top: 2.4rem;
}

.legal-content .section-title:first-child {
  margin-top: 0;
}

.legal-content h3 {
  font-family: var(--font-display);
  color: var(--hud-text);
  font-size: 1.05rem;
  margin: 1.4rem 0 0.5rem;
}

.legal-content p {
  color: var(--hud-muted);
  margin: 0 0 1rem;
}

.legal-content ul {
  color: var(--hud-muted);
  margin: 0 0 1rem;
  padding-left: 1.3rem;
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
}

.legal-content strong {
  color: var(--hud-text);
}

.legal-content .callout {
  text-align: left;
  margin-bottom: 1.6rem;
}

.legal-content .updated-at {
  color: var(--hud-line);
  font-size: 0.85rem;
  margin-bottom: 2.4rem;
}

/* ============================================================
   2026-10-15 新增:網站英文版(語言切換)相關樣式
   ============================================================
   1. 導覽列語言下拉選單(.nav-lang / .lang-select):放在「工作坊」右邊。
      桌機版 .nav-links 的連結間距是 gap: 1.6rem,使用者要求下拉選單離
      「工作坊」約一個全形空白(導覽文字字級 0.92rem,一個全形空白 ≈ 1em
      ≈ 0.92rem),所以用負的 margin-left 把實際間距收到 0.92rem
      (= 0.92rem - 1.6rem = -0.68rem)。
   2. 訂閱頁價格:NT$ 底下的美元參考金額(.plan-price-usd)與換算說明
      (.plans-note)。
   3. 法律頁英文版註記(.lang-notice):用 [data-show-lang="en"] 控制,只有
      <html lang="en">(英文)時才顯示。
   4. 「最多人選」是用 CSS ::before 的 content 寫的,不在 HTML 裡,英文要
      用 html[lang="en"] 另外覆蓋。 */
/* 2026-10-15(第二版):以「改版前」的導覽列為準——底線仍然比最後一個連結
   (工作坊)的右邊多出 2rem(改版前就是這個長度,因為 .nav-row 右內距是
   2rem),語言選單放在這條底線「結尾的旁邊」(線尾右側 --lang-g 處),
   選單底下沒有線。
   實作:桌機版把底線從 border-bottom 改成用背景漸層畫在 .nav-row 底部,
   長度 = 整條寬度 - 右內距 - 選單寬度 - 線尾與選單的距離。為了讓這個算式
   準確,語言選單用固定寬度(--lang-w),不靠內容撐寬。選單用
   margin-left 往右推,讓「工作坊右邊 → 線尾」剛好 2rem(--lang-tail)、
   「線尾 → 選單」剛好 --lang-g:
     margin-left = --lang-tail + --lang-g - 連結間距(flex gap)。
   手機版(≤720px)選單收進漢堡面板裡,維持原本整條底線。 */
.nav-lang {
  margin-left: calc(var(--lang-tail, 2rem) + var(--lang-g, 0.6rem) - 1.6rem);
}

/* 2026-10-15(第三版):使用者要求導覽連結 + 底線結尾 + 語言選單「整組往右移
   約三個全形空白」(一個全形空白 ≈ 連結字級 0.92rem,三個 ≈ 2.76rem)。
   做法:--shift 是右移量,.nav-links 用負的 margin-right 往右推(連帶選單),
   底線背景的長度同步加上 --shift,讓線尾跟連結的相對位置不變。
   但視窗寬度在 1680px 以內時,導覽列右邊就是視窗邊緣(只剩 2rem 內距),
   整組往右移太多會被切掉,所以 --shift 取「理想值(2.76rem)」與「還能用的
   空間」兩者的較小值:可用空間 = 視窗右邊多出的留白(max(0, (100vw - 1680px) / 2))
   + 1.25rem(2rem 內距扣掉要保留的 0.75rem 邊距)。
   結果:寬螢幕(約 1740px 以上)完整右移三個全形空白;較窄的視窗右移到
   「離視窗右緣還剩 0.75rem」為止。 */
.nav-row {
  --nav-pad: 2rem;
  --lang-w: 6.3rem;
  --lang-g: 0.6rem;
  --shift: min(2.76rem, calc(max(0px, (100vw - 1680px) / 2) + 1.25rem));
}

@media (min-width: 721px) {
  .nav-row {
    border-bottom-color: transparent;
    background: linear-gradient(var(--hud-line-dim), var(--hud-line-dim)) left bottom /
      calc(100% - var(--nav-pad) - var(--lang-w) - var(--lang-g) + var(--shift)) 1px no-repeat border-box;
  }

  .nav-links {
    margin-right: calc(-1 * var(--shift));
  }

  .lang-select {
    box-sizing: border-box;
    width: var(--lang-w);
  }
}

.lang-select {
  font: inherit;
  font-size: 0.85rem;
  font-weight: 600;
  letter-spacing: 0.03em;
  color: var(--hud-muted);
  background: rgba(2, 12, 22, 0.9);
  border: 1px solid var(--hud-line-dim);
  border-radius: 6px;
  padding: 0.25rem 0.5rem;
  cursor: pointer;
  transition: color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
}

.lang-select:hover,
.lang-select:focus-visible {
  color: var(--hud-text);
  border-color: var(--hud-line);
  box-shadow: 0 0 10px rgba(77, 240, 255, 0.35);
}

.lang-select:focus-visible {
  outline: 2px solid var(--hud-line);
  outline-offset: 2px;
}

.lang-select option {
  background: #0a2036;
  color: var(--hud-text);
}

@media (max-width: 720px) {
  .nav-lang {
    margin-left: 0;
    padding: 0.5rem 1.25rem 0.85rem;
    text-align: right;
  }

  .lang-select {
    font-size: 1.1rem;
    min-height: 2.75rem;
    padding: 0.4rem 0.75rem;
  }
}

.plan-price-usd {
  font-size: 0.95rem;
  color: var(--hud-muted);
  font-weight: 500;
  margin-top: -0.25rem;
}

.plans-note {
  text-align: center;
  font-size: 0.85rem;
  color: var(--hud-muted);
  margin-top: 1.1rem;
}

[data-show-lang] {
  display: none;
}

html[lang="en"] [data-show-lang="en"] {
  display: block;
}

.lang-notice {
  background: var(--hud-panel);
  border: 1px solid var(--hud-line-dim);
  border-radius: 8px;
  padding: 0.7rem 1rem;
  font-size: 0.9rem;
  color: var(--hud-muted);
  margin-bottom: 1rem;
}

html[lang="en"] .plan-card.featured::before {
  content: "Most popular";
}

/* 英文導覽文字比中文長,加上語言選單後,在「桌機橫排導覽列」還沒收成漢堡
   選單的最窄區間(721px ~ 900px)會比視窗寬(721px 時約多 50px)。
   只在英文版、這個區間把左右內距、連結間距、字級各縮一點;中文版沒有超出,
   維持原樣不動。 */
@media (min-width: 721px) and (max-width: 900px) {
  html[lang="en"] .nav-row {
    --nav-pad: 1.25rem;
    --lang-w: 5.6rem;
    --lang-g: 0.5rem;
    --shift: 0.5rem; /* 這個區間內距只有 1.25rem,右移量收小,選單才不會貼到視窗邊緣 */
    padding-left: 1.25rem;
    padding-right: 1.25rem;
  }

  html[lang="en"] .nav-links {
    gap: 0.5rem;
  }

  html[lang="en"] .nav-links a {
    font-size: 0.85rem;
    letter-spacing: 0.01em;
  }

  /* 這個區間連結間距縮成 0.5rem、線尾只多出 0.6rem,選單離線尾 0.5rem */
  html[lang="en"] .nav-lang {
    margin-left: calc(0.6rem + 0.5rem - 0.5rem);
  }

  html[lang="en"] .lang-select {
    font-size: 0.8rem;
    padding: 0.2rem 0.35rem;
  }
}

/* 2026-10-15:功能頁的標題/副標是把句子拆成一個個 .phrase(inline-block,
   HTML 裡相鄰詞組之間刻意不留空白,見上面 .phrase 的說明)。中文不需要字間空白,
   英文詞組之間要有空格,但 inline-block 邊緣的空白字元會被吃掉,所以英文版
   改用 margin 補一個空格寬度;最後一個詞組(含換行 <br> 前面那個)不補,
   避免置中文字被多出的空白推偏。 */
html[lang="en"] .phrase {
  margin-right: 0.28em;
}

html[lang="en"] .phrase:last-child,
html[lang="en"] .phrase:has(+ br) {
  margin-right: 0;
}

/* 2026-10-15:手機(≤480px)英文版「次數上限」比較表的欄標題比中文長
   (Full version / No API key set、Your own / API key),會比容器寬;
   英文版把欄位內距與字級再縮一點,讓 360~480px 都能整張放下
   (外層 .compare-table-wrap 本來就能橫向捲動,這是讓大多數手機不用捲)。 */
@media (max-width: 480px) {
  html[lang="en"] .compare-table th,
  html[lang="en"] .compare-table td {
    padding: 0.6rem 0.25rem;
    font-size: 0.78rem;
  }

  html[lang="en"] .compare-table th .th-sub {
    font-size: 0.68rem;
  }

  html[lang="en"] .compare-table-wrap {
    padding: 0.4rem 0.5rem;
  }
}

@media (max-width: 480px) {
  html[lang="en"] .limit-tag {
    padding-left: 0.5rem;
    padding-right: 0.5rem;
    font-size: 0.74rem;
    letter-spacing: 0;
  }

  html[lang="en"] .compare-table td:first-child {
    min-width: 0;
    width: 4.2rem;
  }
}
