/*
 * 管理画面mockのトンマナへ寄せる上書き。
 *
 * ⚠ **正本は納品物 `qpark-cms-mock-master_v2.html`**（2026-08-26 受領。両リポジトリの
 *   親ディレクトリに在る）。⚠ **配信中の `questpark-mock.web.app/admin` は開かない**
 *   ——`docs/adr/0004-specification-sources-and-precedence.md` と
 *   `docs/admin/screen-map.md` が名指しで止めている。
 *
 * ⚠ **2026-08-27 に出どころごと入れ替えた。** それまでの寸法とタイポは、いま「開くな」と
 *   決まっている配信中のmockを開いて `getComputedStyle` で読んだ値だった。目分量では
 *   なかったが、**測った相手が正本ではなかった。**納品物と突き合わせて10箇所が食い違い、
 *   全部この版で直してある（`.ai/mock-diff/styleguide.md` §7 に測った表がある）。
 *   ⚠ **「実測」と書いてあることは、正しい相手を測ったことを意味しない。**
 *
 * 納品物の寸法は HTML の class から読める（例: サイドバーは `.sidebar` の `w-[290px]`、
 * 見出しは `--jp-h2-size: 24px` / `--jp-heading-weight: 600`）。ブラウザは要らない。
 *
 * **色は1つも直書きしない。** Filament がパレットを CSS custom property として公開して
 * いるので、`--gray-*` / `--primary-*` / `--danger-*` などを引く。値そのものは
 * `App\Filament\Support\AdminPalette` が持ち、そこが納品物の16進を写している唯一の場所である。
 * ここへ書き写すと、パネルの `->colors()` を変えたときに**この上書きだけが元の色のまま残る**。
 * 寸法は逆に、ここが唯一の出どころなので値を持つ。
 *
 * CSSフレームワークのトークンではなく素のCSSなのは、Filamentのカスタムテーマが
 * vendorのCSSを取り込む専用build経路を必要とするため。上乗せなら
 * `filament:assets` で済み、本番のDockerfileも既にそれを実行している。
 *
 * ADR 0004 はエンドユーザー側の正本mock準拠から `/admin` を外しているが、管理画面mockへ
 * 寄せることをユーザーが選んだので揃える（同ADR「ユーザーの明示的回答は常に最上位」）。
 */
:root {
    /*
     * 納品物から読んだ寸法。ここが唯一の出どころ。
     *
     * ⚠ **`--qp-meta-size: 11px` は消した。** 納品物の型の下端は 12px で、11px はどこにも
     *   無い（`--jp-caption-size` 12/20/0.03em、`--text-theme-xs` 12/20、`--text-xs` 12/20）。
     *   使っていた3箇所のうち2つは `--qp-label-size` へ合流し、残る1つ——狭い画面で
     *   権限マトリクスの列見出しを縮める所——は**トンマナではなく詰めるための値**なので、
     *   そこに直接書いてある。
     */
    --qp-sidebar-width: 290px;
    --qp-topbar-height: 76px;

    /*
     * 右下に浮かせた操作列のぶん、本文の下へ足す余白。
     *
     * ```
     * ボタン   42px（実測）
     * 帯       padding 0.75rem 上下 = 24px
     * 境目     1px
     * 合計     67px  → 68px を宣言している
     * ```
     *
     * ⚠ **計算値だが、ブラウザで裏取りしてある**——`admin-authenticated.spec.ts` の
     * `roomIsAtLeastTheBandHeight` が**描いた帯の高さと突き合わせる**。
     * **8px へ落とすと赤くなることも確かめた（2026-08-29）。**
     *
     * ⚠ **`getBoundingClientRect` は「画面の中に在る」とは言うが
     * 「他の物の下に隠れている」とは言わない**——**貼り付けた回に、それで一度潜った。**
     * **同じ spec の `buttonsHiddenBehindSomething` が `elementFromPoint` で見ている。**
     * ⚠ **狭い幅では帯なのでこの高さが要る。広い幅では島だが、同じだけ空けておく**
     * ——**右下の島が最後の欄の右端に重なりうるからである。**
     */
    --qp-floating-actions-height: 68px;
    --qp-gutter: 24px;

    /*
     * サイドバーの中身の左端。納品物 `.sidebar` の `px-5` ＝ 20px で、
     * ロゴもメニューの箱も末尾のリンクも、**全部ここから始まる**。
     *
     * ⚠ **`--qp-gutter`（24px）とは別の値である。**あちらは帯の左右の余白で、
     *   納品物ではヘッダーの `sm:px-6`。同じに見えて出どころが違うので、混ぜない。
     */
    --qp-sidebar-inset: 20px;
    --qp-heading-size: 24px;
    --qp-label-size: 12px;

    /*
     * 納品物の小さい字の行送り。**22px は納品物の3か所で同じ値である**——一覧の見出し升・
     * サイドバーの項目・升の本文（いずれも描画実測）。Filament の既定は `--text-sm--line-height`
     * の 20px なので、**当てた所だけが 2px 高くなる。**
     *
     * ⚠ **升の本文には当てていない。**そこを 22px にすると札を持たない行の高さが動き、
     *   `#253` が納品物と一致させた 49px から外れる。**気づかなかったのではなく、測って見送った。**
     */
    --qp-line-sm: 22px;

    /*
     * 一覧の升の余白。納品物の `<th>` と `<td>` は例外なく `px-4 py-3`。
     *
     * ⚠ **納品物の11枚の表を数えて決めた。**うち9枚が一覧で、9枚とも `px-4 py-3` である
     *   （`users` `staff` `announcement` `ranking` `vpoint_reprocess` `survey` `mission`
     *   `meta_prediction` `vquest`）。残る2枚は「可変行テーブル」で、これは一覧ではない
     *   ——納品物自身が `component_catalog` でそう名付けて2つを並べている
     *   （「Vクエスト管理・ユーザー管理（A02）の一覧すべて」と
     *   「可変行テーブル（create-invoice.htmlパターン）」）。**別の部品なので混ぜない。**
     *
     * ⚠ **ページ送りの帯だけ `px-5 py-4` である。**升と同じ値ではない。
     *
     * ⚠ **1枚だけ違う。`audit_log` は `px-5 py-3` で、見出しに `bg-gray-50` の地を敷く。**
     *   ここでは採らない。**その画面は納品物自身が「まだ描けていない」と言っているからである**
     *   ——サイドバーの「監査ログ」には `jp-badge-warning` の **「未対応」** が付いていて、
     *   同じ納品物の「プロジェクトメモ」（`wbs_out`）は監査ログを **「ブロック中／PL回答待ち」**
     *   に挙げ、**「回答待ちのためブロック中です。解除後に本モックへ正式画面を追加します。」**
     *   と書いている。⚠ **そのメモ画面の表が `audit_log` と同じ `px-5` である。**
     *   仮置きの表がメモ画面から写されたと読むのが自然で、**揃わないほうを正本にしない。**
     *
     *   ⚠ **次に気づいた人へ: これは漏れではない。**`audit_log` だけ分岐を足さないこと。
     *   「未対応」が外れて正式画面が届いたら、そのとき数え直す。
     */
    --qp-table-cell-inline: 16px;
    --qp-table-cell-block: 12px;
    --qp-table-footer-inline: 20px;
    --qp-table-footer-block: 16px;

    /*
     * mock: "Noto Sans JP"。Filament 既定の Inter Variable には日本語の字が
     * 無く、管理画面の文字はほぼ全部日本語なので、**OSが勝手に選んだフォント**で
     * 描かれていた。ダークテーマと同じ「環境で見え方が変わる」問題。
     *
     * webfontは入れていない（入れるなら専用のtheme asset pipelineが要る）。
     * 日本語を先頭に置いた明示の並びにして、少なくとも「何が選ばれるか読めない」
     * 状態を終わらせる。QP-TECH-070。
     */
    --qp-font:
        'Noto Sans JP', 'Hiragino Sans', 'Hiragino Kaku Gothic ProN', 'Yu Gothic UI', 'Yu Gothic', Meiryo,
        -apple-system, system-ui, 'Segoe UI', sans-serif;
}

.fi-body,
.fi-body input,
.fi-body textarea,
.fi-body select,
.fi-body button {
    font-family: var(--qp-font);
}

/*
 * 納品物 `.sidebar`: `w-[290px]` の白い列に `border-r border-gray-200`（Filament 既定は
 * 320px・境界なし）。⚠ **幅を動かすと本文の列がそのぶん狭くなる。**`.fi-sidebar` は
 * 1024px 以上で `position: sticky` ＝ 流れの中に居るので、`width` がそのまま本文を押す。
 * 表の列幅を測り直すときは、この値を先に決めること。
 */
.fi-sidebar,
.fi-sidebar-open {
    width: var(--qp-sidebar-width);
}

.fi-main-ctn {
    --fi-sidebar-width: var(--qp-sidebar-width);
}

.fi-sidebar {
    background-color: var(--color-white);
    border-right: 1px solid var(--gray-200);
}

/*
 * ブランド枠。納品物 `:11741` の `.jp-logo`:
 *
 *     QUEST<span class="text-brand-500">PARK</span> [CMS] [Master]
 *     .jp-logo       24px / 36px / 700 / 0.025em / text-gray-800
 *     .jp-logo-badge 12px / 36px / 500       "CMS" は gray-100 の地に gray-500、
 *                                            角丸 4px・左右 6px・上下 2px・左に 4px
 *
 * ⚠ **"CMS" は素のテキストではなく小さな札である。**16px / 20px / 0.2px / gray-900 で
 *   描いていたのは、開いてはいけない配信中のmockを測った値だった。
 */
.qp-brand-name {
    font-size: 24px;
    font-weight: 700;
    line-height: 36px;
    letter-spacing: 0.025em;
    color: var(--gray-800);
}

.qp-brand-accent {
    color: var(--primary-600);
}

.qp-brand-badge {
    display: inline-block;
    margin-inline-start: 4px;
    border-radius: 4px;
    padding-inline: 6px;
    padding-block: 2px;
    background-color: var(--gray-100);
    font-size: var(--qp-label-size);
    font-weight: 500;
    line-height: 20px;
    color: var(--gray-500);
    vertical-align: middle;
}

/*
 * 環境名。⚠ **納品物にこの表示は無い。**同じ位置に在る "Master" は納品物自身の版名で、
 * 運営には意味がない。字の大きさと色だけ、その "Master"（`.jp-logo-badge` の 12px と
 * `text-gray-400`）へ合わせている。
 */
.qp-brand-env {
    margin-top: 2px;
    font-size: var(--qp-label-size);
    font-weight: 400;
    line-height: 20px;
    color: var(--gray-400);
}

/*
 * 納品物のヘッダーは `border-b border-gray-200 bg-white` の帯で、中身は `px-4 py-4 sm:px-6`。
 * 高さは `h-11`（44px）のアバターが決めていて 44 + 16 + 16 = **76px**。
 * ⚠ **これは class から出した計算値で、ブラウザで測った値ではない。**
 * `.fi-topbar` は `<nav>` で `.fi-topbar-ctn` の直下にある（DOMで確認）。
 */
.fi-topbar-ctn > nav {
    min-height: var(--qp-topbar-height);
    /*
     * ⚠ **左右で出どころが違う。**帯の左端はサイドバーの中身の左端でもあるので
     * `--qp-sidebar-inset`（納品物の `.sidebar` の `px-5`）、右端は帯そのものの余白なので
     * `--qp-gutter`（納品物のヘッダーの `sm:px-6`）。**同じ 1つの値にしないこと。**
     */
    padding-inline-start: var(--qp-sidebar-inset);
    padding-inline-end: var(--qp-gutter);
    background-color: var(--color-white);
    border-bottom: 1px solid var(--gray-200);
}

/*
 * 納品物はサイドバーが全高の白い列で、その頭にブランドが載る。ヘッダーは本文の列の中に
 * 在って（`margin-left:290px`）、ロゴを持たない。Filament はトップバーが全幅で、
 * ブランドはその左端に置かれる——縦の境界線がヘッダーの下からしか始まらない。
 * 構造は変えられないので、ロゴ枠をサイドバーと同じ幅（左padding ＋ 残り）にして
 * 右端に同じ線を引く。
 *
 * ⚠ **ここに幅の数値を書かないこと。**`nav` の左padding が `--qp-sidebar-inset` なので、
 *   この枠の右端は `inset + (幅 − inset)` ＝ **常にサイドバーの幅と同じ x** に落ちる。
 *   幅を変えても線は繋がったままである——数値を書くと、幅を変えた日に嘘になる。
 *   （以前は「線が x=240 で連続する」と書いてあった。幅を 290 にした時点で嘘になった。）
 *   ⚠ **引く値は `nav` の左padding と同じものでなければならない。**片方だけ替えると線がずれる。
 */
.fi-topbar-start {
    display: flex;
    align-items: center;
    align-self: stretch;
    inline-size: calc(var(--qp-sidebar-width) - var(--qp-sidebar-inset));
    margin-inline-end: var(--qp-gutter);
    border-inline-end: 1px solid var(--gray-200);
}

/*
 * ⚠ **Filament はロゴを枠の中でさらに 12px 内側へ寄せる**（`.fi-logo` の
 * `margin-inline-start`）。納品物のロゴはサイドバーの `px-5` にそのまま載っているので、
 * この寄せを外さないと**ロゴだけが 12px 右にずれる。**
 *
 * ⚠ **戻して赤くなることを確かめてある**（2026-08-27）。この1本だけを効かないセレクタに
 *   すると、管理画面スモークの左端の検査が `logo: 32`（＝ 20 + 12）を出して落ちた。
 *   6本中1本が赤・他5本は緑。**数値まで名指しで出る**ので、次に踏む人はその場で分かる。
 */
.fi-logo {
    margin-inline-start: 0;
}

/*
 * 帯の中のパンくずを、ブランド枠の右へ置く（発注者の決定・2026-08-30「場所はヘッダー」）。
 *
 * ⚠ **DOM の順番は変えられない。**描く口は `TOPBAR_START` で、そこは
 * `<nav class="fi-topbar">` の**いちばん先頭**である（vendor の `livewire/topbar.blade.php`）。
 * **そのままだとブランド枠の左に出る**——ブランド枠は
 * `--qp-sidebar-width` に合わせた縦線を持つので、x=0 から動かせない。
 * **だから並べ替えは `order` で行う。**
 *
 * ```
 * order 0   サイドバーの開閉ボタン（狭い幅のみ）・ブランド枠
 * order 1   パンくず
 * order 2   右端の身元表示（`margin-inline-start:auto` が残りを吸う）
 * ```
 *
 * ⚠ **`.fi-topbar-end` の `order` も書かないと効かない。**既定は全員 0 なので、
 * パンくずだけを 1 にすると**身元表示より後ろ**へ回る。**片方だけ書くと右端が入れ替わる。**
 *
 * ⚠ **`min-inline-size: 0` を落とさないこと。**flex の子は既定で中身より縮まないので、
 * 長い段が入った狭い幅で**身元表示を押し出す。**
 */
.fi-topbar-ctn > nav > .fi-breadcrumbs {
    order: 1;
    min-inline-size: 0;
}

.fi-topbar-ctn > nav > .fi-topbar-end {
    order: 2;
}

/*
 * 納品物 `:11862-11866`: 名前は `text-theme-sm font-medium`（14px / 22px / **500** / 0.02em）で
 * 親の `text-gray-700` を継ぐ。役割は `text-theme-xs text-gray-400`（12px / 20px / 0.03em）。
 * アバターの左へ縦積み。
 * ⚠ **太さは 700 ではなく 500、色は gray-900 ではなく gray-700。**役割も 11px ではなく 12px、
 *   gray-500 ではなく gray-400。4つとも配信中のmockから採った値だった。
 */
.qp-user-identity {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    justify-content: center;
    margin-inline-end: 8px;
    line-height: 1.2;
}

.qp-user-identity-name {
    font-size: 14px;
    font-weight: 500;
    letter-spacing: 0.02em;
    color: var(--gray-700);
}

.qp-user-identity-role {
    font-size: var(--qp-label-size);
    font-weight: 400;
    letter-spacing: 0.03em;
    color: var(--gray-400);
}

/*
 * サイドバー末尾。上境界 ＋ padding 16px、リンクは 12px / 500。
 * ⚠ **左端はここも `--qp-sidebar-inset`。**12px の直書きで、ロゴともメニューとも違う
 *   3つ目の左端になっていた（実測 12px）。⚠ **納品物にこの枠は無い**ので、寄せる相手は
 *   同じサイドバーの中の他の左端である。
 */
.qp-sidebar-footer {
    margin-inline: var(--qp-sidebar-inset);
    padding-block: 16px;
    border-top: 1px solid var(--gray-200);
}

.qp-sidebar-footer-link {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-size: var(--qp-label-size);
    font-weight: 500;
    color: var(--primary-600);
}

.qp-sidebar-footer-icon {
    inline-size: 14px;
    block-size: 14px;
}

/*
 * メニューの箱の左端を、ロゴと同じ `--qp-sidebar-inset` に置く。
 *
 * ⚠ **これは `#246`（幅を 240 → 290 にした本）が作ったずれではない。前から在った。**
 *   ロゴ 36px ／ メニューの箱 16px で、幅がいくつのときも 20px 離れていた。
 *   幅を広げたので目に付きやすくなっただけである。**`#246` を疑わないこと。**
 *
 * ⚠ **`padding` を足すだけでは 20px にならない。**Filament は `.fi-sidebar-nav-groups` を
 *   `margin-inline: -8px` で外へ引いていて（選択中の箱を余白へはみ出させるため）、
 *   箱の左端は **nav の padding − 8px** に落ちる。実測では 24 − 8 = 16 だった。
 *
 * ⚠ **その 8px をこちらで足し込まないこと。**`calc(inset + 8px)` と書くと、Filament が
 *   引く量を変えた日に**黙って 20px からずれる**。引きそのものを 0 にして、padding を
 *   そのまま左端にする。納品物の箱幅（`290 − 20×2 = 250`）とも、こちらで一致する。
 */
.fi-sidebar-nav {
    padding-inline: var(--qp-sidebar-inset);
}

.fi-sidebar-nav-groups {
    margin-inline: 0;
}

/* mock 実測: 12px / 700 / 弱色 / letter-spacing .3px（既定 14px / 500） */
.fi-sidebar-group-label {
    font-size: var(--qp-label-size);
    font-weight: 700;
    letter-spacing: 0.3px;
    color: var(--gray-500);
}

/*
 * 選択中の項目。⚠ **向きが逆だった。**
 *
 *     納品物  淡い地 ＋ 濃い字   `.menu-item-active` = brand-100 の地 に brand-500 の字
 *                                （`:2799` が brand-50、`:11409` が `!important` で
 *                                 brand-100 に上書きしている。効くのは後者）
 *     ここ    濃いベタ塗り ＋ 白字
 *
 * ⚠ **Filament の出荷CSSは元から「淡い地＋濃い字」の向きである**（gray-100 の地に
 *   primary-700 の字と印）。だからこれは新しい形を作る話ではなく、**上書きを外して
 *   色を2つ指す**話になる。
 *
 * ⚠ **`* { color }` で子孫を白く塗る行を残さないこと。**残すと、字と印を何色に指しても
 *   白のままになる。以前ここに在って、この直しで消えているのがその行である。
 *
 * 字と印を `--primary-600` で指しているのは、出荷の既定が `--primary-700`（＝納品物の
 * brand-600 `#1d4ed8`）で、納品物が選択中に使っているのは brand-500（`#2563eb`）＝
 * こちらの `--primary-600` だから。**段の名札が1つずれている**（`AdminPalette` を見よ）。
 */
.fi-sidebar-item.fi-active > .fi-sidebar-item-btn {
    border-radius: 8px;
    background-color: var(--primary-100);
    font-weight: 500;
}

.fi-sidebar-item.fi-active > .fi-sidebar-item-btn > .fi-sidebar-item-label,
.fi-sidebar-item.fi-active > .fi-sidebar-item-btn > .fi-icon {
    color: var(--primary-600);
}

