/* ============================================================
   3. 公開レイヤー — 申込者が見る画面。幅を問わず寸法を落とさない
   一度きりの初見利用で、多くはスマホ。管理画面の密度を持ち込まない。
   ============================================================ */
body.public { font-size: var(--fs-lg); }
body.public main { max-width: 640px; padding: var(--space-32) var(--space-16) var(--space-48); }
/* 申込ページのコース名。18pxでは弱いとの実機指摘を受け、専用の24px段
   （--fs-2xl）を承認の上で追加した（2026-08-18）。24pxの許可セレクタは
   FS_2XL_SELECTORS（tests/test_style_guard.py）が唯一の出どころ。 */
body.public h1 {
  font-size: var(--fs-2xl);
  font-weight: 700;
  margin: 0 0 var(--space-24);
  padding-bottom: var(--space-12);
  border-bottom: 3px solid var(--navy);
}
body.public label { font-size: var(--fs-lg); color: var(--ink); }
/* 共通の h2 は管理画面の密度に合わせた14px。公開は本文が16pxなので、
   打ち消さないと「受講料」の見出しが直下の料金リスト（16px）より小さく出る。

   レビュー重要-4（実測）: 16pxのままだと本文16px・見出し16pxで太さしか
   違わず、一覧が18px（.loc-group h2 / .list-filter）に上げた段が
   フォーム側だけ抜けていた。一覧側は step 6 で「16pxでは本文と区別が
   付かない」として18pxに上げており、その判断がここに通っていなかった。
   18pxに揃える（h1の24pxとは別の段のまま残る）。 */
body.public h2 { font-size: var(--fs-xl); }
/* 公開ページのヘッダー。ロゴは提供された比率のまま置く（変形・影・色替えは
   使用ガイドラインで禁止）。main と同じ 640px の読み幅に左端を揃える。
   ロゴは幅200px・高さ38.5px相当（元画像比率800:154）で描画される想定。
   リンクの上下に space-8（8px）ずつの余白を足し、38.5+16=54.5px で
   タップ領域48pxを満たす。
   【レビューM-9で訂正】以前は img に max-width: 60% を指定しており、
   これがアンカー自身の指定幅200pxに対して循環的に解決されて実際には
   120×23pxまで潰れていた（200×38.5pxで描画されたことが一度も無かった）。
   max-width: 100% に直す。 */
.public-header { max-width: 640px; margin: 0 auto; padding: var(--space-24) var(--space-16) 0; }
.public-header a { display: inline-block; padding: var(--space-8) 0; }
.public-header img { display: block; width: 200px; max-width: 100%; height: auto; }

/* レビュー重要-4（実測）: 必須の選択肢グループの見出し（受講コース・
   受講団体など7個）が13px・--ink-2のままだと、本文（16px・--ink）より
   弱く出て「必須の見出し」に見えない。本文と同じ強さに上げる。 */
body.public legend { font-size: var(--fs-lg); color: var(--ink); }
/* 申込ページの日時・会場。何の情報かをラベルで示す。項目名と値の対なので dl。
   ラベルは補足なので13px、値は公開の本文サイズ16pxのまま。 */
body.public .session-facts { margin: 0 0 var(--space-24); }
body.public .session-facts dt {
  font-size: var(--fs-sm);
  font-weight: 700;
  color: var(--ink-2);
}
body.public .session-facts dd { margin: 2px 0 var(--space-12); }
body.public .card { padding: var(--space-24); }

/* レビュー重要-5（実測）: 送信失敗直後に最初に見る .error が13pxのまま
   だと、本文16pxの画面のなかで一番読みにくい文字になる。公開だけ16pxに
   上げる（管理画面の .error は13pxのまま——共通の .error の margin: 0
   水平無しはそのまま活きるので、ここでは font-size と p/ul の内側の
   余白だけを公開向けに直す）。.error 内の p / ul はこれまで何も
   宣言しておらずブラウザ既定（p が margin: 13px 0、ul が
   padding-left: 40px 相当）のままだった——これがスケール外だったので
   var(--space-*) で明示する。 */
body.public .error { font-size: var(--fs-lg); }
body.public .error p { margin: 0 0 var(--space-8); }
body.public .error ul { margin: 0; padding-left: var(--space-24); }

/* 選択肢は1行1件。指で押せる高さを確保する。fieldset の中のラベルは
   .check を持たないので、ここで面倒を見る。 */
body.public fieldset label,
body.public .consent {
  display: flex;
  align-items: center;
  gap: var(--space-8);
  min-height: 48px;
  margin: 0;
  cursor: pointer;
}

/* 入力欄も48px。狭幅レイヤーの44pxが効いたままだと公開側の基準に届かない。
   ラジオとチェックボックス自体は対象外（押す対象は囲うラベル）。 */
body.public input:not([type="checkbox"]):not([type="radio"]):not([type="hidden"]),
body.public select,
body.public textarea {
  min-height: 48px;
}

/* 法令表記へのリンク。本文中に並ぶので inline-flex にして「／」の
   区切りを保ったまま高さだけ確保する。 */
body.public main a,
.public-footer a {
  display: inline-flex;
  align-items: center;
  min-height: 48px;
}

/* 公開ページのリンク色を --blue に統一する（設計 §4.6・§9-3・§12「リンク色」）。
   対象は apply.html のエラー一覧／同意欄のプライバシーポリシー／同意欄の
   特定商取引法に基づく表記／NCLSテキストの購入ページ、cancel.html の
   振替・返金案内、public_csrf_error.html の戻るリンク の6箇所。
   .public-footer a は対象外（既に --ink-2 で別途スタイル済み。§9-3
   「揃えない」の裁定）。

   レビュー重要-2（旧実装は :not() の除外リストだった。差し戻し）:
   body.public main a は要素3（body/main/a）・クラス1（.public）で
   詳細度 (0,1,3)。ここへ :not(.apply-link):not(.area-index-link) を
   足すと、:not() の引数もそのまま詳細度に数えられる仕様のため
   (0,3,3) まで跳ね上がる——.list-filter a や .empty a（いずれも
   (0,1,1)）の color 宣言を常に上書きして殺していた（変異試験で
   SURVIVED を実測）。極めつけは、公開の main に <a class="btn">
   （button, .btn の (0,1,0)）を置くと (0,3,3) が勝ち、青地に青文字＝
   コントラスト1:1で文字が消える事故（実測）。除外リストは公開に
   色付きリンクを足すたびに追記が要り、忘れると同じ事故が起きる。

   直し方: :where() で main 側を詳細度ゼロの既定にする。:where() の
   中身は詳細度に数えない仕様なので、このルール全体の詳細度は
   要素1（a）だけの (0,0,1) になる——クラスを持つ部品
   （.apply-link / .area-index-link / .btn / .list-filter a /
   .empty a 等）は必ずこれより詳細度が高く、除外リストが無くても
   自然に勝つ。.apply-link は .avail-waitlist + .apply-link（輪郭
   ボタン）にも同じクラスが付くので、この既定を上書きする形は両方の
   申込ボタン系列で成立する。CSSの並べ替えにも依存しない。 */
:where(body.public main) a {
  color: var(--blue);
}

body.public button {
  width: 100%;
  min-height: 48px;
  font-size: var(--fs-lg);
  margin-top: var(--space-8);
}

/* 申込フォームの補足説明。ラベルの一部として読ませるので、
   本文より小さく・弱くするが、AA は割らない（--ink-2）。 */
.hint {
  display: block;
  font-size: var(--fs-sm);
  color: var(--ink-2);
  font-weight: 400;
  margin-top: 2px;
}

/* 定員到達の予告や、項目ごとのお知らせブロック */
.notice {
  background: var(--bg-quiet);
  border-radius: var(--radius);
  padding: var(--space-12) var(--space-16);
  margin: 0 0 var(--space-16);
  font-size: var(--fs-sm);
}
.notice strong { display: block; margin-bottom: var(--space-4); color: var(--ink); }
.notice p { margin: 0; }

/* 同意欄に添える規約の全文。長いので枠で囲って本文と分ける */
.consent + .policy-body {
  border: 1px solid var(--rule);
  border-radius: var(--radius);
  padding: var(--space-12) var(--space-16);
  margin: var(--space-8) 0 var(--space-16);
  font-size: var(--fs-sm);
  color: var(--ink-2);
  max-height: 220px;
  overflow-y: auto;
}

/* カレンダー（月表示）。7列の Grid。<table> は使わない —
   狭幅の組み替えを開催回一覧に閉じる style_guard の規律に触れないため。 */
.cal-grid {
  display: grid; grid-template-columns: repeat(7, 1fr);
  gap: 1px; background: var(--rule-2); margin: 0 var(--space-16) var(--space-16);
  border: 1px solid var(--rule); border-radius: var(--radius); overflow: hidden;
}
.cal-head {
  background: var(--ground-soft); color: var(--ink-2);
  font-size: var(--fs-xs); text-align: center; padding: var(--space-8) 0;
}
.cal-day { background: var(--surface); min-height: 92px; padding: var(--space-4); }
.cal-outside { background: var(--ground-soft); }
.cal-today { box-shadow: inset 0 0 0 2px var(--blue); }
/* .cal-date と .cal-add（＋マーク、下記）を同じ行に横並びにする。絶対配置で
   右上に重ねる案は、狭幅（.cal-day min-height:0・padding:2px の極小マス、
   04-narrow.css）でフォントの実測メトリクスしだいで下の .cal-card と
   数px重なる恐れがあった（2026-09-12 実装時レビュー指摘）ので、通常の
   フローに乗せる——.cal-add の実際の高さぶんだけ .cal-day-head 自体が
   伸び、後続の .cal-card は必ずその下から始まる（重なりが原理的に無い）。 */
.cal-day-head { display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); }
.cal-date { font-size: var(--fs-xs); color: var(--ink-2); }
/* カレンダーの日付から開催回を追加する＋マーク（依頼: カレンダーの日付を
   クリックすると開催回追加ができるように）。タップ領域は素の <a> として
   main a の44px/24px集合にそのまま含まれるので、ここでは見た目の
   サイズだけを決める（新しい min-height/height の規則は書かない）。 */
.cal-add {
  display: inline-flex; align-items: center; justify-content: center;
  flex: 0 0 auto; width: 18px; height: 18px;
  font-size: var(--fs-xs); line-height: 1; text-align: center;
  border-radius: 999px; background: var(--bg-quiet); color: var(--ink-2);
  text-decoration: none;
}
.cal-add:hover { background: var(--blue); color: var(--on-fill); }
/* 末尾の月の切り替えは狭幅だけに出す。広幅は7列で1画面に収まるので要らない。 */
.cal-monthnav { display: none; }
/* 凡例（.cal-legend）と月表の下の詳細（.cal-agenda）も狭幅だけ
   （狭幅のカレンダー設計。決定表参照）。 */
.cal-legend { display: none; }
.cal-agenda { display: none; }
.cal-card {
  display: block; text-decoration: none; color: var(--ink);
  border-left: 4px solid var(--card-accent); background: var(--surface-alt);
  border-radius: var(--radius);
  /* 右パディングは元6px（等距離）。原則は8pxへ丸めるが、ここは個別に4pxへ
     据え置く。狭幅で同日に2件以上並ぶと .cal-day の横並びが折り返さず、
     .cal-grid の overflow: hidden で見切れる既存の不具合がある
     （.cal-day の gap と同じ理由・同じ実測）。8pxのままだと、gapを8pxへ
     戻した後もなお変更前より見切れが広がったままだった。 */
  padding: var(--space-4) var(--space-4); margin-top: var(--space-4);
}
.cal-card:hover { background: var(--bg-quiet); }
.cal-count { display: block; font-size: var(--fs-xs); font-weight: 700; }
.cal-name { display: block; font-size: var(--fs-xs); }
.cal-time { display: block; font-size: var(--fs-xs); color: var(--ink-2); }
.cal-draft { border-left-style: dashed; }
.cal-quiet { opacity: .6; }
.cal-cancelled { opacity: .6; text-decoration: line-through; }
/* [2026-09-13 ユーザー指摘] もっと目立つように。以前は太字ではなく
   （`.pill` を経由しない独自ルールのため、他画面の注意ピルが揃って
   持っている font-weight: 700 が抜けていた）、文字サイズも本文と同じ
   11px（--fs-xs）だった——月表の中で最優先に見せたい「要対応」が、
   隣接する開催地名・時刻と同じ太さ・同じ大きさで並び、埋もれていた。
   色の面積（--bg-alert の塗り）はこの現場の「注意は塗りを主張しすぎない」
   という決定（.pill-alert と同じ配色）を保ったまま、太字＋13px（--fs-sm）
   にして文字そのものの主張を強める。 */
.cal-badge {
  display: inline-block; margin-top: 2px; padding: 0 var(--space-8); border-radius: 999px;
  background: var(--bg-alert); color: var(--alert); font-size: var(--fs-sm); font-weight: 700;
}
/* 狭幅で「開催回のある日だけを縦積み」に組み替えるための目印（Task 18）。
   広幅では見た目を変えない。 */
.cal-has .cal-date { font-weight: 700; }
/* 土日を太字で見分ける（色を増やさない——`:root` の外に色を書かない絶対
   規則1）。以前は狭幅の縦1列リスト（列見出しの `.cal-head` が消える構成）
   だけの手当てだった。狭幅も「7列の月表＋その下に詳細」に統一し、
   `.cal-head` が狭幅でも常時表示されるようになったので、探しやすさを
   保つ仕組みは広幅と共通でよい——狭幅だけの特別扱いをやめ、この規則を
   両方の幅で使う（決定表: 狭幅のカレンダー再設計）。`.cal-has .cal-date`
   の太字と意味が重なる場面がある点は元から広幅にもあった特性で、ここで
   新たに悪化させるものではない。 */
