@charset "UTF-8";
/* =====================================================================
   lp-forge / base.css — 汎用LP生成エンジンの土台CSS
   ---------------------------------------------------------------------
   これは「1本のLPのCSS」ではない。案件ごとに色・書体・写真が入れ替わっても
   構造が破綻しないための器だけを書いてある。**色の実値は1つも書いていない。**

   設計の根拠と判断理由は docs/css-architecture.md に全部書いた。
   ここには「なぜこの値か」を各ブロック1行で置く。

   ■ このファイルが守っている禁止（research-and-design-rules.md 5章）
     - グラデーションを書かない ................ gradient は 0 個
     - 均等3カラムの器を作らない ............... repeat(3, 1fr) / auto-fit / auto-fill は 0 個
     - 全セクション中央揃えにしない ............ text-align:center は .btn と .stickybar だけ
     - スクロール連動の演出を書かない .......... animation / @keyframes / IntersectionObserver 前提クラスは 0 個
     - フォーカスリングを消さない .............. outline:none は 0 個
     - 見出しに飾りを付けない .................. 左罫・下線バー・英字ラベル用の装飾は持たない

   ■ 読み込み順の約束（重要）
     レンダラが出す :root のトークンは **このファイルより後** に置くこと。
     このファイル末尾でなく先頭の :root に既定値を持っているので、後勝ちで上書きされる。
     より確実にしたいなら <div class="lp" style="--bg:...;--fg:..."> のインラインで渡す
     （インラインは常に勝つ）。

   ■ コントラストの責任分界
     CSS は「どの組み合わせが本文扱いか」を宣言するだけ。実測は Node 側の監査で行う。
     4.5:1 以上が要るペア（本文・注記・ボタン文字。18.5px未満/24px未満の文字が乗る）
       --fg      on --bg          本文・見出し
       --fg      on --sunk        沈めた面の本文（.sec--tone-sunk）
       --muted   on --bg          注記・出典・キャプション（13px。ここが一番落ちる）
       --muted   on --sunk        同上
       --accent  on --bg          リンク・キッカー・.stat__value
       --accent  on --sunk        同上
       --accent-fg on --accent    主ボタンの文字・必須バッジの文字（.sec--tone-accent の本文も）
       --accent  on --accent-weak .qa[open] / .voice / .plan--強調 の中の文字
     3:1 以上が要るペア（UI部品の輪郭。WCAG 1.4.11）
       --line    on --bg          入力欄の枠・チェックの枠 ← 罫線一般ではなく「入力欄の枠」が対象
       フォーカスリングは outline-color を --fg / --accent-fg（面に応じて）にしてある。
       **--accent をリングに使っていない**（アクセント地のボタンの上でリングが消えるため）。
     色として自由（不問）
       --line を装飾罫として使う箇所、--accent-weak を面として使う箇所

   ■ 書体トークンについて（research-and-design-rules.md 6章）
     --font-base / --font-head に **Inter / Roboto / system-ui / 游ゴシック を入れない**。
     CSS では禁止できないので、監査ゲート側で文字列一致で落とすこと。
   ===================================================================== */


/* =====================================================================
   1. トークン既定値
   ---------------------------------------------------------------------
   **色の既定値は置いていない。このファイルに色リテラルは0個。**
   置かない理由：既定のグレーを入れておくと、レンダラがトークンを流し忘れても
   「それらしいモノクロのLP」が描画されてしまい、事故が静かに通る。
   トークンが無ければ色が壁抜けして見た目が壊れる＝すぐ気づく、を選んだ。
   （--bg --fg --muted --line --sunk --accent --accent-fg --accent-weak は
     レンダラが :root か .lp の style 属性で必ず全部渡すこと。監査で存在を検査する）

   一方、**寸法と書体には既定値を置いている**。こちらは欠けても壊れ方が静かで、
   かつ案件ごとに変える必要が薄いため。
   ===================================================================== */
:root{
  --font-base: "Helvetica Neue", Arial, "Hiragino Kaku Gothic ProN",
               "Hiragino Sans", "Noto Sans JP", sans-serif;
  --font-head: var(--font-base);

  --w-text: 40rem;   /* 640px。16px本文で全角40字＝実測ルール「35〜45字」の中央 */
  --w-wide: 70rem;   /* 1120px。器のあるセクションだけがここまで広がる */

  --radius: 4px;     /* 角丸は控えめ。写真には効かせない（下の .card__media 参照） */

  --scheme: light;   /* 暗色トークンを流す案件は :root で --scheme:dark に差し替える */

  /* --- 余白スケール（4px基準。刻みは末尾ほど粗い＝隣同士が目で見て違う） --- */
  --sp-1: 0.25rem;   /*  4px  バッジ内・アイコンと文字 */
  --sp-2: 0.5rem;    /*  8px  ラベルと入力欄 */
  --sp-3: 0.75rem;   /* 12px  見出し→直後の本文 */
  --sp-4: 1rem;      /* 16px  段落と段落／左右ガター（SP） */
  --sp-5: 1.5rem;    /* 24px  ボタン間・カード内の段 */
  --sp-6: 2rem;      /* 32px  本文→表・リスト・写真 */
  --sp-7: 2.5rem;    /* 40px  h3のまとまり同士・カード同士 */
  --sp-8: 3.5rem;    /* 56px  セクション縦余白（小） */
  --sp-9: 4.5rem;    /* 72px  セクション縦余白（中） */

  /* --- 意味づけした余白（実装ではこちらだけを使う） --- */
  --flow-tight: var(--sp-3);
  --flow:       var(--sp-4);
  --flow-loose: var(--sp-6);
  --gap-group:  var(--sp-7);
  --gutter:     var(--sp-4);

  /* --- 文字スケール ---------------------------------------------------
     16px = 1rem 基準。clamp を使うのは h1/h2/h3/lead/数字だけ。
     本文以下は固定（本文を可変にすると入力欄が16pxを割ってiOSが自動ズームする）。
     clamp の中央値には **必ず rem 項を入れている**。vw だけだとブラウザの
     文字サイズ設定に追従せず WCAG 1.4.4（200%拡大）を落とす。 */
  --fs-cap:   0.8125rem;                                   /* 13px 下限。これ未満を作らない */
  --fs-sm:    0.875rem;                                    /* 14px 表の中・フッター・追従バー */
  --fs-base:  1rem;                                        /* 16px 本文・入力欄 */
  --fs-lead:  clamp(1.0625rem, 1rem    + 0.30vw, 1.1875rem); /* 17→19px 導入文 */
  --fs-h3:    clamp(1.1875rem, 1.10rem + 0.40vw, 1.375rem);  /* 19→22px */
  --fs-h2:    clamp(1.375rem,  1.20rem + 1.10vw, 1.875rem);  /* 22→30px 実測レンジ SP22-26 / PC26-30 */
  --fs-h1:    clamp(1.625rem,  1.30rem + 1.90vw, 2.5rem);    /* 26→40px 実測レンジ SP26-32 / PC32-40 */
  --fs-num:   clamp(2rem,      1.60rem + 2.20vw, 3.25rem);   /* 32→52px .stats の先頭1つだけ */
  --fs-num-s: 1.5rem;                                        /* 24px  それ以外の数値・料金 */

  /* --- 行送り・字送り（和文。research-and-design-rules.md 6章） --- */
  --lh-body:  1.85;   /* 和文本文 1.8〜2.0 の中央 */
  --lh-head:  1.45;   /* 和文見出し 1.4〜1.5 の中央 */
  --lh-tight: 1.25;   /* 数字だけ */
  --ls-body:  0.02em;
  --ls-head:  0.03em;

  /* --- 部品の寸法（高さは全部 min-* 。固定 height を1つも持たない） --- */
  --tap:         2.75rem;  /* 44px。WCAG 2.5.5 の下限 */
  --btn-h:       3rem;     /* 48px */
  --btn-h-lg:    3.5rem;   /* 56px */
  --stickybar-h: 4.5rem;   /* 72px。追従バーの実高ではなく「フッターに空ける下駄」の見積り */

  /* --- 面（tone）。実体は下の .sec--tone-* で差し替える --- */
  --surface:    var(--bg);
  --on-surface: var(--fg);
}


/* =====================================================================
   2. リセット
   グローバルに触るのは box-sizing と body の余白と text-size-adjust だけ。
   WordPress の固定ページに載せてもテーマ側を壊さない範囲に留める。
   ===================================================================== */
