/*
  フォーム共通のスタイル。素の CSS のみ（プリプロセッサなし）。ビルド時に 1 ファイルへ結合される。
  クラス命名は BEM 風の接頭辞付き。l- レイアウト / c- コンポーネント / u- ユーティリティ / is- 状態

  @import の順序のルール（あとに書いたものが勝つ。順序で勝敗が決まる規則があるので並べ替えない）
    1. 共通 12 本（_tokens 〜 _thanks）は下の順で固定する。使わない部品は import しない。
    2. 複数の form が同じ内容で持つ部品（_consent・_datepop・_gift-frame・_suggest・_unit）は、
       共通 12 本のあと・form 固有の前に置く。使う form だけが import する。
    3. form 固有（_no{N}*.css）は必ず最後。複数あるときは依存順（前のファイルを後ろが上書きする順）。
    4. 共通 CSS に勝つために、クラスの重ね書き・祖先セレクタの追加・!important を使わない。
       同じ詳細度のまま、後ろに置くことで勝たせる。スコープを足すのは別の要素に限定するときだけ。
    5. 共通の状態（:checked・.is-invalid・.is-disabled・:focus-visible・[hidden]）に勝たせる規則は、
       その状態のクラス・擬似クラスを含めて書く。
    6. @layer は使わない（非対応のブラウザでは層の中の CSS が丸ごと無効になる）。
       @charset は書かない（決定180。貼り付け先HTMLは Shift_JIS で、宣言を持たない外部CSSは参照元の文字コードで読まれるため、
       非ASCII文字は content に直接書かず Unicode エスケープにする）。
*/

/* 1. 共通（繰り返し・確認サマリは使わないので import しない） */
/*
  デザイントークン。
  配色は j-urban.jp から抽出した色が基調。役割の割り当てはこのフォーム群の判断。
  トークンは全フォームで同じ値にする（form 固有の値はそのフォームの CSS に置く）。
*/

:root {
  /* --- 文字・線・面 --- */
  --c-text: #3b3b41;
  --c-text-sub: #70757b;
  --c-line: #e6e4e1;
  --c-line-strong: #d3d0cc;
  /*
    面の3層。本配色では3つとも白なので見た目は同じだが、役割が異なるため
    トークンを分けている（層ごとに濃さを変える配色にもこのまま対応できる）。

      --c-canvas   … 画面全体の地。コンテンツの左右に見える余白
      --c-content  … 中央のコンテンツエリア（.l-shell の最大幅 --content-width）と sticky ヘッダー
      --c-bg       … 入力欄・カード・ロゴのヘッダー・完了画面の箱の「面」
  */
  --c-canvas: #fff;
  --c-content: #fff;
  --c-bg: #fff;
  --c-bg-soft: #f7f6f4;
  --c-track: #e9e7e4;

  /*
    --- グラファイト：進捗バーと「次へ」 ---
    ボタンと進捗バーはグレー基調にする。彩度を持つ面を画面から外すと
    情報（設問・入力欄）が前に出て、落ち着いた印象になる。
    純無彩色ではなく上の文字・線と同じくわずかに暖色へ寄せ、地の色から浮かせない。
  */
  --c-graphite: #4c4f55;
  --c-graphite-strong: #363940; /* hover と下辺の影 */

  /*
    --- 進捗バーの塗り（左＝明部 → 右＝暗部のグラデーション） ---
    「次へ」と同じグラファイトで通す（バーだけ目立たせない設計）。
    右端＝暗部が進捗の境界を成すので、溝（--c-track）との比は暗部で見る。
  */
  --c-progress-from: #6f737b;
  --c-progress-to: var(--c-graphite);

  /* --- 墨：最終ステップの送信ボタン専用。「次へ」との差は明度で作る --- */
  --c-ink: #22252b;
  --c-ink-strong: #14161b;

  /* --- アクセント（暖色）：選択中のカード・バッジ --- */
  /* 白背景で 4.5:1 を確保するための濃いオレンジ。枠線・アイコン・マークに使う */
  --c-accent-ink: #a96f0b;
  --c-accent-tint: #fff8ec;

  /* --- エラー --- */
  --c-error: #c00;
  --c-error-tint: #fdf3f3;

  /* --- フォーカスリング：グレーの面・白地のどちらの上でも識別できる青 --- */
  --c-focus: #1668c9;

  /* --- 形 --- */
  --radius-card: 16px;
  --radius-input: 12px;
  --radius-pill: 999px;

  /* --- 寸法 --- */
  /*
    --content-width は `.l-shell` の外形幅＝**薄い背景を敷くエリアの幅**（PC の最大 1100px）。
    本文の幅はここから左右の --gutter を引いた値になる（PC の最大で 1100 − 60×2 = 980px）。
    それより狭い画面では画面幅に追従する。

    PC の gutter を広く取っているのは、背景のエリアが本文にぴったり張り付くと
    詰まって見えるため。
  */
  --content-width: 1100px;
  --gutter: 60px;
  /*
    PC で入力フィールド（テキスト入力・select・カード群）1 つあたりに許す最大幅。
    超えたら左寄せにする（`.c-step--field-max`。_step.css）。
  */
  --field-max-width: 720px;
  --card-min-h: 72px;

  --font-base:
    "Hiragino Kaku Gothic ProN", "Hiragino Sans", "Noto Sans JP",
    "Yu Gothic Medium", "Yu Gothic", Meiryo, system-ui, sans-serif;

  --duration: 0.24s;
}

/*
  モバイルは左右の余白を詰める。`.l-shell` は画面幅いっぱいになる（375 < 最大幅）ので、
  本文幅は 375 − 20×2 = 335px。
*/
@media (max-width: 767px) {
  :root {
    --gutter: 20px;
  }
}

@media (prefers-reduced-motion: reduce) {
  :root {
    --duration: 0.001s;
  }
}

/*
  エラー文のアイコン（丸囲みの「!」）。
  .c-field__error::before が mask で使うため、色を持たない形だけのSVGにしている。
  設計§4.2 の「エラー要素は常に存在させ、空のときCSSで畳む」を満たすための構成。
*/
:root {
  --icon-error: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='9' fill='none' stroke='%23000' stroke-width='1.8'/%3E%3Cpath d='M12 7.4v5.2' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round'/%3E%3Cpath d='M12 16.2v.2' fill='none' stroke='%23000' stroke-width='2.2' stroke-linecap='round'/%3E%3C/svg%3E");
}
/* リセットと土台 */

*,
*::before,
*::after {
  box-sizing: border-box;
}

html {
  -webkit-text-size-adjust: 100%;
}

/*
  ヘッダーがウインドウ全幅の帯になったため、画面いっぱいの高さは body で持つ。
  ヘッダーは .l-shell の外にあり、.l-shell が残りの高さを埋める（flex: 1）。
  .l-shell 側で min-height: 100vh を持つと「100vh ＋ ヘッダー高」になって
  内容が短いステップでも常にスクロールバーが出てしまう。
*/
body {
  margin: 0;
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  color: var(--c-text);
  /* 画面全体の地。コンテンツエリアの左右に見える層（_tokens.css の3層の注記） */
  background: var(--c-canvas);
  font-family: var(--font-base);
  font-size: 16px;
  line-height: 1.7;
  -webkit-font-smoothing: antialiased;
}

/* hidden はどの表示指定よりも優先させる */
[hidden] {
  display: none !important;
}

