/* 「企業を探す」（/search/）だけのスタイル。**この画面は agent_b の持ち場。**
 *
 * ⚠ **`app.css` のトークンだけを使う。** 新しい色を作らない
 *   （--surface-1 / --text-* / --border / --gridline / --series-* / --step-1..4 / --glass*）。
 * ⚠ **生の `font-size: NNpx` を書かない。** `--fs-xs`（11.5px・下限）〜 `--fs-h1` の
 *   段だけを使う。前はこのファイルだけで 10.5px を10箇所以上使っていて、
 *   画面全体の font-size が 20 種に膨らんでいた（＝「読みづらい」の一因）。
 * ⚠ **クラスは全部 `fd-` で始める。** `app.css` にも `.srch` `.fgroup` `.fchk`
 *   という似た名前の一式があり、そちらは共有物なので触れない。名前空間を分けて
 *   勝ち負けを起こさないようにしている。
 *
 * この画面は SUUMO 型 —— 左が固定の条件パネル、右が純粋な表。
 *
 * ### 2026-09-21 の作り直しで何が崩れていたか（同じ穴に落ちないための記録）
 *
 * 1. **表が面に載っていなかった。** `.fd-tablewrap` に背景が無く、`thead` だけが
 *    `--surface-1` の不透明な帯だった。つまり**帯だけが宙に浮いて**、行は
 *    素の背景（`.aurora`）の上に直接置かれていた。他のページの表は全部
 *    `.tablecard.glass` に載っているので、この画面だけ「当たっていない」ように見えた。
 *    → 共有部品 `.tablecard.glass` をそのまま使う（下の `.fd-result`）。
 * 2. **`main.wrap` をこの画面だけ 1280px にしていた。** `.wrap` は `margin: 0 auto`
 *    なので、幅を変えると**左端の位置まで動く**。`/product/`（1140px）から来ると
 *    パンくずと h1 が横に飛んだ。→ 外枠は 1140px のまま、**表のグリッドだけ**を
 *    左右にはみ出させる（`--fd-bleed`）。
 * 3. **h1 が 26px だった**（他のページは `.page-head h1`）。この画面だけ小さく、
 *    作りかけに見えた。→ テンプレートで `.page-head` / `.lede` を使う。
 * 4. **行の上下余白が 4px だった。** 共有の `.tablecard` は 10px 16px。
 *    「コンパクト」を通り越して**窮屈**になっていた（本人の指摘どおり）。
 * 5. **行の区切りが見えなかった。** `--border`（黒の 10% 透過）は面の上では
 *    ほぼ消える。→ 罫線用のトークン `--gridline` に替える。
 * 6. **ボタンが3種類バラバラだった**（`.fd-reset` / `.fd-csv` / `.fd-more` で
 *    大きさ・角丸・色が全部違う）。→ `.fd-btn` 1本にまとめた。
 */

/* ---------------------------------------------------------------- 全体 */

/* ⚠ **`main.wrap` の max-width を触らない。** ここを広げると左端の位置がずれて、
   パンくず・h1 が他のページと食い違う（上の 2.）。6列の表に幅が要るだけなので、
   **グリッドだけ**を本文の外へ左右対称にはみ出させる。

   `--fd-bleed` は片側にはみ出す量:
     - 本文の外に余っている幅 `(100vw - var(--page-max)) / 2` までしか借りない
       （借りすぎるとビューポートの端に貼り付く）
     - 上限 74px。本文 1092px + 148px = 1240px で、これ以上広げても表は薄くなるだけ
     - ビューポートが `--page-max` 未満なら 0（`clamp` の下限）—— 借りる余地が無い
   ⚠ **`padding` で相殺しない。** 中身（パネルと表）ごと動かしたいので margin で出す。
   ⚠ **`body` の左右 padding を勘定に入れていなかった。** 以前は `body` に
     `padding: 0 20px` があったので、実際に余っている幅は
     `(100vw - 40px - 1140px) / 2` で、この式は**常に 20px 多く見積もっていた**
     （`.wrap` の 24px に食われて横あふれにはならないが、上に書いた安全余裕は
     成立していなかった）。いま `body` の padding は無く、余白は中身側が持つので
     この式がそのまま正しい（`static/app.css` の `body` の注記と対）。
   ⚠ **幅の数はトークン（`--page-max`）から引く。** ここと `.wrap` と `.foot-in` の
     3箇所に写すと、広げた日にこの表だけがずれる。 */
.fd {
  --fd-bleed: clamp(0px, calc((100vw - var(--page-max)) / 2), 74px);
  /* ⚠⚠ **はみ出すのは右だけ（2026-10-10、指摘「このパネルがスクロールしづらい」）。**
     以前は左右に同じだけ出していたので、**条件パネルがビューポートの端に寄り**、
     自前のスクロール（`.fd-panel` の `overflow-y: auto`）を掴む余地が無かった。
     ⚠ **余白の数字を足して直さない。** 幅を借りているのは**表**のためで、
       左の柱は借りる理由が無い。借りる側だけ残すのが正しい形
       （`--fd-bleed` の値は変えていない —— 表の幅は 1 px も減らない）。
     ⚠ 左は `.wrap` の `--gutter` がそのまま効く。**ここに padding を足さない。** */
  margin: 0 calc(var(--fd-bleed) * -1) 0 0;
  display: grid; grid-template-columns: 300px minmax(0, 1fr);
  gap: var(--gap-5); align-items: start;
}

/* ⚠ **グリッドの子に `min-width: 0` を明示する。** 既定の `min-width: auto` だと
   子の min-content（下で表に `min-width: 560px` を入れてある）がトラックを押し広げ、
   390px で**条件パネルごと画面の外に出た**。トラック側を `minmax(0, 1fr)` に
   しただけでは足りない —— 実測でトラックが 562px のまま残った。 */
.fd > * { min-width: 0; }

/* ⚠ **条件パネルの中の `p` に `max-width: 72ch` を効かせない。** app.css の
   素の `p` に付いていて、300px の柱では効かないが、将来広げたときに効きはじめる。 */
.fd p { max-width: none; }

/* ------------------------------------------------------------ 条件パネル */

/* ⚠ **`top` はヘッダーの高さぶんだけ下げる。** `.topbar` も sticky なので、
   0 にすると条件パネルの1行目がヘッダーの裏に潜る（既に踏んだ事故）。
   ⚠ **`--bar-h`（58px）をそのまま使わない。** あれは設計値で、実物と合っている
   保証がない（2026-10-10 まで、狭い画面でバーが2段に折れて 113〜137px あった。
   いまは検索窓をアイコンに畳んでどの幅でも1段）。`static/app.js` の
   `trackTopbar()` が実測を `--fd-top` に写すので、そちらを優先する
   （JS が落ちたら設計値に戻る）。
   パネル自体が縦に長いので、**中でスクロールさせて**画面からはみ出させない。
   ⚠⚠ **`+ 12px` にしない（2026-10-08）。** 右の `thead` は `--fd-top` ちょうどに
   貼り付く（隙間を空けると行がそこに覗くので、あちらは詰める以外にない）。
   ここだけ 12px 下げていたため、**左の条件パネルの上端と右の見出し行の上端が
   12px ずれて**、2段組の起点が揃っていなかった。**同じ値にする。**
   ⚠ **狭い画面（899px 以下）ではこの柱は popover のシートになる。** 形は下の
     「シート」の節（`.fd-side[popover]`）にまとめてある。ここは wide の話だけ。 */
.fd-side { position: sticky; top: var(--fd-top, var(--bar-h)); }

/* ⚠ **`--glass`（0.70）ではなく `--glass-strong`（0.88）。** 中に細い文字と
   チェックボックスが数百個並ぶので、密度が高いところほど透けさせない
   （app.css の `.tablecard` が同じ理由で 0.88 にしてある）。
   透けたままだと見出しの帯（不透明な `--surface-1`）と地の色が食い違って、
   **パネルの中で面が2色に割れて見えていた。** */
.fd-panel {
  background: var(--glass-strong);
  padding: 0 16px 18px;
  /* ⚠ 引く値は `top` のオフセット + 下の余白。`top` から `+12px` を外したので
     ここも 28px -> 16px（ずらすと画面の外へはみ出すか、無駄な空きが残る）。 */
  max-height: calc(100vh - var(--fd-top, var(--bar-h)) - 16px);
  overflow-y: auto; overscroll-behavior: contain;
}
/* ⚠⚠ **この中の `?` の吹き出しは、この柱の幅に収める。**
   上の `overflow-y: auto` のせいで、`overflow-x` も `visible` ではなくなる
   （CSS の規定: 片方を `visible` 以外にするともう片方は `auto` になる）。
   つまり**柱より幅のある吹き出しは横で切られる** —— 既定の 360px は
   この柱（274px）を超えていた（実測で切れていた）。
   ⚠ **`overflow-y` を外して解かない。** あれは「柱が画面に収まる」ためのもので、
     外すと条件が長いときに表と高さが合わなくなる。
   ⚠ 左端に寄せる。中央揃えのままだと、右端の `?` で吹き出しが右へ出る。 */
/* ⚠ この柱は `overflow-y: auto`（＝横も切る）ので、**横には出せない。**
   ここだけ下に出して、幅を柱に収める。 */
/* ⚠⚠ **2026-10-10 に、シートになっても値が合っているかを見直した（結論: このまま）。**
   899px 以下でこの器は柱（274px）ではなく画面いっぱいのシートになるが、
   **いちばん狭いのは 320px の画面**で、`.wrap` の中身が約 280px、
   `.fd-panel` の左右 16px を引いて **248px**。244px はそこにぎりぎり収まる
   —— **広げると、いちばん狭い画面でだけ切れる**（切れても例外は出ない）。
   ⚠⚠ **この `?` を popover にしない。** `parts/_hint.html` に
     「popover に戻さない（top layer ＝画面中央に出て、どの `?` を押したのか
     分からなくなる）」と書いてある。条件シート（`.fd-side`）が popover なのは
     **画面を覆ってよいもの**だからで、役割が違う。 */