/*
 * 項目の寸法。**26画面ぜんぶに出る所である。**
 *
 * ⚠ **色と字は既に納品物と一致している。**描画実測で 14px / 500 / `#344054`、選択中は上の規則が
 *   `--primary-600` を当てている。**残っていたのは寸法2つだけだった。**
 *
 *     左右の余白  納品物 12px  ↔  実装 8px
 *     項目の高さ  納品物 38px  ↔  実装 40px
 *
 * ⚠ **高さは余白では作れない。**項目は横並びで、**高いほうの子が行の高さを決める。**
 *
 *     実装    印 24px（`fi-icon.fi-size-lg`）／ 字 20px  → 24 ＋ 余白16 = 40
 *     納品物  印 20px                     ／ 字 22px  → 22 ＋ 余白16 = 38
 *
 *   **印だけを 20px にすると 36px、字だけを 22px にすると 40px のままである。**両方が要る。
 *
 * ⚠ **`.fi-sidebar-item-btn` の `font-size` は触らない。**箱は16px・400だが、**見える字は
 *   `.fi-sidebar-item-label` の 14px・500 である。**箱の16pxが効いているのは印の既定寸法のほうで、
 *   箱を14pxにすると印が別経路でも縮み、**下の2行と二重に効く。**
 *   ⚠ **箱の継承値を「描かれている字」と読み違えると、既に一致しているものへ規則を足すことになる。**
 *
 * ⚠ **印は `> .fi-icon` に限っている。**棚の開閉印（`.fi-sidebar-group-btn` の側）は納品物で
 *   測っていないので、当てない。
 */
.fi-sidebar-item-btn {
    padding-inline: 12px;
}

.fi-sidebar-item-btn > .fi-sidebar-item-label {
    line-height: var(--qp-line-sm);
}

.fi-sidebar-item-btn > .fi-icon {
    width: 20px;
    height: 20px;
}

/*
 * ページ見出し。納品物の型（`--jp-h2-*` / `--jp-heading-weight`）で **24px / 36px / 600 /
 * +0.02em**（Filament 既定は 30px）。⚠ **18px / 700 / −0.025em ではない。**
 * 発注者の決定（2026-08-27）で納品物が正本と決まった。18px は配信中のmockの値だった。
 *
 * 太さと字間は Filament 既定が別の値を当てているので、ここで指す必要がある
 * （既定は `--font-weight-bold` と `--tracking-tight`）。
 *
 * ⚠ **未ログインの画面は別のクラスである。**一覧・詳細は `.fi-header-heading`、
 * ログインなどの1枚ものは `.fi-simple-header-heading`。**綴りが違うので、片方だけ
 * 書くと片方だけ届かない。**実際に届いていなかった——一覧の見出しが納品物どおりの
 * 24/36/600 で描かれている横で、ログインの見出しは Filament 既定の **24/32/700** の
 * ままだった（どちらも描画実測）。
 * ⚠ **値をもう1組書いて増やさないこと。**納品物ではどちらも同じ `jp-h2` なので、
 * **同じ宣言を2つのクラスで受ける。**2箇所に同じ数字が在ると、片方だけ古びる。
 */
.fi-header-heading,
.fi-simple-header-heading,
.qp-auth-outcome-heading {
    font-size: var(--qp-heading-size);
    font-weight: 600;
    line-height: 36px;
    letter-spacing: 0.02em;
    color: var(--gray-900);
}

/*
 * 見出しの下の1行。納品物の `jp-body-sm` で **14px / 22px / gray-500 / 上4px**。
 * Filament 既定は **18px / 28px / gray-600 / 上8px** で、**4つとも違う**（どちらも描画実測・2026-08-28）。
 *
 * ⚠ **上の見出しは1つも直していない。**24 / 36 / 600 / `#101828` が納品物とそのまま一致していた
 * （実測）。**器も既に在る**——`.fi-header-subheading` は Filament が最初から描く。
 * **足したのは寸法だけである。**
 *
 * ⚠ **未ログインの画面（`.fi-simple-header-*`）も同じ宣言で受ける**（2026-10-12 から説明文を持つ。
 * パスワードの再設定・新パスワード・初回の二要素の登録）。違うのは上の余白だけで、モックは `mt-2`（8px。
 * `cms_password_reset_v1.html:71`）なので、そこだけ下で上書きする。
 *
 * ⚠ **`#262` で入った監査ログの1行も、これで納品物の寸法になる。**あの1本だけが
 * 先に入っていて、**18px のまま出ていた。**
 */
.fi-header-subheading,
.fi-simple-header-subheading {
    font-size: 14px;
    line-height: 22px;
    margin-top: 4px;
    color: var(--gray-500);
}

.fi-simple-header-subheading {
    margin-top: 8px;
}

/*
 * 納品物のパンくず。カタログ 09節が「全画面共通ヘッダー内のパンくず。『HOME』＋矢印アイコン＋
 * 現在の画面名の2階層構成」と書いている（納品物 `qpark-cms-mock-master_v2.html:20,676-20,703`）。
 *
 * ⚠ **かつてここに「19画面が持っていて、例外なく2段」と書いてあったが、偽だった**
 * （数え直し 2026-08-30）。`>HOME<` は納品物に20箇所あり、**19が画面・1がカタログの見本**。
 * **3段のものが4本ある。**
 *
 * ```
 * HOME                       1本   ダッシュボード
 * HOME ＞ 画面名             14本
 * HOME ＞ 監査ログ ＞ 未確定   1本   `:17,138`（3段目はWFの状態印）
 * HOME ＞ 資料 ＞ 図の名前     3本   `:20,928` `:20,979` `:21,065`
 * ```
 *
 * ⚠ **カタログの「2階層構成」は、いちばん多い形の説明であって上限ではない。**
 * カタログの字だけを読んで「3段は納品物に無い」と書くと、実画面と食い違う。
 *
 * **ここで足すのは値5つだけである。**
 *
 * | | 納品物 | Filament 既定 |
 * |---|---|---|
 * | 並び | `gap-1.5` = 6px | `calc(var(--spacing) * 2)` = 8px |
 * | 太さ | 指定なし（400） | `--font-weight-medium`（500） |
 * | 現在地 | gray-800 | gray-500（`li` ぜんぶ同じ色） |
 * | リンクの hover | brand-500 | gray-700 |
 * | 区切り | gray-500 | gray-400 |
 *
 * ⚠ **`brand-500` を `--primary-500` で受けないこと。**名札が1段ずれている——理由は
 * このファイルの `.fi-btn` の docblock に書いてある。**ここへ写さない。**
 *
 * ## ⚠ 色は「何番目か」ではなく「リンクかどうか」で分ける
 *
 * 納品物では `HOME` が gray-500 のリンクで、現在地が gray-800 の素の字である。
 * **「1つ目を gray-500」と書くと、3段になった日に真ん中まで gray-800 になる。**
 * `li` を gray-800、`a` を gray-500 にすると、段が増えても
 * **「リンクは弱色・現在地は濃色」**が保たれる。**段数を決めずに色だけ決められる形**である。
 *
 * ## ⚠ 納品物は「役割」で分けている。こちらは「リンクかどうか」で分けている
 *
 * **数え直した**（2026-08-31。パンくず20本・1段1／2段15／3段4）。
 *
 *     納品物   祖先 gray-500 ／ 現在地 gray-800 ／ 区切り gray-500   ⚠ 20本とも例外なし
 *              ⚠ **中間段の `資料` は gray-500 だが、リンクではない。**役割で決まっている
 *     実装     `a` が gray-500 ／ `li` が gray-800
 *
 * ⚠ **いまは全部一致する。**実装の祖先は必ずリンクだからである。
 * **食い違うのは {@see \App\Filament\Support\TheBreadcrumbTrail} の
 * `! hasPage('index')` の枝だけで、そこは祖先がリンクにならず gray-800 になる。**
 * ⚠ **その枝はいま通らない**——44資源のうち `index` を持たないのは `StaffAccountResource`
 * 1本だけで、**あれは `HasItsOwnBreadcrumbTrail` で自分の段を名乗り、祖先をリンクにしている。**
 *
 * ⚠ **通る日が来たら、ここを「役割」で書き直すこと。**リンクかどうかでは足りなくなる。
 *
 * ⚠ **もう1つ、納品物には見かけの例外が1本ある。**`HOME ＞ 監査ログ ＞ 未確定` の
 * 中間段だけ gray-800 である（`:17140`）。**あれは例外ではない**——監査ログが現在地で、
 * **後ろの「未確定」は `text-2xl font-bold text-warning-500` のWFの印**（`:17150`）であって、
 * **パンくずの段ではない。**⚠ **数えるときに1件の例外として拾わないこと。**
 *
 * ダークは `->darkMode(false)`（`AdminPanelProvider`）で閉じているので、Filament の
 * `.dark` 側の宣言は届かない。**だから片側だけ書く。**
 *
 * ## 位置と段数（2026-08-30・発注者の決定で動かした）
 *
 * ⚠ **かつてここに「位置は動かさない。CSS で寄せる話ではない」と書いてあった。**
 * **後半は今も正しい。**寄せたのは CSS ではなく、**描く場所そのもの**である——
 * パネルが `->breadcrumbs(false)` で `.fi-header` 側を閉じ、`TOPBAR_START` の口で
 * 帯の中へ描く（{@see \App\Providers\Filament\AdminPanelProvider}）。
 *
 * 段は {@see \App\Filament\Support\TheBreadcrumbTrail} が決める。**ここは色と間隔だけ。**
 *
 * ⚠ **`.fi-header .fi-breadcrumbs` の Filament 既定は、帯には届かない。**
 * `display:none` も `margin-bottom` も**セレクタが `.fi-header` に閉じている**（実測）。
 * **だから帯側で打ち消す必要が無い。**逆に言えば、**帯へ移したことで
 * 「40rem 未満では出ない」という既定も外れている。**
 *
 * ## ⚠ 測っていないこと
 *
 * - **色と間隔の5つは、いまも配信済みの `app.css` から読んだ値である。**
 *   ⚠ **ただし「その5つが帯の中で実際に当たっているか」は測ってある**——
 *   管理画面スモークが `getComputedStyle` で読む（`tests-admin-smoke/`）。
 *   **字面ではなく描いた結果である。**
 * - ⚠ **`EditStaffAccount` だけが段を自分で答える**（`HasItsOwnBreadcrumbTrail`）。
 *   位置か段数を触る日には必ずそこを通る。理由はあちらに書いてある。
 */
.fi-breadcrumbs ol,
.fi-breadcrumbs ol li {
    column-gap: 6px;
}

.fi-breadcrumbs ol li {
    font-weight: 400;
    color: var(--gray-800);
}

.fi-breadcrumbs ol li a {
    color: var(--gray-500);
}

.fi-breadcrumbs ol li a:hover {
    color: var(--primary-600);
}

/*
 * 区切りの `>`。**納品物は 16px 角の svg**（`width="16" height="16"`。20本とも同じ）。
 * ⚠ **出荷の `.fi-icon` の既定は 20px**（`calc(var(--spacing) * 5)`）。**4px 大きい。**
 *
 * ⚠ **`.fi-icon` を素で書かないこと。**あれは管理画面のアイコン全部に効く。
 * **パンくずの中に限る**——**この規則は既に色を当てている所と同じセレクタで、
 * 対象が1つに揃う。**
 *
 * ⚠ **パンくずの `<li>` の中に在る `.fi-icon` は、いまは区切りだけである**
 * （`vendor/filament/support/resources/views/components/breadcrumbs.blade.php` は
 * 段の名札に `<span>` か `<a>` しか置かない）。**名札にアイコンが付く日が来たら、
 * 色も寸法もそちらへ一緒に当たる。**そのときは分けること。
 *
 * ⚠ **限れているかは、描いた物でしか言えない。**`admin-authenticated.spec.ts` が
 * **パンくずの外のアイコンが出荷の段のままであることを、同じ画面で読む。**
 */
.fi-breadcrumbs ol li .fi-icon {
    width: 16px;
    height: 16px;
    color: var(--gray-500);
}

/*
 * mock 実測: カードは radius 8px・shadow-sm・**上端に4pxの色帯**。
 *
 * どのカードをどの系統にするかはウィジェット側が `extraAttributes` で決め、
 * ここは系統名と Filament のパレットの対応しか持たない。色名（blue など）では
 * なく系統名（primary / warning …）にしてあるのは、パネルの `->colors()` を
 * 変えたときにPHP側の文字列が嘘にならないようにするため。
 *
 * Filament は Stat の色をクラスとして出さない（インラインの custom property）
 * ので、CSS側から状態を読む手は無い。読めないものを読もうとすると一致しない
 * セレクタが黙って残る——最初に書いた `:has(.fi-color-danger)` がまさにそれで、
 * 一度も効いていなかった。
 */
.fi-wi-stats-overview-stat {
    border-radius: 8px;
    border-top: 4px solid var(--gray-300);
    box-shadow:
        0 1px 3px 0 rgb(0 0 0 / 0.1),
        0 1px 2px -1px rgb(0 0 0 / 0.1);
}

.fi-wi-stats-overview-stat.qp-stat-bar-primary {
    border-top-color: var(--primary-600);
}

.fi-wi-stats-overview-stat.qp-stat-bar-warning {
    border-top-color: var(--warning-500);
}

.fi-wi-stats-overview-stat.qp-stat-bar-success {
    border-top-color: var(--success-500);
}

.fi-wi-stats-overview-stat.qp-stat-bar-danger {
    border-top-color: var(--danger-500);
}

/*
 * 権限プリセットは「大項目 → 中項目 → 権限行」を別々の階層で読む。
 * Filamentの1段groupへ大項目と中項目を詰めると、2行が1つの見出しに見えるため、
 * サイドメニューと同じ大項目を表の外、中項目を表内の見出しとして分離する。
 */
.qp-permission-category-section + .qp-permission-category-section {
    margin-block-start: 24px;
    border-block-start: 1px solid var(--gray-200);
}

.qp-permission-category-heading {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 16px 24px;
    /*
     * ⚠ **`--primary-500` を読まないこと。**納品物のブランド段は 500 を飛ばしていて
     * （`AdminPalette::ACCENT` の注記）、`TheAdminPaletteFollowsTheDeliveredMockTest` の
     * `deliveredAccentShades()` も 500 を持たない——**値を見張る根拠が無い段**である。
     * 50 は納品物に在り（`#eff6ff`）、同じ検査が見張っている。
     *
     * ⚠ **半透明が不透明になる。**元は `color-mix(in srgb, var(--primary-500) 8%, transparent)`
     * ＝ 実効 8% の透過で、白の上では `#eff5fe`。`--primary-50` は `#eff6ff` の不透明なので、
     * **白の上では見た目が変わらない**（G と B が1ずつ）。⚠ **白でない地の上では変わる。**
     */
    background-color: var(--primary-50);
    color: var(--primary-700);
    font-size: 16px;
    font-weight: 700;
    line-height: 24px;
}

.qp-permission-category-marker {
    flex: 0 0 4px;
    inline-size: 4px;
    block-size: 24px;
    border-radius: 9999px;
    background-color: var(--primary-600);
}

.qp-permission-category-table-wrap {
    overflow-x: auto;
}

.qp-permission-category-table {
    min-inline-size: 760px;
}

.qp-permission-screen-heading-row {
    border-block: 1px solid var(--gray-200);
    background-color: var(--gray-50);
}

.qp-permission-screen-heading-cell {
    padding: 12px 16px;
    text-align: start;
}

.qp-permission-screen-heading {
    color: var(--gray-800);
    font-size: 14px;
    font-weight: 700;
    line-height: 20px;
}

.qp-permission-screen-role-heading {
    padding: 12px 8px;
    color: var(--gray-700);
    font-size: var(--qp-label-size);
    font-weight: 700;
    line-height: 20px;
    text-align: center;
    white-space: nowrap;
}

.dark .qp-permission-category-heading {
    color: var(--primary-300);
}

.dark .qp-permission-category-marker {
    background-color: var(--primary-400);
}

/* MFA challenge: center the instruction and six-digit control inside the simple page. */
.fi-simple-page .fi-fo-field:has(.fi-one-time-code-input-ctn) .fi-fo-field-label-col {
    justify-items: center;
}

.fi-simple-page .fi-one-time-code-input-ctn {
    margin-inline: auto;
}

/*
 * 未ログインの画面の枠（ログイン・パスワードの再設定・新パスワード・初回の二要素の登録）。
 * モック `20261008_cms_mockups/cms_login_v1.html:76-82`（3画面とも同じ）:
 *
 * ```
 * 列     max-w-[520px] の中央。外の余白 px-4 py-10
 * ロゴ   カードの外の上・中央、下に mb-6（24px）
 * カード rounded-2xl（16px）・bg-white・p-8（32px）、lg（1024px〜）で p-10（40px）・shadow-theme-lg
 * ```
 *
 * ⚠ **Filament はカードを `.fi-simple-main`（`<main>`）に描き、ロゴをその中の見出しに置く。**
 * ロゴを外へ出すため、カードを1段内側の `.fi-simple-page` へ移した（ロゴは `TakesTheSignedOutFrame` がその手前に描く）。
 * `.qp-auth-page` を持つ画面だけに当てる——この部品を使わない1枚ものが増えても、Filament の既定の枠のまま出る。
 *
 * ⚠ 影は `--gray-900` から作る（16進を書かない。理由は `.fi-btn` の影の註）。
 * モックの `--shadow-theme-lg` は `0 12px 16px -4px rgba(16,24,40,.08), 0 4px 6px -2px rgba(16,24,40,.03)`。
 */
.fi-simple-main:has(> .qp-auth-page) {
    max-width: calc(520px + 32px);
    margin-block: 40px;
    padding: 0 16px;
    border-radius: 0;
    background: none;
    box-shadow: none;
}

.qp-auth-brand {
    display: flex;
    justify-content: center;
    margin-bottom: 24px;
}

.qp-auth-page .fi-simple-page {
    border-radius: 16px;
    background-color: var(--color-white);
    padding: 32px;
    box-shadow:
        0 12px 16px -4px color-mix(in oklab, var(--gray-900) 8%, transparent),
        0 4px 6px -2px color-mix(in oklab, var(--gray-900) 3%, transparent);
}

@media (min-width: 1024px) {
    .qp-auth-page .fi-simple-page {
        padding: 40px;
    }
}

/*
 * 必須の印。モックは欄の札の後ろに「（必須）」の字（`text-error-500`）で、Filament の既定は上付きの `*`。
 * ⚠ 未ログインの画面だけに当てる。管理画面のほかの欄は `*` のまま（どちらへ揃えるかは画面ごとの改修で決める）。
 * 札の字の大きさは Filament の `text-sm`（14px）。
 */
.qp-auth-page .fi-fo-field-label-required-mark {
    font-size: 0;
    vertical-align: baseline;
}

.qp-auth-page .fi-fo-field-label-required-mark::after {
    content: '（必須）';
    font-size: 14px;
    color: var(--danger-500);
}

/* フォームの上の帯。モック `cms_login_v1.html:88-101`（`rounded-xl border border-error-500 bg-error-50 p-4`、印・見出し・1行）。 */
.qp-auth-refusal {
    display: flex;
    align-items: flex-start;
    gap: 12px;
    padding: 16px;
    border: 1px solid var(--danger-500);
    border-radius: 12px;
    background-color: var(--danger-50);
}

.qp-auth-refusal-icon {
    flex-shrink: 0;
    margin-top: -2px;
    color: var(--danger-500);
}

.qp-auth-refusal-heading,
.qp-auth-refusal-message,
.qp-auth-link,
.qp-auth-outcome-body {
    margin: 0;
    font-size: 14px;
    line-height: 22px;
    letter-spacing: 0.02em;
}

.qp-auth-refusal-heading {
    margin-bottom: 4px;
    font-weight: 600;
    color: var(--gray-800);
}

.qp-auth-refusal-message,
.qp-auth-outcome-body {
    color: var(--gray-500);
}

/*
 * ボタンの下の中央の補助のリンク。モック `cms_login_v1.html:180-182` ほか（`jp-body-sm text-brand-500 hover:text-brand-600`）。
 * ⚠ 納品物の `brand-500`（`#2563eb`）はこの表の `--primary-600` である（`AdminPalette::ACCENT` の註）。
 * ボタンとの間はモックが `gap-3` ＋ `mt-3`（24px）で、`.fi-simple-page-content` の段の間（24px）と同じなので足さない。
 */
.qp-auth-link-row {
    display: flex;
    justify-content: center;
}

.qp-auth-link {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    color: var(--primary-600);
    text-decoration: none;
}

.qp-auth-link:hover {
    color: var(--primary-700);
}

/*
 * フォームの代わりに出す結果（送信完了・URL の期限切れ・登録完了）。モック `cms_password_new_v1.html:156-205`:
 * 76px の花形の地に 32px の印（下に mb-5）、`jp-h2` の見出し（中央・下に mb-2）、`jp-body-sm` の本文（左寄せ・下に mb-6）、戻るリンク。
 */
.qp-auth-outcome-mark {
    position: relative;
    display: flex;
    justify-content: center;
    align-items: center;
    margin-bottom: 20px;
}

.qp-auth-outcome-icon {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}

.qp-auth-outcome-success .qp-auth-outcome-ground {
    color: var(--success-50);
}

.qp-auth-outcome-success .qp-auth-outcome-icon {
    color: var(--success-600);
}

.qp-auth-outcome-danger .qp-auth-outcome-ground {
    color: var(--danger-50);
}

.qp-auth-outcome-danger .qp-auth-outcome-icon {
    color: var(--danger-600);
}