h1,
h2,
h3,
p,
ul,
ol,
fieldset,
legend {
  margin: 0;
  padding: 0;
}

ul,
ol {
  list-style: none;
}

fieldset {
  border: 0;
  min-width: 0;
}

a {
  color: #0b5fae;
  text-underline-offset: 0.2em;
}

a:hover {
  color: #094a87;
}

button {
  font: inherit;
  color: inherit;
}

/* フォーカスリングは消さない */
:focus-visible {
  outline: 3px solid var(--c-focus);
  outline-offset: 2px;
  border-radius: 4px;
}

/* 視覚的にのみ隠す。読み上げとフォーカスは残す */
.u-visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* --- レイアウト --- */

/*
  ページの土台。ナビゲーションは入力欄の直下に置く（画面下端には固定しない）。
  縦フレックスにしているのは、flex item 同士では margin が相殺されず、
  各ブロックの余白が CSS に書いた値のまま効くため。
*/
.l-shell {
  display: flex;
  flex-direction: column;
  /* ヘッダーを除いた残りの高さを埋める。100vh は body 側が持つ（上の注記） */
  flex: 1;
  width: 100%;
  max-width: var(--content-width);
  margin: 0 auto;
  padding: 0 var(--gutter);
  /*
    中央のコンテンツエリアの地。画面の地（--c-canvas）より一段淡い。
    flex: 1 で残りの高さを埋めるので、内容が短いステップでも
    この帯が画面下端まで伸びる。
  */
  background: var(--c-content);
}

.l-main {
  display: flex;
  flex: 1;
  flex-direction: column;
}

.c-form {
  display: flex;
  flex: 1;
  flex-direction: column;
}

/*
  フォーム名。ページの見出し（h1）。ロゴとプログレスバーの間に置く。
  文字が大きいぶん行間は詰める。

  折り返しは、単語（半角スペースで区切った語）を保つ（keep-all）。「…アンケー／ト」のように
  1 文字だけ次の行へ落ちるのを防ぐ。スペースの無い長い名前が幅を超えるときだけ
  字単位で折る（overflow-wrap: anywhere）。
*/
.c-formname {
  margin: 18px 0 0;
  font-size: 30px;
  font-weight: 700;
  line-height: 1.35;
  letter-spacing: 0.01em;
  word-break: keep-all;
  overflow-wrap: anywhere;
}

/*
  ヘッダーはロゴのみ。

  面の色（白）と下線を**ウインドウ全幅**に敷く。
  そのため `.l-shell` の外に置き、幅の制限は内側のラッパーが持つ。
  地も白なので、見た目は全幅の下線として現れる。
*/
.c-header {
  border-bottom: 1px solid var(--c-line);
  background: var(--c-bg);
}

/* ロゴの左端を本文と揃える。幅と gutter は .l-shell と同じ値を使う */
.c-header__inner {
  max-width: var(--content-width);
  margin: 0 auto;
  padding: 18px var(--gutter) 16px;
}

.c-header__logo {
  display: block;
  width: auto;
  height: 32px;
}

@media (max-width: 767px) {
  .c-header__inner {
    padding: 14px var(--gutter) 12px;
  }

  .c-header__logo {
    height: 26px;
  }

  .c-formname {
    margin-top: 14px;
    font-size: 22px;
  }
}

/* フォーム名。PHP が受付マスタの entry_title を出す。空のときは畳む */
.c-formname:empty {
  display: none;
}
/*
  ステップインジケーター。

  Duolingo にならい、ステップ番号を出さない連続プログレスバーにする。
  総ステップ数が回答で変わるため、番号付きステッパーより
  「割合で伸びる」表現のほうが素直。
  戻る導線はここには置かず、「次へ」と同じ .c-nav にある。
*/

.c-progress {
  position: sticky;
  top: 0;
  z-index: 10;
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 14px 0 16px;
  /*
    スクロールしてくる本文を隠すための不透明な地。
    コンテンツエリアの中にあるので、面（--c-bg）でも画面の地（--c-canvas）でもなく
    --c-content を使う。ここが違う色だと sticky の帯として浮いてしまう。
  */
  background: var(--c-content);
}

/*
  バー両端の目盛り。

  進捗の「起点」と「終点」を数字で示すだけの添え物なので、設問より前に出ない
  大きさ・色にする。数字の見た目が動かないよう等幅数字にしている
  （0% と 100% は桁数が違うが、幅が揺れると sticky の帯として落ち着かない）。
*/
.c-progress__scale {
  flex: none;
  color: var(--c-text-sub);
  font-size: 12px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  line-height: 1;
}

/*
  溝（track）は内側に影を落として、面にはめ込まれた細い溝に見せる。
  太いバーは進捗を強く主張するが、グレー基調では 10px 程度に抑えたほうが
  落ち着いて見える（設問より前に出ない）。
*/
.c-progress__track {
  flex: 1;
  height: 10px;
  border-radius: var(--radius-pill);
  background: var(--c-track);
  box-shadow: inset 0 1px 2px rgb(0 0 0 / 7%);
  overflow: hidden;
}

/*
  塗りは横方向のグラデーション（明→暗）＋上端の細いハイライト。
  単色だとのっぺりするが、この二層で金属的な艶が出る。

  色は専用トークン（_tokens.css の --c-progress-*）。「次へ」と同じグラファイト。
  進捗の境界を成すのは右端＝暗部なので、溝との比は暗部で見る
  （6.65:1。色以外の手掛かりが無くても境界が分かる）。
*/
.c-progress__fill {
  display: block;
  width: 0;
  height: 100%;
  border-radius: var(--radius-pill);
  background-color: var(--c-progress-to);
  background-image:
    linear-gradient(
      to bottom,
      rgb(255 255 255 / 20%) 0,
      rgb(255 255 255 / 6%) 45%,
      rgb(0 0 0 / 8%) 100%
    ),
    linear-gradient(to right, var(--c-progress-from), var(--c-progress-to));
  transition: width 0.45s cubic-bezier(0.22, 1, 0.36, 1);
}

@media (prefers-reduced-motion: reduce) {
  .c-progress__fill {
    transition: none;
  }
}

@media (max-width: 767px) {
  /*
    目盛りが溝の幅を食う。375px 幅では目盛り2つ＋gap のぶん溝が短くなるため、
    文字と間隔を詰めて溝の長さを確保する。
  */
  .c-progress {
    gap: 8px;
  }

  .c-progress__scale {
    font-size: 11px;
  }
}
/*
  ステップ（1画面分）の枠と切替アニメーション。

  見出しは `.u-visually-hidden` で隠してあるが、ステップ切替時のフォーカス移動先として機能する。
*/

.c-step {
  padding-bottom: 8px;
}

.c-step.is-active {
  animation: ac-step-in var(--duration) cubic-bezier(0.22, 1, 0.36, 1) both;
}

@keyframes ac-step-in {
  from {
    opacity: 0;
    transform: translateY(8px);
  }
  to {
    opacity: 1;
    transform: none;
  }
}

@media (prefers-reduced-motion: reduce) {
  .c-step.is-active {
    animation: none;
  }
}

