/* ================================================================
   Board Sea Technology — 02-base.css
   reset / base 元素樣式 ＋ .reveal 動效原子（全站進場行為的唯一實作點）。

   ── 本檔是 styles.css（4,118 行）拆檔的第 2/5 段 ──
   拆檔只切不搬：五個檔案**依序串接回去逐位元組等於原檔**，層疊結果不變。
   由 includes/_head.php 依 01→05 的順序載入，**順序不可調換**。
   來源 banner 邊界見 git 歷史（2026-08-20 拆檔 commit）。
   ================================================================ */

/* ================================================================
   RESET / BASE
   ================================================================ */

*,
*::before,
*::after {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

html {
  /* Marcellus 僅發行 400，禁止瀏覽器對粗體請求做 faux bold 合成
     （DESIGN.md font.heading.single_weight 硬約束，交接契約 4-⑩） */
  font-synthesis: none;
  /* nav 錨點導覽平滑捲動（2026-08-18 派工單 Unit 2：修 nav 假連結）。
     reduced-motion 覆寫已由既有安全網涵蓋——見下方 @media
     (prefers-reduced-motion: reduce) 區塊內 *,*::before,*::after 的
     scroll-behavior: auto !important（該規則本身即涵蓋 html），未新增
     額外覆寫規則。iOS Safari pitfalls skill 核對：原生 scroll-behavior:
     smooth 屬「已修」項目（iOS 15.4+），非陷阱。 */
  scroll-behavior: smooth;
  /* Nav toggle 規格 E8：開選單不跳版。副作用（明講，不藏）：在有傳統捲軸的平台上，
     會讓不需捲動的短頁面也保留 15px 槽，全站置中內容因此左移約 7.5px——全站一致的
     常數位移，不是抖動；換來的是「開選單不跳版」。macOS overlay scrollbar 下此宣告
     無任何視覺影響。grep 已確認全檔原無此宣告，非覆寫既有值。 */
  scrollbar-gutter: stable;
}

body {
  font-family: var(--type-scale-body-family);
  font-size: var(--type-scale-body-size);
  line-height: var(--type-scale-body-line-height);
  color: var(--text-body);
  background-color: var(--surface-page);
  min-width: var(--min-width); /* DESIGN.md layout.min_width：通用最佳實務地板 */
  /* 2026-08-19 header stuck-glass（D30）：.site-header 由 position:sticky 改 fixed 後
     不再佔文件流空間，body 補一個常數 padding-top 頂住版面——常數值不隨 stuck 態變動，
     CLS by construction = 0。靜止態版面逐 px 不變：sticky 原佔 102px flow ≡
     fixed(0px flow) + body padding-top 102px，淨值相同，--hero-height 算式不受影響。 */
  padding-top: var(--header-height);
}

img,
picture,
svg,
video {
  max-width: 100%;
  height: auto;
  display: block;
}

@media (prefers-reduced-motion: reduce) {
  :root {
    /* token 層直接歸零：任何正確引用 motion-* token 的元件自動遵守，
       無須逐元件另寫 reduced-motion 例外（source: DESIGN.md motion.reduced_motion） */
    --motion-duration-hover: 0.01ms;
    --motion-duration-press: 0.01ms;
    --motion-duration-menu: 0.01ms;
    --motion-duration-slide: 0.01ms;
    --motion-duration-carousel: 0.01ms;
    --motion-duration-kenburns: 0.01ms; /* 顯式寫明，不倚賴下方安全網 */
    --motion-duration-enter: 0.01ms;
    --motion-duration-count: 0.01ms;
    --motion-stagger: 0ms;
    --motion-transform-enter: none;
    --motion-press-offset: 0; /* active 位移歸零的全部實作——元件層一律引用此 token，無須逐一寫 media query */
    --hero-kenburns-from: 1; /* 全域安全網只歸零 duration 不歸零位移（見下方 *,*::before,*::after
       規則），Ken Burns 若不 token 化振幅，會在 0.01ms 內跑完並凍結在 scale(1.06)（fill-mode:both）
       ——reduce 使用者反而拿到永久放大 6%、畫質降 6%、構圖被裁的圖。振幅走 token 歸零是唯一正解。 */
    --hero-kenburns-to: 1;
  }

  /* 安全網：涵蓋任何未經 token 化、直接寫 duration 的宣告 */
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    animation-timeline: auto !important; /* D43（spec-footer-marquee-revision-2026-08-19 §5.3）：scroll-driven
       animation 的 animation-duration 不受此安全網原本的覆寫約束（timeline 非 auto 時 duration 被忽略），
       補這行讓 __scrub 的 timeline 退回 document time，上面兩行才能接管。全站 scroll-driven animation
       消費者目前僅 .giant-marquee__scrub 一處，blast radius 為零。 */
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

/* 注意：carousel「改為即時跳位」與「進場動畫直接顯示終態」屬元件行為，
   由 Unit 2/3 建對應元件時一併處理，本層只負責把 duration 收斂到近零。 */

/* ================================================================
   MOTION ATOM — .reveal / .reveal-group（全站微動態規格 P6：捲動進場）
   全站進場行為的唯一實作點，8 個群組共用，本層只寫一次。

   三態（疊加，不設第三個）：
   1. .reveal（無 group class 介入）＝終態＝可見——no-JS／JS 失敗安全預設
   2. .reveal-group.is-armed .reveal＝隱藏起始態——is-armed 唯一帶 opacity:0
   3. .reveal-group.is-armed.is-revealed .reveal＝終態（同 1 視覺值）但帶
      transition；is-revealed 疊加在 is-armed 之上（不移除），4-class
      specificity (0,4,0) 自然蓋過狀態 2 的 (0,3,0)，不需 !important

   stagger：:nth-child(1) 不寫規則，沿用預設 delay:0；(2)/(3)/(n+4) 只覆寫
   transition-delay。delay 一律 calc(var(--motion-stagger) * n)——reduce 區塊
   歸零 --motion-stagger，走 token 才能在 reduce 下自動塌縮為 0。
   reduce 下：--motion-duration-enter／--motion-transform-enter 已在 :root
   reduce 區塊歸零，本層只消費 token，不重寫 media query（硬約束）。 */
.reveal {
  opacity: 1;
  transform: none;
}

.reveal-group.is-armed .reveal {
  opacity: 0;
  transform: var(--motion-transform-enter);
}

.reveal-group.is-armed.is-revealed .reveal {
  opacity: 1;
  transform: none;
  transition:
    opacity var(--motion-duration-enter) var(--motion-easing-standard),
    transform var(--motion-duration-enter) var(--motion-easing-standard);
}

.reveal-group.is-armed.is-revealed .reveal:nth-child(2) {
  transition-delay: calc(var(--motion-stagger) * 1);
}

.reveal-group.is-armed.is-revealed .reveal:nth-child(3) {
  transition-delay: calc(var(--motion-stagger) * 2);
}

.reveal-group.is-armed.is-revealed .reveal:nth-child(n+4) {
  transition-delay: calc(var(--motion-stagger) * 3);
}
