CSSリント警告の解消:`text-wrap`・`resize`・`user-select`を`@supports`でラップ

basecamp/lexxy

Baseline 2023未満のCSS機能が引き起こすESLintのcss/use-baseline警告を解消するため、text-wrapresizeuser-selectの各プロパティを@supportsクエリでラップする変更が行われました。これにより、コアCSSファイルのリント品質が改善されます。

背景

lexxyのCSSコードベースでは、ESLintの css/use-baseline ルールによってBaselineの互換性が検査されています。このルールは、指定された基準(このリポジトリではBaseline 2023)を下回るブラウザ互換性のCSSプロパティを使用した場合に警告を発します。

対象となったプロパティは複数ありました。text-wrap: balancetext-wrap: prettytext-wrap: nowraptext-wrap: wrapresize: noneuser-select: noneが警告の原因として検出されています。これらはいずれもBaseline 2023の基準では広くサポート済みとは見なされていない、あるいはベンダープレフィックスが必要な機能です。

対処方針は2通りに分かれており、@supportsでラップするアプローチと、ESLintコメントによる個別抑制を使い分ける判断がなされています。

技術的な変更

主な対処方針は、問題のあるプロパティを @supports クエリ内に移動することで、ブラウザがそのプロパティをサポートしている場合のみ適用されるプログレッシブエンハンスメント構造に変換することです。

text-wrapの各値に対する変更はlexxy-content.csslexxy-editor.cssの両ファイルにまたがっています。以下はtext-wrap: balanceの変更例です:

変更前:

h1, h2, h3, h4, h5, h6 {
  text-wrap: balance;
}

変更後:

h1, h2, h3, h4, h5, h6 {
  @supports (text-wrap: balance) {
    text-wrap: balance;
  }
}

user-select: noneについては、ベンダープレフィックス付きの -webkit-user-select: none@supportsの外側に残しつつ、標準プロパティを@supports内に配置する構造が採用されました。

変更後:

-webkit-user-select: none;

@supports (user-select: none) {
  user-select: none;
}

一方、::selection { background: transparent; }については@supportsではなく /* eslint-disable-next-line css/use-baseline */ コメントによる抑制が選ばれています。これはプロパティのサポート有無で動作を切り替えることが適切でなく、リント警告を個別に無視する方が実態に即すると判断されたためと読み取れます。

あわせてlexxy-content.cssのコードブロックスタイル(pre要素)では、word-break: break-wordが削除され、代わりにoverflow-wrap: break-wordが追加されています。これはより標準的な長語折り返しの指定への置き換えです。

設計判断

@supportsによる機能検出ESLintコメントによる個別抑制 を使い分ける方針が採用されました。

@supportsでラップする方式は、ブラウザがプロパティをサポートしていない場合にそもそも適用しないというプログレッシブエンハンスメントの原則に沿っています。text-wrapresizeuser-selectのような「あれば望ましい」装飾的・操作的なプロパティに対して適切な対処といえます。フォールバックを別途定義するのではなく、未サポート時には単純に無効化されるため、コードの複雑度を最小に抑えています。

一方、::selectionへのeslint-disableコメントは、@supportsが適用できないケース、もしくは挙動の切り替えが不要なケースへの対処として機能しています。2つのアプローチを意識的に使い分けることで、リント警告への対応が機械的な一括処理ではなく、プロパティごとの意図を反映した形になっています。

まとめ

この変更は、ESLintのリント警告をゼロにしながら、CSSの適用ロジックをブラウザの機能サポートに応じて分岐させるプログレッシブエンハンスメント構造へと整理した点に意義があります。@supportsの活用とコメントによる個別抑制の使い分けは、リント対応の実装において参考になる設計パターンです。

記事メタデータ

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

この記事は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:ファイルパス)およびGitHubのPRリンク記法([#1061](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

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

ESLint、CSS Baseline、プログレッシブエンハンスメントといった用語が前提知識として扱われており、専門知識を持つエンジニアという対象読者に適合しています。

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

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

各パラグラフがトピックセンテンスで始まり、1段落1トピックの原則が守られています。段落の長さも適切で、可読性が高いです。

Diff内容との照合 ⚠ WARNING

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

`user-select`プロパティに関するコード引用が、変更の前後関係を若干単純化して表現しています。ただし、技術的な意図の理解を大きく妨げるものではありません。その他のコード引用は正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`css/use-baseline`、`@supports`、`プログレッシブエンハンスメント`、`ベンダープレフィックス`など、技術用語が正確かつ文脈に即して使用されています。

説明の技術的正確性 ✓ PASS

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

`@supports`による機能の分離や、`overflow-wrap`への置き換えの意図など、技術的な変更点に関する説明は正確で論理的です。

事実の突合 ⚠ WARNING

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

「設計判断」セクションは、PRのDescriptionには明記されていない、コードから読み取った設計意図の解説です。内容は技術的に妥当な解釈ですが、厳密にはPR情報に基づかない推測と見なされます。

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

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

PR番号(#1061)やファイルパスなどの固有名詞は、提供された情報と正確に一致しています。

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

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

記事のタイトルはPRの主題である「CSSリント警告の解消」と、その具体的な手法を要約しており、PR内容と完全に一致しています。

外部知識の正確性 ✓ PASS

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

PRで言及されていない外部知識(例: バージョンのサポート終了情報など)の追記はなく、すべての記述がPRの文脈内に収まっています。

時間表現の正確性 ✓ PASS

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

記事内で「既に」「近い将来」といった時間表現は使用されておらず、時間表現の歪曲に関する問題はありません。