`text-wrap: pretty` をプログレッシブエンハンスメントで適用するCSSフォールバック対応

shoelace-style/webawesome

Firefoxで text-wrap: pretty が未サポートなために発生していたテキストのオーバーフローバグを、@supports を使ったプログレッシブエンハンスメントで修正しました。

背景

native.cssp 要素に対して text-wrap: pretty が無条件に指定されていたことで、Firefoxでテキストのオーバーフローが発生していました。#2331 では、Firefoxで /docs/patterns/layouts/app-settings/ の設定グリッドを表示した際に、テキストが意図しない形ではみ出す現象が報告されています。

text-wrap: pretty は段落末尾の孤立語(orphan)を避けるなど、より洗練されたテキスト折り返しを行うCSS値ですが、現時点でFirefoxが未サポートであり、未知のプロパティ値として無視されます。その結果、折り返し挙動がブラウザのデフォルトに落ちるのではなく、表示崩れを引き起こしていました。

技術的な変更

@supports アットルールを使い、text-wrap: pretty をサポートするブラウザにのみ適用するプログレッシブエンハンスメントの構造に変更されました。

変更前:

p {
  text-wrap: pretty;
}

変更後:

p {
  text-wrap: wrap;
}
@supports (text-wrap: pretty) {
  p {
    text-wrap: pretty;
  }
}

ベースラインを text-wrap: wrap とすることで、全ブラウザで安定した折り返し動作を保証しています。MDNによれば wrappretty に近い挙動を提供するとされており、@supports で機能検出できるブラウザには引き続き pretty が適用されます。

設計判断

@supports によるプログレッシブエンハンスメントが採用されました。

単純に text-wrap: wrap へ戻すだけでも問題は解消できますが、この実装では pretty に対応済みのブラウザ(ChromeやSafariなど)での体験を損なわないよう、機能検出を組み合わせた構成が選択されています。ベースライン値としての wrap とエンハンスメントとしての pretty を明確に分離することで、将来Firefoxが pretty をサポートした際にも追加変更なく自動的に適用される設計です。

まとめ

@supports を活用したこの変更は、単なるバグ修正を超えてCSSの機能検出パターンの好例となっています。ベースライン動作を明示的に宣言した上で段階的に拡張する構造は、ブラウザ互換性の問題を将来にわたって自己解決する堅牢なアプローチです。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
a4315329

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

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

「総論→各論→結論」の構成が明確です。リード文で要旨を述べ、背景、技術的な変更、設計判断、まとめという各セクションが論理的に配置されています。

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きのシンタックスハイライト(```css:ファイルパス)や、PR/Issue番号のリンク記法([#123](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

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

「プログレッシブエンハンスメント」や「@supports」などの専門用語が前提知識として扱われており、対象読者であるエンジニアに適した技術レベルで書かれています。

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

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

各セクション、各パラグラフが「総論→各論」の構造で書かれ、トピックセンテンスが明確で非常に読みやすいです。1段落1トピックの原則も守られています。

Diff内容との照合 ✓ PASS

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

記事内の「変更前」「変更後」のコードブロックは、提供されたDiffの内容と完全に一致しており、変更点を正確に反映しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「text-wrap: pretty」、「@supports」、「プログレッシブエンハンスメント」といった技術用語が正確かつ適切な文脈で使用されています。

説明の技術的正確性 ✓ PASS

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

「@supports」を用いたプログレッシブエンハンスメントの仕組みや、それが将来のブラウザ互換性に与える影響についての説明が技術的に正確かつ論理的です。

事実の突合 ✓ PASS

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

記事内の主張はすべて、PRのDescription、Diff、またはPRが修正対象としているIssueの内容に基づいており、ハルシネーションは認められませんでした。

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

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

PR番号(#2361)およびIssue番号(#2331)が正確に記載・リンクされています。

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

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

記事のタイトルは、PRの変更内容の本質(プログレッシブエンハンスメントによるフォールバック対応)を的確に表現しており、PRの内容と完全に一致しています。

外部知識の正確性 ✓ PASS

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

PRの文脈(caniuse.comへのリンク)から妥当に推測できるブラウザ対応状況の補足に留まっており、根拠のない外部知識の追加はありません。

時間表現の正確性 ✓ PASS

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

PR内の「not yet supported」という表現を「現時点で未サポート」と正確に反映しており、時間表現の歪曲はありません。