`<wa-details>` のコンテンツオーバーフローをShadow DOM起因のbox-sizingで修正

shoelace-style/webawesome

<wa-details> および ネイティブ <details> 要素の内部に配置した全幅要素が右側にはみ出すバグが修正されました。Shadow DOMのスロット機構が box-sizing の継承を遮断するという根本原因を特定し、!important の復活ではなく対象を絞った border-box の付与で解決しています。

背景

このバグは #2100 がトリガーとなりました。#2100 は、ホスト要素とその子要素への box-sizing 設定から !important を除去したPRです。その変更以降、#2137 として報告されたように、<wa-details> 内に置いた <wa-button><wa-input> が右側にはみ出す現象が発生するようになりました。

問題の根本は <details> 要素のShadow DOM にあります。<details> はブラウザ内部でShadow DOMを使用してサマリーとコンテンツをスロットに割り当てますが、このスロットはCSSのデフォルト値である box-sizing: content-box を採用します。Web Awesomeはグローバルスタイルで box-sizing: inherit を設定しているため、スロット内のネイティブ要素はShadow DOMの境界を越えて content-box を継承してしまいます。WAコンポーネントは :host ルールで回避できますが、ネイティブ要素はその恩恵を受けられない点が問題でした。

!important を再導入する案も検討されましたが、それではWAコンポーネント側は修正される一方でネイティブ要素の問題が残ります。この非対称な状況が、より局所的なアプローチを採用する動機となっています。

技術的な変更

修正は2つのファイルへの最小限の追加で構成されています。どちらも box-sizing: border-box を特定のセレクタに直接付与する方針です。

<wa-details> コンポーネントのスタイル修正:

// 変更前
.content {
  display: block;
  padding-block-start: var(--spacing);
  ...
}

// 変更後
.content {
  display: block;
  box-sizing: border-box; /* Ensure contents don't overflow */
  padding-block-start: var(--spacing);
  ...
}

ネイティブ <details> 要素のスタイル修正:

/* 追加 */
&::details-content {
  box-sizing: border-box; /* Ensure contents don't overflow */
}

<wa-details> 側では Shadow DOM内の .content クラスに直接 border-box を指定し、ネイティブ <details> 側では ::details-content 擬似要素を用いてブラウザのShadow DOM内スロットに border-box を適用しています。::details-content はブラウザが <details> のコンテンツ領域を公開する擬似要素であり、Shadow DOMの外からそのスタイルを上書きできます。

設計判断

グローバルルールの変更ではなく、影響箇所へのピンポイント適用 が選ばれました。

選択肢として挙げられた !important の再導入は、WAコンポーネントの問題は解消しますがネイティブ要素には効果がなく、問題を半解決するにとどまります。一方、.content::details-content を直接ターゲットにする手法は、Shadow DOMのスタイル継承の境界を意識した外科的な修正です。グローバルな box-sizing ポリシーには一切手を加えないため、他のコンポーネントへの波及リスクがありません。

また、::details-content 擬似要素の利用は、ブラウザが仕様として公開したAPIを通じてShadow DOMの内部に干渉するアプローチであり、ブラウザ間の互換性を考慮した選択といえます。

まとめ

Shadow DOMによるCSSプロパティ継承の遮断という構造的な問題に対し、グローバルポリシーを変えずに .content::details-contentborder-box を直接付与することで解決しています。Shadow DOMの境界を意識したスタイル設計の難しさと、擬似要素を使った対処の有効性を示す修正です。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
1f5a77a2

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

品質レビュー結果

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

Review Criteria:

記事構成 ✓ PASS

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

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

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きシンタックスハイライトやGitHubのPR/Issueへのリンク記法が正しく使用されており、技術記事としての体裁が整っています。

対象読者への適合性 ✓ PASS

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

Shadow DOM、box-sizing、擬似要素といった専門用語を前提として解説しており、専門知識を持つエンジニアという対象読者に適合した内容です。

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

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

各セクションが総論→各論の構成になっており、かつ各段落がトピックセンテンスで始まっているため、非常に読み進めやすい構造です。1段落1トピックも守られています。

Diff内容との照合 ✓ PASS

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

記事内のコードブロックは、Diffの内容を正確に反映しています。一部省略はありますが、変更の要点を理解する上で適切な省略です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

PR情報で使われている「Shadow DOM」「box-sizing」「::details-content」などの技術用語を正確に使用しており、技術的な信頼性が高いです。

説明の技術的正確性 ✓ PASS

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

Shadow DOMがCSS継承を妨げるという問題の根本原因や、擬似要素を用いた解決策について、PR情報に基づいて技術的に正確な説明がなされています。

事実の突合 ✓ PASS

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

記事内の主張はすべてPRのDescriptionで裏付けられており、ハルシネーション(創作)は見られません。特に「!importantの再導入」という代替案への言及は、PRの背景を深く理解している証拠です。

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

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

PR番号(#2186)や関連するIssue番号(#2137)、PR番号(#2100)が正確に記載・リンクされています。

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

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

PRのタイトル「Fix details content overflow」に対し、記事タイトルは原因(Shadow DOM, box-sizing)と対象(<wa-details>)を加えており、内容を的確に要約しています。

外部知識の正確性 ✓ PASS

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

PRで言及されていないバージョン情報やリリース予定など、外部知識の持ち込みはなく、提供された情報源に忠実です。

時間表現の正確性 ✓ PASS

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

「修正されました」といった過去形の表現が、完了したPRの内容と一致しており、時間表現に誤りはありません。