/*
  PC：入力フィールドの最大幅。

  `.l-shell` の本文は PC で最大 980px まで広がるため、1 問ずつ聞く STEP では入力欄が間延びする。
  `c-step--field-max` を付けた STEP の `.c-fields` 直下の要素を --field-max-width で止め、左寄せにする。
  `data-field-wide` を付けた要素だけは止めず、本文幅を使う（選択肢の多いカード群など）。
*/
@media (min-width: 768px) {
  .c-step--field-max > .c-fields > * {
    max-width: var(--field-max-width);
  }

  .c-step--field-max > .c-fields > [data-field-wide] {
    max-width: none;
  }
}
/* テキスト入力・セレクト・バッジ・エラー表示 */

.c-fields {
  display: flex;
  flex-direction: column;
  gap: 24px;
}

/*
  住所ブロック（郵便番号・都道府県市区町村・番地）は `.h-adr` という
  **1つの div** にまとめる必要がある（yubinbango.js の対応付けの単位）。
  そのため `.c-fields` の gap が中の `.c-field` 同士には効かず、
  補足文と次のラベルがくっついて見える。ブロック自身にも同じ間を持たせる。
*/
[data-address-block] {
  display: flex;
  flex-direction: column;
  gap: 24px;
}

/*
  姓・名のように1つの設問を複数欄で受けるときのまとまり。
  legend は rendered legend のまま（display を上書きしない）、
  レイアウトは内側の span で組む（_cards.css の legend と同じ理由）。
*/
.c-group__legend {
  width: 100%;
  padding: 0;
  margin-bottom: 8px;
}

.c-group__legend-inner {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  font-size: 15px;
  font-weight: 700;
}

/*
  姓・名（フリガナ含む）を2列に並べるグリッド。中に入るのはそのまま `.c-field`。
  氏名は姓・名・姓フリガナ・名フリガナの4欄で、この並びを使う。
  姓・名はラベルが短く、モバイル幅（390px）でも2列のまま崩れないため、
  他のカード式グループと違い `@media` での1列化はしない。
*/
.c-group__cols {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 16px;
}

/*
  入れ子の項目（`.c-fields--nested`）のラベルは、グループ見出しの従属であることを
  見た目で示す。

  このフォームでは「お探しの物件」（legend）の下に「エリア」「予算」「広さ」「築年数」が
  ぶら下がる。指定が無いと legend と同じ 15px / 700 / 同色で並び、階層が見えない。
*/
.c-fields--nested .c-field__label {
  margin-bottom: 6px;
  color: var(--c-text-sub);
  font-size: 13px;
}

/*
  ラベル本文とバッジを横並びにする。
  設問文がそのままラベルになる欄（セレクト式の設問・「その他」欄）は文字数が多く、
  375px 幅ではバッジまで1行に収まらない。折り返しを許して、はみ出させない。
*/
.c-field__label {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  margin-bottom: 8px;
  font-size: 15px;
  font-weight: 700;
}

/*
  ラベル本文に添える注記（例：郵便番号の「（ハイフン不要）」）。
  `.c-fields--nested .c-field__label` と同じトークンで、本文より一段小さく・
  控えめな色にする。
*/
.c-field__label-note {
  color: var(--c-text-sub);
  font-size: 13px;
  font-weight: 400;
}

.c-input,
.c-select {
  display: block;
  width: 100%;
  min-height: 56px;
  padding: 14px 16px;
  border: 2px solid var(--c-line);
  border-radius: var(--radius-input);
  background: var(--c-bg);
  color: var(--c-text);
  /* iOS Safari のフォーカス時自動ズームを避けるため 16px 未満にしない */
  font-family: inherit;
  font-size: 16px;
  line-height: 1.5;
  transition: border-color var(--duration), background-color var(--duration);
}

.c-input::placeholder {
  color: #a3a09c;
}

.c-input:hover,
.c-select:hover {
  border-color: var(--c-line-strong);
}

.c-input:focus,
.c-select:focus {
  border-color: var(--c-accent-ink);
  outline: none;
}

.c-input:focus-visible,
.c-select:focus-visible {
  outline: 3px solid var(--c-focus);
  outline-offset: 2px;
}

/*
  桁数の目安を欄の幅で示す（郵便番号・人数・年収などの短い数値欄）。
  モバイルでも 260px を保つ（郵便番号欄が横幅いっぱいになるのを避ける）。
*/
.c-input--short {
  max-width: 260px;
}

.c-select {
  appearance: none;
  padding-right: 44px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M6 9.5 12 15.5 18 9.5' fill='none' stroke='%233b3b41' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 14px center;
  background-size: 20px 20px;
}

/*
  自由記述（textarea）。

  `.c-input` と同じ枠・角丸にして、入力欄の一員であることを見せる。
  高さは `rows` ではなく min-height で決める（rows は font-size と行間に
  引きずられて機種ごとに変わる）。`resize: vertical` は残す —— 長文を
  書く人が自分で広げられるようにするため。横方向は伸ばさせない（折り返しが壊れる）。
*/
.c-textarea {
  display: block;
  width: 100%;
  min-height: 132px;
  padding: 12px 16px;
  border: 2px solid var(--c-line);
  border-radius: var(--radius-input);
  background: var(--c-bg);
  color: var(--c-text);
  font-family: inherit;
  /* iOS Safari のフォーカス時自動ズームを避けるため 16px 未満にしない */
  font-size: 16px;
  line-height: 1.6;
  resize: vertical;
  transition: border-color var(--duration), background-color var(--duration);
}

/*
  `rows="2"` を付けた欄（補足の自由記述）は 2 行分の高さにする
  （16px × 行間 1.6 × 2 行 ＋ 上下 padding 24px ＋ 枠 4px）。付けない欄は上の min-height（約4行）。
*/
.c-textarea[rows="2"] {
  min-height: 80px;
}

.c-textarea::placeholder {
  color: #a3a09c;
}

.c-textarea:hover {
  border-color: var(--c-line-strong);
}

.c-textarea:focus {
  border-color: var(--c-accent-ink);
  outline: none;
}

.c-textarea:focus-visible {
  outline: 3px solid var(--c-focus);
  outline-offset: 2px;
}

.c-field__hint {
  margin-top: 6px;
  color: var(--c-text-sub);
  font-size: 13px;
}

/* --- 必須・任意・複数選択可のバッジ --- */

.c-badge {
  flex: none;
  padding: 2px 8px;
  border-radius: 6px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.04em;
  line-height: 1.7;
}

.c-badge--required {
  background: var(--c-error-tint);
  color: var(--c-error);
  border: 1px solid #f0c9c9;
}

.c-badge--optional {
  background: var(--c-bg-soft);
  color: var(--c-text-sub);
  border: 1px solid var(--c-line);
}

.c-badge--multi {
  background: var(--c-accent-tint);
  color: var(--c-accent-ink);
  border: 1px solid #f0d8ac;
}

/* --- エラー（色だけで示さず、アイコンとテキストを併用する） --- */

.c-field__error {
  display: flex;
  align-items: flex-start;
  gap: 6px;
  margin-top: 8px;
  color: var(--c-error);
  font-size: 14px;
  font-weight: 700;
  line-height: 1.55;
}

/*
  文言が空なら要素ごと畳む。初期表示ではすべてこの状態になる。

  ★ SPIRAL の `$error:【キーワード】$` はエラーが無いとき空文字に展開されるが、
    要素そのものは静的HTMLに常に存在する（決定96：サーバー側エラーと JS の検証が
    同じ要素に書き込む）。中に SVG を持たせると :empty が効かず、エラーが無くても
    アイコンが出てしまうため、アイコンは ::before で描く。
*/
.c-field__error:empty {
  display: none;
}