*, *::before, *::after{ box-sizing: border-box; }
html{ -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
body{ margin: 0; }

.lp{
  color-scheme: var(--scheme);
  font-family: var(--font-base);
  font-size: var(--fs-base);
  line-height: var(--lh-body);
  letter-spacing: var(--ls-body);
  color: var(--fg);
  background: var(--bg);
  /* 中央揃えを既定にしない。中央になるのは .btn のラベルと .stickybar だけ。
     text-align を切り替えるユーティリティも用意しない（禁止「全セクション中央揃え」） */
  text-align: left;
  text-underline-offset: 0.22em;
  overflow-wrap: anywhere;   /* 長いURLで横スクロールを出さない（WCAG 1.4.10） */
}

/* ---------------------------------------------------------------------
   要素セレクタは **すべて :where() で詳細度0** にする。ここは重要な設計判断。

   初版は `.lp a{...}` `.lp p{margin:0}` と書いていた。詳細度は (0,1,1) で、
   クラス1つのコンポーネント指定 (0,1,0) **より強い**。層の順序が逆転していて、
   リセットがコンポーネントを上書きしていた。実測で見つかった被害は2つ:
     ・`.lp a{color:var(--accent)}` が `.btn--primary{color:var(--accent-fg)}` に勝ち、
       主ボタンの文字が地と同色（コントラスト1:1）になっていた
     ・`.lp p{margin:0}` が `.sec__body > * + *{margin-top}` (0,1,0) に勝ち、
       **本文の縦リズムが全滅**していた（実測 marginTop=0px）
   どちらも「変数は正しいのに当たっていない」ので、目でも計算値でも見つからない。

   :where() の中身は詳細度に加算されないので、`:where(.lp) :where(p)` は (0,0,0)。
   作者スタイルはUAスタイルより常に強いので、詳細度0でもブラウザ既定には勝つ。
   → **クラスを1つでも持つ指定は、必ずこの層に勝つ。**
   --------------------------------------------------------------------- */
:where(.lp) :where(img){ display: block; max-width: 100%; height: auto; }
:where(.lp) :where(h1, h2, h3, h4, p, ul, ol, dl, dd,
                   figure, blockquote, table, fieldset){ margin: 0; }
:where(.lp) :where(fieldset){ border: 0; padding: 0; min-width: 0; }
:where(.lp) :where(table){ border-collapse: collapse; width: 100%; }
:where(.lp) :where(b, strong){ font-weight: 700; }

/* 段落の縦リズム。**器の中でも効かせる**。
   初版は `.sec__body > * + *` の1本しか無く、`.sec__body` の直下しか見ていなかった。
   実測で `.hero__sub` / `.card__body` / `.qa__a` / `.step__body` の中の段落間が
   すべて 0px だった。詳細度0で置くので、器ごとの指定があればそちらが必ず勝つ。 */
:where(.lp) :where(p, ul, ol, dl, blockquote, figure, table)
+ :where(p, ul, ol, dl, blockquote, figure, table){ margin-top: var(--flow); }

/* リンク色。**ボタンを二重に除外している**（`:not(.btn)` と 詳細度0）。
   レンダラはCTAを <a class="btn btn--primary"> で出す（href を持つ以上アンカーが正しい）ので、
   ここで除外しないと必ず衝突する。
   除外しているのは .btn だけ。.news__title / .lp-footer__links / .sec__tel > a /
   .lp-footer__tel > a / 本文中のリンクには今までどおり当たる。 */
:where(.lp) :where(a:not(.btn)){ color: var(--accent); text-decoration-thickness: 1px; }
:where(.lp) :where(a:not(.btn)):hover{ text-decoration-thickness: 2px; }
/* アクセント面ではリンクが地に溶ける（--accent on --accent）。面に追従させる */
.sec--tone-accent :where(a:not(.btn)){ color: var(--on-surface); }

/* フォーカスリング。outline:none はこのファイルに1つも無い。
   色は面に追従する --on-surface。--accent は使わない（アクセント地の上で消えるため）。 */
.lp :where(a, button, input, select, textarea, summary, [tabindex]):focus-visible{
  outline: 3px solid var(--on-surface);
  outline-offset: 2px;
  border-radius: var(--radius);
}

/* アンカー着地。ヘッダーが sticky になる幅（≥960px）でだけ下駄を履かせる */
.lp [id]{ scroll-margin-top: var(--sp-5); }


/* =====================================================================
   3. 器（section / inner / 面 / 縦余白）
   ===================================================================== */
.sec{
  background: var(--surface);
  color: var(--on-surface);
  /* 上下を非対称にしている。見出しの上には余白が要るが、末尾（多くはCTAか注記）の
     下は詰めてよい。全部同じ数値で積むと「均等余白」になり、禁止事項に触れる。 */
  padding-block: var(--sec-pt, var(--sp-9)) var(--sec-pb, var(--sp-8));
}

/* 縦余白は3段だけ。段を増やすと「なんとなく違う値」が生まれて統制が消える */
.sec--sp-s{ --sec-pt: var(--sp-7); --sec-pb: var(--sp-6); }  /* 40 / 32 密度を上げる帯 */
.sec--sp-m{ --sec-pt: var(--sp-9); --sec-pb: var(--sp-8); }  /* 72 / 56 標準 */
.sec--sp-l{ --sec-pt: 5.5rem;      --sec-pb: var(--sp-9); }  /* 88 / 72 行動する場所 */

/* ヒーローだけ上を詰めて下を空ける。ヘッダーの罫線から主コピーまでを近づける */
.sec--hero{ --sec-pt: var(--sp-6); --sec-pb: var(--sp-9); }

/* --- 面（tone） ------------------------------------------------------
   --surface / --on-surface / --muted / --line を面ごとに差し替える。
   コンポーネント側はこの2〜4個しか見ないので、面が変わっても文字が消えない。
   （入力欄だけは例外で --bg / --fg を直接使う。理由は §9 のコメント） */
.sec--tone-base{  --surface: var(--bg); }
.sec--tone-sunk{  --surface: var(--sunk); }
.sec--tone-accent{
  --surface:    var(--accent);
  --on-surface: var(--accent-fg);
  --muted:      var(--accent-fg);  /* 弱い文字を作らない。アクセント地で階調を作ると必ずコントラストを割る */
  --line:       var(--accent-weak);
}

/* 隣り合う面を同じにしない。**構造的に封じる**：
   同じ tone が連続したら、2つ目を地に戻す。テンプレ感の正体のひとつは
   「面が交互に切り替わるだけの単調なページ」なので、そもそも作れないようにする。
   （黙って変わるのは不親切なので、監査ゲート側でも警告を出すこと） */
.sec--tone-sunk + .sec--tone-sunk{ --surface: var(--bg); }
.sec--tone-accent + .sec--tone-accent{
  --surface:    var(--bg);
  --on-surface: var(--fg);
  --muted:      var(--muted);
  --line:       var(--line);
}

/* --- 内側の器 --------------------------------------------------------
   既定は本文幅（--w-text）。**広い器を持つセクションだけ** --w-wide まで広がる。
   ページ全体が同じ幅の柱1本にならないので、それだけで型どおりに見えなくなる。
   :has() が効かない環境では全部が本文幅に落ちる＝安全側に壊れる。 */
.sec__inner{
  width: 100%;
  margin-inline: auto;
  padding-inline: var(--gutter);
  max-width: calc(var(--w-text) + var(--gutter) * 2);
}
.sec--hero .sec__inner,
.sec__inner:has(.cards, .stats, .plans, .voices, .steps){
  max-width: calc(var(--w-wide) + var(--gutter) * 2);
}

/* 見出しのかたまり。本文よりさらに狭くして、見出しが1行に伸び切らないようにする */
.sec__head{ max-width: 34rem; }
/* 見出しのかたまりの直後。初版は `+ .sec__body` に限定していたため、
   レンダラが .stack / .stats / .cards / .steps / .qa / .form を直に置いた節で
   **見出しと中身が 0px で密着**していた（実測報告）。器の種類を問わず空ける。 */
.sec__head + *{ margin-top: var(--flow-loose); }

/* 縦のリズムは隣接セレクタだけで作る。要素ごとに margin-bottom を書かないので、
   最後の要素の下に余分な余白が残る事故が構造的に起きない。 */
.sec__body > * + *{ margin-top: var(--flow); }
/* 器の前は広く空ける。ただし **直前が見出しなら空けない**（見出しは下の塊に属する）。
   `:not(h2,h3,h4)` で除外しておくことで、下の `.lp :where(h2,h3,h4) + *` と
   セレクタが重ならない＝詳細度の勝ち負けに依存しなくなる。 */
.sec__body > :not(h2, h3, h4) + h3,
.sec__body > :not(h2, h3, h4) + .cards,
.sec__body > :not(h2, h3, h4) + .stats,
.sec__body > :not(h2, h3, h4) + .steps,
.sec__body > :not(h2, h3, h4) + .plans,
.sec__body > :not(h2, h3, h4) + .voices,
.sec__body > :not(h2, h3, h4) + .qa,
.sec__body > :not(h2, h3, h4) + .deflist,
.sec__body > :not(h2, h3, h4) + table,
.sec__body > :not(h2, h3, h4) + figure{ margin-top: var(--gap-group); }


/* =====================================================================
   4. タイポグラフィ
   見出しに装飾を付けない（左罫・下線バー・英字ラベル・アイコン）。
   制作会社テンプレの指紋はほぼ全部そこに出る。
   ===================================================================== */
.sec__kicker{
  font-size: var(--fs-cap);
  font-weight: 700;
  letter-spacing: 0.04em;     /* 0.3em の英字キッカーにしない。和文が前提 */
  line-height: 1.6;
  color: var(--accent);
  margin-bottom: var(--sp-2);
}
.sec--tone-accent .sec__kicker{ color: var(--on-surface); }

.sec__title{
  font-family: var(--font-head);
  font-size: var(--fs-h2);
  line-height: var(--lh-head);
  letter-spacing: var(--ls-head);
  font-weight: 700;
  color: var(--on-surface);
}
/* richtext から来る素の見出しの既定。**詳細度0**にしてあるので、
   .card__title / .step__title / .plan__name がどの要素で出ても必ず勝つ。
   （初版は `.lp h2` (0,1,1) だったため、たとえば <h2 class="card__title"> に
     h2 のサイズが当たって h3 指定が効かない、という取りこぼしが起きる形だった） */
:where(.lp) :where(h2){
  font-family: var(--font-head);
  font-size: var(--fs-h2);
  line-height: var(--lh-head);
  letter-spacing: var(--ls-head);
  font-weight: 700;
  color: var(--on-surface);
}
:where(.lp) :where(h3, h4){
  font-family: var(--font-head);
  font-size: var(--fs-h3);
  line-height: var(--lh-head);
  letter-spacing: var(--ls-head);
  font-weight: 700;
  color: var(--on-surface);
}
/* 見出しと直後の本文だけ詰める。初版は !important で通していたが、
   リセットの詳細度を下げたので素の (0,1,0) で足りる。ここから !important を外した。
   （残る !important は .u-visually-hidden と prefers-reduced-motion の計4個だけ。
     どちらも「必ず勝たなければ意味が無い」定型なので残す）
   §3 の `.sec__body > * + *` より後に置いてあるので、同詳細度で後勝ちする。 */
.lp :where(h2, h3, h4) + *{ margin-top: var(--flow-tight); }

.sec__lead{
  margin-top: var(--flow-tight);
  font-size: var(--fs-lead);
  line-height: 1.8;
  color: var(--muted);
  max-width: var(--w-text);
}
:where(.sec__body) :where(p){ max-width: var(--w-text); }

/* セクション内の電話番号。<p class="sec__tel"> の中に受付時間の span が入る。
   .lp-footer__tel と同じ考え方：<p> に nowrap を掛けず、番号の <a> だけ折らせない。 */
.sec__tel{
  font-size: var(--fs-num-s);
  font-weight: 700;
  line-height: var(--lh-tight);
  font-variant-numeric: tabular-nums;
  color: var(--on-surface);
}
.sec__tel > a{ white-space: nowrap; }
.sec__telhours{
  display: block;                 /* span で出るので block にしないと margin-top が効かない */
  margin-top: var(--sp-1);
  font-size: var(--fs-cap);
  font-weight: 400;
  line-height: 1.7;
  letter-spacing: var(--ls-body);
  font-variant-numeric: normal;
  color: var(--muted);
}

:where(.lp) :where(small, figcaption),
.stat__src,
.voice__who,
.hero__note,
.field__help,
.lp-footer__note{
  font-size: var(--fs-cap);   /* 13px。都合の悪い情報（出典・注記）を小さくして逃げない */
  line-height: 1.7;
  color: var(--muted);
}


/* =====================================================================
   5. ボタン
   高さを固定しない（min-height だけ）。**ボタンには white-space:nowrap を書かない**。
   字送りを 0.12em に上書きされても折り返して逃げる（WCAG 1.4.12）。

   min-width:0 が要る理由（2026-09-03 実測で判明）:
   .btn は .hero__ctas / .stickybar の中で flex item になる。flex item の既定は
   min-width:auto なので、中身より小さくならず **親を押し広げる**。
   実測では 390px の画面で .stickybar が 408px になり、18px の横スクロールが出た。
   flex-basis を何remにしても、min-width:0 が無ければ縮まない。
   ===================================================================== */
.btn{
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;            /* ラベルが長いとき2行に逃がす。高さは min-height で受ける */
  gap: var(--sp-2);
  min-width: 0;               /* flex item として縮めるため。これが無いと親を押し広げる */
  max-width: 100%;
  min-height: var(--btn-h);
  padding: var(--sp-3) var(--sp-6);
  border: 2px solid transparent;
  border-radius: var(--radius);
  font-family: inherit;
  font-size: var(--fs-base);
  font-weight: 700;
  line-height: 1.4;
  letter-spacing: var(--ls-body);
  text-align: center;         /* 中央揃えを許すのはここと .stickybar だけ */
  text-decoration: none;
  cursor: pointer;
  transition: background-color .15s ease, color .15s ease, border-color .15s ease;
}
.btn--primary{
  background: var(--accent);
  color: var(--accent-fg);
  /* 枠を透明のままにしない。背景と同じ色を明示する。
     「操作部品の輪郭」を測る道具は border-color を見るので、transparent だと
     比 1.0 と読まれて誤検出になる。値としては見た目に影響しない。 */
  border-color: var(--accent);
}
.btn--ghost{
  background: transparent;
  color: var(--on-surface);
  border-color: var(--on-surface);
}
.btn--ghost:hover{ background: var(--accent-weak); }
/* 電話ボタン。
   **nowrap を外した（2026-09-03 実測）。**
   「番号だけなら nowrap で足りる」という見積りが外れた。レンダラが出す実ラベルは
   「電話する（8:00〜19:00）」のような受付時間つきで、0.12em上書き下で 392px（画面390px）。
   元リサーチ（実測7社中4社が受付時間を併記）に沿った書き方なので、ラベルが短くなる
   見込みは無い。**ボタンは折り返せる、を優先する**（WCAG 1.4.12 / 1.4.10）。
   番号そのものを折らせない手当ては .lp-footer__tel > a に限定した（§11）。 */
.btn--tel{
  background: transparent;
  color: var(--on-surface);
  border-color: var(--line-strong);   /* 枠だけで成立するボタン＝操作部品の輪郭。3:1 が要る */
  font-size: var(--fs-num-s);
  font-variant-numeric: tabular-nums;
}
/* ボタン内の補足（レンダラは <span class="btn__note"> で出す。<p>の中に<div>を置けないため）。
   flex の全幅行にして2行目に落とす。色は currentColor のまま＝どの面でも文字が消えない。 */
.btn__note{
  flex: 1 1 100%;
  font-size: var(--fs-cap);
  font-weight: 400;
  line-height: 1.6;
  letter-spacing: var(--ls-body);
}
/* アクセント地の上では主ボタンが地に溶ける。色を反転させて構造的に潰す */
.sec--tone-accent .btn--primary{
  background: var(--accent-fg);
  color: var(--accent);
  border-color: var(--accent-fg);
}
.sec--tone-accent .btn--ghost:hover{ background: transparent; border-color: var(--accent-weak); }


/* =====================================================================
   6. ヘッダー
   SP では sticky にしない（上下を固定バーで挟むと小さい画面が潰れる）。
   常時の出口は .stickybar だけが持つ。PC では逆に .stickybar を消して
   ヘッダーを sticky にする。**画面に常駐するものは常に1つだけ。**
   ===================================================================== */
/* flex + wrap だと、タグラインが入ったときに **CTAが2行目に落ちる**（実測報告）。
   grid で「1行目=屋号とCTA / 2行目=タグライン」を確定させる。
   タグラインが無ければ2行目は潰れるので、高さは変わらない。 */
.lp-header{
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  column-gap: var(--sp-4);
  row-gap: var(--sp-1);
  min-height: 3.5rem;
  padding: var(--sp-3) var(--gutter);
  background: var(--bg);
  border-bottom: 1px solid var(--line);
}
.lp-header__brand{
  grid-column: 1; grid-row: 1;
  font-weight: 700;
  font-size: var(--fs-base);
  line-height: 1.4;
  letter-spacing: var(--ls-head);
  min-width: 0;
}
.lp-header__brand img{ max-height: 2.25rem; width: auto; }
/* タグライン。本文16pxのままだとCTAを押し出す。13pxにして2行目に固定する */
.lp-header__tag{
  grid-column: 1; grid-row: 2;
  min-width: 0;
  font-size: var(--fs-cap);
  line-height: 1.6;
  color: var(--muted);
}
.lp-header__cta{ grid-column: 2; grid-row: 1 / -1; align-self: center; }
.lp-header .btn{
  min-height: var(--tap);
  font-size: var(--fs-sm);
  padding-inline: var(--sp-4);
}


/* =====================================================================
   7. ヒーロー
   **文字が先、写真が後。写真の上に文字を載せない。**
   純広告LP4本は4本とも見出しを画像に焼いていた（WCAG 1.4.5違反）。
   HTMLテキストで出す以上、順序を反転させるのが素直で、写真が差し替わっても
   コントラストが崩れない。左テキスト＋右モックアップの2列も作らない（禁止事項）。
   ===================================================================== */
.hero__kicker{
  font-size: var(--fs-cap);
  font-weight: 700;
  letter-spacing: 0.04em;
  color: var(--accent);
  margin-bottom: var(--sp-3);
}
.hero__headline{
  font-family: var(--font-head);
  font-size: var(--fs-h1);
  line-height: 1.4;
  letter-spacing: 0.01em;   /* 大きい文字は少し詰める */
  font-weight: 700;
  color: var(--on-surface);
  /* 全角16字で折り返す。実測の主コピーは11〜31字なので2〜3行に収まる。
     字送り 0.01em は1字ごとに幅を足すので、器を 16em にすると 16字は
     16.16em になって入らず、実際には**15字**で折り返していた。器にも字送りを足す。
     実測 2026-09-05: PC1280 で 640px → 646.4px。16字が収まるようになる。 */
  max-width: calc(16em + 16 * 0.01em);
}

/* 極小幅では見出しを1段小さくする。
   .hero__headline の器は「画面幅 - 左右の余白」まで潰れる。341px 未満だと
   文節ひとつ（11字前後）が2行目に収まらず、行末に1〜2字だけ残る形になる。
   実測 2026-09-05: 境目は 333px（320px幅で 11字に 298.6px 必要／器は 288px）。
   対象は iPhone SE 第1世代など 320px 端末。検査対象幅（390 / 1280）には当たらない。 */
@media (max-width: 340px){
  .hero__headline{ font-size: 1.55rem; }   /* 24.8px。11字 = 275.5px ≤ 288px */
}
.hero__sub{
  margin-top: var(--sp-5);
  font-size: var(--fs-lead);
  line-height: 1.8;
  color: var(--muted);
  max-width: var(--w-text);
}
.hero__ctas{
  display: flex;
  flex-wrap: wrap;          /* 既定で折り返す。字送り上書きで押し出されても崩れない */
  gap: var(--sp-3);
  margin-top: var(--sp-7);
}
.hero__ctas .btn{ flex: 1 1 16rem; min-height: var(--btn-h-lg); }
.hero__note{ margin-top: var(--sp-3); flex: 1 1 100%; }
.hero__media{ margin-top: var(--sp-7); }
.hero__media img{ width: 100%; border-radius: 0; }  /* 写真に角丸を付けない */
.hero__media figcaption{ margin-top: var(--sp-2); }


/* =====================================================================
   8. 内容の器
   ===================================================================== */

/* --- 箇条書き -------------------------------------------------------
   list-style:none にすると Safari の VoiceOver でリストの役割が落ちる。
   ::marker を色付けするだけにして、リスト semantics を触らない。
   （role="list" を書き戻す必要が無い＝レンダラ側の事故が減る） */
.stack{ list-style: disc; padding-inline-start: 1.4em; }
.stack > li{ padding-inline-start: 0.2em; }
.stack > li::marker{ color: var(--accent); }
.sec--tone-accent .stack > li::marker{ color: var(--on-surface); }
.stack > li + li{ margin-top: var(--sp-3); }

/* --- 数字 -----------------------------------------------------------
   **均等に並んだ大きい数字3つ** を作らない。先頭1つだけが主数値で、
   残りは1段小さい行になる。「全部大きい＝全部読まれない」を構造で防ぐ。 */
.stats{ display: grid; gap: var(--sp-5); }
.stat{ border-top: 2px solid var(--line); padding-top: var(--sp-4); }
.stat__value{
  font-size: var(--fs-num-s);
  line-height: var(--lh-tight);
  font-weight: 700;
  letter-spacing: 0.01em;
  font-variant-numeric: tabular-nums;
  color: var(--accent);
}
.stats > .stat:first-child .stat__value{ font-size: var(--fs-num); }
.sec--tone-accent .stat__value{ color: var(--on-surface); }
.stat__unit{ font-size: 0.5em; font-weight: 700; margin-inline-start: 0.2em; }
.stat__label{ display: block; margin-top: var(--sp-2); font-size: var(--fs-sm); font-weight: 700; }
.stat__src{ display: block; margin-top: var(--sp-2); }

/* --- カード ---------------------------------------------------------
   箱にしない（枠・影・角丸を持たない）。上に罫線を1本引いた縦組みのブロック。
   最大2列。**3列の器はこのファイルに存在しない。**
   等高にもしない（align-items:start）。「同じ高さの箱が3つ並ぶ」がテンプレ感の中身。 */
.cards{ display: grid; gap: var(--gap-group); align-items: start; }
.card{ border-top: 2px solid var(--line); padding-top: var(--sp-4); }
.card__title{
  font-family: var(--font-head);
  font-size: var(--fs-h3);
  line-height: var(--lh-head);
  letter-spacing: var(--ls-head);
  font-weight: 700;
  color: var(--on-surface);
}
.card__body{ margin-top: var(--flow-tight); }
.card__media{ margin-top: var(--sp-4); }
.card__media img{ width: 100%; border-radius: 0; }

/* --- 手順 -----------------------------------------------------------
   番号は見えるテキスト（.step__no）。CSS counter は読み上げに乗らないことがある。
   .step__no を出す以上 <ol> の marker とは二重になるので marker は消す。
   → レンダラは <ol class="steps" role="list"> と .step__no に aria-hidden を書くこと。 */
.steps{ list-style: none; padding: 0; display: grid; gap: 0; }
.step{ position: relative; padding: 0 0 var(--sp-6) 3rem; }
.step::before{
  content: "";
  position: absolute;
  inset-block: 2.2rem 0;
  inset-inline-start: 0.9rem;
  width: 2px;
  background: var(--line);
}
.step:last-child{ padding-bottom: 0; }
.step:last-child::before{ display: none; }
.step__no{
  position: absolute;
  inset-block-start: 0;
  inset-inline-start: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 2rem;
  min-height: 2rem;
  border-radius: 999px;
  background: var(--accent);
  color: var(--accent-fg);
  font-size: var(--fs-sm);
  font-weight: 700;
  font-variant-numeric: tabular-nums;
}
.sec--tone-accent .step__no{ background: var(--accent-fg); color: var(--accent); }
.step__title{
  font-family: var(--font-head);
  font-size: var(--fs-h3);
  line-height: var(--lh-head);
  font-weight: 700;
  color: var(--on-surface);
}
.step__body{ margin-top: var(--sp-2); }

/* --- 料金 -----------------------------------------------------------
   最大2列。3プランを横に並べて「真ん中がおすすめ」にする定型を作らない。 */
.plans{ display: grid; gap: var(--sp-5); align-items: start; }
.plan{
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: var(--sp-5);
}
.plan__name{
  font-family: var(--font-head);
  font-size: var(--fs-h3);
  line-height: var(--lh-head);
  font-weight: 700;
  color: var(--on-surface);
}
.plan__price{
  margin-top: var(--sp-2);
  font-size: var(--fs-num-s);
  line-height: var(--lh-tight);
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--accent);
}
.sec--tone-accent .plan__price{ color: var(--on-surface); }
.plan__note{ margin-top: var(--sp-2); font-size: var(--fs-cap); color: var(--muted); }
.plan__items{ margin-top: var(--sp-4); list-style: disc; padding-inline-start: 1.4em; font-size: var(--fs-sm); }
.plan__items > li::marker{ color: var(--accent); }
.plan__items > li + li{ margin-top: var(--sp-2); }