.qp-auth-outcome-heading {
    margin: 0 0 8px;
    text-align: center;
}

.qp-auth-outcome-body {
    margin-bottom: 24px;
}

@media (max-width: 767px) {
    .qp-permission-category-heading {
        padding-inline: 16px;
    }

    .qp-permission-category-table {
        min-inline-size: 0;
    }

    .qp-permission-screen-heading-cell {
        padding-inline: 12px;
    }

    /*
     * ⚠ **これはトンマナの値ではない。**狭い画面で権限マトリクスの列見出しを詰めるための
     *   値なので、納品物の型（下端 12px）へ寄せると縮小そのものが消えて意味がなくなる。
     *   `--qp-label-size` を引かず、ここに直接書いてあるのはそのためである。
     */
    .qp-permission-screen-role-heading {
        padding-inline: 4px;
        font-size: 11px;
    }
}

/*
 * 作成・編集の操作ボタンを、画面の右下に浮かせて追随させる
 * （発注者の決定・2026-08-29「画面の右下にスクロール追随で設置すればいいんじゃない？ 全画面」）。
 *
 * ## ⚠ ここは納品物に無い決定である
 *
 * **納品物はボタンの行を流れの中に置いている**——`sticky` は20件あるがすべて `top-0` で、
 * ⚠ **`sticky bottom` も `fixed bottom` も0件である**（d9 の実測 2026-08-29）。
 * **納品物から測れたのは「下端に置いたときの姿」までで、浮かせる形はあちらに無い。**
 * ⚠ **「納品物にこう書いてある」と読まないこと。**
 *
 * ## ⚠ 見出しの追随は、やめた。これは納品物へ寄せる側である
 *
 * **かつてここは `.fi-header` を `position: sticky` で貼り付けていた**
 * （2026-08-23。ボタンが見出しの行に居たため）。
 * **納品物はページ見出しを追随させていない**——**追随するのはヘッダー1本だけで、
 * 中身はパンくずとプロフィールである。**⚠ **だから見出しを止めたのは寄せる側の変更である。**
 *
 * ⚠ **`.fi-topbar-ctn` は触っていない。**あれは Filament 自身が `top:0 / z-index:30` で
 * 貼り付けており、**納品物でも追随している。**発注者が言ったのはページ見出しのほうである。
 *
 * ⚠ **`.fi-header-actions-ctn { margin-inline-end: 2px }` は消した。**
 * **8/23に操作列だけ2px左へ寄せたのは、見出しの行にボタンが在ったからである。**
 * **右下へ移したので、揃える相手が居なくなった。**
 *
 * ## ⚠ 浮かせるのは、フォームの操作列だけである
 *
 * **`.fi-sc-actions` はフォームの下端の操作列で、保存・キャンセル・公開しか入っていない。**
 *
 * ⚠ **子セレクタ（`>`）で書かないこと。**`.fi-sc-actions` はフォームの直下に居ない
 * ——**`fi-grid > fi-grid-col > fi-sc-component` を挟む**（実測 2026-08-29。
 * **`>` で書いて1度も当たらず、`position` が `static` のまま緑になりかけた**）。
 *
 * ⚠ **一度、見出しの行の操作列（`.fi-header-actions-ctn`）を丸ごと浮かせて出荷しかけた。**
 * **あそこにはページ自身の操作も同居している**——
 * **`EditStaffAccount` の「MFAを再設定」が、保存とキャンセルの隣まで引きずられた**
 * （発注者が画面の写真で気づいた・2026-08-29）。
 * ⚠ **こちらのブラウザ検査は「ボタンが隠れていないか」しか見ておらず、緑だった。**
 *
 * **いま操作は `KeepsFormActionsFindable` が引けるようにしたうえで、
 * Filament が元から描く場所（フォームの下端）に居る。**⚠ **混ぜていない。**
 *
 * ## ⚠ 帯にする。ボタンだけを浮かせない
 *
 * **発注者の決定・2026-08-30:**
 *
 * > **ボタンだけになってるから違和感かんじるんだよ。フッターのようにすればいいのでしょう。**
 *
 * ⚠ **重なりをやめろ、ではない。**「ボタンだけが宙に浮いているのが変」という指摘である。
 * **帯にすると「重なっている」ではなく「フッターの下を流れている」に見える。**
 *
 * ⚠ **一度、広い画面では背景も境目も無い島にしていた。**それがこの指摘を招いた。
 *
 * ## ⚠ 狭い画面でも同じ帯である。積まない
 *
 * **納品物は `sm` 未満で縦に積み、2つとも幅いっぱいにする。**
 * ⚠ **あちらは流れの中に在るから積める。**
 * **浮かせたまま積むと、画面の下半分をボタンが覆う。**
 * **だから横並びのまま。**⚠ **これは納品物に無い決定である。**
 *
 * ## 色
 *
 * **地色も境目も、この画面の他の区切りと同じものを使う**
 * ——`--gray-50` と `--gray-200`。⚠ **新しい色を作らない。**
 */
/*
 * ⚠ **メンテナンス管理を先頭に置いてある。並べ替えないこと。**
 *
 * `TheSaveButtonsFloatAtTheBottomRightTest` は宣言の中身を
 * `\.fi-resource-edit-record-page \.fi-sc-form \.fi-sc-actions \{(.*?)\}` で切り出す。
 * ⚠ **あの式は「編集ページの行が `{` で終わる」ことに依っている**ので、
 * **後ろへ足すと行末が `,` になり、切り出せなくなって2本が落ちる**（実測 2026-08-31）。
 *
 * ⚠ **既存の2行は1文字も書き換えていない。足しただけである。**
 */
.fi-maintenance-windows-page .fi-sc-form .fi-sc-actions,
.fi-resource-create-record-page .fi-sc-form .fi-sc-actions,
.fi-resource-edit-record-page .fi-sc-form .fi-sc-actions {
    position: fixed;
    /*
     * ⚠ **`height: auto` を落とさないこと。**
     *
     * **Filament の出荷CSSは `.fi-sc-actions { height: 100% }` を当てている**
     * （流れの中では親の高さに合わせるため）。
     * ⚠ **`position: fixed` にすると、その 100% は画面の高さに解決する**
     * ——**箱が 720px に伸びた**（実測 2026-08-29）。
     *
     * ⚠ **中は空なので目には見えない。だが後ろのクリックを奪う。**
     * **そのうえ「帯の上端より下に在る物」を数える検査は、
     * 上端が画面の外へ出るぶん何も見つけず、緑になっていた**——**それで一度、重なりを見逃した。**
     */
    height: auto;
    top: auto;
    inset-inline: 0;
    bottom: 0;
    z-index: 20;
    display: flex;
    justify-content: flex-end;
    padding: 0.75rem 1rem;
    background-color: var(--gray-50);
    border-block-start: 1px solid var(--gray-200);
}

/*
 * ⚠ 浮かせた帯のぶん、下の中身が隠れる。**その高さをページの中身ぜんぶの下へ足す。**
 *
 * ⚠ **一度、フォーム（`.fi-sc-form`）にだけ足して出荷しかけた。**
 * **フォームの外に描かれている物がそっくり漏れた**——
 * **`EditStaffAccount` の権限の表や、`MaintenanceWindows` の
 * 「メンテナンス期間を設定する」の行に、帯が重なった**
 * （発注者が画面の写真で気づいた・2026-08-29）。
 *
 * ⚠ **`position: fixed` は流れから外れるので、下に余白を作らないと必ず重なる。**
 * **だから足す先は「フォーム」ではなく「ページの中身」でなければならない。**
 *
 * **貼り付けていた頃と同じ計算である**——あのときは帯が上に在り、下の内容が隠れた。
 */
/*
 * ⚠ **同じ要素に付いている。子孫で書かないこと。**
 * **`fi-resource-edit-record-page` は `.fi-page` そのものの class である**
 * （実測 2026-08-29。**`.fi-resource-edit-record-page .fi-page` と書いて
 * 1度も当たらず、余白が 0px のまま緑になりかけた**）。
 */
/*
 * ⚠ **メンテナンス管理も、その注記の「漏れた側」そのものである。**
 * **上の注記が名指ししている「`MaintenanceWindows` の行に帯が重なった」の、当の画面である**
 * ——あのときは行アクションが流れの中に在ったので余白が要らなかった。
 * **フォームを画面へ戻した以上、下端の入力欄が帯に隠れる**（2026-08-31）。
 */
.fi-page.fi-maintenance-windows-page,
.fi-page.fi-resource-create-record-page,
.fi-page.fi-resource-edit-record-page {
    padding-block-end: var(--qp-floating-actions-height);
}

/*
 * 広い画面では右下に寄せる。⚠ 帯を画面いっぱいに伸ばさない。
 *
 * **`sm` 未満だけが帯で、そこから上は右下の島である**——
 * **納品物の「積む」を写さない代わりに、狭い幅だけ帯にしている。**
 */
/*
 * 広い画面では、サイドバーを覆わない（発注者の決定・2026-08-30）。
 *
 * > **ボタンだけになってるから違和感かんじるんだよ。フッターのようにすればいいのでしょう。**
 *
 * ⚠ **帯そのものは狭い幅でも同じである。**変わるのは左端だけ——
 * **本文の始まる所から右端まで。**
 *
 * ⚠ **サイドバーが出るのは 1024px からである**（`.fi-sidebar` の幅を当てている段と同じ）。
 * **それより狭いとサイドバーは畳まれるので、帯は画面いっぱいでよい。**
 */
@media (min-width: 1024px) {
    .fi-maintenance-windows-page .fi-sc-form .fi-sc-actions,
    .fi-resource-create-record-page .fi-sc-form .fi-sc-actions,
    .fi-resource-edit-record-page .fi-sc-form .fi-sc-actions {
        inset-inline-start: var(--qp-sidebar-width);
    }
}

/*
 * ⚠ **右へ寄せるのは、外側ではなく中の `.fi-ac` である。**
 *
 * **Filament は操作列を `.fi-ac.fi-align-start` で包み、`justify-content: flex-start` を当てる。**
 * **中が幅いっぱいに伸びるので、外側に `justify-content: flex-end` を書いても
 * ボタンは左端に居たままになる**（実測 2026-08-29。**発注者が画面を見て気づいた**
 * ——「右詰めになってないからね」）。
 *
 * ⚠ **こちらの検査は4つとも「浮いているか」しか測っておらず、緑のまま通した。**
 * **`admin-authenticated.spec.ts` が右端・下端からの距離を測るようになったのは、その回である。**
 */
.fi-maintenance-windows-page .fi-sc-form .fi-sc-actions > .fi-ac,
.fi-resource-create-record-page .fi-sc-form .fi-sc-actions > .fi-ac,
.fi-resource-edit-record-page .fi-sc-form .fi-sc-actions > .fi-ac {
    width: 100%;
    justify-content: flex-end;
}

/*
 * **自前のブレードで組んだ設定画面の保存の行**（活動通知の文面・ヘルプの入力設定・問い合わせの通知先。L-b・batch7）。
 *
 * ⚠ **`flex justify-end` と書いていたが、効いていなかった。**このパネルは Tailwind を組み立てていない
 * （冒頭の註）ので、Filament の出荷 CSS に無い Tailwind の字は、管理画面ではただの飾りである
 * （`.justify-end` は出荷 CSS に0件。R2-054 の `whitespace-pre-wrap` と同じ原因）。
 * 上のフォームとの間（`space-y-6` も同じ理由で効いていない）もここで空ける。
 */
.qp-save-row {
    display: flex;
    justify-content: flex-end;
    margin-block-start: 1.5rem;
}

/*
 * ジャックポットの公開後「正解」節には、フォームの途中にも操作列がある。
 * 上の共通セレクタがこれまで下端の保存列と同じく fixed にしてしまい、
 * 「正解を保存」の上へ別の操作列が重なってクリックを奪っていた。
 * この節の操作だけ元の流れに戻し、下端の共通フッターはそのまま保つ。
 */
.fi-resource-edit-record-page .fi-sc-form .fi-sc-actions.qp-jackpot-answer-actions {
    position: static;
    inset-inline: auto;
    bottom: auto;
    z-index: auto;
    padding: 0;
    background: transparent;
    border: 0;
}

/*
 * 設問1問ぶんの境界を出す（発注者の指摘・2026-08-23「設問ごとの境界がわかりにくい」）。
 *
 * ⚠ **箱そのものは元からある。** Filament の出荷CSSが `.fi-fo-repeater-item` へ
 *   `border-radius: var(--radius-xl)` / `background-color: var(--color-white)` /
 *   `--tw-ring-color: color-mix(in oklab, var(--gray-950) 5%, transparent)` を当てている。
 *   つまり**白いセクションの上に、白いカードを黒5%の1本線で載せている**状態だった。
 *   見えないのは箱が無いからではなく、**線が薄いから**である。枠が `border` ではなく
 *   ring（＝`box-shadow`）なので、`border-width` を測ると 0 が返る——それで
 *   「箱が無い」に見える。
 *
 * ⚠ **新しい色も影も作らない**（発注者の指示）。線は `--gray-200`、帯は `--gray-50`。
 *   どちらもこのファイルが権限プリセットの区切りで既に使っている組み合わせである
 *   （`.qp-permission-category-section` / `.qp-permission-screen-heading-row`）。
 *   ring の色を上書きしないのは、`--tw-*` が Tailwind の内部変数で、**名前が変わったら
 *   一致しないセレクタとして黙って残る**から（このファイルの `:has(.fi-color-danger)` で
 *   一度やっている）。`border` は CSS そのものなので、そういう消え方をしない。
 *
 * ⚠ **`>` で1階層に限る。** 設問の中には選択肢の Repeater が入れ子で居るので、
 *   子孫セレクタにすると**選択肢の1つ1つにも枠が付く。** 対象は設問の箱だけ。
 *   `qp-question-repeater` は `DailyQuestionSetResource`（今日の10問）と
 *   `SurveyResource`（アンケート）が付けている目印で、Filament は `.fi-fo-repeater` と
 *   同じ要素へ載せる（`Repeater.php` の `$outerAttributes`）ので、その直下が
 *   `ul.fi-fo-repeater-items` である。
 *   **片方だけ消えると黙って効かなくなる**ので、目印とこのセレクタが揃っていることを
 *   `OneQuestionStaysOpenTest` と `TheSurveyQuestionsFoldTheSameWayTest` の両方で見る。
 *
 * ⚠ **枠は角丸のカードに載る。** 帯へ `overflow: hidden` を使うと角が揃う代わりに、
 *   中の `設問画像` の候補一覧が**箱の外へ出られなくなる**ので使わない。角丸は
 *   `inherit` で親から取る（新しい数値を置かないため）。
 */
.qp-question-repeater > ul > .fi-fo-repeater-item {
    border: 1px solid var(--gray-200);
}

.qp-question-repeater > ul > .fi-fo-repeater-item > .fi-fo-repeater-item-header {
    background-color: var(--gray-50);
    border-start-start-radius: inherit;
    border-start-end-radius: inherit;
}

/* 開いているときだけ、頭と中身を1本で分ける。畳んでいるときは箱の下辺と重なる。 */
.qp-question-repeater > ul > .fi-fo-repeater-item:not(.fi-collapsed) > .fi-fo-repeater-item-header {
    border-block-end: 1px solid var(--gray-200);
}

.qp-question-repeater > ul > .fi-fo-repeater-item.fi-collapsed > .fi-fo-repeater-item-header {
    border-radius: inherit;
}

/*
 * カードの見出しの下の線を落とす（発注者の判断・2026-08-31）。
 *
 * ## 納品物には無い。数えた
 *
 * 納品物 `qpark-cms-mock-master_v2.html` の白い枠付きの箱は119個で、浮いている物
 * （`absolute` / `fixed` / `shadow-theme-lg` のドロップダウン等）30個を除くと**カード89枚**。
 * **カードは2つの形に分かれる。**
 *
 *     詰め型  77枚  カード自身が `p-5 sm:p-6`、見出しは素の字
 *                   ⚠ **見出しを持つ48枚のうち、線を持つのは0枚**
 *                   見出しの余白は `mb-5` 28 ／ `mb-1` 6 ／ `mb-4` 3 ／ 無し 3
 *     帯型    10枚  先頭の子が `border-b` の見出し帯
 *                   ⚠ **10枚とも中に `<table>` を1つ持つ**
 *     その他   2枚  `overflow-hidden` で子が1つだけ
 *
 * ⚠ **角丸で母集団を絞らないこと。**納品物のスタイルガイドは「カードは2xl」と書いているが
 *   （`:19625`）、**帯型には `rounded-xl` が5枚ある。**2xl だけで数えると帯型を半分見落とす。
 *
 * ⚠ **0枚が出たので、見出しの側から数え直してある。**納品物の見出し要素は193本
 *   （`h1`-`h6` と `jp-h*` の和集合）で、**線の下に居るのは9本。9本とも一覧の器の帯である**
 *   （問題一覧 `:12442` ／ クエスト一覧 `:13190` ／ ユーザー一覧 `:13913` ／ 対象一覧 `:14614` ／
 *   アンケート一覧 `:15148` ／ 配分ログ `:16255` ／ 期間区分 `:16508` ／ スタッフ一覧 `:17441` ／
 *   カタログの見本 `:20444`）。**見出しの直後の兄弟が `border-t` を持つ形は0本。**
 *
 * ## ⚠ 帯型は触っていない。あちらは Section ではない
 *
 * **帯型に当たるのは Filament の表の器（`.fi-ta-ctn`）で、出荷CSSが
 * `.fi-ta-header` と `.fi-ta-header-toolbar` に同じ線を引いている。**
 * ⚠ **あちらは既に納品物と一致しているので、1行も足していない。**
 *
 * ## ⚠ 線は見出しの下辺ではない。中身の上辺である
 *
 * 出荷CSSはこう書いている——
 * `.fi-section:not(.fi-section-not-contained):not(.fi-aside).fi-section-has-header:not(.fi-collapsed)
 * > .fi-section-content-ctn { border-top-width: 1px }`。
 * ⚠ **`.fi-section-header` 側を探しても見つからない。**「無い」と結論しかける形なので書いておく。
 *
 * **打ち消す相手を1つに絞るため、幅だけを0にする。**`border: none` と書くと、
 * **畳んだときの `border-style: none` や、脚（`.fi-section-footer`）の線と話が混ざる。**
 * ⚠ **脚の線は別の要素に付いていて、ここでは触っていない。**
 *
 * ## ⚠ 外したあと、詰まって見えるかは測っていない
 *
 *     納品物   見出し `mb-5` = 20px
 *     実装     見出しの下余白 16px ＋ 中身の上余白 24px = 40px
 *
 * **数の上では納品物より広い。**⚠ **心配されたのと逆向きである。**
 * **ただし「広すぎて間延びして見えるか」は数では言えない。**
 * **描いた結果は `admin-authenticated.spec.ts` が線の太さだけを読む。**
 *
 * ## ⚠ 100本すべてに効く
 *
 * `Section::make(` は100本あり、**100本とも見出しを持つ**（見出しなしの `Section::make()` は0本）。
 * `->aside(` 0本・`->contained(` 0本なので、**100本すべてが出荷の条件を満たしている。**
 * **1画面ぶんの直しではない。**
 */
.fi-section > .fi-section-content-ctn {
    border-top-width: 0;
}

/*
 * カードの中の区切り線を1段薄くする（#311 で引いた線そのもの・2026-08-31）。
 *
 * **納品物 `qpark-cms-mock-master_v2.html` は、`border-t` の区切りを2つの段で描き分けている。**
 * ⚠ **23本を数えて、例外が無いことを確かめた。**
 *
 *     gray-100   6本  カードの「中」で内容どうしを分ける線
 *                     セグメント `:12161` ／ 画像・動画 `:15405` ／ 指標の設定 `:16428` `:16468`
 *                     ／ 注記 `:16544` ／ **最終更新・更新者 `:17959`**
 *     gray-200  17本  カードの「脚」
 *                     ページ送りの帯 8本（「〜 件 / 全件」）／ 操作列 8本（キャンセル・保存）
 *                     ／ タブの下の面 1本 `:20768`
 *
 * **`.fi-divided` が引く線は前者である。**出荷CSSは `--gray-200` を当てていて、1段濃い。
 *
 * ⚠ **脚のほうは触らない。**実装の脚は既に納品物と同じ gray-200 である
 *   ——ページ送りは出荷CSSの `.fi-pagination`、浮いた操作列はこのファイルの
 *   `border-block-start: 1px solid var(--gray-200)`。**2つとも合っている。**
 *
 * ## ⚠ いま効くのは1枚だけである。増えたら測り直すこと
 *
 * `->divided(` は**1本**（メンテナンス管理の「現在の状態」）。**それが納品物 `:17959` と
 * 1対1で対応するので、この段はその1枚から取った値である。**
 * ⚠ **2本目が現れたら、その画面の納品物と突き合わせてからにすること。**
 * **`TheSectionHeadingsFollowTheDeliveredMockTest` が本数を数えて止める。**
 *
 * ⚠ **出荷の宣言は `:where(…)` に包まれていて特異度が0である。**それでも打ち消せるのは
 *   特異度ではなく `@layer` の外に居るからで、**`:where()` を真似る必要は無い。**
 */
