@verndale/accessibility-standards 1.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 (148) hide show
  1. package/OPERATING.md +5 -0
  2. package/README.md +22 -0
  3. package/bin/accessibility-standards.mjs +32 -0
  4. package/dist/manifest.json +202 -0
  5. package/dist/profiles/ai-orchestration/coverage-manifest.json +202 -0
  6. package/dist/profiles/ai-orchestration/implementation/accessibility.md +329 -0
  7. package/dist/profiles/ai-orchestration/pattern-contracts.json +697 -0
  8. package/dist/profiles/ai-orchestration/patterns/accordion.md +12 -0
  9. package/dist/profiles/ai-orchestration/patterns/alert.md +11 -0
  10. package/dist/profiles/ai-orchestration/patterns/carousel.md +12 -0
  11. package/dist/profiles/ai-orchestration/patterns/combobox.md +11 -0
  12. package/dist/profiles/ai-orchestration/patterns/consequential-submission.md +11 -0
  13. package/dist/profiles/ai-orchestration/patterns/dialog.md +12 -0
  14. package/dist/profiles/ai-orchestration/patterns/disclosure.md +11 -0
  15. package/dist/profiles/ai-orchestration/patterns/dynamic-status.md +11 -0
  16. package/dist/profiles/ai-orchestration/patterns/field.md +11 -0
  17. package/dist/profiles/ai-orchestration/patterns/image.md +11 -0
  18. package/dist/profiles/ai-orchestration/patterns/listbox.md +12 -0
  19. package/dist/profiles/ai-orchestration/patterns/media-player.md +11 -0
  20. package/dist/profiles/ai-orchestration/patterns/menu-button.md +11 -0
  21. package/dist/profiles/ai-orchestration/patterns/pagination.md +11 -0
  22. package/dist/profiles/ai-orchestration/patterns/popover.md +11 -0
  23. package/dist/profiles/ai-orchestration/patterns/progress.md +11 -0
  24. package/dist/profiles/ai-orchestration/patterns/tabs.md +12 -0
  25. package/dist/profiles/ai-orchestration/patterns/tooltip.md +12 -0
  26. package/dist/profiles/ai-orchestration/patterns/validation.md +11 -0
  27. package/dist/profiles/ai-orchestration/review/accessibility.md +67 -0
  28. package/dist/profiles/ai-orchestration/semantics/accessible-name.md +8 -0
  29. package/dist/profiles/ai-orchestration/semantics/alert.md +8 -0
  30. package/dist/profiles/ai-orchestration/semantics/consequential-action.md +8 -0
  31. package/dist/profiles/ai-orchestration/semantics/data-table.md +8 -0
  32. package/dist/profiles/ai-orchestration/semantics/expanded-state.md +8 -0
  33. package/dist/profiles/ai-orchestration/semantics/focus.initial.md +8 -0
  34. package/dist/profiles/ai-orchestration/semantics/focus.return.md +8 -0
  35. package/dist/profiles/ai-orchestration/semantics/focus.visible.md +8 -0
  36. package/dist/profiles/ai-orchestration/semantics/form-error.md +8 -0
  37. package/dist/profiles/ai-orchestration/semantics/form-label.md +8 -0
  38. package/dist/profiles/ai-orchestration/semantics/form-required.md +8 -0
  39. package/dist/profiles/ai-orchestration/semantics/headings.md +8 -0
  40. package/dist/profiles/ai-orchestration/semantics/keyboard.escape.md +8 -0
  41. package/dist/profiles/ai-orchestration/semantics/keyboard.md +8 -0
  42. package/dist/profiles/ai-orchestration/semantics/landmarks.md +8 -0
  43. package/dist/profiles/ai-orchestration/semantics/live-status.md +8 -0
  44. package/dist/profiles/ai-orchestration/semantics/media-alternatives.md +8 -0
  45. package/dist/profiles/ai-orchestration/semantics/motion-control.md +8 -0
  46. package/dist/profiles/ai-orchestration/semantics/name-role-value.md +8 -0
  47. package/dist/profiles/ai-orchestration/semantics/native-dialog.md +8 -0
  48. package/dist/profiles/ai-orchestration/semantics/native-elements.md +8 -0
  49. package/dist/profiles/ai-orchestration/semantics/non-text-alternative.md +8 -0
  50. package/dist/profiles/ai-orchestration/semantics/roles-states-properties.md +8 -0
  51. package/dist/profiles/ai-orchestration/semantics/selected-state.md +8 -0
  52. package/dist/profiles/ai-orchestration/semantics/target-size.md +8 -0
  53. package/dist/profiles/ai-orchestration/semantics.json +289 -0
  54. package/dist/profiles/ai-orchestration/testing/accessibility.md +138 -0
  55. package/dist/profiles/conductor/a11y-semantics.md +152 -0
  56. package/dist/profiles/conductor/accessibility-quality.md +179 -0
  57. package/dist/profiles/conductor/applicability-matrix.json +428 -0
  58. package/dist/profiles/conductor/coverage-manifest.json +202 -0
  59. package/dist/profiles/conductor/pattern-contracts.json +697 -0
  60. package/dist/profiles/conductor/patterns/accordion.json +44 -0
  61. package/dist/profiles/conductor/patterns/alert.json +34 -0
  62. package/dist/profiles/conductor/patterns/carousel.json +45 -0
  63. package/dist/profiles/conductor/patterns/combobox.json +44 -0
  64. package/dist/profiles/conductor/patterns/consequential-submission.json +38 -0
  65. package/dist/profiles/conductor/patterns/dialog.json +47 -0
  66. package/dist/profiles/conductor/patterns/disclosure.json +39 -0
  67. package/dist/profiles/conductor/patterns/dynamic-status.json +36 -0
  68. package/dist/profiles/conductor/patterns/field.json +39 -0
  69. package/dist/profiles/conductor/patterns/image.json +35 -0
  70. package/dist/profiles/conductor/patterns/listbox.json +43 -0
  71. package/dist/profiles/conductor/patterns/media-player.json +45 -0
  72. package/dist/profiles/conductor/patterns/menu-button.json +41 -0
  73. package/dist/profiles/conductor/patterns/pagination.json +39 -0
  74. package/dist/profiles/conductor/patterns/popover.json +40 -0
  75. package/dist/profiles/conductor/patterns/progress.json +37 -0
  76. package/dist/profiles/conductor/patterns/tabs.json +42 -0
  77. package/dist/profiles/conductor/patterns/tooltip.json +37 -0
  78. package/dist/profiles/conductor/patterns/validation.json +42 -0
  79. package/dist/profiles/conductor/semantics.json +289 -0
  80. package/dist/projection-manifest.json +90 -0
  81. package/dist/requirements-to-implementation.md +21 -0
  82. package/lib/build-manifest.mjs +20 -0
  83. package/lib/build.mjs +31 -0
  84. package/lib/compile-applicability.mjs +56 -0
  85. package/lib/digest.mjs +11 -0
  86. package/lib/index.mjs +4 -0
  87. package/lib/load.mjs +40 -0
  88. package/lib/render.mjs +71 -0
  89. package/lib/sync.mjs +94 -0
  90. package/lib/validate.mjs +31 -0
  91. package/package.json +46 -0
  92. package/profiles/ai-orchestration/profile.json +1 -0
  93. package/profiles/ai-orchestration/templates/implementation/README.md +3 -0
  94. package/profiles/ai-orchestration/templates/patterns/README.md +3 -0
  95. package/profiles/ai-orchestration/templates/review/README.md +3 -0
  96. package/profiles/ai-orchestration/templates/semantics/README.md +3 -0
  97. package/profiles/ai-orchestration/templates/testing/README.md +3 -0
  98. package/profiles/conductor/profile.json +1 -0
  99. package/profiles/conductor/templates/applicability/README.md +3 -0
  100. package/profiles/conductor/templates/evidence/README.md +3 -0
  101. package/profiles/conductor/templates/patterns/README.md +3 -0
  102. package/profiles/conductor/templates/semantics/README.md +3 -0
  103. package/schemas/applicability-matrix.schema.json +1 -0
  104. package/schemas/consumer-config.schema.json +1 -0
  105. package/schemas/consumer-routes.schema.json +1 -0
  106. package/schemas/manifest.schema.json +1 -0
  107. package/schemas/pattern.schema.json +1 -0
  108. package/schemas/profile.schema.json +1 -0
  109. package/schemas/projection-manifest.schema.json +1 -0
  110. package/schemas/record.schema.json +1 -0
  111. package/schemas/semantic.schema.json +1 -0
  112. package/src/applicability/facts.yml +1 -0
  113. package/src/applicability/matrix.yml +20 -0
  114. package/src/evidence/proof-routing.yml +1 -0
  115. package/src/foundations/conformance-boundary.yml +1 -0
  116. package/src/foundations/standards-hierarchy.yml +1 -0
  117. package/src/foundations/wcag-2.2.yml +1 -0
  118. package/src/patterns/disclosure/accordion.yml +1 -0
  119. package/src/patterns/disclosure/disclosure.yml +1 -0
  120. package/src/patterns/feedback/alert.yml +1 -0
  121. package/src/patterns/feedback/dynamic-status.yml +1 -0
  122. package/src/patterns/feedback/progress.yml +1 -0
  123. package/src/patterns/forms/consequential-submission.yml +1 -0
  124. package/src/patterns/forms/field.yml +1 -0
  125. package/src/patterns/forms/validation.yml +1 -0
  126. package/src/patterns/media/carousel.yml +1 -0
  127. package/src/patterns/media/image.yml +1 -0
  128. package/src/patterns/media/media-player.yml +1 -0
  129. package/src/patterns/navigation/menu-button.yml +1 -0
  130. package/src/patterns/navigation/pagination.yml +1 -0
  131. package/src/patterns/navigation/tabs.yml +1 -0
  132. package/src/patterns/overlays/dialog.yml +1 -0
  133. package/src/patterns/overlays/popover.yml +1 -0
  134. package/src/patterns/overlays/tooltip.yml +1 -0
  135. package/src/patterns/selection/combobox.yml +1 -0
  136. package/src/patterns/selection/listbox.yml +1 -0
  137. package/src/policies/enhanced-quality.yml +1 -0
  138. package/src/policies/target-size.yml +1 -0
  139. package/src/semantics/accessible-names.yml +1 -0
  140. package/src/semantics/forms.yml +1 -0
  141. package/src/semantics/headings-landmarks.yml +1 -0
  142. package/src/semantics/keyboard-focus.yml +1 -0
  143. package/src/semantics/live-regions.yml +1 -0
  144. package/src/semantics/media.yml +1 -0
  145. package/src/semantics/native-elements.yml +1 -0
  146. package/src/semantics/roles-states-properties.yml +1 -0
  147. package/src/semantics/tables.yml +1 -0
  148. package/src/sources.yml +1 -0
