@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); }
/* richtext の中で、表や本文のすぐ下に添える注釈。
   帯の末尾に置く .sec__note と違って本文の一部なので、上の余白は狭くする。
   出典・但し書きはここに入れる（G8「実績の数字に出典がある」の受け皿）。 */
.note{ margin-top: var(--sp-3); font-size: var(--fs-cap); line-height: 1.7; color: var(--muted); }
.note:last-child{ margin-bottom: 0; }
.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; }

/* --- 漫画 ------------------------------------------------------------
   コマは縦1列。横に並べない。

   2026-09-13 に漫画LP制作会社3社の自社LPを実測して決めた寸法:
     アイコミックス 51,573px(61画面) / シンフィールド 30,258px(36画面) / LP COMIC 12,701px(15画面)
   どれも縦に長すぎて読み切られない。そこで
     ① コマ幅は本文と同じ読み幅（--w-text）に収める。全幅に広げない
     ② コマ間の余白は --sp-5。詰めすぎると1枚の壁画に見え、開けすぎると話が切れる
     ③ 画像に角丸・影を付けない。紙の質感を足すと「テンプレっぽさ」が出る

   コマ間CTA(.manga__mid)は、漫画を読み切らせる前に出口を作るためのもの。
   実測でシンフィールドは最初のCTAが2.7画面下にあり、そこまで到達しないと出口が無かった。 */
.manga{ max-width: var(--w-text); margin-inline: auto; }

/* 狭い画面ではコマを端まで使う（フルブリード）。
   本文に要る左右16pxのガターは、コマには要らない。漫画は元々ページを端まで使う。

   これは見た目の好みではなく、可読性の計算から来ている:
     コマ内の文字の大きさは「画像幅に対する比」で決まる。ガターを外すと
     表示幅が 358px → 390px になり、同じ絵でも文字が 9% 大きく出る。
     必要比は 13/358 = 3.6% から 13/390 = 3.3% に下がる。
     （13px は --fs-cap ＝ このCSSが決めている文字の下限。ここは動かさない）
   生成側の scripts/panel_text_check.py も同じ 390px を前提に測ること。 */
@media (max-width: 640px){
  .manga{
    margin-inline: calc(var(--gutter) * -1);
    max-width: calc(100% + var(--gutter) * 2);
  }
  /* コマ間CTAとキャプションは本文の一部なので、ガターの中に戻す */
  .manga__mid,
  .manga__cap{ margin-inline: var(--gutter); }
}
.manga__panel{ display: block; margin: 0; }
.manga__panel + .manga__panel{ margin-top: var(--sp-5); }
.manga__panel img{ width: 100%; height: auto; border-radius: 0; display: block; }
.manga__cap{
  margin-top: var(--sp-2);
  font-size: var(--fs-cap);
  line-height: 1.7;
  color: var(--muted);
}
/* コマとコマの間に差すCTA。上下を広めに空けて、コマの続きに見えないようにする */
.manga__mid{ margin-block: var(--sp-7); }
.manga__mid .btn{ width: 100%; min-height: var(--btn-h-lg); }
.manga + .sec__note{ max-width: var(--w-text); margin-inline: auto; }
.manga__ctas{ margin-top: var(--sp-6); }

/* 漫画の帯そのもの。コマの下端に絵の余白が入るので、帯の下側を標準より詰める。
   詰めないと「コマの余白 + 帯の余白」が二重になって、次の見出しまでが間延びする。 */
.sec--manga{ --sec-pb: var(--sp-8); }

/* FVに漫画を置くときのフルブリード。指定は lp.json の media.bleed:true。
   .manga と同じ計算（358px → 390px で吹き出しの文字が9%大きく出る）。 */
@media (max-width: 640px){
  .hero__media--bleed{
    margin-inline: calc(var(--gutter) * -1);
    max-width: calc(100% + var(--gutter) * 2);
  }
  .hero__media--bleed figcaption{ margin-inline: var(--gutter); }
}

/* --- お知らせ --------------------------------------------------------
   <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); }

/* 罠の入力欄。人には見せず、機械にだけ見つけさせて、埋まっていたらサーバー側で捨てる。
   display:none にすると埋めずに通る機械がいるので、画面の外へ出す方法をとる。
   読み上げからは aria-hidden と tabindex="-1" で外してある（マークアップ側）。 */
.hp{
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}


/* =====================================================================
   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;
  }
}


/* =====================================================================
   15. 追加部品（2026-09-23 ことばとコード / DESIGN.md §5 A〜D）
   ここに書いたクラスは、それを出す指定（header.nav / links / gallery /
   empathy.media / media.frame）がある案件にしか現れない。
   既存案件のHTMLにはこのクラスが1つも無いので、足しても見た目は変わらない。
   **既存クラスへの規則はここに書かない**（書くと既存案件の見た目が動く）。
   ===================================================================== */

/* --- A. ヘッダーのナビ（ページ内アンカー） ---------------------------
   SP: 屋号の下の2段目を全幅で使う。折り返す（横スクロールにしない）。
   PC: 1段にして右へ。ナビはリンク色にしない（本文中のリンクと見分けるため）。 */
.lp-header__nav{ grid-column: 1 / -1; grid-row: 2; min-width: 0; }
.lp-header__nav ul{
  list-style: none;
  margin: 0 calc(var(--sp-2) * -1);   /* 1項目目の文字の左端を屋号の左端に揃える */
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0 var(--sp-1);
}
.lp-header__nav a{
  display: inline-flex;
  align-items: center;
  min-height: var(--tap);
  padding-inline: var(--sp-2);
  font-size: var(--fs-sm);
  font-weight: 700;
  line-height: 1.4;
  color: var(--fg);
  text-decoration: none;
}
.lp-header__nav a:hover{ text-decoration: underline; text-decoration-thickness: 2px; }

/* --- B. カード末尾の文字リンク -----------------------------------------
   ボタンにしない（カードごとにボタンが並ぶと、ヒーローの主ボタンと強さが同じになる）。
   押せる高さは 44px を inline-flex で確保する。 */
.card__links{
  margin-top: var(--sp-4);
  display: flex;
  flex-wrap: wrap;
  gap: 0 var(--sp-5);
}
.card__links a{
  display: inline-flex;
  align-items: center;
  min-height: var(--tap);
  font-weight: 700;
  color: var(--accent-text, var(--accent));
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 0.3em;
}
.card__links a:hover{ text-decoration-thickness: 2px; }

/* --- C. カード内の複数画像。常に2列（3列の器は作らない） ---------------- */
.card__gallery{
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: var(--sp-3);
  align-items: start;
  margin-top: var(--sp-4);
}
.card__gallery img{ width: 100%; border-radius: 0; }
.card__gallery + .card__title{ margin-top: var(--sp-5); }