.fi-section.fi-divided > .fi-section-content-ctn > .fi-section-content > :not(:last-child) {
    border-color: var(--gray-100);
}

/*
 * 説明文の字（発注者の指示・2026-08-31）。
 *
 * 納品物 `qpark-cms-mock-master_v2.html` の小さい本文は **gray-500** で、
 * 出荷CSSは **gray-600** である（`.fi-sc-text:not(.fi-badge){color:var(--gray-600)}`。
 * 配信済みの `app.css` から読んだ。2026-08-31）。**1段だけ薄くする。**
 *
 *     納品物 `p.jp-body-sm`  121本
 *       500  105本   ← これに寄せる
 *       400    7本   空状態・補足の行
 *       800    5本   言い切りの文
 *       600    2本 ／ 700 1本 ／ 無指定 1本
 *
 * ⚠ **`.jp-body-sm` はクラス自身が色を持たない**（`font-size` / `line-height` /
 *   `font-weight` / `letter-spacing` だけ）。**だから上の 500 は要素の実効値である。**
 * ⚠ **グレー11段は納品物と `AdminPalette::GRAY` で16進が完全一致している**ので、
 *   段の番号のまま突き合わせてよい。
 *
 * ## ⚠ `.fi-color` を外すこと。外さないと赤い注意書きが灰色になる
 *
 * **このファイルは `@layer` の外に居るので、層の中の宣言に特異度と関係なく勝つ**
 * （理由は一覧の升の docblock に書いてある）。素の `.fi-sc-text:not(.fi-badge)` と
 * 書くと、出荷CSSの
 * `.fi-sc-text:not(.fi-badge).fi-color:not(.fi-color-neutral){color:var(--text)}` にも
 * 勝ってしまう。⚠ **`->color('danger')` を渡した注意書きが4本あり、全部灰色になる**
 * ——メンテナンス画面の「保存すると利用者は今すぐ使えなくなります」を含む。
 *
 * `->color()` を渡した `Text` には `fi-color` が必ず付く
 * （`Filament\Support\Colors\ColorManager::getComponentClasses()` が
 * `['fi-color', 'fi-color-<名前>']` を返す）。**だから「色を頼まれた字には触らない」を
 * `:not(.fi-color)` の1つで言える。**
 *
 * ⚠ **`->color('gray')` だけは `fi-color` が付かない**（`HasDefaultGrayColor` の分岐で
 *   空配列が返る）。**あれは既定と同じ色を頼んだときなので、ここで拾ってよい。**
 *
 * ## ⚠ ここが 500 なのは「説明しか描いていない」からである
 *
 * `.fi-sc-text` は `Filament\Schemas\Components\Text` だけが出すクラスで、
 * **いま在る15本は全部が説明・注意書きである。**⚠ **値をここへ入れると、
 * 納品物が値に当てている 800 から静かにずれる。**
 * **その前提は `TheTextColoursFollowTheDeliveredMockTest` が数えて守っている。**
 */
.fi-sc-text:not(.fi-badge):not(.fi-color) {
    color: var(--gray-500);
}

/*
 * ─── 一覧の表 ──────────────────────────────────────────────────────────────
 *
 * 納品物の一覧テーブル9枚を描画して測った値へ寄せる（`qpark-cms-mock-master_v2.html`）。
 * ⚠ **CSSの字面ではなく、127.0.0.1 に立てて `getComputedStyle` で読んだ値である。**
 *
 *     見出しの升   padding 12px 16px ／ 14px ／ 500 ／ gray-500 ／ 地は無し
 *     本文の升     padding 12px 16px
 *     行の高さ     バッジのある行 51.5px ／ 無い行 49px（最終行は罫が無いぶん 0.5px 低い）
 *     行の境界     1px gray-100（最終行には無い）
 *     ホバー       gray-50
 *     バッジ       12px / 行送り 18px / padding 4px 12px / 角丸 9999px → 高さ 26px
 *     ページ送り   border-top 1px gray-200 ／ padding 16px 20px ／ 現在ページは白字
 *
 * ⚠ **「51.5px」は単一の値ではない。**バッジが行の高さの床になっていて、バッジを持たない
 *   `ranking` の行は納品物でも 49px である。**バッジは 26px で、本文の行送り 24px より高い。**
 *   したがって上下の余白をこれ以上削っても 46px には届かない——`docs/admin/component_catalog.md`
 *   に在った「46px」は `12 + 12 + 22` という**計算値**で、バッジを勘定に入れ忘れている。
 *   ⚠ **納品物自身が 51.5px である。**
 *
 * ⚠ **升の箱を持つのは `<td>` ではない。**Filament の `<td>.fi-ta-cell` は padding 0 で、
 *   値は内側の列要素（`.fi-ta-text` `.fi-ta-icon` …）が持っている。`<td>` に書いても効かない。
 *   例外が2つあり、**端の升だけ `<td>` 自身が 12px / 24px を持つ**のと、
 *   **操作列は内側が 0 で `<td>` が持つ**。だから両方をここで揃える。
 *
 * ⚠ **この上書きが効くのは `@layer` の外に居るからである。**`questpark-admin-tonmana.css` は
 *   `filament/app.css` より**先に**読み込まれる（`<link>` の並びで確認済み）。それでも勝つのは、
 *   Filament の出荷CSSが丸ごと `@layer theme/base/components/utilities` の中に在り、
 *   **層の外の宣言は層の中の宣言に無条件で勝つ**からである。
 *   ⚠ **このファイルを `@layer` で包むと、ここの上書きが全部黙って効かなくなる。**
 *
 * ⚠ **`.fi-ta-*` は26画面ぜんぶの一覧に効く。**詳細画面の中の関連一覧も同じ組で描かれる
 *   （実測で値まで同一）。**片方だけ動かすことはできない。**
 */

/*
 * 状態タブの帯。納品物 `#announcement` の
 * `<nav class="flex overflow-x-auto rounded-lg bg-gray-100 p-1">`（描画実測・2026-08-28）。
 *
 * ⚠ **納品物は「灰の受け皿の上に、白い札が1枚乗っている」形である。**実装は白い帯が浮いていて、
 *   **受け皿が無い。**そこが見た目の差の本体で、地色・余白・角丸・影が全部そこから来ている。
 *
 *     帯    地色 gray-100 ／ 内側 4px ／ 角丸 8px ／ 影も輪も無し
 *     タブ  高さ 38px ／ 角丸 6px ／ 余白 8px 12px ／ 14px 500
 *     選択  白地 ＋ `0 1px 2px 0` の gray-900 5% ／ 字は gray-900
 *
 * ⚠ **色はすべて既存の段の名前で引ける。**`gray-100` `白` `gray-900` は `AdminPalette::GRAY`
 *   に在り、影も gray-900 の5%である（納品物の `--color-gray-*` と描画で照合した）。
 *   **新しい値を1つも作っていない。**
 *   ⚠ **札（`.fi-badge`）の色が同じ理由で書けなかったのと、ここは事情が逆である。**
 *   あちらは `--success-*` `--danger-*` `--warning-*` の階調が歯抜けで、出荷CSSが参照する
 *   11段に対し納品物が持つのは 7/8/5段——**13段を作ることになるので止めた。**
 *   **こちらは灰なので、歯抜けが無い。**次に読む人が必ず訊く所なので書いておく。
 *
 * ⚠ **`box-shadow` を途中で切って読まないこと。**Filament の輪と影は Tailwind の
 *   合成で、**先頭3層が透明の placeholder である。**先頭50字だけ読むと「透明だけ」に見え、
 *   **実際には4層目に 1px の輪、5〜6層目に落ち影が在る。**——一度それで「影は無い」と報告した。
 *
 * ⚠ **中央寄せを解くとき `margin-inline` を両側とも落とさないこと。**この帯は
 *   `margin-inline: auto` が**中央寄せと「中身の幅に縮む」の両方をやっている。**
 *   両側を 0 にすると帯がカード幅いっぱい（実測 389px → 1158px）に伸びる。
 *   **落とすのは開始側だけである。**
 *
 * ⚠ **カードの中には入らない。**納品物は帯がカードの見出し領域の子だが、実装の
 *   `.fi-sc-tabs` は `.fi-ta-ctn` の**兄弟**である（`ctn.contains(band)` が偽。実測）。
 *   **DOM の話なので CSS では動かせない。**ここで揃うのは位置ではなく寸法と色だけ。
 *
 * ⚠ **タブの数は揃えない。**納品物4つ・実装6つだが、**実装のほうが状態を多く持っている。**
 *   実装を残す。
 *
 * ⚠ **`.fi-contained` の変種には当てていない。当てては困る。**同じ `.fi-tabs` を、この管理画面は
 *   2つの形で使っている（数えた）。
 *
 *     受け皿型  `.fi-tabs`               一覧の状態タブ。**1画面だけ**（`ListNotifications`。
 *                                        `getTabs()` を定義しているのはこの1枚。陽性対照として
 *                                        `public function` は 2,053 件当たる）
 *     境界線型  `.fi-tabs.fi-contained`  `Filament\Schemas\Components\Tabs`。**10画面**
 *                                        （`app/Filament/Pages/` の10枚）
 *
 *   ⚠ **境界線型は納品物と突き合わせていない。**`:not(.fi-contained)` を外すと、
 *   **測っていない10画面が動く。**負の対照として `staff-and-permissions`（境界線型）へ
 *   ここの4規則を注入し、**9項目とも1つも動かないことを確かめてある。**
 *
 * ⚠ **下位ナビのタブは在らない**（`SubNavigationPosition` の使用が0件）。
 *
 * ─── ⚠ この節を測り直す人へ。**背面のタブでは色が凍る** ───────────────────────────
 *
 * `.fi-tabs-item` は `transition-property` に `color` と `background-color` を持つ。
 * **ブラウザの窓が前面に無いと遷移が進まず、`getComputedStyle` は開始値を返し続ける。**
 * ⚠ **`!important` でも inline の `style` でも変わらないので、セレクタが当たっていないように
 *   見える。**——実際にそれで1時間ぶん誤診した。
 *
 * **見分け方**: 同じ要素で**色以外**（`padding` など）を変えると、そちらは即座に変わる。
 * **色だけ変わらないなら遷移である。**測る前に `*{transition:none !important}` を入れる。
 */
.fi-tabs:not(.fi-contained) {
    /* 中央寄せだけ解く。終了側の auto は幅を縮める役なので残す。 */
    margin-inline-start: 0;
    border-radius: 8px;
    background-color: var(--gray-100);
    padding: 4px;
    box-shadow: none;
}

.fi-tabs:not(.fi-contained) .fi-tabs-item {
    border-radius: 6px;
    /* 高さ 36px → 38px の出どころ。余白は 8px 12px で既に一致している。 */
    line-height: var(--qp-line-sm);
}

.fi-tabs:not(.fi-contained) .fi-tabs-item.fi-active {
    background-color: var(--color-white);
    box-shadow: 0 1px 2px 0 color-mix(in oklab, var(--gray-900) 5%, transparent);
}

/*
 * 選択中の字。⚠ **出荷CSSは `--primary-700` を当てていて、実装は青で描かれていた。**
 * 納品物は gray-900 で、**選ばれていることを地色と影だけで示している。**
 *
 * ⚠ **寄せると、実装が持っていた手がかりが1つ減る。**「選ばれている」を示すものが
 *   字の色・地色・影の3つから、地色と影の2つになる。**納品物に寄せるのが今回の目的だが、
 *   減ること自体は書いておく**——次に読む人が「読みにくくなった」と判断して戻しに来るときに、
 *   **見落としだったのか、承知の上だったのかが分かるように。**
 */
.fi-tabs:not(.fi-contained) .fi-tabs-item.fi-active .fi-tabs-item-label {
    color: var(--gray-900);
}

/*
 * 表を包むカード。
 *
 * ⚠ **「外枠が無い」ではない。在って、線と影だけが違う。**Filament は既に
 * 角丸12px・白地のカードを描いている（`.fi-ta-ctn`。描画実測）。
 *
 *     角丸    実装 12px ／ 納品物 12px（`rounded-xl`）  → **一致。動かさない**
 *     線      実装 `gray-950` 5% の ring 1px ／ 納品物 `gray-200` の border 1px
 *     影      実装 `0 1px 3px` ＋ `0 1px 2px -1px` ／ 納品物 **無し**
 *
 * ⚠ **ring ではなく `border` で引く。**`--tw-ring-color` は Tailwind の内部変数で、
 *   名前が変わったら**一致しないセレクタとして黙って残る**（このファイルの
 *   `:has(.fi-color-danger)` で一度やっている）。`border` は CSS そのものなので、
 *   そういう消え方をしない。`box-sizing: border-box` なので外側の寸法は変わらない。
 *
 * ⚠ **納品物の角丸は割れている。**一覧を持つ5画面のうち `users` `staff` `announcement`
 *   が 12px、`vpoint_reprocess` と `audit_log` が 16px（`rounded-2xl`）。**3対1で12pxを採る**
 *   ——`audit_log` は納品物自身が「未対応」と書いている仮置きで、**同じ形の表がメモ画面
 *   （`wbs_out:18969`）に在り、そちらから写されている**（枠も見出しの地も一字一句同じ）。
 *   数えるときに勘定へ入れない。**残る1枚は `vpoint_reprocess` だけである。**
 *
 * ⚠ **当たるのは84箇所である。**`table(Table $table)` を数えた——Livewire のウィジェット27／
 *   資源の一覧43／関連一覧14。**権限マトリクスもこの中に入る**（`->content()` で
 *   Filament の表の中に描かれている）。**納品物が寸法を持つのは5画面だけ**なので、
 *   残る79箇所は「納品物に無いが同じ形になる」側である。`.fi-ta-*` の他の指定と
 *   **同じ引き受け方をしている**——片方だけ画面を選ぶことはできない。
 */
.fi-ta-ctn {
    border: 1px solid var(--gray-200);
    box-shadow: none;
}

/*
 * 並べ替えの切り替えを見出しの行へ移した表は、表の上の段（`.fi-ta-header-toolbar`）を描かない
 * （2026-10-13・発注者「ミッションの一覧見にくくない？」。段には字の無い ↑↓ が1つ浮いていただけだった）。
 *
 * ⚠ 印は `ListHeader` が、段にほかの物が載らない表にだけ付ける（`ListHeader::reorderTrigger()`）。
 *   Filament はこの段を `->reorderable()` だけで描くと決めている（`$hasHeaderToolbar`）ので、PHP の側からは消せない。
 */
.fi-ta-header-ctn:has(> .qp-list-header-holds-reorder) > .fi-ta-header-toolbar {
    display: none;
}

/*
 * 見出しの升。`<th>` 自身が箱を持つ（内側の並べ替えボタンは padding 0）。
 *
 * ⚠ **行の高さの残り 2px は、余白ではなく行送りである。**余白は既に納品物と同じ 12/16 で、
 *   それでも `<th>` の高さが 44.5px ↔ 46.5px で割れていた。内側まで降りて測ると出どころが出る。
 *
 *     納品物  余白 12/12 ＋ 中身 22px（`line-height: 22px`）  → 46.5
 *     実装    余白 12/12 ＋ 中身 20px（`--text-sm--line-height`）→ 44.5
 *
 *   **余白を足して 46.5 に合わせると、数字は合うが字の座りが変わる。**行送りで動かす。
 *
 * ⚠ **並べ替えボタンには当てていない。**`.fi-ta-header-cell-sort-btn` は自前の `line-height` を
 *   持たないので、ここの1行がそのまま継承される（描画で確認）。**2か所に書かない。**
 */
.fi-ta-header-cell {
    padding: var(--qp-table-cell-block) var(--qp-table-cell-inline);
    font-size: 14px;
    font-weight: 500;
    line-height: var(--qp-line-sm);
    color: var(--gray-500);
}

/*
 * Filament は端の列だけ左右を 24px にする（`:first-of-type` / `:last-of-type`）。
 * 納品物にその区別は無く、9枚とも端も中も 16px である。
 */
.fi-ta-header-cell:first-of-type {
    padding-inline-start: var(--qp-table-cell-inline);
}

.fi-ta-header-cell:last-of-type {
    padding-inline-end: var(--qp-table-cell-inline);
}

/*
 * 見出しの地。納品物の一覧は無地で、灰色の地を敷くのは「可変行テーブル」のほうである。
 *
 * ⚠ **見出しの下線はここで動かしていない。**納品物は `<tr>` に `border-b border-gray-200`、
 *   Filament は `<thead>` に同じ 1px gray-200 を引く。**描かれる線は同じ場所・同じ色で、
 *   実測でも一致した**（`oklch(0.927 0.007 260.732)`）。付いている要素を移すだけの直しは、
 *   画面が1画素も変わらないのに列グループ見出しが2行になる場合の挙動を変える。**入れない。**
 */
.fi-ta-table > thead > tr {
    background-color: transparent;
}

/*
 * 本文の升。`<td>` は箱を持たず、内側の列要素が持つ——Filament の作りをそのまま使う。
 * `<td>` 側に残る端の余白だけ落として、全部の列の左右を 16px に揃える。
 */
.fi-ta-cell {
    padding: 0;
}

/*
 * ⚠ **選ぶ欄（チェック欄）だけは `<td>` / `<th>` 自身が余白を持つ。**中に列要素が無いので、上の 0 で
 *   四角がカードの左の線に貼り付いた（準統合 8095 の確かめ・2026-10-12。四角の left 323px・カードの left 322px。
 *   選んだ行の左の青い線とも重なった）。納品物の Vポイント再処理（`1-39-7`）は選ぶ欄も
 *   `<th class="w-10 px-4 py-3">` ／ `<td class="px-4 py-3">` で、ほかの升と同じ値である。
 *   見出し行の全選択も同じ組（`fi-ta-cell fi-ta-selection-cell`）で描かれるので、この1本で両方に効く。
 *   ⚠ 上の `.fi-ta-cell` と強さが同じなので、**この規則はあちらより後に置く。**
 */
.fi-ta-selection-cell {
    padding: var(--qp-table-cell-block) var(--qp-table-cell-inline);
}

.fi-ta-checkbox:not(.fi-inline),
.fi-ta-color:not(.fi-inline),
.fi-ta-icon:not(.fi-inline),
.fi-ta-image:not(.fi-inline),
.fi-ta-select:not(.fi-inline),
.fi-ta-text:not(.fi-inline),
.fi-ta-toggle:not(.fi-inline),
.fi-ta-cell > .fi-ta-actions {
    padding-inline: var(--qp-table-cell-inline);
    padding-block: var(--qp-table-cell-block);
}

/*
 * 行の境界。納品物は `divide-y divide-gray-100`——Tailwind v4 の `divide-y` は
 * **最終行以外の下辺**に引くので、Filament と付く場所は同じである。**違うのは色だけ。**
 */
.fi-ta-table > tbody > .fi-ta-row:not(:last-child) {
    border-bottom-color: var(--gray-100);
}

/*
 * 止まっている行。**印を載せるのはPHPで、ここは色だけを持つ。**
 *
 * 納品物で行が沈むのは**3枚だけ**である（`data-page` 26枚を数えた。地色を持つ `<tr>` は
 * 3件、陽性対照として `<tr>` 全体は47件）。
 *
 *     users             13968  suspended  bg-error-50/40
 *     staff             17500  inactive   bg-error-50/40
 *     vpoint_reprocess  14666  error      bg-error-50/**30**
 *
 * ⚠ **1枚だけ 30% である。**2対1で 40% を採る。**1枚を平均に混ぜない**——
 *   35% はどの画面にも無い値になる。
 *
 * ⚠ **画面ごとの条件を書き分けていない。**納品物では、沈む行と**状態バッジが赤い行**が
 *   3枚とも完全に一致する。だから実装側も既存の `statusColor()` が `danger` を返すかだけを
 *   見て、`qp-ta-row-attention` を載せる（`UserResource` / `StaffAccountsTable` /
 *   `VPointPayoutErrorResource`）。**状態の語が増えた日に、色と行が別々に古びない。**
 *
 * ⚠ **ホバーが勝つ。**Filament の `.fi-ta-row.fi-clickable:hover` は詞が2つあり、
 *   こちらの1つより強い——押せる行にカーソルを置くと灰へ替わる。**納品物も同じである**
 *   （`hover:bg-gray-50` と `bg-error-50/40` が同じ要素に載っていて、ホバー側が勝つ）。
 *   **合わせに行って `!important` を書かない。**
 */
