/* ============================================================================
   聽摘 TingZhai — 元件變體制 (Component Variants)
   ----------------------------------------------------------------------------
   這支檔案是全站按鈕／卡片／標籤的唯一定義來源。

   為什麼要有它（收斂前實測的數字，2026-08-12）：
     .btn  散在 6 個檔案共 40 個規則塊
           （styles.css×15、faq×8、sync×8、landing-b×5、welcome×3、episode×1）
     padding 至少四種：9px 20px／10px 20px／10px 24px／11px 26px
           ── 同一顆「開啟 App」在不同頁大小就是不一樣
     同一件事有三種命名：.outline／.btn-outline／.ghost
     .card 在 2 個檔案各寫一份、.chip 在 landing-b 與 deck 各長一套

   ----------------------------------------------------------------------------
   怎麼用（借 shadcn cva 的結構，但一行框架都沒有）：

     <a class="btn">主要動作</a>                  基底＝主要按鈕
     <a class="btn btn--outline">次要動作</a>      外框
     <a class="btn btn--ghost">最弱動作</a>        幽靈（只有框線）
     <button class="btn btn--danger">刪除</button>  危險
     <button class="btn btn--sm">小</button>        尺寸：sm ／（不加）md ／ lg

   舊 class 名一律照舊有效，HTML 一個字都不用改：
     .btn.outline ＝ .btn.btn-outline ＝ .btn--outline
     .btn.ghost                       ＝ .btn--ghost
     .btn.danger                      ＝ .btn--danger
     .btn.small                       ＝ .btn--sm
     .btn.btn-big                     ＝ .btn--lg

   ----------------------------------------------------------------------------
   兩個設計決定，先講清楚免得後人踩雷：

   1. 皮膚跟著主題走，不是跟著頁面走。
      行銷頁（faq／sync／welcome／landing-b）＝淺色，<html> 上沒有 data-theme；
      App 頁（index／episode／…）＝深色，<html data-theme="dark">。
      所以皮膚寫成 :where(html:not([data-theme])) 與 :where(html[data-theme="dark"])。
      用 :where() 是刻意的：它把選擇器權重壓成 0，主題皮膚跟變體一樣都是 (0,1,0)，
      誰在後面誰贏，順序即優先序，不會出現「主題把變體蓋掉」這種難查的坑。

   2. 變體只改 --btn-* 這組元件變數，不直接寫 background／color。
      基底一次把 var(--btn-*) 接到真正的屬性上，變體與各頁覆寫只要改變數。
      這樣「頁面專屬覆寫」也能安全參與（例如 landing-b 的主色按鈕），
      不會因為某一層寫死 box-shadow 而把 ghost 的「不要陰影」蓋回去。

   ----------------------------------------------------------------------------
   載入順序：tokens.css → components.css → styles.css／該頁 <style>。
   （後兩者才放頁面專屬覆寫，順序反了會整組失效。）
   ============================================================================ */


/* ────────────────────────────────────────────────────────────────────────────
   元件刻度 — 落不進 tokens.css 通用刻度的值放這裡
   tokens.css 的間距是 4 的倍數（4／8／12／16／24…），按鈕的內距天生落在半階上，
   硬塞進去反而會讓按鈕大幅變形。所以另外開一層元件刻度，數字集中在這一塊，
   之後要整體調按鈕大小只要改這裡，不用回去翻 6 個檔案。
   ──────────────────────────────────────────────────────────────────────────── */