.c-field__error::before {
  content: "";
  flex: none;
  width: 18px;
  height: 18px;
  margin-top: 2px;
  background-color: currentColor;
  /* 丸囲みの「!」。currentColor で塗るため mask で形だけを与える */
  mask: var(--icon-error) center / contain no-repeat;
  -webkit-mask: var(--icon-error) center / contain no-repeat;
}

/*
  `is-invalid` は入力欄そのものに付く（src/ts/validation.ts の invalidTargetOf）。
  以前は `.c-field` に付けていたが、1つの `.c-field` に欄が2つある箇所
  （エリア欄と「未定」チェック）で、後から検証された側が先の赤枠を剥がしていた。
*/
.c-input.is-invalid,
.c-select.is-invalid,
.c-textarea.is-invalid {
  border-color: var(--c-error);
  background: var(--c-error-tint);
}

/* --- エラーサマリ --- */

.c-summary {
  margin-bottom: 24px;
  padding: 18px 20px;
  border: 2px solid var(--c-error);
  border-radius: var(--radius-card);
  background: var(--c-error-tint);
}

.c-summary:focus {
  outline: none;
}

.c-summary:focus-visible {
  outline: 3px solid var(--c-focus);
  outline-offset: 2px;
}

.c-summary__title {
  color: var(--c-error);
  font-size: 16px;
  font-weight: 700;
}