/* --- 声 -------------------------------------------------------------
   丸い顔写真＋名前＋星の定型を作らない。契約に .voice__avatar が無いのは意図的。 */
.voices{ display: grid; gap: var(--sp-5); align-items: start; }
.voice{
  background: var(--accent-weak);
  border-radius: var(--radius);
  padding: var(--sp-5);
}
.sec--tone-accent .voice{ background: transparent; border: 1px solid var(--line); }
.voice__body{ font-size: var(--fs-base); }
.voice__who{ display: block; margin-top: var(--sp-3); }
/* 所属・肩書き。レンダラは <figcaption class="voice__who"> の中の span で出す */
.voice__attr{
  display: block;
  margin-top: var(--sp-1);
  font-size: var(--fs-cap);
  line-height: 1.7;
  color: var(--muted);
}

/* --- FAQ ------------------------------------------------------------
   ネイティブの <details>。ARIA も JS も書かない（WCAG 4.1.2 を構造で満たす）。 */
.qa{ border-top: 1px solid var(--line); }
.qa__item{ border-bottom: 1px solid var(--line); }
.qa__q{
  display: flex;
  align-items: flex-start;
  gap: var(--sp-4);
  min-height: var(--tap);
  padding-block: var(--sp-4);
  font-weight: 700;
  cursor: pointer;
  list-style: none;
}
.qa__q::-webkit-details-marker{ display: none; }
.qa__q::after{
  content: "＋";
  margin-inline-start: auto;
  flex: none;
  color: var(--accent);
  font-weight: 700;
}
.sec--tone-accent .qa__q::after{ color: var(--on-surface); }
.qa__item[open] > .qa__q::after{ content: "−"; }
.qa__a{ padding-block: 0 var(--sp-5); }