.cal-date.cal-weekend { font-weight: 700; }

/* 月表のマスの中身の出し分け（狭幅のカレンダー設計。2026-08-31
   ユーザー裁定・決定表）。サーバは幅を知らないので両方を常に描画し、
   CSS の display だけで切り替える。既定（このルールは @media より前）は
   広幅の見え方——全文（.cal-full）を見せ、略記（.cal-brief）は隠す。
   .cal-full は display: contents にして、直下の cal-count/cal-name/
   cal-time/cal-badge の見た目（変更前の cal-card 直下と同じ）を保つ。 */
.cal-full { display: contents; }
.cal-brief { display: none; }
/* 要対応の印。❗（絵文字）は 40px で入らないので使わない（実測・決定表）。
   最初は赤い太字の「!」だけにしたが、**11px の裸の「!」は細くて見つけにくい**と
   実機で指摘された（2026-08-31）。**赤い丸の中に白抜き**にする——この現場で
   状態を示すときの語彙（`.cal-badge` / `.pill` と同じ 999px の丸み）に揃える。
   白文字と --alert の明暗差は 6.10:1 で基準（4.5:1）を満たす。
   色は --alert / --surface で、:root に色を足さない（絶対規則1）。 */
.cal-alert {
  display: inline-block;
  min-width: 13px;
  padding: 0 2px;
  border-radius: 999px;
  background: var(--alert);
  color: var(--surface);
  font-weight: 700;
  text-align: center;
}
.cal-legend li { display: flex; align-items: center; }
.cal-legend-swatch {
  display: inline-block; width: 10px; height: 10px; margin-right: var(--space-4);
  border-radius: var(--radius); background: var(--card-accent);
}
.cal-agenda-day { margin-bottom: var(--space-16); }
.cal-agenda-date { font-size: var(--fs-sm); font-weight: 700; color: var(--ink); margin: 0 0 var(--space-4); }
.cal-agenda-dow { font-weight: 400; color: var(--ink-2); }
.cal-agenda-list { list-style: none; margin: 0; padding: 0; }
.cal-agenda-item {
  border-left: 4px solid var(--card-accent); background: var(--surface-alt);
  border-radius: var(--radius); padding: var(--space-4) var(--space-8);
  margin-top: var(--space-4);
}

/* ------------------------------------------------------------
   公開・一覧（/courses/<course_code>。Phase 8 step 6。設計 §3・§4.1.1・§3.9）
   この画面だけ body_class が "public list"（public_base.html の
   body_class ブロック。設計 §4.1.1）。幅とカラムの規則だけを
   上書きし、タップ対象のセレクタには .list を混ぜない —
   body.public.list main a のような複合セレクタは _css_public_tap() の
   ^body\.public\s+ 除去に引っかからず、ui-reviewer.md の PUBLIC_TAP
   集合とずれる（設計 §6.2）。申込リンク（.apply-link）は main の中の
   <a> なので、既存の body.public main a が48pxのタップ高さを既に
   与えている。ここで min-height を重ねて書かない。
   ------------------------------------------------------------ */
/* body.public main の 640px 宣言（上の「3. 公開レイヤー」冒頭）はその
   まま残し、詳細度の高い複合セレクタで上書きする（宣言ブロックを分割・
   並べ替えると test_公開レイヤーが定義されている が落ちる。設計 §4.1）。 */
body.public.list main { max-width: 1180px; }
body.public.list .public-header,
body.public.list .public-footer { max-width: 1180px; }

/* 見せ方の切り替え（開催地から探す／日程から探す。設計 §3.10・§3.10.1）。
   既存の .seg をそのまま流用し、新しいクラスは作らない。
   文字サイズだけ16px（--fs-lg）へ上書きする——13px（--fs-sm）は管理画面の
   密度で、公開の本文16pxに対しページの主操作が最小段になってしまう
   （.loc-group h2 / .list-filter / .empty と同じ上書きの流儀。
   【事実の訂正】このコメントと components.md は以前「18px」と誤って
   書いていた。18px は --fs-xl で、320pxでの .seg の幅の予算（16pxで
   274px／上限300px）を超えて横スクロールする。実装は最初から --fs-lg
   ＝16pxで、直すべきは記述のほうだった）。
   管理画面の .seg には触れない（セレクタを body.public.list に限定）。
   非現在側の文字色は --ink-2（白地に5.45:1）が真下の索引チップ
   （.area-index-link・--ink・17.6:1）より薄く、序列が逆に見えていた
   （レビュー実測。E-5）ので --ink に揃える。 */
body.public.list .seg a { font-size: var(--fs-lg); color: var(--ink); }

/* 切り替えと索引の間隔が0pxで、8px角丸の矩形（.seg）と999pxのピル
   （.area-index-link）が隙間なく積み、別々の操作なのに1つの塊に見えて
   いた（レビュー実測。E-2）。8段のスケール内で下の余白を足す。 */
body.public.list .seg { margin-bottom: var(--space-8); }

/* 現在地（.on）の --navy ベタ塗りをやめる（設計 §3.10.1「切り替えの
   見え方」）。公開ページで --navy が面として使われるのはここだけで、
   面積は申込ボタンの1.54倍——ファーストビューの視覚的重心が申込ボタンで
   はなく切り替えに移っていた（レビュー実測。E-4）。現在地は ✓ と
   font-weight: 700（.seg a.on の既存宣言）と面の差（--bg-quiet）で示す。
   --bg-quiet 上の --ink は15.05:1でコントラストは十分（実測。2026-09-05
   管理画面刷新で --bg-quiet を #f1ede6 に差し替えたため数値を更新）。 */
body.public.list .seg a.on { background: var(--bg-quiet); color: var(--ink); }

/* .seg の既定の overflow: hidden 宣言（このファイル冒頭「2. 共通
   コンポーネント」）は角丸の外にはみ出す子要素の背景を切り取るための
   ものだが、フォーカスリング（outline-offset: 2px）も一緒に切って
   しまう。公開側はキーボード操作のレビュー観点に入っているためここで
   直す。子（先頭・末尾の <a>）自身に角丸を持たせ、overflow を外す——
   管理画面の .seg（calendar.html / sessions.html）も対象に含めて直す
   （挙動を変えない範囲の既存欠陥の是正。設計 §3.10.1「フォーカス
   リング」）。
   （旧注記）以前はここに「コメントに波括弧を書かないこと」という
   注意書きがあった。tests/test_style_guard.py の _rules() がコメントを
   剥がす前に生ファイルへ正規表現を掛けており、コメント内の波括弧が実在の
   CSSルールと誤認され、直後の本物の .seg ルールのセレクタ抽出を壊して
   いたため（実際にこれで誤検知が起きた）。2026-09-05 段3 修正ラウンド1で
   _rules() 自体がコメントを除去してから走査するよう直したため、この
   注意書きは不要になった。 */
.seg { overflow: visible; }
/* overflow を外しただけでは、隣の兄弟の背景（後続の <a> の box）が先行
   要素のフォーカスリングの右辺を塗りつぶす（実測: 1本目の <a> だけ
   左・上・下の3辺しか描かれない）。:focus-visible のときだけ自分を
   手前に出す（設計 §3.10.1「フォーカスリングの重なり」）。 */
.seg a:focus-visible { position: relative; z-index: 1; }
/* 角丸は calc(var(--radius) - 1px) にする（設計 §3.10.1「角丸の合わせ」）。
   枠1px＋角丸8pxの内縁の曲率は7pxで、子に8pxをそのまま与えると .on の
   塗りの四隅に1px弱のすき間が出る（実測）。 */
.seg a:first-child {
  border-top-left-radius: calc(var(--radius) - 1px);
  border-bottom-left-radius: calc(var(--radius) - 1px);
}
.seg a:last-child {
  border-top-right-radius: calc(var(--radius) - 1px);
  border-bottom-right-radius: calc(var(--radius) - 1px);
}

/* 開催地の索引（h1直下。レビューM-5）。17〜20の開催地を上から目視で
   探すしかなく、スマホでは目的の開催地まで何画面もスクロールする問題
   への対応。<nav> の中の <a> は main 内なので既存の body.public main a
   が48pxのタップ高さを既に与える——ここで min-height を重ねない。 */
.area-index { margin: 0 0 var(--space-24); }
.area-index-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-8);
}
.area-index-link {
  padding: 0 var(--space-12);
  border: 1px solid var(--rule-strong);
  border-radius: 999px;
  color: var(--ink);
  font-size: var(--fs-sm);
  text-decoration: none;
}
.area-index-link:hover { text-decoration: underline; }
/* 絞り込み中の開催地の印。色（枠色）だけに頼らず、直後の
   .area-index-current の文字（「（絞り込み中）」）で伝える。 */
.area-index-item-current .area-index-link {
  border-color: var(--blue);
  font-weight: 700;
}
.area-index-current { color: var(--blue); font-weight: 700; }

/* 絞り込み中の帯。「解除して全部見る」導線を常に添える
   （設計 §3.7-2。0件の行き止まりを作らない）。13px・淡い地では画面地
   （--ground）との対比が弱く帯に見えなかった（レビューM-13）ので、
   16px・--ink・枠付きにする。 */
.list-filter {
  margin: 0 0 var(--space-16);
  padding: var(--space-12) var(--space-16);
  background: var(--bg-quiet);
  border: 1px solid var(--rule);
  border-radius: var(--radius);
  font-size: var(--fs-lg);
  color: var(--ink);
}
.list-filter a { color: var(--blue); }

/* 0件の文言（レビューM-13）。共通の .empty（13px・合成イタリック）は
   管理画面の他の空状態と共有しているのでここでは変えず、一覧だけ
   body.public.list を前置して上書きする（test_empty_の定義は1つだけ は
   セレクタが `.empty` ちょうどの規則数を数えているので、複合セレクタの
   追加では落ちない）。ほかに読むものが無い画面で最も弱い文字になって
   いたので16px・--ink・面と枠を持つ形にし、Noto Sans JP に無い合成
   イタリックをやめる。 */
body.public.list .empty {
  font-size: var(--fs-lg);
  color: var(--ink);
  font-style: normal;
  background: var(--surface);
  border: 1px solid var(--rule);
  border-radius: var(--radius);
}

/* 開催地ごとのまとまり。768px以上ではカラムを増やして一覧性を上げる
   （設計 §3.9 レイアウト・要望§92-95「PCでは広い画面を活かす」）。
   会場カードの段は無い（§3.2.0。開催地の直下に日程行が並ぶだけ）。 */
.loc-groups { display: grid; gap: var(--space-24); align-items: start; }
/* 絞り込みで開催地が1つだけ残ったとき（?venue= の着地点）、多カラムの
   グリッドが空の列を確保したまま1枚のカードだけを残し、右側が大きく
   空く（レビューM-16。実測: 1180px幅で367pxのカードの右に781px空く）。
   グループが1つのときだけ読み幅に戻す。main の幅（.public-header /
   .public-footer と揃えた 1180px）は変えない——グリッド自身の max-width
   だけを絞る。 */
.loc-groups:has(.loc-group:only-child) { max-width: 640px; }

/* 日程順（?view=date、設計 §3.10）のまとまり（月ごと）。.loc-groups は
   768px以上で多カラムのグリッドに変わるため流用しない——流用すると
   9月・10月・11月が横3カラムに並び、上から読むと日付が行き来するという、
   この見せ方が直そうとしている問題がそのまま再発する（実測）。常に
   1カラムで縦に流す。カード自体（見出し＋ .date-list）は .loc-group を
   そのまま流用する——月ごとの見出しも「開催地ごとの見出し」と同じ視覚
   処理（面・枠・18pxのh2）でよく、新しいカードクラスは要らない。 */
.date-groups { display: flex; flex-direction: column; gap: var(--space-24); }

.loc-group {
  background: var(--surface);
  border: 1px solid var(--rule);
  border-radius: var(--radius);
  box-shadow: 0 1px 2px var(--shadow-card);
  overflow: hidden;
}
/* 月の見出しを position: sticky で画面上端に貼り付ける（設計 §3.10「月の
   見出しの貼り付き」）。実測で62行のうち42行（68%）は自分の月見出しが
   1画面以上（最大3.85画面）上にあり、指を止めた場所で「この20日は何月か」
   が分からなかった。.loc-group の overflow: hidden があると sticky が
   効かないので、日程順（.date-groups の中）だけ overflow を外し、角丸を
   見出し側へ移す。開催地から探す側（.loc-groups の中）の見た目は変えない
   ——このセレクタは .date-groups の中の .loc-group にしか当たらない。 */
.date-groups .loc-group { overflow: visible; }
.date-groups .loc-group h2 {
  position: sticky;
  top: 0;
  z-index: 1;
  background: var(--surface);
  border-top-left-radius: var(--radius);
  border-top-right-radius: var(--radius);
}
/* 開催地の見出し。依頼者の優先順位（開催地＞開催日＞…＞申込ボタン）に
   対し、実測では16px/700（本文と太さしか違わない）で最も弱かった
   （レビューM-12）。18px（--fs-xl）に上げる。.loc-group h2 単体
   （詳細度0,1,1）は body.public h2（0,1,2）に負けて効かないので、
   body.public.list を前置して詳細度を上げる。 */
body.public.list .loc-group h2 {
  font-size: var(--fs-xl);
  font-weight: 700;
  margin: 0;
  padding: var(--space-12) var(--space-16);
  border-bottom: 1px solid var(--rule);
}
.date-list { list-style: none; margin: 0; padding: 0; }
.date-row {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  gap: var(--space-16);
  padding: var(--space-16);
  border-top: 1px solid var(--rule-2);
}
.date-row:first-child { border-top: 0; }
.date-row:hover { background: var(--surface-alt); }