/* 白い紙・白い画面が地に溶けるときだけ付ける 1px の罫（media.frame:true）。影は付けない */
.img--framed{ border: 1px solid var(--line); }

/* --- D. 共感セクションの写真 ---------------------------------------------
   写真に角丸・枠を付けない。無いときは .sec__portrait 自体が出ない。 */
.sec__portrait{ max-width: 15rem; }
.sec__portrait img{ width: 100%; border-radius: 0; }
.sec__portrait + .sec__body--narrow{ margin-top: var(--flow-loose); }

@media (min-width: 960px){
  .lp-header__nav{ grid-column: 2; grid-row: 1; }
  .lp-header__nav ul{ margin: 0 calc(var(--sp-3) * -1) 0 0; gap: 0 var(--sp-1); }
  .lp-header__nav a{ padding-inline: var(--sp-3); font-size: 0.9375rem; }

  /* 写真 16rem ＋ 本文幅。見出しは2列にまたがる */
  .sec--empathy .sec__inner:has(.sec__portrait){
    display: grid;
    grid-template-columns: 16rem minmax(0, var(--w-text));
    column-gap: var(--sp-8);
    align-items: start;
    max-width: calc(16rem + var(--sp-8) + var(--w-text) + var(--gutter) * 2);
  }
  .sec--empathy .sec__inner:has(.sec__portrait) > .sec__head{ grid-column: 1 / -1; }
  .sec--empathy .sec__inner:has(.sec__portrait) > .sec__sign{ grid-column: 2; }
  .sec__portrait{ max-width: none; }
}


/* ---- 案件固有 custom.css ---- */
/* 書体の確認: 見出しは Noto Sans JP（Black 900）。https://raw.githubusercontent.com/google/fonts/main/ofl/notosansjp/OFL.txt を 2026-10-29 に genbun で原文確認 → SIL OFL 1.1・Reserved Font Name は 'Source' のみ・「単体で売らない」「著作権表示とライセンスを添える」が条件。google/fonts の NotoSansJP[wght].ttf を 900 に固定し、見出しに出る134字だけに fontTools で絞って assets/noto-sans-jp-900-heading.woff2（24,056バイト）に置いた。著作権表示とライセンスは書体の中（name表）と assets/noto-sans-jp-OFL.txt */
/* =====================================================================
   ことばとコード 歯科医院向けセールスLP（shika-hp）の案件固有 CSS（2026-10-29）
   色: 白磁（#f6f8f6）× 墨緑（#17211f）× 深い青緑（#0c5650）、差し色に淡い青磁。
       見本の「みずき歯科」（生成り×えんじ／濃紺×黄色）とは別の、作り手の色にする。
   印: 原稿用紙のます目（ことば）を、見本の画面を載せる台の模様にする。
   動き: 見本の患者向けLP（projects/mizuki-hikaku/custom.css）と同じ作り方。
     - 最初の画面は、開いたときに時間で動く（テロップが順に入り、見本の画面が右から入る）
     - 下の節は、画面に入ったら1回だけ時間で動く（animation-trigger。@supports の中だけ）
     - 全部 prefers-reduced-motion: no-preference の中。reduce と未対応のブラウザでは最初から全部見える
   ===================================================================== */

@font-face{
  font-family: "KC Heading";
  src: url("noto-sans-jp-900-heading.woff2") format("woff2");
  font-weight: 900; font-style: normal;
  font-display: block;   /* 帯の位置を字の幅で決めているので、別の書体で一瞬出さない（24KB） */
}

:root{
  --head: "KC Heading", var(--font-head);
  --celadon: #dcebe5;        /* 見本を載せる台・強調の面 */
  --celadon-band: #b8dfcf;   /* 見出しのマーカー（上の字 #17211f とのコントラスト 約12:1） */
  --paper: #ffffff;
  --ink: #17211f;
  --grid-cell: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22'%3E%3Cpath d='M21.5 0v22M0 21.5h22' fill='none' stroke='%230c5650' stroke-opacity='.16'/%3E%3C/svg%3E");
  --shadow-1: 0 1px 2px rgb(23 33 31 / .08), 0 14px 32px -14px rgb(23 33 31 / .32);
  --shadow-2: 0 2px 4px rgb(23 33 31 / .10), 0 24px 48px -20px rgb(23 33 31 / .45);
}

/* ---------- 折り返し: 語の途中で折らない・最後の1〜2字だけ行に残さない ---------- */
.lp :where(h1, h2, h3, h4, p, li, dt, dd, th, td, summary, figcaption, .stat__label, .stat__src, .btn, .plan__note){
  word-break: auto-phrase;
  text-wrap: pretty;
}
/* 行頭の「（」が全角ぶん右にずれて見えた（ダメ出し1周目）→ 行頭の開き括弧を半角に詰める（Chrome 123〜。未対応は今まで通り） */
.lp{ text-spacing-trim: trim-start; }
/* 短い段落（2〜4行）は行の長さをそろえる。auto-phrase が「公開まで2か／月以内」で折った所（流れの5）を、
   句点の後ろで折るようにする（balance は句読点の切れ目を選びやすい） */
.lp :where(.step__body p, .hero__note){
  text-wrap: balance;
}
/* PC: 「お問い／合わせ」「実績と／して」が auto-phrase でも折れた（実測）。句読点・中黒・空白の所だけで折る。
   スマホは1行が短く、句読点の間が入りきらずに字の途中で折れたので auto-phrase のまま（390 で実測） */
@media (min-width: 600px){
  .lp :where(.card__body p, .qa__a p, .hero__note){ word-break: keep-all; }
}

/* ---------- 見出しの書体 ---------- */
.hero__headline, .sec__title, .card__title, .step__title, .plan__name, .stat__value, .plan__price,
.sec__body--rich h3, .lp-header__brand{
  font-family: var(--head); font-weight: 900;
}
.sec__title{
  font-size: clamp(1.5rem, 1.15rem + 1.5vw, 2.375rem);
  line-height: 1.42; letter-spacing: .03em;
}
.sec__kicker{ font-size: .875rem; letter-spacing: .06em; }
.sec__lead{ color: var(--fg); }

/* ---------- ヘッダー（屋号の頭に原稿用紙のます目1つ） ---------- */
.lp-header{ background: rgb(246 248 246 / .94); backdrop-filter: blur(6px); }
.lp-header__brand{ display: flex; align-items: center; gap: .6em; font-size: 1.0625rem; letter-spacing: .08em; }
.lp-header__brand::before{
  content: ""; flex: none; width: 1.15em; height: 1.15em;
  border: 2px solid var(--accent);
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'%3E%3Cpath d='M5 0v10M0 5h10' stroke='%230c5650' stroke-width='1'/%3E%3C/svg%3E") center / 100% 100% no-repeat;
}