.fd-panel .hint__pop {
  max-width: 244px;
  top: calc(100% + 7px); left: auto; right: 0; transform: none;
}

.fd-panel__h {
  position: sticky; top: 0; z-index: 2;
  display: flex; align-items: center; justify-content: space-between; gap: var(--gap-3);
  /* ⚠ 透けさせない。下を行が流れると見出しが読めなくなる。 */
  background: var(--surface-1);
  margin: 0 -16px; padding: 13px 16px 11px;
  border-bottom: 1px solid var(--gridline);
  font-size: var(--fs-sm); font-weight: var(--fw-bold); color: var(--text-primary);
}

/* 条件のひとかたまり。**区切りを効かせる**（`--border` では面の上で消えていた）。 */
.fd-group { padding: 16px 0; border-bottom: 1px solid var(--gridline); }
.fd-group:last-of-type { border-bottom: 0; padding-bottom: 4px; }
.fd-group__h {
  display: flex; align-items: center; justify-content: space-between; gap: var(--gap-2);
  min-height: 24px;
}
.fd-group__t { font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--text-primary); }
/* すべて / いずれか の行。**見出しとは別の行**に置く。
   1行に詰めたら 300px ではどれも読めない幅になった。 */
.fd-group__sub {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--gap-2); flex-wrap: wrap; margin: 6px 0 9px;
}
/* 「N 件選択中」＋「すべて外す」。**1件以上選んでいるときだけ出る**
   （`hidden` を外すのは `static/app.js` の `syncPicked()`）。

   ⚠⚠ **「すべて選ぶ」と「指定なし」は 2026-10-09 に消した（指摘で決定が覆った）。**
     「**『すべて選ぶ』ってボタン要る？**『指定なし』も何も選択されていないときには
       よくわからない。**選択したら、選択された奴が出てくる、『すべて外す』も
       出てくる**が良い気もするけどどう思う？」
     - OR が既定なので「すべて選ぶ」＝ほぼ絞らないのと同じ。押しても画面が
       変わらないボタンは「効いていない」と読まれる。
     - 「指定なし」は**一覧を見れば分かる**（触れば分かることを文で言わない）。
     - 「すべて外す」だけ残す。138 件を1つずつ外すのは苦痛。
     ⚠ **同じ日の午前に「残す」と決めた記録がこの近辺にあったが、覆っている。**
       `.fd-bulk--on` も `static/app.js` の `syncBulk()` ごと消した。
   ⚠ **`display` を持つので `[hidden]` の打ち消しが要る**（`app.css` の `[hidden]` の節）。 */
.fd-group__picked {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--gap-2); flex-wrap: wrap; margin: 6px 0 9px;
}
.fd-group__picked[hidden] { display: none; }
.fd-state { font-size: var(--fs-xs); color: var(--link); font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums; }

/* いずれか / すべて。**既定は「いずれか」（OR）**（2026-10-09 に AND から替えた）。

   1つの条件の中で複数選んだら OR、別の条件どうしは AND（自動）、何も選ばなければ
   絞り込みなし＝全件。既定が AND だったころは「すべて選ぶ」を押すと 138 件が AND で
   結ばれて**必ず0件**になっていた。
   ⚠ **AND（すべて）は消していない。** 2〜3個の AND は営業リストとして効く。
     替えたのは既定の座と**並び順**（既定が左）だけ。
   ⚠ 意味の説明は下の `.fd-mode-note`。**押す前に読める位置**に置く。 */
.fd-mode { display: flex; gap: var(--gap-1); flex: none; margin-left: auto; }
.fd-mode input { position: absolute; opacity: 0; pointer-events: none; }
/* ⚠ **`<label>` 側にも当てる。** 見えているピルは中の `<span>`（下）で、そちらには
   `pointer` があったが、**`<label>` の箱は1〜2px だけ外にはみ出す**ので、
   その縁をなぞると矢印に戻っていた（押せる範囲の中に押せなく見える帯ができる）。
   `.fd-chk input` と同じ種類の取りこぼし。 */
.fd-mode label { cursor: pointer; }
.fd-mode span {
  display: block; font-size: var(--fs-xs); font-weight: var(--fw-medium); padding: var(--pad-chip);
  border-radius: var(--radius-pill); border: 1px solid var(--border);
  color: var(--text-muted); cursor: pointer; white-space: nowrap;
}
/* ⚠ **白文字を `--series-1` に載せない。** `--series-1`（#2a78d6）は白との比が
   4.42:1 で、11.5px の小さな文字には足りない（AA は 4.5:1）。`--step-4` は
   白と 5.9:1 以上。`.btn:hover` も同じ組み合わせ。 */
.fd-mode input:checked + span { background: var(--step-4); border-color: var(--step-4); color: #fff; }
.fd-mode input:focus-visible + span { outline: 2px solid var(--series-1); outline-offset: 2px; }

/* 切り替えが**いま何をするか**を、押す前に1行で言う（`static/app.js` の
   `paintModeNotes()` が入れる。文言は `parts/_finder.html`）。

   ⚠ **これが「押したら0件で理由が分からない」の半分の手当て。** もう半分は
     表の空状態に出る `.fd-fix`（1クリックで「いずれか」へ戻す）。
   ⚠ **選んでいないときは出さない。** 条件が1つも無いところに but 書きを積むと、
     5つ並ぶ群が全部2行ぶん高くなって一覧が遠ざかる。 */
.fd-mode-note {
  margin: -4px 0 9px; font-size: var(--fs-xs); line-height: 1.5; color: var(--text-muted);
}
.fd-mode-note[hidden] { display: none; }
.fd-mode-note b { color: var(--text-secondary); font-weight: var(--fw-semibold); }
/* 0 件になっているとき。⚠ **赤を使わない** —— 壊れたのではなく、条件が狭いだけ。
   左の縦罫 1本で「ここを見ろ」とだけ言う。 */
.fd-mode-note--warn {
  color: var(--text-secondary); border-left: 3px solid var(--baseline);
  padding: 2px 0 2px 9px; margin-left: -1px;
}
.fd-mode-note--warn b { color: var(--text-primary); }

/* ⚠⚠ **16px を切らない（2026-10-10、実測 12.5px）。** iOS Safari は 16px 未満の
   入力欄に触れると**ページごと拡大し、自動では戻らない** —— 以後そのセッションは
   ずっと横スクロールになる。この画面には絞り込みの入力が4つあるので、
   指で探しはじめた瞬間に必ず踏む。
   ⚠ **`user-scalable=no` / `maximum-scale=1` で止めない。** WCAG 1.4.4 違反で、
     `tests/web/test_responsive.py::test_the_viewport_still_allows_zoom` が落とす。
     直す手は「文字を 16px 以上にする」の一手だけ（`docs/design/responsive.md` §4.3）。
   ⚠ **`--fs-*` に段を増やさない。** 16px は**トークンではなく OS の制約**なので、
     段として持たず `max()` で下駄を履かせる。wide でも 16px になるが、
     ここは絞り込みの入力で、柱の中の「読む文字」（`--fs-sm`）とは役割が違う。 */
.fd-input {
  font: inherit; font-size: max(16px, var(--fs-sm)); width: 100%; margin-bottom: 8px;
  padding: 7px 11px; border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: var(--plane); color: var(--text-primary);
}
.fd-input:focus { outline: 2px solid var(--series-1); outline-offset: 1px; border-color: transparent; }
.fd-input::placeholder { color: var(--text-muted); }

/* チェック／ラジオ1行。**指で押せる高さ**にする（前は 4px 刻みで詰まっていた）。 */
.fd-chk {
  display: flex; align-items: center; gap: var(--gap-2); padding: 5px 2px;
  font-size: var(--fs-sm); line-height: 1.5; color: var(--text-secondary); cursor: pointer;
  border-radius: var(--radius-sm);
}
/* ⚠⚠ **`cursor` は継承しない。** 行（`<label>`）には上で `pointer` を当てているのに、
   **チェックボックスそのものに重ねると矢印に戻っていた**（指摘）——
   UA のスタイルシートがフォーム部品に `cursor: default` を当てているため。
   押せる範囲の中に押せなく見える島ができる。`/product/` の列フィルタ
   （`static/saas.css` の `.sx-menu__lab input`）は先に直してあったので、
   **同じ穴がこちらにだけ残っていた**。 */
.fd-chk input { accent-color: var(--series-1); flex: none; margin: 0; cursor: pointer; }
.fd-chk > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; }
.fd-chk:hover { color: var(--text-primary); background: var(--tint-1); }
.fd-chk--on { color: var(--text-primary); font-weight: var(--fw-semibold); }
.fd-n {
  font-style: normal; color: var(--text-muted); font-size: var(--fs-xs); margin-left: 7px;
  font-variant-numeric: tabular-nums; font-weight: var(--fw-normal);
}

/* 読み込みの失敗を出す場所。⚠ **黙って0件にしない。** 理由をここに書く。 */
.fd-msg {
  margin: 9px 0 0; padding: 8px 11px; font-size: var(--fs-xs); line-height: 1.6;
  border-left: 2px solid var(--critical); border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
  background: var(--surface-1); color: var(--text-secondary);
}

/* 検出の有無。**この画面の目玉**なので、3択だけ少し強く見せる。
   ⚠ 3つとも件数を先に出す（検出ゼロは別ファイルだが、数は `blank` から貰っている）。
   ⚠ 「検出できている」だけが追加の読み込みなしで出せる = 既定。他は押した時点で取る。 */
.fd-det { margin-top: 2px; }
/* ⚠⚠ **大きさを変えて強調しない（2026-10-09）。** `--fs-md` に上げていたが、
   左の柱は他の絞り込みが全部 `--fs-sm` なので、**ここだけ字が大きくて浮いていた**
   （「ここの文字変じゃない？他と合わせて小さくして」）。
   **強さは `--fw-semibold` と `--text-primary` が持つ。大きさは揃える。** */