/* Signature（設計 §3.9「Signature — 日付ブロックの組版」）: 日と曜日を
   分解し、同格に並べる。交替勤務の申込者にとって曜日は判断材料の本体で、
   括弧の中の補足ではない。.date-month を flex-basis: 100% で強制改行させ、
   day/dow を次の行に同じ大きさ（--fs-xl・700）で並べる——専用のラップ
   要素は増やさない（テンプレートの契約に .date-daydow は無い）。
   階層は太さ・余白・罫線で作る。字間は使わない（§12「階層の作り方」）。 */
/* 幅は固定（min-width ではない）。min-width だけだと内容量で84〜99.7px の
   4種に散り、同じカードの中で時刻・料金の左端が最大15.7pxずれる
   （レビューM-2）。「30 月曜」のような最長パターンが折り返さない値を
   実測して固定する（幅はスケール外の自由な値でよい）。 */
.date-block {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--space-8);
  flex: 0 0 auto;
  padding-right: var(--space-16);
  border-right: 1px solid var(--rule-2);
  width: 104px;
}
/* 日程順（.date-groups の中）だけ仕切り罫を行の高さいっぱいに伸ばす
   （設計 §3.10「.date-block の仕切り罫」）。.date-row の
   align-items: flex-start だと .date-block の高さは自身の内容分にしか
   ならず、罫線が短く見えていた（実測: 27.9px。開催地順は56px）。
   align-self: stretch にすると74.4pxになり、行高は変わらない（実測）。 */
.date-groups .date-block { align-self: stretch; }
/* 「9月」「10月」のような桁数の差でも .date-month 自体の幅が動かないよう
   数字を等幅にする（レビューM-2）。 */
.date-month { flex: 1 0 100%; font-size: var(--fs-sm); color: var(--ink-2); font-variant-numeric: tabular-nums; }
.date-day {
  font-size: var(--fs-xl);
  font-weight: 700;
  font-variant-numeric: tabular-nums;
}
.date-dow { font-size: var(--fs-xl); font-weight: 700; }

.date-body { flex: 1 1 180px; min-width: 0; }
/* 日程順（?view=date）の行だけに出す開催地名（設計 §3.10「行に出すもの」）。
   まとまりの見出しが月になるので、行が開催地を持たないと「どこの回か」が
   分からない。開催地が申込可否を決める主軸になるため、時刻・料金より
   強い太さで先に置く（DOM順どおり、.date-body の先頭）。 */
.date-loc { font-size: var(--fs-lg); font-weight: 700; color: var(--ink); }
.date-time { font-size: var(--fs-lg); }
.date-fee { font-size: var(--fs-lg); font-variant-numeric: tabular-nums; }
/* 復習参加の補助表記（設計 §3.6）。通常参加が満席でも、復習枠に空きが
   ある回にはこの1行を出す。出さないと復習参加できる人が「もう入れない」
   と読んでしまう。 */
.date-note { font-size: var(--fs-sm); color: var(--ink-2); margin-top: var(--space-4); }

/* max-width は 600〜767px で行が横に伸びきる問題への対応（レビューM-3）。
   flex: 1 1 100% と margin-left: auto の組み合わせがボタンを右端まで
   押し出し、767px でバッジ右端〜ボタン左端が512px空いていた
   （768pxでは126px）。実測（375/768/780/800px）で ≥768px の見え方に
   変化が無いことを確認済み。 */
.date-action {
  flex: 1 1 100%;
  max-width: 384px;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-12);
}

/* 空き状況の3段階（設計 §3.5.1・§12）。色だけで伝えない —
   語（.avail のテキスト）と印の形（●/◐/○）を必ず添える。空きあり と
   キャンセル待ち は同じ面（--bg-quiet）を共有し、文字色と印の形だけで
   分ける。緑（--ok / --bg-ok）は空き状況に使わない。 */
.avail {
  display: inline-flex;
  align-items: center;
  gap: var(--space-4);
  padding: var(--space-4) var(--space-12);
  border-radius: 999px;
  font-size: var(--fs-sm);
  font-weight: 700;
  white-space: nowrap;
}
.avail-available { color: var(--blue); background: var(--bg-quiet); }
.avail-limited { color: var(--alert); background: var(--bg-alert); }
.avail-waitlist { color: var(--ink-2); background: var(--bg-quiet); }
.avail-mark { line-height: 1; }

/* 看護師限定・関係者のみの印（HP切替設計 §5、§1 決定20）。表示だけの印で、
   絞り込みは作らない。.avail と同じピル形の輪郭（角丸・padding・
   フォントサイズは共通のまま。新しい角丸トークンは増やさない）。

   2026-09-08 依頼者裁定: 印は空き状況バッジ（.avail、塗り）と
   区別できる見た目にする——実測で〔看護師限定〕が「残り僅か」
   （.avail-limited）と同じ赤・同じ塗り、〔関係者のみ〕が「キャンセル
   待ち」（.avail-waitlist）と同じ灰・同じ塗りで、形も大きさも同じため
   どちらが空き状況でどちらが属性か区別できなかった。ここでは
   **塗りをやめて枠線だけ**にする（background: transparent、
   border: 1px solid currentColor）。新しい色トークンは足さない——
   currentColor は下の色宣言（--alert・--ink-2、.avail-limited /
   .avail-waitlist と同じ既存トークン）をそのまま枠にも流用するだけで、
   :root に新しい値を足していない。枠の実際の色は --alert（白地
   5.9:1）・--ink-2（白地 5.9:1）でどちらも非文字UIに必要な3:1を
   大きく超える。

   DOM順は `_date_row.html` で .date-body 側（日付のまとまり）に置く。
   .date-action（空き状況バッジ・申込ボタンの列）には置かない——
   依頼者裁定の理由と同じで、空き状況の列に混ぜると区別が付かない。
   副作用として、`.avail-waitlist + .apply-link`（隣接セレクタ、下）を
   印が挟んで隣接を切る事故（旧欠陥）も構造的に起きなくなる。 */
/* 2026-09-08 依頼者実測: 375px幅で .mark-staff-only（「関係者のみ
   （一般のお申込はできません）」、文言が長い）が画面右端をはみ出し、
   white-space: nowrap のため折り返せず、body の横スクロールも
   増えないまま文字が画面外に消えていた（読めない状態）。共通規則
   .mark の nowrap を外し、印の種類ごとに折り返しの可否を分ける。
   .mark-nurse-only（「看護師限定」、短い）は「看護師 / 限定」に
   割れるのを防ぐため nowrap のまま。文言・色・枠線・塗りは変えない。 */
.mark {
  display: inline-flex;
  align-items: center;
  padding: var(--space-4) var(--space-12);
  border-radius: 999px;
  font-size: var(--fs-sm);
  font-weight: 700;
  background: transparent;
  border: 1px solid currentColor;
}
.mark-nurse-only { color: var(--alert); white-space: nowrap; }
.mark-staff-only { color: var(--ink-2); }

/* 申込ボタン。タップ高さは既存の body.public main a（main 内の a は
   48px）にそのまま乗る。ここで min-height を重ねない —
   .list を混ぜたセレクタで48pxを増やすと、タップ集合の一致テスト
   （test_タップ領域計測の公開集合がCSSとui_reviewerで一致する）が
   割れる（設計 §4.1.1-3・§6.2）。 */
.apply-link {
  margin-left: auto;
  display: inline-flex;
  justify-content: center;
  padding: 0 var(--space-16);
  border-radius: var(--radius);
  background: var(--blue);
  color: var(--on-fill);
  font-weight: 700;
  text-decoration: none;
  text-align: center;
}
.apply-link:hover { background: var(--navy); }
/* キャンセル待ちの申込ボタンは輪郭ボタンに降格する（レビューM-12）。
   塗りは「申し込める日程」だけに使う——依頼者の優先順位（開催地＞
   開催日＞…＞申込ボタン）に対し、実測では塗りの申込ボタンが最も強く、
   キャンセル待ちでも通常の申込と同じ強さに見えていた。

   レビュー重要-6（実測、当時）: 枠を --rule-strong（当時の値 #ccd6e0、白地
   1.47:1）にすると、非文字UI（ボタンの輪郭）に必要な3:1を大きく割り、
   ボタンの形が文字色（--blue）頼みになっていた。--blue は白地に5.28:1
   あるので、枠もそこへ寄せた。2026-09-05 管理画面刷新で --rule-strong は
   #8f857a（白地3.62:1）に暗くなり今は3:1を満たすが、--rule-strong は
   「入力欄・ボタンの枠」専用のトークン（01-tokens.css）で、公開側の輪郭
   ボタンに転用する理由は無い。文字色をそのまま枠にも使えば新しいトークン
   は要らない。塗り／輪郭の使い分け（申し込める日程だけ塗り）はそのまま。 */
.avail-waitlist + .apply-link {
  background: transparent;
  color: var(--blue);
  border: 1px solid var(--blue);
}
.avail-waitlist + .apply-link:hover { background: var(--bg-quiet); }
.apply-soon { margin-left: auto; font-size: var(--fs-sm); color: var(--ink-2); }
/* .apply-soon（受付開始前）と寸法・色をそろえる。「受付開始前」は本番の
   経路で application_opens_at を書く箇所が無く実発生しないため、同じ画面
   に並ぶことが無い。文字列（「N月N日 受付開始」／「受付を終了しました」）
   で十分に区別できるので、新しいトークンは足さない
   （design-show-closed-sessions.md 決定4）。 */
.apply-closed { margin-left: auto; font-size: var(--fs-sm); color: var(--ink-2); }

@media (min-width: 768px) {
  /* 768px以上でのみ多カラム化する。767px以下の既存メディアクエリには
     触らない（ブレークポイントは768pxの1点だけ。test_狭幅の組み替えが
     開催回一覧に閉じている は max-width:767px ブロックだけを字面で
     抽出するので、この新しいブロックはそこに含まれない）。 */
  /* 320pxのとき、1100px付近で3カラム化してカードが335pxまで狭まり、
     768pxの2カラム時（348.5px）より窮屈になっていた（レビューM-4）。
     340pxへ引き上げる。768pxでは 340×2＋gap24＝704px ≤ 内容幅なので
     2カラムを維持し（348pxを超えると768pxの2カラムの余裕が0.5pxまで
     減って壊れやすくなるため、348未満に留める）、3カラムの開始点が
     約1115pxへ上がる。test_一覧の開催地は768pxで2カラムになる が
     704 ≤ 720（768pxの内容幅の見積もり）を機械的に確認する。 */
  .loc-groups { grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); }

  /* 日程順（.date-groups の中）だけ、行の中身（開催地名・時刻・料金）を
     3列に揃える（設計 §3.10「広い画面での行の中身」）。日程順は1カラムの
     ままなので .date-body が594pxまで伸び、その84%（498px）が空いていた
     （実測: 行高106.4→80px、ページ高-15%）。.date-note（復習参加の補助
     表記）は3列の外に出し、行全体の幅で回す。開催地から探す側
     （.loc-group h2 は1カラムのまま）の見た目は変えない。 */
  .date-groups .date-body {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    align-items: baseline;
    column-gap: var(--space-16);
  }
  .date-groups .date-note { grid-column: 1 / -1; }

  /* 768〜950px帯で .date-action が384pxを取り切り、.date-body が
     flex-basis(180px) 付近まで痩せて3列が50pxになる。
     実測 2026-09-04（768px）: 受講料が4行に割れ、行高131.2px。
     この帯では伸ばさない。767px以下は1カラム縦積みなので影響しない。 */
  .date-groups .date-row .date-action { flex: 0 1 auto; }
}

/* ============================================================
   コース別パレットの別名（2026-09-05 刷新）

   **ここには色のリテラルを1つも書かない。** 実値は :root（01-tokens.css）に
   あり、ここは var() で別名を張るだけ。こうすることで
   「:root の外に色を書かない」（絶対規則1）を破らずにコース別の配色ができる。

   出どころは scripts/course_palette.py。手で足さない
   ——tests/test_course_palette.py が生成結果とこのブロックを照合する。

   data-course が無い／未知のコードのときは既定（--course-default-*）が効く。
   既定を置かないと var(--c-main) が未解決になり、主ボタンの塗りが消える。
   ============================================================ */