/* ヘッダーとフッターの左右の端を、本文の広い器（--w-wide）の端にそろえる（広い画面で左端がずれないように） */
.lp-header, .lp-footer{ padding-inline: max(var(--gutter), calc((100% - var(--w-wide)) / 2)); }
@media (min-width: 1440px){ .lp{ --w-wide: 78rem; } }

/* ---------- 節の頭: 短い差し色の線（下の動きで左から伸びる） ---------- */
.sec__head::before{
  content: ""; display: block; width: 3rem; height: 3px; margin-bottom: var(--sp-4);
  background: var(--accent); transform-origin: 0 50%;
}
.sec--tone-accent .sec__head::before{ background: var(--accent-fg); }


/* =====================================================================
   最初の画面
   ===================================================================== */
.sec--hero{ position: relative; overflow: hidden; overflow: clip; }
.sec--hero .hero{ display: grid; gap: var(--sp-7); }
.sec--hero .hero__text{ container-type: inline-size; min-width: 0; }
.sec--hero .hero__kicker{ font-size: .9375rem; letter-spacing: .04em; display: flex; align-items: baseline; gap: .55em; }
.sec--hero .hero__kicker::before{
  content: ""; flex: none; width: .6em; height: .6em; background: var(--accent); translate: 0 .02em;
}
.sec--hero .hero__headline{
  /* 文字の列の幅（cqi）で上限を決める。2行目「3つの画面を一度に作ります」（12.6字＋字送り）が必ず1行に入る */
  --h1fs: min(clamp(1.875rem, 1.25rem + 2.6vw, 3.375rem), calc(100cqi / 13.6));
  position: relative; isolation: isolate;
  font-size: var(--h1fs); line-height: 1.34; letter-spacing: .02em; max-width: none;
  word-break: keep-all;
}
/* マーカー: 2行目の「3つの画面」の下半分。字の幅（Noto Sans JP 900 の実寸）で長さを決める */
.sec--hero .hero__headline::after{
  content: ""; position: absolute; z-index: -1; pointer-events: none;
  left: -.08em; width: 4.86em;   /* 「3つの画面」の実寸 4.708em（1024・1280・1920 で実測）＋前後 .08em */
  top: calc(1.34em + .64em); height: .44em;
  background: var(--celadon-band); transform-origin: 0 50%;
}
.sec--hero .hero__sub{ color: var(--fg); font-size: clamp(1.0625rem, 1rem + .3vw, 1.1875rem); }
.sec--hero .hero__ctas{ margin-top: var(--sp-6); }
.sec--hero .hero__ctas .btn{ border-radius: 6px; font-weight: 900; letter-spacing: .04em; }
.sec--hero .hero__ctas .btn--primary{ box-shadow: 0 10px 22px -12px rgb(12 86 80 / .9); }
.sec--hero .hero__note{ font-size: .875rem; color: var(--muted); max-width: 40em; }

/* 見本の画面を載せる台（原稿用紙のます目）。パソコンの画面の上に、スマホの画面を重ねる */
.sec--hero .hero__media{
  position: relative; margin: 0;
  padding: 8% 18% 24% 4%;   /* パソコンの画面は左寄せ、スマホは右下（パソコン画面の見出しにかけない。ダメ出し1周目） */
  background: var(--celadon) var(--grid-cell) 0 0 / 22px 22px;
  border-radius: 8px;
}
/* ブラウザの窓。上の帯は透明な枠にして、白地と点3つを背景で描く（枠の中は画像の寄りで切り抜く） */
.sec--hero .hero__media picture{
  position: relative; display: block; overflow: hidden;
  border: 1px solid rgb(23 33 31 / .18); border-top: 1.5rem solid transparent;
  border-radius: 8px; box-shadow: var(--shadow-2);
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 10'%3E%3Cg fill='%2317211f' fill-opacity='.24'%3E%3Ccircle cx='5' cy='5' r='4'/%3E%3Ccircle cx='20' cy='5' r='4'/%3E%3Ccircle cx='35' cy='5' r='4'/%3E%3C/g%3E%3C/svg%3E") .7rem .45rem / 2.4rem .6rem no-repeat, var(--paper);
  background-origin: border-box, border-box;
}
.sec--hero .hero__media img{ width: 100%; transform-origin: 50% 0; }
/* スマホの画面（患者向けの説明ページ）。画像の説明は上の img の alt に書いた */
.sec--hero .hero__media::after{
  content: ""; position: absolute; z-index: 2; right: 3.5%; bottom: 4%;
  width: 21%; aspect-ratio: 390 / 844;
  background: var(--paper) url("shot-lp-sp-390.webp") 50% 0 / cover no-repeat;
  border: .4rem solid var(--ink); border-radius: 1.25rem;
  box-shadow: var(--shadow-2);
}
@media (min-width: 960px){
  .sec--hero{ display: flex; align-items: center; min-height: min(calc(100svh - 4.5rem), 44rem); }  /* 54rem だと 1920x1080 で下に約 250px の空き（ダメ出し1周目） */
  .sec--hero > .sec__inner{ width: 100%; }
  .sec--hero .hero{ grid-template-columns: minmax(0, 6fr) minmax(0, 5.2fr); gap: clamp(2.5rem, 4.5vw, 5rem); align-items: center; }
  .sec--hero .hero__ctas .btn{ flex: 0 1 17rem; }
  .sec--hero .hero__media::after{ border-width: .5rem; border-radius: 1.5rem; }
}
@media (min-width: 1360px){
  .sec--hero .hero__kicker{ font-size: 1rem; }
}
@media (max-width: 420px){ .sec--hero .hero__kicker{ font-size: .875rem; letter-spacing: 0; } }
/* スマホ・タブレット: 見出しのすぐ下に見本の画面を小さく1枚（ダメ出し1周目「スマホの最初の画面に絵が無い」）。
   文字の列をほどいて（display: contents）並び順だけ変える。読む順は 小見出し → 見出し → 絵 → 本文 → ボタン */
@media (max-width: 959px){
  .sec--hero .hero{ gap: 0; container-type: inline-size; }
  .sec--hero .hero__text{ display: contents; }
  .sec--hero .hero__kicker{ order: 1; }
  .sec--hero .hero__headline{ order: 2; }
  .sec--hero .hero__media{ order: 3; margin-top: var(--sp-4); width: min(100%, 17.5rem); }
  .sec--hero .hero__sub{ order: 4; }
  .sec--hero .hero__ctas{ order: 5; }
  .sec--hero .hero__note{ order: 6; }
  .sec--hero .hero__media picture{ border-top-width: 1rem; border-radius: 6px; background-position: .45rem .3rem, 0 0; background-size: 1.6rem .4rem, auto; }
  .sec--hero .hero__media::after{ border-width: .25rem; border-radius: .75rem; }
}
@media (min-width: 600px) and (max-width: 959px){ .sec--hero .hero__media{ width: min(100%, 24rem); } }