.qp-ta-row-attention {
    background-color: color-mix(in oklab, var(--danger-50) 40%, transparent);
}

/*
 * バッジ。納品物 `.jp-badge` ＋ `.jp-badge-sm`。
 *
 * ⚠ **表の中だけに当てている。**納品物では詳細画面のバッジも同じ形だが、この本は表の見た目で、
 *   `.fi-badge` を素で書くと入力欄・情報欄・通知まで動く。**範囲を広げない。**
 *   ⚠ 結果として、一覧のバッジと一覧の外のバッジが製品内で2つの形になる。
 * ⚠ **例外は、状態の札だけ**（2026-09-25、a8 の差・統合役の判断「見出しの札の形を一覧に合わせ、規則を1か所に」）。
 *   同じ回の同じ状態を、一覧と見出し・詳細で同じ形の札にする。**選択子を並べて、同じ規則を読ませる**（写しを作らない）。
 *   - `.fi-header-heading .qp-status-badge`：見出しの状態の札（Vクエストの公開した回・メタ予測）
 *     （CHK-c11-a8-DRAFT-BADGE-SHAPE・CHK-c13-a8-META-5）
 *   - `.qp-status-entry .fi-badge`：詳細の「状態」の欄の札（ミッション。CHK-c13-a8-MISSION-4）。
 *     infolist の札は class を受け取る口が無いので、欄の入れ物に `qp-status-entry` を付けて中の札を指す
 */
.fi-ta-cell .fi-badge,
.fi-header-heading .qp-status-badge,
.qp-status-entry .fi-badge {
    border-radius: 9999px;
    padding-inline: 12px;
    padding-block: 4px;
    font-size: var(--qp-label-size);
    font-weight: 500;
    line-height: 18px;

    /*
     * 字送り。納品物の `.jp-badge` は `--jp-caption-tracking`（**0.03em**）を持つ。
     *
     * ⚠ **出荷は「持っていない」のではない。逆を向いている。**
     * 表の札は `.fi-badge.fi-size-sm` で、出荷CSSがそこへ `--tracking-tight`
     * （**-0.025em**）を当てている。**12px に対して -0.3px。**
     * **納品物は +0.36px なので、詰めるのと空けるのが入れ替わっている。**
     *
     * ⚠ **`normal` へ戻すのでは足りない。**あちらは負の値を明示しているので、
     * **こちらも明示しないと -0.3px のままである。**
     */
    letter-spacing: 0.03em;

    /*
     * 枠。⚠ **納品物の札は `box-shadow: none` で、枠を1本も持たない**（描画実測）。
     * Filament は内側に 1px の輪を描く（各色の 600 段の10%）。
     *
     * ⚠ **これは色の値ではなく、枠の有無である。**だから下の「色は直せない」に掛からず、
     *   ここで消せる。**輪の色は指していない**——消したので指す先が無い。
     */
    box-shadow: none;
}

/*
 * 素の札の色。⚠ **寸法は上の規則で既に納品物と一致している**（高さ26px／`4px 12px`／
 * 角丸9999px、いずれも描画実測）。**ここで動かすのは段だけである。**
 *
 * ⚠ **これは階調の問題ではない。**`AdminPalette::GRAY` は既に納品物と同じ値で、`--gray-100` は
 *   納品物の `--color-gray-100`、`--gray-700` は同 `--color-gray-700` と一致する（描画で確認）。
 *   **違うのは出荷CSSの `.fi-badge{background-color:var(--gray-50);color:var(--gray-600)}` が
 *   50/600 を掴んでいることだけである。**だから段を指し直すだけで済み、
 *   **新しい値を1つも置いていない。**⚠ **階調をどう登録し直しても、この段の選び方は変わらない。**
 *
 * ⚠ **範囲は上と同じ `.fi-ta-cell` の中に留める。**表の外にも札は在るが（角丸6pxのまま）、
 *   **そちらは測っていない。**`#253` が寸法で引いた線を、ここでも同じ所に引く。
 *
 * ─── ⚠ 色の付いた札（`success` / `danger` / `warning`）は、ここでは直せない ───────────
 *
 * **測ってある。3種とも納品物と違う**（描画実測・2026-08-28。左が納品物）:
 *
 *     成功    `--color-success-50` / `--color-success-700`  ↔  Tailwind green の 50 / 700
 *     エラー  `--color-error-50`   / `--color-error-700`    ↔  Tailwind red   の 50 / 700
 *     注意    `--color-warning-50` / `--color-warning-700`  ↔  Tailwind amber の 50 / 700
 *
 * **書けない理由が2つあり、どちらも別の担当の決定が要る。**
 *
 *   1. ⚠ **このファイルに色の値は書けない。**`TheAdminPaletteFollowsTheDeliveredMockTest` の
 *      「色を直書きさせない」が禁じている。**値の唯一の出どころは `AdminPalette` である。**
 *      ——**一度16進で書いて、この検査に落とされた。正しい赤だった。**
 *   2. ⚠ **`AdminPalette` へ登録すること自体が、まだできない。**
 *      **理由は `AdminPalette::DANGER` の docblock に在る。ここへ写さない。**
 *      要点だけ: `ItemComponent` が `$color[950]` を**添字で直に**読むので、その段を持たない
 *      ランプを登録すると**利用者一覧が 500 になる**。納品物は4色とも `950` を持たない。
 *      **登録の最低条件は `50` と `950` の2段である。**
 *
 *      ⚠ **ここには「出荷CSSは3色を11段すべて参照しているので、13段を埋めないと登録できない」と
 *      書いてあった。参照は本当だが、結論が誤りだった。**
 *      **参照していることと、塗られることは別である。**11段のうち**部品規則**が引くのは
 *      `50` `100` `400` `500` `600` `700` の6段で、残る `200` `300` `800` `900` `950` を引く
 *      セレクタは `fi-bg-color-*` / `fi-text-color-*` の**任意クラスだけ**である（実測）。
 *      **「13段」は数えすぎで、登録を止めていた理由としては間違っていた。**
 *
 *      ⚠ **ただし「我々が手で書かないから出ない」ではない。**任意クラスは `ColorManager` が
 *      色地図から出す。**そちらの段は登録した値との対比率で実行時に選ばれる**ので、
 *      **既定のランプで測った段は、登録後の段を予言しない。**
 *      ⚠ **この「実行時に選ばれる」は任意クラスの側だけに掛かる。部品規則には掛からない**
 *      ——`.fi-color` は色付き部品へ無条件に付くので、**6段は対比率と無関係に当たる。**
 *      **片方だけ測って「その段は出ない」と読んだ。2度やっている。**
 *
 *      **登録すると札より広く塗り替わるのは、変わらず本当である。**
 *      `--danger-50` は `.qp-in-entry-attention` と **`.qp-ta-row-attention`**、
 *      `--danger-500` は `.qp-in-entry-attention` と `.qp-stat-bar-danger`、
 *      `--success-500` `--warning-500` はダッシュボードのカード（`.qp-stat-bar-*`）が引く。
 *      ⚠ **数えるときは説明文を落とすこと。**注釈の中の字が計数に混ざる。
 *      **測ったのは表の中の札だけである。**
 *
 * ⚠ **気づかなかったのではない。測って、ここでは直せないと分かった。**
 *   **どの段を足すかは発注者の決定であって、この本で決めることではない。**
 *   **色ごとに何が足りないかは `AdminPalette::DANGER` の docblock が名指ししている。**
 *
 * ⚠ **`primary` と `info` は、そもそも当てる相手が無い。**納品物の一覧が使う札を種別ごとに
 *   数えると `success` `error` `warning` `gray` の4種だけで、`jp-badge-primary` 6件・
 *   `jp-badge-info` 6件は**いずれも一覧の外**である。**数えて見送った。**
 *   ⚠ **ただし「納品物にその色が無い」ではない。**`info` に当たる段は
 *   `--color-blue-light-*` という**別の名札**で在る（`50` `300` `400` `500` `600`）。
 *   **`--color-info-*` を引いて0件を「無い」と読まないこと。一度そう読んで間違えた。**
 *
 * ⚠ **`jp-badge-dark`（濃い塗り）も当てていない。**納品物の `#announcement` が「非公開」だけに
 *   使っているが、**淡い／濃いの使い分けが何枚で立つかを数えていない。**別に測る。
 */
.fi-ta-cell .fi-badge:not(.fi-color),
.fi-header-heading .qp-status-badge:not(.fi-color),
.qp-status-entry .fi-badge:not(.fi-color) {
    background-color: var(--gray-100);
    color: var(--gray-700);
}

/*
 * 0件のとき。納品物は `px-4 py-10 text-center text-gray-400` の1行である。
 *
 * ⚠ **文言は動かしていない。**納品物は「該当するデータがありません」、実装は
 *   「利用者が見つかりません」と資源ごとに変える。**どちらを採るかは語の流儀の話で、この本ではない。**
 */
.fi-ta-empty-state {
    padding-block: 40px;
    padding-inline: var(--qp-table-cell-inline);
    color: var(--gray-400);
}

/*
 * ページ送りの帯。納品物は `border-t border-gray-200` に `px-5 py-4`。
 * ⚠ **升の 16px ではなく 20px である。**別の値なので別の変数から引く。
 */
.fi-pagination {
    padding-inline: var(--qp-table-footer-inline);
    padding-block: var(--qp-table-footer-block);
}

/*
 * 現在ページ。納品物は `bg-brand-500` の地に `text-white`。
 *
 * ⚠ **`--primary-500` ではなく `--primary-600` である。**納品物のブランド段は Tailwind v3 の
 *   `blue` に名札を1つずらして付けたもので、`brand-500` の実体は `#2563eb`＝v3 の `blue-600` ——
 *   `App\Filament\Support\AdminPalette` が名札を戻して登録している。**名前で寄せると1段明るくなる。**
 */
.fi-pagination-item-btn[aria-current='page'] {
    background-color: var(--primary-600);
    color: var(--color-white);
}

/*
 * ─── 読み飛ばしてはいけない1項目 ─────────────────────────────────────────────
 *
 * 詳細画面の中で、他の項目と同じ見た目で並んでいると読み飛ばされるものを囲う。
 * 納品物の「Alerts（画面内に埋め込む通知）」と同じ形である
 * （`qpark-cms-mock-master_v2.html:14817` ／ 見本は `20638`）。
 *
 *     枠   1px `error-500` ／ 角丸 `rounded-xl`（12px）
 *     地   `error-50`
 *     余白 16px（`p-4`）
 *
 * ⚠ **いま載っているのは1箇所だけである**——Vポイント付与状況の詳細の「契約上の対応方法」で、
 *   **運営がこの画面で押しても終わらないとき**にだけ付く（`VPointPayoutErrorResource`）。
 *   納品物はこの形を ticket・maintenance・login・password_reset でも使っているが、
 *   **そちらは別の本である。**ここに色の変種（warning / success / info）を先に作らない
 *   ——**使われない宣言は、次に読む人には「効いていない」と見分けが付かない。**
 *
 * ⚠ **角丸は `--radius-xl` から引く。**Filament のこの変数が 12px で、納品物の
 *   `rounded-xl` と同じ値である（どちらも実測）。**新しい数字を置かない。**
 *
 * ⚠ **印は `.fi-in-text` に載る**（`extraAttributes` の行き先。`TextEntry.php:185-188`）。
 *   色のクラス `.fi-color-danger` は**内側の `.fi-in-text-item`** に付くので、
 *   ここから読もうとしない。**同じ述語をPHP側で1つ使って、両方を出している。**
 */
.qp-in-entry-attention {
    border: 1px solid var(--danger-500);
    border-radius: var(--radius-xl);
    background-color: var(--danger-50);
    padding: 16px;
}

/*
 * 枠線ボタンと入力欄の輪。納品物は **1px の `--gray-300`**（`#d0d5dd`）である。
 *
 * ## ⚠ `border` を足さない。輪の色を替える
 *
 * 納品物は `border:1px solid var(--color-gray-300)` と書いているが、**Filament は輪
 * （`box-shadow` の `0 0 0 1px`）で描いている。**`border` を足すと**二重になって太る。**
 *
 * ⚠ **輪を消して `border` にするのも採らない。**焦点が当たると Filament は**同じ輪を
 * 太らせる**——実測で `oklch(0.546 0.215 262.881) 0 0 0 2px` になった（2026-08-28）。
 * **輪を消すと、その焦点の作りごと替えることになる。**仕組みを残して色だけ替える。
 *
 * ## ⚠ 焦点のときに素の輪を外す。ただし外し方が欄とボタンで違う
 *
 * **仕組みを残しても、素の輪を上書きすると焦点の輪まで消える。**
 * ⚠ **2026-08-28、実際に消した。**除外の無い形で書いたら、
 * 欄に焦点が当たっている（`document.activeElement` で確認済み）のに輪が
 * **素のまま**だった。**こちらの規則のほうが強く、Filament の焦点の規則が負けていた。**
 *
 * ⚠ **「輪を残す判断」と「素の輪だけ替える」は別である。**前者だけ守っても後者を外すと、
 * **運営はどの欄に入力しているのか分からなくなる。**
 * ⚠ **色を測るだけでは気づけない**——素の色は納品物どおりに出ていた。
 * **焦点を当てて、前後で変わることを見て初めて分かる。**
 *
 * ### ⚠ ボタンだけ `:focus-visible` へ寄せてある（2026-08-29）
 *
 * **はじめは両方 `:not(:focus-within)` だった。ボタンではそれが合っていない。**
 *
 * ```
 * 欄     Filament の焦点の輪は `.fi-input-wrp:…:focus-within`   → 除外も `:focus-within`
 * ボタン Filament の焦点の輪は `.fi-btn…:focus-visible`         → ⚠ 除外だけ `:focus-within` だった
 * ```
 *
 * ⚠ **食い違うのはマウスで押した瞬間である。**`:focus-within` は真、`:focus-visible` は偽になり、
 * **こちらの規則が外れ、Filament の焦点の輪も出ない。**
 *
 * ⚠ **それでも輪は消えない。下に Filament の素の輪が居るからである**——
 * `.fi-btn:not(.fi-color)` が `--tw-ring-shadow` で 1px を描いていて、
 * **この規則はそれを上書きしているだけだった。**
 * **だから起きるのは「消える」ではなく「色が変わって、その姿のまま残る」**
 * ——納品物の `--gray-300`（不透明）から `--gray-950` の10%へ。
 * ⚠ **ボタンは押したあとも焦点を保つので、運営がいちばん見る状態がその姿になる。**
 * **消えるなら誰かが気づく。色が変わったまま残るのは誰も気づかない。**
 *
 * ⚠ **`:focus-visible` へ寄せると、マウスではこちらが残り、キーボードでは外れて
 * 下の焦点の輪が出る。**実測で3状態とも確かめた（素／マウス／キーボード・2026-08-29）。
 *
 * ## ⚠ 1本で2つに効く
 *
 * 枠線ボタンと入力欄は、**同じ輪の仕組みを使っている**（どちらも実測）。
 * 納品物でも枠は同じ `--color-gray-300` なので、**1つの規則が両方の受け皿になる。**
 * 納品物の枠線ボタンは**54箇所**あり、**`<td>` の中には1つも無い**（実測。`<td>` は113個）
 * ——ページ上部・カードの中・モーダルの底・フォームの下に居る。
 * **つまりこの1本が、その54箇所ぶんの受け皿である。**
 *
 * ⚠ **ここには 73 と書いてあった（2026-08-28に訂正）。**`grep` の生の出現数で、
 * **CSS の定義ブロック（`.jp-btn-stroke{…}` とその状態3本）と散文の `<code>` を
 * 一緒に数えていた。**class 属性の中の語として数え直すと 54 である。
 * ⚠ **`<td>` の中が0という結論は動かない。**拾いすぎていたのは分子だけである。
 *
 * ## ⚠ 色クラスの無い `.fi-btn` が、納品物の枠線ボタンである
 *
 * `.fi-color` が付かない `.fi-btn`（モーダルの「キャンセル」など）が地 `#ffffff` で
 * 輪を持つ唯一の型で、納品物の `jp-btn-stroke` と対応する。**塗り・危険には輪が無い**
 * （`box-shadow: none`。実測）ので、`:not(.fi-color)` で外す。
 *
 * ⚠ **影は `--gray-900` の5%から作る。**納品物の `--shadow-theme-xs` は
 * `0 1px 2px rgba(16,24,40,.05)` で、`16,24,40` は `--gray-900`（`#101828`）である。
 * **16進を書かない**（`TheAdminPaletteFollowsTheDeliveredMockTest` が禁じている）。
 * 綴りは状態タブが先に使っているものへ揃えた——**同じ影を2通りに書かない。**
 */
.fi-btn:not(.fi-color):not(:focus-visible),
.fi-input-wrp:not(:focus-within) {
    box-shadow:
        0 0 0 1px var(--gray-300),
        0 1px 2px 0 color-mix(in oklab, var(--gray-900) 5%, transparent);
}

/*
 * 焦点の輪。納品物 `11567` `11573` `11579`（正本ブロックの中）。
 *
 * ```
 * 枠線  box-shadow: var(--shadow-theme-xs), 0 0 0 4px var(--color-gray-100)   ⚠ 素の影を残す
 * 塗り  box-shadow: 0 0 0 4px var(--jp-focus-ring-primary)                    ⚠ 素の影を置き換える
 *       同 danger  0 0 0 4px var(--jp-focus-ring-danger)
 * --jp-focus-ring-* は「その色の500を12%透過」（納品物の注釈にそう書いてある）
 * ```
 *
 * ## ⚠ 納品物が決めているのはボタンだけである
 *
 * **正本ブロック（`11411`-`11611`）の中に在る焦点の規則は、上の3本しかない**（実測）。
 * 入力欄・選択欄・チェックの `&:focus` は `4782` 付近＝**ブロックの外**で、
 * TailAdmin 側の生成物である。**だからここでは欄の焦点に触らない。**
 * ⚠ **`:focus` を素で数えると46本出るが、flatpickr / leaflet / maplibre の混入である。**
 *
 * ⚠ **`success` / `warning` / `info` の輪は作らない。**納品物が決めているのは
 * `primary` と `danger` の2色だけで、**使われない宣言は、次に読む人には
 * 「効いていない」と見分けが付かない。**
 *
 * ## ⚠ `box-shadow` を直に書かない。`--tw-ring-shadow` を替える
 *
 * Filament の焦点は `box-shadow: var(--tw-inset-shadow), …, var(--tw-ring-shadow), var(--tw-shadow)`
 * という合成である。⚠ **末尾に `--tw-shadow` が居るので、輪と影を別々に置ける**
 * ——納品物の「素の影を残したまま輪を足す」が、仕組みを壊さずに書ける。
 *
 * ⚠ **枠線ボタンは輪の枠に2層入れてある。**納品物は焦点時にも `border-color: --color-gray-300`
 * を残す（1pxの縁）が、Filament の輪の枠は1つなので、`1px` と `4px` を1つの値に並べる。
 *
 * ⚠ **重なりの順は納品物と逆である。**納品物は `影, 輪` の順で影が上、こちらは合成の都合で
 * `輪, 影` の順になる。**1px ぼけの影と 4px の輪なので差は出ないと見ているが、測っていない。
 * 「同じ」とは書かない。**
 *
 * ## ⚠ 塗りは色ごとに書く。`var(--color-500)` でまとめると1段ずれる
 *
 * **一度まとめて書いて、実測で `#3b82f6` が出た。納品物は `#2563eb` である。**
 *
 * ```
 * 納品物 brand-500 = #2563eb  ↔  実装 --primary-600   ⚠ 名札が1つずれている
 * 納品物 error-500 = #f04438  ↔  実装 --danger-500    ずれていない
 * ```
 *
 * **同じ「500」でも段が違うので、1つの規則では書けない。**
 * ⚠ **`AdminPalette::ACCENT` の docblock が理由を持っている。ここへ写さない。**
 *
 * ⚠ **`danger` はまだ登録されていない**（`AdminPalette::DANGER` は在るが `->colors()` へ渡していない。
 * 理由はその docblock に在る）。**この規則は綴りなので登録の有無に関わらず成立するが、
 * 出る色が納品物の赤になるのは登録された日からである。**
 */
.fi-btn:not(.fi-color):focus-visible {
    --tw-ring-shadow:
        0 0 0 1px var(--gray-300),
        0 0 0 4px var(--gray-100);
    --tw-shadow: 0 1px 2px 0 color-mix(in oklab, var(--gray-900) 5%, transparent);
}

.fi-btn.fi-color-primary:focus-visible {
    --tw-ring-shadow: 0 0 0 4px color-mix(in oklab, var(--primary-600) 12%, transparent);
}

.fi-btn.fi-color-danger:focus-visible {
    --tw-ring-shadow: 0 0 0 4px color-mix(in oklab, var(--danger-500) 12%, transparent);
}

