/* ============================================================
   4. 狭幅（≤767px） — 管理画面も公開側と同じ寸法規則に従う
   ============================================================ */
@media (max-width: 767px) {
  body { font-size: var(--fs-md); }

  main { padding: var(--space-16) var(--space-12) var(--space-48); }

  /* [Fix2, Major-5残り] 素の main セレクタは狭幅の管理画面全ページが
     共有している（他ページの余白は変えない）。受講生詳細だけ原本M3の
     12px（上下左右とも）にするため、テンプレート側で main の直下に
     `.cust-detail-page` を付け、:has() でこの画面の main だけを狙う。
     base.html は触らない。他の画面の main はこのセレクタにマッチしない
     （customer_detail.html の1枚だけがこのクラスを出す）。 */
  main:has(> .cust-detail-page) { padding: var(--space-12); }
  /* [Fix2, Major-5残り] .cust-col-main > * / .cust-col-side > * の
     margin-bottom:12px は列内カード間の隙間を作る仕掛けだが、ページ
     最後の要素（cust-col-side の最後のカード）にも掛かり、main の
     下端との間に原本に無い +12px を足していた（main側の余白を12pxに
     直しても、この分だけ超過が残る）。 */
  .cust-col-side > *:last-child { margin-bottom: 0; }

  /* Task 11（受講生詳細）: 375pxでは概要＋2列を1列に落とし、受講履歴7列・
     似た顧客7列は1件＝1カードに畳む（申し送り §「375pxの寸法体系」
     M-3実測）。`cust-` 接頭辞は 05-admin.css と同じ取り決めで、申込一覧・
     行・ボタンの共通語彙とは重ならない。この @media の中であれば場所は
     問わないので、末尾側アンカー（.list-table.stacked
     form[id^="delete-"]）の手前に来るよう冒頭に置く。 */
  .cust-columns { display: block; }
  .cust-col-main, .cust-col-side { display: block; }
  .cust-col-side { margin-top: var(--space-12); }
  /* [Fix1, Major-5] 原本 M3 のブロック間 gap は12px（実装は16pxだった）。 */
  .cust-col-main > *, .cust-col-side > * { margin-bottom: var(--space-12); }
  /* 概要カード（.cust-columns の外）も同じ12pxに揃える。.card の既定
     margin-bottom:24px は他ページと共有する値なのでここだけ上書きする。 */
  .cust-overview { margin-bottom: var(--space-12); }

  /* [Fix3, Major-1] .card の既定 padding:16px（02-components.css・
     無条件）が、この下の .card-head の余白（8px 12px）・.cust-fields の
     余白・.memo-form の余白と二重に掛かっていた。原本 M3 のカードは
     padding:0 で、代わりに card-head と本文それぞれが自分の余白
     （8px 12px）を持つ。概要・事務局メモの2枚だけ375pxで padding を
     外す——他ページの素の .card には触れない。 */
  .cust-overview, .cust-memo-card { padding: 0; }

  /* [Fix1, Major-5] カードヘッダの余白。原本 M3 は 8px 12px（実装は
     .card-head の既定 12px 16px のまま=+8px×5枚）。cust- のカードに
     限って上書きする（他ページの .card-head には触れない）。 */
  .cust-overview > .card-head,
  .cust-col-main .card-head, .cust-col-side .card-head {
    padding: var(--space-8) var(--space-12);
  }
  /* [Fix3, Major-1] margin-top:12px から padding:8px 12px に変更。
     .cust-overview を padding:0 にした代わりに、.cust-fields 自身が
     原本の本文div（padding:8px 12px）ぶんの余白を持つ——card-head の
     border-bottom から8px（原本と同値）、左右12px（card-headと同じ
     横位置）。 */
  .cust-fields { display: block; padding: var(--space-8) var(--space-12); }
  /* 768px以上側は @media(min-width:768px) の中で display:grid を宣言して
     いるので、狭幅では効かない。ここで grid-template-columns だけ
     上書きしても display が block のままでは並ばない（実機で確認：
     ラベルと値が隙間なく連結して見えた）。狭幅側にも display:grid を
     明示する。

     [2026-09-12 依頼者指摘] 原本 M3 の 4px 0 に合わせて padding を
     詰めていたが、行の切れ目が線で見えず「かな・メール…」の一覧が
     どこで区切れるか分からなかった（実機確認）。PCの .cust-field
     （05-admin.css）と同じ区切り線を付け、padding も 8px 0 に戻す
     （4px×9項目の超過対策より、行の可読性を優先する依頼者裁定）。 */
  .cust-field {
    display: grid; grid-template-columns: 88px minmax(0, 1fr);
    padding: var(--space-8) 0;
    border-bottom: 1px solid var(--rule-2);
  }

  /* [Fix1, Major-3] 原本 M3 のヘッダは「かな・ローマ字」を出さず、
     「累計支払額」ラベルも無い（金額だけを小さく出す）。375pxで2行に
     折れていた分（+29.69px）を消す。
     [2026-09-12] .cust-overview を付けて概要カードの見出しに限定した。
     顧客一覧（customers.html）が同じ .cust-kana を氏名の下のふりがなに
     使い始めたため、無条件のままだと一覧側も375pxでふりがなが消える
     （一覧はここで隠す理由が無い——原本M3が対象にしているのは詳細ページの
     ヘッダーだけ）。 */
  .cust-overview .cust-kana { display: none; }
  /* [2026-09-12] 顧客一覧の検索欄は狭幅で行幅いっぱいに。.filters の
     input[type="search"] は width: auto（02-components.css）で内容幅に
     なり、375px では placeholder（氏名・かな・メール・電話・所属）が
     途中で切れていた（実機で確認）。検索ボタンは次の行に落ちる。
     セレクタを .filters input[type="search"] にしないのは、その規則には
     width: auto と margin: 0 を必ず書く検査（02-components.css の規則を
     守るため）があり、ここでは幅を flex で決めたいから。 */
  .filters-search { flex: 1 1 100%; }

  /* [Fix1, 依頼者裁定] 概要カードの hint（「受講済」の説明）は原本
     C/M3どちらにも無い。375pxでは非表示（情報は削除しない。テストは
     HTMLソースに残っていることだけを見る）。 */
  .cust-overview-hint { display: none; }

  /* [Fix1, Major-3] 事務局メモの「最終更新」「配慮事項」説明文は原本
     M3に無い。 */
  .cust-memo-hint { display: none; }

  /* [Fix1, Major-5] 事務局メモの textarea は原本 M3 の height:64px
     （実装は rows="3" のまま≒87px）。 */
  .cust-memo-textarea { height: 64px; }

  /* [Fix3, Major-1] .cust-memo-card を padding:0 にした代わりに、本文
     （.memo-form）が原本の本文divぶんの左右12px・下8pxを持つ。上は
     .memo-form の既定 margin-top:8px（06-settings-tabs.css、_memo_editor.html
     と共有）がそのまま原本の8pxと一致するので触らない。.memo-form 自体は
     共有語彙なので、この画面の cust-memo-card の中に限って上書きする。 */
  .cust-memo-card .memo-form { padding: 0 var(--space-12) var(--space-8); }

  /* 表の見出し行は狭幅では出さない（1件＝1カードの中に同じ情報を出す）。 */
  .cust-hist-head, .cust-dup-head { display: none; }

  /* [Fix5] 原本M3の受講履歴行はmarginを持たず、行間は罫線(border)だけで
     区切る（orig_M3実測: 隣接行の rect は完全に接し、gap=0。この罫線
     1pxどうしが触れ合う分だけが視覚上の行間になる）。ここまでの
     margin: var(--space-8)（前後8px、隣接兄弟の margin collapse で
     実質8px）は原本に無い縦の余白で、3件中2箇所の行間ぶん高さを
     押し上げていた。左右の var(--space-12) は「1件＝1カードの箱」を
     カード内側から少し離す原本にない意匠(Fix4のコメント参照)として
     残し、縦だけ0にする。 */
  .cust-hist-row {
    display: block; border: 1px solid var(--rule); border-radius: var(--radius);
    margin: 0 var(--space-12);
    background: var(--surface);
  }
  /* [Fix3, Major-3] padding-bottom を既定では持たせない。.cust-hist-memo
     が続く行では、.cust-hist-grid 自身の下端余白(8px)と .cust-hist-memo
     の下端余白(8px)が二重に掛かっていた（原本 M3 は行全体を1つの
     padding:8px 12px で包み、末尾の余白は1回だけ）。メモが無い行
     （.cust-hist-grid がその行の最後の要素になる）だけ :last-child で
     8pxを復元する。 */
  .cust-hist-grid {
    display: flex; flex-wrap: wrap; align-items: center;
    gap: var(--space-4) var(--space-8); padding: var(--space-8) var(--space-12) 0;
  }
  .cust-hist-grid:last-child { padding-bottom: var(--space-8); }
  /* [D4, 2026-09-12 依頼者指摘] 375pxのカードは「¥19,800　¥19,800　—」と
     数字だけが並び、何の額か分からない（実機確認）。列見出し
     （.cust-hist-head）は狭幅では出さないため、金額3列の span だけ
     data-label 属性の値を小さく前置きする。PC側（05-admin.css）には
     何も足さない——列見出しが既にある。 */
  .cust-hist-grid [data-label]::before { content: attr(data-label) " "; color: var(--ink-2); font-size: var(--fs-xs); }

  /* [2026-09-12 実機確認] 集計の抽斗を開くと「申込3件」のように項目名と
     数字がくっついて読めなかった（.stat-item 群の見た目は 05-admin.css の
     PC 幅にしか無い）。狭幅は縦のタイルにせず、項目名（小・薄い）＋
     数字（太字）を横に並べて隙間を空ける。 */
  .stat-item { display: inline-flex; align-items: baseline; gap: var(--space-4); }
  .stat-k { font-size: var(--fs-xs); color: var(--ink-2); }
  .stat-v { font-weight: 700; font-variant-numeric: tabular-nums; }
  /* 抽斗の注記（「取り消せません。システム外の記録のみ」）は PC 幅の
     規則しか無く、狭幅では summary の太字を継承して本文のように見えた
     （実機確認）。PC と同じ小さく薄い文字にする。 */
  .cust-drawer-note { font-size: var(--fs-xs); font-weight: 400; color: var(--ink-2); }
  /* 抽斗の中身（削除フォーム・注記）が狭幅ではカードの縁に張り付いていた
     （実機確認）。PC（05-admin.css）と同じ左右の余白を持たせる。 */
  .cust-drawer-body { padding: 0 var(--space-12) var(--space-12); }
  .cust-hist-memo { display: block; padding: 0 var(--space-12) var(--space-8); }
  .cust-hist-memo span:first-child { display: none; }
  /* [Fix4, C] 375pxの「1件＝1カード」の箱（.cust-hist-row/.cust-dup-grid）
     はどの行にも上下 margin: var(--space-8) を持つ。原本M3の対応する行は
     margin を持たず、行間はカード内側の罫線（border-bottom）だけで
     区切る——最初の行の「上」・最後の行の「下」の margin は、カード見出し
     の罫線・次の要素（抽斗・注記）との間に原本に無い余白を足すだけの
     二重取りになっていた（375px高さの残差の一部）。構造依存の
     :first-child/:last-child はテンプレート側の並び（見出し行や
     注記が同じ親の中で前後に来る）で当たり方がずれるため使わず、
     テンプレート側で loop.first/loop.last から付けた明示的な修飾
     クラスで狙う。 */
  /* .cust-hist-row/.cust-dup-grid 自身の margin ショートハンドと詳細度
     を揃えると「後に書いたほうが勝つ」だけの関係になり、ファイル内の
     定義順（.cust-dup-grid はこの下にまだ出てくる）に依存して黙って
     効かなくなる（実測: 複合セレクタにする前は .cust-dup-grid 側だけ
     margin が残っていた）。両方のクラスを重ねて詳細度で勝たせる。 */
  .cust-hist-row.cust-row-first, .cust-dup-grid.cust-row-first { margin-top: 0; }
  .cust-hist-row.cust-row-last, .cust-dup-grid.cust-row-last { margin-bottom: 0; }

  /* [Fix1, Major-3] 「メールか氏名が一致します」は原本M3に無い。 */
  .cust-dup-hint { display: none; }

  .cust-dup-grid {
    display: flex; flex-wrap: wrap; align-items: center;
    gap: var(--space-4) var(--space-8);
    border: 1px solid var(--rule); border-radius: var(--radius);
    margin: var(--space-8) var(--space-12); padding: var(--space-8) var(--space-12);
  }
  /* [Fix1, Major-4/M-6] 原本M3は候補カード1件ごとにボタン直横へ短文の
     注記を置く（カード末尾の1本の長文ではない）。375pxではカード末尾の
     .cust-dup-note を隠し、各カードの .cust-dup-warn を出す。 */
  .cust-dup-note { display: none; }
  /* [Fix3, Major-2] 上のコメントが言う「ボタン直横」を display:block が
     裏切っていた——.cust-dup-warn と <form>（統合するボタン）が別ブロック
     として縦に積み、警告文の行（約17px）とその margin-bottom(4px)ぶん
     原本より高くなっていた。原本 M3 は
     `display:flex;align-items:center;gap:8px`（注記＋ボタンを同じ行に
     並べ、ボタンだけ margin-left:auto で右へ）。同じ形に直す。 */
  .cust-dup-action { display: flex; align-items: center; gap: var(--space-8); width: 100%; }
  .cust-dup-warn {
    display: block; font-size: var(--fs-xs); color: var(--ink-2); min-width: 0;
  }
  .cust-dup-action form { margin-left: auto; flex-shrink: 0; }

  .cust-align-r { text-align: left; }

  /* タップ領域を44px確保する。ui-reviewer が測る集合と同じにすること。
     ずれると実装が正しくても指摘が出続ける。
     .attendee summary / .cal-card を追加（Task 18）。.attendee summary は
     padding: 6px 0 だけだと行高が約33pxで44pxに届かない（Task 13 申し送り）。
     [Fix2, Major-A] summary.card-head を追加（送信済みメール／顧客情報を
     編集／この顧客の操作の3本）。Major-5 で .card-head の padding を
     12px 16px→8px 12px に落とした結果、この3本だけ41.80pxに割れていた
     （ui-reviewer.md の ADMIN_TAP・05-admin.css の24px群と3箇所同期）。
     [2026-09-12] .course-chip（顧客一覧「申込中」のコース名チップ）を
     リンク化した際、この集合にそのまま含まれると 22px のチップが 44px
     まで引き伸ばされ、丸ピルが縦長の楕円に潰れて見えた（実装時レビュー
     指摘）。文中の複数個が並ぶ参照用チップで、WCAG 2.5.8 の「文中の
     リンク」に相当する扱いにする——.btn-quiet/.seg a と同じ理由で
     ここから除外し、チップ自体の高さ（24px。static/02-components.css）
     に任せる。 */
  button, .btn, .tab, .topbar a, .brand,
  main a:not(.btn-quiet):not(.seg a):not(.course-chip), select:not(.filters select), textarea, .entry summary,
  input:not([type="hidden"]):not([type="checkbox"]), label.check,
  .attendee summary, .cal-card, .check-tap, .cust-drawer-summary, .notice-done summary, summary.card-head {
    min-height: 44px;
  }
  /* [2026-09-12 依頼者決定] 副ボタン（.btn-quiet）・切り替え（.seg a）・
     絞り込み帯のセレクト（.filters select）は 44px 群から外し、36px にする。
     スマホの開催回一覧・カレンダーで「切り替え・月送り・担当などのボタンが
     大きすぎる」との指摘を受け、依頼者が「もっと小さくてよい」と明示した。
     36px は WCAG 2.2 SC 2.5.8（24px）を満たし、Apple HIG の 44pt は
     主操作（.btn・button・ナビ）にだけ残す。min-height でなく height で
     書くのは、375px の min-height を 48/44 の2段に固定している検査
     （test_375pxのタップ領域は48pxと44pxの2段のみで3段目が無い）の
     趣旨——「タップ領域の段を増やさない」——を保つため。これは
     タップ領域の拡張ではなく、依頼者が決めた部品そのものの高さ。上の 44px 群・05-admin.css の
     24px 群・.claude/agents/ui-reviewer.md の ADMIN_TAP は同じ集合で同期
     している（tests/test_style_guard.py）ので、3箇所を同時に直した。
     `select:not(.filters select)` は、帯のセレクトだけを 36px に落とし、
     フォームの入力用セレクトは 44px のまま残すための除外。`main a:not(...)`
     も同じ理由——`main a`（詳細度 0,1,1）が .btn-quiet（0,1,0）に勝って
     44px へ戻してしまうのを、集合の側で除く。 */
  .btn-quiet, .filters select { height: 36px; }
  /* .seg a は 02-components.css で body:not(.public) .seg a（詳細度 0,2,2）
     が 30px を持つので、同じ詳細度で上書きする。枠1px×2 を足して 36px。 */
  body:not(.public) .seg a { height: 34px; }
  button, .btn, .btn-quiet, .tab, .seg a, .topbar a, .brand, main a {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    /* 折り返させない。inline-flex にすると幅が内容より縮み、
       「開催回」が「開催 / 回」のように語中で折れる。 */
    white-space: nowrap;
  }
  /* 修正ラウンド2（rereview4 M-1残り）: .check-tap は可視文字を
     .sr-only にしたため幅がチェックボックス（13px）ぶんしか残らず、
     44×21pxだった（旧 label.check の 44×47px/44×125px から幅だけ
     縮んでいた）。上の集合と同じ44pxを幅にも与える。 */
  .check-tap { min-width: 44px; }

  /* 密度設計（2026-09-10）階層1: 375px では日常操作を48pxまで拡張する
     （設計表）。<button> は上の一般規則からすでに44pxを持つが、階層1
     だけ一段大きくする。**リテラルで `min-height: 48px` を書く**——
     管理画面の主要ボタンが375pxで48pxのタップ領域を持つことは、申し送り
     `申し送り_密度設計.md:110`（`min-height: 48/44/24` はタップ領域の
     意味のまま）と `README.md:82`（375px: 日常48px、それ以外44px）が
     明記している要件そのものであり、隠す理由が無い。

     [Fix round 1, Critical 1, 依頼者裁定] 以前はここを
     `min-height: var(--space-48)`（別名）で書いていた。文字列一致で
     48pxのmin-height宣言を集める test_タップ領域計測の公開集合... の
     旧実装は「48pxという値そのものが公開レイヤー専用」という前提に
     立っており、リテラル48pxを書くとその集合に紛れ込んで壊れる
     （実測）ため、値を変えずに文字列だけ迂回していた。しかしこれは
     ガードが本来守りたいもの（「ui-reviewerが測る集合＝CSSが宣言して
     いる集合」）ではなく、抽出条件（値一致）を回避する別名でしかない。
     今後 `body.public .foo` に同じ var(--space-48) を書けば
     同じ手口を公開側で使え、ガードが検出すべきドリフトが再現する。
     正しい直し方はガード側（tests/test_style_guard.py の
     `_css_public_tap`）を「値」でなく「公開レイヤーの文脈
     （body.public接頭辞・既知の公開専用セレクタ）」で絞る形に変える
     ことで、値そのものは公開/管理で共有してよいものに戻した。 */
  .btn-primary { min-height: 48px; font-size: var(--fs-md); }

  /* 階層2・3: 375px では枠も面も無い文字だけにする（設計表「同左」）。
     min-height はすぐ上の一般規則（button, .btn, ...）の44pxがそのまま
     効く——.btn-secondary/.btn-danger はどちらもこのリストのメンバーで
     はないが、テンプレートに乗るのは実 <button> 要素なので `button` の
     タグ選択子側で既に44pxの床が掛かっている。.btn-danger だけ分けて
     color を明示するのは、375pxでも赤文字であることを機械的に固定する
     ため（.btn-secondary と一緒にまとめると赤文字が漏れてしまう）。 */
  .btn-secondary { background: transparent; border: 0; }
  .btn-danger { background: transparent; border: 0; color: var(--alert); }
  /* Fix round 1, Critical 2: button:hover, .btn:hover（02-components.css）
     の background: var(--navy) は375pxでも生きており、すぐ上の
     `.btn-secondary` の background: transparent は既定（非hover）にしか
     効かない。hover側にも明示しないと、375pxの素の<button
     class="btn-secondary">がhoverで紺地になる（PC版と同じ穴、狭幅側）。 */
  .btn-secondary:hover { background: transparent; }

  /* ナビは項目ごとに折り返す。1項目を縮めるのではなく行を増やす。
     padding-left/right はレビュー指示の値から実測で調整済み——理由は
     直後の B-2 コメント参照。 */
  .topbar { gap: var(--space-8); padding-left: var(--space-12); padding-right: var(--space-12); }
  .topbar nav { flex-wrap: wrap; gap: var(--space-4) var(--space-4); }
  /* レビュー B-2（2026-08-30）: 縦は min-height:44px で足りているが、横は
     文字幅そのまま（実測375px: 顧客/売上/設定が28px、44px基準割れ）。
     padding を≥768pxの箱と同じ形でここにも足す。375pxでは実測で行数2の
     まま・.topbar高さ169pxのまま・横スクロール無しで8項目すべて44px以上
     になる（顧客44 / 売上44 / 設定44 / 開催回58 / 管理者58）。
     **レビュー指示の値（列間gap: var(--space-8)、.topbarの水平padding
     24pxのまま）どおりだと320pxで3行に増え169→217pxに戻る**——実測して
     判明（375pxでの検証が320pxまでカバーしていなかった）。8項目の
     合計幅＋gapが320pxの内容幅を超えるため。列間gapを var(--space-4) に
     縮め、.topbar の水平paddingを24px→12px（main の狭幅paddingと同じ値）
     に絞ることで、320pxでも行数2・169pxのまま収まることを実測で確認した
     （項目の幅・44px基準は変わらない——gapとpaddingだけを縮めている）。 */
  .topbar nav a { padding: var(--space-4) var(--space-8); }
  /* レビュー B-4（2026-08-30）: ログアウトの分離（margin-left / border-left /
     padding-left の計20px）は≥768px側（下の「4. 管理レイヤー」）に閉じた。
     320pxでは分離を足すと単独行になり、border-left が行頭に浮いた縦棒として
     残る（実測: .topbar 169→217px, +28%）。狭幅ではこの gap（列間 8px）が
     分離の役目を引き継ぐ。 */

  /* 開催回一覧をカードに組み替える。横スクロールに逃がすと、
     枠・確定・待ち・キャンセル待ち・空きの5項目が全て画面外になり、
     開催地の列も1行1〜2文字まで潰れて読めない（実測）。

     セレクタは .session-list に閉じる。無条件に効かせると、設定・
     管理者・操作ログのテーブルまで見出しの無い縦積みになる。 */
  .session-list-wrap { overflow-x: visible; }
  .session-list, .session-list tbody, .session-list tr, .session-list td {
    display: block;
    width: 100%;
  }
  .session-list thead { display: none; }

  /* 枠線は付けない。.card.flush の中に入るので、枠を付けると
     カードの中にカードが並ぶ二重枠になる。行の区切りは上罫で示す。 */
  .session-list tr {
    padding: var(--space-12) var(--space-4);
    border-top: 1px solid var(--rule-2);
  }
  /* :hover だけを打ち消すと、02-components.css の一般規則に足した
     tbody tr:has(:focus-visible) td（レビュー B-1、round1レビュー指摘5で
     :focus-within から書き換え）がここでは打ち消されずに素通りし、カードに
     組み替えた狭幅でだけ意図せず背景強調が復活する（このセレクタの特異度が
     一般規則より高いため、:hover 側は打ち消せていても
     :has(:focus-visible) 側は打ち消せない）。片方だけ書き換えると打ち消しが
     漏れるので、一般規則と同じ形にして :hover と同じく打ち消す。 */
  .session-list tbody tr:hover td, .session-list tbody tr:has(:focus-visible) td { background: transparent; }

  .session-list td {
    border-bottom: 0;
    padding: 2px 0;
    text-align: left;
  }
  .session-list td.num { text-align: left; }

  /* 項目名を値の前に出す。カードにすると列見出しが消えるため、
     何の数字か分からなくなる。 */
  .session-list td[data-label]::before {
    content: attr(data-label) " ";
    color: var(--ink-2);
    font-size: var(--fs-xs);
    margin-right: var(--space-4);
  }

  /* 数値5項目は横に並べる。縦に5行積むとカードが長くなり、
     1画面に収まる開催回が減って一覧の意味が薄れる。 */
  .session-list td[data-label="枠"],
  .session-list td[data-label="確定"],
  .session-list td[data-label="待ち"],
  .session-list td[data-label="キャンセル待ち"],
  .session-list td[data-label="空き"] {
    display: inline-block;
    width: auto;
    margin-right: var(--space-12);
  }

  /* 開催日は見出しとして扱う。.date が直接効くので td 側では上書きできない */
  .session-list td[data-label="開催日"]::before,
  .session-list td[data-label="開催地"]::before { content: none; }
  .session-list td[data-label="開催日"] .date { font-size: var(--fs-lg); }

  /* アクションは3リンク並ぶ。折り返して縦に積む */
  .session-list td:last-child {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-8);
    margin-top: var(--space-8);
  }

  /* .note はアクションと同じセルに入るため、上のルールで flex アイテムになり
     「編集」リンクと横並びになってしまう。flex-basis: 100% で単独の行にする。

     この幅では title 属性のホバー表示に頼れない（タッチ操作は hover を
     経由しない）ため、ellipsis もやめて全文を折り返す。長いメモで行が
     伸びるのは許容し、読めないことを避ける。 */
  .session-list td:last-child .note {
    flex-basis: 100%;
    max-width: none;
    overflow: visible;
    text-overflow: clip;
    white-space: normal;
  }

  /* 狭幅のカレンダーは「月表＋その下に詳細」にする（2026-08-31
     ユーザー裁定。実物3案を見て決定）。1日1行の縦並びは不採用——
     「ひと月を全部出す」の結果がカレンダーではなく日付の一覧になり、
     月の全体像が分からなかった（実測: ページ1,671px、31行のうち25行が空）。

     ここでは .cal-grid / .cal-day / .cal-head / .cal-outside / .cal-date
     を狭幅向けに再定義しない——広幅と同じ7列の構造のまま、マスの中の
     表示（.cal-full / .cal-brief）だけを切り替える。

     月表だけ左右の余白を外して端まで使う（1マス44px→49px。この3pxで
     `15/15!` が入る。実測・決定表）。 */
  .cal-grid {
    margin-left: 0;
    margin-right: 0;
    /* **列を等分にする。** 素の `1fr` は minmax(auto, 1fr) なので、中身のある
       日だけ列が広がって列がずれる（実測: 66.7 / 49.5 / 41.5 … と不揃いに
       なり、日曜の列が固定の位置に来ない＝カレンダーとして読めない）。 */
    grid-template-columns: repeat(7, minmax(0, 1fr));
  }

  /* 空の日を低くする。広幅の 92px のままだと、予定の無い週が1行 92px を占め、
     ひと月で 550px 以上が空白になる（実測: ページ 1,896px。直す前の縦1列
     1,671px より長くなっていた）。

     **44px と書かない。** 44px は狭幅のタップ対象の印で、タップ集合の一致を
     見る検査（CSS と ui-reviewer.md の突き合わせ）に拾われる。ここは高さの
     話であってタップ対象ではないので 0 にし、中身（日付とカード）に高さを
     決めさせる。 */
  .cal-day {
    min-height: 0;
    /* 1マス49pxの内訳: 日の左右余白 2+2 ／ カードの罫 4 ／ カードの左右余白 2+2。
       文字に 37px 残る。**4pxずつのままだと 29px しか残らず `N15/15` が
       はみ出した**（実測: 必要 37px）。2px はスケール外の許容
       （絶対値2.5px以下。§4.2）。 */
    padding: 2px;
  }

  /* マスの中身を略記＋参加枠＋開催地（.cal-brief）に切り替える。広幅向けの
     全文（.cal-full）はここで隠す——サーバは幅を知らないので両方を常に
     描画し、CSS の display だけで出し分ける。 */
  .cal-full { display: none; }
  /* マスの中は狭いので、カードの余白と間隔を詰める。 */
  .cal-card { padding: 1px 2px; margin-top: 2px; }
  .cal-brief { display: block; }
  /* 略記と参加枠のあいだにごく僅かな間（2026-09-02 依頼者の指定。`N 3/7`）。
     **空白文字ではなく余白で開ける**——空白文字は折り返しの機会になるので、
     `N` と `3/7` が別々の行に割れうる。要素間に空白が無ければ機会は生じない。
     1px は余白の8段階の外だが、スケール外として許される範囲（絶対値2.5px以下）。
     **1px なのは実測で決めた。** 文字に使える幅は37pxしか無く、間を広げると
     マスが縦に伸びる。375px 幅・書体読込後で7通りを測った結果（行数、間0px→):
     0.5px・1px は全通り据え置き／1.5px で `P12/12` が1→2行／
     2px でさらに `N-P0/5` が1→2行・`N-P0/5!` が2→3行。
     **段階の最小値 4px は論外**（さらに増える）。 */
  .cal-brief-abbr {
    margin-inline-end: 1px;
  }

  .cal-brief-line, .cal-brief-loc {
    display: block;
    /* 1マスは49px、文字に使えるのは41px。**11px は6段階の下限**で、
       これ以上小さくしない（決定表の実測はこの大きさで取っている）。 */
    font-size: var(--fs-xs);
    line-height: 1.2;
    /* **折り返しを許す。** `.cal-card` の white-space: nowrap（広幅で
       コース名を1行に保つための指定）がここまで継承され、決定表の
       「切り詰めない・折り返す」が実際には成立していなかった——幅を
       超えた分は折り返さずに切れていた（実測: `N15/15 !` は 52px 必要で
       37px しか無いのに1行のままだった）。 */
    white-space: normal;
    /* どちらの行も折り返しを許す。切り詰めない——決定表の実測値どおり、
       いちばん幅を食う組み合わせだけが1〜3px超える
       （`P 12/12!` 42px・`和歌山市` 44px）。欠けるより1行増えるほうがよい。 */
    overflow-wrap: anywhere;
  }

  /* 略記にしたので凡例を出す（決定表）。 */
  .cal-legend {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-4) var(--space-12);
    margin: 0 var(--space-16) var(--space-16);
    padding: 0;
    list-style: none;
    font-size: var(--fs-xs);
    color: var(--ink-2);
  }

  /* 月表の下に「予定のある日だけ」の詳細を続ける（決定表）。中身は
     session_summary マクロを月表のマスと共有する——2箇所に書かない。 */
  .cal-agenda {
    display: block;
    margin: 0 var(--space-16) var(--space-16);
  }

  .cal-monthnav {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-8);
    margin: 0 var(--space-16) var(--space-16);
  }

  /* [2026-09-12 依頼者指摘] 帯の中の月の切り替え（.monthnav）は塊ごと
     次の行へ落ちるので、落ちたときは行幅いっぱいを使って左右に散らす
     （‹ 前月 … 年月 … 翌月 › … 今日）。指で押す左右のボタンが画面の両端に
     寄り、真ん中の年月が読みやすくなる。塊の中は nowrap のまま。 */
  .monthnav { flex: 1 0 100%; justify-content: space-between; }
  .monthnav .period { flex: 1 1 auto; text-align: center; }

  /* .panel-stats の display / grid-template-columns / dt・dd の文字サイズは
     ここに書く（Task 18・.attendee summary と同じ理由。static/05-admin.css の
     コメント参照）。横1帯（repeat(7,1fr)）は768px以上専用（05-admin.css）。

     [2026-09-14 ユーザー指摘] 7項目を縦1列に積むと右半分が空いたまま
     画面の高さを取る。2列（左4・右3）に分ける——dt/dd の対を
     grid-auto-flow: column で**列優先**に流し、8行×2列の升に
     dt1 dd1 … dt4 dd4 ／ dt5 dd5 … dt7 dd7 と収める（dt が見出し行、
     dd が値の行に必ず揃う）。各対の下に罫（dd の border-bottom）を引き、
     列の末尾（4番目・7番目の dd）だけ罫を消す。値の文字は PC の
     --fs-xl から --fs-lg に一段落とす。 */
  .panel-stats {
    display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
    grid-template-rows: repeat(8, auto); grid-auto-flow: column;
    gap: 0 var(--space-16);
  }
  .panel-stats dt { font-size: var(--fs-xs); font-weight: 700; color: var(--ink-2); padding-top: var(--space-8); }
  .panel-stats dd {
    margin: 0; padding-bottom: var(--space-8); border-bottom: 1px solid var(--rule-2);
    display: flex; align-items: baseline; gap: var(--space-8);
  }
  .panel-stats dd:nth-of-type(4), .panel-stats dd:nth-of-type(7) { border-bottom: 0; }
  .panel-stats .stat-value { font-size: var(--fs-lg); }

  /* [2026-09-14 ユーザー指摘] 開催回パネルの受講者行。以前は flex-wrap
     で「内容の幅のまま自然に折り返す」形だったが、氏名・所属の文字量で
     段の構成が変わり、短い人（大村・加藤・濱本）だけメモ印の右に
     並んで字下げされたように見えた。申込一覧（下の .entry summary）と
     同じ**固定グリッド**にして、誰でも同じ位置に同じ順で出す:

       [memo] 16px   メモ印
       [body] 1fr    氏名・かな（1段目）／申込日・区分・職種・所属（2段目）
       [status] auto 状態ピル
       [prework] 44px 事前課題チェック（ACLS・PEARS のみ。列自体を
                      .attendee--prework 修飾クラスで出し入れする）
       [action] auto 承認（無い行は 0px）

     注意ピル（.cell-alert）は body から右端までを使う2行目、押せない理由
     （.row-note）は3行目。出席の列は同日の依頼者決定で廃止した。 */
  .attendee summary {
    display: grid;
    grid-template-columns: [memo] 16px [body] minmax(0, 1fr) [status] auto [action] auto;
    grid-template-rows: auto auto auto;
    column-gap: var(--space-8); row-gap: 0;
    align-items: center;
  }
  .attendee.attendee--prework summary {
    grid-template-columns:
      [memo] 16px [body] minmax(0, 1fr) [status] auto [prework] 44px [action] auto;
  }
  .attendee summary > .cell-memo { grid-column: memo; grid-row: 1; }
  /* 氏名の帯（_attendee_row.html の .attendee-name-band）。1段目に氏名＋
     かな（.cell-name。かなは収まらなければ氏名の下へ）、2段目に申込日・
     区分・職種（.attendee-secondary）と所属を小さく並べる。 */
  .attendee summary > .attendee-name-band {
    grid-column: body; grid-row: 1;
    display: flex; flex-wrap: wrap; align-items: baseline;
    gap: 0 var(--space-8); min-width: 0;
  }
  .attendee summary > .attendee-name-band > .cell-name {
    flex: 1 1 100%; min-width: 0; flex-wrap: wrap; column-gap: var(--space-8); row-gap: 0;
  }
  .attendee summary > .attendee-name-band > .cell-name > .attendee-name { white-space: nowrap; }
  .attendee summary > .attendee-name-band > .attendee-secondary {
    display: flex; flex-wrap: wrap; gap: var(--space-4);
    font-size: var(--fs-xs); color: var(--ink-2);
  }
  .attendee summary > .attendee-name-band > .cell-organization {
    flex: 0 1 auto; font-size: var(--fs-xs); color: var(--ink-2); overflow-wrap: anywhere;
  }
  /* 事前課題チェックの添え字（2026-09-14 ユーザー指摘「チェックボックスが
     事前課題のチェックであることをわかりやすく」）。狭幅は列見出しが無い
     ので、チェックの下に11pxで「事前課題」を出す。44px の列幅に4文字が
     ちょうど収まる。PC（≥768px）は列見出しがあるので出さない
     （02-components.css で既定 display: none）。 */
  .check-tap--captioned { flex-direction: column; gap: 0; line-height: 1; }
  .check-caption { display: block; font-size: var(--fs-xs); color: var(--ink-2); white-space: nowrap; }
  .attendee summary > .cell-status { grid-column: status; grid-row: 1; }
  .attendee summary > .cell-prework { grid-column: prework; grid-row: 1; }
  .attendee summary > .cell-action { grid-column: action; grid-row: 1; }
  .attendee summary > .cell-alert {
    grid-column: body / -1; grid-row: 2;
    display: flex; flex-wrap: wrap; gap: var(--space-4); overflow: visible;
  }
  .attendee summary > .row-note { grid-column: body / -1; grid-row: 3; }
  /* 通常参加／復習参加の見出しは行より控えめに。 */
  .panel-body h2 { font-size: var(--fs-sm); color: var(--ink-2); margin: var(--space-16) 0 var(--space-4); }
  /* 下部の操作（編集／申込一覧を開く／メールアドレスをコピー）は同じ
     36px の副ボタン（.btn-quiet）で折り返す。以前は折り返さず、コピーの
     ボタンがカードの右端からはみ出していた。 */
  .panel-foot { flex-wrap: wrap; gap: var(--space-8); }

  /* ============================================================
     密度設計 Task 12（2026-09-11・修正ラウンド1）: 375pxの寸法体系の
     総仕上げ。ボタン3階層のmin-height（上のほう）・タップ領域は
     Task 3・5・18がすでに敷いている。ここでは申込一覧の行
     （.entry summary）を「2段＋右端の操作列」の**固定グリッド**に
     畳む（task-12-brief.md／依頼者の修正指示）。

     **修正ラウンド1で作り直した理由**: 初版は `.attendee summary`
     （Task 10・18）と同じ「flex-wrap で内容の幅のまま自然に折り返す」
     形を流用したが、これは段の構成（何が1行目・2行目に来るか）が
     申込ごとの文字量で変わってしまい、README骨格1「1行＝固定グリッド。
     要素の有無にかかわらず幅が動かない」に反する（依頼者指摘）。
     ここでは原本 `id="M1"` の行カード（`grid-template-columns:
     minmax(0,1fr) auto`）と同じ考え方を、既存のフラットな `cell-*`
     構成（Task 5）にそのまま適用する。 */

  /* [Task 12] 氏名は常に全文表示し、かな（.entry-kana）だけを省略する
     （brief「氏名は常に全文。かなだけellipsis」）。.entry-name の無条件
     規則（02-components.css）はPC幅の固定10列グリッド向けに
     text-overflow: ellipsis を持つが、375pxのカード表示では省略しない
     ——nowrapのまま省略記号だけ外すと氏名がカード幅を超えて横スクロール
     の原因になるため、折り返しを許して幅の中に収める（overflow-wrap:
     anywhere）。M1実測: 氏名は16px（var(--fs-lg)）。 */
  .entry-name {
    font-size: var(--fs-lg);
    white-space: normal;
    overflow: visible;
    text-overflow: clip;
    overflow-wrap: anywhere;
  }

  /* [Task 14] 申込一覧の1行（.entry summary）を原本 M1 の行カード
     （`grid-template-columns: minmax(0,1fr) auto`、.dc.html 1335行〜）
     に揃える。受け入れ条件「375px・12件 1,491〜1,497px／1行 65〜91px／
     780pxに5人分」を実測して外れていたため作り直した（task-14-report.md）。

     Task 12 修正ラウンド1の「段2の4項目を固定幅トラックに1つずつ」は、
     317px予算で注意列が13pxまで潰れ（ピルが読めない）、出席・事前課題を
     縦積みにしたため1行が109pxになっていた（原本 64.84px、実測）。
     原本 M1 は段2を flex-wrap（状態ピル・区分・金額・注意ピルが1行に
     収まらなければ次の行へ）にし、右端に 44×44 のチェック2つ＋承認を
     **横に**並べている。位置が固定なのは「段1＝氏名＋かな／段2＝帯／
     右端＝操作」という3つの領域と、チェック2つの列（44px×2）。段2の
     中で何が折り返すかだけがデータで変わる（原本も同じ。M1実測:
     注意ピル無し 64.84px・あり 90.89px）。

       [memo] 16px   メモ印
       [body] 1fr    段1＝氏名＋かな（.cell-name）／段2＝帯（.row-band）
       [prework] 44px 事前課題チェック（ACLS・PEARS のみ。列自体を
                      .entry--prework 修飾クラスで出し入れする——PCの
                      9列/10列と同じ対）

     出席チェックの列（[attend] 44px）は 2026-09-14 の依頼者決定で廃止した。
     実際に使える幅は 325px（375 − main の左右 padding 12×2 − .card の
     罫 1×2 − .entry の左右 padding 12×2。下で .entry の padding を原本の
     カード（8px 12px）に合わせた）。

     申込日（cell-applied）は原本 M1 の行カードに無い列なので375pxでは
     出さない（display:none。値はDOMに残る）。 */
  .entry { padding: var(--space-8) var(--space-12); }
  .entry summary {
    display: grid;
    grid-template-columns:
      [memo] 16px [body] minmax(0, 1fr);
    grid-template-rows: auto auto;
    column-gap: var(--space-8);
    row-gap: 0;
    align-items: center;
  }
  .entry.entry--prework summary {
    grid-template-columns:
      [memo] 16px [body] minmax(0, 1fr) [prework] 44px;
  }
  /* 上の `.entry summary` は子孫セレクタなので、.entry に入れ子の抽斗
     （取り消し・返金の操作）の summary にも当たる。PC側は 05-admin.css
     で打ち消してあるが、375px側には無く、閉じた「取り消し・返金の操作」
     の見出しが16pxのメモ列で1文字ずつ折り返して225pxの高さになっていた
     （Task 14 実測。Task 12 のグリッドでも同じ）。ここで同じ打ち消しを
     入れる。「申込フォームの回答」は Task B（2026-09-11）で抽斗自体を
     廃止したため、.answers-drawer 分の打ち消しは無くなった。 */
  .entry .danger-drawer summary {
    display: inline-flex; grid-template-columns: none;
  }
  /* 開閉マーカー（▸/▾）は無条件規則（02-components.css）の ::before で
     出るが、display:grid の直下では生成ボックスも暗黙のグリッド項目
     として数えられ列がずれる（PC10列グリッド・05-admin.cssの同種の
     コメント参照）。PCと同じ手当て（矢印を消し、1列目=メモ印に
     ::after で重ねる）をここにも適用する。 */
  .entry summary::before { display: none; }
  .entry[open] .cell-memo { position: relative; color: transparent; }
  .entry[open] .cell-memo::after {
    content: "▾";
    position: absolute;
    inset: 0;
    color: var(--ink-2);
  }
  .entry summary > .cell-memo { grid-column: memo; grid-row: 1; width: auto; }
  .entry summary > .cell-name { grid-column: body; grid-row: 1; }
  /* 氏名は常に全文（折り返してでも）・かなはellipsisで省略——という
     優先順位を作る。**flex-shrinkの比率では実現できなかった**
     （実測: kanaのflex-shrinkを1→200にしても氏名80px・かな72pxと
     ほぼ変わらず。shrink比は基準サイズとの積で決まるため、shrink値を
     大きくするだけでは狙った配分にならない）。代わりに氏名を
     `flex: 0 0 auto`（自分の内容サイズに固定・縮めない）＋
     `max-width: 100%`（cell-name自体の幅は超えない安全弁）にし、
     かなを `flex: 1 1 0%`（基準0・余った幅だけをもらう）にする。
     短い氏名（内容サイズがcell-name幅に収まる）は1行のまま表示され、
     残った幅をかなが受け取る。長い氏名（内容サイズがcell-name幅を
     超える）は max-width: 100% がcell-nameの幅で頭打ちにし、そこから
     先は折り返し（overflow-wrap: anywhere、上のブロックで設定済み）で
     吸収する——横スクロールにはならない。 */
  .entry summary > .cell-name > .entry-name { flex: 0 0 auto; max-width: 100%; }
  .entry summary > .cell-name > .entry-kana { flex: 1 1 0%; min-width: 0; }
  .entry summary > .cell-applied { display: none; }
  /* 段2の帯。原本 M1（.dc.html 1342行）: `display:flex;align-items:
     baseline;gap:4px;flex-wrap:wrap;min-width:0`、中身はすべて11px。
     並び順は原本どおり 状態ピル → 区分 → 金額 → 注意ピル（DOM順は
     区分→状態→注意→金額なので order で並べ替える。注意ピルは
     .cell-alert が display: contents で箱を持たないため、order は
     ピル自身に付ける）。

     reservation-list-brief.md（2026-09-12）: 金額（cell-amount）は撤去し、
     区分の後に職種・所属・経験年数を挿入した（請求/入金を削った分だけ
     order を詰め、注意ピルは末尾のまま）。 */
  .entry summary > .row-band {
    grid-column: body; grid-row: 2;
    display: flex; flex-wrap: wrap; align-items: baseline;
    gap: var(--space-4);
    min-width: 0;
  }
  .entry summary > .row-band > .cell-status { order: 1; }
  .entry summary > .row-band > .cell-kind { order: 2; }
  .entry summary > .row-band > .cell-occupation { order: 3; font-size: var(--fs-xs); }
  /* [2026-09-13] 全文表示に変更（PC側と同じ理由）。max-width: 100% は
     残す——row-band（flex-wrap）の中で所属だけ幅いっぱいに伸びて次の
     項目を押し出さないようにするため。 */
  .entry summary > .row-band > .cell-organization {
    order: 4; font-size: var(--fs-xs); max-width: 100%; overflow-wrap: break-word;
  }
  .entry summary > .row-band > .cell-experience { order: 5; font-size: var(--fs-xs); }
  .entry summary > .row-band > .cell-alert > .pill { order: 6; }
  /* 注意ピルは1つずつ折り返せるよう .cell-alert の箱を外す
     （display: contents）。無条件規則の overflow:hidden（02-components.css。
     PC の168px・1段固定のための切り詰め）は箱が無くなるので効かず、
     ピルは帯の中で折り返して全文が読める。畳み（先頭1つ＋「＋N」）は
     テンプレート側で共通。 */
  .entry summary > .row-band > .cell-alert { display: contents; }
  .entry summary > .cell-prework { grid-column: prework; grid-row: 1 / 3; align-self: center; }
  /* 押せない理由の本文（.row-note）は、段1・段2の下にもう1行増やして
     全幅で出す（disabled のときだけ・常に3行目という固定位置。動くのは
     幅ではなく行数なので、README骨格1「要素の有無で幅が動かない」には
     反しない）。顧客メモ・申込メモ（.row-memo、reservation-list-brief.md
     §2）も同じ全幅本文なので既定は同じ3行目に置く。 */
  .entry summary > .row-note,
  .entry summary > .row-memo { grid-column: memo / -1; grid-row: 3; }
  /* 両方が同じ行に出うる（disabled理由＋メモ）。3行目に重ねると文字が
     重なって読めないため、.row-note の直後に .row-memo が続く場合だけ
     4行目へ送る（実機確認: 375pxで重なりが無いことを確認済み）。 */
  .entry summary > .row-note + .row-memo { grid-row: 4; }

  /* [Task 12 修正ラウンド1] 375pxだけの「上部集計」。02-components.css
     の無条件規則で display:none にしてあるものを、ここでだけ表示に
     戻す。確定・承認待ち・入金未確認の3つは1行常時（.entry-metrics-row）、
     残り4つは <details> の抽斗（.entry-metrics-drawer）に畳む
     （task-12-brief.md）。抽斗の開閉トグル（<summary
     class="btn-secondary toolbar-chip">）は上のツールバー
     （.toolbar-chip、02-components.css・05-admin.css）と同じ見た目・
     同じ開閉マーカーをそのまま使うので、ここでは追加のCSSを持たない。 */
  /* [Task 14] 集計帯は原本 M1 の band 2（.dc.html 1315行: `padding:4px
     12px`・高さ 30.69px 実測）に合わせて1行にする。抽斗のトグル
     （summary）は独立した2行目にせず、同じ行の右端に文字だけで置く
     （<details> を display: contents にして summary と panel を帯の
     flex 項目にする——.toolbar details と同じ手法、05-admin.css）。
     開いた panel だけ全幅（flex-basis: 100%）で次の行に落ちる。 */
  .entry-metrics {
    display: flex; flex-wrap: wrap; align-items: center;
    gap: 0 var(--space-16);
    padding: 0 var(--space-12);
    border-bottom: 1px solid var(--rule-2);
  }
  .entry-metrics-row {
    display: flex;
    align-items: center;
    gap: var(--space-16);
    height: 31px;
  }
  .entry-metric { font-size: var(--fs-xs); color: var(--ink-2); white-space: nowrap; }
  .entry-metric b { font-size: var(--fs-md); font-weight: 700; color: var(--ink); margin-right: var(--space-4); }
  .entry-metrics-drawer { display: contents; }
  .entry-metrics-drawer > summary.toolbar-chip {
    margin-left: auto; padding: var(--space-12) 0; height: auto;
    font-size: var(--fs-sm); color: var(--ink-2);
  }
  /* 抽斗の中身（残り4項目）は1行常時と同じ見た目で、折り返しを許す
     （4項目が375px幅に収まりきらないことがあるため。.drawer-panel の
     既定padding/背景/罫は02-components.cssから流用する）。 */
  .entry-metrics-drawer > .drawer-panel {
    flex-basis: 100%;
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-8) var(--space-16);
  }

  /* [Task 14] 見出し帯（.card-head.toolbar-head）とツールバー（.toolbar）
     も原本 M1 の band 1（45px）・band 3（45px）に合わせて各1行にする。
     見出し: 戻るリンク・h1・件数を1行に置き、開催回の要約は右端で
     ellipsis（原本: `margin-left:auto;min-width:0;overflow:hidden;
     text-overflow:ellipsis;white-space:nowrap`、11px）。
     ツールバー: チップは375pxで既に枠も面も無い文字だけ（上の
     .btn-secondary/.btn-danger）。原本 band 3 は `padding:0 12px` の
     44px リンクの横並びなので、帯の上下 padding を 0 にし、抽斗の
     summary チップは上下 padding 12px で44px相当の高さにする（summary は
     button/a ではないのでタップ領域の一般規則（44px群）に乗らず32pxの
     ままだった。min-height は3点セットの管理集合専用なのでここでは
     使わず、ボタン語彙の height: 32px（02-components.css）を auto に
     戻して padding で44pxにする。集計帯のトグル summary も同じ）。
     見出し帯の高さは中の戻るリンク（main a・44px）が決める。 */
  .card-head.toolbar-head {
    flex-wrap: nowrap;
    gap: var(--space-8);
    /* [2026-09-12] 戻るリンク（.btn-quiet）を 36px に落とした（上の
       「依頼者決定」）ので、帯の高さを密度設計の 45px 前後（README・
       test_375pxのヘッダの見出し帯とツールバー帯と集計帯は1行のまま）に
       保つぶんを上下の padding（4px×2）で足す: 36 + 8 = 44px。 */
    padding: var(--space-4) var(--space-12);
  }
  .card-head.toolbar-head > h1,
  .card-head.toolbar-head > .count,
  .card-head.toolbar-head > .btn-quiet { flex: 0 0 auto; white-space: nowrap; }
  .card-head.toolbar-head > .toolbar-summary {
    margin-left: auto; min-width: 0;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    font-size: var(--fs-xs);
  }
  .toolbar { padding: 0 var(--space-12); gap: 0 var(--space-8); }
  /* F3（修正ラウンド1・Task Aの申告）: 出力ボタンを1つの
     <details>「出力」に畳んだ帯のトグル。.entry-metrics-drawer の
     summary.toolbar-chip と同じ理由・同じ手法（summaryはbutton/aでは
     ないため一般のタップ領域規則に乗らない。height:32pxをautoに戻し、
     paddingで44px相当にする）。margin-left:autoは付けない——こちらは
     行の右端ではなく、.toolbar 直下の独立した抽斗のトグルそのもの。 */
  .toolbar-outputs > summary.toolbar-chip {
    padding: var(--space-12) 0; height: auto;
    font-size: var(--fs-sm); color: var(--ink-2);
  }

  /* <dialog> の既定UAスタイル（margin: auto によるセンタリング）が
     height: 100vh を指定しても上下に余白を残す（実測: 812px中778pxしか
     埋まらない）。margin: 0 で余白を消す。 */
  .panel-dialog { width: 100vw; max-width: none; height: 100vh; margin: 0; }

  /* 管理者一覧・開催地・会場（2本）・インストラクター・似た顧客の6本を
     カードに組み替える。開催回一覧（session-list）と同じ仕組みで、対象は
     list-table.stacked に限る——無条件に効かせると、設定・操作ログのような
     参照専用の表まで見出しの無い縦積みになってしまう。
     写すのは開催回一覧の狭幅ルールのうち一部だけ。数値を横に並べる指定・
     項目名を消す指定・ノート欄の扱い・ホバー時の背景の打ち消しは開催回一覧
     に固有の事情なので、ここには持ち込まない。 */
  .scroll.stacked-wrap { overflow-x: visible; }
  .list-table.stacked, .list-table.stacked tbody, .list-table.stacked tr, .list-table.stacked td {
    display: block;
    width: 100%;
  }
  .list-table.stacked thead { display: none; }

  /* C-3（2026-08-31 ユーザー裁定・実装後レビュー指摘）: 行の区切りが
     --rule-2 の1本線（白地 1.20:1・ホバー面 1.12:1。2026-09-05 管理画面
     刷新で --rule / --rule-2 の色も変わったため数値を更新）だけでは
     ロービジョンで判別できない。--rule（白地 1.35:1）も同様に3:1に届かない。
     --rule-strong は同じ刷新で白地3.62:1まで暗くなり3:1を満たすように
     なったが、これは「入力欄・ボタンの枠」専用のトークン（01-tokens.css）
     で、参照専用の一覧の行区切りに転用すると操作可能な要素に見えてしまう。
     よって :root に色は足さず、上下の余白を広げて区切りを見せる（横方向
     var(--space-4) は変えない）。 */
  .list-table.stacked tr {
    padding: var(--space-16) var(--space-4);
    border-top: 1px solid var(--rule-2);
  }

  .list-table.stacked td {
    border-bottom: 0;
    padding: 2px 0;
    text-align: left;
    overflow-wrap: anywhere;
  }

  /* C-3（2026-08-31 ユーザー裁定）: 先頭のセルを太字にして行の見出しに
     見せる。.session-list の大きな日付が行の先頭にあるから読みやすい、
     という先例と同じ考え方。C-4 の項目名を消す措置と合わせて
     「行の見出し」になる。 */
  .list-table.stacked td:first-child {
    font-weight: 700;
  }

  /* 項目名を値の前に出す。カードにすると列見出しが消えるので、名前を
     持たない選択欄（会場〈開催地未設定〉の開催地）は、これが唯一の手がかりに
     なる。開催回一覧と違い、ここでは content を none にする項目を1つも
     置かない。 */
  .list-table.stacked td[data-label]::before {
    content: attr(data-label) " ";
    color: var(--ink-2);
    font-size: var(--fs-xs);
    margin-right: var(--space-4);
  }

  /* C-4（2026-08-31 ユーザー裁定・実装後レビュー指摘）: 1列の表（開催地・
     インストラクター）では「■ 開催地名 兵庫県神戸市」の「開催地名」が
     カード見出し（「現在登録されている開催地」）と重複する。先頭のセルは
     その行の身元（氏名・会場名・開催地名）なので、項目名が無くても意味が
     通る。§5.1.1「content: none を使わない」の理由（会場〈開催地未設定〉の
     「開催地」は名前を持たない select で、項目名を消すと何を選ぶ欄か
     分からなくなる）はここには当たらない——その欄は先頭のセルではない。
     td:first-child::before に限定し、他の列では引き続き content: none を
     使わない（tests/test_style_guard.py の
     test_stacked系にcontent_noneが無い で検査）。base の ::before と同じ
     詳細度（0,3,2）なので、後にあるこのルールが tr の1列目にだけ勝つ。 */
  .list-table.stacked td:first-child::before {
    content: none;
  }

  /* 値の無い項目（似た顧客のメモ・状態など）は、項目名だけが宙に浮かない
     よう、セルごと隠す。tr を挟んで詳細度を1つ上げているのは、下の操作列の
     規則と同じ詳細度だと「後に書いたほうが勝つ」だけの関係になり、順序を
     入れ替えた瞬間に効かなくなるため。実際、操作列が空になる行（自分自身の
     管理者の行）で高さ4pxの名前の無いセルが残っていた（2026-08-31 実測）。 */
  .list-table.stacked tr td:empty { display: none; }

  /* 操作列は行の最後に置き、複数のボタンを折り返して並べる。広幅向けの
     詰め（button の右マージン・削除フォームの左マージン）は、ここでは
     gap が間隔の役目を引き継ぐので戻す。戻さないと隙間が不揃いになる。 */
  .list-table.stacked td:last-child {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-8);
    margin-top: var(--space-8);
  }
  .list-table.stacked button { margin-right: 0; }
  .list-table.stacked form[id^="delete-"] { margin-left: 0; }
}

