@verndale/accessibility-standards 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/OPERATING.md +1 -1
  2. package/README.md +1 -1
  3. package/dist/manifest.json +156 -116
  4. package/dist/profiles/ai-orchestration/coverage-manifest.json +702 -153
  5. package/dist/profiles/ai-orchestration/implementation/accessibility.md +523 -42
  6. package/dist/profiles/ai-orchestration/pattern-contracts.json +892 -306
  7. package/dist/profiles/ai-orchestration/patterns/accordion.md +6 -1
  8. package/dist/profiles/ai-orchestration/patterns/alert.md +6 -1
  9. package/dist/profiles/ai-orchestration/patterns/carousel.md +6 -1
  10. package/dist/profiles/ai-orchestration/patterns/checkbox.md +27 -0
  11. package/dist/profiles/ai-orchestration/patterns/combobox.md +6 -1
  12. package/dist/profiles/ai-orchestration/patterns/consequential-submission.md +8 -3
  13. package/dist/profiles/ai-orchestration/patterns/dialog.md +6 -1
  14. package/dist/profiles/ai-orchestration/patterns/disclosure.md +6 -1
  15. package/dist/profiles/ai-orchestration/patterns/dynamic-status.md +6 -1
  16. package/dist/profiles/ai-orchestration/patterns/field.md +7 -1
  17. package/dist/profiles/ai-orchestration/patterns/image.md +6 -1
  18. package/dist/profiles/ai-orchestration/patterns/listbox.md +6 -1
  19. package/dist/profiles/ai-orchestration/patterns/media-player.md +9 -1
  20. package/dist/profiles/ai-orchestration/patterns/menu-button.md +6 -1
  21. package/dist/profiles/ai-orchestration/patterns/menu.md +30 -0
  22. package/dist/profiles/ai-orchestration/patterns/pagination.md +6 -1
  23. package/dist/profiles/ai-orchestration/patterns/popover.md +7 -1
  24. package/dist/profiles/ai-orchestration/patterns/progress.md +7 -1
  25. package/dist/profiles/ai-orchestration/patterns/radio-group.md +27 -0
  26. package/dist/profiles/ai-orchestration/patterns/slider.md +31 -0
  27. package/dist/profiles/ai-orchestration/patterns/spinbutton.md +28 -0
  28. package/dist/profiles/ai-orchestration/patterns/tabs.md +6 -1
  29. package/dist/profiles/ai-orchestration/patterns/tooltip.md +6 -1
  30. package/dist/profiles/ai-orchestration/patterns/tree-view.md +31 -0
  31. package/dist/profiles/ai-orchestration/patterns/validation.md +7 -1
  32. package/dist/profiles/ai-orchestration/review/accessibility.md +14 -6
  33. package/dist/profiles/ai-orchestration/semantics/accessible-authentication.md +13 -0
  34. package/dist/profiles/ai-orchestration/semantics/accessible-name.md +8 -2
  35. package/dist/profiles/ai-orchestration/semantics/alert.md +7 -1
  36. package/dist/profiles/ai-orchestration/semantics/consequential-action.md +6 -2
  37. package/dist/profiles/ai-orchestration/semantics/consistent-help.md +13 -0
  38. package/dist/profiles/ai-orchestration/semantics/data-table.md +7 -2
  39. package/dist/profiles/ai-orchestration/semantics/dragging-alternative.md +13 -0
  40. package/dist/profiles/ai-orchestration/semantics/expanded-state.md +6 -1
  41. package/dist/profiles/ai-orchestration/semantics/focus.initial.md +4 -1
  42. package/dist/profiles/ai-orchestration/semantics/focus.return.md +4 -1
  43. package/dist/profiles/ai-orchestration/semantics/focus.visible.md +8 -2
  44. package/dist/profiles/ai-orchestration/semantics/form-error.md +8 -2
  45. package/dist/profiles/ai-orchestration/semantics/form-label.md +7 -1
  46. package/dist/profiles/ai-orchestration/semantics/form-required.md +7 -1
  47. package/dist/profiles/ai-orchestration/semantics/headings.md +7 -1
  48. package/dist/profiles/ai-orchestration/semantics/keyboard.escape.md +4 -1
  49. package/dist/profiles/ai-orchestration/semantics/keyboard.md +7 -1
  50. package/dist/profiles/ai-orchestration/semantics/landmarks.md +6 -1
  51. package/dist/profiles/ai-orchestration/semantics/live-status.md +7 -2
  52. package/dist/profiles/ai-orchestration/semantics/media-alternatives.md +11 -1
  53. package/dist/profiles/ai-orchestration/semantics/motion-control.md +8 -2
  54. package/dist/profiles/ai-orchestration/semantics/name-role-value.md +6 -2
  55. package/dist/profiles/ai-orchestration/semantics/native-dialog.md +7 -1
  56. package/dist/profiles/ai-orchestration/semantics/native-elements.md +5 -1
  57. package/dist/profiles/ai-orchestration/semantics/non-text-alternative.md +5 -1
  58. package/dist/profiles/ai-orchestration/semantics/redundant-entry.md +13 -0
  59. package/dist/profiles/ai-orchestration/semantics/roles-states-properties.md +6 -1
  60. package/dist/profiles/ai-orchestration/semantics/selected-state.md +6 -1
  61. package/dist/profiles/ai-orchestration/semantics/target-size.md +6 -2
  62. package/dist/profiles/ai-orchestration/semantics.json +826 -130
  63. package/dist/profiles/ai-orchestration/testing/accessibility.md +33 -3
  64. package/dist/profiles/ai-orchestration/ui-design-brain-bindings.json +287 -307
  65. package/dist/profiles/conductor/a11y-semantics.md +249 -10
  66. package/dist/profiles/conductor/accessibility-quality.md +275 -33
  67. package/dist/profiles/conductor/applicability-matrix.json +226 -269
  68. package/dist/profiles/conductor/coverage-manifest.json +702 -153
  69. package/dist/profiles/conductor/pattern-contracts.json +892 -306
  70. package/dist/profiles/conductor/patterns/accordion.json +35 -27
  71. package/dist/profiles/conductor/patterns/alert.json +29 -21
  72. package/dist/profiles/conductor/patterns/carousel.json +36 -28
  73. package/dist/profiles/conductor/patterns/checkbox.json +67 -0
  74. package/dist/profiles/conductor/patterns/combobox.json +37 -29
  75. package/dist/profiles/conductor/patterns/consequential-submission.json +34 -25
  76. package/dist/profiles/conductor/patterns/dialog.json +37 -29
  77. package/dist/profiles/conductor/patterns/disclosure.json +33 -25
  78. package/dist/profiles/conductor/patterns/dynamic-status.json +31 -22
  79. package/dist/profiles/conductor/patterns/field.json +41 -25
  80. package/dist/profiles/conductor/patterns/image.json +31 -22
  81. package/dist/profiles/conductor/patterns/listbox.json +35 -27
  82. package/dist/profiles/conductor/patterns/media-player.json +59 -29
  83. package/dist/profiles/conductor/patterns/menu-button.json +34 -26
  84. package/dist/profiles/conductor/patterns/menu.json +78 -0
  85. package/dist/profiles/conductor/patterns/pagination.json +34 -25
  86. package/dist/profiles/conductor/patterns/popover.json +42 -26
  87. package/dist/profiles/conductor/patterns/progress.json +38 -23
  88. package/dist/profiles/conductor/patterns/radio-group.json +69 -0
  89. package/dist/profiles/conductor/patterns/slider.json +84 -0
  90. package/dist/profiles/conductor/patterns/spinbutton.json +74 -0
  91. package/dist/profiles/conductor/patterns/tabs.json +34 -26
  92. package/dist/profiles/conductor/patterns/tooltip.json +31 -23
  93. package/dist/profiles/conductor/patterns/tree-view.json +77 -0
  94. package/dist/profiles/conductor/patterns/validation.json +42 -26
  95. package/dist/profiles/conductor/semantics.json +826 -130
  96. package/dist/profiles/conductor/ui-design-brain-bindings.json +287 -307
  97. package/dist/projection-manifest.json +120 -104
  98. package/dist/requirements-to-implementation.md +7 -1
  99. package/lib/build.mjs +3 -3
  100. package/lib/digest.mjs +8 -0
  101. package/lib/load.mjs +13 -0
  102. package/lib/provenance.mjs +2 -0
  103. package/lib/render.mjs +51 -7
  104. package/lib/sync.mjs +2 -2
  105. package/lib/validate.mjs +335 -33
  106. package/package.json +6 -2
  107. package/profiles/ai-orchestration/profile.json +1 -1
  108. package/profiles/ai-orchestration/templates/patterns/README.md +1 -1
  109. package/profiles/ai-orchestration/templates/review/README.md +1 -1
  110. package/profiles/ai-orchestration/templates/semantics/README.md +1 -1
  111. package/profiles/ai-orchestration/templates/testing/README.md +1 -1
  112. package/profiles/conductor/profile.json +1 -1
  113. package/profiles/conductor/templates/evidence/README.md +1 -1
  114. package/profiles/conductor/templates/patterns/README.md +1 -1
  115. package/profiles/conductor/templates/semantics/README.md +1 -1
  116. package/schemas/consumer-config.schema.json +1 -1
  117. package/schemas/contract.schema.json +1 -1
  118. package/schemas/manifest.schema.json +1 -1
  119. package/schemas/pattern.schema.json +98 -1
  120. package/schemas/profile.schema.json +1 -1
  121. package/schemas/projection-manifest.schema.json +6 -6
  122. package/schemas/semantic.schema.json +26 -1
  123. package/schemas/standards-reference.schema.json +105 -0
  124. package/schemas/wcag-coverage.schema.json +93 -0
  125. package/src/applicability/facts.yml +3 -5
  126. package/src/applicability/matrix.yml +5 -7
  127. package/src/applicability/ui-design-brain-bindings.yml +8 -22
  128. package/src/contract.yml +1 -1
  129. package/src/coverage/wcag-2.2.yml +68 -0
  130. package/src/patterns/disclosure/accordion.yml +1 -1
  131. package/src/patterns/disclosure/disclosure.yml +1 -1
  132. package/src/patterns/feedback/alert.yml +1 -1
  133. package/src/patterns/feedback/dynamic-status.yml +1 -1
  134. package/src/patterns/feedback/progress.yml +1 -1
  135. package/src/patterns/forms/consequential-submission.yml +1 -1
  136. package/src/patterns/forms/field.yml +1 -1
  137. package/src/patterns/forms/spinbutton.yml +1 -0
  138. package/src/patterns/forms/validation.yml +1 -1
  139. package/src/patterns/media/carousel.yml +1 -1
  140. package/src/patterns/media/image.yml +1 -1
  141. package/src/patterns/media/media-player.yml +1 -1
  142. package/src/patterns/navigation/menu-button.yml +1 -1
  143. package/src/patterns/navigation/menu.yml +1 -0
  144. package/src/patterns/navigation/pagination.yml +1 -1
  145. package/src/patterns/navigation/tabs.yml +1 -1
  146. package/src/patterns/navigation/tree-view.yml +1 -0
  147. package/src/patterns/overlays/dialog.yml +1 -1
  148. package/src/patterns/overlays/popover.yml +1 -1
  149. package/src/patterns/overlays/tooltip.yml +1 -1
  150. package/src/patterns/selection/checkbox.yml +1 -0
  151. package/src/patterns/selection/combobox.yml +1 -1
  152. package/src/patterns/selection/listbox.yml +1 -1
  153. package/src/patterns/selection/radio-group.yml +1 -0
  154. package/src/patterns/selection/slider.yml +1 -0
  155. package/src/semantics/accessible-names.yml +1 -1
  156. package/src/semantics/forms.yml +1 -1
  157. package/src/semantics/headings-landmarks.yml +1 -1
  158. package/src/semantics/keyboard-focus.yml +1 -1
  159. package/src/semantics/live-regions.yml +1 -1
  160. package/src/semantics/media.yml +1 -1
  161. package/src/semantics/native-elements.yml +1 -1
  162. package/src/semantics/roles-states-properties.yml +1 -1
  163. package/src/semantics/tables.yml +1 -1
  164. package/src/semantics/wcag-2.2.yml +1 -0
  165. package/src/sources.yml +1 -1