/*
 * 枠線ボタンの字。納品物は `--color-gray-700`（`#344054`）で、実装は `#0c111d`
 * ＝ `--gray-950` だった（実測）。**2段濃い。**
 *
 * ⚠ **塗りと危険の字は白なので、ここでも `:not(.fi-color)` が要る。**
 * 外すと、塗りボタンの白字が灰になる。
 */
.fi-btn:not(.fi-color) {
    color: var(--gray-700);
}

/*
 * アイコンと札のあいだ。納品物は **8px**（`base` も `compact` も同じ）、
 * 実装は 6px だった（どちらも実測）。
 *
 * ⚠ **寸法はこの1つだけ直す。**高さ・余白・字・角丸は**別の本**である——
 * 納品物は2寸法（`base` 47px / `compact` 36px）を場所で使い分けており、
 * どちらへ寄せるかはボタンの居場所で決まるので、CSSだけでは決まらない。
 * ⚠ **間隔だけは、2寸法とも 8px で同じなので、居場所を決めなくても書ける。**
 * **定義でもそうだった**——納品物の `.jp-btn` は `gap: calc(var(--spacing)*2)`
 * ＝ 8px を `base`・`compact` の別なく1本で持っている（`component_catalog` 02節）。
 *
 * ⚠ **ここに「実装は1寸法しか出していない」と書いてあったのは誤りだった**
 * （2026-08-28に測って訂正）。**2つ出ている**——`fi-size-md` と、カードの中の
 * `fi-size-sm` である。下の寸法の規則がその2つを受けている。
 */
.fi-btn {
    column-gap: 8px;
}

/*
 * ボタンの寸法。**納品物の2段（`base` / `compact`）を、実装の2段へ載せる。**
 *
 * 出どころは納品物の**正本のブロック**である——`qpark-cms-mock-master_v2.html`
 * `11411`〜`11611` の201行に `JP-DESIGN-SYSTEM-START` / `-END` で囲まれた区画があり、
 * **「このファイルが正本」と書いてある。**ボタンは `11560`〜`11562`。
 * ⚠ **用例の画面から逆算していた。定義は最初から在った**——`data-page` の26枚に
 * `component_catalog`（どこで使うか・なぜそうしたか）と `styleguide`（段の一覧）も
 * 入っている。**値・段・状態は201行のほうから採る。**
 *
 *     .jp-btn          gap 8px / radius var(--radius-lg)=8px / border 1px / weight 500
 *     .jp-btn-base     font 14px（--jp-body-sm-size） padding 12px 16px
 *     .jp-btn-compact  font 12px（--jp-caption-size）  padding  8px 12px / radius --radius-md=6px
 *
 * ## どちらの段をどこへ当てるか——**居場所を数えて決めた**
 *
 * 26画面＋作成画面9枚をブラウザで走査した（2026-08-28）。**札のある `.fi-btn`：**
 *
 *     ページ上部の操作      10   md      納品物 base（「フォーム送信・モーダル確認などの主要操作」）
 *     表のヘッダ            17   md      同上（「新規作成」）
 *     タブの中など           4   md      同上
 *     モーダルの底           2   md      同上（「設定を保存」「キャンセル」）
 *     カードの中「◯◯を追加」 4   sm      納品物 compact
 *
 * **33 対 4。**だから **`md` を base、`sm` を compact** として受ける。
 * ⚠ **`app/` に `->size(` は1件も無い**（実測）。この2つは我々が当てた値ではなく、
 * **Filament 自身の既定が2通りしか出ていない**ということである——素の `null` が `md`、
 * カード側の容器（`Section` / `Actions` / `Field` など14箇所）が `defaultSize(Small)`。
 * **納品物の2段と、実装に出ている2段が、1対1で対応している。**
 * ⚠ **だから `->size()` を書いて増やさないこと。**
 * `TheButtonSizesFollowTheDeliveredMockTest` が `app/Filament/` を見張っている。
 *
 * ## ⚠ 行の操作には当たらない。当ててはいけない
 *
 * 表の行の操作は **`.fi-link` 295個**（17画面・実測）で、**`.fi-btn` ではない。**
 * `⋯` と絞り込みは `.fi-icon-btn` 38個で、これも別のクラスである。
 * ⚠ **`Action` は1つの型で3つの姿を持つので、PHP 側で既定を差し替えると
 * 314個を巻き添えにする。**CSS でクラスを名指しすれば当たらない——
 * **当ててから295個と38個を測り直し、1つも動かないことを確かめた。**
 *
 * 納品物の側も同じ形である。⚠ **カタログの説明文は `compact` を
 * 「テーブル行内アクション等」と言うが、26画面の `<td>` の中に `jp-btn-compact` は
 * 0個**である（`jp-btn-base` も0個）。**行の操作は `jp-menu-item` 60箇所**で、
 * うち **21個が `<td>` の直下**に居る（残りはドロップダウンの中）。
 * ⚠ **カタログの説明文は、納品物自身の画面より弱い。**
 *
 * ⚠ **`jp-menu-item` を最初 94 と数えた（2026-08-28に訂正）。**`grep` の生の出現数で、
 * **`jp-menu-item-icon` 32件を部分一致で拾っていた。**同じ数え方で `jp-btn-compact` も
 * 31 を 32 と数えている。**class 属性の中の語として数えること。**
 *
 * ## ⚠ `line-height` は「足す」のではなく「Filament の上書きを外す」
 *
 * 納品物の `.jp-btn` は `line-height` を**宣言していない**（`normal` のまま）。
 * Filament は単位無しの `1.42857`（＝20/14）を当てている。⚠ **単位が無いので字を12pxへ
 * 下げると行の高さも 17.14px へ縮む**——`compact` を font だけ下げたら **h=33.1** に
 * なった（実測）。`normal` へ戻すと 18px になり、**納品物と同じ仕組みに戻る。**
 * **宣言を足しているのではなく、上書きを外している。**
 *
 * ⚠ **21px という数値のほうを写さないこと。**納品物の正本ブロックは、冒頭で
 * **「Typography調整: Noto Sans JPへの素の置き換え（line-height等は未調整・見た目判断用）」**
 * と自分で言っている（`11412`）。しかも同じブロックは 14px の文字に
 * `--text-theme-sm--line-height: 22px` を確定させているのに、**`.jp-btn` はそれを引いていない**
 * （`font-size` しか書いていない）。⚠ **つまり納品物の中に 21px と 22px が並んでいて、
 * ボタンがどちらに乗るのかは決まっていない。**
 * **決まっていない数値を写すのではなく、決まっている仕組み（`normal`）を写す。**
 *
 * ⚠ **その代わり、高さがこの機械のフォントに依るようになる。**
 * **開発機で 45px、CI で 44px だった**（2026-08-28、実測。ブラウザの検査が落ちて分かった）。
 * 管理画面は**webフォントを積んでいない**——`--qp-font` は
 * `'Noto Sans JP', 'Hiragino Sans', …` という OS 任せの並びである（`QP-TECH-070`）。
 * ⚠ **日本語フォントの在る機械と無い機械では、そもそも字そのものが違う。
 * 1px の高さは、その症状のいちばん小さい出方にすぎない。**
 *
 * ⚠ **それでも `normal` を選ぶ。**Filament の `1.42857` や納品物の 21px を焼くと、
 * **フォントを積んだ日に、その数値のほうが間違いになる**（`QP-TECH-070` を直すと
 * `normal` はちょうど納品物の 21px になる）。
 * **`normal` は、フォントが直ったときに正しくなる側である。**
 *
 * ## ⚠ 高さは 2px 合わない。合わせに行かない
 *
 *     実測      base  45（納品物 47）   compact 34（納品物 36）
 *     差の出どころ  納品物の `border: 1px` × 上下 = 2px
 *
 * **Filament は枠線を `box-shadow: 0 0 0 1px` の輪として箱の外へ描く**ので、高さに乗らない。
 * ⚠ **`border` を足して埋めない**——`#271` で実際に焦点の輪を壊した形である。
 * **描かれる線の太さは同じで、箱の内か外かが違うだけである。**
 * ⚠ **同じ2pxが入力欄にも出ている**（納品物44 / 実装36〜40）。
 * **部品ごとの話ではなく、系全体で1つの差である。**
 *
 * ## ⚠ Filament の「段ごとの負の margin」は、置き去りにしていない
 *
 * 配信済み `app.css` に、**ボタンの段ごとに刻んだ負の margin** が在る。
 * class を変えずに見た目だけ替えるこの書き方だと、**理屈の上では取り残される。**
 *
 *     .fi-ta-ctn .fi-ta-header .fi-ta-actions:has(.fi-btn.fi-size-md:not(.fi-dropdown-panel *))
 *     .fi-section>.fi-section-header>.fi-section-header-after-ctn:has(…)
 *         xs -2px ／ sm -4px ／ md -6px ／ lg -8px ／ xl -10px
 *
 * **描いて測った。サイドバーの26画面＋作成画面2枚の、28枚ぜんぶである。**
 * 各画面で2つの状態を作って、容れ物の座標と高さを丸ごと突き合わせた——
 * **①規則だけ当てた状態**と、**②補正も xl の値（-10px）へ替えた状態。**
 *
 *     この規則が実際に当たる画面    7 / 28
 *       park-publication / missions-titles-and-rankings / v-point-treasury-and-budget
 *       expert-user-settings / quest-classification-master / sponsor-tie-ups
 *       user-experience-settings
 *     ①と②で座標か高さが動いた画面  ⚠ 0 / 28
 *
 * ⚠ **当たる7画面でも、`-6px` を `-10px` へ替えて1pxも動かない。**
 * 帯の高さ・ボタンの位置・見出しとの距離、すべて同じである。
 * **操作の容れ物が、その行でいちばん背の高い物になっていないから**で、
 * **負の block margin が噛む形になっていない。**
 *
 * ⚠ **ダッシュボードの1枚だけ、この数え方が弱い。**iframe の中では
 * `document.hidden` が真になり `IntersectionObserver` が発火しないので、
 * **遅延読み込みのウィジェットが出ないまま数えている。**
 * ただしあの画面は `__lazyLoad` を直接呼んで起こしたうえで数えても
 * **`.fi-btn` が0個**なので（別途実測）、当たりようがない。
 *
 * ⚠ **だから補正の規則は足さない。**足しても何も変わらないので、
 * **「効いていること」を誰も測れない規則が1本増えるだけである。**
 * ⚠ **もし将来この容れ物が行でいちばん背の高い物になったら、4pxが出る。**
 * そのときに足す。
 *
 * ⚠ **最初、`staff-and-permissions` 1枚を見て「この規則はどこにも当たっていない」と読んだ。**
 * あの画面では操作が `.fi-ta-header-toolbar` の下に居て `.fi-ta-header` の下に居ない。
 * **1枚で決めると逆の結論が出る形だった。**
 *
 * ## ⚠ ドロップダウンの中のボタンにも当たる
 *
 * Filament は上の補正から `:not(.fi-dropdown-panel *)` で中身を外しているが、
 * **こちらの規則は外していない。**絞り込みの「フィルタを適用」は 36px → 45px になる（実測）。
 * ⚠ **はみ出さない**——パネルは 213px で、下端まで 24px 空いている（実測）。
 * **納品物の言葉では「フォーム送信」＝ base なので、寄せる先はこれで合っている。**
 */
.fi-btn.fi-size-md {
    padding-block: 12px;
    padding-inline: 16px;
    line-height: normal;
}

.fi-btn.fi-size-sm {
    padding-block: 8px;
    padding-inline: 12px;
    font-size: 12px;
    line-height: normal;
    border-radius: 6px;
}

/*
 * 入力欄の寸法。**納品物の主寸法は 44px で、しかも高さを直に宣言している。**
 *
 * 出どころは `component_catalog` 05 — Form。⚠ **ボタンと違って `jp-*` の部品が無く、
 * Tailwind の並びで書いてある。**
 *
 *     jp-body-sm shadow-theme-xs h-11 w-full rounded-lg border border-gray-300
 *     bg-transparent px-4 py-2.5 …
 *
 *     h-11 = 44px  ⚠ 高さが直に書いてある   px-4 = 16px   py-2.5 = 10px
 *     rounded-lg = 8px   border 1px   jp-body-sm = 14px / line-height 22px
 *
 * ## ⚠ 「納品物は全部 44px」ではない。3寸法ある
 *
 * **26画面の `<input>` `<select>` `<textarea>` を、宣言されている `h-*` で数えた。**
 *
 *     h-11（44px）  85箇所   フォームの欄・表の検索・選択欄。**主寸法**
 *     h-10（40px）  15箇所   ⚠ **可変行テーブルの `<td>` の中の編集欄**（12件中9件が `<td>`）
 *     h-9 （36px）   3箇所   ⚠ **納品物の動作確認用**（`※確認用：認証結果パターン`）。UIではない
 *
 * ⚠ **最初「用例の5画面を描いて測ったら全部 44 だった」で全部と書きかけた。**
 * **開いた画面がたまたま `h-11` の側だっただけである。**宣言を数えて3つに割れた。
 *
 * **`h-10` は実装に相手が居ない。**表の中の入力欄を8画面で数えて **0個**（実測）。
 * 納品物が可変行テーブルでやっていることを、実装は**繰り返し欄**でやっている
 * （`今日の10問 作成` は繰り返し欄2個・その中の入力欄8個）。⚠ **表ではないので、
 * 表の中用の寸法ではなく、フォームの寸法（44px）が相手になる。**
 * **`h-9` は納品物の仕掛けなので、相手を作らない。**
 *
 * ## ⚠ ボタンの本の結論を、そのまま持ち込まないこと
 *
 * **ボタンでは高さを追わなかった。**納品物が高さも `line-height` も宣言しておらず、
 * 差の2pxは「枠線を箱の外の輪として描く」という系全体の違いだったからである。
 *
 * ⚠ **入力欄は違う。**`h-11` は**宣言された要求**で、`jp-body-sm` は**確定した段**
 * （`--text-theme-sm--line-height: 22px`）を引いている。**44px は追う。**
 *
 *     ボタン   45 対 47 = 2px   ← border。追わない
 *     入力欄   36 対 44 = 8px   ← ⚠ padding だけで説明が付く。追う
 *
 * ⚠ **そして 44 が揃うのは偶然である。**内訳が違う。
 *
 *     納品物  10 + 10 + 22(行) + 2(枠線)  = 44
 *     実装    10 + 10 + 24(行) + 0(輪)    = 44
 *
 * **`compact` の36と `md` の36が偶然一致したのと同じ形なので、「揃った」と書かずに内訳を残す。**
 * ⚠ **`line-height` は触らない。**24 を 22 にすると 42px になり、**宣言された 44 から外れる。**
 *
 * ## ⚠ 要素で限定すること。クラスだけで書くと器が膨らむ
 *
 * `.fi-select-input` は **`select` と `div` の両方に付く**（`div` は検索付き選択欄の器）。
 * ⚠ **クラスだけで `padding-block` を当てたら、器が 36px から 64px になった**（実測）。
 * **`select.` と `button.` を頭に付けて限定する。**
 *
 * ## 選択欄の右側は触らない
 *
 * 納品物の選択欄は `pl-4 pr-11`（左16・右44）。**左は揃えるが、右は 32px のままにする。**
 * ⚠ **右の余白は山形（chevron）を避けるためのもので、山形は実装側が描いている**
 * ——`background-position: calc(100% - 8px)` / `21px`（実測）。**29px ぶんしか要らない。**
 * **納品物の44は納品物の山形の寸法**なので、写すと**無い物のために字を寄せる**ことになる。
 *
 * ## 何が一緒に動くか（実測。当てた前後で数えた）
 *
 *     動く    input.fi-input          フォーム・表の検索・トップバーの全体検索  36 → 44
 *             select.fi-select-input      36 → 44
 *             button.fi-select-input-btn  36 → 44（検索付き選択欄）
 *             .fi-input-wrp textarea      余白のみ（高さは行数で決まる。84px のまま）
 *     動かない 表の行の高さ  [73,51,51] のまま
 *     動く    表ヘッダの帯  61 → 69（park-publication）／ 70 → 70（staff。他の物が背が高い）
 *
 * ⚠ **トップバーの全体検索も 44 になる。納品物にこれに当たる物は無い**
 * （26画面を数えて、殻の側の `input` は**0個**）。**納品物に無い物なので、
 * 除外する規則も書かない**——除外は納品物が作っていない区別を作ることになる。
 *
 * ## ⚠ テキストエリアは「納品物に無い」ではなかった
 *
 * **最初「カタログにも26画面にも1つも無い」と書いた。誤りである。**
 * ⚠ **3箇所ある**（`announcement` / `meta_prediction` / `component_catalog`）。
 * **描いて数えたときに、その画面を開いていなかっただけ**で、宣言を数えたら出てきた。
 *
 *     jp-body-sm shadow-theme-xs w-full rounded-lg border border-gray-300 px-4 py-2.5
 *     ⚠ `h-*` は無い（高さは `rows` で決まる）。**余白は入力欄と同じ 10 / 16。**
 *
 * **だから縦も横も揃える。高さだけは触らない**——`rows` で決まるもので、納品物も
 * `h-*` を書いていない。
 * ⚠ **`textarea` にはクラスが1つも付いていない**ので、器から辿るしかない（実測）。
 */
.fi-input {
    padding-block: 10px;
    padding-inline: 16px;
}

select.fi-select-input,
button.fi-select-input-btn {
    padding-block: 10px;
    padding-inline-start: 16px;
}

.fi-input-wrp textarea {
    padding-block: 10px;
    padding-inline: 16px;
}

/*
 * 打った値の字（発注者の指示・2026-08-31）。
 *
 * 納品物の入力欄は **gray-800**、出荷CSSは **gray-950** である
 * （`input.fi-input{color:var(--gray-950)}`。配信済みの `app.css` から読んだ。2026-08-31）。
 *
 *     納品物の `<input>`  129本
 *       色を宣言しているもの  72本 → **800 が71本**
 *       残る1本は gray-500 で `type="file"`
 *       ⚠ アップロード欄は Filament では `input.fi-input` にならない（別の器）
 *       残り57本は色を持たない check / radio / range / file
 *
 * ⚠ **数えるときは静的な `class="…"` だけを見ること。**納品物は Alpine の
 *   `:class="…"` も持っていて、**素朴に `class="` で拾うと動的なほうを掴む**
 *   ——それで一度 56/72 と出た。**16本ぶん取り違える。**
 *
 * ## ⚠ `:disabled` を外すこと。止めた欄が濃くなる
 *
 * 出荷CSSは止めた欄を `input.fi-input:disabled{color:var(--gray-500)}` で薄くしている。
 * **このファイルは `@layer` の外なので、素の `input.fi-input` と書くとそこにも勝つ**
 * ——**止めた欄が gray-800 になり、押せる欄と見分けが付かなくなる。**
 * ⚠ **画面では薄いままに見える。**出荷CSSが `-webkit-text-fill-color` も当てていて、
 *   あちらは打ち消していないからである。**見えないだけで、`color` の側では勝っている。**
 *   **見えない食い違いを残さない**ので、こちらで避ける。
 *
 * ## ⚠ 打った値を映す器を、4つとも同じ段にする。途中で止めない
 *
 * 納品物は **`select` 30/30・`textarea` 3/3 も 800** である（`input` の 71/72 より純粋）。
 * 出荷CSSはどれも gray-950 を当てている
 * （`input.fi-input` ／ `select.fi-select-input` ／ `.fi-select-input .fi-select-input-btn` ／
 * `.fi-fo-textarea textarea`。実測 2026-08-31）。
 *
 * ⚠ **一度「入力欄だけ」で出しかけて、止めた。**
 *
 *     いま       3つとも 950   ⚠ 揃ってはいる。納品物より濃いだけ
 *     入力欄だけ  入力欄 800 ／ 選択欄・複数行欄 950
 *                ⚠ 同じフォームの中で1段ずれる。**いま無いずれを、寄せる側が作る**
 *     4つとも    納品物と一致
 *
 * **「寄せる」つもりの粗が新しいずれを生む形なので、やるなら全部・やらないなら0である**
 * （発注者へ通したうえでの決定・2026-08-31）。
 *
 * ⚠ **選択欄は2つある。**素の `select` と、検索付き選択欄の `button` である。
 * **片方だけ寄せると、同じ「選択欄」の中でずれる。**このファイルは余白のほうでも
 * 既に2つ並べて書いている（すぐ上）。**色でも同じ組にする。**
 *
 * ⚠ **複数行欄だけ器の名前が違う。**余白は `.fi-input-wrp textarea` で当てているが、
 * **色は `.fi-fo-textarea textarea` で当てる**——**出荷が 950 を塗っているのがそちらだからである。**
 * `.fi-input-wrp` で書くと、**出荷が塗っていない `textarea`（他の部品の中の物）まで
 * こちらだけが塗る**ことになる。**塗る相手を出荷と一致させる。**
 *
 * ⚠ **検索付き選択欄の `button` にだけ、出荷は `:disabled` の色を持たない。**
 * それでも `:not(:disabled)` を付けているのは、**4つの意図を1つに揃えておくため**である
 * ——**止めた欄の見え方は出荷に任せる。**
 */
