`<wa-rating>` をフォームコントロール化し、ネイティブフォーム送信に対応

shoelace-style/webawesome

<wa-rating>Form Associated Custom Element(FACE) に対応し、<form> タグと組み合わせてネイティブなフォーム送信・バリデーションが利用できるようになりました。合わせて、ARIA属性の付与先がシャドウDOM内部の要素からホスト要素に移動し、アクセシビリティも改善されています。

背景

discussion #2192 で議論されていたように、<wa-rating> はこれまで WebAwesomeElement を継承する一般的なカスタム要素であり、<form> に配置しても値が送信されませんでした。他のフォームコントロール(<wa-input> など)が既に WebAwesomeFormAssociatedElement を継承してフォーム統合を実現していたのに対し、<wa-rating> だけがその恩恵を受けられていない状況でした。

また、issue #2205 では、role="slider"aria-* 属性がシャドウDOM内の .rating 要素に付与されていたことが問題として指摘されていました。Shadow DOMの境界を越えてホスト要素のARIAを外部から認識しにくい構造になっており、仕様に沿ったアクセシビリティ実装への改善が求められていました。

技術的な変更

rating.ts の継承元が WebAwesomeElement から WebAwesomeFormAssociatedElement に変更され、フォーム統合に必要な基盤が提供されるようになりました。これにより、<wa-rating> はForm Associated Custom Elements APIを通じてブラウザのフォームに値を登録し、送信・バリデーションに参加できます。

変更前:

import WebAwesomeElement from '../../internal/webawesome-element.js';

@customElement('wa-rating')
export default class WaRating extends WebAwesomeElement {

変更後:

import { WebAwesomeFormAssociatedElement } from '../../internal/webawesome-form-associated-element.js';
import { RequiredValidator } from '../../internal/validators/required-validator.js';

@customElement('wa-rating')
export default class WaRating extends WebAwesomeFormAssociatedElement {
  static get validators() {
    return [...super.validators, RequiredValidator()];
  }

  assumeInteractionOn = ['change'];

RequiredValidatorvalidators に追加することで required 属性が機能するようになり、未選択の状態でフォームを送信しようとするとブラウザのバリデーションエラーが発生します。assumeInteractionOn = ['change'] は、ユーザーが値を変更したタイミングをインタラクション済みとみなす設定で、バリデーションのトリガーを適切に制御します。

ARIA属性の付与先もシャドウDOM内の .rating 要素からホスト要素に移動しました。connectedCallback() 内で this.setAttribute('role', 'slider') のように直接ホスト要素に設定するよう変更されています。スタイル側でも、フォーカスリングのCSSセレクタが .rating:focus-visible から :host(:focus-visible) に変更され、ホスト要素へのフォーカス移動と一貫性が保たれています。

/* 変更前 */
.rating:focus-visible {
  outline: var(--wa-focus-ring);
  outline-offset: var(--wa-focus-ring-offset);
}

/* 変更後 */
:host(:focus-visible) {
  outline: var(--wa-focus-ring);
  outline-offset: var(--wa-focus-ring-offset);
}

テストコードも同様に更新され、ARIAアサーションの対象が el.shadowRoot.querySelector('[part~="base"]') からホスト要素 el 直接に変更されています。

設計判断

WebAwesomeFormAssociatedElement を継承する既存の設計パターンに準拠する方式 が採用されました。フォーム統合ロジックを wa-rating 内に直接実装するのではなく、他のフォームコントロールと同じ基底クラスを継承することで、バリデーション・フォーム送信・wa-invalid イベントなどの共通機能が一括して得られます。

ARIA属性のホスト要素への移動も、この変更に自然に伴うものです。Form Associated Custom Elementsとしてブラウザに認識される要素はホスト要素そのものであり、rolearia-* もホストに付与するのが仕様に沿った実装です。シャドウDOM内部の要素に付与していた従来の実装は、フォーム統合とアクセシビリティの両面で構造上の問題を抱えていたといえます。

まとめ

本PRは、継承元クラスの変更という最小限の改修で <wa-rating> をフォームエコシステムに完全統合した変更です。バリデーション・ARIA・フォーカス管理がすべてホスト要素ベースに整理されたことで、コンポーネントの内部構造と外部仕様の一貫性が高まりました。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
587b21a1

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

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

「総論→各論→結論」の構成が明確です。リード文で要旨を述べ、背景、技術詳細、設計判断、まとめという各セクションが論理的に配置されています。

カスタムMarkdown構文 ⚠ WARNING

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

ファイル名付きシンタックスハイライトは正しく使用されています。GitHubのIssue/Discussionへのリンク記法がガイドラインの例(例: [#123](URL))と厳密には一致していません(例: [discussion #2192](URL))。しかし、リンクは正しく機能しており、内容理解への影響はありません。

対象読者への適合性 ✓ PASS

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

「Form Associated Custom Element」や「シャドウDOM」などの専門用語を前提に解説しており、対象読者であるエンジニアに適した技術レベルです。

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

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

各セクションが総論から各論へと展開され、各段落はトピックセンテンスで始まり、1段落1トピックの原則が守られています。可読性が非常に高いです。

Diff内容との照合 ✓ PASS

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

記事内で引用されているすべてのコードブロック(rating.ts, rating.styles.ts)は、提供されたDiff情報と正確に一致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「WebAwesomeFormAssociatedElement」や「RequiredValidator」、「ホスト要素」といった技術用語が、PRの文脈に沿って正確に使用されています。

説明の技術的正確性 ✓ PASS

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

継承元の変更によるフォーム統合や、ARIA属性の付与先変更によるアクセシビリティ改善といった説明は、Diff内容に裏付けられており技術的に正確です。

事実の突合 ✓ PASS

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

記事内のすべての主張は、PRのタイトル、Description、Diff(changelog.mdを含む)、関連Issue/Discussion番号によって裏付けられており、ハルシネーションは検出されませんでした。

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

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

PR番号(#2215)、Issue番号(#2205)、Discussion番号(#2192)などの固有名詞はすべて正確です。

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

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

記事タイトル「<wa-rating> をフォームコントロール化し、ネイティブフォーム送信に対応」は、PRの主題である「Make rating a form control」を正確に表現しています。

外部知識の正確性 ✓ PASS

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

PRで言及されていない外部知識(バージョンのサポート状況など)の追加はなく、すべての記述がPR情報に基づいています。

時間表現の正確性 ✓ PASS

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

「〜でした」「〜になりました」といった完了形の表現が使われており、変更が完了したというPRの事実関係と時間表現が一致しています。