Add light-dismiss behavior tests and changelog entry for dialog and drawer components

shoelace-style/webawesome

この PR は、<wa-dialog><wa-drawer>lightDismiss 挙動を検証するテストを追加し、同時に変更履歴を記録する changelog エントリを導入します。テストの追加により、コンポーネントが期待通りに動作することを CI で検証でき、将来的な回帰を防止します。

背景

lightDismiss は、バックドロップ(オーバーレイ)をクリックした際にコンポーネントを閉じるかどうかを制御する Boolean 属性です。Web Awesome の貢献ガイドラインでは、Boolean 属性はデフォルトで false とし、属性の有無で true/false を判定することが推奨されています[^1]。この規則は wa-dialog では既にテストで保証されていましたが、wa-drawer についてはテストが不足していたため、実装の正確性を自動的に確認できませんでした。

技術的な変更

テストスイートに lightDismiss のシナリオを 3 つ追加しました。各コンポーネントで共通するテストは次の通りです。

  1. バックドロップをクリックしたとき、属性が付与されていなければ閉じないことを確認。
  2. light-dismiss 属性が付与されている場合、バックドロップクリックで閉じることを確認。
  3. コンポーネント内部(ボディ領域)をクリックしたときは属性の有無に関わらず閉じないことを確認。
@@ -184,6 +184,42 @@ describe('<wa-dialog>', () => {
         });
       });

+      describe('light dismiss', () => {
+        it('should not close when clicking the backdrop by default', async () => {
+          const el = await fixture<WaDialog>(html`<wa-dialog open>Content</wa-dialog>`);
+          const dialog = el.shadowRoot!.querySelector<HTMLDialogElement>('.dialog')!;
+          dialog.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true, composed: true }));
+          await aTimeout(250);
+          expect(el.open).to.be.true;
+        });
+
+        it('should close when clicking the backdrop when light-dismiss is enabled', async () => {
+          const el = await fixture<WaDialog>(html`<wa-dialog open light-dismiss>Content</wa-dialog>`);
+          const dialog = el.shadowRoot!.querySelector<HTMLDialogElement>('.dialog')!;
+          await expectEvent(el, 'wa-after-hide', () => {
+            dialog.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true, composed: true }));
+          });
+          expect(el.open).to.be.false;
+        });
+
+        it('should not close when clicking inside the dialog even when light-dismiss is enabled', async () => {
+          const el = await fixture<WaDialog>(html`<wa-dialog open light-dismiss>Content</wa-dialog>`);
+          const body = el.shadowRoot!.querySelector<HTMLElement>('[part="body"]')!;
+          body.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true, composed: true }));
+          await aTimeout(250);
+          expect(el.open).to.be.true;
+        });
+      });
*** End Patch
@@ -209,6 +209,42 @@ describe('<wa-drawer>', () => {
         });
       });

+      describe('light dismiss', () => {
+        it('should not close when clicking the backdrop by default', async () => {
+          const el = await fixture<WaDrawer>(html`<wa-drawer open>Content</wa-drawer>`);
+          const drawer = el.shadowRoot!.querySelector<HTMLDialogElement>('.drawer')!;
+          drawer.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true, composed: true }));
+          await aTimeout(250);
+          expect(el.open).to.be.true;
+        });
+
+        it('should close when clicking the backdrop when light-dismiss is enabled', async () => {
+          const el = await fixture<WaDrawer>(html`<wa-drawer open light-dismiss>Content</wa-drawer>`);
+          const drawer = el.shadowRoot!.querySelector<HTMLDialogElement>('.drawer')!;
+          await expectEvent(el, 'wa-after-hide', () => {
+            drawer.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true, composed: true }));
+          });
+          expect(el.open).to.be.false;
+        });
+
+        it('should not close when clicking inside the drawer even when light-dismiss is enabled', async () => {
+          const el = await fixture<WaDrawer>(html`<wa-drawer open light-dismiss>Content</wa-drawer>`);
+          const body = el.shadowRoot!.querySelector<HTMLElement>('[part="body"]')!;
+          body.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true, composed: true }));
+          await aTimeout(250);
+          expect(el.open).to.be.true;
+        });
+      });
*** End Patch

changelog にもエントリを追加し、light-dismiss オプションに関するバグ修正を明示しました。

- Fixed a bug in `<wa-drawer>` that caused the `light-dismiss` option not work as intended [pr:2437]

設計判断

テスト追加は、コンポーネントの公開 API と HTML 標準の挙動を CI で保証するための防御的設計です。Boolean 属性のデフォルトが false であることは仕様上の制約であり、属性を付与したときのみ true になることをテストで明示しています。これにより、将来的に属性の実装が変わった場合でもテストが失敗し、すぐに問題を検出できます。

まとめ

本 PR は <wa-dialog><wa-drawer>lightDismiss 挙動を検証するテストと changelog エントリを追加し、コンポーネントが Web Awesome の Boolean 属性規約に沿って正しく動作することを CI で保証します。テストの導入により回帰リスクが低減され、ライブラリの品質が向上します。

記事メタデータ

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

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

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文、背景、技術的変更、設計判断、まとめが揃っており、総論→各論→結論の流れが明確です。

カスタムMarkdown構文 ⚠ WARNING

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

コードブロックは diff・markdown と正しく記述されていますが、PRリンクの記法が [PR #2446](URL) となっており、仕様の [#123](URL) 形式とずれています。

対象読者への適合性 ✓ PASS

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

対象は Web Awesome のコンポーネント開発者向けで、専門用語やテスト実装の説明が適切に行われています。

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

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

各セクションは総論・各論・結論の構成になり、段落はトピックセンテンスで始まり、1段落1トピック・6文未満で適切に区切られています。

Diff内容との照合 ✓ PASS

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

記事内のコードブロックは提供された Diff の追加部分と一致しており、コメント行の省略は内容の正確さに影響していません。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

light-dismiss、lightDismiss、Boolean 属性 などの用語は PR と合致しており、誤用はありません。

説明の技術的正確性 ✓ PASS

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

テストが期待通りの動作を検証する旨の説明は Diff と PR 内容に裏付けられ、技術的に正確です。

事実の突合 ✓ PASS

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

記事の全ての主張は PR のタイトル・説明・Diff で裏付けられ、根拠のない推測や外部知識は含まれていません。

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

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

PR 番号 #2446、関連 PR #2437、コード中のファイル名・行数は正確です。

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

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

記事タイトルは PR の「Add tests + changelog」を具体化した形であり、内容と矛盾していません。

外部知識の正確性 ✓ PASS

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

LTS やリリーススケジュール等、PR に記載されていない外部情報は一切含まれていません。

時間表現の正確性 ✓ PASS

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

時間表現は使用されておらず、PR の記述と食い違う箇所はありません。