body.public {
  --c-main: var(--course-default-main);
  --c-deep: var(--course-default-deep);
  --c-tint: var(--course-default-tint);
  --c-soft: var(--course-default-soft);
  --c-line: var(--course-default-line);
  --c-ring: var(--course-default-ring);
  --c-shadow: var(--course-default-shadow);
  --c-err-bg: var(--course-default-err-bg);
  --c-err-line: var(--course-default-err-line);
  --c-err-ink: var(--course-default-err-ink);
  --c-err-field-bg: var(--course-default-err-field-bg);
  --c-err-field-line: var(--course-default-err-field-line);
  --c-link: var(--course-default-link);
  --c-assure-line: var(--course-default-assure-line);
  --c-review-fee-bg: var(--course-default-review-fee-bg);
  --c-step-done-ink: var(--course-default-step-done-ink);
  --c-submitting: var(--course-default-submitting);
}
body.public[data-course="ACLS"] {
  --c-main: var(--course-acls-main);
  --c-deep: var(--course-acls-deep);
  --c-tint: var(--course-acls-tint);
  --c-soft: var(--course-acls-soft);
  --c-line: var(--course-acls-line);
  --c-ring: var(--course-acls-ring);
  --c-shadow: var(--course-acls-shadow);
  --c-err-bg: var(--course-acls-err-bg);
  --c-err-line: var(--course-acls-err-line);
  --c-err-ink: var(--course-acls-err-ink);
  --c-err-field-bg: var(--course-acls-err-field-bg);
  --c-err-field-line: var(--course-acls-err-field-line);
  --c-link: var(--course-acls-link);
  --c-assure-line: var(--course-acls-assure-line);
  --c-review-fee-bg: var(--course-acls-review-fee-bg);
  --c-step-done-ink: var(--course-acls-step-done-ink);
  --c-submitting: var(--course-acls-submitting);
}
body.public[data-course="NCLS"] {
  --c-main: var(--course-ncls-main);
  --c-deep: var(--course-ncls-deep);
  --c-tint: var(--course-ncls-tint);
  --c-soft: var(--course-ncls-soft);
  --c-line: var(--course-ncls-line);
  --c-ring: var(--course-ncls-ring);
  --c-shadow: var(--course-ncls-shadow);
  --c-err-bg: var(--course-ncls-err-bg);
  --c-err-line: var(--course-ncls-err-line);
  --c-err-ink: var(--course-ncls-err-ink);
  --c-err-field-bg: var(--course-ncls-err-field-bg);
  --c-err-field-line: var(--course-ncls-err-field-line);
  --c-link: var(--course-ncls-link);
  --c-assure-line: var(--course-ncls-assure-line);
  --c-review-fee-bg: var(--course-ncls-review-fee-bg);
  --c-step-done-ink: var(--course-ncls-step-done-ink);
  --c-submitting: var(--course-ncls-submitting);
}
body.public[data-course="NCLS_EP"] {
  --c-main: var(--course-ncls-ep-main);
  --c-deep: var(--course-ncls-ep-deep);
  --c-tint: var(--course-ncls-ep-tint);
  --c-soft: var(--course-ncls-ep-soft);
  --c-line: var(--course-ncls-ep-line);
  --c-ring: var(--course-ncls-ep-ring);
  --c-shadow: var(--course-ncls-ep-shadow);
  --c-err-bg: var(--course-ncls-ep-err-bg);
  --c-err-line: var(--course-ncls-ep-err-line);
  --c-err-ink: var(--course-ncls-ep-err-ink);
  --c-err-field-bg: var(--course-ncls-ep-err-field-bg);
  --c-err-field-line: var(--course-ncls-ep-err-field-line);
  --c-link: var(--course-ncls-ep-link);
  --c-assure-line: var(--course-ncls-ep-assure-line);
  --c-review-fee-bg: var(--course-ncls-ep-review-fee-bg);
  --c-step-done-ink: var(--course-ncls-ep-step-done-ink);
  --c-submitting: var(--course-ncls-ep-submitting);
}
body.public[data-course="NCLS_INST"] {
  --c-main: var(--course-ncls-inst-main);
  --c-deep: var(--course-ncls-inst-deep);
  --c-tint: var(--course-ncls-inst-tint);
  --c-soft: var(--course-ncls-inst-soft);
  --c-line: var(--course-ncls-inst-line);
  --c-ring: var(--course-ncls-inst-ring);
  --c-shadow: var(--course-ncls-inst-shadow);
  --c-err-bg: var(--course-ncls-inst-err-bg);
  --c-err-line: var(--course-ncls-inst-err-line);
  --c-err-ink: var(--course-ncls-inst-err-ink);
  --c-err-field-bg: var(--course-ncls-inst-err-field-bg);
  --c-err-field-line: var(--course-ncls-inst-err-field-line);
  --c-link: var(--course-ncls-inst-link);
  --c-assure-line: var(--course-ncls-inst-assure-line);
  --c-review-fee-bg: var(--course-ncls-inst-review-fee-bg);
  --c-step-done-ink: var(--course-ncls-inst-step-done-ink);
  --c-submitting: var(--course-ncls-inst-submitting);
}
body.public[data-course="PEARS"] {
  --c-main: var(--course-pears-main);
  --c-deep: var(--course-pears-deep);
  --c-tint: var(--course-pears-tint);
  --c-soft: var(--course-pears-soft);
  --c-line: var(--course-pears-line);
  --c-ring: var(--course-pears-ring);
  --c-shadow: var(--course-pears-shadow);
  --c-err-bg: var(--course-pears-err-bg);
  --c-err-line: var(--course-pears-err-line);
  --c-err-ink: var(--course-pears-err-ink);
  --c-err-field-bg: var(--course-pears-err-field-bg);
  --c-err-field-line: var(--course-pears-err-field-line);
  --c-link: var(--course-pears-link);
  --c-assure-line: var(--course-pears-assure-line);
  --c-review-fee-bg: var(--course-pears-review-fee-bg);
  --c-step-done-ink: var(--course-pears-step-done-ink);
  --c-submitting: var(--course-pears-submitting);
}
body.public[data-course="ACLS_INST"] {
  --c-main: var(--course-acls-inst-main);
  --c-deep: var(--course-acls-inst-deep);
  --c-tint: var(--course-acls-inst-tint);
  --c-soft: var(--course-acls-inst-soft);
  --c-line: var(--course-acls-inst-line);
  --c-ring: var(--course-acls-inst-ring);
  --c-shadow: var(--course-acls-inst-shadow);
  --c-err-bg: var(--course-acls-inst-err-bg);
  --c-err-line: var(--course-acls-inst-err-line);
  --c-err-ink: var(--course-acls-inst-err-ink);
  --c-err-field-bg: var(--course-acls-inst-err-field-bg);
  --c-err-field-line: var(--course-acls-inst-err-field-line);
  --c-link: var(--course-acls-inst-link);
  --c-assure-line: var(--course-acls-inst-assure-line);
  --c-review-fee-bg: var(--course-acls-inst-review-fee-bg);
  --c-step-done-ink: var(--course-acls-inst-step-done-ink);
  --c-submitting: var(--course-acls-inst-submitting);
}

/* ============================================================
   公開申込フォームの刷新（2026-09-05、Claude Design 確定案）

   要素の対応は docs/superpowers/specs/2026-09-05-apply-redesign-inventory.md
   の記号（A-1 等）で示す。色は全て var()、寸法は全てトークン。
   ============================================================ */

/* --- ステップの表示・非表示 ---

   **`[hidden]` を常に勝たせる。** static/apply.js は要素の hidden プロパティで
   ステップを畳むが、参加区分の切替が `.regular-only` と
   `#attendance-review:checked ~ .review-only` に display: contents を当てており、
   これは 06-settings-tabs.css（このファイルより後に読まれる）にあって
   id を含む＝詳細度も高い。素直に書くと **hidden を付けても表示されたまま**になる。

   実機で実測して見つけた（2026-09-05、375px）: JS が16要素に hidden を立てた状態で、
   **15要素の computed display が none になっていなかった**。DOM 上は hidden なのに
   画面には全ステップが出ている、という一番たちの悪い形——「動いているように見えて
   ウィザードになっていない」。

   ここは `!important` が正しい道具。`[hidden]` は「何があっても隠す」という意味の
   属性で、それを他の display 宣言に負けさせないための宣言だから。
   （このリポジトリで `!important` を使うのはここだけ。）

   **[data-step] に限定しない。** 当初 `[data-step][hidden]` と書いていたが、
   ステップ操作のボタン（`hidden` 属性つきで出す「戻る」「次へ」）と
   ステップ帯は data-step を持たないので、この規則が届いていなかった。
   `button, .btn` の display: inline-block（02-components.css）と
   狭幅の `display: inline-flex`（04-narrow.css）は作者スタイルなので、
   UA の `[hidden]` の display: none に**カスケードの起源で勝つ**——
   結果、**ステップ1の時点で「次へ」と「この内容で申し込む」が並んで出て、
   受講歴・同意を飛ばしたまま送信できてしまっていた**（差分レビューで実測）。
   サーバ側の検証が受け止めるので不正な予約は作られないが、申込者には
   「見たこともない欄のエラー」が出る。申込フォームでは致命的。 */
body.public.apply [hidden] { display: none !important; }

/* --- A. 全体の地とレイアウト --- */
body.public.apply { background: var(--form-ground); color: var(--form-text); }

/* ロゴ帯とヘッダー帯は本文（max-width 640px）と幅を揃える。
   広幅は確定案の 1180px（在庫表 N-1b）。

   A-8: 本文パディングは16px。サイト共通の body.public main（32px 16px 48px、
   一覧・法令ページ等にも効く）はそのまま——body.public.apply main に限定して
   上書きすることで、他の公開ページの余白を変えずに済ませる。 */
body.public.apply main { max-width: 640px; padding: var(--space-16); }

/* --- B. ヘッダー画像帯 --- */
/* 指摘4【中】: height 固定＋overflow: hidden だと、完了画面
   （course_visual.DONE_HEIGHT=186）で開催地が長く日程行が2行になる
   開催回のとき、320px幅で13.3px切れる（実測）。min-height に変え、
   帯を display: flex にして .apply-band__inner を通常のフローに置く
   ——内容が入りきらないときだけ帯自体が伸びるようにする（内容が
   min-height 以下のときは元と同じ見た目のまま）。 */
.apply-band {
  position: relative;
  max-width: 640px;
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  min-height: var(--band-h);       /* 高さの出どころは course_visual（SVGのviewBoxと同じ値）。あくまで下限 */
  overflow: hidden;
  background: var(--c-tint);
}
.apply-band__ecg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;                    /* .apply-band が伸びてもSVGはinset:0で追従する（実機で確認） */
}
/* 幅ごとに専用の viewBox を持つ SVG を出し分ける（在庫表 B-2 / N-4）。 */
.apply-band__ecg--wide { display: none; }
.apply-band__ecg path { stroke: var(--c-line); }
.apply-band__inner {
  /* absolute + inset:0 をやめ、通常のフローに置く。**position: relative は
     残す**——position指定である限り、DOM順で後にある要素として2つの
     ECG（position: absolute）より前面に描かれる仕組み（positioned要素は
     非positioned要素より後に、同じ階層内ではDOM順に描かれる）が保たれる。
     flex: 1 1 auto にすると、.apply-band（display: flex）の高さが
     min-height だけで足りるときはそこまで伸び、内容がそれより大きい
     ときは内容の高さがそのまま .apply-band 自体の高さになる。 */
  position: relative;
  flex: 1 1 auto;
  box-sizing: border-box;
  padding: var(--space-24);
  display: flex;
  flex-direction: column;
  gap: var(--space-12);
}
.apply-band__kicker {
  font-family: "Quicksand", "Noto Sans JP", sans-serif;
  font-weight: 500;
  font-size: var(--fs-xs);
  letter-spacing: .18em;
  text-transform: uppercase;
  line-height: 1.5;
  color: var(--c-deep);
}
/* B-3 の例外: PEARS だけキッカーが長く、11px では 375px 幅で折り返して
   帯からはみ出す。確定案が per-course の例外として持っていたもの。 */
body.public[data-course="PEARS"] .apply-band__kicker {
  font-size: var(--fs-9-5);
  letter-spacing: .10em;
}
.apply-band__name {
  font-family: "Quicksand", "Noto Sans JP", sans-serif;
  font-weight: 600;
  color: var(--c-deep);
}
.apply-band__name-latin {
  display: block;
  font-family: "Quicksand", "Noto Sans JP", sans-serif;
  font-weight: 600;
  font-size: var(--fs-58);
  line-height: .98;
  letter-spacing: .01em;
  color: var(--c-deep);
}
.apply-band__name-ja {
  display: block;
  margin-top: var(--space-4);
  font-family: "Zen Maru Gothic", "Noto Sans JP", sans-serif;
  font-weight: 500;
  font-size: var(--fs-30);
  line-height: 1.15;
  white-space: nowrap;
  color: var(--c-deep);
}
/* B-6: 開催回ごとに変わる行。狭幅では時刻を出さない（確定案 metaLine）。

   指摘G: 確定案の色 var(--form-text-2) は、心電図の線（var(--c-line)、
   主色30%）と重なる箇所で合成後のコントラストが ACLS 4.34 / NCLS_INST
   4.21 / 既定 4.49 と 4.5:1 を割っていた（実測）。var(--c-deep) に変えて
   全コースで 5.4:1 以上を確保する（確定案からの逸脱。記録は
   docs/superpowers/specs/2026-09-05-apply-redesign-inventory.md §M）。 */
.apply-band__meta {
  margin-top: auto;
  font-family: "Zen Maru Gothic", "Noto Sans JP", sans-serif;
  font-weight: 400;
  font-size: var(--fs-md);
  color: var(--c-deep);
}
.apply-band__meta-time { display: none; }
/* 開催地は語の途中で折り返さない（「東京・大手」／「町」に割れるのを防ぐ）。 */
.apply-band__meta-place { white-space: nowrap; }
.apply-band__meta-date::after,
.apply-band__meta-time::after { content: "　"; }

