prose.css に @scope を導入し、wa‑prose と wa‑not‑prose の近接認識を実装

shoelace-style/webawesome

@scope を用いて prose.css のルールをラップし、wa-prosewa-not-prose が入れ子構造でも期待通りに適用・除外できるようになりました。この変更はレイヤー優先順位と CSS Specificity の二重課題を根本的に解決します。

背景

現在の実装では wa-prosewa-not-prose が同一 @layer wa-utilities 内で定義されており、wa-not-prose がレイヤー全体のプロパティを revert-layer で巻き戻すため、他ユーティリティのフォントサイズやマージンリセットまで無効化していました(問題 1)。

さらに、wa-not-prose の方が Specificity が高く、wa-prosewa-not-prose 内に配置しても再度 wa-prose を有効化できず、問題 2 が発生していました。このため、ドキュメントとコード例のスタイルが不整合になるケースが多数報告されていました。

これらの課題は、wa-prosewa-not-prose が要素の近接性(proximity)に応じてスタイルを切り替えることができないことに起因します。そこで、スコープベースの解決策が採られました。

技術的な変更

@scope を利用して :where(.wa-prose):where(.wa-not-prose) をそれぞれ fromto の範囲でラップしました。これにより、スコープ外のスタイルは影響しず、入れ子構造でも正しく継承・除外が行われます。

@@
-  :where(.wa-prose) {
-    /* 旧実装 … (省略) */
-  }
+  @scope (.wa-prose) to (.wa-not-prose) {
+    /* 新実装 – ルートは 0,0,0 Specificity のまま、内部は従来通り */
+    --wa-prose-rhythm-scale: 1;
+    /* 省略: 既存トークン・ヘディング定義など */
+  }

コードブロックの前後には必ず空行を入れ、差分の削除行(-)と追加行(+)を明示しています。変更前は :where(.wa-prose) のみで定義され、wa-not-prose がレイヤー全体に影響していましたが、@scope に置き換えることで wa-not-prose はスコープ外に限定されます。

この変更は prose.mdchangelog.md の記述も更新し、利用例に wa-prose wa-font-size-s のように他ユーティリティと併用できることを示しています。ドキュメント側のコード例も wa-callout での wa-not-prose 使用例へと刷新され、実際の挙動が視覚的に確認できるようになりました。

設計判断

@scope の採用は、既存のユーティリティレイヤー構造を崩さずに近接感知を実装できる最小侵襲な手法として選ばれました。代替案として新規クラスや !important に頼る方法も検討されましたが、後方互換性とメンテナンス性を重視した結果、標準化された CSS 機能である @scope が最適と判断されました。

この設計は「レイヤーは変えずにスコープだけを切り替える」という方針に沿い、他ユーティリティ(例: wa-stack, wa-font-size-*)への副作用を防ぎます。また、@scope はブラウザの最新二世代でサポートされているため、プログレッシブエンハンスメントとして安全に導入可能です。

まとめ

prose.css@scope を導入したことで、wa-prosewa-not-prose が入れ子でも正しく適用・除外でき、レイヤー優先順位と Specificity の問題が根本的に解消されました。既存コードへの影響は最小限で、ドキュメントも新しい利用パターンに合わせて更新されています。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
18c50805

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

品質レビュー結果

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

Review Criteria:

記事構成 ✓ PASS

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

リード文・背景・技術的変更・設計判断・まとめの5セクションがあり、総論→各論→結論の流れが明確です。

カスタムMarkdown構文 ✓ PASS

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

コードブロックは `css:packages/webawesome/src/styles/utilities/prose.css` の形式で正しく記述され、GitHubリンクも正しい記法です。

対象読者への適合性 ✓ PASS

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

対象はCSS/フロントエンドエンジニアで、専門用語が中心です。初心者向けの余計な解説はありません。

パラグラフ・ライティング ⚠ WARNING

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

ほとんどの段落は構成が整っていますが、背景セクションの段落が6文以上とやや長く、トピックセンテンスの明確さが若干不足しています。

Diff内容との照合 ✓ PASS

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

記事内コードブロックはDiffに存在する変更行(:where → @scope)を正しく示しており、内容はDiffと合致しています。省略部分はコメントで示されています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

@scope、Specificity、layer precedence などの用語は正しく使用され、PRと一致しています。

説明の技術的正確性 ✓ PASS

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

技術的な説明はPRの記述と矛盾せず、因果関係も論理的です。

事実の突合 ✓ PASS

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

すべての主張はPRタイトル、Description、Diffで裏付けられており、根拠のない推測はありません。

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

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

PR番号 #2564 などの数値は正確です。

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

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

記事タイトルはPRの内容「Use @scope in prose.css」を日本語で適切に表現しています。

外部知識の正確性 ✓ PASS

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

ブラウザが「最新二世代でサポート」と記載しており、PRのブラウザサポート情報と一致しています。

時間表現の正確性 ✓ PASS

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

時間表現の歪曲はありません。