Preflight が Firefox の iframe:focus-visible スタイルを上書きしないように修正

tailwindlabs/tailwindcss

Preflight の :-moz-focusring ルールが Firefox のネイティブ iframe:focus-visible アウトラインを上書きしていた問題を、セレクタに :where(:not(iframe)) を付加して除外するよう修正しました。これにより、iframe 以外の要素では従来どおりフォーカスリングが適用され、Firefox のデフォルト挙動は保持されます。

背景

Firefox は iframe:focus-visible { outline-style: none; } を UA スタイルシートで定義しており、iframe がフォーカスされたときに自動的にアウトラインが付かないよう設計されています。 Tailwind の Preflight が :-moz-focusring { outline: auto; } を追加したことで、Firefox のこのデフォルトが上書きされ、iframe に不要な自動アウトラインが表示されるケースが報告されました(#19795)。この挙動は特にキーボード操作で iframe 内の要素にフォーカスが移動した際に顕著で、アクセシビリティ体験を損ねるため、修正が必要と判断されました。

技術的な変更

:-moz-focusring セレクタに :where(:not(iframe)) を付与し、iframe を除外するように変更しました。 変更前と変更後のコードは以下の通りです。

-:-moz-focusring {
+:-moz-focusring:where(:not(iframe)) {
   outline: auto;
 }

このシンプルな置換により、iframe 以外の要素では従来通り outline: auto; が適用され、iframe だけは UA スタイルシートの outline-style: none; がそのまま有効になります。

テストスイートとスナップショットが同様に更新され、期待されるセレクタが反映されています。 integrations/cli/index.test.tspackages/@tailwindcss-postcss/src/__snapshots__/index.test.ts.snappackages/tailwindcss/src/__snapshots__/index.test.ts.snappackages/tailwindcss/src/source-maps/source-map.test.ts の全てで :-moz-focusring から :-moz-focusring:where(:not(iframe)) への差分が追加・削除されています。これにより CI が新しいセレクタを検証し、回帰を防止します。

CHANGELOG にも変更内容が追記され、リリースノートとして利用可能になっています。 具体的には CHANGELOG.md に「Prevent Preflight from overriding Firefox's native iframe:focus-visible outline styles」(#20292) が追加され、利用者が変更点を容易に把握できるようになりました。

設計判断

:where(:not(iframe)) を用いる選択は、既存のセレクタの構造を極力保持しつつ例外要素だけを除外する最小限のアプローチです。 :where() は特異性が 0 であるため、他の CSS ルールとの衝突リスクを増やさずに目的を達成できます。この点は、Firefox 以外のブラウザでも安全に評価され、将来的な UA スタイルシートの変更にも柔軟に対応できます。

設計上のトレードオフはほとんどなく、既存の :-moz-focusring ルールの動作を変えずに例外だけを除外できる点が評価されました。 新たな設定キーやフラグを導入する必要がなく、コードベースへの侵入度が低いため、メンテナンスコストも最小限に抑えられています。

まとめ

この PR は、Firefox のネイティブ iframe:focus-visible スタイルを尊重しつつ、Preflight のフォーカスリング改善を維持するためのセレクタ修正です。:where(:not(iframe)) の導入により、iframe の自動アウトラインが除外され、アクセシビリティとブラウザ固有の挙動が調和しました。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
1c5a821a

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文、背景、技術的な変更、設計判断(任意)、まとめの全要素が揃っており、総論→各論→結論の流れが明確です。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

コードブロックは正しい ```${language}:${filepath}``` 形式で記述され、GitHub の Issue/PR リンクは # 付きで正しくリンク化されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

専門的な CSS/Preflight の知識を前提とした記述で、余計な初心者向け解説はなく、対象エンジニアに適したレベルです。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションは総論パラグラフ、具体的な各論、結論パラグラフで構成され、段落はトピックセンテンスで始まり1トピックに限定、長さも適切です。空行も確保されています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内のコードブロックは提供された Diff と完全に一致し、ファイル名・変更内容とも一致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

使用されている CSS セレクタや Preflight 関連用語は PR で使用されたものと一致し、誤用はありません。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

技術的な説明は PR の記述と Diff に基づき正確で、因果関係も論理的です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内の全ての主張は PR のタイトル・説明・Diff で裏付けられており、推測や捏造は見受けられません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR 番号 #20292、Issue 番号 #19795 など数値は正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルは PR の目的(iframe のアウトラインを除外する修正)を適切に日本語化しており、内容と食い違いはありません。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事は PR に記載された情報以外のバージョンサポートやリリーススケジュール等の外部知識を含んでいません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

時間表現の歪曲はなく、PR の記述と一致しています。