/* --- 定義リスト -----------------------------------------------------
   値が長い項目は <table> ではなくこちら。<table> を display:block で縦積みにすると
   表の役割がアクセシビリティツリーから落ちる。 */
.deflist{ border-top: 1px solid var(--line); }
.deflist > div{
  display: grid;
  gap: var(--sp-1) var(--sp-5);
  padding-block: var(--sp-4);
  border-bottom: 1px solid var(--line);
}
.deflist dt{ font-weight: 700; font-size: var(--fs-sm); color: var(--on-surface); }
.deflist dd{ margin: 0; }
/* <dd> の中の注記。レンダラは span で出す（<dd> 直下でも <p> を入れ子にしない方針のため） */
.deflist__note{
  display: block;
  margin-top: var(--sp-1);
  font-size: var(--fs-cap);
  line-height: 1.7;
  color: var(--muted);
}

/* --- 表（richtext から来る素の <table> 用） -------------------------
   横スクロールさせない。狭い幅では列幅を固定して本文側を折る。
   overflow-x:auto にすると、スマホでは表の右側に何かある事に気づかれない。 */
:where(.lp) :where(table){ table-layout: fixed; }
:where(.lp) :where(th, td){
  padding: var(--sp-3) var(--sp-2);
  text-align: left;
  vertical-align: top;
  border-bottom: 1px solid var(--line);
  font-size: var(--fs-sm);
}
:where(.lp) :where(th){ font-weight: 700; width: 34%; }


/* =====================================================================
   8-2. レンダラが出すが初版に規則が無かったクラス
   src/render/sections.mjs / page.mjs の出力と突き合わせて洗い出した分。
   規則が無いと「無指定で描画される」だけで、エラーにもコントラスト不足にもならず
   静かに崩れる。**器を用意した以上、器の名前は全部ここで受ける。**
   ===================================================================== */

/* --- ヒーローの器（レンダラは <div class="hero"> の中に __text と __media を出す） --- */
/* 器そのものにも規則を置く。__text にだけ書いて .hero を書き忘れており、
   クラス網羅の検査（audit/class_coverage.py）で「無指定1件」として出た唯一の残り。
   flow-root は見た目を変えない代わりに、子の上下マージンが器の外へ抜けて
   セクションの余白（--sec-pt / --sec-pb）を食うのを止める。
   overlay で先頭に来る .hero__media は margin-top を持つので、実際に抜ける形をしている。 */
.hero{ display: flow-root; }
.hero__text{ display: block; }
/* overlay:true のとき、レンダラは写真を先に出す。
   **それでも文字は写真の上に載せない**（判断10）。純広告LP4本が見出しを画像に焼いていた
   のを真似ない、というのがこの土台の立場なので、overlay は「順序が入れ替わるだけ」に留める。
   写真が差し替わってもコントラストが崩れない、が守れなくなるため。 */
.hero--overlay .hero__media{ margin-top: 0; margin-bottom: var(--sp-7); }

/* --- セクション内のCTA群（.hero__ctas の非ヒーロー版） --- */
.sec__ctas{
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-3);
  margin-top: var(--gap-group);
}
.sec__ctas .btn{ flex: 1 1 15rem; min-height: var(--btn-h-lg); }

/* --- セクション末尾の注記・署名 --- */
.sec__note{ margin-top: var(--sp-5); font-size: var(--fs-cap); line-height: 1.7; color: var(--muted); }
.sec__sign{ margin-top: var(--sp-6); font-weight: 700; }   /* 右寄せにしない（中央・右揃えを持たない方針） */

/* --- 本文の器の変種 --- */
.sec__body--narrow{ max-width: 34rem; }      /* 共感・メッセージ。読み幅をさらに詰める */
.sec__body--rich > * + *{ margin-top: var(--flow); }  /* richtext。素の要素だけで組まれる */

/* --- 写真（figure + figcaption）。角丸は付けない --- */
.media{ display: block; }
.media img{ width: 100%; border-radius: 0; }
.media__cap{ margin-top: var(--sp-2); }
.voice__media{ margin-top: var(--sp-4); }
.voice__media img{ width: 100%; border-radius: 0; }

/* --- お知らせ --------------------------------------------------------
   <ul class="newslist"> > <li class="news"> > <time class="news__date"> + .news__title。
   .steps と同じ理由で list-style を消しているので、
   **レンダラは <ul class="newslist" role="list"> を書くこと**（Safari VoiceOver 対策）。 */
.newslist{ list-style: none; padding: 0; border-top: 1px solid var(--line); }
.news{
  display: grid;
  gap: var(--sp-1) var(--sp-5);
  padding-block: var(--sp-4);
  border-bottom: 1px solid var(--line);
}
.news__date{
  font-size: var(--fs-cap);
  font-variant-numeric: tabular-nums;
  color: var(--muted);
}
.news__title{ font-weight: 700; }