input.fi-input:not(:disabled),
select.fi-select-input:not(:disabled),
button.fi-select-input-btn:not(:disabled),
.fi-fo-textarea textarea:not(:disabled) {
    color: var(--gray-800);
}

/*
 * ─── モーダル ───────────────────────────────────────────────────────────────
 *
 * 納品物のモーダルは **13枚とも構造の値が同じ**である（`qpark-cms-mock-master_v2.html`。
 * 画面に13枚、カタログに6枚。⚠ **カタログの6枚を外しても定義は変わらない**——
 * 13枚が同じ値を13回言っている）。
 *
 * ```
 * 角丸       rounded-3xl                             13/13
 * 余白       p-6 lg:p-10                             13/13
 * 地         bg-white                                13/13   ← 実装と一致
 * overlay    bg-gray-400/50 ＋ backdrop-blur-[32px]  13/13
 * 閉じる     右16px・上16px                          11/13   ← 実装と一致
 * 幅         480px ×8 ／ 600px ×5
 * ```
 *
 * ## ⚠ 幅は「揃っていない」ではなく「同じ考え方で目盛りが違う」だった
 *
 * `CanOpenModal::getModalWidth()` は**明示が無いとき2つに分ける**——
 * 確認が要るなら `Width::Medium`（448px）、それ以外は `Width::FourExtraLarge`（896px）。
 * **実装は既に「確認系とそれ以外」で分けていた。**納品物も2つの値しか使っていない。
 * ⚠ **大小を保つ写し方は1通りしかない**ので、目盛りだけ動かす。
 *
 * ⚠ **画面ごとに納品物と同じほうを選ばせることは、ここではできない。**
 * 納品物の割り当ては規則になっていない——**「〜しますか？」の確認が 600px 側に2枚在る**
 * （チケットの補正／再処理の実行）。**中身の量で1枚ずつ選ばれている。**
 * やるなら 21箇所へ `->modalWidth()` を書くことになり、**1画面ずつの決定になる。**
 * **発注者へ返してある。**
 *
 * ⚠ **`fi-width-lg` を明示している1件（`EditStaffAccount`）は 512px のまま残る。**
 * **「全部揃えた」とは言えない。**納品物に 512px は無いが、
 * **あれは明示された幅なので、CSS で黙って動かさない。**
 *
 * ## ⚠ 余白は器が違う
 *
 * 納品物は外枠1つに `p-6 lg:p-10` を掛けるが、**Filament は header / content / footer に
 * 分けて持っている。**外枠に書いても効かないので、**3つへ同じ値を配る。**
 * ⚠ **`lg` は 1024px。**納品物の Tailwind の既定と同じ。
 *
 * ## ⚠ アイコンの地は1段ちがう
 *
 * 納品物は色の `50` 段（`fill-error-50`）、出荷CSSは `--color-100`。
 * ⚠ **`#283` で意味色4つが11段になるまで、`50` を持たない色が在って当てられなかった。**
 * **いまは4色とも持っている。**
 */
.fi-modal:not(.fi-modal-slide-over):not(.fi-width-screen)
    > .fi-modal-window-ctn
    > .fi-modal-window {
    border-radius: 24px;
}

.fi-modal > .fi-modal-close-overlay {
    background-color: color-mix(in oklab, var(--gray-400) 50%, transparent);
    backdrop-filter: blur(32px);
}

.fi-modal > .fi-modal-window-ctn > .fi-modal-window.fi-width-md {
    max-width: 480px;
}

.fi-modal > .fi-modal-window-ctn > .fi-modal-window.fi-width-4xl {
    max-width: 600px;
}

.fi-modal > .fi-modal-window-ctn > .fi-modal-window .fi-modal-icon-bg.fi-color {
    background-color: var(--color-50);
}

@media (min-width: 1024px) {
    .fi-modal:not(.fi-modal-slide-over)
        > .fi-modal-window-ctn
        > .fi-modal-window
        :is(.fi-modal-header, .fi-modal-content, .fi-modal-footer) {
        padding-inline: 40px;
    }

    .fi-modal:not(.fi-modal-slide-over)
        > .fi-modal-window-ctn
        > .fi-modal-window
        .fi-modal-header {
        padding-top: 40px;
    }

    .fi-modal:not(.fi-modal-slide-over)
        > .fi-modal-window-ctn
        > .fi-modal-window
        .fi-modal-content {
        padding-block: 40px;
    }
}

/*
 * 通知（トースト）。納品物 `11538`-`11556`（正本ブロックの中・**19規則**）。
 *
 * **`Notification::make` は82箇所に在り、我々の CSS には規則が1本も無かった**（実測 2026-08-29）。
 * 内訳は `success` 72 / `danger` 7 / `warning` 5 / `info` 3。
 * ⚠ **PHP は1箇所も触らない。**82箇所は納品物と同じ姿になるだけである。
 *
 * ## ⚠ 色は `.fi-color` から取れない。`.fi-status-*` を名指しする
 *
 * `->success()` が入れるのは `color` ではなく `status`（`HasStatus`）である。実測した姿:
 *
 * ```
 * 根        fi-no-notification fi-status-success     ⚠ fi-color は付かない
 * アイコン   fi-color fi-color-success fi-no-notification-icon fi-icon fi-size-md
 * ```
 *
 * ⚠ **`--color-N` の張り替えはアイコンにしか掛かっていない。**だから下辺の帯は
 * `var(--color-500)` では書けず、**4色を名指しする**ことになる。
 * ⚠ **`:has()` は要らない**——`fi-status-*` は根に在る。
 *
 * ⚠ **`.fi-no-notification.fi-color` の地色替えは、出荷CSSに在るが当たっていない**
 * （根に `fi-color` が付かないため）。**地は白のままで、納品物と一致している。**
 *
 * ## ⚠ 引く段は、すべて納品物の値である
 *
 * `#283` が4色を11段にして登録したが、**足りない段は `*_FILLED_IN` に分けて置いてある**
 * （あちらの docblock が「納品物の値ではない」と書いている）。
 * **トーストが引くのは `50` / `500` / `600` だけで、11段とも納品物の側に在る**（実測）。
 * ⚠ **作った値を1つも引かない。**`TheToastFollowsTheDeliveredShapeTest` がそれを見張る。
 *
 * ⚠ **`info` だけアイコンの字が `500` である。**他の3色は `600`。
 * **納品物 `11549` がそう書いている**（`--color-blue-light-500`）。**揃えない。**
 *
 * ## ⚠ アイコンの箱は svg 自身に作る。器が無い
 *
 * 納品物は 40×40 の箱の中に 24×24 の svg を置くが、**Filament は箱を出さない**
 * ——`.fi-no-notification-icon` は **svg そのもの**である。
 * **だから `padding` と地色で箱にする**（`box-sizing: border-box` で 40 − 8×2 = 24）。
 * ⚠ **ブラウザで実測した**（外形 40.0×40.0 ／ 中の絵 24.0 ／ 地 `--success-50` ／ 字 `--success-600`・2026-08-29）。
 *
 * ## ⚠ 題の段は、説明文の有無で変わる
 *
 * 納品物は `.jp-toast-title`(16px) と `.jp-toast-title-sm`(14px) を持つ。
 * **実装には綴りが1つしか無いので、`:has(.fi-no-notification-body)` で分ける。**
 * ⚠ **説明文が無いと `fi-no-notification-body` は出力されない**（実測）ので、これで分かれる。
 *
 * ## ⚠ 落としたもの: アイコンと字のあいだの間隔
 *
 * 納品物は `.jp-toast`（本文と閉じるの間・12px）と `.jp-toast-body`（アイコンと字の間・16px）で
 * **2つの間隔を持つ**が、**実装は `.fi-no-notification` の1つの `gap` が3つ全部を決めている。**
 * **構造が違うので、片方だけ替えられない。**⚠ **12px のまま残した**——
 * **「16px にする」には器を1つ増やすことになり、それは CSS の本ではない。**
 */
.fi-no-notification:not(.fi-inline) {
    max-width: 360px;
    border-radius: var(--radius-md);
    border-bottom-width: 4px;
    padding: 12px;
    box-shadow:
        0 12px 16px -4px color-mix(in oklab, var(--gray-900) 8%, transparent),
        0 4px 6px -2px color-mix(in oklab, var(--gray-900) 3%, transparent);
}

.fi-no-notification.fi-status-success {
    border-bottom-color: var(--success-500);
}

.fi-no-notification.fi-status-danger {
    border-bottom-color: var(--danger-500);
}

.fi-no-notification.fi-status-warning {
    border-bottom-color: var(--warning-500);
}

.fi-no-notification.fi-status-info {
    border-bottom-color: var(--info-500);
}

.fi-no-notification .fi-no-notification-icon {
    box-sizing: border-box;
    width: 40px;
    height: 40px;
    border-radius: var(--radius-lg);
    padding: 8px;
}

.fi-no-notification.fi-status-success .fi-no-notification-icon {
    background-color: var(--success-50);
    color: var(--success-600);
}

.fi-no-notification.fi-status-danger .fi-no-notification-icon {
    background-color: var(--danger-50);
    color: var(--danger-600);
}

.fi-no-notification.fi-status-warning .fi-no-notification-icon {
    background-color: var(--warning-50);
    color: var(--warning-600);
}

.fi-no-notification.fi-status-info .fi-no-notification-icon {
    background-color: var(--info-50);
    color: var(--info-500);
}

.fi-no-notification .fi-no-notification-title {
    font-size: 14px;
    font-weight: 600;
    line-height: 1.4;
    color: var(--gray-800);
}

.fi-no-notification:has(.fi-no-notification-body) .fi-no-notification-title {
    font-size: 16px;
}

.fi-no-notification .fi-no-notification-body {
    margin-top: 4px;
    font-size: 14px;
    line-height: 22px;
    color: var(--gray-500);
}

.fi-no-notification .fi-no-notification-close-btn {
    color: var(--gray-400);
}

.fi-no-notification .fi-no-notification-close-btn:hover {
    color: var(--gray-700);
}

/*
 * ⚠ **折れる場所を持たない字を、どこででも折る。**
 *
 * `->wrap()` が付けるのは `white-space: normal` までで、**それは「折ってよい」としか
 * 言っていない。** `.` や `_` しか無い字は、⚠ **折ってよくても折る場所が無い。**
 *
 * ⚠ **`承認host`（`ApprovedExternalDestinationResource`）が付けている目印である。**
 * **片方だけ消えると黙って効かなくなる**ので、**目印とこの規則が揃っていることを
 * `TheSponsorCodesFallOntoASecondLineTest` が見る**
 * ——`qp-question-repeater` で1度踏んだのと同じ形である。
 *
 * ⚠ **広く配らないこと。**`-` を持つ字は普通の折り返しで折れるので、
 * **重ねる理由が無い**（実測: 符丁の列は `->wrap()` だけで 0px に戻る）。
 */
.qp-break-anywhere {
    overflow-wrap: anywhere;
}

/*
 * 表の札を折り返す印（2026-10-14・利用者の詳細の「Vチケットの出入り」の取引種別。発注者の答え 124）。
 * 札（`.fi-badge`）は出荷CSSで1行に固定されているので、升の字の折り返し（`->wrap()`）だけでは折れない。
 * 一括付与の行の札は運営が付けた名前（最大50字）で、1行のままだと表を横へ押し出して右の列を隠す。
 * 印を付けた升の札だけを折る（`.fi-badge` を素で書くと入力欄・情報欄・通知まで動く）。
 *
 * 語の切れ目でだけ折る（`word-break: auto-phrase`）。普通の折り方だと「ジャックポ／ット挑戦」と語の途中で折れた
 * （2026-10-14・統合役の 8095 実ブラウザ）。日本語の文節で折るので、頁の `lang="ja"` が要る。
 * ⚠ 効くのは Chromium の系統だけで、ほかのブラウザはこの宣言を読まずに普通の折り方へ戻る（表がはみ出すことはない）。
 */
.qp-wrap-badges .fi-badge,
.qp-wrap-badges .fi-badge * {
    white-space: normal;
    word-break: auto-phrase;
}

/*
 * **運営が読む本文の改行を残す**（R2-054。お問い合わせの内容、ヘルプ記事の質問・見出しと本文）。
 *
 * ⚠ **`whitespace-pre-wrap` を付けていたが、効いていなかった。**このパネルは Tailwind を組み立てていない
 * （冒頭の註）ので、Filament の出荷 CSS に無い Tailwind の字は、管理画面ではただの飾りである。
 * 長い URL などの1語がはみ出さないよう、`qp-break-anywhere` と同じ折り方も重ねる。
 */
.qp-keep-line-breaks {
    white-space: pre-wrap;
    overflow-wrap: anywhere;
}

/*
 * 画像の用途ごとの「画像」1欄（2026-09-24。`App\Filament\Support\ManagedImagePicker`）。
 *
 * 形は承認済みの画面案 `vquest-admin-wireframe.html` の `.main-image-*` と `.image-library*` に寄せる。
 * ⚠ **色は直書きしない**（このファイルの冒頭の決まり）。パレットの変数だけを引く。
 */
.qp-image-picker {
    display: grid;
    gap: 0.625rem;
}

.qp-image-picker__file {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
}

.qp-image-picker__drop {
    display: flex;
    align-items: center;
    gap: 1rem;
    width: 100%;
    min-height: 7.5rem;
    padding: 1.5rem;
    border: 1px dashed var(--gray-300);
    border-radius: 0.75rem;
    background: var(--gray-50);
    color: var(--gray-700);
    text-align: start;
    cursor: pointer;
}

.qp-image-picker__drop:hover,
.qp-image-picker__drop--dragging {
    border-color: var(--primary-600);
    background: var(--primary-50);
}

.qp-image-picker__drop-icon {
    flex: none;
    width: 2rem;
    height: 2rem;
    color: var(--primary-600);
}

.qp-image-picker__drop-copy {
    display: grid;
    gap: 0.25rem;
}

.qp-image-picker__drop-copy small,
.qp-image-picker__help,
.qp-image-picker__note,
.qp-image-picker__detail,
.qp-image-picker__status {
    color: var(--gray-500);
    font-size: var(--qp-label-size);
}

.qp-image-picker__open,
.qp-image-picker__text-button {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    justify-self: start;
    padding: 0;
    border: 0;
    background: none;
    color: var(--primary-600);
    font-weight: 600;
    cursor: pointer;
}

.qp-image-picker__open-icon {
    width: 1rem;
    height: 1rem;
}

.qp-image-picker__text-button--remove,
.qp-image-picker__error,
.qp-image-picker__warning {
    color: var(--danger-600);
}

.qp-image-picker__current {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem;
    align-items: flex-start;
    padding: 1rem;
    border: 1px solid var(--gray-200);
    border-radius: 0.75rem;
}

.qp-image-picker__thumb {
    display: grid;
    place-items: center;
    flex: none;
    width: 8rem;
    aspect-ratio: 4 / 3;
    overflow: hidden;
    border-radius: 0.5rem;
    background: var(--gray-100);
}

.qp-image-picker__thumb img,
.qp-image-picker__choice img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.qp-image-picker__copy {
    display: grid;
    flex: 1 1 14rem;
    gap: 0.25rem;
    min-width: 0;
}

.qp-image-picker__filename,
.qp-image-picker__choice strong {
    overflow-wrap: anywhere;
}

.qp-image-picker__source {
    justify-self: start;
    padding: 0.125rem 0.5rem;
    border-radius: 999px;
    background: var(--gray-100);
    color: var(--gray-700);
    font-size: var(--qp-label-size);
}

.qp-image-picker__source--uploaded {
    background: var(--primary-50);
    color: var(--primary-700);
}

.qp-image-picker__actions {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem 1rem;
    margin-top: 0.25rem;
}

.qp-image-picker__duplicate {
    display: grid;
    gap: 0.5rem;
    padding: 0.75rem 1rem;
    border: 1px solid var(--gray-200);
    border-radius: 0.5rem;
    background: var(--gray-50);
}

.qp-image-picker__library {
    display: grid;
    gap: 0.75rem;
    padding: 1rem;
    border: 1px solid var(--gray-200);
    border-radius: 0.75rem;
}

.qp-image-picker__library-head {
    display: flex;
    justify-content: space-between;
    gap: 1rem;
}

.qp-image-picker__library-head p {
    color: var(--gray-500);
    font-size: var(--qp-label-size);
}

.qp-image-picker__search {
    width: 100%;
    padding: 0.5rem 0.75rem;
    border: 1px solid var(--gray-300);
    border-radius: 0.5rem;
}

.qp-image-picker__grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(9rem, 1fr));
    gap: 0.75rem;
}

.qp-image-picker__choice {
    display: grid;
    gap: 0.25rem;
    padding: 0.5rem;
    border: 1px solid var(--gray-200);
    border-radius: 0.5rem;
    background: none;
    text-align: start;
    cursor: pointer;
}

.qp-image-picker__choice > img,
.qp-image-picker__choice > .qp-image-picker__no-preview {
    aspect-ratio: 4 / 3;
    border-radius: 0.375rem;
    background: var(--gray-100);
}

.qp-image-picker__choice[aria-pressed='true'] {
    border-color: var(--primary-600);
    box-shadow: 0 0 0 1px var(--primary-600);
}

.qp-image-picker__no-preview {
    display: grid;
    place-items: center;
    color: var(--gray-500);
    font-size: var(--qp-label-size);
}

/*
 * **回答形式のカード**（`App\Filament\Support\FormatCards`。Vクエストの「答え方を選ぶ」とジャックポットの「回答形式を選ぶ」）。
 *
 * ⚠ **形の出どころは承認済みの画面案**（`vquest-admin-wireframe.html` の `.format-grid`／`.format-card`、
 * `jackpot-admin-wireframe.html` の同じ部品。2026-09-25・依頼 v1）。上の納品物ではない。
 *
 * - 色は画面案の16進をいちばん近いパレットの名前へ置いた（この家は色を直書きしない。冒頭の註）:
 *   枠 #dce2ec → gray-200／触れた枠 #87a9e5 → primary-300／選んだ枠と ✓ #2563eb → primary-600（同じ値）／
 *   選んだ背景 #f6f9ff → primary-50／記号と一言 #677c9b・#617086 → gray-500
 * - 名前と一言は、納品物の型の下端 12px（`--qp-label-size`）。画面案は 11px・9px（全体が小さい縮尺で描かれている）。
 *   記号は画面案の 15px のまま
 * - 太さ（依頼 v4 の1・2。a8 の差 DETAIL-GLYPH・DETAIL-NAME-WEIGHT）: 名前は画面案の `strong` の既定の 700。
 *   記号は画面案の 600 より一段太い 700——この器には字体の並びの先頭 Noto Sans JP が無く、次のヒラギノ角ゴで描かれる。
 *   600 だと W5 になり、画面案の見え方（W6）より線が細い
 * - 選んだ形は `:has(input:checked)` で描く——押した瞬間に変わり、サーバの往復を待たない
 * - 押せないカード（下書きの編集・公開した回）は、選んだ印を残して全体を灰色にする
 */
.qp-format-cards {
    display: grid;
    grid-template-columns: repeat(var(--qp-format-count, 5), minmax(0, 1fr));
    gap: 8px;
}

@media (max-width: 1100px) {
    .qp-format-cards {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }
}

@media (max-width: 520px) {
    .qp-format-cards {
        grid-template-columns: minmax(0, 1fr);
    }
}

.qp-format-card {
    position: relative;
    display: block;
    min-height: 91px;
    padding: 12px 10px;
    border: 1px solid var(--gray-200);
    border-radius: 7px;
    /* 地は節の白のまま（色を直書きしない。`.qp-image-picker__choice` と同じ） */
    background: none;
    text-align: start;
    cursor: pointer;
}

.qp-format-card:hover,
.qp-operation-card:hover {
    border-color: var(--primary-300);
}

/*
 * ⚠ **ラジオの入力はカード全体に重ねて、透明にする**（押すのは入力そのもの）。
 * 1px に縮めて `pointer-events: none` にしていた最初の形では、ブラウザの試験（Playwright の `check()`）が
 * 「入力の上に別の要素がある」として押せず、30秒待って落ちた（管理画面 smoke・2026-09-25 の実測）。
 * 重ねれば、画面の人もキーボードも試験も、同じ1つの入力を押す。
 */
.qp-format-card-input {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    margin: 0;
    opacity: 0;
    cursor: pointer;
}