/* =====================================================================
   点検の結果（数字）
   ===================================================================== */
.stat__value{ font-size: clamp(2.25rem, 1.8rem + 2vw, 3.5rem); line-height: 1.1; letter-spacing: .01em; }
.stats > .stat:first-child .stat__value{ font-size: clamp(3.25rem, 2.4rem + 4vw, 5.5rem); }
.stat__unit{ font-family: var(--font-base); font-size: 1rem; color: var(--accent); }  /* 単位が 8px まで小さくなっていた（数字の大きさの半分ではなく、本文の大きさにする） */
.stat{ border-top: 2px solid var(--line); padding-top: var(--sp-5); }
.stats > .stat:first-child{ border-top: 3px solid var(--accent); }
.stat__label{ font-size: 1rem; line-height: 1.6; }
.stat__src{ font-size: .8125rem; }
@media (min-width: 1200px){   /* 1024 幅で3列にすると出典の日付「2026-06-01」が途中で折れた（実測）ので、3列は 1200 から */
  .stats{ grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr) minmax(0, 1fr); gap: var(--sp-8); align-items: start; }
  .stats > .stat:first-child{ grid-column: auto; }
}


/* =====================================================================
   表（点検で見ていること・ほかの方法と比べて）
   ===================================================================== */
/* 節の左端をそろえる: 表の節も、最初の画面と同じ広い器（--w-wide）に置く */
#sheet .sec__inner, #compare .sec__inner, #flow .sec__inner{ max-width: calc(var(--w-wide) + var(--gutter) * 2); }
.u-nowrap{ display: inline-block; max-width: 100%; overflow-wrap: anywhere; }  /* アドレスはひとかたまりで次の行へ送る。入りきらないとき（文字200%など）だけ中で折る */
.sec__body--rich table{ border-top: 2px solid var(--fg); background: var(--paper); }
.sec__body--rich thead th{ font-size: .875rem; color: var(--fg); background: var(--celadon); border-bottom: 1px solid var(--line); }
.sec__body--rich th, .sec__body--rich td{ width: auto; padding: var(--sp-4) var(--sp-3); line-height: 1.7; }
.sec__body--rich tbody td:first-child{ font-weight: 700; }
#compare tbody tr:last-child td{ background: #eef6f2; border-bottom: 2px solid var(--accent); }
#compare tbody tr:last-child td:first-child{ color: var(--accent); }
#sheet table, #compare table{ margin-top: var(--gap-group); }
#sheet .sec__body > p, #compare .sec__body > p{ max-width: var(--w-text); }
#sheet table + p, #compare table + p{ margin-top: var(--gap-group); }
@media (min-width: 960px){
  .sec__body--rich th, .sec__body--rich td{ font-size: .9375rem; padding: var(--sp-4); }
  #sheet thead th:first-child, #compare thead th:first-child{ width: 26%; }
}
/* スマホ: 3列の表は1列が7〜8字しか入らず「PRONIアイミ／ツ）」のように語の途中で折れた（実測）。
   行ごとのカードに組み替える。列の見出しは読み上げ用に残し、画面では各行に小さく出す（見出しと同じ語） */
@media (max-width: 599px){
  .sec__body--rich table, .sec__body--rich tbody, .sec__body--rich tr, .sec__body--rich td{ display: block; width: auto; }
  .sec__body--rich thead{
    position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap;
  }
  .sec__body--rich table{ border-top: 3px solid var(--fg); background: transparent; }
  .sec__body--rich tbody tr{ padding: var(--sp-5) var(--sp-4); background: var(--paper); border-bottom: 1px solid var(--line); }
  .sec__body--rich td{ padding: 0; border: 0; font-size: .9375rem; line-height: 1.7; }
  .sec__body--rich tbody td:first-child{ font-weight: 700; font-size: 1.0625rem; color: var(--fg); }  /* 見出しの書体は見出しの字だけに絞ってあるので、ここは本文の書体の太字 */
  .sec__body--rich td + td{ display: grid; grid-template-columns: 5.5em minmax(0, 1fr); gap: var(--sp-3); margin-top: var(--sp-3); }
  .sec__body--rich td + td::before{ font-size: .8125rem; font-weight: 700; color: var(--muted); line-height: 2; }
  #sheet td:nth-child(2)::before{ content: "よくある状態"; }
  #sheet td:nth-child(3)::before{ content: "直し方"; }
  #compare td:nth-child(2)::before{ content: "かかる費用"; }
  #compare td:nth-child(3)::before{ content: "残ること"; }
  #compare tbody tr:last-child{ background: #eef6f2; border-bottom: 2px solid var(--accent); }
  #compare tbody tr:last-child td{ background: transparent; border: 0; }
}


/* =====================================================================
   困りごと
   ===================================================================== */
#problem .stack{ list-style: none; padding: 0; }
#problem .stack > li{
  position: relative; padding: var(--sp-4) 0 var(--sp-4) 2.1rem; margin: 0;
  border-bottom: 1px solid var(--line); font-weight: 700; line-height: 1.7;
}
#problem .stack > li:first-child{ border-top: 1px solid var(--line); }
#problem .stack > li::before{
  content: ""; position: absolute; left: .15rem; top: calc(var(--sp-4) + .42em);
  width: 1.05rem; height: 1.05rem; border: 2px solid var(--accent); border-radius: 50%;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'%3E%3Cpath d='M3 3l4 4M7 3l-4 4' stroke='%230c5650' stroke-width='1.4' stroke-linecap='round'/%3E%3C/svg%3E") center / 80% 80% no-repeat;
}
/* 申し送り: 箇条書きのすぐ下の調査の段落が詰まっていた → ひと呼吸あける */
#problem .stack + .sec__body{
  margin-top: var(--gap-group);
  padding: var(--sp-5); background: var(--paper); border-left: 3px solid var(--accent);
}
@media (min-width: 960px){
  #problem .sec__inner{
    max-width: calc(var(--w-wide) + var(--gutter) * 2);
    display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); column-gap: 4rem; align-items: start;
  }
  #problem .sec__head{ grid-column: 1 / -1; }
  #problem .stack, #problem .stack + .sec__body{ margin-top: var(--flow-loose); }
  #problem .stack + .sec__body{ padding: var(--sp-6); }
}


/* =====================================================================
   セットの中身（4枚のカード）
   ===================================================================== */
