ダイアログのユーティリティスタイルをクラスセレクタでスコープ化

shoelace-style/webawesome

ドキュメントサイトのグローバルスタイルが <wa-dialog> コンポーネントのサンプル表示に意図せず適用されていた問題を、.app-dialog クラスによるスコープ化で解消しました。

背景

utils.css に定義されたダイアログ向けのユーティリティスタイルが、ドキュメントページ上の <wa-dialog> 使用例にも漏れ込むという問題が発生していました。具体的には、フッター付きダイアログに対して [slot='footer'] へのスタイル(ボーダーやパディング)が、ドキュメントのサンプルコンポーネントにも適用されてしまっていました。PRに添付されたスクリーンショットで、修正前は <wa-dialog> のサンプル表示が崩れており、修正後に正常なレイアウトに戻っていることが確認できます。

このスタイルはドキュメントサイト自身のアプリケーションUI(Build Awesome プロモーションダイアログなど)向けに定義されたものであり、コンポーネントの使用例とは明確に区別する必要がありました。

技術的な変更

変更の核心は、utils.css のCSSセレクタを要素タイプ全体から特定クラスを持つ要素に絞り込むことです。

変更前:

wa-dialog:has([slot='footer']) [slot='footer'] {
  border-block-start: var(--wa-border-width-s) solid var(--wa-color-surface-border);
  flex-grow: 1;
  padding-block-start: var(--wa-space-l);
}

変更後:

wa-dialog.app-dialog [slot='footer'] {
  border-block-start: var(--wa-border-width-s) solid var(--wa-color-surface-border);
  flex-grow: 1;
  padding-block-start: var(--wa-space-l);
}

変更前のセレクタ wa-dialog:has([slot='footer']) は、フッタースロットを持つすべての <wa-dialog> を対象としていました。変更後の wa-dialog.app-dialog.app-dialog クラスを持つ要素のみに適用範囲を限定しています。あわせて :has([slot='footer']) の条件も削除され、セレクタがよりシンプルになっています。

スタイルの適用先であるサイト固有ダイアログには、対応するクラスが追加されました。

<wa-dialog
  id="dialog-site"
  class="dialog-ba-kickstarter brand-build-awesome app-dialog"
  light-dismiss
  without-header>

設計判断

既存のコンポーネント要素型セレクタを廃止し、アプリケーション固有クラスで意図を明示する方針 が採用されました。

wa-dialog はドキュメントサイトがコンポーネントの使用例を示すために多数埋め込んでいる要素です。要素型に対してグローバルなスタイルを当てると、ドキュメントが増えるたびにスタイルが漏れ込むリスクが継続的に存在します。.app-dialog という命名は、そのスタイルがアプリケーション自身のUIにのみ属することをコード上で明示しており、今後ダイアログが追加された際にも意図しない適用を防ぐ役割を果たします。

また、変更前に使用されていた :has() 疑似クラスは条件の表現力は高いものの、セレクタの意図が読み取りにくい面があります。.app-dialog クラスの付与という明示的な宣言に置き換えることで、スタイルの適用対象を開発者が一目で把握できるようになっています。

まとめ

2行の変更で、ドキュメントサイトのアプリケーションUIとコンポーネントサンプルのスタイルを明確に分離しました。クラスによるスコープの明示はCSS設計の基本原則ですが、このPRはドキュメントサイトというコンポーネントと利用例が共存する特殊な文脈において、その重要性を端的に示しています。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
1278d720

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

品質レビュー結果

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

Review Criteria:

記事構成 ✓ PASS

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

リード文(総論)→背景・技術詳細・設計判断(各論)→まとめ(結論)の3部構成が明確に守られています。特に、任意項目である「設計判断」のセクションが設けられ、変更の意図が深く掘り下げられている点が優れています。

カスタムMarkdown構文 ⚠ WARNING

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

ファイル名付きシンタックスハイライトは正しく使用されています。しかし、PR番号のリンク記法が `[PR #2134](URL)` となっており、ガイドラインで推奨される `[#2134](URL)` 形式と異なります。

対象読者への適合性 ✓ PASS

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

CSSセレクタのスコープ、:has()疑似クラス、コンポーネント設計といったトピックは、専門知識を持つエンジニアという対象読者に完全に適合しています。冗長な説明はなく、簡潔です。

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

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

各セクション、各パラグラフともに「総論→各論」の構成が徹底されています。各段落の先頭にトピックセンテンスが置かれているため、非常に読みやすいです。段落の長さも適切で、1段落1トピックの原則が守られています。

Diff内容との照合 ✓ PASS

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

記事内のコードブロックは、提供されたDiffの内容を正確に反映しています。HTMLの引用部分がDiffより広い範囲を含んでいますが、これは変更点を文脈の中で理解しやすくするための適切な編集であり、問題ありません。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「クラスセレクタ」「スコープ化」「:has()疑似クラス」などの技術用語が、文脈に沿って正確に使用されています。

説明の技術的正確性 ✓ PASS

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

スタイルの意図しない適用(leaching)という問題、およびクラスセレクタによるスコープ限定という解決策について、技術的に正確かつ論理的に説明されています。

事実の突合 ✓ PASS

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

記事内のすべての主張は、PRのタイトル、Description、Diff内のコードによって裏付けられています。特に「設計判断」セクションは、PRには明記されていないものの、コード変更の意図を的確に言語化したものであり、ハルシネーションには該当しません。

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

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

PR番号(#2134)やファイルパス、CSSクラス名(.app-dialog)などの固有名詞はすべて正確です。

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

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

記事のタイトル「ダイアログのユーティリティスタイルをクラスセレクタでスコープ化」は、PRのタイトル「Scope dialog util to `app-dialog` class」の内容を日本語で的確に表現しています。

外部知識の正確性 ✓ PASS

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

記事には、PR情報に記載のないバージョン情報やリリース予定などの外部知識は含まれていません。

時間表現の正確性 ✓ PASS

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

記事全体で過去形(「〜しました」「〜でした」)が適切に使用されており、完了した変更として正しく表現されています。時間表現の歪曲はありません。