ラジオグループとカラーピッカーで視覚的に隠されたラベルが機能しない問題を修正

shoelace-style/webawesome

wa-visually-hidden-label ユーティリティクラスが <wa-radio-group><wa-color-picker> で機能しない問題が修正されました。これにより、アクセシビリティを保ちながらラベルを視覚的に隠す実装が、すべてのフォームコンポーネントで一貫して動作するようになります。

背景

Web Awesomeは wa-visually-hidden-label クラスを提供しており、スクリーンリーダーには認識されるがビジュアル上は表示されないラベルを実現できます。しかし #1933 で報告されたように、このクラスが一部のコンポーネントで機能していませんでした。

問題の原因は、コンポーネントごとに異なるShadow DOMパーツ名が使われていることでした。<wa-input> などの単純なフォームコンポーネントは label パーツを使用しますが、<wa-radio-group><wa-color-picker> のような複合コンポーネントは form-control-label パーツを使用していました。既存の実装は label パーツのみを対象としていたため、これらのコンポーネントでラベルを隠すことができませんでした。

技術的な変更

form-control-label パーツに対する視覚的非表示スタイルが追加されました。

変更前:

.wa-visually-hidden:not(:focus-within),
.wa-visually-hidden-force,
.wa-visually-hidden-hint::part(hint),
.wa-visually-hidden-label::part(label) {
  position: absolute !important;
  width: 1px !important;
  height: 1px !important;
  /* ... */
}

変更後:

.wa-visually-hidden:not(:focus-within),
.wa-visually-hidden-force,
.wa-visually-hidden-hint::part(hint),
.wa-visually-hidden-label::part(label),
.wa-visually-hidden-label::part(form-control-label) {
  position: absolute !important;
  width: 1px !important;
  height: 1px !important;
  /* ... */
}

同じ変更が visually-hidden.styles.ts にも適用され、TypeScriptベースのスタイル定義との一貫性が保たれています。これにより、以下のようなマークアップで、ラジオグループのラベルが視覚的に隠されながらスクリーンリーダーには認識される状態が実現します。

<wa-radio-group class="wa-visually-hidden-label" label="選択肢">
  <wa-radio value="option1">オプション1</wa-radio>
  <wa-radio value="option2">オプション2</wa-radio>
</wa-radio-group>

設計判断

既存のユーティリティクラスに新しいパーツセレクタを追加する方式 が採用されました。

新しいユーティリティクラスを作成する代わりに、wa-visually-hidden-label の対象範囲を拡張することで、開発者が複数のクラスを使い分ける必要性を排除しています。この判断により、すべてのフォームコンポーネントで同じクラス名を使用できる一貫性が保たれました。

CSSセレクタの追加のみで実装できるため、JavaScriptの変更やコンポーネント内部のリファクタリングは不要でした。Shadow DOMパーツを通じてスタイルを適用する設計が、このような拡張を容易にしています。

本修正は、Web Awesomeのアクセシビリティユーティリティが、コンポーネントの内部実装の違いを意識せず統一的に機能することを保証しています。labelform-control-label という2つのパーツ名を同時にサポートすることで、既存コードとの互換性を維持しながら、すべてのフォームコンポーネントで視覚的に隠されたラベルが正しく動作するようになりました。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

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

品質レビュー結果

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

Review Criteria:

記事構成 ✓ PASS

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

「リード文→背景→技術的な変更→設計判断→結論」の構成が明確で、ガイドラインに完全に準拠しています。特に、最後の段落が結論として機能しており、記事全体の意義をまとめています。

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きシンタックスハイライト(```css:path/to/file.css)とGitHubのIssue/PRリンク記法([#123](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

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

Shadow DOMの`part`やCSSユーティリティクラスといった専門用語を適切に使用しており、対象読者であるエンジニアに適した技術レベルで書かれています。

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

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

各セクションが「総論→各論」で構成され、各段落がトピックセンテンスで始まるなど、パラグラフ・ライティングの原則を非常によく遵守しています。可読性が非常に高いです。

Diff内容との照合 ✓ PASS

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

記事内のコードブロック(変更前・変更後)は、提供されたDiffの内容を正確に反映しています。ファイルパスの指定も正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「Shadow DOM」「part」「ユーティリティクラス」などの技術用語が、文脈に沿って正確に使用されています。

説明の技術的正確性 ✓ PASS

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

コンポーネントによる`part`名の違い(`label` vs `form-control-label`)が問題の原因であるという説明は、CSSセレクタの追加というDiff内容と完全に整合しており、技術的に正確です。

事実の突合 ✓ PASS

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

記事内のすべての主張(問題の発生源、原因、修正内容)は、PRのDescription、Diff、Changelogの内容によって裏付けられています。ハルシネーションは検出されませんでした。

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

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

PR番号(#2012)とIssue番号(#1933)が正確に記載されています。

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

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

記事のタイトルはPRのタイトルとChangelogの内容を正確に反映しており、修正対象(ラジオグループとカラーピッカー)を具体的に示している点で優れています。

外部知識の正確性 ✓ PASS

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

PR情報に含まれない外部知識(バージョン情報、リリース予定など)の追記はなく、提供された情報源に忠実です。

時間表現の正確性 ✓ PASS

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

完了した変更に対して「〜されました」という過去形を適切に使用しており、時間表現は正確です。