/* 番号つきの同じ形のカードが4枚並んで手順に見えた（ダメ出し1周目）→ 番号をやめる。
   3つの画面（ホームページ・説明ページ・Web予約）を主に、原稿は下に細い帯で添える。
   PC: ホームページを左に大きく、説明ページと Web予約を右に重ねる。原稿は全幅の帯 */
#set .card{
  position: relative; padding: var(--sp-6) var(--sp-5) var(--sp-5);
  background: var(--paper); border: 1px solid rgb(23 33 31 / .12); border-top: 3px solid var(--accent);
  border-radius: 0 0 6px 6px; box-shadow: var(--shadow-1);
}
#set .card:first-child{ background: var(--celadon) var(--grid-cell) 0 0 / 22px 22px; border-color: rgb(12 86 80 / .25); border-top-color: var(--accent); }
#set .card:first-child .card__title{ font-size: clamp(1.375rem, 1.2rem + .8vw, 1.875rem); }
#set .card:first-child .card__body{ background: var(--paper); padding: var(--sp-4); margin-top: var(--sp-4); border-radius: 4px; }
#set .card:nth-child(4){
  background: transparent; box-shadow: none; border: 0; border-left: 3px solid var(--accent); border-radius: 0;
  padding: var(--sp-1) 0 var(--sp-1) var(--sp-5);
}
#set .card:nth-child(4) .card__title{ font-size: 1.125rem; }
#set .card__body p + p{ margin-top: var(--sp-2); }
#set .sec__ctas{ margin-top: var(--gap-group); }
#set .sec__ctas .btn{ flex: 0 1 24rem; border-radius: 6px; font-weight: 900; letter-spacing: .04em; }
@media (min-width: 960px){
  #set .cards{ grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr); gap: var(--sp-6) var(--sp-7); align-items: stretch; }
  #set .cards > .card:nth-child(even){ margin-top: 0; }
  #set .card{ padding: var(--sp-6); }
  #set .card:first-child{ grid-row: 1 / span 2; padding: var(--sp-8) var(--sp-7) var(--sp-7); }
  #set .card:nth-child(4){ grid-column: 1 / -1; padding: var(--sp-2) 0 var(--sp-2) var(--sp-6); margin-top: var(--sp-3); }
  #set .card:nth-child(4) .card__body{ max-width: 46rem; }
}


/* =====================================================================
   見本（ホームページと説明ページの画面）
   ===================================================================== */
#sample .sec__inner{ max-width: calc(var(--w-wide) + var(--gutter) * 2); }
#sample .sec__body > p, #sample .sample__lead{ max-width: var(--w-text); }
#sample .sec__body > .showcase{ margin-top: var(--gap-group); }
#sample .sec__body > .showcase + p{ margin-top: var(--gap-group); }
.showcase{ display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--sp-6); align-items: center; }
.showcase__text > * + *{ margin-top: var(--flow); }
.showcase__text h3{ font-size: clamp(1.25rem, 1.1rem + .6vw, 1.625rem); }
.showcase__text h3::before{
  content: ""; display: block; width: 2rem; height: 3px; margin-bottom: var(--sp-3); background: var(--accent);
}
.showcase__text a{ font-weight: 700; }
/* 下線は inline-block の中へは伝わらないので、アドレスの塊にも同じ下線を引く */
.showcase__text a .u-nowrap{ text-decoration: underline; text-decoration-thickness: inherit; text-underline-offset: .22em; }
.showcase__text a:hover .u-nowrap{ text-decoration-thickness: 2px; }
.showcase__shot{
  position: relative; display: block;
  padding: 6% 18% 21% 4%;   /* スマホは右下。パソコン画面の見出しにかけない（ダメ出し1周目） */
  background: var(--celadon) var(--grid-cell) 0 0 / 22px 22px;
  border-radius: 8px;
}
.showcase__pc{
  width: 100%; border: 1px solid rgb(23 33 31 / .18); border-top: 1.1rem solid var(--paper);
  border-radius: 6px; background: var(--paper); box-shadow: var(--shadow-2);
  transition: translate .4s cubic-bezier(.34, 1.56, .64, 1);
}
.showcase__sp{
  position: absolute; right: 3%; bottom: 4%; width: 20%;
  border: .3rem solid var(--ink); border-radius: 1rem; background: var(--paper); box-shadow: var(--shadow-2);
  transition: translate .4s cubic-bezier(.34, 1.56, .64, 1);
}
@media (hover: hover){
  .showcase__shot:hover .showcase__pc{ translate: 0 -4px; }
  .showcase__shot:hover .showcase__sp{ translate: 0 -8px; }
}
@media (min-width: 960px){
  .showcase{ grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); gap: clamp(2.5rem, 4.5vw, 5rem); }
  .showcase--rev{ grid-template-columns: minmax(0, 7fr) minmax(0, 5fr); }
  .showcase--rev .showcase__text{ order: 2; }
  .showcase__sp{ border-width: .4rem; border-radius: 1.25rem; }
}


/* =====================================================================
   料金
   ===================================================================== */
.plan{
  background: var(--paper); border: 2px solid var(--accent); border-radius: 8px;
  padding: var(--sp-6) var(--sp-5); box-shadow: var(--shadow-1);
}
.plan__name{ font-size: clamp(1.1875rem, 1.05rem + .5vw, 1.5rem); }
.plan__price{ margin-top: var(--sp-3); color: var(--accent); }
.plan__amount{ font-size: clamp(2.75rem, 2.2rem + 2.4vw, 4rem); line-height: 1; letter-spacing: .01em; }
.plan__unit{ font-family: var(--font-base); font-size: 1rem; }
.plan__note{ font-size: .9375rem; font-weight: 700; color: var(--fg); }
.plan__items{ margin-top: var(--sp-5); padding-top: var(--sp-5); border-top: 1px solid var(--line); font-size: .9375rem; }
/* 申し送り: PC で相談ボタンが箇条書きにくっついて見えた → 間をあけ、幅いっぱいの押しやすいボタンに */
.plan > .btn{ display: flex; width: 100%; margin-top: var(--sp-7); min-height: var(--btn-h-lg); }
#price .sec__note{ font-size: .875rem; color: var(--fg); line-height: 1.8; }
@media (min-width: 960px){
  #price .sec__inner{
    display: grid; grid-template-columns: minmax(0, 7fr) minmax(0, 5fr); column-gap: 4rem; align-items: start;
  }
  #price .sec__head{ grid-column: 1 / -1; }
  #price .plans{ grid-column: 1; grid-template-columns: minmax(0, 1fr); }
  #price .sec__note{ grid-column: 2; margin-top: var(--flow-loose); padding-top: var(--sp-4); border-top: 2px solid var(--fg); }
  .plan{ padding: var(--sp-8) var(--sp-7) var(--sp-7); }
}


