Checkbox Group コンポーネントの追加と周辺修正

shoelace-style/webawesome

新しい <wa-checkbox-group> が Web Awesome に導入され、チェックボックスやスイッチを共有ラベル・ヒントでまとめる機能が提供されました。合わせて、コード例表示のアクセシビリティ改善とダイアログボタンのスタイル統一が行われています。

背景

この PR は、以前のディスカッション #947 で合意された チェックボックスグループ 機能を実装するものです。実装にあたっては、関連 Issue #1076 で挙げられたコンポーネント追加の要望と合わせて、ドキュメントやテストの整備も同時に行われました。加えて、コピー用ボタンのフォーカス問題やダイアログのボタンスタイル不整合といった、既存コンポーネントの細部修正も本 PR に含まれています。

技術的な変更

コンポーネント本体の実装

wa-checkbox-groupWebAwesomeElement を継承し、@customElement('wa-checkbox-group') で登録されています。主要プロパティは labelhint で、スロットを通じて HTML ラベルやヒントを提供できます。また、orientation 属性でレイアウト方向を制御し、デフォルトは vertical です。

@customElement('wa-checkbox-group')
export default class WaCheckboxGroup extends WebAwesomeElement {
  static css = [sizeStyles, formControlStyles, styles];

  @property() label = '';
  @property({ attribute: 'hint' }) hint = '';
  @property({ reflect: true }) orientation: 'vertical' | 'horizontal' = 'vertical';
  // ...省略...
}

スタイル定義

checkbox-group.styles.ts ではホスト要素のレイアウトと内部要素の間隔を CSS カスタムプロパティ --gap で管理しています。水平レイアウト時は --gap が 1 em に拡張され、フレックス方向が切り替わります。

:host {
  --gap: 0.5em;
  display: block;
}

:host([orientation='horizontal']) {
  --gap: 1em;
}

[part~='form-control-input'] {
  display: flex;
  flex-direction: column;
  align-items: start;
  gap: var(--gap);
  margin-block-start: 0.5em;
}

テストケース

checkbox-group.test.ts では、ラベルとヒントが正しく aria-labelledby / aria-describedby に反映されるか、role="group" が付与されているか、デフォルトの垂直レイアウトが適用されるかを検証しています。@open-wc/testing を利用したアクセシビリティテストも含まれています。

it('should expose a role="group" wrapper labeled by the label', async () => {
  const el = await fixture<WaCheckboxGroup>(html`
    <wa-checkbox-group label="Toppings">
      <wa-checkbox value="cheese">Cheese</wa-checkbox>
    </wa-checkbox-group>
  `);
  const group = el.shadowRoot!.querySelector('[role="group"]')!;
  expect(group.getAttribute('aria-labelledby')).to.equal('label');
  expect(group.getAttribute('aria-describedby')).to.equal('hint');
});

ドキュメントとナビゲーションの更新

新規マークダウン checkbox-group.md が追加され、基本使用例やラベル・ヒントの指定方法が記載されています。また、サイドバーテンプレート sidebar.njk にエントリが挿入され、コンポーネント一覧から直接参照できるようになりました。

@@ -230,6 +230,7 @@
 </h2>
 <ul>
     <li><a href="/docs/components/checkbox/">Checkbox</a></li>
+    <li><a href="/docs/components/checkbox-group/">Checkbox Group</a></li>
     <li><a href="/docs/components/color-picker/">Color Picker</a></li>

アクセシビリティ改善(コード例表示)

code-examples.jssource.inert の切り替えが追加され、折りたたまれたコード例がキーボードフォーカスから除外されます。これにより、コピー用ボタンが見えない領域でフォーカスされる問題が解消されました。

@@ -51,8 +51,10 @@
   if (open) {
     source.removeAttribute('aria-hidden');
+    source.inert = false;
   } else {
     source.setAttribute('aria-hidden', 'true');
+    source.inert = true;
   }
 }