/* --- 料金の内訳 --- */
.plan__badge{
  display: inline-block;
  margin-bottom: var(--sp-3);
  padding: var(--sp-1) var(--sp-3);
  border-radius: var(--radius);
  background: var(--accent);
  color: var(--accent-fg);
  font-size: var(--fs-cap);
  font-weight: 700;
  line-height: 1.5;
}
.sec--tone-accent .plan__badge{ background: var(--accent-fg); color: var(--accent); }
.plan--rec{ border-color: var(--accent); border-width: 2px; }
.plan__amount{ font-size: 1.3em; }
.plan__unit{ font-size: 0.6em; font-weight: 700; margin-inline-start: 0.2em; }

/* --- 変種フック（土台では見た目を変えない。案件CSSで足す用） -----------
   .stack--check / .cards--case / .deflist--company / .sec--{type} / .field--{type}
   規則を「わざと持たない」。記号や色を増やすとテンプレの指紋になるため。
   ここに書いてあるのは「洗った結果、意図的に空である」という記録。 */


/* =====================================================================
   9. フォーム
   EFO の実測（項目が1つ減るごとに通過率+約2%）に対して CSS ができるのは
   「1項目を短く見せること」だけ。ラベルは常に入力欄の上、横並びにしない。
   ===================================================================== */
.form{ display: grid; gap: var(--sp-5); }
.field{ display: grid; gap: var(--sp-2); }
.field__label{
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--sp-2);
  font-size: var(--fs-sm);
  font-weight: 700;
  color: var(--on-surface);
}
/* 必須/任意は **色ではなく文字** で示す。バッジが読めなくても文言が残る（WCAG 1.4.1） */
.field__req,
.field__opt{
  font-size: var(--fs-cap);
  font-weight: 700;
  line-height: 1.5;
  padding: var(--sp-1) var(--sp-2);
  border-radius: var(--radius);
}
.field__req{ background: var(--accent); color: var(--accent-fg); }
.field__opt{ background: transparent; color: var(--muted); border: 1px solid var(--line); }
.field__help{ margin-top: 0; }
.field__error{
  font-size: var(--fs-sm);
  font-weight: 700;
  line-height: 1.7;
  padding-inline-start: var(--sp-3);
  border-inline-start: 3px solid currentColor;  /* 色だけに頼らず、形でも異常だと分かる */
}

/* 入力欄だけは面（--surface）に追従させず、常にページの地と文字色を使う。
   沈めた面やアクセント面の上でも「入力する場所」の見え方が変わらないため。 */
.form :where(input, select, textarea){
  width: 100%;
  min-height: var(--btn-h);
  padding: var(--sp-3);
  font-family: inherit;
  font-size: max(1rem, 16px);   /* 16px 未満で iOS Safari が自動ズームする。rem が縮んでも割れないように max() */
  line-height: 1.6;
  color: var(--fg);
  background: var(--bg);
  /* **操作部品の枠は --line-strong**（対 --bg 3:1・WCAG 1.4.11）。
     初版は装飾罫の --line を当てていて、実測 1.33:1 で不合格だった。
     --line は「区切り線」、--line-strong は「触れる部品の輪郭」。役割が違う。 */
  border: 1.5px solid var(--line-strong);
  border-radius: var(--radius);
}
.form :where(textarea){ min-height: 8rem; resize: vertical; }
.form :where(input[type="checkbox"], input[type="radio"]){
  width: 1.375rem;
  min-height: 1.375rem;
  height: 1.375rem;
  padding: 0;
  accent-color: var(--accent);
}
/* ラジオ/チェックの行は 44px 以上。入力欄そのものではなく <label> 側で確保する */
.form label:has(input[type="checkbox"]),
.form label:has(input[type="radio"]){
  display: flex;
  align-items: flex-start;
  gap: var(--sp-3);
  min-height: var(--tap);
  padding-block: var(--sp-2);
  cursor: pointer;
}
.form [aria-invalid="true"]{ border-width: 2px; }
.form .btn--primary{ width: 100%; min-height: var(--btn-h-lg); }
.form__submit{ margin-top: var(--sp-2); }
.form__privacy{ font-size: var(--fs-cap); line-height: 1.7; color: var(--muted); }


/* =====================================================================
   10. 追従バー
   position:fixed のみ。スクロール量で出し入れしない（JSを持たせない）。
   地は半透明にしない。背後の写真や表が透けると文字のコントラストを保証できない。
   ===================================================================== */
.stickybar{
  position: fixed;
  inset-inline: 0;
  inset-block-end: 0;
  z-index: 70;
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--sp-2);
  padding: var(--sp-2) var(--sp-3);
  padding-block-end: calc(var(--sp-2) + env(safe-area-inset-bottom, 0px));
  background: var(--bg);
  border-top: 1px solid var(--line);
  text-align: center;
}
.stickybar__label{
  flex: 1 1 100%;
  min-width: 0;               /* 同上。兄弟が押し広げたときに巻き込まれない */
  font-size: var(--fs-cap);
  color: var(--muted);
}
/* min-width:0 は .btn 側にも入れたが、ここにも明示しておく。
   flex-basis は「そこまで伸びたい」であって「そこを下回らない」ではない、
   ということを読む側が取り違えないため。実測ではここが親を押し広げていた。

   flex-basis を 10rem → 8rem に、左右padding を 32px → 12px に下げた理由（実測）:
   10rem(160px) だと 320px 幅でボタン2つが1行に収まらず縦積みになり、
   バーの高さが 152px＝画面(844px)の18% を占めた。判断11（常駐するものが画面を潰さない）
   に反する。8rem+padding12px なら 320px でも横1行に収まる。 */
.stickybar__btn{
  flex: 1 1 8rem;
  min-width: 0;
  min-height: var(--tap);
  padding-inline: var(--sp-3);
  font-size: var(--fs-sm);
}


/* =====================================================================
   11. フッター
   ===================================================================== */
.lp-footer{
  background: var(--sunk);
  color: var(--fg);
  padding: var(--sp-8) var(--gutter);
  /* 追従バーの下に本文が隠れないための下駄。バーが消える幅で外す */
  padding-block-end: calc(var(--sp-8) + var(--stickybar-h));
  font-size: var(--fs-sm);
}
/* 電話番号の行。<p> 自体には nowrap を掛けない（中に受付時間の span が入るため、
   掛けると行全体が折れなくなって画面をはみ出す。.btn--tel で実際にそうなった）。
   **折らせないのは「番号そのもの」＝中の <a> だけ。** <a> が無ければ何も nowrap しない
   ＝安全側に壊れる。 */
.lp-footer__tel{
  font-size: var(--fs-num-s);
  font-weight: 700;
  font-variant-numeric: tabular-nums;
}
.lp-footer__tel > a{ white-space: nowrap; }
/* 受付時間。レンダラは <p class="lp-footer__tel"> の中の **inline の span** で出す
   （<p> の中に <div> を置けないため span で確定）。
   span のままだと margin-top が効かず、右へ流れてズレる（実測 +14px）。
   display:block を当てて行として成立させる。span に display:block は仕様上正当。 */
.lp-footer__hours{
  display: block;
  margin-top: var(--sp-1);
  font-size: var(--fs-cap);
  font-weight: 400;
  line-height: 1.7;
  letter-spacing: var(--ls-body);
  font-variant-numeric: normal;   /* 親の tabular-nums を継がない（時刻は等幅にしない） */
  color: var(--muted);
}
.lp-footer__name{ font-size: var(--fs-base); font-weight: 700; }
.lp-footer__addr,
.lp-footer__area{ margin-top: var(--sp-1); }
.lp-footer__links{
  list-style: none;      /* レンダラは role="list" を書くこと */
  padding: 0;
  margin-top: var(--sp-4);
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-2) var(--sp-5);
}
.lp-footer__links a{ display: inline-block; min-height: var(--tap); line-height: var(--tap); }  /* タップ44px */
.lp-footer__note{ margin-top: var(--sp-5); padding-top: var(--sp-4); border-top: 1px solid var(--line); }
.lp-footer__copy{ margin-top: var(--sp-4); font-size: var(--fs-cap); color: var(--muted); }


/* =====================================================================
   12. ユーティリティ
   ===================================================================== */
.u-visually-hidden{
  position: absolute !important;
  width: 1px; height: 1px;
  margin: -1px; padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}


/* =====================================================================
   13. ブレークポイント
   2本しか無い。600px = 2列を許す最小幅（本文幅 --w-text の半分が全角17字を割らない）。
   960px = 追従バーを畳んでヘッダーを sticky にする幅。
   この2本の外側に @media は書かない（下の prefers-reduced-motion を除く）。
   ===================================================================== */
@media (min-width: 600px){
  :root{ --gutter: var(--sp-5); }

  /* 数字の先頭1つだけ全幅。残りが2列に並ぶので「均等な数字の列」にならない */
  .stats{ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: var(--sp-6) var(--sp-7); }
  .stats > .stat:first-child{ grid-column: 1 / -1; }

  .plans{ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: var(--sp-6); }
  .deflist > div{ grid-template-columns: 11em minmax(0, 1fr); }
  .form .btn--primary{ width: auto; min-width: 18rem; }
  .stickybar__label{ flex: 0 1 auto; text-align: start; }
}

@media (min-width: 960px){
  :root{ --gutter: var(--sp-6); }

  /* PC の縦余白。同じ3段のまま値だけ上げる。段は増やさない */
  .sec{ padding-block: var(--sec-pt-pc, 6rem) var(--sec-pb-pc, 5rem); }
  .sec--sp-s{ --sec-pt-pc: var(--sp-8); --sec-pb-pc: var(--sp-7); }  /* 56 / 40 */
  .sec--sp-m{ --sec-pt-pc: 6rem;        --sec-pb-pc: 5rem; }         /* 96 / 80 */
  .sec--sp-l{ --sec-pt-pc: 8rem;        --sec-pb-pc: 6.5rem; }       /* 128 / 104 */
  .sec--hero{ --sec-pt-pc: var(--sp-8); --sec-pb-pc: 6.5rem; }

  /* 常駐するものを1つにする。追従バーを消してヘッダーを sticky に入れ替える */
  .lp-header{ position: sticky; inset-block-start: 0; z-index: 60; min-height: 4.5rem; }
  .lp [id]{ scroll-margin-top: 5.5rem; }
  .stickybar{ display: none; }
  .lp-footer{ padding-block-end: var(--sp-8); }

  /* カードは最大2列。右列を1段下げて、格子に見えないようにする。
     （やり過ぎだと感じたらこの1行だけ消せばよい。他に影響しない） */
  .cards{ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: var(--sp-9) var(--sp-8); }
  .cards > .card:nth-child(even){ margin-top: var(--sp-7); }

  .voices{ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: var(--sp-6); }
  .steps{ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); column-gap: var(--sp-8); }
  .hero__ctas .btn{ flex: 0 1 20rem; }
}


