# テキスト収まり検査の実用対応

指定した最小・最大幅と高さに対して、単一行・折り返し後の両方を検査する。
以下の順で、探索 → 失敗するテスト → 実装 → 整理を進める。
ブラウザに任せる判定と MoonBit の予測値を区別し、不明な結果を合格扱いしない。

## 優先順位

1. [x] フォント選択・読み込み失敗・フォールバック
   - 必須の Web フォントを指定でき、未登録・読み込み失敗を結果に含める。
   - 混在文字・合成太字を実ブラウザで検証する。実際に使われた字形のフォントを断定できない場合は明示する。
   - `requiredFonts` / `fonts` 診断を追加。未登録・選択フォントの読み込み失敗は `font-error`。字形ごとのフォントは `unverified`。
   - 3 エンジン × 3 ケース成功。単位なし line-height の複製で発生する丸め誤差も修正。
2. [x] Flex / Grid 内の幅制約
   - 実配置の利用可能幅、`min-width:auto / 0`、縮小、兄弟要素の占有を検証する。
   - 親からはみ出した要素自体と、要素内部のテキスト超過を区別する。
   - `placement` に親の領域と超過距離を追加。兄弟要素を押し出すケースと通常のインラインラベルも検証。3 エンジン × 3 ケース成功。
3. [x] アイコン付き・複合インライン要素
   - SVG・画像・`inline-block`・バッジ・文字列の疑似要素を含む幅を検査する。
   - 測定のために元 DOM を変更せず、外部リソースを再取得しない。
   - SVG / 画像は取得済みの寸法を持つ無害な箱として計測。inline-block と文字列・空文字の疑似要素に対応。
   - 計測用 DOM をページの CSS から隔離し、タグ指定の疑似要素の二重適用を防ぐ。
   - CSS counter / URL / 位置指定の疑似要素は対象外。3 エンジン × 4 ケース成功。
4. [x] 省略表示と祖先によるクリップ
   - 全文表示・省略表示・意図しない切断・スクロール可能な超過を区別する。
   - 対象と祖先のクリップ境界を報告し、省略を許容するか指定できる。
   - `presentation` / `accepted` / `allowTruncation` を追加。物理的な `layout.status` と合否を区別。CLI でも省略許可を指定可能。
   - 省略許可でも最小・最大幅の制約を保持。3 エンジン × 5 ケース成功。
5. [x] 日本語と長い文字列の改行
   - 禁則、括弧・句読点、長い URL、NBSP、ZWSP、ソフトハイフン、明示改行、連続空白を検証する。
   - ブラウザ自身の行分割を基準とし、単語・行数の決め打ちを避ける。
   - 既存のブラウザ委譲を維持し、実際の Range と高さを比較する 3 エンジン × 7 ケースを追加・成功。
6. [x] `input`・`textarea`
   - 値・placeholder・内部余白・横スクロール・複数行を検査する。
   - パスワード等の対象外コントロールは明示する。元の値・選択・スクロール位置を保存する。
   - text / email / url / tel と textarea に対応。placeholder の書体、末尾改行、wrap=off も計測。
   - password / search 等の装飾付きコントロールは対象外。3 エンジン × 4 ケース成功。
7. [x] 可変フォントの追加軸
   - `wdth`・`opsz`・`font-stretch`・自動光学サイズを検証する。
   - MoonBit の軸指定を JS の測定 API に接続し、選択された軸を結果に残す。
   - `shapeTextWithAxes` / 非同期 `measureWithAxes` / CLI の軸指定を追加。Roboto Serif の固定参照フォントも追加。
   - 幅・光学サイズの明示指定は macOS Chromium で幅差 0.05px 未満。Linux の比較では FreeType の整数フォント単位への丸め上限を字数から計算する。DOM の収まり判定の許容幅は変更しない。
   - 自動光学サイズと CSS font-stretch は 3 エンジンで実測確認。
8. [x] 単純な拡大縮小・CSS zoom
   - 正の軸平行な scale / translate / zoom を共通座標に換算する。
   - 回転・傾斜・3D・反転は対象外として明示する。小数幅の境界も検証する。
   - 座標を元の CSS ピクセルへ正規化。zoom の枠線丸めはエンジン自身に計測させる。
   - 祖先と対象の scale / zoom、独立 scale プロパティ、DPR=2 の非対称枠線を含む 3 エンジン × 8 ケース成功。

## 検証

- [x] `moon check --deny-warn` と `pnpm run check:browser` 成功。
- [x] MoonBit 通常ターゲット 220 件、JS ターゲット 220 件成功。
- [x] `just test-browser`: Chromium / Firefox / WebKit の DOM 検査 50 ケースずつと、Chromium の字形・幅比較 30 ケース、合計 180 件成功。
- [x] CLI: 明示的な幅・光学サイズの指定で幅差 0.000178px。省略禁止は終了コード 1、許可した ellipsis / line clamp は 0。
- [x] CLI: 既存ページの祖先による切断、必須フォント不在を終了コード 1 として検出。
- [x] `git diff --check` / `moon fmt --check` 成功。CI に軸指定の計測 JSON を追加。

## 後続候補

- 縦書き、段組、回転・3D 変形。
- Shadow DOM の内部検査。
- search / password / select 等、ブラウザ固有の描画や秘匿値を持つコントロール。
- CSS counter / URL / 位置指定の疑似要素、子孫独自の変形・位置指定。
- 影や装飾まで含めた描画ピクセル境界。