:root {
  /* 按鈕內距 md：取收斂前四種值的中位數
     直向 9／10／10／11 → 10px；橫向 20／20／24／26 → 22px
     所以每一頁的按鈕最多只差 ±2px，沒有任何一頁被改到變形。 */
  --btn-py-md: 10px;
  --btn-px-md: 22px;

  /* sm：沿用 styles.css 既有值（index／episode 共 93 顆小按鈕，動它等於全站重排） */
  --btn-py-sm: 6px;
  --btn-px-sm: 13px;

  /* lg：沿用 welcome 的 .btn-big（首頁兩組主 CTA） */
  --btn-py-lg: 16px;
  --btn-px-lg: 40px;

  /* 圖示與文字的間隙。6px 不在 4 的倍數刻度上，但改成 8px 會動到
     App 頁上百顆帶圖示的按鈕，這一輪先原樣鎖住。 */
  --btn-gap: 6px;

  /* 卡片內距：沿用 App 端的 18px（sync 原本是 16px 18px，直向 +2px） */
  --card-pad: 18px;

  /* 標籤內距：沿用 landing-b 既有值（該頁 43 顆 chip，動它整排會重排） */
  --chip-py: 5px;
  --chip-px: 13px;
}


/* ════════════════════════════════════════════════════════════════════════════
   A. 按鈕基底
   ════════════════════════════════════════════════════════════════════════════ */
.btn {
  /* —— 變體介面：以下每一個變數都可以被變體或頁面覆寫 —— */
  --btn-bg:           var(--primary);
  --btn-fg:           var(--primary-fg);
  --btn-bd:           transparent;
  --btn-bw:           0px;                    /* 框線寬度 */
  --btn-py:           var(--btn-py-md);
  --btn-px:           var(--btn-px-md);
  --btn-fs:           var(--fs-base);
  --btn-fw:           700;
  --btn-shadow:       none;
  --btn-lift:         0px;                    /* hover 時上浮幾 px */
  --btn-bg-hover:     var(--primary-hover);
  --btn-fg-hover:     var(--btn-fg);
  --btn-bd-hover:     var(--btn-bd);
  --btn-shadow-hover: var(--btn-shadow);

  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--btn-gap);

  padding: var(--btn-py) var(--btn-px);
  border: var(--btn-bw) solid var(--btn-bd);
  border-radius: var(--r-full);

  background: var(--btn-bg);
  color: var(--btn-fg);
  box-shadow: var(--btn-shadow);

  font-family: inherit;
  font-size: var(--btn-fs);
  font-weight: var(--btn-fw);
  /* ⚠️ 這裡原本是 `white-space: nowrap`。
     它擋掉的是「本來就放得下卻硬要換行」，但也讓按鈕在使用者把系統文字
     放大時衝出視窗、被裁掉且捲不到（實測 200% 時「免費開始使用（送 3 小時）」
     超出 55px）。改成 normal——瀏覽器只在真的放不下時才換行，
     一般狀態的版面經逐元素比對完全不變。 */
  white-space: normal;
  max-width: 100%;
  text-decoration: none;

  cursor: pointer;
  touch-action: manipulation;
  transition:
    transform  0.22s var(--ease-spring),
    background 0.18s var(--ease-out),
    border-color 0.18s var(--ease-out),
    color      0.18s var(--ease-out),
    box-shadow 0.18s var(--ease-out),
    opacity    0.18s;
}

/* 註：line-height 刻意不設。
   各頁 body 的行高不一樣（App 1.7、faq 1.8、landing-b 1.7），
   在這裡釘死會讓按鈕高度整批位移好幾 px，屬於「明顯改變外觀」，留給下一輪處理。 */


/* ────────────────────────────────────────────────────────────────────────────
   B. 主題皮膚（基底層）
   放在變體之前：變體永遠贏得過主題，順序即優先序。
   ──────────────────────────────────────────────────────────────────────────── */

/* 淺色＝行銷頁：墨色實心 ＋ 2px 墨框，hover 轉硃紅並上浮 2px
   來源：faq／sync／welcome 三份一模一樣的定義。 */
:where(html:not([data-theme])) .btn {
  --btn-bg:       var(--fg);
  --btn-fg:       var(--bg);
  --btn-bd:       var(--fg);
  --btn-bw:       2px;
  --btn-lift:     -2px;
  --btn-bg-hover: var(--primary);
  --btn-fg-hover: var(--bg);
  --btn-bd-hover: var(--primary);
}