/* =====================================================================
   14. prefers-reduced-motion — 対応する
   このファイルにスクロール連動の演出は無いので、対象は
   ①ボタンの色のトランジション ②html の smooth scroll の2つだけ。
   それでも「動きを減らす」設定を無視しない（WCAG 2.3.3 / 前庭障害への配慮）。

   prefers-color-scheme — 対応しない（判断）。
   配色は案件ごとに写真とブランドから決めてコントラストを実測する。OSの設定で
   勝手に反転させると、その実測値が保証できなくなる。暗い配色で出す案件は
   :root のトークンを暗色で流し、--scheme:dark を書く。CSS は同じものが動く。
   ===================================================================== */
@media (prefers-reduced-motion: reduce){
  html{ scroll-behavior: auto; }
  .lp *,
  .lp *::before,
  .lp *::after{
    transition-duration: 0.01ms !important;
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
  }
}


/* ---- 案件固有 custom.css ---- */
@charset "UTF-8";
/* =====================================================================
   メキメキ / custom.css — 案件固有の「土台」だけ
   ---------------------------------------------------------------------
   土台: src/render/base.css（このファイルはその後ろに連結される。触っていない）

   ■ このファイルの立場（2026-09-05 作り直し）
     配色の詰め・装飾は次工程（ui-designer）の担当。ここでやるのは
     **軽重の設計だけ**。使う道具は4つに限定する。
       ①縦の占有  ②面の色  ③器の幅  ④画像の実寸
     飾り（枠・影・グラデ・アイコン・英字ラベル）は1つも足さない。

   ■ 作り直しの理由（実測 2026-09-05／作り直し前の数値）
     PC1280: 利用イメージ 1316px(16.9%) / FV 1255px(16.1%) ← 差 5%。山場に見えない
     利用イメージの画像は 516×303 が2枚。FVの 1024×561 より**小さい**。
     面は #f5f5f5 で「こんな方におすすめ」と同じ。器幅 1152 も特徴・流れと同じ。
     → 山場だと分かる手がかりが**4つとも無かった**。宣言は閲覧者に見えない。

   ■ 軽重の決め方（このファイルが実装している唯一の考え）
     面を変えるのはページ内で2回だけ。1回は山場（沈めた面）、1回は出口（アクセント面）。
     交互に塗らない。塗りが交互だと、どこも特別にならない。
     「横に並んだ複数の画像」を持つのは**利用イメージだけ**。他のブロックは最大1枚。

   ■ FV だけ作り直した（2026-09-05 第2回）
     依頼主の言葉:「何のLPかがわからないし単調で目を引かない」
     実測（作り直し前）:
       SP390  最初の画像 Y=675  1画面に写る画像 18.4%
       PC1280 最初の画像 Y=687  1画面に写る画像 13.2%
       → **1画面の 82〜88% が白地と文字だけ。**
       サービスの正体を言っているのは 13px のキッカー1行だけだった。
     解いた道具は3つ。**飾りは1つも足していない。**
       ① 名乗りを読める大きさにする（キッカー 13 → 16px、リード文を本文色に）
       ② 1画面の中の「誰も意図していない余白」を消す
          - ヘッダーのタグラインに段落間 24px が混入していた（§4）
          - CTA上 56 / 画像上 96（PC）を 40 / 40 に（§5③）
          - FVブロックの上下 72/120 → 56/96（§1・§10）
       ③ FV画像を **横長の帯**にして器いっぱいまで出す（§5④）
          縦ではなく横に伸ばす。高さを増やすと山場を追い越すため。
     実測（作り直し後・新素材と lp.json 統合を前提）:
       SP390  Y=513  36.0%   PC1280 Y=490  36.5%
       山場/FV の高さ比 1.93 → 2.31倍（PC1280）。**山場はむしろ強くなった。**

   ■ 持っていないもの（数えられるようにここに書く）
     グラデーション 0 / 影 0 / @keyframes 0 / outline:none 0 /
     text-align:center 0 / repeat(3,1fr)・auto-fit・auto-fill 0 /
     色リテラル 0（すべて var() 経由）/ !important 0 / テーマ切替 0
   ===================================================================== */


/* =====================================================================
   0. トークン
   ---------------------------------------------------------------------
   ■ ここに書いても効かないものがある（実測 2026-09-05／作り直し前の版の誤り）
     レンダラは <style>:root{…}</style> を **<link href="lp.css"> より後ろ** に出す。
     つまり tokens.mjs が出す変数は base.css にも custom.css にも**必ず勝つ**。
     対象は次の16個:
       --bg --fg --muted --line --line-strong --sunk --accent --accent-fg
       --accent-text --accent-weak --font-base --font-head --w-text --w-wide --radius
     作り直し前の custom.css は「レンダラは :root を lp.css の前に出す」という
     前提で --radius / --w-text / --w-wide を書いていたが、**1つも当たっていなかった**。
     実測値は tokens.mjs の既定 --w-text:34rem / --w-wide:68rem / --radius:10rem相当。
     → **この3つは lp.json の tokens（wText / wWide / radius）で指定すること。**
        ここには書かない（書くと「指定したのに効かない」が再発する）。

   ここで宣言してよいのは、tokens.mjs が出さない変数だけ。
   ===================================================================== */
:root{
  /* --- 山場だけが使う3つ目の幅 -------------------------------------
     土台は幅を2段しか持たない（本文/広い）。ここで**1段だけ**足す。
     理由: 山場を「高いだけ」にすると、スクロールしている本人には長さが分からない。
     他のどのブロックとも違う幅にすると、帯に入った瞬間に器が変わったと分かる。
     使ってよいのは .sec--proof / .sec--voice の2つだけ（＝利用イメージ1ブロック）。
     1152 + ガター64 = 1216 ≤ 1280。検査幅で横スクロールを出さない。
     72rem が上限（これ以上にすると PC1280 で横スクロールが出る）。
     差を作るのは **--w-wide を lp.json で 64rem に下げる**側で行う。
     68rem（既定）のままだと差が 5.9% しかなく、幅の違いが読み取れない。 */
  --w-show: 72rem;   /* 1152px。--w-wide 64rem(1024px) に対して 12.5% 広い */

  /* --- 余白（土台の値を一段上げる。段の数は増やさない）--------------- */
  --flow:       var(--sp-5);   /* 段落と段落        16 → 24 */
  --flow-loose: var(--sp-7);   /* 見出しの塊 → 中身  32 → 40 */
  --gap-group:  4rem;          /* 器の前            40 → 64 */
}


/* =====================================================================
   1. セクションの縦余白 — 3段の**差を広げる**
   ---------------------------------------------------------------------
   作り直し前は s=56/40・m=88/72・l=104/88 で、l は m の 1.18倍しかなかった。
   「l を指定したのに m と見分けが付かない」＝段が3つある意味が無い状態。
   l を大きく引き離す。l を使うのは山場と出口だけ。
     SP  s 48/36   m 80/64    l 120/96    （l/m = 1.50）
     PC  s 64/48   m 112/88   l 176/136   （l/m = 1.57）
   .sec--hero は .sec--sp-* と同詳細度なので、**必ず後ろに置く**（土台と同じ順序）。
   ===================================================================== */
.sec--sp-s{ --sec-pt: 3rem;    --sec-pb: 2.25rem; }   /*  48 / 36 */
.sec--sp-m{ --sec-pt: 5rem;    --sec-pb: 4rem; }      /*  80 / 64 */
.sec--sp-l{ --sec-pt: 7.5rem;  --sec-pb: 6rem; }      /* 120 / 96 */

/* FV の上下。**ヘッダーの罫線から主コピーまでを詰める。**
   実測 2026-09-05（作り直し前）: SP390 で最初の画像が Y=675、PC1280 で Y=687。
   1画面(844/900)の 82〜88% が白地と文字だけだった。
   上を詰めた分だけ画像が繰り上がる。下は「画像が畳の外へ続く」ように残す。
     SP  32 / 64   （旧 40 / 80）
     PC  56 / 96   （旧 72 / 120。§10 で指定）*/
.sec--hero{ --sec-pt: 2rem; --sec-pb: 4rem; }         /*  32 / 64 */


/* =====================================================================
   2. 面（tone）— ページ内で2回だけ塗る
   ---------------------------------------------------------------------
   土台の既定は problem=sunk / summary=sunk / proof=sunk で、沈めた面が3回出る。
   3回出ると「白・グレー・白・グレー」の縞になり、**山場のグレーが順番のひとつ**に
   見える。ここで沈めた面を利用イメージの1回だけに絞る。

   lp.json 側でも tone を合わせて書くこと（報告の「切り分け」参照）。
   CSS でも押さえているのは、原稿を触った拍子に面が増えても設計が崩れないようにするため。
   ===================================================================== */
.sec--problem{ --surface: var(--bg); }   /* こんな方におすすめ → 白に戻す */
.sec--summary{ --surface: var(--bg); }   /* サービスについて（deflist採用時）→ 白 */
.sec--flow{    --surface: var(--bg); }   /* 学習の流れ → 白 */


/* =====================================================================
   3. 器の幅 — ブロックごとに変える
   ---------------------------------------------------------------------
   土台は `.sec__inner:has(.cards,.stats,.plans,.voices,.steps)` で自動的に広げるが、
   .steps がその条件に入っていない取りこぼしがある（実測: 1280px で 576px の器に
   2列が入り、手順の本文が1行12字で折れていた）。補う。
   ===================================================================== */
.sec--flow .sec__inner{ max-width: calc(var(--w-wide) + var(--gutter) * 2); }

