`<wa-dropdown>` の見出し色から `!important` を除去してテーマ上書きを可能に

shoelace-style/webawesome

<wa-dropdown> コンポーネントの見出し(ラベル)スタイルにおいて、color プロパティへの !important 修飾を削除しました。これにより、ライトDOM側のスタイルからドロップダウン見出しの色をテーマとして上書きできるようになります。

背景

WebAwesome のドキュメントでは、<wa-dropdown> メニュー内の見出しとして h1h6 要素を使用することを推奨しています。しかし、これらの見出しに適用されるスタイルには color: var(--wa-color-text-quiet) !important が含まれており、ユーザーがライトDOMからテーマとして色を変更しようとしても上書きが一切効かない状態でした。

この問題は #2102 として報告されました。報告者が作成した CodePen のデモ では、!important を用いてもスタイルが反映されない様子が示されています。Shadow DOM 内の ::slotted() セレクターによって適用された !important スタイルは、外部のスタイルシートから上書きする手段がなく、テーマ機能の妨げとなっていました。

技術的な変更

変更は dropdown.styles.ts における color 宣言の !important 削除のみです。

変更前:

color: var(--wa-color-text-quiet) !important;

変更後:

color: var(--wa-color-text-quiet);

同じブロック内の displaymarginpaddingfont-familyfont-weightfont-size の各プロパティには引き続き !important が残っていますが、color のみが除外されました。これにより、デフォルト色は --wa-color-text-quiet CSS カスタムプロパティを通じて引き続き適用されながら、ライトDOM側のスタイルルールで上書きできるようになります。

設計判断

::slotted() セレクター内での !important の使用 は、Shadow DOM のカプセル化において特殊な問題を引き起こします。通常、Shadow DOM 内のスタイルとライトDOMのスタイルにはカスケードの優先順位が定義されていますが、!important を組み合わせることでその逆転が起きます。本修正は、color プロパティに限って !important を外すことで、スタイルの継承とカスタマイズ可能性を回復させる最小限の変更となっています。

color プロパティから !important が削除された一方で、displaymarginpadding といった他のプロパティでは維持されました。これにより、スタイルのカスタマイズは色に限定される形となっています。コンポーネントの構造的な整合性を保ちながらテーマ機能を有効にするための選択的な対応といえます。

まとめ

1行の変更でありながら、<wa-dropdown> の見出しカラーに対するテーマ適用性という根本的な課題を解消しています。Shadow DOM と ::slotted() を組み合わせた設計において !important がどのようにスタイルの上書きを封じてしまうかを示す典型的な事例であり、コンポーネントライブラリにおけるスタイルのカスタマイズ可能性設計の難しさを浮き彫りにしています。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
80ae6991

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

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

「リード文(総論)→背景・技術詳細・設計判断(各論)→まとめ(結論)」という3部構成が明確に適用されており、非常に分かりやすい構成です。

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きシンタックスハイライト(```typescript:path/to/file.ts)やIssue番号のリンク記法([#2102](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

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

Shadow DOM、::slotted()、!importantの挙動など、専門知識を持つエンジニアを対象とした適切な技術レベルと表現で書かれています。

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

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

各セクションが総論→各論の構成になっており、各段落はトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が守られています。これにより、記事の要点を素早く把握できます。

Diff内容との照合 ✓ PASS

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

記事内で引用されているコードの変更前・変更後、およびファイル名は、提供されたDiff情報と完全に一致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「ライトDOM」「Shadow DOM」「::slotted()」「カスケード」といった技術用語が、文脈に沿って正確に使用されています。

説明の技術的正確性 ✓ PASS

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

Shadow DOM内の`!important`がライトDOMからのスタイル上書きを不可能にするという技術的な説明は、PRのDescriptionとも一致しており、正確です。

事実の突合 ✓ PASS

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

記事内の主張はすべてPRのDescription、Diff、関連Issue番号で裏付けられており、ハルシネーション(創作)は見られません。「設計判断」セクションはPRに明記されていませんが、コードの差分から論理的に導かれた妥当な考察です。

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

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

PR番号(#2226)とIssue番号(#2102)が正確に記載されています。

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

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

記事のタイトルは「`!important`を除去してテーマ上書きを可能にする」というPRの主旨を正確に反映しています。

外部知識の正確性 ✓ PASS

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

PR情報に記載のないバージョン情報やリリース予定といった外部知識の追加はなく、提供された情報源に忠実です。

時間表現の正確性 ✓ PASS

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

「〜でした」「〜できない状態でした」といった表現が、修正前の状況を正しく示しており、時間表現に歪曲はありません。