/* =====================================================================
   最初の1院（条件の表）
   ===================================================================== */
#monitor .deflist{ background: var(--paper); border-top: 3px solid var(--accent); padding: 0 var(--sp-5); box-shadow: var(--shadow-1); }
#monitor .deflist > div:last-child{ border-bottom: 0; }
#monitor .deflist dt{ color: var(--accent); }
@media (min-width: 960px){
  #monitor .sec__inner{
    max-width: calc(var(--w-wide) + var(--gutter) * 2);
    display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); column-gap: 4.5rem; align-items: start;
  }
  #monitor .deflist{ margin-top: 0; padding: 0 var(--sp-6); }
}


/* =====================================================================
   流れ・作る人・よくある質問・最後の相談
   ===================================================================== */
.step__no{ font-family: var(--head); font-weight: 900; font-size: 1rem; }
.step__title{ font-size: clamp(1.125rem, 1.05rem + .35vw, 1.3125rem); }
.sec__portrait{ position: relative; isolation: isolate; padding: 0 1.25rem 1.25rem 0; }
/* 写真の灰色の背景が素材写真っぽい（ダメ出し1周目）→ 写真は変えず、右下にずらした原稿用紙の台を敷いて、枠で和らげる */
.sec__portrait::before{
  content: ""; position: absolute; z-index: -1; inset: 1.25rem 0 0 1.25rem;
  background: var(--celadon) var(--grid-cell) 0 0 / 22px 22px; border-radius: 8px;
}
.sec__portrait img{ border: .5rem solid var(--paper); border-radius: 6px; box-shadow: var(--shadow-1); }
#about .sec__body{ font-size: 1.0625rem; }
@media (min-width: 960px){
  /* 作る人: 写真を左の列、見出しと本文を右の列。左端は他の節と同じ広い器 */
  .sec--empathy .sec__inner:has(.sec__portrait){
    max-width: calc(var(--w-wide) + var(--gutter) * 2);
    grid-template-columns: 20rem minmax(0, var(--w-text)); grid-template-rows: auto 1fr; column-gap: 4.5rem;
  }
  .sec--empathy .sec__inner:has(.sec__portrait) > .sec__head{ grid-column: 2; grid-row: 1; }
  .sec--empathy .sec__inner:has(.sec__portrait) > .sec__portrait{ grid-column: 1; grid-row: 1 / span 2; }
  .sec--empathy .sec__inner:has(.sec__portrait) > .sec__body{ grid-column: 2; grid-row: 2; margin-top: var(--flow-loose); }
}
@media (min-width: 960px){
  #faq .sec__inner{
    max-width: calc(var(--w-wide) + var(--gutter) * 2);
    display: grid; grid-template-columns: minmax(0, 4fr) minmax(0, 8fr); column-gap: 4.5rem; align-items: start;
  }
  #faq .qa{ margin-top: 0; }
  #faq .sec__head{ position: sticky; top: 7rem; }
}
.qa__q{ font-weight: 700; }
#contact .sec__title{ font-size: clamp(1.625rem, 1.2rem + 1.9vw, 2.75rem); }
#contact .sec__lead{ color: var(--on-surface); }
#contact .btn--primary{ font-weight: 900; letter-spacing: .04em; border-radius: 6px; }
#contact .sec__ctas .btn{ flex: 1 1 18rem; }
@media (min-width: 960px){
  /* 最後の相談: 見出しと案内を左、ボタンを右（上下の真ん中にそろえる） */
  #contact .sec__inner{
    max-width: calc(var(--w-wide) + var(--gutter) * 2);
    display: grid; grid-template-columns: minmax(0, 7fr) minmax(0, 5fr); column-gap: 4.5rem; align-items: center;
  }
  #contact .sec__ctas{ margin-top: 0; }
  #contact .sec__ctas .btn{ min-height: 4rem; font-size: 1.0625rem; }
}


/* =====================================================================
   ダメ出し2周目（2026-10-29）
   ===================================================================== */
/* (1) セットの中身: 左の大きいカードが右の2枚ぶんの高さに伸び、下に空の枠（1280 で約220px・1024 で約320px）が出た。
       → 見本のホームページの画面を、カードのいちばん下にブラウザの窓として入れる。
       PC: 残りの高さいっぱいに広げ、画面の上から切り抜く（カードの高さは右の2枚で決まったまま）。
       スマホ: 横幅 17rem までの小さな1枚。最初の画面と見本の節にも同じ画面があるので大きく出さない（540px の画像を表示幅の2倍以内で使う） */
#set .card:first-child{ display: flex; flex-direction: column; }
#set .card:first-child .card__media{
  order: 5; margin-top: var(--sp-5); width: min(100%, 17rem);
  overflow: hidden; border-radius: 6px; box-shadow: var(--shadow-1);
  border: 1px solid rgb(23 33 31 / .18); border-top: .9rem solid transparent;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 10'%3E%3Cg fill='%2317211f' fill-opacity='.24'%3E%3Ccircle cx='5' cy='5' r='4'/%3E%3Ccircle cx='20' cy='5' r='4'/%3E%3Ccircle cx='35' cy='5' r='4'/%3E%3C/g%3E%3C/svg%3E") .45rem .27rem / 1.5rem .375rem no-repeat, var(--paper);
  background-origin: border-box, border-box;
}
#set .card:first-child .card__media img{ display: block; }
@media (min-width: 960px){
  #set .card:first-child .card__media{
    position: relative; flex: 1 1 0; min-height: 10rem; width: auto; margin-top: var(--sp-6);
    border-top-width: 1.25rem; box-shadow: var(--shadow-2);
    background-position: .7rem .375rem, 0 0; background-size: 2.2rem .55rem, auto;
  }
  #set .card:first-child .card__media picture{ position: absolute; inset: 0; }
  #set .card:first-child .card__media img{ width: 100%; height: 100%; object-fit: cover; object-position: 50% 0; }
}

/* (5) 最初の1院の条件が、ボタンの下の灰色の小さな注意書きに埋もれていた → 本文の最後の段落にして、ボタンのすぐ上の帯にする。
       金額は並べない（二重価格の見せ方をしない） */
.sec--hero .hero__sub > p:last-child:not(:first-child){
  margin-top: var(--sp-5); padding: var(--sp-3) var(--sp-4);
  background: var(--celadon); border-left: 4px solid var(--accent); border-radius: 0 4px 4px 0;
  font-size: .9375rem; font-weight: 700; line-height: 1.65; color: var(--ink);
}
.sec--hero .hero__ctas{ margin-top: var(--sp-5); }
/* (2) 金額の幅（「40〜150万円」など）を数字の途中で折らない → lp.json の表で .u-nowrap（上の「アドレスはひとかたまり」と同じ部品）に入れた。
       後ろの「、」「。」も塊に入れる（外に出すと行頭に来た）。white-space:nowrap は文字200%で横にはみ出した（audit）ので使わない */
