/*
 * 夜のバンド（.night）＝ヒーロー〜DIVISIONS の共通の暗い地。
 * 金の S 字光跡（.trajectory）がこの中を縦断し、スクロール進行で stroke が引かれる（演出#1）。
 * ヒーローの満月・姫路城シルエット・触れるヨーヨー・カウントダウンもここに含む。
 */

/* ================= 夜のバンド ================= */
/* FB0715ラウンド3 キュー19（mos「ニュースセクションやディビジョンズセクションでヨーヨーが
   手前に来てる。話が違う」）: 根治はこの isolation:isolate の撤去。理由:
   .night は position:relative + isolation:isolate で独立したスタッキングコンテキストを
   作っていたため、.night の内側にある「.night .shell { z-index:2 }」（hero.css内・下記参照）は
   .night という1つの箱の中だけで完結する内部順位でしかなく、.night の外（<main class="front">
   の直下）に置かれている .trajectory-webgl-stage（z-index:1）とは一切競合できなかった。
   結果、.night 全体（背景も z:2 に持ち上げたはずの本文も丸ごと）が、.night 自身の
   スタック値（position:relative・z-index:auto＝stack level 0）でしか外側と比較されず、
   canvas側の明示的な正のz-index(1)に対して常に負ける＝News/Contest Info/Divisions配下の
   本文（.shell）にヨーヨーが乗って見えていた（過去ラウンドで .division__card だけに
   z-index:2を追加で足す対症療法を試みたが、そもそも .night の isolation がある限り
   どんな子孫にz-indexを足しても外へは絶対に効かないため根治しなかった）。
   isolation を外すことで、.night 配下の「.night .shell」z:2 ルールが .trajectory-webgl-stage
   と同じ祖先スタッキングコンテキストで直接競合できるようになり、SCHEDULE/VISIT/SPONSORS
   （.night の外＝もともとこの isolation の影響を受けておらず、個別のz:2ルールが機能していた
   帯）と同じ仕組みで自然に解決する。mix-blend-mode を使うレイヤー（.hero__bg-layer等）は
   個別に isolation:isolate を持っているため、この撤去による副作用はない（別途確認済み）。 */
.night {
  position: relative;
  background:
    radial-gradient(120% 60% at 78% 8%, rgb(24 60 120 / 0.35) 0%, transparent 55%),
    linear-gradient(180deg, var(--night-sky-top) 0%, var(--night-sky) 22%, var(--night-0) 60%, var(--night-1) 100%);
  /* G4: 夜バンドの view progress を名前付きタイムラインとして公開。軌跡繊維の描き進み（SDA）が参照する。
     app.js のヨーヨー進行式（cover 6%〜80%）とレンジを一致させてある。 */
  view-timeline-name: --wyyc-night;
  view-timeline-axis: block;
}
/* 極淡い青海波テクスチャ＋粒状感で「布の夜」を出す（B案の全面テクスチャは持ち込まない）。
   F7（2026-07-11）: 以前は mix-blend-mode:screen を使っていたが、ブレンドは背後が変わるたびに
   再合成が要る＝スクロール中ずっと合成コストがかかる。opacity 0.09 の極淡テクスチャでは
   通常合成でも見た目はほぼ同じなので、ブレンドをやめて静的レイヤーとして焼く（合成負荷を削る）。 */
.night::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: 0;
  background-image: url(../images/pattern_seigaiha_dark.webp);
  background-size: 300px 300px;
  opacity: 0.08;
  pointer-events: none;
}

/* 金の S 字光跡（セクション跨ぎ・#P7-3で復活）。ヒーロー背景の一枚絵には光跡が焼き込まれているので、
 * ヒーロー領域だけをマスクで伏せて二重を避け、その下の News→入口→HEADLINERS→DIVISIONS を貫く
 * 連続した金の軌跡として見せる（原案「軌跡の夜」の核）。svh でヒーロー(min-height:100svh)の下端に合わせて
 * フェードインさせる。.section-arc は各セクション入口の補助アクセントに格下げ。 */