/* 山場だけが使う幅。ここだけ器が広がる */
.sec--proof .sec__inner,
.sec--voice .sec__inner{ max-width: calc(var(--w-show) + var(--gutter) * 2); }


/* =====================================================================
   4. 縦のリズム — 土台に規則が無い組み合わせを埋める
   ---------------------------------------------------------------------
   土台は `.sec__head + *` と `.sec__body > * + *` を持つが、器どうしの間隔と
   入れ子の中の段落は持たない。レンダラは paragraphs() で <p> を複数出すので、
   ここが無いと段落の切れ目が 0px になる。
   ===================================================================== */
.hero__sub   > * + *,
.sec__lead   > * + *,
.card__body  > * + *,
.step__body  > * + *,
.voice__body > * + *,
.qa__a       > * + *{ margin-top: var(--flow); }

/* カードの中の順序（媒体 → 見出し → 本文）。媒体が先頭に来るときだけ上を詰める */
.card__media:first-child{ margin-top: 0; }
.card__media + .card__title{ margin-top: var(--sp-5); }

/* 器どうし */
.stack + .sec__body{ margin-top: var(--flow-loose); }
.sec__body + .sec__ctas,
.cards + .sec__ctas{ margin-top: var(--flow-loose); }
.sec__ctas + .sec__tel{ margin-top: var(--sp-5); }
.sec__body + .sec__sign{ margin-top: var(--sp-6); }
.form + .sec__note{ margin-top: var(--sp-5); }

/* セクション内のCTA群（.hero__ctas と同じ挙動に揃える） */
.sec__ctas{ display: flex; flex-wrap: wrap; gap: var(--sp-3); }
.sec__ctas .btn{
  flex: 1 1 16rem;
  min-width: 0;              /* 外すと親を押し広げて横スクロールが出る */
  min-height: var(--btn-h-lg);
}

/* 注記・署名・キャプション（13px・--muted）。土台に規則が無いもの */
.sec__sign,
.sec__note,
.form__privacy,
.media__cap,
.lp-footer__copy{ font-size: var(--fs-cap); line-height: 1.7; color: var(--muted); }
.lp-footer__name{ font-size: var(--fs-base); font-weight: 700; }
.lp-footer__copy{ margin-top: var(--sp-4); }

/* ヘッダーのタグライン。ブランド → 説明 → CTA の順に強さを付ける。
   ■ margin-top: 0 は見た目の趣味ではなく、**混入の除去**（実測 2026-09-05）
     土台の縦リズムは詳細度0の隣接規則
       `:where(.lp) :where(p,ul,…) + :where(p,…){ margin-top: var(--flow) }`
     で書かれている。ヘッダーは grid だが、`__brand` と `__tag` は
     **隣り合う <p>** なので、この段落間の規則が当たっていた。
     しかも --flow は当ファイル §0 で 16 → 24px に上げてある。
     結果、ヘッダーの高さが 121px（内訳: 12 + 22 + **24** + 21 + 12 + 罫線1 …
     実際は行1がCTAの48pxで決まるため 121px）になり、
     **1画面の 13〜14% を、誰も意図していない段落間の余白が食っていた。**
     grid の行間は row-gap が持つ（土台が --sp-1 = 4px を指定済み）ので、
     margin は 0 が正しい。 */
.lp-header__tag{
  font-size: var(--fs-cap);
  line-height: 1.6;
  color: var(--muted);
  min-width: 0;
  margin-top: 0;
}
.lp-header{ column-gap: var(--sp-3); }

/* SP ではタグラインを出さない（畳むのではなく**消す**）。
   理由: 同じ文言「デザインの練習ツール」を、この直下 129px の `.hero__kicker` が
   16px で言うようになった（§5 ①）。同じ言葉を 13px と 16px で二度出すぶん、
   ヘッダーが1行ぶん（24px）高くなり、画像が下がる。
   消しても名乗りは1画面の中に残る（実測: kicker は SP390 で Y=129、折り返し無し）。
   600px 以上では横に並べる余地があるので残す（§10）。 */
@media (max-width: 599px){
  .lp-header__tag{ display: none; }
}


/* =====================================================================
   5. FV
   ---------------------------------------------------------------------
   **左テキスト＋右モックの2列にはしない。** 土台 §7 が明文で禁止している
   （写真を差し替えてもコントラストが崩れない、を守るため）。順序は文字→画像のまま。

   FV の画像はページ内で2番目の大きさに留める。1番は山場の講評画像。
   ここを最大にすると、山場に着いたとき「さっきより小さい絵」が出ることになる。
   ===================================================================== */
/* --- ①名乗りを読める大きさにする ---------------------------------
   実測 2026-09-05（作り直し前）: サービスの正体を言っているのは
   `.hero__kicker` の **13px 1行だけ**。見出しは「毎朝7時に、お題が1つ。」で、
   何のお題かも誰向けかも言っていない。A面もB面も同じ問題を持つ。
   13px はこのページの最小サイズ（注記・出典と同じ）で、
   **一番小さい文字が唯一の名乗りになっていた。**
   16px（本文と同じ）に上げる。飾りは足さない。上げるのは大きさだけ。
   12字 × 16.64px（字送り0.04em込み）= 200px。SP390 の器 358px に1行で入る。 */
.hero__kicker{ font-size: var(--fs-base); margin-bottom: var(--sp-4); }

/* --- ②リード文を「注記」から「本文」に戻す -----------------------
   土台の既定は --muted。灰色の19pxは、読み飛ばしてよい注記の色。
   ここは **このページで唯一「Webデザインの」と書く行** なので、面の文字色にする。
   （--on-surface は面ごとに切り替わる変数。--fg 直書きにしない） */
.hero__sub{ margin-top: var(--sp-5); color: var(--on-surface); }

/* --- ③文字と画像の間の余白を詰める -------------------------------
   作り直し前は ctas 56px + media 96px（PC）。合計 152px が、
   1画面のうち **画像が入るべき場所** を空のまま使っていた。 */
.hero__ctas{   margin-top:    var(--sp-7); }   /* 56 → 40 */
.hero__media{  margin-top:    var(--sp-7); }   /* 72 → 40（PCは §10 で 40）*/

/* 画面モックは写真ではなく自分で組んだUI。中の要素が10pxの角丸なので外周も揃える。
   （写真を使う案件ではこの3行を書かないこと。土台の既定は角丸0） */
.hero__media img,
.card__media img,
.voice__media img{ border-radius: var(--radius); }

/* --- ④画像の器 ---------------------------------------------------
   ■ 何を変えたか
     幅  716px → **器いっぱい（PC 1024px）**
     比  1.43:1（UIモックの比） → **32:15（横長の帯）**
   ■ なぜ横長の帯か
     縦に大きくすると山場（講評）の絵を高さで超えてしまう。
     横に伸ばせば、1画面に入る面積だけが増えて、**高さは山場に届かない**。
     FV 1024×480 / 山場 1040×625。高さ 0.77倍・面積 0.76倍で山場が上のまま。
   ■ aspect-ratio を器の側で決める理由（§8 と同じ火傷）
     lp.json の width/height は読み込み前のCLS予約にしか効かず、
     画像が届いた時点で素材の実比に上書きされる。
     §8 で「1600×520 と書いたのに 1088×638 で描画され、山場を追い越した」
     事故を実測している。**FVは山場を追い越してはいけない側**なので、
     素材が別の比で差し替わっても器が比を握る形にする。
     縦が切れるのは許容する（帯は端で切れているほうが「まだ続く」が伝わる）。
   ■ 段ごとの上限幅（引き伸ばしてぼかさない／太らせない）
     〜599px   素材 hero3-sp（ 716×860）表示 358〜567px  → 最大 2.00倍
     600〜959  素材 hero3   （1432×671）表示 552〜716px  → 最大 2.00倍
     960px〜   素材 hero3-pc（**1792×840**）表示 896〜1024px → 最大 2.00倍
     G5 の判定は `素材幅 > 表示幅 × 2.0`。ちょうど 2.0 は通る。
     ■ hero3-pc を 2048 ではなく **1792** にする理由（実測 2026-09-05）
       960px 以上で器いっぱいに出すと、**器の幅は 896px から始まる**
       （960 − ガター64）。1024px になるのは画面幅 1088px 以上。
       2048px の素材を用意すると 960〜1087px の画面で 2048/896 = **2.29倍**になり、
       過大な画像になる。G5 の実測は 390 と 1280 でしか測らないので**検査を素通りする**。
       1792 なら 960px で 2.00倍、1280px で 1.75倍。どの幅でも 2.0 を超えない。 */
.hero__media img{ max-width: 44.75rem; }   /* 716px。960px 未満はここで止める */

/* ■ セレクタを素材名で縛っている理由（事故防止。趣味ではない）
     この比の指定を素の `.hero__media img` に書くと、**新しい素材が入る前に
     この custom.css だけ先に配ると、いまの hero2（UIモック 1.43:1）が
     32:15 に切り取られて画面の上下が消し飛ぶ。**
     素材名で縛っておけば、素材が入るまでは1行も当たらない＝いまの見た目のまま。
     → **素材のファイル名は hero3.png / hero3-sp.png / hero3-pc.png にすること。**
        別名にするとこの節が丸ごと効かず、帯にならない。 */
.hero__media img[src*="hero3"]{
  aspect-ratio: 179 / 215;   /* SP: 358 × 430 */
  object-fit: cover;
}
@media (min-width: 600px){
  .hero__media img[src*="hero3"]{ aspect-ratio: 32 / 15; }   /* 帯に切り替える */
}


/* =====================================================================
   6. 利用イメージ（山場）その1 — 同じお題への提出を並べる帯
   ---------------------------------------------------------------------
   レンダラ: proof の cases → <div class="cards cards--case"> > <article class="card">
   .cards--case は土台が**意図的に空にしてある変種フック**（base.css §8 末尾に
   「案件CSSで足す用」と明記）。掴んでよい場所なので、ここに書く。

   ■ 枚数は4枚にする（3枚ではなく）
     禁止されているのは均等3カラムの器。3枚だと器を工夫しても
     「特徴を3つ並べたやつ」に見えて型が衝突する。4枚は比較の集合に見える。
     4枚は「正解が1つでない」を示すための集合なので、**互いに同じ大きさにする**。
     1枚だけ大きくすると、それが基準線になって「自分には無理」が戻ってくる。

   ■ SPは横スクロールにしない
     横スクロールの帯はキーボードで中身に到達できない環境がある（WCAG 2.1.1）。
     4枚を2×2で置けば全部が同時に見える。同時に見えることが、この帯の唯一の仕事。
   ===================================================================== */
