Accordion と Accordion Item コンポーネントの追加

shoelace-style/webawesome

Web Awesome へ <wa-accordion><wa-accordion-item> の 2 つの実験的コンポーネントが追加され、キーボード対応の縦型可展開セクションが利用可能になりました。

背景

なぜ新しいコンポーネントが必要だったのか は、従来の UI パターンで頻出する「FAQ」や「設定パネル」等の情報整理が、アクセシビリティとデザインの両立で実装コストが高くなる点です。既存コンポーネント群は単体要素の組み合わせで実装されており、展開・折りたたみロジックやイベントハンドリングを各プロジェクトで重複実装していました。この PR は、共通化とアクセシビリティの標準化を目的に、Accordion 系の基盤コンポーネントを公式に提供します。

技術的な変更

コンポーネント実装packages/webawesome/src/components/accordion/accordion-item/ に新規ファイルを追加し、Lit を用いた Web Components として定義されています。主な変更点は以下の通りです。

  • accordion.tsWaAccordion クラスを追加。modemultiple/single/single-collapsible)や icon-placementheading-levelappearance といった属性を反映し、expandAll() / collapseAll() メソッドと 4 種類のカスタムイベント(wa-expand など)を提供します。
  • accordion-item.tsWaAccordionItem クラスを追加。labelexpandeddisabled 属性をホストに反映し、expand() / collapse() / toggle() が Promise を返してアニメーション完了を通知します。animationGeneration カウンタで競合アニメーションを防止しています。
  • スタイルは accordion.styles.tsaccordion-item.styles.ts に分割し、--spacing--show-duration--hide-duration--easing 等の CSS カスタムプロパティで外部調整が可能です。アイコン位置は flex-direction: row-reverse により start 配置を実現しています。
  • カスタムイベントは src/events/ に新規追加し、events.ts でエクスポートしています。WaAccordionExpandEvent などはキャンセル可能で、親コンポーネント側で展開ロジックをフックできます。
  • テストは accordion.test.tsaccordion-item.test.ts に総合的なアクセシビリティテスト、属性デフォルト検証、キーボード操作シナリオを追加し、@open-wc/testing@web/test-runner-commands を利用しています。
  • ドキュメントは docs/components/accordion.mdaccordion-item.md を新規作成し、使用例、属性一覧、イベント一覧を掲載。サイドバーのナビゲーションは docs/_includes/sidebar.njk にリスト項目を挿入して自動反映させました。

代表的なコード例

@customElement('wa-accordion')
export default class WaAccordion extends WebAwesomeElement {
  @property({ reflect: true }) mode: 'single' | 'single-collapsible' | 'multiple' = 'multiple';
  @property({ attribute: 'icon-placement', reflect: true }) iconPlacement: 'start' | 'end' = 'end';
  // …省略
}
@customElement('wa-accordion-item')
export default class WaAccordionItem extends WebAwesomeElement {
  @property({ type: Boolean, reflect: true }) expanded = false;
  @property({ type: Boolean, reflect: true }) disabled = false;
  // expand(), collapse(), toggle() が Promise を返す実装
}

設計判断

属性拡張と後方互換性の選択 が本 PR の中心的な設計判断です。WaAccordionWaAccordionItem は両方とも WebAwesomeElement を継承し、CSS カスタムプロパティで外観を外部から制御できるようにしました。属性はすべて reflect: true とし、DOM から直接閲覧・変更できる点でコンポーネントの宣言的使用を促進しています。イベントは キャンセル可能 に設計し、アプリ側で展開前にロジックを差し込める柔軟性を持たせました。さらに、mode のデフォルトを multiple とし、既存 UI パターンへの影響を最小化しています。これらは「拡張は最小限に、既存 API との互換性は保持する」という設計方針に沿った選択です。

まとめ

本 PR により、Web Awesome にアクセシブルでカスタマイズ可能な Accordion 系コンポーネント が標準装備され、共通実装の重複を排除しつつ、属性・イベント・CSS カスタムプロパティによる柔軟な制御が可能になりました。ドキュメントとテストの整備により、導入障壁も低く設定されています。

記事メタデータ

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

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

品質レビュー結果

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

Review Criteria:

記事構成 ✓ PASS

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

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

カスタムMarkdown構文 ⚠ WARNING

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

コードブロックはファイル名付きシンタックスハイライトが正しく使用されていますが、PRリンクが「PR #2434」の形式で記載されており、要求された `[#123](URL)` 形式になっていません。リンク記法の修正が必要です。

対象読者への適合性 ✓ PASS

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

専門的な開発者向けの内容で、余計な初心者向け説明がなく適切です。

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

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

各セクションは総論・各論・結論の構成で、段落はトピックセンテンスで始まり1段落1トピックが守られ、長すぎる段落もありません。

Diff内容との照合 ✓ PASS

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

記事中のコードブロックは Diff に含まれるファイルとパスが一致し、抜粋部分も Diff 内容と合致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

PR に記載された属性名やイベント名などと一致しており、用語の誤用はありません。

説明の技術的正確性 ✓ PASS

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

技術的な説明は PR の内容と合致し、根拠のある記述となっています。

事実の突合 ✓ PASS

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

記事内の主張はすべて PR のタイトル、説明、Diff、変更ファイルで裏付けられており、推測や捏造はありません。

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

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

PR 番号 #2434 など数値は正しく記載されています。

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

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

記事タイトルは PR の「Add <wa-accordion> and <wa-accordion-item> components」の内容を日本語で正確に表現しています。

外部知識の正確性 ✓ PASS

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

外部のバージョンサポート情報やリリース日程等は記載されていません。

時間表現の正確性 ✓ PASS

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

時間表現の歪曲はなく、PR の記述と一致しています。