@@ -1,11 +1,16 @@
1
1
  <!-- GENERATED by @verndale/accessibility-standards; DO NOT EDIT -->
2
- <!-- package: @verndale/accessibility-standards@2.0.0; profile: conductor@2.0.0; schema: 2; source-digest: e4bf4272751c21e417ddd3e6c52308bf804fab097629ba843964532e7f97d9f0; profile-digest: 4840ac3a4910f8dc3a850df266a141e0e4df94ca3c8935ae4531c56f6be91e65 -->
2
+ <!-- package: @verndale/accessibility-standards@3.0.0; profile: conductor@3.0.0; schema: 3; source-digest: 708ac82783bfb5ebcce31e4dada15d8580863f5e37b32d1807adf61e415ed5af; profile-digest: beadcb5fe8151303b3e3241de4fee0ece3be9ff2f4dbdb3a6f93a363b0a2d491 -->
3
3
  # Accessibility quality contract
4
4
 
5
5
  ## pattern.accordion
6
6
 
7
+ Standards:
8
+ - [aria-apg accordion](<https://www.w3.org/WAI/ARIA/apg/patterns/accordion/>) — informative
9
+
7
10
  Requires: semantics.native-elements, semantics.accessible-name, semantics.expanded-state, semantics.keyboard, semantics.focus.visible.
8
11
 
12
+ Activation: `{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.accordion"}}`
13
+
9
14
  Scope: Grouped disclosure sections.
10
15
 
11
16
  Behavior:
@@ -22,8 +27,13 @@ Evidence: unit, axe, e2e, human.
22
27
 
23
28
  ## pattern.alert
24
29
 
30
+ Standards:
31
+ - [aria-apg alert](<https://www.w3.org/WAI/ARIA/apg/patterns/alert/>) — informative
32
+
25
33
  Requires: semantics.alert.
26
34
 
35
+ Activation: `{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.alert"}}`
36
+
27
37
  Scope: Urgent message.
28
38
 
29
39
  Behavior:
@@ -39,8 +49,13 @@ Evidence: unit, human.
39
49
 
40
50
  ## pattern.carousel
41
51
 
52
+ Standards:
53
+ - [aria-apg carousel](<https://www.w3.org/WAI/ARIA/apg/patterns/carousel/>) — informative
54
+
42
55
  Requires: semantics.accessible-name, semantics.keyboard, semantics.focus.visible, semantics.motion-control, semantics.live-status.
43
56
 
57
+ Activation: `{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.carousel"}}`
58
+
44
59
  Scope: Rotating content set.
45
60
 
46
61
  Behavior:
@@ -55,10 +70,39 @@ Implementation outcomes: carousel-controls, carousel-rotation.
55
70
 
56
71
  Evidence: unit, axe, e2e, human.
57
72
 
73
+ ## pattern.checkbox
74
+
75
+ Standards:
76
+ - [aria-apg checkbox](<https://www.w3.org/WAI/ARIA/apg/patterns/checkbox/>) — informative
77
+
78
+ Requires: semantics.accessible-name, semantics.focus.visible, semantics.form-label, semantics.keyboard, semantics.name-role-value, semantics.native-elements, semantics.roles-states-properties.
79
+
80
+ Activation: `{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.checkbox"}}`
81
+
82
+ Scope: Standalone, grouped, dual-state, or tri-state checkboxes.
83
+
84
+ Behavior:
85
+ - Use a native checkbox when it provides the required behavior; otherwise expose checkbox semantics and synchronize checked, unchecked, or mixed state
86
+ - Space toggles the focused checkbox without changing unrelated controls
87
+ - Associate logical groups and any relevant descriptions with programmatic group labels
88
+
89
+ Product decisions: dual_or_tri_state, group_labeling, mixed_state_cycle.
90
+
91
+ Functional Spec bindings: fields, states, keyboard.
92
+
93
+ Implementation outcomes: checkbox-group-semantics, checkbox-state-machine.
94
+
95
+ Evidence: unit, axe, e2e, human.
96
+
58
97
  ## pattern.combobox
59
98
 
99
+ Standards:
100
+ - [aria-apg combobox](<https://www.w3.org/WAI/ARIA/apg/patterns/combobox/>) — informative
101
+
60
102
  Requires: semantics.accessible-name, semantics.expanded-state, semantics.selected-state, semantics.keyboard, semantics.live-status.
61
103
 
104
+ Activation: `{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.combobox"}}`
105
+
62
106
  Scope: Input with selectable popup.
63
107
 
64
108
  Behavior:
@@ -74,12 +118,17 @@ Evidence: unit, axe, e2e, human.
74
118
 
75
119
  ## pattern.consequential-submission
76
120
 
121
+ Standards:
122
+ - [wcag-2.2 3.3.4](<https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data>) (Level AA) — normative
123
+
77
124
  Requires: semantics.consequential-action, semantics.form-error, semantics.keyboard.
78
125
 
79
- Scope: Legal, financial, destructive, or irreversible submission.
126
+ Activation: `{"contains":{"fact":"component.submission_consequence","value":"consequential"}}`
127
+
128
+ Scope: Legal commitments, financial transactions, stored user-controllable data changes, or user test-response submissions.
80
129
 
81
130
  Behavior:
82
- - Support review, correction, confirmation, or reversal
131
+ - Provide at least one declared safeguard: make the submission reversible; check user-entered data for errors and let the user correct them; or let the user review, confirm, and correct information before finalizing
83
132
 
84
133
  Product decisions: safeguard, reversal_window.
85
134
 
@@ -91,8 +140,13 @@ Evidence: e2e, human.
91
140
 
92
141
  ## pattern.dialog
93
142
 
143
+ Standards:
144
+ - [aria-apg dialog-modal](<https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/>) — informative
145
+
94
146
  Requires: semantics.native-dialog, semantics.accessible-name, semantics.keyboard.escape, semantics.focus.initial, semantics.focus.return.
95
147
 
148
+ Activation: `{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.dialog"}}`
149
+
96
150
  Scope: Modal and non-modal dialogs.
97
151
 
98
152
  Behavior:
@@ -109,8 +163,13 @@ Evidence: unit, axe, e2e, human.
109
163
 
110
164
  ## pattern.disclosure
111
165
 
166
+ Standards:
167
+ - [aria-apg disclosure](<https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/>) — informative
168
+
112
169
  Requires: semantics.native-elements, semantics.accessible-name, semantics.expanded-state, semantics.keyboard.
113
170
 
171
+ Activation: `{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.disclosure"}}`
172
+
114
173
  Scope: Show and hide supplementary content.
115
174
 
116
175
  Behavior:
@@ -126,8 +185,13 @@ Evidence: unit, axe, e2e.
126
185
 
127
186
  ## pattern.dynamic-status
128
187
 
188
+ Standards:
189
+ - [wcag-2.2 4.1.3](<https://www.w3.org/TR/WCAG22/#status-messages>) (Level AA) — normative
190
+
129
191
  Requires: semantics.live-status.
130
192
 
193
+ Activation: `{"equals":{"fact":"component.has_dynamic_status","value":true}}`
194
+
131
195
  Scope: Asynchronous status message.
132
196
 
133
197
  Behavior:
@@ -143,8 +207,14 @@ Evidence: unit, e2e, human.
143
207
 
144
208
  ## pattern.field
145
209
 
210
+ Standards:
211
+ - [wcag-2.2 3.3.2](<https://www.w3.org/TR/WCAG22/#labels-or-instructions>) (Level A) — normative
212
+ - [wcag-2.2 4.1.2](<https://www.w3.org/TR/WCAG22/#name-role-value>) (Level A) — normative
213
+
146
214
  Requires: semantics.form-label, semantics.form-required, semantics.focus.visible.
147
215
 
216
+ Activation: `{"any":[{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.field"}},{"equals":{"fact":"component.has_form_fields","value":true}}]}`
217
+
148
218
  Scope: Labeled form input.
149
219
 
150
220
  Behavior:
@@ -160,8 +230,13 @@ Evidence: unit, axe, human.
160
230
 
161
231
  ## pattern.image
162
232
 
233
+ Standards:
234
+ - [wcag-2.2 1.1.1](<https://www.w3.org/TR/WCAG22/#non-text-content>) (Level A) — normative
235
+
163
236
  Requires: semantics.non-text-alternative.
164
237
 
238
+ Activation: `{"any":[{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.image"}},{"equals":{"fact":"content.has_non_text","value":true}}]}`
239
+
165
240
  Scope: Informative, functional, complex, or decorative image.
166
241
 
167
242
  Behavior:
@@ -177,8 +252,13 @@ Evidence: axe, human.
177
252
 
178
253
  ## pattern.listbox
179
254
 
255
+ Standards:
256
+ - [aria-apg listbox](<https://www.w3.org/WAI/ARIA/apg/patterns/listbox/>) — informative
257
+
180
258
  Requires: semantics.accessible-name, semantics.selected-state, semantics.keyboard, semantics.focus.visible.
181
259
 
260
+ Activation: `{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.listbox"}}`
261
+
182
262
  Scope: Single or multi-select option list.
183
263
 
184
264
  Behavior:
@@ -195,8 +275,16 @@ Evidence: unit, axe, e2e, human.
195
275
 
196
276
  ## pattern.media-player
197
277
 
278
+ Standards:
279
+ - [wcag-2.2 1.2.1](<https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded>) (Level A) — normative
280
+ - [wcag-2.2 1.2.2](<https://www.w3.org/TR/WCAG22/#captions-prerecorded>) (Level A) — normative
281
+ - [wcag-2.2 1.2.3](<https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded>) (Level A) — normative
282
+ - [wcag-2.2 1.2.5](<https://www.w3.org/TR/WCAG22/#audio-description-prerecorded>) (Level AA) — normative
283
+
198
284
  Requires: semantics.media-alternatives, semantics.accessible-name, semantics.keyboard, semantics.focus.visible, semantics.motion-control.
199
285
 
286
+ Activation: `{"any":[{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.media-player"}},{"equals":{"fact":"content.has_media","value":true}}]}`
287
+
200
288
  Scope: Audio or video playback.
201
289
 
202
290
  Behavior:
@@ -210,10 +298,42 @@ Implementation outcomes: media-alternatives, media-controls.
210
298
 
211
299
  Evidence: axe, e2e, human.
212
300
 
301
+ ## pattern.menu
302
+
303
+ Standards:
304
+ - [aria-apg menubar](<https://www.w3.org/WAI/ARIA/apg/patterns/menubar/>) — informative
305
+
306
+ Requires: semantics.accessible-name, semantics.expanded-state, semantics.focus.initial, semantics.focus.return, semantics.focus.visible, semantics.keyboard, semantics.keyboard.escape, semantics.roles-states-properties.
307
+
308
+ Activation: `{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.menu"}}`
309
+
310
+ Scope: Command menus, submenus, and persistent menubars.
311
+
312
+ Behavior:
313
+ - Expose menu or menubar containers with menuitem, menuitemcheckbox, or menuitemradio children; synchronize submenu expanded state, checkable-item checked state, orientation, and disabled state
314
+ - When a popup menu opens, move focus to its first item; when a persistent menubar receives focus through Tab or Shift+Tab, restore its declared last-focused item or use its first enabled item; Tab and Shift+Tab do not move among items and, from an item, exit the composite and close all open menus
315
+ - For the default horizontal menubar with vertical popup menus, Right and Left move among menubar items, Down opens a submenu and focuses its first item, Up may open it and focus its last item, Down and Up move among popup items, Right opens a child submenu, and Left closes a child submenu and returns focus to its parent item; reverse the declared axes for alternate orientations
316
+ - Enter opens an item's submenu and focuses its first item, or otherwise activates the item and closes the menu; declare whether Space mirrors Enter on plain items, toggles menuitemcheckbox without closing, and checks a menuitemradio while unchecking its group peers without closing
317
+ - Keep disabled menu items focusable but non-activatable, keep separators non-focusable, and apply Home, End, optional type-ahead, and the declared wrapping policy within the current menu or menubar
318
+ - Escape closes the menu containing focus and restores focus to its parent item, menu button, or invoking context
319
+
320
+ Product decisions: entry_focus, focus_strategy, menu_or_menubar, orientation, space_behavior, submenu_model, typeahead, wrap_navigation.
321
+
322
+ Functional Spec bindings: behavior, states, keyboard, focus.
323
+
324
+ Implementation outcomes: menu-composite-focus, menu-keyboard-model, menu-state-model.
325
+
326
+ Evidence: unit, axe, e2e, human.
327
+
213
328
  ## pattern.menu-button
214
329
 
330
+ Standards:
331
+ - [aria-apg menu-button](<https://www.w3.org/WAI/ARIA/apg/patterns/menu-button/>) — informative
332
+
215
333
  Requires: semantics.accessible-name, semantics.expanded-state, semantics.keyboard, semantics.focus.initial, semantics.focus.return.
216
334
 
335
+ Activation: `{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.menu-button"}}`
336
+
217
337
  Scope: Button opening a command menu.
218
338
 
219
339
  Behavior:
@@ -229,8 +349,13 @@ Evidence: unit, e2e, human.
229
349
 
230
350
  ## pattern.pagination
231
351
 
352
+ Standards:
353
+ - [wcag-2.2 2.4.4](<https://www.w3.org/TR/WCAG22/#link-purpose-in-context>) (Level A) — normative
354
+
232
355
  Requires: semantics.native-elements, semantics.accessible-name, semantics.landmarks, semantics.focus.visible.
233
356
 
357
+ Activation: `{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.pagination"}}`
358
+
234
359
  Scope: Paged result navigation.
235
360
 
236
361
  Behavior:
@@ -246,8 +371,14 @@ Evidence: unit, axe, human.
246
371
 
247
372
  ## pattern.popover
248
373
 
374
+ Standards:
375
+ - [wcag-2.2 2.1.1](<https://www.w3.org/TR/WCAG22/#keyboard>) (Level A) — normative
376
+ - [wcag-2.2 2.4.3](<https://www.w3.org/TR/WCAG22/#focus-order>) (Level A) — normative
377
+
249
378
  Requires: semantics.native-elements, semantics.accessible-name, semantics.keyboard.escape, semantics.focus.return.
250
379
 
380
+ Activation: `{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.popover"}}`
381
+
251
382
  Scope: Non-modal transient surface.
252
383
 
253
384
  Behavior:
@@ -263,8 +394,14 @@ Evidence: unit, e2e, human.
263
394
 
264
395
  ## pattern.progress
265
396
 
397
+ Standards:
398
+ - [wai-aria-1.2 progressbar](<https://www.w3.org/TR/wai-aria-1.2/#progressbar>) — normative
399
+ - [wcag-2.2 4.1.2](<https://www.w3.org/TR/WCAG22/#name-role-value>) (Level A) — normative
400
+
266
401
  Requires: semantics.name-role-value, semantics.live-status.
267
402
 
403
+ Activation: `{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.progress"}}`
404
+
268
405
  Scope: Determinate or indeterminate progress.
269
406
 
270
407
  Behavior:
@@ -278,10 +415,92 @@ Implementation outcomes: progress-value.
278
415
 
279
416
  Evidence: unit, axe, human.
280
417
 
418
+ ## pattern.radio-group
419
+
420
+ Standards:
421
+ - [aria-apg radio](<https://www.w3.org/WAI/ARIA/apg/patterns/radio/>) — informative
422
+
423
+ Requires: semantics.accessible-name, semantics.focus.visible, semantics.form-label, semantics.keyboard, semantics.native-elements, semantics.roles-states-properties.
424
+
425
+ Activation: `{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.radio-group"}}`
426
+
427
+ Scope: Mutually exclusive choices presented as a radio group.
428
+
429
+ Behavior:
430
+ - Use native grouped radio inputs when they provide the required behavior; otherwise expose a named radiogroup containing named radio controls with exactly one checked item when selected
431
+ - Use one tab stop for group entry, focusing the checked radio or the first radio when none is checked
432
+ - Outside a toolbar, Space selects the focused radio and arrow keys move focus and selection with wrapping; inside a toolbar, toolbar navigation moves focus without changing selection, while Space or optionally Enter checks the focused radio
433
+
434
+ Product decisions: initial_selection, native_or_custom, toolbar_context, wrap_navigation.
435
+
436
+ Functional Spec bindings: fields, states, keyboard, focus.
437
+
438
+ Implementation outcomes: radio-group-keyboard-model, radio-group-labeling, radio-group-selection-model.
439
+
440
+ Evidence: unit, axe, e2e, human.
441
+
442
+ ## pattern.slider
443
+
444
+ Standards:
445
+ - [aria-apg slider](<https://www.w3.org/WAI/ARIA/apg/patterns/slider/>) — informative
446
+ - [aria-apg slider-multithumb](<https://www.w3.org/WAI/ARIA/apg/patterns/slider-multithumb/>) — informative
447
+
448
+ Requires: semantics.accessible-name, semantics.dragging-alternative, semantics.focus.visible, semantics.keyboard, semantics.name-role-value, semantics.native-elements, semantics.roles-states-properties.
449
+
450
+ Activation: `{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.slider"}}`
451
+
452
+ Scope: Single-thumb or multi-thumb bounded range input.
453
+
454
+ Behavior:
455
+ - Use a native input[type=range] for a single-thumb slider when it supplies the required range, step, orientation, labeling, and value presentation; use a custom slider only when native behavior cannot satisfy the declared interaction
456
+ - Expose every focusable thumb as a distinct named slider with synchronized current, minimum, maximum, orientation, and user-friendly value text when the numeric value is insufficient
457
+ - Right and Up increase by one step while Left and Down decrease by one step unless a documented orientation and value presentation makes reversal more intuitive; Home and End move to range bounds, and optional Page Up and Page Down apply the declared larger step
458
+ - Provide an equivalent single-pointer method for every drag operation that does not require dragging, such as track activation or an adjacent value input
459
+ - Keep every thumb in a constant tab order for multi-thumb sliders and update dependent thumb bounds whenever another thumb changes them
460
+ - Verify operation with touch-based assistive technology on target devices before production use
461
+
462
+ Product decisions: direction_mapping, large_step, native_or_custom, orientation, single_or_multi_thumb, step, thumb_constraints, value_text.
463
+
464
+ Functional Spec bindings: fields, states, keyboard, controls.
465
+
466
+ Implementation outcomes: slider-keyboard-model, slider-native-control-selection, slider-range-state, slider-touch-at-compatibility.
467
+
468
+ Evidence: unit, axe, e2e, human.
469
+
470
+ ## pattern.spinbutton
471
+
472
+ Standards:
473
+ - [aria-apg spinbutton](<https://www.w3.org/WAI/ARIA/apg/patterns/spinbutton/>) — informative
474
+
475
+ Requires: semantics.accessible-name, semantics.focus.visible, semantics.form-label, semantics.keyboard, semantics.name-role-value, semantics.native-elements, semantics.roles-states-properties.
476
+
477
+ Activation: `{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.spinbutton"}}`
478
+
479
+ Scope: Value input constrained to a discrete set or range, with optional direct text editing.
480
+
481
+ Behavior:
482
+ - Use a native number input when it supplies the required range, step, editing, labeling, and validation behavior; otherwise expose a named spinbutton with synchronized current, minimum, maximum, user-friendly value text, and invalid state when a value is outside the allowed range
483
+ - Keep focus on the spinbutton while Up and Down change its value, Home and End apply known bounds, and optional Page Up and Page Down apply the declared larger step
484
+ - Treat the editable decision as permission for direct text entry, not as whether the spinbutton is adjustable; when direct editing is disabled, the declared increment and decrement controls still change the value and the spinbutton is not exposed as read-only
485
+ - When direct editing is allowed, preserve platform text editing commands and do not intercept keys needed to enter, navigate, select, or modify text
486
+
487
+ Product decisions: editable, large_step, native_or_custom, range_bounds, step, value_text.
488
+
489
+ Functional Spec bindings: fields, states, keyboard, validation.
490
+
491
+ Implementation outcomes: spinbutton-keyboard-model, spinbutton-native-control-selection, spinbutton-range-state, spinbutton-validation.
492
+
493
+ Evidence: unit, axe, e2e, human.
494
+
281
495
  ## pattern.tabs
282
496
 
497
+ Standards:
498
+ - [aria-apg tabs](<https://www.w3.org/WAI/ARIA/apg/patterns/tabs/>) — informative
499
+
283
500
  Requires: semantics.accessible-name, semantics.selected-state, semantics.keyboard, semantics.focus.visible.
284
501
 
502
+ Activation: `{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.tabs"}}`
503
+
285
504
  Scope: Tabbed interfaces.
286
505
 
287
506
  Behavior:
@@ -298,8 +517,13 @@ Evidence: unit, axe, e2e, human.
298
517
 
299
518
  ## pattern.tooltip
300
519
 
520
+ Standards:
521
+ - [aria-apg tooltip](<https://www.w3.org/WAI/ARIA/apg/patterns/tooltip/>) — informative
522
+
301
523
  Requires: semantics.accessible-name, semantics.keyboard.escape.
302
524
 
525
+ Activation: `{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.tooltip"}}`
526
+
303
527
  Scope: Supplementary description.
304
528
 
305
529
  Behavior:
@@ -314,10 +538,44 @@ Implementation outcomes: tooltip-description.
314
538
 
315
539
  Evidence: unit, e2e, human.
316
540
 
541
+ ## pattern.tree-view
542
+
543
+ Standards:
544
+ - [aria-apg treeview](<https://www.w3.org/WAI/ARIA/apg/patterns/treeview/>) — informative
545
+
546
+ Requires: semantics.accessible-name, semantics.expanded-state, semantics.focus.visible, semantics.keyboard, semantics.roles-states-properties, semantics.selected-state.
547
+
548
+ Activation: `{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.tree-view"}}`
549
+
550
+ Scope: Hierarchical single-select or multi-select tree widgets.
551
+
552
+ Behavior:
553
+ - Expose tree, treeitem, and group relationships, set aria-multiselectable for a multi-select tree, and provide level, position, and set-size metadata when the complete hierarchy is not represented in the DOM
554
+ - On tree entry, focus the selected node or first selected node when one exists and otherwise focus the first node; keep one composite tab stop and keep focus visually distinct from selection
555
+ - In a vertical tree, Right Arrow opens a closed parent without moving focus, moves from an open parent to its first child, and does nothing on an end node; Left Arrow closes an open parent, moves from a closed parent or end node to its parent, and does nothing on a root node that cannot close
556
+ - In a vertical tree, Down Arrow moves to the next visible focusable node and Up Arrow moves to the previous visible focusable node without changing expansion; Home and End move to the first and last visible focusable nodes, Enter performs the node's declared default action, and type-ahead moves to the next matching node
557
+ - For a horizontal tree, remap Down Arrow to the vertical Right Arrow behavior, Right Arrow to vertical Down Arrow, Up Arrow to vertical Left Arrow, and Left Arrow to vertical Up Arrow
558
+ - Keep focus distinct from selection and synchronize expansion and the declared aria-selected or aria-checked state model without exposing both states for the same selection purpose
559
+ - For a multi-select tree using the recommended modifier-free model, navigation does not clear selection, Space toggles selection of the focused node, and declared Shift combinations extend contiguous selection; for the alternative modifier-required model, unmodified navigation selects only the focused node while Control plus an arrow moves focus without changing selection and Control plus Space toggles the focused node
560
+
561
+ Product decisions: focus_strategy, multi_select_keyboard_model, orientation, selection_follows_focus, selection_state, single_or_multi_select, typeahead, virtualization.
562
+
563
+ Functional Spec bindings: behavior, states, keyboard, focus.
564
+
565
+ Implementation outcomes: tree-hierarchy-semantics, tree-keyboard-model, tree-selection-model.
566
+
567
+ Evidence: unit, axe, e2e, human.
568
+
317
569
  ## pattern.validation
318
570
 
571
+ Standards:
572
+ - [wcag-2.2 3.3.1](<https://www.w3.org/TR/WCAG22/#error-identification>) (Level A) — normative
573
+ - [wcag-2.2 3.3.3](<https://www.w3.org/TR/WCAG22/#error-suggestion>) (Level AA) — normative
574
+
319
575
  Requires: semantics.form-error, semantics.live-status, semantics.focus.initial.
320
576
 
577
+ Activation: `{"any":[{"contains":{"fact":"component.accessibility_pattern_ids","value":"pattern.validation"}},{"equals":{"fact":"component.has_validation","value":true}}]}`
578
+
321
579
  Scope: Client or server validation.
322
580
 
323
581
  Behavior:
@@ -411,21 +669,13 @@ Outcomes: semantics.keyboard.
411
669
 
412
670
  Evidence: e2e, human.
413
671
 
414
- ## applicability.character-shortcuts
672
+ ## applicability.dragging-alternative
415
673
 
416
- When: `{"equals":{"fact":"interaction.has_character_shortcuts","value":true}}`
674
+ When: `{"equals":{"fact":"interaction.has_dragging","value":true}}`
417
675
 
418
- Outcomes: semantics.keyboard.
676
+ Outcomes: semantics.dragging-alternative.
419
677
 
420
- Evidence: unit, e2e.
421
-
422
- ## applicability.orientation-sensory
423
-
424
- When: `{"equals":{"fact":"content.uses_orientation_or_sensory_cues","value":true}}`
425
-
426
- Outcomes: semantics.name-role-value.
427
-
428
- Evidence: human.
678
+ Evidence: e2e, human.
429
679
 
430
680
  ## applicability.target-size
431
681
 
@@ -443,41 +693,33 @@ Outcomes: semantics.focus.visible.
443
693
 
444
694
  Evidence: e2e, human.
445
695
 
446
- ## applicability.authentication-captcha
696
+ ## applicability.accessible-authentication
447
697
 
448
698
  When: `{"equals":{"fact":"flow.has_authentication","value":true}}`
449
699
 
450
- Outcomes: semantics.form-label, semantics.form-error.
700
+ Outcomes: semantics.accessible-authentication.
451
701
 
452
- Evidence: axe, e2e, human.
702
+ Evidence: e2e, human.
453
703
 
454
704
  ## applicability.redundant-entry
455
705
 
456
706
  When: `{"equals":{"fact":"flow.repeats_entry","value":true}}`
457
707
 
458
- Outcomes: semantics.form-label.
708
+ Outcomes: semantics.form-label, semantics.redundant-entry.
459
709
 
460
710
  Evidence: e2e, human.
461
711
 
462
712
  ## applicability.consistent-help
463
713
 
464
- When: `{"equals":{"fact":"artifact.has_help","value":true}}`
465
-
466
- Outcomes: semantics.landmarks.
714
+ When: `{"equals":{"fact":"artifact.has_repeated_help_across_page_set","value":true}}`
467
715
 
468
- Evidence: human.
716
+ Outcomes: semantics.consistent-help.
469
717
 
470
- ## applicability.locale-bidi
471
-
472
- When: `{"equals":{"fact":"content.has_locale_or_bidi","value":true}}`
473
-
474
- Outcomes: semantics.native-elements.
475
-
476
- Evidence: unit, human.
718
+ Evidence: e2e, human.
477
719
 
478
- ## applicability.data-table-grid
720
+ ## applicability.data-table
479
721
 
480
- When: `{"equals":{"fact":"component.has_data_table_or_grid","value":true}}`
722
+ When: `{"equals":{"fact":"component.has_data_table","value":true}}`
481
723
 
482
724
  Outcomes: semantics.data-table.
483
725
 
@@ -487,7 +729,7 @@ Evidence: axe, e2e, human.
487
729
 
488
730
  Tool availability changes the evidence route, never requirement applicability. A missing required capability is a blocker.
489
731
 
490
- - unit: semantic state and deterministic resolver behavior; capability: unit
491
732
  - axe: automated rule evidence; capability: axe
492
733
  - e2e: keyboard, focus, and integrated behavior; capability: e2e
493
734
  - human: judgment, assistive technology, content, and visual evidence; capability: human
735
+ - unit: semantic state and deterministic resolver behavior; capability: unit