.sec--proof .cards--case{
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);   /* SP: 2×2 */
  gap: var(--sp-6) var(--sp-4);
}

/* 罫線を外す。4枚は「絵の比較」なので、線があると絵より線が先に見える */
.sec--proof .cards--case > .card{ border-top: 0; padding-top: 0; }

/* 見出しと本文は絵の説明に落とす（「提出A ／ 会社員・3週目」程度） */
.sec--proof .cards--case .card__title{
  font-size: var(--fs-sm);
  margin-top: var(--sp-3);
}
.sec--proof .cards--case .card__body{
  margin-top: var(--sp-1);
  font-size: var(--fs-cap);
  line-height: 1.7;
  color: var(--muted);
}


/* =====================================================================
   7. 利用イメージ（山場）その2 — 講評の全文と、書いた人
   ---------------------------------------------------------------------
   レンダラ: voice → <div class="voices"> > <figure class="voice">
              > .voice__media / <blockquote class="voice__body"> / <figcaption class="voice__who">
   講評は「引用文＋書いた人」なので blockquote + figcaption が素直（G4 の構造検査に乗る）。
   .card__body にベタ書きすると、この構造が消える。

   ■ 前の節と溶接して、1ブロックに見せる
     土台に `.sec--tone-sunk + .sec--tone-sunk{ --surface: var(--bg) }` がある。
     「同じ面が続いたら2つ目を地に戻す」という縞対策で、**そのままだと講評だけ白に落ちる**。
     ここは意図して面を続けるので、同詳細度(0,2,0)・後勝ちで打ち消す。
     上余白も0にして、2つの <section> が1本の帯に見えるようにする。

   ■ 顔写真は置かない
     土台 §8 が「丸い顔写真＋名前＋星の定型を作らない」と書いており、契約に
     .voice__avatar が無いのも意図的。架空サービスの「現役デザイナー」に作った顔を
     付けるのは経歴の捏造でもある。人の気配は**講評の文章そのもの**と氏名・肩書きで出す。
     作り直し前の「空のグレー丸」はモック画像側から消すこと。
   ===================================================================== */
.sec--proof + .sec--voice{
  --surface: var(--sunk);   /* 土台の縞対策を打ち消す。ここだけは面を続ける */
  --sec-pt: 0;
  --sec-pt-pc: 0;
}

/* 溶接した後半の見出しは前半より小さくする。
   スキーマが voice に heading を必須にしているので見出しは必ず出る。h2 のままだと
   「新しいブロックが始まった」と読めてしまうので、見た目だけ h3 の大きさに落とす
   （要素は h2 のまま＝見出し階層の検査 G4 は崩さない）。 */
.sec--proof + .sec--voice .sec__title{ font-size: var(--fs-h3); }

/* 講評は1件だけ置く。土台は ≥960px で2列にするので1列に戻す */
.sec--voice .voices{ grid-template-columns: minmax(0, 1fr); }

/* 講評の枠。ページ内で**ここだけ**が淡いアクセント面を持つ。
   面を持つ部品が1つしか無いので、それ自体が「ここが本題」の合図になる。
   SPの内側余白は 16px に留める。32px にすると講評画像が 294px まで痩せて、
   FVの画像（358px）に負ける＝山場の絵がページ最大でなくなる（実測 2026-09-05）。 */
.sec--voice .voice{ padding: var(--sp-4); }
.sec--voice .voice__media{ margin-top: 0; }
.sec--voice .voice__body{ margin-top: var(--sp-6); max-width: var(--w-text); }
.sec--voice .voice__who{ margin-top: var(--sp-5); font-weight: 700; }

/* 注釈つきの講評画像＝ページ内で最大。器いっぱいまで出す（FVの716pxより広い） */
.sec--voice .voice__media img{ max-width: none; }


/* =====================================================================
   8. サービスの特徴 — 最後の1枚（ポートフォリオに溜まる）だけ全幅
   ---------------------------------------------------------------------
   「38件」を数字で言わず、日付順のサムネイルの壁を1枚の画像で見せる（型4）。
   壁の絵は横に広くないと壁に見えないので、最後のカードだけ2列をまたぐ。
   結果として 1列＋1列（千鳥）＋全幅 になり、3枚が均等に並ぶ型を踏まない。
   ===================================================================== */
.sec--benefit .cards > .card:last-child .card__media img{
  max-width: none;
  /* **比を固定する。** lp.json の width/height は読み込み前のCLS予約にしか効かず、
     画像が届いた時点で「素材の実比」に上書きされる（UA既定の aspect-ratio: auto ...）。
     実測 2026-09-05: 1600×520 と書いたのに 1088×638 で描画され、
     **壁の絵が山場の講評画像（1040×570）より大きくなっていた**。設計の逆転。
     素材が別の比で差し替わっても山場を超えないよう、器の側で比を決める。
     縦が切れるのは許容する。サムネイルの壁は「まだ下に続く」が伝わるほうが正しい。 */
  aspect-ratio: 40 / 13;      /* 1600×520 の帯。1088px 幅で 354px */
  object-fit: cover;
}


/* =====================================================================
   9. 罫線・入力欄 — 実測で見つかっていた不足（作り直し前から引き継ぐ）
   ===================================================================== */
/* --line は #e0e0e0（対 --bg 1.27:1）で、沈めた面の上ではほぼ見えない。
   カードの切れ目は 1px の濃い線にする（2px の薄いグレーより「今っぽい」側） */
.card{ border-top-width: 1px; border-top-color: var(--fg); }
.sec--tone-accent .card{ border-top-color: var(--on-surface); }

/* WCAG 1.4.11（非テキスト 3:1）。tokens.mjs は入力欄の枠のために --line-strong
   （対地 3.67:1）を渡しているのに、土台の .form input は --line（1.27:1）を使っている。
   描画後コントラストのゲート（G3）は文字しか見ないので検出できない。 */
.form :where(input, select, textarea){ border-color: var(--line-strong); }

/* 主要導線のボタンだけ上下を広げる（ヘッダーの小さいボタンには当てない） */
.hero__ctas .btn,
.sec__ctas .btn,
.form__submit{ padding-block: var(--sp-4); }


/* =====================================================================
   10. ブレークポイント
   土台と同じ 600px / 960px の2本だけ。新しい線は引かない。
   ===================================================================== */
@media (min-width: 600px){
  /* 提出4枚。2×2 のまま横幅だけ広がる（4列にするのは 960px から） */
  .sec--proof .cards--case{ gap: var(--sp-7) var(--sp-5); }

  /* --- ヘッダーを1行に畳む ------------------------------------------
     土台は「1行目=屋号とCTA / 2行目=タグライン」の2行。CTAが48pxあるので
     2行目のぶんだけ素直に高さが増え、実測 121px（SPも同じ）。
     600px 以上では横に置く余地があるので3列1行にする。**73px**（-48px）。
     幅の確認: 600px のとき 器 = 600 - ガター64 = 536px。
       屋号「メキメキ」16px太字 ≒ 64 ＋ gap12 ＋ タグライン13px×10字 ≒ 131
       ＋ gap12 ＋ CTA 115 = 334px ≤ 536px。折り返さない。
     SP（〜599px）は2行のまま。ただし §4 で混入していた 24px は取ってある（-23px）。 */
  .lp-header{ grid-template-columns: auto minmax(0, 1fr) auto; }
  .lp-header__brand{ grid-column: 1; grid-row: 1; }
  .lp-header__tag{   grid-column: 2; grid-row: 1; }
  .lp-header__cta{   grid-column: 3; grid-row: 1; }
}

@media (min-width: 960px){
  .sec--sp-s{ --sec-pt-pc: 4rem;    --sec-pb-pc: 3rem; }       /*  64 /  48 */
  .sec--sp-m{ --sec-pt-pc: 7rem;    --sec-pb-pc: 5.5rem; }     /* 112 /  88 */
  .sec--sp-l{ --sec-pt-pc: 11rem;   --sec-pb-pc: 8.5rem; }     /* 176 / 136 */
  .sec--hero{ --sec-pt-pc: 3.5rem;      --sec-pb-pc: 6rem; }   /*  56 /  96 */

  .hero__media{ margin-top: 2.5rem; }        /* 96 → 40 */
  /* PCだけ器いっぱいまで出す（1024px）。高さは 32:15 で 480px に決まるので、
     山場の講評画像 1040×625 を **高さでも面積でも超えない**。
     ここも素材名で縛る（上と同じ理由。いまの hero2 は 716px のまま） */
  .hero__media img[src*="hero3"]{ max-width: none; }

  .sec__head + *{ margin-top: 3rem; }
  .sec__body + .sec__ctas,
  .cards + .sec__ctas{ margin-top: 3rem; }
  .sec__ctas .btn{ flex: 0 1 20rem; }

  /* --- 提出4枚を横1列に並べる ---------------------------------------
     minmax(0,1fr) を4つ書き出している。repeat() を使わないのは、
     土台が禁止している均等3カラムと**書き方の見分けが付くようにする**ため。
     4枚は同じ大きさ。ここで1枚だけ広げると基準線が生まれる。 */
  .sec--proof .cards--case{
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr);
    gap: var(--sp-5);
  }
  /* 土台は .cards の偶数番を1段下げて格子に見せない。**比較の帯では天地を揃える**
     （ずれていると「4枚が同じ条件で並んでいる」が読めなくなる） */
  .sec--proof .cards--case > .card:nth-child(even){ margin-top: 0; }

  /* 特徴の最後の1枚（サムネイルの壁）だけ2列をまたぐ */
  .sec--benefit .cards > .card:last-child{ grid-column: 1 / -1; margin-top: var(--sp-9); }

  .sec--voice .voice{ padding: var(--sp-8); }
}