/* 深色＝App 頁：硃紅漸層 ＋ 光暈（原 styles.css 的 .btn:not(.outline):not(.danger)）
   hover 只加強光暈、不換底色 —— 這是收斂前的實際行為，照抄。 */
:where(html[data-theme="dark"]) .btn {
  --btn-bg:           linear-gradient(145deg, #f2613a, #d94f2b);
  --btn-fg:           #fff;
  --btn-bg-hover:     linear-gradient(145deg, #f2613a, #d94f2b);
  --btn-shadow:       0 4px 16px rgba(242,97,58,0.30), inset 0 1px 0 rgba(255,255,255,0.2);
  --btn-shadow-hover: 0 6px 22px rgba(242,97,58,0.42), inset 0 1px 0 rgba(255,255,255,0.25);
}


/* ────────────────────────────────────────────────────────────────────────────
   C. 狀態
   ──────────────────────────────────────────────────────────────────────────── */
.btn:hover {
  background: var(--btn-bg-hover);
  color: var(--btn-fg-hover);
  border-color: var(--btn-bd-hover);
  box-shadow: var(--btn-shadow-hover);
  transform: translateY(var(--btn-lift));
}

/* 按下瞬間縮 0.96，做出原生 App 的壓感（原本只有 App 頁有，現在行銷頁也吃得到） */
.btn:active:not(:disabled):not([aria-disabled="true"]) {
  transform: scale(0.96);
}

.btn:disabled,
.btn[disabled],
.btn[aria-disabled="true"] {
  opacity: 0.5;
  pointer-events: none;
}

/* 焦點環：tokens.css 已有 :where() 全域版，這裡再寫一次是為了讓 .btn 一定壓得過
   任何舊的頁面樣式（鍵盤使用者看不到焦點＝可用性 bug，不是外觀偏好）。 */
.btn:focus-visible {
  outline: 2px solid var(--primary);
  outline-offset: 2px;
}


/* ────────────────────────────────────────────────────────────────────────────
   D. 尺寸變體
   ──────────────────────────────────────────────────────────────────────────── */
.btn--sm,
.btn.small {
  --btn-py: var(--btn-py-sm);
  --btn-px: var(--btn-px-sm);
  --btn-fs: var(--fs-sm);
}

.btn--lg,
.btn.btn-big {
  --btn-py: var(--btn-py-lg);
  --btn-px: var(--btn-px-lg);
  --btn-fs: var(--fs-md);
}


/* ────────────────────────────────────────────────────────────────────────────
   E. 樣式變體
   每個變體依序寫「通用 → 淺色 → 深色」，同權重、後者贏，
   而任一頁只會命中其中一個主題，所以不會互相打架。
   ──────────────────────────────────────────────────────────────────────────── */

/* ── outline：次要動作 ──
   淺色頁不必另外寫：框線寬度與框色沿用上面的淺色皮膚（透明底＋墨框、hover 轉硃紅框），
   跟收斂前 faq／sync／welcome 的行為一模一樣。 */
.btn--outline,
.btn.outline,
.btn.btn-outline {
  --btn-bg:           transparent;
  --btn-fg:           var(--fg);
  --btn-shadow:       none;
  --btn-shadow-hover: none;
  --btn-bg-hover:     var(--fg);
  --btn-fg-hover:     var(--bg);
}
/* 深色：App 端的 outline 其實是「灰底無框」，不是真的外框（styles.css 原樣）。
   色票刻意用舊別名 var(--ink)：styles.css 目前把它覆寫成 #f2efe9（token 是 #f4ece3），
   改用 --fg 會讓 57 顆按鈕的字色跟著變，那不屬於這一輪的範圍。 */
:where(html[data-theme="dark"]) .btn--outline,
:where(html[data-theme="dark"]) .btn.outline,
:where(html[data-theme="dark"]) .btn.btn-outline {
  --btn-bg:       var(--surface-2);
  --btn-fg:       var(--ink);
  --btn-bd:       transparent;
  --btn-bw:       0px;
  --btn-bg-hover: var(--surface-3);
  --btn-fg-hover: var(--ink);
}

/* ── ghost：最弱動作，只有一條細框（來源：landing-b 的 .ghost） ── */
.btn--ghost,
.btn.ghost {
  --btn-bg:           transparent;
  --btn-fg:           var(--fg);
  --btn-bd:           var(--fg);
  --btn-bw:           1.5px;
  --btn-shadow:       none;
  --btn-shadow-hover: none;
  --btn-bg-hover:     transparent;
  --btn-fg-hover:     var(--primary);
  --btn-bd-hover:     var(--primary);
}

/* ── danger：破壞性動作。深色 App 頁專用，行銷頁沒有用到 ── */
.btn--danger,
.btn.danger {
  --btn-bg:           var(--surface-2);
  --btn-fg:           var(--vermillion-ink);   /* 文字用 -ink 版（第 33 輪拆的）；第 34 輪已收斂掉 styles.css 的覆寫 */
  --btn-bd:           transparent;
  --btn-bw:           0px;
  --btn-shadow:       none;
  --btn-shadow-hover: none;
  /* 收斂前 danger 的 hover 完全沒有回饋（被同權重規則互相蓋掉），這裡補上最輕的一階 */
  --btn-bg-hover:     var(--surface-3);
  --btn-fg-hover:     var(--vermillion);
}


/* ════════════════════════════════════════════════════════════════════════════
   F. 卡片
   來源：styles.css 的 .card（＋第 448 行的景深群組）與 sync.html 的 .card。
   註：目前全站 13 個 .card 都是「一個容器裝自由內容」，
       沒有任何一頁有 header／body／title／desc 的固定結構，
       所以刻意不生 .card__header 這類子元素樣式 —— 那會是沒人用的死 CSS。
       等真的出現重複結構再補。
   ════════════════════════════════════════════════════════════════════════════ */
.card {
  background: var(--surface-1);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  padding: var(--card-pad);
  transition:
    transform  0.25s var(--ease-spring),
    background 0.18s var(--ease-out),
    box-shadow 0.25s var(--ease-out);
}

/* 深色：頂緣受光 hairline ＋ 由上而下微漸層 ＋ 柔陰影（App 端的景深系統） */
:where(html[data-theme="dark"]) .card {
  background: linear-gradient(180deg, var(--surface-2), var(--surface-1));
  border-top-color: var(--line-strong);
  box-shadow: var(--shadow-sm), var(--shadow-md);
}


/* ════════════════════════════════════════════════════════════════════════════
   G. 標籤 chip
   來源：landing-b 的 .chip（唯一一份完整定義）。
   deck.html 的 .bcard .chip 是另一種東西（顏色由 JS 逐顆內嵌），
   在該頁保留區域覆寫，不強行合併。
   註：margin 刻意不放進元件 —— 那是版面的事，留在 landing-b。
   ════════════════════════════════════════════════════════════════════════════ */
.chip {
  display: inline-block;
  padding: var(--chip-py) var(--chip-px);
  border: 1px solid var(--line);
  border-radius: var(--r-full);
  background: var(--surface);
  color: var(--fg-muted);
  font-size: var(--fs-xs);
  font-weight: 700;
  letter-spacing: 0.1em;
}

/* 選中態。⚠️ 目前沒有任何一頁用到，是替「可篩選的 chip 列」預留的正式寫法，
   免得下次有人又在頁面裡自己發明一個 .chip.on。 */
.chip--active {
  border-color: var(--primary);
  background: var(--primary);
  color: var(--primary-fg);
}