.trajectory {
  display: block;
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  z-index: 1;
  pointer-events: none;
  overflow: visible;
  -webkit-mask-image: linear-gradient(to bottom, transparent calc(100svh - 260px), #000 calc(100svh + 40px));
  mask-image: linear-gradient(to bottom, transparent calc(100svh - 260px), #000 calc(100svh + 40px));
}
/* ================= G3: 束なる光の繊維（2026-07-11b） =================
 * 一本線でなく、共通のS字（#trajBase）を <use> で数本引いた「束なる光の線」。glow は drop-shadow
 * フィルタを使わず、太幅faint（halo）×細幅bright（core）の重ね描きで表現する。フィルタが無いので、
 * 描き進み中に stroke-dashoffset が動いても paint が軽い＝F7で根治したカクつきを再発させない。 */
.trajectory__fiber {
  fill: none;
  stroke-linecap: round;
  stroke-dasharray: 1;          /* pathLength=1 正規化 */
  stroke-dashoffset: 0;          /* 既定（JS無効・SDA非対応・reduced）は全描画 */
}
.trajectory__fiber--halo {
  stroke: var(--color-gold);
  stroke-width: 5.4;
  opacity: 0.14;
}
.trajectory__fiber--core {
  stroke: var(--color-gold-light);
  stroke-width: 1.5;
  opacity: 0.88;
}

/* ================= FB0712 V1〜V3: WebGL版 軌跡+3Dヨーヨー・ステージ =================
 * 旧SVG光跡（.trajectory）＋旧CSSヨーヨー（.trajectory-yoyo）は「WebGL不可・JS無効・
 * reduced-motion」時の静的フォールバック（V5）としてそのまま残す。WebGLが実際に初期化に
 * 成功したときだけ app.js が <html> に .wyyc-webgl-active を付け、このブロックで旧2系統を
 * 非表示にして新WebGL系統（1系統のみ）へ完全に切り替える（V1: 二本立て駆動の廃止）。
 *
 * FB0715ラウンド3（mos「白背景でヨーヨーが止まっている・フッターまで続いてほしい」）:
 * ステージ(.trajectory-webgl-stage)の絶対配置の基準を .night から <main data-traj-range>
 * （ヒーロー〜SPONSORS帯の末尾まで＝front-page.php参照）へ拡張した。実体のcanvasはその内側で
 * position:sticky; top:0; height:100vh とし、「data-traj-range を縦断してスクロールする間は
 * ビューポートに固定されたキャンバスの中で3Dシーンだけが進む」古典的なピン留め
 * スクローリーテリング構成にする。これにより、
 *   - canvasの実サイズは常にビューポート相当（data-traj-rangeの全高ぶんの巨大canvasにしない）＝
 *     大きなWebGLフレームバッファを毎フレーム再ラスタライズするコストを避け、CWV予算を守る。
 *   - 「data-traj-rangeがビューポートにある間は必ずヨーヨーが画面内にある」がジオメトリの
 *     都合でなく構造そのもので保証される（V2）。 */
.front {
  position: relative; /* .trajectory-webgl-stage の inset:0 の基準（.trajectory-webgl-stageが
    positionを持つ最も近い祖先になるようにする）。 */
}
/* FB0715ラウンド3 キュー17再差し戻し（team-lead実機検証: 「差が一定＝いつまでも縮まらない」の
   指摘。sticky解除後はcanvas（＝ヨーヨーの画面位置）とfooter上端が同速で上昇するため、
   注視点Yのオフセットだけではギャップは絶対に0にならず、遮蔽は幾何学的に起こり得ない）:
   根治は「stickyの解除自体をfooterの高さぶん遅らせる」こと。.trajectory-webgl-stage
   （sticky canvasの containing block）の下端を、mainの下端からfooterの実高さぶん
   （--wyyc-footer-h・app.jsがResizeObserverで実測してセット）だけ下へ延長する。
   これにより、footerがビューポートを下から上がってくる間もcanvasはstickyのまま画面に
   固定され続け（ヨーヨーはp=1クランプで停留したまま動かない）、footer（z:2・不透明背景、
   canvasのz:1より手前）が画面下から通過する間、本当にヨーヨーの上に重なって覆い隠す。
   stageのこの延長ぶん（footer背面に隠れる領域）はz-index的にfooterの奥（z:1<z:2）に
   潜るだけなので見た目の副作用はない。--wyyc-footer-h未セット時（JS無効等）は0pxに
   フォールバックし、旧来どおりmainの下端でstickyが解除される（崩れない）。 */
.trajectory-webgl-stage {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: calc(-1 * var(--wyyc-footer-h, 0px));
  z-index: var(--z-trajectory, 1);
  pointer-events: none;
  /* overflow:hidden をここに置かない: sticky な子（canvas）の「最も近いスクロール祖先」が
     このボックス自身になってしまい、ビューポートへピン留めされず.frontと一緒に流れてしまう
     （実機検証で発覚。canvasRect.top が nightRect.top と常に一致＝stickyが無効化されていた）。 */
}
.trajectory-webgl {
  display: block;
  position: sticky;
  top: 0;
  width: 100%;
  height: 100svh;
}
html:not(.wyyc-webgl-active) .trajectory-webgl-stage { display: none; }
.wyyc-webgl-active .trajectory,
.wyyc-webgl-active .trajectory-yoyo {
  display: none;
}

/* ================= G4: スクロール連動の描き進み（2026-07-11b） =================
 * scroll-driven animation（view timeline）で stroke-dashoffset を browser 側に動かす。
 * JS の毎フレーム path 書き換えはしない（F7の教訓）。対応ブラウザ（Chrome 等）でのみ発火し、
 * 非対応（Firefox/Safari 等）は全描画のまま＝崩れなし。range はヨーヨーの JS 進行式と一致させてある。 */
@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {
    /* 描き進みは「細幅の core 繊維」だけに掛ける。太幅 halo は常時薄く全描画のまま（軌跡の残り香）に
       しておくことで、毎フレーム再描画される領域を細いストロークだけに絞る＝paint を軽く保つ
       （F7で根治したカクつきを再発させないための肝）。
       FB0712 V1: WebGL系統が有効な間はこの旧SDA描き進みを止める（二本立て駆動を防ぐ。
       .wyyc-webgl-active 側で要素自体も display:none にしているため視覚的には無害だが、
       「動いている系統は常に1つだけ」を CSS 側でも明示する）。 */
    .wyyc-js:not(.wyyc-webgl-active) .trajectory__fiber--core {
      stroke-dashoffset: 1;
      animation: wyyc-traj-draw linear both;
      animation-timeline: --wyyc-night; /* .night の view progress を参照 */
      animation-range: cover 6% cover 80%;
    }
    @keyframes wyyc-traj-draw {
      from { stroke-dashoffset: 1; }
      to   { stroke-dashoffset: 0; }
    }
  }
}

/* ================= G2→M1/M5: 軌跡を転がる3D手車ヨーヨー（FB0711c・2026-07-12） =================
 * 意匠は日本玩具博物館「手車」の再解釈（feedback/2026-07-12-sora-line/ヨーヨー.jpg）:
 * 木製・同心円の縞（赤ベース＋生成り＋差し色の緑）・2枚の円盤と深い溝・綿紐。水風船ヨーヨー風は撤去。
 * 位置は app.js が軌跡パスの幾何から transform で載せる（compositor完結・path非書換。M2で quickTo の
 * イージング遅延を撤去し、スクロール位置と同一フレームで直接 gsap.set する＝軌跡描き先端との desync 根治）。
 * 3D奥行き（M5）は S字のカーブのきつさから算出したバンク（rotateY）・前傾（rotateX）・迫り/退きの
 * スケールを .trajectory-yoyo__disc に、回転（自転）は .trajectory-yoyo__ball に分離して掛ける
 * （perspective は .trajectory-yoyo 自身が持つ＝子の3D変形を有効化）。
 * 既定は原点・非表示で、JSが is-ready を付けてフェードイン（初期のちら見え防止）。JS無効は display:none。
 * 終端到達で .is-finale が付き金色に光る（フィナーレ）。 */
.trajectory-yoyo {
  position: absolute;
  top: 0;
  left: 0;
  z-index: 3;
  width: clamp(30px, 4.2vw, 50px);
  aspect-ratio: 1;
  pointer-events: none;
  will-change: transform;
  opacity: 0;
  perspective: 280px;
  transition: opacity 320ms var(--ease-out-expo);
}
.trajectory-yoyo.is-ready { opacity: 1; }
html:not(.wyyc-js) .trajectory-yoyo { display: none; }

/* 3Dバンク（M5）を担う層。回転（自転=.__ball）とは独立させ、カーブに沿った傾き/迫り出しだけを持つ。
   transform は JS が毎フレーム直接 gsap.set（イージングなし）で確定する＝スクロール位置と1:1。 */
.trajectory-yoyo__disc {
  position: absolute;
  inset: 0;
  transform-style: preserve-3d;
}

/* 奥の円盤（M1: 2枚の円盤と深い溝の再現）。手前の面よりわずかに小さく・暗く・奥（-Z）へ置き、
   バンク時に縁からのぞかせて「厚みのある2枚組」を感じさせる。静的な木口色のみ＝再描画コストなし。 */
.trajectory-yoyo__rim-back {
  position: absolute;
  inset: 8%;
  border-radius: 50%;
  background: radial-gradient(circle at 40% 32%, #5c3a20, #3c2412 70%, #2a180a 100%);
  transform: translateZ(-3.5px) scale(0.94);
}

/* 手前の円盤の面（自転する木製ディスク本体）。同心円の縞＝赤ベース＋生成り＋差し色の深緑
   （手車の意匠を再解釈。特定メーカー品を模さない抽象パターン）。回転は --roll を rotate() に。 */
.trajectory-yoyo__ball {
  position: absolute;
  inset: 0;
  border-radius: 50%;
  background:
    radial-gradient(circle at 38% 34%, rgba(255, 255, 255, 0.22), transparent 30%),
    radial-gradient(circle at 50% 50%,
      #5c3016 0%, #5c3016 5%,
      #a8332a 5%, #a8332a 9%,
      #f1e2bd 9%, #f1e2bd 16%,
      #8f2c24 16%, #8f2c24 35%,
      #f1e2bd 35%, #f1e2bd 41%,
      #33573f 41%, #33573f 47%,
      #f1e2bd 47%, #f1e2bd 53%,
      #8f2c24 53%, #8f2c24 82%,
      #6b4726 82%, #6b4726 100%
    );
  box-shadow:
    inset 0 0 0 2px rgba(42, 22, 10, 0.55),
    inset -3px -4px 7px rgba(30, 14, 6, 0.45),
    inset 2px 3px 5px rgba(255, 235, 190, 0.22),
    0 4px 10px rgba(0, 0, 0, 0.38);
  transform: rotate(var(--roll, 0deg));
  transform-origin: 50% 50%;
}
.trajectory-yoyo__sheen {
  position: absolute;
  left: 20%;
  top: 13%;
  width: 30%;
  height: 22%;
  border-radius: 50%;
  background: radial-gradient(circle at 42% 42%, rgba(255, 250, 235, 0.55), transparent 72%);
  mix-blend-mode: soft-light;
}
/* 綿紐（M1: 輪ゴムでなく綿紐の風合い）。玉の回転とは独立に上向きで固定し、先端に小さな木の玉飾り。 */
.trajectory-yoyo__string {
  position: absolute;
  left: 50%;
  top: -34%;
  width: 22%;
  height: 42%;
  transform: translateX(-50%);
  border: 1.7px solid rgba(238, 226, 202, 0.82);
  border-bottom: none;
  border-radius: 50% 50% 42% 42%;
}
.trajectory-yoyo__string::after {
  content: '';
  position: absolute;
  left: 50%;
  top: -12%;
  width: 26%;
  height: 26%;
  transform: translate(-50%, -50%);
  border-radius: 50%;
  background: radial-gradient(circle at 38% 32%, #d8bd8e, #8f6a3c 75%);
}
/* フィナーレの金光（既定は消灯）。 */
.trajectory-yoyo__glow {
  position: absolute;
  inset: -45%;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(240, 216, 120, 0.85), rgba(216, 168, 96, 0.38) 46%, transparent 70%);
  opacity: 0;
  transition: opacity 480ms var(--ease-out-expo);
}
.trajectory-yoyo.is-finale .trajectory-yoyo__glow { opacity: 1; }
.trajectory-yoyo.is-finale .trajectory-yoyo__ball {
  background:
    radial-gradient(circle at 38% 34%, rgba(255, 255, 255, 0.3), transparent 30%),
    radial-gradient(circle at 50% 50%,
      #6b4a12 0%, #6b4a12 5%,
      #e8b840 5%, #e8b840 9%,
      #fdf3d6 9%, #fdf3d6 16%,
      #d89a2e 16%, #d89a2e 35%,
      #fdf3d6 35%, #fdf3d6 41%,
      #b9791f 41%, #b9791f 47%,
      #fdf3d6 47%, #fdf3d6 53%,
      #d89a2e 53%, #d89a2e 82%,
      #8a611c 82%, #8a611c 100%
    );
  box-shadow:
    inset 0 0 0 2px rgba(90, 58, 10, 0.5),
    inset -3px -4px 7px rgba(70, 40, 5, 0.4),
    inset 2px 3px 5px rgba(255, 245, 200, 0.4),
    0 0 18px rgba(240, 216, 120, 0.9),
    0 0 34px rgba(216, 168, 96, 0.6);
}
.trajectory-yoyo.is-finale .trajectory-yoyo__rim-back {
  background: radial-gradient(circle at 40% 32%, #a3781f, #6b4a12 70%, #4a3208 100%);
}
@media (prefers-reduced-motion: reduce) {
  .trajectory-yoyo { transition: none; }
}

/* ================= パーティクルの散り（F11復活・新演出へ統合・2026-07-11b） =================
 * 二層構成: (1) trajectory-fx = 軌跡帯に沿ってふわり立ち上る金粒のアンビエント散り（CSSキーフレーム）。
 *           (2) trajectory-spark = ヨーヨーの転がりに伴い現在地から散る火花（app.js が WAAPI で動かす）。
 * いずれも transform/opacity のみ＝compositor 完結。ヒーロー上端は背景写真が主役なのでマスクで伏せる。 */
.trajectory-fx {
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  overflow: hidden;
  -webkit-mask-image: linear-gradient(to bottom, transparent calc(100svh - 120px), #000 calc(100svh + 120px));
  mask-image: linear-gradient(to bottom, transparent calc(100svh - 120px), #000 calc(100svh + 120px));
}
/* M4（FB0711c）: 粒の存在感強化。サイズ・輝度・振り幅は app.js 側の生成レンジで底上げし、
   ここでは芯（core）に加えて外周のふんわりした光暈（halo）を重ね、輝度の見え方に厚みを持たせる。
   halo は静的な background 値のみ＝transform/opacity と独立で再計算されない（compositor 負荷なし）。 */
.trajectory-fx__p {
  position: absolute;
  left: var(--px, 50%);
  top: var(--py, 50%);
  width: var(--size, 5px);
  height: var(--size, 5px);
  border-radius: 50%;
  background: radial-gradient(circle at 40% 35%, #fff8e6, var(--color-gold-light) 42%, var(--color-gold) 62%, transparent 76%);
  box-shadow: 0 0 calc(var(--size, 5px) * 1.6) calc(var(--size, 5px) * 0.35) rgba(240, 208, 128, 0.55);
  opacity: 0;
  will-change: transform, opacity;
  transform: translate3d(0, 0, 0) scale(0.4);
}
@keyframes wyyc-particle-rise {
  0%   { opacity: 0; transform: translate3d(0, 0, 0) scale(0.35); }
  12%  { opacity: var(--peak, 0.9); }
  70%  { opacity: var(--peak, 0.9); }
  100% { opacity: 0; transform: translate3d(var(--dx, 6px), calc(-1 * var(--rise, 90px)), 0) scale(1); }
}
.trajectory-fx.is-active .trajectory-fx__p {
  animation: wyyc-particle-rise var(--dur, 4.2s) var(--ease-out-expo) var(--delay, 0s) infinite;
}

/* ヨーヨー火花のプール。基準は原点で、app.js の WAAPI が transform で現在地へ飛ばして散らす。 */
/* FB0715ラウンド3 キュー11（mos「パーティクルだけが一番手前に出ていて要素の邪魔をしている」）:
   z-index 4→1へ引き下げた（trajectory-webgl-stageと同じ層）。旧z:4は「ヨーヨー(旧z3=CSS版
   .trajectory-yoyoの値)の少し上で散る」という、WebGL化前の古いz階層を前提にした値が
   そのまま残っていたもの。現在はWebGL単一系統でヨーヨー自体もcanvas内部（z:1）に統合済みなので、
   火花もその層に揃え、すべてのページ本文（sections.cssのセクション一括z:2ルール）より
   背面にする。 */
.trajectory-sparks {
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  overflow: hidden;
}
/* M4: 火花本体を4px→6pxへ増量し、静的な box-shadow の光暈で輝度を底上げ（transform/opacity のみが
   フレームごとに動く＝box-shadowは固定値なので compositor 負荷に影響しない）。 */
.trajectory-spark {
  position: absolute;
  left: 0;
  top: 0;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: radial-gradient(circle at 40% 35%, #fffaf0, #fff4d6 38%, var(--color-gold) 62%, transparent 76%);
  box-shadow: 0 0 9px 1.5px rgba(240, 208, 128, 0.6);
  opacity: 0; /* 既定は不可視。WAAPI 実行時のみ光る */
  will-change: transform, opacity;
}
@media (prefers-reduced-motion: reduce) {
  /* 減モーションでは散りを出さない（app.js も生成しないが CSS でも二重に伏せる）。 */
  .trajectory-fx,
  .trajectory-sparks {
    display: none;
  }
}

/* 各セクション入口の短い金の弧（光跡の分解・docs/06）。全幅で表示し、
 * ヒーロー背景の光跡から下部セクションへの連続感を担う。 */
.section-arc {
  display: block;
  padding-top: clamp(2rem, 6vw, 3rem);
}
.section-arc svg {
  width: 120px;
  height: 24px;
  margin: 0 auto;
}
/* D-6: schedule__seam と同じ seam 方式。既定（JS無効）は全描画で見せ、.wyyc-js のときだけ
   初期を隠してビューポート進入で1回だけ引く（section-arc / player__orbit / footer 光跡で方式統一）。 */
.section-arc__path {
  stroke-dasharray: 1;
  stroke-dashoffset: 0; /* 既定（JS無効）は全描画で見せる */
  filter: drop-shadow(0 0 4px rgb(216 177 96 / 0.5));
}
.wyyc-js .section-arc__path {
  stroke-dashoffset: 1;
}
.wyyc-js .section-arc.is-visible .section-arc__path {
  transition: stroke-dashoffset 900ms var(--ease-out-expo);
  stroke-dashoffset: 0;
}

/* 夜バンド内セクションのコンテンツは光跡より前面 */
.night .shell,
.hero__content {
  position: relative;
  z-index: 2;
}

/* ================= ヒーロー ================= */
/* FB0715ラウンド2追加（mos「ナビバー分だけヒーローが下にずれてSCROLLが見えていない」）:
   .masthead は position:sticky（フローに参加＝常に --masthead-h ぶんの高さを占有する）なのに、
   .hero は min-height:100svh（ビューポート丸ごと）を要求していたため、ファーストビューが
   masthead-hぶん超過し、ヒーロー下端の.hero__scrollがビューポート外に押し出されていた。
   さらに padding-top に var(--masthead-h) を加算していたのは、masthead が position:fixed
   （コンテンツに重なるオーバーレイ）だった旧設計を前提にした「固定ヘッダーの下に隠れないための
   余白」で、sticky化（フロー内・スペース占有）済みの現在は二重に効いて逆効果だった。
   min-heightから masthead-h を差し引き、padding-top の加算分を撤去して、
   masthead(sticky・実高さ)+hero(100svh-masthead-h) = ちょうど1ビューポート(100svh) に揃えた。 */
.hero {
  position: relative;
  min-height: calc(100svh - var(--masthead-h));
  display: flex;
  align-items: center;
  padding: clamp(1rem, 4vh, 3rem) 0 clamp(3rem, 10vh, 6rem);
  overflow: hidden;
}

/* ================= ヒーロー背景カルーセル（過去大会の実写） =================
 * 実写6枚をクロスフェード（opacity のみ＝コンポジタフレンドリー）。素材は無加工のまま、
 * 夜/藍/金のブランドトーンへは CSSフィルター＋オーバーレイで寄せる。トーン合わせの値は
 * .hero の --hero-photo-* / --hero-tint-* / --hero-scrim-* に集約し、後から調整できる。
 * 下辺は .night の夜へ羽化して繋ぐ（矩形の境界を出さない）。 */
.hero {
  --hero-photo-brightness: 0.6;   /* 夜へ沈める明度 */
  --hero-photo-saturate: 0.8;     /* わずかに彩度を落として派手さを抑える */
  --hero-photo-contrast: 1.05;
  --hero-tint-color: 21 50 99;    /* 藍寄せの色被せ（--color-ai 近傍の rgb 値。FB0715 C でフライヤー実測に追従） */
  --hero-tint-opacity: 0.4;
  --hero-scrim-left: 0.58;        /* 左の暗部（見出し可読性）の濃さ */
  --hero-scrim-bottom: 0.82;      /* 下辺の暗部（夜への接続）の濃さ */
}
.hero__carousel {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  pointer-events: none;
  user-select: none;
  -webkit-mask-image: linear-gradient(to bottom, #000 80%, transparent 100%);
  mask-image: linear-gradient(to bottom, #000 80%, transparent 100%);
}
.hero__slide {
  position: absolute;
  inset: 0;
  opacity: 0;
  transition: opacity 1200ms var(--ease-out-expo);
}
.hero__slide.is-active {
  opacity: 1;
}
/* JS無効時は先頭スライドだけを静止表示（切替なし）。reduced-motion も同じ静止（下の @media）。 */
html:not(.wyyc-js) .hero__slide {
  opacity: 0;
  transition: none;
}
html:not(.wyyc-js) .hero__slide.is-active {
  opacity: 1;
}
.hero__slide-img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  /* F1（2026-07-11・暫定）: 見出しは左寄せなので、写真内のプリント文字・スポンサーロゴ・
     被写体が「左側」に来ると見出しとかぶる。各スライドの object-position を個別に調整して、
     左端に来る文字/ロゴを画面外へ逃がし、被写体を中央へ寄せる（恒久対応はトリミング前の原版待ち）。 */
  object-position: var(--slide-pos, center center);
  filter:
    brightness(var(--hero-photo-brightness))
    saturate(var(--hero-photo-saturate))
    contrast(var(--hero-photo-contrast));
}
/* スライド別トリミング。nth-child は .hero__slide のみを対象にし、後続の tint/scrim span は含めない。
   01 姫路城: 左は空・右に天守 → やや右へ寄せて空の左肩に見出しの余白を残す。
   02 選手(ピンク髪): 左背景に「GOLD LEVEL SPONSORS」等のロゴ文字 → 大きく右へ寄せて左のロゴ文字を画面外へ。
   03 ヨーヨー静物: 被写体は右寄り・左は暗い床 → 右寄せで被写体を中央へ。
   04 ステージ全景: 右端に白ボードの文字 → やや左へ寄せて右端の文字を逃がす。
   05 選手2名(接写): 右肩に「44 EMPORIUM」プリント → やや左へ寄せて右のプリントを逃がす。
   06 プラハ会場: 中央と両脇スクリーンに大会名テキスト → 下寄りに引いてテキスト帯を上へ逃がす。 */
.hero__slide:nth-child(1) .hero__slide-img { --slide-pos: 62% center; }
.hero__slide:nth-child(2) .hero__slide-img { --slide-pos: 82% center; }
.hero__slide:nth-child(3) .hero__slide-img { --slide-pos: 72% center; }
.hero__slide:nth-child(4) .hero__slide-img { --slide-pos: 38% center; }
.hero__slide:nth-child(5) .hero__slide-img { --slide-pos: 34% center; }
.hero__slide:nth-child(6) .hero__slide-img { --slide-pos: center 72%; }
@media (max-width: 767px) {
  /* モバイルは見出し・カウントダウンが縦積みで中央〜下に重なるため、被写体をやや上へ寄せて
     文字帯（下側）と写真内テキストの重なりを避ける。横位置は上の指定を継承。
     依頼主報告（2026-07-16）「スマホで人の顔と文字が被る」対応: SP実機幅(375)で全6枚を
     実測したところ、02（ピンク髪の選手）・04（DJブース2名）・05（接写の選手）の3枚で
     見出し帯の真後ろに顔が来ていた。被写体自体が縦いっぱいに写る近影のため、縦位置を
     ずらすだけでは顔が見出し帯から逃げ切らず、横位置を大きく振って顔をフレーム端へ
     出す形で調整（このメディアクエリ内はSP専用でPC/タブレットの見た目は変えない）。
     FB0717再指摘（02のみ再修正）: 実写画像で計測したところ、顔・髪は元画像の右側
     （自然座標で50%〜100%）にあり、SPでは高さ基準でカバーするため水平方向にしか
     スライドの余地がない。旧値95%はその右側＝顔をむしろ画面内に収める指定になっており、
     見出しと丸ごと重なっていた（実機で再現・確認済み）。左端（0%〜30%＝暗い背景＋
     淡いスポンサーロゴのみ）へ振り直し、顔を完全にフレーム外へ出す。 */
  .hero__slide:nth-child(2) .hero__slide-img { --slide-pos: 8% center; }
  .hero__slide:nth-child(4) .hero__slide-img { --slide-pos: 0% 20%; }
  .hero__slide:nth-child(5) .hero__slide-img { --slide-pos: 0% center; }
  .hero__slide:nth-child(6) .hero__slide-img { --slide-pos: center 40%; }
}
/* 藍の色被せ（乗算で影を藍へ倒し、実写を夜のブランドトーンへ寄せる） */
.hero__carousel-tint {
  position: absolute;
  inset: 0;
  pointer-events: none;
  background:
    radial-gradient(120% 80% at 78% 12%, rgb(24 60 120 / 0.32) 0%, transparent 58%),
    linear-gradient(180deg, rgb(6 11 22 / 0.22) 0%, rgb(var(--hero-tint-color) / var(--hero-tint-opacity)) 100%);
  mix-blend-mode: multiply;
}
/* 見出し可読性のスクリム。左を沈めて左寄せの見出しを立たせ、下辺を夜へ落として .night へ繋ぐ。 */
.hero__carousel-scrim {
  position: absolute;
  inset: 0;
  pointer-events: none;
  background:
    linear-gradient(90deg, rgb(6 11 22 / var(--hero-scrim-left)) 0%, rgb(6 11 22 / 0.12) 46%, transparent 72%),
    linear-gradient(to bottom, transparent 30%, rgb(6 11 22 / calc(var(--hero-scrim-bottom) * 0.5)) 68%, rgb(6 11 22 / var(--hero-scrim-bottom)) 100%);
}
@media (max-width: 767px) {
  /* モバイルは見出し/日付/カウントダウンが縦に積まれて画像中央〜下に重なるため、
   * 左スクリムを弱め、上下方向のスクリムで文字帯全体を沈める。 */
  .hero {
    --hero-scrim-left: 0.3;
  }
  .hero__carousel-scrim {
    background:
      linear-gradient(to bottom, rgb(6 11 22 / 0.3) 0%, transparent 24%, rgb(6 11 22 / 0.5) 56%, rgb(6 11 22 / 0.88) 92%);
  }
}

/* G1（2026-07-11b）: ヒーロー右側ヨーヨー（.hero__yoyo* / .hero__string）の CSS は撤去した。 */


/* ヒーローのテキスト塊 */
.hero__content {
  width: 100%;
  max-width: var(--shell-max);
  margin-inline: auto;
  padding-inline: var(--shell-pad);
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: clamp(1rem, 2.5vh, 1.75rem);
}
.hero__eyebrow {
  font-family: var(--font-display);
  /* C-4: FB「文字もう少し小さくても」への対応。tagline-en より一段小さい専用サイズにする。 */
  font-size: clamp(0.68rem, 0.6rem + 0.32vw, 0.84rem);
  font-weight: 500;
  letter-spacing: 0.3em;
  text-transform: uppercase;
  color: var(--color-gold-light);
}
.hero__headline {
  margin: 0;
  /* 概念画像のトンマナ根幹＝明朝体。Shippori Mincho（自前同梱）で組む */
  font-family: var(--font-jp-serif);
  font-weight: 500;
  font-size: var(--text-headline);
  /* B-2: 1.12は明朝大見出しには窮屈（行間0.18em）で行間の文字が詰まって見えた。1.28へ。
     ヒーローは min-height:100svh + flex なので縦に伸びても崩れない。 */
  line-height: 1.28;
  letter-spacing: 0.04em;
  color: var(--color-kinari);
  text-shadow: 0 2px 30px rgb(6 11 22 / 0.7), 0 0 1px rgb(240 216 192 / 0.5);
  word-break: keep-all;
  /* B-1: Customizerで長い見出しに編集された場合、単語ラッパ内に折返し点が無いと画面幅を超えて
     物理的にトリミングされる（空くん指摘の「見出し見切れ」）。JS無効時の緊急折返しを確保する保険。
     通常の見出し長では発火せず見た目の骨格は不変。 */
  overflow-wrap: anywhere;
}
.hero__headline-word {
  display: inline-block;
  /* FB0714 F5: ラッパは今は「意味の区切り（読点直後）または半角スペース」で分割されており、
     内部に文字単位の折返し点を残すと句読点だけが孤立する事故が起きる（app.js splitHeadline
     のコメント参照）。nowrap でラッパ内部の改行を禁じ、折返しはラッパとラッパの間
     （読点直後に挿むゼロ幅スペース／英単語間のスペース）でしか起きないようにする。
     祖先 .hero__headline の overflow-wrap:anywhere は、1ラッパがそれ単体で行幅を超える
     異常系（極端に長い一続きの文字列）専用の最終フォールバックとして残す。 */
  white-space: nowrap;
}
.hero__headline-char {
  display: inline-block;
}
/* D-3: JS有効時は見出し全体を一旦隠し、app.js の revealHeadline() が文字分割＋gsap.set完了後に
   親を戻してから1文字ずつリビールする（分割前の一瞬の非分割表示のちら見えを防ぐ）。
   reduced-motion / gsap未読込の早期returnパスは下記 @media で opacity:1 に固定する。 */
@keyframes wyyc-headline-reveal-fallback {
  to {
    opacity: 1;
  }
}
.wyyc-js [data-hero-headline] {
  opacity: 0;
  /* 懸念③是正: D-2で .wyyc-js は <head> の極小scriptで必ず先に付くため、app.js自体が
     読み込み失敗すると revealHeadline() が一度も走らず見出しが永久に非表示のままになる
     （sightedユーザーの情報欠落）。[data-reveal] と同じ0.8s/1.6s遅延の自動開示フォールバックで
     最終防御する。app.js が正常な場合は revealHeadline() の gsap.set(headline,{opacity:1}) が
     1.6sより先に走るため見た目は変わらない。 */
  animation: wyyc-headline-reveal-fallback 0.8s var(--ease-out-expo) 1.6s forwards;
}
.hero__date {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 0.5rem;
  font-family: var(--font-jp-serif);
  font-size: var(--text-lead);
  letter-spacing: 0.08em;
  color: color-mix(in srgb, var(--color-kinari) 88%, transparent);
}
.hero__date-en {
  font-family: var(--font-display);
  letter-spacing: 0.14em;
  color: var(--color-gold-light);
}
.hero__date-dot {
  color: var(--color-gold);
}

/* カウントダウン（概念画像: ベタ塗りボックスでなくヘアライン罫線の区画） */
.countdown {
  margin-top: 0.75rem;
  padding: 0.75rem 0;
  background: transparent;
  border-top: 1px solid var(--hairline-strong);
  border-bottom: 1px solid var(--hairline-strong);
}
.countdown__label {
  font-family: var(--font-display);
  font-size: 0.68rem;
  /* FB0712 総重量削減: 500はZen Kaku Gothic Newの中間ウェイトのためだけに1ウェイト丸ごと
     配信する必要が生じる（このJA countdownラベルが唯一の実使用箇所の1つ）。700（既存の見出し等で
     使用済み・追加コストなし）へ寄せてウェイト数を400/700の2種へ絞る。 */
  font-weight: 700;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: color-mix(in srgb, var(--color-kinari) 74%, transparent);
  margin-bottom: 0.7rem;
  text-align: center;
}
.countdown__grid {
  display: flex;
}
.countdown__unit {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.3rem;
  padding-inline: clamp(0.6rem, 2vw, 1.4rem);
  border-left: 1px solid var(--hairline);
}
.countdown__unit:first-child {
  border-left: 0;
}
.countdown__num {
  /* F2（2026-07-11）: 桁変動での位置カクつき根治。数字ブロックを「最大桁基準の固定幅」にして、
     残り日時がどんな数字（1桁/2桁、EN/JA）でも幅が1pxも変わらないようにする。
     tabular-nums はサブセット由来で効かない可能性があるため、幅の担保は em ベースの固定幅
     （display:block + 中央寄せ）で行い、字幅差があってもセル幅が動かないようにする（保険の多重化）。
     各セル幅が定数 → .countdown__unit(flex:1) が等幅 → .countdown 全体の内在幅が定数 →
     中央寄せの「開幕までの残り」ラベルも一切動かない。 */
  display: block;
  min-width: 1.6em; /* Oswald の2桁ぶんに十分な固定幅（1桁でも中央寄せで位置不変） */
  text-align: center;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: var(--text-countdown);
  line-height: 1;
  color: var(--color-kinari);
  font-variant-numeric: tabular-nums;
  font-feature-settings: 'tnum';
}
.countdown__cap {
  font-family: var(--font-display);
  font-size: 0.6rem;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: color-mix(in srgb, var(--color-kinari) 72%, transparent);
}
.countdown--live,
.countdown--closed {
  display: flex;
  align-items: center;
  gap: 0.85rem;
}
.countdown__now {
  font-family: var(--font-jp-serif);
  font-size: var(--text-lead);
  color: var(--color-kinari);
}

/* スクロールインジケーター */
.hero__scroll {
  position: absolute;
  z-index: 2;
  left: 50%;
  bottom: clamp(1.25rem, 3vh, 2rem);
  transform: translateX(-50%);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.5rem;
  color: var(--color-kinari);
  opacity: 0.7;
  transition: opacity var(--duration-normal) var(--ease-out-expo);
}
/* FB0715ラウンド2追加（mos「SCROLLと、下にスクロールすると落下するヨーヨーの表現を合体
   させたい」）: 演出の意味は1行で＝「SCROLLの糸を、ヨーヨーの開始位置（マストヘッドの
   チケットボタン右端＝FB0715ラウンド2で校正したDESKTOP_LOOKAT_X_OFFSET_STARTの落ち着き先）に
   真上から重ねることで、この糸を手繰るとそのままヨーヨーが投げ出される軌跡につながって見える」。
   軌跡（ヨーヨーのthrow）が唯一の比喩という規律を守り、新しい比喩は持ち込まない。位置合わせは
   WebGLのprojectToScreen実行タイミング（初回スクロール後まで遅延＝CWV対応）を待たずに済むよう、
   masthead__inner と同じ shell-max/shell-pad のボックス計算をCSSだけで再現する（JS非依存・
   静的なleft値なのでtransform/opacity/clip-path縛りにも抵触しない）。
   モバイル/タブレット（<1024px）はヨーヨー自体が中央固定のオフセットなし配置のままなので、
   SCROLLインジケーターも従来通り中央のまま変更しない。
   FB0716-R5追記: 上記は書かれた時点（FB0715ラウンド2）の前提であり、その後FB0715ラウンド3
   キュー22でモバイル幅のヨーヨーも中央固定をやめ、.to-top（ページトップへ戻るボタン）付近へ
   右寄せする設計（MOBILE_LOOKAT_X_OFFSET、trajectory-webgl.js）に変わったため、この段落の
   「モバイルは中央のまま」は実態と食い違っていた。SCROLLインジケーターの真上にヨーヨーの
   出現位置を揃えるため、下の@media (max-width:1024px)でモバイルも.to-topと同じx位置
   （right基準）へ寄せる。 */
/* min-width:1025px（1024pxではない）: header.php側の `@media (max-width:1024px)` が
   masthead__nav を隠しnav-toggle（ハンバーガー）を出す境界と噛み合わせている。1024px幅では
   まだハンバーガーが出てチケットボタンの右にスペースが空くため、そのままだとhero__scrollが
   ボタン右端より右へずれてしまう（Playwright実機検証で発覚）。デスクトップフルナビ表示時
   （≥1025px）だけこの位置合わせを適用し、1024px以下は中央のまま安全側にする。 */
@media (min-width: 1025px) {
  .hero__scroll {
    left: calc((100% + var(--shell-max)) / 2 - var(--shell-pad));
  }
}
/* team-lead FB「スクロール案内の見切れ解消」（PC限定）: .hero__scroll は .hero（position:relative）
   基準の絶対配置で、従来は bottom（.heroの下端からの距離）で位置決めしていた。.heroはmin-height
   （100svh - masthead-h）を持つだけでheightは固定していないため、見出し・カウントダウン等の
   内容が高さ不足の狭いビューポート（実測: 幅1440でも高さ750px以下・幅1366で高さ657px等、
   ブラウザのツールバー分だけ画面が縮んだ実利用時に相当）でheroの実際のボックスが
   min-heightを超えて伸び、bottom基準の.hero__scrollがその伸びた分だけ押し下げられて
   ビューポート外へ見切れていた（Playwright実測: 1440×750で9px・1366×657で83px超過）。
   heroの伸び幅に左右されない位置にするため、bottom基準をやめ、hero自身の上端（＝masthead-h
   ぶん下がった位置＝ビューポート上端からは常に一定）を基準にしたtopへ切り替える。
   104pxはインジケーター本体の実測高さ（22+8+46+8+17≈101pxに安全マージンを足した値）で、
   ビューポート幅に依存しない固定値。SP/タブレット（≤1024px）は元のbottom基準のまま変更しない
   （挙動を変える指示はPC限定のため）。 */
@media (min-width: 1025px) {
  .hero__scroll {
    top: calc(100svh - var(--masthead-h) - 104px - clamp(1.25rem, 3vh, 2rem));
    bottom: auto;
  }
}
/* FB0716-R5追記: モバイル/タブレット（≤1024px）は.to-top（global.css）と同じx位置
   （right: clamp(1rem,3vw,2rem)・width:48pxの中心＝右端からclamp+24px）に寄せる。
   MOBILE_LOOKAT_X_OFFSET（trajectory-webgl.js）がこの.to-top位置を狙って校正されている
   ため、SCROLLインジケーターもここに揃えることで「この場所からヨーヨーがトスされる」の
   位置合わせがモバイルでも成立する。 */
@media (max-width: 1024px) {
  .hero__scroll {
    left: calc(100% - (clamp(1rem, 3vw, 2rem) + 24px));
  }
}
.hero__scroll:hover {
  opacity: 1;
}
/* FB0715ラウンド3 追加FB（キュー13 mos「SCROLLの案内をもうちょっと大きめに、ヨーヨーをトス
   するかのような雰囲気の演出に」）: 素朴なリング(border円)は一回り大きくし（7px→11px）、
   トスの気配としてごくわずかに左右へ揺れる（品よく・過剰装飾にならない範囲の振幅6°）
   アニメーションを足していた。
   FB0716-R5追記（team-lead依頼: 3Dヨーヨーと同じ手車の意匠に）: そのリングを、3Dヨーヨー本体
   （trajectory-yoyo__ballの同心円ブルズアイ・朱/生成り/深緑の配色）と同一パターンのSVGへ
   置き換えた（front-page.php参照）。要素は糸(hero__scroll-line)の下にぶら下がる配置に変わった
   ため、揺れの支点(transform-origin)も「輪の下」から「ヨーヨー本体の上端（糸の付け根）」へ
   付け替えている。視認しやすいよう一回り大きく（11px→22px）した。 */
.hero__scroll-loop {
  display: block;
  width: 22px;
  height: 22px;
  animation: loop-sway 2.8s ease-in-out infinite;
  transform-origin: 50% -8%; /* ヨーヨー本体の上端（糸の付け根）を支点に振れる */
}
@keyframes loop-sway {
  0%, 100% { transform: rotate(-6deg); }
  50% { transform: rotate(6deg); }
}
.hero__scroll-line {
  width: 1.5px;
  height: 46px;
  background: linear-gradient(180deg, transparent, var(--color-gold-light));
  animation: scroll-pulse 2.4s var(--ease-out-expo) infinite;
}
.hero__scroll-cap {
  font-family: var(--font-display);
  font-size: 0.72rem;
  letter-spacing: 0.32em;
  text-transform: uppercase;
}
@keyframes scroll-pulse {
  0%, 100% { opacity: 0.3; transform: scaleY(0.7); transform-origin: top; }
  50% { opacity: 1; transform: scaleY(1); transform-origin: top; }
}
@media (prefers-reduced-motion: reduce) {
  .hero__scroll-loop { animation: none; }
}
/* FB0715ラウンド2追加: スクロールが実際に進んだら「SCROLL」の役目は終わり、同じ場所から
   下りていく軌跡・ヨーヨー本体へ主役を渡す（フェードで退場）。既存のG4（軌跡の描き進み・
   hero.css:107-130）と同じ view timeline（--wyyc-night）・同じ手法（opacityのみのSDA）を使い、
   ページ全体で「動いている系統は1つ」の作法を踏襲する。 */
@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {
    .wyyc-js .hero__scroll {
      animation: wyyc-hero-scroll-fade linear both;
      animation-timeline: --wyyc-night;
      /* "cover" は要素が画面に入り始めてから抜けきるまでの進行率。ページ先頭にある巨大な .night
         (高さ数千px) は読み込み直後（スクロール0）の時点で既にcover進行率が17〜20%前後まで
         進んでいる（G4の.trajectory__fiber--core・cover 6%〜80%のdashoffset実測値から逆算。
         6%という数字自体はこの逆算値と無関係で、そちらは別の目的で経験的に決められた値）。
         この読み込み時点の進行率はビューポート幅ごとに.nightの実高さが変わるぶん微妙にズレる
         （320px:17.0%・768px:20.2%・1024px:19.5%・1440/1920px:18.8%、Playwright実機で実測）。
         0%起点や実測値ギリギリで組むと、幅によっては読み込み直後から既にフェード済み扱いに
         なりSCROLLがほぼ見えない不具合を実機検証で確認したため、実測した最大値（768pxの
         20.2%）にさらに余裕を足した21%を起点にし、そこから軽くホイールした程度で消えきる
         幅（24%）にした。 */
      animation-range: cover 21% cover 24%;
    }
    /* FB0715ラウンド3 追加FB: 単純なフェードでなく、わずかに下方向へ動きながら消えることで
       「トスされて手を離れ、軌跡（3Dヨーヨー）へ主役を渡す」感触を足す。transform(translateY)+
       opacityのみ＝コンポジタ完結でperformance.md準拠。移動量はごく小さく（8px）品よく留めた。 */
    @keyframes wyyc-hero-scroll-fade {
      from { opacity: 0.7; transform: translateX(-50%) translateY(0); }
      to   { opacity: 0; transform: translateX(-50%) translateY(8px); }
    }
  }
}
/* FB 2026-07-17（mos「SCROLLのフェードアウトと3Dヨーヨーのフェードインを同時に」）:
   基準単位が異なる2つの独立したフェード（このview-timeline animationのcover%と、
   REVEAL_START_P基準のJS制御）を同じフレームで駆動し直すため、WebGL演出が実際に起動した
   （＝JSがREVEAL_START_P基準でopacity/transformを直接制御し始める）ときはこのCSS駆動の
   フェードを止める。docEl(.wyyc-webgl-active)はtrajectory-webgl.js起動成功時のみ付与される
   （app.js参照）ので、フォールバック時（WebGL非対応・reduced-motion等）は従来のCSSフェード
   がそのまま残る＝V5フォールバック方針を崩さない。 */
.wyyc-webgl-active .hero__scroll {
  animation: none;
  transition: none; /* 毎フレームのJS制御にopacity transitionが遅延をかけないよう無効化 */
}

/* ================= reduced-motion ================= */
@media (prefers-reduced-motion: reduce) {
  /* カルーセルは切替せず先頭スライドを静止表示（急変防止でトランジションも切る）。
     app.js の initHeroCarousel も reduced では自動送りしないので二重で担保する。 */
  .hero__slide {
    transition: none;
  }
  /* .wyyc-js .section-arc__path（seam方式の初期非表示）より詳細度で上回らせて reduced を優先させる */
  .wyyc-js .section-arc__path {
    stroke-dashoffset: 0;
    transition: none;
  }
  .hero__scroll-line {
    animation: none;
    opacity: 0.6;
  }
  /* D-3: revealHeadline() は reduce で早期returnし親の opacity を戻さないため、常時表示で固定する。
     懸念③の自動開示フォールバックもモーションなので reduced では止める。 */
  .wyyc-js [data-hero-headline] {
    opacity: 1;
    animation: none;
  }
}

/* ================= レスポンシブ ================= */
@media (max-width: 768px) {
  .hero__content {
    align-items: flex-start;
  }
}

@media (max-width: 420px) {
  .countdown {
    padding: 0.9rem 1rem;
    width: 100%;
  }
  .countdown__grid {
    justify-content: space-between;
  }
  /* FB0715ラウンド2追加（狭幅で秒("42")が右端で見切れる既存不具合の修正）: .countdown__unit は
     flex:1 だが、子の .countdown__num（min-width:1.6em・--text-countdown由来のfont-size）と
     左右padding-inlineの合計が「収縮不可な最小内容サイズ」を作ってしまい、320px幅では
     グリッドの内在幅305pxに対して利用可能幅が248pxしかなく57pxはみ出していた（Playwright実測）。
     この幅だけpadding-inlineと数字のfont-sizeを縮め、内在幅を約223pxまで落として収める
     （他の幅・トークン本体には触れない最小の手当て）。 */
  .countdown__unit {
    padding-inline: 0.3rem;
  }
  .countdown__num {
    font-size: 1.9rem;
  }
}