ダイアログボタンのスタイル統一

dialog.md<wa-button>appearance="filled" が削除され、他の例と外観が統一されました。機能に影響はなく、見た目の一貫性のみが目的です。

@@ -19,7 +19,7 @@
   <wa-dialog label="Dialog" id="dialog-overview">
     This is a standard dialog. You can put any content you want in here!
-    <wa-button appearance="filled" slot="footer" variant="brand" data-dialog="close">Close</wa-button>
+    <wa-button slot="footer" variant="brand" data-dialog="close">Close</wa-button>
   </wa-dialog>

スペルチェック語彙の追加

cspell.json"Groupable" が語彙として追加され、スペルチェックが補完されました。

@@ -95,6 +95,7 @@
     "giga",
     "globby",
     "Grayscale",
+    "Groupable",
     "groupby",

設計判断

HasSlotController が導入され、hintlabel スロットの有無を監視し、スロットが未提供の場合は属性値にフォールバックしています。これにより、API の一貫性とアクセシビリティ要件が同時に満たされています。

レイアウト制御は CSS カスタムプロパティ --gaporientation 属性の組み合わせで実装され、フレックス方向の切り替えはスタイルシートだけで完結します。追加ロジックが最小限に抑えられ、パフォーマンスへの影響が低減されています。

サイズ伝搬は sizeStyleswarnDeprecatedSize を継承し、子コンポーネントへ自動的に適用されます。将来的なサイズ API の統一に向けた段階的移行が可能な設計です。

アクセシビリティ改善として、code-examples.jsinert 制御と role="group" の提供が挙げられます。どちらもユーザーエクスペリエンスと WCAG への適合を意識した最小変更です。

まとめ

<wa-checkbox-group> の追加により、チェックボックスやスイッチのグルーピングが公式 API として提供され、ラベル・ヒント・方向性・サイズ設定が統一的に扱えるようになりました。併せて行われたドキュメント整備、ナビゲーション更新、アクセシビリティ微調整、ダイアログデザイン統一は、コンポーネント群全体の一貫性と開発者体験の向上に寄与します。

記事メタデータ

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

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

品質レビュー結果

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

Review Criteria:

記事構成 ✓ PASS

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

リード文 → 背景 → 技術的な変更 → 設計判断(任意) → まとめ の流れが明確に構成されており、各必須要素が揃っています。

カスタムMarkdown構文 ⚠ WARNING

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

コードブロックのファイル名付きシンタックスハイライトは正しい形式です。GitHubリンクは [PR #2514](URL) のように記載されており、要求された `[ #123 ](URL)` 形式と完全には一致していません。

対象読者への適合性 ✓ PASS

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

専門的な開発者向けの記述で、余計な初心者向け説明はなく適切です。

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

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

各セクションが総論→各論→結論の構成になり、段落はトピックセンテンスで始まり1トピックに絞られ、長さも適切です。

Diff内容との照合 ✓ PASS

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

記事内のコードブロックは提供されたDiffの追加箇所と一致しており、抜粋や省略も内容理解に支障ありません。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

使用されている技術用語(コンポーネント名、スロット、ARIA属性など)はPR情報と合致し、誤用はありません。

説明の技術的正確性 ✓ PASS

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

技術的説明はDiffおよびPRの記載内容と整合しており、根拠のない主張はありません。

事実の突合 ✓ PASS

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

全ての主張はPRタイトル、説明、Diffで裏付けられており、捏造や推測は見受けられません。

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

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

PR番号やファイル名などの固有名詞は正確に記載されています。

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

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

記事タイトルはPRの「Checkbox Group」機能追加を正確に表現しています。

外部知識の正確性 ✓ PASS

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

バージョンやリリーススケジュール等、PRに記載のない外部情報は含まれていません。

時間表現の正確性 ✓ PASS

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

時間表現のずれはなく、PRの表現と一致しています。