/* --- A-4〜A-7. スティッキーバー --- */
.apply-sticky {
  position: sticky;
  top: 0;
  z-index: 3;
  display: flex;
  align-items: center;
  gap: var(--space-10);
  /* 確定案は画面いっぱいの帯だが、本文の左右パディング（16px）を負の margin で
     打ち消す形は採らない——余白スケールの規則（tests/test_style_guard.py の
     test_padding_margin_gapはスケールか除外条件に従う）が負値を
     「1px罫線の位置合わせ用（絶対値2.5px以下）」に限っているため。
     本文のガター内に収める。**確定案からの逸脱として在庫表に記録した。** */
  margin: 0 0 var(--space-14);
  padding: var(--space-10) var(--space-16);
  background: var(--surface);
  border-bottom: 1px solid var(--form-sticky-rule);
  box-shadow: 0 2px 8px var(--form-shadow-frame-near);
}
.apply-sticky__course {
  font-family: "Quicksand", "Noto Sans JP", sans-serif;
  font-weight: 600;
  font-size: var(--fs-19);
  color: var(--c-deep);
}
.apply-sticky__date { font-size: var(--fs-sm); color: var(--form-text-2); }
.apply-sticky__badge {
  margin-left: auto;
  padding: var(--space-5) var(--space-10);
  border-radius: 999px;
  font-size: var(--fs-12);
  font-weight: 700;
  background: var(--c-main);
  color: var(--on-fill);
}
/* 参加区分バッジの出し分けは CSS だけで行う（JS を使わない）。
   **2つとも描いて片方を隠す** ——どちらが選ばれていても必ず1つ見える。
   一般兄弟結合子が届くよう、スティッキーバーはラジオより後ろの
   <form> 直下に置いてある（templates/apply.html 参照）。 */
.apply-sticky__badge--review { display: none; }
#attendance-review:checked ~ .apply-sticky .apply-sticky__badge--regular { display: none; }
#attendance-review:checked ~ .apply-sticky .apply-sticky__badge--review { display: block; }

/* --- D. ステップ帯 --- */
.apply-steps {
  display: flex;
  gap: var(--space-6);
  margin: 0 0 var(--space-14);
  padding: 0;
  list-style: none;
}
.apply-steps__item {
  /* **min-height ではなく height。** min-height: 44px を使うと、
     管理画面のタップ領域の集合（tests/test_style_guard.py の
     test_タップ領域計測の管理集合が…）に、タップ対象でないこの状態表示が
     混ざってしまう。ステップ帯は押せない <li> で、文言も短い固定値なので
     高さを固定してよい。 */
  flex: 1;
  height: 40px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 999px;
  font-size: var(--fs-12);
  font-weight: 700;
  background: var(--form-inert);
  color: var(--form-text-2);
}
.apply-steps__item[data-state="current"] { background: var(--c-main); color: var(--on-fill); }
.apply-steps__item[data-state="done"] { background: var(--c-soft); color: var(--c-step-done-ink); }
/* D-6: 狭幅は短いラベル、広幅は長いラベル。apply-band__meta-time と同じ
   流儀——両方を常にサーバ描画し、display だけで出し分ける（決定10）。
   広幅側の上書きは下の @media (min-width: 768px) 内にある。 */
.apply-steps__label--wide { display: none; }

/* --- C. カードの基本形（在庫表 C-1）。確定案は白いカードが縦に並ぶ形。 --- */
.apply-card,
.apply-section,
.apply-confirm__section {
  background: var(--surface);
  border-radius: var(--radius-20);
  padding: var(--space-20);
  margin-bottom: var(--space-14);
  box-shadow: 0 1px 2px var(--form-shadow-card);
}
.apply-card .session-facts { margin: 0; }
/* E-1/E-2: 開催概要カード。ステップ帯の下に上罫、ラベル幅52px固定の2列。
   <dl>/<dt>/<dd> の意味構造は変えない——確定案は素のflex行だが、H-6の
   確認行と同じ技法（gridでdt/ddを2列に並べる）で作る。dt/ddの色・太さは
   既存の body.public .session-facts dt/dd（グローバル）に任せ、ここでは
   罫と2列レイアウトだけを足す。 */
body.public.apply .apply-card .session-facts {
  display: grid;
  grid-template-columns: 52px minmax(0, 1fr);
  column-gap: var(--space-12);
  row-gap: var(--space-10);
  padding-top: var(--space-4);
  border-top: 1px solid var(--form-tag-bg);
}
body.public.apply .apply-card .session-facts dt,
body.public.apply .apply-card .session-facts dd { margin: 0; }
.apply-card > p {
  margin: var(--space-12) 0 0;
  font-size: var(--fs-15);
  line-height: 1.8;
  color: var(--form-text-2);
}
/* カード見出し（C-2）。大きさは body.public h2（18px）のまま、書体だけ足す。 */
body.public.apply h2 {
  font-family: "Zen Maru Gothic", "Noto Sans JP", sans-serif;
  font-weight: 700;
}

/* --- E. 入力欄 --- */
/* E-16: 確定案の狭幅は gap 20px（実装は 14px だった）。広幅は既存の
   18px（下の @media 内、決定済みの逸脱）のまま変えない。 */
.apply-section { display: flex; flex-direction: column; gap: var(--space-20); }
.apply-row { display: flex; gap: var(--space-12); flex-wrap: wrap; }
.apply-row .apply-field { flex: 1 1 130px; min-width: 0; }
.apply-field { display: flex; flex-direction: column; gap: var(--space-8); }
.apply-field__label {
  display: flex;
  align-items: center;
  gap: var(--space-8);
  flex-wrap: wrap;
  font-size: var(--fs-lg);
  font-weight: 700;
}
.apply-req {
  padding: var(--space-3) var(--space-8);
  border-radius: 999px;
  font-size: var(--fs-xs);
  font-weight: 700;
  background: var(--c-soft);
  color: var(--c-deep);
}
.apply-field-block { display: block; }

/* E-13: 受講料の数字だけ大きく。「円」は本文の大きさのまま。
   数字と「円」はフォントサイズが違う（30px と本文16px）ので、素の
   インライン配置に任せるとくっつきすぎる。gap 8px を効かせるため
   .apply-tiers__fee を inline-flex にする——align-items: baseline で
   大きさの違う2つを行の基準線で揃える。 */
.apply-tiers { margin: 0; padding-left: 0; list-style: none; }
.apply-tiers__fee {
  display: inline-flex;
  align-items: baseline;
  gap: var(--space-8);
}
.apply-tiers__amount {
  font-family: "Quicksand", "Noto Sans JP", sans-serif;
  font-weight: 600;
  font-size: var(--fs-30);
  color: var(--c-deep);
}

/* --- H. 確認パネル --- */
.apply-confirm { display: flex; flex-direction: column; gap: var(--space-14); }
/* H-1: 見出し「この内容で申し込みます」の狭幅は20px（--fs-20）。
   広幅は下の @media 内で --fs-21 に上書きする（既存）。 */
body.public.apply .apply-confirm h2 { font-size: var(--fs-20); }
.apply-confirm__lead {
  margin: 0;
  font-size: var(--fs-15);
  line-height: 1.8;
  color: var(--form-text-2);
}
/* H-2: 「最下部の」/「右下の」はレイアウトで意味が変わる（広幅は
   ボタンが右下に来る2カラム構成）ので、文言そのものを幅で出し分ける。
   apply-band__meta-time と同じやり方——サーバ描画のHTMLには両方
   常に存在し、CSS の display だけで切り替える（決定10: JSを使わない）。 */
.apply-confirm__lead-narrow { display: inline; }
.apply-confirm__lead-wide { display: none; }
/* H-3〜H-6: 確認パネルの節と各行。中身は static/apply.js が入力欄から読んで作る。 */
.apply-confirm__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-12);
  margin-bottom: var(--space-14);
}
.apply-confirm__head h3 {
  margin: 0;
  font-family: "Zen Maru Gothic", "Noto Sans JP", sans-serif;
  font-size: var(--fs-17);
  font-weight: 700;
}
/* `body.public button` の width: 100% は (0,1,1) で、クラス単独の
   `.apply-confirm__edit`(0,1,0) より強い。**body.public.apply を付けて
   詳細度を上げないと幅いっぱいのままになる**（実機で実測）。 */
body.public.apply .apply-confirm__edit {
  /* min-height は指定しない。body.public button が 48px を与えており、
     ここで独自に書くと公開レイヤーのタップ対象集合が増えて
     ui-reviewer.md の PUBLIC_TAP とずれる（button で既に拾えている）。 */
  width: auto;
  flex: none;
  padding: 0 var(--space-12);
  margin-top: 0;
  border: 0;
  background: none;
  font-family: inherit;
  font-size: var(--fs-15);
  font-weight: 700;
  color: var(--c-link);
  cursor: pointer;
}

/* H-6: 確認パネルの各行。 */
/* H-6: キーと値を2列に並べる。<dl> の既定は縦積みなので grid で組む。 */
.apply-confirm__rows {
  margin: 0;
  display: grid;
  grid-template-columns: 96px minmax(0, 1fr);
  column-gap: var(--space-14);
}
.apply-confirm__rows dt {
  grid-column: 1;
  padding-top: var(--space-12);
  border-top: 1px solid var(--form-row-rule);
  font-size: var(--fs-sm);
  font-weight: 700;
  line-height: 1.6;
  color: var(--form-label);
}
/* 指摘1【最重要】: 値は static/apply.js が textContent で任意の文字列
   （メールアドレス等）を流し込む。ハイフンの無い文字列は既定の折り返し
   規則で折り返せず、STEP4（送信ボタンのある画面）で横スクロールになる
   （実測: 320px 幅で yamada.hanako@gmail.com が箱を75px超えてインクが
   はみ出す）。overflow-wrap: anywhere で強制的に折り返させる。
   dt（ラベル）側は実機で計測したが、最長26字のラベルも含め全部が
   日本語の文字列で、既定の行分割規則でも任意の文字間で折り返せるため
   箱を超えない（実測 over=0）。dt には付けない。 */
.apply-confirm__rows dd {
  grid-column: 2;
  margin: 0;
  padding-top: var(--space-12);
  border-top: 1px solid var(--form-row-rule);
  font-size: var(--fs-lg);
  line-height: 1.7;
  overflow-wrap: anywhere;
}

.apply-assure {
  padding: var(--space-18);
  border: 1px solid var(--c-assure-line);
  border-radius: var(--radius-20);
  background: var(--c-tint);
  display: flex;
  flex-direction: column;
  gap: var(--space-10);
}
/* 指摘I: <span> から <h3> に変えた。UAスタイル既定のマージンを消す
   （font-size/color は既にこのクラス側の宣言があり、static/06-settings-tabs.css
   の裸の h3 用ルールより詳細度が高いので安全だが、margin は本クラス側で
   未指定だとその裸ルールが勝つ）。 */
.apply-assure__title { margin: 0; font-size: var(--fs-15); font-weight: 700; color: var(--c-deep); }
/* H-10: 既定の disc マーカーを18×18pxの丸枠に差し替える。
   ul 自体を縦gapの列にする——確定案は各項目が gap:10px の行として並ぶ
   （3つの<li>を並べる従来のブロック要素の詰まった行間ではない）。 */
.apply-assure ul {
  margin: 0;
  padding-left: 0;
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: var(--space-10);
  font-size: var(--fs-md);
  line-height: 1.8;
  color: var(--form-text-2);
}
.apply-assure ul li {
  position: relative;
  /* 18px(丸) + 10px(間隔) = 28px */
  padding-left: var(--space-28);
}
.apply-assure ul li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 3px;
  width: 18px;
  height: 18px;
  border-radius: 50%;
  border: 2px solid var(--c-main);
}

/* --- ステップ操作のボタン --- */
.apply-nav { display: flex; gap: var(--space-10); margin-top: var(--space-8); }
.apply-nav__submit, .apply-nav__next { flex: 1; }
.apply-nav__back {
  padding: 0 var(--space-22);
  border: 1px solid var(--form-btn-rule);
  border-radius: 999px;
  background: var(--surface);
  color: var(--form-text);
  font-family: inherit;
  font-size: var(--fs-lg);
}
/* 指摘H: 「次へ」は未入力でも実際には動作するので aria-disabled は付けない
   （static/apply.js 参照）。見た目の減光だけを data-apply-incomplete で
   行う。送信ボタンは送信中に実際に disabled になる場面があるので
   aria-disabled のままでよい。 */
.apply-nav__next[data-apply-incomplete="true"], .apply-nav__submit[aria-disabled="true"] {
  background: var(--form-btn-off-bg);
  color: var(--form-btn-off-ink);
  cursor: not-allowed;
  box-shadow: none;
}