/* ⚠ **太字にしない（2026-10-09、指摘）。** 3択だけ太いと、左の柱の中で
   そこだけ見出しのように浮く。**強さは色（`--text-primary`）だけで足りる。** */
.fd-det .fd-chk { color: var(--text-primary); padding: 6px 2px; }
.fd-det .fd-chk .fd-n { font-weight: var(--fw-normal); }

/* 長い一覧は中でスクロールさせて、**左の柱の高さを一定に保つ。**
   ⚠ **下端をぼかす。** 高さが行の高さの倍数にならないので、必ず最後の行が
     途中で切れる。素のままだと**描画が失敗した半端な行**に見えていた
     （行の高さはフォントで変わるので、px を合わせにいっても直らない）。
     フェードなら「まだ続く」ことが伝わる。 */
.fd-list {
  max-height: 214px; overflow-y: auto; padding-right: 4px; overscroll-behavior: contain;
  -webkit-mask-image: linear-gradient(to bottom, #000 calc(100% - 16px), transparent);
  mask-image: linear-gradient(to bottom, #000 calc(100% - 16px), transparent);
}
.fd-list--short { max-height: 168px; }
.fd-list__none { font-size: var(--fs-xs); color: var(--text-muted); padding: 6px 2px; margin: 0; }
/* 選んだものは上に固定する。**150製品の中から選ぶので、絞り込むと
   選択済みが視界から消えて「外し方が分からない」になる。** */
.fd-picked { border-bottom: 1px dashed var(--baseline); margin-bottom: 7px; padding-bottom: 6px; }

/* 「何も検出されていない」を選ぶとプロダクトの条件は成り立たない。**弱めて理由を出す。**
 *
 * ⚠ **`.42` に戻さない。** WCAG 1.4.3 の「無効な部品は免除」は
 *   `disabled` が実際に立っているときだけの話で、透かしただけの文字には効かない。
 *   地は #fcfcfb なので、`--text-secondary`（素で 7.6:1）を .42 で透かすと
 *   **1.9:1**、.6 でも **2.9:1** で AA（4.5:1）に届かない。
 * ⚠ だから**透かす前に文字を濃いほうへ戻す**。`--text-primary`（素で 18.1:1）を
 *   .75 で透かすと **8.4:1** で収まる。「弱めてある」は透かしが出しているので、
 *   読めないほど薄くする必要はない。
 * ⚠ `pointer-events` は**マウスしか止めない**。Tab で入って Space を押せてしまうので、
 *   `input.disabled` を実際に立てるのは `static/app.js` 側の仕事。**CSS だけでは治らない。** */
.fd-group--off { opacity: .75; }
/* ⚠ **クラスを 2 回書いているのは誤字ではない。** 特異度を (0,2,0) まで上げないと、
   中の `.fd-btn--sm` / `.fd-n` / `.fd-state`（どれも (0,1,0) で `--text-muted`）が勝って
   残る。実測でその3つだけが **2.5〜2.9:1** で落ちていた。
   ⚠ **個別に列挙しない。** 一度そう書いて取りこぼした。群の中の文字は
     全部同じ扱い（無効）なので、全部に当ててから例外を 1 つ戻す。 */
.fd-group--off.fd-group--off * { color: var(--text-primary); }
/* 唯一の例外。選んでいるモードの切替だけは**地を持っている**ので、
   文字を `--text-primary` に戻すと濃い青の上の黒字（2.6:1）になる。
   ⚠ **白字に戻すだけでも足りない。** `opacity` は地ごと薄くするので、
     `--step-4` の青が .75 で地に浮いて **3.8:1** に落ちる（実測）。
     地を `--text-primary` にすれば透かしたあとでも **8.4:1**。
   ⚠ 青を残さないのは意図的。群が無効のあいだ、この切替は**効いていない**。 */
.fd-group--off.fd-group--off .fd-mode input:checked + span {
  color: #fff; background: var(--text-primary); border-color: var(--text-primary);
}
.fd-group--off input, .fd-group--off .fd-input, .fd-group--off .fd-btn { pointer-events: none; }

/* ------------------------------------------------------------- ボタン */

/* ⚠ **ボタンはこの1本だけにする。** 前は `.fd-reset` / `.fd-csv` / `.fd-more` が
   それぞれ違う大きさ・角丸・色で、同じ画面の中で3種類の「押せるもの」が居た。 */
.fd-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: var(--gap-ic);
  font: inherit; font-size: var(--fs-sm); font-weight: var(--fw-semibold); cursor: pointer; white-space: nowrap;
  padding: var(--pad-btn-md); border-radius: var(--radius-pill);
  border: 1px solid var(--border); background: var(--glass-strong); color: var(--text-secondary);
}
.fd-btn:hover:not(:disabled) { color: var(--link); border-color: var(--series-1); }
.fd-btn:disabled { opacity: .5; cursor: default; }
.fd-btn:focus-visible { outline: 2px solid var(--series-1); outline-offset: 2px; }
/* ⚠ **`display` を持たせたので UA の `[hidden]{display:none}` に勝ってしまう。**
   これを書かないと「JS が入るまで隠す」が効かない。 */
.fd-btn[hidden] { display: none; }

.fd-btn--sm { font-size: var(--fs-xs); font-weight: var(--fw-medium); padding: 4px 11px; color: var(--text-muted); }
.fd-btn--more { width: 100%; margin-top: 12px; padding: 12px; border-radius: var(--radius-sm); }

/* ------------------------------------------- シート（899px 以下の条件パネル）

   ⚠⚠ **2026-10-10 に「場所を取るもの」から「呼び出すもの」へ変えた**
   （`docs/design/responsive.md` §3.1）。それまでは 980px 以下で

       .fd-side  { position: static; }   ← sticky をやめる
       .fd-panel { max-height: none; }   ← 高さの蓋も外す

   と書いてあり、PC では「画面に収まる 300px の柱」だったものが、**自然な高さの
   まま本文の先頭に置かれて**いた。中身はプロダクト百数十件 + 都道府県 47 件の
   チェックボックスなので **2,200〜2,300px の壁**になり、表はその下。実測で
   **結果の表が 320px で 4.1 画面下 / 390px で 2.7 画面下 / iPad 縦で 1.9 画面下**、
   `aside.fd-side` は iPad 横（1024x768）で **693px = 画面の 90%** を占めていた。
   `/search/` は**条件を選ぶ画面ではなく、絞った結果を見る画面**なので、
   **着地点は表**でなければならない。

   ## 実装はネイティブの `popover`。**JS は1行も書かない。**

   ⚠ **新しい仕組みを作らない。** このリポジトリは既に Popover API を使っている
     （`parts/_evidence.html` / `parts/_activity.html` の「シグナル」）。同じ作法に乗る:
     開閉は `popovertarget` 属性だけ、**Esc と外側タップで閉じるのはブラウザの実装**。
   ⚠ **`popover="auto"` にする。** `manual` だと外側タップで閉じず、
     「閉じ方が分からない全画面」になる。
   ⚠⚠ **DOM を作り直さない。** 同じ `<aside>` をそのまま出し入れする。
     作り直すと**選んだチェックが消える**（`static/app.js` は DOM を状態として読む）。
   ⚠ **`.fd-panel` の高さの蓋を外さない。** シートでも要る（中身は百数十件）。
     上限は**画面の 85%**（下に表が覗く ＝「後ろに結果がある」が伝わる）。
   ⚠ **`100dvh` を使わない。** アドレスバーの出入りで高さが跳ねる（`app.css` に既出）。

   ## wide では popover として振る舞わせない

   UA のスタイルシートは `[popover]` に `position: fixed` / `inset: 0` /
   `width: fit-content` / `margin: auto` / `border: solid` / `padding` /
   `background: canvas` / `overflow: auto` を当てている。**作者スタイルは UA より
   強い**ので、ここで要るぶんだけ打ち消せば、wide は**1px も変わらない 300px の柱**
   のまま残る。
   ⚠ **`inset: auto` と書かない。** `inset` は `top` の longhand を含むので、
     (0,1,1) のこの規則が上の `.fd-side { top: … }`（0,1,0）に勝ってしまい、
     **sticky の貼り付く位置が消える**。打ち消すのは right / bottom / left だけ。
   ⚠ **`app.css` の `@supports not selector(:popover-open) { [popover] { display: none } }`
     に負けないこと。** あれは (0,1,0) で、ここは (0,1,1) なので読み込み順に関係なく
     勝つ。**`.fd-side` 単独（0,1,0）で書くと、CSS の配り順しだいで柱が消える。**
   ⚠ **開いたまま wide に跨ぐと（スマホを横にする）、柱が top layer に居たまま
     描かれる。** 形はここの柱のままなので崩れないが、他のものより手前に出る。
     CSS では閉じられない（`hidePopover()` は JS）。**これを理由にシートを
     `manual` にしたり、幅で開閉を書いたりしないこと** —— 外側を1回触れば
     ブラウザが閉じる（light dismiss）ので、自然に戻る。 */
.fd-side[popover] {
  display: block;
  right: auto; bottom: auto; left: auto;
  width: auto; height: auto; max-width: none; max-height: none;
  margin: 0; border: 0; padding: 0;
  background: none; color: inherit; overflow: visible;
}

/* シートを開く口。**899px 以下だけ出る**（`.page-head__end`、件数のすぐ後ろ）。

       企業を探す   該当 1,234 社（1,201 ドメイン）…   [?] [ 条件 ▾ ]
       ↑ この行ごと sticky にしたものが要約バー（下の `@media` を見ること）

   ⚠⚠ **件数の器（`.fd-count`）を2つ作らない。** 表の上に「該当 N 社」を
     置き直したくなるが、`static/app.js` は `[data-role=count]` を
     `document.querySelector` で**1つだけ**引くので、2つ目は**焼いた時点の
     「読み込み中…」で固まった写し**になる（`[data-role=reset]` で同じ事故を
     踏んで `querySelectorAll` に直した履歴がある）。しかも
     `tests/web/test_markup.py::test_the_counts_sit_next_to_the_heading_not_inside_the_table`
     が「件数は `.page-head` の中」「表カードの中に無い」を両方見ている。
     **だから器は増やさず、`.page-head` ごと貼り付ける**（下）。
   ⚠ **「条件 N 件」の N はここに書けない。** 数を持つ `[data-role=active-n]` は
     `<form data-finder>` の中にあり、JS は `root.querySelector` で引く。
     このボタンはフォームの外（`.page-head`）なので、動かすと `null` になる。
     写しも作らない —— **出すなら JS 側の1行が要る。**
   ⚠ **`.fd-btn` より後ろに書く。** `.fd-btn` は `display: inline-flex` を持つので、
     前に書くと同じ特異度 (0,1,0) で後ろの `.fd-btn` が勝ち、**wide でも出たまま**
     になる。 */
.fd-sheet-open { display: none; }
.fd-sheet-open::after { content: " ▾"; font-size: 0.7em; }
/* シートを閉じる口。**「閉じる」ではなく行き先を言う**（着地点は表）。
   ⚠ wide では出さない。`popovertarget` は wide でも生きているが、
     そちらでは柱が最初から見えているので押す意味が無い。 */
.fd-sheet-close { display: none; }

/* ------------------------------------------------------------ 表の読み方 */

/* ⚠ **この3つを消さない。**
   1つめが無いと「なぜ子会社まで Salesforce なのか」と必ず聞かれる。
   2つめが無いと「押せる企業と押せない企業の違いは何か」と必ず聞かれる（実際に聞かれた）。
   3つめ（母集合）が無いと「全体で何社あるのか」を見る手段が無くなる。 */
/* ----------------------------------------- いまの絞り込み（チップ）

   `static/app.js` の `paintActive()` が中身を作る。**条件パネルの一番上。**

   ⚠ **表の上（メインパネル）に置かない。** 一度そこに置いたが、条件を触る場所と
     いま何が効いているかを見る場所が左右に割れた（指摘）。
   ⚠ **左の柱の写しではなく、1つずつ外すための口。** 群が5つ・一覧がスクロールする
     ので、選んだ製品は絞り込み入力で「選択済み」の塊に移って**画面の外**へ行く。
     「結局何がチェックされているか分からない」の正体はそこ。
   ⚠ 高さを決め打ちしない（条件は10個以上並ぶ）。パネル自体がスクロールする。
   ⚠ **`.fd-group` の罫線に混ぜない。** 条件の群ではなく**状態**なので、
     下向きの罫1本で区切るだけにして、群の padding の規則には参加させない。 */

.fd-active {
  padding: 12px 0 13px; border-bottom: 1px solid var(--gridline);
}
.fd-active[hidden] { display: none; }
.fd-active__h {
  margin: 0 0 7px;
  font-size: var(--fs-xs); font-weight: var(--fw-semibold); color: var(--text-secondary);
}
.fd-active__n { color: var(--text-muted); font-weight: var(--fw-normal); margin-left: 6px; }
/* ⚠ **条件ごとに1行**（`.fd-sel`）なので、ここは縦に積む。
   以前は `flex-wrap` でチップを直接並べていた（下の `.fd-off` の注記）。 */
.fd-active__chips { display: flex; flex-direction: column; gap: var(--gap-3); min-width: 0; }

/* ⚠⚠ **2026-10-09 に作り直した（指摘「選択された奴の文字が微妙」）。**

   前は1つのチップが2段組で、1段目に **「導入（すべて満たす）」** という
   *この画面の中にしか無い語* が出ていた（左の柱の見出しは「プロダクトを導入して
   いる」、切替は「すべて」「いずれか」で、**3通りの言い方**が並んでいた）。
   しかも群の名前はチップ1つずつが背負っていたので、**138 件選ぶと同じ語が 138 回**
   並び、柱が 2,000px 伸びて条件の群が画面から消えた。

   いまは **条件ごとに1行**（`.fd-sel`）にして、
   - 群の名前は行の見出し（`.fd-sel__k`）が **1回だけ** 持つ。文字は左の柱の見出しを
     `static/app.js` が DOM から読んでいるので、**言い方が割れようがない**。
   - 「いずれか / すべて満たす」は行の見出しの小さな札（`.fd-sel__mode`）。
     2件以上選んだときだけ出る（1件ならどちらでも同じなので雑音）。
   - チップ本体は **値 + ✕ の1行**。
   - 10 件を超えたぶんは「ほか N 件」に畳む（`.fd-off--more`）。

   ⚠ **「導入」と「検出できなくなった」の見分けを消さない**（意味が正反対で、
     混ざると事故）。`.fd-off--gone` は表の `.fd-tag--gone` と**同じ点線**を持ち、
     `aria-label` には群の名前が入ったまま。
   ⚠ 色で「悪い」を出さない（外すボタンに赤を使わない）。hover で初めて縁が立つ。 */
.fd-sel { display: flex; flex-direction: column; gap: var(--gap-ic); min-width: 0; }
.fd-sel__h {
  display: flex; align-items: baseline; flex-wrap: wrap; gap: var(--gap-1) var(--gap-2);
  margin: 0; font-size: var(--fs-xs); line-height: 1.3;
}
.fd-sel__k { color: var(--text-secondary); font-weight: var(--fw-semibold); }
/* 「いずれか」「すべて満たす」。**地を持たせる**（見出しの一部ではなく状態なので）。 */
.fd-sel__mode {
  padding: 1px 7px; border-radius: var(--radius-pill);
  background: var(--tint-1); color: var(--step-4); font-weight: var(--fw-semibold);
}
.fd-sel__n { color: var(--text-muted); font-variant-numeric: tabular-nums; }
.fd-sel__v { display: flex; flex-wrap: wrap; gap: var(--gap-1); min-width: 0; }

.fd-off {
  display: inline-flex; align-items: center; gap: var(--gap-ic); text-align: left;
  font: inherit; font-size: var(--fs-xs); line-height: 1.5; padding: 2px 7px 2px 9px;
  border: 1px solid var(--border); border-radius: var(--radius-pill);
  background: var(--plane); color: var(--text-primary); cursor: pointer;
  max-width: 100%;
}
.fd-off:hover { border-color: var(--series-1); }
.fd-off:focus-visible { outline: 2px solid var(--series-1); outline-offset: 2px; }
.fd-off__v { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fd-off__x { color: var(--text-muted); flex: none; }
.fd-off:hover .fd-off__x { color: var(--link); }
/* ⚠ **点線は表の `.fd-tag--gone` と同じ言い方。** チップ1つだけを見ても
   「導入している」ではないと分かるようにする（意味が正反対なので）。
   ⚠ hover の縁は `.fd-off:hover`（0,2,0）が勝つので、ここに `:hover` は要らない。 */
.fd-off--gone { border-style: dashed; border-color: var(--baseline); }
/* 「ほか N 件」。**条件は外さない**ので ✕ を持たせず、地も持たせない。
   ⚠ **`.fd-off--more:hover` と書かない。** `tests/web/test_stylesheets.py` の
     トークン走査は `(--[\w-]+)\s*:` で定義を拾うので、`--more:` を
     **「誰も使っていないトークンの定義」**と読んで落ちる。当てる口は属性のほう
     （`data-more-chips`。`static/app.js` が同じ名前で開閉を拾っている）。 */
.fd-off--more { background: none; color: var(--text-muted); border-style: dotted; }
.fd-off[data-more-chips]:hover { color: var(--link); }

/* ⚠ **`.fd-scope`（母集合の1文）は 2026-10-09 に消した**（指摘）。
   「母集合 N 社 / M ドメイン（うち検出ゼロの K 社は、選んだときだけ読み込みます）。」
   は数を見せるだけで、読み手が次に何を押せばいいかを1つも出していなかった。
   ⚠ **戻すならまず3択を見ること。** 母集合の数は「どちらも（すべて）」の横に
     既に出ていて、**そちらは押すと実際にその母集合になる**（説明の文と違って
     数と結果が一致する）。 */

/* ---------------------------------------------------------------- 表 */

/* 面は共有部品 `.tablecard.glass` に任せる（他のページの表と同じ面・枠・角丸・影）。
   ⚠ **`overflow: hidden` にしない。** `.tablecard` の既定は hidden で、これが載ると
     スクロール容器ができて `thead` の sticky が**ビューポートに効かなくなる**。
     `clip` はスクロール容器を作らないので sticky が生きたまま角丸で切れる。
     （`clip` が無い古いブラウザでは角が丸く切れないだけ。崩れはしない。） */
.fd-result { overflow: clip; margin: 0; }

/* 件数。**題（`<h1>`）の横**に置く（`.page-head__top`）。
 *
 * ⚠⚠ **2026-10-09 に表カードの中の帯（`.fd-bar`）から引っ越した（指摘）。**
 *   「7,736 社（7,581 ドメイン）60 ドメインまで表示」が列見出しのすぐ上に
 *   入っていて、**表に付いている操作に見えた**（`/product/` の「1,133 プロダクト」と
 *   同じ指摘）。あの数は「この画面がいま何を相手にしているか」の話。
 *   ⚠ **`.fd-bar` を作り直さない。** 戻すと同じ数が2箇所に出て、
 *     live 領域も2つになる（`test_the_search_screen_announces_what_changed`）。
 *
 * ⚠ **大きさを `--fs-h2` のまま持ち上げない。** 帯の中では数が主役だったが、
 *   題の横では 32px の `h1` の隣に 20px が並ぶことになり、**どちらが題なのか
 *   分からなくなる**（実測で並べて決めた）。数は `--fs-lede`、単位と但し書きは
 *   `--fs-sm` に落として、`h1` との差を保つ。
 * ⚠ **「60 ドメインまで表示」（`.fd-count__sub`）を消さない。** 打ち切りの断りで、
 *   無いと「7,736社ぶんの名簿が手に入る」と読まれる。
 * ⚠ **題と足元で揃える。** 親（`.page-head__top`）が `align-items: baseline`。 */
.fd-count { font-size: var(--fs-sm); color: var(--text-secondary); }
.fd-count b {
  font-size: var(--fs-lede); font-weight: var(--fw-bold); letter-spacing: -0.02em; color: var(--text-primary);
  font-variant-numeric: tabular-nums; margin-right: 2px;
}
.fd-count .fd-count__sub { color: var(--text-muted); font-size: var(--fs-sm); }

.fd-tablewrap { margin: 0; }
/* ⚠⚠ **`border-collapse: separate` にする（2026-10-08、2026-10-09 に理由を更新）。**
   共有の既定は `collapse` だが、**畳んだ罫線を持つセルは `position: sticky` で
   動かせない**（罫線をセルから剥がして表の側で描くため）。企業個票の
   `.ct-scroll`（`static/saas.css`）で実測済み。
   ⚠ **2026-10-08 に書いてあった理由（外向きの `box-shadow` が描かれない）は
     もう効いていない。** 境目は `inset` の2px になったので、`collapse` でも
     線自体は出る。それでも戻さないこと —— 戻すと sticky のほうが死ぬ。
   ⚠ `border-spacing: 0` を必ず添える。既定の 2px が入ると全セルに隙間が空いて、
     貼り付いた見出しの**その隙間から行が覗く**（直したかったものが戻る）。
   ⚠ 行の区切りは下で `border-top` を1本ずつ引いているので、`separate` にしても
     二重線にはならない（`collapse` が畳んでいたのは隣接セルの**左右**の罫線で、
     この表は左右に罫線を引いていない）。 */
.fd-table {
  margin: 0; font-size: var(--fs-md); table-layout: fixed;
  border-collapse: separate; border-spacing: 0;
}

/* ⚠⚠ **並び順の1文は 2026-10-09 に画面から消した（指摘）。読み上げは消していない。**

   「検出数の多い順。列見出しで並べ替えできます。」が表の真上に毎回出ていたが、
   列見出しは `<button>` で、押せば `aria-sort` も立つ。**見えている人には操作の
   手がかりが既にある**ので、この行は場所を取っているだけだった。

   ⚠ **`display: none` にしない。** `<caption>` は表に入ったときに読み上げられるので、
     いまどの基準で並んでいるかを支援技術に渡す口はここしかない（`paintCap()` と
     `aria-sort` が対）。`app.css` の `.vh` と同じ手で、1つめの文だけを隠す。
   ⚠ **`font-size: 0` / `line-height: 0` が要る。** `<caption>` の中には改行と
     インデントの空白ノードが残るので、これが無いと**文字を消しても行が1行ぶん残る。**
   ⚠ **2つめ（点線の意味）は見えるまま。** 「解約とは限りません」は法務上いちばん
     効く断り書きで、点線が出ているとき＝選んでいるときだけ JS が入れる。 */
.fd-cap { caption-side: top; text-align: left; padding: 0; font-size: 0; line-height: 0; }
.fd-cap__t {
  position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0;
  overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0;
}
.fd-cap__note {
  display: block; padding: 10px 16px 0;
  font-size: var(--fs-sm); line-height: 1.6; color: var(--text-muted);
}
.fd-cap__note[hidden] { display: none; }

/* ⚠ **共有の `.tablecard th, td` は 10px 16px。** 6列だと横 16px は広すぎるので
   横だけ詰める。**縦は詰めない**（4px にしていたのが「窮屈」の正体）。
   `.fd-result` を前置きして、app.css 側の `.tablecard td` と specificity で並ぶ
   ようにしてある（同点だと読み込み順まかせになる）。 */
.fd-result .fd-table th, .fd-result .fd-table td {
  padding: 10px 12px; vertical-align: middle; line-height: 1.55;
}

/* ⚠ **thead を sticky にするときは必ずヘッダーの高さぶんだけ下げる。**
   `top: 0` にすると1行目がヘッダーの裏に隠れる（app.css の `.tablecard` が
   sticky を諦めているのはこれを踏んだから）。背景も不透明にしないと透ける。

   ## 「濃い地 + 太い罫」をやめた（2026-10-09・4回目の作り直し）

   直したい問題は一度も変わっていない: **貼り付いた見出しの真下で行が途中から
   切れるので、半分だけ見えている行が見出しから溢れ出しているように読める**
   （「裏側を突き抜けている」）。手の変遷はこう ——

   | 回 | 手 | 言われたこと |
   |---|---|---|
   | 1 | 罫線 1px のみ | （元の問題） |
   | 2 | 7px のグラデーションの影 | **「header の shadow が変」**（実測で煤が乗って見えた） |
   | 3 | 地 `--plane` + 下罫 2px `--baseline` | **「デザイン的に微妙」** |
   | 4 | 地 `--gridline` + 1px | **「色とか、下線を太くしているところがダサすぎ」** |

   ⚠⚠ **「濃い地 + 太い罫」で解こうとするのをやめた。** 2〜4 はどれも
     *境目を強くする*方向で、強くするほど「ダサい」と言われている。
     求められているのは**軽さ**で、現代的な表（Linear / Notion / スプレッドシート）は
     こう解いている ——

   - **地は面と同じ**（`--surface-1`）。帯で殴らない。見出しが「ラベルの行」だと
     言うのは**字のほう**（`--fs-xs` + `letter-spacing` + `--text-secondary`）。
   - **罫は 1px 1本**。ただし色は `--baseline` で、**行の区切り（`--gridline`）より
     一段だけ濃い**。この差が「ここは行と行の境ではない」を言う唯一の線。
     ⚠ **`--gridline` にしない。** 行の区切りと同じ色にした案（対照）は、実測で
       元の問題がそのまま出た（切れた行が見出しから続いて見える）。
   - **深さは影が言う**（`--shadow-lid`）。⚠ **2 の失敗（煤）との違いは、
     硬い罫と**セットで**使うこと。罫が境目を決め、影は「行がその下をくぐって
     いる」ことだけを言う。実測は `app.css` の `--shadow-lid` の注記。

   ⚠⚠ **`/product/`（`static/saas.css` の `.sx-scroll .sx thead th`）と
     必ず同じ組にする。** 同じサイトに貼り付く見出しが2つあるので、片方だけ
     触ると形が割れる（実際に割れていた）。`tests/web/test_stylesheet.py::
     test_the_two_sticky_table_heads_are_cut_from_the_same_cloth` が縛っている。
   ⚠ **実機で確かめること（2倍）。** 見出しの真下で行がちょうど半分に切れる位置まで
     実際にスクロールして撮る。判定は「切れた行の文字が見出しから湧いて出て
     見えないか」の1点で、これを外した案は4回とも戻っている。
   ⚠ 地は**不透明**であること。透けると下を流れる行で見出しが読めなくなる。
   ⚠ **縦罫（列の切れ目）は引かない。** 6列ぶんの縦線は、軽くするという
     今回の目的と正面から反対。列の区別は見出しの字と右寄せが既に言っている。 */
.fd-result .fd-table thead th {
  position: sticky; top: var(--fd-top, var(--bar-h)); z-index: 4;
  background: var(--surface-1); color: var(--text-secondary);
  font-size: var(--fs-xs); font-weight: var(--fw-semibold); letter-spacing: .04em;
  padding-top: 10px; padding-bottom: 10px; white-space: nowrap;
  border-bottom: 1px solid var(--baseline);
}
/* ⚠⚠ **影は「貼り付いているときだけ」出す（2026-10-09・5回目の指摘）。**
   常に出していたら**「この shadow が強すぎるね」**と言われた。濃さを下げる方向に
   動かすのは2回目・4回目と同じ轍（「濃すぎ」↔「弱くて読めない」を往復する）。

   ⚠ **軸を変えた。** 表の先頭を見ているあいだは**下に流れている行が無い**ので、
     影には意味が無い —— ただの飾りで、だから強く見える。行がくぐっている
     ときにだけ蓋に見えればよい。
   ⚠ `.is-stuck` を付け外しするのは `static/app.js` の `stickyLid()`
     （`IntersectionObserver` + 見出しの1px上のセンチネル `.fd-lidmark`）。
   ⚠ **JS が死んだら影なし**（罫1本で読める）。進歩的強化の作法どおり。
   ⚠ `/product/`（`static/saas.css`）と**同じ形**にすること。 */
.fd-result .fd-table.is-stuck thead th { box-shadow: var(--shadow-lid); }
/* 貼り付いたかを見るためだけの 1px。**高さを持たせない**（行の間が空く）。 */
.fd-lidmark { height: 1px; margin-bottom: -1px; }

/* ⚠ **行の区切りは `--gridline`。** `--border`（黒の 10% 透過）は面の上でほぼ
   消えて、6列を目で追えなかった。
   ⚠ **`border-top` で引く。** `.tablecard tbody tr:last-child td { border-bottom: 0 }`
     は「1ドメイン = 1 `<tbody>`」だと**全行に当たって区切りが全部消える**
     （どの行も自分の tbody の last-child なので）。上罫線なら1本ずつ確実に出る。 */
.fd-result .fd-table tbody td {
  border-bottom: 0; border-top: 1px solid var(--gridline);
}
.fd-result .fd-table tbody:first-of-type tr:first-child td { border-top: 0; }

/* ⚠ **プロダクトの帯に幅を回す。** ここが「何が入っているか」を見せる列で、
   この画面の売り物。企業名とドメインは省略記号で足りる。 */
/* ⚠⚠ **企業の列をいちばん広く（2026-10-09）。** 以前は企業 23% に対して
   プロダクト列が `auto`（＝残り全部、実測で 40% 近く）で、**社名が途中で
   切れているのに右のチップは3つで打ち止め**という配り方だった
   （「『検出できているプロダクト』については、横幅は小さくしたいな。もっと。
   そのうえで、『企業』を横幅を広くしてほしいな」）。
   ⚠ **プロダクト列を `auto` に戻さない。** 戻すと残りを全部持っていく。
   ⚠ 合計は 100% ちょうどにしない —— 数の2列は px 指定なので、%の合計は
     それを引いた残りに対して効く。 */
.fd-th-name { width: 34%; }
.fd-th-pref { width: 7%; }
.fd-th-dom  { width: 14%; }
.fd-th-n    { width: 66px; text-align: right; }
.fd-th-prod { width: 26%; }
.fd-th-emp  { width: 82px; text-align: right; }

/* ⚠ **並べ替えボタンは見出しの文字そのものに見せる**（`static/saas.css` の
   `.sx__sort` と同じ作法）。ボタンらしい箱を足すと6列ぶんのノイズになる。
   方向は `aria-sort` が持ち、矢印はその写し。 */
.fd-sort {
  appearance: none; background: none; border: 0; padding: 0; margin: 0;
  font: inherit; color: inherit; cursor: pointer;
  display: inline-flex; align-items: center; gap: var(--gap-ic);
}
.fd-sort:hover { color: var(--text-primary); }
.fd-sort::after { content: "↕"; font-size: var(--fs-xs); color: var(--text-muted); opacity: .55; }
.fd-table th[aria-sort] .fd-sort { color: var(--text-primary); }
.fd-table th[aria-sort="ascending"] .fd-sort::after { content: "↑"; opacity: 1; }
.fd-table th[aria-sort="descending"] .fd-sort::after { content: "↓"; opacity: 1; }
.fd-sort:focus-visible { outline: 2px solid var(--series-1); outline-offset: 3px; }
/* 数の列は右寄せなので、ボタンも右端に寄せる。 */
.fd-th-n .fd-sort, .fd-th-emp .fd-sort { justify-content: flex-end; width: 100%; }

.fd-table tbody tr:hover { background: var(--tint-1); }
.fd-table tbody.fd-g--open { background: var(--tint-1); }

/* ⚠ **個票がある会社だけリンクになる**（検出3件未満はページを作っていない）。

   ⚠⚠ **常時の下線を戻さない（2026-10-09）。** 「押せることを見せる」つもりで
   全行に薄い下線を引いていたが、**60 行全部に線が入ると罫線に見える** ——
   表にはすでに行の区切り線があるので、横線が2本ずつ並ぶ状態だった
   （「下線だけどやめてくれる？ホバーしたときにつけてもいい」）。

   **押せることはこの3つが言っている:**
     ・文字の濃さ（`--text-primary` と `.fd-name--none` の `--text-secondary`）
     ・行の hover（`.fd-table tbody tr:hover`）と `cursor: pointer`
     ・ホバーしたときの下線（下）
   ⚠ **色で全行を青にしない。** 60 行が全部青だと、それはリンクの一覧であって
     表に見えない。 */
/* ⚠ **太字にしない（2026-10-09）。** 60行が全部太いと表が重い
   （`app.css` の `.cname` と同じ判断。2つの表で揃える）。 */
.fd-name { font-weight: var(--fw-normal); color: var(--text-primary); text-decoration: none; }
a.fd-name:hover {
  color: var(--link);
  text-decoration: underline; text-decoration-color: var(--series-1);
  text-decoration-thickness: 1px; text-underline-offset: 3px;
}

/* ⚠⚠ **クリック範囲は行全体（2026-10-09）。** 「企業名のところしか
   クリックできません」と言われた。`/product/` の表（`saas.css` の `.ct`）は
   先に同じ形で解いてあり、**同じ形の表なのにこちらだけ残っていた**。
   作りもあちらと揃える: リンクの `::after` を行いっぱいに広げるだけで、
   **JS は1行も書かない**（`<tr>` にハンドラを付けない）。

   ⚠ **行の中の他の押せるものは覆いの上へ逃がす必要がある。**
     この表には `.fd-share`（「ほかN社」）があるので、下で `z-index` を上げている。
     **行に押せるものを追加するときは同じ手当てが要る** —— 忘れると
     覆いに隠れて黙って押せなくなる。
   ⚠ `.fd-name--none`（個票が無い会社）も `<a>` なので、行全体が押せる。
     行き先は `/company/not-listed/`（なぜ個票が無いかの説明）。 */
.fd-table tbody tr { position: relative; }
.fd-table tbody tr:has(a.fd-name) { cursor: pointer; }
.fd-table tbody td > a.fd-name::after,
.fd-table tbody .fd-c-name__in > a.fd-name::after {
  content: ""; position: absolute; inset: 0;
}
.fd-table tbody .fd-share { position: relative; z-index: 1; }
/* ⚠⚠ **`.fd-c-name` に `overflow: hidden` を戻さない（2026-10-09）。**
   行全体を押せるようにしたので（下の `a.fd-name::after` の覆い）、
   このセルで切ると**覆いが社名のセルの中だけにクリップされて**、
   指摘の状態（社名の文字しか押せない）に戻る。
   切り詰めは**中の要素側**でやる（下の行）ので、ここでは不要。 */
.fd-c-name > span, .fd-c-name > a { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fd-c-pref { color: var(--text-secondary); white-space: nowrap; }
.fd-c-dom {
  font-family: ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;
  font-size: var(--fs-xs); color: var(--text-muted);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.fd-c-n { text-align: right; font-variant-numeric: tabular-nums; font-weight: var(--fw-semibold); }
.fd-c-n--0 { color: var(--text-muted); font-weight: var(--fw-normal); }
.fd-c-emp { text-align: right; font-variant-numeric: tabular-nums; color: var(--text-secondary); white-space: nowrap; }

/* 検出できたプロダクト。**名前とアイコンを1行に詰める**（折り返すと行の高さが暴れる）。

   ⚠ **セルの右端は「ほか N」で閉じる。** 帯を列幅で切り落としていた頃は、
     3つめが名前の途中で断たれて `Send…` `Micr…` が並び、**読み込みに失敗した
     ように見えていた**。いまは JS が出す帯を 3 個に固定し、残りは
     `n - 表示数` の**正確な数**を chip で出す（`static/app.js` の `rest`）。
   ⚠ フェードは**保険**として残す。名前が極端に長い1個が枠を超えたときだけ効く。
   ⚠ 帯そのものの見た目は共有の `.chip` に合わせてある（`--fs-xs` / 2px 9px / 999px）。
     ここだけ 10.5px にしていたので、他のページのチップより一段小さく浮いていた。 */
.fd-c-prod { display: flex; gap: var(--gap-1); align-items: center; min-width: 0; }
.fd-tags {
  display: flex; gap: var(--gap-1); align-items: center; overflow: hidden;
  flex: 1 1 auto; min-width: 0;
  -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 12px), transparent);
  mask-image: linear-gradient(to right, #000 calc(100% - 12px), transparent);
}
.fd-tag {
  display: inline-flex; align-items: center; gap: var(--gap-ic); flex: none;
  /* ⚠ 左だけ狭いのはアイコンが入るため。縦と右は `--pad-chip` と揃える。 */
  font-size: var(--fs-xs); padding: 2px 9px 2px 4px; border-radius: var(--radius-pill);
  border: 1px solid var(--border); background: var(--surface-1);
  color: var(--text-secondary); white-space: nowrap;
  /* ⚠ **2個 + 「ほか N」がセル（約 400px）に収まる幅にする。** 168px にすると
     2個目が必ずフェードに食われて、切れ端が並んで見えた。 */
  max-width: 152px;
}
.fd-tag > span:last-child { overflow: hidden; text-overflow: ellipsis; }
/* ⚠ **`.fd-tag--plain` は消した。** `app.js` が出す帯は `--gone` / `--none` /
   `--more` の3種だけで、アイコン無しの帯を作る経路が無い。 */
.fd-tag--more { color: var(--text-muted); flex: none; padding-left: 9px; }
.fd-tag--none { border-style: dashed; color: var(--text-muted); background: transparent; }
/* 「検出できなくなった」で当たった製品。**強調しない** —— 推論だから。 */
.fd-tag--gone { border-style: dashed; color: var(--text-muted); }

/* ---------------------------------------------- 同じドメインを共有する法人 */

/* ⚠ **同じ URL に複数の法人がぶら下がるのがこのデータの地雷。**
   別々の行にすると「同じ会社が何度も出てくる」ように見える。1行＝1ドメインにして、
   法人はここに畳む。 */
/* ⚠ **`flex: none`。** 縮んでよいのは社名だけで、このボタンが縮む／押し出されると
   ドメイン共有を開く手段そのものが消える（上の `.fd-c-name--shared` の注記）。
   ⚠ 高さ 24px を切らない（指で押せる下限）。 */
.fd-share {
  font: inherit; font-size: var(--fs-xs); cursor: pointer; flex: none;
  min-height: 24px; padding: var(--pad-chip); border-radius: var(--radius-pill); white-space: nowrap;
  border: 1px solid var(--step-1); background: transparent; color: var(--link);
}
.fd-share:hover { background: var(--tint-1); }
.fd-share:focus-visible { outline: 2px solid var(--series-1); outline-offset: 2px; }
.fd-share::after { content: " ▾"; font-size: 0.7em; }
.fd-g--open .fd-share::after { content: " ▴"; }
/* ⚠ **「ほかN社」のボタンを、社名と同じ流れに置かない。**
 *
 * 以前はセル（211px）に `white-space: nowrap; overflow: hidden` を当てて、
 * 社名とボタンを1行に流していた。社名が長いとボタンが**セルの外へ押し出されて
 * 切り取られ、押せなくなる**。実測で8個中7個が `elementFromPoint` で
 * `null`（＝当たり判定が無い）だった。**ドメイン共有を開く手段が消えていた。**
 *
 * ⚠ **`<td>` を `display: flex` にしない。** セルが表のレイアウトから外れて
 *   列幅と罫線が壊れる（`app.css` の `.also__t` で同じ穴を踏んでいる）。
 *   中に1枚 `<div>` を挟んで、そちらを flex にする。
 * ⚠ **縮むのは社名だけ。** ボタンは `flex: none`。 */
.fd-c-name--shared { overflow: visible; }
.fd-c-name__in { display: flex; align-items: center; gap: var(--gap-2); min-width: 0; }
.fd-c-name__in > span, .fd-c-name__in > a {
  display: block; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* 畳んだ中身。**親の行にくっついて見せる**ので上罫線は引かない。 */
.fd-result .fd-table .fd-sub td {
  border-top: 0; padding: 4px 16px 12px 28px; background: var(--tint-1);
}
.fd-sub__h { font-size: var(--fs-xs); color: var(--text-muted); margin-bottom: 5px; }
.fd-sub__list {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: var(--gap-1) var(--gap-4); list-style: none; margin: 0; padding: 0; max-width: none;
}
.fd-sub__list li { margin: 0; font-size: var(--fs-sm); display: flex; gap: var(--gap-2); align-items: baseline; }
.fd-sub__list a { text-decoration: none; }
.fd-sub__list a:hover { text-decoration: underline; }
.fd-sub__pref { color: var(--text-muted); font-size: var(--fs-xs); }

/* ⚠ **色は `static/saas.css` の `.sx-empty` と揃える**（`--text-secondary`）。
   どちらも「表そのものを差し替えた 0 件表示」なのに、ここだけ `--text-muted` で
   注記のように弱く見えていた（これは注記ではなく、その条件の**結果**）。 */
.fd-result .fd-table .fd-empty td {
  padding: 44px 16px; text-align: center; color: var(--text-secondary); font-size: var(--fs-md);
  border-top: 0;
}
/* 0 件の表から、いちばん効く手を**1クリックで**打てるようにする。

   ⚠ **文ではなくボタンにする**（2026-10-09）。以前ここは地の文で
     「プロダクトを「いずれか」にする」と書いてあるだけだったので、読んだあと
     左の柱まで戻って切替を探す必要があった。多数選択 × AND は必ず0件になるので、
     **戻り道を結果のところに置く**（押すと `static/app.js` が `mode` を or にする）。
   ⚠ **`.fd-btn` を足さない。** あれは条件パネルの操作系で、ここは文の中の動詞。
     下線のあるリンクと同じ読み方にして、押せることだけを出す。 */
.fd-fix {
  font: inherit; font-size: inherit; font-weight: var(--fw-semibold);
  padding: 0; border: 0; background: none; cursor: pointer;
  color: var(--link); text-decoration: underline; text-underline-offset: 3px;
}
.fd-fix:hover { color: var(--step-4); }
/* 0件の中身。**見出し → 押せる手 → 外す候補**の順で、行を分ける。 */
.fd-empty__h { margin: 0; }
.fd-empty__fix { margin: 12px 0 0; }
.fd-empty__tips { margin: 14px 0 0; font-size: var(--fs-sm); color: var(--text-muted); }
/* 「なぜ0件か」。**ボタンの下に回す**（押せるものと理由を同じ行に並べない）。 */
.fd-fix__why { display: block; margin-top: 4px; font-size: var(--fs-sm); color: var(--text-muted); }
.fd-fix__why b { color: var(--text-secondary); font-weight: var(--fw-semibold); }
.fd-fix:focus-visible { outline: 2px solid var(--series-1); outline-offset: 2px; border-radius: var(--radius-xs); }

/* ---------------------------------------------------------------- 反応 */

/* 段は **599 / 899 の2つだけ**（`docs/design/responsive.md` §2。
   `tests/web/test_responsive.py` が3つ目を弾く）。

   ⚠⚠ **2026-10-10 に 1180 / 980 / 620 の3つから寄せ直した。機械的な置換ではない。**

   | もと | 何をしていたか | いま |
   |---|---|---|
   | 1180px | 従業員数の列を `display: none` | **段ごと消した**（列は消さない。下） |
   | 980px | 2段組をやめる + ドメインの列を `display: none` | **899px**（列は消さない） |
   | 620px | 所在地の列を `display: none` + セルを詰める | **599px**（詰めるだけ） |

   ⚠ **980 を 899 にしたのは「近いから」ではない。** 2段組が成立する下限は実測
     **884px**（300 の柱 + 24 の `--gap-5` + 560 の表）で、884〜980px は
     **2列が入るのに1列にしていた**帯だった。iPad 横（1024px）がぎりぎり外側に
     居ただけで、`.fd-side` が画面の 90% を占めていたのはこの判断のずれが元。

   ⚠⚠ **狭い画面で列を `display: none` にしない（2026-10-10）。** 直す前は
     従業員数・ドメイン・所在地の3列が、それぞれ別の閾値で消えていた。
     **所在地は「唯一確実な属性」**（`docs/design/web_design.md` §2.2）なのに、
     iPad 縦でも iPhone でも**画面のどこにも無かった** —— 消したものは
     畳まれているのではなく、どこにも無い。横スクロールで逃がす（下）。
   ⚠ **本物の `<table>` を `display: block` で畳まない。** 支援技術から表として
     読まれなくなる（`docs/design/responsive.md` §4.1）。畳めるのは `<div>` + grid で
     組んだ行だけなので、**compact でも横スクロールのまま**にしてある。
   ⚠ **当たり判定と hover はここで決めない。** 幅はレイアウトだけ。指で押せる
     大きさは下の `@media (pointer: coarse)` が持つ（同 §1.1）。 */
@media (max-width: 899px) {
  /* ⚠ **`1fr` と書かない。`minmax(0, 1fr)` にする。** `1fr` は `minmax(auto, 1fr)`
     の略で、トラックが中身の min-content より縮まない。下で表に `min-width` を
     入れてあるので、`1fr` だと**トラックごとそこまで広がって条件パネルまで
     画面からはみ出す**（390px で右半分が切れていた）。 */
  .fd { grid-template-columns: minmax(0, 1fr); gap: var(--gap-4); }

  /* --- 条件パネル: ここで初めて本物の popover として振る舞わせる ------------- */

  /* ⚠ **閉じた状態が既定。** この面に来た人が見たいのは結果であって条件ではない。
     ⚠ `:popover-open` を知らないブラウザでは**この2行ごと捨てられ**、柱は
       上の `.fd-side[popover]`（`display: block`）のまま本文の先頭に出る ——
       昔の形に戻るだけで、**条件が消えることはない**。下の `@supports` で
       そのとき開く口のほうを引っ込める（押しても何も開かないボタンを残さない）。
     ⚠ z-index は 5（要約バー）> 4（列見出し）> 3（貼り付く1列目）の順。
       トップバーの 30（`app.css`）は**超えない** —— あちらが常に手前。 */
  .fd-side[popover]:not(:popover-open) { display: none; }
  /* 下から出るシート。⚠ **全画面にしない。** 下に表が覗いていることが
     「後ろに結果がある」を伝える唯一の手がかり（高さの上限は `.fd-panel` が持つ）。 */
  .fd-side[popover]:popover-open {
    display: block; position: fixed;
    top: auto; right: 0; bottom: 0; left: 0;
    width: auto; height: auto; max-width: none; max-height: none;
    margin: 0; border: 0; padding: 0; background: none; overflow: visible;
  }
  /* ⚠ 色は `app.css` の `.pop::backdrop` と同じ。シートが2種類あるように見せない。 */
  .fd-side[popover]::backdrop { background: rgba(11,11,11,.30); }
  /* ⚠⚠ **高さの蓋を外さない（`max-height: none` にしない）。** 中身は
     プロダクト百数十件 + 都道府県 47 件で、外した結果が 2,300px の壁だった。
     ⚠ **85vh。`85dvh` にしない**（アドレスバーの出入りで跳ねる。`app.css` に既出）。
     ⚠ 角丸はここが持つ。`overflow-y: auto`（上の `.fd-panel`）がスクロール容器を
       作るので、中の sticky な見出しもこの角で切られる。
     ⚠ **地を不透明（`--surface-1`）にする。** 柱のときの `--glass-strong`（白 88%）は
       後ろが本文だったから成立していた。シートは**表の上に重なる**ので、
       透かすと罫線と行の文字が条件の文字に混ざって読めなくなる。 */
  .fd-panel {
    max-height: 85vh;
    border-radius: var(--radius) var(--radius) 0 0;
    background: var(--surface-1);
    box-shadow: var(--shadow-2);
  }
  /* --- 要約バー = `.page-head` ごと貼り付ける ------------------------------

     ⚠⚠ **新しいバーを作らない（2026-10-10）。** 表の上に「該当 N 社 ▾」の帯を
       置くのが素直に見えるが、件数の器は**この画面にちょうど1つ**しか置けない:
         - `static/app.js` は `[data-role=count]` を `document.querySelector` で
           引く（最初の1つだけ）。2つ目は**永遠に「読み込み中…」のまま**
         - その器は `.page-head` の中でなければならない
           （`tests/web/test_markup.py::test_the_counts_sit_next_to_the_heading_not_inside_the_table`
           が「題の横にある」「表カードの中に無い」を両方見ている）
       **写しを作るのではなく、本物を貼り付ける。**
     ⚠ `:has()` で絞っているのは、`.page-head` が全ページ共有の部品だから。
       **`.page-head` 単独で書かない** —— 定義が `app.css` と2箇所に割れて
       `tests/web/test_stylesheet.py::test_no_selector_is_defined_in_two_different_files`
       が落ちるし、他の面まで貼り付く。
     ⚠ **`top` は `thead`・シートと同じ値にする。** ここだけずらすと、貼り付いた
       バーと表の先頭の間に行が覗く（`.fd-panel` の `top` で一度踏んでいる）。
     ⚠ **地は不透明。** 透けると下を流れる表の行がそのまま件数に重なる。 */
  .page-head:has(.fd-count) {
    position: sticky; top: var(--fd-top, var(--bar-h)); z-index: 5;
    margin-bottom: var(--gap-3); padding: 8px 0 6px;
    background: var(--surface-1); border-bottom: 1px solid var(--gridline);
  }
  /* 下の罫線がバーの底になるので、中の余白は持たせない（二重に空く）。 */
  .page-head:has(.fd-count) .page-head__top { margin-bottom: 0; }
  .fd-sheet-open { display: inline-flex; }
  .fd-sheet-close { display: inline-flex; }

  /* ⚠ **popover を知らないブラウザでは、開く口を引っ込める。**
     `popovertarget` が効かないので、押しても何も起きないボタンだけが残る
     （条件そのものは上のとおり柱として出ているので、操作は成立する）。 */
  @supports not selector(:popover-open) {
    .fd-sheet-open, .fd-sheet-close { display: none; }
  }

  /* --- 表: 列を消さずに横へ逃がし、1列目を貼り付ける ----------------------- */

  /* ⚠ 720px 以下でトップバーの高さが可変になる（`app.css`）。高さが読めない
     ところで sticky を重ねると必ず隠れるので、**見出しの貼り付きはやめる**。
     ⚠ 下で `overflow-x: auto` のスクロール容器ができるので、**sticky thead とは
       どのみち併用できない**（`top` の基準がビューポートではなくなる）。 */
  .fd-result .fd-table thead th { position: static; }
  /* ⚠ **`prod` 列も含めて1列も落とさない。** 横に逃がす
     （`app.css` の `.tablecard` が狭い画面でやっているのと同じ手）。 */
  .fd-result { overflow-x: auto; }
  /* 6列ぶんの最小幅。⚠ **`0.80 × W + 148px ≦ W`** を満たすこと（%の4列と、
     px 指定の2列 66 + 82 の取り合い）。下回ると所在地が「神奈…」で切れる。 */
  .fd-result .fd-table { min-width: 820px; }
  /* ⚠ **wide の配り方（34/7/14/26）をそのまま使わない。** 所在地 7% は 1140px の
     表でこそ 4文字ぶん入るが、820px では 57px = 3文字で切れる。
     **横に振って読む表では、主役（企業名）を少し譲って全列を読める幅にする。** */
  .fd-th-name { width: 30%; }
  .fd-th-pref { width: 11%; }
  .fd-th-dom  { width: 15%; }
  .fd-th-prod { width: 24%; }

  /* ⚠⚠ **1列目（企業名）を貼り付ける。** 820px の表を 390px の画面で見るので、
     右へ振ると**何の行を見ているのか分からなくなる**。
     ⚠ **地を不透明にする**（透けると下を流れる列が社名に重なる）。
     ⚠⚠ **`position: sticky` は positioned。** つまりこのセルが
       `a.fd-name::after`（行いっぱいの覆い）の containing block になり、
       **899px 以下では「行のどこでも押せる」が「企業名のセルのどこでも押せる」に
       狭まる**。セルは常に画面に居るので押せない場所はできない。
       ⚠ **これを嫌って sticky をやめないこと。** 横に振って何の行か分からない
         ほうが致命的（2026-10-10 の実測で、表は画面の 2.1 倍の幅がある）。 */
  /* ⚠⚠ **`top: auto` を落とさない（2026-10-10・実測で踏んだ）。**
     すぐ上の節が `thead th { position: static }` で縦の貼り付きを切っているが、
     ここで `position: sticky` に戻すと**縦の貼り付きも一緒に戻る** ——
     しかも `top` は上の節が残した `var(--fd-top)` のままなので、
     **列見出しだけが下へずれて1行目のデータに重なった**
     （390px の実測: `thead` は top=334 なのに `th.fd-th-name` が **top=393**、
     `td.fd-c-name`（top=399）と 211x40 重なり、**「企業」の見出しが消えて見えた**）。
     ⚠ **横だけ貼る**のがここの仕事。`left` は指定し、`top` は明示的に殺す。
     ⚠ `qa_mobile.py` の `collide` 検査がこれを捕まえた。目視では
       「見出しが空欄」としか見えず、原因に辿り着けない型の壊れ方。 */
  .fd-result .fd-table thead th.fd-th-name,
  .fd-result .fd-table tbody td.fd-c-name {
    position: sticky; left: 0; top: auto; z-index: 3;
    background: var(--surface-1); border-right: 1px solid var(--gridline);
  }
  /* ⚠ **`background-color` で塗らない。** 不透明な地（`--surface-1`）を
     `--tint-1`（半透明）で置き換えると**その列だけ後ろが透ける**し、重ねると
     他の列より一段濃い青になる。画像として敷けば、他の列と同じ「地 + tint 1枚」。 */
  .fd-table tbody tr:hover td.fd-c-name,
  .fd-table tbody.fd-g--open td.fd-c-name {
    background-image: linear-gradient(var(--tint-1), var(--tint-1));
  }

  /* ⚠ `<caption>` は表の中なので、横スクロールに巻き込まれる。**説明文を読むために
     横に振らせない** —— 見えている幅で折り返させる（表だけが横に動けばよい）。
     ⚠ 当たる先は `.fd-cap__note`（点線の意味）1つだけになった。並び順の1文は
       視覚的に隠してあるので幅を持たない（上の `.fd-cap` の注記）。
     ⚠ **`.wrap` の左右と同じ値を読む。** 以前は `calc(100vw - 88px)`（44px × 2）と
       生の数で書いてあり、`--gutter` が 36px / 20px に落ちる幅では**実際より狭く**
       見積もっていた。数を2箇所に書かない。 */
  .fd-cap__note { max-width: calc(100vw - var(--gutter) * 2); white-space: normal; }
}

@media (max-width: 599px) {
  /* ⚠⚠ **ここで所在地の列を消していた（620px、〜2026-10-10）。もう消さない。**
     「所在地は左の条件で絞れる」と書いてあったが、**絞るのと読むのは別の用事**で、
     営業リストとして見るときに「どこの会社か」が無いのは致命的
     （`docs/design/web_design.md` §2.2 の「唯一確実な属性」）。
     代わりにセルの左右を詰めて、同じ幅により多くの列を見せる。 */
  .fd-result .fd-table th, .fd-result .fd-table td { padding: 10px 8px; }
  .fd-result .fd-table { min-width: 760px; }
  .fd-cap__note { padding-left: 12px; padding-right: 12px; }
  /* ⚠ **貼り付いた見出しの行を肥やさない。** 固定物は画面の 25% を超えない
     （`docs/design/responsive.md` §4.4）。320px では `h1`（25px）と件数が
     3行に折れるので、題だけ1段落として帯の高さを詰める。
     ⚠ **`--fs-*` に段を足さない。** 既にある `--fs-h2` に寄せる。 */
  .page-head:has(.fd-count) h1 { font-size: var(--fs-h2); }
}

/* ------------------------------------------------- 指で押せる大きさ（44px）

   ⚠⚠ **幅で決めない。** iPad 横（1024px・指）は「広いからマウス」と誤判定され、
     窓を 500px に狭めた PC（マウス）は「狭いから指」と誤判定される ——
     **幅で代用すると両方向に外す**（`docs/design/responsive.md` §1.1）。
   ⚠ **「`hover: none` は検証しにくい」はもう理由にならない。**
     `web/tools/qa_mobile.py` が `has_touch` を渡すので、タッチ端末としての
     描画を機械で見られる。
   ⚠ 基準は **44px が目標、24px が WCAG 2.2 AA の必須ライン**。
     2026-10-10 の実測（違反）: `input` 13x13 / `button.fd-sort` 33x18 /
     `a.fd-name` 136x22。
   ⚠ **本文中のインラインリンクは対象外**（WCAG 2.5.8 も除外している）。 */
@media (pointer: coarse) {
  /* ⚠ **チェックボックスの枠（13px）は大きくしない。** 大きくすると OS の部品と
     見た目が食い違う。**行（`<label>`）ごと 44px の当たり判定にする**のが正解
     （`docs/design/responsive.md` §4.2 の表）。枠だけを見る検査には 13x13 のまま
     映るが、指が触れる面は行全体。 */
  .fd-chk { min-height: 44px; }
  /* ⚠ **ピル（`<span>`）を大きくしない。** 見た目は変えず、`<label>` の箱だけを
     44px にして中央に置く。`.fd-mode label` には既に `cursor: pointer` がある
     （`tests/web/test_stylesheet.py::test_everything_you_can_press_says_so_with_the_cursor`）。 */
  .fd-mode label { display: inline-flex; align-items: center; min-height: 44px; }
  .fd-input { min-height: 44px; }
  /* 「すべて外す」「条件をすべて外す」「条件 ▾」「結果を見る」。 */
  .fd-btn--sm { min-height: 44px; }
  /* いま効いている条件を1つずつ外すチップ。**外す口が押せないと戻れない。** */
  .fd-off { min-height: 44px; }
  /* 0 件からの戻り道（「いずれか」に戻す）。文の中に居るが `inline-block` なので
     行間は壊れない。 */
  .fd-fix { min-height: 44px; }
  /* ⚠ **列見出しの並べ替えは高さだけでは足りない**（実測 33x18 で、幅のほうが
     先に足りなくなる）。見出しのセルいっぱいに広げる。 */
  .fd-sort { min-height: 44px; width: 100%; }
  /* 「ほか N 社」。⚠ **行の覆い（`a.fd-name::after`）より上に居る**ことは
     上の `.fd-table tbody .fd-share` が担保している。大きくしても隠れない。 */
  .fd-share { min-height: 44px; }
  /* ⚠ **文字は大きくしない。** 縦の `padding` で 22px -> 44px にして、同じだけ
     負の `margin` で戻す —— **行の高さは 1px も変えずに**当たり判定だけを広げる
     （60 行ぶん背が伸びると、せっかく上げた表がまた画面から出ていく）。 */
  .fd-c-name > a.fd-name, .fd-c-name__in > a.fd-name { padding: 11px 0; margin: -11px 0; }
}

/* `/search/` の、個票が無い会社。理由は `static/app.css` の `.cname--none` と同じ。
   ⚠ **`text-decoration-style: dotted` は消した（2026-10-09）。** 下線を常時から
   hover へ移した時点で、`<span>`（リンクでない側）には**掛かる線が無い**。
   残しておくと「点線で区別している」と読めるが、実際には**色だけ**。 */
.fd-name--none { color: var(--text-secondary); }
