@surea11y/core 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.
- package/CHANGELOG.md +49 -0
- package/LICENSE +21 -0
- package/README.md +145 -0
- package/bin/core.js +244 -0
- package/docs/BINDING_AUTHORS_GUIDE.md +41 -0
- package/docs/CLI.md +49 -0
- package/docs/ENGINE_OPTIONS.md +155 -0
- package/docs/I18N.md +47 -0
- package/docs/INTEGRATION.md +156 -0
- package/docs/LIMITATIONS.md +31 -0
- package/docs/OUTPUT_SCHEMA.md +237 -0
- package/docs/POLICY.md +71 -0
- package/docs/RULE_AUTHORING.md +375 -0
- package/docs/RULE_CATALOG.md +180 -0
- package/docs/RULE_TAXONOMY.md +145 -0
- package/docs/TROUBLESHOOTING.md +48 -0
- package/docs/WCAG_CONFORMANCE.md +49 -0
- package/package.json +60 -0
- package/src/catalogs/composites.wcag.js +490 -0
- package/src/checks/automatic/area-alt-present.js +225 -0
- package/src/checks/automatic/aria-allowed-attr.js +206 -0
- package/src/checks/automatic/aria-allowed-role.js +102 -0
- package/src/checks/automatic/aria-braille-equivalent.js +139 -0
- package/src/checks/automatic/aria-conditional-attr.js +110 -0
- package/src/checks/automatic/aria-deprecated-role.js +106 -0
- package/src/checks/automatic/aria-hidden-body.js +87 -0
- package/src/checks/automatic/aria-hidden-focus.js +480 -0
- package/src/checks/automatic/aria-prohibited-attr.js +156 -0
- package/src/checks/automatic/aria-prohibited-children.js +265 -0
- package/src/checks/automatic/aria-required-attr.js +154 -0
- package/src/checks/automatic/aria-required-children.js +274 -0
- package/src/checks/automatic/aria-required-parent.js +222 -0
- package/src/checks/automatic/aria-role-name-present.js +201 -0
- package/src/checks/automatic/aria-roles-valid.js +110 -0
- package/src/checks/automatic/aria-valid-attr-value.js +123 -0
- package/src/checks/automatic/aria-valid-attr.js +109 -0
- package/src/checks/automatic/autocomplete-valid.js +134 -0
- package/src/checks/automatic/avoid-inline-spacing.js +107 -0
- package/src/checks/automatic/binary-control-name-present.js +294 -0
- package/src/checks/automatic/button-name-present.js +146 -0
- package/src/checks/automatic/bypass-blocks-present.js +162 -0
- package/src/checks/automatic/canvas-text-alternative-present.js +140 -0
- package/src/checks/automatic/combobox-name-present.js +267 -0
- package/src/checks/automatic/contrast-computable.js +378 -0
- package/src/checks/automatic/contrast-enhanced.js +517 -0
- package/src/checks/automatic/contrast-minimum.js +512 -0
- package/src/checks/automatic/css-orientation-lock.js +206 -0
- package/src/checks/automatic/definition-list-children-valid.js +148 -0
- package/src/checks/automatic/deprecated-elements-not-used.js +91 -0
- package/src/checks/automatic/dialog-name-present.js +209 -0
- package/src/checks/automatic/dlitem-parent-valid.js +100 -0
- package/src/checks/automatic/duplicate-id-aria.js +126 -0
- package/src/checks/automatic/embed-text-alternative-present.js +190 -0
- package/src/checks/automatic/form-control-programmatic-label-present.js +409 -0
- package/src/checks/automatic/form-control-single-label.js +117 -0
- package/src/checks/automatic/html-xml-lang-mismatch.js +91 -0
- package/src/checks/automatic/iframe-focusable-content.js +141 -0
- package/src/checks/automatic/iframe-name-present.js +102 -0
- package/src/checks/automatic/iframe-title-unique.js +107 -0
- package/src/checks/automatic/img-alt-present.js +223 -0
- package/src/checks/automatic/input-image-alt-present.js +155 -0
- package/src/checks/automatic/label-in-name.js +326 -0
- package/src/checks/automatic/language-page-present.js +159 -0
- package/src/checks/automatic/link-in-text-block.js +218 -0
- package/src/checks/automatic/link-name-present.js +114 -0
- package/src/checks/automatic/list-children-valid.js +152 -0
- package/src/checks/automatic/listbox-name-present.js +236 -0
- package/src/checks/automatic/listitem-parent-valid.js +118 -0
- package/src/checks/automatic/menuitem-name-present.js +201 -0
- package/src/checks/automatic/meta-refresh-no-exceptions.js +105 -0
- package/src/checks/automatic/meta-refresh-timing-absent.js +107 -0
- package/src/checks/automatic/meta-viewport-zoom-enabled.js +118 -0
- package/src/checks/automatic/meter-name-present.js +160 -0
- package/src/checks/automatic/nested-interactive-controls-absent.js +135 -0
- package/src/checks/automatic/object-text-alternative-present.js +193 -0
- package/src/checks/automatic/option-name-present.js +157 -0
- package/src/checks/automatic/page-title-present.js +86 -0
- package/src/checks/automatic/progressbar-name-present.js +165 -0
- package/src/checks/automatic/role-img-alt-present.js +206 -0
- package/src/checks/automatic/searchbox-name-present.js +236 -0
- package/src/checks/automatic/server-side-image-map-absent.js +88 -0
- package/src/checks/automatic/slider-name-present.js +276 -0
- package/src/checks/automatic/spinbutton-name-present.js +236 -0
- package/src/checks/automatic/summary-name-present.js +153 -0
- package/src/checks/automatic/svg-image-text-alternative-present.js +220 -0
- package/src/checks/automatic/svg-text-alternative-present.js +298 -0
- package/src/checks/automatic/tab-name-present.js +200 -0
- package/src/checks/automatic/table-headers-attr-valid.js +122 -0
- package/src/checks/automatic/table-th-has-data-cells.js +117 -0
- package/src/checks/automatic/target-size-minimum.js +605 -0
- package/src/checks/automatic/td-has-header.js +151 -0
- package/src/checks/automatic/textbox-name-present.js +236 -0
- package/src/checks/automatic/tooltip-name-present.js +158 -0
- package/src/checks/automatic/treeitem-name-present.js +157 -0
- package/src/checks/automatic/valid-lang.js +100 -0
- package/src/checks/automatic/video-poster-text-alternative-present.js +193 -0
- package/src/checks/manual/accesskeys-manual.js +93 -0
- package/src/checks/manual/area-alt-decorative-manual.js +247 -0
- package/src/checks/manual/area-alt-quality-manual.js +204 -0
- package/src/checks/manual/aria-checked-state-mismatch-manual.js +141 -0
- package/src/checks/manual/aria-text-manual.js +109 -0
- package/src/checks/manual/canvas-text-alternative-quality-manual.js +170 -0
- package/src/checks/manual/css-hidden-focus.js +259 -0
- package/src/checks/manual/embed-text-alternative-quality-manual.js +204 -0
- package/src/checks/manual/empty-heading-manual.js +182 -0
- package/src/checks/manual/empty-table-header-manual.js +163 -0
- package/src/checks/manual/focus-order-semantics-manual.js +117 -0
- package/src/checks/manual/form-control-programmatic-label-quality-manual.js +291 -0
- package/src/checks/manual/heading-order-manual.js +130 -0
- package/src/checks/manual/identical-links-same-purpose-manual.js +142 -0
- package/src/checks/manual/image-redundant-alt-manual.js +118 -0
- package/src/checks/manual/img-alt-decorative-manual.js +148 -0
- package/src/checks/manual/img-alt-quality-manual.js +182 -0
- package/src/checks/manual/input-image-alt-decorative-manual.js +144 -0
- package/src/checks/manual/input-image-alt-quality-manual.js +144 -0
- package/src/checks/manual/label-title-only-manual.js +115 -0
- package/src/checks/manual/landmark-banner-is-top-level-manual.js +180 -0
- package/src/checks/manual/landmark-contentinfo-is-top-level-manual.js +169 -0
- package/src/checks/manual/landmark-main-is-top-level-manual.js +167 -0
- package/src/checks/manual/landmark-no-duplicate-banner-manual.js +177 -0
- package/src/checks/manual/landmark-no-duplicate-contentinfo-manual.js +169 -0
- package/src/checks/manual/landmark-no-duplicate-main-manual.js +132 -0
- package/src/checks/manual/landmark-one-main-manual.js +151 -0
- package/src/checks/manual/landmark-unique-manual.js +252 -0
- package/src/checks/manual/link-name-quality-manual.js +143 -0
- package/src/checks/manual/media-transcript-present-manual.js +373 -0
- package/src/checks/manual/meta-viewport-large-manual.js +119 -0
- package/src/checks/manual/mouse-only-event-handlers-manual.js +134 -0
- package/src/checks/manual/no-autoplay-audio-manual.js +116 -0
- package/src/checks/manual/object-text-alternative-quality-manual.js +194 -0
- package/src/checks/manual/p-as-heading-manual.js +163 -0
- package/src/checks/manual/page-has-heading-one-manual.js +110 -0
- package/src/checks/manual/page-title-patterns-manual.js +262 -0
- package/src/checks/manual/presentation-role-conflict-manual.js +159 -0
- package/src/checks/manual/region-manual.js +183 -0
- package/src/checks/manual/scope-attr-valid-manual.js +93 -0
- package/src/checks/manual/scrollable-region-focusable-manual.js +168 -0
- package/src/checks/manual/skip-link-manual.js +150 -0
- package/src/checks/manual/svg-text-alternative-quality-manual.js +209 -0
- package/src/checks/manual/tabindex-manual.js +94 -0
- package/src/checks/manual/table-duplicate-name-manual.js +99 -0
- package/src/checks/manual/table-fake-caption-manual.js +122 -0
- package/src/checks/manual/video-caption-manual.js +118 -0
- package/src/checks/manual-review.js +95 -0
- package/src/checks/rules-and-tags.full.csv +19 -0
- package/src/checks/rules-and-tags.full.json +259 -0
- package/src/core/aria-helpers.js +906 -0
- package/src/core/contrast-helpers.js +1147 -0
- package/src/core/dom-helpers.js +4085 -0
- package/src/core/dom-runner.js +627 -0
- package/src/core/frame-messaging.js +210 -0
- package/src/core/frame-scan.js +178 -0
- package/src/core/rollup-composites.js +135 -0
- package/src/core/rule-meta.js +140 -0
- package/src/core.js +79055 -0
- package/src/coverage/wcag-facets.js +1079 -0
- package/src/coverage/wcag-version-map.js +84 -0
- package/src/i18n/en.js +919 -0
- package/src/i18n/fr.js +527 -0
- package/src/index.js +4 -0
- package/src/policy/contracts.js +18 -0
- package/src/policy/resolvePolicy.js +55 -0
- package/src/policy/schemas/engine-options.schema.json +103 -0
- package/src/policy/schemas/policy-contract.schema.json +40 -0
|
@@ -0,0 +1,1079 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* WCAG coverage facets (NON-NORMATIVE)
|
|
5
|
+
*
|
|
6
|
+
* PURPOSE
|
|
7
|
+
* -------
|
|
8
|
+
* Facets represent common test objectives derived from WCAG
|
|
9
|
+
* Understanding documents and Techniques.
|
|
10
|
+
*
|
|
11
|
+
* Facets:
|
|
12
|
+
* • are NOT requirements
|
|
13
|
+
* • are NOT enforced
|
|
14
|
+
* • MUST NOT affect rule outcomes or policy
|
|
15
|
+
*
|
|
16
|
+
* ALIGNMENT WITH surea11y
|
|
17
|
+
* -----------------------
|
|
18
|
+
* • Referenced from rule meta via meta.coverage.facetsBySc
|
|
19
|
+
* • Stable identifiers once published
|
|
20
|
+
* • Automation levels correspond to expected rule types:
|
|
21
|
+
* full → automatic
|
|
22
|
+
* partial → automatic or manual
|
|
23
|
+
* manual → manual-only
|
|
24
|
+
*
|
|
25
|
+
* NOTE
|
|
26
|
+
* ----
|
|
27
|
+
* Facets can be broader than a single atomic rule. Multiple atomic checks may map
|
|
28
|
+
* to the same facet, and a single SC often has multiple facets.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* MACRO FACETS POLICY (IMPORTANT)
|
|
33
|
+
* -------------------------------
|
|
34
|
+
* This registry includes two kinds of facets:
|
|
35
|
+
*
|
|
36
|
+
* 1) Technology facets (preferred for rule meta)
|
|
37
|
+
* - Example: "img-alt-attr-present"
|
|
38
|
+
* - These represent a specific, testable objective for a specific technology/family.
|
|
39
|
+
* - RULES SHOULD reference these facets in meta.coverage.facetsBySc.
|
|
40
|
+
*
|
|
41
|
+
* 2) Macro facets (coverage-level only; NOT for rule meta by default)
|
|
42
|
+
* - Examples: "text-alternative-mechanism", "functional-nontext-name"
|
|
43
|
+
* - These are intentionally broader than any single atomic rule.
|
|
44
|
+
* - They are used for reporting/coverage aggregation and planning.
|
|
45
|
+
*
|
|
46
|
+
* RULE AUTHORING REQUIREMENT
|
|
47
|
+
* --------------------------
|
|
48
|
+
* Rules MUST NOT claim macro facets unless the rule explicitly implements the full
|
|
49
|
+
* macro objective (i.e., a single atomic rule whose normative expectation matches
|
|
50
|
+
* the macro facet definition without relying on other checks).
|
|
51
|
+
*
|
|
52
|
+
* Why:
|
|
53
|
+
* - Prevents overstating coverage when only one mechanism is checked (e.g., alt only).
|
|
54
|
+
* - Avoids ambiguity as new mechanisms/checks are added later.
|
|
55
|
+
* - Keeps coverage accounting deterministic and traceable.
|
|
56
|
+
*
|
|
57
|
+
* Practical guidance:
|
|
58
|
+
* - If your rule checks one mechanism (e.g., "alt attribute present"), claim only the
|
|
59
|
+
* corresponding technology facet (e.g., "img-alt-attr-present").
|
|
60
|
+
* - If you need a macro facet to be "satisfied", implement a dedicated rule that
|
|
61
|
+
* checks that macro condition directly OR compute macro satisfaction outside the
|
|
62
|
+
* rule layer (e.g., via reporting logic that aggregates multiple technology facets).
|
|
63
|
+
*/
|
|
64
|
+
|
|
65
|
+
const FACETS = {
|
|
66
|
+
"1.1.1": {
|
|
67
|
+
"title": "Non-text Content",
|
|
68
|
+
"level": "A",
|
|
69
|
+
"facets": [
|
|
70
|
+
{
|
|
71
|
+
"id": "text-alternative-mechanism",
|
|
72
|
+
"label": "Text alternative mechanism present",
|
|
73
|
+
"automation": "partial",
|
|
74
|
+
"macro": true
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": "functional-nontext-name",
|
|
78
|
+
"label": "Functional non-text has accessible name",
|
|
79
|
+
"automation": "partial",
|
|
80
|
+
"macro": true
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"id": "decorative-null",
|
|
84
|
+
"label": "Decorative content correctly null",
|
|
85
|
+
"automation": "manual",
|
|
86
|
+
"macro": true
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"id": "text-alt-quality-review",
|
|
90
|
+
"label": "Text alternative is appropriate and equivalent",
|
|
91
|
+
"automation": "manual",
|
|
92
|
+
"macro": true
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"id": "text-alternative-quality",
|
|
96
|
+
"label": "Text alternatives are appropriate and equivalent",
|
|
97
|
+
"automation": "partial",
|
|
98
|
+
"macro": true
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"id": "img-alt-attr-present",
|
|
102
|
+
"label": "<img> has alt attribute",
|
|
103
|
+
"automation": "full"
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"id": "role-img-text-alternative-present",
|
|
107
|
+
"label": "role=\"img\" has text alternative",
|
|
108
|
+
"automation": "full"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"id": "input-image-alt-attr-present",
|
|
112
|
+
"label": "<input type=\"image\"> has alt attribute",
|
|
113
|
+
"automation": "full"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"id": "area-alt-attr-present",
|
|
117
|
+
"label": "<area> has alt attribute",
|
|
118
|
+
"automation": "full"
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"id": "canvas-text-alternative-present",
|
|
122
|
+
"label": "<canvas> has fallback text or accessible name",
|
|
123
|
+
"automation": "partial"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"id": "embed-text-alternative-present",
|
|
127
|
+
"label": "<embed> has fallback text or accessible name",
|
|
128
|
+
"automation": "partial"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"id": "svg-text-alt-present",
|
|
132
|
+
"label": "<svg> has a text alternative mechanism when exposed",
|
|
133
|
+
"automation": "partial"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"id": "svg-text-alternative-present",
|
|
137
|
+
"label": "SVG <image> has a text alternative mechanism",
|
|
138
|
+
"automation": "partial"
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"id": "svg-image-text-alt-present",
|
|
142
|
+
"label": "SVG <image> has a text alternative mechanism",
|
|
143
|
+
"automation": "partial"
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"id": "object-text-alternative-present",
|
|
147
|
+
"label": "<object> has fallback text or accessible name",
|
|
148
|
+
"automation": "partial"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"id": "embed-name-present",
|
|
152
|
+
"label": "<embed> has accessible name",
|
|
153
|
+
"automation": "partial"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"id": "video-poster-text-alt-present",
|
|
157
|
+
"label": "<video poster> has a text alternative mechanism",
|
|
158
|
+
"automation": "partial"
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"id": "alt-suspicious-patterns",
|
|
162
|
+
"label": "Alt text suspicious patterns (e.g., filename/placeholder)",
|
|
163
|
+
"automation": "partial"
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"id": "acc-eligibility-filtering",
|
|
167
|
+
"label": "Excluded due to accessibility-tree eligibility",
|
|
168
|
+
"automation": "partial",
|
|
169
|
+
"macro": true
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"id": "meter-name-present",
|
|
173
|
+
"label": "role=\"meter\" elements expose an accessible name",
|
|
174
|
+
"automation": "full"
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"id": "progressbar-name-present",
|
|
178
|
+
"label": "role=\"progressbar\" elements expose an accessible name",
|
|
179
|
+
"automation": "full"
|
|
180
|
+
}
|
|
181
|
+
]
|
|
182
|
+
},
|
|
183
|
+
"1.2.1": {
|
|
184
|
+
"title": "Audio-only and Video-only (Prerecorded)",
|
|
185
|
+
"level": "A",
|
|
186
|
+
"facets": [
|
|
187
|
+
{
|
|
188
|
+
"id": "transcript-evidence",
|
|
189
|
+
"label": "Transcript / text alternative evidence for prerecorded audio-only or video-only media (in-page association or verified on-page target)",
|
|
190
|
+
"automation": "partial"
|
|
191
|
+
}
|
|
192
|
+
]
|
|
193
|
+
},
|
|
194
|
+
"1.2.2": {
|
|
195
|
+
"title": "Captions (Prerecorded)",
|
|
196
|
+
"level": "A",
|
|
197
|
+
"facets": [
|
|
198
|
+
{
|
|
199
|
+
"id": "video-captions-track-evidence",
|
|
200
|
+
"label": "<video> declares a captions/subtitles <track> (evidence only — cannot verify audio content)",
|
|
201
|
+
"automation": "manual"
|
|
202
|
+
}
|
|
203
|
+
]
|
|
204
|
+
},
|
|
205
|
+
"1.2.3": {
|
|
206
|
+
"title": "Audio Description or Media Alternative (Prerecorded)",
|
|
207
|
+
"level": "A",
|
|
208
|
+
"facets": []
|
|
209
|
+
},
|
|
210
|
+
"1.2.4": {
|
|
211
|
+
"title": "Captions (Live)",
|
|
212
|
+
"level": "AA",
|
|
213
|
+
"facets": []
|
|
214
|
+
},
|
|
215
|
+
"1.2.5": {
|
|
216
|
+
"title": "Audio Description (Prerecorded)",
|
|
217
|
+
"level": "AA",
|
|
218
|
+
"facets": []
|
|
219
|
+
},
|
|
220
|
+
"1.2.6": {
|
|
221
|
+
"title": "Sign Language (Prerecorded)",
|
|
222
|
+
"level": "AAA",
|
|
223
|
+
"facets": []
|
|
224
|
+
},
|
|
225
|
+
"1.2.7": {
|
|
226
|
+
"title": "Extended Audio Description (Prerecorded)",
|
|
227
|
+
"level": "AAA",
|
|
228
|
+
"facets": []
|
|
229
|
+
},
|
|
230
|
+
"1.2.8": {
|
|
231
|
+
"title": "Media Alternative (Prerecorded)",
|
|
232
|
+
"level": "AAA",
|
|
233
|
+
"facets": []
|
|
234
|
+
},
|
|
235
|
+
"1.2.9": {
|
|
236
|
+
"title": "Audio-only (Live)",
|
|
237
|
+
"level": "AAA",
|
|
238
|
+
"facets": []
|
|
239
|
+
},
|
|
240
|
+
"1.3.1": {
|
|
241
|
+
"title": "Info and Relationships",
|
|
242
|
+
"level": "A",
|
|
243
|
+
"facets": [
|
|
244
|
+
{
|
|
245
|
+
"id": "form-control-programmatic-label-present",
|
|
246
|
+
"label": "Form controls have a programmatic label (label/aria-label/aria-labelledby/title/placeholder)",
|
|
247
|
+
"automation": "full"
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"id": "form-control-label-quality-review",
|
|
251
|
+
"label": "Form control labels are appropriate",
|
|
252
|
+
"automation": "manual",
|
|
253
|
+
"macro": true
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"id": "table-headers-attr-valid",
|
|
257
|
+
"label": "Table cell headers attribute references valid <th> cells within the same table",
|
|
258
|
+
"automation": "full"
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
"id": "table-th-has-data-cells",
|
|
262
|
+
"label": "Tables with <th> cells also have data cells for them to describe",
|
|
263
|
+
"automation": "partial"
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
"id": "aria-hidden-body-absent",
|
|
267
|
+
"label": "The document <body> does not have aria-hidden=\"true\"",
|
|
268
|
+
"automation": "full"
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
"id": "list-children-valid",
|
|
272
|
+
"label": "<ul>/<ol> only directly contain <li> (or <script>/<template>)",
|
|
273
|
+
"automation": "full"
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
"id": "listitem-parent-valid",
|
|
277
|
+
"label": "<li> elements are contained by a list container (<ul>/<ol>/role=\"list\")",
|
|
278
|
+
"automation": "full"
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
"id": "definition-list-children-valid",
|
|
282
|
+
"label": "<dl> only directly contains <dt>/<dd> groups (optionally wrapped in one <div>), <script>, <template>, or <style>",
|
|
283
|
+
"automation": "full"
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
"id": "dlitem-parent-valid",
|
|
287
|
+
"label": "<dt>/<dd> elements are contained by a <dl>, directly or via one wrapping <div>",
|
|
288
|
+
"automation": "full"
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
"id": "p-as-heading-evidence",
|
|
292
|
+
"label": "Bold, heading-sized <p> text that may need a real heading element (evidence only)",
|
|
293
|
+
"automation": "manual"
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
"id": "table-fake-caption-evidence",
|
|
297
|
+
"label": "Table first-row cell that may be standing in for a real <caption> (evidence only)",
|
|
298
|
+
"automation": "manual"
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
"id": "td-has-header",
|
|
302
|
+
"label": "Data cells in large, simple tables have an associated header",
|
|
303
|
+
"automation": "full"
|
|
304
|
+
}
|
|
305
|
+
]
|
|
306
|
+
},
|
|
307
|
+
"1.3.2": {
|
|
308
|
+
"title": "Meaningful Sequence",
|
|
309
|
+
"level": "A",
|
|
310
|
+
"facets": []
|
|
311
|
+
},
|
|
312
|
+
"1.3.3": {
|
|
313
|
+
"title": "Sensory Characteristics",
|
|
314
|
+
"level": "A",
|
|
315
|
+
"facets": []
|
|
316
|
+
},
|
|
317
|
+
"1.3.4": {
|
|
318
|
+
"title": "Orientation",
|
|
319
|
+
"level": "AA",
|
|
320
|
+
"facets": [
|
|
321
|
+
{
|
|
322
|
+
"id": "css-orientation-lock",
|
|
323
|
+
"label": "No CSS orientation media query rotates the page to lock its display orientation",
|
|
324
|
+
"automation": "full"
|
|
325
|
+
}
|
|
326
|
+
]
|
|
327
|
+
},
|
|
328
|
+
"1.3.5": {
|
|
329
|
+
"title": "Identify Input Purpose",
|
|
330
|
+
"level": "AA",
|
|
331
|
+
"facets": [
|
|
332
|
+
{
|
|
333
|
+
"id": "autocomplete-valid",
|
|
334
|
+
"label": "A non-empty autocomplete attribute is a valid autofill value",
|
|
335
|
+
"automation": "full"
|
|
336
|
+
}
|
|
337
|
+
]
|
|
338
|
+
},
|
|
339
|
+
"1.3.6": {
|
|
340
|
+
"title": "Identify Purpose",
|
|
341
|
+
"level": "AAA",
|
|
342
|
+
"facets": []
|
|
343
|
+
},
|
|
344
|
+
"1.4.1": {
|
|
345
|
+
"title": "Use of Color",
|
|
346
|
+
"level": "A",
|
|
347
|
+
"facets": [
|
|
348
|
+
{
|
|
349
|
+
"id": "link-in-text-block",
|
|
350
|
+
"label": "Links inside blocks of text are distinguishable from surrounding text by non-color means (underline, weight/style difference, or >=3:1 contrast)",
|
|
351
|
+
"automation": "partial"
|
|
352
|
+
}
|
|
353
|
+
]
|
|
354
|
+
},
|
|
355
|
+
"1.4.2": {
|
|
356
|
+
"title": "Audio Control",
|
|
357
|
+
"level": "A",
|
|
358
|
+
"facets": [
|
|
359
|
+
{
|
|
360
|
+
"id": "no-autoplay-audio-evidence",
|
|
361
|
+
"label": "Autoplaying unmuted audio/video has a controls mechanism (evidence only — clip duration is not statically knowable)",
|
|
362
|
+
"automation": "manual"
|
|
363
|
+
}
|
|
364
|
+
]
|
|
365
|
+
},
|
|
366
|
+
"1.4.3": {
|
|
367
|
+
"title": "Contrast (Minimum)",
|
|
368
|
+
"level": "AA",
|
|
369
|
+
"facets": [
|
|
370
|
+
{
|
|
371
|
+
"id": "contrast-computability-143",
|
|
372
|
+
"label": "Text contrast is computable from CSS for 1.4.3 (no images/gradients/blending ambiguity)",
|
|
373
|
+
"automation": "partial"
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
"id": "contrast-minimum-text",
|
|
377
|
+
"label": "Visible text meets minimum contrast ratio (AA) when computable",
|
|
378
|
+
"automation": "partial"
|
|
379
|
+
}
|
|
380
|
+
]
|
|
381
|
+
},
|
|
382
|
+
"1.4.4": {
|
|
383
|
+
"title": "Resize Text",
|
|
384
|
+
"level": "AA",
|
|
385
|
+
"facets": [
|
|
386
|
+
{
|
|
387
|
+
"id": "meta-viewport-zoom-enabled",
|
|
388
|
+
"label": "<meta name=\"viewport\"> does not disable or cap pinch-zoom below 200%",
|
|
389
|
+
"automation": "full"
|
|
390
|
+
}
|
|
391
|
+
]
|
|
392
|
+
},
|
|
393
|
+
"1.4.5": {
|
|
394
|
+
"title": "Images of Text",
|
|
395
|
+
"level": "AA",
|
|
396
|
+
"facets": []
|
|
397
|
+
},
|
|
398
|
+
"1.4.6": {
|
|
399
|
+
"title": "Contrast (Enhanced)",
|
|
400
|
+
"level": "AAA",
|
|
401
|
+
"facets": [
|
|
402
|
+
{
|
|
403
|
+
"id": "contrast-computability-146",
|
|
404
|
+
"label": "Text contrast is computable from CSS for 1.4.6 (no images/gradients/blending ambiguity)",
|
|
405
|
+
"automation": "partial"
|
|
406
|
+
},
|
|
407
|
+
{
|
|
408
|
+
"id": "contrast-enhanced-text",
|
|
409
|
+
"label": "Visible text meets enhanced contrast ratio (AAA) when computable",
|
|
410
|
+
"automation": "partial"
|
|
411
|
+
}
|
|
412
|
+
]
|
|
413
|
+
},
|
|
414
|
+
"1.4.7": {
|
|
415
|
+
"title": "Low or No Background Audio",
|
|
416
|
+
"level": "AAA",
|
|
417
|
+
"facets": []
|
|
418
|
+
},
|
|
419
|
+
"1.4.8": {
|
|
420
|
+
"title": "Visual Presentation",
|
|
421
|
+
"level": "AAA",
|
|
422
|
+
"facets": []
|
|
423
|
+
},
|
|
424
|
+
"1.4.9": {
|
|
425
|
+
"title": "Images of Text (No Exception)",
|
|
426
|
+
"level": "AAA",
|
|
427
|
+
"facets": []
|
|
428
|
+
},
|
|
429
|
+
"1.4.10": {
|
|
430
|
+
"title": "Reflow",
|
|
431
|
+
"level": "AA",
|
|
432
|
+
"facets": []
|
|
433
|
+
},
|
|
434
|
+
"1.4.11": {
|
|
435
|
+
"title": "Non-text Contrast",
|
|
436
|
+
"level": "AA",
|
|
437
|
+
"facets": []
|
|
438
|
+
},
|
|
439
|
+
"1.4.12": {
|
|
440
|
+
"title": "Text Spacing",
|
|
441
|
+
"level": "AA",
|
|
442
|
+
"facets": [
|
|
443
|
+
{
|
|
444
|
+
"id": "avoid-inline-spacing",
|
|
445
|
+
"label": "Inline style does not force line-height/letter-spacing/word-spacing with !important",
|
|
446
|
+
"automation": "full"
|
|
447
|
+
}
|
|
448
|
+
]
|
|
449
|
+
},
|
|
450
|
+
"1.4.13": {
|
|
451
|
+
"title": "Content on Hover or Focus",
|
|
452
|
+
"level": "AA",
|
|
453
|
+
"facets": []
|
|
454
|
+
},
|
|
455
|
+
"2.1.1": {
|
|
456
|
+
"title": "Keyboard",
|
|
457
|
+
"level": "A",
|
|
458
|
+
"facets": [
|
|
459
|
+
{
|
|
460
|
+
"id": "iframe-tabindex-negative-content-not-focusable",
|
|
461
|
+
"label": "Same-origin frames with tabindex=\"-1\" contain no focusable content",
|
|
462
|
+
"automation": "partial"
|
|
463
|
+
},
|
|
464
|
+
{
|
|
465
|
+
"id": "server-side-image-map-absent",
|
|
466
|
+
"label": "<img> does not use a server-side image map (ismap)",
|
|
467
|
+
"automation": "full"
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
"id": "scrollable-region-focusable-evidence",
|
|
471
|
+
"label": "A CSS-scrollable region with no focusable descendant is itself keyboard-focusable (evidence only — actual overflow not statically knowable)",
|
|
472
|
+
"automation": "manual"
|
|
473
|
+
},
|
|
474
|
+
{
|
|
475
|
+
"id": "mouse-only-event-handlers-evidence",
|
|
476
|
+
"label": "Pointer-only inline event handlers have a keyboard-reachable equivalent (evidence only — JS-attached listeners are not statically visible)",
|
|
477
|
+
"automation": "manual"
|
|
478
|
+
}
|
|
479
|
+
]
|
|
480
|
+
},
|
|
481
|
+
"2.1.2": {
|
|
482
|
+
"title": "No Keyboard Trap",
|
|
483
|
+
"level": "A",
|
|
484
|
+
"facets": []
|
|
485
|
+
},
|
|
486
|
+
"2.1.3": {
|
|
487
|
+
"title": "Keyboard (No Exception)",
|
|
488
|
+
"level": "AAA",
|
|
489
|
+
"facets": [
|
|
490
|
+
{
|
|
491
|
+
"id": "scrollable-region-focusable-evidence",
|
|
492
|
+
"label": "A CSS-scrollable region with no focusable descendant is itself keyboard-focusable (evidence only — actual overflow not statically knowable)",
|
|
493
|
+
"automation": "manual"
|
|
494
|
+
}
|
|
495
|
+
]
|
|
496
|
+
},
|
|
497
|
+
"2.1.4": {
|
|
498
|
+
"title": "Character Key Shortcuts",
|
|
499
|
+
"level": "A",
|
|
500
|
+
"facets": []
|
|
501
|
+
},
|
|
502
|
+
"2.2.1": {
|
|
503
|
+
"title": "Timing Adjustable",
|
|
504
|
+
"level": "A",
|
|
505
|
+
"facets": [
|
|
506
|
+
{
|
|
507
|
+
"id": "meta-refresh-timing-absent",
|
|
508
|
+
"label": "<meta http-equiv=\"refresh\"> does not impose a delayed page refresh",
|
|
509
|
+
"automation": "full"
|
|
510
|
+
}
|
|
511
|
+
]
|
|
512
|
+
},
|
|
513
|
+
"2.2.2": {
|
|
514
|
+
"title": "Pause, Stop, Hide",
|
|
515
|
+
"level": "A",
|
|
516
|
+
"facets": [
|
|
517
|
+
{
|
|
518
|
+
"id": "deprecated-non-stoppable-elements-absent",
|
|
519
|
+
"label": "Obsolete non-stoppable elements (<blink>, <marquee>) are not present",
|
|
520
|
+
"automation": "full"
|
|
521
|
+
}
|
|
522
|
+
]
|
|
523
|
+
},
|
|
524
|
+
"2.2.3": {
|
|
525
|
+
"title": "No Timing",
|
|
526
|
+
"level": "AAA",
|
|
527
|
+
"facets": []
|
|
528
|
+
},
|
|
529
|
+
"2.2.4": {
|
|
530
|
+
"title": "Interruptions",
|
|
531
|
+
"level": "AAA",
|
|
532
|
+
"facets": [
|
|
533
|
+
{
|
|
534
|
+
"id": "meta-refresh-no-exceptions",
|
|
535
|
+
"label": "No meta refresh is used, regardless of delay (AAA)",
|
|
536
|
+
"automation": "full"
|
|
537
|
+
}
|
|
538
|
+
]
|
|
539
|
+
},
|
|
540
|
+
"2.2.5": {
|
|
541
|
+
"title": "Re-authenticating",
|
|
542
|
+
"level": "AAA",
|
|
543
|
+
"facets": []
|
|
544
|
+
},
|
|
545
|
+
"2.2.6": {
|
|
546
|
+
"title": "Timeouts",
|
|
547
|
+
"level": "AAA",
|
|
548
|
+
"facets": []
|
|
549
|
+
},
|
|
550
|
+
"2.3.1": {
|
|
551
|
+
"title": "Three Flashes or Below Threshold",
|
|
552
|
+
"level": "A",
|
|
553
|
+
"facets": []
|
|
554
|
+
},
|
|
555
|
+
"2.3.2": {
|
|
556
|
+
"title": "Three Flashes",
|
|
557
|
+
"level": "AAA",
|
|
558
|
+
"facets": []
|
|
559
|
+
},
|
|
560
|
+
"2.3.3": {
|
|
561
|
+
"title": "Animation from Interactions",
|
|
562
|
+
"level": "AAA",
|
|
563
|
+
"facets": []
|
|
564
|
+
},
|
|
565
|
+
"2.4.1": {
|
|
566
|
+
"title": "Bypass Blocks",
|
|
567
|
+
"level": "A",
|
|
568
|
+
"facets": [
|
|
569
|
+
{
|
|
570
|
+
"id": "bypass-blocks-present",
|
|
571
|
+
"label": "Page has a main landmark, working same-page anchor link, or heading (recognized bypass-blocks mechanism)",
|
|
572
|
+
"automation": "partial"
|
|
573
|
+
}
|
|
574
|
+
]
|
|
575
|
+
},
|
|
576
|
+
"2.4.2": {
|
|
577
|
+
"title": "Page Titled",
|
|
578
|
+
"level": "A",
|
|
579
|
+
"facets": [
|
|
580
|
+
{
|
|
581
|
+
"id": "page-title-present",
|
|
582
|
+
"label": "<title> element is present and non-empty",
|
|
583
|
+
"automation": "full"
|
|
584
|
+
},
|
|
585
|
+
{
|
|
586
|
+
"id": "page-title-patterns",
|
|
587
|
+
"label": "Page title patterns review (generic / duplicated / overly templated across pages)",
|
|
588
|
+
"automation": "partial"
|
|
589
|
+
}
|
|
590
|
+
]
|
|
591
|
+
},
|
|
592
|
+
"2.4.3": {
|
|
593
|
+
"title": "Focus Order",
|
|
594
|
+
"level": "A",
|
|
595
|
+
"facets": []
|
|
596
|
+
},
|
|
597
|
+
"2.4.4": {
|
|
598
|
+
"title": "Link Purpose (In Context)",
|
|
599
|
+
"level": "A",
|
|
600
|
+
"facets": [
|
|
601
|
+
{
|
|
602
|
+
"id": "link-text-descriptive-evidence",
|
|
603
|
+
"label": "Link text is not a known non-descriptive/generic phrase (evidence only — surrounding-context sufficiency not verified)",
|
|
604
|
+
"automation": "manual"
|
|
605
|
+
}
|
|
606
|
+
]
|
|
607
|
+
},
|
|
608
|
+
"2.4.5": {
|
|
609
|
+
"title": "Multiple Ways",
|
|
610
|
+
"level": "AA",
|
|
611
|
+
"facets": []
|
|
612
|
+
},
|
|
613
|
+
"2.4.6": {
|
|
614
|
+
"title": "Headings and Labels",
|
|
615
|
+
"level": "AA",
|
|
616
|
+
"facets": []
|
|
617
|
+
},
|
|
618
|
+
"2.4.7": {
|
|
619
|
+
"title": "Focus Visible",
|
|
620
|
+
"level": "AA",
|
|
621
|
+
"facets": [
|
|
622
|
+
{
|
|
623
|
+
"id": "css-hidden-focusable",
|
|
624
|
+
"label": "tabbable element is visually hidden by CSS",
|
|
625
|
+
"automation": "full"
|
|
626
|
+
}
|
|
627
|
+
]
|
|
628
|
+
},
|
|
629
|
+
"2.4.8": {
|
|
630
|
+
"title": "Location",
|
|
631
|
+
"level": "AAA",
|
|
632
|
+
"facets": []
|
|
633
|
+
},
|
|
634
|
+
"2.4.9": {
|
|
635
|
+
"title": "Link Purpose (Link Only)",
|
|
636
|
+
"level": "AAA",
|
|
637
|
+
"facets": [
|
|
638
|
+
{
|
|
639
|
+
"id": "identical-links-same-purpose-evidence",
|
|
640
|
+
"label": "Links sharing an accessible name resolve to a single shared destination",
|
|
641
|
+
"automation": "manual"
|
|
642
|
+
}
|
|
643
|
+
]
|
|
644
|
+
},
|
|
645
|
+
"2.4.10": {
|
|
646
|
+
"title": "Section Headings",
|
|
647
|
+
"level": "AAA",
|
|
648
|
+
"facets": []
|
|
649
|
+
},
|
|
650
|
+
"2.4.11": {
|
|
651
|
+
"title": "Focus Not Obscured (Minimum)",
|
|
652
|
+
"level": "AA",
|
|
653
|
+
"facets": []
|
|
654
|
+
},
|
|
655
|
+
"2.4.12": {
|
|
656
|
+
"title": "Focus Not Obscured (Enhanced)",
|
|
657
|
+
"level": "AAA",
|
|
658
|
+
"facets": []
|
|
659
|
+
},
|
|
660
|
+
"2.4.13": {
|
|
661
|
+
"title": "Focus Appearance",
|
|
662
|
+
"level": "AAA",
|
|
663
|
+
"facets": []
|
|
664
|
+
},
|
|
665
|
+
"2.5.1": {
|
|
666
|
+
"title": "Pointer Gestures",
|
|
667
|
+
"level": "A",
|
|
668
|
+
"facets": []
|
|
669
|
+
},
|
|
670
|
+
"2.5.2": {
|
|
671
|
+
"title": "Pointer Cancellation",
|
|
672
|
+
"level": "A",
|
|
673
|
+
"facets": []
|
|
674
|
+
},
|
|
675
|
+
"2.5.3": {
|
|
676
|
+
"title": "Label in Name",
|
|
677
|
+
"level": "A",
|
|
678
|
+
"facets": [
|
|
679
|
+
{
|
|
680
|
+
"id": "label-in-name",
|
|
681
|
+
"label": "Controls with aria-label/aria-labelledby: accessible name contains visible label text",
|
|
682
|
+
"automation": "partial"
|
|
683
|
+
}
|
|
684
|
+
]
|
|
685
|
+
},
|
|
686
|
+
"2.5.4": {
|
|
687
|
+
"title": "Motion Actuation",
|
|
688
|
+
"level": "A",
|
|
689
|
+
"facets": []
|
|
690
|
+
},
|
|
691
|
+
"2.5.5": {
|
|
692
|
+
"title": "Target Size (Enhanced)",
|
|
693
|
+
"level": "AAA",
|
|
694
|
+
"facets": []
|
|
695
|
+
},
|
|
696
|
+
"2.5.6": {
|
|
697
|
+
"title": "Concurrent Input Mechanisms",
|
|
698
|
+
"level": "AAA",
|
|
699
|
+
"facets": []
|
|
700
|
+
},
|
|
701
|
+
"2.5.7": {
|
|
702
|
+
"title": "Dragging Movements",
|
|
703
|
+
"level": "AA",
|
|
704
|
+
"facets": []
|
|
705
|
+
},
|
|
706
|
+
"2.5.8": {
|
|
707
|
+
"title": "Target Size (Minimum)",
|
|
708
|
+
"level": "AA",
|
|
709
|
+
"facets": [
|
|
710
|
+
{
|
|
711
|
+
"id": "target-size-minimum-pointer",
|
|
712
|
+
"label": "Pointer targets meet minimum size or spacing exception (24×24 CSS px) when measurable",
|
|
713
|
+
"automation": "partial"
|
|
714
|
+
}
|
|
715
|
+
]
|
|
716
|
+
},
|
|
717
|
+
"3.1.1": {
|
|
718
|
+
"title": "Language of Page",
|
|
719
|
+
"level": "A",
|
|
720
|
+
"facets": [
|
|
721
|
+
{
|
|
722
|
+
"id": "html-lang-attr-present",
|
|
723
|
+
"label": "<html> has a valid non-empty lang attribute",
|
|
724
|
+
"automation": "full"
|
|
725
|
+
},
|
|
726
|
+
{
|
|
727
|
+
"id": "html-xml-lang-mismatch",
|
|
728
|
+
"label": "lang and xml:lang on <html> declare the same primary language, when both are present",
|
|
729
|
+
"automation": "full"
|
|
730
|
+
}
|
|
731
|
+
]
|
|
732
|
+
},
|
|
733
|
+
"3.1.2": {
|
|
734
|
+
"title": "Language of Parts",
|
|
735
|
+
"level": "AA",
|
|
736
|
+
"facets": [
|
|
737
|
+
{
|
|
738
|
+
"id": "element-lang-valid",
|
|
739
|
+
"label": "Any element's lang attribute (when present) is a syntactically valid language tag",
|
|
740
|
+
"automation": "full"
|
|
741
|
+
}
|
|
742
|
+
]
|
|
743
|
+
},
|
|
744
|
+
"3.1.3": {
|
|
745
|
+
"title": "Unusual Words",
|
|
746
|
+
"level": "AAA",
|
|
747
|
+
"facets": []
|
|
748
|
+
},
|
|
749
|
+
"3.1.4": {
|
|
750
|
+
"title": "Abbreviations",
|
|
751
|
+
"level": "AAA",
|
|
752
|
+
"facets": []
|
|
753
|
+
},
|
|
754
|
+
"3.1.5": {
|
|
755
|
+
"title": "Reading Level",
|
|
756
|
+
"level": "AAA",
|
|
757
|
+
"facets": []
|
|
758
|
+
},
|
|
759
|
+
"3.1.6": {
|
|
760
|
+
"title": "Pronunciation",
|
|
761
|
+
"level": "AAA",
|
|
762
|
+
"facets": []
|
|
763
|
+
},
|
|
764
|
+
"3.2.1": {
|
|
765
|
+
"title": "On Focus",
|
|
766
|
+
"level": "A",
|
|
767
|
+
"facets": []
|
|
768
|
+
},
|
|
769
|
+
"3.2.2": {
|
|
770
|
+
"title": "On Input",
|
|
771
|
+
"level": "A",
|
|
772
|
+
"facets": []
|
|
773
|
+
},
|
|
774
|
+
"3.2.3": {
|
|
775
|
+
"title": "Consistent Navigation",
|
|
776
|
+
"level": "AA",
|
|
777
|
+
"facets": []
|
|
778
|
+
},
|
|
779
|
+
"3.2.4": {
|
|
780
|
+
"title": "Consistent Identification",
|
|
781
|
+
"level": "AA",
|
|
782
|
+
"facets": []
|
|
783
|
+
},
|
|
784
|
+
"3.2.5": {
|
|
785
|
+
"title": "Change on Request",
|
|
786
|
+
"level": "AAA",
|
|
787
|
+
"facets": [
|
|
788
|
+
{
|
|
789
|
+
"id": "meta-refresh-no-exceptions",
|
|
790
|
+
"label": "No meta refresh is used, regardless of delay (AAA)",
|
|
791
|
+
"automation": "full"
|
|
792
|
+
}
|
|
793
|
+
]
|
|
794
|
+
},
|
|
795
|
+
"3.2.6": {
|
|
796
|
+
"title": "Consistent Help",
|
|
797
|
+
"level": "A",
|
|
798
|
+
"facets": []
|
|
799
|
+
},
|
|
800
|
+
"3.3.1": {
|
|
801
|
+
"title": "Error Identification",
|
|
802
|
+
"level": "A",
|
|
803
|
+
"facets": []
|
|
804
|
+
},
|
|
805
|
+
"3.3.2": {
|
|
806
|
+
"title": "Labels or Instructions",
|
|
807
|
+
"level": "A",
|
|
808
|
+
"facets": [
|
|
809
|
+
{
|
|
810
|
+
"id": "form-control-labels-or-instructions-present",
|
|
811
|
+
"label": "Form controls provide labels or instructions (label/aria-label/aria-labelledby/title/placeholder)",
|
|
812
|
+
"automation": "full"
|
|
813
|
+
},
|
|
814
|
+
{
|
|
815
|
+
"id": "form-control-single-label",
|
|
816
|
+
"label": "Form controls are associated with at most one <label>",
|
|
817
|
+
"automation": "full"
|
|
818
|
+
}
|
|
819
|
+
]
|
|
820
|
+
},
|
|
821
|
+
"3.3.3": {
|
|
822
|
+
"title": "Error Suggestion",
|
|
823
|
+
"level": "AA",
|
|
824
|
+
"facets": []
|
|
825
|
+
},
|
|
826
|
+
"3.3.4": {
|
|
827
|
+
"title": "Error Prevention (Legal, Financial, Data)",
|
|
828
|
+
"level": "AA",
|
|
829
|
+
"facets": []
|
|
830
|
+
},
|
|
831
|
+
"3.3.5": {
|
|
832
|
+
"title": "Help",
|
|
833
|
+
"level": "AAA",
|
|
834
|
+
"facets": []
|
|
835
|
+
},
|
|
836
|
+
"3.3.6": {
|
|
837
|
+
"title": "Error Prevention (All)",
|
|
838
|
+
"level": "AAA",
|
|
839
|
+
"facets": []
|
|
840
|
+
},
|
|
841
|
+
"3.3.7": {
|
|
842
|
+
"title": "Redundant Entry",
|
|
843
|
+
"level": "A",
|
|
844
|
+
"facets": []
|
|
845
|
+
},
|
|
846
|
+
"3.3.8": {
|
|
847
|
+
"title": "Accessible Authentication (Minimum)",
|
|
848
|
+
"level": "AA",
|
|
849
|
+
"facets": []
|
|
850
|
+
},
|
|
851
|
+
"3.3.9": {
|
|
852
|
+
"title": "Accessible Authentication (Enhanced)",
|
|
853
|
+
"level": "AAA",
|
|
854
|
+
"facets": []
|
|
855
|
+
},
|
|
856
|
+
"4.1.1": {
|
|
857
|
+
"title": "Parsing (Obsolete and removed)",
|
|
858
|
+
"level": null,
|
|
859
|
+
"facets": []
|
|
860
|
+
},
|
|
861
|
+
"4.1.2": {
|
|
862
|
+
"title": "Name, Role, Value",
|
|
863
|
+
"level": "A",
|
|
864
|
+
"facets": [
|
|
865
|
+
{
|
|
866
|
+
"id": "form-control-name-present",
|
|
867
|
+
"label": "Form controls expose an accessible name (label/aria-label/aria-labelledby/title/placeholder)",
|
|
868
|
+
"automation": "full"
|
|
869
|
+
},
|
|
870
|
+
{
|
|
871
|
+
"id": "form-control-name-quality",
|
|
872
|
+
"label": "Form controls accessible name quality (avoid placeholder/title as primary)",
|
|
873
|
+
"automation": "manual"
|
|
874
|
+
},
|
|
875
|
+
{
|
|
876
|
+
"id": "aria-hidden-focusable",
|
|
877
|
+
"label": "aria-hidden subtree has focusable content",
|
|
878
|
+
"automation": "full"
|
|
879
|
+
},
|
|
880
|
+
{
|
|
881
|
+
"id": "link-name-present",
|
|
882
|
+
"label": "Links expose an accessible name (content text / aria-label / aria-labelledby / title)",
|
|
883
|
+
"automation": "full"
|
|
884
|
+
},
|
|
885
|
+
{
|
|
886
|
+
"id": "button-name-present",
|
|
887
|
+
"label": "Buttons expose an accessible name (content text / aria-label / aria-labelledby / title / value)",
|
|
888
|
+
"automation": "full"
|
|
889
|
+
},
|
|
890
|
+
{
|
|
891
|
+
"id": "checkbox-name-present",
|
|
892
|
+
"label": "Checkboxes expose an accessible name (label / aria-label / aria-labelledby / title)",
|
|
893
|
+
"automation": "full"
|
|
894
|
+
},
|
|
895
|
+
{
|
|
896
|
+
"id": "radio-name-present",
|
|
897
|
+
"label": "Radio buttons expose an accessible name (label / aria-label / aria-labelledby / title)",
|
|
898
|
+
"automation": "full"
|
|
899
|
+
},
|
|
900
|
+
{
|
|
901
|
+
"id": "switch-name-present",
|
|
902
|
+
"label": "Switches expose an accessible name (content / aria-label / aria-labelledby / title)",
|
|
903
|
+
"automation": "full"
|
|
904
|
+
},
|
|
905
|
+
{
|
|
906
|
+
"id": "combobox-name-present",
|
|
907
|
+
"label": "Comboboxes expose an accessible name (content / aria-label / aria-labelledby / title)",
|
|
908
|
+
"automation": "full"
|
|
909
|
+
},
|
|
910
|
+
{
|
|
911
|
+
"id": "dialog-name-present",
|
|
912
|
+
"label": "Dialogs expose an accessible name (aria-labelledby / aria-label / title / content)",
|
|
913
|
+
"automation": "full"
|
|
914
|
+
},
|
|
915
|
+
{
|
|
916
|
+
"id": "menuitem-name-present",
|
|
917
|
+
"label": "Menu items expose an accessible name (content / aria-label / aria-labelledby / title)",
|
|
918
|
+
"automation": "full"
|
|
919
|
+
},
|
|
920
|
+
{
|
|
921
|
+
"id": "tab-name-present",
|
|
922
|
+
"label": "Tabs expose an accessible name (content / aria-label / aria-labelledby / title)",
|
|
923
|
+
"automation": "full"
|
|
924
|
+
},
|
|
925
|
+
{
|
|
926
|
+
"id": "slider-name-present",
|
|
927
|
+
"label": "Sliders expose an accessible name (label / aria-label / aria-labelledby / title / content)",
|
|
928
|
+
"automation": "full"
|
|
929
|
+
},
|
|
930
|
+
{
|
|
931
|
+
"id": "textbox-name-present",
|
|
932
|
+
"label": "Textboxes (role=\\\"textbox\\\") expose an accessible name (content / aria-label / aria-labelledby / title)",
|
|
933
|
+
"automation": "full"
|
|
934
|
+
},
|
|
935
|
+
{
|
|
936
|
+
"id": "searchbox-name-present",
|
|
937
|
+
"label": "Searchboxes (role=\\\"searchbox\\\") expose an accessible name (content / aria-label / aria-labelledby / title)",
|
|
938
|
+
"automation": "full"
|
|
939
|
+
},
|
|
940
|
+
{
|
|
941
|
+
"id": "spinbutton-name-present",
|
|
942
|
+
"label": "Spinbuttons (role=\\\"spinbutton\\\") expose an accessible name (content / aria-label / aria-labelledby / title)",
|
|
943
|
+
"automation": "full"
|
|
944
|
+
},
|
|
945
|
+
{
|
|
946
|
+
"id": "listbox-name-present",
|
|
947
|
+
"label": "Listboxes (role=\\\"listbox\\\") expose an accessible name (content / aria-label / aria-labelledby / title)",
|
|
948
|
+
"automation": "full"
|
|
949
|
+
},
|
|
950
|
+
{
|
|
951
|
+
"id": "option-name-present",
|
|
952
|
+
"label": "Options (role=\\\"option\\\") expose an accessible name (content / aria-label / aria-labelledby / title)",
|
|
953
|
+
"automation": "full"
|
|
954
|
+
},
|
|
955
|
+
{
|
|
956
|
+
"id": "treeitem-name-present",
|
|
957
|
+
"label": "Tree items (role=\\\"treeitem\\\") expose an accessible name (content / aria-label / aria-labelledby / title)",
|
|
958
|
+
"automation": "full"
|
|
959
|
+
},
|
|
960
|
+
{
|
|
961
|
+
"id": "aria-role-name-present",
|
|
962
|
+
"label": "Selected ARIA widget/container roles (scrollbar, toolbar, tablist, radiogroup, tree, grid, menu, menubar) expose an accessible name",
|
|
963
|
+
"automation": "full"
|
|
964
|
+
},
|
|
965
|
+
{
|
|
966
|
+
"id": "aria-role-valid",
|
|
967
|
+
"label": "Explicit role attribute resolves to a real, non-abstract ARIA role",
|
|
968
|
+
"automation": "full"
|
|
969
|
+
},
|
|
970
|
+
{
|
|
971
|
+
"id": "aria-role-not-deprecated",
|
|
972
|
+
"label": "Explicit role attribute does not use a deprecated ARIA role",
|
|
973
|
+
"automation": "full"
|
|
974
|
+
},
|
|
975
|
+
{
|
|
976
|
+
"id": "aria-attr-name-valid",
|
|
977
|
+
"label": "Every aria-* attribute name present is a real, defined ARIA attribute",
|
|
978
|
+
"automation": "full"
|
|
979
|
+
},
|
|
980
|
+
{
|
|
981
|
+
"id": "aria-attr-value-valid",
|
|
982
|
+
"label": "Every recognized aria-* attribute has a value matching its declared type",
|
|
983
|
+
"automation": "full"
|
|
984
|
+
},
|
|
985
|
+
{
|
|
986
|
+
"id": "aria-attr-allowed-for-role",
|
|
987
|
+
"label": "aria-* attributes present are permitted for the element's explicit role",
|
|
988
|
+
"automation": "full"
|
|
989
|
+
},
|
|
990
|
+
{
|
|
991
|
+
"id": "aria-attr-not-prohibited",
|
|
992
|
+
"label": "ARIA naming attributes are not used on roles that prohibit them",
|
|
993
|
+
"automation": "full"
|
|
994
|
+
},
|
|
995
|
+
{
|
|
996
|
+
"id": "aria-attr-required-for-role",
|
|
997
|
+
"label": "Roles with an unambiguous required state/property carry it (e.g. role=\\\"checkbox\\\" has aria-checked)",
|
|
998
|
+
"automation": "full"
|
|
999
|
+
},
|
|
1000
|
+
{
|
|
1001
|
+
"id": "aria-role-allowed-for-element",
|
|
1002
|
+
"label": "Explicit role attribute is permitted by the ARIA-in-HTML spec for its host element",
|
|
1003
|
+
"automation": "full"
|
|
1004
|
+
},
|
|
1005
|
+
{
|
|
1006
|
+
"id": "aria-role-required-owned-children",
|
|
1007
|
+
"label": "Container roles (list, listbox, menu, table, tablist, tree, ...) own at least one required child role",
|
|
1008
|
+
"automation": "full"
|
|
1009
|
+
},
|
|
1010
|
+
{
|
|
1011
|
+
"id": "aria-role-owned-children-allowed",
|
|
1012
|
+
"label": "Container roles do not own an accessible-tree child with a disallowed role",
|
|
1013
|
+
"automation": "full"
|
|
1014
|
+
},
|
|
1015
|
+
{
|
|
1016
|
+
"id": "aria-role-required-context-parent",
|
|
1017
|
+
"label": "Roles requiring a specific context role (listitem, option, tab, treeitem, row, cell, ...) have an acceptable ancestor/owner",
|
|
1018
|
+
"automation": "full"
|
|
1019
|
+
},
|
|
1020
|
+
{
|
|
1021
|
+
"id": "iframe-name-present",
|
|
1022
|
+
"label": "<iframe>/<frame> elements expose an accessible name (aria-label / aria-labelledby / title)",
|
|
1023
|
+
"automation": "full"
|
|
1024
|
+
},
|
|
1025
|
+
{
|
|
1026
|
+
"id": "iframe-title-unique",
|
|
1027
|
+
"label": "No two <iframe>/<frame> elements share the same title attribute value",
|
|
1028
|
+
"automation": "full"
|
|
1029
|
+
},
|
|
1030
|
+
{
|
|
1031
|
+
"id": "aria-hidden-body-absent",
|
|
1032
|
+
"label": "The document <body> does not have aria-hidden=\"true\"",
|
|
1033
|
+
"automation": "full"
|
|
1034
|
+
},
|
|
1035
|
+
{
|
|
1036
|
+
"id": "duplicate-id-aria",
|
|
1037
|
+
"label": "IDs referenced by ARIA ID-reference attributes are unique in the document",
|
|
1038
|
+
"automation": "full"
|
|
1039
|
+
},
|
|
1040
|
+
{
|
|
1041
|
+
"id": "summary-name-present",
|
|
1042
|
+
"label": "<summary> elements expose an accessible name",
|
|
1043
|
+
"automation": "full"
|
|
1044
|
+
},
|
|
1045
|
+
{
|
|
1046
|
+
"id": "tooltip-name-present",
|
|
1047
|
+
"label": "role=\"tooltip\" elements expose an accessible name",
|
|
1048
|
+
"automation": "full"
|
|
1049
|
+
},
|
|
1050
|
+
{
|
|
1051
|
+
"id": "nested-interactive-controls-absent",
|
|
1052
|
+
"label": "Interactive controls do not contain other interactive controls",
|
|
1053
|
+
"automation": "full"
|
|
1054
|
+
},
|
|
1055
|
+
{
|
|
1056
|
+
"id": "aria-braille-equivalent",
|
|
1057
|
+
"label": "aria-braillelabel/aria-brailleroledescription have a non-braille equivalent",
|
|
1058
|
+
"automation": "full"
|
|
1059
|
+
},
|
|
1060
|
+
{
|
|
1061
|
+
"id": "aria-conditional-attr",
|
|
1062
|
+
"label": "aria-errormessage is only used when aria-invalid is not false/absent",
|
|
1063
|
+
"automation": "full"
|
|
1064
|
+
},
|
|
1065
|
+
{
|
|
1066
|
+
"id": "aria-checked-state-mismatch",
|
|
1067
|
+
"label": "Native checkbox/radio aria-checked matches its actual checked/indeterminate state (evidence only — static markup can't rule out later JS hydration)",
|
|
1068
|
+
"automation": "manual"
|
|
1069
|
+
}
|
|
1070
|
+
]
|
|
1071
|
+
},
|
|
1072
|
+
"4.1.3": {
|
|
1073
|
+
"title": "Status Messages",
|
|
1074
|
+
"level": "AA",
|
|
1075
|
+
"facets": []
|
|
1076
|
+
}
|
|
1077
|
+
};
|
|
1078
|
+
|
|
1079
|
+
module.exports = {FACETS};
|