/* --- N. 広幅（確定案のデスクトップ） --- */
@media (min-width: 768px) {
  body.public.apply main { max-width: 1180px; }
  /* .public-header はここに書かない —— 指摘P1-2（在庫表との再照合、
     2026-09-05・実測）参照。同じ詳細度 (0,2,1) の、下の方（A-2/A-3/N-1e）
     にある max-width: 640px の body.public.apply .public-header 規則が
     このブロックより後ろにあるため、ここに書いてもソース順で負けて
     640px のまま取り残される。1180px への上書きはその後ろにある
     「A-2 / N-1e: 広幅のロゴ帯」ブロック（下の方の @media (min-width: 768px)
     内）に書く。 */
  body.public.apply .apply-band { max-width: 1180px; }
  /* height→min-height: 狭幅と同じ理由（指摘4・指摘5）。PEARSのキッカーが
     768px以上で2行になるケース（指摘5）でも、固定250pxのまま下paddingに
     食い込ませず、必要なら帯自体を伸ばす。 */
  body.public.apply .apply-band { min-height: 250px; }
  .apply-band__ecg--narrow { display: none; }
  .apply-band__ecg--wide { display: block; }
  /* N-1c / N-1g: 広幅では開催概要と安心ブロックを**本文から消す**。
     右サイドバー（.apply-aside）が同じ内容を持っているので、
     隠さないと「日時・開催地」と「安心してご入力いただくために」が
     画面に2つ出る。確定案は本文側を持たない形。 */
  body.public.apply .session-facts,
  body.public.apply .apply-confirm .apply-assure { display: none; }
  .apply-band__inner { padding: var(--space-36) var(--space-48) var(--space-30); gap: var(--space-16); }
  .apply-band__kicker { font-size: var(--fs-sm); letter-spacing: .24em; }
  body.public[data-course="PEARS"] .apply-band__kicker { font-size: var(--fs-sm); letter-spacing: .24em; }
  .apply-band__name-latin { font-size: var(--fs-110); line-height: .9; }
  /* N-4: 広幅では和名を欧文の**横**に並べる（狭幅は縦積み）。
     和名があるときの欧文は 110px ではなく 92px——横に2つ並ぶぶん詰める。
     入れ子の有無で1つ目と2つ目を見分ける:
       和名なし … 同じ要素に .apply-band__name と .apply-band__name-latin
       和名あり … .apply-band__name の**子**に .apply-band__name-latin */
  .apply-band__name > .apply-band__name-latin {
    display: inline;
    font-size: var(--fs-92);
  }
  .apply-band__name:not(.apply-band__name-latin) {
    display: flex;
    align-items: baseline;
    gap: var(--space-20);
    white-space: nowrap;
  }
  .apply-band__name-ja {
    display: inline;
    margin-top: 0;
    font-size: var(--fs-46);
    line-height: 1.1;
  }
  .apply-band__meta { font-size: var(--fs-17); }
  .apply-band__meta-time { display: inline; }
  /* N-1a: 広幅ではスティッキーバーを出さない（右サイドバーが同じ役目を持つ）。 */
  .apply-sticky { display: none; }
  .apply-steps { gap: var(--space-10); }
  .apply-steps__item { height: 44px; font-size: var(--fs-md); }
  /* D-6: 広幅は長いラベルに出し分ける。 */
  .apply-steps__label--narrow { display: none; }
  .apply-steps__label--wide { display: inline; }
  .apply-row { gap: var(--space-20); }
  /* 指摘3【中】: 固定220pxのままだと、氏名などの2列を並べるのに
     220×2+gap20=460px要る一方、本文カラム（内側）は768pxで388pxしかなく、
     768〜839pxで2列が1列に崩れる（840pxで確定案どおりの2列に戻る不連続
     な挙動だった。実測）。840px専用の値を新設せず、clamp() で本文カラム
     幅の割合として連続的に縮める——本文カラムが広がる（≒938px以上）に
     つれて確定案の220pxに達する。サイドバーの280px側は動かさない
     （確定案からの逸脱を1箇所に留める。在庫表 §M に記録）。 */
  .apply-row .apply-field { flex: 1 1 clamp(150px, 44%, 220px); }
  .apply-section { gap: var(--space-18); }
  .apply-card,
  .apply-section,
  .apply-confirm__section { padding: var(--space-22); }
  .apply-tiers__amount { font-size: var(--fs-32); }
  /* 2026-09-09: .apply-tiers（受講料）と .consent（同意チェック行）は
     <form> の直接の子（.regular-only / .review-only 経由、display:
     contents）で .apply-section の外にいるため、上の共通ルールの
     22px（var(--space-22)）左paddingを引き継がない——実機で実測すると
     広幅（1710px）で .apply-field は left:303 なのにこの2つだけ
     left:281 のまま22px左に寄って見えていた。参加区分の切替
     （#attendance-review:checked ~ .regular-only / .review-only、
     static/06-settings-tabs.css）が「<form> の直接の子」前提の
     一般兄弟結合子で書かれているため、.apply-section で包んで
     inset を引き継がせることができない（H-12 の .apply-nav__back と
     同じ「直接の子であることを一般兄弟結合子に使っている」事情）。
     値は上の共通ルールと同じ --space-22 を使う——別の値をハードコード
     すると、共通ルール側が変わったときに追従せず再びずれる。
     詳細度: .apply-tiers 自身の `padding-left: 0`（0,1,0）と
     body.public.apply .consent の `padding: var(--space-6) 0`
     （0,3,1）を両方上書きする必要がある。セレクタに `form` を足して
     要素数を1つ増やし（0,3,2）、ソース順に関わらず勝たせる。 */
  body.public.apply form .apply-tiers,
  body.public.apply form .consent { padding-left: var(--space-22); }
}

/* ============================================================
   申込フォームをコース色でまとめる（2026-09-05、ユーザー指摘）

   確定案（Claude Design）はフォーム全体がコース色。実機で測ったところ
   **参加区分タブ・本文リンク・送信ボタンの3箇所だけ var(--blue) が残って**おり、
   「ここだけ色が違う」状態になっていた。

   このブロックは `body.public.apply` に限る——一覧・法令ページのリンク色を
   --blue に統一するという既存の裁定（設計 §4.6・§9-3・§12）は変えない。
   ============================================================ */

/* 見出しの下線。確定案にはこの下線そのものが無い（帯の大きなコース名が
   ブランドを担っている）が、公開ページの h1 は下線を持つという既存の作りは
   残し、色だけコースに揃える。ここだけ紺のままだと「フォームの中で1箇所だけ
   色が違う」状態になる（実機の実測で最後に残っていた1件）。 */
body.public.apply h1 { border-bottom-color: var(--c-main); }

/* リンク（E-7 / G-5 / I-15）。既存の `:where(body.public main) a` と同じ
   詳細度 (0,0,1) にして、後に書くことで勝たせる。**:where() を外して
   詳細度を上げない** — 上げると .apply-link / .btn などクラスを持つ部品の
   色宣言まで殺す（設計に事故の記録あり）。 */
:where(body.public.apply main) a {
  color: var(--c-link);
}

/* 主ボタン（E-28）。確定案は 56px・ピル・Zen Maru Gothic 17px/700。 */
body.public.apply .apply-nav__submit,
body.public.apply .apply-nav__next {
  min-height: 56px;
  border-radius: 999px;
  background: var(--c-main);
  color: var(--on-fill);
  font-family: "Zen Maru Gothic", "Noto Sans JP", sans-serif;
  font-size: var(--fs-17);
  font-weight: 700;
  box-shadow: 0 6px 18px var(--c-shadow);
}
body.public.apply .apply-nav__submit:hover,
body.public.apply .apply-nav__next:hover { background: var(--c-deep); }
/* 副ボタン（F-13 / H-12）は輪郭のまま。塗りボタンの規則に巻き込まれないよう
   ここで明示する。 */
body.public.apply .apply-nav__back {
  width: auto;
  flex: none;
  min-height: 56px;
  background: var(--surface);
  color: var(--form-text);
  box-shadow: none;
}
body.public.apply .apply-nav__back:hover { background: var(--form-tag-bg); }

/* 入力欄（E-22〜E-24）。地・枠もコース色の系列に寄せる。 */
body.public.apply input:not([type="checkbox"]):not([type="radio"]):not([type="hidden"]),
body.public.apply select,
body.public.apply textarea {
  /* 確定案 E-22 は 52px。**48px の宣言（body.public input …）は消さない**——
     消すとタップ領域の計測対象の集合から入力欄が外れ、ui-reviewer が
     測らなくなる。ここは上書きするだけにして、48px の宣言は残す。
     52px は 48px の下限を上回っているので、規則としても矛盾しない。 */
  min-height: 52px;
  padding: 0 var(--space-16);
  border-radius: var(--radius-14);
  background: var(--form-input-bg);
  border: 1px solid var(--form-input-rule);
  color: var(--form-text);
}
body.public.apply input:not([type="checkbox"]):not([type="radio"]):not([type="hidden"]):focus-visible,
body.public.apply select:focus-visible,
body.public.apply textarea:focus-visible {
  outline: none;
  background: var(--surface);
  border: 2px solid var(--c-main);
  box-shadow: 0 0 0 4px var(--c-ring);
}
body.public.apply ::placeholder { color: var(--form-label); }
/* エラーのある欄（E-24）。aria-invalid は apply.html が付ける。

   指摘P0-2（在庫表との再照合、2026-09-05・実測）: 素のセレクタは
   詳細度 (0,3,1) で、上の基底の入力欄の規則
   body.public.apply input:not([type="checkbox"]):not([type="radio"]):not([type="hidden"])
   の (0,5,2) に負けていた。aria-invalid の出力自体は正しく行われているのに、
   エラーのある欄が通常の欄と同じ見た目になる（実測: 地 #faf9f7／枠1px #908d89）。

   直し方: 基底の入力欄の規則と**同じ形＋属性1つ**にする。select には
   aria-invalid を付ける箇所が現状無いが、書式を揃えて select にも
   同じ考え方が効くようにしておく。input 側は要素・クラスの数が基底の
   規則と同じ上に [aria-invalid="true"] が1つ増えるので、詳細度で
   確実に上回り、CSSの並び順に依存しない。 */
body.public.apply input[aria-invalid="true"]:not([type="checkbox"]):not([type="radio"]):not([type="hidden"]),
body.public.apply select[aria-invalid="true"],
body.public.apply textarea[aria-invalid="true"] {
  background: var(--c-err-field-bg);
  border: 2px solid var(--c-err-field-line);
}

/* エラー総覧・欄ごとのエラー（E-5〜E-7 / E-25）。padding は総覧
   （.error 単体）にだけ効く——.error--field が padding: 0 で打ち消す
   ので、欄ごとのインラインエラーには影響しない。 */
body.public.apply .error {
  padding: var(--space-18);
  border-radius: var(--radius-20);
  background: var(--c-err-bg);
  border: 1px solid var(--c-err-line);
  color: var(--c-err-ink);
}
body.public.apply .error a { color: var(--c-err-ink); font-weight: 700; }
/* E-7 / E-25: 「↓」「⚠」は**装飾なので CSS で出す**。本文に入れると
   読み上げで記号がそのまま読まれ、テストもリンクの文言として拾ってしまう。 */
body.public.apply .error a::before { content: "↓ "; }
body.public.apply .error--field::before { content: "⚠ "; }
body.public.apply .error__title { margin: 0 0 var(--space-8); font-size: var(--fs-lg); font-weight: 700; }
body.public.apply .error--field {
  font-size: var(--fs-15);
  font-weight: 700;
  line-height: 1.6;
  background: none;
  border: 0;
  padding: 0;
}

/* 満席・復習の告知（E-12 / E-14 / F-3）。 */
body.public.apply .notice {
  border-radius: var(--radius-16);
  padding: var(--space-16);
  background: var(--c-review-fee-bg);
  border: 0;
  font-size: var(--fs-15);
  line-height: 1.8;
}
/* E-12: 満席（キャンセル待ち）の告知だけ、より濃い地にする。
   復習の受講料枠（F-3）と同じ色だと「定員に達している」ことが埋もれる。 */
body.public.apply .regular-only .notice { background: var(--c-err-bg); }
body.public.apply .notice strong { color: var(--c-deep); }

/* チェック・ラジオの印（F-10 / F-11 / G-6）。 */
body.public.apply input[type="checkbox"],
body.public.apply input[type="radio"] { accent-color: var(--c-main); }

/* G-2: textarea は1行入力と違って上下のパディングが要る。 */
body.public.apply textarea {
  min-height: 104px;
  padding: var(--space-14) var(--space-16);
  line-height: 1.8;
  resize: vertical;
}

/* ============================================================
   N-1b / N-2 / N-3: 広幅の2カラムと右サイドバー
   ============================================================ */

/* 狭幅では出さない。確定案のモバイルにサイドバーは無く、
   スティッキーバー（A-4）が「何に申し込んでいるか」を担っている。 */
.apply-aside { display: none; }