/* 開催回一覧の事務局メモ。長いメモで行が伸びないよう1行に丸める。
   狭幅（≤767px）では上の @media 内で折り返し表示に上書きする。 */
.session-list .note {
  font-size: var(--fs-xs); color: var(--ink-2);
  max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* 開催回一覧（≥768px、table-layout: auto のまま）で「開催地 / 会場」の
   会場名が長い月（例: 板橋区立企業活性化センター2階）に、見出しの
   「確定」「待ち」「キャンセル待ち」「空き」「担当」と状態の .pill が
   2行に割れていた（実測: thead th 51〜68px、.pill 37×39px）。原因は
   auto レイアウトが列幅を必要幅ぎりぎりまで削ることで、どの列を削る
   かは「開催地 / 会場」に限らず全列に及んでいた。

   見出しと .pill だけ折り返しを禁止すると、auto レイアウトの列幅計算が
   その最小幅を必ず確保するようになり、折り返しを許したまま残る
   「開催地 / 会場」列（このルールでは触れていない）が唯一の逃げ場として
   自動的に縮む。table-layout や個々の列に px 幅を指定していないのは、
   会場名の長さは月によって変わるため、固定幅では別の月に別の壊れ方を
   持ち込むおそれがあるため（実測: 768px でこの2行だけで表全体の
   横スクロールが消え、thead th が33.8pxの1行に、.pill が38×22pxに戻った）。

   .pill 自体でなく .session-list .pill に絞っているのは、certificates.html
   などの .pill は last_send_error のような可変長の文字列を持つことがあり、
   nowrap にすると折り返しの逃げ場を失って横スクロールに化けるため
   （開催回一覧の状態ピルは status_labels の短い固定語句のみ）。 */
.session-list thead th { white-space: nowrap; }
.session-list .pill { white-space: nowrap; }