.c-summary__list {
  margin-top: 8px;
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.c-summary__list a {
  color: var(--c-error);
  font-weight: 700;
}

/* ------------------------------------------------------------------ */
/* 画面内ブロック小見出し                                              */
/* ------------------------------------------------------------------ */

/*
  1つのステップに設問グループを複数置くときの見出し。

  ステップ見出し（h2）は視覚的に隠してあり、画面上の最上位の見出しは
  設問文（.c-cards__question / .c-field__label＝16px・700）になる。
  小見出しはその**さらに上**に立つので、大きさではなく
  「左の縦罫＋一段小さい文字＋下の余白」で階層を作る。
  設問文より大きくすると、設問そのものより見出しが目立ってしまう。

  マークアップは h3（ステップ見出しの h2 の下）。
  ```html
  <h3 class="c-subhead">ご本人さまについて</h3>
  ```
  補足を添えるときは直後に `<p class="c-subhead__note">`。
*/
.c-subhead {
  display: flex;
  align-items: center;
  gap: 8px;
  padding-left: 10px;
  border-left: 4px solid var(--c-accent-ink);
  font-size: 15px;
  font-weight: 700;
  line-height: 1.4;
}

/* 直前に設問がある場合は上に間を取る（.c-fields の gap では足りない） */
.c-fields > .c-subhead:not(:first-child) {
  margin-top: 8px;
}

.c-subhead__note {
  margin-top: -8px;
  color: var(--c-text-sub);
  font-size: 13px;
  line-height: 1.6;
}

/*
  見出しを持たない地の文（ご案内・導入文）。1 文 1 段落で `<p>` を並べる。
  `.c-subhead__note` は見出し直下に置く前提で負のマージンを持つため、
  ステップ先頭の単独段落には使えない（進捗バーに食い込む）。
*/
.c-lead {
  margin: 0;
  color: var(--c-text);
  font-size: 15px;
  line-height: 1.7;
}

.c-lead p + p {
  margin-top: 12px;
}

/*
  1 画面に 2 ブロックを束ねたときの区切り線。
  小見出し（.c-subhead）だけでは、同じ形の設問が続く画面で型の切り替わりが読み取れない。
*/
.c-divider {
  height: 0;
  margin: 4px 0;
  border: 0;
  border-top: 1px solid var(--c-line);
}

/* --- モバイル --- */

@media (max-width: 767px) {
  /*
    高さは PC（56px）の約80%。
    font-size は 16px から下げない（iOS Safari のフォーカス時自動ズームを招くため）。
    縮めたのは上下 padding のみで、45px はタップ領域の下限 44px を保っている。
  */
  .c-input,
  .c-select {
    min-height: 45px;
    padding: 8px 16px;
  }
}
/*
  カード式ボタン。

  Duolingo の選択肢カード（大きなタップ領域・面での選択状態・アイコン付き）を下敷きにする。
  input は display:none にせず視覚的にのみ隠す。隠すとフォーカスを受け取れず、
  キーボードでの矢印キー移動が不能になるため。

  単一選択と複数選択の区別は3点セットで行う。
    1. マークの形 …… 単一＝円 / 複数＝角丸四角にチェック
    2. バッジ　　 …… 複数選択のグループにだけ「複数選択可」
    3. 選択時の表現 … 単一＝円を塗る / 複数＝チェックが現れる
*/

/*
  legend は fieldset の「rendered legend」で、Chrome では display の上書きが効かない。
  float で通常フローへ逃がす手もあるが、直後に差し込まれるエラー文が
  フロートの脇（幅ゼロ）へ押し込まれて1文字ずつ折り返されるため採らない。
  legend 自体はブロックのまま、内側の span でレイアウトを組む。
*/
.c-cards__legend {
  width: 100%;
  padding: 0;
  margin-bottom: 12px;
}

.c-cards__legend-inner {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
}

.c-cards__question {
  font-size: 16px;
  font-weight: 700;
}

.c-cards__badges {
  display: flex;
  gap: 6px;
}

.c-cards__list {
  display: grid;
  grid-template-columns: 1fr; /* モバイルは1カラム */
  gap: 10px;
}
/* 列数は末尾の「列数」の節で決める（--cols / --cols-sp） */

.c-card {
  position: relative;
}

/* 視覚的にのみ隠す。フォーカスは受け取れる */
.c-card__input {
  position: absolute;
  top: 50%;
  left: 16px;
  width: 1px;
  height: 1px;
  margin: 0;
  opacity: 0;
  pointer-events: none;
}

.c-card__label {
  display: flex;
  align-items: center;
  gap: 14px;
  min-height: var(--card-min-h);
  height: 100%;
  padding: 14px 16px;
  /* 枠は四辺とも 2px。影も付けないフラットな造形で、厚みの表現は持たない */
  border: 2px solid var(--c-line);
  border-radius: var(--radius-card);
  background: var(--c-bg);
  font-size: 15px;
  font-weight: 700;
  line-height: 1.45;
  cursor: pointer;
  transition:
    background-color var(--duration),
    border-color var(--duration),
    transform 0.08s ease-out;
}

@media (hover: hover) {
  .c-card__label:hover {
    background: var(--c-bg-soft);
    border-color: var(--c-line-strong);
  }
}

/*
  押した手応え。沈み込みは transform だけで表す。
  margin での補正が要らないので、周囲のカードの位置もずれない。
*/
.c-card__label:active {
  transform: translateY(1px);
}

.c-card__icon {
  flex: none;
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  color: var(--c-text-sub);
  transition: color var(--duration);
}

/*
  pre-line にしているのは、選択肢ラベルの改行を `\n` で表しているため
  （src/ts/choices.ts の Choice.label）。ラベルは escapeHtml を通してから
  DOM に入るので `<br>` は使えない。連続する空白は畳まれ、改行だけが残る。
*/
.c-card__text {
  flex: 1;
  min-width: 0;
  white-space: pre-line;
}

/* ラベル＋補足文の縦積み（Choice.note があるとき・画像付きカード） */
.c-card__body {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.c-card__note {
  color: var(--c-text-sub);
  font-size: 12px;
  font-weight: 400;
  line-height: 1.5;
}

.c-card__mark {
  flex: none;
  display: grid;
  place-items: center;
  width: 24px;
  height: 24px;
  border: 2px solid var(--c-line-strong);
  color: transparent;
  transition: background-color var(--duration), border-color var(--duration), color var(--duration);
}

.c-card__mark--radio {
  border-radius: var(--radius-pill);
}

.c-card__mark--check {
  border-radius: 8px;
}

/* --- 選択状態（:checked + label で完結させる） --- */

.c-card__input:checked + .c-card__label {
  border-color: var(--c-accent-ink);
  background: var(--c-accent-tint);
}

.c-card__input:checked + .c-card__label .c-card__icon {
  color: var(--c-accent-ink);
}

.c-card__input:checked + .c-card__label .c-card__mark {
  border-color: var(--c-accent-ink);
}

/* 単一選択：円を塗る */
.c-card__input:checked + .c-card__label .c-card__mark--radio {
  box-shadow: inset 0 0 0 4px var(--c-accent-tint), inset 0 0 0 12px var(--c-accent-ink);
}

/* 複数選択：チェックが現れる */
.c-card__input:checked + .c-card__label .c-card__mark--check {
  background: var(--c-accent-ink);
  color: #fff;
}

/* --- フォーカス（キーボード利用者が現在位置を見失わないよう必ず出す） --- */

.c-card__input:focus-visible + .c-card__label {
  outline: 3px solid var(--c-focus);
  outline-offset: 2px;
}

/* --- エラー時のグループ --- */

.c-cards.is-invalid .c-card__label {
  border-color: #e8b4b4;
}

.c-cards.is-invalid .c-card__input:checked + .c-card__label {
  border-color: var(--c-accent-ink);
}

/* --- 3 列でラベルが長いグループの詰め（PC） --- */

@media (min-width: 768px) {
  /*
    3列でラベルが長いグループは、横一列（アイコンの右にテキスト）のまま
    余白と部品を詰めてテキスト幅を確保する。

    3列だとカード幅が約 193px しかなく、既定の余白（padding 16px・gap 14px・
    アイコン 34px・マーク 24px）ではテキストの取り分が 71px しか残らない。
    ご検討内容の「浴室・洗面所」やお問い合わせ内容の「現地調査・見積り希望」は
    100px 前後を必要とし、意図した改行位置より手前で折り返してしまう。

    左右 padding を 8px、gap を 8px、アイコンを 24px に詰めて 109px 確保する。
    マーク（24px）は縮めない。選択時の塗り（.c-card__mark--radio の inset 影）が
    この直径を前提にしているため。上下 padding は 14px のままでカード高さは変えない。

    **対象は data-tight="true" のグループだけ**（CardGroupSpec.tight）。
    ラベルが短いグループまで詰めると、アイコンだけが小さい浮いた見た目になる。
  */
  .c-cards__list[data-cols="3"][data-tight="true"] .c-card__label {
    gap: 8px;
    padding: 14px 8px;
  }

  .c-cards__list[data-cols="3"][data-tight="true"] .c-card__icon {
    width: 24px;
    height: 24px;
  }

  /* 枠を縮めたぶん、中の図形も 26px → 20px に合わせる */
  .c-cards__list[data-cols="3"][data-tight="true"] .c-card__icon svg {
    width: 20px;
    height: 20px;
  }
}

@media (max-width: 767px) {
  /*
    高さは PC（72px）より詰めて 56px にする。

    内容の高さは 54px（padding 8px ×2 ＋ 枠 4px ＋ アイコン枠 34px）なので、
    **min-height の 56px が下限として効いている**。
    さらに詰めるならアイコン（34px）を小さくする必要がある。
    ラベルが2行になるカード（`\n` で改行位置を指定しているもの）は
    行の高さが勝って 66px 前後になる。

    タップ領域の下限 44px は保っている。
  */
  .c-card__label {
    min-height: 56px;
    padding: 8px 12px;
    font-size: 16px;
  }
}

/* 押し込みの動きは --duration の外にあるため、個別に打ち消す（_nav.css と同じ） */
@media (prefers-reduced-motion: reduce) {
  .c-card__label:active {
    transform: none;
  }
}

/* ================================================================== */
/* variant：見た目のバリエーション                                     */
/*                                                                    */
/* いずれも radio / checkbox のグループであることは変わらない。         */
/* 骨格（.c-card > .c-card__input + .c-card__label）は共通で、          */
/* label の中身と並べ方だけを変えている（src/ts/cards.ts）。            */
/* 列数はここでは決めず、末尾の「列数」の節にまとめる。                  */
/* ================================================================== */

/* --- compact：時間帯など短いラベルを詰めて並べる --- */

/*
  アイコンも選択マークも持たない。文字だけのカードなので、
  選択状態は面と枠（共通の :checked スタイル）だけで示す。
  時間帯は「10:00〜」のように幅が揃うため、中央寄せが読みやすい。
*/
.c-cards__list[data-variant="compact"] {
  gap: 8px;
}

.c-cards__list[data-variant="compact"] .c-card__label {
  justify-content: center;
  min-height: 52px;
  padding: 12px 8px;
  text-align: center;
}

/* --- image：画像付きカード --- */

/*
  画像は上、ラベルは下。横並びにすると 390px では画像が 100px 程度まで痩せて
  何が写っているか判別できなくなる。
  縦積みなので選択マークは右上へ絶対配置する（label の中の流れから外す）。
*/
.c-cards__list[data-variant="image"] {
  gap: 10px;
}

.c-cards__list[data-variant="image"] .c-card__label {
  position: relative;
  flex-direction: column;
  align-items: stretch;
  gap: 10px;
  padding: 10px;
}

.c-card__media {
  display: block;
  overflow: hidden;
  border-radius: 10px;
  background: var(--c-bg-soft);
}

/*
  比率を固定して、画像の縦横がまちまちでもカードの高さを揃える。
  差し替え用の実画像は 4:3 で用意すると切れない。
*/
.c-card__img {
  display: block;
  width: 100%;
  aspect-ratio: 4 / 3;
  object-fit: cover;
}

.c-cards__list[data-variant="image"] .c-card__mark {
  position: absolute;
  top: 16px;
  right: 16px;
  background: var(--c-bg);
}

/* --- radio：ラジオボタン風の選択カード --- */

/*
  単一選択のカード（良い／普通／悪い・ある／無い など）を、
  「ラベルを左寄せ、丸いラジオ印を右端」の見た目にする（印の位置は複数選択カードのチェック印と同じ）。
  高さは compact と同じ 52px に揃えている（枠 2px×2 ＋ 上下 padding 12px×2 ＋ 印 24px）。
  単一選択だけを想定する（複数選択に付けても印の形が矛盾しないよう、印は選択方式に従う）。
  列数は data-cols / data-cols-sp で決め、SP でも折り返さない（HTML は両方に同じ値を書く）。
  印（24px）を右端に置くぶん、3 列の狭いカード（SP 390px で 111px 幅）は
  余白・文字サイズを詰めて「契約通り」等の 4 文字ラベルを 1 行に収める。
*/
.c-cards__list[data-variant="radio"] {
  gap: 8px;
}

.c-cards__list[data-variant="radio"] .c-card__label {
  gap: 12px;
  min-height: 52px;
  padding: 12px 16px;
  text-align: left;
}

.c-cards__list[data-variant="radio"] .c-card__text {
  flex: 1;
  min-width: 0;
  white-space: nowrap;
}

/* 3 列の狭いカード（SP）：4 文字ラベル＋印 24px が収まるよう詰める（390px で 111px 幅） */
@media (max-width: 479px) {
  .c-cards__list[data-variant="radio"][data-cols="3"] .c-card__label {
    gap: 4px;
    padding: 12px 8px 12px 10px;
  }

  .c-cards__list[data-variant="radio"][data-cols="3"] .c-card__text {
    font-size: 14px;
  }
}

/* 360px 級（3 列で 101px 幅）はさらに詰める */
@media (max-width: 389px) {
  .c-cards__list[data-variant="radio"][data-cols="3"] .c-card__label {
    padding: 12px 6px 12px 8px;
  }

  .c-cards__list[data-variant="radio"][data-cols="3"] .c-card__text {
    font-size: 13px;
  }
}

/* ================================================================== */
/* 列数                                                               */
/*                                                                    */
/* cards.ts が .c-cards__list に --cols（PC）・--cols-sp（SP）を設定する。*/
/* 値は任意の正の整数。指定が無いとき（変数が未設定）は、下の var() の    */
/* フォールバックが variant ごとの既定列数になる。                       */
/*   default … PC 2 列 / SP 1 列                                       */
/*   compact … 〜479px 2 列 / 480px〜 3 列（PC も 3 列）                 */
/*   image   … 2 列                                                    */
/*   radio   … 2 列                                                    */
/* variant の見た目の規則より後ろに置く（同じ詳細度で、列数を後勝ちにする）。*/
/* ================================================================== */

/* --- default --- */

@media (min-width: 768px) {
  .c-cards__list[data-variant="default"] {
    grid-template-columns: repeat(var(--cols, 2), minmax(0, 1fr));
  }
}

/*
  中間段（640〜767px）。

  `.l-shell` は画面幅に合わせて広がるのに、SP の既定は 1 カラムなので、
  767px では 680px 幅のカードが縦 1 列に並んでしまう。
  ブレイクポイント 767px 自体は動かさず、この帯だけ PC で 2 列以上のグループを 2 カラムにする。
  640px は原本 SPIRAL フォームの PC/SP 切替と同じ位置。
  SP の列数が 2 以上と指定されているグループは、次の規則（SP）がこの規則に勝つ。
*/
@media (min-width: 640px) and (max-width: 767px) {
  .c-cards__list[data-variant="default"]:not([data-cols="1"]) {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

/* SP（767px 以下）：SP の列数が 2 以上のとき。1 または未指定は 1 列（帯では上の規則で 2 列） */
@media (max-width: 767px) {
  .c-cards__list[data-variant="default"][data-cols-sp]:where(:not([data-cols-sp="1"])) {
    grid-template-columns: repeat(var(--cols-sp), minmax(0, 1fr));
  }
}

/*
  極端に狭い画面（1280px の 400% ズーム相当）。

  320px で SP 2 列を保つと、カード1枚のテキストの取り分が
  約25px＝**1文字分**しか残らず、ラベルが1文字ずつ縦に折り返してカード高さが
  260px まで伸びる。この幅では1カラムに落とす（3 列以上は今も落とさない）。
*/
@media (max-width: 359px) {
  .c-cards__list[data-variant="default"][data-cols-sp="2"] {
    grid-template-columns: 1fr;
  }
}

/* --- compact・image・radio：SP は --cols-sp、PC（768px〜）は --cols --- */

.c-cards__list[data-variant="compact"] {
  grid-template-columns: repeat(var(--cols-sp, 2), minmax(0, 1fr));
}

.c-cards__list[data-variant="image"],
.c-cards__list[data-variant="radio"] {
  grid-template-columns: repeat(var(--cols-sp, 2), minmax(0, 1fr));
}

@media (min-width: 480px) {
  .c-cards__list[data-variant="compact"] {
    grid-template-columns: repeat(var(--cols-sp, 3), minmax(0, 1fr));
  }
}

@media (min-width: 768px) {
  .c-cards__list[data-variant="compact"] {
    grid-template-columns: repeat(var(--cols, 3), minmax(0, 1fr));
  }

  .c-cards__list[data-variant="image"],
  .c-cards__list[data-variant="radio"] {
    grid-template-columns: repeat(var(--cols, 2), minmax(0, 1fr));
  }
}
/*
  条件付き項目まわり。
    .c-conditional … 選択に応じて現れるひとまとまり
    .c-check       … カード式ではない素のチェックボックス（「未定」「住所が異なる」）
    .c-inline      … 年・月のように単位付きの短い欄を横に並べる
    .c-note        … 注釈（既定は装飾なしの地の文。面付きは .c-note--box）
*/

/*
  条件で現れるブロック。
  面と左の罫線で「直前の選択にぶら下がっている」ことを示す。
  唐突に項目が増えたように見せないための処理で、装飾ではない。

  `[hidden]` は _base.css で `display: none !important` にしてあるため、
  ここで display を指定しても閉じている間は出ない。
*/
.c-conditional {
  display: flex;
  flex-direction: column;
  gap: 24px;
  padding: 20px 20px 20px 17px;
  border-left: 3px solid var(--c-accent-ink);
  border-radius: 0 var(--radius-card) var(--radius-card) 0;
  background: var(--c-bg-soft);
}

/* 入れ子の項目群は外側より詰める（同じ設問の中の小項目であることを示す） */
.c-fields--nested {
  gap: 16px;
}

/* --- 素のチェックボックス --- */

/*
  タップ領域は 44px 以上。
  ラベルの上下 padding だけでは**ラベル部分しか 44px にならない**。
  チェックボックス本体を含む行全体で下限を満たす必要がある。
*/
.c-check {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-top: 10px;
  min-height: 44px;
}

.c-check__input {
  flex: none;
  width: 24px;
  height: 24px;
  /* 選択状態の色をアクセントに合わせる。ネイティブの見た目は保つ */
  accent-color: var(--c-accent-ink);
}

.c-check__input:focus-visible {
  outline: 3px solid var(--c-focus);
  outline-offset: 2px;
}

/*
  ラベル側に上下の余白を持たせてタップ領域を 44px 以上にする。
  チェックボックス本体（20px）だけではタップ領域の下限を満たさない。
*/
/* ラベルは残りの幅いっぱいに広げる。文字の右側の空白もタップ領域にするため */
.c-check__label {
  flex: 1;
  padding: 12px 0;
  font-size: 15px;
  font-weight: 700;
  line-height: 1.4;
  cursor: pointer;
}

/*
  単独で立つチェックボックス（リフォーム予定地の有無）。
  設問と同じ重みで読ませたいので、入力欄と同じ枠を持たせる。
*/
.c-check--standalone {
  margin-top: 0;
  padding: 0 16px;
  border: 2px solid var(--c-line);
  border-radius: var(--radius-input);
  background: var(--c-bg);
  transition: border-color var(--duration), background-color var(--duration);
}

.c-check--standalone:hover {
  border-color: var(--c-line-strong);
}

/* 選択中は面と枠をアクセント寄りにして、下のブロックとの関係を示す */
.c-check--standalone:has(.c-check__input:checked) {
  border-color: var(--c-accent-ink);
  background: var(--c-accent-tint);
}

/* --- 単位付きの短い欄（年・月） --- */

/*
  エラー文が出ると項目の高さが変わるため、上端で揃える。
  center のままだと片方だけエラーが出たときに、もう一方が縦にずれる。
*/
.c-inline {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  gap: 12px 16px;
}

/*
  年・月それぞれの `.c-field`。
  中は「入力欄＋単位」の横並び（.c-inline__control）と、その下に落ちるエラー文の縦積み。
  ここを inline-flex にすると、エラー文が入力欄と単位の間に割り込んで単位を押し出す。
*/
.c-inline__item {
  display: block;
}

.c-inline__control {
  display: flex;
  align-items: center;
  gap: 8px;
}

/*
  桁数の目安を幅で示す。年は4桁・月は2桁。
  `flex: none` が要る。付けないと `.c-input { width: 100% }` との詳細度が同じで
  @import 順に勝っているだけの状態になり、混み合ったときに縮む。
*/
.c-input--num {
  flex: none;
  width: 7em;
  text-align: center;
}

/* 月は2桁。位置（:last-child）ではなくクラスで指定する（末尾に要素を足しても崩れない） */
.c-input--num-month {
  width: 5em;
}

.c-inline__unit {
  font-size: 15px;
  font-weight: 700;
  white-space: nowrap;
}

/* --- 注釈 --- */

/*
  注釈。既定は面・枠・太字などの装飾を付けない、本文と同じ見た目の地の文。
  色だけに頼らないよう「※」を文頭に置いて使う。
*/
.c-note {
  margin: 0;
  padding: 0;
  border: 0;
  background: none;
  color: var(--c-text);
  font-size: inherit;
  font-weight: 400;
  line-height: 1.7;
}

/*
  面付きの注釈。読み飛ばされると困る内容を、面を敷いて本文から浮かせる。
  `.c-note` と併用する（<p class="c-note c-note--box">）。
*/
.c-note--box {
  padding: 14px 16px;
  border: 1px solid #f0d8ac;
  border-radius: var(--radius-input);
  background: var(--c-accent-tint);
  color: var(--c-accent-ink);
  font-size: 13px;
  font-weight: 700;
}

/* --- モバイル --- */

@media (max-width: 767px) {
  .c-conditional {
    padding: 16px 16px 16px 13px;
    gap: 20px;
  }

  .c-check--standalone {
    padding: 0 12px;
  }
}
/*
  ナビゲーション（ステップ群の外に1組だけ）。
  同意ブロック（.c-consent）は _consent.css にある。
*/

/*
  入力欄（同意文がある最終ステップでは同意文）の直下に置く。
  画面下端には固定しない（PC・モバイルとも）。

  末尾の env(safe-area-inset-bottom) は、iPhone のホームバー領域に
  ボタンが被らないようにするための余白。固定表示ではないのでスクロールで
  逃がせるが、最下部のボタンが指の届きにくい位置に来るのを避けている。
*/
.c-nav {
  display: flex;
  justify-content: space-between;
  gap: 12px;
  margin-top: 28px;
  padding-bottom: calc(20px + env(safe-area-inset-bottom, 0px));
}

.c-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  min-height: 56px;
  padding: 14px 32px;
  border: 0;
  border-radius: 14px;
  font-size: 17px;
  font-weight: 700;
  letter-spacing: 0.02em;
  cursor: pointer;
  transition: background-color var(--duration), transform 0.08s ease-out;
}

.c-btn:active {
  transform: translateY(2px);
}

/*
  「戻る」：左端に置くセカンダリのボタン。
  白地＋枠線で「次へ」より一段引っ込め、押し間違いを防ぐ。
*/
.c-btn--back {
  border: 2px solid var(--c-line-strong);
  background: var(--c-bg);
  color: var(--c-graphite);
}

.c-btn--back:hover {
  background: var(--c-bg-soft);
}

/*
  「次へ」：グラファイトの面に白文字（約 8.4:1）。平面の塗り。

  margin-left: auto は「戻る」が hidden の STEP 1 対策。hidden 要素は
  スペースを取らないため、space-between だけだと「次へ」が左端へ寄ってしまう。
*/
.c-btn--next {
  margin-left: auto;
  background: var(--c-graphite);
  color: #fff;
}

.c-btn--next:hover {
  background: var(--c-graphite-strong);
}

/*
  送信ボタンだけ見た目を変える。
  中間の「次へ」と同じ外観だと、意図しない送信や逆に送信のためらいを生む。

  グレー基調では色相で差を付けられないため、
    1. 明度　　 …… グラファイトより一段深い墨
    2. 字送り　 …… やや広げて改まった調子にする
    3. 横幅　　 …… flex:1 で「次へ」より広く取る
  の3点で段差を作る。
*/
.c-btn--submit {
  flex: 1;
  margin-left: auto; /* 「次へ」と同じく、「戻る」が hidden でも右側に留めるため */
  background: var(--c-ink);
  color: #fff;
  letter-spacing: 0.08em;
}

.c-btn--submit:hover {
  background: var(--c-ink-strong);
}

@media (max-width: 767px) {
  /*
    モバイルはボタンをフルワイドにする（下部には固定しないが、幅は画面いっぱい）。
    狭い画面で右寄せの小さなボタンにすると、片手で親指が届く範囲から外れる。

    高さは PC（56px）の約80%。
    行間を詰めないと padding だけでは 45px に収まらないため line-height も下げている。
    45px はタップ領域の下限 44px を保っている。
  */
  .c-btn {
    flex: 1;
    width: 100%;
    min-height: 45px;
    padding: 10px 16px;
    line-height: 1.3;
  }

  /*
    「戻る」だけは内容幅に留める。上の flex: 1 のままだと「次へ」と 50/50 に
    割れてしまい、主導線の「次へ」が痩せる。戻ると次へ（最終ステップでは送信）は
    同じ行のまま、残り幅を主導線に譲る。
  */
  .c-btn--back {
    flex: 0 0 auto;
    width: auto;
  }
}

/*
  押し込みの動きは transform で表しているが、`transition` の 0.08s と合わせて
  `--duration` の外にある（意図的に短くしている）。
  動きを減らす設定では位置を動かさない。
*/
@media (prefers-reduced-motion: reduce) {
  .c-btn:active {
    transform: none;
  }
}

/*
  汎用の無効化スタイル。現時点で送信ボタンを無効化する仕組みは無いが、
  他の理由でボタンが disabled になる場合に備えて残す。
  色は落とすが、コントラストは 4.5:1 を割らない濃さに留める。
*/
.c-btn:disabled,
.c-btn--submit:disabled {
  background: #8d9096;
  cursor: not-allowed;
}

.c-btn:disabled:active {
  transform: none;
}
/* 完了画面（thanks.html）。フォーム本体と同じ form.css を共有して見た目を揃える */

.c-thanks {
  padding: 40px 0 64px;
}

/* チェックマークと見出しを横並びにする */
.c-thanks__head {
  display: flex;
  align-items: center;
  gap: 16px;
  margin-bottom: 24px;
}

.c-thanks__mark {
  flex: none;
  display: grid;
  place-items: center;
  width: 72px;
  height: 72px;
  border-radius: var(--radius-pill);
  background: var(--c-accent-tint);
  color: var(--c-accent-ink);
}

/*
  ページ唯一の見出し。マークの横に並ぶが、大きさは独立した h1 だったときのまま
  （24px / PC 28px）保つ。ねぎらいの一言と2本立てだった頃は競合を避けて
  一言側を一段小さくしていたが、1本になったので抑える理由がなくなった。
*/
.c-thanks__title {
  font-size: 24px;
  font-weight: 700;
  line-height: 1.5;
}

.c-thanks__lead {
  margin-top: 12px;
  font-size: 15px;
}

.c-thanks__box {
  margin-top: 28px;
  padding: 20px;
  border: 2px solid var(--c-line);
  border-radius: var(--radius-card);
  /*
    面の色を明示する。地（--c-canvas）に色が敷かれる配色でも
    枠だけの箱にならず、カードとして立つようにするため。
  */
  background: var(--c-bg);
}

.c-thanks__box-title {
  font-size: 15px;
  font-weight: 700;
}

.c-thanks__list {
  margin-top: 10px;
  display: flex;
  flex-direction: column;
  gap: 8px;
  font-size: 14px;
  line-height: 1.7;
}

.c-thanks__list li {
  padding-left: 1.1em;
  text-indent: -1.1em;
}

.c-thanks__list li::before {
  /* ★ 非ASCIIを直接書かない（決定180）。\30FB は U+30FB。末尾の空白はエスケープの終端 */
  content: "\30FB ";
}

.c-thanks__note {
  margin-top: 20px;
  color: var(--c-text-sub);
  font-size: 13px;
}

.c-thanks__actions {
  margin-top: 32px;
}

.c-thanks__back {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 56px;
  padding: 14px 32px;
  border: 2px solid var(--c-line);
  border-bottom-width: 4px;
  border-radius: 14px;
  background: var(--c-bg);
  color: var(--c-text);
  font-weight: 700;
  text-decoration: none;
}

.c-thanks__back:hover {
  background: var(--c-bg-soft);
  color: var(--c-text);
}

@media (min-width: 768px) {
  .c-thanks__title {
    font-size: 28px;
  }
}

@media (max-width: 767px) {
  /*
    375px 幅ではマークと見出しが1行に収まらない。マークを縮めたうえで文字も詰める。
    幅の内訳：335 −（マーク 56 ＋ gap 12）＝ 267px に対し、
    18px × 14文字 = 252px。20px だと 280px で「お問い合わせを受け付けまし／た」と折れる。
  */
  .c-thanks__head {
    gap: 12px;
  }

  .c-thanks__mark {
    width: 56px;
    height: 56px;
  }

  .c-thanks__mark svg {
    width: 28px;
    height: 28px;
  }

  .c-thanks__title {
    font-size: 18px;
  }
}

/* 2. 複数 form が持つ部品 */
/*
  同意ブロック（個人情報の取り扱いについての注記）。同意ブロックを持つ form が import する。

  最終ステップの末尾にあり、その直後が送信ボタンになる。間に他の要素を挟まない。
  チェックボックスは持たない（注記文のみ）。
*/

/*
  面の色は選択済みカードと同じ --c-accent-tint。
  グレー（--c-bg-soft）だと直上のカード群から浮いて別種の面に見えるため揃えた。
*/
.c-consent {
  margin-top: 32px;
  padding: 18px 20px;
  border-radius: var(--radius-card);
  background: var(--c-accent-tint);
}

.c-consent__text {
  color: var(--c-text-sub);
  font-size: 13px;
  line-height: 1.75;
}

.c-consent__text a {
  word-break: break-all;
}

.c-consent__text + .c-consent__text {
  margin-top: 10px;
}

/* 3. form 固有 */
/*
  No.9（パートナー設計事務所募集）固有の追加スタイル。共通 CSS のあとに読み込む。
*/

/*
  希望業務エリアの第1・第2希望を左右に並べる（.c-group__cols の 2 列は SP・PC 共通）。
  SP（390px）では 1 列 約 169px しかないため、セレクトの左右余白と矢印を詰めて
  「愛知県」「神奈川県」などの都道府県名を切らずに出す。
*/
.c-group__cols .c-select {
  padding-right: 32px;
  padding-left: 12px;
  background-position: right 8px center;
  background-size: 18px 18px;
}

/* 4. SPIRAL 固有（初期表示のちらつき対策・JS無効時の見え方）。承認済み画面には無い */
/*
  SPIRAL 元ソースの <center> を打ち消す（campaign の配信中の form.css と同じ規則）。

  SPIRAL 元ソースの骨格 `<center><div class="body_tbl">` を残しているため、<center> の
  `text-align: center` が中の文字に継承される。承認済み画面には <center> が無いので、そのままだと
  **フォーム名・補足文・短い入力欄（郵便番号）まで中央に寄ってしまう。**
  デザインは .l-shell が中央寄せを担っているので、文字寄せだけを左へ戻す。
  <center> 自体はSPIRALでの用途が未確認なので削除しない（CLAUDE.md §2-2）。

  ★ 2026-10-20 に検証環境で発見した。campaign の元CSS（_tokens.css）にあった規則を、移植のとき
    エラーアイコンの定義だけ取って、この規則を取り漏らしていた。
*/
.body_tbl {
  text-align: left;
}

/*
  SPIRAL 固有の追加スタイル。承認済み画面（別リポジトリ form-no2）には無く、
  campaign の配信中 form.css（`.js-stepform` の節）から持ち込んだ。最後に読み込む。

  ## 初期表示のちらつき対策（campaign 決定212）

  form.js の初期化が終わるまでの間、**JS が起動したあとには消える／移動するもの**を先に隠す。
  `.js-stepform` は入力画面の HTML のインライン script が最初に `<html>` へ付け、
  form.js が初期化を終えたら外す。
  JS 無効・form.js 到達不可ではクラスが付かない／外れるため、
  **JS 無効で全ステップが縦に並ぶこと（campaign 決定99）に影響しない。**

  承認済み画面は STEP を HTML 上で `hidden inert` にしているが、SPIRAL 版は JS 無効でも
  全 STEP を出す必要があるため HTML には書かない。**そのぶん、JS が STEP を隠すまでの
  一瞬、全 STEP が見えてしまう**ので、ここで先に隠す。
*/
.js-stepform .c-step:not([data-step="1"]),
.js-stepform [data-nav="submit"] {
  display: none;
}

/*
  進捗バーだけは逆に「先に出す」（campaign 決定212c）。

  バーは HTML で hidden になっており（JS 無効では進捗の概念が無いため・決定179）、
  form.js が起動して初めて `bar.hidden = false` で現れる。
  **そのぶん本文が押し下げられ、入力欄の位置がずれる**ので、場所を先に確保する。

  ★ `!important` を使う理由：共通の `[hidden] { display: none !important }` を上書きするため。
    **ここを外すと効かない**（CLAUDE.md §9 の「理由を書けば可」に該当）。
  ★ 幅は `.c-progress__fill { width: 0 }` のまま。JS が総ステップ数を数えてから正しい割合を入れる。
  ★ JS 無効ではクラスが付かないため、バーは出ない。
*/
.js-stepform [data-progress][hidden] {
  display: flex !important;
}

/*
  「次へ進む」も同じ理由で場所を先に確保する（campaign 決定212c）。
  HTML では hidden（JS 無効では type="button" が働かないため・決定178）で、JS が起動して初めて現れる。

  ★ バーと違い `visibility: hidden` で**見せずに場所だけ**確保する。
    JS が動く前に見えると押せてしまい、押しても何も起きないため。
  ★ JS が `hidden` を外した時点でこのセレクタから外れ、通常表示に戻る。
*/
.js-stepform [data-nav="next"][hidden] {
  display: inline-flex !important;
  visibility: hidden;
}