@media (min-width: 768px) {
  /* **grid にする。flex ではなく grid なのは、<form> の直接の子が
     フラットに並んでいるから**（参加区分の切替が一般兄弟結合子で動くため、
     本文をラッパー div でまとめられない）。左カラムに全部を流し、
     サイドバーだけを右カラムに全行またいで置く（下の .apply-aside の
     コメント参照）。

     2026-09-09: `-1`（.apply-aside 側の grid-row の終端）は仕様上
     「明示グリッドの最終行」を指す。この <form> が grid-template-rows を
     宣言していないと明示グリッドは0行のままで、`-1` は行1に巻き戻って
     しまう（試した: grid-template-rows を足さず .apply-aside だけ
     `grid-row: 1 / -1` にしても計算値は 1 / -1 のままレイアウトは
     変わらなかった）。行数を明示して初めて `-1` が機能する。

     行数（40）は「今日この形の最大」ではなく余裕を持たせた値——
     カスタム質問（form_fields、管理画面でコースごとに増減できる）が
     STEP2の regular-only/review-only に1問1行で積み上がるため、
     正確な将来上限は無い。実測の最大はカスタム質問14問の
     ACLS/PEARSでSTEP2・通常参加時18行（10問のNCLSは14行）。
     この実測最大の倍強を確保した。auto の空トラックは0pxに潰れる
     （実測）ので、40行を使い切らない画面でも高さは変わらない。 */
  body.public.apply form {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 280px;
    grid-template-rows: repeat(40, auto);
    column-gap: var(--space-24);
    align-items: start;
  }
  /* N-1b: 確認画面（STEP4）だけサイドバーの列を300pxに広げる。
     static/apply.js の show() が <form data-apply-step="…"> へ現在地の
     ステップ番号を書き込む——JS 無効時はこの属性が付かず既定の280pxの
     まま（フォーム画面と確認画面の区別がJS無しでは付かないため、床は
     狭い方に倒す。他のN-1b/N-2/N-3差分と同じくJSが動く前提の仕上げ）。
     詳細度 (0,3,1) は素の `body.public.apply form`（0,2,1）に勝つ。 */
  body.public.apply form[data-apply-step="4"] {
    grid-template-columns: minmax(0, 1fr) 300px;
  }
  /* .regular-only / .review-only は display: contents なので、
     グリッドの子になるのは**その中身**。孫まで左カラムに寄せないと、
     参加区分の分岐だけ右カラムへ回り込む。 */
  body.public.apply form > *,
  body.public.apply form > .regular-only > *,
  body.public.apply form > .review-only > * { grid-column: 1; }

  /* **`body.public.apply form > *` より詳細度を高くする。**
     あちらは (0,2,2)、`.apply-aside` 単独は (0,1,0) で負け、
     サイドバーが左カラムへ落ちて全幅になる（実機で実測）。

     2026-09-09: grid-row は `1` だけでなく `1 / -1`（全行）に跨がせる。
     1行だけだと、本文側の最初の項目がサイドバーより短いとき、行1が
     サイドバーの高さに引っ張られて本文の下に大きな空白ができる
     （実機で実測: https://course-reservation.onrender.com/apply/28、
     復習参加選択・1456px幅。行1が525.57pxまで伸び、以降の要素が
     その分下に押し出された。サイドバーを隠すと行1は231.59pxまで縮む）。
     `-1` を機能させるには <form> 側の grid-template-rows（上のコメント
     参照）が要る——無いと明示グリッドが0行のままで `-1` が行1に
     巻き戻り、この空白が再発する。 */
  body.public.apply form > .apply-aside {
    display: flex;
    flex-direction: column;
    gap: var(--space-14);
    grid-column: 2;
    grid-row: 1 / -1;
    position: sticky;
    top: var(--space-24);
  }
  .apply-aside__card {
    display: flex;
    flex-direction: column;
    gap: var(--space-10);
    padding: var(--space-20);
    border-radius: var(--radius-20);
    background: var(--surface);
    box-shadow: 0 1px 2px var(--form-shadow-card);
  }
  /* 指摘I: <span> から <h2> に変えた。sitewide の `body.public h2` /
     デスクトップの `body.public.apply h2`（03-public.css）が font-size を
     18px/19px に上書きしてしまう詳細度を持つため、同じ祖先クラスを
     重ねて詳細度を上げ、13px を保つ。margin も明示して h2 の既定を消す。 */
  body.public.apply .apply-aside__title { margin: 0; font-size: var(--fs-sm); font-weight: 700; color: var(--form-label); }
  .apply-aside__course {
    font-family: "Quicksand", "Noto Sans JP", sans-serif;
    font-weight: 600;
    font-size: var(--fs-2xl);
    color: var(--c-deep);
  }
  .apply-aside__line { font-size: var(--fs-lg); }
  .apply-aside__rule { height: 1px; margin: var(--space-4) 0; background: var(--form-inert); }
  .apply-aside__row { display: flex; align-items: center; justify-content: space-between; }
  .apply-aside__key { font-size: var(--fs-15); color: var(--form-text-2); }
  .apply-aside__badge {
    padding: var(--space-5) var(--space-12);
    border-radius: 999px;
    font-size: var(--fs-15);
    font-weight: 700;
    background: var(--c-main);
    color: var(--on-fill);
  }
  /* N-3a: フォーム画面の安心ブロックは枠が中立色で、丸印を持たない
     （確認画面側の H-8〜H-10 とは別物）。 */
  .apply-aside__assure {
    display: flex;
    flex-direction: column;
    gap: var(--space-10);
    padding: var(--space-20);
    border-radius: var(--radius-20);
    background: var(--c-tint);
    border: 1px solid var(--form-policy-rule);
    font-size: var(--fs-sm);
    line-height: 1.8;
    color: var(--form-text-2);
  }
  .apply-aside__assure-title { margin: 0; font-size: var(--fs-md); font-weight: 700; color: var(--c-deep); }

  /* N-2c/d/g・N-3b/c/d: 確認画面（STEP4）専用のサイドバー変種
     （_apply_aside_confirm.html、クラス .apply-aside--confirm）の上書き。
     フォーム画面版の既定値（24px・枠が中立色・見出し14px・丸印なし13px）
     はそのまま基準として残し、ここでは確認画面だけ違う値を足す。 */
  .apply-aside--confirm .apply-aside__course { font-size: var(--fs-26); }
  /* N-2g: 受講料行。左（見出し）は .apply-aside__key を使い回す
     （参加区分行の左と同じ見た目）。右は static/apply.js が
     .apply-tiers から読んだ文字列を書き込む（値を2箇所に持たない）。 */
  .apply-aside--confirm .apply-aside__fee { font-size: var(--fs-15); font-weight: 700; }
  /* N-3b: 枠がコース `assure-line` に変わる。他（地色・radius・padding・
     gap）は .apply-aside__assure の既定のまま——border-color だけ上書き。 */
  .apply-aside--confirm .apply-aside__assure { border-color: var(--c-assure-line); }
  /* N-3c: 見出し15px（フォーム画面は14px＝.apply-aside__assure-titleの既定）。 */
  .apply-aside--confirm .apply-aside__assure-title { font-size: var(--fs-15); }
  /* N-3d: 確認画面だけ丸枠つきの箇条書き（STEP4本文の .apply-assure ul/
     ul li::before と同じ技法・同じ寸法）。フォーム画面版は素の<span>行の
     ままなので、この ul/li セレクタは確認画面版にしか存在しない。 */
  .apply-aside--confirm .apply-aside__assure ul {
    margin: 0;
    padding-left: 0;
    list-style: none;
    display: flex;
    flex-direction: column;
    gap: var(--space-10);
    font-size: var(--fs-md);
  }
  .apply-aside--confirm .apply-aside__assure ul li {
    position: relative;
    /* 18px(丸) + 10px(間隔) = 28px */
    padding-left: var(--space-28);
  }
  .apply-aside--confirm .apply-aside__assure ul li::before {
    content: "";
    position: absolute;
    left: 0;
    top: 3px;
    width: 18px;
    height: 18px;
    border-radius: 50%;
    border: 2px solid var(--c-main);
  }
}

/* 参加区分バッジの出し分け（スティッキーバーと同じ仕掛け）。
   メディアクエリの外に置く——中に書くと、狭幅で display:none が効いている
   ときに「両方 none」ではなく規則そのものが無くなる。 */
.apply-aside__badge--review { display: none; }
#attendance-review:checked ~ .apply-aside .apply-aside__badge--regular { display: none; }
#attendance-review:checked ~ .apply-aside .apply-aside__badge--review { display: inline; }

/* ============================================================
   I: 申込完了（apply_done.html）
   ============================================================ */
.apply-done { display: flex; flex-direction: column; gap: var(--space-16); }
/* I-4: ✓ の丸。 */
.apply-done__mark {
  width: 56px;
  height: 56px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: var(--fs-26);
  background: var(--c-soft);
  color: var(--c-err-ink);
}
/* I-5: 完了の見出しは帯の下の h1。申込フォームの h1 と違い下線を持たない
   ——ここは「受け付けた」という結果そのもので、ページの見出しとして立たせる。 */
body.public.apply .apply-done h1 {
  margin: 0;
  border-bottom: 0;
  padding-bottom: 0;
  font-family: "Zen Maru Gothic", "Noto Sans JP", sans-serif;
  font-size: var(--fs-23);
  font-weight: 700;
  line-height: 1.5;
}
.apply-done__course { margin: 0; font-size: var(--fs-lg); font-weight: 700; }
.apply-done p { margin: 0; font-size: var(--fs-lg); line-height: 1.9; color: var(--form-text-2); }
/* I-8: 受付日時の枠。確定案の受付番号枠の意匠をそのまま使う。 */
.apply-done__receipt {
  display: flex;
  flex-direction: column;
  gap: var(--space-6);
  padding: var(--space-16);
  border-radius: var(--radius-14);
  background: var(--form-input-bg);
  border: 1px solid var(--form-policy-rule);
}
.apply-done__receipt-key { font-size: var(--fs-sm); font-weight: 700; color: var(--form-label); }
.apply-done__receipt-value {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: var(--fs-xl);
  font-weight: 400;
}

/* I-12〜I-15: このあとの流れ。 */
.apply-done-next { display: flex; flex-direction: column; gap: var(--space-12); }
/* 指摘I: <span> から <h2> に変えた。理由は .apply-aside__title と同じ
   （sitewide h2 の font-size 上書きに詳細度で勝つ）。 */
body.public.apply .apply-done-next__title { margin: 0; font-size: var(--fs-sm); font-weight: 700; color: var(--form-label); }
/* I-13: 既定の数字マーカー（decimal）を24×24pxの丸印に差し替える。
   list-style:none にして自前の counter で丸を描く——::marker は円の
   中に収められない（マーカーは行のテキストと同じボックスモデルに乗らない）。 */
.apply-done-next__steps {
  margin: 0;
  padding-left: 0;
  list-style: none;
  counter-reset: apply-done-step;
  display: flex;
  flex-direction: column;
  gap: var(--space-8);
  font-size: var(--fs-15);
  line-height: 1.8;
}
.apply-done-next__steps li {
  position: relative;
  /* 24px(丸) + 12px(間隔) = 36px */
  padding-left: var(--space-36);
}
.apply-done-next__steps li::before {
  counter-increment: apply-done-step;
  content: counter(apply-done-step);
  position: absolute;
  left: 0;
  top: 0;
  width: 24px;
  height: 24px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--c-soft);
  color: var(--c-step-done-ink);
  font-family: "Quicksand", "Noto Sans JP", sans-serif;
  font-weight: 600;
  font-size: var(--fs-sm);
}
.apply-done-next__note {
  display: flex;
  flex-direction: column;
  gap: var(--space-6);
  padding-top: var(--space-12);
  border-top: 1px solid var(--form-row-rule);
  font-size: var(--fs-md);
  line-height: 1.8;
  color: var(--form-text-2);
}
/* 指摘I: <span> から <h3> に変えた。以前は font-size を持たず親
   （.apply-done-next__note、14px）から継承していたが、h3 にすると
   sitewide の裸の h3 用ルール（06-settings-tabs.css。16px・margin 24/16px）に
   font-size/margin を奪われる。明示して継承時の見た目を保つ。 */
.apply-done-next__note-title { margin: 0; font-size: var(--fs-md); font-weight: 700; color: var(--form-text); }
/* I-15: 連絡先リンク。色・タップ高さ48pxは既存の
   :where(body.public.apply main) a / body.public main a に任せ、
   ここでは大きさだけ15pxに上げる。 */
.apply-done-next__contact { font-size: var(--fs-15); }
/* I-16: 他の開催日を見る（ピルの輪郭ボタン）。 */
.apply-done-back { margin: 0; }
body.public.apply .apply-done-back a {
  /* min-height は書かない。body.public main a が 48px を与えており、
     ここで独自に書くと公開レイヤーのタップ対象集合が増えて
     ui-reviewer.md の PUBLIC_TAP とずれる（main a で既に拾えている）。 */
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 999px;
  border: 1px solid var(--form-btn-rule);
  background: var(--surface);
  font-size: var(--fs-15);
  font-weight: 700;
  text-decoration: none;
}

/* --- N-5: 送信中の状態 --- */
body.public.apply .apply-nav__submit[data-apply-submitting] {
  background: var(--c-submitting);
  cursor: progress;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-12);
}
body.public.apply .apply-nav__back[disabled] {
  color: var(--form-text-off);
  cursor: not-allowed;
}
.apply-spinner {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  border: 2.5px solid var(--form-spinner-track);
  border-top-color: var(--on-fill);
  animation: apply-spin .8s linear infinite;
}
@keyframes apply-spin { to { transform: rotate(360deg); } }
.apply-submitting-notice {
  margin: var(--space-8) 0 0;
  font-size: var(--fs-md);
  color: var(--form-label);
}

/* F-4 / G-3: ステップの見出し。**カードで包まず**（包むと .regular-only
   が form の直接の子でなくなり、参加区分の CSS 切替が無音で死ぬ）、
   質問カードとは別に、ページの地の上に乗る素のセクション見出しとして
   扱う。

   2026-09-14 ユーザー指摘【重要】: 「参加区分と受講料」の質問カードと
   この見出しが同じ白い面（カード）に見えるのはおかしい——見出しは
   カードの外に出す。以前は margin-top・border-radius・白背景つきで
   「この見出しだけ浮いた角丸カードに見える」中途半端な状態だった。
   下の質問群が個別カード化された今は、この見出しは背景を持たない
   ただのラベルにして、カードの外（ページの地の色の上）に置く。 */
.apply-group-title {
  margin: var(--space-20) 0 var(--space-12);
  padding: 0;
}
/* 質問ごとに独立したカード（角丸・影・余白つき）にする。

   2026-09-14 ユーザー指摘【重要】: 「受講歴・ご経験」の見出しと
   「参加区分と受講料」が同じ1枚の面に見えるのはおかしい。また
   「救命講習の受講経験」「職業経験年数」等の質問が、囲む枠が無いまま
   地続きに並んでいたため、枠から半分はみ出しているように見えていた
   （以前の「ひと続きの面に見せる」設計そのものが指摘の対象だった）。
   質問ごとに .apply-section と同じ見た目（角丸20px・影・margin-bottom）
   の独立したカードにする。

   .apply-field-block はフィールド1つにつき1つのdivなので、それ自体を
   まるごと1枚のカードにする。.regular-only/.review-only は
   display: contents の透明ラッパー（参加区分のCSS切替が「formの直接の子」
   であることに依存するため、包む形にはできない）なので、その直接の子を
   :first-child/:last-childで判定し、複数の子（例: 受講料の見出し+リスト）
   をまとめて1枚のカードに見せる——子が1つだけの場合は同じ要素が
   first-childとlast-childの両方に当たり、四隅すべてが丸まる。
   border-radiusを分割した個別プロパティで書くのはこのため（一括の
   border-radiusだと後勝ちで上書きし合い、単独の子で四隅が半分ずつ
   消える）。

   指摘P0-1（在庫表との再照合、2026-09-05・実測）: 素のセレクタだと
   詳細度 (0,3,2) になり、.apply-review-badge（復習参加バッジ、(0,1,0)）・
   .review-only .notice（復習の受講料枠）・.policy-body（同意の全文枠）・
   .regular-only .notice（満席の告知）・.consent（同意チェック行）という
   「個々の部品」を上書きしてしまっていた——:where() に包んで詳細度を
   (0,0,0) にし、クラスを1つでも持つ部品側が必ず自然に勝つようにする。 */