@@ -0,0 +1,289 @@
1
+ {
2
+ "_generated": "GENERATED by @verndale/accessibility-standards; DO NOT EDIT",
3
+ "schema_version": 1,
4
+ "semantics": [
5
+ {
6
+ "id": "semantics.accessible-name",
7
+ "version": "1.0.0",
8
+ "title": "Accessible name",
9
+ "kind": "semantic",
10
+ "requirement": "Every interactive or meaning-bearing control has a concise programmatic name derived from visible text when available.",
11
+ "proof": [
12
+ "unit",
13
+ "axe",
14
+ "human"
15
+ ]
16
+ },
17
+ {
18
+ "id": "semantics.alert",
19
+ "version": "1.0.0",
20
+ "title": "Urgent alert",
21
+ "kind": "semantic",
22
+ "requirement": "Use alert semantics only for urgent, time-sensitive messages that require immediate announcement.",
23
+ "proof": [
24
+ "unit",
25
+ "human"
26
+ ]
27
+ },
28
+ {
29
+ "id": "semantics.consequential-action",
30
+ "version": "1.0.0",
31
+ "title": "Consequential action",
32
+ "kind": "semantic",
33
+ "requirement": "Legal, financial, destructive, or data-submitting actions support review, confirmation, or reversal as required.",
34
+ "proof": [
35
+ "e2e",
36
+ "human"
37
+ ]
38
+ },
39
+ {
40
+ "id": "semantics.data-table",
41
+ "version": "1.0.0",
42
+ "title": "Data table",
43
+ "kind": "semantic",
44
+ "requirement": "Tabular relationships use table markup with associated headers; interactive grids implement their full keyboard model.",
45
+ "proof": [
46
+ "axe",
47
+ "e2e",
48
+ "human"
49
+ ]
50
+ },
51
+ {
52
+ "id": "semantics.expanded-state",
53
+ "version": "1.0.0",
54
+ "title": "Expanded state",
55
+ "kind": "semantic",
56
+ "requirement": "Expandable controls expose aria-expanded and identify the controlled region when needed.",
57
+ "proof": [
58
+ "unit",
59
+ "axe",
60
+ "e2e"
61
+ ]
62
+ },
63
+ {
64
+ "id": "semantics.focus.initial",
65
+ "version": "1.0.0",
66
+ "title": "Initial focus",
67
+ "kind": "semantic",
68
+ "requirement": "On activation, focus moves to the deterministic target appropriate to the pattern.",
69
+ "proof": [
70
+ "unit",
71
+ "e2e"
72
+ ]
73
+ },
74
+ {
75
+ "id": "semantics.focus.return",
76
+ "version": "1.0.0",
77
+ "title": "Focus return",
78
+ "kind": "semantic",
79
+ "requirement": "On dismissal, focus returns to the invoking control or a documented logical successor.",
80
+ "proof": [
81
+ "unit",
82
+ "e2e"
83
+ ]
84
+ },
85
+ {
86
+ "id": "semantics.focus.visible",
87
+ "version": "1.0.0",
88
+ "title": "Visible focus",
89
+ "kind": "semantic",
90
+ "requirement": "Keyboard focus is visible, sufficiently contrasted, and not fully obscured.",
91
+ "proof": [
92
+ "e2e",
93
+ "human"
94
+ ]
95
+ },
96
+ {
97
+ "id": "semantics.form-error",
98
+ "version": "1.0.0",
99
+ "title": "Form error",
100
+ "kind": "semantic",
101
+ "requirement": "Identify errors in text, associate them with fields, and provide correction guidance.",
102
+ "proof": [
103
+ "unit",
104
+ "axe",
105
+ "e2e",
106
+ "human"
107
+ ]
108
+ },
109
+ {
110
+ "id": "semantics.form-label",
111
+ "version": "1.0.0",
112
+ "title": "Form label",
113
+ "kind": "semantic",
114
+ "requirement": "Every form control has a persistent programmatically associated label.",
115
+ "proof": [
116
+ "unit",
117
+ "axe"
118
+ ]
119
+ },
120
+ {
121
+ "id": "semantics.form-required",
122
+ "version": "1.0.0",
123
+ "title": "Required field",
124
+ "kind": "semantic",
125
+ "requirement": "Requiredness is communicated visually and programmatically before submission.",
126
+ "proof": [
127
+ "unit",
128
+ "axe"
129
+ ]
130
+ },
131
+ {
132
+ "id": "semantics.headings",
133
+ "version": "1.0.0",
134
+ "title": "Heading structure",
135
+ "kind": "semantic",
136
+ "requirement": "Headings describe document structure without choosing levels for visual appearance.",
137
+ "proof": [
138
+ "axe",
139
+ "human"
140
+ ]
141
+ },
142
+ {
143
+ "id": "semantics.keyboard",
144
+ "version": "1.0.0",
145
+ "title": "Keyboard operation",
146
+ "kind": "semantic",
147
+ "requirement": "All functionality is operable with a keyboard without traps.",
148
+ "proof": [
149
+ "e2e",
150
+ "human"
151
+ ]
152
+ },
153
+ {
154
+ "id": "semantics.keyboard.escape",
155
+ "version": "1.0.0",
156
+ "title": "Escape dismissal",
157
+ "kind": "semantic",
158
+ "requirement": "Escape closes the topmost dismissible overlay without activating its trigger.",
159
+ "proof": [
160
+ "unit",
161
+ "e2e"
162
+ ]
163
+ },
164
+ {
165
+ "id": "semantics.landmarks",
166
+ "version": "1.0.0",
167
+ "title": "Landmarks",
168
+ "kind": "semantic",
169
+ "requirement": "Use native landmarks and name repeated landmarks only when a name is required to distinguish them.",
170
+ "proof": [
171
+ "axe",
172
+ "human"
173
+ ]
174
+ },
175
+ {
176
+ "id": "semantics.live-status",
177
+ "version": "1.0.0",
178
+ "title": "Status announcements",
179
+ "kind": "semantic",
180
+ "requirement": "Important asynchronous status updates are exposed through a correctly scoped, non-duplicative live region.",
181
+ "proof": [
182
+ "unit",
183
+ "e2e",
184
+ "human"
185
+ ]
186
+ },
187
+ {
188
+ "id": "semantics.media-alternatives",
189
+ "version": "1.0.0",
190
+ "title": "Media alternatives",
191
+ "kind": "semantic",
192
+ "requirement": "Prerecorded media provides applicable captions, transcripts, and audio description.",
193
+ "proof": [
194
+ "human"
195
+ ]
196
+ },
197
+ {
198
+ "id": "semantics.motion-control",
199
+ "version": "1.0.0",
200
+ "title": "Motion control",
201
+ "kind": "semantic",
202
+ "requirement": "Respect reduced-motion preferences and provide controls for moving or time-limited content where required.",
203
+ "proof": [
204
+ "e2e",
205
+ "human"
206
+ ]
207
+ },
208
+ {
209
+ "id": "semantics.name-role-value",
210
+ "version": "1.0.0",
211
+ "title": "Name role value",
212
+ "kind": "semantic",
213
+ "requirement": "Expose the correct accessible name, role, value, and state through the platform accessibility API.",
214
+ "proof": [
215
+ "unit",
216
+ "axe",
217
+ "human"
218
+ ]
219
+ },
220
+ {
221
+ "id": "semantics.native-dialog",
222
+ "version": "1.0.0",
223
+ "title": "Native dialog semantics",
224
+ "kind": "semantic",
225
+ "requirement": "Use dialog semantics with a programmatic name and modal state only when interaction is modal.",
226
+ "proof": [
227
+ "axe",
228
+ "e2e",
229
+ "human"
230
+ ]
231
+ },
232
+ {
233
+ "id": "semantics.native-elements",
234
+ "version": "1.0.0",
235
+ "title": "Native elements",
236
+ "kind": "semantic",
237
+ "requirement": "Use the native HTML element whose semantics and behavior match the control before adding ARIA.",
238
+ "proof": [
239
+ "axe",
240
+ "human"
241
+ ]
242
+ },
243
+ {
244
+ "id": "semantics.non-text-alternative",
245
+ "version": "1.0.0",
246
+ "title": "Non-text alternative",
247
+ "kind": "semantic",
248
+ "requirement": "Meaningful non-text content has an equivalent alternative and decorative content is ignored by assistive technology.",
249
+ "proof": [
250
+ "axe",
251
+ "human"
252
+ ]
253
+ },
254
+ {
255
+ "id": "semantics.roles-states-properties",
256
+ "version": "1.0.0",
257
+ "title": "Roles states and properties",
258
+ "kind": "semantic",
259
+ "requirement": "Apply only valid ARIA roles, states, and properties and keep exposed state synchronized with rendered behavior.",
260
+ "proof": [
261
+ "unit",
262
+ "axe",
263
+ "e2e"
264
+ ]
265
+ },
266
+ {
267
+ "id": "semantics.selected-state",
268
+ "version": "1.0.0",
269
+ "title": "Selected state",
270
+ "kind": "semantic",
271
+ "requirement": "Selection widgets expose current selection with the state required by their role.",
272
+ "proof": [
273
+ "unit",
274
+ "e2e"
275
+ ]
276
+ },
277
+ {
278
+ "id": "semantics.target-size",
279
+ "version": "1.0.0",
280
+ "title": "Target size",
281
+ "kind": "semantic",
282
+ "requirement": "Pointer targets meet 24 by 24 CSS pixels or a WCAG 2.5.8 exception; 44 by 44 is an enhanced recommendation.",
283
+ "proof": [
284
+ "e2e",
285
+ "human"
286
+ ]
287
+ }
288
+ ]
289
+ }
@@ -0,0 +1,138 @@
1
+ <!-- GENERATED by @verndale/accessibility-standards; DO NOT EDIT -->
2
+ # Accessibility testing contract
3
+
4
+ ## axe
5
+
6
+ - pattern.accordion
7
+ - pattern.carousel
8
+ - pattern.combobox
9
+ - pattern.dialog
10
+ - pattern.disclosure
11
+ - pattern.field
12
+ - pattern.image
13
+ - pattern.listbox
14
+ - pattern.media-player
15
+ - pattern.pagination
16
+ - pattern.progress
17
+ - pattern.tabs
18
+ - pattern.validation
19
+ - semantics.accessible-name
20
+ - semantics.data-table
21
+ - semantics.expanded-state
22
+ - semantics.form-error
23
+ - semantics.form-label
24
+ - semantics.form-required
25
+ - semantics.headings
26
+ - semantics.landmarks
27
+ - semantics.name-role-value
28
+ - semantics.native-dialog
29
+ - semantics.native-elements
30
+ - semantics.non-text-alternative
31
+ - semantics.roles-states-properties
32
+
33
+ ## e2e
34
+
35
+ - pattern.accordion
36
+ - pattern.carousel
37
+ - pattern.combobox
38
+ - pattern.consequential-submission
39
+ - pattern.dialog
40
+ - pattern.disclosure
41
+ - pattern.dynamic-status
42
+ - pattern.field
43
+ - pattern.listbox
44
+ - pattern.media-player
45
+ - pattern.menu-button
46
+ - pattern.popover
47
+ - pattern.tabs
48
+ - pattern.tooltip
49
+ - pattern.validation
50
+ - semantics.consequential-action
51
+ - semantics.data-table
52
+ - semantics.expanded-state
53
+ - semantics.focus.initial
54
+ - semantics.focus.return
55
+ - semantics.focus.visible
56
+ - semantics.form-error
57
+ - semantics.form-label
58
+ - semantics.keyboard
59
+ - semantics.keyboard.escape
60
+ - semantics.live-status
61
+ - semantics.motion-control
62
+ - semantics.native-dialog
63
+ - semantics.roles-states-properties
64
+ - semantics.selected-state
65
+ - semantics.target-size
66
+
67
+ ## human
68
+
69
+ - pattern.accordion
70
+ - pattern.alert
71
+ - pattern.carousel
72
+ - pattern.combobox
73
+ - pattern.consequential-submission
74
+ - pattern.dialog
75
+ - pattern.dynamic-status
76
+ - pattern.field
77
+ - pattern.image
78
+ - pattern.listbox
79
+ - pattern.media-player
80
+ - pattern.menu-button
81
+ - pattern.pagination
82
+ - pattern.popover
83
+ - pattern.progress
84
+ - pattern.tabs
85
+ - pattern.tooltip
86
+ - pattern.validation
87
+ - semantics.accessible-name
88
+ - semantics.alert
89
+ - semantics.consequential-action
90
+ - semantics.data-table
91
+ - semantics.focus.visible
92
+ - semantics.form-error
93
+ - semantics.form-label
94
+ - semantics.headings
95
+ - semantics.keyboard
96
+ - semantics.landmarks
97
+ - semantics.live-status
98
+ - semantics.media-alternatives
99
+ - semantics.motion-control
100
+ - semantics.name-role-value
101
+ - semantics.native-dialog
102
+ - semantics.native-elements
103
+ - semantics.non-text-alternative
104
+ - semantics.target-size
105
+
106
+ ## unit
107
+
108
+ - pattern.accordion
109
+ - pattern.alert
110
+ - pattern.carousel
111
+ - pattern.combobox
112
+ - pattern.dialog
113
+ - pattern.disclosure
114
+ - pattern.dynamic-status
115
+ - pattern.field
116
+ - pattern.listbox
117
+ - pattern.menu-button
118
+ - pattern.pagination
119
+ - pattern.popover
120
+ - pattern.progress
121
+ - pattern.tabs
122
+ - pattern.tooltip
123
+ - pattern.validation
124
+ - semantics.accessible-name
125
+ - semantics.alert
126
+ - semantics.expanded-state
127
+ - semantics.focus.initial
128
+ - semantics.focus.return
129
+ - semantics.form-error
130
+ - semantics.form-label
131
+ - semantics.form-required
132
+ - semantics.keyboard
133
+ - semantics.keyboard.escape
134
+ - semantics.live-status
135
+ - semantics.name-role-value
136
+ - semantics.native-elements
137
+ - semantics.roles-states-properties
138
+ - semantics.selected-state
@@ -0,0 +1,152 @@
1
+ <!-- GENERATED by @verndale/accessibility-standards; DO NOT EDIT -->
2
+ # Accessibility semantics
3
+
4
+ ## semantics.accessible-name
5
+
6
+ Every interactive or meaning-bearing control has a concise programmatic name derived from visible text when available.
7
+
8
+ Proof: unit, axe, human.
9
+
10
+ ## semantics.alert
11
+
12
+ Use alert semantics only for urgent, time-sensitive messages that require immediate announcement.
13
+
14
+ Proof: unit, human.
15
+
16
+ ## semantics.consequential-action
17
+
18
+ Legal, financial, destructive, or data-submitting actions support review, confirmation, or reversal as required.
19
+
20
+ Proof: e2e, human.
21
+
22
+ ## semantics.data-table
23
+
24
+ Tabular relationships use table markup with associated headers; interactive grids implement their full keyboard model.
25
+
26
+ Proof: axe, e2e, human.
27
+
28
+ ## semantics.expanded-state
29
+
30
+ Expandable controls expose aria-expanded and identify the controlled region when needed.
31
+
32
+ Proof: unit, axe, e2e.
33
+
34
+ ## semantics.focus.initial
35
+
36
+ On activation, focus moves to the deterministic target appropriate to the pattern.
37
+
38
+ Proof: unit, e2e.
39
+
40
+ ## semantics.focus.return
41
+
42
+ On dismissal, focus returns to the invoking control or a documented logical successor.
43
+
44
+ Proof: unit, e2e.
45
+
46
+ ## semantics.focus.visible
47
+
48
+ Keyboard focus is visible, sufficiently contrasted, and not fully obscured.
49
+
50
+ Proof: e2e, human.
51
+
52
+ ## semantics.form-error
53
+
54
+ Identify errors in text, associate them with fields, and provide correction guidance.
55
+
56
+ Proof: unit, axe, e2e, human.
57
+
58
+ ## semantics.form-label
59
+
60
+ Every form control has a persistent programmatically associated label.
61
+
62
+ Proof: unit, axe.
63
+
64
+ ## semantics.form-required
65
+
66
+ Requiredness is communicated visually and programmatically before submission.
67
+
68
+ Proof: unit, axe.
69
+
70
+ ## semantics.headings
71
+
72
+ Headings describe document structure without choosing levels for visual appearance.
73
+
74
+ Proof: axe, human.
75
+
76
+ ## semantics.keyboard
77
+
78
+ All functionality is operable with a keyboard without traps.
79
+
80
+ Proof: e2e, human.
81
+
82
+ ## semantics.keyboard.escape
83
+
84
+ Escape closes the topmost dismissible overlay without activating its trigger.
85
+
86
+ Proof: unit, e2e.
87
+
88
+ ## semantics.landmarks
89
+
90
+ Use native landmarks and name repeated landmarks only when a name is required to distinguish them.
91
+
92
+ Proof: axe, human.
93
+
94
+ ## semantics.live-status
95
+
96
+ Important asynchronous status updates are exposed through a correctly scoped, non-duplicative live region.
97
+
98
+ Proof: unit, e2e, human.
99
+
100
+ ## semantics.media-alternatives
101
+
102
+ Prerecorded media provides applicable captions, transcripts, and audio description.
103
+
104
+ Proof: human.
105
+
106
+ ## semantics.motion-control
107
+
108
+ Respect reduced-motion preferences and provide controls for moving or time-limited content where required.
109
+
110
+ Proof: e2e, human.
111
+
112
+ ## semantics.name-role-value
113
+
114
+ Expose the correct accessible name, role, value, and state through the platform accessibility API.
115
+
116
+ Proof: unit, axe, human.
117
+
118
+ ## semantics.native-dialog
119
+
120
+ Use dialog semantics with a programmatic name and modal state only when interaction is modal.
121
+
122
+ Proof: axe, e2e, human.
123
+
124
+ ## semantics.native-elements
125
+
126
+ Use the native HTML element whose semantics and behavior match the control before adding ARIA.
127
+
128
+ Proof: axe, human.
129
+
130
+ ## semantics.non-text-alternative
131
+
132
+ Meaningful non-text content has an equivalent alternative and decorative content is ignored by assistive technology.
133
+
134
+ Proof: axe, human.
135
+
136
+ ## semantics.roles-states-properties
137
+
138
+ Apply only valid ARIA roles, states, and properties and keep exposed state synchronized with rendered behavior.
139
+
140
+ Proof: unit, axe, e2e.
141
+
142
+ ## semantics.selected-state
143
+
144
+ Selection widgets expose current selection with the state required by their role.
145
+
146
+ Proof: unit, e2e.
147
+
148
+ ## semantics.target-size
149
+
150
+ Pointer targets meet 24 by 24 CSS pixels or a WCAG 2.5.8 exception; 44 by 44 is an enhanced recommendation.
151
+
152
+ Proof: e2e, human.