
/* ★★★2026-08-26（K-1180）: 右上の帯まわりの規則 18 本を **ここから外した**。
 *   ★正本は `assets/css/header-shared.css` ただ 1 本（★あれは **両方のサイトで**読まれる）。
 *   ★★外してよい根拠（実測）= 突き合わせで **このファイルだけに在る規則は 0 本**
 *     ＝ ★失う見た目が無い。★一方で **17 本中 12 本の宣言が食い違っていた**。
 *   ★★食い違いが見た目に出る機構 = このファイルは `template_redirect` の中で登録されるので
 *     `header-shared.css`（テーマ読込時に登録）より **後に出る ＝ 勝つ**。
 *     ★★だから **社員サイトだけ**このファイルの値になり、教室サイトと違って見えていた。
 *   ★実際に違っていたもの = パンくずの文字 13px/12px ／ 歯車の字の大きさ ／ 押したときの地の色 ／
 *     メニューの地（#fff と var(--ies-surface)）／ 罫の色（#e4e4dd と #E3E3E3）ほか。
 *   ★★**戻し方** = `git revert`。★このファイルに書き戻すのではなく、
 *     ★★足したい規則は `header-shared.css` に足すこと（★2 本目の正本を作らない）。 */


/* =========================================================
 * ★★★UI キット（共通部品）— K-1228 / 2026-08-30
 *
 * ★★**相澤さんのご指示（逐語・2026-08-30）**:
 *   「UI 系の多くは結局**コンポネント化を徹底的に完遂して**、そのあとにそれらのコンポネントを
 *    使って組み上げないと、結局別途統一する作業やトークン化できているかの調査や
 *    トークンに変換する作業が必要になるよね？」
 *   「フォントサイズや背景色などはもちろん**ボタンやバッジ、各種フォームなども
 *    徹底的なまでにまずは共通部品を作成して**それらを全画面に対して適用していきましょう」
 *
 * ★★**このファイルが部品の唯一の正本である。**★画面ごとの CSS に部品を作らない。
 *   ★配られ方 = `ies-tokens`（`assets/css/tokens.css`）→ このファイル。
 *   ★★**ログインしている全員に届く**（★社員・講師・保護者・生徒／両方のサイト）。
 *   ★根拠 = `functions.php` の K-1222 / K-1223 の節 ＋ `inc/pdash-loader.php:712`。
 *
 * ★★**設計の 5 原則**（★どれか 1 つでも破ったら、それは部品ではなく写しである）:
 *   ① ★**値はトークンからしか取らない。**★生の hex・生の px（角丸・余白・文字）を書かない
 *   ② ★**当たり判定は S(24) / M(32) / L(44) の 3 段だけ**（K-1185）。★40px を作らない
 *   ③ ★**角丸は 4 / 8 / 12 / 16 / 丸薬 の 5 段だけ**（K-1206）。★操作するもの = 8px・カード = 16px
 *   ④ ★**文字は 12px 未満にしない**（`docs/ui/system/acceptance.md`）。★px ではなく rem で書く
 *   ⑤ ★**淡い地の上の文字は 4.5:1 以上**（K-1219）。★満たせない組は専用の `-ink` を使う
 *
 * ★★**修飾子は「数」で決めている。**★手書きの形が何か所あるかを測ってから足した
 *   （★物差し = `php tools/nb-scan-ui-shapes.php`）。★★**好みで足していない。**
 *
 * ★★**この節が見ないもの**: ★実ブラウザでの位置と寸法（K-1216）。
 *   ★見本帳 = `bash docs/ui/tools/build-ui-kit.sh`（★明・暗の両方を焼いて測ること）。
 * ========================================================= */

/* --- ⓪地の文の大きさ（★このファイルが *全員* に届く唯一の共有 CSS だから、ここに置く） ---
 *
 * ★★★**2026-09-06: 保護者の 8 画面だけ地の文が 16px だった。★誰も決めていない値。**
 *
 * ★★**相澤さんのご決定** = ★★**14px に揃える**（★他の全画面が 14px）。
 *
 * ★★**なぜ保護者だけ外れていたか（★担当の実測）**: ★14px を宣言している場所は 2 つあるが、
 *   ★★**保護者にはどちらも配られていなかった**:
 *   | 誰が見る画面 | 14px を配るファイル | 保護者は |
 *   |---|---|---|
 *   | 社員サイト全画面 | `assets/css/base.css:31` | ★**配られない** |
 *   | 教室サイトの社員・講師 | `assets/css/sidebar-shared.css:668` | ★**配られない** |
 *   ★理由 = `functions.php:807` が「社員でも講師でもない人」に対し
 *     ★★**トークンと部品の 2 本だけ配って早期 return する**（K-1222）。
 *   ★対照 = ★教室サイトの *スタッフ* の画面は 14px（★同じ教室サイトでも役で変わっていた）。
 *
 * ★★**なぜ `body` に書いてよいか**: ★このファイルは **全員に届く**（★社員・講師・保護者・生徒）。
 *   ★★**他の 2 か所より先に読まれる**ので、★社員・講師の画面では今までどおり
 *   　`base.css` / `sidebar-shared.css` の宣言が勝つ ＝ ★★**あちらの見え方は 1px も変わらない。**
 *   ★★**変わるのは、どちらも届いていなかった保護者・生徒だけ。**
 *
 * ★★**実測（★担当が焼いて測った）**: ★保護者 8 枚すべて 16px → 14px。
 *   ★★**縦の長さは 8 枚とも ±0px**（★部品化で中身が自前の大きさを持ったため）。
 *   ★実際に文字が変わる要素は **2 個だけ**。
 *
 * ★★**`:where()` で包む理由**: ★重みを 0 にして、★**部品にも画面にも絶対に勝たせない。**
 *   ★★これは「床」であって「決まり」ではない（★K-1517 と同じ考え）。 */
:where(body) { font-size: 0.875rem; }

/* --- ①カード ------------------------------------------------
 * ★手書き 270 か所 / 140 種（★実測 2026-08-30）。
 * ★修飾子は「余白の段」「面の強さ」「押せるか」の 3 軸だけに絞った。 */
.ies-card {
  background: var(--ies-surface);
  border: 1px solid var(--ies-border);
  /* ★★2026-08-29（K-1191）: 5px → 16px。★本体層の `--cl-radius-lg` と揃えた。
     ★同じ「カード」なのに層で角丸が違っていたのを解消する（★11 画面が一度に揃う）。
     ★★★2026-08-31（K-1249・相澤さんのご決定）: **16px → 12px。**
       ★逐語 =「そうだね **12 だと万人受け**しそうだよね」。
       ★★**これは測って決まった値ではなく、ブランドの意図で決まった値である**（★下の注記）。 */
  border-radius: var(--ies-radius-md);
  padding: var(--ies-sp-5);
  box-shadow: var(--ies-shadow-sm);
}
.ies-card + .ies-card { margin-top: var(--ies-sp-4); }
/* ★★★2026-09-01（K-1286）: **太さ 600 を全部 700 にした（13 か所）。★見た目は 1px も変わらない。**
 *
 * ★★**理由（★本番で実測）**: ★`header.php:37` が読み込むのは
 *   `Noto+Sans+JP:wght@400;500;700` ——★★**600 は配られていない。**
 *   ★CSS の書体選択規則は「600 が無ければ 600 以上を昇順に探す」ので、★★**700 が選ばれる。**
 *
 * ★★**本番 noberu.net で 32px の同一文字列の送り幅を測った値**:
 *   | 太さ | 幅 |
 *   |---|---|
 *   | 400 | 346.19px |
 *   | 500 | 348.20px |
 *   | ★**600** | ★**350.95px** |
 *   | ★**700** | ★**350.95px** ← ★★**完全一致** |
 *
 * ★★**＝ 部品が書いていた太さの決定の 44%（59 / 257 か所）が、画面上では実行されていなかった。**
 *   ★モーダルの見出し（600）＝ カードの見出し（700）で、★★**階層の差が消えていた。**
 *
 * ★★**なぜ「600 を配る」ではなく「600 を落とす」を選んだか**（★相澤さんのご指示 =
 *   「数値で視認性がよくなるほうで決めていい」）:
 *   ・★落とす = ★★**見た目が 1px も変わらない**（★いま 700 として描かれているため）。★重さも増えない
 *   ・★配る = ★59 か所の見た目が動き、★書体が 1 つ増える。★しかも 400/500/600/700 は
 *   　送り幅で **0.58〜0.79% しか違わず**、★★**離れて出たときの絶対判断では見分けられない**
 *   　（Miller 1956 の 5〜7 水準は、★水準が十分離れている前提）
 *
 * ★★**残っている問題（★これは直していない）**: ★見出しの段が **18 / 16 / 14 / 12px** で、
 *   ★比が **1.125 / 1.143 / 1.167** ——★★**どれも絶対判断の閾値（約 1.2 倍）を下回る。**
 *   ★★**太さで補えないので、階層は大きさだけに委ねられている。**
 *   ★★**作り直すには「12px の太字が日本語で潰れるか」を測る手段が要る。★いま無い**（★本棚 [544]）。 */
.ies-card__title { font-size: 0.875rem; color: var(--ies-text-sub); margin-bottom: var(--ies-sp-2); font-weight: 700; }
/* ★2026-08-30（K-1230）: 28px → **24px**。★★**大きな数字が 2 種類あった**（★カード 28 ／ 統計 24）。
 *   ★しかも 28px は、この repo が宣言している文字の刻み（12/14/16/18/20/24）の**外**だった。 */
.ies-card__value { font-family: var(--ies-font-mono); font-size: 1.5rem; font-weight: 700; color: var(--ies-text); }
/* ★余白の段。★手書きで最も多いのは 16px（`p-4`）で、24px の `.ies-card` より 1 段狭い。 */
.ies-card--tight { padding: var(--ies-sp-4); }
/* ★★2026-10-22（K-2178 ②11・部品化の続き）: **小さい枠**（余白 縦 4 × 横 8px の段）。
 *   ★なぜ: 給与明細の「承認済みの事務作業申請」の読むだけの行が `px-2 py-1 border border-border/60 rounded-lg`、編集の箱が `bg-surface/60 border border-border rounded-lg px-2 py-2` の手書き（申請の行の数だけ並ぶ・3 か所）。
 *     余白の段が `--tight`（16px）より小さい面の口が無く、角・枠・余白を行ごとに書いていた。
 *   ★値の出どころ（★新しい値を作っていない）= 手書きの `py-1`（縦 0.25rem）・`px-2`（横 0.5rem）と同じ。`--cl-sp-1` / `--cl-sp-2` は rem で Tailwind の語と同値（個人設定の文字の大きさに追従するところも手書きと同じ）。
 *   ★面の角（12px）・枠（罫の 100%）・影は `.ies-card` のまま。影を消すなら `.ies-card--plain` を組む。★手書きの角 8px → 12px と枠 60% → 100% は面の約束（K-1249）にそろう差。
 *   ★並べ方（`flex`・`gap`・`items-*`）は持たない（中身は画面が書く）。★渡さなければ（この class を使わない画面は）出力は 1 バイトも変わらない。
 *   ★画面に `px-*` `py-*` `border` `border-border/60` `rounded-lg` を残すと、後に読まれる Tailwind が勝つ ＝ 置き換えるときは消す。
 *   ★小さい枠どうしの間は並べる箱の `space-y-*` が持つ ＝ `.ies-card + .ies-card` の上 16px は小さい枠には付けない（下の 2 行目）。給与明細は読む行と編集の箱（hidden）が交互に並ぶので、編集を開いた行にだけ 16px の隙間が出るのを避ける。並べる箱の `space-y-*` は消さない。 */
.ies-card--mini { padding: var(--cl-sp-1, 0.25rem) var(--cl-sp-2, 0.5rem); }
.ies-card + .ies-card--mini { margin-top: 0; }
/* ★★★2026-08-31（K-1249・相澤さんのご決定）— **面の角丸は 12px。**
 * ★★**ご決定の逐語** =「**そうだね 12 だと万人受けしそうだよね**」
 *
 * ★★★**この値は「測って」決まったのではない。★ブランドの意図で決まった。**
 *   ★★**相澤さんのご指摘が、私の枠組みの誤りを直した**（★逐語）:
 *   > 角丸については**視認性というよりも雰囲気**なのではと今思ったんだけどどうなの？
 *   ★★**そのとおりだった。**★私は「段の間隔」という *二次的な* 基準で 16px を導いていたが、
 *   ★★**呼んだ 2 体とも「理論は px を決めない」と明言していた**のを、私が読み飛ばしていた。
 *
 * ★★**理論が決めるのは「してはいけないこと」だけ**:
 *   ・★外側 ≥ 内側（★同心に収まらない。★幾何学的に証明できる）
 *   ・★短辺の直線が消えると**バッジと同じ形になる**（★12px なら **短辺 48px 以上**が要る）
 *
 * ★★**12px を選んだ根拠（★4 つが独立に指した）**:
 *   ①★**いま実際に最も多い**（★8px:103 / **12px:158** / 16px:119）＝ 変更が最も少ない
 *   ②★**noberu は情報密度の高い業務系**（★社員・講師 39 枚 対 保護者 8 枚）
 *   ③★ただし保護者も使うので 8px は硬すぎる
 *   ④★慣習の整理でも 12px が「最も汎用的・モダンさと機能性のバランス」
 *
 * ★★★**`--s`（小さい面の段）は作らない。**★2026-08-31 に一度作ったが、★**12px なら要らない**——
 *   ★下限が 64px → **48px** に下がり、★実測（46 個中 64px 未満が 2 個）でほぼ全部が満たす。
 *   ★★**使われない段は腐る**ので、作らないほうが正しい。 */
/* ★中に表や一覧を敷き詰めるとき（★内側の要素が自分で余白を持つ）。 */
.ies-card--flush { padding: 0; overflow: hidden; }
/* ★面を落ち着かせる（★カードの中にカードを置くとき）。 */
.ies-card--plain { box-shadow: none; }
/* ★意味のある淡い面。★`--tint` は主要色、`--tint-warn` などは状態。 */
/* ★2026-08-30（K-1229）: 淡色面は 2 つだけ（★緑＝主要 ／ コーラル＝要応答）。★青と琥珀を外した。 */
.ies-card--tint        { background: var(--ies-jade-soft);  border-color: transparent; box-shadow: none; }
.ies-card--tint-accent { background: var(--ies-coral-soft); border-color: transparent; box-shadow: none; }
/* ★丸ごと押せるカード（★一覧の行・選択肢）。★当たり判定は中身が作る。 */
.ies-card--hover { cursor: pointer; transition: border-color .15s, box-shadow .15s; }
.ies-card--hover:hover { border-color: var(--ies-jade-dark); box-shadow: var(--ies-shadow-md); }
.ies-card--hover:focus-visible { outline: 2px solid var(--ies-jade-dark); outline-offset: 2px; }
/* ★★★2026-09-06: **押せるカードの段（L = 44px）と、左の縁で種別を示す口を足した。**
 *
 * ★★**なぜ**（★実測で見つかった・門 `nb-test-ui-kit` の D）: ★保護者の画面が
 *   ★`min-h-[44px]` と `border-l-[3px] border-l-primary` を **Tailwind で直書き**していた。
 *   ★★**Tailwind は共通部品より *後* に読まれるので、直書きが部品に勝つ。**
 *   ★★＝ **部品の大きさと形が、画面ごとに黙って上書きされていた。**
 *
 * ★`--l` … ★★**押せるカードが指の下限（44px）を割らない**（K-1185。★保護者はスマホで押す）。
 *   ★★**押せないカードには使わない**（★`--hover` と組で使う）。
 * ★`--edge` … ★★**左の縁 3px で種別を示す**（★実例 = 振替のコマ）。
 *   ★★**色は指定しない。★`--ies-card-edge` を渡す**（★既定は緑）＝ 新しい色を作らずに済む。
 *   ★★**縁は「別の意味」を足すもの**であって、★飾りではない（★色だけに頼らず、中の文言でも分かること）。 */
.ies-card--l    { min-height: var(--cl-tap-l, 44px); }
.ies-card--edge { border-left: 3px solid var(--ies-card-edge, var(--ies-jade-dark)); }
/* ★★★2026-09-06: **枠の色で「いま注目させたい面」を示す段**（★`--edge` は *左の縁* だけ・こちらは *枠ぜんたい*）。
 * ★★**なぜ足したか**: ★画面が `border-primary/30` `border-accent/30`（Tailwind）を
 *   ★★**部品の上に重ねて書いていた**（★実測 = 4 か所）。
 *   ★★**Tailwind は部品より後に読まれるので、★重ねた 1 語が必ず勝つ**（★門 `nb-test-ui-kit` の D）。
 *   ★★＝ 同じ意味の指定が 2 つの正本を持つ形。★★**部品の側に段を作って 1 本にした。**
 * ★★**濃さは「30%」ではなくトークンの淡い色**（★`/30` のような不透明度を新しく作らない）。
 * ★★**色だけに頼らないこと**（★上の `--edge` と同じ約束）——★中の文言でも分かるようにする。 */
.ies-card--tone-primary { border-color: var(--ies-jade); }
.ies-card--tone-accent  { border-color: var(--ies-coral, var(--ies-accent)); }
/* ★カードの中の 3 段（★見出し／中身／操作）。★`--flush` と組んで使う。 */
.ies-card__head {
  display: flex; align-items: center; gap: var(--ies-sp-3);
  margin-bottom: var(--ies-sp-4);
}
.ies-card__head-title { margin: 0; font-size: 1rem; font-weight: 700; color: var(--ies-text); min-width: 0; }
.ies-card__head-actions { display: flex; align-items: center; gap: var(--ies-sp-2); margin-left: auto; }
.ies-card__body { min-width: 0; }
.ies-card__foot {
  display: flex; align-items: center; justify-content: flex-end; gap: var(--ies-sp-2);
  margin-top: var(--ies-sp-4); padding-top: var(--ies-sp-3);
  border-top: 1px solid var(--ies-border);
}
/* ★★2026-10-22（K-2178 ②2・7・15・21・部品化の続き）: **余白ゼロのカード（`.ies-card--flush`）の中の「頭の帯」「足の帯」「本体の余白」**。
 *   ★なぜ要るか（②7 の「在る `__head` `__body` `__foot` で足りるか」の答え = **足りない・値が違う**）: 上の 3 つは **余白のあるカード用**。
 *     `__head` は下に 16px あけるだけで **罫も横の余白も持たない**／`__foot` の罫は **内側**（上に 16px あけてから 12px 詰めて罫）でカードの端まで届かない／`__body` は余白を持たない。
 *     flush のカードの中の頭と足は「カードの端から端までの罫 ＋ 自前の横の余白」で、生徒設定・報告書を書く・報告書の部品・保護者の確認書・講師トップの申請が **それぞれ手書き**していた。
 *   ★`.ies-card__bar` = **帯**（縦 12 × 横 16px・罫は下に 1 本）。頭の帯が既定。`--foot` = 足の帯（罫が上・頁送りや金額のまとまり）。`--plain` = 罫なし（合計の行など・余白だけ同じ帯にそろえる）。
 *     ★値の出どころ（★新しい値を作っていない）= 手書きの `px-4 py-3 border-b|border-t border-border`。保護者の確認書（科目の頭・教材・金額・合計）と保護者の予定の月ナビが、この値で **ぴったり**書かれていた綴り（5 か所・使われている数が最多）。
 *       余白は rem（`--cl-sp-3` ＝ `py-3`・`--cl-sp-4` ＝ `px-4`・個人設定の文字の大きさに追従）、罫は `--ies-border`（`border-border` が引く `--cl-border` と明暗とも同値）。
 *     ★割れていた値は最多の側へそろえた（★その画面は見た目が少し変わる）= 横は 16px が 8 か所（保護者の確認書 4・保護者の予定 3・保護者ホーム 1）／ 20→24px（`px-5 sm:px-6`）が 7 か所（報告書を書く・報告書の部品 4・生徒設定 3）。縦は 12px が 8 か所で最多（報告書を書くの 16・生徒設定の 14 は 12 へ）。
 *     ★★保護者の確認書の約束（`page-guardian-entry.php` の合計の注記）= 科目の小計と合計の **金額の右端を縦にそろえる**。★科目の足（金額）と合計の行の **両方がこの 1 つの横の余白を読む** ＝ 片方だけ動いて右端がずれることがない。
 *     ★並べ方（`flex`・`gap`・`items-*`・`justify-between`）と地（`bg-surface`・`bg-primary/5`）と罫の色の上書き（`border-primary/30`）は持たない（中身は画面が書く）。
 *     ★題を持つ頭（`<h2>` ＋ 右の塊）は在る `.ies-sec-head--card-head`（`nb_section_head( variant => 'card-head' )`・縦 16 × 横 24 ／ スマホ 12 × 16）。この帯は題の口を持たない頭と足（並びは画面が書く）。
 *   ★`--slim` = **縦の余白ゼロの帯**（講師トップの申請フォームの頭 ＝ 題 ＋ 「閉じる」〔押せる高さ 44px〕の 1 行）。縦 0 × 横 12px・罫は 40%（`.ies-rows` の区切りと同じ濃さ）。
 *     ★高さは中の押しもの 44px ＋ 罫 1px ＝ **45px のまま**。★帯（縦 12 × 横 16px）や行の部品（`.ies-row` 縦 10）で代えると 69px / 65px に伸びるので、別の段にした。`--foot` とは組まない（頭だけ）。
 *   ★`.ies-card__pad` = **本体の余白 20px**（`p-5`・`--cl-sp-5`）。flush のカードの頭の下に置く本体（個人設定 4・予約の行事 1・生徒設定の本体）。
 *     ★★帯の横（16px）と本体の横（20px）は **4px ずれる**所がある（旧が帯も 20px でそろっていた生徒設定の 3 枚）。そろえるなら帯の横を 20px に上げる 1 行で足りる（その場合は保護者の 8 か所が 4px 広がる・決めるのは親）。
 *   ★渡さなければ（この class を使わない画面は）出力は 1 バイトも変わらない。
 *   ★画面に `px-*` `py-*` `border-b` `border-t` `border-border` `p-5` `sm:px-6` を残すと、後に読まれる Tailwind が勝つ ＝ 置き換えるときは消す（地 `bg-*`・並び `flex`・罫の色 `border-primary/30` は残してよい）。 */
.ies-card__bar {
  padding: var(--cl-sp-3, 0.75rem) var(--cl-sp-4, 1rem);
  border-bottom: 1px solid var(--ies-border);
}
.ies-card__bar--foot { border-bottom: 0; border-top: 1px solid var(--ies-border); }
.ies-card__bar--plain { border-bottom: 0; }
.ies-card__bar--slim {
  padding: 0 var(--cl-sp-3, 0.75rem);
  border-bottom-color: color-mix(in srgb, var(--ies-border) 40%, transparent);
}
/* ★★2026-10-22（K-2178・部品を足す 2・RB1 ⑭）: `--sub` = **薄い小見出しの帯**（月の見出しなど・縦 6 × 横 16px・罫は下）。
 *   ★なぜ: 保護者の授業予定の「N 月」の帯が `ies-label ies-label--mute px-4 py-1.5 bg-surface border-b border-border` の手書きだった。帯の既定（縦 12）で寄せると 12px 高くなり、`--slim`（縦 0）では足りない ＝ その間の段が無かった。
 *   ★値の出どころ（★新しい値を作っていない）= 手書きの `py-1.5`（0.375rem・Tailwind と同じ rem）・`px-4`（`--cl-sp-4`）。罫（下に 1px）は `.ies-card__bar` のまま（手書きの `border-b border-border` と明暗とも同値）。
 *   ★地（`bg-surface`）は持たない（帯の約束 ＝ 地は画面が書く）。`--foot` `--plain` `--slim` とは組まない（頭の帯の縦の段を選ぶ口）。
 *   ★渡さなければ出力は 1 バイトも変わらない。★画面に `px-4` `py-1.5` `border-b` `border-border` を残すと、後に読まれる Tailwind が勝つ ＝ 置き換えるときは消す。 */
.ies-card__bar--sub { padding: 0.375rem var(--cl-sp-4, 1rem); }
.ies-card__pad { padding: var(--cl-sp-5, 1.25rem); }
/* ★★2026-10-22（K-2178・部品を足す 2・RB2 ④⑤）: 本体の余白の段 2 つ（どちらも完全な宣言 ＝ 単独でも `.ies-card__pad` と組んでも同じに出る）。
 *   ★`--s` = 12px 四方（講師トップの申請フォーム 3 つが `p-3 space-y-3` の手書き）。在る `.ies-card__pad`（20px）に替えなかった訳 = ①頭の帯 `.ies-card__bar--slim` の横が 12px なので本体の左端が帯の題と 8px ずれる ②幅 375px で入力欄の列が狭まり日付欄の字が切れる恐れ（コード読み・未測定）。
 *   ★`--below-head` = 上 0・左右と下 12px（見出しの口の直下に置く本体 ＝ 週ごとの表の外側・給与明細の内訳）。`--s` と別にした訳 = 上が 0 の形で、`p-3` では上に 12px 増える。
 *   ★値の出どころ（★新しい値を作っていない）= 手書きの `p-3` ／ `px-3 pb-3`（どちらも `--cl-sp-3` ＝ 0.75rem）。
 *   ★上を 4px にしたい形（給与明細の内訳 `px-3 pb-3 pt-1`）は `pt-1` を画面に残す（後に読まれる Tailwind が勝つ）。★渡さなければ出力は 1 バイトも変わらない。★置き換えるときは `p-3` ／ `px-3 pb-3` を消す。 */
.ies-card__pad--s { padding: var(--cl-sp-3, 0.75rem); }
.ies-card__pad--below-head { padding: 0 var(--cl-sp-3, 0.75rem) var(--cl-sp-3, 0.75rem); }
/* ★★2026-10-22（K-2178 ②12・部品化の続き）: **区切り線**（上に罫を 1 本・前の中身との間と罫の下を 12px ずつあける）。
 *   ★なぜ: 前の中身と下の中身の間に罫を引く手書き `mt-3 pt-3 border-t border-border` が、保護者の確認書・給与明細・シフト希望・報告書・静的ページに別々の濃さ・間で散らばっていた（13 か所）。
 *   ★値の出どころ（★新しい値を作っていない）= 手書きの `mt-3`（0.75rem）・`pt-3`（0.75rem）・`border-t border-border`（罫の 100%）。余白は rem（`--cl-sp-3`）、罫は `--ies-border`。
 *     ★割れ = 罫の濃さ（100% が 9・60% が 1・40% が 3）と間（上 12 × 下 12 が 5・20 × 20 が 1・20 × 16 が 2・32 × 24 が 2〔静的ページ〕・ほか 3）。最多の側へそろえた ＝ 差が 4px を超える 8 か所は寄せない。
 *   ★渡さなければ出力は 1 バイトも変わらない。★画面に `mt-*` `pt-*` `border-t` `border-border` を残すと、後に読まれる Tailwind が勝つ ＝ 置き換えるときは消す。 */
.ies-rule {
  margin-top: var(--cl-sp-3, 0.75rem);
  padding-top: var(--cl-sp-3, 0.75rem);
  border-top: 1px solid var(--ies-border);
}
/* ★★2026-10-22（K-2178・部品を足す 2・RB1 ②）: **左右 4px の内側の余白**（節の見出しの字の頭にそろえる印）。★字の役（`.ies-label` `.ies-caption`）や並びの行と **掛け合わせて使う軸**（`.ies-num` `.ies-ink-warn` と同じ考え・大きさも色も決めない）。
 *   ★なぜ: 保護者の授業予定の画面の件数の行・注記・日付の見出しの行が、節の見出し（`.nb-gsec > .ies-sec-head` は左右 4px）の字の頭にそろえるために `px-1` を手書きしていた（`ies-label px-1` ／ `ies-caption px-1` ／ `flex items-center gap-2 px-1`）。
 *   ★値の出どころ（★新しい値を作っていない）= 手書きの `px-1`（0.25rem ＝ `--cl-sp-1`）。`.nb-gsec > .ies-sec-head` の `padding-inline`（`--ies-sp-1` ＝ 4px）と同じ幅で、個人設定の文字の大きさに追従するところだけ手書きの `px-1` と同じ（rem）。
 *   ★上下は持たない（`px-1 pt-2` のように上を足す画面は `pt-2` を残す）。★渡さなければ出力は 1 バイトも変わらない。★置き換えるときは `px-1` を消す。 */
.ies-inset { padding-inline: var(--cl-sp-1, 0.25rem); }
/* ★★2026-10-22（K-2178・部品を足す 2・RB3）: **丸い点の箇条書き**（`ul` の字の頭に ● を出す・左に 16px）。★字の役（`.ies-caption` `.ies-caption--ink` `.ies-caption--long` ほか）と掛け合わせる軸 ＝ 大きさ・色・行間は持たない。
 *   ★なぜ: 削除の確認窓・社員の生徒管理・経営の入力の注意書きの一覧が、手書き `list-disc pl-4` を 6 か所に別々に書いていた。
 *   ★値の出どころ（★新しい値を作っていない）= 手書きの `list-disc`（`list-style-type: disc`）＋ `pl-4`（`--cl-sp-4` ＝ 1rem）。★2 宣言とも要る（Tailwind の preflight が `ul` を `list-style: none; padding: 0` にしているため・preflight を読まない画面では既定の余白が残る ＝ 手書きと同じ）。
 *   ★渡さなければ出力は 1 バイトも変わらない。★画面に `list-disc` `pl-4` を残すと、後に読まれる Tailwind が勝つが同じ値なので見た目は変わらない ＝ 置き換えるときは消す。 */
.ies-list--disc { list-style-type: disc; padding-left: var(--cl-sp-4, 1rem); }
/* ★★2026-10-21 夜（W-642・部品化の続き・相澤さん「部品の足しを今すぐ始めて」）: **画面の下に貼る「足」**（返信欄・送信欄の入れ物）。
 *   ★なぜ: お問い合わせ（社員）の返信欄の足が 3 か所（読むだけ・返信できる・返信できない）とも `px-5 py-4 border-t border-border bg-white flex-shrink-0`（18 語）の手書きだった。
 *     ★`.ies-modal__foot` は窓の足（地が `--ies-bg`・横 24px・下の角の丸めを器に任せる）、`.ies-card__foot` はカードの中の足（上に余白＋罫・右寄せ）で、どちらも画面の下に貼る足には合わない。
 *     ★保護者のお問い合わせの `nb-inq-bar`・講師のシフト希望の下の帯も同じ形の手書き（★この部品へ寄せるのは各画面を触る便・いまは当てていない）。
 *   ★値の出どころ（★新しい値を作っていない）= 手書きの Tailwind の語と同じ値: `px-5`（横 1.25rem）・`py-4`（縦 1rem）・`border-t border-border`（上に 1px の罫・色は `--ies-border`＝ `border-border` が引く `--cl-border` と明暗とも同値）・
 *     `bg-white`（地は白・暗い配色は `[data-theme="dark"] .bg-white` と同じ `--ies-surface`）・`flex-shrink-0`（縦に並べた箱の中で縮まない ＝ 長い会話に押されて足が潰れない）。
 *     ★余白は `--cl-sp-4` / `--cl-sp-5`（rem・個人設定の文字の大きさに追従）。★portal 層の `--ies-sp-5` は 24px で別の値（tokens.css の警告のとおり）なので使わない。
 *   ★並べ方（中の `flex`・`gap`）は持たない（★中身は画面が書く）。★渡さなければ（この class を使わない画面は）出力は 1 バイトも変わらない。
 *   ★画面に `px-*` `py-*` `border-t` `bg-white` `flex-shrink-0` を残すと、後に読まれる Tailwind が勝つ ＝ 置き換えるときは消す。 */
.ies-page-foot {
  flex-shrink: 0;
  padding: var(--cl-sp-4, 1rem) var(--cl-sp-5, 1.25rem);
  border-top: 1px solid var(--ies-border);
  background-color: var(--ies-surface, var(--cl-surface, #fff));
}
/* ★★2026-10-22（K-2178・部品を足す 2・RB2 ⑥⑦⑧）: **画面の下に貼りつく帯**（`--fixed`）と、その中身の幅（`__inner`）・帯の高さぶんの空き（`__space`）。
 *   ★なぜ: 講師のシフト希望の画面の下の帯（固定シフト・月ごとの調整の 2 か所）が `fixed bottom-0 left-0 right-0 z-30 border-t border-border bg-white/95 backdrop-blur-sm` ＋ `max-w-3xl mx-auto px-4 py-3` ＋ `.nbsr-bar-space`（画面専用 CSS）の手書きだった。
 *   ★上の `.ies-page-foot`（流れの中・不透明・縦 16 × 横 20px）との関係: `--fixed` は **これの修飾子**（組んで使う: `ies-page-foot ies-page-foot--fixed`）。貼りつく・半透明・ぼかしを足し、**余白は 0 にして `__inner` に持たせる**（上の縦 16 × 横 20px を持つと帯が 69 → 77px になり、下の `__space`（4.5rem ＝ 72px）を超えて表の最後の行が帯の下に隠れる）。★上の `.ies-page-foot` を直さない（返信欄の 3 か所が使う）。
 *   ★値の出どころ（★新しい値を作っていない）= 手書きの `fixed bottom-0 left-0 right-0 z-30`（30）・`border-t`（上の罫は上の `.ies-page-foot` が持つ）・`backdrop-blur-sm`（4px）・`max-w-3xl mx-auto`（48rem）・`px-4 py-3`（`--cl-sp-4` / `--cl-sp-3`）。`__space` の 4.5rem は `pages/shift-request.css` の `.nbsr-bar-space` の根拠のまま（帯は標準 69px ＝ 4.3rem・文字の大きさ「特大」で 90.6px ＝ 4.0rem・167% で 107.9px ＝ 4.0rem ＝ どれも 4.5rem に収まる・押す所の 44px は px なので rem より伸びない）。
 *   ★★面の色だけは手書きの写しではない（直る側の変化）: 手書きの `bg-white/95` は暗い配色の置き換えが無い（下の `[data-theme="dark"] .bg-white` は `.bg-white` だけで、半透明の `bg-white/95` は別のクラス名）＝ 暗い配色で白いまま帯が浮いていた疑い（コード読み・未測定）。
 *     部品は面のトークン `--ies-surface` の 95%（`color-mix`）で作る ＝ 明るい配色は白の 95% で手書きと同じ・暗い配色は面の色（`#1e1e22`）になる。
 *   ★帯の中の並び（`flex items-center gap-3`）は持たない（中身は画面が書く）。★`__space` は帯の直前に 1 つ置く（流れの中の空き）。
 *   ★渡さなければ（この class を使わない画面は）出力は 1 バイトも変わらない。★置き換えるときは `fixed` `bottom-0` `left-0` `right-0` `z-30` `border-t` `border-border` `bg-white/95` `backdrop-blur-sm` ／ `max-w-3xl` `mx-auto` `px-4` `py-3` を消す。 */
.ies-page-foot--fixed {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 30;
  padding: 0;
  background-color: color-mix(in srgb, var(--ies-surface, var(--cl-surface, #fff)) 95%, transparent);
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
}
.ies-page-foot__inner {
  max-width: 48rem;
  margin-left: auto;
  margin-right: auto;
  padding: var(--cl-sp-3, 0.75rem) var(--cl-sp-4, 1rem);
}
.ies-page-foot__space { height: 4.5rem; }
/* ★★2026-10-21（K-2174・W-304 ②）: カードの中の一覧の行（★旧 = 画面ごとの手書き `px-3〜5 py-2〜4 border-b border-border/40 last:border-b-0 hover:bg-surface` ＝ 余白が 10 通り・約 15 画面）。
 *   ★値 = 縦 10 × 横 12（相澤さんの窓の答え・絵 docs/ui/screens/部品化-2026-10-21/q1.png）。★撫でたとき = 面に主色 10%（docs/ui/system/hover.md §2 ②・旧の「灰の地へ寄る」向きから変わる）。
 *   ★`.ies-rows` = 行を並べる箱（`.ies-card--flush` の中など）。子どうしの間にだけ区切り線（★旧 `border-b … last:border-b-0`・`divide-y divide-border/40` と同じ色 = 罫の 40%）。
 *   ★`.ies-row` = 1 つの行の余白だけ（並びの語 flex・gap・items-* は画面が書く）。押せる行（a・button・`--hover`）だけ撫でた色が付く。★`--l` = 押せる高さ 44px（K-1185）。
 *   ★画面に `px-*` `py-*` `border-b` `hover:bg-*` を残すと、後に読まれる Tailwind が勝つ ＝ 置き換えるときは消す。★渡さなければ出力は 1 バイトも変わらない。 */
.ies-rows > * + * { border-top: 1px solid color-mix(in srgb, var(--ies-border) 40%, transparent); }
.ies-row { padding: var(--cl-sp-2-5, 0.625rem) var(--ies-sp-3); }
.ies-row--l { min-height: var(--cl-tap-l, 44px); }
/* ★★2026-10-22（K-2178・部品を足す 2・RB1 ⑪⑫⑭）: 行まわりの小さな部品 3 つ。
 *   ★`.ies-tap--l` = **押せる高さの床 44px だけ**（`.ies-row--l` と同じ値 `--cl-tap-l`）。★なぜ: 行（`.ies-row`）の中の段〈時刻 ＋ 科目 ＋ 状態の札の 1 段など ＝ 状態によって押すものが入る・入らない〉や、行ではない `flex items-center gap-2` の段が、高さをそろえるために `min-h-[44px]` を手書きしていた（保護者ホーム・報告書の部品ほか 5 か所）。
 *     ★`.ies-row--l` を借りなかった訳 = `.ies-row` の縦 10 × 横 12px の余白まで付いてくる（行でない段に余白が増える）。★`.ies-check` の中には組まない（`.ies-check` の高さ 32px が後ろで勝つ ＝ そこは `.ies-check--l`）。
 *   ★`.ies-row--tint` = **行の淡い地**（ページの地 `--cl-bg` ＝ 明 #F2F2F2・暗い配色は追従 ＝ 手書きの `bg-surface` が引く先と同じ）。★なぜ: 授業予定の「この先さらに」の足の行が、行と区別する印に `bg-surface` を手書きしていた。★撫でた色（`a.ies-row:hover` ・0,2,1）は地より強い ＝ 手書きのときと同じ順。
 *   ★`.ies-row__go` = **行の右端の「›」の包み**（縮まない ＋ 控えめの灰 `--cl-muted`）。★なぜ: 行の右端の矢印〈`ri-arrow-right-s-line`〉が `flex-shrink-0 text-muted` の手書きで 7 か所（保護者ホーム 3・講師トップ 3・保護者の報告書 1）。`<span class="ies-row__go">絵</span>` でも、絵の口の class に渡しても同じ（絵は色を継ぐ）。
 *     ★名前に `row` を付けたが、置き場は行の中に限らない（保護者ホームの問い合わせの札はカードの中）＝ 値は同じ。
 *   ★値の出どころ（★新しい値を作っていない）= 手書きの `min-h-[44px]` ／ `bg-surface`（`rgb(var(--cl-bg-rgb, 242 242 242))`）／ `text-muted`（`rgb(var(--cl-muted-rgb, 99 109 126))`）と同じ変数。
 *   ★3 つとも渡さなければ出力は 1 バイトも変わらない。★置き換えるときは `min-h-[44px]` ／ `bg-surface` ／ `flex-shrink-0 text-muted` を消す。 */
.ies-tap--l { min-height: var(--cl-tap-l, 44px); }
.ies-row--tint { background-color: rgb(var(--cl-bg-rgb, 242 242 242)); }
.ies-row__go { flex-shrink: 0; color: rgb(var(--cl-muted-rgb, 99 109 126)); }
a.ies-row, button.ies-row, .ies-row--hover { transition: background-color .15s; }
/* ★2026-10-21 夜（W-643 ②の担当 GHR の気づき・相澤さん「直す」）: 撫でた色はマウスのある画面だけ（★触る画面では押した後に色が残るため・旧の保護者ホームと同じ守り）。★パソコンの見た目は変わらない。 */
a.ies-row:hover, button.ies-row:hover, .ies-row--hover:hover { text-decoration: none; }
@media (hover: hover) {
  a.ies-row:hover, button.ies-row:hover, .ies-row--hover:hover { background: color-mix(in srgb, var(--ies-jade) 10%, var(--ies-surface)); }
}
/* ★2026-09-24（K-1870）: ボタンの置き場（全画面で共通）。★並びは「やめる → 主」＝ 主が右端。
   ★狭い画面で主を上に全幅にするときは `--stack` を足す（★規則は覆いの足 `.ies-modal--sheet` と同じ @media の中に 1 つ）。 */

/* --- ②統計（数字を 1 つ大きく見せる箱） ---------------------
 * ★`.ies-card__title` / `__value` の組は**使用 0 件**だった（★実測 2026-08-30）。
 * ★実際に手書きされているのは「小さい見出し ＋ 等幅の大きな数 ＋ 補足」の 3 段。
 * ★★**旧 2 語は消さずに残し**（★他所から参照されうる）、★新しく書くときはこちらを使う。 */
.ies-stat {
  background: var(--ies-surface);
  border: 1px solid var(--ies-border);
  /* ★★2026-08-31（K-1249）: 16px → **12px**（★面はすべて 12px）。 */
  border-radius: var(--ies-radius-md);
  padding: var(--ies-sp-4);
  box-shadow: var(--ies-shadow-sm);
}
/* ★文字の刻みは 12 / 14 / 16 / 18 / 20 / 24px（★Tailwind の既定と同じ）。★13px を作らない
   （★2026-08-30・`impeccable` の検出器が拾った。★親が刻みの外の値を書いていた）。 */
.ies-stat__label { font-size: 0.75rem; font-weight: 700; color: var(--ies-text-mute); }
/* ★2026-08-30（K-1230）: 長い値を入れると **30px → 270px** に伸びて器を壊していた。 */
.ies-stat__value {
  font-family: var(--ies-font-mono); font-size: 1.5rem; font-weight: 700;
  color: var(--ies-text); line-height: 1.25;
  min-width: 0; overflow-wrap: anywhere;
}
.ies-stat__sub { font-size: 0.75rem; color: var(--ies-text-mute); }
/* ★★2026-08-30（K-1230）: 名前を **向き（up/down）から 善し悪し（good/bad）へ**変えた。
 *   ★★**なぜ** = ★「欠席 7 ／ ↓2」を赤で出していた。★**欠席が減ったのに赤**。
 *   ★向きで名前を付けると、呼ぶ側が「どちらが良いか」を表現できない。
 * ★★**色だけに頼らないこと**（★矢印や語を必ず添える）。 */
.ies-stat__value--good { color: var(--ies-jade-dark); }
.ies-stat__value--bad  { color: var(--ies-coral-ink); }
/* ★★2026-10-22（K-2178・部品を足す 2・RB2 ⑨）: `--tight` = **行間を詰める段**（行間 1 ＝ 手書きの `leading-none`）。
 *   ★なぜ: 講師のシフト希望の画面の下の帯の数（2 か所）は、数の字だけ `.ies-stat__value` を借り（面は借りない）、帯の高さ 69px を保つために `leading-none` を画面に残していた（部品の既定 1.25 だと帯が 2px 伸びる）。
 *   ★値の出どころ（★新しい値を作っていない）= 手書きの `leading-none`（`line-height: 1`）。★`.ies-stat__value` の後ろに置いた ＝ 同じ詳細度で勝つ。
 *   ★渡さなければ出力は 1 バイトも変わらない。★置き換えるときは `leading-none` を消す。 */
.ies-stat__value--tight { line-height: 1; }

/* Grid */
.ies-grid { display: grid; gap: var(--ies-sp-4); }
.ies-grid--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
/* ★★2026-08-30（K-1230）: `1fr` → `minmax(0, 1fr)`。★★**3 列だけがこの形になっていなかった。**
 *   ★実測 = 折り返さない中身を 1 つ入れると 列が **129/129/129 → 498/41/41** に崩れ、
 *   ★★**器から 192px はみ出した**（★陰性対照 = 同じ操作を 2 列でやると動かない）。 */
.ies-grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.ies-grid--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
@media (max-width: 820px) {
  .ies-grid--3 { grid-template-columns: 1fr; }
  .ies-grid--4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 560px) {
  .ies-grid--2 { grid-template-columns: 1fr; }
  .ies-grid--4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
/* ★2026-09-30（担当 ADM の気づき）: 格子の中のカードは「縦に積むための余白」`.ies-card + .ies-card { margin-top: 16px }` を消す。
 *   ★無いと 1 行の中で 2 枚目以降だけ 16px 下がり、上端がずれる（★設定の一覧が 2026-09-05 に実測して画面の CSS で消していた = settings-hub.css）。
 *   ★詳細度は同じ (0,2,0) で、この規則が後ろに在るので勝つ。★間は格子の gap が持つ。 */
.ies-grid > .ies-card { margin-top: 0; }

/* Button */
/* ★★★2026-08-29 (K-1218): ボタンを **S / M / L の 3 段**にした。
 *
 * ★★**なぜ**: 相澤さんの逐語（2026-08-28・K-1185 に記録）=
 *   「ボタンも **SML みたいに 3 つのコンポーネント**っていうのかな？ を
 *    **あらかじめ設計しておいて、ケースごとにどれ使おうかな？** みたいにやるといい」
 *   ★★K-1185 は**当たり判定の 3 段を定義しただけ**で、★**ボタンそのものは 3 段になっていなかった**。
 *
 * ★★**実測（2026-08-29・親）**:
 *   ・`.ies-btn` の使用 = **60 か所**。★旧 padding `10px 18px` ＝ **高さ約 40px**
 *     ＝ ★★**K-1185 が「廃止する」と決めた 40px そのものだった。**
 *   ・★★**`.ies-btn--sm` は 7 ファイル・21 か所で使われているのに、CSS の定義が 0 件**
 *     （★陽性対照 = `--ghost` は 3 件定義が在る）。★★**21 か所の「小さいボタン」は小さくなっていなかった。**
 *   ・★**Tailwind で手書きされたボタンらしき行 = 473 行**（★`px-*` ＋ `py-*` ＋ `rounded` ＋ `bg-*`）。
 *     ★多い順の padding = `px-3 py-2`(118) / `px-4 py-3`(42) / `px-3 py-1.5`(42) / `px-4 py-2`(32)。
 *     ★★**＝ 部品が無いのではなく、部品が使われていない**（★60 対 473）。
 *
 * ★★**値の正本は `--cl-tap-s/m/l`（`header.php`）。★ここは控え付きで参照する。**
 *   ★理由 = ★★**`--cl-*` は社員サイト（`templates/page-*.php`）には配られていない**
 *     （★実測 = 見本帳が焼き込む CSS の `:root` に `--cl-*` が 1 つも無い）。
 *   ★控えを書かないと、社員サイトで**黙って高さが無くなる**。★この作法は
 *     `settings-shell.css` が既に採っている（★「外の層が配っていなくても控えで動く」）。
 *
 * ★★**この節が見ないもの**: ★実ブラウザでの見え方。★見本帳 = `docs/ui/tools/preview/components.html`
 *   （`bash docs/ui/tools/build-dash-preview.sh components` で作り直す）。★★**測ってから反映すること**（K-1216）。
 */
.ies-btn {
  display: inline-flex; align-items: center; justify-content: center;
  gap: var(--ies-sp-2);
  /* ★M（既定・32px）。★K-1185 =「M = 32px … **既定。迷ったらこれ。**」 */
  min-height: var(--cl-tap-m, 32px);
  /* ★余白は刻み（`--ies-sp-*`）に載せる。★高さは min-height が決めるので、
     ★padding は「刻みに載っていて、min-height を超えない」ことだけを満たせばよい。 */
  padding: var(--ies-sp-1) var(--ies-sp-4);
  line-height: 1.4;
  /* ★★★2026-09-13（K-1707）: **押しものの字は折り返さない。**
     ★★実測（担当 SAL・給与明細の見本）= 幅の足りない升に置いた「上書き」が
       ★★**3 行・68.8px** に折り返し、★行の高さがその 1 つのために 2 倍以上になっていた。
     ★★**押しものは「1 つの的」である** ——★折り返した瞬間、★的の形が中身の字数で決まる
       （★`acceptance.md` の段 S24/M32/L44 が意味を失う）。
     ★★入り切らないときは **親が幅をどうにかする**のが正しい（★器の話）。★部品は折らない。
     ★★先例 = `.ies-badge`（:1104）・`.ies-chip`（:1253）は元から `nowrap` を持っている
       ——★**押しものだけが持っていなかった**（★兄弟の非対称）。 */
  white-space: nowrap;
  border-radius: var(--ies-radius-sm);
  /* ★★K-1219（2026-08-30）: 地を `--ies-jade`(#00A86B) → `--ies-jade-dark`(#00794E) にした。
     ★★**理由は好みではなく数**: ★白文字 × #00A86B = **3.08:1** で 4.5:1 を満たしていなかった。
     ★#00794E なら **5.46:1**（★実測・ブラウザ）。★★**新しい色は作っていない**——
     ★同じ画面の輪郭ボタンの文字色が元からこの色だった。★相澤さんのご決定（2026-08-30）。 */
  border: 1px solid var(--ies-jade-dark);
  background: var(--ies-jade-dark);
  color: var(--ies-surface); font-weight: 700;
  cursor: pointer; transition: background .15s, transform .05s;
}
/* ★S = 24px。★K-1185 =「**周りを別の当たり判定が隙間なく囲んでいる**場所にだけ」。
   ★★単独で置かない（★外すと指が空を切る）。 */
.ies-btn--s {
  min-height: var(--cl-tap-s, 24px);
  padding: var(--ies-sp-1) var(--ies-sp-3);
  /* ★行の高さを 1 にする理由 = 12px × 1.4 ＝ 16.8px に上下の 4px を足すと 24.8px となり、
     ★min-height の 24px を **超えてしまう**（★min-height は縮められない）。★実測で確かめた。 */
  line-height: 1;
  font-size: .75rem;   /* 12px = 受け入れ条件の下限。★これ以上小さくしない */
  font-weight: 700;
}
/* ★★★`--sm` は **M（32px・基本形と同じ）**。★★S ではない。
 *
 * ★★**2026-08-30 訂正: 親は当初これを `--s`（24px）の別名にした。★誤りだった。**
 *   ★★**別の頭の指摘で判明**（★レビュー担当・2026-08-30）:
 *     ★`--sm` の使用 25 か所には「保存する」「キャンセル」「**選択を完全に削除**」など
 *     ★★**単独で押すボタン**が含まれる。★受け入れ条件（`docs/ui/system/acceptance.md`）は
 *     ★★**S を「周りを別の当たり判定が隙間なく囲んでいる場所にだけ」**と定めており、
 *     ★★**これらに S を当ててはいけない。**
 *   ★★**親の推論のどこが誤っていたか**: ★「`--sm` は small だから S」と読んだ。
 *     ★★**実際は「既定より小さく」の意味**だった——★当時の既定は約 47px なので、
 *     ★★**作者が求めていたのは 32px（いまの M）である。**
 *   ★★**門は全部緑だった。★門は高さを見ていない。**（★K-1216 と同じ形）
 *
 * ★いまの扱い = **基本形と同じ M**。★宣言を持たせないことで、`.ies-btn` の値がそのまま効く。
 * ★★**新しく書くときは使わない**（★`--s` / なし（M）／ `--l` から選ぶ）。
 * ★★**次に触る画面から 1 つずつ振り分けて、この別名を消していく。** */
.ies-btn--sm { /* ★M（基本形と同値）。★宣言を足さない＝ `.ies-btn` の 32px がそのまま効く */ }
/* ★L = 44px。★K-1185 =「**単独で押すもの**。主要な確定ボタン・ヘッダーのアイコンボタン」。 */
.ies-btn--l {
  min-height: var(--cl-tap-l, 44px);
  padding: var(--ies-sp-2) var(--ies-sp-5);
}
/* ★★2026-08-29 (K-1218): `--primary` と `:disabled` を**画面ごとの CSS から共通へ引き上げた**。
 * ★★**なぜ**（★実測）: `.ies-btn--primary` は **9 ファイル・15 か所**で使われているのに、
 *   ★★**共通の components.css に定義が 0 件**で、`assets/css/pages/schedule.css` にしか無かった。
 *   ★★**＝ schedule.css を読み込まない画面では、`--primary` は何もしていなかった**
 *   （★`--sm` が 21 か所で効いていなかったのと**同じ型**。★これで 2 件目）。
 * ★★**`:disabled` は基本形に置く。**★どのボタンも押せなくなることが在るのに、
 *   ★旧実装は `--primary` にしか無かった（★`--ghost` や `--danger` は押せないときの見た目が無かった）。 */
.ies-btn--primary {
  background: var(--ies-jade-dark);
  color: var(--ies-surface);
  border-color: var(--ies-jade-dark);
}
/* ★★2026-08-30（K-1230）: 押せないときは **役に関係なく同じ平らな灰**にした。
 *   ★★**旧実装は `opacity:.6` だけ**で、★地の色が役ごとに違うため**薄まり方も違った**
 *     （★白地に重ねた計算値 = 主要 2.6:1 ／ 輪郭 2.6:1 ／ 削除 2.8:1 ／ ★**二次だけ 4.5:1**）。
 *   ★★**＝ 押せない二次が、押せない主要より読みやすい**という逆転が起きていた。
 *   ★新実装 = 地 `--ies-surface-alt` ／ 文字 `--ies-text-sub`（★**6.08:1**・読めるが明らかに不活性）。 */
/* ★★★2026-09-19（K-1780）: 押せないものは **地を塗らない・枠と字を 1 段薄くする**（★下の「状態の層」も同じ考え）。
 *   ★★副地の灰（#F8F8F8）は 2026-09-05 に #F4F4F4 から動いたあと **白の面に 1.06・ページの地に 1.05** ＝ 見えていなかった
 *     （★見える差の床 1.10・`hover.md` §3）。★効いていたのは 枠（3.36 → 1.28）と字（黒 17.04 → 灰）の変化だけ。
 *   ★★見える灰（罫 `--ies-border`・白に 1.28）で塗る案は、**押せないものが押せるものより重く見える**ので採らなかった
 *     （★反映前の設計レビューの実測 = 見本帳の白の面の上で、目を細めたときの重さ（★代わりの物差し・知覚として検証済みではない）
 *       押せない 1.37〜1.39 ＞ 押せる二次 1.16・輪郭 1.17 ／
 *       押せるようになった瞬間に「軽くなる」逆向き ／ 罫の灰は撫でた地と同じ色 ＝ 1 つの色に 2 つの意味。K-1237 の兆候
 *       「押せないボタンが押せるように見える＝明暗比を上げすぎ」の向き。★WCAG は押せない部品を明暗比の対象外にしている）。
 *   ★値: 地 = 透明（置き場所の地がそのまま見える）／ 枠 = `--ies-border`（白に 1.28・押せる二次 3.36 より薄い）／
 *     字 = `--ies-text-mute`（白 5.22 ／ 地 4.67 ／ 暗 4.54 ／ 4.93 ＝ **この repo の字の床 4.5 は守る**・押せる字より必ず薄い）。 */
.ies-btn:disabled,
.ies-btn[aria-disabled="true"] {
  background: transparent;
  color: var(--ies-text-mute);
  border-color: var(--ies-border);
  opacity: 1;
  cursor: not-allowed;
  filter: none;
}
.ies-btn:disabled:hover,
.ies-btn[aria-disabled="true"]:hover {
  background: transparent;
  border-color: var(--ies-border);
  color: var(--ies-text-mute);
}
/* ★2026-08-30（K-1230）訂正: 下の 2 つは、★上の `:disabled` が役に関係なく同じ見た目になったので
 *   **不要になった**。★★消さずに残すのは、★同じ誤りを繰り返さないため（★下の注記が理由を持つ）。
 * ★★2026-08-30: 「削除」にも同じ逃げ道が要る（★別の頭の指摘で判明）。
   ★★**無いと何が起きるか**: 上の `.ies-btn:disabled:hover`（詳細度 0,3,0）が
     `.ies-btn--danger:hover`（0,2,0）に**勝つ**ので、★押せない削除ボタンにマウスを乗せると
     ★★**地が緑・文字が暗い赤**になる（★コントラスト **1.20:1** ＝ ほぼ読めない）。
   ★★いま画面には出ていない（★`--danger` の使用 2 か所は `disabled` を立てていない）が、
     ★**共通部品の規則そのものが誤っている**ので、次に誰かが押せなくした瞬間に出る。 */
/* ★★2026-09-19（K-1780）訂正: 下の規則は **押せない削除を撫でると、削除の色（淡い赤）に戻していた**
 *   （★詳細度 0,3,0 で上の `.ies-btn:disabled:hover` と同じ・後ろに在るので勝つ）＝「押せないものは何も起きない」（`hover.md` ⑥）に反する。
 *   ★上の注記の心配（撫でると緑の地）は、いまは `.ies-btn:disabled:hover` が塞いでいる。★ここは押せない姿と同じ値に固定する。
 *   ★焼いた 85 画面（2026-09-19・幅 1280）では削除のボタンそのものが 0 個 ＝ 画面に出ている所は見つかっていない。 */
.ies-btn--danger:disabled:hover,
.ies-btn--danger[aria-disabled="true"]:hover {
  background: transparent;
  border-color: var(--ies-border);
  color: var(--ies-text-mute);
}
/* ★K-1219: 地が jade-dark になったので、hover はさらに 1 段。★白文字 × #006843 = 6.86:1。
   ★★暗いテーマでは向きが逆（明るくする）＝ トークン側で入れ替えてある。 */
.ies-btn:hover { background: var(--ies-jade-hover); border-color: var(--ies-jade-hover); text-decoration: none; color: var(--ies-surface); }
.ies-btn:active { transform: translateY(1px); }

/* =========================================================================
 * ★★★状態の層（K-1237・2026-08-30）— **押せる部品ぜんぶに同じ規則を当てる**
 * -------------------------------------------------------------------------
 * ★★**なぜ在るか（★別の頭が実測した）**:
 *   ・★★**押せなくしたときの文字が読めない部品が 4 つ**あった —— ★半透明にするだけの実装で、
 *     ★実測 = 札 **2.23:1** ／ タブ **2.23:1** ／ チェック **3.30:1**（★必要 4.5）。
 *     ★★**同じ直しはボタンに既に入っていた**（★平らな灰 ＝ **6.08:1**）。★**他に配られていなかった。**
 *   ・★★**押した瞬間の手ごたえが、押せる 41 種のうち 29 種に無かった**（★在るのはボタンだけ）。
 *   ・★★**アイコンボタンは押せなくしても見た目が 1 つも変わらなかった**（★`:disabled` の規則が無い）。
 *
 * ★★**規則（★ここが正本。★新しい押せる部品を作ったら、必ずこの 2 つを持たせる）**:
 *   ①**押せない** = 地を塗らない（透明）＋ 1 段薄い字（`--ies-text-mute`・4.5 以上）＋ 枠を持つものは薄い枠（`--ies-border`）
 *     ＋ 絵だけのものは絵を `--ies-border-strong`（3.0 以上）＋ `cursor: not-allowed`。
 *     ★2026-09-19（K-1780）に「平らな灰（副地）＋ 沈めた文字（`--ies-text-sub`）」から変えた（★上の `.ies-btn:disabled` の注記）。
 *     ★★**押せないものは、押せるものより必ず軽く**（★字も絵も、押せるときより明暗比が低い ＝ 門 `tools/nb-test-kit-ground.php` の順位の段）。
 *     ★★**半透明（`opacity`）で表さない**——★文字と地の両方が薄まり、**読めなくなる**。
 *   ②**押した瞬間** = `transform: translateY(1px)`。★★**位置だけ**（★色も大きさも変えない）。
 *     ★「動きを減らす」設定では打ち消す（★下の `prefers-reduced-motion`）。
 * ========================================================================= */
.ies-icon-btn:disabled,
.ies-icon-btn[aria-disabled="true"],
.ies-modal__close:disabled,
.ies-chip__x:disabled,
.ies-toast__action:disabled,
.ies-chip:disabled,
.ies-chip[aria-disabled="true"],
.ies-tab:disabled,
.ies-tab[aria-disabled="true"],
/* ★★★2026-09-13（K-1697）: `.is-disabled` も足した。★★**なぜ** = ★予定登録のモーダルの台本が
   ★`disabled` 属性と **`is-disabled` の両方**で押せないことを表している（★`schedule-modal.js` に 1 か所）。
   ★★属性だけを見ていると、★**台本が片方しか付けない経路で見た目が戻らない**（★押せないのに押せそうに見える）。 */
.ies-tab.is-disabled {
  background: transparent;
  color: var(--ies-text-mute);
  border-color: var(--ies-border);
  opacity: 1;
  cursor: not-allowed;
  filter: none;
}
/* ★撫でても何も起きないこと（★押せないのに反応すると「押せる」と読まれる）
 * ★★2026-09-19（本棚 [738]）: 閉じる ✕・チップの ✕・知らせの押しものを足した。★3 つとも撫でた地の規則（0,2,0）が
 *   押せない姿（0,2,0）より後ろに在って勝ち、押せないのに撫でると地が出ていた（★いま押せなくする呼び出しは 0 件＝前もって塞ぐ）。 */
.ies-icon-btn:disabled:hover,
.ies-icon-btn[aria-disabled="true"]:hover,
.ies-modal__close:disabled:hover,
.ies-chip__x:disabled:hover,
.ies-toast__action:disabled:hover,
.ies-chip:disabled:hover,
.ies-chip[aria-disabled="true"]:hover,
.ies-tab:disabled:hover,
.ies-tab[aria-disabled="true"]:hover,
.ies-tab.is-disabled:hover {
  background: transparent;
  color: var(--ies-text-mute);
  border-color: var(--ies-border);
}
/* ★★2026-09-19（K-1780・反映前レビューの指摘）: **下線型のタブは、撫でると押せる札の姿に戻っていた。**
 *   ★`.ies-tabs--line .ies-tab:hover`（0,3,0・この下の ⑧ に在る）が、上の「撫でても何も起きない」（0,3,0）より後ろに在って勝ち、
 *     字が `--ies-text` に濃くなっていた（★予定登録の窓の編集中 = `schedule-modal.js` が `is-disabled` と `disabled` を付ける）。
 *   ★1 段強い 0,4,0 で、押せない姿のまま固定する。★下線も素のまま（透明）——★上の「撫でても何も起きない」の枠の色（0,3,0）が
 *     下線型の `border-bottom: 2px solid transparent`（0,2,0）に勝ち、撫でると灰の下線が出ていた（★見本帳を撫でて測った・直す前から在った）。 */
.ies-tabs--line .ies-tab:disabled:hover,
.ies-tabs--line .ies-tab[aria-disabled="true"]:hover,
.ies-tabs--line .ies-tab.is-disabled:hover {
  background: transparent;
  color: var(--ies-text-mute);
  border-bottom-color: transparent;
}
/* ★★2026-09-19（K-1780）: **絵だけの押しもの**は、字ではなく絵なので床は 3.0（WCAG 1.4.11）。★押せるときの絵 `--ies-text-mute`（白 5.22）より
 *   1 段薄い `--ies-border-strong`（白 3.36 ／ 地 3.00 ／ 暗 3.38 ／ 3.67）にする。
 *   ★旧は押せない絵が `--ies-text-sub`（輝度 0.107）＝ 押せる絵（0.151）より **濃く**、向きが逆だった
 *     （★月送りの押せない矢印が、押せる矢印より濃く見えていた）。★先例 = `pages/avail-grid.css` の週送り（地なし・絵を薄く）。 */
.ies-icon-btn:disabled,
.ies-icon-btn[aria-disabled="true"],
.ies-modal__close:disabled,
.ies-chip__x:disabled,
.ies-icon-btn:disabled:hover,
.ies-icon-btn[aria-disabled="true"]:hover,
.ies-modal__close:disabled:hover,
.ies-chip__x:disabled:hover { color: var(--ies-border-strong); }
/* ★★2026-10-02（W-032・本棚 [742]・向きは K-1801 の C「押せないものは字の床を緩める」で 9/20 に決定済み）: **押せないタブと、文字だけのボタンの字を、1 段薄く（`--ies-text-mute` → `--ies-border-strong`）。**
 *   ★この 2 つは地も枠も持たない ＝ 押せない合図が字の色しか無く、旧の mute（白 5.22）は押せる字（タブ 6.69・文字だけのボタン 5.46）との差が小さかった。
 *   ★値 = 既存トークンで 3.0〜4.5 に入るのは `--ies-border-strong`（#8C8C8C）の 1 つだけ ＝ 選ぶ余地が無い（新しい色は作らない）。
 *     ★手計算 = 白 3.36 ／ ページの地 3.00 ／ 暗い配色 3.37（★mute は 5.22 ／ 4.67 ／ 4.54）。★字の床 4.5 は割る（★WCAG は押せない部品を対象外にしている・床の例外は検査の側へ教える）。
 *   ★詳細度は上の「状態の層」と同じ ＋ 後ろに置いて勝たせる（★下線型のタブの 0,4,0 も、文字だけのボタンの 0,3,0 も同じ値）。 */
.ies-tab:disabled,
.ies-tab[aria-disabled="true"],
.ies-tab.is-disabled,
.ies-tab:disabled:hover,
.ies-tab[aria-disabled="true"]:hover,
.ies-tab.is-disabled:hover,
.ies-tabs--line .ies-tab:disabled:hover,
.ies-tabs--line .ies-tab[aria-disabled="true"]:hover,
.ies-tabs--line .ies-tab.is-disabled:hover,
.ies-btn--link:disabled,
.ies-btn--link[aria-disabled="true"],
.ies-btn--link:disabled:hover,
.ies-btn--link[aria-disabled="true"]:hover { color: var(--ies-border-strong); }
/* ★★チェックとつまみは `<input>` を包む器なので、★**文字の色を直接沈める**
   （★半透明だと、地まで薄まって文字が読めなくなる）。★2026-09-19（K-1780）: 字は `--ies-text-mute`（状態の層と同じ）。 */
.ies-check--disabled,
.ies-check:has(input:disabled) {
  opacity: 1;
  color: var(--ies-text-mute);
  cursor: not-allowed;
}
/* ★2026-09-19（K-1780）: つまみの溝は部品の形そのもの（★地を消すと溝が無くなる）ので塗る。★押せる「切」の溝 `--ies-border-strong`（3.36）より
   1 段薄い `--ies-border`（1.28）＝ 押せるときより軽い。★旧の副地（1.06）では溝の形が見えなかった。 */
.ies-switch input[type="checkbox"]:disabled + .ies-switch__slider {
  opacity: 1;
  background: var(--ies-border);
  border-color: var(--ies-border);
  cursor: not-allowed;
}
/* ★2026-09-30（PROG-14 の後・担当 SW の気づき）: 押せないときの指の形を、溝だけでなく札（label）全体へ（★`.ies-check:has(input:disabled)` と同じ向き）。 */
.ies-switch:has(input:disabled) { cursor: not-allowed; }
/* ★★★2026-08-30（K-1239・反映前レビューの指摘）: **文章の途中のリンク**。
 * ★★**ボタンの部品を文の中に置いてはいけない** —— ★`.ies-btn` は `inline-flex` で、
 *   ★`--l` は `min-height: 44px`。★★**12px の本文の中に 44px の箱が入ると、
 *   ★その 1 行だけ行間が跳ね、前後の文とつながって読めなくなる。**
 * ★★私は一括置換で 7 か所をそうしてしまった（★元は `underline` の素のリンクだった）。
 * ★★**文の中のリンクは「箱」ではない。**★下線と色だけを持つ。
 * ★当たり判定の 3 段（24/32/44）は**押せる箱**に掛かる規則であり、★文中のリンクには掛からない
 *   （★WCAG 2.2 の 2.5.8 も「文章の中のリンク」を対象外としている）。 */
.ies-inline-link {
  color: var(--ies-jade-dark);
  text-decoration: underline;
  text-underline-offset: 2px;
  font-weight: 700;
}
.ies-inline-link:hover { color: var(--ies-jade-hover); }
.ies-inline-link:focus-visible {
  outline: 2px solid var(--ies-jade-dark);
  outline-offset: 2px;
  border-radius: var(--ies-radius-xs);
}

/* ★★★2026-09-05（相澤さんのご指摘・正本 = `docs/ui/system/hover.md`）:
 * **面を持つ部品は、撫でても下線を出さない。**
 *
 * ★逐語 =「面で設計するタイルのデザインだから、マウスオーバーすると枠も出てその枠もブランドカラーの緑に
 *   なるから、十分それだけでマウスオーバーなのはわかる」「**挙動がバラバラなことほど気持ち悪いことはありません**」
 *
 * ★★**なぜ 1 か所にまとめるか**（★実測 2026-09-05）:
 *   ★`assets/css/base.css:36` の `a:hover { text-decoration: underline; }` は詳細度 **(0,1,1)**。
 *   ★部品側の `text-decoration: none` は素の規則に書かれていることが多く、そちらは **(0,1,0)** ＝ **負ける**。
 *   ★★**＝ その部品を `<a>` に載せた画面だけで、撫でた瞬間に下線が復活する。**
 *   ★★これを画面ごとに直していたので、同じ直しが repo に **3 か所**バラバラに在った
 *     （`pages/settings-hub.css:58` ／ `pages/settings-shell.css` の追加行 ／ `page-staff-seat-view.php` の `a.sv-toolbar-btn`）。
 *   ★★**＝ 直し方が 3 通りに割れていた。**★ここに 1 本置いて、以後はここだけを直す。
 *
 * ★★**なぜ `:hover` 側に書くか** = ★`.ies-chip:hover` は **(0,2,0)**（★類名 1 ＋ 擬似クラス 1）で、
 *   ★`a:hover` の (0,1,1) に **類名の桁で勝つ**。★★読み込み順に頼らない。
 *   ★（★類名を 2 回書く必要は無い。★`settings-hub.css:58` の `.nbsh-card.nbsh-card` は念のための重ね書きで、
 *     ★1 回でも勝っている ——★あちらは私の持ち場の外なので触っていない。）
 *
 * ★★**`<button>` にしか使っていない部品も入れてある**（★いま下線は出ない）。
 *   ★理由 = ★★**この挙動を「札の種類」ではなく「部品」の性質にするため**。
 *   ★後で誰かが `<a>` に載せ替えた日に、★何もしなくても正しいままになる。
 *   ★★＝ 死んだ規則ではなく、**載せ替えに対する保険**である。
 *
 * ★見張り = `tools/nb-test-HOVERKIT-decoration.php`（★(A) 明示の下線 ／ (B) 打ち消し漏れ）。 */
.ies-card--hover:hover,
.ies-msg-row:hover,
.ies-chip:hover,
.ies-tab:hover { text-decoration: none; }

/* ★★押した瞬間の手ごたえを、押せるもの全部へ。★★**位置だけ動かす**（★色も大きさも変えない）。 */
.ies-icon-btn:active,
.ies-chip:active,
.ies-tab:active,
.ies-modal__close:active,
.ies-chip__x:active,
.ies-toast__action:active { transform: translateY(1px); }

.ies-icon-btn:disabled:active,
.ies-chip:disabled:active,
.ies-tab:disabled:active { transform: none; }
/* graceful-cookie (.69): HTML hidden 属性を復活。`.ies-btn{display:inline-flex}`(author)が UA 規則
   [hidden]{display:none} に勝ち、hidden=true のボタンが表示され続けていた(まとめて削除が単発でも出る等)。
   author 規則同士の specificity 勝ち(.ies-btn[hidden] > .ies-btn)+ !important で確実に非表示化。
   JS の hidden 制御(まとめて削除/削除/複製の出し分け)を本来の意図どおりに効かせるだけ。 */
.ies-btn[hidden] { display: none !important; }

/* ★★★2026-09-06（K-1530）: **同じ穴が、ボタン以外の 5 つにも空いていた。**
 * ★★担当の報告（逐語・実測つき）=「`.ies-badge` は `display:inline-flex` を持つため、
 *   作者スタイルがブラウザ既定の `[hidden]{display:none}` に勝ち、
 *   ★★**`hidden` 属性で出し入れしている要素に当てると永久に出たままになります**」。
 * ★★**＝ 画面が部品を採ると、その画面の「出し入れ」が黙って壊れる。**
 *   ★★これは「部品にすると機能が減る」ように *見える* 形なので、
 *   　★★**部品化そのものを止める理由になっていた**（★実際、担当 1 人が寄せるのを諦めた）。
 * ★★**ブラウザ既定の [hidden] は詳細度 0 なので、部品の 1 クラスに必ず負ける。**
 *   ★★＝ `display` を宣言する部品は、★**全部これを持たなければならない。**
 * ★門 = `tools/nb-test-hidden-escape.php`（★display を宣言する部品を数え、逃げ道の無いものを落とす）。 */
.ies-badge[hidden],
.ies-chip[hidden],
.ies-tab[hidden],
.ies-check[hidden],
.ies-icon-btn[hidden] { display: none !important; }

/* ★★★そして **1 行で根治する**（★上の 5 つは、下が在れば要らない。★読む人のために残す）。
 * ★★**実測 = `display` を宣言する部品は 44 種あり、★逃げ道を持っていたのは 7 種だけだった**
 *   （★`php tools/nb-test-hidden-escape.php`）。★★**37 種が同じ穴を持っていた。**
 * ★★**さらに悪いことに、★同じ回避策が 6 つの CSS に *別々に* 書かれていた**
 *   （★`pages/files.css` ／ `pages/messages.css` ／ `pages/credentials.css` ／
 *   　`pages/employee-manage.css` ／ `components/notif-bell.css` ／ `pages/schedule-settings.css`）。
 *   ★★**＝ 同じ穴を 6 回、別々に塞いでいた。**★★1 か所で塞げば、6 つとも要らなくなる。
 * ★★**`!important` を使う理由**: ★作り手の規則どうしでは `!important` が詳細度に勝つので、
 *   ★★**これから足される部品にも、何もしなくても効く**（★＝ 忘れても壊れない）。
 * ★★**壊す心配が無いことを測った**: ★`[hidden]` に `display:none` 以外を当てている規則は
 *   ★repo 全体で **0 件**（★＝「わざと hidden のまま見せている」場所は無い）。
 * ★★これは広く使われている作法でもある（★Tailwind の preflight も `[hidden]{display:none}` を持つ）。 */
[hidden] { display: none !important; }
.ies-btn--ghost { background: transparent; color: var(--ies-jade-dark); }
/* ★★2026-10-02（W-032・問い 174 (a)・相澤さん「UIUX の理論的に数字で背景の色とかは決めているはずですから推奨の通りでいいです」）:
 *   **輪郭ボタンの撫でた地を、淡い緑の塗り（`--ies-jade-soft`）→ 緑を 10% だけ重ねる（透かし）へ。字は 1 段濃い緑（`--ies-jade-hover`）へ。**
 *   ★旧の淡い緑の塗りは、ページの灰の地（#F2F2F2）に直に置くと **1.01:1 ＝ 何も起きていないように見えた**（★白の上は 1.13:1）。
 *     ★10% の重ね = 下の地の上に緑を薄く乗せる ＝ **どの地の上でも同じ向きに沈む**（★手計算 = 灰の地 1.11:1 ／ 白 1.12:1・合図の床 1.10 〔`hover.md` §3〕 の上）。
 *   ★字: 旧の `--ies-jade-dark`（#00794E）は重ねた灰の地の上で **4.42:1 ＝ 字の床 4.5 を割る**。★1 段濃い `--ies-jade-hover`（#006843）なら 灰の地 5.56 ／ 白 6.15
 *     （★暗い配色は `--ies-jade-hover` が明るい緑 ＝ 暗い地の上で浮く向き）。★新しい色は作っていない（既存トークンだけ）。
 *   ★詳細度は旧と同じ (0,2,0)（★押している間の塗り `.ies-btn--ghost[aria-pressed]` は下で後ろ勝ちのまま）。 */
.ies-btn--ghost:hover { background: color-mix(in srgb, var(--ies-jade) 10%, transparent); color: var(--ies-jade-hover); }
/* ★★K-1219（2026-08-30）: 「削除」を**薄い地 ＋ 濃い文字**に一本化した。
 * ★★**なぜ**（★相澤さんのご決定・2026-08-30。★逐語 =「これは僕の感覚よりも色を数値化したときの
 *   基準？…機械的に決めたほうがいいです」）:
 *   ・旧実装（塗りつぶし coral × 白文字）= **2.83:1** ★4.5 未達
 *   ・`pages/schedule.css` が勝手に上書きしていた版（薄い地 × #DC2626）= **3.95:1** ★これも未達
 *   ★★**＝ 同じ「削除」ボタンが画面によって 2 通りに見え、どちらも基準を満たしていなかった。**
 *   ・新（薄い地 × `--ies-danger-ink`）= ★**5.30:1**（明）／ **5.01:1**（暗）
 * ★★**画面側の上書きは消した**（`pages/schedule.css`）。
 * ★★2026-08-30 訂正: 旧記述「★二度と割れないよう**検査で見張る**」は**言い過ぎだった**（★別の頭の指摘）。
 *   ★`tools/nb-test-button-sizes.php` の (B) は **数を出すだけで落ちない**（★母集団として見せる欄）。
 *   ★★**落ちるのは (A1) 定義が無い修飾子 と (A2) 共通に無い修飾子だけ。**
 *   ★★さらに (B) は `.ies-btn--修飾子` の再定義しか見ないので、★**基本形 `.ies-btn` への上書きは 0 件と報告する**
 *     （★実際には `pages/schedule-settings.css:52` に `#ies-sched-settings .ies-btn { min-height:44px }` が残っており、
 *      ★詳細度 (1,1,0) で S/M/L の 3 段すべてに勝つ）。 */
/* ★★2026-08-30（K-1230）: 枠の色を地と同じにしていたので **輪郭が無く、二次より軽く見えていた**。
 *   ★★**取り消しと削除を並べたとき、危険な側が弱く見える** = 誤操作を誘う向き。
 *   ★→ 枠を文字と同じ濃さにした。★★**文字の 5.30:1 は 1 も動かない**（★地も文字も変えていない）。 */
.ies-btn--danger {
  background: var(--ies-danger-soft);
  color: var(--ies-danger-ink);
  border-color: var(--ies-danger-ink);
}
.ies-btn--danger:hover {
  background: var(--ies-danger-soft-hover);
  border-color: var(--ies-danger-soft-hover);
  color: var(--ies-danger-ink);
}

/* ★★★2026-08-30（K-1228）: ここから下が**この便で足した修飾子**である。
 * ★★**足す前に数えた**（★`php tools/nb-scan-ui-shapes.php --family=btn`）:
 *   ★手書きのボタン **480 か所 / 325 種**。★★**325 種すべてに修飾子は作らない。**
 *   ★足したのは、★**手書きの中に実際に何十か所も現れる「役」だけ**である。
 *
 * ★★**`--ghost` と `--secondary` は別物である**（★取り違えないこと）:
 *   ・`--ghost`     … 地は透明・**枠は緑**・文字は緑 …… ★主要の 1 段下（★同じ話の続き）
 *   ・`--secondary` … 地は白・**枠は灰**・文字は黒 …… ★★**別の選択肢**（★「戻る」「取消」）
 *   ★手書きで最も多い二次形は後者（`bg-white border border-border text-ink`）で、
 *   ★★**共通部品にこれが無かった**ので、皆が手で書いていた。 */

/* ★二次（白地＋灰枠＋黒文字）。★「戻る」「キャンセル」「絞り込み」など。 */
/* ★★★2026-08-30（K-1230・設計レビューの指摘）: **強弱の階段を『形』で作る。**
 * ★★**何が問題だったか（★別の頭が実測）**: ★輪郭(ghost) と 二次(secondary) は
 *   ★**同じ高さ・同じ 1px の枠・同じ太さ**で、★★**違いは色だけ**だった。
 *   ★★**＝ 並べても順位が出ない。**★毎日押す人が、押す前に文字を読まないと選べない。
 *   ★さらに**暗い配色では順位が入れ替わって見えた**（★同じ画面が配色で優先度を変える）。
 * ★★**直し方 = 段ごとに『形』を変える**（★色が読めなくても順位が残る）:
 *     ①主要   … **塗り**（濃緑の地 ＋ 白文字）
 *     ②輪郭   … **枠**（透明の地 ＋ 緑の枠 ＋ 緑の文字）
 *     ③二次   … **地だけ**（淡い灰の地 ＋ 枠なし ＋ 黒文字）★★ここを変えた
 *     ④文字だけ … 地も枠も無い
 * ★★**押せない（disabled）も役ごとに揃えた**（★下）。★旧実装は `opacity:.6` 一本槍で、
 *   ★**押せない二次のほうが、押せない主要より生き生きして見えていた**（★実測 4.5:1 対 2.6:1）。 */
/* ★★2026-08-30 追記（K-1230・★機械の実測で直した）: **枠を残す。**
 *   ★★親は当初、階段を作るために枠を消した。★★**測ったら 1.28:1 だった** ——
 *   ★灰の地（#F4F4F4）と白の面の差がこれしかなく、★★**押せるものだと分からない**
 *   （WCAG 1.4.11 = 部品の輪郭に 3:1）。
 *   ★→ ★**地は残し、枠を「見える灰」に戻した**（★#949494 = 3.03:1）。
 *   ★★階段は保たれる —— ★輪郭(ghost) は**緑の枠・地なし**、二次は**灰の枠・地あり**で、
 *   ★★**色と塗りの 2 つの軸で別物**である（★色が読めなくても、塗りの有無で順位が残る）。 */
/* ★★★2026-09-19（K-1780・相澤さん「なんとなく灰色がいいかなではなく…数値に基づいた視認性の高いもの」）:
 *   **地を副地（灰）→ 白にした。★形を出すのは枠だけ。**
 *   ★★測った数（WCAG の相対輝度・台本 = `docs/integration/BTN-2026-09-19-measure/BTN-contrast.mjs`）:
 *     ・副地の地は **白の面に 1.06・ページの地に 1.05** ＝ 見える差の床 1.10（`hover.md` §3）に届いていなかった。
 *       ★2026-09-05 に副地を #F4F4F4 → #F8F8F8 へ動かしたときに沈んだ（★上の追記「塗りの有無で順位が残る」はそこで失効）。
 *     ・白にすると 字 16.05 → **17.04** ／ 枠の内側 3.17 → **3.36** ／ 撫でた地との差 1.21 → **1.28** ／ ページの地の上 1.05 → **1.12**。
 *       ★★悪くなる数が 1 つも無い。★相澤さんの「地は白に近いほうが見やすい」（K-1773）とも、モック（道具の列はすべて白地）とも合う。
 *   ★輪郭（ghost）との違いは 枠と字の色（緑 5.46 ／ 灰の枠 3.36・黒の字 17.04）＝ **見分けはつくが、強弱の順位は形では残らない**
 *     （★灰色で見ると字の濃い二次のほうが重い。★上の追記の「色が読めなくても順位が残る」は、副地が 1.06 だった 2026-09-05 から
 *       実物では満たされていなかった ＝ この便で確定した・K-1780。★形の階段を立て直すなら二次に別の形が要る＝相澤さんの判断）。 */
.ies-btn--secondary {
  background: var(--ies-surface);
  color: var(--ies-text);
  border-color: var(--ies-border-strong);
}
.ies-btn--secondary:hover {
  background: var(--ies-border);
  color: var(--ies-text);
  border-color: var(--ies-border-strong);
}

/* ★★2026-09-19（K-1780）: **絵だけの押しもの（正方形）。★形だけを持つ。**
 *   ★地・枠・字の色は役の修飾子（`--secondary` など）が持つ ＝ 隣に並ぶ箱と同じ見た目になる。
 *   ★出どころ = 道具の列の歯車（`parts/screen-gear-menu.php`）が枠 `--cl-border`（白の面に 1.28:1）の自前の箱を持ち、
 *     同じ行の二次ボタン（3.36:1）より 1 本だけ薄かった。★見た目を部品から取るために、形の口をここに置いた。
 *   ★枠のない絵だけのボタンは `.ies-icon-btn`（★こちらは面を持たない）。 */
.ies-btn--icon { padding-left: 0; padding-right: 0; min-width: var(--cl-tap-m, 32px); }
.ies-btn--icon.ies-btn--s { min-width: var(--cl-tap-s, 24px); }
.ies-btn--icon.ies-btn--l { min-width: var(--cl-tap-l, 44px); }

/* ★全幅（★モーダルの確定・狭い画面の主要ボタン）。★`w-full` の手書きの受け皿。 */
.ies-btn--block { display: flex; width: 100%; }

/* ★★2026-09-29（部品化の残り PROG-21）: 中身を縦に積む（★字の下に小さい添え字を置くボタン）。
   ★出どころ = 検定学習の採点 3 つ（`templates/page-quiz.php` の注記の依頼）。★渡さなければ何も変わらない。
   ★★2026-10-03（束 1 の 1a・PROG-21 の作り直し）: 旧は `flex-direction` と `gap` だけ。★`.ies-btn` の `white-space: nowrap`（:295）と `--l` の左右 24px（:337）で、
     幅 375 の 3 列（1 つ約 103.7px・中身 53.7px・計算）に「× もう一度」（約 77px）が入らず、3483dce6 で見送った。
     ★いまは 2 段に積むので **上下は 1 段細く・左右 8px・折り返しを許す**（★`--l` より後ろ ＝ 余白は stack が勝つ・中身 85.7px・計算）。
     ★押す的の高さは段のまま（`--l` の min-height 44px・★余白では決めない）。★使う画面 0 の間は見た目 0。 */
.ies-btn--stack {
  flex-direction: column;
  gap: 0;
  white-space: normal;
  padding: var(--ies-sp-1) var(--ies-sp-2);
  text-align: center;
}

/* ★丸薬。★絞り込みの並びなど「札に見せたいボタン」だけ。★確定ボタンには使わない。 */
.ies-btn--pill { border-radius: var(--ies-radius-full); }

/* ★文字だけ（リンク風）。★枠も地も持たない。★`--ghost` より 1 段弱い。
   ★★**当たり判定は残す**（★`min-height` は基本形のまま）。 */
.ies-btn--link {
  background: transparent; border-color: transparent;
  color: var(--ies-jade-dark); font-weight: 700;
  padding-left: var(--ies-sp-2); padding-right: var(--ies-sp-2);
}
.ies-btn--link:hover {
  background: transparent; border-color: transparent;
  color: var(--ies-jade-hover); text-decoration: underline;
}
/* ★★2026-09-19（K-1780・反映前の設計レビューの指摘）: **文字だけのボタンは、押せなくしても枠を足さない・下線も出さない。**
 *   ★押せない姿（`.ies-btn:disabled`・0,2,0）の薄い枠が `.ies-btn--link`（0,1,0）に勝ち、押せない文字だけのボタンに **枠が足されて**
 *     押せるときより重く・ボタンらしく見えていた。★撫でると `.ies-btn--link:hover` の下線も残っていた（前から）。
 *   ★字の差は 緑 5.46 → mute 5.22 と小さい（★字の床 4.5 の中では大きく開けられない ＝ 本棚 [742]・相澤さんの判断）。 */
.ies-btn--link:disabled,
.ies-btn--link[aria-disabled="true"],
.ies-btn--link:disabled:hover,
.ies-btn--link[aria-disabled="true"]:hover { border-color: transparent; text-decoration: none; }

/* ★★押されている状態（★トグル・タブ代わりのボタン・絞り込みの選択中）。
 * ★★**`aria-pressed` を正本にする**（★見た目だけの `is-active` は、読み上げに伝わらない）。
 * ★`.is-active` も受けるのは、既存の JS が付け外ししている印がこれだから（★実測）。 */
/* ★★★2026-08-30（K-1230）: 押されている状態を **塗り**にした。
 * ★★**何が問題だったか**: ★薄緑（`--ies-jade-soft`）が **4 つの意味**を兼ねていた ——
 *   ★「押されている」「選択中」「種別の札」「押せる面」。★★**どれがどれか目で区別できない。**
 * ★→ ★★**薄緑は『状態の札』の専用色に予約**し、★押されているものは**塗り**で示す。
 *   ★白文字 × 濃緑 = **5.46:1**（★暗い配色は 4.93:1）。 */
.ies-btn--ghost.is-active,
.ies-btn--ghost[aria-pressed="true"],
.ies-btn--secondary.is-active,
.ies-btn--secondary[aria-pressed="true"] {
  background: var(--ies-jade-dark);
  border-color: var(--ies-jade-dark);
  color: var(--ies-surface);
}

/* ★★2026-10-03（W-267 ⑧・束 1 の 1a）: **緑の地の上の押しもの**（★`.ies-icon-btn--on-primary`〈:835〉の文字つき版・綴りも同じ）。
 * ★★**何が起きていたか** = 社内メッセージの緑の帯の上の宛先・ピン留め（`ies-btn--secondary ies-btn--s`）は、色を画面の規則（`pages/messages.css`
 *   = 地 白 15〜18%・枠 白 40〜55%・字 #fff）が持っていた。★部品の押されている姿（上の塊）は緑の塗り ＝ **緑の帯の上で溶ける**。
 *   ★白 15% の地の上の白い字は **4.13:1**（計算・字の床 4.5 を割る）。★焦点の輪（素は濃い緑）も緑の上で消える（下の「焦点」の節に 1 組足した）。
 * ★★**値はぜんぶ既存のトークン**（`--cl-on-primary` ／ `--cl-on-primary-rgb` ／ `--cl-primary`）＋ 透明度。★新しい色は作っていない。
 *   ★明るい配色（緑 #00794E の上・計算）: 素 = 枠 白 60%（3.05:1）・字 白（5.46:1）／ 撫でた = 地 白 10%（字 4.52:1）／ 押されている = 地 白・字 緑（5.46:1）／
 *   押せない = 枠 白 30%・字 白 85%（4.53:1・押せる字より薄く字の床 4.5 は守る・K-1780）。★暗い配色は `--cl-on-primary` と `--cl-primary` が入れ替わる（W-186）＝ 数は測っていない。
 * ★`--secondary` と一緒に付けても単独でも同じ姿（★この塊は `--secondary` の後ろに在って勝つ）。★押されている・押せないは、詳細度が同じ `.ies-btn--secondary[aria-pressed]`（:755）と
 *   `.ies-btn:disabled`（:366）に **後勝ち**で効く（0,2,0）。★押せないの撫でた（0,3,0）は `.ies-btn:disabled:hover`（:375）に後勝ち。
 * ★★**この型が見ないもの**: 処理中（`aria-busy`）の輪は素のまま（★字を透明にして `--ies-text` の輪を描く・緑の上では見えない）＝ 使うなら先に緑の上で測る。★いまどの画面にも当てていない（当てるのは 2f）。 */
.ies-btn--on-primary {
  background: transparent;
  border-color: rgb(var(--cl-on-primary-rgb, 255 255 255) / .60);
  color: var(--cl-on-primary);
}
.ies-btn--on-primary:hover {
  background: rgb(var(--cl-on-primary-rgb, 255 255 255) / .10);
  border-color: var(--cl-on-primary);
  color: var(--cl-on-primary);
}
.ies-btn--on-primary.is-active,
.ies-btn--on-primary[aria-pressed="true"] {
  background: var(--cl-on-primary);
  border-color: var(--cl-on-primary);
  color: var(--cl-primary);
}
.ies-btn--on-primary:disabled,
.ies-btn--on-primary[aria-disabled="true"] {
  background: transparent;
  border-color: rgb(var(--cl-on-primary-rgb, 255 255 255) / .30);
  color: rgb(var(--cl-on-primary-rgb, 255 255 255) / .85);
}
.ies-btn--on-primary:disabled:hover,
.ies-btn--on-primary[aria-disabled="true"]:hover {
  background: transparent;
  border-color: rgb(var(--cl-on-primary-rgb, 255 255 255) / .30);
  color: rgb(var(--cl-on-primary-rgb, 255 255 255) / .85);
}

/* ★アイコンと文字の間。★基本形が `gap` を持っているので、追加の指定は要らない。
   ★アイコンだけを押させたいときは `.ies-icon-btn` を使う（★下）。 */
.ies-btn > i, .ies-btn > svg { flex-shrink: 0; }

/* アイコン専用の最小ボタン (編集 ✏ / 削除 🗑 など)。
   枠線・背景なし、min 32px でタップ領域は確保しつつ視覚的に省スペース。
   ★★★2026-08-30（K-1235・別の頭の指摘）: **`!important` を全部外した。**
   ★旧記述「他のCSS (.ies-btn ベース等) からの上書きを確実に抑えるため重要なものは !important」は**失効**。
   ★★**前提が実測で成立していなかった** —— ★`ies-icon-btn` を含む class 属性 **10 件のうち、
   　★`ies-btn` を併記しているものは **0 件**（★想定していた衝突が起きていない）。
   ★★**そして害のほうが実在していた** —— ★`--solid` が **自分の親である素を上書きするために
   　`!important` を使っていた**（★部品が自分自身と戦っていた）。
   ★★**修飾子が素を上書きできない部品は、画面側からはもっと上書きできない。**
   ★当たり判定の 3 段も、他の族と同じく**トークンから取る**（★ここだけ生の px だった）。 */
.ies-icon-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: var(--cl-tap-m, 32px);
  min-height: var(--cl-tap-m, 32px);
  padding: var(--ies-sp-1) var(--ies-sp-2);
  background: transparent;
  border: 0;
  color: var(--ies-text-mute, #636d7e);
  cursor: pointer;
  border-radius: var(--ies-radius-sm);
  font-size: 1rem;
  line-height: 1;
  text-decoration: none;
  transition: background .12s, color .12s;
}
/* ★★2026-08-30（K-1235）: 地を `rgba(0,0,0,.06)` から **トークン**へ。
 * ★★**生の黒の薄掛けは、暗い配色で消える**（★暗い面に黒を 6% 重ねてもほとんど変化しない）。
 * ★同じ役の `.ies-modal__close:hover` は元から `--ies-surface-alt` を使っており、★これで 2 つが 1 つになる。
 * ★★2026-09-19（本棚 [734]）: 撫でた地を副地 → 罫の灰（二次ボタンの撫でた地 `hover.md` ③-3 と同じ）。★副地は白に 1.06 ＝ 撫でた合図の床 1.10
 *   （`hover.md` §3）に届かず、合図は絵の色（#636D7E → #1C1C1C）だけだった。★罫の灰 = 白 1.28 ／ ページの地 1.15。閉じる ✕ も同じ値。 */
.ies-icon-btn:hover {
  background: var(--ies-border);
  color: var(--ies-text, #1C1C1C);
  text-decoration: none;
}
.ies-icon-btn--danger { color: var(--ies-danger, #DC2626); }
/* ★2026-08-30: `rgba(192,57,43,.08)` は **K-277 が退役させた旧い赤**（#c0392b 系）の薄掛けだった。
   ★いまの `--ies-danger`（#DC2626）に合わせる。★8% のままなので見た目はほぼ変わらない。 */
.ies-icon-btn--danger:hover { background: rgba(220,38,38,.08); color: var(--ies-danger, #DC2626); }
/* K-650: 密度の高い表向け小型サイズ (WCAG 2.5.8 Target Size 下限 24px)。base の min32px を絞る純追加。
 * ★★★2026-08-30（K-1235・別の頭の指摘）: **`--sm` を消し、`--s` の 1 本にした。**
 *   ★★**実測 = `--sm` と `--s` はバイト単位で同一の 3 宣言**。★使用は `--sm` 1 か所・`--s` 0 か所。
 *   ★★**別名を残す理由が無い**（★`.ies-btn` 側の `--sm` とは違い、こちらは意味も同じ）。
 *   ★唯一の使用箇所は `--s` へ書き換えた。★★**見た目は 1px も動かない。**
 * ★★**`--l`（44px）**: ★ヘッダーのアイコンボタンは「単独で押すもの」= L（`docs/ui/system/acceptance.md`）。 */
.ies-icon-btn--s { min-width: var(--cl-tap-s, 24px); min-height: var(--cl-tap-s, 24px); padding: var(--ies-sp-1); }
.ies-icon-btn--l { min-width: var(--cl-tap-l, 44px); min-height: var(--cl-tap-l, 44px); }
/* ★丸い形（★閉じる ✕・戻る ← など「面の上に置く」もの）。 */
.ies-icon-btn--round { border-radius: var(--ies-radius-full); }
/* ★地を持つ形（★面の上で押せることを見せたいとき）。
   ★★2026-08-30（K-1235）: 素から `!important` を外したので、★**こちらも要らなくなった**
   （★修飾子は素より後に出るので、同じ強さなら勝つ）。 */
.ies-icon-btn--solid {
  background: var(--ies-surface-alt);
  color: var(--ies-text);
}
.ies-icon-btn--solid:hover { background: var(--ies-border); }
/* ★★★2026-09-29（W-191・W-186 の申し送り）: **緑の地の上の絵だけのボタン**（★色の軸 = `--danger` と同じ並び）。
 * ★★**何が起きていたか** = 出席可能日の右の欄の緑の見出しの中の「前週・翌週・閉じる」が、素の絵の色（灰 `--ies-text-mute`）のまま緑の上に載っていた
 *   ＝ **明るい配色で 1.05:1（ほぼ見えない）**。★部品に「緑の地の上」の型が無かった。
 * ★絵 = `--cl-on-primary`（緑の塗りの上の字と絵の色・W-186）。★明 = 白 × 緑 5.46:1 ／ 暗 = 濃い字 × 明るい緑 8.97:1（手計算）。
 * ★撫でた地 = 同じ絵の色を 10% だけ重ねる（`--cl-on-primary-rgb`・控えの値つき）。★緑の面に 1.20:1（明・暗とも）＝ 合図の床 1.10（`hover.md` §3）の上。
 *   ★10% は `hover.md` の「明・暗のどちらでも 1.1 を超える最小の丸い数」と同じ値。★撫でた地の上の絵は 明 4.54:1 ／ 暗 7.49:1。
 * ★★綴りは `--on-primary` ——★トークン `--cl-on-primary` と Tailwind の `text-on-primary` と同じ名前（★キットに `--on-*` は他に無い ＝ 新しい綴り）。
 * ★焦点の輪は絵と同じ色にする（★下の「焦点」の節・★素の輪は緑で、緑の地の上では 1.00:1 で消える）。
 * ★★**この型が見ないもの**: ★押せない姿（`:disabled`）と処理中（`aria-busy`）は緑の上では描いていない（★素の規則のまま ＝ 絵が `--ies-border-strong`）。
 *   ★いまこの型で押せなくする呼び出しは 0 件。★使うなら先に緑の上で測る。★使う場所 = 緑の塗り（`bg-primary`）の上だけ。 */
.ies-icon-btn--on-primary { color: var(--cl-on-primary); }
.ies-icon-btn--on-primary:hover {
  background: rgb(var(--cl-on-primary-rgb, 255 255 255) / .10);
  color: var(--cl-on-primary);
}

/* --- ③アイコンの器（押せない・飾り） ------------------------
 * ★★**これはボタンではない。**★見出しや空状態の脇に置く「アイコンを入れる四角／丸」。
 * ★手書き **56 か所**（★`bg-primary/10` ＋ `rounded-2xl` の組。★実測 2026-08-30）。
 * ★★**押せる見た目にしない**（★`cursor` を変えない・hover を持たせない）。 */
/* ★★★2026-08-30（K-1235）: **「器」と「人の印」の共通の土台を 1 か所にした。**
 * ★★**2 体の別の頭で意見が割れた場所である**（★どちらの言い分も記録する）:
 *   ・棚の重複を見た頭 =「11 宣言中 7 が同じ。★**1 つに畳め**」
 *   ・設計体系を見た頭 =「★**契約が違う。**★人の印は *写真 → 頭文字 → 既定* の 3 段の代替連鎖を持ち、
 *     　`img` を入れる。★器は装飾で `aria-hidden` が既定。★**箱が同じなだけで畳むと、
 *     　『人の印に意味色を当てる』が文法上正しくなり、静かに間違ったものが作れる**」
 * ★★**私の判断 = 名前は分けたまま、土台だけ共有する**（★後者を採る）。
 *   ★これで「重複を 1 か所で直せない」という前者の懸念も同時に消える。
 * ★★**大きさの段は分けたまま**（★器 32/40/56 ／ 人の印 24/32/44）。
 *   ★理由 = ★当たり判定の 3 段（24/32/44）が支配するのは **押せるもの**。
 *   ★★**器は押せない**（★下の注記のとおり `cursor` も hover も持たない）ので、あの段には縛られない。 */
.ies-icon-box,
.ies-avatar {
  display: inline-flex; align-items: center; justify-content: center;
  flex-shrink: 0;
  background: var(--ies-jade-soft);
  color: var(--ies-jade-dark);
  line-height: 1;
}
.ies-icon-box {
  width: 40px; height: 40px;
  border-radius: var(--ies-radius-md);
  font-size: 1.125rem;
  /* ★★2026-08-31（K-1241・別の頭の指摘）: **中身がはみ出さないようにする。**
   *   ★旧は無く、★**器に `<img>`（教室のロゴ等）を入れると角から出て黙って崩れた。**
   *   ★中身はアイコン 1 つなので副作用は無い（★人の印は既に持っている）。 */
  overflow: hidden;
}
.ies-icon-box--s  { width: 32px; height: 32px; border-radius: var(--ies-radius-sm); font-size: 1rem; }
.ies-icon-box--l  { width: 56px; height: 56px; border-radius: var(--ies-radius-lg); font-size: 1.5rem; }
/* ★★★2026-08-31（K-1241）: **4 段目を足した。**★実測 = 手書き 123 か所のうち **64px が 26 か所**で、
 *   ★★**3 段（32/40/56）が覆えていたのは大きさだけで数えて 56%、形まで見ると 42% だった。**
 *   ★★**アイコンの大きさは「器 × 45% を 2px 単位・下限 16px・原寸±2px なら原寸へ」**という規則で決めた。
 *     ★この規則は既存 3 段（16 / 18 / 24px）を **3 つとも再現する**（★後付けではなく、既にあった判断の式化）。
 *     ★64 × 45% = 28.8 → **28px**（★比 43.8%。★小さいほど比を上げる = 光学サイズの原理・OpenType 1.8 `opsz`）。
 *   ★★**角丸は 16px のまま**（★理想は 20px だが `acceptance.md` の段（4/8/12/16/9999）に無い。
 *     ★★**新しい段を作らない**ほうを採った。★56px より 3.6 ポイント角ばって見えるが許容範囲）。
 *   ★★**56 と 64 を同じ段に畳まなかった理由（★実測）** = ★**同じファイルに同居するのは 2 件だけ**
 *     （★56px を持つ 19 ファイル ／ 64px を持つ 15 ファイル）。★★**同時に見比べられないので、
 *     14% の近さは「揃え忘れ」に見えない**（★Weber–Fechner の閾値は *同時比較* の話）。 */
.ies-icon-box--xl { width: 64px; height: 64px; border-radius: var(--ies-radius-lg); font-size: 1.75rem; }

/* ★★★2026-08-31（K-1241）— **形の軸を足した。★これがこの部品に一番足りなかったもの。**
 * ★★**2 体の別の頭が、独立に同じことを指した**（★別々の経路が一致したときだけ確からしい）:
 *   ・設計理論の頭 =「大きさは主軸ではない。**形（丸）が独立軸**で、26% を占める。
 *     　★**段をいくら精緻にしても、この 26% は 1 件も救われない**」
 *   ・型設計の頭 =「足りないのは段ではなく形。**丸い器は角の器としても人の印としても書けない**」
 * ★★**親（私）は「段が足りない」と思って呼んだ。★問いの立て方が違っていた。**
 *
 * ★★**ただし数は両者とも外していた**（★親が測って分かった）。★丸い 32 件の中身の実測:
 *   ★**人の頭文字 13 件**（★これは `.ies-avatar` の仕事。★器ではない）／ ★**数字・文字 8 件** ／
 *   ★**アイコン 7 件** ／ ★**学習の 4 色タイル 4 件**（★体系の外の色。★★**部品の対象外**）。
 *   ★★**＝ 丸い器として引き取るのは 15 件。29 でも 32 でもない。**
 *
 * ★★**綴りは新しく作っていない。**★`.ies-icon-btn--round` が既に同じ意味で使っている
 *   （★形の言い方が `--pill` / `--round` / `--square` の 3 通りに割れているので、**4 つ目を作らない**）。 */
.ies-icon-box--round { border-radius: var(--ies-radius-full); }
/* ★意味の色。★★**淡地の上の文字は専用の `-ink` を使う**（★4.5:1 を満たすため。K-1228）。
 * ★★★2026-08-30（K-1235・別の頭の指摘）: **`--warn` と `--info` を消した。**
 *   ★★**理由 = 綴りが意味を裏切っていた。**★K-1229 で 2 色相に畳んだ結果、
 *     ・`--warn` と書くと **琥珀ではなくコーラル**が出る（★`--accent` と 1 バイトも違わない）
 *     ・`--info` と書くと **青ではなく灰**が出る（★`--mute` と 1 バイトも違わない）
 *   ★★**＝ 1,576 か所の置き換えで「警告だから --warn」と書く人が、毎回裏切られる。**
 *   ★使用は 2 つとも **0 件**（★陽性対照 = 同じ式で `ies-btn` は 104 件）。★見た目は 1px も動かない。
 * ★★**意味と綴りの対応（★これが正本。★迷ったらここを読む）**:
 *   肯定・完了 → `--primary`（緑） ／ ★**注意・警告 → `--accent`（コーラル）**
 *   危険・破壊 → `--danger`（赤）  ／ ★**情報・補足 → `--mute`（中立の灰）** */
.ies-icon-box--accent { background: var(--ies-coral-soft);  color: var(--ies-coral-ink); }
.ies-icon-box--danger { background: var(--ies-danger-soft); color: var(--ies-danger-ink); }
.ies-icon-box--mute   { background: var(--ies-border); color: var(--ies-text-sub); }   /* ★2026-09-19 本棚 [734]: 中立の札と同じ地（副地は白に 1.06 で器の形が見えなかった） */

/* ★★★2026-08-31（K-1241）— **地の出し方の軸**（★上の「意味の色」とは別の軸である）。
 * ★★**なぜ足したか（★実測）**: ★手書き 123 か所のうち **16 か所（13%）が淡地ではない** ——
 *   ★地なし 7 ／ 白＋枠 4 ／ 濃い地 5。★★**いまの部品ではこの 16 か所を 1 つも書けなかった。**
 *
 * ★★★**綴りは 1 つも発明していない。★キットに既に在る語を、意味を確かめてから借りた**
 *   （★`flight-rules` の「名前を作る前に、その綴りが既に在るかを撃つ。★在ったら *意味も* 確かめる」）:
 *   ・`--ghost`   = `.ies-btn--ghost`（:357）… **地を透明にし、文字は濃い緑**。★同じ意味
 *   ・`--outline` = `.ies-swatch--outline`（:886）… **白い地 ＋ 1px の枠**。★同じ意味
 *   ・`--solid`   = `.ies-badge--solid`（:959）… **濃い緑の地 ＋ 白い文字**。★同じ意味
 *   ★★**使ってはいけない語**（★キット内で *別の* 意味を持つ）= `--plain`（影を消す）／
 *     `--tint`（淡い地）／`--secondary`（輪郭のボタン）。
 *
 * ★★★**枠に `border` を使わない理由（★段の設計に直結する）**:
 *   ★`border: 1px` を足すと、★**箱が 64px → 66px になり、決めた段から外れる。**
 *   ★`box-shadow: inset` は箱の大きさを 1px も変えない。★★**`.ies-swatch--outline` が既にこうしている。**
 *
 * ★明暗比（★白い面の上・K-1219 の物差し）: `--ies-jade-dark` × 白 = **5.46:1**（★4.5 を満たす）。
 * ★★**この 3 つが見ないもの**: ★色相との掛け合わせ（★例 = 「コーラルの ghost」）。
 *   ★実測でその組み合わせが 0 件だったので**作っていない**（★要るようになってから足す。★★先に増やさない）。 */
.ies-icon-box--primary { background: var(--ies-jade-soft); color: var(--ies-jade-dark); }
.ies-icon-box--ghost   { background: transparent;          color: var(--ies-jade-dark); }
.ies-icon-box--outline { background: var(--ies-surface);   color: var(--ies-jade-dark); box-shadow: inset 0 0 0 1px var(--ies-border-strong); }
.ies-icon-box--solid   { background: var(--ies-jade-dark); color: var(--ies-surface); }

/* --- ④人の印（アバター） ------------------------------------
 * ★手書き **36 か所**（★`bg-primary/10` ＋ `rounded-full`。★実測 2026-08-30）。
 * ★中身は氏名の頭文字 1 字（`mb_substr($name,0,1)`）か、画像。 */
/* ★土台（並び・地・文字色）は `.ies-icon-box` と共有している（★上の注記）。★ここは差分だけ。 */
.ies-avatar {
  width: 32px; height: 32px; overflow: hidden;
  border-radius: var(--ies-radius-full);
  font-weight: 700; font-size: 0.875rem;
}
.ies-avatar--s { width: 24px; height: 24px; font-size: 0.75rem; }
/* ★2026-08-30（K-1230）: 16px → **20px**。★光学比を揃えた（★S 50% / M 44% / ★旧 L 36%）。 */
.ies-avatar--l { width: 44px; height: 44px; font-size: 1.25rem; }
.ies-avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* ★人以外（教室・科目など）を丸で表すとき。★色で種類を分ける。 */
/* ★2026-08-30（K-1229）: 青を外した。★人以外の印は コーラル か 中立 の 2 つ。 */
.ies-avatar--accent { background: var(--ies-coral-soft);  color: var(--ies-coral-ink); }
.ies-avatar--mute   { background: var(--ies-border); color: var(--ies-text-sub); }   /* ★2026-09-19 本棚 [734]: 中立の札と同じ地 */

/* --- ⑤画面の見出し（★本文の頭の帯）------------------------------------------
 * ★★★2026-09-06 全面改訂（K-1540 の 2 本目）
 *
 * ★★**なぜ書き換えたか**: ★この綴りは 2026-08-30 から在ったが、
 *   ★★**使っている画面は 1 本も無かった**（★実測 = markup での使用 **0 件**）。
 *   ★実際に画面が出している帯は `parts/page-head.php` の `nb_page_head()` で、
 *     ★★**同じ見た目を Tailwind の語彙で別に組んでいた**（★`docs/ui/system/page-recipe.md` が欠陥として記録済）。
 *   ★★Tailwind は社員サイトへ配っていない（`functions.php`）＝ **社員サイトはこの帯を呼べなかった。**
 *
 * ★★★**値はすべて実ブラウザで測って写した**（★2026-09-06・講師のシフトの実物・幅 1440 と 279 の 2 点）:
 *   | 何 | 実測 |
 *   |---|---|
 *   | 下の余白 | **20px**（旧の綴りは 12px だった） |
 *   | 帯の下 | **32px**（旧 24px） |
 *   | 罫線 | **2px #00794E** |
 *   | すき間 | **12px** |
 *   | 題 | 幅 640 未満 **16px / 行間 20px** ／ 640 以上 **18px / 行間 28px** ／ 700 ／ **#1A1A1E** |
 *   | 添え | **12px / 行間 16px / 400 / #636D7E / 上 2px** |
 *   | 右の塊 | すき間 **8px** ／ 右端へ寄る |
 *
 * ★★**題の大きさが 2 段になるのは Tailwind の並び順のため**（★`.text-base` → `.leading-tight` → `.sm\:text-lg`）。
 *   ★素直に「1.125rem / 1.25」と書くとここを外す。★★**実測どおり 2 段で書く。**
 *
 * ★★**色は `var(--cl-x, var(--ies-y))` で書く。**★`--cl-*` を定義しているのは `header.php` の `:root` だけ
 *   ＝ ★**教室サイトは今までと 1 バイトも変わらず、社員サイトでは portal 層に落ちる。**
 *
 * ★★**`margin: 0` は飾りではない。**★社員サイトは `base.css` の `h1..h4{margin:0 0 12px}` / `p{margin:0 0 12px}`
 *   が土台なので、★書かないと **社員サイトだけ 12px 下にずれる**（★教室サイトは preflight が 0 にしている）。
 *
 * ★★**この節が持たないもの**: ★アイコンの器（`.ies-icon-box` を借りる）／ 添えの文字そのもの（`.ies-caption`）／
 *   右に並ぶ押しもの（`.ies-btn`）。
 *
 * ★★★**2026-08-30 の改善（添えを 12px/mute → 14px/sub ＝ 4.83:1 → 6.69:1）は、★この改訂で *戻している*。**
 *   ★理由 = ★**1 画面にも届いていなかった**ので「戻す」ではなく「まだ当てていない」が正しい。
 *   ★★見た目を 1px も変えないことを最優先にした（★同じ便で 2 つのことをしない）。
 *   ★★**添えの読みやすさを上げる話は、別に起票して測ってから当てる。** */
.ies-page-head {
  display: flex;
  align-items: center;
  gap: var(--ies-sp-3);                       /* 12px */
  padding-bottom: 1.25rem;                    /* 20px（★実測） */
  margin-bottom: 2rem;                        /* 32px（★実測） */
  border-bottom: 2px solid var(--cl-primary, var(--ies-jade-dark));
}
/* ★狭いときに右の塊を折り返す（★画面が `flex-wrap` を渡していた形の置き換え）。 */
.ies-page-head--wrap { flex-wrap: wrap; }

/* ★★★2026-09-06: **`flex: 1 1 auto` を付けない。**
 *   ★付けると題の箱が **310px → 676px** に広がる（★実ブラウザで前後を測って判明）。
 *   ★★文字は左そろえなので **始まる位置は動かない**が、★★**長い題の折り返す位置が変わる。**
 *   ★旧の形は `<div class="flex … min-w-0">` の中に在り、★幅は中身なりだった。
 *   ★★右の塊は `margin-left:auto` が押しやるので、★これで旧と同じ幾何になる。
 *   ★★**広げたほうが読みやすい可能性は在る。★別に測って決める**（★同じ便で 2 つのことをしない）。 */
.ies-page-head__body { min-width: 0; }

.ies-page-head__title {
  margin: 0;                                  /* ★社員サイトの h2{margin:0 0 12px} を打ち消す */
  font-size: 1rem;                            /* 16px（★640 未満） */
  line-height: 1.25rem;                       /* 20px */
  font-weight: 700;
  color: var(--cl-ink, var(--ies-text));
}
@media (min-width: 640px) {
  .ies-page-head__title { font-size: 1.125rem; line-height: 1.75rem; }   /* 18px / 28px（★実測） */
}

/* ★添えの 1 行。★文字そのものは `.ies-caption`（12px / --ies-text-mute）が持つ。★ここは余白だけ。 */
.ies-page-head__sub { margin: 0.125rem 0 0; } /* 上 2px ＋ 社員サイトの p{margin:0 0 12px} を打ち消す */
/* ★題の下に札と月を 1 行で並べる（口 `subtitle_html`・2026-09-21 段 C-1）。
 *   ★`.ies-page-head__sub` と重ねて使う（★上の余白は同じ・★並べ方だけをここが足す）。 */
.ies-page-head__meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ies-sp-2); }

.ies-page-head__actions {
  display: flex;
  align-items: center;
  gap: var(--ies-sp-2);                       /* 8px */
  margin-left: auto;                          /* ★子が 2 つのとき space-between と同じ幾何 */
  flex-shrink: 0;
}

/* ★戻る。★★保護者と講師本人の画面だけ（★社員の画面はパンくずが在るので出さない）。
 * ★★`text-decoration: none` を明示するのは、★社員サイトの土台が `base.css` の
 *   `:where(a:hover){underline}` だから ——★書かないと **社員サイトでだけ撫でると下線が出る**。 */
.ies-page-head__back {
  display: inline-flex;
  align-items: center;
  gap: var(--ies-sp-1);                       /* 4px */
  min-height: var(--cl-tap-l, 44px);
  margin-bottom: var(--ies-sp-3);             /* 12px */
  font-size: 0.875rem; line-height: 1.25rem;  /* 14px / 20px */
  color: var(--cl-muted, var(--ies-text-mute));
  text-decoration: none;
  transition: color .15s cubic-bezier(.4, 0, .2, 1);
}
.ies-page-head__back:hover { color: var(--cl-ink, var(--ies-text)); text-decoration: none; }
.ies-page-head__back:focus-visible {
  outline: 2px solid var(--cl-primary, var(--ies-jade-dark));
  outline-offset: 2px;
  border-radius: var(--ies-radius-xs);
}

/* =========================================================
 * 共通テーブル: 全画面で統一されたデザイン
 *   .ies-table-wrap でテーブルを囲む(角丸枠線+横スクロール)
 *   .ies-table を <table> に付与(基本スタイル)
 *   ページ固有のクラス (.ies-users-table 等) と併用可能
 * ========================================================= */
.ies-table-wrap {
  max-width: 100%;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  margin-top: var(--ies-sp-3);
  border: 1px solid var(--ies-border, #E3E3E3);
  border-radius: var(--ies-radius-sm);
  background: var(--ies-surface);
}
/* ★★★2026-09-13（K-1708）: **面の中に置いた表は、自分の枠を描かない。**
 *
 * ★★**相澤さんのご指摘（逐語）**:
 *   > まだ **枠の中に枠 が無駄にあります**けど、これはただの横線つまり **data table のような UI じゃダメなんですか？**
 *   > それとも **何かの共通部品でこのUIが強制されていますか？**
 * ★★**答え = 強制していた。★この部品が枠と角丸を描いていた**（★上の 2 行）。
 *
 * ★★**なぜ元は枠が在ったか**（★消す前に理由を測った）= ★この部品は
 *   **表が画面のいちばん外側に在る**ことを前提にしていた（★問い合わせ管理などは、表そのものが本文）。
 *   ★そこでは枠が **唯一の輪郭**なので要る。★★**面（`.ies-card`）の中では、輪郭は面が既に持っている。**
 *
 * ★★＝ 面の中では **横線だけの素の表**になる（★相澤さんの仰る data table の形）。
 * ★★重み (0,1,0) は素の規則と **同じ**で、★後に載るので勝つ（★`!important` を使わない）。
 * ★★**面の外の表は 1px も変わらない**（★問い合わせ管理・給与の勤怠など）。 */
:where(.ies-card) .ies-table-wrap {
  border: 0;
  border-radius: 0;
  background: transparent;
}

/* ★★★2026-09-13（K-1708）: **月送りの帯の下の余白。**★出す側 = `parts/month-nav.php`。
 *   ★★相澤さんのご指摘 =「すぐ下の枠と **完全にくっついています**けど…正しいということでいいの？」
 *   ★★**正しくなかった。★余白を 1 度も書いていなかっただけ**（★部品にも呼ぶ側 4 枚にも `margin` が無かった）。
 *   ★16px（★近接 = 月送りと中身は「つながっているもの」なので、節と節の 24px より一段狭い）。 */
.nb-month-nav { margin-bottom: var(--ies-sp-4); }
/* ★2026-09-19（本棚 [733]）: 帯の箱と「今月」は縮めない。★行の末尾の口 `after` に添え書きを置いた出席可能日で、
 *   幅 768 のとき箱が 172 → 167px に縮み、月の札が 2 行に割れた（箱の高さ 34 → 54px・実測）。★縮むのは添え書きの側。
 * ★★2026-09-19（設計レビュー）: 縮めないだけだと、幅 360・文字「特大」で行が 34px はみ出し、ページが 3px 横に動いた（給与の勤怠・実測）
 *   ＝ 行を折り返せるようにした（入りきらない「今月」は次の段へ）。★並び（flex・真ん中・隙間 8px）も部品が持つ
 *   （旧は Tailwind の `flex items-center gap-2` だけに頼り、Tailwind を読まない見本帳では帯が縦に積まれていた）。
 * ★行の末尾の添え書き `.nb-month-nav__note` は、基準の幅 12rem まで同じ段に残って縮み（字が折り返す）、それより狭いと次の段へ。 */
.nb-month-nav { display: flex; align-items: center; gap: var(--ies-sp-2); flex-wrap: wrap; }
.nb-month-nav > .ies-card, .nb-month-nav > .ies-btn { flex-shrink: 0; }
.nb-month-nav__note { flex: 1 1 12rem; min-width: 0; text-align: right; }
/* ★★2026-09-18: 道具の列に置く姿（`nb_month_nav( [ 'bar' => true ] )`・座席管理と予約管理）。
 *   ★相澤さんのご指摘 =「月とか日を動かす部分だけ高さがそろってない」。★実測（1280・座席管理）=
 *     切り替えの枠 42px・上端 61px に対し、日付の箱は 日 42px・上端 53px ／ 月 34px・上端 53px。
 *   ★原因 2 つ: ①上の 16px の下余白ごと上下の真ん中でそろうので箱が 8px 上へずれる ②高さが中身で決まる
 *     （月は字の行＋上下 6px、日は曜日の札 28px＋上下 6px）。
 *   ★直し = 切り替えの枠（`nb_toolbar_css()` の tabs）と同じ作り ＝ 場所を取らない内側の線＋32px の押しもの（外形 32px）。
 *     ★1 行目はすべて 32px（相澤さんのご判断・2026-09-18）。 */
.nb-month-nav--bar { margin-bottom: 0; }
/* ★枠線は outline（内側へ 1px）。★inset の影にすると矢印の地が上に描かれ、指を乗せた端・押せない端の線が消えた
 *   （2026-09-18 のレビュー・実測）。★outline は中身より上に描かれ、場所も取らない（外形 32px のまま）。 */
/* ★★2026-09-19（K-1780）: 線の色を `--ies-border` → `--ies-border-strong`。★同じ行の切り替え（`.ies-tabs`）・検索欄・二次ボタンは
 *   強い罫（白の面 3.36 ／ ページの地 3.00）なのに、日付送りだけ薄い罫（1.28 ／ 1.15 ＝ 輪郭の床 3:1 の外）で 1 本だけ薄かった。
 *   ★中の仕切り（矢印と日付の間の縦線）は押せる所どうしの区切りなので、薄い罫のまま。
 * ★★2026-09-19（本棚 [733]）: **単独で置く姿（給与の勤怠・給与明細・出席可能日・講師シフト）も同じ作りにした**
 *   （選択子を `--bar` から帯そのものへ）。★旧の単独の姿 = 薄い罫の枠 1px（白の面 1.28 ／ ページの地 1.15）・角丸 12px・高さ 34px で、
 *   隣の「今月」（32px・角丸 8px）と上下がずれていた。★帯の姿は 1 つ ＝ 違いは下の余白だけ（`--bar` は 0・単独は 16px K-1708）。
 *   ★角丸 8px は「操作するもの = 8px」（K-1206）。 */
.nb-month-nav > .ies-card {
  display: inline-flex; align-items: center;
  padding: 0; border: 0; border-radius: var(--ies-radius-sm);
  outline: 1px solid var(--ies-border-strong); outline-offset: -1px;
}
/* ★日付と曜日の札の隙間は部品が決める（gap 8px ＋ 札自身の左の余白 4px ＝ 2 画面とも 12px・座席管理の旧と同じ）。
 *   ★旧は座席管理だけ字の間の空白で 12px・予約管理は 4px だった（inline-flex にすると空白は消える＝レビューの実測）。 */
.nb-month-nav > .ies-card > .ies-subhead {
  display: inline-flex; align-items: center; gap: var(--ies-sp-2);
  min-height: var(--cl-tap-m, 32px); padding-top: 0; padding-bottom: 0;
}
.ies-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 0.875rem;
}
/* ★★2026-08-30（K-1228）: 見出しの文字色を `--ies-text-mute` → `--ies-text-sub` にした。
 *   ★★**理由は好みではなく数**（★機械で測った）: ★見出しの地は `--ies-surface-alt`(#F4F4F4) で、
 *     ★その上の `--ies-text-mute`(#6B7280) は **4.40:1** ＝ **4.5:1 に届いていない**。
 *     ★`--ies-text-sub`(#5C5C5C) なら **6.08:1**（★暗い配色は 4.74 → 7.27）。
 *   ★★**この食い違いは K-936 のコメントが既に書いていた**（★「surface-alt 地では 4.40:1 に留まり
 *     僅かに未達」）。★★**書いてあったが直っていなかった。**★ここで閉じる。
 *   ★余白も生の px（`10px 12px`）から刻み（8/12px）へ載せ替えた。★縦が 2px 詰まる。 */
.ies-table thead th {
  padding: var(--ies-sp-2) var(--ies-sp-3);
  text-align: left;
  background: var(--ies-bg-soft);
  font-size: 0.75rem;
  font-weight: 700;
  color: var(--ies-text-sub);
  white-space: nowrap;
  border-bottom: 1px solid var(--ies-border);
}
.ies-table tbody td {
  padding: var(--ies-sp-2) var(--ies-sp-3);
  border-bottom: 1px solid var(--ies-border);
  text-align: left;
  vertical-align: middle;
}
.ies-table tbody tr:last-child td { border-bottom: 0; }
.ies-table tbody tr:hover { background: var(--ies-bg-soft, #f8f8f8); }
/* ★数の列。★★**等幅で右へ寄せる**（★桁が揃わないと読み比べられない）。 */
.ies-table .is-num { font-family: var(--ies-font-mono); text-align: right; white-space: nowrap; }
/* ★★2026-10-21 夜（W-643 ①の担当 SBS の気づき・相澤さん「部品の足しを今すぐ始めて」）: **中央寄せの列**。
 *   ★なぜ: 表の部品の中では Tailwind の `text-center`（0,1,0）が効かない ＝ 見出し `.ies-table thead th` ・マス `.ies-table tbody td` の左寄せ（0,1,2）に負ける（実測 = `payroll-attendance.css` の注記と同じ形）。
 *     ★席とブースの設定は取っ手・「#」・削除の 3 列を中央寄せにしていたのが、表を部品へ寄せた便（d88b01e2）で外れて左寄せになった ＝ その 3 列をこの class で元の姿へ戻す。
 *   ★書き方は数の列 `.is-num` と同じ（★見出し `th` にもマス `td` にも付ける・強さ (0,2,0) が左寄せ (0,1,2) に勝つ）。★値は寄せ方だけ（`text-center` と同じ `text-align: center`）で、等幅・折り返しの指定は持たない（★そこが `.is-num` と違う）。
 *   ★渡さなければ（この class を使わない表は）出力は 1 バイトも変わらない。★`.is-num` と一緒には付けない（★後ろに書いた中央寄せが右寄せに勝ってしまう ＝ 数の列は右に寄せる）。 */
.ies-table .is-center { text-align: center; }

/* ═══════════════════════════════════════════════════════════════════════
 * ★★★2026-09-13（K-1709）: **表に「行の見出し」と「合計の行」を足した。**
 *
 * ★★**相澤さんのご指摘**:「もっと気合い入れてUI整えてよ　なんかもう **言語化できないけど
 *   ダサいっていうかごちゃついてる**」／「ただの横線つまり **data table のような UI** じゃダメなんですか？」
 *
 * ★★**足した理由（★どちらも「表なら当然在るもの」で、★無いから画面が手で書いていた）**:
 *   ★①**行の見出し（`tbody th`）** … 1 列目が項目名の表は、★`<td>` ではなく `<th scope="row">` が正しい
 *     （★読み上げが「どの項目の金額か」を言える）。★★**部品が形を持っていなかったので、★左寄せも余白も付かなかった**
 *     （★担当 SAL が「`.ies-table` が `tbody th` を見ていない」と報告していた ——★★その 1 件がこれ）。
 *   ★②**合計の行（`tfoot`）** … 表の最後に「答え」を置くのは表の基本。★★旧は画面が
 *     `border-t` を手で引いて `<div>` で作っていた（★＝ 手書きの写し）。
 *
 * ★★**上の罫線を 2px にする**（★`tbody` の 1px と *違う太さ*にすることで、★「ここで区切れる」と形で言う）。
 * ★★**色は足していない**（★地は `--ies-bg-soft`・文字は素のまま）。 */
.ies-table tbody th {
  padding: var(--ies-sp-2) var(--ies-sp-3);
  border-bottom: 1px solid var(--ies-border);
  text-align: left;
  vertical-align: middle;
  font-weight: 600;
}
.ies-table tbody tr:last-child th { border-bottom: 0; }
.ies-table--compact tbody th { padding: var(--ies-sp-1) var(--ies-sp-2); }
.ies-table tfoot th,
.ies-table tfoot td {
  padding: var(--ies-sp-2) var(--ies-sp-3);
  border-top: 2px solid var(--ies-border);
  text-align: left;
  font-weight: 700;
  background: var(--ies-bg-soft);
}
.ies-table tfoot .is-num { font-size: 1.0625rem; }
.ies-table--compact tfoot th,
.ies-table--compact tfoot td { padding: var(--ies-sp-2) var(--ies-sp-2); }

/* ★★**内訳の行**（★親の行の下にぶら下がる明細）。★★字下げで親子を表す ——
 *   ★線を増やさない（★線が増えるほど「枠の中の枠」に近づく）。 */
.ies-table__sub > th:first-child,
.ies-table__sub > td:first-child { padding-left: var(--ies-sp-5); }
.ies-table__sub { color: var(--ies-text-sub); }

/* ★★★**表の中の入力欄は、列の幅をそろえる。**
 *   ★★相澤さんのご指摘「ごちゃついてる」の実体の 1 つ = ★行ごとに入力欄の幅が違い、
 *     ★★**数の左端が揃っていなかった**（★実測 = 上書きの在る行 140px ／ 加減算の行 330px）。
 *   ★★幅は **部品が決める**（★画面が `w-24` のような数を書かない）。
 *   ★6.5rem = 104px ＝ `-1,200`（★符号つき 5 桁）が切れずに入る最小（★実測）。 */
.ies-table .is-num .ies-input { width: 6.5rem; min-width: 6.5rem; }
/* ★行を詰める（★1 画面に多くの行を出したいとき）。★文字は小さくしない。 */
.ies-table--compact tbody td,
.ies-table--compact thead th { padding: var(--ies-sp-1) var(--ies-sp-2); }
/* ★押せる行（★開く・詳細へ）。★★行ぜんたいが当たり判定になる。 */
.ies-table--rows tbody tr { cursor: pointer; }
/* ★見出しを固定する（★器が縦にスクロールするとき）。 */
.ies-table--stickyhead thead th { position: sticky; top: 0; z-index: 1; }

/* --- ⑦入力欄 ------------------------------------------------
 * ★手書き **288 か所 / 162 種**（★実測 2026-08-30）。★族の中でいちばん散らばっていた。
 * ★★**旧実装の余白は生の px（`10px 12px`）だった。**★刻み（4/8/12/16）に載せ直した
 *   （★高さの差は約 4px。★★**見た目が動く**。★相澤さんのご承認済の範囲）。
 * ★大きさの正本 = `--cl-field-h`（32px・「文字を入れる欄の見た目」）。
 *   ★★**押すもの（44px）とは別の引き出しである**（`docs/ui/system/acceptance.md`）。 */
.ies-field { margin-bottom: var(--ies-sp-4); }
.ies-field__label { display: block; font-size: 0.875rem; color: var(--ies-text-sub); margin-bottom: var(--ies-sp-1); font-weight: 700; }
/* ★必須の印。★★**色だけで示さない**（★記号を出す）。
 *   ★2026-10-22（K-2178 ②22）: `::after` だけを足す規則なので、`.ies-field__label` でなくラベルの役（`.ies-label` `.ies-label--mute`）と組んでも同じに出る（**2 本目は足さない**）。
 *     ★手書きの `<span class="text-accent">*</span>`（カルテ 5・報告書の記入 3・予約のイベント 1・生徒設定 1）はこれで置き換わる ＝ 星 1 字（橙）→ 「必須」の淡い赤の札（見た目が変わる・先例 = `templates/page-message-compose.php` 2026-09-06）。 */
.ies-field__label--required::after {
  content: "必須";
  margin-left: var(--ies-sp-2);
  padding: 0 var(--ies-sp-1);
  border-radius: var(--ies-radius-xs);
  background: var(--ies-danger-soft); color: var(--ies-danger-ink);
  font-size: 0.75rem; font-weight: 700;
}
/* ★補足と誤りの文。★★**誤りは色だけでなく文字で伝える。** */
.ies-field__help  { margin-top: var(--ies-sp-1); font-size: 0.75rem; color: var(--ies-text-mute); }
.ies-field__error { margin-top: var(--ies-sp-1); font-size: 0.75rem; color: var(--ies-danger-ink); font-weight: 700; }
/* ★★2026-08-30（K-1228・★ブラウザで測って直した）: 余白を 8px → **4px**、行の高さを 1.4 に固定した。
 *   ★★**なぜ** = ★見本帳をブラウザで測ったところ、★**入力欄だけが刻みから外れていた**
 *     （★実測 = 入力欄 38px ／ プルダウン 40px ／ 大 50px ／ 大のプルダウン 52px）。
 *   ★★**押せる高さは S 24 / M 32 / L 44 の 3 段**（K-1185）で、★38 も 40 も 50 も刻みに無い。
 *   ★→ ★余白と行の高さを詰め、★**`min-height` が効くようにした**（★実測 = 32 / 44 / 24 ちょうど）。
 *   ★★**検査は緑だった。★門は高さを見ない**（K-1216）。★描いて測らなければ分からなかった。 */
.ies-input, .ies-textarea, .ies-select {
  width: 100%;
  min-height: var(--cl-field-h, 32px);
  padding: var(--ies-sp-1) var(--ies-sp-3);
  line-height: 1.4;
  border: 1px solid var(--ies-border-strong);
  border-radius: var(--ies-radius-sm);
  background: var(--ies-surface);
  color: var(--ies-text);
  /* ★★フォーム部品は既定で書体を継がない。★明示しないと OS の書体が出る（★他の文字と揃わない）。 */
  font-family: var(--ies-font-sans);
  font-size: 0.875rem;
  transition: border-color .15s, box-shadow .15s;
}
/* ★★★2026-09-06: **入力欄の 3 つの段**（★どれも「画面が Tailwind を部品の上に重ねていた」ものを引き取った）。
 * ★★門 `nb-test-ui-kit` の D が実測で名指ししたものだけを作った（★使い手のいない段は作らない）。
 *
 * ★`--quiet` … ★**書けない欄の見た目**（★実際は `<span>` で、値を見せるだけ）。
 *   ★旧 = `bg-surface text-muted`（★page-admin-staff-manage.php:173）。
 * ★`--code` … ★**符号を入れる欄**（★教室コードなど）。★太字＋大文字。
 *   ★旧 = `font-bold uppercase`（★同 :1889）。★★`ies-num`（等幅）と組んで使う。
 * ★`--compact` … ★**縦に伸びない小さな書き込み欄**（★返信の 1 行〜3 行）。
 *   ★旧 = `resize-none min-h-[3.5rem] max-h-[8.75rem]`（★page-staff-inquiry.php:1348）。
 *   ★★**高さは Tailwind の任意値ではなく、行の高さから決める**（★3.5rem ≒ 2 行 ／ 8.75rem ≒ 5 行）。 */
/* ★★2026-09-19（設計レビュー・本棚 [734]）: 書けない欄も押せない欄と同じ姿（地を塗らない・枠 `--ies-border`・字 mute）。
 *   ★旧 = 副地（白に 1.06 ＝ 見えない）＋ 強い罫の枠 ＝ 空の入力欄と地の 1.06 しか違わず、書けそうに見えた。
 *   ★押せない欄を K-1782 で変えたので、この 2 つ（同じ「操作できない」）の姿が割れていた。使い手 = 給与単価の固定された有効月・押せる行の無い献立の札。 */
.ies-input--quiet, .ies-select--quiet {
  background-color: transparent;
  border-color: var(--ies-border);
  color: var(--ies-text-mute);
}
.ies-input--code { font-weight: 700; text-transform: uppercase; }
/* ★★★2026-10-02（W-032・本棚 [784] ④）: **素の `.ies-textarea`（最低 160px・縦に伸ばせる）と `--s`（80px）を、この段（`--compact`）と `--l`（下）より前へ移した。**
 *   ★旧は下（`--auto` の次）に在った。★3 つとも重みは同じ (0,1,0) ＝ **後ろに書いたものが勝つ** ので、素の 160px が
 *     `--compact`（3.5〜8.75rem）と `--l`（44px）に **後ろから勝っていた**（★小は「最低 160 ＞ 最高 140」で 160px のまま・大も 160px のまま
 *     ＝ どちらの段も効いていなかった）。★画面は 11 か所（保護者ホームの欄 2・確認書の欄 1・講師トップの申請の理由 3・お問い合わせの返信 1・座席のメモ 4）。
 *   ★★見た目が変わる = これらの欄が、書いてある行数（`rows`）どおりの高さに縮む（★`--compact` は 3.5〜8.75rem・`--l` は 44px 以上）。
 *   ★`--s` は素のすぐ後ろ（★`--s` と `--compact` を同時に名乗る呼び出しは 0 件 ＝ 順の入れ替えで変わる欄は無い・2026-10-02 に字で数えた）。 */
.ies-textarea { min-height: 160px; resize: vertical; }
.ies-textarea--s { min-height: 80px; }
.ies-textarea--compact { resize: none; min-height: 3.5rem; max-height: 8.75rem; }

/* ★★★2026-09-06: **選ぶ欄に手ごたえ（指のかたち）を戻した。**
 * ★★担当の報告（実測）=「画面側が持っていた手ごたえが、★**部品に寄せたことで消えました**」。
 * ★★**＝ 部品化で *機能が減った* 1 件**。★★こういうものは、見つけたら部品の側で埋める
 *   （★画面へ書き戻すと、また 2 つ目の正本ができる）。
 * ★`<select>` は押すと一覧が開く ＝ 押しものなので、★指のかたちが出るのが正しい。 */
.ies-select { cursor: pointer; }
/* ★★2026-08-30（K-1230・機械の実測）: 焦点の枠を `--ies-jade`(3.08:1) → `--ies-jade-dark`(5.46:1)。
 *   ★★**淡い輪（3px）は白地に対して 1.13:1 で、実質見えていない。**
 *   ★★**＝ 焦点を伝えているのは枠の色替えのほう**なので、そちらを確実に見える濃さにする。
 *   ★輪は「広がり」を伝える補助として残す（★消すと当たりが分かりにくい）。 */
/* ★★★2026-09-03（K-1399）: **`outline: none` をやめた。**
 * ★★**なぜ**（★別の頭の設計審査が指摘 → 私が確かめた）: ★強制配色（Windows のハイコントラスト）では
 *   ★★**`border-color` も `box-shadow` も上書き・無効化される。**★★＝ 焦点がどこにあるか分からなくなる。
 * ★★**K-1313（2026-09-01）が共通シェルを `outline: 2px solid` に直したのに、
 *   ★キットの入力欄だけが `outline: none` のまま取り残されていた。**
 * ★★輪（box-shadow）は「広がり」を伝える補助として残す（★消すと当たりが分かりにくい）。
 * ★`outline-offset: 1px` = 枠の外側に 1px 空けて描く（★枠の色替えと二重に見えない）。 */
.ies-input:focus, .ies-textarea:focus, .ies-select:focus {
  outline: 2px solid var(--ies-jade-dark);
  outline-offset: 1px;
  border-color: var(--ies-jade-dark);
  box-shadow: 0 0 0 3px var(--ies-jade-soft);
}
.ies-input::placeholder, .ies-textarea::placeholder { color: var(--ies-text-mute); }
/* ★★2026-09-19（本棚 [734]）: 押せない欄も「押せない」の決まり（上の状態の層・K-1780）へ ＝ 地を塗らず、枠と字を 1 段薄く。
 *   ★旧 = 副地 #F8F8F8（白に 1.06 ＝ 見えない）＋ 枠は押せる欄と同じ強い罫 ＝ 字の色だけが違い、
 *     同じフォームの押せないボタン（塗らない・薄い枠）と姿が 2 通りだった。★地は `background-color` だけを消す（絵の地を消さない）。 */
.ies-input:disabled, .ies-textarea:disabled, .ies-select:disabled {
  background-color: transparent; border-color: var(--ies-border); color: var(--ies-text-mute); cursor: not-allowed;
}
/* ★読み取り専用は「押せない」ではなく「変えられない」。★地は変えるが文字は薄くしない。 */
/* ★★2026-08-30（K-1230）: **「押せない」と「読み取り専用」が同じ灰地で区別できなかった。**
 *   ★→ 読み取り専用は **文字を薄くしない**（★中身は読ませたい）。★枠を破線にして違いを形で出す。 */
.ies-input[readonly], .ies-textarea[readonly] {
  background: var(--ies-surface-alt);
  color: var(--ies-text);
  border-style: dashed;
  cursor: default;
}
/* ★誤りの状態。★★`aria-invalid` を正本にする（★見た目だけの印は読み上げに伝わらない）。 */
.ies-input.is-invalid, .ies-textarea.is-invalid, .ies-select.is-invalid,
.ies-input[aria-invalid="true"], .ies-textarea[aria-invalid="true"], .ies-select[aria-invalid="true"] {
  border-color: var(--ies-danger);
}
.ies-input.is-invalid:focus, .ies-input[aria-invalid="true"]:focus,
.ies-textarea.is-invalid:focus, .ies-textarea[aria-invalid="true"]:focus,
.ies-select.is-invalid:focus, .ies-select[aria-invalid="true"]:focus {
  border-color: var(--ies-danger); box-shadow: 0 0 0 3px var(--ies-danger-soft);
}
/* ★大きさの 2 段。★既定は上（★行の中に置ける高さ）。
 * ★★★2026-09-06: **`.ies-textarea--l` を足した。★抜けていた。**
 *   ★★**実測で見つかった**（★門 `nb-test-ui-kit` の B ＝「定義の無い修飾子が使われている」）:
 *     ★保護者の画面が `.ies-textarea--l` を書いていたが、★★**定義が 1 つも無く、静かに何もしていなかった。**
 *   ★★**なぜ 16px（`1rem`）か** ——★これは好みではない:
 *     ★★**iOS の Safari は、★文字が 16px 未満の入力欄に触れると画面を勝手に拡大する。**
 *     ★★保護者・生徒はスマホで使うので、★★**16px を割ると入力のたびに画面が飛ぶ。**
 *     ★★＝ `--l` は「指で触る入力欄」の段であり、★16px はその条件である。
 *   ★★**これで画面側の `text-base` の直書きが不要になる**（★共通部品より後に読まれて部品に勝っていた）。 */
.ies-input--l, .ies-select--l, .ies-textarea--l { min-height: var(--cl-tap-l, 44px); padding: var(--ies-sp-2) var(--ies-sp-4); font-size: 1rem; }
.ies-input--s, .ies-select--s { min-height: var(--cl-tap-s, 24px); padding: 0 var(--ies-sp-2); font-size: 0.75rem; }
/* ★★2026-09-18: 探す欄（左に虫めがね）。★出どころ = 座席管理の道具の列の検索欄（旧 `.sv-search`・画面の手書き・高さ 40px）を
 *   共通の入力欄（32px）へ寄せた（相澤さんのご指示「大原則としてすべてコンポネント化」・道具の列の 1 行目を 32px にそろえる）。
 *   ★絵は旧 `.sv-search` が持っていた虫めがね（Remix の search-line）をそのまま移した（★新しく描いていない）。 */
.ies-input--search {
  /* ★左の余白 = 絵の位置（12px）＋絵（14px）＋すき間（4px）＝ 30px。★これより広いと字を置ける幅が減るだけ。
     ★★2026-09-21 訂正: 控えを `0.75rem` `0.25rem` から **px** へ直した。★理由 = トークンは px なので
       `rem` の控えは**文字サイズを変えた利用者だけで設計と違う余白になる**（★門 `nb-test-token-fallback` が
       「控えとトークンの食い違いが 0 → 4 件に増えた」と落ちていた）。★既定の文字サイズでは同じ値なので見た目は変わらない。 */
  padding-left: calc(var(--ies-sp-3, 12px) + 0.875rem + var(--ies-sp-1, 4px));
  /* ★右は 8px（既定 12px より 1 段狭い）。★道具の列の 112px の欄で 5 文字の名前が欠けない幅（72px）を作るため。 */
  padding-right: var(--ies-sp-2, 8px);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%236B7280'%3E%3Cpath d='M15.5 14h-.79l-.28-.27A6.5 6.5 0 1 0 13 15.5l.27.28v.79l5 4.99L19.49 20l-4.99-5zm-6 0A4.5 4.5 0 1 1 14 9.5 4.5 4.5 0 0 1 9.5 14z'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: var(--ies-sp-3, 12px) center; background-size: 0.875rem;
}
/* ★幅を内容に合わせる（★日付・時刻・件数など。★`width:100%` を打ち消す）。 */
/* ★★★2026-09-01（K-1284）: **`.ies-textarea--auto` が抜けていた。**
   ★★実測 = 門（`nb-test-ui-kit.php` の B）が「定義の無い修飾子」として拾った
   　（★`page-guardian-inquiry.php:453`）。★★**書いても静かに何もしない状態だった。**
   ★3 つとも同じ土台（`width: 100%`）を共有しているので、★逃がし方も 3 つとも同じであるべき。 */
.ies-input--auto, .ies-select--auto, .ies-textarea--auto { width: auto; }
/* ★2026-10-02: 素の `.ies-textarea { min-height: 160px }` と `--s` はここから **上へ移した**（`--compact` の直前・本棚 [784] ④）。 */

/* ★前後に印を添える欄（★検索の虫めがね・単位・通貨）。 */
.ies-input-group { display: flex; align-items: stretch; }
.ies-input-group > .ies-input { border-radius: 0; }
.ies-input-group > :first-child { border-top-left-radius: var(--ies-radius-sm); border-bottom-left-radius: var(--ies-radius-sm); }
.ies-input-group > :last-child  { border-top-right-radius: var(--ies-radius-sm); border-bottom-right-radius: var(--ies-radius-sm); }
/* ★隣り合う枠を 1 本に見せる。★★**負の余白を使わない**（★余白のトークンに −1px は無い。
   ★左の枠を落とすほうが、拡大表示でもずれない）。 */
.ies-input-group > * + * { border-left: 0; }
.ies-input-group__addon {
  display: inline-flex; align-items: center;
  padding: 0 var(--ies-sp-3);
  border: 1px solid var(--ies-border-strong);
  /* ★2026-08-30: 文字を mute(4.40:1) → sub(6.08:1) に。★地が副地なので mute では基準を割る。
   * ★2026-09-19（本棚 [734]）: 地を副地 → 罫の灰（中立の札と同じ）。★副地は白に 1.06 で、添えが入力欄（白）と同じ面に見えていた。字 sub は 5.21。 */
  background: var(--ies-border); color: var(--ies-text-sub);
  font-size: 0.875rem; white-space: nowrap;
}
.ies-input-group > .ies-input:focus { position: relative; z-index: 1; }

/* ★選ぶ欄（チェック・ラジオ）の 1 行。★★**当たり判定は行ぜんたい**（★文字を押しても効く）。 */
.ies-check {
  display: inline-flex; align-items: center; gap: var(--ies-sp-2);
  min-height: var(--cl-tap-m, 32px);
  cursor: pointer; font-size: 0.875rem; color: var(--ies-text);
}
.ies-check > input { width: 16px; height: 16px; flex-shrink: 0; accent-color: var(--ies-jade-dark); cursor: pointer; }
/* ★★2026-10-22（K-2178 ②16・部品化の続き）: **選ぶ札の押せる高さの段（L = 44px・K-1185）**。★`.ies-card--l` / `.ies-badge--l` と同じ付け方・同じ値（`--cl-tap-l`）。
 *   ★なぜ: `.ies-check` の高さ（M = 32px）が `.ies-row--l` ほか **前に定義された高さの口より後ろで勝つ**ため、指で押す行（講師トップの今日の指導報告書を選ぶ札・報告書の一括選択・生徒を選ぶ行）が
 *     `min-h-[44px]` を Tailwind で手書きで残していた（3 か所）。★この段は `.ies-check` より **後ろ**にあるので、`.ies-row--l` を組むより先に効く。
 *   ★値の出どころ（★新しい値を作っていない）= 手書きの `min-h-[44px]` と同じ 44px。★渡さなければ出力は 1 バイトも変わらない。
 *   ★画面に `min-h-[44px]` を残すと、後に読まれる Tailwind が勝つが同じ値なので見た目は変わらない ＝ 置き換えるときは消す。 */
.ies-check--l { min-height: var(--cl-tap-l, 44px); }
/* ★★2026-08-30（K-1237）: 旧 `opacity: .5` はここから外した。★★**正本は「状態の層」**（★上の方）。
   ★理由 = 半透明だと文字も地も薄まり、★実測で **3.30:1**（★必要 4.5）まで落ちていた。 */
.ies-check-group { display: flex; flex-wrap: wrap; gap: var(--ies-sp-2) var(--ies-sp-4); }

/* ★入／切のつまみ。
 * ★★**2026-08-30（K-1228）: `assets/css/pages/schedule.css` から**ここへ引き上げた。**
 *   ★★**親案（`<button role="switch">` ＋ `::after`）は捨てた。**★理由 = 2 つ:
 *     ① ★既存の作りは **`<label>` の中に本物のチェック欄**を隠して持つ ＝ フォームで値が飛ぶ・
 *        読み上げが素で正しい。★`role="switch"` を手で書くより堅い
 *     ② ★★**当たり判定 44px ／ 見た目 24px** を既に分けている
 *        （★受け入れ条件の「小さな部品は見た目 32px ／ 当たり判定 40px」と同じ考え方）
 *   ★★**markup での使用は 0 件**（★陽性対照 = 同じ式で `ies-btn` は 108 件）。
 *     ★★**＝ いま見た目が動く画面は無い。**★だから引き上げと同時に「入」の緑を
 *     ★`--ies-jade`(#00A86B) → **`--ies-jade-dark`** にした（★主要ボタンと同じ緑に揃えた・K-1219）。
 * ★★**書き方**: `<label class="ies-switch"><input type="checkbox"><span class="ies-switch__slider"></span></label>` */
.ies-switch {
  position: relative;
  display: inline-block;
  width: 44px;
  min-height: 44px;
  height: 44px;
  cursor: pointer;
  vertical-align: middle;
}
.ies-switch input[type="checkbox"] {
  opacity: 0;
  width: 0;
  height: 0;
  position: absolute;
}
.ies-switch__slider {
  position: absolute;
  top: 50%;
  left: 0;
  width: 44px;
  height: 24px;
  transform: translateY(-50%);
  /* ★2026-08-30（K-1230）: `--ies-border`(1.28:1) → `--ies-border-strong`(3.03:1)。
     ★★**「切」のつまみは、それが在ることが見えないと押せない**（WCAG 1.4.11）。 */
  background: var(--ies-border-strong);
  border-radius: var(--ies-radius-full);
  transition: background-color .18s;
}
.ies-switch__slider::before {
  content: "";
  position: absolute;
  top: 2px;
  left: 2px;
  width: 20px;
  height: 20px;
  background: var(--ies-surface);
  border-radius: 50%;
  box-shadow: 0 1px 3px rgba(0, 0, 0, .2);
  transition: transform .18s;
}
.ies-switch input[type="checkbox"]:checked + .ies-switch__slider {
  background: var(--ies-jade-dark);
}
.ies-switch input[type="checkbox"]:checked + .ies-switch__slider::before {
  transform: translateX(20px);
}
/* ★★2026-09-19（本棚 [739]）: 押せない「入」も押せない溝（`--ies-border`）。★旧は上の「入」の規則（0,4,1）が押せない溝の規則（同じ 0,4,1）より
 *   後ろに在って勝ち、押せない「入」が押せる「入」と同じ緑（白に 5.46）のままだった。★いま `.ies-switch` を出す画面は 0（見本帳だけ・2026-09-19 に grep）
 *   ＝ 画面の害は出ていなかった。部品を使い始める前に塞いだ。
 *   ★押せない入と切の違いは **つまみの位置だけ**（★Material の押せないスイッチはつまみの大きさ・色も変える＝同じではない・設計レビュー）。
 *   ★溝 = 白の面 1.28 ／ ページの地 1.15（見える差の床 1.10）。★設定の器のスイッチ `.nb-set__switch` の押せる「切」はこの押せない溝と同じ姿
 *     ＝ 部品へ寄せる便で 2 つを同時に切り替える（本棚 [745]）。★★2026-09-30 済 = 2c060a08（器の口 nb_set_switch() が `.ies-switch` を出す・PROG-14）。 */
.ies-switch input[type="checkbox"]:checked:disabled + .ies-switch__slider {
  background: var(--ies-border);
}
.ies-switch input[type="checkbox"]:focus-visible + .ies-switch__slider {
  outline: 2px solid var(--ies-jade-dark);
  outline-offset: 2px;
}
/* ★★2026-08-30（K-1237）: 旧 `opacity: .5` はここから外した（★正本は「状態の層」）。 */

/* --- ⑦-b 色の見本（小さな四角） -----------------------------
 * ★★**新しい族**（★別プロセスの棚卸しで見つかった。★親は「バッジ」に混ぜて数えていた）。
 * ★手書き **28 か所**（★凡例。★`page-staff-available-days.php:304` `page-guardian-schedule.php:310` ほか）。
 *   ★★2026-09-06: 実例の 1 つ `page-staff-monitor.php:171` は画面ごと退役したので落とした。
 *   ★★**中身が空・余白ゼロ・正方形**でバッジではない。
 * ★大きさは 3 段で 96% を覆う（★実測）。★色は使う側が `background` で当てる。 */
.ies-swatch {
  display: inline-block; flex-shrink: 0;
  width: 12px; height: 12px;
  border-radius: var(--ies-radius-xs);
  background: var(--ies-border);
}
.ies-swatch--s { width: 6px; height: 6px; }
.ies-swatch--l { width: 16px; height: 16px; }
.ies-swatch--round { border-radius: var(--ies-radius-full); }
/* ★意味の色（★凡例でよく使う 5 つ）。 */
/* ★2026-08-30（K-1229）: 青と琥珀を外した。★凡例の色も 2 色相＋中立。 */
.ies-swatch--primary { background: var(--ies-jade-dark); }
.ies-swatch--accent  { background: var(--ies-coral-ink); }
.ies-swatch--mute    { background: var(--ies-border-strong); }
/* ★枠だけの見本（★「予定なし」を表す）。 */
.ies-swatch--outline { background: var(--ies-surface); box-shadow: inset 0 0 0 1px var(--ies-border-strong); }

/* Badge */
/* ★★★2026-08-30（K-1221）: `.ies-badge` の**素の定義をここから外した**。
 * ★★**正本は `assets/css/sidebar-shared.css`**（★あちらは**両方のサイトで**読まれる）。
 * ★★**K-1180 とまったく同じ手当て**——★あのときは帯の規則 18 本を同じ理由でここから外した。
 *
 * ★★**外した理由（★実測 2026-08-30）**: ★2 つのファイルが同じセレクタを持ち、**値が違っていた**:
 *   ・ここ = コーラル地 ／ 20px ／ 完全な丸 ／ 等幅フォント
 *   ・`sidebar-shared.css` = `#E94E1B` ／ 18px ／ 角丸小
 *   ★このファイルは `template_redirect` の中で登録されるので**後に出る＝勝つ**
 *   ★★＝ **社員サイトだけコーラルの 20px、教室サイトは #E94E1B の 18px** で見えていた。
 *   ★★相澤さんの逐語（K-1180）=「どちらの URL であっても**寸分たがわず、完璧に、同じもの**を表示できるように」。
 *
 * ★★**残っている問題（★未決 [503]）**: ★**どちらの色も読みやすさの基準に届いていない**
 *   （★白文字 × `#E94E1B` = **3.69:1** ／ 白文字 × `--ies-coral` = **2.82:1**。★必要 4.5）。
 *   ★★**色の決め直しは相澤さんの判断待ち。**★ここでは**2 つを 1 つにしただけ**で、色は変えていない。 */
/* ★★★2026-08-30 訂正（K-1228）: **上の「素の定義をここから外した」は失効した。★戻す。**
 *
 * ★★**なぜ戻すのか（★実測 2026-08-30・★K-1222 が作った穴）**:
 *   ★K-1221 は「`sidebar-shared.css` は**両方のサイトで**読まれるから、あちらが正本」と書いた。
 *   ★★**その前提が、その 1 時間後の K-1222 で崩れていた。**
 *   ★いまの配り方（`functions.php`）= ★**保護者・生徒には `sidebar-shared.css` を配らない**
 *     （★柱を持たないので要らない）。★配るのは `tokens.css` ＋ **このファイル**の 2 本だけ。
 *   ★★**＝ 保護者・生徒の画面には `.ies-badge--mute` は在るのに、素の `.ies-badge` が無かった。**
 *     ★修飾子だけが当たると、★**地も形も持たないただの文字**になる（★静かに壊れる形）。
 *
 * ★★**戻して安全な根拠（★2 経路で確認）**:
 *   ・★`.ies-badge` の**使用は PHP に 0 件**（★陽性対照 = 同じ式で `ies-btn` は多数ヒット）。
 *     ★★**＝ いま画面に出ているものが 1 つも無い。**★見た目は 1px も動かない。
 *   ・★このファイルは `sidebar-shared.css` より**後に出る＝勝つ**（★K-1180 が測った順序）。
 *     ★だから両方に在っても、こちらが効く。★★**それでも重複は残さない**——
 *     ★`sidebar-shared.css` の `.ies-badge` は**この便で削除した**（★あちらは柱の見た目だけを持つ）。
 *   ・★柱の未読の数は `.ies-sidebar__unread` という**別の部品**である（★`sidebar-shared.css:337` の注記）。
 *     ★★**そちらは触っていない**（★色が 4.5:1 に届いていない件 = 未決。★下の `--count` を見よ）。
 *
 * ★★**色の決め方**（K-1219 と同じ）: ★淡い地 ＋ 濃い文字。★★**全部 4.5:1 を機械で満たしてある**
 *   （★主要 4.85 ／ 注意 4.52 ／ 警告 4.52 ／ 情報 4.51 ／ 危険 5.30 ／ 中立 6.08。★明るい配色）。 */
.ies-badge {
  display: inline-flex; align-items: center; justify-content: center;
  gap: var(--ies-sp-1);
  min-height: 20px;
  padding: 0 var(--ies-sp-2);
  border-radius: var(--ies-radius-full);
  /* ★★2026-09-19（本棚 [734]・相澤さんのご判断）: 地を副地 `--ies-surface-alt` → 罫の灰 `--ies-border`。
   *   ★副地は白の面に 1.06・ページの地に 1.05 ＝ 見える差の床 1.10 に届かず、札が「太字の灰の字」に見えていた
   *     （2026-09-05 に副地を #F4F4F4 → #F8F8F8 へ動かした 1 行で沈んだ）。★罫の灰 = 白の面 1.28・ページの地 1.15・暗 1.33 ／ 1.44
   *     ＝ **どこに置いても形が見える唯一の値**（タブの件数の丸 K-1780 と同じ地＝小さな中立の丸はこの 1 色）。字 sub は 5.21（床 4.5）。
   *   ★色つきの札との強弱（★物差しで結論が変わる・設計レビュー 2026-09-19）: 地だけの色差 ΔE2000（明）では灰 5.8 ＜ 緑 8.3・コーラル 10.1・赤 12.0 で
   *     色つきのほうが目立つが、字まで含めた札の明るさでは灰 1.47 ＞ 緑 1.31・コーラル 1.36・赤 1.42 で灰がいちばん重く、暗い配色（直す前から）と
   *     色覚 D 型の模擬でも灰が色つきと同じか重い。★床 1.10 を守ったまま色つきより軽い灰は無い（#EEEEEE 以上でページの地に 1.04）
   *     ＝ 値ではなく色つきの側（印を足すなど）で目立たせる話（本棚）。（`docs/integration/REST-2026-09-19-measure/`）
   *   ★却下: `--ies-bg`（白の面 1.12 だがページの地 1.00・暗 1.09 で消える）／ 塗らずに罫の枠（押せないチップ・ボタン K-1780 と同じ姿になる）。
   *   ★相澤さんの条件（逐語）=「１コンポーネント化が進んで統一が進むこと ２数値的に視認性が高まってUIUXが向上すること」。 */
  background: var(--ies-border);
  color: var(--ies-text-sub);
  font-size: 0.75rem; font-weight: 700; line-height: 1.4;
  /* ★★2026-08-30（K-1230・機械の実測）: 長い文字（日本語 30 字）を入れると、
     ★**375px 幅で画面が 210px 横にはみ出した**（★札 11/13・タブ 6/6・チップ 6 が親を超過）。
     ★★原因 = `nowrap` ＋ 高さ固定で **縦に逃げられない**。★→ 器を超えたら省略記号にする。 */
  white-space: nowrap; flex-shrink: 0;
  max-width: 100%; overflow: hidden; text-overflow: ellipsis;
}
/* ★意味の色（★淡地 ＋ `-ink`）。★★**バッジは押せない。**押せるものは `.ies-chip`（下）。 */
/* ★★★2026-08-30（K-1229・相澤さんのご決定）: **意味の色は緑とコーラルの 2 色相だけ。**
 *   ★★**青（`--ies-info`）と琥珀（`--ies-warn`）を部品から外した。**
 *   ★★**なぜ** = ★相澤さんが見本帳をご覧になって「★**ブランドのカラーを逸脱して結構カラフル**」。
 *     ★★**そのとおりだった。**★親は族ごとに 6 系統ずつ意味色を用意し、画面に **5 色相**を並べていた。
 *     ★★しかも 旧 CLAUDE.md の『デザイン言語』（★2026-09-13 に退避 = `docs/integration/CLAUDE-MD-RECORD-ARCHIVE.md` の色の節〈859 行あたり〉・値の正本は `noberu-design-system`）は **primary / accent / ink / muted の 4 つ**しか定めておらず、
 *     ★★**青と琥珀は意味の色として定義されていない。**★「トークンが在る」と「使ってよい」は別だった。
 *   ★★**色は『いま応答が要るもの』にだけ使う**（★相澤さんのご決定）。★状態の札は既定が中立。
 *   ★`--warn` は**コーラルの淡色**へ畳んだ（★旧 CLAUDE.md の『デザイン言語』=「accent＝警告・欠席・削除」・2026-09-13 に退避 = `docs/integration/CLAUDE-MD-RECORD-ARCHIVE.md` の 859 行・値の正本は `noberu-design-system`）。
 *   ★`--info` は**中立**（★情報は応答を求めないので色を持たない）。★名前は残す（★呼び出し側を壊さない）。 */
/* ★★★2026-08-30（K-1235）: **`--warn` `--info` `--mention` を消した**（★上の器と同じ理由）。
 *   ★3 つとも、K-1229 で 2 色相に畳んだ結果 **`--accent` か `--mute` と 1 バイトも違わなく**なっていた。
 *   ★★**綴りが意味を裏切ったまま 1,576 か所へ配ることになるので、いま落とす**（★使用は 3 つとも 0 件）。
 * ★★**意味と綴りの対応**: 肯定 → `--primary` ／ ★**注意・警告 → `--accent`** ／
 *   危険 → `--danger` ／ ★**情報・補足・自分宛て → `--mute`**。★★**新しく書くときはこの 4 つから選ぶ。** */
.ies-badge--primary { background: var(--ies-jade-soft);   color: var(--ies-jade-dark); }
.ies-badge--accent  { background: var(--ies-coral-soft);  color: var(--ies-coral-ink); }
.ies-badge--danger  { background: var(--ies-danger-soft); color: var(--ies-danger-ink); }
.ies-badge--mute    { background: var(--ies-border); color: var(--ies-text-sub); }   /* ★2026-09-19 本棚 [734]: 素の札と同じ（上の注記） */
/* ★塗り（★数が少なく、強く見せたいものだけ）。★文字色は面のトークンなので配色に追従する。 */
.ies-badge--solid   { background: var(--ies-jade-dark); color: var(--ies-surface); }
/* ★角丸の札（★丸薬にしたくないとき。★表の中など）。 */
.ies-badge--square  { border-radius: var(--ies-radius-sm); }
/* ★★★2026-09-06: **指で押す札の段（L = 44px）を足した。**
 *   ★★**なぜ**（★実測で見つかった）: ★保護者の画面が `.ies-badge` に
 *     ★`min-h-[44px] px-3` を **Tailwind で直書き**していた（★門 `nb-test-ui-kit` の D が捕まえた）。
 *   ★★**Tailwind は共通部品より *後* に読まれるので、★直書きが部品に勝つ。**
 *     ★★＝ **部品の大きさが、画面ごとに黙って上書きされていた。**
 *   ★★**保護者・生徒はスマホで押す**ので、★★**押せる領域の段は L（44px）が要る**（K-1185）。
 *   ★★**押せない札には使わない** ——★これは「押す札」専用の段である（★ただの目印には既定を使う）。 */
.ies-badge--l { min-height: var(--cl-tap-l, 44px); padding-left: var(--ies-sp-3); padding-right: var(--ies-sp-3); }
/* ★★数の印（★未読件数）。★`--ies-danger` の塗り = 明 4.83:1 ／ 暗 5.0:1（★機械で確認）。
   ★★**柱の未読（`.ies-sidebar__unread`・コーラル 2.82:1）はこれに寄せていない**——
   ★あちらの色は相澤さんの判断待ち（★`docs/pending-answers.md`）。★勝手に変えない。 */
.ies-badge--count {
  min-width: 18px; min-height: 18px;
  padding: 0 var(--ies-sp-1);
  background: var(--ies-danger); color: var(--ies-surface);
  font-family: var(--ies-font-mono);
}
/* ★点（★「何か在る」だけを示す。★数も文字も持たない）。 */
.ies-badge--dot {
  min-width: 8px; min-height: 8px; width: 8px; height: 8px;
  padding: 0; background: var(--ies-jade-dark);
}
/* ★2026-10-20（W-304・部品化の下見 CP-下見.md §3 ③）: 灰色の点。★画面の手書きの点（`bg-border`・約 8 か所）と同じ色 ＝ 置き換えても見た目は変わらない。
 *   ★`.ies-badge--mute` は上（地 = border）に在るが、後ろの `.ies-badge--dot` が地を緑に固定する ＝ 2 つ重ねたときだけ灰へ戻す（渡さなければ 1 バイトも変わらない）。 */
.ies-badge--dot.ies-badge--mute { background: var(--ies-border); }
/* ★2026-10-21（K-2174 ②）: 読んだ行の点 = 見せないが場所は残す（★旧 = 社員トップ・講師の連絡の手書きの透明の点 `bg-transparent` ＝ 読んだ行と読んでいない行の字の頭がそろう）。渡さなければ 1 バイトも変わらない。 */
.ies-badge--dot.is-read { visibility: hidden; }

/* ★★2026-10-22 9 時台（K-2178 ②・テナント設定の札・担当 C2）: **枠つきの札**（読むだけの状態・件数・理由の 1 枚）`.ies-plate`。★押せない。★押せる札は `.ies-chip`（すぐ下の節）。
 *   ★なぜ足した（足りなかった）か: テナント設定の手書きの札 `.nbt-settings__chip`（29 か所）に合う部品が無かった。`.ies-badge` へ寄せると見た目が変わる ＝
 *     ①高さ 20px（札は 32px）②枠なし（札は 1px の罫）③太字 700（札は継ぐ）④折り返さず「…」で切る（札は「この役職はその権限を持っていないので、ここは効きません」のような長い文を折り返して全部見せる）⑤琥珀の札（`--warn`）がコーラルに変わる（`--ies-coral-*` に琥珀は無い）。
 *   ★値の出どころ（★新しい値を作っていない）= `assets/css/pages/tenant-settings.css` の `.nbt-settings__chip` ／ `--on` ／ `--warn` ／ `--note` の 4 規則（と `.nbt-settings__count` の 1 規則 = `--count`）を、値を 1 つも変えずにここへ移した
 *     （基本 = 並び inline-flex・縦中央・間 4px・高さ 2rem〈=32px・`--cl-tap-m` ではなく手書きと同じ rem のまま〉・左右 8px・角 `--cl-radius-sm`・枠 1px `--cl-border`・地 `--cl-bg`・字 12px・`--cl-muted`・行間 1.5・太さは継ぐ・折り返しは許す）。
 *     ★色は `--cl-*` の変数から引く ＝ 暗い配色の値も手書きと同じ（暗い配色だけの規則は元から無かった）。
 *   ★修飾子 = `--on`（緑 = 使われている・入っている）／ `--warn`（琥珀 = 操作が効かない・効かなくなる）／ `--note`（文が入る札 = 上揃え・左寄せ・内側 8px・行間 1.7・高さを固定しない）。★右端へ寄せるのは Tailwind の `ml-auto`（部品は並べ方を持たない）。
 *   ★名前を `ies-tag` にしなかった理由: `pages/schedule.css` と `js/schedule-modal.js` に **別物の `.ies-tag`**（予定の宛先の消せる丸い札）が在る。同じ名前で部品の層に基本を置くと、あちらの札に高さ 32px と枠が漏れる。
 *   ★`--count` = 数だけの札（テナント設定の `.nbt-settings__count`・14 か所）。基本とは高さ・太さ・書体・縦の余白が違うので修飾子にした（値は旧の規則のまま・下の節）。
 *   ★渡さなければ出力は 1 バイトも変わらない。★この便でテナント設定の札 29 か所と数だけの札 14 か所を寄せた（旧の画面の規則は消した ＝ 2 本目の正本にしない）。★ほかの画面の手書きの枠つきの札を寄せるときは、値が同じか確かめてから（違えば修飾子を足す前に報告）。 */
.ies-plate {
  display: inline-flex;
  align-items: center;
  gap: var(--cl-sp-1);
  min-height: 2rem; /* 32px = 見た目 */
  padding: 0 var(--cl-sp-2);
  border-radius: var(--cl-radius-sm);
  border: 1px solid var(--cl-border);
  background: var(--cl-bg);
  color: var(--cl-muted);
  font-size: 0.75rem;
  line-height: 1.5;
}
.ies-plate--on {
  border-color: var(--cl-primary);
  background: var(--cl-primary-light);
  color: var(--cl-primary-dark);
}
.ies-plate--warn {
  border-color: var(--cl-warn-line);
  background: var(--cl-warn-light);
  color: var(--cl-warn-dark);
}
/* ★文が入る札（「中に N 件あるため削除できません」など）。★1 行に収まらないので高さを固定しない・折り返しを許す・丸い札のふりをさせない（角は基本のまま）。 */
.ies-plate--note {
  align-items: flex-start;
  min-height: 0;
  padding: var(--cl-sp-2);
  line-height: 1.7;
  text-align: left;
}
/* ★数だけの札（「役職 3」「権限 12」「教室 5」など・節の右肩や開閉の頭に並べる）。★値の出どころ = テナント設定の `.nbt-settings__count`（旧の 97〜108 行）を値を変えずに写した。
 *   ★基本と違う所だけ書く（色・地・枠・角・12px は基本のまま）= 縮まない（`flex: 0 0 auto`）・高さを固定しない（`min-height: 0`）・縦 4px × 横 8px・等幅・太字 700・折り返さない・行間は継ぐ（基本の 1.5 ではなく、旧と同じく body の 1.7 ＝ 高さ約 30.4px）。
 *   ★数と短い名前だけを入れる札に使う。★文が入る札は `--note`。 */
.ies-plate--count {
  flex: 0 0 auto;
  min-height: 0;
  padding: var(--cl-sp-1) var(--cl-sp-2);
  font-family: var(--cl-font-mono);
  font-weight: 700;
  line-height: inherit;
  white-space: nowrap;
}

/* --- ⑥チップ（押せる札） ------------------------------------
 * ★★**バッジとの違い = 押せるかどうか。**★見た目が似ていても役が違うので分ける。
 * ★★**定義が 2 か所に割れていた**（★`pages/messages.css:96` と `pages/schedule.css:1395`）。
 *   ★★**この 2 つは値が違う**（★片方は枠つきの白地・片方は淡い灰地）。
 *   ★→ ★**ここを正本にする。**★画面側の 2 本は、当てる便で外す（★段 4-1）。
 * ★当たり判定 = S(24px)。★★**周りを別の当たり判定が隙間なく囲んでいる並び**にだけ使う
 *   （★絞り込みの札は横に隙間なく並ぶ）。★単独で置くなら `.ies-btn--pill` を使う。 */
.ies-chip {
  display: inline-flex; align-items: center; justify-content: center;
  gap: var(--ies-sp-1);
  min-height: var(--cl-tap-s, 24px);
  padding: 0 var(--ies-sp-3);
  /* ★2026-08-30（K-1230）: `--ies-border`(1.28:1) → `--ies-border-strong`(3.03:1)。
     ★★押せる札は、輪郭が見えないと押せると分からない（WCAG 1.4.11）。 */
  border: 1px solid var(--ies-border-strong);
  border-radius: var(--ies-radius-full);
  background: var(--ies-surface);
  color: var(--ies-text-sub);
  font-size: 0.75rem; font-weight: 700; line-height: 1;
  /* ★2026-08-30（K-1230）: 上の札と同じ理由で、器を超えたら省略記号にする。 */
  white-space: nowrap; max-width: 100%; overflow: hidden; text-overflow: ellipsis;
  cursor: pointer;
  transition: background .15s, border-color .15s, color .15s;
}
.ies-chip:hover { border-color: var(--ies-jade-dark); color: var(--ies-jade-dark); }
.ies-chip:focus-visible { outline: 2px solid var(--ies-jade-dark); outline-offset: 1px; }
/* ★2026-08-30（K-1230）: 選択中を塗りにした（★上のボタンと同じ理由）。 */
.ies-chip.is-active,
.ies-chip[aria-pressed="true"] {
  background: var(--ies-jade-dark);
  border-color: var(--ies-jade-dark);
  color: var(--ies-surface);
}
/* ★★2026-08-30（K-1237）: 旧 `opacity: .5` はここから外した（★正本は「状態の層」）。
   ★実測 = 半透明だと文字が **2.23:1**（★必要 4.5）まで落ちていた。 */
/* ★中に `<input type="checkbox">` を隠して持つ形（★`pages/messages.css` が採っていた作り）。 */
.ies-chip > input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.ies-chip:has(input:checked) {
  background: var(--ies-jade-dark);
  border-color: var(--ies-jade-dark);
  color: var(--ies-surface);
}
/* ★2026-09-30（W-218）: 隠した input を持つ形は、焦点が札ではなく input に在る ＝ `.ies-chip:focus-visible` が当たらない。
 *   ★キーボードで辿ったとき札の外側に輪を出す（★値は下の「焦点」の節と同じ = 濃緑 2px・隙間 2px・K-1286）。 */
.ies-chip:has(input:focus-visible) { outline: 2px solid var(--ies-jade-dark); outline-offset: 2px; }
.ies-chip:has(input:disabled) {
  /* ★★2026-08-30（K-1237）: 半透明をやめ、★「状態の層」と同じ平らな灰にした。
     ★2026-09-19（K-1780）: 状態の層と同じく **地を塗らず・枠と字を 1 段薄く**（押せる札 = 強い罫 3.36・字 sub 6.69 → 薄い罫 1.28・字 mute 5.22）。 */
  background: transparent;
  color: var(--ies-text-mute);
  border-color: var(--ies-border);
  opacity: 1;
  cursor: not-allowed;
}
/* ★消せる札（★選んだ相手・絞り込みの解除）。★中の ✕ は `.ies-chip__x`。
   ★★**24px より小さくしない**（★2026-08-30 に実測して直した。★初版は 16px で、
     ★当たり判定の下限 S=24px を割っていた）。★★**消せる札は `--m`（32px）で使うこと。** */
.ies-chip__x {
  display: inline-flex; align-items: center; justify-content: center;
  width: 24px; height: 24px; flex-shrink: 0;
  margin-right: calc(var(--ies-sp-2) * -1);
  border: 0; background: transparent; color: inherit;
  cursor: pointer; border-radius: var(--ies-radius-full); line-height: 1;
}
.ies-chip__x:hover { background: var(--ies-border); }
/* ★1 段大きい札（★単独で押す絞り込み・並びが疎なとき）。 */
.ies-chip--m { min-height: var(--cl-tap-m, 32px); padding: 0 var(--ies-sp-4); font-size: 0.875rem; }
/* ★★2026-08-30（K-1230）: `align-items: center` を足した。
 *   ★★**無いと、同じ札が並びの中身しだいで 24px にも 32px にもなる**（★実測で再現）。
 *   ★見本帳では 32px に見えるのに、実画面では 24px で出る、という食い違いの原因。 */
.ies-chip-group { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ies-sp-2); }

/* --- ⑧タブ --------------------------------------------------
 * ★★**部品そのものが無かった**（★手書き 8 か所・`role="tab"` は 12 か所。★実測 2026-08-30）。
 * ★旧 CLAUDE.md の『デザイン言語』（★2026-09-13 に退避 = `docs/integration/CLAUDE-MD-RECORD-ARCHIVE.md` の『デザイン言語・共通パターン』871 行・値の正本は `noberu-design-system`）は **Pill 型**（丸い器の中で選択中だけ塗る）を定めている。
 *   ★★その形を既定にし、★**下線型は `--line` として別に持つ**（★画面の幅が足りないとき）。
 * ★★**`role="tablist" / "tab"` と `aria-selected` を正本にする。**
 *
 * ★★★2026-09-19（K-1778 = K-1773 の実装）: **見方の切り替えの部品はこれ 1 つ。外形は札の高さ（M 32px / L 44px）。**
 *   ★出どころ = 相澤さんのご指摘（逐語）「それぞれ月とか日のビューを切り替えるパーツだけどなんで高さも違えば
 *     下地も違うの？…２つの共通部品があるの？」→ ご判断「高さは３２でいいでしょう　４２だとやぼったいし
 *     ノートPC利用者の高さをその分だけ占有します」「地と枠は計算で決めていい…地は白に近いほうが見やすい」。
 *   ★旧 = 内側の余白 4px ＋ 枠 1px ＝ 外形 42px（段 24/32/44 の外）／ 道具の列（座席・予約）は別の部品で 32px・灰の地。
 *     ★道具の列の口（`parts/screen-toolbar.php`）もこの類名を出すようにした ＝ 見た目の正本はここだけ。
 *   ★★値の決め方（明暗比・計算 = WCAG の相対輝度・2026-09-19）:
 *     ・枠 = `--ies-border-strong`。★候補 2 つのうち、置き場所（面／ページの地）× 帯の地 × 明暗の配色の
 *       どの組でも 3:1 を超えるのはこれだけ（最小 3.00 = 白の帯をページの地に置いたとき）。`--ies-border` は 1.15〜1.44。
 *     ・地 = `--ies-surface`（白）。★地の候補 3 つ（白／副地／地）は置き場所との差がどれも 1.12 以下 ＝ 地では帯の形は
 *       出ない（形を出すのは枠）。★なので字と印の明暗比で選んだ: 選んでいない字 6.69（副地 6.30・地 5.97）／
 *       選んだ札の塗り 対 地 5.46（4.88）。★相澤さんの「白に近い地」とも合う。
 *     ・枠は場所を取らない内側の線（inset の影）＝ 外形が札の高さのまま。★余白 0・隙間 0 ＝ 押せる所が切れ目なく並ぶ。
 *     ・角丸 = 札と同じ 8px（★余白 0 なので外側 = 内側で同心・幾何）。★影は持たない（★押しもの `.ies-btn` と同じ。影はカードの印）。
 *   ★焦点の輪は札の内側に描く（★下の「焦点」の節）——★余白 0 の横に流れる箱は、外側の輪を上下で切り取るため。
 *   ★★縦ははみ出させない（`overflow-y: hidden`）。★`overflow-x: auto` だけだと縦も auto になり、押した札が 1px 沈む
 *     （`.ies-tab:active`）たびに縦のバー 15px が出て帯が広がった（★余白 0 なので沈んだ 1px が帯からはみ出す・
 *     旧は余白 4px が吸っていた。★実測 2026-09-19 = 座席管理 180 → 195px・下線型は前から同じ穴）。
 *   ★★札の地は枠線の 1px 内側で止める（★下の `.ies-tabs:not(.ies-tabs--line) .ies-tab`）——★枠線は帯の地と一緒に
 *     描かれるので、札の地（撫でた主色 10%・選んだ緑）がそのまま上に塗ると、帯の形を出している枠が消える。 */
.ies-tabs {
  display: inline-flex; align-items: center; gap: 0;
  padding: 0;
  border: 0;
  border-radius: var(--ies-radius-sm);
  background: var(--ies-surface);
  box-shadow: inset 0 0 0 1px var(--ies-border-strong);
  max-width: 100%; overflow-x: auto; overflow-y: hidden;
}
.ies-tab {
  display: inline-flex; align-items: center; justify-content: center; gap: var(--ies-sp-2);
  min-height: var(--cl-tap-m, 32px);
  padding: 0 var(--ies-sp-4);
  border: 0; border-radius: var(--ies-radius-sm);
  background: transparent; color: var(--ies-text-sub);
  font-size: 0.875rem; font-weight: 700; white-space: nowrap;
  /* ★2026-08-30（K-1230）: 器（`.ies-tabs`）は横スクロールするが、★**タブ自身が親を超えていた**
     （★1400px でも 3/6 が 124〜188px 超過）。★→ 縮められるようにし、超えたら省略記号。 */
  min-width: 0; max-width: 100%; overflow: hidden; text-overflow: ellipsis;
  cursor: pointer; transition: background .15s, color .15s;
}
/* ★★2026-09-19（K-1778）: 丸い器の中の札は、透明な 1px の枠を持ち、地をその内側で止める（`background-clip: padding-box`）。
   ★理由（幾何）= 器の枠線は場所を取らない線（inset の影）で、器の地と一緒に描かれる ＝ 札の地が上に塗ると枠が消える
     （★撫でた札の上下で枠が途切れ、2 枚の帯ではほぼ全部隠れた・2026-09-19 のレビューの実測）。
   ★透明な枠の下に器の枠線が見える ＝ 撫でても選んでも、帯の輪郭は途切れない。★高さは border-box で 32 / 44px のまま。
   ★下線型は別の姿（下線そのものが札の枠）なので当てない。 */
.ies-tabs:not(.ies-tabs--line) .ies-tab {
  box-sizing: border-box;
  border: 1px solid transparent;
  background-clip: padding-box;
}
/* ★★2026-09-19（K-1778）: 撫でた地を `--ies-surface-alt` → 主色 10%（`docs/ui/system/hover.md` の ⑤ = ② の値）。
   ★旧の副地は白の地に 1.06:1 ＝ 見えていなかった（主色 10% は 1.12:1・hover.md の床）。★選択中は下の規則が後ろで勝つ ＝ 何も起きない。 */
.ies-tab:hover { background: color-mix(in srgb, var(--ies-jade) 10%, var(--ies-surface)); color: var(--ies-text); }
.ies-tab[aria-selected="true"], .ies-tab.is-active {
  background: var(--ies-jade-dark); color: var(--ies-surface);
}
.ies-tab:focus-visible { outline: 2px solid var(--ies-jade-dark); outline-offset: 1px; }
/* ★★★2026-09-06: **指で押すタブの段（L = 44px）を足した。**
 *   ★★**なぜ**（★実測）: ★保護者の画面 2 枚が `.ies-tab` に `min-h-[44px]` を **Tailwind で直書き**
 *     していた（★門 `nb-test-ui-kit` の D）。★★**Tailwind は部品より後に読まれるので、直書きが勝つ。**
 *   ★★**＝ 部品の大きさが、画面ごとに黙って上書きされていた。**
 *   ★★**保護者・生徒はスマホで押す**ので、★段は L（44px）が正しい（K-1185 =「単独で押すもの」）。
 *   ★★既定（M・32px）は **PC で並べて置くタブ**のまま。★変えていない。 */
.ies-tab--l { min-height: var(--cl-tap-l, 44px); }
/* ★★2026-08-30（K-1237）: 旧 `opacity: .5` はここから外した（★正本は「状態の層」）。
   ★実測 = 半透明だと文字が **2.23:1**（★必要 4.5）まで落ちていた。 */
/* ★タブの中の件数。★選択中は面の色に反転する。 */
.ies-tab__count {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 18px; padding: 0 var(--ies-sp-1);
  border-radius: var(--ies-radius-full);
  /* ★2026-08-30: 同上（4.40 → 6.08）。 */
  /* ★★2026-09-19（K-1780）: 地を副地 → `--ies-border`。★副地は白の札の上で 1.06・撫でた札（主色 10%）の上で 1.05 ＝ 丸が見えていなかった
       （★数字は読めるが、札の中の「件数の囲み」に見えない）。★罫の灰は 白の札 1.28 ／ 撫でた札 1.15 ／ 下線型の地 1.15（暗 1.33 ／ 1.10 ／ 1.44）。
       ★字 sub は 5.21（暗 5.25）。★選んだ塗りの札の中では下の規則が面の色へ反転する（★変えていない）。 */
  background: var(--ies-border); color: var(--ies-text-sub);
  font-family: var(--ies-font-mono); font-size: 0.75rem; font-weight: 700;
}
/* ★★2026-08-30（K-1230）: 選択中のタブの中で **件数の丸が消えていた**
 *   （★地 #006843 と タブの地 #00794E の差が **1.26:1**）。★選んでいないタブでは見えるので、
 *   ★★**いま見ているタブでだけ形が壊れる**という質の悪い出方だった。
 *   ★→ 面の色で反転させる（★明 = 白の丸 ／ 暗 = 暗い丸。★どちらも 4.9:1 以上）。 */
/* ★★★2026-09-13（K-1697・★測って見つけた本物の欠陥）: **反転を「塗りのタブ」だけに絞った。**
 *   ★★**旧** = `.ies-tab[aria-selected="true"] .ies-tab__count { background: var(--ies-surface) }`（★容器を問わない）。
 *   ★★**何が起きていたか**（★実測・合成の板で明暗を計算）:
 *     ★**下線型（`--line`）の選択中のタブは、地が *透明* のまま**（★緑になるのは下線と文字だけ）。
 *     ★★そこへ丸を **面の色（白）** で塗っていたので、★★**白地に白 ＝ 丸が消えていた。**
 *     ★★**実測 = 8 組のうち 2 組が「消えている」**（★下線型・選択中の `__count` と `__dot`）。
 *   ★★**どこに出ていたか** = ★**保護者のお知らせ受信**が `--line` ＋ `__count` の組（★未読の数）。
 *     ★★未読が在って「未読」を選んでいるとき、★**数の囲みが消えていた**（★数字は読めるが札に見えない）。
 *   ★★**＝ K-1230 で足した反転は *塗りのタブ* のための直しだった。★容器を問わずに当てたのが誤り。**
 *   ★絞り方 = 容器が `--line` *でない* とき（★`:not()`）。★詳細度 (0,4,0) で素の (0,1,0) に勝つ。 */
/* ★2026-10-17: 窓型（`--window`）の選んだタブも地は白 ＝ 反転しない（★下線型と同じ理由）。 */
.ies-tabs:not(.ies-tabs--line):not(.ies-tabs--window) .ies-tab[aria-selected="true"] .ies-tab__count,
.ies-tabs:not(.ies-tabs--line):not(.ies-tabs--window) .ies-tab.is-active .ies-tab__count { background: var(--ies-surface); color: var(--ies-jade-dark); }
/* ★★★2026-09-13（K-1697）: **印だけの丸**（★数を出さず「ここに何か入っている」だけを伝える）。
 *   ★★**出どころ** = ★予定登録のモーダルが `.ies-modal__tab-dot` として **自分で持っていた**
 *     （★7px の丸・緑）。★★同じ役の実装が 2 つに割れていたので、★部品へ引き上げた。
 *   ★★**`__count` との使い分け** = ★**数が意味を持つなら `__count`** ／ ★**「在る／無い」だけなら `__dot`**。
 *   ★★**新しい色を作っていない**（★`--ies-jade-dark` ＝ 選択中のタブと同じ緑。★K-1229 の 2 色相の中）。
 *   ★`[hidden]` の逃げ道は根（`[hidden] { display: none !important; }`）が持っている（★上の注記）。
 *   ★★選択中のタブの中では **面の色へ反転する**（★`__count` と同じ考え方 ——
 *     ★反転しないと、★緑の地に緑の丸で **消える**）。 */
.ies-tab__dot {
  display: inline-block; flex-shrink: 0;
  width: 7px; height: 7px;
  border-radius: var(--ies-radius-full);
  background: var(--ies-jade-dark);
}
/* ★★反転は **塗りのタブだけ**（★上の `__count` と同じ理由・同じ絞り方）。
   ★★下線型では地が透明なので、★**緑のまま**にしておく（★白にすると消える）。 */
.ies-tabs:not(.ies-tabs--line):not(.ies-tabs--window) .ies-tab[aria-selected="true"] .ies-tab__dot,
.ies-tabs:not(.ies-tabs--line):not(.ies-tabs--window) .ies-tab.is-active .ies-tab__dot { background: var(--ies-surface); }
/* ★★2026-09-19 夜: 講習会の切り替え（年度 × 講習・`parts/lecture-switcher.php` の `nb_lec_switcher()`）。
   ★切り替え `.ies-tabs` の 2 組を 1 段に並べ、狭ければ 2 段に折り返す（★配置だけ・札の見た目は `.ies-tabs` が持つ）。 */
.nb-lec-switcher { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ies-sp-3, 12px); min-width: 0; }
/* ★下線型（★数が多い・横に長い並び）。 */
.ies-tabs--line {
  display: flex; gap: var(--ies-sp-4);
  padding: 0; border: 0; border-bottom: 1px solid var(--ies-border);
  border-radius: 0; background: transparent; box-shadow: none;
}
.ies-tabs--line .ies-tab {
  border-radius: 0; padding: 0 var(--ies-sp-1);
  border-bottom: 2px solid transparent;
}
.ies-tabs--line .ies-tab:hover { background: transparent; color: var(--ies-text); }
.ies-tabs--line .ies-tab[aria-selected="true"],
.ies-tabs--line .ies-tab.is-active {
  background: transparent; color: var(--ies-jade-dark); border-bottom-color: var(--ies-jade-dark);
}
/* ★★2026-10-17（経営報告書の見やすさ・設計書 docs/superpowers/specs/2026-10-17-keiei-ui-design.md §4-1）: **窓のタブ**（ブラウザの窓のタブの形）。
 *   ★相澤さん「予実…の部分は上位概念だから ブラウザのウィンドウのタブみたいなUIにしてもいい」・案 1 を選んだ（2026-10-17）。
 *   ★型の 3 つ目（塗りの帯・下線型・窓型）。★選んだタブは白い面になり、すぐ下の白い面（器が描く・`tab-shell.css` の窓の姿）とつながる。
 *   ★帯の下の線は器が描く（帯の `::after`）。★選んだタブは位置を持ち（z-index 1）、その線の上に白を塗ってつなぎ目を消す。
 *   ★字 16px（下の段の札 14px より 1 段上）・選んでいない 500 ／ 選んだ 700・高さ L（44px・画面の行き先を替える単独の押しもの）。
 *   ★選んだ印 = 白の地 ＋ 上辺の内側 2px の濃い緑（帯の地 #F2F2F2 に 4.88:1 ＝ 状態の印として 3:1 を超える）・字は濃い緑（白に 5.46:1）。
 *   ★値はトークンだけ。★既存の 2 つの型の値は 1 つも変えていない（K-1856）。 */
/* ★★2026-10-17 夜（磨き 1・相澤さん「磨き 1（反り・仕切り・撫でた面・最小幅、アイコンなし）を入れて本番へ出してください」・絵 = docs/ui/screens/経営報告書/ui-2026-10-17/KT-*.png）:
 *   ①選んだタブの下の 2 つの角を外へ反らせる（8px = 上の角と同じ半径・面の線と同じ色の弧）＝ タブが白い面から生えて見える（よい連続）。
 *   ②選んでいないタブどうしの間に 1px × 16px の仕切り（行の区切りの色 `--ies-row-rule`）。★選んだタブ・撫でたタブの両脇では消す。
 *   ③撫でたときはタブ全体を塗らず、内側の角丸の面（上下 6px 内側 ＝ 高さ 32px・左右 2px 内側・角 8px・主色 10%）＝ 下の段の札（M 32px）と同じ大きさの「押せる面」。
 *   ④最小幅 5rem（80px）＝ 2 字の名札（予実・在籍…）が 66px と細く、長い名札との幅の差が大きかった。★1280px の帯は 1 行のまま（実測 = タブの行 498px ＋ 範囲の箱 493px ＋ 間 16px ≦ 1,029px）。
 *   ★両端に反りのぶんの余白（8px）を持つ ＝ 1 枚目・最後のタブの反りが面の外へはみ出さない。★名札は日本語なので、太さが 500 ↔ 700 で変わっても幅は動かない（全角の字幅は太さで変わらない）。 */
.ies-tabs--window {
  display: flex; align-items: flex-end; gap: var(--ies-sp-1);
  padding: 0 var(--ies-radius-sm); border: 0; border-radius: 0; background: transparent; box-shadow: none;
}
.ies-tabs--window .ies-tab {
  position: relative; isolation: isolate; overflow: visible;
  min-width: 5rem; min-height: var(--cl-tap-l, 44px);
  padding: 0 var(--ies-sp-4);
  border: 1px solid transparent; border-bottom: 0;
  border-radius: var(--ies-radius-sm) var(--ies-radius-sm) 0 0;
  background: transparent; color: var(--ies-text-sub);
  font-size: 1rem; font-weight: 500;
}
/* ③撫でた面（★タブそのものは塗らない）。 */
.ies-tabs--window .ies-tab:hover { background: transparent; color: var(--ies-text); }
.ies-tabs--window .ies-tab:not([aria-selected="true"], .is-active)::after {
  content: ''; position: absolute; inset: 6px 2px; z-index: -1;
  border-radius: var(--ies-radius-sm); background: transparent; transition: background-color .12s;
  text-decoration: none;   /* ★空の絶対配置で字を持たない ＝ 下線は出ない。門 HOVERKIT の (B) は疑似要素と宿主を区別しないので、打ち消しを書いて数に入れる（見た目は変わらない） */
}
.ies-tabs--window .ies-tab:not([aria-selected="true"], .is-active):hover::after { background: color-mix(in srgb, var(--ies-jade) 10%, var(--ies-bg)); }
/* ②仕切り（★選んでいないタブが 2 枚続くところだけ・撫でたタブの両脇では消す）。 */
.ies-tabs--window .ies-tab:not([aria-selected="true"], .is-active) + .ies-tab:not([aria-selected="true"], .is-active)::before {
  content: ''; position: absolute; left: calc(var(--ies-sp-1) / -2 - 0.5px); top: 50%;
  width: 1px; height: 1rem; transform: translateY(-50%); background: var(--ies-row-rule);
}
/* ★消すのは選んでいないタブの ::before（仕切り）だけ。★選んだタブの ::before は①の左の反り ＝ 選んだタブを撫でる・その左隣を撫でると、
   反りが消えて左下だけ直角になっていた（2026-10-17 夜・相澤さんの絵・直し 1 回目）。★右の反り（::after）は③の規則が初めから選んだタブを除いている。 */
.ies-tabs--window .ies-tab:hover + .ies-tab:not([aria-selected="true"], .is-active)::before,
.ies-tabs--window .ies-tab:not([aria-selected="true"], .is-active):hover::before { opacity: 0; }
.ies-tabs--window .ies-tab[aria-selected="true"],
.ies-tabs--window .ies-tab.is-active {
  position: relative; z-index: 1;
  background: var(--ies-surface); color: var(--ies-jade-dark); font-weight: 700;
  border-color: var(--ies-border);
  /* ★下の線は引かない（★面とつなぐ）。★ここで消す理由 = 塗りの帯の規則 `.ies-tabs:not(.ies-tabs--line) .ies-tab`（0,3,0）が窓型にも当たり、
     上の `.ies-tabs--window .ies-tab`（0,2,0）の「下の線なし」を 1px の線で上書きしていた（2026-10-17 夜に測った・選んだタブの下に面の線と同じ色の 1px が残り、つながっていなかった）。 */
  border-bottom-width: 0;
  box-shadow: inset 0 2px 0 var(--ies-jade-dark);
}
/* ①反り（★選んだタブの外の左右 8px × 8px に、面の線と同じ色の弧と白い面を描く）。 */
.ies-tabs--window .ies-tab:is([aria-selected="true"], .is-active)::before,
.ies-tabs--window .ies-tab:is([aria-selected="true"], .is-active)::after {
  content: ''; position: absolute; bottom: 0;
  width: var(--ies-radius-sm); height: var(--ies-radius-sm); pointer-events: none;
}
.ies-tabs--window .ies-tab:is([aria-selected="true"], .is-active)::before {
  right: 100%;
  background: radial-gradient(circle at 0 0, transparent calc(var(--ies-radius-sm) - 1px), var(--ies-border) calc(var(--ies-radius-sm) - 1px), var(--ies-border) var(--ies-radius-sm), var(--ies-surface) calc(var(--ies-radius-sm) + 0.5px));
}
.ies-tabs--window .ies-tab:is([aria-selected="true"], .is-active)::after {
  left: 100%;
  background: radial-gradient(circle at 100% 0, transparent calc(var(--ies-radius-sm) - 1px), var(--ies-border) calc(var(--ies-radius-sm) - 1px), var(--ies-border) var(--ies-radius-sm), var(--ies-surface) calc(var(--ies-radius-sm) + 0.5px));
}
@media (prefers-reduced-motion: reduce) {
  .ies-tabs--window .ies-tab::after { transition: none; }
}
/* ★狭い画面では器いっぱいに広げる（★指で押せる幅を確保する）。
 *
 * ★★★2026-09-13: **等分される札は 2 行に折り返してよい**ようにした（`white-space: normal`）。
 *   ★★**なぜ**（★実測・担当 SHIFT3 が `assets/css/pages/shift-request.css` の注記に残していたもの）:
 *     ★シフト希望の 2 枚のタブが **幅 320px で黙って切れていた**
 *       （★箱 **122px** に対し中身 **126px**「固定シフト 未提出」／**133px**「月ごとの調整 受付中」）。
 *     ★★**省略記号は出ない** ——★`display: inline-flex` の中身に `text-overflow` は効かないので、
 *       ★★**文字が欠けていること自体が画面に出ない。**
 *     ★★**画面の側では直せない**（★2 枚を等分する帯なので、幅は部品が決めている）。
 *   ★★**なぜ折り返しでよいのか** = ★**等分されている札は幅が決まっている**ので、
 *     ★折り返しても隣へはみ出さない。★★逆に `--scroll` の札は**幅が中身で決まる**ので、
 *     ★折り返すと「横に流して読む」という意味が消える ——★だから下で `nowrap` に戻している。
 *   ★★**入り切っている帯は 1px も変わらない**（★折り返すのは、切れていた帯だけ）。
 *   ★`overflow: hidden` は残す ——★折り返しても入らない極端な場合の最後の受け皿。
 *   ★★**この決まりの正本 = `docs/ui/system/tabs.md`**（★値はここ・言葉はあちら。★同じ便で直す）。 */
@media (max-width: 560px) {
  .ies-tabs { display: flex; width: 100%; }
  .ies-tabs .ies-tab {
    flex: 1 1 0; padding: 0 var(--ies-sp-2);
    white-space: normal; text-align: center; line-height: 1.25;
    /* ★★2026-10-02（W-032・本棚 [793]）: **語の途中で折らない。**★旧は 560px 以下で日本語が字の途中で折れた（★教室設定の学年帯・科目のタブで出ていた・本棚 [793]）。
     *   ★`keep-all` = 日本語は字の間で折らず、空白（「固定シフト 未提出」の間）でだけ折る。★Chrome 119 以降は `auto-phrase` が文節で折る（★後ろの宣言が勝つ・古い端末は `keep-all` のまま）。
     *   ★`overflow-wrap: anywhere` = **それでも入らない長い札は字の途中で折る**（★`keep-all` だけだと折れずに `overflow: hidden` で切れる ＝ 旧より悪い）。★「語で折る・入らなければ字で折る」の組。
     *   ★詳細度は旧と同じ ＝ `--scroll`（`white-space: nowrap`）の札は折り返さないので、この 2 行も効かない。★測っていない: 実機の折れ方（★描いていない・推測）。 */
    word-break: keep-all;
    word-break: auto-phrase;
    overflow-wrap: anywhere;
  }
}
/* ★★★★2026-09-13 **撤去した（墓標）**。★下の規則は消えている。★以下は *なぜ在ったか* の記録である。
 *
 * ★★**撤去の理由（★相澤さんのご指摘・逐語・2026-09-12）**:
 *   > タブが２つなら２等分で幅いっぱいになるのか？／…とかだと２つか３つで挙動が違っておかしいよね
 *   > **タブは共通部品ですから共通部品の定義に従ってください**
 *   > もしタブに関する設計や実装がないのならそれは共通部品つまりコンポネントもしくはテンプレの設計が甘いですよね
 *
 *   ★★**この修飾子は「561px 以上でも幅いっぱいを等分するか」を *画面ごとの選択* にしていた。**
 *   ★実測 = ★名乗っていたのは **1 枚だけ**（保護者のお知らせ受信）／★名乗っていない帯は **8 枚**。
 *   ★★**＝ 同じ部品が、画面の好みで違う振る舞いをしていた。★それは部品の定義ではない。**
 *
 * ★★**撤去で見え方が変わった 1 か所（★実測・記録として残す）**:
 *   ★保護者のお知らせ受信の 3 枚が、★**561px 以上で** 等分（213.3px ずつ）→ **左寄せ**になった。
 *   ★★**560px 以下は 1px も変わっていない**（★96 / 114.3px ＝ 等分のまま。★上の `@media` が持っている）。
 *   ★★**保護者の実使用はスマホ**なので、実害はここに出ない。
 *
 * ★★**理屈**（★`docs/ui/system/tabs.md` §1 に全文）= ★下線型のタブは**名札の幅のまま左に並べ、
 *   下線だけを端まで伸ばす**のが標準（GitHub・Material の scrollable tabs・NN/g）。★3 枚を 672px に
 *   等分すると 1 枚 224px になり、★**名札が余白の中央に浮いて下線との結びつきが弱くなる。**
 *
 * ─── ★以下は撤去前の記録（★2026-09-12・担当 TAB2）───────────────
 *
 * ★旧 `--fill` = **タブが帯いっぱいを等分する**（★どの窓でも。★指で押す 3〜4 枚の並び向け）。
 *
 * ★★**なぜ部品の側に在るのか**（★2026-09-12・担当 TAB2）:
 *   ★★**保護者のお知らせ受信（`page-guardian-notices.php`）が `.ies-tab` に Tailwind の `flex-1` を
 *     直書きしていた。**★★**Tailwind は部品より *後* に読まれる**（`inc/assets.php` の `wp_enqueue_scripts` 9999）
 *     ので、★あの 1 語が **部品の決めた伸び縮みに勝っていた** ＝ 部品の仕組みが無効になっていた。
 *   ★★**相澤さんのご決定（逐語・2026-09-12）** =「これはコンポーネント化やテンプレ化に反するということ？
 *     であれば **絶対に許容してはダメです**」。
 *   ★★**＝ 画面の直書きをやめ、★その意図を「修飾子」として部品が持つ。**
 *     ★同じ直し方を 2026-09-06 に `--l`（44px の段）でやっている（★上の注記）。★**3 つ目の流儀を作らない。**
 *
 * ★★**何をするか** = 帯を `display: flex; width: 100%` にし、★タブを等分する（`flex: 1 1 0`）。
 *   ★★これは **560px 以下で部品が既にやっていること**（★上の `@media`）を、★**どの窓でも**に広げたものである。
 *   ★実測（2026-09-12・焼いた実画面を playwright の Chromium で 320/375/768/1280px の 4 窓で測った・お知らせ受信の 3 枚）:
 *     ★直書き（`flex-1`）と この修飾子で、★**帯とタブの幅・高さが 1px も動かない**
 *       （★タブ 96 / 114.3 / 213.3 / 213.3px・高さ 44px ／ 帯 320 / 375 / 672 / 672px ／ ページの横はみ出し 0px）。
 *     ★★＝ 見え方を変えずに、値の持ち主だけが画面から部品へ移った。
 *     ★計算値の **書き方**だけ変わる（`flex-basis` が `0%` → `0px`。★同じ意味・寸法は同じ）。
 *   ★★**「直書きを消すだけ」にすると見え方は変わる**（★実測 = 561px 以上で 3 枚が 48.5 / 36 / 36px の
 *     左寄せになる。★下線の帯は 672px のまま ＝ `--line` が `display: flex` なので）。★だから修飾子で受けた。
 *
 * ★★**`--scroll` と同時に名乗らない**（★意味が正反対 = 等分する / 縮ませない）。
 *   ★この修飾子は `--scroll` より **前**に置いてある ＝ 万一両方を名乗ったら `--scroll`（縮ませない）が勝つ。
 *   ★見張り = `tools/nb-test-tab-scroll.php` の **C-02**（★両方を名乗ったら赤）。
 * ★見張り = 同 **C-03 / C-04**（★定義が読めるか ／ 名乗る口が 1 つ以上あるか）。 */
/* ★★**`.ies-tabs--fill` の 2 規則は 2026-09-13 に消した。★名前ごと消している**
   （★名前だけ残すと「名乗れる」と読まれ、★また画面ごとの選択に戻る）。
   ★見張り = `tools/nb-test-tab-scroll.php` の **C-05**（★名前が戻ったら赤）。 */

/* ★★★`--scroll` = **タブを縮ませない**（★名札の幅のまま、★帯の中だけを横に流す）。
 *
 * ★★**なぜ部品の側に在るのか**（★2026-09-12・担当 TABCSS）:
 *   ★★**同じ 1 行が 2 か所に写しで在った** ——★`assets/css/pages/tab-shell.css`（★経営報告書の器）と
 *     ★`assets/css/pages/shift-request.css`（★シフト希望の提出）。★どちらも `flex: 0 0 auto` を自分で書いていた。
 *   ★★同じ規則が 2 か所にあると、直すとき必ず片方を忘れる（K-27）。★★**だから、この 1 行が repo で唯一の正本である。**
 *
 * ★★**いつ名乗るか** = ★タブが多くて、等分すると名札が切れる並び。
 *   ★★**切れても省略記号は出ない**（★`display: inline-flex` の中身に `text-overflow` は効かない）——
 *     ★★だから「入らない」ことが画面上で **何の合図も無く** 起きる。★これがこの修飾子の存在理由である。
 *   ★実測（2026-09-12・焼いた写しを playwright で測った・幅 768px・経営報告書の 7 枚）:
 *     ★名札に要る幅 32〜107px に対し、★見せていた幅は 28〜90px（★7 枚すべてが切れていた）。
 *
 * ★★**ページ本体の横スクロールは増えない。**★器（`.ies-tabs`）が `max-width: 100%` と `overflow-x: auto` を
 *   既に持つので、★流れるのは **帯の中だけ**（★実測 = 320/375/768/1280px の 4 窓とも、ページのはみ出し 0px）。
 *
 * ★★**詳細度は部品の既定と同じ (0,2,0)。★だから上の `@media` より *後ろ* に置くこと**
 *   （★同点なら後に読んだほうが勝つ）。★★**順を入れ替えると、狭い画面で黙って効かなくなる。**
 *
 * ★見張り = `tools/nb-test-tab-scroll.php`（★写しが戻ったら赤 ／ この 1 行を消したら赤 ／ 順を入れ替えたら赤）。 */
/* ★★★2026-09-13: 宣言に **`white-space: nowrap` を足した**（★折り返さない）。
   ★★**なぜ要るのか** = ★上の `@media (max-width: 560px)` が `.ies-tabs .ies-tab` に
     `white-space: normal` を当てたので、★**当てないとこの修飾子の札まで折り返す**。
   ★★**なぜ折り返してはいけないのか** = ★この修飾子の札は**幅が中身で決まる**。★折り返すと幅が縮み、
     ★★**「横に流して読む」という意味そのものが消える**（★14 本の月タブが縦に膨らむ）。
   ★★詳細度は上の `@media` と同点 (0,2,0) で、★**こちらが後ろに在るので勝つ**
     ——★★**順を入れ替えると、狭い画面で月タブが折り返して黙って高くなる。**
   ★★★**この 1 行を 1 行のまま保つ**（★改行して整形しない）——★毒 P6 / P7 がこの **字面を丸ごと**
     探しており、★★**整形を変えた瞬間に 2 本が空振りして「当たり判定」が赤になる**（★2026-09-13 に実際に出した）。
   ★見張り = `tools/nb-test-tab-scroll.php` の **C-06**（★折り返しの対と順）。 */
.ies-tabs--scroll .ies-tab { flex: 0 0 auto; white-space: nowrap; }
/* ★指で横に流すときの手ざわり（★iOS の慣性）。★寸法も色も変えない（★Chrome では何もしない）。 */
.ies-tabs--scroll { -webkit-overflow-scrolling: touch; }

/* --- ⑨空状態 ------------------------------------------------
 * ★★**部品そのものが無かった**（★手書き 34 か所 / 21 種。★実測 2026-08-30）。
 * ★★**4 つの部位を全部そろえる**（★アイコン・見出し・説明・次の一手）。
 *   ★説明だけの空状態は「何をすればよいか」を伝えないので、★**次の一手を置ける形にしてある。**
 *
 * ★★2026-10-02（W-032 ①・相澤さんの答え「見本の高さへ・丸の色はいまの灰のまま」）: **見本（月次の締めのモック）の寸法へ寄せた。**
 *   ★色は 1 つも変えていない（★丸の地と絵の色・題と説明の色はそのまま）。★変えたのは寸法と字だけ:
 *   | 部位 | 前 | 後（見本） |
 *   |---|---|---|
 *   | 余白（上下／左右） | 48／24 | 24／24 |
 *   | 部位の間（gap） | 12 | 8（★見本は絵と題 10・題と説明 6 ＝ 足して 16。★刻みに 10 と 6 が無いので 8 + 8） |
 *   | 絵の丸 / 中の絵 | 56px / 24px | 38px / 16px（★丸と絵の比 0.43 → 0.42 のまま縮めた） |
 *   | 題 | 16px・700 | 14px・500・行 1.5（★見本の 21px 行） |
 *   | 説明 | 14px・400 | 14px・400（★変えない。見本の 13px は字の刻み 12 / 14 / 16 の外 ＝ 上の `.ies-stat__label` の「13px を作らない」に従った・親の判断 2026-10-02） |
 *   ★★**太さ 500 を選んだ理由** = ★書体は `Noto+Sans+JP:wght@400;500;700` しか配られておらず（★上の K-1286）、★600 を書くと 700 に化ける。★500 は配られている段で、★`.ies-attachment__name` が既に使っている。
 *   ★箱の高さ = 227 → 約 147（★計算値・測っていない。★絵 38 ＋ 題 21 ＋ 説明 23.8〈14 × 行 1.7〉＋ gap 16 ＋ 余白 48。見本 144）。
 *   ★暗い配色の上書きは無い（★色は `--ies-border` / `--ies-text-sub` / `--ies-text-mute` が暗い側で切り替わる）。 */
.ies-empty {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: var(--ies-sp-2);
  padding: var(--ies-sp-5);
  text-align: center;
  color: var(--ies-text-mute);
}
.ies-empty__icon {
  display: inline-flex; align-items: center; justify-content: center;
  width: 38px; height: 38px;
  border-radius: var(--ies-radius-full);
  /* ★2026-08-30: 同上（4.40 → 6.08）。
   * ★2026-09-19（本棚 [734]）: 地を副地 → 罫の灰（中立の札・絵の器と同じ）。★副地は白に 1.06 で丸が見えず、絵だけが浮いていた。 */
  background: var(--ies-border); color: var(--ies-text-sub);
  font-size: 1rem; line-height: 1;
}
.ies-empty__title { margin: 0; font-size: 0.875rem; font-weight: 500; line-height: 1.5; color: var(--ies-text); }
.ies-empty__text  { margin: 0; font-size: 0.875rem; color: var(--ies-text-mute); max-width: 32em; }
.ies-empty__action { margin-top: var(--ies-sp-2); }
/* ★表や一覧の中に差し込む小さい形（★行の代わりに置く）。 */
.ies-empty--inline { padding: var(--ies-sp-5) var(--ies-sp-4); gap: var(--ies-sp-2); }
.ies-empty--inline .ies-empty__icon { width: 32px; height: 32px; font-size: 1rem; }
.ies-empty--inline .ies-empty__title { font-size: 0.875rem; }

/* --- ⑩モーダル ----------------------------------------------
 * ★★**2026-08-30（K-1228）: `assets/css/pages/schedule.css` から**ここへ引き上げた。**
 *
 * ★★**親は当初、別の語彙で新しく作ろうとした。★誤りだった**（★別プロセスの棚卸しで判明）:
 *   ★親案 = `.ies-modal` が**覆い**、`.ies-modal__box` が箱。
 *   ★既存 = `.ies-modal-backdrop` が**覆い**、`.ies-modal` が**箱**。★★**上下が逆である。**
 *   ★★**既存は現役**（★markup で 32 か所・`parts/schedule-modal.php` ほか JS 6 本）。
 *   ★★**親案をそのまま入れていたら、予定モーダルが `position:fixed; inset:0` になって壊れていた。**
 *   ★→ ★★**既存の語彙を正本として採り、親案は捨てた。**★語彙を 2 つ作らない。
 *
 * ★★**引き上げた理由** = ★`pages/schedule.css` は **`templates/page-dashboard.php` からしか配られない**。
 *   ★★**＝ 他の 20 画面のモーダルには、この部品が存在しなかった。**★だから皆が手で書いていた
 *     （★手書き 50 か所 / 実装 21 種。★実測 2026-08-30）。
 *
 * ★★**値で変えたもの（★正直に書く）**:
 *   ・箱の角丸 8px → **16px**（★受け入れ条件「カード・モーダル = 16px」に合わせた）
 *   ・見出しの余白 `14px 20px` → **12px 24px**（★刻みに載せた）
 *   ・本文の余白 `20px` → **24px** ／ 足元 `12px 20px` → **12px 24px** ／ 足元の角丸 10px → 8px
 *   ・★**それ以外は 1 バイトも変えていない**（★位置・大きさ・影・高さの計算はそのまま）。
 * ★★**閉じ方は 3 つ**（✕ ／ 背景を押す ／ Esc）。★JS の約束は画面が持つ。 */
.ies-modal-open { overflow: hidden; }
.ies-modal-backdrop {
  position: fixed;
  inset: 0;
  background: var(--ies-scrim, rgba(20, 20, 20, .5));
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 1000;
  padding: var(--ies-sp-4);
  overflow-y: auto;
  /* ★★★2026-09-06: **ぼかしを部品へ引き上げた。**
   * ★★**なぜ**: ★家の作法（旧 CLAUDE.md『デザイン言語』・2026-09-13 に退避 = `docs/integration/CLAUDE-MD-RECORD-ARCHIVE.md` の『デザイン言語・共通パターン』872 行・値の正本は `noberu-design-system`）が「モーダル = `bg-ink/40 backdrop-blur-sm`」と
   *   定めているのに、★★**部品はぼかしを持っていなかった。**
   *   ★★＝ 画面が Tailwind の `backdrop-blur-sm` を **部品の上に重ねる**しかなく、
   *     ★実測で **16 か所**がそう書いていた（★門 `nb-test-ui-kit` の D が名指しした）。
   * ★★**部品が持てば、★どの画面も 1 語も書かなくてよくなる。**
   * ★`-webkit-` を添える理由 = ★Safari が接頭辞つきしか見ない版を今も配っている
   *   （★`assets/css/menu-shell.css:27` が同じ形で先に書いている ——★2 つ目の正本を作らない）。
   * ★★値は Tailwind の `backdrop-blur-sm` と同じ **4px**（★新しい数字を作っていない）。 */
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
}
.ies-modal-backdrop[hidden] { display: none; }
.ies-modal {
  background: var(--ies-surface);
  /* ★★2026-08-31（K-1249）: 16px → **12px**（★面はすべて 12px）。
     ★★下の `overflow: hidden` の理由は変わらない（★足元の子が親の丸みを塗る問題）。 */
  border-radius: var(--ies-radius-md);
  /* ★★2026-08-30 追記（K-1230・★反映前のレビューが見つけた）: **`overflow: hidden` が要る。**
     ★★**なぜ** = ★引き上げのときに箱の角丸を 8px → **16px** にしたが、
     ★★**足元（`__foot`）の下 2 角は 8px のままで、しかも地の色が違う**（★白 と #FAFAFA）。
     ★→ ★★**親の 16px の丸みの内側を、子の 8px の角が塗る**＝ 暗幕の上に薄い灰の角が左右に出る。
     ★★**足元を持つ全モーダルで出る**（★予定モーダルを含む）。★1 行で閉じる。 */
  overflow: hidden;
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.25);
  width: 100%;
  max-width: 640px;
  display: flex;
  flex-direction: column;
  height: calc(100vh - 32px);
  max-height: calc(100vh - 32px);
  /* dvh 対応ブラウザでは可視領域基準で正確な高さに (iOS アドレスバー対策) */
  height: calc(100dvh - 32px);
  max-height: calc(100dvh - 32px);
}
/* ★幅の 3 段。★手書きの 21 実装は max-w-md / lg / 2xl / 3xl の 4 段に散っていた（★実測）。 */
.ies-modal--s { max-width: 440px; }
.ies-modal--l { max-width: 800px; }
.ies-modal--full { max-width: 1080px; }
/* ★中身が短いモーダルは、画面いっぱいに伸ばさない。 */
.ies-modal--auto { height: auto; max-height: calc(100dvh - 32px); }
.ies-modal__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--ies-sp-3);
  padding: var(--ies-sp-3) var(--ies-sp-5);
  border-bottom: 1px solid var(--ies-border);
  flex-shrink: 0;  /* body が長くてもヘッダーは縮めない */
}
.ies-modal__head h2 { font-size: 1rem; font-weight: 700; margin: 0; }
/* ★見出しの語。★`h2` に頼らずに書けるようにする（★見出しの階層は画面が決める）。 */
.ies-modal__title { margin: 0; font-size: 1rem; font-weight: 700; color: var(--ies-text); min-width: 0; }
/* ★★2026-08-30（K-1230）: **キットの中で ✕ だけが作法の外**だった
 *   （★40×32 の中に 24px の字 = 60%。★キット中いちばん重いアイコン。★地の変化も焦点表示も無し）。
 *   ★→ アイコンボタンと同じ寸法・同じ当たり判定（32px）・同じ hover にした。 */
.ies-modal__close {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: var(--cl-tap-m, 32px); min-height: var(--cl-tap-m, 32px);
  background: none; border: 0;
  border-radius: var(--ies-radius-full);
  font-size: 1rem; line-height: 1;
  cursor: pointer;
  color: var(--ies-text-mute);
  padding: var(--ies-sp-1);
}
.ies-modal__close:hover { background: var(--ies-border); color: var(--ies-text); }   /* ★2026-09-19 本棚 [734]: 絵だけのボタンの撫でた地と同じ */
/* ★★2026-10-22（K-2178・部品を足す 2・RB1 ⑧）: **窓の見出しと本文の間に置く 1 行の帯**（`__lead`・振替の期限の知らせの包みなど）。
 *   ★なぜ: 保護者の授業予定の振替の窓が、見出し（`__head`）と本文（`__body`）の間の知らせの包みを `px-5 pt-3 flex-shrink-0` で手書きしていた。
 *   ★値の出どころ = 窓の見出し・本文・足と **同じ左右 24px**（`--ies-sp-5`）・上 12px（`--ies-sp-3`）・下 0・縮まない（本文が長くても見出しの下から消えない ＝ `__head` `__foot` と同じ）。
 *     ★★**手書きの `px-5` は 20px で、窓の見出し・本文・足の 24px と 4px ずれていた**（部品化の担当の推奨のまま 24px にそろえた・K-2178 は部品に最終的にそろう限り推奨で進める決定）＝ 期限の知らせが左右 4px 内側へ入る（見た目が変わる・窓の見出しの字の頭とそろう）。
 *   ★渡さなければ出力は 1 バイトも変わらない。★置き換えるときは `px-5` `pt-3` `flex-shrink-0` を消す。 */
.ies-modal__lead {
  padding: var(--ies-sp-3) var(--ies-sp-5) 0;
  flex-shrink: 0;
}
.ies-modal__body {
  padding: var(--ies-sp-5);
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  flex: 1 1 auto;
  min-height: 0;  /* flex child が content height で広がるのを防ぎ、overflow:auto を確実に効かせる */
}
.ies-modal__foot {
  padding: var(--ies-sp-3) var(--ies-sp-5);
  border-top: 1px solid var(--ies-border);
  display: flex;
  gap: var(--ies-sp-2);
  align-items: center;
  background: var(--ies-bg);
  /* ★★★K-1329 (2026-09-01・相澤さんの実機報告「モーダルの四隅の角丸が消えかかっている」):
   *   ★★**旧記述の 2 行（`border-bottom-*-radius: var(--ies-radius-lg)`）を削除した。**
   *   ★旧記述 =「★2026-08-30: 箱の角丸に合わせる（★上の `overflow: hidden` と二重の備え）」。
   *
   *   ★★**何が起きていたか**（★本番の実画面で `getComputedStyle` で測った・2026-09-01）:
   *     ・器  `.ies-modal`      … `border-radius: 12px` ＋ `overflow: hidden`
   *     ・足元 `.ies-modal__foot` … `border-radius: 0 0 **16px** 16px`（★地の色は #FAFAFA）
   *   ★★＝ **12px で切り抜く器の中に、16px の丸みを描いていた。**★はみ出した分が切り落とされ、
   *     ★角がえぐれて「丸みが消えかかっている」ように見える。
   *
   *   ★★**原因は「同じ値を 2 か所に書いた」こと。**★K-1249（2026-08-31）が器を 16px → 12px に
   *     下げたとき、★★**写しの側（この 2 行）が `--ies-radius-lg`＝16px のまま取り残された。**
   *     ★「二重の備え」と名乗っていたが、★★**備えではなく 2 つ目の正本だった。**
   *
   *   ★★**足す形では直さない**（★12px に書き換えると同じ事故がもう一度起きる）。
   *     ★★**角丸の正本は器の 1 か所だけ**にし、★切り抜きは器の `overflow: hidden` に任せる。
   *   ★★あわせて `.ies-modal--sheet`（狭い画面で下から出す形・下 2 角は角丸 0）も正しくなる
   *     —— ★旧記述のままだと、あちらでは**下が四角い器の中に 16px の丸い足元**が居た。 */
  flex-shrink: 0;  /* body が長くてもフッターは縮めない (画面外に押し出されない) */
}
.ies-modal__foot-spacer { flex: 1; }
.ies-modal__err {
  margin-top: var(--ies-sp-3);
  padding: var(--ies-sp-2) var(--ies-sp-3);
  border-radius: var(--ies-radius-sm);
  background: var(--ies-danger-soft);
  /* ★2026-08-30: 文字を `--ies-danger`(3.95:1) → `--ies-danger-ink`(5.30:1) にした（K-1219 と同じ理由）。 */
  color: var(--ies-danger-ink);
  font-size: 0.875rem;
  border: 1px solid var(--ies-danger-soft);
}
/* ★★2026-09-12（親・担当 SCHTO の申し送り）: 赤い案内の中の導線は、案内の文字と同じ色にする（★下線と太さで導線だと分ける）。
   ★理由 = 全体の `a` の緑は、この淡い赤の地の上で 4.47:1 ＝ 基準 4.5 に届かない（★案内の文字色は 5.30:1）。
   ★★旧は台本（schedule-modal.js）が `style.color = 'inherit'` を直書きしていた → 正本の CSS へ移した。 */
.ies-modal__err a { color: inherit; }
/* ★2026-08-30（K-1228）: `pages/schedule.css` の @media から移した。★全画面のモーダルに効かせる。 */
@media (max-width: 720px) {
  .ies-modal { max-width: 100%; }
}
/* ★★狭い画面で下から出す形。★★**印を付けたモーダルだけ**（★既存の全モーダルを勝手に変えない）。 */
@media (max-width: 560px) {
  .ies-modal--sheet {
    align-self: flex-end;
    max-width: none;
    height: auto;
    max-height: 92dvh;
    border-radius: var(--ies-radius-lg) var(--ies-radius-lg) 0 0;
  }
  /* ★★2026-09-24（K-1870）: カードの足の狭い画面の形 `.ies-card__foot--stack` も、覆いの足と同じ規則に載せた。
     ★並びは「やめる → 主」（主が最後）。★逆順に積むので、狭い画面では主が上に全幅になる。★値を 2 か所に書かない。 */
  .ies-modal--sheet .ies-modal__foot,
  .ies-card__foot--stack { flex-direction: column-reverse; }
  .ies-modal--sheet .ies-modal__foot > .ies-btn,
  .ies-card__foot--stack > .ies-btn { width: 100%; }
}

/* --- ⑪告知（画面の中に置く帯） ------------------------------
 * ★★既存の `.ies-notice` / `.ies-notice-success` は**この下に在る画面専用の形**である
 *   （★添付一括削除の画面が使っている）。★★**新しく書くときはこちらを使う。**
 * ★★**色だけで意味を伝えない**（★アイコンと見出しを添える形にしてある）。 */
.ies-alert {
  display: flex; align-items: flex-start; gap: var(--ies-sp-3);
  padding: var(--ies-sp-4);
  border: 1px solid var(--ies-border);
  border-radius: var(--ies-radius-md);
  background: var(--ies-surface-alt);
  color: var(--ies-text);
  font-size: 0.875rem;
}
.ies-alert__icon { flex-shrink: 0; font-size: 1.125rem; line-height: 1.4; }
.ies-alert__body { min-width: 0; }
.ies-alert__title { margin: 0; font-weight: 700; }
.ies-alert__text  { margin: 0; color: var(--ies-text-sub); }
/* ★★2026-08-30（K-1229）: 告知は **3 通り**にした（★中立 ／ 緑 ／ コーラル系）。
 *   ★`--info`（青）は**中立**にした ＝ ★★**情報は応答を求めないので色を持たない。**
 *   ★`--warn`（琥珀）は**コーラル**へ畳んだ。★`--danger` は赤のまま（★同じ暖色の一族の強い側）。 */
/* ★★2026-10-02（W-032・問い 174 (b)・相澤さん「推奨の通りでいい」）: **案内（`--info`）は、部品がもともと持つ枠（`--ies-border`・白に 1.28:1）を戻した。**
 *   ★旧は枠を透明に消し、★地（副地 #F8F8F8）だけで形を出していた ＝ 白の面に **1.06:1 で、箱の形が見えなかった**（★使い手 = 24 か所・13 ファイル・2026-10-02 に PHP と JS を字で数えた ＝ 本棚の「26・14」は旧い数）。
 *   ★地は今のまま軽くしておく（★地を灰にして 1.28:1 にする案は、大きい箱で重く見えるので取らない）。★ほかの 3 つ（成功・注意・危険）は色つきの地が形を出すので透明のまま。 */
.ies-alert--info    { background: var(--ies-surface-alt); }
.ies-alert--info    .ies-alert__icon { color: var(--ies-text-sub); }
.ies-alert--success { background: var(--ies-jade-soft); border-color: transparent; }
.ies-alert--success .ies-alert__icon { color: var(--ies-jade-dark); }
.ies-alert--warn    { background: var(--ies-coral-soft); border-color: transparent; }
.ies-alert--warn    .ies-alert__icon { color: var(--ies-coral-ink); }
.ies-alert--danger  { background: var(--ies-danger-soft); border-color: transparent; }
.ies-alert--danger  .ies-alert__icon { color: var(--ies-danger-ink); }

/* --- ⑫知らせ（消える通知） ----------------------------------
 * ★★**2026-08-30（K-1228）: `assets/css/pages/schedule.css` から**ここへ引き上げた。**
 *   ★★**親案は捨てた**（★右上・緑地）。★既存は**右下・濃い地**で、★`is-visible` の出入りと
 *     4 つの種別を既に持っていた。★★**成熟している側を正本にする。**
 *   ★★**引き上げた理由** = ★`pages/schedule.css` は `templates/page-dashboard.php` からしか配られない。
 *     ★ところが `assets/js/toast.js`（`window.iesToast`）は**どの画面からでも呼べる**。
 *     ★★**＝ ダッシュボード以外で呼ぶと、地も影も無い裸の文字が出ていた。**
 *   ★★**値は 1 つも変えていない**（★`12px 16px` → `sp-3 sp-4` は同値。★`gap:16px` → `sp-4` も同値）。
 *   ★下の K-491 / K-611 の注記は、引き上げ前からのもの（★履歴として残す）。 */
/* K-491 (2026-06-19): 旧 .ies-toast 二重定義 (block1=配置担当 / block2=見た目担当) を
   1ブロックに統合 (dedup)。値は統合前の「実効値」(後勝ち適用後) をそのまま採用し全画面見た目不変。 */
/* ★★★K-1337（2026-09-01・相澤さんのご指摘）: **知らせを画面の下 → 帯のすぐ下（右上）へ移した。**
 *
 * ★逐語 =「出退勤を押すとトーストが出ると思いますが **現状なぜか画面下部に出ます**ので
 *   **ボタン付近の UI 上正しい位置に出るようにしてください**」。
 *
 * ★★**「なぜか」の答え**（★実測）= ★元から下だった。★`templates/page-dashboard.php` の注記が
 *   「★トーストは `position:fixed` で **画面の右上**」と書いていたが、★★**あれが嘘だった**
 *   （★実装は `bottom: 24px` / `bottom: 20px` ＝ **右下**）。★注記だけが実装とずれていた。
 *
 * ★★**なぜ右上が正しいか** = ★この知らせを出す操作（出退勤）は**帯の右上**に在る。
 *   ★★**押した場所と、結果が出る場所が、画面の対角に離れていた。**
 *   ★人は押した指の近くを見るので、★★**下に出た知らせは見落とされる**。
 *
 * ★★**位置** = ★帯の高さ（`--ies-header-h`＝広い窓 45px・狭い窓 767px 以下は帯の実寸〈CSS の 57px を台本が実寸で上書き・W-269〉）＋ 8px の下、右は **24px**（★帯の余白と同じ線に乗せる）。
 *
 * ★★**あわせて `.ies-toast` の `position: fixed` をやめた**（★器の中で流す形へ）。
 *   ★★**なぜ** = ★器も知らせも両方 `fixed` だったので、★★**器の `flex` と `gap` は 1 つも効いていなかった**
 *     （★2 枚目が出れば重なる作り）。★いまは 1 枚しか出さない実装（`toast.js` の `clearExisting`）
 *     なので表には出ていなかったが、★**器を置いている意味が無かった。**
 *   ★★これで位置の正本が **器ただ 1 つ**になる（★2 か所に座標を書かない）。 */
#ies-toast-container {
  position: fixed;
  top: calc(var(--ies-header-h, 45px) + var(--ies-sp-2, 8px));
  right: var(--ies-sp-5, 24px);
  bottom: auto;
  z-index: 1500;
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: var(--ies-sp-2);
  pointer-events: none;
}
/* ★★2026-10-22（K-2178・部品を足す 2・RB1 ⑨）: **知らせを画面の下の中央に置く器**（`.ies-toast-dock`・保護者の画面用）。★上の `#ies-toast-container`（右上・`toast.js` が作る）とは別の器で、置き場所の正本はこちら。
 *   ★なぜ: 保護者ホームと授業予定が、知らせ `.ies-toast` を入れる器を `fixed left-0 right-0 px-3 flex justify-center pointer-events-none` ＋ `style="z-index:1200; bottom:calc(1.625rem + var(--nb-gtab-h, 0rem) + env(safe-area-inset-bottom,0px))"` で 2 画面とも手書きしていた（`style=` も 2 か所）。
 *   ★値の出どころ（★新しい値を作っていない）= 手書きの `px-3`（`--cl-sp-3`）と inline の `z-index:1200` ／ `bottom:calc(…)` をそのまま。`--nb-gtab-h` は下のメニュー〈`.nb-gtab`〉の高さ（下の `:root` が定義・既定 0）＝ メニューが在る狭い幅のときだけ知らせを持ち上げる。
 *   ★器は押しを受けない（`pointer-events: none`）。★中の `.ies-toast` は見えないとき押しを受けず、`is-visible` のときだけ受ける（上の `.ies-toast:not(.is-visible)`）。★`role="status"` `aria-live="polite"` は画面が器に付ける（読み上げの印）。
 *   ★渡さなければ出力は 1 バイトも変わらない。★置き換えるときは `fixed` `left-0` `right-0` `px-3` `flex` `justify-center` `pointer-events-none` ＋ `style="z-index:…; bottom:…"` を消す。 */
.ies-toast-dock {
  position: fixed;
  left: 0;
  right: 0;
  z-index: 1200;
  bottom: calc(1.625rem + var(--nb-gtab-h, 0rem) + env(safe-area-inset-bottom, 0px));
  display: flex;
  justify-content: center;
  padding-inline: var(--cl-sp-3, 0.75rem);
  pointer-events: none;
}
.ies-toast {
  position: static;   /* ★K-1337: 器の中で流す（★座標は器が持つ） */
  z-index: 99999;
  background: var(--ies-text);
  color: var(--ies-surface);
  padding: var(--ies-sp-3) var(--ies-sp-4);
  /* K-611: 枠は【全テーマ共通の構造】として常に 1px 持つ。色だけをテーマで変える。 */
  border: 1px solid transparent;
  border-radius: var(--ies-radius-md);
  display: flex;
  align-items: center;
  gap: var(--ies-sp-4);
  min-width: 280px;
  max-width: 480px;
  pointer-events: auto;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
  font-size: 0.875rem;
  opacity: 0;
  transform: translateY(8px);
  transition: opacity 200ms ease, transform 200ms ease;
}
.ies-toast.is-visible { opacity: 1; transform: translateY(0); }
/* ★★2026-09-12（親・担当 GHUI の申し送り）: 見えないとき（透明）は押しを受けない。
   ★理由 = 透明でも `pointer-events: auto` のままだと、下にあるものの押しを横取りする
   （★実測 = 保護者のスケジュールで、頭の下半分を格子状に押して 1551 点中 207 点を奪っていた）。
   ★出すときは台本が `is-visible` を足す（★toast.js・schedule.js・保護者のホームとスケジュールの 4 か所とも、この形で確認）。 */
.ies-toast:not(.is-visible) { pointer-events: none; }
/* ★W-266（2026-10-03）: 旧 =「1 行で切る」（white-space:nowrap・text-overflow:ellipsis）。長い知らせの右端が消えていた → 2 行まで折り返し、3 行目からは 2 行目の末尾が「…」。
 *   ★使い先 4 か所（toast.js・schedule.js・page-guardian-home.php・page-guardian-schedule.php）ぜんぶに効く。`min-width:0` は flex の子が中身の幅で縮まない穴を塞ぐ。 */
.ies-toast__msg {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  overflow-wrap: anywhere;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  line-clamp: 2;
}
.ies-toast__action {
  background: transparent;
  border: 1px solid rgba(255, 255, 255, 0.4);
  color: var(--ies-surface);
  border-radius: var(--ies-radius-xs);
  /* ★2026-08-30: 実測 30px で刻み（24/32/44）から外れていたので M に乗せた。 */
  min-height: var(--cl-tap-m, 32px);
  padding: var(--ies-sp-1) var(--ies-sp-3);
  cursor: pointer;
  font-size: inherit;
  font-weight: 700;
  white-space: nowrap;
}
.ies-toast__action:hover { background: rgba(255, 255, 255, 0.1); }
/* ★★2026-08-30（K-1228・★ブラウザで測って直した）: 種別の地を 2 つ差し替えた。
 *   ★★**なぜ** = ★描いて測ったら、★**白文字が地に対して基準を割っていた**:
 *     ・警告（`--ies-warn` #D97706 × 白）= **3.19:1** ★4.5 未達
 *     ・情報（`--ies-info` #2F7CE0 × 白）= **4.13:1** ★4.5 未達
 *   ★→ ★同じ色相の 1 段濃い値（`-ink`）に差し替えた = **5.03:1 / 5.14:1**（★機械で選んだ値）。
 *   ★成功（#00794E × 白 = 5.46）と失敗（#DC2626 × 白 = 4.83）は元から満たしている。 */
/* ★★2026-08-30（K-1229）: 青と琥珀を外した。★`--info` は素と同じ（★色を持たない）。
 *   ★`--warning` はコーラルの濃色（★白文字で 5.31:1）。★名前は 4 つとも残す ——
 *   ★`toast.js` が `'ies-toast--' + type` で組み立てるので、★消すと綴りだけが宙に浮く。 */
.ies-toast--success { background: var(--ies-jade-dark); }
/* ★★2026-08-30 訂正（★反映前のレビューの指摘）: 上の「値は 1 つも変えていない」は、
   ★★**この行に限っては失効した**（★K-1229 が同じ日の後の作業で色を変えたため）。
   ★★**`--info` は素と同じ色である。★これは意図**（★情報は応答を求めないので色を持たない）。
   ★★**＝ この修飾子は「何もしない」ことが仕事。**★名前だけ残しているのは `toast.js` が
   　`'ies-toast--' + type` で組み立てるからで、★消すと綴りが宙に浮く。 */
.ies-toast--info    { background: var(--ies-text); }
.ies-toast--warning { background: var(--ies-coral-ink); }
.ies-toast--error   { background: var(--ies-danger); }
/* ★★K-1337（2026-09-01）: 狭い画面の規則も **器の側へ移した**（★`.ies-toast` は静かに流れるだけになったため、
 *   ★あちらに `left/right/bottom` を書いても 1 つも効かない）。
 *   ★★狭い画面では左右いっぱいに広げる（★旧と同じ考え方）。★★ただし**上に出す**のは変えない ——
 *     ★押した場所（帯の右上）の近くに出す、というのがこの直しの本体だから。 */
@media (max-width: 640px) {
  #ies-toast-container {
    left: var(--ies-sp-3, 12px);
    right: var(--ies-sp-3, 12px);
    align-items: stretch;
  }
}
/* K-295(B): 暗い配色（★引き上げ前は `pages/schedule.css` の末尾に在った）。 */
[data-theme="dark"] .ies-toast {
  background: var(--ies-surface);
  border-color: var(--ies-border);
  color: var(--ies-text);
}
[data-theme="dark"] .ies-toast__action { color: var(--ies-text); }
/* ★★2026-08-30（K-1228）: 暗い配色は **文字色も一緒に指定する**。
 *   ★★**なぜ（★これは元からの欠陥）** = ★暗い配色の素は `color: var(--ies-text)`（明るい文字）だが、
 *     ★種別の地は**明るい色**（琥珀・青・赤・緑）なので、★★**明るい地に明るい文字**になっていた
 *     （★実測 = 警告で 約 1.6:1 ＝ ほぼ読めない）。
 *   ★→ ★種別を付けたときだけ**暗い文字**に戻す。★成功は 1 段明るい緑にする（★暗い地の上で 9.7:1）。 */
[data-theme="dark"] .ies-toast--success { background: var(--ies-jade); color: var(--ies-bg); }
[data-theme="dark"] .ies-toast--info    { background: var(--ies-surface); color: var(--ies-text); }
[data-theme="dark"] .ies-toast--warning { background: var(--ies-coral); color: var(--ies-bg); }
[data-theme="dark"] .ies-toast--error   { background: var(--ies-danger); color: var(--ies-bg); }
[data-theme="dark"] .ies-toast--success .ies-toast__action,
[data-theme="dark"] .ies-toast--warning .ies-toast__action,
[data-theme="dark"] .ies-toast--error .ies-toast__action { color: var(--ies-bg); border-color: rgba(0, 0, 0, 0.35); }

/* =========================================================
 * ★★★UI キット・状態の層（K-1230 / 2026-08-30）
 *
 * ★★**なぜ 1 か所にまとめるか** = ★★**状態は族をまたいで同じでなければならない。**
 *   ★族ごとに書くと、★足し忘れた部品だけが「別の作法」になる（★実際にそうなっていた）。
 *
 * ★★**この便で見つかった欠け（★2 体の独立した評価が、別々の経路で同じ所を指した）**:
 *   ・★★**焦点の枠が 37 個の操作部品で無かった**（★ボタン 26 ／ アイコンボタン 7 ／ ✕ ほか 4）。
 *     ★★ブラウザ既定の橙色の枠に落ちており、★白地に対して **2.40:1**・緑のボタンの上で **2.28:1**
 *     　＝ ★★**どちらも 3:1 未満。**★キットの緑（5.46:1）とは別の色が出ていた。
 *     ★★**キットで最も使われる部品だけが、キットの作法の外に居た。**
 *   ・★★**「いま処理中」がキット全体で 0 件**（★陽性対照 = 同じファイルの `:hover` は 31 件）。
 *     ★★毎日大量に保存する画面で、★**押した直後の合図が無い＝二重送信が止まらない。**
 *   ・★★**動きを減らす設定（`prefers-reduced-motion`）を尊重する指定が 0 件**（★動く部品は 13 種）。
 * ========================================================= */

/* --- 焦点（キーボードで辿っている場所） ---------------------
 * ★★**`:focus-visible` を使う**（★`:focus` だと、マウスで押しただけで枠が出る）。
 * ★色は緑（★白地 5.46:1 ／ 暗い面 4.93:1）。★2px ＋ 2px の隙間で、地の色に関係なく見える。 */
.ies-btn:focus-visible,
.ies-icon-btn:focus-visible,
.ies-modal__close:focus-visible,
.ies-chip__x:focus-visible,
.ies-tab:focus-visible,
.ies-table--rows tbody tr:focus-visible {
  outline: 2px solid var(--ies-jade-dark);
  outline-offset: 2px;
}
/* ★★★2026-09-01（K-1286）: **この規則を割った。★是正が欠陥を作っていた。**
 *
 * ★旧記述 =「色の付いた地の上（知らせ・押されているボタン）は、緑では沈む。文字と同じ色で描く」。
 * ★★**知らせ（`.ies-toast`）については正しい。★他の 4 つについては誤りだった。**
 *
 * ★★**理由 = `outline-offset: 2px` なので、輪は要素の *外* に描かれる。**
 *   ★★**＝ 輪が乗るのは「部品の色」ではなく「その後ろの地」である。**
 *   ★押されているボタン・選択中の札・選択中のタブは、地が緑（`--ies-jade-dark`）で文字が白なので、
 *   ★★`currentColor` = **白**。★その輪が**白い地の上**に出ていた。
 *
 * ★★**実測（★別プロセスが見本帳をブラウザで測り、親が値で裏を取った）**:
 *   | 焦点の先 | 輪 | 乗る地 | 比 |
 *   |---|---|---|---|
 *   | 選択中のタブ | 白 | タブの器の白 | ★★**1.00 : 1** |
 *   | 選択中の札／押されているボタン | 白 | 画面の地 #FAFAFA | ★★**1.04 : 1** |
 *   | （対照）選択して *いない* 側 | 濃緑 | 同じ地 | **5.46 : 1** |
 *   ★★**＝ 大事なほうだけ見えない、という逆転が起きていた**（★WCAG 1.4.11 / 2.4.13）。
 *
 * ★★**直したあとの値**: ★濃緑の輪 = 明 **5.46:1** ／ 暗 **4.97:1**（`#1f9f6c` vs `#1e1e22`）。
 *   ★★**両方の配色で 3:1 を超える。**★2px の隙間が在るので、緑の地の上でも輪と地は分かれて見える。 */
.ies-btn--ghost[aria-pressed="true"]:focus-visible,
.ies-btn--secondary.is-active:focus-visible,
.ies-chip.is-active:focus-visible,
.ies-tab[aria-selected="true"]:focus-visible {
  outline: 2px solid var(--ies-jade-dark);
  outline-offset: 2px;
}
/* ★★★2026-09-19（K-1778）: **帯の中の札は、焦点の輪を札の内側に描く。**
 *   ★理由（幾何）= 帯（`.ies-tabs`）は `overflow-x: auto` で、内側の余白が 0 ＝ 札が帯の高さいっぱい。
 *     ★外側 2px の輪は帯に **上下を切り取られ**、左右の切れ端しか残らない（★下線型は前から同じ穴 ——
 *     ★`assets/css/pages/tab-shell.css` が画面の側で内側へ寄せていた。★その 1 規則は部品へ上げて消した）。
 *   ★選んでいない札 = 緑の輪を内側 2px（★白の地に 5.46:1 ／ 暗 4.93:1）。
 *   ★塗りの札（選択中）= 面の色の輪をさらに 2px 内側（★緑の塗りに 5.46:1 ／ 暗 4.93:1）——★緑の塗りに緑の輪は消えるため。
 *     ★下線型の選択中は地が透明なので緑の輪のまま（`:not(.ies-tabs--line)`）。 */
.ies-tabs .ies-tab:focus-visible { outline-offset: -2px; }
/* ★2026-10-17: 窓型（`--window`）の選んだタブも地は白 ＝ 緑の輪のまま（★面の色の輪にすると白に白で消える）。 */
.ies-tabs:not(.ies-tabs--line):not(.ies-tabs--window) .ies-tab:is([aria-selected="true"], .is-active):focus-visible {
  outline-color: var(--ies-surface);
  outline-offset: -4px;
}
/* ★★2026-10-03（W-267 ⑧）: 緑の地の上の押しもの（`.ies-btn--on-primary`・上の「押されている状態」の後ろ）の輪は、字と同じ色。
 *   ★素の輪（`--ies-jade-dark`）は緑の帯の上で緑 × 緑 = 1.00:1 ＝ 消える（`.ies-icon-btn--on-primary` の注記〈W-191〉と同じ理由）。★太さと隙間は素のまま。
 *   ★押されている姿（地が白）の輪は、`.ies-btn--secondary.is-active:focus-visible`（0,3,0）に後勝ちさせるため 0,3,0 で書く。 */
.ies-btn--on-primary:focus-visible,
.ies-btn--on-primary:is([aria-pressed="true"], .is-active):focus-visible {
  outline-color: var(--cl-on-primary);
}
/* ★★知らせ（`.ies-toast`）だけは別。★地が `--ies-text`（#1C1C1C）＝ **暗い面**なので、
 *   ★白い輪が正しい（★実測 約 17:1）。★緑にすると 2.6:1 まで落ちる。 */
.ies-toast__action:focus-visible {
  outline: 2px solid currentColor;
  outline-offset: 2px;
}
/* ★★2026-09-29（W-191）: 緑の地の上の絵だけのボタン（`.ies-icon-btn--on-primary`）の輪は絵と同じ色。
 *   ★素の輪（`--ies-jade-dark`）は緑の見出しの上で緑 × 緑 = 1.00:1 ＝ 消える。★絵の色（明 白 5.46:1 ／ 暗 濃い字 8.97:1・手計算）なら見える。
 *   ★上の素の輪（0,2,0）と同じ強さ ＝ 後ろに置いて勝たせる（★太さと隙間は素のまま）。 */
.ies-icon-btn--on-primary:focus-visible { outline-color: var(--cl-on-primary); }

/* --- いま処理中 ---------------------------------------------
 * ★★**`aria-busy="true"` を正本にする**（★読み上げにも伝わる）。★`.is-loading` も受ける
 *   （★既存の JS が付け外ししている印がこの形だから）。
 * ★★**押せなくする**（`pointer-events: none`）＝ 二重送信を形で止める。
 * ★★**文字は消さずに透明にする**（★幅が変わらない＝ ボタンが縮んで指が外れることが無い）。 */
.ies-btn[aria-busy="true"],
.ies-btn.is-loading,
.ies-icon-btn[aria-busy="true"],
.ies-icon-btn.is-loading {
  position: relative;
  color: transparent !important;
  pointer-events: none;
  cursor: progress;
}
.ies-btn[aria-busy="true"]::after,
.ies-btn.is-loading::after,
.ies-icon-btn[aria-busy="true"]::after,
.ies-icon-btn.is-loading::after {
  content: "";
  /* ★中央に置く。★★**負の余白を使わない**（★余白の刻みに負の値は無い ／ 拡大表示でずれる）。
     ★`inset: 0` ＋ `margin: auto` は、回転（`transform`）と衝突しない中央寄せである。 */
  position: absolute;
  inset: 0;
  width: 14px; height: 14px;
  margin: auto;
  border: 2px solid currentColor;
  border-top-color: transparent;
  border-radius: var(--ies-radius-full);
  opacity: .9;
  animation: ies-spin .7s linear infinite;
}
/* ★輪の色は「その部品の文字色」から取る。★塗りのボタンでは白、輪郭では緑になる。 */
.ies-btn[aria-busy="true"]::after,
.ies-btn.is-loading::after { color: var(--ies-surface); }
.ies-btn--ghost[aria-busy="true"]::after,
.ies-btn--ghost.is-loading::after,
.ies-btn--link[aria-busy="true"]::after,
.ies-btn--link.is-loading::after { color: var(--ies-jade-dark); }
.ies-btn--secondary[aria-busy="true"]::after,
.ies-btn--secondary.is-loading::after { color: var(--ies-text); }
.ies-btn--danger[aria-busy="true"]::after,
.ies-btn--danger.is-loading::after { color: var(--ies-danger-ink); }
.ies-icon-btn[aria-busy="true"]::after,
.ies-icon-btn.is-loading::after { color: var(--ies-text-mute); }
/* ★★2026-09-19（K-1780・反映前の設計レビューの指摘）: **押せない ＋ 処理中** では、輪を押せない字の色にする。
 *   ★送る台本（`assets/js/apply.js`・`notice-threads.js`・`templates/page-quiz.php`・`ui-variant.js`）は押せなくすると同時に処理中にする。
 *   ★処理中は字を隠し、塗りのボタンの輪は白 ——★押せない姿は地を塗らないので **白の面に白の輪（1.00）＝ 何も見えない箱** になっていた
 *     （★直す前も副地の上の白で 1.06 ＝ 前から見えていなかった）。★押せない字 `--ies-text-mute`（白 5.22）の輪にする。 */
.ies-btn:disabled[aria-busy="true"]::after,
.ies-btn:disabled.is-loading::after,
.ies-btn[aria-disabled="true"][aria-busy="true"]::after,
.ies-btn[aria-disabled="true"].is-loading::after { color: var(--ies-text-mute); }
@keyframes ies-spin { to { transform: rotate(360deg); } }
/* ★★2026-10-22（K-2178・部品を足す 2・RB1 ①）: **読み込み中の輪**（`.ies-spinner`・32px・中の「検索中…」の上に置く）。★ボタンの輪（上の `::after`・14px）とは別の、**単独で置く大きい輪**。
 *   ★なぜ: 保護者の授業予定の「空き枠を検索中」の輪が `w-8 h-8 border-2 border-primary/30 border-t-primary rounded-full animate-spin` の手書きだった（HTML の 1 か所と、JS が `innerHTML` で組む文字列の 1 か所＝ 同じ出力）。
 *   ★値の出どころ（★新しい値を作っていない）= 手書きの `w-8 h-8`（2rem）・`border-2`（2px）・`border-primary/30`（主色の 30%）・`border-t-primary`（上辺だけ主色）・`rounded-full`・`animate-spin`（1 秒で 1 回転・等速）。
 *     ★色は Tailwind が引く `--cl-primary-rgb`（明 0 121 78 ／ 暗 46 207 143）から作る ＝ 暗い配色にも追従して手書きと 1 色も動かない。★回転は上の `@keyframes ies-spin`（Tailwind の `spin` と同じ 360 度）を 1 秒で流用する（ボタンの輪は 0.7 秒）。
 *   ★`box-sizing: border-box` を書くのは、Tailwind の preflight を読まない画面でも 32px に収めるため（枠 2px が外に足されない）。
 *   ★★動きを減らす設定の人には、ボタンの輪と同じく **回転ではなく点滅**（下の `prefers-reduced-motion` の節に足した）＝ 手書きの `animate-spin` はこの設定を無視していた（直る側の変化・見た目の形は同じ）。
 *   ★渡さなければ出力は 1 バイトも変わらない。★置き換えるときは `w-8 h-8 border-2 border-primary/30 border-t-primary rounded-full animate-spin` を消す。 */
.ies-spinner {
  box-sizing: border-box;
  width: 2rem;
  height: 2rem;
  border: 2px solid rgb(var(--cl-primary-rgb, 0 121 78) / .3);
  border-top-color: rgb(var(--cl-primary-rgb, 0 121 78));
  border-radius: var(--ies-radius-full);
  animation: ies-spin 1s linear infinite;
}
/* ★器そのものが読み込み中のとき（★カード・表・一覧）。★中身を薄くして触れなくする。 */
[aria-busy="true"].ies-card,
[aria-busy="true"].ies-table-wrap { opacity: .6; pointer-events: none; cursor: progress; }

/* --- 暗い配色で札が消える -----------------------------------
 * ★★**実測** = 札の淡い地 `#142a20` と 面 `#1e1e22` の差は **1.10:1**。
 *   ★★丸薬の形が見えず「色つきの文字」に見えていた（★同じ色でも、大きな面の告知は成立する）。
 * ★→ ★**札にだけ 1px の枠**を足す。★明るい配色は 1 バイトも変えない。 */
/* ★2026-08-30 追記: 枠を `--ies-border`(1.33:1) → `--ies-border-strong`(3.38:1)。
   ★★**1.33 では、枠を足しても札の形はやはり見えなかった**（★実測で確かめて直した）。 */
[data-theme="dark"] .ies-badge { border: 1px solid var(--ies-border-strong); }
[data-theme="dark"] .ies-badge--solid,
[data-theme="dark"] .ies-badge--count,
[data-theme="dark"] .ies-badge--dot { border-color: transparent; }

/* --- 動きを減らす設定を尊重する ------------------------------
 * ★★**0 件だった**（★動く部品は 13 種）。★前庭障害・乗り物酔いのある人には、
 *   ★**動きそのものが症状を起こす**（WCAG 2.3.3 / OS の設定）。
 * ★★**処理中の輪だけは残す**——★消すと「動いている」ことが伝わらなくなるので、
 *   ★**回転をやめて点滅に変える**（★動きの量を落としつつ、状態は伝える）。 */
@media (prefers-reduced-motion: reduce) {
  .ies-btn, .ies-icon-btn, .ies-chip, .ies-tab, .ies-card--hover,
  .ies-input, .ies-textarea, .ies-select, .ies-switch__slider,
  .ies-switch__slider::before, .ies-toast, .ies-msg-row {
    transition: none !important;
  }
  /* ★★2026-08-30（K-1237）: 押した瞬間の沈み込みを、★**押せる部品ぜんぶで**打ち消す
     （★旧記述はボタンだけだった。★状態の層を広げたので、打ち消す側も広げる）。
     ★★**別の頭の指摘**: ★この設定では「唯一の押した合図」が消える。
     ★★**それでよい**——★動きを減らしたい人にとって、位置の変化は害のほうが大きい。
     ★★**代わりの合図は焦点の輪（`outline`）が持つ**（★あれは動かない）。 */
  .ies-btn:active, .ies-icon-btn:active, .ies-chip:active, .ies-tab:active,
  .ies-modal__close:active, .ies-chip__x:active, .ies-toast__action:active { transform: none; }
  .ies-btn[aria-busy="true"]::after,
  .ies-btn.is-loading::after,
  .ies-icon-btn[aria-busy="true"]::after,
  .ies-icon-btn.is-loading::after,
  .ies-spinner {
    animation: ies-pulse 1.2s ease-in-out infinite;
  }
  @keyframes ies-pulse { 50% { opacity: .25; } }
}

/* スクリーンリーダー専用: 視覚的に隠すがアクセシビリティで読まれる */
.sr-only {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* Message row */
.ies-msg-row {
  display: flex; align-items: center; gap: var(--ies-sp-4);
  padding: var(--ies-sp-4);
  border-bottom: 1px solid var(--ies-border);
  cursor: pointer;
  transition: background .12s ease, box-shadow .12s ease;
}
.ies-msg-row:hover { background: var(--ies-surface-alt); }
.ies-msg-row.is-unread { background: var(--ies-jade-soft); }
/* 未読行もホバーで明確にフィードバック（jade-soft より一段濃く） */
.ies-msg-row.is-unread:hover {
  background: color-mix(in srgb, var(--ies-jade-soft) 70%, var(--ies-jade, #00A86B) 12%);
}
.ies-msg-row:focus-visible {
  outline: 2px solid var(--ies-jade, #00A86B);
  outline-offset: -2px;
  background: var(--ies-surface-alt);
}
.ies-msg-row__title { font-weight: 700; }
.ies-msg-row__meta  { font-size: 0.75rem; color: var(--ies-text-mute); font-family: var(--ies-font-mono); }
.ies-msg-row__body  { flex: 1; min-width: 0; }

/* ★★2026-08-30（K-1235）: **ログイン画面の CSS 19 行を削除した。** ★`.ies-login` `__card` `__brand` は使用 0 件で、★`page-login.php` は Tailwind のクラスだけで組まれている（★class 属性を全部出して確認）。 */


.ies-notice {
    padding: 12px 16px;
    border-radius: var(--ies-radius-sm);
    margin-bottom: 16px;
    font-size: 0.875rem;
}
.ies-notice-success {
    background: var(--ies-jade-soft);
    border: 1px solid var(--ies-jade);
    color: var(--ies-jade-dark);
}
/* ★2026-08-15: 統合直後の「本番でテスト中」の告知（parts/header-portal.php が出す）。
 *   ★`.ies-notice-success` と同じ形の variant として足す（★自作の部品を増やさない）。
 *   ★色は警告の正値 var(--ies-warn) / var(--ies-warn-soft)（tokens.css:31-32）。
 *   ★危険（--ies-danger 赤）ではない。★通常状態（jade 緑）でもない。★「注意して見てほしい」の層。
 *   ★★生 hex は書かない（ダークテーマに追従しなくなるため）。 */
.ies-notice-testing {
    background: var(--ies-warn-soft);
    border: 1px solid var(--ies-warn);
    color: var(--ies-ink);
    display: flex;
    align-items: flex-start;
    gap: var(--ies-sp-2);
    /* ★左右は .ies-content（layout.css:156）と同じ clamp にして端を揃える。
     *   ★下は 0 でよい = 直下の .ies-content が自分の上 padding（clamp(16px,1.2%,24px)）を持つため。
     *   ★max-width も .ies-content と同値にして、広い画面で幅が食い違わないようにする。 */
    margin: var(--ies-sp-3) clamp(16px, 2vw, 32px) 0;
    max-width: 1600px;
}
.ies-notice-testing__icon {
    color: var(--ies-warn);
    flex-shrink: 0;
    font-size: 1.125rem;
    line-height: 1.4;
}
.ies-notice-testing__body { min-width: 0; }
.ies-notice-testing__title {
    font-weight: 700;
    margin: 0 0 2px;
}
.ies-notice-testing__sub {
    color: var(--ies-text-sub);
    font-size: 0.875rem; /* 13px（★下限 12px を下回らない） */
    margin: 0;
}
/* ★★2026-08-30（K-1235）: **添付一括削除画面の CSS 83 行を削除した。** ★`.ies-purge-*` `.ies-pin-badge` `.ies-file-icon` は**すべて使用 0 件**（★wp-content 全体を走査）。★生の黄 `#fff8e1` / `#fff3cd`（★暗い配色に追従しない 2 か所）も一緒に消えた。★★**生きている `.ies-notice` / `.ies-notice-testing*` はこの上に残してある**（★実測 = 15 件 / 12 件が使用中）。 */

/* ★★2026-08-30（K-1235）: **教室コンテキスト スイッチャーの CSS 92 行を削除した。** ★機能ごと 2026-06-06（K-303）で撤去済で、★markup も AJAX も既に無い（★`assets/js/app.js:2442` に記録）。★実測 = 6 クラスとも使用 0 件（★唯一の一致は、その撤去を記録した *コメント* 1 行）。 */

/* ★★2026-08-30（K-1224）: ここに **開き `/*` を失ったコメントの尾が 2 行**残っていた。
 *   ★★**CSS の解析器は、その残骸から次の `{` までを 1 つのセレクタとして飲み込む**ので、
 *     ★直後の `.ies-sidebar__group { margin:0; padding:0 }` が **規則ごと捨てられていた。**
 *   ★★**エラーは出ない。★見た目にも出ていなかった** —— ★同じ規則が
 *     `assets/css/sidebar-shared.css:389` に一字一句同じ形で在り、そちらは両サイトで読まれるため。
 *   ★★**危ないのは「ここに新しい規則を書くと黙って落ちる」こと。**
 *   ★見つけ方（★別プロセスが実測）= ページに触れない `new CSSStyleSheet()` に流し込んで規則を数えた
 *     （★そのまま = 4 本・`.ies-sidebar__group` 無し ／ ★残骸を消すと = 5 本・有り）。
 *   ★★**門 4 本すべて緑だった。★どの門も CSS の構文を見ていない。** */

/* ★★2026-08-26（K-1180）: ここに在ったモバイル規則も外した。
 *   ★`assets/css/header-shared.css:332` に **同じ値の同じ規則**が在る（★重複）。
 *   ★上のコメントは、外した規則を説明していた残骸だったので一緒に消した
 *     （★古いコメントは間違った地図になる）。 */

/* =========================================================
 * Step 21: サイドバー グループ (details) + シェブロン
 * ========================================================= */
.ies-sidebar__group { margin: 0; padding: 0; }
.ies-sidebar__group > summary {
    cursor: pointer;
    list-style: none;
    user-select: none;
}
.ies-sidebar__group > summary::-webkit-details-marker { display: none; }
.ies-sidebar__group > summary::marker { display: none; }
.ies-sidebar__group-summary {
    /* .ies-sidebar__link と同じ装飾を継承する想定 */
    display: flex;
    align-items: center;
    gap: 10px;
}
.ies-sidebar__group-chevron {
    margin-left: auto;
    transition: transform .15s ease;
    flex-shrink: 0;
    color: var(--ies-text-mute, #636d7e);
}
.ies-sidebar__group[open] > summary .ies-sidebar__group-chevron {
    transform: rotate(90deg);
}

/* ★★★2026-08-30（K-1235・別の頭の指摘 → ★**本番で実測して確定**）:
 * ★★**`.ies-sidebar__group-children` の素の定義を、ここから外した。**
 * ★★**外さないと何が起きていたか（★本番 noberu.net で `getComputedStyle` を撃った実測）**:
 *   ・`sidebar-shared.css` = `padding: 2px 0 2px 10px; margin: 1px 0 8px 17px; border-left: 1px solid …`
 *   ・ここ（★後に出て勝つ） = `padding: 2px 0` … ★★**短縮形なので `padding-left: 10px` を 0 に戻す**
 *   ★★**結果 = 縦罫から文字までの距離が 10px → 0.67px**。★★**入れ子の項目が縦罫にくっついていた。**
 *   ★★**縦罫と 17px の余白は残る**ので「線だけ在って字下げが無い」という壊れ方になる。
 * ★★**K-1221 は同じ手当てを `__sublink` と `__sublink.is-active` に施したが、★この 1 か所を残していた。**
 *   ★同ファイルの K-1224 の注記は「一字一句同じ形で在る」と書いていたが、★★**同じではなかった。**
 * ★★**正本は `assets/css/sidebar-shared.css`**（★components.css より先に読まれる＝ 依存に入っている）。
 * ★★**これは見た目を変える直しではなく、★失われていた 10px を戻す直しである。** */
/* ★2026-08-15: assets/css/sidebar-shared.css:141 と同じ相方。★44px の実体は layout.css:23 の
 *   .ies-sidebar__link（markup が併記する）だが、class 併記が外れた時に静かに縮むのを防ぐため明示する。 */
/* ★★★2026-08-30（K-1221）: `.ies-sidebar__sublink` の**素の定義をここから外した**。
 * ★★**正本は `assets/css/sidebar-shared.css`**（★両方のサイトで読まれる）。★K-1180 と同じ手当て。
 * ★★**外さないと何が起きるか（★実測）**: ★値が食い違っていた——
 *   ・ここ = `min-height: 44px` ／ `font-size: 0.92em`
 *   ・`sidebar-shared.css` = `min-height: 32px` ／ `font-size: 0.875rem`
 *   ★★**このファイルは後に出て勝つ**ので、★`components.css` を教室サイトへも配ると
 *   ★★**サイドバーの子項目が 32px → 44px に伸び、柱全体が縦に大きく膨らむ。**
 *   ★★**＝ ①（両サイトへ配る）を素で撃つと、これが起きていた。** */
/* ★★2026-08-30（K-1221）: `.ies-sidebar__sublink.is-active` も**ここから外した**。★同じ理由。
 * ★★**食い違い（★実測）**: ★ここ = 地が `--ies-bg-hover`（**灰色 #f4f4f4**）／
 *   `sidebar-shared.css` = 地が `--ies-jade-soft`（**緑の淡い色**）。
 * ★★**＝ 配ると、選ばれている子項目の帯が緑から灰色に変わっていた。** */

/* 「管理設定」グループの控えめなトーン (低頻度を表現) */
.ies-sidebar__group--admin > summary .ies-sidebar__link-label {
    color: var(--ies-text-mute, #636d7e);
}

/* ★2026-10-10（K-2046・W-455）: ここに在った「閉じた柱（ies-sidebar-rail）でグループの中身と › を隠す」規則は消した。
 *   ★正本は `assets/css/sidebar-shared.css` のレール（縮小）の節ただ 1 つ（★768px 以上だけ・同じ値）。
 *   ★こちらは @media の外だった ＝ 767px 以下の引き出しでも、閉じた柱の記憶が残っているとグループの中身を隠していた（推測・測っていない）。 */

/* =========================================================
 * K-S1105 (2026-05-22): 添付ファイル UI 共通コンポーネント
 *   messages(トップ/返信/新規) + schedule モーダル 共用。旧 pages/messages.css から
 *   移設し global 化 (components.css は全ページ enqueue)。サイボウズ準拠の 1 ボタン式
 *   (「ファイルを選択する」→ 即リスト表示 → 「×削除する」個別削除)。
 *   ボタン先・リスト後の順序は markup 側で対応。
 * ========================================================= */

/* --- 確定済み添付リスト (既存オブジェクト: メッセージトップ / スケジュール) --- */
.ies-attachments {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.ies-attachments:empty { display: none; } /* K-S1105: 0件時は高さを消す */
/* K-181-fix4 (2026-05-28): メッセージ本文の最終段落と添付ファイルカードが密着して視覚的に
   連結して見えていた問題を解消。`.ies-msg-body` スコープ + `:not([hidden])` で添付ありの
   ときのみ上余白を確保 (添付なしは `hidden` 属性で display:none = そもそも margin 影響なし)。
   schedule 等の他コンテキストの `.ies-attachments` は touch せず (msg-body scope で限定)。 */
.ies-msg-body .ies-attachments:not([hidden]) {
  margin-top: 1em;
}

.ies-attachment {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 12px;
  background: var(--ies-bg-soft, #f8f8f8);
  border: 1px solid var(--ies-border, #E3E3E3);
  border-radius: var(--ies-radius-sm);
  font-size: 0.9em;
}
.ies-attachment__link {
  display: flex;
  align-items: center;
  gap: 8px;
  flex: 1;
  text-decoration: none;
  color: var(--ies-text, #1C1C1C);
  min-width: 0;
}
/* ★★2026-08-31: 地色の緑 → 文字色の緑（★K-1211。★撫でたときの色も文字なので基準が要る。
   ★旧 #00A86B は白の上で 3.08:1 ／ 新 #00794E = 5.46:1）。 */
.ies-attachment__link:hover { color: var(--ies-jade-dark, #00794E); }
.ies-attachment__icon { font-size: 1.1em; flex-shrink: 0; }
.ies-attachment__name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-weight: 500;
}
/* ★2026-08-31（K-1264）: 大きさは `max()` で床（12px）を挟む。★0.85em のままだと親 14px で **11.9px**。 */
.ies-attachment__size { color: var(--ies-text-mute, #636d7e); font-size: max(0.75rem, 0.85em); flex-shrink: 0; }

/* --- K-503: 画像添付のインラインサムネイル (原寸 + CSS 縮小 + lazy)。非画像 .ies-attachment は不変 --- */
.ies-attachment--image { align-items: flex-start; }
.ies-attachment--image .ies-attachment__link {
  flex-direction: column;        /* サムネを上、ファイル名を下のキャプションに */
  align-items: flex-start;
  gap: 4px;
}
.ies-attachment--image .ies-attachment__icon { display: none; } /* 📎 はサムネで自明 */
.ies-attachment--image .ies-attachment__size { display: none; } /* 控えめ表示: 画像はサイズ非表示 */
.ies-attachment--image .ies-attachment__name { white-space: normal; word-break: break-all; } /* キャプションは折返し可 */
.ies-attachment__thumb {
  display: block;
  max-width: 100%;               /* スレッド幅/モバイルで溢れない */
  max-height: 200px;             /* 原寸を CSS で縮小表示 */
  width: auto;
  height: auto;
  border-radius: var(--ies-radius-xs);
  border: 1px solid var(--ies-border, #E3E3E3);
  background: var(--ies-surface, #fff);
  object-fit: contain;
}

/* --- ピッカー preview (未送信: 返信 / 新規作成 / 選択直後) --- */
.ies-attachment-preview-list {
  list-style: none;
  margin: 8px 0 0;
  padding: 0;
}
.ies-attachment-preview-item {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 6px 10px;
  margin-bottom: 4px;
  background: var(--ies-surface-alt, #F8F8F8);
  border: 1px dashed var(--ies-border, #E3E3E3);
  border-radius: var(--ies-radius-xs);
  font-size: 0.875rem;
}
.ies-attachment-preview-item__icon { flex-shrink: 0; }
.ies-attachment-preview-item__name {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* ★2026-08-31（K-1264）: 同上（★上の `.ies-attachment__size` と対の位置に在る）。 */
.ies-attachment-preview-item__size { color: var(--ies-text-mute, #636d7e); font-size: max(0.75rem, 0.85em); flex-shrink: 0; }

/* --- 「×削除する」ボタン (確定リスト・preview 共通、サイボウズ準拠) K-S1105 ---
   ※ ピッカーの実クラスは .ies-attachment-preview-item__remove (ご提示の …-preview__remove はタイポ訂正) */
.ies-attachment__delete,
.ies-attachment-preview-item__remove {
  background: transparent;
  border: none;
  color: var(--ies-text-mute, #636d7e);
  font-size: 0.875rem;
  padding: 2px 8px;
  margin-left: 6px;
  cursor: pointer;
  border-radius: var(--ies-radius-xs);
  transition: background 0.15s, color 0.15s;
  white-space: nowrap;
  flex-shrink: 0;
}
.ies-attachment__delete:hover,
.ies-attachment-preview-item__remove:hover {
  background: var(--ies-danger-soft); /* K-S1105: 薄赤背景 (削除予告、視認性向上) */
  color: var(--ies-danger-ink);      /* 濃い赤文字 */
}

/* --- 添付の札（書く欄の中・字の上）★2026-09-30 ---
   ★相澤さん「添付が下の方に出て見えづらい・添付できてる？ってなる」「ChatGPT のようにテキストエリア上部に角丸の四角で・ファイル名が 2 行ほどでOK」。
   ★組み立て = `assets/js/attachment-picker.js`（`data-picker-layout="tile"` のとき）。★置き場 = `assets/css/pages/messages.css` の書く欄の格子の 2 段目。
   ★値の根拠:
     ・札の形 = 角 12（`--ies-radius-md` = 中の器・K-1399）／枠 = 罫の灰（札は押すものではない ＝ 3:1 は要らない。外の欄の枠が 3:1 を持つ）／地 = 白（副地は白に 1.06 で見えない）
     ・目立たせるのは枠ではなく絵の器 = 部品 `.ies-icon-box--s`（32・淡い緑の地・濃い緑の絵）＝ 「添付できている」を形と色で一目で言う
     ・幅 16rem（既定の字で 256px）= 字の幅 256 − 余白 16 − 絵 32 − 間 16 − × 24 = 168px ＝ 14px の字で 1 行約 12 字 ×2 行 ＝ 24 字
       （★「【202302ラインB】参考・入塾1ヵ月管理表.xlsx」がほぼ収まる幅）。★スマホで欄が狭ければ欄の幅まで縮む
     ・字 14px（`0.875rem`・12px の床の上）／2 行で切って … ／英数の長い名前も折る（`overflow-wrap: anywhere`）
     ・× = 部品 `.ies-icon-btn--s --round`（当たり 24 = 段 S）。★外すだけで消すのではないので赤にしない
     ・札どうしの間 8 = 近接（札の中の間 8 と同じ ＝ 札の外の間を札の中より広く見せるのは枠の役） */
.ies-attach-tiles {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: var(--cl-sp-2);
}
.ies-attach-tile {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  column-gap: var(--cl-sp-2);
  width: 16rem;
  max-width: 100%;
  padding: var(--cl-sp-2);
  background: var(--ies-surface);
  border: 1px solid var(--ies-border);
  border-radius: var(--ies-radius-md);
}
.ies-attach-tile__icon svg { width: 1em; height: 1em; display: block; }
.ies-attach-tile__name {
  font-size: 0.875rem;
  line-height: 1.35;
  color: var(--ies-text);
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  overflow: hidden;
  overflow-wrap: anywhere;
}
.ies-attach-tile__remove { align-self: start; }
.ies-attach-tile__remove svg { width: 1rem; height: 1rem; display: block; }

/* --- 追加 UI (「ファイルを選択する」ボタン + preview) K-S1105 --- */
.ies-attachment-add {
  margin: 0;
  padding: 8px 0;
  display: flex;
  flex-direction: column;
  gap: var(--ies-sp-2, 8px);
  align-items: flex-start;
}
.ies-attachment-add__preview { width: 100%; margin-top: 8px; }
.ies-attachment-add__preview:empty { margin-top: 0; display: none; }

/* K-S1105: schedule モーダル添付行 (dd[data-detail="attachments"]) の余白問題対処。
   .ies-sched-detail dd は white-space:pre-wrap (schedule.css:1083) のため PHP テンプレ起源の
   インデント空白/改行がテキストノード化し高さを取る (主因)。grid 既定 align-items:stretch で
   セルが引き伸ばされる (副因)。attachments の dd のみ normal + align-self:start で解消。
   ※ 他の dd (data-detail="body"=メモ等) は pre-wrap 維持 = ユーザー入力の改行を保持。
   ※ 本セレクタ (詳細度 0,2,1) は schedule.css の .ies-sched-detail dd (0,1,1) より高く、
      components.css→schedule.css の読込順に関わらず優先される。 */
.ies-sched-detail > dd[data-detail="attachments"] {
  white-space: normal;
  align-self: start;
}

/* =========================================================================
 * ⑰ 文字の役（★2026-08-30・K-1250）
 *
 * ★★★**なぜ足したか（★実測してから決めた）**:
 *   ★物差し（`tools/nb-scan-ui-shapes.php --other`）を作って測ったところ、
 *   ★★**どの族にも入らない要素が 6,476 か所あり、その最大が「文字だけ」の 1,508 か所**だった。
 *   ★★**文字の役は、他の部品の *中の子* としては在った**（`.ies-field__label` / `.ies-stat__label` /
 *     `.ies-empty__text` / `.ies-page-head__sub`）が、★★**単独で使える役が 1 つも無かった。**
 *   ★→ ★**画面はそのつど Tailwind を手で並べるしかなく、381 通りの綴りに割れていた。**
 *
 * ★★**役は理論ではなく実測から決めた**（★`--roles` で 4 軸に畳んだ結果。★110 役 → 上位 21 役で 8 割）:
 *
 *   | 役 | 実測 | 値 |
 *   |---|---|---|
 *   | 注記   | ★**423 か所** | 12px / 400 / 控えめ |
 *   | 数値   | ★**262 か所** | 等幅（★大きさ・色は継ぐ） |
 *   | 小見出し | ★**159 か所** | 14px / 700 / 本文色 |
 *   | ラベル | ★**148 か所** | 12px / 700（★控えめ版は `--mute`） |
 *
 * ★★**2026-08-31 訂正: 「使用箇所 0 件」は失効した。**★★**同じ日に私自身が 1,223 か所へ当てた。**
 *   ★いまの数 = `php tools/nb-scan-ui-shapes.php --family=text` で測る（★数をここに書かない）。
 *   ★（旧記述）足しただけでは見た目は 1px も動かない（★使用箇所 0 件・★2026-08-31 の朝の時点）。
 *   ★★**「いま 0 件」は「これからも 0 件」ではない**（`flight-rules` §1-7）。
 *
 * ★★★**当てるときに知っておくこと（★これを読まずに当てない）**:
 *   ①★**行間を必ず一緒に持つ。**★Tailwind の `text-xs` は `line-height: 1rem` を **同時に**当てている。
 *     ★★**大きさだけ移すと、地の文の 1.7 を継いで行間が 16px → 20.4px に伸びる。**
 *   ②★**太さが 600 の箇所は 700 になる**（★小見出し 61 か所 ／ ラベル 47 か所）。
 *     ★★**これは意図した統一である**（K-1229 =「意味を持たない差を足さない」）。★当てたら焼いて測る。
 *   ③★★★**2026-08-31 訂正: 旧記述は事実と *逆* だった**（★別の頭が捕まえ、★親が実測して確かめた）。
 *     ★★（旧記述）「`text-ink` / `text-muted` は Tailwind の固定色で暗い配色に追従しない。
 *       ★このトークンは追従する（＝ 当てると暗い配色が正しくなる）」——★★**これは誤り。**
 *     ★実測 = `assets/css/build/tailwind.css` は
 *       `.text-ink{color:rgb(var(--cl-ink-rgb,26 26 30)/…)}` と **CSS 変数**を使っており、
 *       `header.php` が明所（:184-185）と暗所（:422-423）の両方で定義している。
 *       ★★**＝ Tailwind の色も暗い配色に追従している。**
 *     ★★**本当の差（★実測値）**:
 *       ・本文色 … 明 #1A1A1E → #1C1C1C ／ ★★**暗 #e8e8e6 → #e8e8e6（＝ 完全に同じ）**
 *       ・控えめ … 明 #6B7280 → #6B7280（★同じ） ／ ★★**暗 #a8a8a4 → #868681（★暗くなる）**
 *     ★★★**＝ いちばん多い役（注記）は、暗い配色で明暗比が *下がる*。**
 *       ★`tokens.css` は #868681 を「暗地 4.54:1」と記録している（★基準は満たす）。
 *       ★★**当てる利点は「暗い配色が正しくなる」ことではない**——★利点は
 *       ★★**1 か所を直せば全部が変わること**である。
 *     ★★★**2026-08-31 決着（★相澤さんのご回答 =「このままでよい」）**:
 *       ★**トークンをそのまま使う**（★暗い配色で 6.96:1 → 4.54:1。★基準 4.5 は満たす）。
 *       ★★**兆候** = 2026-10-31 までに「暗い配色で小さい字が読みにくい」と 1 件でも出たら、
 *       ★`tokens.css` の暗い側 `--ies-text-mute` を明るくする（★手戻りは 1 行）。
 *   ④★**並べ方（余白・揃え・省略）は持たない。**★`mt-1` `block` `truncate` は画面が持つ。
 *     ★★**役は「文字そのもの」だけを決める**（★だから `display` を書いていない）。
 *
 * ★★**未決 = `.ies-field__label` は 14px / 600 / 副文色**で、★★**この `.ies-label` と値が違う。**
 *   ★実測（★2026-08-31・★別の頭の指摘で数え直した）= 画面側の手書きラベルは **148 か所**だが、
 *     ★★**その内訳は 700 が 101 か所・600 が 47 か所**（★「12px / 700 が 148 か所」と書いていたのは誤り）。
 *   ★部品側 `.ies-field__label` の実要素 = **17 か所**（★旧記述の「13 か所」は注記の言及を含む数え方だった）。
 *   ★★**どちらへ寄せるかは、画面を見てから決める**（★`docs/pending-answers.md`）。★いまは触らない。
 *
 * ★★★**2026-08-31 追記 — 4 つ目の意図した違い（★別の頭が捕まえ、★親が焼いて確かめた）**:
 *   ★★**太い祖先の中に置かれた注記が、700 → 400 になる。**
 *   ★元の綴り（`text-xs text-muted`）は太さを持たず、★**親から継いでいた**。
 *   ★この部品は `font-weight: 400` を持つので、★継承が切れる。
 *   ★実測 = お問い合わせ管理の画面を当てる前後で焼いて突き合わせ、★★**1 件**（「(1人)」）で確認。
 *   ★★**私の「意図しない違いは 0 件」は、★測った 2 画面の範囲でしか正しくなかった。**
 *   ★★★**2026-08-31 決着（★相澤さんのご回答 =「このままでよい」）**:
 *     ★**注記は 400 のまま。**★★**＝ 注記が見出しより細い**という並びになる（★読む順序が付く）。
 *     ★★**兆候** = 2026-10-31 までに「単位が薄くて読めない」と出たら、★その箇所に太字を足す。
 * ==========================================================================*/

/* ★注記・補助文（★見出しの下の 1 行・入力欄の下の説明・一覧の副文）。 */
.ies-caption {
  font-size: 0.75rem;
  line-height: 1rem;
  font-weight: 400;
  color: var(--ies-text-mute);
}
/* ★2026-10-20（W-304・部品化の下見 CP-下見.md §3 ①）: 複数行の長い注記の行間。★いまの手書き `ies-caption leading-relaxed`（46 か所）と同じ 1.625 ＝ 置き換えても見た目は変わらない。
 *   ★素の `.ies-caption` は変えない（渡さなければ 1 バイトも変わらない）。 */
.ies-caption--long { line-height: 1.625; }
/* ★★2026-10-22（K-2178 ②3・部品化の続き）: **12px・本文色の注記**（時刻・名前・本文の黒字の 12px）。
 *   ★なぜ: `.ies-caption` は控えめな灰（`--ies-text-mute`）なので、時刻や名前を寄せると薄くなる。寄せずに残していた手書き `text-xs text-ink`（講師トップの予定・ほかの日の報告書の行・お知らせの回答の集計）と、
 *     寄せたうえで `ies-caption … text-ink` と Tailwind の色を重ねていた綴り（保護者の確認書の挨拶文）が、この色の口を欲しがっていた。
 *   ★値の出どころ（★新しい値を作っていない）= 色は手書きの `text-ink` が引く `--cl-ink`（`.ies-copy` と同じ作り・手書きの色と **1 色も動かない**）。大きさ・行間・太さは `.ies-caption` のまま（12px / 1rem / 400）。
 *     ★`--ies-text`（#1C1C1C）に替えると本文色の既知の差（明 #1A1A1E → #1C1C1C）が出る ＝ ほかの役とそろえるのは「部品を直す段」（K-1856 ②）。
 *   ★`.ies-caption` と組んで使う（`ies-caption ies-caption--ink`）。★複数行の長い文は `--long` も組む。★色を継いでいた 12px（`text-xs` だけの手書き）を寄せると、継ぎ元の色が `--cl-ink` に固定される（継ぎ元が `--ies-text` の行は #1A1A1E ← #1C1C1C の 2 段の差）。
 *   ★表の中（`.nb-tbl td .ies-caption`・0,2,0）では表の規則の灰が `--ink` に勝つ ＝ 表のセルの中の 12px の黒字には使えない（手書きの `text-xs text-ink` は `.ies-caption` を持たないので灰にならなかった ＝ 表の中の手書きは寄せない）。
 *   ★渡さなければ出力は 1 バイトも変わらない。★画面に `text-xs` `text-ink` `leading-relaxed` を残すと、後に読まれる Tailwind が勝つ ＝ 置き換えるときは消す。 */
.ies-caption--ink { color: var(--cl-ink, rgb(26 26 30)); }

/* ★★★2026-08-31 — **素の `<small>` に、文字の下限（12px）を守らせる。**
 *
 * ★★**なぜ要るか（★本番の実画面で実測した。★手元の焼き直しでは 0 件だった）**:
 *   ★受け入れ条件 = `docs/ui/system/acceptance.md`「★文字サイズの下限 12px」。
 *   ★★**2 つのサイトで、★原因が違う**（★2026-08-31 に本番で `document.styleSheets` を数えて確かめた）:
 *
 *   | どこ | 組み立て済み Tailwind | `<small>` の実効 | 原因 |
 *   |---|---|---|---|
 *   | 教室サイト（`noberu.net`） | ★**読む** | **11.2px** | ★preflight の `small{font-size:80%}` |
 *   | 社員サイト（`ies.noberu.net`） | ★**読まない** | **11.67px** | ★★**ブラウザの既定**（`font-size: smaller`） |
 *
 *   ★★**どちらの画面にも `components.css` は届いている**（★実測。★両方の `styleSheets` に在る）。
 *   ★★**教室サイトでは preflight が *いちばん最後* に読まれる**ので、★同じ強さの `small{}` では勝てない。
 *     ★→ **`body small` にして強さで勝つ**（★社員サイト側は既定を上書きするだけなので、どちらでも勝つ）。
 *   ★本番で実際に割っていた箇所 = ★座席管理 **9.6px** が 1 件 ／ ★社員ダッシュボード **10px** が 2 件・**11.9px** が 2 件。
 *
 * ★★**「小さくする」意図は残す。**★床（`.ies-caption` と同じ 0.75rem = 12px）より下へ行かせないだけ。
 * ★★**`assets/css/tailwind-input.css` には書かない**（★あのファイルが「ここに規則を書かない」と自分で決めている）。
 * ★★**この 1 行が見ないもの**: ★`<small>` 以外の綴りで小さくしている箇所（★`text-[10px]` など。★あちらは別の門）。 */
body small { font-size: max(0.75rem, 0.8em); }

/* ★ラベル（★入力欄の上・節の中の項目名）。★`display` は持たない＝ 画面が `block` を足す。 */
.ies-label {
  font-size: 0.75rem;
  line-height: 1rem;
  font-weight: 700;
  color: var(--ies-text);
}
/* ★控えめなラベル（★主役ではない項目名）。★実測 66 か所。 */
.ies-label--mute { color: var(--ies-text-mute); }

/* ★小見出し（★カードの中の見出し・節の中の区切り）。★画面の見出しは `.ies-page-head__title`。 */
.ies-subhead {
  font-size: 0.875rem;
  line-height: 1.25rem;
  font-weight: 700;
  color: var(--ies-text);
}
/* ★★2026-10-22（K-2178・部品を足す 2・RB1 ⑩・RB2 ③）: 小見出しの **大きさの段 2 つ**（`.ies-subhead` と組んで使う: `ies-subhead ies-subhead--lg`）。★太さ 700 と本文色は `.ies-subhead` のまま。
 *   ★`--lg` = 16px ／ `--xl` = 18px。★なぜ 2 つに分けたか: 担当が別々に「小見出しの大きい段」を足す案を出し、**同じ名前 `--l` で大きさが違った**（保護者の画面の日付の数字・合計金額 = 18px ／ 講師の画面の日付の数字・給与明細の合計 = 16px）。
 *     ★`nb-gcard__title`（18px・700・行間 1.375）は後ろ（保護者の部品の節）にあるので、日曜の赤 `.ies-ink-warn` に色で勝ってしまい日付の数字には使えなかった。★この 2 つは `.ies-subhead` の直後 ＝ `.ies-ink-warn`（下）より前 ＝ 色の軸が勝つ。
 *     ★名前を `--l` にしない訳 = 押せる高さの段（`.ies-row--l` ほか S / M / L・K-1185）と取り違えるため。★段の名前は `.ies-subhead`（14px）からの数 ＝ 1 つ上が `--lg`、2 つ上が `--xl`。
 *   ★行間を **必ず一緒に持つ**（上の ① ＝ 大きさだけ移すと地の文の行間を継いで伸びる）。★`--lg` = 1.25rem（手書きの `text-base leading-tight` ＝ 16px × 1.25 と同じ）／ `--xl` = 1.25（手書きの `text-lg leading-tight`）。
 *   ★値の出どころ（★新しい値を作っていない）= 手書きの `text-base font-bold` ／ `text-lg font-bold leading-tight`。★見た目の差 = ①行間が `text-base` だけだった所（給与明細の合計・一覧の題）は 24 → 20px ②色が手書きの `text-ink` だった所は #1A1A1E → #1C1C1C（明るい配色のみ・2 段・上の ③ の既知の差）。
 *   ★曜日の色（日曜の赤・土曜の緑）を **PHP の式が Tailwind の色の語で渡す**画面は、Tailwind が最後に読まれるので色は部品に勝つ。★部品の色の軸（`.ies-ink-warn` ほか）を渡す画面も、軸が `.ies-subhead` の後ろなので勝つ。
 *   ★渡さなければ出力は 1 バイトも変わらない。★置き換えるときは `text-base` ／ `text-lg` `font-bold` `leading-tight` を消す。 */
.ies-subhead--lg { font-size: 1rem; line-height: 1.25rem; }
.ies-subhead--xl { font-size: 1.125rem; line-height: 1.25; }

/* ★★2026-10-21 夜（W-643 ④・部品化の続き・相澤さん「部品の足しを今すぐ始めて」）: **本文の字（14px）の役**。
 *   ★なぜ: 部品化の担当たちが「本文の 14px の役が部品に無い」と寄せずに残した手書き（`text-sm text-ink`・`text-sm text-muted`・`text-sm text-ink leading-relaxed`）が、
 *     報告書の記入だけで 19 語（値の表示 12・宛先の読むだけ 2・日ごとの宿題 5）。`.ies-caption` は 12px、`.ies-subhead` は 14px だが太字 ＝ **14px の細字の役だけが無かった**。
 *   ★値の出どころ（★新しい値を作っていない）= 手書きの Tailwind の語と同じ値: `text-sm`（0.875rem / 行 1.25rem）・`text-ink`（`--cl-ink`）・`text-muted`（`--cl-muted`）・`leading-relaxed`（行 1.625）。
 *   ★★色を `--ies-text` / `--ies-text-mute` でなく `--cl-ink` / `--cl-muted` から引くのは、手書きの `text-ink` / `text-muted` が引く先と同じにして **置き換えても 1 色も動かないようにするため**。
 *     ★`--ies-text` / `--ies-text-mute` に替えると、上の ③ の「既知の差」が出る（本文色 明 #1A1A1E → #1C1C1C ／ 控えめ 暗 #a8a8a4 → #868681）。★ほかの役（注記・ラベル・小見出し）とそろえるかは「部品を直す」段（K-1856 ②）で相澤さんに伺う。
 *   ★太さは持たない（★継ぐ）= 手書きの `text-sm text-ink` も太さを書いていなかった。★`.ies-caption` の ④ のように 400 を持つと、太い祖先の中に置いたとき太さが変わる。
 *   ★名前を `ies-body` にしなかった: 旧 A 型の箱 `body.ies-body` は「0 件に消した名前」（下の A 型の箱の注記）で、同じ綴りを呼び戻さない。
 *   ★`--mute` = 控えめな版（`.ies-label--mute` と同じ付け方）／ `--long` = 複数行の長い文の行間 1.625（`.ies-caption--long` と同じ・素の役は変えない）。
 *   ★並べ方（`display`・余白・折り返し）は持たない（④）。★渡さなければ（この class を使わない画面は）出力は 1 バイトも変わらない。
 *   ★画面に `text-sm` `text-ink` `text-muted` `leading-relaxed` を残すと、後に読まれる Tailwind が勝つ ＝ 置き換えるときは消す。 */
.ies-copy {
  font-size: 0.875rem;
  line-height: 1.25rem;
  color: var(--cl-ink, rgb(26 26 30));
}
.ies-copy--mute { color: var(--cl-muted, rgb(99 109 126)); }
.ies-copy--long { line-height: 1.625; }

/* ★★2026-10-22（K-2178 ②8・部品化の続き）: **注意・エラーの色の字**（橙の濃い赤 = 手書き `text-accent-dark`）。★字の役（大きさ・太さ）と **掛け合わせて使う色の軸**（`.ies-num` と同じ考え・大きさも太さも決めない）。
 *   ★なぜ（②8 の「在る `nb-text-accent-dark` を使うか、足すか」の答え = **足す**）: `nb-utilities.css` の `.nb-text-accent-dark` は **読み込み順が `components.css` より前**（`inc/assets.php` の束 = preflight → nb-utilities → base → … → components → 画面の CSS → Tailwind）。
 *     同じ詳細度（0,1,0）なら後ろが勝つので、`ies-label` `ies-caption` `ies-subhead` と組むと **役の色が勝って橙にならない**（画面で使われた実績が 0 件なのはこのため・手書きの Tailwind `text-accent-dark` は最後に読まれるので勝っていた）。
 *     この部品は役の規則（`.ies-caption` `.ies-label` `.ies-subhead` `.ies-copy`）より **後ろ**に置いたので、組んだとき橙が勝つ。
 *   ★値の出どころ（★新しい値を作っていない）= 手書きの `text-accent-dark` が引く `--cl-accent-dark`（明 #C82500 ／ 暗 #E85A3A・Tailwind の `rgb(var(--cl-accent-dark-rgb) / 1)` と同じ変数から作る ＝ 1 色も動かない）。
 *     ★`--ies-coral-ink`（明 #BA442E）にしないのは、手書きの色と明るい配色で色が変わるため（そろえるなら「部品を直す段」・K-1856 ②）。
 *   ★名前の `warn` は部品の層の言葉（`.ies-alert--warn` ＝ 橙の系）。★Tailwind の `text-warn`（`--cl-warn`・琥珀）とは別の色。
 *   ★渡さなければ出力は 1 バイトも変わらない。★画面に `text-accent-dark` を残すと、後に読まれる Tailwind が勝つが同じ色なので見た目は変わらない ＝ 置き換えるときは消す（2 本目の正本にしない）。 */
.ies-ink-warn { color: var(--cl-accent-dark, rgb(200 37 0)); }
/* ★★2026-10-22（K-2178・部品を足す 2・RB1 ⑨・RB2 ①②）: **主色の字**（`.ies-ink-primary`・緑）と **主色の濃い字**（`.ies-ink-primary-dark`・濃い緑）。★`.ies-ink-warn` の仲間 ＝ 字の役（大きさ・太さ）と掛け合わせて使う色の軸（大きさも太さも決めない）。
 *   ★なぜ: 字の役と手書きの `text-primary` / `text-primary-dark` を重ねる綴りが多い（`ies-label text-primary` 〈「すべて見る」〉・`ies-num ies-label text-primary-dark` 〈月の見出し・給与明細の年月〉ほか 10 か所以上）。
 *     ★在る `nb-text-primary`（`nb-utilities.css`）は読み込み順が `components.css` より前で、`ies-label` の色に負ける ＝ 使えない（`.ies-ink-warn` の注記と同じ理由）。★この2つは役の規則の **後ろ**に置いた ＝ 組んだとき緑が勝つ。
 *   ★値の出どころ（★新しい値を作っていない）= 手書きの `text-primary`（`rgb(var(--cl-primary-rgb, 0 121 78))`・明 #00794E ／ 暗 #2ecf8f）・`text-primary-dark`（`rgb(var(--cl-primary-dark-rgb, 0 104 67))`・明 #006843 ／ 暗 #1f9f6c）と **同じ変数・同じ控え**で作る ＝ 1 色も動かない。
 *     ★`tokens.css` の注記（参照側は `var(--cl-primary-rgb, 0 121 78)` と控えつきで書く）のとおり。★`--ies-jade` ／ `--ies-jade-dark`（#00a86b ／ #00835a）に替えると色が変わる ＝ そろえるのは「部品を直す段」（K-1856 ②）。
 *   ★表の中（`.nb-tbl td .ies-caption`・0,2,0）では表の規則の灰が勝つ ＝ 表のセルの中の字には使えない（`.ies-caption--ink` と同じ）。
 *   ★渡さなければ出力は 1 バイトも変わらない。★画面に `text-primary` / `text-primary-dark` を残すと、後に読まれる Tailwind が勝つが同じ色なので見た目は変わらない ＝ 置き換えるときは消す。 */
.ies-ink-primary { color: rgb(var(--cl-primary-rgb, 0 121 78)); }
.ies-ink-primary-dark { color: rgb(var(--cl-primary-dark-rgb, 0 104 67)); }

/* ★★2026-10-22（K-2178 ② の 1 の続き・担当 ICN の申し送り (b)）: **展開の矢印の絵（CSS の content から描く分）**。
 *   ★なぜ: `::before` の content の字（▸ › ）は `<template data-nb-icons>` を引けない ＝ 前例（`pages/seat-view.css` の mask）と同じく mask で描く。
 *     同じ path を画面の CSS ごとに写さないよう、変数をここ 1 か所に置く（使う側 = `pages/dashboard.css` の完了の開閉 2 つ・`pages/list-shell.css` の柱のグループと枝の 2 つ）。
 *   ★値 = `inc/icon-map.php` の `ri-arrow-right-s-line` と同じ path（Remix の原本のまま）。開いたときの 90 度回転で `ri-arrow-down-s-line` と同じ向きになる。色は使う側の currentColor。
 *   ★使い方 = `content: ''; display: inline-block; width: 1em; height: 1em; background-color: currentColor; mask: var(--nb-ic-chevron-right) center / contain no-repeat;`（-webkit-mask も同じ値）。 */
:root { --nb-ic-chevron-right: url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%3E%3Cpath%20d%3D%27M13.1717%2012.0007L8.22192%207.05093L9.63614%205.63672L16.0001%2012.0007L9.63614%2018.3646L8.22192%2016.9504L13.1717%2012.0007Z%27%2F%3E%3C%2Fsvg%3E"); }

/* ★数値の書体（★役ではなく **軸**。★他の役と掛け合わせて使う）。
   ★★**大きさも色も太さも決めない**——★決めると掛け合わせられなくなる。
   ★対象 = 数字・時刻・ID・金額・教室コード（★日本語の文には使わない）。
   ★`tabular-nums` = 桁を縦に揃える（★等幅書体では見た目は変わらないが、控えの書体で効く）。 */
.ies-num {
  font-family: var(--ies-font-mono);
  font-variant-numeric: tabular-nums;
}
/* ★★★2026-09-13（K-1707）: **引かれる金額**（★給与明細の任意加減算のマイナスなど）。
 *   ★★**新しい色を作っていない** ——★`--ies-danger-ink` は既に「危険・引く」の役の色で、
 *     ★薄い地の上で **5.30:1（明）／ 5.01:1（暗）** を実測済（★:545 の注記）。★白地でも床を満たす。
 *   ★★**直した理由**: ★旧は画面が `text-red-500`（#ef4444）を直書きしており、
 *     ★★白地で **3.76:1** ＝ 床（4.5:1）割れ。★しかも **色の台帳に 1 度も載っていない色**だった
 *     （★Tailwind の既定がそのまま出ていた・★実測 = 担当 SAL・2026-09-13）。
 *   ★★**色だけに意味を持たせない** ——★出す側は必ず符号（`-`）も書く（★色が見えない人にも届く）。 */
.ies-num--minus { color: var(--ies-danger-ink); }

/* ═══════════════════════════════════════════════════════════════════════
 * ⑱ 献立（「…」を押すと出る小さなメニュー）★2026-09-06
 *
 * ★★出す側 = `parts/menu-popover.php` ／ 開け閉め = `assets/js/menu-popover.js`。
 * ★★**実測 = 同じものが repo に 6 通り、別々に書かれていた**（★出どころは PHP 側の注記に一覧）。
 *   ★正本にしたのは `parts/screen-gear-menu.php` の歯車（★唯一すでに部品の形をしていた）。
 *
 * ★★**この節が持たないもの**:
 *   ・★取っ手の見た目（★`.ies-icon-btn` をそのまま借りる。★もう 1 つ作らない）
 *     ★2026-09-18（K-1771）: 文字を見せる取っ手は選ぶ欄（`.ies-select`）を借りる（★この節の末尾）
 *   ・★中身の意味（★危ない行の色だけ持つ。★何が危ないかは呼ぶ側が決める）
 * ★★開け閉めは `hidden` 属性。★受けるのは上の `[hidden] { display:none !important }`。
 * ═══════════════════════════════════════════════════════════════════════ */
.ies-menu {
  position: relative;
  display: inline-flex;
}
/* ★★2026-10-02（W-032・問い 173・相澤さん「① 緑の塗り・白い字にそろえる」）: **開いているあいだの取っ手は、緑の塗り ＋ 白い字（暗い配色は濃い字）の 1 つ。**
 *   ★旧は 3 通り = 献立・歯車は淡い緑の地（白の上で 1.13:1・ページの灰の地の上で 1.01:1 ＝ 開いていることが見えにくい）／ 座席の「生徒リスト」は緑の塗り ／ 鐘と自分のメニューは灰の地。
 *   ★押している間は塗り（K-1230・`.ies-btn--ghost[aria-pressed]`）と同じ向き。★座席の `.sv-side-toggle[aria-expanded="true"]`（`pages/seat-view.css`）が元からこの値 ＝ **それに献立と歯車をそろえた**
 *     （★値は座席と同じトークン = 地・枠 `--cl-primary` ／ 字 `--cl-on-primary`。★明 = 白 × 緑 5.46:1 ／ 暗 = 濃い字 × 明るい緑 8.97:1・W-186 の手計算）。
 *   ★歯車（`parts/screen-gear-menu.php`・`.nb-gear__btn`）もここで受ける（★あちらの自前の規則は消した ＝ 値を 2 か所に書かない）。
 *   ★★**そろえていないもの（★理由つき）**: ①鐘（`components/notif-bell.css`）と社員サイトの自分のメニュー（`header-shared.css`）= 凍結中の画面（W-033 でそろえる）。
 *     ②**保護者の頭の自分の印**（`.nb-gtb__acct` の中の取っ手）= 「自分のメニュー」の仲間で、★顔の丸の右上の「新しい返信」の点が緑の塗りの上で消える・撫でた地の規則が `components/chat.css` に別に在る ＝ W-033 と一緒に直す（★旧の淡い緑のまま・下の 1 規則）。
 *     ★★2026-10-03: ①② とも W-033（FRZ-01）でそろえた。
 *   ★枠も塗る（★文字を見せる取っ手 `.ies-menu__field` は選ぶ欄の白い枠を持つ）。★右の ▾ は字と同じ色へ（★素は mute の灰 ＝ 緑の塗りの上で読めない）。 */
.ies-menu__btn[aria-expanded="true"],
.nb-gear__btn[aria-expanded="true"] {
  background: var(--cl-primary);
  border-color: var(--cl-primary);
  color: var(--cl-on-primary);
}
.ies-menu__btn[aria-expanded="true"] .ies-menu__caret { color: inherit; }
/* ★2026-10-03（W-033・問い 173 ①）: 保護者の頭の自分の印も、開いているあいだは上の緑の塗り（旧 = 淡い緑のまま据え置いていた）。
   ★新しい返信の点（緑）が緑の塗りの上で見えなくなるので、開いているあいだだけ白の縁を 2px（鐘の赤い点と同じ作り）。 */
.nb-gtb__acct .ies-menu__btn[aria-expanded="true"] .nb-gtb__dot { box-shadow: 0 0 0 2px var(--cl-on-primary); }
/* ★★2026-10-03（W-033・計画の字との違い）: 名前つきの取っ手（`.nb-gtb__who`・お問い合わせの頭だけ）は、字の色を `components/chat.css` の
   `.nb-gtb__acct .nb-gtb__who`（0,2,0・components.css より後に読まれる）が持つ ＝ 上の緑の塗り（0,2,0）が負けて、濃い字（--ies-text）が緑の上に残る
   （明 = 約 3 : 1 の手計算〈推測・測っていない〉・名前は 14px）。★開いているあいだだけ (0,3,0) で白い字へ。★開いたまま撫でると chat.css の灰の地（0,3,0・後ろ）が緑を消し、白い字が灰の上に残るので、
   開いている撫では緑のまま (0,4,0)。★新しい値は無い（上と同じ 2 つのトークン）。★顔の丸 `.nb-gtb__face` は chat.css 195 行が開いているあいだ透明にする ＝ 名前と印が 1 枚の緑。 */
.nb-gtb__acct .nb-gtb__who[aria-expanded="true"] { color: var(--cl-on-primary); }
.nb-gtb__acct .nb-gtb__who[aria-expanded="true"]:hover { background: var(--cl-primary); }
/* ★表の行の「…」（`.nb-tbl td .ies-icon-btn` の字 = text-sub・0,2,1）は、開いているあいだは緑の塗りの上の字の色へ。 */
.nb-tbl td .ies-menu__btn[aria-expanded="true"] { color: var(--cl-on-primary); }

.ies-menu__panel {
  position: absolute;
  top: calc(100% + var(--ies-sp-1));
  right: 0;
  left: auto;
  z-index: 400;
  min-width: 11rem;
  max-width: min(20rem, calc(100vw - var(--ies-sp-4)));
  /* ★★★2026-09-06: **高さの上限と巻き取りを足した。**
   *   ★★**無いと、行が多いときに箱が画面の外へ伸びる**（★下端が切れて押せなくなる）。
   *   ★実例 = ★**パンくずの教室切り替えは本番で 21 教室**。★44px × 21 = **924px** ＝ 入らない。
   *   ★★寄せる前に足しておくこと（★寄せてから足すと、その 1 便だけ切れた姿が出る）。
   *   ★`60vh` = 画面の 6 割。★残り 4 割で「箱の外を押して閉じる」余地を残す。 */
  max-height: 60vh;
  overflow-y: auto;
  padding: var(--ies-sp-1);
  border: 1px solid var(--ies-border);
  border-radius: var(--ies-radius-md);
  background: var(--ies-surface);
  box-shadow: var(--ies-shadow-md);
  text-align: left;
}
/* ★左そろえで開く（★画面の左側に置いた取っ手向け）。 */
.ies-menu--start .ies-menu__panel { left: 0; right: auto; }
/* ★★画面の端で切れないための裏返し。★印を付けるのは JS、★裏返すのはここ。
   ★★順序が意味を持つ: `.is-flip-x` は `--start` の既定より **後**に置く（同じ強さなので後が勝つ）。 */
.ies-menu__panel.is-flip-x { left: 0; right: auto; }
.ies-menu--start .ies-menu__panel.is-flip-x { right: 0; left: auto; }
.ies-menu__panel.is-flip-y { top: auto; bottom: calc(100% + var(--ies-sp-1)); }

/* ★まとまりの見出し（★押せない）。 */
.ies-menu__cap {
  padding: var(--ies-sp-2) var(--ies-sp-2) var(--ies-sp-1);
  font-size: 0.75rem;
  color: var(--ies-text-mute);
}
.ies-menu__sep {
  margin: var(--ies-sp-1);
  border: 0;
  border-top: 1px solid var(--ies-border);
}

/* ★行。★`<a>` と `<button>` の両方がこの姿になる（★どちらで書いても揃う）。 */
/* ★★★2026-09-06（★相澤さんのご決定・逐語 =「メニュー４４ｐｘでＯＫ」）: **32px → 44px（L の段）。**
 *
 * ★★**なぜ L か（★理由は好みではない）**:
 *   ①★**メニューを開いたら、押す対象はその行しかない** ＝ 受け入れ条件の「単独で押すもの」＝ **L**。
 *   ②★★**既に 44px で出ている実物が 2 つある**（★右上の丸いアイコン ／ パンくずの教室切り替え。
 *     ★`assets/css/header-shared.css` の `.ies-breadcrumb__classroom-item` ほか。★実測）。
 *     ★★あれは **2026-08-15 に「小さすぎる」と直した値**である。
 *     ★★**32px のまま寄せると、その是正を巻き戻すことになる。**
 *   ③★Fitts の法則 ——★いちばん押す的を、いちばん押しやすくする。
 *
 * ★★**詰まった場所は `--compact`（32px）を選ぶ**（★ファイル管理の枡のように、行が短く数が多いところ）。
 *   ★★S(24) は作らない ——★字が 12px なので、上下の余白が 6px しか残らない。 */
.ies-menu--compact .ies-menu__item { min-height: var(--cl-tap-m, 32px); }
.ies-menu__item {
  display: flex;
  align-items: center;
  gap: var(--ies-sp-2);
  width: 100%;
  min-height: var(--cl-tap-l, 44px);
  padding: var(--ies-sp-1) var(--ies-sp-2);
  border: 0;
  border-radius: var(--ies-radius-sm);
  background: transparent;
  color: var(--ies-text);
  /* ★`<button>` は書体を受け継がないので、★ここで **地の文と同じ書体**に戻す
     （★これが無いと、行き先のある行（`<a>`）と、押しものの行（`<button>`）で **書体が違って見える**）。 */
  font-family: var(--ies-font-sans);
  font-size: 0.875rem;
  text-align: left;
  text-decoration: none;
  cursor: pointer;
}
/* ★★2026-10-02（W-032・本棚 [744]）: 撫でた行の地を、副地（`--ies-surface-alt`・白に **1.06:1 ＝ 見えない**）→ 主色 10%（`docs/ui/system/hover.md` §2 の ②「面を持つが枠を足せない行」）へ。
 *   ★タブの撫でた地（`.ies-tab:hover`）と同じ式・同じ値（白の面に 1.12:1・床 1.10 の上）。★下の保護者の頭の 2 つ（`.nb-gtb__id--switch` ／ `.nb-gtb__kidopt`）も同じ。 */
.ies-menu__item:hover { background: color-mix(in srgb, var(--ies-jade) 10%, var(--ies-surface)); text-decoration: none; }
.ies-menu__item:focus-visible { outline: 2px solid var(--ies-jade-dark); outline-offset: -2px; }
/* ★危ない行（★消す・ごみ箱へ入れる）。★色だけで言わず、文言も呼ぶ側が言い切る。 */
.ies-menu__item--danger { color: var(--ies-danger-ink); }
.ies-menu__item--danger:hover { background: var(--ies-danger-soft); }
/* ★いま選ばれている行。 */
.ies-menu__item.is-current { color: var(--ies-jade-dark); font-weight: 700; }

.ies-menu__ico,
.ies-menu__check,
.ies-menu__to {
  display: inline-flex;
  flex: 0 0 auto;
  font-size: 1rem;
  color: var(--ies-text-mute);
}
.ies-menu__ico svg,
.ies-menu__check svg,
.ies-menu__to svg { width: 1em; height: 1em; }
.ies-menu__check { color: var(--ies-jade-dark); }
.ies-menu__label { flex: 1 1 auto; min-width: 0; }

/* ★★★2026-09-18（K-1771）: **文字を見せる取っ手**（`nb_menu_popover( [ 'text' => … ] )`）。
 * ★出どころ = 予約管理のイベントの選び口（旧 `.nb-yg-panel__evsum`・画面の手書き・`<details>`）を寄せた
 *   （相澤さんの大原則「すべてコンポネント化を推進」）。★いま選ばれているものの名前を見せ、押すと選び直す形。
 * ★★見た目は **選ぶ欄（`.ies-select`）を借りる**（★白地・濃い灰の枠 3.36:1・角 8px・32px。★もう 1 つ作らない）。
 *   ★モック（予約管理・2026-09-16）もこの場所を選ぶ欄（`<select>`）で描いている。
 * ★ここに足すのは「借りた形に無いもの」だけ:
 *   ・中の並び（名前 ＋ 右の `▾`）… `inline-flex`。★隙間 8px（`--ies-sp-2`）= ボタン（`.ies-btn`）の中の絵と文字の隙間と同じ値
 *   ・太字 … ★この名前は「いま何を見ているか」＝ 同じ行の日付（`.ies-subhead`・700）と同じ役なので同じ太さ（類同）
 *   ・撫でたとき … 枠を主色に（`docs/ui/system/hover.md`「面を持ち、枠を引けるもの」）
 *   ・押せない札（`.is-static` ＝ `--quiet`・★2026-09-19 から地なし・薄い枠・mute の字 ＝ 押せない欄と同じ姿）… 指のかたちを出さない
 * ★★名前は **折り返す**（★`…` で切らない ＝ 黙って欠ける名前を作らない）。★長い名前の行は 2 行ぶん伸びる。
 * ★開いた箱は取っ手より狭くしない（★欄の下に出る一覧は、欄と同じ幅から始まる ＝ 左の縁がそろう）。 */
.ies-menu__field {
  display: inline-flex;
  align-items: center;
  gap: var(--ies-sp-2);
  min-width: 0;
  max-width: 100%;
  text-align: left;
  font-weight: 700;
}
.ies-menu__btn.ies-menu__field:hover { border-color: var(--ies-jade-dark); }
/* ★★マウスで押したときは焦点の輪を出さない（★押すものの決まり = この CSS の「焦点」の節の `:focus-visible`）。
 *   ★選ぶ欄（`.ies-select:focus`・入力欄の作法 = 押しても輪を出す）を借りたので、その輪が取っ手にも付いてくる。ここで打ち消す。
 *   ★キーボードで辿ったとき（`:focus-visible`）は、借りた輪がそのまま出る。★枠の緑（撫でたときと同じ色）は残す。
 *   ★出どころ = レビューの指摘（2026-09-18）。★詳細度 (0,4,0) ＞ `.ies-select:focus` (0,2,0)。 */
.ies-menu__btn.ies-menu__field:focus:not(:focus-visible) { outline: none; box-shadow: none; }
.ies-menu__field.is-static { cursor: default; }
.ies-menu__text { min-width: 0; overflow-wrap: anywhere; }
.ies-menu__caret {
  display: inline-flex;
  flex: 0 0 auto;
  font-size: 1rem;
  /* ★行の高さ 1 = 絵が無いときの控え（文字の ▾）でも 16px に収める（★1.4 のままだと 22.4px になり、取っ手が 32.4px に膨らむ・見本帳で実測）。 */
  line-height: 1;
  color: var(--ies-text-mute);
}
.ies-menu__caret svg { width: 1em; height: 1em; }
/* ★★`width: max-content` = 箱の幅を中身から決める（★上限は `.ies-menu__panel` の 20rem のまま）。
 *   ★無いと、かぶせて出す箱の幅は包み（＝取っ手）の幅までしか広がらず、長い名前の行が 3 行に折れる
 *   （★実測 2026-09-18・手元・1280: 取っ手 197px の箱で長い名前の行が 79px。直す前の画面の一覧は 288px で 2 行）。 */
.ies-menu--text .ies-menu__panel { min-width: max(11rem, 100%); width: max-content; }

/* ═══════════════════════════════════════════════════════════════════════
 * ★★★暗い配色で `bg-white` だけが取り残されていた（2026-09-03・K-1411）
 *
 * ★★**何が起きていたか（★実測。★暗い配色で 5 枚を焼いて測った）**:
 *   ★2026-08-30（K-1225）に、Tailwind の `ink` / `muted` / `border` / `surface` を
 *     ★**3 数字（`--cl-*-rgb`）から作る形へ移した ＝ 前景は配色に追従するようになった。**
 *   ★★**ところが地の `bg-white` は Tailwind 内蔵の `#fff` のままで、追従しない。**
 *   ★★＝ 暗い配色で **白い板に明るい文字**が載り、★★**1.23:1（ほぼ読めない）**になっていた。
 *   ★実測（★焼いて測った・教室サイト）= 出席可能日 **白い地の文字 21** ／ スタッフのトップ **8** ／
 *     生徒管理 **2** ／ 満足度カルテ **2**。
 *   ★★**決定 K-1035 が「順序は *地を先、前景を後*」と書いていた。★順序が逆になっていた。**
 *
 * ★★**なぜ `base.css` ではなくここか（★1 度そこへ書いて、何も変わらないことで気づいた）**:
 *   ★★**`base.css` は教室サイトに配られていない**（★実測 = 教室サイトが読むのは
 *     tokens / sidebar-shared / header-shared / components / menu-shell / notif-bell /
 *     datetime-field / build/tailwind.css の 8 本）。
 *
 * ★★**明るい配色は 1 バイトも変わらない**（★`[data-theme="dark"]` の中だけ）。
 * ★★**戻し方 = この 3 行を消すだけ。**
 *
 * ★★**この規則が見ないもの**:
 *   ・★`bg-white/20` のような **半透明**（★別のクラス名なので当たらない。★実測 23 か所）。
 *     ★あれは「白を薄く重ねる」意図なので、暗い配色でもそのままでよい。
 *   ・★★**画面ごとの CSS に生の明るい hex を地として書いている 157 か所**（★別の借金・本棚 [580]）。
 * ═══════════════════════════════════════════════════════════════════════ */
[data-theme="dark"] .bg-white { background-color: var(--ies-surface, var(--cl-surface, #fff)); }
[data-theme="dark"] .hover\:bg-white:hover,
[data-theme="dark"] .focus\:bg-white:focus { background-color: var(--ies-surface, var(--cl-surface, #fff)); }

/* ═══════════════════════════════════════════════════════════════════════
 * ⑳ 節の見出し（★見出し … 補足 ……… 右端にリンク ›）★2026-09-06
 *
 * ★★**なぜ足すのか（★相澤さんのご指摘・2026-09-06）**:
 *   ★逐語 =「いやだからこれを変えてほしいって話をしてるんだよね」。
 *   ★★**節の見出しの共通部品（`parts/section-head.php`）は Tailwind の語彙で書かれていた。**
 *   ★★**Tailwind は社員サイトへ意図的に配っていない**（`functions.php:995` ＝ 配ると
 *     　`@tailwind base` が当たって社員サイト全体の見た目が変わる）。
 *   ★★**＝ 社員サイトの画面は、共通部品を「呼べない」。★だから毎回 自前で `<h2>` を書いていた。**
 *   ★実例 = `templates/page-settings-hub.php:53` が「使えない」と理由を書き残していた。
 *
 * ★★**直し方 = 部品の側を、両方に届く語彙（`.ies-*`）へ移す。**
 *   ★`components.css` は **両サイトへ配られている**（★実測 = `functions.php:906` が教室サイトへ
 *     `noberu-components-shared`、★:917 が社員サイトへ `ies-components` として積む）。
 *   ★★**＝ ここに書けば、社員サイトでも教室サイトでも同じ 1 本の PHP が使える。**
 *
 * ★★**値は Tailwind 版からの写しである**（★新しい値を決めていない）:
 *   | 旧（Tailwind） | 新（ここ） | px |
 *   |---|---|---|
 *   | `gap-x-3` | `column-gap: var(--ies-sp-3)` | 12 |
 *   | `gap-y-1` | `row-gap: var(--ies-sp-1)` | 4 |
 *   | `mb-2` | `margin-bottom: var(--ies-sp-2)` | 8 |
 *   | `gap-3`（右のかたまり） | `gap: var(--ies-sp-3)` | 12 |
 *   | `gap-1`（リンクと矢印） | `gap: var(--ies-sp-1)` | 4 |
 *   | `text-xs` | `font-size: .75rem / line-height: 1rem` | 12 |
 *   | `min-h-[44px]` | `var(--cl-tap-l, 44px)`（★`.ies-btn--l` と同じ書き方） | 44 |
 *
 * ★★**色だけは 2 か所ずれる**（★下に理由を書いた。★目視でご確認いただく）。
 *
 * ★★**この節が持たないもの**:
 *   ・★見出しそのものの文字（★`.ies-subhead` を借りる。★もう 1 つ作らない）
 *   ・★右に並ぶ小ボタン（★`.ies-btn--secondary --l` を借りる）
 *   ・★数字の書体（★`.ies-num` を借りる）
 * ═══════════════════════════════════════════════════════════════════════ */
.ies-sec-head {
  display: flex;
  flex-wrap: wrap;                     /* ★入りきらないときは **行ごと**折る（★文字単位で折らない） */
  align-items: center;
  column-gap: var(--ies-sp-3);
  row-gap: var(--ies-sp-1);
  margin-bottom: var(--ies-sp-2);
}

/* ★見出し・補足は縮ませない（★2026-08-16 に「未確認 0 件」が 1 文字ずつ縦に折れた事故の直し）。 */
.ies-sec-head__title { flex-shrink: 0; }

.ies-sec-head__note {
  flex-shrink: 0;
  white-space: nowrap;
  margin: 0;
  font-size: 0.75rem;                  /* ★12px = 文字の下限。★これより下げない */
  line-height: 1rem;
  color: var(--ies-text-mute);         /* ★#636D7E ＝ Tailwind の `text-muted` と **同値**（実測） */
}
/* ★手が要る状態。★★旧 Tailwind 版は `text-accent-dark`（#C82500）だった。
 *   ★ここでは文字用に用意されている `--ies-coral-ink`（#BA442E）を使う。
 *   ★★**理由 = 暗い配色に追従する**（★`--cl-accent-dark` は portal 層に無い）。
 *   ★★**見た目は少しだけ変わる**（★どちらも白地で 4.5:1 を超える濃い赤）。★目視の器に積んだ。 */
.ies-sec-head__note--accent { color: var(--ies-coral-ink); }

/* ★右のかたまり（★注記 → 小ボタン → 遷移リンク の順）。 */
.ies-sec-head__right {
  margin-left: auto;                   /* ★★これが「右端に置く」の正体 */
  display: flex;
  align-items: center;
  gap: var(--ies-sp-3);
  flex-shrink: 0;
}
.ies-sec-head__right-note { white-space: nowrap; margin: 0; }

/* ★右端の遷移リンク（★「すべて見る ›」）。
 * ★★**面を持たないので下線は出さない** —— ★下線は「文中のリンク」の記号
 *   （★正本 = `docs/ui/system/hover.md`）。★ここは節の見出しの一部であって文中ではない。 */
.ies-sec-head__link {
  display: inline-flex;
  align-items: center;
  gap: var(--ies-sp-1);
  min-height: var(--cl-tap-l, 44px);   /* ★L の段。★`.ies-btn--l` と同じ書き方 */
  font-size: 0.75rem;
  line-height: 1rem;
  font-weight: 700;                    /* ★旧 `font-semibold`(600) から 700 へ。★`.ies-*` の太字は 700 で揃っている */
  color: var(--ies-jade-dark);         /* ★明るい配色では #00794E ＝ Tailwind の `text-primary` と **同値**（実測） */
  text-decoration: none;
  transition: color .12s;
}
.ies-sec-head__link:hover { color: var(--ies-jade-hover); }
.ies-sec-head__link:focus-visible {
  outline: 2px solid var(--ies-jade-dark);
  outline-offset: 2px;
  border-radius: var(--ies-radius-xs);
}
/* ★補足が **文章**のときは折り返す（★既定の「折り返さない」は "0 件" が 1 文字ずつ縦に折れた
   事故の直しで、★**数のための決まり**である。★文章に掛けると 1 語も折れず器を突き破る）。
   ★★2026-09-26（仕事の一覧 W-043）: `flex-shrink: 1` と `min-width: 0` を足した。★旧は `white-space` だけで、
     ★既定の `flex-shrink: 0` が残る ＝ 箱が「1 行に並べた幅」のまま縮まず、★**折り返してよいのに 1 度も折れなかった**
     （★講習会管理の基本設定で、幅 320 で頁が 333px・文字「特大」× 幅 320〜390 で 466px に広がって横に流れた）。
   ★見出しと並ばなければ、先に行ごと下へ折れ（器の flex-wrap）、それでも入らないときだけ箱が縮んで中で折れる。
   ★1 行に収まる注記は 1px も動かない（★設定の一覧の 3 つ = 幅 320〜1280 × 標準・特大で前後同じことを測った）。 */
.ies-sec-head__note--wrap { white-space: normal; flex-shrink: 1; min-width: 0; }

/* ───────────────────────────────────────────────────────────────────────
 * ★★2026-09-21（段 C-1）に足した口の受け皿。
 *   ★どれも **新しいクラスを渡したときだけ**効く（★既存の節の見出しは 1 バイトも変わらない）。
 *   ★★**新しい値は決めていない** ——★`--ies-sp-*` と `.ies-caption` の既定、および
 *     ★`assets/css/pages/payroll-attendance.css` が 2026-09-17 から使っている値の**写し**である。
 *   ★門 = `tools/nb-test-section-head.php`（C-01〜C-06）。
 * ─────────────────────────────────────────────────────────────────────── */

/* ★題の列（口 `lead` か `ident_html` を渡したときだけ出る）。★題・説明・識別行を縦に積む。
 *   ★★`flex: 1 1 7rem` = 狭い幅では 7rem まで縮み、それより狭いと右のかたまりが下の段へ落ちる。
 *     ★値 7rem は `assets/css/pages/payroll-attendance.css` が 2026-09-17 に幅 390 で実測して決めた値の**写し**
 *     （★8rem では「締める」まで下へ落ちた・★新しい値を決めていない）。
 *   ★★説明を渡さない節は**この列が出ない** ＝ いままでどおり題は縮まない（本棚 [772] は別の話として残る）。 */
.ies-sec-head__titles { flex: 1 1 7rem; min-width: 0; display: flex; flex-direction: column; row-gap: var(--ies-sp-1); }

/* ★題の下の説明 1 文（口 `lead`）。★余白は列の row-gap が持つ。 */
.ies-sec-head__lead { margin: 0; }

/* ★識別行（口 `ident_html`）= 札と事実（ID・教室コード・教室名）を 1 行に並べる。★説明のさらに下。 */
.ies-sec-head__ident { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ies-sp-2); margin: 0; }

/* ★題の前に置く絵・アバター（口 `media_html`）。★題と同じく縮ませない。
 *   ★★**絵と題の間は 8px に固定する**（★器の `column-gap` に従わせない）。
 *     ★理由 = 絵は **題の一部**であって、題と右の塊の間（12px ／ 箱の頭では 16px）とは別の距離。
 *     ★値 8px の出どころ = いま絵を置いている画面 **8 か所が `gap-2`（8px）**（経営報告書 3・予約のイベント 2・
 *       生徒設定 3）。★残り 1 か所（勤怠の「この日の未処理の申請」）だけが器の既定 12px だった ＝ **8px に揃える**。
 *     ★負の余白で器の `column-gap` を打ち消している（★器の型ごとに打ち消す量が違う）。 */
.ies-sec-head__media { flex-shrink: 0; display: inline-flex; align-items: center; margin-right: calc(var(--ies-sp-2) - var(--ies-sp-3)); }
.ies-sec-head--card-head .ies-sec-head__media { margin-right: calc(var(--ies-sp-2) - var(--ies-sp-4)); }
.ies-sec-head--card-top .ies-sec-head__media { margin-right: calc(var(--ies-sp-2) - var(--ies-sp-3)); }

/* ★箱の 1 段目として置く（口 `variant` => 'card-top'）。★下の箱へ罫と角丸を継ぐ。
 *   ★★値は `assets/css/pages/payroll-attendance.css` の `.nb-sec-head` からの**写し**
 *     （★同じ形を画面の CSS で 1 枚ずつ書かせないための口。★画面側の規則は段 S で消す）。 */
.ies-sec-head--card-top {
  background: var(--ies-surface);
  border: 1px solid var(--ies-border);
  border-bottom: 0;
  border-radius: var(--ies-radius-md) var(--ies-radius-md) 0 0;
  padding: var(--ies-sp-4) var(--ies-sp-5);
  margin-bottom: 0;
}
.ies-sec-head--card-top + .ies-card,
.ies-sec-head--card-top + .nb-tbl .nb-tbl__frame { border-top-left-radius: 0; border-top-right-radius: 0; }
@media (max-width: 640px) {
  /* ★スマホは頭の余白を 12px / 16px に下げる（★写し元と同じ）。 */
  .ies-sec-head--card-top { padding: var(--ies-sp-3) var(--ies-sp-4); }
}

/* ★箱の **中**の 1 段目（口 `variant` => 'card-head'）。★余白を持ち、下に罫を引く。
 *   ★★値は `assets/css/pages/payroll-attendance.css` の `.noberu-attn-sec__head` からの**写し**
 *     （★2026-09-17 に「見栄えは原則モックに合わせる」で作られた形。★モックの頭の高さ 74px）。
 *   ★`justify-content` は持たない ——★右のかたまりは `.ies-sec-head__right` の `margin-left:auto` で右へ行く
 *     （★`space-between` と同じ幾何。★器の規則を 2 通りにしない）。 */
.ies-sec-head--card-head {
  column-gap: var(--ies-sp-4);
  row-gap: var(--ies-sp-2);
  padding: var(--ies-sp-4) var(--ies-sp-5);
  border-bottom: 1px solid var(--ies-border);
  margin-bottom: 0;
}
@media (max-width: 640px) {
  /* ★スマホは 12px / 16px（★写し元と同じ）。 */
  .ies-sec-head--card-head { padding: var(--ies-sp-3) var(--ies-sp-4); }
}

/* ═══════════════════════════════════════════════════════════════════════
 * ㉒ 保護者の器 —— 一番外（.nb-gshell）・頭（.nb-gtb）・節（.nb-gsec）★2026-09-12・担当 GHUI
 *
 * ★★相澤さんの逐語（2026-09-12・保護者画面のスマホ版）:
 *   ①「mainタグに上下にもpaddingが入ってるけどただでさえ面積貴重なので少なくとも上のpaddingは廃止でいいですよね」
 *   ②「ヘッダーがダサすぎるしUIUXとして不適切なので…ブラッシュアップしておいてください」
 *   ③「見出しとその直下の枠の間隔が異なっていると思います…共通部品化したほうがいいですよね」
 * ★出す側 = parts/guardian-topbar.php（一番外と頭）／ parts/guardian-section.php（節）。
 * ★決めた値と理由の正本 = docs/ui/screens/保護者の頭/spec.md（★ここには式と理由の要点だけ）。
 * ★この節が見ないもの = 社員・講師の画面（★保護者の器が入っている main にだけ効く）。
 * ★見張り = tools/nb-test-guardian-frame.php。
 * ═══════════════════════════════════════════════════════════════════════ */

/* ①一番外の器の型 = 保護者の器が入っていれば、本文の器（main）の余白は 0。
 *   ★頭が画面の上端と左右の端まで届く。★本文の左右 16px は保護者の器の中（px-4）が持つ。
 *   ★型で決める（★画面の名前で決めない・K-1547）。★`:has()` を持たないブラウザでは規則ごと無視され、今までの余白に戻るだけ。 */
/* ★★2026-09-23（K-1854）: **幅の上限（1600px）も外した。**★旧は窓 1600px を超えると本文の器が真ん中に 1600 で止まり、
 *   ★頭の帯（白）がそこで切れ、★お問い合わせでは左右に地の色の帯が 160px ずつ出ていた（★実測・Chromium・幅 1920）。
 *   ★保護者の中身の幅は器の中の箱（`nb_guardian_wrap_class()`）が持つので、ここを外しても中身は 1px も広がらない。 */
.ies-content:has(> .nb-gshell) { padding: 0; max-width: none; }

/* ★下の余白 = 最後の枠と画面の下端のあいだ ＝ 本文の器の下 16px（py-4）＋ ここの 8px ＝ 24px。
 *   ★header.php の viewport に `viewport-fit=cover` が無いので、ホームバーの分はブラウザが先に空けている（env() は 0）。
 *   ★cover にした日のために env() を足しておく。★底に貼りつくものを持つ画面は pad_style で上書きする（例 = お問い合わせ）。 */
.nb-gshell { padding-bottom: calc(var(--ies-sp-2) + env(safe-area-inset-bottom, 0px)); }

/* ②頭。★1 段・高さ 52px（＝ 押す的 L 44px ＋ 上下 4px）。★地は面の色・下に 1px の罫線（★緑にしない・相澤さん「トップが正しい形です」）。
 * ★★2026-09-16（担当 T01・K-1748・指示書要件1）: **既定は通常フロー（sticky を外した）。**
 *   ★旧＝9画面すべてが常時貼りつく52pxヘッダーだった。★指示書「スマホで全画面に52px前後の固定ヘッダーを
 *     常時占有させる設計は採用しない」に反していたため、相澤さんの判断で既定を外した。
 *   ★★チャット（お問い合わせ・`.nb-chat__bar` を持つ画面）だけは `assets/css/components/chat.css` が
 *     `position: sticky` を足し戻す（★会話中の現在地を失わないため・型で決める＝画面名では分岐しない）。
 *   ★★影響＝8画面（ホーム・授業予定・お知らせ・予約・個人設定・入会申込・入室登録・成績帳票）は
 *     スクロールで頭が隠れる通常の挙動になる（★1画面＝お問い合わせだけ現状どおり常時表示）。 */
.nb-gtb {
  background: var(--ies-surface);
  border-bottom: 1px solid var(--ies-border);
}
.nb-gtb__in {
  display: flex;
  align-items: center;
  gap: var(--ies-sp-1);
  min-height: calc(var(--cl-tap-l, 44px) + var(--ies-sp-1) * 2);
  padding: var(--ies-sp-1);
}
/* ★戻る・自分の印 = 44px の丸（L）。★左右 4px ＋ 丸の中の 12px ＝ 絵の端が本文の枠の端（16px）にそろう。
 *   ★絵は 20px・地の文字色（★薄い灰にしない ＝ 画面を移る主な道具なので）。 */
.nb-gtb .ies-icon-btn { flex: 0 0 auto; color: var(--ies-text); font-size: 1.25rem; }

/* ★真ん中 = 題（16px）＋ お子さまの名前（14px）の 2 行。★行の高さ 20 ＋ 20 ＝ 40px ≦ 44px。 */
.nb-gtb__id {
  position: relative;
  flex: 1 1 auto;
  min-width: 0;
  min-height: var(--cl-tap-l, 44px);
  display: flex;
  flex-direction: column;
  justify-content: center;
  border-radius: var(--ies-radius-sm);
}
/* ★戻るが無いとき（ホーム）は、字の左端を本文の枠の左端にそろえる（4 ＋ 12 ＝ 16px）。 */
.nb-gtb__in > .nb-gtb__id:first-child,
.nb-gtb__brand + .nb-gtb__id { padding-left: var(--ies-sp-3); }
/* ★(0,2,0) にしてある ＝ `.ies-content h1`（(0,1,1)・20px ＋ 下 24px）に勝つため（★旧の頭が 119px あった原因の 1 つ）。 */
.nb-gtb .nb-gtb__title {
  margin: 0;
  padding: 0;
  border: 0;
  font-size: 1rem;
  line-height: 1.25rem;
  font-weight: 700;
  color: var(--ies-text);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.nb-gtb__kid {
  display: block;
  min-width: 0;
  font-size: 0.875rem;
  line-height: 1.25rem;
  color: var(--ies-text-sub);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.nb-gtb__note {
  margin: 0;
  font-size: 0.75rem;
  line-height: 1rem;
  color: var(--ies-text-mute);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* ★ホーム（題が無い）＝ お子さまの名前が 1 行目の大きさ・教室名が 2 行目。 */
.nb-gtb__id--lead-kid .nb-gtb__kid { font-size: 1rem; font-weight: 700; color: var(--ies-text); }

/* ★お子さまの切り替え（★2 人以上のときだけ）。★押せるのは真ん中の 2 行ぜんぶ（★名前の字だけだと 20px しか無い ＝ Fitts）。
 *   ★透明な覆い（::after）が 2 行を覆う。★題（h1）は押しものの外に置いたまま（★見出しの意味を押しものに畳まない）。 */
.nb-gtb__kids { min-width: 0; }
.nb-gtb__kidbtn {
  display: flex;
  align-items: center;
  gap: var(--ies-sp-1);
  overflow: visible;
  cursor: pointer;
  list-style: none;
}
.nb-gtb__kidbtn::-webkit-details-marker { display: none; }
.nb-gtb__kidbtn::after {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  border-radius: var(--ies-radius-sm);
}
.nb-gtb__kidbtn:focus-visible { outline: none; }
.nb-gtb__kidbtn:focus-visible::after { outline: 2px solid var(--ies-jade-dark); outline-offset: -2px; }
/* ★2026-10-02（W-032・本棚 [744]）: 撫でた地 = 副地（白に 1.06:1・見えない）→ 主色 10%（`hover.md` §2 ②・`.ies-menu__item:hover` と同じ値）。 */
@media (hover: hover) { .nb-gtb__id--switch:hover { background: color-mix(in srgb, var(--ies-jade) 10%, var(--ies-surface)); } }
.nb-gtb__kidname { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nb-gtb__caret { flex: 0 0 auto; display: inline-flex; color: var(--ies-text-mute); transition: transform .15s; }
.nb-gtb__kids[open] .nb-gtb__caret { transform: rotate(180deg); }
/* ★一覧。★★名前は **切らない**（★折り返す）——★上の札が切れることは許すが、一覧が切れることは許さない
 *   （★「テスト」「テスト」で別の子を選べてしまった実害・parts/guardian-topbar.php の冒頭）。 */
.nb-gtb__kidlist {
  position: absolute;
  top: calc(100% + var(--ies-sp-1));
  left: 0;
  z-index: 50;
  min-width: 16rem;
  max-width: calc(100vw - var(--ies-sp-4));
  padding: var(--ies-sp-1);
  background: var(--ies-surface);
  border: 1px solid var(--ies-border);
  border-radius: var(--ies-radius-md);
  box-shadow: var(--ies-shadow-md);
}
.nb-gtb__kidopt {
  display: flex;
  align-items: center;
  gap: var(--ies-sp-2);
  min-height: var(--cl-tap-l, 44px);
  padding: var(--ies-sp-1) var(--ies-sp-3);
  border-radius: var(--ies-radius-sm);
  color: var(--ies-text);
  font-size: 0.875rem;
  line-height: 1.25rem;
  text-decoration: none;
}
.nb-gtb__kidopt:hover { background: color-mix(in srgb, var(--ies-jade) 10%, var(--ies-surface)); text-decoration: none; }   /* ★2026-10-02（[744]）: 副地 → 主色 10%（`hover.md` §2 ②） */
.nb-gtb__kidopt:focus-visible { outline: 2px solid var(--ies-jade-dark); outline-offset: -2px; }
/* ★いま見ているお子さま = 塗り（淡い緑の地 ＋ 濃い緑の字 ＋ 太字）＋ ✓（★色だけで言わない）。 */
.nb-gtb__kidopt.is-current { background: var(--ies-jade-soft); color: var(--ies-jade-dark); font-weight: 700; }
.nb-gtb__kidopt-name { flex: 1 1 auto; min-width: 0; overflow-wrap: anywhere; }
.nb-gtb__check { flex: 0 0 auto; display: inline-flex; color: var(--ies-jade-dark); }
/* ★ほかのお子さまに教室から新しい返信がある印（★点だけ・件数は出さない ＝ レーンS の決定）。 */
.nb-gtb__dot { flex: 0 0 auto; width: 8px; height: 8px; border-radius: var(--ies-radius-full); background: var(--ies-jade); }
/* ★右端の小物（★お知らせの「未読 N 件」など）→ 自分の印。 */
.nb-gtb__act { display: flex; align-items: center; gap: var(--ies-sp-2); flex: 0 0 auto; }
.nb-gtb__acct { flex: 0 0 auto; }
/* ★★2026-10-20（K-2161）: ≡（個人設定で出した人だけ）。★並びは [右の小物][≡][人の印] ＝ 真ん中の `.nb-gtb__id` が伸びて右へ押す今の形のまま（★margin は足さない）。 */
.nb-gtb__nav { flex: 0 0 auto; }
/* ★ブランドは PC のホームだけ（★モック PC :27-30）。★スマホは縦も横も惜しいので出さない。 */
.nb-gtb__brand { display: none; }
.nb-gtb__brand-dot { width: 1rem; height: 1rem; border-radius: var(--ies-radius-full); background: var(--ies-jade); }
@media (min-width: 1024px) {
  .nb-gtb__brand {
    display: inline-flex;
    align-items: center;
    gap: var(--ies-sp-2);
    flex: 0 0 auto;
    padding: 0 var(--ies-sp-4) 0 var(--ies-sp-3);
    font-size: 1.125rem;
    font-weight: 700;
    color: var(--ies-text);
  }
  /* ★ホームの本文は PC で左右 28px（lg:px-7）。★頭の字の左端をそこへそろえる（28 − 12）。 */
  .nb-gtb--home .nb-gtb__in { padding-left: calc(1.75rem - var(--ies-sp-3)); padding-right: calc(1.75rem - var(--ies-sp-3)); }
}

/* ③節 = 見出しの段 ＋ その直下の枠。★★見出しの字の下端 → 枠の上端 は **12px（--ies-sp-3）ただ 1 つ**。
 *   ★旧（実測 2026-09-12・幅 375）= 手書きの見出し 8px ／ `nb_section_head()` の見出し 20px
 *     （★「すべて見る」の 44px が段を押し広げ、その下に見出しの 8px が足されていた）。
 *   ★12 は式で決まる = （押す的 44 − 見出しの行 20）÷ 2。★「すべて見る」の 44px を上下に 12px ずつはみ出させて、
 *     ★段の高さは字の 20px にする ＝ はみ出した 12px は下のすき間 12px にちょうど収まり、★枠には 1px も重ならない。
 *   ★近接（ゲシュタルト）= 見出し → 自分の枠 12px ＜ 前の節の枠 → 見出し 20px（★節どうしの間は画面の段が持つ）。
 *   ★★2026-09-29（K-1952 ②）: 全画面の節 `.nb-sec`（parts/section.php の `nb_sec_open()`）も同じ規則・同じ値（★値は変えていない）。
 *   ★★★2026-10-20 訂正（W-605・相澤さんの逐語）: 上の「見出し → 枠 12px ただ 1 つ」「12 は式で決まる」「前の節の枠 → 見出し 20px（節どうしの間は画面の段が持つ）」は **失効**。
 *     > 「教室からのToDoとその見出しすぐ下のgapが多分１２ｐｘなんだけどすこーーしだけ離れすぎている感じなんだよね」
 *     > 「４ｐｘに狭くした分見出しの上、つまり節と節の間をその分８ｐｘとか１２ｐｘくらい間隔をあけたほうが近接の法則で認知しやすいと思う」
 *   ★新しい式（並べた絵で「見出し → 箱 4px・節の間 28px」「節の部品を使う全画面〈保護者の画面も〉」に決まった）:
 *     ①見出しの字の下端 → 枠の上端 = 4px（--ies-sp-1）。★枠の中の間（枠 → 枠・枠 → 下のボタン）は gap の 12px のまま ＝ 見出しの下だけ margin-bottom（4 − 12）で詰める。
 *     ②前の節の枠の下端 → 次の節の見出しの上端 = 28px（--nb-sec-gap = --ies-sp-5 + --ies-sp-1 ＝ 24 + 4・刻みに 28 は無い）＝ **部品が 1 か所で持つ**（下の `~` の規則）。
 *       ★呼ぶ側は節どうしの間を `mb-*` ／ `space-y-*` ／ 格子の gap で書かない。★節でないもの（ボタンの行・知らせの帯）との間は、いままでどおり画面の段が持つ。
 *     ③「すべて見る」と右のボタンの押せる高さ 44px は保つ。★上へ 20px（= 44 − 20 − 4）・下へ 4px はみ出させる ＝ 段の高さは字の 20px のまま・下の枠に重ならない（上は節の間 28px に収まる）。
 *     ④★字だけのリンクは、箱が上へ寄る分だけ字が題より 8px 上にずれる ＝ padding-top（= 上のはみ出し − 下のはみ出し = 16px）で字を戻す。
 *       ★顔を持つボタンは戻せない（戻すと顔が下の枠に当たる）＝ ボタンの中心は題の中心より 8px 上（下端は枠の上端にちょうど付く ＝ 旧 12px のときも同じ）。 */
:root { --nb-sec-gap: calc(var(--ies-sp-5) + var(--ies-sp-1)); }   /* ★節 → 節 = 28px ただ 1 つの値（W-605） */
.nb-gsec,
.nb-sec {
  display: flex;
  flex-direction: column;
  gap: var(--ies-sp-3);
  min-width: 0;
}
.nb-gsec > .ies-sec-head,
.nb-sec > .ies-sec-head { margin: 0; padding-inline: var(--ies-sp-1); }
/* ★★W-605: 見出し → 枠 = 4px（gap の 12px から 8px 引く）。★枠の中の間は gap のまま。 */
.nb-gsec > .ies-sec-head,
.nb-sec > .ies-sec-head { margin-bottom: calc(var(--ies-sp-1) - var(--ies-sp-3)); }
.nb-gsec > .ies-sec-head .ies-sec-head__link,
.nb-gsec > .ies-sec-head .ies-sec-head__right > .ies-btn,
.nb-sec > .ies-sec-head .ies-sec-head__link,
.nb-sec > .ies-sec-head .ies-sec-head__right > .ies-btn {
  margin-top: calc(1.25rem - var(--cl-tap-l, 44px) + var(--ies-sp-1));
  margin-bottom: calc(-1 * var(--ies-sp-1));
}
/* ★字だけのリンク: 押せる範囲が上へ寄った分、字を下へ戻す（= 上のはみ出し 20 − 下のはみ出し 4 = 16px）。★ボタンには付けない（顔の中の字が下へずれる）。 */
.nb-gsec > .ies-sec-head .ies-sec-head__link,
.nb-sec > .ies-sec-head .ies-sec-head__link {
  padding-top: calc(var(--cl-tap-l, 44px) - 1.25rem - 2 * var(--ies-sp-1));
}
/* ★★W-605: 節 → 節 = 28px を部品が持つ（呼ぶ側の `mb-4` ／ `space-y-*` ／ 格子の gap は節どうしの間に使わない）。
 *   ★前の節が **直前でなくても**（間に `<script>` が挟まっても）効くよう `~`（後ろの兄弟すべて）で書く。
 *   ★`:not([hidden])` を両側に付けるのは、隠れた節を数えないため ＋ 詳しさを (0,4,0) にして Tailwind の `.space-y-N > :not([hidden]) ~ :not([hidden])`（0,3,0・margin-top）に勝つため。
 *   ★節でないものの後ろの節には効かない（その間はいままでどおり画面の段）。★ブロックの並びの親でだけ正しい（格子・flex の gap の親は gap と足し算になる ＝ 親を直す）。 */
:is(.nb-gsec, .nb-sec):not([hidden]) ~ :is(.nb-gsec, .nb-sec):not([hidden]) { margin-top: var(--nb-sec-gap); }
/* ★節の「次」が入れ子の外にあるとき（保護者ホームの「ご確認ください」の下の 2 列）、その節に付けて下の間を 28px にする。 */
.nb-sec-gap-below { margin-bottom: var(--nb-sec-gap); }

/* ④下のメニュー（`.nb-gtab`）★2026-10-20（K-2161・相澤さんの承認）。★個人設定で「画面の下にメニューを出す」を選んだ人にだけ、`parts/guardian-tabbar.php` が出す。
 *   ★既定の人の画面には要素そのものが出ない ＝ この節の規則は何にも当たらず、画面は 1px も変わらない（下の `:root` の値も 0 のまま）。
 * ★形（設計書 7 節）= 高さ 56px（3.5rem）＋ 下の安全余白。白地・上に 1px の罫線。各項目は 絵 22px（1.375rem）＋ 字 12px（0.75rem）、押せる範囲は列の幅いっぱい × 56px。
 *   ★列は渡された数で等分（`flex: 1 1 0`）＝ 条件で項目が消えて 4 つ未満になっても並びは崩れない・ほかの項目で埋めない。
 *   ★いま居る画面 = 緑の字 ＋ 太字（＋ 部品側の `aria-current="page"`）＝ 色だけで言わない。
 * ★重なり順 = 300。★献立の箱（400）・窓（1000）・知らせ（1200）より **下**＝ 欠席・振替のシート、確認の窓、知らせが隠れない。
 * ★新しい色は無い（面・罫・字・主色のトークンだけ。撫でた地は `.ies-menu__item:hover` と同じ式）。
 * ★パソコンの幅（1024px 以上）では、メニューも余白の箱も出さない（≡ は帯に出る）。
 * ★余白の箱（`.nb-gtab-spacer`）は器の中に置く ＝ 器の下の余白に、メニューの高さぶんが足される（最後の行が隠れない）。 */
.nb-gtab {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 300;
  display: flex;
  background: var(--ies-surface);
  border-top: 1px solid var(--ies-border);
  padding-bottom: env(safe-area-inset-bottom, 0px);
}
.nb-gtab__item {
  flex: 1 1 0;
  min-width: 0;
  min-height: 3.5rem;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 0.125rem;
  position: relative;
  color: var(--ies-text-mute);
  font-weight: 600;
  text-decoration: none;
}
@media (hover: hover) { .nb-gtab__item:hover { background: color-mix(in srgb, var(--ies-jade) 10%, var(--ies-surface)); text-decoration: none; } }
.nb-gtab__item:focus-visible { outline: 2px solid var(--ies-jade-dark); outline-offset: -2px; }
.nb-gtab__item[aria-current="page"] { color: var(--ies-jade-dark); font-weight: 700; }
.nb-gtab__ico { display: inline-flex; font-size: 1.375rem; }
.nb-gtab__ico svg { width: 1em; height: 1em; }
.nb-gtab__label {
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 0.75rem;
  line-height: 1rem;
}
/* ★未読の数の札 = 絵の右上（`nb_gnav_badge_html()`・99 で止める）。★押しは項目全体が受ける。 */
.nb-gtab__badge { position: absolute; top: 0.25rem; left: calc(50% + 0.375rem); pointer-events: none; }
.nb-gtab-spacer { height: calc(3.5rem + env(safe-area-inset-bottom, 0px)); }
@media (min-width: 1024px) { .nb-gtab, .nb-gtab-spacer { display: none; } }
/* ★知らせ（`.ies-toast`）を持ち上げる高さ。★ホームと授業予定の知らせの置き場（`bottom:calc(1.625rem + …)`）がこの値を足す。
 *   ★既定は 0 ＝ 下のメニューが無い画面（と既定の人）の知らせの位置は今と同じ。★メニューが在って狭い幅のときだけ、メニューの高さ（3.5rem）。
 *   ★`:has()` を持たないブラウザでは持ち上がらないだけ（知らせは下のメニューと重なって出る・押せないことはない）。 */
:root { --nb-gtab-h: 0rem; }
@media (max-width: 1023.98px) { :root:has(.nb-gtab) { --nb-gtab-h: 3.5rem; } }

/* ⑤保護者の画面の小さな部品 ★2026-10-20（W-606・画面が自分で書く見た目を門 nb-test-screen-look が数えて、ホーム 123（上限 103）・個人設定 32（上限 10）で赤だった）。
 *   ★ホームの「面談のご案内」（札の題・案内の文・お子さま／場所の 2 列）と、個人設定の「選ぶ札」（✓ ＋ 題 ＋ 補足の枠つきの行）を、画面の Tailwind の束から部品へ移した。
 *   ★値は移す前の綴りと同じ ＝ 札の題 `text-lg font-bold text-ink leading-snug`（18px・700・行間 1.375）／ 案内の文 `text-sm text-muted leading-relaxed`（14px・行間 1.625）／
 *     2 列 `flex gap-3` ＋ `w-16 flex-shrink-0`（キー 4rem・値 `text-sm text-ink`）／ 選ぶ札 `w-full items-start gap-3 min-h-[44px] px-3 py-2 rounded-lg border border-border`。
 *   ★色は部品の流儀どおりトークン（本文色 --ies-text・控えめ --ies-text-mute）。明るい配色での差は本文色だけ #1A1A1E → #1C1C1C（`.ies-subhead` などへ当てたときの既知の差・上の「文字の役」の注記 ③）・控えめは同じ #636D7E。
 *   ★新しい色・角・余白の値は作っていない。★余白の `mt-*`（札の中の間）は呼ぶ側が持つ（役は文字そのものだけ）。 */
.nb-gcard__title { font-size: 1.125rem; line-height: 1.375; font-weight: 700; color: var(--ies-text); }
.nb-gcard__text { font-size: 0.875rem; line-height: 1.625; color: var(--ies-text-mute); }
/* ★キーと値の 1 行（お子さま ／ 場所）。★キーは `.ies-caption` と一緒に使う（字は 12px の注記）・幅 4rem で値の頭をそろえる。 */
.nb-gfact { display: flex; gap: var(--ies-sp-3); }
.nb-gfact__k { flex-shrink: 0; width: 4rem; }
.nb-gfact__v { min-width: 0; font-size: 0.875rem; line-height: 1.25rem; color: var(--ies-text); }
/* ★選ぶ札（個人設定の「メールでのお知らせ」「メニュー」）。★`.ies-check` と一緒に使う ＝ 行の高さの床 32px・四角 16px・字 14px は部品のまま、ここは枠・余白・押せる高さ 44px・上そろえだけ。 */
.nb-gcheck {
  width: 100%;
  align-items: flex-start;
  gap: var(--ies-sp-3);
  min-height: var(--cl-tap-l, 44px);
  padding: var(--ies-sp-2) var(--ies-sp-3);
  border: 1px solid var(--ies-border);
  border-radius: var(--ies-radius-sm);
}
.nb-gcheck--center { align-items: center; }   /* ★題だけの札（補足の 2 行目が無い）は縦の真ん中 */
/* ★★2026-10-22（K-2178・部品を足す 2・RB1 ③④⑤⑥）: **保護者の月カレンダー**（授業予定の画面・`.ies-card--flush` の中の 7 列の格子）= 曜日の帯 `__week` ／ 日のマス `__cell` ／ 日付の丸 `__num` ／ 休室日の日付 `__off`。
 *   ★なぜ（「在る `.nb-cal`（K-1589）で足りるか」の答え = **足りない**）: `.nb-cal` は `<table>` の格子（座席管理・予約管理）で、**自分の枠・角丸・影・升の内余白 8px・升の罫を持つ**。
 *     保護者の月カレンダーは既にカードの中に在る div の格子で、マスは高さ 48px の押せる `<button>` ＋ 日付の丸 24px ＋ 授業ありの点 ＝ 表にすると枠の中に枠が入り（「枠の中に枠を作らない」）、升の余白で 48px に収まらず、`<table>` への組み替えで HTML も台本も変わる。
 *     `.ies-cal`（`pages/schedule.css`・社員サイトの予定表）はマスが 110px 以上の別の形。★2 つとも **値のトークンは同じ**（曜日の帯の地 = `.nb-cal thead th` と同じ `--ies-surface-alt`）。
 *   ★名前は保護者の部品の仲間（`.nb-gcard` `.nb-gtab` `.nb-gfact` `.nb-gcheck`）にそろえた（`.nb-cal__*` は `<table>` の升の名前なので使わない）。
 *   ★値の出どころ（★新しい値を作っていない）= 手書きの Tailwind と同じ値: 格子 `grid grid-cols-7`（7 列・`minmax(0, 1fr)`）／ 帯 `py-1.5`（0.375rem）・`border-b border-border/60`（下に 1px・罫の 60%）／ マス `h-12`（3rem）・`flex flex-col items-center justify-center` ／ 押せるマス `gap-0.5`（0.125rem）・`transition-all`（0.15s）／
 *     丸 `w-6 h-6`（1.5rem）・`rounded-full`・`text-xs`（12px・行 1rem）／ 休室日の日付 `text-xs line-through` ・「閉」の `leading-none`（行間 1）・間 `mt-0.5`（0.125rem）。
 *   ★★色の 2 か所は手書きの写しではない（暗い配色が追従する側へ直した）: ①帯の地 = 手書きの生 hex `#FAFAF7`（旧い地の色の取り残し・暗い配色で追従しない）→ `--ies-surface-alt`（#F8F8F8・明るい配色で 2 段の差・暗い配色は追従）。
 *     ②休室日のマスの地 = 手書きの `bg-white/80`（暗い配色の置き換えが無い）→ 面のトークン `--ies-surface` の 80%（`color-mix`）＝ 明るい配色は白の 80% で手書きと同じ・暗い配色は面の色（白い箱が浮かない）。★生 hex は門が止める。
 *   ★押せるマスの動き（`transition`）は、画面の CSS が変えるのが背景色だけ（撫でた・選んだ）なので `background-color` に絞った（`all` は書かない）。
 *   ★日の色（日曜の橙・土曜の緑・平日・今日の塗り・休室日の薄い色）は **持たない**（画面の式が Tailwind の色の語で渡す・PHP が決める）。
 *   ★★JS と画面の CSS が読み書きする `gs-cal-day` `gs-cal-sel` `gs-day-num` `data-date` は部品に入れない（画面に残す ＝ 消すと選んだ日の塗りと絞り込みが動かない）。★`gs-cal-day` の `width: 100%` ・撫でた色・選んだ色も画面の `<style>` に残る。
 *   ★`__off` は **丸ではない**（休室日の日付は 12px の取り消し線だけ ＝ `__num` と組まない）。★`__off-mark` は「閉」の行間 1（`.ies-label` と組む）。★休室日のマスは `__cell--closed`（間 2px ＝ 手書きの「閉」の `mt-0.5` を間に持たせた）。
 *   ★渡さなければ出力は 1 バイトも変わらない。★置き換えるときは対応する Tailwind の語（`grid-cols-7` `h-12` `flex-col` `w-6 h-6` `rounded-full` `text-xs` `line-through` `leading-none` `mt-0.5` `bg-white/80` `bg-[…]` など）を消す。 */
.nb-gcal__grid,
.nb-gcal__week { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); }
.nb-gcal__week {
  text-align: center;
  padding: 0.375rem 0;
  border-bottom: 1px solid color-mix(in srgb, var(--ies-border) 60%, transparent);
  background-color: var(--ies-surface-alt);
}
.nb-gcal__cell {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  height: 3rem;
}
.nb-gcal__cell--tap {
  gap: 0.125rem;
  transition: background-color .15s cubic-bezier(.4, 0, .2, 1);
}
.nb-gcal__cell--closed {
  gap: 0.125rem;
  background-color: color-mix(in srgb, var(--ies-surface, var(--cl-surface, #fff)) 80%, transparent);
}
.nb-gcal__num {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 1.5rem;
  height: 1.5rem;
  border-radius: var(--ies-radius-full);
  font-size: 0.75rem;
  line-height: 1rem;
}
.nb-gcal__off { font-size: 0.75rem; line-height: 1rem; text-decoration: line-through; }
.nb-gcal__off-mark { line-height: 1; }

/* ═══════════════════════════════════════════════════════════════════════
 * ㉑ 保存の状態（★「保存中…」「保存しました」「保存できませんでした」）★2026-09-06
 *
 * ★★**なぜここへ移したか**: ★同じ役目のものが **2 通り**在った。
 *   ①`parts/settings-autosave.php` の `<style>`（★丸を持たず、**文字そのものに色**を乗せる）
 *   ②`page-staff-student-manage.php` の `.iesh-savedot`（★6px の丸 ＋ 灰色の文字）
 *   ★★**相澤さんのご決定（2026-09-06・逐語）=「保存の印　OKです共通の形にしてください」。**
 *
 * ★★**②を捨てる理由（★焼いて測った・数で）**:
 *   ①★★**失敗しても丸が緑だった**（★JS が「保存中か否か」だけで色を切り替えていた）。
 *     ★文字は「保存できませんでした」なのに、★丸は「うまくいった」と言っていた。
 *   ②★琥珀の丸は白地に **2.01:1**（★図形に要る 3:1 を下回る）。★緑の丸との差も **2.72:1**。
 *     ★★＝ **丸だけで状態を読み分けることは、いま誰にもできていなかった。**
 *   ③★色だけが運ぶ情報が 1 つ減る（★WCAG 1.4.1「色だけで伝えない」）。
 *   ★★**失うものは無い** ——★3 つの状態は**文字がすでに全部言っている**。
 *
 * ★★**値は `parts/settings-autosave.php` からの写しであって、新しい値ではない。**
 *   ★`--cl-*` を先に置き、★無い環境（＝ 社員サイト）だけ `--ies-*` に落ちる書き方にしてある。
 *   ★★**＝ 教室サイトの見た目は 1px も変わらない。★社員サイトでは初めて色が付く。**
 * ═══════════════════════════════════════════════════════════════════════ */
.nb-save-state { font-size: 0.75rem; color: var(--cl-muted, var(--ies-text-mute)); }
.nb-save-state.is-busy { color: var(--cl-muted, var(--ies-text-mute)); }
.nb-save-state.is-ok   { color: var(--cl-primary-dark, var(--ies-jade-dark)); font-weight: 700; }
.nb-save-state.is-err  { color: var(--cl-accent-dark, var(--ies-coral-ink)); font-weight: 700; }


/* ═══════════════════════════════════════════════════════════════════════════
 * ★★★本文の器 —— **両サイト共通の「一番外の床」**（★2026-09-06・K-1546）
 *
 * ★★**相澤さんの逐語（2026-09-06）**:
 *   「いくらテンプレートとコンポネントを使っても**外側の器からして異なっていたのなら意味ないですよね**
 *    **外側の器から共通にしないとテンプレートとは言いませんよね**」
 *
 * ★★**どこから来たか** = `assets/css/layout.css` に在った 2 行。★あちらは **pdash の画面にしか配られない**
 *   （`inc/pdash-loader.php:883`）ので、★教室サイトの 50 画面では `.ies-content` が **ただの名前**だった。
 *   ★★実測 = 器を出しても `padding-left: 0px` のまま（★2026-09-06）。
 *
 * ★★**値は 1 つも変えていない**（★移しただけ）。★上下 = `clamp(16px, 1.2%, 24px)`（K-222）／
 *   左右 = `clamp(16px, 2vw, 32px)`（K-510）／ 上限 1600px。
 *
 * ★★**出すのは `inc/body-shell.php` だけ。★画面は一番外の箱を書かない**（★見張り = `tools/nb-test-body-shell.php`）。
 * ═══════════════════════════════════════════════════════════════════════════ */
/* ★★2026-09-06: 生の px を刻みへ載せ替えた（★門の指摘）。★★**値は 1 つも変わらない**
   （★`--ies-sp-4` = 16px ／ `--ies-sp-5` = 24px ／ `--ies-sp-6` = 32px。★実測で確認）。
   ★★上限 1600px だけは刻みに無い値なので、そのまま置く（★K-510 で決めた本文の最大幅）。 */
.ies-content {
  padding: clamp(var(--ies-sp-4, 16px), 1.2%, var(--ies-sp-5, 24px))
           clamp(var(--ies-sp-4, 16px), 2vw, var(--ies-sp-6, 32px));
  max-width: 1600px;
  width: 100%;
  /* ★★★2026-09-06 夜: **中央寄せを戻した。★これは移設のときに落ちた 1 行である。**
   *
   * ★★**相澤さんのご指摘（逐語）** =「**設定系の多くがなんか中央ではなくて左に寄っていますけど
   *   これはわざと狙いがあってそうしてるの？ それとも外側の包みをつけたり外したりしてできたバグ？**」
   * ★★**バグだった。**★狙いは 1 つも無い。
   *
   * ★★**証拠は移設元の注記そのもの** = `assets/css/layout.css` の K-510 の注記に
   *   「★**max-width:1600px 超幅は *中央寄せ* +余白ゆえ** clamp 上限 32px は実コンテンツ端で効く」と在る。
   *   ★★**＝ 中央寄せは元の設計に *書いてあった*。★2026-09-06（便 14）で components.css へ移したとき、
   *     この 1 行だけが写されなかった。**★注記は移したが、宣言は落ちた。
   *
   * ★★**実測（★本番 `/5Z99/staff-notices/`・実効幅 2384px で再現）**:
   *   | | 足す前 | ★足したあと |
   *   |---|---|---|
   *   | 本文の器 | x=200 → 1800 | ★**x=492 → 2092** |
   *   | ★**右に死んでいた帯** | ★★**584px** | ★★**左右 292px ずつで対称** |
   *   ★★**＝ 1600px を超える画面では、全画面がまるごと左へ寄っていた**（★設定だけの話ではない）。
   *
   * ★★**狭い画面では 1px も動かない** ——★余りが無いとき `auto` は 0 に落ちる
   *   （★実測 = 幅 1478 では足す前も後も x=200・w=1278 で同一）。
   *
   * ★★**なぜ「画面ごとに違って見えた」か** = 中の器は **自分で中央寄せを持っている**
   *   （`.nb-set` の `margin:0 auto` ／ `.nbsh-*` の `margin:0 auto` ／ `.nb-ls__measure` の `margin-inline:auto`）。
   *   ★★**外が左に寄り、中が中で中央に寄る** ので、★器ごとに「どれくらい左か」が変わっていた。 */
  margin-inline: auto;
}

/* ★★★べた張り（外周の余白 0）は **中に入っている器の型で決まる**。★★画面の名前で決めない。
   ★★相澤さんのご指摘（逐語・2026-09-06）=「**３カラムのテンプレートを０ｐｘにする が正しいんじゃないの
     またページごとのｐｘを個別に設定しようとした？**」——★★そのとおりだった。

   ★★**なぜ 0 か**:
     ・3 カラム（`.nb-ls`）… ★左の柱と本体が **それぞれ内側に余白を持つ**。★外へもう 1 本足すと
       ★★**目が境界を 2 回またぐうえ、★本体が狭くなるだけ**（★相澤さん =「メインカラムが表示領域狭くなるでしょ」）。
     ・カレンダー（`.sv-wrap` / `.nb-yg-shell`）… ★格子そのものが商品。★外周の余白はその税。
       ★あわせて **画面の端に接した面はマウスをぶつけて止められる**（Fitts）。

   ★★**＝ 新しく 3 カラムの画面を作れば、★何も書かなくても 0 になる。**
   ★★**型を増やす（＝ この選択子に 1 本足す）のは相澤さんの決裁**（★逐語 =「管理者である僕の決裁が必要」）。

   ★`:has()` を使う。★すべての現行ブラウザが持つ（2023 年以降）。★持たないブラウザでは
   ★★**規則ごと無視され、★外周の余白が残る**（＝ 崩れではなく、★詰まらないだけ）。 */
.ies-content:has(> .nb-ls),
.ies-content:has(> .sv-wrap),
.ies-content:has(> .nb-yg-shell) {
  /* ★★★2026-09-06 夜: **上下も 0 にした（★左右だけでは足りなかった）。**
   *
   * ★★**相澤さんのご指摘（逐語）** =「**やはり多くの画面のスクショ４，５あたりのこの空白は
   *   すごい気になりますので埋めたほうがいいと感じるのですが これは何か理論的な理由あるんだっけ？
   *   社内メッセージではこの空白はないのにお問い合わせとかお知らせではこの空白があるし
   *   座席管理予約管理のカレンダー系でも空白があって 全く一貫性がない**」。
   *
   * ★★**理論的な理由は無かった。★左右だけ 0 にして、上下を消し忘れていただけである。**
   *
   * ★★**実測（★本番・窓 2560）**:
   *   | 画面 | 帯の下端 | 中身の頭 | ★空白 |
   *   |---|---|---|---|
   *   | お知らせ ／ お問い合わせ ／ 座席管理 | 44 | 69 | ★★**25px** |
   *   | ★**社内メッセージ** | 34 | 45 | ★**11px**（★＝ ほぼ無い） |
   *
   * ★★**なぜ社内メッセージだけ無かったか（★実測で特定）** = ★★**あの画面が器を上書きしていたから。**
   *   ★`assets/css/pages/messages-new.css` の `body.nb-msgs-new .ies-content { … max-width:none; padding:0 }`。
   *   ★★**＝ 一貫していなかったのではなく、★1 枚だけがテンプレートから降りていた。**
   *   ★★**この上書きは K-1547（画面ごとの見た目の分岐の禁止）に当たる形**だが、
   *     ★鍵が slug ではなく body の class なので、★門がすり抜けていた（★別便で畳む）。
   *
   * ★★**なぜ 0 でよいか** = ★この 3 つの器は **中がすでに自分の余白を持っている**
   *   （★3 カラムは柱と本体が各自 ／ カレンダーは格子そのものが商品）。★外にもう 1 本足すと二重になる。
   *   ★★**上下も同じ理屈である。**★左右だけ消していたのは、単に見落としだった。 */
  padding: 0;
}

/* ★★★2026-09-06 夜: **カレンダー系だけ、幅の上限（1600px）も外す。**
 *
 * ★★**相澤さんのご決定（逐語）** =「**これは要するにカレンダー系のテンプレートは左右の幅をなくす
 *   ということだよね？であれば賛成です**」。
 *
 * ★★**なぜカレンダーだけか（★3 カラムに同じことをしない理由）**:
 *   ★カレンダーの中身は **格子**で、★★**広いほど 1 日ぶんの列が太くなり、そのまま読みやすくなる。**
 *   ★★3 カラムの本文は **読む文章**で、★上限（990px ＝ 1 行 約 70 文字）は *内側* に別に在る。
 *     ★★＝ 外の 1600 を外しても、★★**読む列は 990 のまま。★空白が外から内へ移るだけで、減らない。**
 *   ★相澤さんのお見立て =「3 カラムはメインの領域が確かにそこまで幅を占有する画面はない」
 *     ★★（★ご本人が「全画面で確かめたわけではない」と添えられている ＝ **未実測**。
 *     　★確かめるなら「本文の中でいちばん広い中身」を画面ごとに測る）。
 *
 * ★★**実測（★本番・窓 2560・座席管理）**: ★本文の器 1600 → **2360**（★左右 380px の帯が消える）。
 *
 * ★★**予約管理も同じ扱い**（`.nb-yg-shell`）。
 *
 * ═══════════════════════════════════════════════════════════════════════════
 * ★★★**2026-09-06 夜・訂正: 上の「3 カラム（`.nb-ls`）はここに書かない」は失効した。**
 *
 * ★★**相澤さんのご指摘（逐語）**:
 *   「**あとお問い合わせとかお知らせの３カラムレイアウトがなぜか中央寄せになってるんだけど**」
 *   「**社内メッセージは正しい形をしているけど**」
 *   「**社内メッセージだけが正しい形をしていてその他の３カラムの画面がおかしいということは
 *     テンプレを使ってないの？**」
 *
 * ★★**答え = 使っている。★5 枚とも同じ器（`.nb-ls`）である。**
 *   ★★**社内メッセージだけが、その上から *自分の CSS で器を上書き* していた**
 *     （`assets/css/pages/messages-new.css` の `body.nb-msgs-new .ies-content { max-width: none }`）。
 *   ★★**＝ 1 枚だけが正しく見えていたのは、★器が正しかったからではなく、
 *     　★あの 1 枚だけが器の外へ出ていたからである。★他の 4 枚は器の *素の姿* を映していた。**
 *
 * ★★**上の「なぜカレンダーだけか」の理屈は、★半分しか当たっていなかった**:
 *   ★「読む列は 990 のまま ＝ 空白が外から内へ移るだけ」は **本文の側**の話としては正しい。
 *   ★★**しかし 3 カラムは *本文だけの器ではない*。★左に柱（一覧）を持つ。**
 *     ★上限 1600 ＋ 中央寄せだと、★★**枠ごと画面の真ん中に浮き、★柱が窓の左端から離れる。**
 *     ★★＝ 一覧は「窓の左端に貼り付いている」ことで場所を覚えるものなので、★浮くと毎回探し直しになる。
 *   ★★**カレンダーと同じ結論に、★別の理由で着く。**
 *
 * ★★**読む列が伸びる心配は無い**（★上の理屈のうち生きている側）:
 *   ★本文の上限 990px は `.nb-ls__measure` が **内側で**持っている（`pages/list-shell.css`）。
 *   ★★＝ 外を外しても 1 行の文字数は 1 文字も増えない。
 * ═══════════════════════════════════════════════════════════════════════════ */
/* ★★★2026-09-06 夜: **予定表のカレンダーを一覧に足した（★`assets/css/pages/schedule.css:5` から移設）。**
 *   ★★**カレンダーは 2 種類ではなく 3 種類あった**（★別プロセスの棚卸しで判明。★親は 2 つだと思っていた）:
 *     ①座席管理 `.sv-wrap` ／ ②予約管理 `.nb-yg-shell` ／ ★★③**予定表 `#ies-calendar-root`**
 *   ★★③だけが一覧から漏れ、★**画面が自分で `max-width: none` を書き続けていた。**
 *   ★★**値は 1 バイトも変えていない**（★移しただけ ＝ 画面の見え方は 1px も動かない）。
 *   ★★**上限だけを移し、外周の余白は移していない**（★①②と違い、★③は余白を持ったまま今日まで来ている。
 *     ★余白まで揃えるかは *見え方が変わる* 判断なので、★★**相澤さんに測ってお見せしてから決める**）。
 *   ★★③だけ *子孫* で見る理由 = ★元の 1 行が子孫だったから（★形を変えると挙動が変わる恐れがある）。 */
/* ★★★2026-09-12（相澤さんのご指摘）: **上にタブの器（経営報告書）を一覧に足した。**
 *   ★逐語 =「経営報告書…**やはり僕の２８インチモニタでも横スクロールが出るのが気になります**／
 *     座席管理や予約管理は本文すべて使ってるけど **同じように本文ほぼ全画面使ってもいい**気がする／
 *     現状は google スプレッドシートなので当然全画面が表の形式…**逆に横スクロールとかのほうが微妙**」。
 *   ★★**なぜ 1 行で効くのか（★担当 NAV の実測）**: ★外枠の上限 1600px ＋ 左右の余白 32px で
 *     ★**中身は 1536px で頭打ち**（★2560px の画面でも 1536px のまま）。★一方、支出と損益計算書の表は
 *     ★14 列ぜんぶに固定幅と `nowrap` が入っており **1572px が縮まない床**。★★＝ **36px 足りない**。
 *     ★この 1 行を入れないと、★**どんなに広いモニタでも横スクロールは消えない**。
 *   ★★**狭い窓では残る**（★正直に書く）: 窓 1440px では中身 1176px なので、支出と PL は今までどおり
 *     ★表の内側にスクロールが出る（★1920px で 1656px ＝ 収まる）。★列を減らす案は別の便。
 *   ★★**外周の余白は移していない**（★①②と違い、★表は角丸の面に載るので、余白 0 にすると
 *     ★面の縁が窓にくっついて「面」と読めなくなる）。★見張り = `tools/nb-test-KEIEI-shell.php` の C8
 *     （★いままで「未着地」と名乗って通していた判定が、この 1 行で **OK に変わる**）。 */
.ies-content:has(> .nb-ls),
.ies-content:has(> .nb-tsh),
.ies-content:has(> .sv-wrap),
.ies-content:has(> .nb-yg-shell),
.ies-content:has(#ies-calendar-root) {
  max-width: none;
}

/* ═══════════════════════════════════════════════════════════════════════════
 * ★★★2026-09-06 夜: **3 カラムの器に「窓の高さ」を渡す。**
 *
 * ★★**相澤さんのご指摘**（逐語）:
 *   「**ナレッジや社内メッセージが正しい見栄えなんだけどどうして同じテンプレートを使っているはずが
 *     見栄えが異なるの？　満足度カルテも正しい形です**」
 *
 * ★★**答え = 高さを渡す 1 行が、★また *画面の側* に在った。**★幅のときと同じ形である。
 *   ★社内メッセージだけが `messages-new.css` に `display:grid; grid-template-rows:1fr; flex:1 1 auto` を持ち、
 *   ★★**他の 3 カラムは何も持っていなかった。**
 *
 * ★★**なぜ 3 枚は正しく見えていたのか（★実測で分かった・見かけと理由が違う）**:
 *   ★器の流れ方は 2 つある（K-1213）。★★**正しく見えていた 3 枚は、たまたま全部「ページ流し」だった。**
 *     ・社内メッセージ ／ 満足度カルテ ／ ナレッジ … ★**ページ流し**（★柱に `min-height` が効いて底まで伸びる）
 *     ・★★お知らせ ／ お問い合わせ ／ 講師への配信 … ★**器の中流し**（`body.nb-ls-flow-inner`）
 *   ★★**器の中流しは、body → 器 の *たけの鎖* が `.ies-content` で切れていた。**
 *     ★`body` は縦の flex（高さ 100dvh）だが、★`.ies-content` は `display:block; flex:0 1 auto` ＝ **伸びない**。
 *     ★★＝ 器は中身のたけ（★実測 **352px**）で止まり、★下が地の色のまま残っていた。
 *
 * ★★**実測（★本番・窓 1271・お知らせ）**: ★この 4 行を当てると **352 → 1226px**（＝ 窓 − 帯 45）。
 *   ★★**ページ流しの画面では 1px も動かない**（★満足度カルテ = 当てる前後とも 6781px・縦スクロール 5555 のまま）。
 *   ★★だから **流れ方で分けずに、3 カラム全部へ当てる**（★分けるほど、また片方だけ直す日が来る）。
 * ═══════════════════════════════════════════════════════════════════════════ */
.ies-content:has(> .nb-ls) {
  /* ★★親が縦の flex のとき（★器の中流し）に **伸びる**ための 2 行。 */
  flex: 1 1 auto;
  min-height: 0;
  /* ★★中のただ 1 つの子（＝ 3 カラムの器）に、★**横も縦も**自分のたけを渡す。
     ★`flex`（横並び）にすると器が中身なりの幅に縮み、★画面側に `flex:1 1 auto` を書く羽目になる。 */
  display: grid;
  grid-template-rows: 1fr;
}

/* ═══════════════════════════════════════════════════════════════════════════
 * ★★2026-09-25: **会話の 1 通（本文の器の直下に返信の箱を持つ画面）は、文書ごと流れるまま「窓の高さぶんの下限」を持つ。**
 *
 * ★★相澤さん（2026-09-25・要点）=「サイドバーやカラムは固定されつつも **本文画面全体が縦スクロール** される挙動」
 *   「その画面の一部だけがスクロールされるのが昔のインラインフレームの個人ホームページみたいでダサい」
 *   「いちいちそのインライン要素の上までマウスカーソルをもっていかないといけないという時点でアウト」
 * ★直したいこと = スレッドが短いと、返信の箱（書く欄）が窓の途中に浮く（★手元の実測 = 書く欄が窓の下端から 幅 390 で 170.6px・1280 で 195.8px 上 ／ 返信 0 件では 405.4px・410px 上）。
 *
 * ★型で決める（K-1547）= **本文の器の直下に `.ies-thread__reply-card` を持つ画面だけ**（★いまは templates/page-message-single.php の 1 枚）。
 *   ★新しい社内メッセージ（3 列・templates/page-messages-new.php）は同じ箱を器の奥に描く ＝ 直下ではないので当たらない。
 * ★形 = body を縦の flex にして下限のたけ（100svh）を持たせ、本文の器を伸ばして縦の flex にする。
 *   ★返信の箱は `assets/css/pages/messages.css` の `margin-top: auto` で下へ押し出される。
 *   ★スレッドが窓より長ければ、ふつうに文書が流れる（★返信の箱は今の `position: sticky; bottom: 0` のまま窓の下に貼りつく）。
 * ★★**書かないもの = `height` の固定と `overflow`。**（★K-1748 の「窓の高さの器」＝ 中だけが流れる形は使わない。同じ日に一度その案が出て取り下げた）
 *   ★見張り = tools/nb-test-thread-docflow.php（★どこかの箱に overflow とたけの上限が付いたら赤・下へ押し出す仕掛けが消えたら赤・返信の箱に style 属性の margin が戻ったら赤）。
 *   ★★2026-09-25 夕方 訂正: **スマホ（マウスで使う広い窓以外）だけは、下の節で html の overflow と body の height を書く**（★窓まるごとの箱・相澤さんの iPhone の指示）。
 *     ★PC は上の「書かない」のまま（★門の F-01〜F-05 は PC 側の規則だけで数える・スマホの形は M-01〜M-06）。
 * ★`svh`（控え `vh`）を選ぶ理由 = components/chat.css の K-1733 の注記と同じ（★`dvh` は iPhone のツールバーの出入りで文書が伸び縮みし、往復を作りうる）。
 * ★★型を 1 つ増やした ＝ **相澤さんの決裁待ち**（★body-shell.php の約束 =「型を増やすのは相澤さんの決裁」）。
 *   ★画面の CSS（messages.css）へ置く道も無い: 一番外の器の寸法（display・flex）を画面が書く形になり、tools/nb-test-shell-override.php が赤にする（★逃げ道の名簿も相澤さんの決裁）。
 *   ★振る舞いの出典 = 2026-09-25 の相澤さんの言葉（親が中継・上の要点）。
 * ═══════════════════════════════════════════════════════════════════════════ */
body:has(> .ies-content > .ies-thread__reply-card) {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  min-height: 100svh;
}
.ies-content:has(> .ies-thread__reply-card) {
  flex: 1 0 auto;
  display: flex;
  flex-direction: column;
}
/* ★★2026-09-28（W-010・本棚 [792]）: **3 列の器（新しい社内メッセージ・templates/page-messages-new.php）の本文に会話の 1 通を挟んだ画面も、書く欄を本文の列の下まで押し出す。**
 *   ★パソコンでは本文の列（.nb-ls__body）は柱の下限（assets/css/pages/list-shell.css の「帯の下から画面の底まで」）で窓の底まで伸びているが、
 *     中の 2 枚（.nb-ls__scroll ／ .nb-ls__measure）が中身の丈で止まり、書く欄が中身の直後に浮いていた（★手元の実測 = 1280 で窓の底から 172.8px 上）。
 *   ★直し = この 2 枚を列の丈まで伸ばして縦の flex にし、書く欄を margin-top: auto で下へ押し出す（★上の 1 通の画面と同じ考え方・中身の余白の 3 行も同じ）。
 *     ★画面の CSS（messages.css）に置かない = 画面は器の型名を書かない（CLAUDE.md §3）＝ 会話の 1 通の型の節（ここ）に 2 つの形を並べる。
 *   ★書かないもの = height の固定と overflow（K-1880 ③）＝ 長いやりとりでは今までどおり文書が流れ、書く欄は sticky で窓の下に貼りつく。
 *   ★器の中の流れ（body.nb-ls-flow-inner = .nb-ls__scroll が中で流れる形）には当てない。
 *   ★スマホ（幅 899 以下）は柱が隠れて下限が無くなり、ページそのものが窓より短く終わる（★390 で 112.6px 浮く）＝ ここの規則だけでは直らない。
 *     ★★2026-09-28 訂正: 下の @media の 1 規則（外側の器 body に下限のたけ）で直した ＝ inc/body-shell.php の約束どおり相澤さんの決裁（問い 152「1」・K-1927）。旧記述は残す。 */
body:not(.nb-ls-flow-inner) .nb-ls__scroll:has(> .nb-ls__measure > .ies-thread__reply-card),
body:not(.nb-ls-flow-inner) .nb-ls__measure:has(> .ies-thread__reply-card) {
  flex: 1 0 auto;
  display: flex;
  flex-direction: column;
}
body:not(.nb-ls-flow-inner) .nb-ls__measure > .ies-thread__reply-card { margin-top: auto; }
body:not(.nb-ls-flow-inner) .nb-ls__measure > :has(+ .ies-thread__reply-card) { margin-bottom: var(--ies-sp-4); }
/* ★2026-10-03（W-267 ⑦・束 1 の 1a）: ここに在った「返信 N 件」の見出しの上の余白の打ち消し（旧 = 返信の節の見出しの先頭の子に `margin-top: 0`）を削除した。
 *   ★対象 0 ＝ 返信の見出しは節の見出しの部品（`templates/page-message-single.php` の `.ies-sec-head`・上の余白を持たない）になり、旧の類名の要素はどの画面にも無い
 *   （`pages/messages.css` の同じ打ち消し 2 つも同じ日に消した）。★動き 0。 */
/* ★★2026-09-28（W-010 ②・問い 152 = 相澤さんの決裁「1」・K-1927）: **スマホ（幅 899 以下）の 3 列の社内メッセージは、外側の器（body）に窓の高さの下限を持たせる。**
 *   ★柱（一覧）が隠れる幅では、本文の列の丈を決めるものが中身しか無く、ページが窓より短く終わっていた（★手元の実測 = 390 で書く欄が 112.6px 浮く）。
 *   ★形は上の 1 通の画面の型（body:has(> .ies-content > .ies-thread__reply-card)）と同じ ＝ body を縦の flex にして下限 100svh・本文の器（.ies-content:has(> .nb-ls) の flex: 1 1 auto）が伸びる。
 *   ★幅の境目 899px は assets/css/pages/list-shell.css の「柱を隠す」境目と同じ（★900 以上は柱の下限が効いている）。★器の中の流れには当てない。 */
@media (max-width: 899px) {
  body:not(.nb-ls-flow-inner):has(> .ies-content > .nb-ls .nb-ls__measure > .ies-thread__reply-card) {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
    min-height: 100svh;
  }
}
/* ★★2026-09-25 夕方（相澤さん「PC版は今のままでいい　でもiPhoneの制御が難しいんだよね」「ツールバーが出たり消えたりするが特にね」
 *   「chat gptのようにツールバーとテキストエリアの両方が完全に固定されているほうが操作しやすそう」）:
 *   **スマホ（＝ マウスで使う広い窓〈PC〉以外）だけ、窓まるごとの箱（body）で流す。**★PC は上の 2 規則のまま（★1 宣言も変えない）。
 *   ★形と理由は保護者のお問い合わせ（components/chat.css の同じ日の節）と同じ ＝ 文書（html）は流れない・流れるのは body（幅も高さも窓まるごと）・
 *     頭（.ies-header の sticky）と返信の箱（messages.css の sticky）は箱の上と下に貼りつく・たけと上端は画面の台本 nb-vv-box が見えている窓に合わせる。
 *   ★body の下限のたけ（上の 100svh）は 0 に戻す（★残すとキーボードが出ても箱が縮まない）。★body の子は縮めない（★箱のたけが決まると頭が縮みうる）。
 *   ★覆いを開いたあいだ後ろを止める印（`.ies-modal-open` / `body.noberu-menu-active` = overflow: hidden）は、この箱の overflow-y: auto に詳細度で負ける
 *     ＝ 印が付いたあいだは hidden に戻す 1 規則を足した（★`:where()` で弱く書く形は、ほかの門〈tools/nb-test-msgs-clip.php〉が読めない ＝ 名指しで書く）。
 *   ★条件の字は components/chat.css・画面の台本と一字一句同じ ＝ 門 = tools/nb-test-thread-docflow.php の M-01〜M-06。
 *   ★型を足した ＝ 上の 2 規則と同じく相澤さんの決裁の対象（★body-shell.php の約束）。 */
@media not all and (min-width: 48rem) and (hover: hover) and (pointer: fine) {
  html:has(> body > .ies-content > .ies-thread__reply-card) {
    overflow: hidden;
    overscroll-behavior: none;
  }
  body:has(> .ies-content > .ies-thread__reply-card) {
    min-height: 0;
    height: var(--nb-vvh, 100dvh);
    margin-top: var(--nb-vvt, 0px);
    overflow-y: auto;
    overscroll-behavior: none;
  }
  body.ies-modal-open:has(> .ies-content > .ies-thread__reply-card),
  body.noberu-menu-active:has(> .ies-content > .ies-thread__reply-card) { overflow-y: hidden; }
  body:has(> .ies-content > .ies-thread__reply-card) > * { flex-shrink: 0; }
}
/* ★2026-09-29（W-175）: 上の条件は印刷でも真になりうる。★引き金は「紙の中身の幅が 48rem 未満」（★ふつうの余白の A4 がそれ）。
 *   ★★2026-09-29 訂正（W-026）: 旧記述は理由を「紙には hover が無い」としていたが、その理由づけは誤り ＝ 失効（★根拠 = `not all and (A) and (B) and (C)` は
 *     3 つの条件のどれか 1 つが偽なら真 ＝ 幅が 48rem 未満なら hover の値によらず真。★紙の幅が 48rem 以上のときの hover / pointer の値は測っていない）。
 *   ★箱（html の overflow: hidden・body のたけ = 窓）が紙に当たり、1 通が 1 枚目で切れていた（実測 = 余白 10mm の A4 で 1 枚・箱の無い同じ長さは 6 枚）。
 *   ★印刷では箱を外す（★上の条件の字は変えない = 門 M-01〜M-06 が字で比べている）。★同じ詳細度 ＝ 後ろに置いて勝つ。 */
@media print {
  html:has(> body > .ies-content > .ies-thread__reply-card) { overflow: visible; }
  body:has(> .ies-content > .ies-thread__reply-card) { height: auto; margin-top: 0; overflow-y: visible; }
}
/* ★★2026-09-29（W-026・束 12 の監査 C）: **器の中流し（`body.nb-ls-flow-inner`）は、紙では窓の高さで切らない。**
 *   ★対象 = `noberu_list_shell_enqueue( 'inner' )` を呼ぶ 8 画面（★ファイル・申込・出席可能日・お問い合わせ管理・講師への配信・講師のシフト・お知らせのテンプレート・ワークフロー
 *     ＝ 2026-09-29 に呼び出しを数えた）。★流れ方 `page` の画面は `body:not(.nb-ls-flow-inner)` ＝ この節に当たらない。
 *   ★何が起きていたか（★推測・印刷プレビューは開いていない）: body が 100dvh・overflow hidden、中の柱（`.nb-ls__rail` / `.nb-ls__list`）と本文（`.nb-ls__body` / `.nb-ls__scroll`）が
 *     overflow ＝ 長いものは 1 枚目で切れる。★直し = 紙では高さと overflow を解く（★画面には 1 宣言も効かない・器の 1 か所・画面ごとには書かない）。
 *   ★頭に `html` を足す理由 = `list-shell.css` は画面が積むので、この components.css より後ろに載る（★同じ詳細度なら負ける）。★`html` 1 つ足して 1 段上げる。
 *   ★置き場が `list-shell.css` ではない理由 = あちらに印刷の節（`@media print`）を書くと、pre-commit の門 `tools/nb-test-karte-print.php` の P-09（★「器の CSS は印刷の規則を持たない」）が赤になる。
 *     ★紙の 1 枚は `parts/list-shell.php` の `noberu_shell_print_unfold()` が `page` の画面にだけ出す設計。★置き場を移すなら、P-09 の見方も同じ便で直す。
 *   ★柱は隠していない（★満足度カルテの `noberu_shell_print_unfold()` は隠す。★8 画面で隠すかは決めていない ＝ 未決）。
 *   ★この節が見ないもの: 各画面が自分で持つ固定の高さ・内側のスクロール（★例 = 講師のシフトの格子）／ 帯とサイドバー（★紙にそのまま出る）。 */
@media print {
  html body.nb-ls-flow-inner { height: auto; min-height: 0; overflow: visible; }
  html body.nb-ls-flow-inner .nb-ls__rail,
  html body.nb-ls-flow-inner .nb-ls__body { overflow: visible; }
  html body.nb-ls-flow-inner .nb-ls__list,
  html body.nb-ls-flow-inner .nb-ls__scroll { min-height: 0; overflow: visible; }
}

/* ★★★2026-09-06 夜: **表の器も上限（1600px）を外す。★ただし外周の余白は残す。**
 *
 * ★★**相澤さんのご提案（逐語）** =「**現状１４７９ｐｘくらいの幅でぎりぎり横スクロールが消えます
 *   でもスクショ２，３とおり両サイドに結構な余白あるんですよね　こういうのも表形式だと幅が広いケースって
 *   多いと思うので３カラムとかカレンダーのように最大限領域を活用するというのを模索してもいい**」。
 *
 * ★★**上限は外す**（★カレンダーと同じ理由 ——★列が増えるほど幅が要る）。
 * ★★**余白は残す**（★カレンダーと違う点）。★理由 = ★表は **角丸の面**に載る。
 *   ★余白を 0 にすると、★カードの角が柱と窓の縁に貼りつき、★★**面であることが読めなくなる。**
 *   ★格子（カレンダー）は面を持たないので 0 でよい。
 *
 * ★★**両サイドの余白の正体は *二重* だった**（★計算値。★★実測ではない ——
 *   ★測ろうとした時点でブラウザの窓が幅 0 になり、★取れなかった）:
 *   ★`.ies-content` の左右 `clamp(16px, 2vw, 32px)` ＋ 画面側の包み `.nb-leads-page` の同じ clamp。
 *   ★★幅 1479 では **29.6px × 2 = 59.2px が片側**、★左右で **118px**。
 *   ★★**器へ載せ替えると画面側の包みが消える**ので、★この二重は載せ替えそのもので解ける。
 *   ★計算 = 1479 − 柱 200 − 縦棒 15 − 片側 29.6×2 ＝ **1204.8px**。★表の下限 1150px は **入る**。 */
/* ★★**表だけは *孫* でも効かせる**（`:has(.nb-tbl)`。★他の 3 つは `:has(> …)`）。
 *   ★★**なぜ差を付けるか（★実測・本番 2026-09-06）**: ★表を持つ画面は、器の外にもう 1 枚
 *     「この画面ぜんたい」の箱を持つことがある（★問い合わせ管理の `.nb-leads-page`）。
 *   ★★`> ` を付けると、★その 1 枚に阻まれて **上限が外れなかった**（★実測 = 本文が 1600 のまま）。
 *   ★★**入れ子の表で誤爆しないか** = ★この器は表の中に入れ子にできない（★行のセルは値だけを受ける）ので、
 *     ★`.nb-tbl` が 2 つ入れ子になることは構造上ありえない。 */
.ies-content:has(.nb-tbl) {
  max-width: none;
}

/* ═══════════════════════════════════════════════════════════════════════════
 * ★★★文章の器 `.nb-prose` —— 利用者が書いた文章をそのまま出す場所（★2026-09-08・K-1562）
 *
 * ★★相澤さんのご決定（2026-09-07）= 「**B で**」。★選択肢 A = 下敷き（全画面）に 12px ／ B = 文章の器だけ。
 * ★★何が起きていたか = 段 B（配りの 1 本化）で `base.css` が教室サイトに届き、
 *   ★部品の説明文（`.ies-caption` ほか）**186 要素**に 12px が付いた。
 *   ★★部品の中の段落は **部品が決める**（★型で決める・K-1547 と同じ向き）。
 *
 * ★★**どこに付けるか** = 利用者が書いた文章を **そのまま**出す包み。
 *   ・社内メッセージの本文（`.ies-msg-body__content`）と返信（`.ies-reply__content`）
 *   ・お知らせ 4 画面（教室・保護者・保護者のホーム・講師への配信・講師が読む）
 *   ★★**部品の説明文には付けない。**★あれは「文章」ではなく **部品の一部**である。
 *
 * ★★`:where()` で詳細度を **(0,1,0)** に抑える。★理由 = 社内メッセージは
 *   `.ies-msg-body__content p:last-child { margin-bottom: 0 }`（(0,2,1)）や
 *   見出しの `margin: 32px 0 12px`（(0,2,1)）を **自分で持っている**。★あれらが今までどおり勝つ。
 * ★★値は下敷きに在ったものと **同じ**（`--ies-sp-3` = 12px）。★★`:last-child` の 0 は足さない
 *   （★社内メッセージが自分で持つ。★ここで足すと、持っていない画面の最後の段落まで詰まる）。
 * ★★見張り = `tools/nb-test-prose.php`（★下敷きに戻った ／ この規則が消えた ／ 包みから名前が外れた、を止める）。
 * ═══════════════════════════════════════════════════════════════════════════ */
.nb-prose :where(p, h1, h2, h3, h4) { margin: 0 0 var(--ies-sp-3); }

/* ═══════════ ★★★2026-09-08（段 H-1・K-1562）: 文章の器が「中身の型」も持つ ═══════════
 * ★★**出どころ** = ★お知らせの 2 画面が **同じ規則を別々に**持っていた（★実測・1 バイト違わず、
 *   ★接頭辞が `.ntc-body` ↔ `.gn-body` に違うだけ）:
 *     `page-staff-notices.php` の `<style>` 8 行 ／ `page-guardian-notices.php` の `<style>` 9 行。
 *   ★★**片方だけ直すという事故が、いちばん起きやすい形**（★同じ注意書きが `page-staff-notices.php` の
 *     2026-08-30 の注記に既に在る ——★あのときはボタンと入力欄を寄せ、★**文章の型だけが残っていた**）。
 * ★★**＝ 利用者が書いた文章の型は、文章の器が持つ。**★画面は包みに `nb-prose` を付けるだけ。
 *
 * ★★**見た目が変わるところ（★意図した変化・目視待ちに積んだ）**:
 *   ・★お知らせ 2 画面 = ★罫線の色が **生の #E5E7EB → `--ies-border`（#E3E3E3）**（★わずかに濃い）
 *   ・★★**社内メッセージは 1 つも変わらない**（★実測 = 見出し 2・箇条書き・表・升の 4 項目とも同じ）。
 *     ★理由 = `assets/css/pages/messages.css` が **同じ重み（0,1,1）で同じ型**を既に持っており、
 *       ★載る順（部品 → 画面の CSS）で **あちらが後**に来るため勝つ。
 *     ★★**親はここを 1 度読み違えた**（★測る板に messages.css を読み込まず「表が 62px → 900px になる」と
 *       書いた）。★★**載る順を再現していない板は、合格ではなく *測れていない***。
 *
 * ★★**段落の下（12px）は上の 1 行が持つ。★ここでは段落に触らない**（★2 か所で決めない）。
 * ★★見張り = `tools/nb-test-prose.php`（★下敷きに戻った ／ この規則が消えた ／ 包みの名前が外れた）。
 * ═══════════════════════════════════════════════════════════════════════════════ */
/* ★★**値は 1 つも動かしていない**（★rem のまま写した）。★動かしたのは **色だけ**（★下の注記）。
 *   ★理由 = ★段の目盛（4/8/12/16/24…）に寄せると **9 つの値がいっせいに動く**。
 *     ★★寄せるなら「1 つずつ変えて描いて測る」べきで、★**移す便でまとめてやらない**（★原因が混ざる）。
 *   ★★寄せるかどうかは別便の判断として `docs/pending-decisions.md` に積んだ。 */
.nb-prose h2 { font-size: 1rem; font-weight: bold; margin: 1rem 0 .4rem; }
.nb-prose h3 { font-size: .9rem; font-weight: bold; margin: .8rem 0 .3rem; }
.nb-prose ul { list-style: disc;    padding-left: 1.25rem; margin: .4rem 0; }
.nb-prose ol { list-style: decimal; padding-left: 1.25rem; margin: .4rem 0; }
.nb-prose hr { border: none; border-top: 1px solid var(--ies-border, #E3E3E3); margin: 1rem 0; }
.nb-prose table { border-collapse: collapse; width: 100%; margin: .6rem 0; font-size: .82rem; }
.nb-prose table td,
.nb-prose table th { border: 1px solid var(--ies-border, #E3E3E3); padding: .4rem .6rem; }
.nb-prose table th { background: var(--cl-surface, #FFFFFF); font-weight: bold; }

@media (max-width: 767px) {
  /* ★狭い画面では詰める（★layout.css から移した。★値は不変）。 */
  .ies-content { padding: var(--ies-sp-4) var(--ies-sp-2); }
  /* ★★2026-09-06 夜: 広い画面と同じく **上下も 0**（★上の注記と対）。★片方だけ直すと静かに食い違う。 */
  .ies-content:has(> .nb-ls),
  .ies-content:has(> .sv-wrap),
  .ies-content:has(> .nb-yg-shell) { padding: 0; }
}


/* ═══════════════════════════════════════════════════════════════════════════
 * ★★★表の器（`nb-tbl`）—— 4 つ目のテンプレート
 *   ★2026-09-06 新設（K-1548）／ ★★**2026-09-06 夜に全面改訂**
 *
 * ★★相澤さんの逐語 =「**表　の器を作って綺麗に統一構造ができるのならいいですね**」
 *
 * ═══════════════════════════════════════════════════════════════════
 * ★★★**2026-09-06 夜: 私の推奨を 2 つ撤回した。★相澤さんの実機のご指摘で覆った。**
 *
 * ★★**撤回①: 「縦スクロールを表の中で流す」** ——★★**やめた。★ページが流れる。**
 *   ★逐語 =「**全体の縦スクロールの中にインラインフレームのように内側に縦スクロールが
 *     あるのがすごい違和感です**」（★座席管理をご覧になって）。★★**そのとおりである。**
 *   ★★**代わりに、見出しは *ページ* に対して貼りつく**（`top: var(--ies-header-h)`）。
 *   ★★**これで「見出しの固定」は失わずに、入れ子のスクロールが消える。**
 *
 * ★★**撤回②: 「横に長い表は器が受け止める（横スクロール＋釘付け）」** ——★★**最後の手段に降格。**
 *   ★逐語 =「**住所とかはほぼ使いませんが重要な情報なのでクリックしたら全部が見えるとか
 *     そういう工夫をいくつかの項目でやっています … 可能なら横スクロールはないほうがいいです**」。
 *   ★★**＝ 相澤さんが問い合わせ管理で既に作られていた工夫を、器の標準にする**（`.nb-tbl__peek`）。
 *   ★★**既定は「詰めて、押すと全部見える」。★横スクロールは名指しで選んだときだけ。**
 *
 * ★★**この 2 つは繋がっている（★CSS の決まりごと）**:
 *   ★`overflow-x: auto` を置いた瞬間、その要素は **縦にもスクロールの器になる**
 *     （★`overflow-y: visible` は指定できない ＝ 自動で `auto` に化ける）。
 *   ★★**＝ 横スクロールを持たせると、見出しはページに貼りつけなくなる。**
 *   ★★**＝ 横スクロールをやめることが、そのまま「入れ子のスクロールをやめる」ことになる。**
 * ═══════════════════════════════════════════════════════════════════
 *
 * ★★**採用した 6 つ**（★モック = `docs/ui/screens/表の器/mock-2026-09-06.html`）:
 *   ①~~縦スクロールは表の中~~ → ★★**ページが流れる。見出しは帯の下に貼りつく**（★上の撤回①）
 *   ②道具の列は **2 行**（★上 = 何を見るか ／ 下 = 何をするか。★K-1446 の正典を表にも当てる）
 *   ③行の高さは **標準 44 / 密 32**（★歯車で本人が選ぶ）
 *   ④表は **白い面（枠 1px・角丸 12）で包む**
 *   ⑤給与一覧は表に作り替える（★器ではなく画面側の話）
 *   ⑥選んだ行は **淡い緑地 ＋ チェックの印**
 *
 * ★★★**2026-09-06 訂正: 旧記述「問い合わせ管理の表は幅 1320px」は *出どころが無い*。**
 *   ★実測の記録は `assets/css/pages/inquiries.css` の「自然幅 1106.7〜1161.8px ／ 下限 1150px」だけ。
 *   ★★**器の寸法はこの数に 1 つも依存していない。**
 *
 * ★★**器の名前は *主役* で決める。**★付属のレールや道具の列で決めない。
 * ★★**出すのは `parts/table-shell.php` の口だけ。★画面が `.nb-tbl*` を自分で書かない。**
 *   ★ふるまい = `assets/js/table-shell.js`。★見張り = `tools/nb-test-table-shell.php`。
 * ═══════════════════════════════════════════════════════════════════════════ */
.nb-tbl {
  display: flex;
  flex-direction: column;
  gap: var(--ies-sp-3, 12px);
  min-width: 0;                 /* ★親が flex/grid のとき、中の表に押し広げられない */
}

/* ★要約（★任意・最大 5 枚）。★中身は `.ies-stat` をそのまま並べる ＝ 2 つ目の部品を作らない。
   ★★**要約と道具の列の間だけ 1 段広い**（12 ＋ 4 = 16px）——★性質が違うものの境目（近接）。 */
.nb-tbl__summary {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
  gap: var(--ies-sp-3, 12px);
  margin-bottom: var(--ies-sp-1, 4px);
}

/* ★★道具の列は **2 行**。★上「何を見るか」／下「何をするか」。
   ★★**「する」ものが無い画面では、2 行目そのものが出ない**（★空の帯を描かない）。 */
.nb-tbl__bar {
  display: flex;
  flex-direction: column;
  gap: var(--ies-sp-2, 8px);
}
.nb-tbl__row {
  display: flex;
  align-items: center;
  flex-wrap: wrap;              /* ★狭い画面では折り返す（★横スクロールを作らない） */
  gap: var(--ies-sp-2, 8px) var(--ies-sp-3, 12px);
  min-height: var(--ies-tap-m, 32px);
}
.nb-tbl__group {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--ies-sp-2, 8px);
  min-width: 0;
}
/* ★★右端の一群（★件数・歯車・主要な押しもの）。★★**どの表でも同じ場所**に在ることが値打ち。 */
.nb-tbl__right {
  margin-left: auto;
  display: flex;
  flex-wrap: wrap;              /* ★2026-09-11（担当 PAYLIST の実測）: 札とボタンを並べると、折り返さずにボタンが 1 文字ずつ折れた（高さ 147px）。★塊ごと次の行へ送る */
  align-items: center;
  gap: var(--ies-sp-2, 8px);
  position: relative;           /* ★歯車の献立の受け皿 */
}
/* ★件数。★★**数字は等幅**（★桁が動いても位置が揺れない）。 */
.nb-tbl__count {
  color: var(--ies-text-sub, #5c5c5c);
  font-size: 0.75rem;           /* 12px = 下限ちょうど */
  white-space: nowrap;          /* ★★「全 44 件」を 1 文字ずつ折り返さない（★2026-08-16 に踏んだ） */
}
.nb-tbl__count .ies-num { font-weight: 700; color: var(--ies-text, #1c1c1c); }
/* ★検索窓は **縮む側**（8〜14rem）。★実測（幅 1280・勤怠確認）= 固定 14rem だと 1 行目が 2 段に折れた。 */
.nb-tbl__search {
  position: relative;
  display: inline-flex;
  flex: 1 1 10rem;
  min-width: 8rem;
  max-width: 14rem;
}
.nb-tbl__search-icon {
  position: absolute;
  left: var(--ies-sp-2, 8px);
  top: 50%;
  transform: translateY(-50%);
  color: var(--ies-text-mute, #636d7e);
  pointer-events: none;
}
.nb-tbl__search .ies-input { padding-left: var(--ies-sp-6, 32px); width: 100%; }
/* ★★期間の送りは **この器が持たない**。★正本は `parts/month-nav.php`（★月・日・週を扱える）。
   ★置くときは `nb_tbl_slot_open()` … `nb_tbl_slot_close()` の中で `nb_month_nav()` を呼ぶ。
   ★★**同じ役に部品を 2 つ作らない**（★`settings-shell` で実際に踏んだ型 ＝ 文法書 §7-3）。 */
/* ★★選んでいるあいだ、2 行目はこの顔になる。★★**行そのものは動かない**（★高さも位置も同じ）。 */
.nb-tbl__select {
  flex: 1 1 auto;
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--ies-sp-2, 8px) var(--ies-sp-3, 12px);
  min-height: var(--ies-tap-m, 32px);
  padding: 0 var(--ies-sp-2, 8px) 0 var(--ies-sp-3, 12px);
  border-radius: var(--ies-radius-sm, 8px);
  background: var(--ies-jade-soft, #e6f5ee);
  color: var(--ies-jade-dark, #00794e);
  font-size: 0.75rem;
  font-weight: 700;
}
.nb-tbl__select .ies-num { color: inherit; }
.nb-tbl__select-end { margin-left: auto; }

/* ★★表を包む面。★★**枠・角丸・影は「面」の決まり**（★12px = K-1249）。
   ★★★**`overflow` を書かない。**★書いた瞬間、この要素が縦のスクロールの器になり、
     ★★**中の見出しがページに貼りつけなくなる**（★上の撤回①・②）。
   ★→ 角の丸めは、下の「角の始末」の 4 行で行う。 */
.nb-tbl__frame {
  position: relative;
  min-width: 0;
  border: 1px solid var(--ies-border, #e3e3e3);
  border-radius: var(--ies-radius-md, 12px);
  background: var(--ies-surface, #fff);
  box-shadow: var(--ies-shadow-sm, 0 1px 2px rgba(0,0,0,.04));
}

/* ─── 表そのもの ───────────────────────────────────────────────
   ★`border-collapse: separate` にする理由 = ★★**貼りつく見出しで collapse の罫線が消える**
     （★罫線は境界の持ちものになり、sticky で置き去りになる）。★→ 罫線はセルの下辺として描く。 */
.nb-tbl table {
  width: 100%;
  border-collapse: separate;
  border-spacing: 0;
  font-size: 0.875rem;
  line-height: 1.4;
  color: var(--ies-text, #1c1c1c);
  /* ★★列幅は **中身ではなく指定**で決める（★`fixed`）。
     ★★**これが「横に伸びない」の本体である** ——★長い住所が入っても、列は 1px も広がらない。 */
  table-layout: fixed;
  /* ★★★2026-09-06 夜: **潰れる床（`--nb-tbl-min`）。★器が列の宣言から自動で計算して置く。**
     ★★**相澤さんのご指示**（逐語）=「**幅が狭くなるにつれてメモや住所、メールなどが狭くなって
       できるだけ幅を可変で調整して さすがに欄がつぶれそうというところで横スクロールにしてください**」。
     ★★**この 1 行が「さすがに」の位置を決める。**★これより狭くなると表は縮まず、下の `is-xscroll` が出る。
     ★値の作り方 = ★**幅を書いた列の合計 ＋（幅を書かない列の数 × 4.5rem）**（`parts/table-shell.php`）。 */
  min-width: var(--nb-tbl-min, 0);
}

/* ★★★2026-09-06 夜: **横スクロールは「要るときだけ」出す（★台本が測って印を置く）。**
 *
 * ★★**なぜ常時 `overflow-x: auto` にしないか** = ★CSS では **片方の軸だけ**をスクロールにできない。
 *   ★`overflow-x: auto` と書いた瞬間、★この面は **縦のスクロールの器**にもなり、
 *   ★★**見出しがページに貼りつけなくなる**（★相澤さんが「インラインフレームのようで違和感」と
 *     　却下された形が、★横スクロールの副作用として戻ってくる）。
 *
 * ★★**だから台本（`assets/js/table-shell.js`）が実際にはみ出したときだけ印を置く。**
 *   ★★**＝ 広い画面では貼りつく見出しが生き、★狭い画面でだけ横スクロールになる。**
 *   ★はみ出していないのに印が付くことはない（★測ってから付ける）。
 *
 * ★★**この形で失うもの（★正直に書く）** = ★★**横スクロールが出ている間は、見出しが貼りつかない。**
 *   ★これは CSS の制約であって、選べる余地が無い。
 * ★★2026-10-03 訂正（W-263）: 上の「失うもの」は **本物の見出しについてだけ** 残る（★CSS の制約は変わらない）。
 *   ★横に流れている間は、台本が見出しと合計の **写し** を窓の帯の下と窓の下端に貼りつける（`table-shell.js` の ⑩・下の `.nb-tbl__float`）。 */
.nb-tbl__frame.is-xscroll { overflow-x: auto; }

/* ═══════════════════════════════════════════════════════════════════════════
 * ★★★2026-09-08: **横スクロールが出た瞬間、見出しが 1 行目の上に居座っていた（★不具合）。**
 *
 * ★★**相澤さんの実機報告（逐語）** =
 *   「問い合わせ管理の見出し行がウィンドウ幅によっては崩れてしまいます
 *     ただしスクショのようにブレークポイントによる崩れではない様子なので心配です」
 *
 * ★★**上の注記は「貼りつかなくなる」とだけ書いていたが、★実際はそれで済んでいなかった。**
 *   ★`overflow-x: auto` が付いた面は **スクロールの器**になる ＝ 見出しの貼りつき先が
 *     ★**ページ → この面**へ移る。★そこへ `top: 45px`（★帯のぶんの逃げ）がそのまま残っていたので、
 *     ★★**見出しが面の上端から 45px 下、つまり 1 行目の真上へ押し出されていた。**
 *
 * ★★**実測**（★焼いた写し `after-e1/b2-leads.html` を幅ごとに描いて測った）:
 *   | 幅 | はみ出し | 横スクロール | 見出しの Y | 1 行目の Y | 重なり |
 *   |---|---|---|---|---|---|
 *   | 1479px | 0 | 切 | 328 | 360 | なし |
 *   | 1478px | 1 | 切 | 328 | 360 | なし |
 *   | 1476px | 3 | **入** | **373** | 360 | ★★**重なる** |
 *   ★★**＝ 境目は「幅の段（ブレークポイント）」ではなく「中身が入り切るか」**。
 *     ★だから データや、歯車で出している列によって境目が動く（★相澤さんが不気味に感じられた所以）。
 *
 * ★★**直し = 逃げを 0 に戻すだけ。**★貼りつく相手が面になった以上、帯のぶんの逃げは意味を持たない
 *   （★帯はページの上に在り、この面の中には無い）。★見出しは表の頭の、あるべき位置に座る。
 * ★★**貼りつかないこと自体は上の注記のとおり「失うもの」として受け入れている**（★CSS の制約）。
 *   ★★**この便で直したのは「押し出されて重なる」ほう**であって、★貼りつきを取り戻したのではない。
 *
 * ★★**いつから在ったか** = `6dd53217`（★2026-09-06「表の列を固定と可変に分けた」）から。
 *   ★★**表の器を使う画面すべて**が同じ条件で崩れていた（★問い合わせ管理だけではない）。
 * ═══════════════════════════════════════════════════════════════════════════ */
.nb-tbl__frame.is-xscroll thead th { top: 0; }

/* ═══════════════════════════════════════════════════════════════════════════
 * ★★★2026-10-03（W-263）: **横に流れている間、見出しと合計は「写し」が窓に貼りつく。**
 *   ★上の 2 つの注記の「失うもの」（★横スクロールの間は本物の見出しが貼りつかない）を、台本の写しで取り戻した（`table-shell.js` の ⑩）。
 *   ★写し = 印（`is-xscroll`）が付いている間だけ、台本が `.nb-tbl`（面の親）の最後の子に組む `div`（`aria-hidden`）。
 *     ★頭は帯の下（`top` = 帯の高さ・狭い窓は帯の実寸 = W-269）、合計は窓の下端。★横の位置と幅と送りは台本が面に合わせる。
 *   ★z-index 3 = 表の見出し（2）より上・タブの帯（5・`pages/tab-shell.css`）と帯の頭（40）より下
 *     ＝ タブの帯を持つ画面では写しも帯の下に隠れる（★本物の見出しも今そう）。
 *   ★写しの中のセルは貼りつかない（`position: static`）。★(0,2,1) が器の `thead` / `tfoot` のセルの貼りつき（0,1,2）に勝つ。
 *   ★本物の見出し・合計は DOM から動かさない（★読み上げ・押しものは本物のまま）。★合わないときは台本が写しを出さない（★今の姿に倒れる）。
 *   ★値はすべて既存のトークン（★面・影）。★新しい色は作っていない。★紙では出さない（下の印刷の節）。
 * ═══════════════════════════════════════════════════════════════════════════ */
.nb-tbl__float {
  position: fixed;
  z-index: 3;
  overflow: hidden;
  background: var(--ies-surface, #fff);
  box-shadow: var(--ies-shadow-sm, 0 1px 2px rgba(0,0,0,.04));
}
.nb-tbl__float--head { top: var(--nb-stick-top, var(--ies-header-h, 45px)); }   /* ★2026-10-17: 本物の見出しと同じ変数（上の注記） */
.nb-tbl__float--foot { bottom: 0; }
.nb-tbl .nb-tbl__float :is(th, td) { position: static; }

.nb-tbl th,
.nb-tbl td {
  padding: 0 var(--ies-sp-3, 12px);
  text-align: left;
  vertical-align: middle;
  border-bottom: 1px solid var(--ies-border, #e3e3e3);
  background: var(--ies-surface, #fff);
  /* ★★既定で **詰める**（★はみ出したら「…」）。★★**行を膨らませない・横へ伸ばさない。** */
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* ★両端だけ 16px ＝ 押しもの（`.ies-btn`）の内側の余白と同じ値。★面の縁からの距離が画面じゅうで揃う。 */
.nb-tbl th:first-child, .nb-tbl td:first-child { padding-left: var(--ies-sp-4, 16px); }
.nb-tbl th:last-child,  .nb-tbl td:last-child  { padding-right: var(--ies-sp-4, 16px); }

/* ★★★見出しは **ページ** に貼りつく（★帯の下）。★★入れ子のスクロールを作らない。
   ★`--ies-header-h` = 45px（★実測。★`tokens.css` が持つ）。
   ★訂正（2026-10-03）: 上の「= 45px」は旧記述。いまは 広い窓 45px・767px 以下は帯の実寸（W-269・tokens.css の @media と parts/header-shared.php の台本が書く）。
     ★横に流れている間の写し（W-263・上の `.nb-tbl__float--head`）の `top` もこの変数を読む。 */
/* ★2026-10-17（経営報告書・設計書 §4-7）: 貼りつく位置は `--nb-stick-top`（★既定 = いまと同じ帯の高さ）。
     ★タブの器（`tab-shell.css`）だけが「帯 ＋ タブの帯」に置き直す ＝ 見出しがタブの帯の下に潜らない（★いままで潜っていた）。他の画面は 1px も変わらない。 */
.nb-tbl thead th {
  position: sticky;
  top: var(--nb-stick-top, var(--ies-header-h, 45px));
  z-index: 2;
  height: var(--ies-tap-m, 32px);
  background: var(--ies-surface-alt, #f8f8f8);
  color: var(--ies-text-sub, #5c5c5c);     /* ★副地の上で 6.08:1（★K-1228 と同じ理由） */
  font-size: 0.75rem;
  font-weight: 700;
}
/* ★★2026-10-17（経営報告書・設計書 §4-6）: **報告の見出し**（`nb_tbl_open( [ 'report' => true ] )`）。
   ★数を読み比べる表（予実・推移など）では、列の見出しが説明する数（14px・濃い字）より小さく薄いと、どの列か読めない（★いまの 12px・灰が画面で最小の字だった）。
   ★見出しを 14px・濃い字（#F8F8F8 の上で約 16:1）に、下の線を行の区切りの線（`--ies-row-rule`）にして帯を白と分ける。★既定の表は 1px も変わらない。 */
.nb-tbl--report thead th { font-size: 0.875rem; color: var(--ies-text, #1c1c1c); border-bottom-color: var(--ies-row-rule); }
/* ★★行の高さ = **標準 L 44**（★行の中の操作 M 32 ＋ 上下 6px）。 */
.nb-tbl tbody td { height: var(--ies-tap-l, 44px); }
.nb-tbl tbody tr:last-child td { border-bottom: 0; }
/* ★★密 = M 32（★文字 14px × 行の高さ 1.4 ＝ 19.6 に上下 6px）。★★文字は小さくしない。 */
.nb-tbl--dense tbody td { height: var(--ies-tap-m, 32px); }
.nb-tbl--dense th, .nb-tbl--dense td { padding-left: var(--ies-sp-2, 8px); padding-right: var(--ies-sp-2, 8px); }
.nb-tbl--dense th:first-child, .nb-tbl--dense td:first-child { padding-left: var(--ies-sp-3, 12px); }
.nb-tbl--dense th:last-child,  .nb-tbl--dense td:last-child  { padding-right: var(--ies-sp-3, 12px); }
/* ═══════════════════════════════════════════════════════════════════════════
 * ★★**行のまとまりの帯**（★`nb_tbl_band()` が出す `<tr class="nb-tbl__band">`・2026-09-20・K-1796）
 *
 * ★★**相澤さんの逐語** =「今使っている試算表はエクセルなんだけど **学年ごとに生徒を並べて** ／
 *   **学年が切り替わるところで行を１行開けて** 見えやすくしたりしています」
 *   ＝ ★★**空きで分ける**（★ゲシュタルトの近接）。★色の面では分けない。
 *
 * ★★**どの数字が何を決めたか**:
 *   ・★**上の空き 12px**（`--ies-sp-3`）= ★まとまり *どうし* の距離。★まとまりの *中* の距離は 0（★罫線 1px だけ）
 *     ＝ ★12 > 0 で **近接が成立する**。★`<tr>` に margin は効かないので、★セルの `padding-top` で作る。
 *   ・★**押しものの高さ 32px**（`--ies-tap-m`・★S24 / M32 / L44 の 3 段・K-1185）。★12 ＋ 32 = **44px**
 *     ＝ ★行の高さ（L 44）と同じ ＝ **表の縦のリズムを崩さない**。
 *   ・★**上の罫線 = `--ies-border-strong`**（★白地で **3.36:1**・トークンの実測）。★行と行の間は `--ies-border`
 *     （★同 1.3:1 前後）＝ ★★**2 段の強さで「行の区切り」と「まとまりの区切り」を見分ける**。
 *     ★★線を太くしていない（★`§5` の「区切りは 1px の罫線」を守る）。
 *   ・★**字 14px / 700**。★列の名前（`thead` = 12px / 700）より **1 段上** ＝ 視覚階層は「まとまり ＞ 列の名前」。
 *   ・★**押しものは表の全幅**（★**Fitts** = 的が大きいほど速く当たる）。★撫でたときは **表の行とまったく同じ**
 *     主色 10%（★`hover.md` の「面を持つが枠を足すと位置が動くもの」・★**類同** = 行と同じ反応にする）。
 *
 * ★★**地は白のまま**（★副地 `--ies-surface-alt` は白に 1.06 ＝ 見える灰ではない・K-1780）。
 * ★★**畳んだ行は `hidden`**（★台本が付ける）。★逃げ道は `[hidden]{display:none!important}` の 1 行だけ（K-1530）。
 * ★★**押せない姿で色を変えていない** ——★この帯は枠も面も持たない ＝ **そもそも押しものに見えない**ので、
 *   ★字を薄くする必要が無い（★`opacity` も掛けない）。★撫でたときの面だけが「押せる」を名乗る。
 *   ★台本が届いていない間は当たり判定を切る（★下の `html:not(.nb-js)`）＝ 撫でても面が出ない。
 * ═══════════════════════════════════════════════════════════════════════════ */
/* ★★★詳細度に注意（★2026-09-20 に踏んだ）:
 *   ★器の既定 `.nb-tbl th:first-child` / `:last-child`（左右 16px・3853-3854 行）は **(0,2,1)**。
 *   ★`.nb-tbl__band > th` は **(0,1,1)** で **負ける** ＝ 左右の 0 が効かず、
 *     ★★**帯の字が生徒の名前より 16px 右へずれ、押しものも表の幅より 32px 狭くなる**（＝ Fitts の注記が嘘になる）。
 *   ★★見つけたのは別の頭 2 体（独立に同じ指摘）。★親は `.nb-tbl__band-in` の **箱の左端**を測っていて
 *     ★★**字そのものを測っていなかった** ＝ 「差 0px」と報告したのは誤り。
 *   ★★`.nb-tbl` を 1 つ足して (0,2,1) にし、★既存より **後に書く**ことで勝たせる。 */
.nb-tbl .nb-tbl__band > th {
  padding: var(--ies-sp-3, 12px) 0 0;
  background: var(--ies-surface, #fff);
  border-top: 1px solid var(--ies-border-strong, #8c8c8c);
  border-bottom: 1px solid var(--ies-border, #e3e3e3);
  font-weight: 400;              /* ★`<th>` の既定の太字は継がない（★中の字が自分で持つ） */
  overflow: visible;             /* ★★器の既定（隠す）を継がない ＝ 貼りつく中身の基準を奪わない（本棚 [773]・下の注記） */
}
/* ★★★2026-09-21（本棚 [773]）: 器の既定 `.nb-tbl th { overflow: hidden }`（★「…」で詰めるため）を帯のセルが継ぐと、
 *   ★セル自身がスクロールの器になり、★貼りつく中身（`.nb-tbl__band-in`）の基準が **横に流れる器ではなく、動かないセル**になる
 *   ＝ ★★横に流すと帯の字が表と一緒に流れていた（★2026-09-20 の導入の日から・焼いた実画面で 200px 流して 515 → 315）。
 *   ★確かめ = セルだけ隠すのをやめると貼りつき（515 → 515）、★間の押しもの（button）を隠すとまた流れる（幅 1280 ／ 390 とも）。
 *   ★★帯の中身は見えている幅で折れる（下の `.nb-tbl__band-in`）ので、隠さなくてもセルの外へはみ出さない。
 *   ★門 = `tools/nb-test-table-shell.php` の BC-08（★押しもの側が隠す形も赤にする）。 */
/* ★表のいちばん上の帯は、空きも罫線も要らない（★すぐ上が貼りつく見出し ＝ もう区切れている）。 */
.nb-tbl__band:first-child > th { padding-top: 0; border-top: 0; }

.nb-tbl__band-btn {
  display: block;
  width: 100%;                   /* ★Fitts ＝ 行ぜんたいが的 */
  min-height: var(--ies-tap-m, 32px);   /* ★2026-09-21: 固定の高さをやめた ＝ 中身が折れたら伸びる（★下の `.nb-tbl__band-in`） */
  margin: 0;
  padding: 0;
  border: 0;
  background: transparent;
  font: inherit;
  color: inherit;
  text-align: left;
  cursor: pointer;
}
/* ★★★台本が届いていない間は押せない（★押しても何も起きないボタンを作らない・K-1605）。
 *   ★★**`disabled` は使わない**（★2026-09-20 に一度使って、その日のうちに外した）——
 *     ★この画面のタブは **頁を読み直さずに表の中身だけを差し替える**ので、
 *     ★差し替えで出た帯の `disabled` を外す機会が無く、★★**通常の手順では永久に押せなかった。**
 *   ★`nb-js` は `documentElement` に付く ＝ ★**本文をいくら差し替えても消えない。**
 *   ★この形が見ないもの: ★台本が止まった環境で **Tab ＋ Enter** で押されること（★当たり判定は切るが、焦点は止まる）。 */
html:not(.nb-js) .nb-tbl__band-btn { pointer-events: none; }
.nb-tbl__band-btn:hover { background: color-mix(in srgb, var(--ies-jade, #00a86b) 10%, transparent); }
.nb-tbl__band-btn:focus-visible { outline: 2px solid var(--ies-jade-dark, #00794e); outline-offset: -2px; }

/* ★★中身は **左端に貼りつく** ——★横に流す表（`is-xscroll`）で、★帯の字だけが左へ消えないように。 */
/* ★★2026-09-21（本棚 [767]・K-1817）: **見えている幅で折る**（★小計を足すと字が長くなる）。
 *   ★貼りついた中身は横に流しても一緒に動く ＝ ★見えている幅より長いと **後ろが永久に見えない**。
 *   ★見えている幅は台本が器に渡す（`--nb-tbl-view` ＝ `paintXScroll()`・★差し替えた表でも `resize` の合図で渡る）。
 *   ★台本が止まっていれば既定の `none` ＝ 旧と同じ（★折れないだけで、1 行ならいままでどおり）。
 *   ★行と行の間は 0（★折れた 2 行目は同じ帯の続き ＝ 近接）。★高さは固定をやめて `min-height`（★1 行なら旧と同じ 32px）。 */
.nb-tbl__band-in {
  position: sticky;
  left: 0;
  display: inline-flex;
  flex-wrap: wrap;
  max-width: var(--nb-tbl-view, none);
  align-items: center;
  gap: 0 var(--ies-sp-2, 8px);
  min-height: var(--ies-tap-m, 32px);
  padding: 0 var(--ies-sp-4, 16px);
}
.nb-tbl__band-in svg { flex-shrink: 0; color: var(--ies-text-sub, #5c5c5c); }
/* ★閉じているときは ＞（★木の枝と同じ向き。★開いている ∨ ＝「下に中身が続く」）。 */
.nb-tbl__band.is-folded .nb-tbl__band-in svg { transform: rotate(-90deg); }
.nb-tbl__band-label { font-size: 0.875rem; font-weight: 700; color: var(--ies-text, #1c1c1c); }
.nb-tbl__band-note  { font-size: 0.75rem;  font-weight: 400; color: var(--ies-text-sub, #5c5c5c); }
/* ★★小計（`stats`・2026-09-21・本棚 [767]・K-1817）—— まとまりごとの提案・申込のコマ数と金額。
 *   ★**近接**: 組の中は 4px（`--ies-sp-1`）／ 組と組は 16px（`--ies-sp-4`）＝ 4 倍の差で「どれとどれが 1 組か」が読める。
 *     ★人数（note）と最初の組の間も 16px（★箱の左の 8px ＋ 中身の間の 8px）＝ 人数は名前の側、小計は別の組。
 *   ★**階層**: 字の大きさは添え字と同じ 12px のまま、★名前は `--ies-text-mute`（白地 5.2:1）・値は `--ies-text`（同 17:1）
 *     ＝ 色の濃さで「名前 ＜ 値」（★小さい字の階層は大きさではなく色で作る・デザインの正本 §6）。
 *   ★数字は幅をそろえる（`tabular-nums`・★要約の帯と同じ作法 ＝ 単位の和文が混ざるので等幅の書体にはしない）。
 *   ★1 組は途中で折らない（★「40コマ」と「¥400,000」が別の行に割れない）＝ 入りきらなければ **組ごと**次の行へ。 */
.nb-tbl__band-stats { display: inline-flex; flex-wrap: wrap; align-items: baseline; gap: 0 var(--ies-sp-4, 16px); margin-left: var(--ies-sp-2, 8px); }
.nb-tbl__band-stat { display: inline-flex; align-items: baseline; gap: var(--ies-sp-1, 4px); white-space: nowrap; }
.nb-tbl__band-stat-label { font-size: 0.75rem; font-weight: 400; color: var(--ies-text-mute, #636d7e); }
.nb-tbl__band-stat-value { font-size: 0.75rem; font-weight: 400; color: var(--ies-text, #1c1c1c); font-variant-numeric: tabular-nums; }
.nb-tbl--dense .nb-tbl__band > th { padding-top: var(--ies-sp-2, 8px); }

/* ★合計の行は **ページの下端**に貼りつく。★★「合計」は数の話なので太字（★色は足さない）。 */
.nb-tbl tfoot td {
  position: sticky;
  bottom: 0;
  z-index: 2;
  height: var(--ies-tap-l, 44px);
  background: var(--ies-surface-alt, #f8f8f8);
  font-weight: 700;
  border-top: 1px solid var(--ies-border, #e3e3e3);
  border-bottom: 0;
}
/* ★2026-10-18（W-564 Task 1）: 合計の行の 1 つ目のセルが行の見出し（`row_head` → `<th scope="row">`）のとき、上の `td` と同じ貼りつき・地・太字・線（★値は上と同じ ＝ 変えるときは両方）。渡さない表には出ない（R-06）。 */
.nb-tbl tfoot th:where([scope="row"]) {
  position: sticky;
  bottom: 0;
  z-index: 2;
  height: var(--ies-tap-l, 44px);
  background: var(--ies-surface-alt);
  font-weight: 700;
  border-top: 1px solid var(--ies-border);
  border-bottom: 0;
}

/* ★角の始末（★`overflow:hidden` を使えないので、角丸を **セルの側**で作る）。 */
.nb-tbl thead tr:first-child th:first-child { border-top-left-radius: var(--ies-radius-md, 12px); }
.nb-tbl thead tr:first-child th:last-child  { border-top-right-radius: var(--ies-radius-md, 12px); }
.nb-tbl tbody tr:last-child td:first-child,
.nb-tbl tfoot tr:last-child td:first-child  { border-bottom-left-radius: var(--ies-radius-md, 12px); }
.nb-tbl tbody tr:last-child td:last-child,
.nb-tbl tfoot tr:last-child td:last-child   { border-bottom-right-radius: var(--ies-radius-md, 12px); }

/* ─── 列の型（★画面は「型」だけを名乗る。★幅も寄せも書けない） ─────────── */
/* ★数 = 等幅・右寄せ（★桁を縦に揃えて読み比べる）。 */
.nb-tbl .is-num  { font-family: var(--ies-font-mono); font-variant-numeric: tabular-nums; text-align: right; }
/* ★印 = 中央（★○×・日付の札など「在る／無い」を縦に追う列）。 */
.nb-tbl .is-mark { text-align: center; }
/* ★選ぶ列（★48px）。 */
.nb-tbl .is-check { width: var(--ies-sp-7, 48px); padding-right: 0; }
.nb-tbl .is-check .ies-check { min-height: 0; }
/* ★行の中の操作（★右端）。 */
.nb-tbl .is-act  { text-align: right; }
/* ★★伸ばしてよい列（★`table-layout: fixed` の中で、余った幅をここが受ける）。
   ★★**1 つの表に 1〜2 本だけ。**★全部に付けると、また横へ伸びはじめる。 */
.nb-tbl .is-grow { width: auto; }
/* ★★2026-10-14（W-538）: まとめの列（`nb_tbl_frame_open()` の `cols` の `edge`・前期／後期／年間のように他の列を束ねた列）。
 *   ★面を 1 段沈めて「束ねた数」と分かるようにする（見出しの帯と同じ `--ies-surface-alt`・新しい色は作らない）。
 *   ★`col` の面（1 行目）は、セルが自分の面（上の `.nb-tbl td` の `--ies-surface`）を持つので隠れる ＝ 実際に塗るのは 3 行目の `td`。
 *   ★行の撫で・選択・沈め（`.nb-tbl tbody tr:hover td` など）は (0,2,3) で `td.nb-tbl__td--edge`（0,2,1）に勝つ ＝ 行の状態が先に見える。 */
.nb-tbl col.nb-tbl__col--edge { background: var(--ies-surface-alt, #f8f8f8); }
.nb-tbl th.nb-tbl__th--edge { font-weight: 700; }
.nb-tbl td.nb-tbl__td--edge { background: var(--ies-surface-alt, #f8f8f8); }
/* ═══════════════════════════════════════════════════════════════════════════
 * ★★★2026-10-18（W-564 Task 1・経営報告書の 12 か月の表）: **表の器に足した口の見た目**（`parts/table-shell.php` の `sep` ・ `sub` ・ `calc` ・ `joined`）
 *
 * ★どれも「渡した表の、渡した列・行」だけに当たる印（`nb-tbl__th--sep` ・ `nb-tbl__th-sub` ・ `is-calc` ・ `is-joined`）。
 *   ★渡さない表の HTML にこの class は 1 つも出ない ＝ 既存の表は 1 宣言も変わらない（R-06）。★値はすべて既存のトークン（★新しい色は作っていない・K-1856 ②）。
 * ★使い手 = 経営報告書の 12 か月の表（`nb_kr_sheet()`・W-564）と予実の表（W-583）。
 * ═══════════════════════════════════════════════════════════════════════════ */
/* ★列の区切りの線（`sep`）= 右に 1px。★行の下の線と同じ色（`--ies-border`）＝ 列 ＜ 行の順位は崩さない（`--ies-row-rule` の注記）。 */
.nb-tbl th.nb-tbl__th--sep,
.nb-tbl td.nb-tbl__td--sep { border-right: 1px solid var(--ies-border); }
/* ★見出しの字の下の添え書き（`sub`）= 12px（下限）・`--ies-text-mute`（副地の上で 4.9:1）・行を改める。★見出しの太字と色は継がない。長いときは「…」で詰める（見出しと同じ作法）。 */
.nb-tbl__th-sub {
  display: block;
  overflow: hidden;
  text-overflow: ellipsis;
  font-size: 0.75rem;
  font-weight: 400;
  color: var(--ies-text-mute);
}
/* ★計算の行（`calc` → `is-calc`）= 地を 1 段沈め（合計の行・まとめの列と同じ `--ies-surface-alt`）・字は太字（★強弱は色でなく形・K-1230）。
 *   ★行の状態（撫でる・選ぶ）の規則より前に置く ＝ 同じ詳細度 (0,2,3) で後の状態が勝つ（撫でた計算の行も合図が出る）。 */
.nb-tbl tbody tr.is-calc > :is(th, td) { background: var(--ies-surface-alt); font-weight: 700; }
/* ★続きの行（`joined` → `is-joined`）= 次の行が同じ項目の続き。★続きの行のセルの下はいまの線（`--ies-border`）のまま・1 列目（項目名）の下の線は消す。
 *   ★項目の最後の行（続きの行のすぐ後の、続きでない行）の下だけを行の区切りの線（`--ies-row-rule` ＝ いまの線より濃い）にする ＝ 項目の境が濃く、同じ項目の中が薄い。
 *   ★項目名を束の 1 行目にだけ出す表（予実）で、同じ項目の行どうしを 1 塊に見せる（rowspan は使わない ＝ 貼りつく列の数え方が行ごとに変わらない）。
 *   ★★2026-10-18 直した（親・担当 A1 の指摘）: 初めの版は続きの行の下を `--ies-row-rule` にしていた ＝ `--ies-row-rule`（白地で約 1.82:1）は `--ies-border`（約 1.28:1）より濃く、
 *     同じ項目の中のほうが濃く見える逆向きだった（W-583 の設計書 §4 の 3「同じ項目は細い線・項目の境はいまの線」の意図 ＝ 中が薄く境が濃い、を新しい色を作らずに守る形へ）。
 *   ★色だけを替える（幅は替えない）＝ 器の「最後の行は線なし」はそのまま効く。 */
.nb-tbl tbody tr.is-joined > :first-child { border-bottom: 0; }
.nb-tbl tbody tr.is-joined + tr:not(.is-joined) > :is(th, td) { border-bottom-color: var(--ies-row-rule); }

/* ─── ★★★詰めた値を「押すと全部見える」（★相澤さんの工夫を器へ） ─────────
   ★逐語 =「★**住所とかはほぼ使いませんが重要な情報なのでクリックしたら全部が見える**とか
     そういう工夫をいくつかの項目でやっています」。
   ★★**これが横スクロールの代わりである。**★列は 1px も広がらず、押した行だけが縦に伸びる。
   ★★**押せる印は「…」ではなく、詰まっているセルの右端の小さな取っ手**（★S 24px）。 */
.nb-tbl__peek {
  display: inline-flex;
  align-items: center;
  gap: var(--ies-sp-1, 4px);
  max-width: 100%;
  min-height: var(--ies-tap-s, 24px);
  padding: 0;
  border: 0;
  background: none;
  color: inherit;
  font: inherit;
  text-align: left;
  cursor: pointer;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.nb-tbl__peek:hover { text-decoration: underline; }   /* ★面を持たない押しもの（`hover.md` ③-4） */
.nb-tbl__peek:focus-visible { outline: 2px solid var(--ies-jade-dark, #00794e); outline-offset: 2px; border-radius: var(--ies-radius-xs, 4px); }
/* ★開いたセル ——★★**折り返して全部見せる**（★行が縦に伸びる。★横には 1px も伸びない）。 */
.nb-tbl td.is-open {
  white-space: normal;
  overflow: visible;
  padding-top: var(--ies-sp-2, 8px);
  padding-bottom: var(--ies-sp-2, 8px);
}
.nb-tbl td.is-open .nb-tbl__peek { white-space: normal; overflow: visible; }
/* ★詰まっていることが分かる印（★押せる列にだけ出す）。★開いているあいだは裏返る。 */
.nb-tbl__peek-mark { flex-shrink: 0; color: var(--ies-text-mute, #636d7e); font-size: 0.75rem; }
.nb-tbl td.is-open .nb-tbl__peek-mark { transform: rotate(180deg); }
/* ★★★2026-09-08（K-1605・相澤さんのご指摘）: **列に収まっている文字は、押しものにしない。**
   ★逐語 =「謎の v のトグルが出ます ★**押しても何も出ません**」。
   ★★収まっているかは描かないと分からないので、★台本が測って `is-fit` を付ける（`table-shell.js`）。
   ★★**色と太さは 1 ミリも変えない** ——★変えると「使えない文字」に見える。★変えるのは *押せる合図* だけ。 */
.nb-tbl__peek.is-fit { cursor: default; }
.nb-tbl__peek.is-fit:hover { text-decoration: none; }
.nb-tbl__peek.is-fit .nb-tbl__peek-mark { display: none; }
.nb-tbl__peek[disabled] { color: inherit; opacity: 1; }

/* ─── 行の状態 ─────────────────────────────────────────────────
   ★撫では **面に主色 10%**（★`docs/ui/system/hover.md` ②。★5% は 1.056:1 ＝ 見えない）。
   ★選択は **淡い緑地**（★目次・柱の「選択中」と同じ作法）＋ ★★チェックの印で見分ける。 */
.nb-tbl tbody tr:hover td { background: color-mix(in srgb, var(--ies-jade, #00a86b) 10%, var(--ies-surface, #fff)); }
.nb-tbl tbody tr.is-selected td { background: var(--ies-jade-soft, #e6f5ee); }
.nb-tbl tbody tr.is-selected:hover td { background: color-mix(in srgb, var(--ies-jade, #00a86b) 18%, var(--ies-surface, #fff)); }
/* ★★沈める（★対象外・ボツ・名簿外）。★★**左の縦バーで出さない**（★相澤さん =「AI 臭い左枠線は NG」）。 */
.nb-tbl tbody tr.is-quiet td { background: var(--ies-surface-alt, #f8f8f8); color: var(--ies-text-sub, #5c5c5c); }
.nb-tbl tbody tr.is-quiet:hover td { background: color-mix(in srgb, var(--ies-jade, #00a86b) 10%, var(--ies-surface-alt, #f8f8f8)); }

/* ═══════════════════════════════════════════════════════════════════
 * ★★★行の状態は **2 つの channel** で出す（★2026-09-06 夜・相澤さんのご決定）
 *
 * ★★**なぜ 2 つ要るのか（★1 つに畳めない理由）**:
 *   ★★**面（塗り）= その行が *どうなったか*（★終わった状態）。**★例 = 契約した ／ ボツ ／ 対象外。
 *   ★★**縁（縦線）= その行に *手が要るか*（★これからの用）。**★例 = 打刻なし ／ 未確認。
 *   ★★**この 2 つは同時に起きうる**（★契約したのに打刻が無い）。★1 つの channel では両方を出せない。
 *   ★★＝ 分けているのは飾りではなく、★**同時に成り立つ 2 種類の事実**だからである。
 * ═══════════════════════════════════════════════════════════════════ */

/* ★★①面 = 決まった行（★問い合わせ管理の「契約」）。★★**相澤さんのご決定 =「これはピンクのままでいいです」**。
 *
 * ★★**これは K-1229「意味の色は緑とコーラルの 2 色相だけ」の *唯一の例外* である。★名指しで残す。**
 *   ★★**緑にできない理由** = ★緑は「いま選んでいる行」（`is-selected`）が既に使っている。★同じ表で衝突する。
 *   ★★**コーラルにできない理由** = ★コーラルは「手が要る」側の色。★終わった行に使うと意味が逆になる。
 *   ★★**過去に 1 度、この色の意味を反転させて直している**（★K-649 Phase2。
 *     ★逐語 = 「★契約は danger ではない・ボツは accent ではない。混ぜないこと」）。★★**混ぜない。**
 * ★明暗比 = 文字 #1C1C1C 対 この地で **14.66 : 1**（★計算値）。★沈めた行（#F8F8F8）とは明るさがほぼ同じなので、
 *   ★★**色が見えない人には見分けられない。★だから札（「契約」列の日付）が本体で、面は添えである。** */
.nb-tbl tbody tr.is-settled td { background: var(--ies-settled, #FCE7F3); }
.nb-tbl tbody tr.is-settled:hover td { background: color-mix(in srgb, var(--ies-jade, #00a86b) 10%, var(--ies-settled, #FCE7F3)); }

/* ★★②縁 = 手が要る行（★勤怠確認の「打刻なし」）。★★**面を塗らない**。
 *
 * ★★**なぜ面ではなく縁か**（★勤怠確認の実装が既に出していた理由。★そのまま器へ引き取った）:
 *   ★行を丸ごと塗ると、★★**塗った上に載る文字の明暗比が行ごとに変わる。**★縁なら文字は白地のまま。
 * ★★**色だけに頼らない** ——★同じ意味の**札**を行の中にも出すこと（★「打刻なし」）。
 * ★★**知っておくこと（★実測・本番 5Z99・8/31）**: ★対象 17 名が **全員**「打刻なし」だった日は、
 *   ★★**縦線が全行に出て、表の左端の 1 本の棒になる。**★そのとき縁は何も区別していない。
 *   ★★**これは欠陥ではなく、データがそうだという事実**である。★ただし「例外が常態」なら、
 *   ★★**その表は絞り込みの既定を変えるべき**という合図として読むこと。 */
.nb-tbl tbody tr.is-attention td:first-child { box-shadow: inset 3px 0 0 var(--ies-coral, #ff6b4a); }
/* ★手は要らないが、ふつうの行でもない（★0 コマ・名簿外）。★中立の灰。 */
.nb-tbl tbody tr.is-aside td:first-child { box-shadow: inset 3px 0 0 var(--ies-border-strong, #8c8c8c); }
/* ★表の中の 2 次の文字と絵は `text-sub`。★★`text-mute` は「選んで撫でた面」の上で 4.28:1 と床を割る。 */
.nb-tbl td .ies-caption,
.nb-tbl td .ies-icon-btn { color: var(--ies-text-sub, #5c5c5c); }

/* ═══════════════════════════════════════════════════════════════════════════
 * ★★★2026-10-18（W-564 Task 1）: **行の見出し（`nb_tbl_frame_open( [ 'row_head' => true ] )` → 1 つ目のセルが `<th scope="row">`）の見た目**
 *
 * ★上の `td` の規則（高さ・最後の行の線と角・撫でる／選ぶ／沈める／決まった・縁・表の中の 2 次の字）を、行の見出しにも同じに当てる写し。
 *   ★`:where([scope="row"])` で詳細度を `td` の規則と同じにしてある ＝ 後ろの規則との勝ち負け（例: 計算の行 `is-calc` と撫でる）が `td` と同じ向きになる。
 *   ★`td` の規則は 1 字も書き換えていない（★門が字面で読む）。★値を変えるときは対の `td` の規則も一緒に変える（★2 つ目の正本にしない）。
 *   ★渡さない表には `<th scope="row">` が出ない ＝ この節はどの既存の表にも当たらない（R-06）。
 * ★太さ: `th` の既定は太字 ＝ 行の見出しは `td` の字（400）にそろえる。★太字になるのは計算の行（`is-calc`）と合計の行（`tfoot`）だけ。
 * ═══════════════════════════════════════════════════════════════════════════ */
.nb-tbl tbody th:where([scope="row"]) { height: var(--ies-tap-l, 44px); font-weight: 400; }
.nb-tbl--dense tbody th:where([scope="row"]) { height: var(--ies-tap-m, 32px); }
.nb-tbl tbody tr:last-child th:where([scope="row"]) { border-bottom: 0; }
.nb-tbl tbody tr:last-child th:where([scope="row"]):first-child,
.nb-tbl tfoot tr:last-child th:where([scope="row"]):first-child { border-bottom-left-radius: var(--ies-radius-md, 12px); }
.nb-tbl tbody tr:hover th:where([scope="row"]) { background: color-mix(in srgb, var(--ies-jade) 10%, var(--ies-surface)); }
.nb-tbl tbody tr.is-selected th:where([scope="row"]) { background: var(--ies-jade-soft); }
.nb-tbl tbody tr.is-selected:hover th:where([scope="row"]) { background: color-mix(in srgb, var(--ies-jade) 18%, var(--ies-surface)); }
.nb-tbl tbody tr.is-quiet th:where([scope="row"]) { background: var(--ies-surface-alt); color: var(--ies-text-sub); }
.nb-tbl tbody tr.is-quiet:hover th:where([scope="row"]) { background: color-mix(in srgb, var(--ies-jade) 10%, var(--ies-surface-alt)); }
.nb-tbl tbody tr.is-settled th:where([scope="row"]) { background: var(--ies-settled); }
.nb-tbl tbody tr.is-settled:hover th:where([scope="row"]) { background: color-mix(in srgb, var(--ies-jade) 10%, var(--ies-settled)); }
.nb-tbl tbody tr.is-attention th:where([scope="row"]):first-child { box-shadow: inset 3px 0 0 var(--ies-coral); }
.nb-tbl tbody tr.is-aside th:where([scope="row"]):first-child { box-shadow: inset 3px 0 0 var(--ies-border-strong); }
.nb-tbl th:where([scope="row"]) .ies-caption,
.nb-tbl th:where([scope="row"]) .ies-icon-btn { color: var(--ies-text-sub); }

/* ─── 並べ替え ─────────────────────────────────────────────────
   ★見出しは押しもの。★★**印が付くのは選んだ 1 列だけ**（★類同の破れを 1 か所に絞る）。 */
.nb-tbl__sort {
  display: inline-flex;
  align-items: center;
  gap: var(--ies-sp-1, 4px);
  max-width: 100%;
  min-height: var(--ies-tap-m, 32px);
  padding: 0;
  border: 0;
  background: none;
  color: inherit;
  font: inherit;
  font-weight: 700;
  cursor: pointer;
  overflow: hidden;
}
.nb-tbl__sort svg { width: 1rem; height: 1rem; visibility: hidden; flex-shrink: 0; }
.nb-tbl th[aria-sort] .nb-tbl__sort { color: var(--ies-text, #1c1c1c); }
.nb-tbl th[aria-sort] .nb-tbl__sort svg { visibility: visible; }
.nb-tbl th[aria-sort="descending"] .nb-tbl__sort svg { transform: rotate(180deg); }
.nb-tbl__sort:hover { text-decoration: underline; }
.nb-tbl__sort:focus-visible { outline: 2px solid var(--ies-jade-dark, #00794e); outline-offset: 2px; border-radius: var(--ies-radius-xs, 4px); }
/* ★数の列では、矢印を数字の左に置く（★右端の桁を揃えたまま）。 */
.nb-tbl .is-num .nb-tbl__sort { flex-direction: row-reverse; }

/* ★行の主リンク（★識別子）。★★行の撫では面で言うので、**下線を付けない**（`hover.md` ②）。 */
.nb-tbl__link { color: var(--ies-text, #1c1c1c); font-weight: 700; text-decoration: none; }
.nb-tbl__link:hover { text-decoration: none; color: var(--ies-jade-dark, #00794e); }
.nb-tbl__link:focus-visible { outline: 2px solid var(--ies-jade-dark, #00794e); outline-offset: 2px; border-radius: var(--ies-radius-xs, 4px); }

/* ★★★2026-09-11（担当 TBLROW）: **行ごと押せる行**（`nb_tbl_row( [ 'href' => … ] )` → `tr[data-nb-tbl-href]`）。
   ★相澤さんのご回答 =「３．する　でいいです」。★ふるまい = `assets/js/table-shell.js` の ⑥。
   ★★**撫でたときの合図は 1 つだけ** = 上の「面に主色 10%」（`docs/ui/system/hover.md` ②）。
     ★★ここで足すのは *指の形* だけ。★下線・枠・文字の色は足さない（★1 つの合図に 1 つの意味）。
   ★★**知っておくこと**: ★押せない行も、撫でると同じ面になる（★行を目で追う助けとして前から在る）。
     ★＝ 押せる行と押せない行の違いは、撫でたときの **指の形だけ**。★押せない行の撫でを消すかは未決
     （★問いと推奨 = `docs/integration/TODO-2026-09-11-TBLROW.md`）。 */
.nb-tbl tbody tr[data-nb-tbl-href] { cursor: pointer; }

/* ★明細の行（★1 行の下に開く。★勤怠確認の `<details>` を受ける）。 */
.nb-tbl__detail td {
  height: auto;
  padding-top: var(--ies-sp-2, 8px);
  padding-bottom: var(--ies-sp-2, 8px);
  background: var(--ies-surface-alt, #f8f8f8);
  color: var(--ies-text-sub, #5c5c5c);
  font-size: 0.75rem;
  white-space: normal;
  overflow: visible;
}
.nb-tbl__detail:hover td { background: var(--ies-surface-alt, #f8f8f8); }
.nb-tbl__toggle {
  display: inline-flex;
  align-items: center;
  gap: var(--ies-sp-1, 4px);
  min-height: var(--ies-tap-m, 32px);
  padding: 0 var(--ies-sp-2, 8px);
  border: 0;
  background: none;
  color: var(--ies-jade-dark, #00794e);
  font: inherit;
  font-size: 0.75rem;
  font-weight: 700;
  cursor: pointer;
  border-radius: var(--ies-radius-sm, 8px);
}
.nb-tbl__toggle:hover { text-decoration: underline; }
.nb-tbl__toggle:focus-visible { outline: 2px solid var(--ies-jade-dark, #00794e); outline-offset: 2px; }
.nb-tbl__toggle svg { width: 1rem; height: 1rem; flex-shrink: 0; }
.nb-tbl__toggle[aria-expanded="true"] svg { transform: rotate(180deg); }

/* ★★0 件・読み込み中は **表の中**に出す。★★見出しは残す ＝「何が入る表か」が分かる。 */
.nb-tbl__empty td { height: auto; padding: 0; white-space: normal; overflow: visible; }
.nb-tbl__empty:hover td { background: var(--ies-surface, #fff); }
.nb-tbl__skel {
  display: block;
  height: var(--ies-sp-3, 12px);
  border-radius: var(--ies-radius-xs, 4px);
  background: var(--ies-border, #e3e3e3);
  animation: nb-tbl-pulse 1.2s ease-in-out infinite;
}
@keyframes nb-tbl-pulse { 50% { opacity: .5; } }
@media (prefers-reduced-motion: reduce) { .nb-tbl__skel { animation: none; } }

/* ★★列を隠す（★歯車の「見せる列」）。★★**横スクロールの代わりの 2 本目の手**である。
   ★JS が `.nb-tbl__frame` に印を置き、CSS が畳む。

   ★★★2026-09-06 夜 訂正: **`col` も一緒に隠さないと、この手は 1 mm も効かない。**
   ★★**実測（★親が撃ち直した。★`docs/ui/tools/preview/TBL-colhide-probe.html`・枠 1165px・18 列）**:
   | | 表の幅 | はみ出し | 列の実幅 |
   |---|---|---|---|
   | ①隠す前 | 1514px | 351px | 48,72,52,52,124,128,… |
   | ★②**セルだけ隠す（★旧）** | ★★**1514px（変わらない）** | ★★**351px（変わらない）** | ★★48,72,52,**x,52,124**,… ＝ **1 つずつ手前へずれる** |
   | ★③**`col` も隠す（★いま）** | ★**1165px** | ★**2px** | 49,74,53,x,127,131,… ＝ 余りが比例配分される |
   ★★**②の壊れ方が本当に悪い** ——★氏名が学校の幅（52px）を、電話が氏名の幅（124px）を受け取り、
   　★★**18 列の幅の設計が総崩れになる。**★しかも横スクロールは 1px も減らない。
   ★★**この壊れ方は「幅を宣言した表」でだけ出る**（★宣言しない表では起きない ＝ 陰性対照で確認）。
   ★★**＝ 器を使う表はすべて幅を宣言するので、全部が対象だった。**
   ★見つけたのは私ではなく、★**文脈を持たない別プロセス**（★載せ替えの棚卸し）である。 */
.nb-tbl__frame[data-hide~="c1"]  col:nth-child(1),
.nb-tbl__frame[data-hide~="c2"]  col:nth-child(2),
.nb-tbl__frame[data-hide~="c3"]  col:nth-child(3),
.nb-tbl__frame[data-hide~="c4"]  col:nth-child(4),
.nb-tbl__frame[data-hide~="c5"]  col:nth-child(5),
.nb-tbl__frame[data-hide~="c6"]  col:nth-child(6),
.nb-tbl__frame[data-hide~="c7"]  col:nth-child(7),
.nb-tbl__frame[data-hide~="c8"]  col:nth-child(8),
.nb-tbl__frame[data-hide~="c9"]  col:nth-child(9),
.nb-tbl__frame[data-hide~="c10"] col:nth-child(10),
.nb-tbl__frame[data-hide~="c11"] col:nth-child(11),
.nb-tbl__frame[data-hide~="c12"] col:nth-child(12),
.nb-tbl__frame[data-hide~="c13"] col:nth-child(13),
.nb-tbl__frame[data-hide~="c14"] col:nth-child(14),
.nb-tbl__frame[data-hide~="c15"] col:nth-child(15),
.nb-tbl__frame[data-hide~="c16"] col:nth-child(16),
.nb-tbl__frame[data-hide~="c17"] col:nth-child(17),
.nb-tbl__frame[data-hide~="c18"] col:nth-child(18),
.nb-tbl__frame[data-hide~="c1"]  :is(th, td):nth-child(1),
.nb-tbl__frame[data-hide~="c2"]  :is(th, td):nth-child(2),
.nb-tbl__frame[data-hide~="c3"]  :is(th, td):nth-child(3),
.nb-tbl__frame[data-hide~="c4"]  :is(th, td):nth-child(4),
.nb-tbl__frame[data-hide~="c5"]  :is(th, td):nth-child(5),
.nb-tbl__frame[data-hide~="c6"]  :is(th, td):nth-child(6),
.nb-tbl__frame[data-hide~="c7"]  :is(th, td):nth-child(7),
.nb-tbl__frame[data-hide~="c8"]  :is(th, td):nth-child(8),
.nb-tbl__frame[data-hide~="c9"]  :is(th, td):nth-child(9),
.nb-tbl__frame[data-hide~="c10"] :is(th, td):nth-child(10),
.nb-tbl__frame[data-hide~="c11"] :is(th, td):nth-child(11),
.nb-tbl__frame[data-hide~="c12"] :is(th, td):nth-child(12),
.nb-tbl__frame[data-hide~="c13"] :is(th, td):nth-child(13),
.nb-tbl__frame[data-hide~="c14"] :is(th, td):nth-child(14),
.nb-tbl__frame[data-hide~="c15"] :is(th, td):nth-child(15),
.nb-tbl__frame[data-hide~="c16"] :is(th, td):nth-child(16),
.nb-tbl__frame[data-hide~="c17"] :is(th, td):nth-child(17),
.nb-tbl__frame[data-hide~="c18"] :is(th, td):nth-child(18) { display: none; }

/* ═══════════════════════════════════════════════════════════════════
 * ★★★最後の手段 —— 横スクロール（`.nb-tbl--scroll-x`）
 *
 * ★★**既定では使わない。**★相澤さんの逐語 =「**可能なら横スクロールはないほうがいいです**」。
 * ★★**先に試すこと（順に）**: ①詰めて `.nb-tbl__peek` で開く ②歯車で列を隠す ③密（32px）にする。
 *
 * ★★**この段を選ぶと失うもの（★書かない約束は約束ではない）**:
 *   ★★**見出しが貼りつかなくなる。**★`overflow-x: auto` はその要素を縦のスクロールの器にもするので、
 *     ★見出しの `top: 45px` は **ページではなく、この器の上端**を指すようになる。
 *   ★★＝ ①と②の合図が同時に立たない。★★**だから既定にしない。** */
.nb-tbl--scroll-x .nb-tbl__frame { overflow: hidden; }   /* ★この段でだけ、角丸のために使ってよい */
.nb-tbl--scroll-x .nb-tbl__wrap {
  overflow-x: auto;
  overscroll-behavior-x: contain;   /* ★端まで来ても、後ろのページを動かさない */
  min-width: 0;
}
.nb-tbl--scroll-x .nb-tbl__wrap:focus-visible { outline: 2px solid var(--ies-jade-dark, #00794e); outline-offset: -2px; }
.nb-tbl--scroll-x table { table-layout: auto; }          /* ★横に流すなら、幅は中身が決めてよい */
.nb-tbl--scroll-x thead th { top: 0; }                   /* ★★器の上端（★ページではない・上の注記） */
/* ★端の影 = 「★まだ横に続く」の合図。★★黒の半透明を書かない（★暗い配色で消える・K-1235）。 */
.nb-tbl--scroll-x .nb-tbl__frame::before,
.nb-tbl--scroll-x .nb-tbl__frame::after {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  width: var(--ies-sp-4, 16px);
  pointer-events: none;
  opacity: 0;
  transition: opacity .15s;
  z-index: 4;
}
.nb-tbl--scroll-x .nb-tbl__frame::before {
  left: var(--nb-tbl-pin-w, 0px);
  background: linear-gradient(to right, color-mix(in srgb, var(--ies-text, #1c1c1c) 10%, transparent), transparent);
}
.nb-tbl--scroll-x .nb-tbl__frame::after {
  right: 0;
  background: linear-gradient(to left, color-mix(in srgb, var(--ies-text, #1c1c1c) 10%, transparent), transparent);
}
.nb-tbl--scroll-x .nb-tbl__frame[data-scroll-x="mid"]::before,
.nb-tbl--scroll-x .nb-tbl__frame[data-scroll-x="end"]::before { opacity: 1; }
.nb-tbl--scroll-x .nb-tbl__frame[data-scroll-x="start"]::after,
.nb-tbl--scroll-x .nb-tbl__frame[data-scroll-x="mid"]::after  { opacity: 1; }
@media (prefers-reduced-motion: reduce) {
  .nb-tbl--scroll-x .nb-tbl__frame::before,
  .nb-tbl--scroll-x .nb-tbl__frame::after { transition: none; }
}
/* ★釘付け（★横に流すときだけ意味を持つ）。★★上限は 2 本（★選ぶ列 48px ＋ 識別子）。 */
.nb-tbl--scroll-x .nb-tbl__frame[data-pin] :is(th, td):nth-child(1) { position: sticky; left: 0; z-index: 1; }
.nb-tbl--scroll-x .nb-tbl__frame[data-pin="2"] :is(th, td):nth-child(2) { position: sticky; left: var(--ies-sp-7, 48px); z-index: 1; }
.nb-tbl--scroll-x .nb-tbl__frame[data-pin] thead th:nth-child(1),
.nb-tbl--scroll-x .nb-tbl__frame[data-pin="2"] thead th:nth-child(2) { z-index: 3; }
.nb-tbl--scroll-x .nb-tbl__frame[data-pin="1"] :is(th, td):nth-child(1),
.nb-tbl--scroll-x .nb-tbl__frame[data-pin="2"] :is(th, td):nth-child(2) { border-right: 1px solid var(--ies-border, #e3e3e3); }

/* ═══════════════════════════════════════════════════════════════════════════
 * ★★★2026-10-18（W-564 Task 1・経営報告書の 12 か月の表）: **横に流れている間（`is-xscroll`）も、左の 1〜2 列を貼りつける**
 *
 * ★なぜ要るか: 上の釘付けは「最後の手段」の型（`.nb-tbl--scroll-x`）の中でしか効かない（★呼び手 0）。★ふつうの表は、はみ出したときだけ台本が面へ `is-xscroll` を置いて横に流す（上の注記）。
 *   ★12 か月の表は横に流すと「いま何の項目を見ているか」が左へ消える ＝ 1 列目（項目名）を面に貼りつける。★予実の表は 2 列目（数の種類）まで。
 * ★面に渡る値（`nb_tbl_frame_open()` が列の宣言の幅から出す・px に直せないときは出ない）:
 *   ・`--nb-tbl-pin1-w` … 1 列目の幅 ＝ 2 列目の `left`（pin 2 のとき）
 *   ・`--nb-tbl-pin-w`  … 貼りつく列の幅の和 ＝ 焦点の送りの余白（`scroll-padding-inline-start`）
 * ★焦点の余白: 横に流れる箱は、焦点の欄を「箱の左端」まで送るだけで、貼りついた列の幅を知らない ＝ Shift+Tab で戻ると欄が貼りついた列の下に潜る（WCAG 2.4.11・
 *   経営報告書の手書きの表は 2026-09-12 に同じ手当てをしていた〈支出 6 回・売上 3 回が潜った実測〉）。★その幅を「送るときに空ける余白」として面に渡す。
 * ★z の順: 見出し・合計の 1 列目（2 列目）は 3 ＝ 見出しの他のセル（2）より前に出す（見出しも合計も上下と左右の両方に貼りつくため）。★本体の 1 列目は 1。
 * ★貼りつけの外: 帯の行（`.nb-tbl__band`・中身が自分で左に貼りつく）と、列をまたぐセル（`colspan`・明細・0 件）。
 * ★詳細度は `:where()` で下げてある（★面の印 3 つ = (0,3,0)）＝ 器の既定（`thead th` の z-index 2 など）には勝ち、画面の規則には負けやすい。
 * ★渡さない表（`data-pin` が無い面）には 1 宣言も当たらない（R-06）。
 * ═══════════════════════════════════════════════════════════════════════════ */
.nb-tbl__frame.is-xscroll[data-pin] { scroll-padding-inline-start: var(--nb-tbl-pin-w, 0px); }
.nb-tbl__frame.is-xscroll[data-pin] :where(tr:not(.nb-tbl__band)) > :where(:first-child:not([colspan])) { position: sticky; left: 0; z-index: 1; }
.nb-tbl__frame.is-xscroll[data-pin="2"] :where(tr:not(.nb-tbl__band)) > :where(:nth-child(2):not([colspan])) { position: sticky; left: var(--nb-tbl-pin1-w, auto); z-index: 1; }   /* 控え auto ＝ 面に値が渡らない（列の宣言の幅が px に直せない）ときは貼りつかない（旧は値が無いと宣言ごと無効 ＝ left は auto で同じ動き・2026-10-20 に控えを明記） */
.nb-tbl__frame.is-xscroll[data-pin] :is(thead, tfoot) tr > :first-child,
.nb-tbl__frame.is-xscroll[data-pin="2"] :is(thead, tfoot) tr > :nth-child(2) { z-index: 3; }
/* ★縁の線は貼りつく列の右端に 1 本（pin 1 = 1 列目・pin 2 = 2 列目）。★上の `.nb-tbl--scroll-x` の型と同じ置き方。 */
.nb-tbl__frame.is-xscroll[data-pin="1"] :where(tr:not(.nb-tbl__band)) > :where(:first-child:not([colspan])),
.nb-tbl__frame.is-xscroll[data-pin="2"] :where(tr:not(.nb-tbl__band)) > :where(:nth-child(2):not([colspan])) { border-right: 1px solid var(--ies-border); }
/* ★見出しと合計の写し（`.nb-tbl__float`・`table-shell.js` の ⑩）の中でも同じ列を貼りつける。★写しの箱は面ではなく `.nb-tbl` の子 ＝ 台本が面の `data-pin` と `--nb-tbl-pin1-w` を箱へ写す。
 *   ★写しの箱は `overflow: hidden` で台本が `scrollLeft` を面に合わせる ＝ 箱が貼りつきの基準。★上下には貼りつけない（`top` ・ `bottom` を auto に戻す）。
 *   ★(0,4,1) = 写しの中のセルを static に戻す規則（上の `.nb-tbl .nb-tbl__float :is(th, td)` = (0,2,1)）より強い。 */
.nb-tbl .nb-tbl__float[data-pin] tr > :first-child { position: sticky; left: 0; top: auto; bottom: auto; z-index: 3; }
.nb-tbl .nb-tbl__float[data-pin="2"] tr > :nth-child(2) { position: sticky; left: var(--nb-tbl-pin1-w, auto); top: auto; bottom: auto; z-index: 3; }
.nb-tbl .nb-tbl__float[data-pin="1"] tr > :first-child,
.nb-tbl .nb-tbl__float[data-pin="2"] tr > :nth-child(2) { border-right: 1px solid var(--ies-border); }

/* ─── 紙 ────────────────────────────────────────────────────────
   ★★**印刷プレビューは 1 度も開いていない。** */
@media print {
  .nb-tbl__bar { display: none; }
  .nb-tbl__frame { border: 0; box-shadow: none; overflow: visible; }
  .nb-tbl__frame::before, .nb-tbl__frame::after { display: none; }
  .nb-tbl__wrap { overflow: visible; }
  .nb-tbl thead th, .nb-tbl tfoot td,
  .nb-tbl__frame[data-pin] :is(th, td) { position: static; }
  /* ★2026-10-18（W-564 Task 1）: 横に流れていた面（`is-xscroll`）の貼りつく列も、紙では貼りつけない。★上の規則 (0,2,1) は画面の貼りつき (0,3,0) に負ける ＝ 同じ面の印を足して (0,3,1) にする。 */
  .nb-tbl__frame.is-xscroll[data-pin] :is(th, td) { position: static; }
  .nb-tbl thead { display: table-header-group; }   /* ★頁をまたぐと見出しを繰り返す */
  .nb-tbl tr { break-inside: avoid; }
  .nb-tbl td { white-space: normal; overflow: visible; }   /* ★紙では詰めない（★全部出す） */
  /* ★★2026-09-29（W-026・本棚 [776]・推奨 A）: **画面で横に流していた表（`is-xscroll`）の右が、紙で切れていた。**
   *   ★原因（★規則の詳細度を読んで特定・印刷は開いていない）: 画面の `.nb-tbl__frame.is-xscroll { overflow-x: auto }`（0,2,0）が、上の紙の `.nb-tbl__frame { overflow: visible }`（0,1,0）に勝っていた
   *     ＝ 紙でも枠がスクロールの器のまま ＝ 枠の外へはみ出した分（★[776] の実測 = 器 694px に表 976px ＝ 282px）が紙に出ない。
   *   ★直し = 紙では `is-xscroll` の枠も overflow を解く（★`.nb-tbl` を頭に足して 0,3,0）＋ 表の床（`min-width: var(--nb-tbl-min)`）を外し、列を中身に合わせて紙の幅へ詰める（`table-layout: auto`）。
   *   ★変わる範囲 = 画面で `is-xscroll` が付いていた表だけ（★付いていない表の紙は 1 宣言も変わらない）。
   *   ★測っていないこと: 紙の幅で列が実際にどこまで詰まるか（★見出しの字は折らない ＝ 見出しの幅の合計が紙の幅を超えれば、はみ出した分はブラウザの「幅に合わせて縮小」に任せることになる）。
   *   ★`is-xscroll` は画面で測って付く印 ＝ 広い窓で開いて印を付けずに印刷した表の紙は、この節の対象外（★床が紙の幅を超えるなら同じく縮小任せ）。
   *   ★`.nb-tbl--scroll-x`（最後の手段の型）は同じ負け方をしている（★`.nb-tbl--scroll-x .nb-tbl__frame { overflow: hidden }`）が、使う画面が 0（2026-09-29・呼び出し = 検査 1 本のみ）なので触っていない。 */
  .nb-tbl .nb-tbl__frame.is-xscroll { overflow: visible; }
  .nb-tbl .nb-tbl__frame.is-xscroll table { min-width: 0; table-layout: auto; }
  /* ★2026-10-03（W-263）: 見出しと合計の写しは紙に出さない（★紙は本物の見出しを頁ごとに繰り返す・上の `table-header-group`）。 */
  .nb-tbl__float { display: none !important; }
}

/* ─── 狭い画面 ──────────────────────────────────────────────────
   ★★**構造で畳む。文字は縮めない**（★12px が下限・例外なし）。
   ★★**カード一覧へ切り替えない** ——★詰める ＋ 列を隠す の 1 通りに揃える。 */
@media (max-width: 767px) {
  .nb-tbl__right { margin-left: 0; flex: 1 0 100%; justify-content: space-between; }
  .nb-tbl__search { flex: 1 1 12rem; max-width: none; }
  .nb-tbl__summary { grid-template-columns: repeat(2, 1fr); }
}

/* ═══════════════════════════════════════════════════════════════════════════
 * ★★★2026-09-07（段 C・骨組みの統一）: 旧 `assets/css/layout.css`（A 型の箱・退役）から移した「本文の器の中身」の規則
 *
 * ★★**末尾に置く理由** = layout.css は部品（このファイル）の **後**に積まれていた。★ここに置けば勝ち負けは 1 つも変わらない。
 * ★★これで A 型の箱の CSS は repo に 1 本も残っていない（★`.ies-app` / `.ies-main` / `body.ies-body` = 0 件）。
 * ═══════════════════════════════════════════════════════════════════════════ */
/* 本文の中の h1（★帯の現在地の h1 は `.ies-header` の中に在るので、この規則には当たらない） */
.ies-content h1 {
  font-size: 1.25rem;
  font-weight: 700;
  line-height: 1.3;
  margin: 0 0 var(--ies-sp-5);
  color: var(--ies-text);
  border: none;
  padding: 0;
}
@media (max-width: 767px) {
  /* スマホでは .ies-card の左右の余白を詰めて本文幅を確保する */
  .ies-content .ies-card { padding-left: var(--ies-sp-3); padding-right: var(--ies-sp-3); }
  /* ★★2026-10-20（W-604）: 余白なしの箱（`.ies-card--flush`）は、スマホ幅でも余白を持たない。
   *   ★部品の取り違え = 上の規則（0,2,0）が `.ies-card--flush` の「余白なし」（146 行・0,1,0）に勝ち、スマホ幅では **余白なしの箱にも左右 12px が入っていた**。
   *   ★同じ詳細度（0,2,0）で後ろに置いて勝たせる。
   * ★相澤さんの逐語（2026-10-20）=「スクショ１で左右８ｐｘずつ　スクショ２で左右１６ｐｘずつ　合計左右で２０ｐｘずつpaddingがあるんだけどこんなに必要かどうかを検討してほしいです」
   *   「あとこの部分の左の余白がありすぎると思います」（講師トップの予定の日付の列）。
   * ★効く範囲 = `ies-card--flush` を書いている 36 ファイル（保護者・社員の画面を含む・grep で数えた）の **767px 以下**。箱の中の行が左右 12px ずつ広がり、行の区切り線が箱の端まで届く。パソコン（768px 以上）は変わらない。 */
  .ies-content .ies-card--flush { padding-left: 0; padding-right: 0; }
}

/* ═══════════════════════════════════════════════════════════════════════════
 * ★★★カレンダー形式の器（`.nb-cal`）—— 2026-09-08・K-1589
 *
 * ★★**相澤さんのご指示（逐語・2026-09-08）**:
 *   > 同じレイアウトの画面は共通のテンプレで作られていて
 *   > **HTMLやCSSからjsに至るまで共通のファイルが使われていること**
 *   > 個々に記述するというのは**徹底的に削減する**
 *   > 月も日もマスターもすべて**同じ枠線の色や背景色**などにして整える必要があります
 *
 * ★★**何を持ち、何を持たないか（★ここを混ぜると、また画面へ戻る）**:
 *   ・★**持つ** = 器（外枠・面・角丸）／見出しの帯／罫線／曜日の字／マスの状態（今日・選択・前後の月・休室・×の日・受け口）
 *   ・★**持たない** = 列の数・列の幅・マスの中身（★講師の人数で変わるので画面が決める）
 *
 * ★★**なぜ `.ies-cal`（`pages/schedule.css`）と別なのか**（★2 つ目の器を作った理由を残す）:
 *   ・`.ies-cal` = **予定を並べる月カレンダー**（div ＋ CSS グリッド・社員サイトの予定表とウィジェット）
 *   ・`.nb-cal`  = **数と枠を並べる格子**（`<table>`・座席管理の月/日/マスター・予約管理）
 *   ★★**器の値（枠・面・見出しの地・罫線）は 2 つとも同じトークンを引く。★形だけが違う。**
 *   ★2026-09-08 に `.ies-cal` へ寄せようとして **名前が丸ごと衝突**した（★取り消し済）。★同じ轍を踏まないこと。
 *
 * ★★**値の出どころ（★1 つも新しい色を決めていない）**:
 *   | 役 | 値 | 出どころ・明暗比 |
 *   |---|---|---|
 *   | 外枠・罫線 | `--ies-border` #E3E3E3 | K-1214（★機械で選んだ罫線）／`.nb-tbl__frame` と同値。白地 **1.28:1** |
 *   | 面 | `--ies-surface` #FFFFFF | `.nb-tbl` と同値 |
 *   | 角丸 | `--ies-radius-md` 12px | `.nb-tbl__frame` と同値 |
 *   | ★**見出しの帯** | `--ies-surface-alt` #F8F8F8 | ★★`.nb-tbl thead th` と同値（K-1518）。面との段 **1.06** |
 *   | 日曜の字 | `--ies-danger-ink` #B91C1C | 白地 **6.47:1** |
 *   | 土曜の字 | `--ies-info-ink` #296DC5 | 白地 **5.14:1** |
 *   | 前後の月 | `--ies-bg` #F2F2F2 | ★`.ies-cal__cell.is-other-month` と同値（★元から一致していた） |
 *   | 休室日 | `--ies-coral-soft` #FFE8E1 | ★コーラルは使ってよい 2 色相の 1 つ（K-1229） |
 *   | ×の日 | `--cl-accent-light` #FFF0ED | ★2026-10-21 足した（W-620 ①）。休室日より 1 段淡い同じ色相。土曜の字 **4.63:1** |
 *
 * ★★**直した「設計から外れていた値」**（★座席管理が持っていたもの・★K-278 が捨てた暖色）:
 *   ・見出しの帯 `--cl-bg` #F2F2F2（★**地**＝ページの色）→ `--ies-surface-alt` #F8F8F8（★**副地**）
 *     ★★**地を使うと、白いカードに穴が開いて後ろのページが見えているように読める。**
 *   ・講師の列 `#F4F4EE`（暖色の灰）／ シフト外 `#F0F0EC` ／ 空マスの hover `#E9E9E3` → ★トークンへ
 *   ・今日 `#FFF9E8`（★琥珀の塗り）→ **塗らない**。★琥珀は部品に使わない（K-1229）
 *   ・休室日 `#FFF5F3`（生 hex）→ `--ies-coral-soft`
 *   ・★★**土日の *見出し* の塗り**（土＝緑地・日＝コーラル地）→ **字の色だけ**にした。
 *     ★根拠 = 体系の規約「★週末は**文字色だけ**で表し、セルは塗り分けない」。
 *     ★★**緑は「選択・現在地」の色**なので、土曜の見出しを緑に塗ると *選ばれている* と読める（★偽の合図）。
 *
 * ★★**今日と選択中は「形」で分ける**（K-1230「強弱は色ではなく形で作る」）:
 *   ・今日 …… 輪だけ（塗らない）      ← 弱
 *   ・選択中 … 輪 ＋ 淡い緑の面        ← 強
 *   ★★**色が読めなくても順位が残る。**★旧実装は両方とも緑の輪で、★**見分けが付かなかった**。
 * ═══════════════════════════════════════════════════════════════════════════ */

/* ── 器 ───────────────────────────────────────────────────────────────── */
.nb-cal {
  width: 100%;
  border-collapse: separate;
  border-spacing: 0;
  background: var(--ies-surface, #fff);
  border: 1px solid var(--ies-border, #e3e3e3);
  border-radius: var(--ies-radius-md, 12px);
  overflow: hidden;
  box-shadow: var(--ies-shadow-sm, 0 1px 2px rgba(0,0,0,.04));
  /* ★★字の色を器が持つ理由 = **曜日の色をマスに載せ、中身に継がせる**ため。
     ★中身（日付の数字など）は `color: inherit` と書けば、土日だけ自動で色が変わる。
     ★★**画面ごとに「土は緑・日は #8A2A17」と書き直さなくてよくなる**（★それが割れの元だった）。 */
  color: var(--ies-text, #1c1c1c);
}

/* ── 見出しの帯 ───────────────────────────────────────────────────────── */
.nb-cal thead th {
  background: var(--ies-surface-alt, #f8f8f8);
  border-bottom: 1px solid var(--ies-border, #e3e3e3);
  color: var(--ies-text-sub, #5c5c5c);
  /* ★★2026-09-08: `.8rem`（12.8px）→ **0.75rem（12px）**。★体系の刻み（`text-xs`）に戻した。
     ★★`.nb-tbl thead th` と同値 ＝ 表と暦で見出しの大きさが揃う。★検出器が刻み外を落とす。 */
  font-size: 0.75rem;
  font-weight: 700;
  text-align: center;
  padding: var(--ies-sp-3, 12px) var(--ies-sp-2, 8px);
}

/* ── 罫線（★縦は「隣り合う列のあいだ」だけ ＝ 端に線を出さない） ───────────
 * ★★**まず 4 辺を 0 にしてから、要る辺だけ太さを戻す。**
 * 　★理由（★2026-09-08・差分で見つけた）= 太さだけ書くと、★**下敷き（preflight）の既定の色と style が残る**。
 * 　★見た目には出ない（★太さ 0 なので描かれない）が、★★**計算値が画面ごとに違う**ことになり、
 * 　★「1px も変わっていない」を測るときに毎回ノイズが出る。★器は決定的にしておく。 */
.nb-cal th,
.nb-cal td { border: 0 solid var(--ies-border, #e3e3e3); }
.nb-cal thead th { border-bottom-width: 1px; }
.nb-cal th + th,
.nb-cal td + td { border-left-width: 1px; }
/* ★★升の面・内余白・縦位置も **器の持ちもの**（★`.nb-tbl th, .nb-tbl td` と同じ考え方）。
   ★★2026-09-08 追記: 初版はこれを持たせ忘れ、★**予約管理を載せ替えたときに内余白が落ちた**
   　（★座席管理は画面側に同じ宣言が残っていたので **表に出なかった** ＝ 危ない見逃し方だった）。
   ★升の中身は上から積む（★予定・件数・帯）ので `top`。★高さは中身の量で決まるので **画面が持つ**。 */
.nb-cal td {
  padding: var(--ies-sp-2, 8px);
  vertical-align: top;
  background: var(--ies-surface, #fff);
  border-bottom-width: 1px;
  /* ★★★2026-09-08（★相澤さんのご決定 = 案 B・★正本 = `docs/ui/system/acceptance.md`「格子の線」）:
     ★★**行の区切りだけを濃くする**（★白地 1.28 → **1.82:1** ＝ 約 1.4 倍 ＝ 知覚できる差）。
     ★★**列の区切り（左の線）は `--ies-border` のまま** ＝ ★**行 > 列 の順位**を作る。
     　★両方濃くすると格子が主役になる（★体系は「面が主役・線は控えめ」）。
     ★★**前提 = 升の中に横線を引かないこと**（★画面側の ③）。★順序を逆にすると濃くしすぎる。
     ★★3:1 は狙わない ——★狙っても届かない（★撫でたときの面で 2.76）。★理由の全文はトークンの注記。 */
  border-bottom-color: var(--ies-row-rule);
}
.nb-cal tbody tr:last-child td { border-bottom-width: 0; }

/* ── 曜日（★字の色だけ。★面は塗らない） ──────────────────────────────── */
.nb-cal .is-sun,
.nb-cal thead th.is-sun { color: var(--ies-danger-ink, #b91c1c); }
.nb-cal .is-sat,
.nb-cal thead th.is-sat { color: var(--ies-info-ink, #296dc5); }

/* ── マスの状態 ───────────────────────────────────────────────────────── */
/* ★前後の月 = 押せない。★地の色まで沈める（★`.ies-cal__cell.is-other-month` と同値） */
.nb-cal td.is-outside {
  background: var(--ies-bg, #f2f2f2);
  color: var(--ies-text-mute, #636d7e);
  cursor: default;
  pointer-events: none;
}
/* ★今日 = 輪だけ（★塗らない ＝ 選択中に席を譲る） */
.nb-cal td.is-today { box-shadow: inset 0 0 0 2px var(--ies-jade, #00a86b); }
/* ★×の日 = その日の **どこかの時間帯** に × が付いている（★一部だけ来られない日・出席可能日）—— 2026-10-21（W-620 ①）
 *   ★★それまで出席可能日は休室日の `is-closed` を借りていた（★名前の意味がずれる・`!important` で撫でても変わらない）。
 *   ★面 = `--cl-accent-light`（#FFF0ED）＝ 休室日（`--ies-coral-soft` #FFE8E1）より **1 段淡い同じ色相**。
 *     ★★淡さの順 = 意味の強さの順（休室日 = 丸ごと開いていない ＞ ×の日 = 一部だけ来られない）。★どの時間帯かは升の中の札が言う。
 *     ★★休室日の面を借りたままにしない理由 = その面の上で土曜の字（`--ies-info-ink`）が **4.37:1**（床 4.5 を割る）。
 *   ★明暗比（計算・WCAG 2.x）:
 *     | | 平日の字 | 土 | 日 | 白い升との段 |
 *     |---|---|---|---|---|
 *     | 明るい配色 #FFF0ED | 15.37 | **4.63** | 5.84 | 1.11 |
 *     | 撫でたとき #E6E9E0 | 13.87 | ★**4.18** | 5.27 | 撫でる前と 1.11 |
 *     | 暗い配色 #2E1A14 | 13.43 | 5.70 | 4.88 | 1.01（★休室日と同じく暗い配色ではほぼ見えない） |
 *   ★撫でたとき = 面に主色を 10%（`docs/ui/system/hover.md` ②・保護者の表〈`pages/avail-grid.css`〉の × の升と同じ式）。
 *     ★★撫でている間だけ土曜の字が 4.18:1（床を割る）。★土曜の字が 4.5 を保てる地は「白から段 1.14 まで」しか無く、
 *       ★×の日の面（1.11）と撫でた段（hover.md の床 1.10）を両方は取れない ＝ 休んでいる姿の 4.5 を取り、撫でた姿は割った。
 *   ★`!important` を付けない ＝ 休室日と重なれば休室日が勝つ。★選択中・受け口はこの下に書くので同じ強さでも勝つ。
 *   ★撫でる地を器が持つのは、×の日が「押して × を直す暦」にしか出ない状態だから（★押せない暦で使うなら、そのとき分ける）。 */
.nb-cal td.is-x { background: var(--cl-accent-light, #fff0ed); }
@media (hover: hover) {
  .nb-cal td.is-x:hover { background: color-mix(in srgb, var(--ies-jade, #00a86b) 10%, var(--cl-accent-light, #fff0ed)); }
}
/* ★選択中 = 輪 ＋ 淡い緑の面（★今日より強い） */
.nb-cal td.is-selected {
  background: var(--ies-jade-soft, #e6f5ee);
  box-shadow: inset 0 0 0 2px var(--ies-jade, #00a86b);
}
/* ★★休室日 —— `!important` を残している理由:
 *   ★画面側の絞り込み（`.sv-cal td.sv-hit`）が **あとから**同じ強さで面を塗る。
 *   ★★休室日は「そもそも開いていない」という *事実* なので、絞り込みの結果より上に出す。
 *   ★旧実装（画面の `<style>`）も `!important` を持っていた ＝ **挙動を変えていない**。 */
.nb-cal td.is-closed { background: var(--ies-coral-soft, #ffe8e1) !important; }

/* ── 行の見出し（★格子型で左端に立つ列。★講師名など） ──────────────────
 * ★★★2026-09-08（★本番で見つけて直した）: **`th` / `td` を頭に付けている理由**。
 * 　★裸の `.nb-cal__rowhead`（0,1,0）は、★★**すぐ上の `.nb-cal td`（0,1,1）に負ける。**
 * 　★★実害 = 私が 2 便目で器に面の色を足した瞬間、★**講師の列の帯が白へ戻った**
 * 　　（★1 便目では帯が出ていた ＝ **自分の直しを、自分の次の直しが静かに消していた**）。
 * 　★★**手元の突合は「0 件」と出たが、★あれは日ビューを開いた写しを作れていなかった**
 * 　　（★要素数が隠したときと同じ 1163 のままだった ＝ 測れていないのに緑）。
 * 　★★**＝ 部品の中で「あとから足した規則が、先に在った規則を上書きする」ことが起きる。**
 * 　　★役の名前で当てる規則は、★**必ず要素名で釘を刺す。** */
/* ★両方が持つのは **帯と折り返さないこと**だけ。 */
.nb-cal th.nb-cal__rowhead,
.nb-cal td.nb-cal__rowhead {
  background: var(--ies-surface-alt, #f8f8f8);
  white-space: nowrap;
}
/* ★★字は **本文の升だけ**に当てる。
   ★理由 = 見出しの角（`<th>`）は「講師」という *列の名前*なので、★隣の時刻の見出しと同じ姿
   　（`--ies-text-sub` ／ 0.75rem）のままにする。★中身（講師名）は本文なので濃く・少し大きく。
   ★★2026-09-08 追記: ここを `th` にも当てていて、★**角だけ 12.48px になった**（★測って気づいた）。
   　★★役の名前で当てる規則は、★**どの要素に効かせたいのかまで書く。** */
.nb-cal td.nb-cal__rowhead {
  color: var(--ies-text, #1c1c1c);
  font-size: 0.78rem;
  font-weight: 700;
}

/* ── 受け口（★ドラッグしたものを落とせる場所） ──────────────────────── */
.nb-cal td.is-drop     { background: var(--ies-jade-soft, #e6f5ee); outline: 2px dashed var(--ies-jade, #00a86b); }
.nb-cal td.is-dropover { background: var(--ies-jade-soft, #e6f5ee); outline: 2px solid  var(--ies-jade, #00a86b); }

/* ── ★升の頭（`__cellhead`）= 升の中のいちばん上の行 ──────────────────
 * ★★**横線を引かない**（★相澤さんのご決定 ①・2026-09-07）。
 * 　★逐語 =「ブースのメモの上の線があるけどこれは消しちゃダメかな？…**あえて分けなくては
 * 　　いけない明確かつ強い理由はない**んだよね」。
 * ★★**理由（★実測）** = 升の中の線 **1.13:1** と 行の区切り **1.28:1** の差が **0.15** しかなく、
 * 　★ゲシュタルトの **類同**で「同じ線 ＝ 同じ意味」と読まれていた。★★升の中の線を消すと、
 * 　★★**残った 1 本が「行の区切り」の意味を独占する**（★1 つの合図に 1 つの意味）。
 * ★★**区分けは近接（下の余白）が作る。**★線は要らない。 */
.nb-cal__cellhead {
  display: flex;
  align-items: center;
  flex-wrap: nowrap;
  gap: var(--ies-sp-1, 4px);
  /* ★左右と上に余白を持たない ——★**升そのものが 8px 持っている**（`.nb-cal td`）ので二重になる。
     ★旧実装は上 3px・左右 2px を足していた（★刻みの外の値）。★落として器の余白に任せた。 */
  padding: 0 0 var(--ies-sp-1, 4px);
  margin-bottom: var(--ies-sp-1, 4px);
}

/* ── ★升の中の選択（`__cellsel`）= 升の頭に置くプルダウン ────────────────
 * ★★**幅に上限を置く**（★相澤さんのご決定 ②）。★逐語 =「ブースのプルダウンが幅取りすぎ」。
 * ★★**原因（★実測）** = `<select>` の幅は **いちばん長い選択肢**で決まり、★表示中の字では決まらない。
 * 　★だから「未設定」と出ていても、★長い名前が 1 つ在るだけで **140px** まで広がっていた（★中身は 72px）。
 * ★★縮められるようにしておく（`min-width: 0`）＝ 列が狭いとき、★隣の操作（鉛筆・×）を先に残す。 */
.nb-cal__cellsel {
  max-width: 96px;
  min-width: 0;
  flex: 0 1 auto;
  /* ★丸薬の姿も器が持つ（★画面から移した。★旧 `.sv-cell-booth-sel` の基本形）。
     ★★上下の余白は **0** ——★旧 1px は刻みの外で、★選択欄の高さは字と行の高さが決める。
     ★★**状態の色（選んである／未設定）は画面が持つ**（★教室ごとの意味の色なので器の仕事ではない）。 */
  font-size: 0.75rem;
  padding: 0 var(--ies-sp-2, 8px);
  border: none;
  border-radius: var(--ies-radius-full, 9999px);
  font-weight: 600;
  white-space: nowrap;
  text-overflow: ellipsis;
  cursor: pointer;
  transition: opacity .12s;
}

/* ── ★格子型（`--grid`）= 「行 × 時間」の表 ────────────────────────────
 * ★月の升（既定）との違いは **見出しが時刻である**ことだけ。★枠も面も罫線も同じものを引く。
 * ★★**時刻は数字なので mono**（★体系の規約「mono = 数字・時刻・ID・金額・教室コード」）。
 * ★★列の数と幅は **画面が決める**（★講師の人数で変わる）。★器は口だけ開けておく。 */
.nb-cal--grid thead th {
  font-family: var(--ies-font-mono);
  /* ★大きさは既定（0.75rem）のまま。★★旧 `.78rem` は刻みの外だった。 */
  white-space: nowrap;
}
/* ★行の見出しの列は、左端に立つので字は左寄せ・縦は中央（★名前を読む列） */
.nb-cal--grid .nb-cal__rowhead { text-align: left; vertical-align: middle; }

/* ═══════════════════════════════════════════════════════════════════════════
 * ★★★承認のカード（`.nb-approve`）—— 2026-09-08・K-1591
 *
 * ★★**なぜ在るか** = ★**同じカードが 3 か所に手で書かれていて、★既に割れていた**（★実測）:
 *   ・勤怠確認の「事務作業の申請」… 見出しは `.ies-sec-head` ／ 申請中の札は **コーラル**
 *   ・事務給与申請の「事務作業の申請」… 見出しは素の flex ／ 申請中の札は **既定**
 *   ・事務給与申請の「打刻の修正」…… 同上 ＋ 締め済みのときだけ承認を伏せる
 *   ★★**＝ 3 箇所に同じ処理があるものは、直すとき必ず 1 箇所忘れる**（★体系の規約）。
 *
 * ★★**この器が持つのは「並べ方」だけ。**★中身（誰の・いつの・何分）と受け口（nonce・押しもの）は
 *   ★呼ぶ側が渡す（★★2026-09-08 K-1600: `parts/approval-card.php` は退役。★いまの使い手は「残り」の却下の面）。
 * ═══════════════════════════════════════════════════════════════════════════ */
.nb-approve__reason {
  margin: 0 0 var(--ies-sp-3, 12px);
  font-size: 0.875rem;
  color: var(--ies-text, #1c1c1c);
  white-space: pre-wrap;
}
/* ★押しものの帯。★狭い画面では折り返す（★却下理由の欄が先に伸びる）。 */
.nb-approve__bar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--ies-sp-2, 8px);
  margin-top: var(--ies-sp-4, 16px);
  /* ★★下は 0 ——★カードの内余白が既に持っている。★★これを書かないと `<form>` の既定の下余白
     　（★実測 **14px**）が残り、★カードが 1 枚あたり 14px 伸びる（★突合で見つけた）。 */
  margin-bottom: 0;
}
/* ★却下理由の欄 = ★**伸びる側**。★10rem を下回らない（★下回ると 1 文字ずつ折り返す）。 */
.nb-approve__note { flex: 1 1 10rem; min-width: 10rem; }

/* ── ★「残り」の一覧の行（`.nb-remain__row`）—— 2026-09-08 訂正 ───────────
 * ★★**未確認の日は「1 行」で出す**（★設計の絵のとおり）。★★初版は押しものを 2 行目へ落としており、
 *   ★1 件あたり 60px ほど縦を食っていた（★16 日残っていれば 1,000px 近い）。
 * ★★**遷移リンクは見出しの右端**（★体系の規約「すべて見る › は見出しの右端」）。 */
.nb-remain__row { padding-top: var(--ies-sp-3, 12px); padding-bottom: var(--ies-sp-3, 12px); }
.nb-remain__row .ies-sec-head { margin-bottom: 0; }
.nb-remain__go { margin-left: auto; flex-shrink: 0; }

/* ── ★行を開く（`.nb-rowpanel`）—— 2026-09-08・K-1593 ─────────────
 * ★★**相方** = `assets/js/table-shell.js` の `data-nb-row-open`。
 * ★★**閉じた姿は CSS が作る。★ただし台本の印（`.nb-js`）が付いたときだけ**
 *   ——★台本が止まっているときに畳むと、★**中身へ二度と行けなくなる**（★打刻の編集がその中に在る）。
 * ★★**＝ 止まっていれば全部開いたまま出る。**★冗長だが使える。 */
.nb-js .nb-rowpanel { display: none; }
.nb-js .nb-rowpanel.is-open { display: table-row; }

/* ★★行の中の「開く」押しもの。★★**行の高さを増やさない**（★行の中の操作は M＝32px の段）。
   ★見た目は「文字＋しるし」だけ ——★塗りも枠も持たない（★体系の強弱 = 塗り > 枠 > 地+枠 > 文字だけ）。 */
.nb-rowtoggle {
  display: inline-flex;
  align-items: center;
  gap: var(--ies-sp-1, 4px);
  min-height: var(--ies-tap-m, 32px);
  padding: 0;
  border: 0;
  background: none;
  color: var(--ies-jade-dark, #00794e);
  font: inherit;
  cursor: pointer;
}
.nb-rowtoggle:hover { text-decoration: underline; }
/* ★開いているあいだ、しるしを回す（★どの行が開いているかを、色に頼らず形で示す）。 */
.nb-rowtoggle[aria-expanded="true"] svg { transform: rotate(180deg); }
.nb-rowtoggle svg { transition: transform .12s; }

/* ── ★押せる札（`button.ies-badge`）—— 2026-09-08・K-1593 ─────────────
 * ★★**札を押しものにするとき**（★例 = 打刻が無いセルの「打刻なし」を押して直す）。
 * ★★**実測で 3 つずれていた**（★span の札と並べて測った）:
 *   ・★下敷きの **枠 2px** が残る（★64×20 → 68×21 に太る）
 *   ・★★**高さ 21px** ＝ 押せる寸法の下限 **S 24px** を割る
 *   ・★つまみ（cursor）が `default` のまま ＝ **押せると分からない**
 * ★★色と字は span と同じ（★実測で一致）ので、★**直すのはこの 3 つだけ**。 */
button.ies-badge {
  border: 0;
  cursor: pointer;
  min-height: var(--ies-tap-s, 24px);
  font: inherit;
  font-size: 0.75rem;
  font-weight: 700;
}

/* ★「残り」の一覧の操作のセル ——★承認（1 押し）と「却下…」（★行を開く）を横に並べる。 */
.nb-remain__act { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ies-sp-2, 8px); justify-content: flex-end; }
.nb-remain__act form { margin: 0; }

/* ★「この日をまとめて確認」を、絞り込みの行の右端へ入れるための箱（★2026-09-08・K-1598）。
   ★★帯を 1 本増やさない ——★どちらも「この日をどう片付けるか」の道具なので、同じ行に居るのが正しい。 */
.nb-attn-bulk { display: inline-flex; align-items: center; gap: var(--ies-sp-2, 8px); }
.nb-attn-bulk form { margin: 0; }

/* ═══════════════════════════════════════════════════════════════════════════
 * ★★★左から出る引き出し（`.nb-drawer`）—— 2026-09-11・担当 DRW2
 *
 * ★★**相澤さんの逐語（2026-09-11）**:
 *   > 実装済みだけどやっぱり幅を広くすると講師の名前までドロワーがかぶってしまいますね
 *   （★幅の前便の回答 =「２６０で実装してみてください」＝ 座席管理の生徒リスト・振替リスト）
 *
 * ★★**決めたこと = 引き出しは「メニューの場所」を借り、★はみ出す分だけ本文を右へ寄せる。**
 *   ・★引き出しは今までどおり左端・上端から縦いっぱい（★作業中は使わないメニューの上に重なる）。
 *   ・★★開いているあいだだけ、本文の左の逃げ（`body.has-ies-sidebar` の padding-left）を
 *     ★**引き出しの幅まで広げる**。★メニューがふだん・細いレール・隠す、のどれでも同じ 1 行で効く
 *     （★どの状態でも「引き出しの右端 ＝ 本文の左端」になるので、状態の一覧をここに写さない）。
 *   ・★＝ 引き出しは本文を **1 升も・1 文字も覆わない**（★講師の名前・落とし先の升・道具の列・パンくず）。
 *   ★★比べた案（右・下・講師の列の貼り付け・常設の柱・重ねたまま）と実測 =
 *     `docs/integration/TODO-2026-09-11-DRAWER.md` の「DRW2」の節。
 *
 * ★★**なぜ「重ねる」ではなく「寄せる」か**（★Fluent 2 / PatternFly の inline drawer と同じ判断）:
 *   ・★この引き出しは **中身を本文へドラッグして使う**一覧 ＝ 引き出しと本文を **同時に** 見て使う。
 *   ・★重ねたまま広げると、広げた分だけ本文の左端が隠れる（★実測 = 260px で日・マスターの講師 4 人中 4 人）。
 *   ・★代わりに払うもの = 開いているあいだ本文が細くなる（★ふだんのメニューで 60px）。★閉じれば戻る。
 *
 * ★★**幅** = `--ies-drawer-w`（★正本は tokens.css に置く）。★無いときの控え = 16.25rem（= 260px・文字の大きさ標準）。
 *   ・★**rem で持つ** = 文字を「特大」にした人は、引き出しも同じ割合で広がる（★260 → 364px）。
 *     ★寄せる方式なので、広げても本文は隠れない（★代わりに開いているあいだの格子が細くなる）。
 *   ・★**メニューより細くしない**（`max()`）＝ 引き出しの右からメニューが覗かない。
 *
 * ★★**この部品が持たないもの** = 中身（見出し・一覧・フォーム・余白）の見た目 ／ 開け閉めの JS
 *   （★画面が `.is-open` を付け外しする）。
 * ★★**寄せが効かない環境**（★`:has()` を知らない古いブラウザ ／ 幅 767px 以下）では **今までどおり重ねる**。
 *   ★座席管理はその場合だけ、ドラッグ中に引き出しを退かす（`page-staff-seat-view.php` の dragstart・描かれた位置で判定）。
 * ═══════════════════════════════════════════════════════════════════════════ */
:root { --nb-drawer-w: max(var(--ies-sidebar-w, 200px), var(--ies-drawer-w, 16.25rem)); }
.nb-drawer {
  display: none;
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  z-index: 300;               /* ★メニュー(50 / スマホ 200)より上・頭とモーダル(9999)より下（★旧 .sv-side / .nb-yg-side と同じ数） */
  width: min(var(--nb-drawer-w), 92vw);
  overflow-y: auto;
  overscroll-behavior: contain;   /* ★中を下まで送っても、後ろのページが動かない */
  background: var(--cl-surface);
  border-right: 1px solid var(--cl-border);
  box-shadow: 2px 0 14px rgba(0, 0, 0, .14);
}
.nb-drawer.is-open { display: block; }
/* ★★寄せ。★詳細度 (0,4,1) = メニューの状態の規則（★いちばん強いレール = (0,3,2)・sidebar-shared.css）に勝つ。 */
@media (min-width: 768px) {
  :root:has(.nb-drawer.is-open) > body.has-ies-sidebar { padding-left: var(--nb-drawer-w); }
}

/* ═══════════════════════════════════════════════════════════════════════════
 * ★★★引き出しの頭（`.nb-drawer__head`）・器の変数・中の柱の頭 —— 2026-10-20・W-522 / W-528（相澤さん「部品そのものの値を直す段の 4 件を今回やる」）
 *
 * ★何のために在るか: 引き出しの頭（✕・見出し・検索窓）を、座席管理（生徒リスト・振替リスト）が `.sv-side-head` で、予約管理の名簿が `.nb-rsv-drawer__head` で、
 *   画面の CSS に別々に持っていた（値はほぼ同じで、字の大きさ・棒の太さ・左右の余白だけが数 px ずれていた）。★この 1 本に寄せた。
 * ★頭の形 =`<div class="nb-drawer__head"><button class="ies-icon-btn ies-icon-btn--s" aria-label="閉じる">✕</button><h2>見出し</h2>[<input class="ies-input ies-input--search">]</div>`。
 *   ✕ は頭の子の `.ies-icon-btn` が右上へ出る（クラス名を付けなくてよい）／ 見出しの左に主色の棒／ 検索窓を置くと頭の下の余白を窓の下に取る。画面が頭に付ける独自のクラスは台本が掴むためのもの（値は持たない）。
 * ★頭は引き出しの上へ貼りつく（引き出しが `overflow-y: auto` なので、中を送っても頭は動かない）。
 * ★値の出どころ = 予約管理の側（字 14px・棒 4×16px・左右 8px）。座席管理は 13.1px・3×14px・左右 4px から数 px 変わる（前後の計算値は報告に出した）。
 * ═══════════════════════════════════════════════════════════════════════════ */
.nb-drawer__head {
  position: sticky;
  top: 0;
  z-index: 10;
  padding: var(--ies-sp-3) var(--ies-sp-2) 0;
  background: var(--cl-surface);
  border-bottom: 1px solid var(--cl-border);
}
.nb-drawer__head > h2 {
  display: flex;
  align-items: center;
  gap: var(--ies-sp-1);
  margin: 0 0 var(--ies-sp-2);
  font-size: 0.875rem;
  font-weight: 700;
  color: var(--cl-muted);
}
.nb-drawer__head > h2::before {
  content: '';
  width: var(--ies-sp-1);
  height: var(--ies-sp-4);
  background: var(--cl-primary);
  border-radius: var(--ies-radius-xs);
}
.nb-drawer__head > .ies-icon-btn { position: absolute; top: var(--ies-sp-2); right: var(--ies-sp-2); }
.nb-drawer__head > .ies-input { margin-bottom: var(--ies-sp-3); }

/* ★★器の変数を引き出しにも届ける（W-522 の「器の変数が引き出しに届かない」）。★器（`.nb-ls`・list-shell.css）は自分の枠の中でしか変数を持たない ＝ 引き出しに直に置いた器の見出し（`noberu_list_shell_group_head()`）は、
 *   変数が空になって高さ・下の線・字の色が **エラーも出さずに消える**。★座席管理の生徒リストは学年の見出しを引き出しに直に置く ＝ 旧は画面（seat-view.css の `.sv-side`）が同じ 5 本を写していた。
 * ★値は器の定義と **同じトークン**を指す（新しい値を作らない）。★器の側で色の指し先を変えたら、ここも見ること。
 *   柱だけの口（`.nb-ls--rail-only`）を引き出しの中に置く画面は、器が自分の枠で全部持つ ＝ 近い側（`.nb-ls`）の定義が勝つので、ここは当たらない。 */
.nb-drawer {
  --nb-ls-tap-m: var(--cl-tap-m, 2rem);
  --nb-ls-border: var(--cl-border);
  --nb-ls-muted: var(--cl-muted);
  --nb-ls-ink: var(--cl-ink);
  --nb-ls-accent: var(--cl-primary);
}

/* ★★引き出しの中に柱だけの口（`.nb-ls--rail-only`）を置いたとき（予約管理の名簿・W-528 の残り 2 行）。
 *   ①柱の頭（検索窓と切り替え）は、引き出しの頭の下へ貼りつく。頭の高さは画面の台本が測って `--nb-drawer-head-h` に渡す（無ければ 0 ＝ 頭の下に潜るだけで壊れない）。地は引き出しと同じ。
 *   ②行の名前の後ろの添え（学年の字）に左の間隔。器の行（list-shell.css）は添えに左の間隔を持たない。★器に足すと同じ口を使う他の画面（問い合わせ管理の「／ 誰」）も動くので、いまは引き出しの中だけに掛ける。 */
.nb-drawer .nb-ls__rail-head { position: sticky; top: var(--nb-drawer-head-h, 0px); z-index: 9; background: var(--cl-surface); }
.nb-drawer .nb-ls__name > .nb-ls__sub { margin-left: var(--ies-sp-1); }

/* ═══════════════════════════════════════════════════════════════════════════
 * ★要約の帯（`.nb-sumstrip`）—— 2026-09-18・U5（座席管理のモック）
 * ★「ラベル 数」を横に並べ、右端に状態の札（`.ies-badge`）。★読むだけ（押せるものを置かない）。
 * ★出すのは `parts/summary-strip.php` の `nb_summary_strip()` だけ。★画面がこの綴りを書かない。
 * ★同じ形 = 予約管理の文脈バー（`.nb-yg-context`・画面の CSS）。★あちらをこの部品へ寄せるのは別便。
 * ★狭い幅では札が次の行へ回る（`flex-wrap`）＝ 横にはみ出さない。
 * ═══════════════════════════════════════════════════════════════════════════ */
.nb-sumstrip {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--ies-sp-2) var(--ies-sp-4);
  padding: var(--ies-sp-3) var(--ies-sp-4);
  background: var(--ies-surface);
  border: 1px solid var(--ies-border);
  border-radius: var(--ies-radius-md);
  box-shadow: var(--ies-shadow-sm);
}
.nb-sumstrip__items { display: flex; flex-wrap: wrap; gap: var(--ies-sp-2) var(--ies-sp-5); margin: 0; }
.nb-sumstrip__item { display: flex; align-items: baseline; gap: var(--ies-sp-2); }
.nb-sumstrip__item dt { font-size: .75rem; color: var(--ies-text-mute); }
.nb-sumstrip__item dd { margin: 0; font-size: .875rem; font-weight: 700; color: var(--ies-text); font-variant-numeric: tabular-nums; }
.nb-sumstrip__badges { display: flex; flex-wrap: wrap; gap: var(--ies-sp-2); }

/* ═══════════════════════════════════════════════════════════════════════════
 * ★畳める節（`details.ies-disclosure`）—— 2026-09-18・U5（自動コマ組の「高度な操作」）
 * ★ふだん押さない操作・長い内訳を畳む。★JS なしで開く（`<details>`）。★キーボードは summary に届く。
 * ★★いま画面ごとに書かれている畳み（講習会の単価の過去分など）をこの部品へ寄せるのは別便。
 * ═══════════════════════════════════════════════════════════════════════════ */
.ies-disclosure > summary {
  display: inline-flex; align-items: center; gap: var(--ies-sp-2);
  min-height: var(--cl-tap-m, 32px); cursor: pointer; list-style: none;
  color: var(--ies-text-sub); font-size: .875rem; font-weight: 700; border-radius: var(--ies-radius-sm);
}
.ies-disclosure > summary::-webkit-details-marker { display: none; }
.ies-disclosure > summary::before {
  content: ''; flex-shrink: 0; width: 0; height: 0;
  border-left: 5px solid currentColor; border-top: 4px solid transparent; border-bottom: 4px solid transparent;
  transition: transform .12s;
}
.ies-disclosure[open] > summary::before { transform: rotate(90deg); }
.ies-disclosure > summary:hover { color: var(--ies-text); }
.ies-disclosure > summary:focus-visible { outline: 2px solid var(--ies-jade-dark); outline-offset: 2px; }
.ies-disclosure__body { display: flex; flex-direction: column; gap: var(--ies-sp-3); margin-top: var(--ies-sp-2); }
@media (prefers-reduced-motion: reduce) { .ies-disclosure > summary::before { transition: none; } }