:where(body.public.apply form > .apply-field-block) {
  background: var(--surface);
  padding: var(--space-20);
  border-radius: var(--radius-20);
  box-shadow: 0 1px 2px var(--form-shadow-card);
  margin: 0 0 var(--space-14);
}
:where(body.public.apply form > .regular-only > *),
:where(body.public.apply form > .review-only > *) {
  background: var(--surface);
  padding: var(--space-8) var(--space-20);
}
:where(body.public.apply form > .regular-only > *:first-child),
:where(body.public.apply form > .review-only > *:first-child) {
  border-top-left-radius: var(--radius-20);
  border-top-right-radius: var(--radius-20);
  padding-top: var(--space-20);
}
:where(body.public.apply form > .regular-only > *:last-child),
:where(body.public.apply form > .review-only > *:last-child) {
  border-bottom-left-radius: var(--radius-20);
  border-bottom-right-radius: var(--radius-20);
  padding-bottom: var(--space-20);
  box-shadow: 0 1px 2px var(--form-shadow-card);
  margin-bottom: var(--space-14);
}
/* E-20: 任意バッジ。必須（--c-soft / --c-deep）と対にする中立色。 */
.apply-opt {
  margin-left: var(--space-8);
  padding: var(--space-3) var(--space-8);
  border-radius: 999px;
  font-size: var(--fs-xs);
  font-weight: 400;
  background: var(--form-tag-bg);
  color: var(--form-text-2);
}
.apply-req { margin-left: var(--space-8); }

/* F-10 / F-11 / G-6: チェック印・ラジオ印。確定案は 22×22px。
   ネイティブのままだと約13pxで、指で押す的としても小さい。
   **appearance: none で自前描画にはしない** —— チェックマークを
   自前で描くと色を data URI に直書きすることになり、
   「:root の外に色を書かない」に触れる。大きさと accent-color で寄せる。 */
body.public.apply input[type="checkbox"],
body.public.apply input[type="radio"] {
  width: 22px;
  height: 22px;
  flex: none;
  margin: 0;
}
/* 2026-09-13 ユーザー指摘: チェックボックス/ラジオの動的設問は
   <fieldset><legend> を使うため、02-components.css の fieldset 既定
   （枠線・パディング・legendが上罫をまたぐネイティブ描画）がそのまま乗り、
   ラベルを枠の外に置く形の欄（.apply-field、テキスト/テキストエリア）と
   質問ごとに見た目が食い違っていた——罫線が見出し文字の途中を横切る
   （実機で再現確認済み）。参加区分タブ（.attendance-switch__nav）は
   既に独自の border: none を持つため対象から外す。

   2026-09-14 再指摘・実測で発覚（1回目）: 枠線と一緒に padding も 0 に
   したため、fieldset が `.regular-only`/`.review-only` の直接の子として
   受け取るはずの :where() 規則のpaddingを、この規則の実の詳細度
   （:where() の中身は0だが、こちらは0ではない）が丸ごと上書きしていた
   ——legendの文字が「受講動機」等の見出しより20px左に寄っていた
   （getBoundingClientRectで実測）。

   2026-09-14 再指摘（2回目）: 質問ごとに独立カード化した際、fieldset
   自身が :first-child/:last-child として角丸・影・上下パディングを
   :where() 規則から受け取る設計にしたため、ここで padding/margin/
   border-radius を固定値で指定するとまた同じ理由で上書きしてしまう。
   border: 0（legendが罫線をまたぐネイティブ描画の打ち消し）だけ残し、
   他はすべて :where() 側に委ねる。 */
body.public.apply fieldset:not(.attendance-switch__nav) {
  border: 0;
}
body.public.apply fieldset:not(.attendance-switch__nav) > legend {
  padding: 0;
  margin: 0 0 var(--space-8);
}
/* 選択肢の行（F-9）。
   2026-09-13 ユーザー指摘: チェック/ラジオが左端に寄りすぎて見える
   ——fieldsetの枠線を消した際にpaddingも0にしたため、申込フォームの
   テキスト入力欄（body.public.apply input, padding: 0 16px、上の方の規則）
   の文字開始位置より16px手前に来ていた。同じ16pxを左パディングとして
   持たせ、テキストの開始位置に揃える。legendには掛からない
   （fieldsetでなくlabelにだけ付ける）。 */
body.public.apply fieldset label {
  display: flex;
  align-items: center;
  gap: var(--space-12);
  padding-left: var(--space-16);
  border-bottom: 1px solid var(--form-row-rule);
}
body.public.apply fieldset label:last-of-type { border-bottom: 0; }
/* G-6: 同意行は文が折り返すので上揃え。 */
body.public.apply .consent {
  display: flex;
  align-items: flex-start;
  gap: var(--space-12);
  padding: var(--space-6) 0;
  line-height: 1.7;
}

/* G-4: 同意事項の全文枠。 */
body.public.apply .policy-body {
  max-height: 240px;
  padding: var(--space-16);
  border-radius: var(--radius-14);
  background: var(--form-input-bg);
  border: 1px solid var(--form-policy-rule);
  font-size: var(--fs-md);
  line-height: 1.95;
  color: var(--form-text-2);
}

/* G-5: 法令リンク2本。色・min-height は main a の既定
   （:where(body.public.apply main) a / body.public main a）に任せ、
   ここでは並べ方（gap）と文字サイズだけ足す。 */
body.public.apply .apply-legal-links {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-14);
  font-size: var(--fs-15);
}

/* A-2 / A-3 / N-1e: ロゴ帯。地を白にして帯と地続きに見せる。 */
body.public.apply .public-header {
  max-width: 640px;
  padding: var(--space-16) var(--space-20) var(--space-12);
  background: var(--surface);
  display: flex;
  align-items: center;
  justify-content: space-between;
}
body.public.apply .public-header img { width: 160px; }
/* この display:none は全ページ共通の既定（狭幅ではどのページでも
   注記を出さない）。**限定するのは下の @media 内の display:block 側だけ**
   ——そちらが「表示する規則」で、body.public.apply に限定していないと
   広幅の /courses/<code> や /legal/privacy にも効いてしまう（05・実測）。
   ここまで body.public.apply に限定すると、限定を外れた瞬間に
   .public-header__note が UA 既定の display（span は inline）に戻り、
   狭幅でも常時表示になってしまうため触らない。 */
.public-header__note { display: none; }

/* I-1 / I-3: 完了画面の寸法。 */
body.public.apply .apply-done { padding: var(--space-24) var(--space-20); }
body.public.apply.done .apply-band__name-latin { font-size: var(--fs-54); }
/* I-2: 完了画面だけ本文パディングが 18px 16px 22px（A-8 の16pxとも違う）。
   body.public.apply.done main は body.public.apply main より詳細度が高い
   （クラスが1つ多い）ので、順序に関わらず勝つ。 */
body.public.apply.done main { padding: var(--space-18) var(--space-16) var(--space-22); }

@media (min-width: 768px) {
  /* H-1 / C-2: 広幅の見出しは1段大きい。 */
  body.public.apply h2 { font-size: var(--fs-19); }
  body.public.apply .apply-confirm h2 { font-size: var(--fs-21); }
  body.public.apply .apply-confirm__head h3 { font-size: var(--fs-xl); }
  /* H-2: 広幅は16px/1.9、文言も「右下のボタン」に替える。 */
  .apply-confirm__lead { font-size: var(--fs-lg); line-height: 1.9; }
  .apply-confirm__lead-narrow { display: none; }
  .apply-confirm__lead-wide { display: inline; }
  /* H-12: 確認画面（STEP4）の「戻る」だけ広幅で padding が 0 24px。
     .apply-nav__back は STEP2〜4 で共有する同じ要素なので、新しい状態
     フラグを JS に足す代わりに、確認パネル（[data-apply-confirm]、
     JSが hidden を外す）が form の直接の子として手前にある事実を
     一般兄弟結合子で使う——#attendance-review:checked ~ .review-only
     と同じ考え方（JS を増やさずCSSだけで閉じる）。 */
  [data-apply-confirm]:not([hidden]) ~ .apply-nav .apply-nav__back {
    padding: 0 var(--space-24);
  }
  /* H-6: 広幅はキー幅と間隔が広い。
     指摘2【高】: 固定200pxのままだと、右サイドバー（.apply-aside）に本文を
     取られる768〜938pxで値の列が168px（375px幅の193pxより狭い）になり、
     42文字の住所のような長い値が、position: sticky で不透明な右サイドバー
     （DOM上あとにあるため上に描かれる）の裏に隠れる（実測、横スクロールは
     出ない）。938pxにも区切りを足さず、clamp() でキー列を本文カラム幅の
     割合として連続的に変える——本文カラムが狭いあいだはキーを縮めて
     値に幅を返し、本文カラムが広がる（≒938px以上）につれて確定案の
     200pxへ戻る。 */
  .apply-confirm__rows { grid-template-columns: clamp(96px, 36%, 200px) minmax(0, 1fr); column-gap: var(--space-20); }
  .apply-confirm__rows dt { font-size: var(--fs-md); }
  .apply-confirm__rows dd { line-height: 1.8; }
  /* A-2 / N-1e: 広幅のロゴ帯。
     P1-2: max-width はここで 1180px に上書きする。上の N ブロックに
     書くと、この下の行にある同詳細度 (0,2,1) の 640px 指定（A-2/A-3/N-1e、
     常時適用）より前に来てソース順で負ける——ここ（それより後ろ）に
     書けば、詳細度が同じでもソース順で勝つ。ヘッダー帯（.apply-band）
     の 1180px と揃え、広幅で左端・幅が一致するようにする。 */
  body.public.apply .public-header { max-width: 1180px; padding: var(--space-16) var(--space-28) var(--space-12); }
  body.public.apply .public-header img { width: 200px; }
  body.public.apply .public-header__note {
    display: block;
    font-family: "Zen Maru Gothic", "Noto Sans JP", sans-serif;
    font-size: var(--fs-md);
    color: var(--form-label);
  }
  /* E-9 / E-14: 広幅ではセグメントと復習バッジを広げすぎない。 */
  .attendance-switch__nav,
  body.public.apply .review-only .notice { max-width: 420px; }
  /* A-9 / N-1f: フッターは広幅で14px・gap20pxへ。.public-footer は
     公開の全ページ共通の部品なので、申込フォーム（このブロックの対象）
     だけに絞る——一覧など他の公開ページの広幅フッターは今回の在庫表の
     対象外で、無条件に変えると影響範囲が広がりすぎる。
     色は var(--form-link-quiet) にしない——test_style_guard.py の
     test_public_footer_のリンク色はink_2のまま揃えない /
     test_public_footerのリンクは下線を持つ が「.public-footer a は
     var(--ink-2) のまま（Phase 8 設計 §9-3の裁定）」を固定している。
     ここを --form-link-quiet に変えると両方のガードテストが落ちる
     （実測）ため、色はそのまま --ink-2 に据え置き、サイズと間隔だけ直す。 */
  body.public.apply .public-footer { font-size: var(--fs-md); gap: var(--space-20); }
}

/* E-14: 復習参加として申し込み中。 */
.apply-review-badge {
  margin: 0 0 var(--space-12);
  padding: var(--space-14) var(--space-16);
  border-radius: var(--radius-16);
  background: var(--c-main);
  color: var(--on-fill);
  font-size: var(--fs-lg);
  font-weight: 700;
}
/* G-7: 同意の説明。 */
.apply-consent-note {
  margin: var(--space-8) 0 0;
  padding: 0 var(--space-20) var(--space-20);
  background: var(--surface);
  border-radius: 0 0 var(--radius-20) var(--radius-20);
  font-size: var(--fs-md);
  line-height: 1.7;
  color: var(--form-label);
}
/* 2026-09-09 owner裁定B: NCLSの復習参加で「受講歴のあるコース」に
   ACLSを選ぶと、下の月欄のラベルをACLS向けの文言に差し替える。両方とも
   描いておいてCSSで片方を隠す方式（templates/_apply_sticky.html:9・
   .apply-sticky__badge--regular/--review と同じ考え方）。JSは使わない
   ——常に選択と一致したラベルのまま。
   ラジオはlegendを持たせるため<fieldset id="field-review_course">の中に
   あり、一般兄弟結合子(~)だけではfieldsetの外の.review-taken-on-labelに
   届かない。ここだけローカルな:has()で越える——body:has()のような大域の
   :has()はtemplates/apply.htmlの参加区分の切替では避けている
   （fieldsetの外まで一般兄弟結合子で届かせる必要があるため）が、これは
   #field-review_course 1個に閉じた小さな:has()で、02-components.cssの
   tbody tr:has(:focus-visible)と同じ規模感なので使う。 */
.review-taken-on-label__acls { display: none; }
#field-review_course:has(input[name="review_course"][value="ACLS"]:checked)
  ~ .review-taken-on-label .review-taken-on-label__acls { display: inline; }
#field-review_course:has(input[name="review_course"][value="ACLS"]:checked)
  ~ .review-taken-on-label .review-taken-on-label__ncls { display: none; }