/* (2a)(b) 「で、」が行頭に来た・「月々の／お支払いは」で折れた → 原稿で「まで。」の後ろを改行し、
   スマホでも最初の画面の本文（帯を除く）は句読点・中黒の後ろでだけ折る（どの区切りも 16 字以内で 1 行に入るのを 390 で実測） */
@media (max-width: 599px){
  .sec--hero .hero__sub > p:not(:last-child){ word-break: keep-all; }
}

/* スマホ 390×844: 主ボタンを最初の画面に入れる。見本の画面を一回り小さくし、本文の行間を少し詰める */
@media (max-width: 599px){
  .sec--hero{ --sec-pt: var(--sp-5); }
  /* 台の内側の余白は % だと親（文字の列 358px）の幅で決まり、台を細くすると中のパソコン画面が 97px まで縮んだ。
     スマホでは rem で決め、高さは前と同じ（約190px）のまま、パソコン画面を約190px幅にする */
  .sec--hero .hero__media{ width: min(100%, 15rem); margin-top: var(--sp-3); padding: .875rem 2.75rem 2.5rem .5rem; }
  .sec--hero .hero__sub{ margin-top: var(--sp-3); font-size: 1rem; line-height: 1.62; }
  .sec--hero .hero__sub > p + p{ margin-top: var(--sp-3); }
  .sec--hero .hero__sub > p:last-child:not(:first-child){ margin-top: var(--sp-4); padding: var(--sp-2) var(--sp-3); font-size: .875rem; }
  .sec--hero .hero__ctas{ margin-top: var(--sp-4); }
}

/* (3) 節と節の間が 230px 前後あき、ページが途切れたように見えた（PC 1280 の #set の下など）。
       縦余白の3段はそのまま、値だけ下げる。地の色が変わらない境目は、次の節の上をさらに詰める */
.sec--sp-m{ --sec-pt: 3.5rem; --sec-pb: 2.5rem; }
.sec--sp-l:not(.sec--hero){ --sec-pt: 4rem; --sec-pb: 3rem; }
.sec--tone-base + .sec--tone-base, .sec--tone-sunk + .sec--tone-sunk + .sec--tone-base{ --sec-pt: 2.5rem; }
@media (min-width: 960px){
  /* 1024×768 で 1画面の 1/4（192px）を超えないところまで（実測） */
  .sec--sp-m{ --sec-pt-pc: 4.5rem; --sec-pb-pc: 3.5rem; }
  .sec--sp-l:not(.sec--hero){ --sec-pt-pc: 5.5rem; --sec-pb-pc: 4.5rem; }
  .sec--hero{ --sec-pb-pc: 3.5rem; }
  .sec--tone-base + .sec--tone-base, .sec--tone-sunk + .sec--tone-sunk + .sec--tone-base{ --sec-pt-pc: 3.5rem; }
}
/* 横向きのスマホ（780×450 など）: 1画面が低いので、上下をもう一段詰める */
@media (max-width: 959px) and (max-height: 520px){
  .sec--sp-m, .sec--sp-l:not(.sec--hero){ --sec-pt: 2rem; --sec-pb: 1.5rem; }
  .sec--hero{ --sec-pb: 2rem; }
  .sec--tone-base + .sec--tone-base, .sec--tone-sunk + .sec--tone-sunk + .sec--tone-base{ --sec-pt: 1.75rem; }
}


/* =====================================================================
   動き
   ===================================================================== */
