チェックボックスの不確定状態で `aria-checked` を `mixed` に修正

shoelace-style/webawesome

<wa-checkbox> の不確定(indeterminate)状態において、aria-checked 属性が仕様に反して false のまま設定されていたアクセシビリティバグが修正されました。1行の条件式の追加により、WAI-ARIA仕様に準拠した mixed 値が正しく出力されるようになります。

背景

アクセシビリティ検査において、不確定状態のチェックボックスに対して「ARIA attributes must be used as specified for the element's role」というエラーが報告されていました。WAI-ARIA仕様では、チェックボックスロールの aria-checked に許容される値は truefalsemixed の3種類であり、不確定状態には mixed を使用することが定められています。

問題の発生箇所は checkbox.ts のテンプレート内で、aria-checked の値が this.checked のbooleanのみに基づいて算出されていた点です。indeterminate プロパティが true であっても this.checkedfalse であれば aria-checked="false" が出力され、要素の実際の状態とARIA属性が乖離していました。#2305 でこの問題が報告されています。

この状態は、スクリーンリーダーや支援技術が不確定状態を正しく認識できないことを意味しており、アクセシビリティ上の実害を伴うバグでした。

技術的な変更

checkbox.ts のテンプレート内、aria-checked バインディングの算出ロジックに indeterminate の判定が追加されました。

変更前:

aria-checked=${this.checked ? 'true' : 'false'}

変更後:

aria-checked=${this.indeterminate ? 'mixed' : this.checked ? 'true' : 'false'}

三項演算子を入れ子にすることで、indeterminatetrue の場合を最優先で評価し mixed を返し、それ以外は従来通り this.checked の値に応じて true または false を返します。indeterminatefalse のケースでは従来と同一の出力となるため、既存の動作への影響はありません。

設計判断

indeterminatechecked より先に評価する順序が採用されました。チェックボックスが不確定状態にある場合、checked の値に関わらず状態は mixed であるべきという意味論的な優先度を、コードの評価順序そのもので表現しています。

また、aria-checked 属性を削除するのではなく mixed を明示的に設定する方針が取られています。明示的に値を設定することで支援技術が不確定状態を確実に認識できるよう配慮された判断です。

まとめ

1行の変更で indeterminate 状態のARIA属性がWAI-ARIA仕様に準拠し、スクリーンリーダーなどの支援技術がチェックボックスの不確定状態を正しく伝達できるようになりました。状態の優先度をコードの評価順序で明示するシンプルな修正が、アクセシビリティ準拠と後方互換性の両立を実現しています。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
c3fb6344

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

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文(総論)、背景・技術詳細・設計判断(各論)、まとめ(結論)という「総論→各論→結論」の構成が明確で理解しやすい。必須要素はすべて含まれている。

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きシンタックスハイライト、Issue番号のリンク記法がガイドラインに沿って正しく使用されている。

対象読者への適合性 ✓ PASS

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

WAI-ARIAやWebコンポーネント実装に関する知識を前提としており、専門のエンジニアという対象読者に適合している。

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

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

各セクションが総論→各論の構成になっており、各パラグラフもトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が守られていて可読性が高い。

Diff内容との照合 ✓ PASS

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

記事内で引用されているコードブロックは、提供されたDiffの内容とファイルパスを正確に反映している。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`aria-checked`, `indeterminate`, `WAI-ARIA`などの技術用語が正確かつ適切な文脈で使用されている。

説明の技術的正確性 ✓ PASS

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

三項演算子の評価順序に関する説明など、コードの変更がもたらす挙動を技術的に正確に解説できている。

事実の突合 ✓ PASS

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

PR Descriptionで参照されているIssue番号を適切に引用し、コードの差分から設計意図を読み取るなど、すべての主張がPR情報に基づいており、ハルシネーションは見られない。

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

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

PR番号(#2307)、Issue番号(#2305)などの固有名詞や数値が正確に記載されている。

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

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

記事のタイトルは、PRのタイトル「Fix `aria-checked` when indeterminate」の内容をより具体的に、かつ正確に反映している。

外部知識の正確性 ✓ PASS

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

WAI-ARIA仕様に関する説明はPRに直接記載はないが、変更の技術的背景を説明するために不可欠な補足情報であり、PRの意図を正確に伝える上で有益。捏造にはあたらない。

時間表現の正確性 ✓ PASS

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

「修正されました」「バグでした」といった過去形の表現が、完了した変更を報告する文脈で正しく使用されている。