.qp-format-card-input:disabled {
    cursor: not-allowed;
}

.qp-format-icon {
    display: block;
    height: 25px;
    color: var(--gray-500);
    font-size: 15px;
    font-weight: 700;
    letter-spacing: 1px;
}

.qp-format-name {
    display: block;
    margin-top: 4px;
    font-size: var(--qp-label-size);
    font-weight: 700;
}

.qp-format-sub,
.qp-operation-help {
    display: block;
    margin-top: 2px;
    color: var(--gray-500);
    font-size: var(--qp-label-size);
}

.qp-format-card:has(> .qp-format-card-input:checked) {
    border-color: var(--primary-600);
    box-shadow: inset 0 0 0 1px var(--primary-600);
    background: var(--primary-50);
}

.qp-format-card:has(> .qp-format-card-input:checked) .qp-format-icon {
    color: var(--primary-600);
}

.qp-format-card:has(> .qp-format-card-input:checked) .qp-format-tick::after {
    content: '✓';
    position: absolute;
    top: 7px;
    right: 7px;
    color: var(--primary-600);
    font-size: var(--qp-label-size);
}

/*
 * **キーボードで着いたカードは、外側の輪で示す**（統合役の判断・2026-09-25。画面案はフォーカスの形を決めていない）。
 * 選んだ印（内側の青い枠 ＝ box-shadow・薄い青の地）の外側に出るので、選んだカードに着いても両方が見える。
 * マウスで押したときは出ない（:focus-visible）。
 * ⚠ 影で描かない。2026-09-25 までの淡い青の影（4px・12%）は見分けにくく、選んだ印の内側の枠（同じ box-shadow）を上書きして消していた
 */
.qp-format-card:has(> .qp-format-card-input:focus-visible) {
    outline: 2px solid var(--primary-600);
    outline-offset: 2px;
}

.qp-format-card-disabled {
    cursor: not-allowed;
    background: var(--gray-50);
}

.qp-format-card-disabled:hover {
    border-color: var(--gray-200);
}

.qp-format-card-disabled .qp-format-name {
    color: var(--gray-500);
}

.qp-format-card-disabled:has(> .qp-format-card-input:checked) {
    border-color: var(--gray-400);
    box-shadow: inset 0 0 0 1px var(--gray-400);
    background: var(--gray-100);
}

.qp-format-card-disabled:has(> .qp-format-card-input:checked) .qp-format-icon,
.qp-format-card-disabled:has(> .qp-format-card-input:checked) .qp-format-tick::after {
    color: var(--gray-500);
}

/*
 * **ジャックポットの「公開後の操作」の窓の箱**（この箱を描いていた窓と view は 2026-10-13 に消した。10-04 からどこからも開かれていなかった。いまこの規則を使う所は無い。
 * 承認済みの画面案 `jackpot-admin-wireframe.html` の `.read-only-operations`／`.operation`。統合役の依頼・a8 の CHK-c14・2026-09-25）。
 *
 * - 2列（画面案 `repeat(2, minmax(0, 1fr))`・間 10px）。狭い画面では1列（画面案と同じ）
 * - 箱は回答形式のカードと同じ規則を読む：枠 gray-200・角 7px・触れた枠 primary-300（`.qp-format-card:hover` に選択子を並べた）。
 *   一言は `.qp-format-sub` に選択子を並べた（gray-500・12px）。名前は太字 700 で、記号が無いので上の余白を持たない
 * - 字の大きさは回答形式のカードと同じく、納品物の型の下端 12px。画面案は 11px・9px（全体が小さい縮尺で描かれている）
 * - 押すと、その操作の窓が重なって開く（view が Filament の操作のボタンと同じ口を呼ぶ）
 */
.qp-operation-cards {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 10px;
}

@media (max-width: 520px) {
    .qp-operation-cards {
        grid-template-columns: minmax(0, 1fr);
    }
}

.qp-operation-card {
    display: block;
    width: 100%;
    padding: 12px;
    border: 1px solid var(--gray-200);
    border-radius: 7px;
    background: none;
    text-align: start;
    cursor: pointer;
}

.qp-operation-card:focus-visible {
    outline: 2px solid var(--primary-600);
    outline-offset: 2px;
}

.qp-operation-name {
    display: block;
    font-size: var(--qp-label-size);
    font-weight: 700;
}

.qp-operation-footnote {
    margin-top: 12px;
    color: var(--gray-500);
    font-size: var(--qp-label-size);
}

/*
 * **ジャックポットの公開した回の緑の帯**（`JackpotRoundResource::form()` の `Callout`。画面案の `.status-banner`。
 * 統合役の依頼・a8 の CHK-c14・2026-09-25）：印なしで1段、1文目「公開時の条件を表示しています。」だけが太字で、2文目が続く。
 * 印は PHP の側で出さない（状態を置かず色だけ緑）。ここでは見出しと説明を同じ行に流し、見出しを太くする。字は変えない。
 */
.qp-published-callout .fi-callout-text {
    display: block;
}

.qp-published-callout .fi-callout-heading,
.qp-published-callout .fi-callout-description {
    display: inline;
}

.qp-published-callout .fi-callout-heading {
    margin-inline-end: 0.5em;
    font-weight: 700;
}

/*
 * **カードの下の、選んだ形式の説明と例**（承認済みの画面案の `.format-example`。依頼 v4 の3・a8 の差 DETAIL-EXAMPLE-BOLD）。
 * 画面案は地の字が `#40536f`、「例：」の `strong` が `--ink`（`#172235`）。パレットのいちばん近い段へ置いた:
 *
 *     地の字  #40536f → gray-600 #475467（gray-700 #344054 より近い。RGB でも OKLab でも同じ）
 *     例：    #172235 → gray-800 #1d2939（gray-900 #101828 より近い。同じ）
 *
 * ⚠ 当てるのは説明と例の2行だけ。その下の完全的中の条件の行は画面案に無い行なので、説明の地の字（上の `.fi-sc-text`）のまま
 */
.qp-format-example {
    color: var(--gray-600);
}

.qp-format-example strong {
    color: var(--gray-800);
}

/*
 * **ジャックポットのカードのすぐ下の注意の箱**（承認済みの画面案 `jackpot-admin-wireframe.html` の `.notice.neutral`。Q6・2026-09-25）。
 * 色は画面案の16進をパレットのいちばん近い段へ置いた: 地 #f8fafc → gray-50／枠 #e2e7ed → gray-200／字 #65748a → gray-500。
 * 余白・角は画面案のまま。字はカードと同じく納品物の型の下端 12px（画面案は 11px）。
 * その下の完全的中の条件の1行（`.qp-format-condition`）は、説明の地の字（上の `.fi-sc-text`）のまま
 */
/*
 * 原資の「お金を入れる」の窓の1行目「（原資名）に N pt を入れます」（2026-10-21・画面イメージ）。窓の見出し（`.fi-modal-heading`）と同じ大きさ・太さ・色。
 * ⚠ 大きさは字の器の class で当てる。Filament の大きさの指定を使うと、ボタンの寸法の見張り（`TheButtonSizesFollowTheDeliveredMockTest`）に当たる
 */
.fi-sc-text:not(.fi-badge):has(> .qp-fund-sentence) {
    font-size: var(--text-base);
    line-height: calc(var(--spacing) * 6);
    font-weight: var(--font-weight-semibold);
    color: var(--gray-950);
}

.fi-sc-text:not(.fi-badge):has(> .qp-fund-sentence):where(.dark, .dark *) {
    color: var(--color-white);
}

/* Filament の Text は inline-block の span で中身の幅に縮む。箱を含む Text だけを節の幅いっぱいにする */
.fi-sc-text:not(.fi-badge):has(> .qp-format-notice) {
    display: block;
}

.qp-format-notice {
    display: block;
    padding: 12px 14px;
    border: 1px solid var(--gray-200);
    border-radius: 7px;
    background-color: var(--gray-50);
    color: var(--gray-500);
    font-size: var(--qp-label-size);
    line-height: 1.8;
}

.qp-format-condition {
    display: block;
    margin-top: 8px;
}

/*
 * **Vクエストの公開した回の見出し**（承認済みの画面案の `.back-link`・`.page-title-line`・`.badge.dot`。依頼 v1・2026-09-25）。
 * 見出しの上に「Vクエスト一覧へ」、見出しの右に状態の札（点つき）。札の字と色は一覧の「状態」の列と同じ（`QuestListState`）。
 */
.qp-back-link {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    margin-bottom: 9px;
    color: var(--gray-500);
    font-size: var(--qp-label-size);
}

.qp-back-link-icon {
    width: 13px;
    height: 13px;
}

.fi-header-heading .qp-status-badge {
    margin-inline-start: 12px;
    vertical-align: middle;
}

/*
 * ⚠ **札の形と灰色の札（下書き）の段は、一覧の札と同じ規則が塗る**（上の `.fi-ta-cell .fi-badge` と
 * `.fi-ta-cell .fi-badge:not(.fi-color)` に選択子を並べた。2026-09-25）。ここに置くのは見出しの中の位置だけである。
 * 灰色の段を合わせたのは発注者の答え Q4（「一覧の状態の列と同じ字と色」。依頼 v4 の7）、形を合わせたのは a8 の差
 * CHK-c11-a8-DRAFT-BADGE-SHAPE（それまでは Filament の既定の細い枠・角の丸い四角だった）。
 */

.qp-status-badge::before,
.qp-status-entry .fi-badge::before {
    content: '';
    width: 5px;
    height: 5px;
    border-radius: 50%;
    background: currentColor;
}

/*
 * **公開した回の画面の最後の帯**（承認済みの画面案の `.editor-footer`：「{状態}の内容を確認中」と「変更できる項目を確認」。依頼 v3 ②・案 a）。
 */
.qp-published-band {
    align-items: center;
    padding: 12px 16px;
    border: 1px solid var(--gray-200);
    border-radius: 8px;
    background: var(--gray-50);
}

.qp-published-band-state {
    color: var(--gray-600);
    font-size: var(--qp-label-size);
}


/*
 * KPI のタブのカード（継続率・回遊・利用傾向。2026-10-12）。
 * 納品物 `1-25-2_cms_kpi_v1.html` の大きな数（`text-4xl font-bold`）・小さな説明（`text-sm` の灰）・
 * 平日／週末の2色の棒を、Filament の部品の中で描く。色は Filament の custom property だけを引く。
 */
.qp-kpi-figure {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    margin-block: 0.5rem;
}

.qp-kpi-value {
    font-size: 2.25rem;
    font-weight: 700;
    line-height: 1.1;
    color: var(--gray-900);
}

.qp-kpi-label {
    margin-block-start: 0.75rem;
    font-size: 0.875rem;
    font-weight: 600;
    color: var(--gray-700);
}

.qp-kpi-note {
    margin-block-start: 0.25rem;
    font-size: 0.8125rem;
    color: var(--gray-500);
}

.qp-kpi-unavailable {
    margin-block: 0.5rem;
    font-size: 0.875rem;
    color: var(--gray-600);
}

.qp-kpi-split {
    display: flex;
    overflow: hidden;
    height: 0.75rem;
    margin-block: 0.5rem 0.25rem;
    border-radius: 9999px;
    background: var(--gray-100);
}

.qp-kpi-split-weekday {
    background: var(--primary-600);
}

.qp-kpi-split-weekend {
    background: var(--warning-500);
}

.qp-kpi-split-legend {
    display: flex;
    justify-content: space-between;
    font-size: 0.8125rem;
    color: var(--gray-600);
}

/*
 * KPI の日ごとの表（2026-10-22。案 `20261021_クエストパーク_KPIダッシュボード案.html` の S1・S1b・S2）。
 * 行＝業務日・列＝指標。日付の列は横に送っても残す（sticky）。セルの下に前日比（増えた＝緑・減った＝赤）。
 * 明るい色だけ（発注者の決定 2026-10-22 の問い8「B」）。色は Filament の custom property だけを引く。
 *
 * 2026-10-23 の見直し（発注者「全部お願い」）：
 * A  KPI のタブを見ているときだけページの幅を画面いっぱいにする（タブの印 `qp-kpi-wide-tab` に `fi-active` が付いている間。`Dashboard::content()`）
 * B  群の見出しの字は横に送っても日付の列の右に残す（sticky。日付の列の幅を `--qp-kpi-date-width` に決めて、その右に止める）。群の最初の列に区切りの線
 * C  前日比は差があるときだけ出す（「±0」「—」は `qp-kpi-diff-quiet` の空白で行の高さだけ保つ）
 * F  ÷DAU の率が 100% を超えるセルは案の `td.ng`（薄い赤の地と枠）
 * G・H  受付中のVクエストの表：名前の横の番号・字の列（種類・協賛）は見出しも中身も左寄せ
 */
.fi-main:has(.qp-kpi-wide-tab.fi-active) {
    max-width: none;
}

/* 「全画面で見る」は表の右上に寄せる（発注者の依頼・2026-10-24。横に長い表を全幅のモーダルで見る入口） */
.qp-kpi-expand {
    display: flex;
    justify-content: flex-end;
    margin-block: 0.25rem;
}

/* KPI の全画面モーダルを、全幅(Screen)ではなく大きめの普通のモーダルにする（背景の暗がり・中央・中身の高さにフィット。発注者「モーダル自体が変／タブ設置前が良かった／もっと大きく」2026-10-24） */
.fi-modal-window:has(.qp-kpi-modal-content) {
    max-width: 96vw;
}

/* モーダルの中の表は、画面の高さいっぱい近くまで縦に伸ばす（ページ側の 70vh より大きく。ヘッダ追随・日付列固定はそのまま効く） */
.fi-modal .qp-kpi-modal-content .qp-kpi-table-wrap {
    max-height: 80vh;
}

/* 表題の行：表題（左）＋操作（期間・タブ。その右）＋×（右端）を1行に（発注者「期間も表毎のタブも表題の右に」2026-10-24） */
.qp-kpi-modal-bar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.75rem 1.5rem;
    margin-block-end: 1rem;
}

.qp-kpi-modal-title {
    color: var(--gray-900);
    font-size: 1.125rem;
    font-weight: 700;
}

.qp-kpi-modal-controls {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.75rem 1.25rem;
}

/* 表題の行の右端の × で閉じる（背景クリック・ESC も可） */
.qp-kpi-modal-x {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.75rem;
    height: 1.75rem;
    margin-inline-start: auto;
    border: none;
    border-radius: 6px;
    background: transparent;
    color: var(--gray-500);
    font-size: 1.375rem;
    line-height: 1;
    cursor: pointer;
}

.qp-kpi-modal-x:hover {
    background: var(--gray-100);
    color: var(--gray-900);
}

/* 期間切り替え（押すと裏のダッシュボードとモーダルがまとめて同じ期間になる）。ページの期間と同じセグメントの見た目 */
.qp-kpi-modal-period {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
}

.qp-kpi-modal-period-label {
    color: var(--gray-500);
    font-size: 0.75rem;
    font-weight: 600;
}

.qp-kpi-modal-period-group {
    display: inline-flex;
    overflow: hidden;
    border: 1px solid var(--gray-300);
    border-radius: 8px;
}

.qp-kpi-period-btn {
    padding: 0.3125rem 0.875rem;
    border: none;
    border-inline-start: 1px solid var(--gray-300);
    background: var(--color-white);
    color: var(--gray-700);
    font-size: 0.8125rem;
    font-weight: 500;
    cursor: pointer;
}

.qp-kpi-period-btn:first-child {
    border-inline-start: none;
}

.qp-kpi-period-btn:hover:not(.qp-kpi-period-btn-active) {
    background: var(--gray-50);
}

.qp-kpi-period-btn-active {
    background: var(--primary-600);
    color: var(--color-white);
    font-weight: 600;
}

/* 表ごとのタブ（機能別の9機能・コホートの人数/割合）。表題の行に期間と並べる。多いときは折り返す */
.qp-kpi-modal-tabs {
    display: inline-flex;
    flex-wrap: wrap;
    gap: 0.25rem;
}

.qp-kpi-tab-btn {
    padding: 0.25rem 0.75rem;
    border: 1px solid var(--gray-300);
    border-radius: 9999px;
    background: var(--color-white);
    color: var(--gray-700);
    font-size: 0.8125rem;
    cursor: pointer;
}

.qp-kpi-tab-btn:hover:not(.qp-kpi-tab-btn-active) {
    background: var(--gray-50);
}

.qp-kpi-tab-btn-active {
    border-color: var(--primary-600);
    background: var(--primary-600);
    color: var(--color-white);
    font-weight: 600;
}

.qp-kpi-table-wrap {
    overflow: auto;
    max-width: 100%;
    max-height: 70vh;
    margin-block-start: 0.75rem;
    border: 1px solid var(--gray-200);
    border-radius: 8px;
}

.qp-kpi-table {
    --qp-kpi-date-width: 9rem;
    --qp-kpi-group-h: 1.75rem;
    border-collapse: separate;
    border-spacing: 0;
    font-size: 0.75rem;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

.qp-kpi-table th {
    position: sticky;
    top: 0;
    z-index: 1;
    padding: 0.375rem 0.625rem;
    border-bottom: 1px solid var(--gray-200);
    background: var(--primary-600);
    color: var(--color-white);
    font-weight: 600;
    text-align: right;
}

/* 群見出しのある表（全体サマリー）は2段。群の段を上端に、項目名の段をその下に重ねて、縦スクロールで両方を残す。群の段が無い表（機能別・コホート）は項目名の段が top:0 のまま */
.qp-kpi-table-groups th {
    height: var(--qp-kpi-group-h);
    background: var(--gray-100);
    color: var(--gray-700);
    font-size: 0.6875rem;
    text-align: left;
}

.qp-kpi-table-groups + tr th {
    top: var(--qp-kpi-group-h);
}

/* 群の名前は、群の列が見えている間ずっと日付の列の右に止まる（群の th の中だけで動く） */
.qp-kpi-group-name {
    position: sticky;
    left: calc(var(--qp-kpi-date-width) + 0.625rem);
    display: inline-block;
}

.qp-kpi-table .qp-kpi-group-start {
    border-left: 2px solid var(--gray-300);
}

.qp-kpi-table td {
    padding: 0.3125rem 0.625rem;
    border-bottom: 1px solid var(--gray-200);
    color: var(--gray-900);
    text-align: right;
}

.qp-kpi-table tbody tr:nth-child(even) td {
    background: var(--gray-50);
}

.qp-kpi-table .qp-kpi-table-date {
    position: sticky;
    left: 0;
    z-index: 2;
    width: var(--qp-kpi-date-width);
    min-width: var(--qp-kpi-date-width);
    background: var(--gray-100);
    font-weight: 600;
    text-align: left;
}

.qp-kpi-table th.qp-kpi-table-date {
    z-index: 3;
    background: var(--primary-600);
    color: var(--color-white);
}

.qp-kpi-table-groups th.qp-kpi-table-date {
    background: var(--gray-100);
}

.qp-kpi-table-today {
    margin-inline-start: 0.375rem;
    padding: 0 0.375rem;
    border-radius: 4px;
    background: var(--primary-50);
    color: var(--primary-700);
    font-size: 0.625rem;
}

.qp-kpi-diff {
    display: block;
    font-size: 0.625rem;
    line-height: 1.1;
}

.qp-kpi-diff-up {
    color: var(--success-700);
}

.qp-kpi-diff-down {
    color: var(--danger-600);
}

.qp-kpi-diff-quiet {
    visibility: hidden;
}

.qp-kpi-table td.qp-kpi-ng,
.qp-kpi-table tbody tr:nth-child(even) td.qp-kpi-ng {
    background: var(--danger-50);
    box-shadow: inset 0 0 0 1px var(--danger-500);
}

.qp-kpi-ng-swatch {
    display: inline-block;
    width: 0.75rem;
    height: 0.75rem;
    margin-inline-end: 0.375rem;
    vertical-align: -0.125rem;
    border-radius: 2px;
    background: var(--danger-50);
    box-shadow: inset 0 0 0 1px var(--danger-500);
}

.qp-kpi-table .qp-kpi-text {
    text-align: left;
}

.qp-kpi-quest-id {
    margin-inline-start: 0.375rem;
    color: var(--gray-500);
    font-weight: 400;
}

/* KPI の指標の定義一覧（2026-10-22。案の「指標の定義一覧」の灰の箱） */
.qp-kpi-definitions {
    margin-block: 0.5rem 0.75rem;
    padding: 0.75rem 1rem;
    border-radius: 8px;
    background: var(--gray-50);
    color: var(--gray-700);
    font-size: 0.75rem;
    line-height: 1.6;
}

.qp-kpi-definitions dt {
    display: inline;
    color: var(--primary-700);
    font-weight: 700;
}

.qp-kpi-definitions dt::after {
    content: '：';
}

.qp-kpi-definitions dd {
    display: inline;
    margin: 0;
}