@media (prefers-reduced-motion: no-preference){
  /* ---- 最初の画面（開いたとき・時間で動く）: 1.2秒・少し行き過ぎて戻る（1.07倍→1倍）。0.1〜0.15秒ずつ ---- */
  .sec--hero .hero__kicker{ animation: kc-pop 1.2s cubic-bezier(.34, 1.56, .64, 1) both; }
  .sec--hero .hero__headline{ --pop-y: 31px; animation: kc-pop 1.2s cubic-bezier(.34, 1.56, .64, 1) .1s both; }
  .sec--hero .hero__headline::after{ animation: kc-wipe .7s cubic-bezier(.65, 0, .35, 1) 1.3s both; }
  .sec--hero .hero__sub{ animation: kc-pop 1.2s cubic-bezier(.34, 1.56, .64, 1) .25s both; }
  .sec--hero .hero__ctas{ animation: kc-pop 1.2s cubic-bezier(.34, 1.56, .64, 1) .4s both; }
  .sec--hero .hero__note{ animation: kc-pop 1.2s cubic-bezier(.34, 1.56, .64, 1) .55s both; }
  .sec--hero .hero__media{ animation: kc-pop-r 1.2s cubic-bezier(.34, 1.56, .64, 1) .2s both; }
  .sec--hero .hero__media img{ animation: kc-zoom 7s cubic-bezier(.22, .61, .36, 1) .2s both; }
  .sec--hero .hero__media::after{ --pop-y: 40px; animation: kc-pop 1.2s cubic-bezier(.34, 1.56, .64, 1) .6s both; }

  /* ---- 下の節（画面に入ったら1回・時間で動く）。Chrome の animation-trigger だけ。
         出典 https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/animation-trigger
              https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/timeline-trigger
         mizuki-hikaku で分かった2つ: 範囲の終わり（exit 100%）まで書く／引き金ごとに trigger-scope: all ---- */
  @supports (animation-trigger: --t play-once){
    .sec__head, .stats, .sec__body--rich table, #problem .stack, #set .card, .showcase__shot,
    .plan, .deflist, .step, .sec__portrait, .qa{ trigger-scope: all; }
    .sec__head{ timeline-trigger: --kt-head view() entry 60% exit 100%; }
    .stats{ timeline-trigger: --kt-stats view() entry 25% exit 100%; }
    .sec__body--rich thead{ timeline-trigger: --kt-tbl view() entry 100% exit 100%; }
    #problem .stack{ timeline-trigger: --kt-list view() entry 25% exit 100%; }
    #set .card{ timeline-trigger: --kt-card view() entry 25% exit 100%; }
    .showcase__shot{ timeline-trigger: --kt-shot view() entry 40% exit 100%; }
    .plan{ timeline-trigger: --kt-plan view() entry 25% exit 100%; }
    .deflist{ timeline-trigger: --kt-dl view() entry 25% exit 100%; }
    .step{ timeline-trigger: --kt-step view() entry 60% exit 100%; }
    .sec__portrait{ timeline-trigger: --kt-photo view() entry 40% exit 100%; }
    .qa{ timeline-trigger: --kt-qa view() entry 10% exit 100%; }

    /* 見出しの帯: 線 0.9秒 → 見出しが 0.15秒後から 1.0秒でせり上がる */
    .sec__head::before{ animation: kc-wipe .9s cubic-bezier(.65, 0, .35, 1) both; animation-trigger: --kt-head play-once; }
    .sec__head .sec__title{ animation: kc-rise 1s cubic-bezier(.16, 1, .3, 1) .15s both; animation-trigger: --kt-head play-once; }
    .sec__head .sec__lead{ animation: kc-row .8s cubic-bezier(.16, 1, .3, 1) .35s both; animation-trigger: --kt-head play-once; }

    /* 数字: 1.2秒の「ポン」・0.12秒ずつ */
    .stats > .stat{ animation: kc-pop 1.2s cubic-bezier(.34, 1.56, .64, 1) both; animation-trigger: --kt-stats play-once; }
    .stats > .stat:nth-child(2){ animation-delay: .12s; }
    .stats > .stat:nth-child(3){ animation-delay: .24s; }

    /* 表の行: 1行 0.6秒・32px 浮く・0.1秒ずつ */
    .sec__body--rich tbody tr{ animation: kc-row .6s cubic-bezier(.16, 1, .3, 1) both; animation-trigger: --kt-tbl play-once; }
    .sec__body--rich tbody tr:nth-child(2){ animation-delay: .1s; }
    .sec__body--rich tbody tr:nth-child(3){ animation-delay: .2s; }
    .sec__body--rich tbody tr:nth-child(4){ animation-delay: .3s; }

    /* 困りごとの箇条書き: 0.6秒・0.1秒ずつ */
    #problem .stack > li{ animation: kc-row .6s cubic-bezier(.16, 1, .3, 1) both; animation-trigger: --kt-list play-once; }
    #problem .stack > li:nth-child(2){ animation-delay: .1s; }
    #problem .stack > li:nth-child(3){ animation-delay: .2s; }
    #problem .stack > li:nth-child(4){ animation-delay: .3s; }

    /* セットの中身のカード: 1.2秒の「ポン」・0.12秒ずつ（右の列が少し遅れる） */
    #set .card{ animation: kc-pop 1.2s cubic-bezier(.34, 1.56, .64, 1) both; animation-trigger: --kt-card play-once; }
    #set .card:nth-child(even){ animation-delay: .12s; }

    /* 見本の画面: 台が左から開き（1.1秒）、パソコン → スマホの順に入る */
    .showcase__shot{ animation: kc-curtain 1.1s cubic-bezier(.65, 0, .35, 1) both; animation-trigger: --kt-shot play-once; }
    .showcase__pc{ animation: kc-pop 1.2s cubic-bezier(.34, 1.56, .64, 1) .25s both; animation-trigger: --kt-shot play-once; }
    .showcase__sp{ --pop-y: 40px; animation: kc-pop 1.2s cubic-bezier(.34, 1.56, .64, 1) .45s both; animation-trigger: --kt-shot play-once; }

    /* 料金のカード */
    .plan{ animation: kc-pop 1.2s cubic-bezier(.34, 1.56, .64, 1) both; animation-trigger: --kt-plan play-once; }

    /* 条件の表の行: 0.6秒・0.1秒ずつ */
    .deflist > div{ animation: kc-row .6s cubic-bezier(.16, 1, .3, 1) both; animation-trigger: --kt-dl play-once; }
    .deflist > div:nth-child(2){ animation-delay: .1s; }
    .deflist > div:nth-child(3){ animation-delay: .2s; }
    .deflist > div:nth-child(4){ animation-delay: .3s; }
    .deflist > div:nth-child(5){ animation-delay: .4s; }

    /* 流れ: 番号が「ポン」と出て、中身が続く。右の列は 0.15秒遅れる */
    .step__no{ animation: kc-pop 1.2s cubic-bezier(.34, 1.56, .64, 1) both; animation-trigger: --kt-step play-once; }
    .step__title, .step__body{ animation: kc-row .8s cubic-bezier(.16, 1, .3, 1) .15s both; animation-trigger: --kt-step play-once; }

    /* 作る人の写真: 幕が左から開く 1.1秒 */
    .sec__portrait img{ animation: kc-curtain 1.1s cubic-bezier(.65, 0, .35, 1) both; animation-trigger: --kt-photo play-once; }

    /* よくある質問: 0.6秒・0.1秒ずつ */
    .qa__item{ animation: kc-row .6s cubic-bezier(.16, 1, .3, 1) both; animation-trigger: --kt-qa play-once; }
    .qa__item:nth-child(2){ animation-delay: .1s; }
    .qa__item:nth-child(3){ animation-delay: .2s; }
    .qa__item:nth-child(4){ animation-delay: .3s; }
    .qa__item:nth-child(5){ animation-delay: .4s; }
    .qa__item:nth-child(6){ animation-delay: .5s; }
    .qa__item:nth-child(7){ animation-delay: .6s; }
    .qa__item:nth-child(8){ animation-delay: .7s; }
    .qa__item:nth-child(9){ animation-delay: .8s; }
  }
}
@media (prefers-reduced-motion: no-preference) and (min-width: 960px){
  @supports (animation-trigger: --t play-once){
    .step:nth-child(even) .step__no{ animation-delay: .15s; }
    .step:nth-child(even) .step__title, .step:nth-child(even) .step__body{ animation-delay: .3s; }
  }
}
@keyframes kc-pop{ from{ opacity: 0; translate: 0 var(--pop-y, 24px); scale: 1.07; } 30%{ opacity: 1; } to{ opacity: 1; translate: none; scale: none; } }
@keyframes kc-pop-r{ from{ opacity: 0; translate: 31px 0; scale: 1.07; } 30%{ opacity: 1; } to{ opacity: 1; translate: none; scale: none; } }
/* 1倍から始めると、拡大が切り抜きの枠を 2px 超える瞬間が測る時刻で前後し、audit の「隠れた要素」が 3→4 と揺れた（2026-10-29 実測）。
   最初から少し拡大した状態で始めて、はみ出しを測る時刻によらず一定にする。拡大の幅（6%）は変えない */
@keyframes kc-zoom{ from{ transform: scale(1.02); } to{ transform: scale(1.08); } }
@keyframes kc-wipe{ from{ transform: scaleX(0); } to{ transform: scaleX(1); } }
@keyframes kc-rise{ from{ clip-path: inset(0 0 100% 0); transform: translateY(.9em); } to{ clip-path: inset(0 0 -.2em 0); transform: none; } }
@keyframes kc-row{ from{ opacity: 0; translate: 0 32px; } to{ opacity: 1; translate: none; } }
@keyframes kc-curtain{ from{ clip-path: inset(0 100% 0 0); } to{ clip-path: inset(0 0 0 0); } }
