@diegovelasquezweb/a11y-engine 0.1.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/LICENSE +21 -0
- package/README.md +20 -0
- package/assets/discovery/crawler-config.json +11 -0
- package/assets/discovery/stack-detection.json +33 -0
- package/assets/remediation/axe-check-maps.json +31 -0
- package/assets/remediation/code-patterns.json +109 -0
- package/assets/remediation/guardrails.json +24 -0
- package/assets/remediation/intelligence.json +4166 -0
- package/assets/remediation/source-boundaries.json +46 -0
- package/assets/reporting/compliance-config.json +173 -0
- package/assets/reporting/manual-checks.json +944 -0
- package/assets/reporting/wcag-reference.json +588 -0
- package/package.json +37 -0
- package/scripts/audit.mjs +326 -0
- package/scripts/core/asset-loader.mjs +54 -0
- package/scripts/core/toolchain.mjs +102 -0
- package/scripts/core/utils.mjs +105 -0
- package/scripts/engine/analyzer.mjs +1022 -0
- package/scripts/engine/dom-scanner.mjs +685 -0
- package/scripts/engine/source-scanner.mjs +300 -0
- package/scripts/reports/builders/checklist.mjs +307 -0
- package/scripts/reports/builders/html.mjs +766 -0
- package/scripts/reports/builders/md.mjs +96 -0
- package/scripts/reports/builders/pdf.mjs +259 -0
- package/scripts/reports/renderers/findings.mjs +188 -0
- package/scripts/reports/renderers/html.mjs +452 -0
- package/scripts/reports/renderers/md.mjs +595 -0
- package/scripts/reports/renderers/pdf.mjs +551 -0
- package/scripts/reports/renderers/utils.mjs +42 -0
|
@@ -0,0 +1,588 @@
|
|
|
1
|
+
{
|
|
2
|
+
"apgPatterns": {
|
|
3
|
+
"alert": "https://www.w3.org/WAI/ARIA/apg/patterns/alert/",
|
|
4
|
+
"alertdialog": "https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/",
|
|
5
|
+
"button": "https://www.w3.org/WAI/ARIA/apg/patterns/button/",
|
|
6
|
+
"carousel": "https://www.w3.org/WAI/ARIA/apg/patterns/carousel/",
|
|
7
|
+
"checkbox": "https://www.w3.org/WAI/ARIA/apg/patterns/checkbox/",
|
|
8
|
+
"combobox": "https://www.w3.org/WAI/ARIA/apg/patterns/combobox/",
|
|
9
|
+
"dialog": "https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/",
|
|
10
|
+
"disclosure": "https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/",
|
|
11
|
+
"feed": "https://www.w3.org/WAI/ARIA/apg/patterns/feed/",
|
|
12
|
+
"grid": "https://www.w3.org/WAI/ARIA/apg/patterns/grid/",
|
|
13
|
+
"link": "https://www.w3.org/WAI/ARIA/apg/patterns/link/",
|
|
14
|
+
"listbox": "https://www.w3.org/WAI/ARIA/apg/patterns/listbox/",
|
|
15
|
+
"menu": "https://www.w3.org/WAI/ARIA/apg/patterns/menubar/",
|
|
16
|
+
"menubar": "https://www.w3.org/WAI/ARIA/apg/patterns/menubar/",
|
|
17
|
+
"menuitem": "https://www.w3.org/WAI/ARIA/apg/patterns/menubar/",
|
|
18
|
+
"meter": "https://www.w3.org/WAI/ARIA/apg/patterns/meter/",
|
|
19
|
+
"radio": "https://www.w3.org/WAI/ARIA/apg/patterns/radio/",
|
|
20
|
+
"radiogroup": "https://www.w3.org/WAI/ARIA/apg/patterns/radio/",
|
|
21
|
+
"slider": "https://www.w3.org/WAI/ARIA/apg/patterns/slider/",
|
|
22
|
+
"spinbutton": "https://www.w3.org/WAI/ARIA/apg/patterns/spinbutton/",
|
|
23
|
+
"switch": "https://www.w3.org/WAI/ARIA/apg/patterns/switch/",
|
|
24
|
+
"table": "https://www.w3.org/WAI/ARIA/apg/patterns/table/",
|
|
25
|
+
"tab": "https://www.w3.org/WAI/ARIA/apg/patterns/tabs/",
|
|
26
|
+
"tablist": "https://www.w3.org/WAI/ARIA/apg/patterns/tabs/",
|
|
27
|
+
"tabpanel": "https://www.w3.org/WAI/ARIA/apg/patterns/tabs/",
|
|
28
|
+
"toolbar": "https://www.w3.org/WAI/ARIA/apg/patterns/toolbar/",
|
|
29
|
+
"tooltip": "https://www.w3.org/WAI/ARIA/apg/patterns/tooltip/",
|
|
30
|
+
"treeview": "https://www.w3.org/WAI/ARIA/apg/patterns/treeview/",
|
|
31
|
+
"treegrid": "https://www.w3.org/WAI/ARIA/apg/patterns/treegrid/",
|
|
32
|
+
"navigation": "https://www.w3.org/WAI/ARIA/apg/patterns/landmarks/examples/navigation.html",
|
|
33
|
+
"banner": "https://www.w3.org/WAI/ARIA/apg/patterns/landmarks/examples/banner.html",
|
|
34
|
+
"contentinfo": "https://www.w3.org/WAI/ARIA/apg/patterns/landmarks/examples/contentinfo.html",
|
|
35
|
+
"complementary": "https://www.w3.org/WAI/ARIA/apg/patterns/landmarks/examples/complementary.html",
|
|
36
|
+
"main": "https://www.w3.org/WAI/ARIA/apg/patterns/landmarks/examples/main.html",
|
|
37
|
+
"form": "https://www.w3.org/WAI/ARIA/apg/patterns/landmarks/examples/form.html",
|
|
38
|
+
"heading": "https://www.w3.org/WAI/ARIA/apg/practices/structural-roles/",
|
|
39
|
+
"group": "https://www.w3.org/WAI/ARIA/apg/patterns/landmarks/examples/form.html"
|
|
40
|
+
},
|
|
41
|
+
"mdn": {
|
|
42
|
+
"accesskeys": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/accesskey",
|
|
43
|
+
"area-alt": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/area",
|
|
44
|
+
"aria-allowed-attr": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes",
|
|
45
|
+
"aria-allowed-role": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles",
|
|
46
|
+
"aria-braille-equivalent": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-braillelabel",
|
|
47
|
+
"aria-command-name": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/button_role",
|
|
48
|
+
"aria-conditional-attr": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes",
|
|
49
|
+
"aria-deprecated-role": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles",
|
|
50
|
+
"aria-dialog-name": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/dialog_role",
|
|
51
|
+
"aria-hidden-body": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-hidden",
|
|
52
|
+
"aria-hidden-focus": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-hidden",
|
|
53
|
+
"aria-input-field-name": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/textbox_role",
|
|
54
|
+
"aria-meter-name": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/meter_role",
|
|
55
|
+
"aria-progressbar-name": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/progressbar_role",
|
|
56
|
+
"aria-prohibited-attr": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes",
|
|
57
|
+
"aria-required-attr": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes",
|
|
58
|
+
"aria-required-children": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles",
|
|
59
|
+
"aria-required-parent": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles",
|
|
60
|
+
"aria-roledescription": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-roledescription",
|
|
61
|
+
"aria-roles": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles",
|
|
62
|
+
"aria-text": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-label",
|
|
63
|
+
"aria-toggle-field-name": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/checkbox",
|
|
64
|
+
"aria-tooltip-name": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/tooltip_role",
|
|
65
|
+
"aria-treeitem-name": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/treeitem_role",
|
|
66
|
+
"aria-valid-attr": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes",
|
|
67
|
+
"aria-valid-attr-value": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes",
|
|
68
|
+
"audio-caption": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/track",
|
|
69
|
+
"autocomplete-valid": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/autocomplete",
|
|
70
|
+
"avoid-inline-spacing": "https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/letter-spacing",
|
|
71
|
+
"blink": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/blink",
|
|
72
|
+
"button-name": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/button_role",
|
|
73
|
+
"bypass": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/a",
|
|
74
|
+
"color-contrast": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/Guides/Understanding_WCAG/Perceivable#contrast_minimum",
|
|
75
|
+
"css-orientation-lock": "https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/At-rules/@media/orientation",
|
|
76
|
+
"definition-list": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dl",
|
|
77
|
+
"dlitem": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dd",
|
|
78
|
+
"document-title": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/title",
|
|
79
|
+
"duplicate-id": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/id",
|
|
80
|
+
"duplicate-id-aria": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/id",
|
|
81
|
+
"empty-heading": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/Heading_Elements",
|
|
82
|
+
"empty-table-header": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/th",
|
|
83
|
+
"focus-order-semantics": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/tabindex",
|
|
84
|
+
"form-field-multiple-labels": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/label",
|
|
85
|
+
"frame-focusable-content": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/iframe",
|
|
86
|
+
"frame-tested": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/iframe",
|
|
87
|
+
"frame-title": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/iframe#title",
|
|
88
|
+
"frame-title-unique": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/iframe#title",
|
|
89
|
+
"heading-order": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/Heading_Elements",
|
|
90
|
+
"hidden-content": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/hidden",
|
|
91
|
+
"html-has-lang": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/lang",
|
|
92
|
+
"html-lang-valid": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/lang",
|
|
93
|
+
"html-xml-lang-mismatch": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/lang",
|
|
94
|
+
"identical-links-same-purpose": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/a",
|
|
95
|
+
"image-alt": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/img#alt",
|
|
96
|
+
"image-redundant-alt": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/img#alt",
|
|
97
|
+
"input-button-name": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/submit",
|
|
98
|
+
"input-image-alt": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/image",
|
|
99
|
+
"label": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/label",
|
|
100
|
+
"label-content-name-mismatch": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-label",
|
|
101
|
+
"label-title-only": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/label",
|
|
102
|
+
"landmark-banner-is-top-level": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/header",
|
|
103
|
+
"landmark-complementary-is-top-level": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/aside",
|
|
104
|
+
"landmark-contentinfo-is-top-level": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/footer",
|
|
105
|
+
"landmark-main-is-top-level": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/main",
|
|
106
|
+
"landmark-no-duplicate-banner": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/header",
|
|
107
|
+
"landmark-no-duplicate-contentinfo": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/footer",
|
|
108
|
+
"landmark-no-duplicate-main": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/main",
|
|
109
|
+
"landmark-one-main": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/main",
|
|
110
|
+
"landmark-unique": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/nav",
|
|
111
|
+
"link-in-text-block": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/a",
|
|
112
|
+
"link-name": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/a",
|
|
113
|
+
"list": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/ul",
|
|
114
|
+
"listitem": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/li",
|
|
115
|
+
"marquee": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/marquee",
|
|
116
|
+
"meta-refresh": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/meta/http-equiv",
|
|
117
|
+
"meta-viewport": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/meta/name/viewport",
|
|
118
|
+
"meta-viewport-large": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/meta/name/viewport",
|
|
119
|
+
"nested-interactive": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/button",
|
|
120
|
+
"no-autoplay-audio": "https://developer.mozilla.org/en-US/docs/Web/Media/Guides/Autoplay",
|
|
121
|
+
"object-alt": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/object",
|
|
122
|
+
"p-as-heading": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/Heading_Elements",
|
|
123
|
+
"page-has-heading-one": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/Heading_Elements",
|
|
124
|
+
"presentation-role-conflict": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/presentation_role",
|
|
125
|
+
"region": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/header",
|
|
126
|
+
"role-img-alt": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/img_role",
|
|
127
|
+
"scope-attr-valid": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/th#scope",
|
|
128
|
+
"scrollable-region-focusable": "https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/overflow",
|
|
129
|
+
"select-name": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/select",
|
|
130
|
+
"server-side-image-map": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/map",
|
|
131
|
+
"skip-link": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/a",
|
|
132
|
+
"summary-name": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/summary",
|
|
133
|
+
"svg-img-alt": "https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Element/svg",
|
|
134
|
+
"tabindex": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/tabindex",
|
|
135
|
+
"table-duplicate-name": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/caption",
|
|
136
|
+
"table-fake-caption": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/caption",
|
|
137
|
+
"target-size": "https://developer.mozilla.org/en-US/docs/Web/Accessibility/Guides/Understanding_WCAG/Operable#guideline_2.5_%E2%80%94_input_modalities",
|
|
138
|
+
"td-has-header": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/th",
|
|
139
|
+
"td-headers-attr": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/td#headers",
|
|
140
|
+
"th-has-data-cells": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/th",
|
|
141
|
+
"valid-lang": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/lang",
|
|
142
|
+
"video-caption": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/track"
|
|
143
|
+
},
|
|
144
|
+
"wcagCriterionMap": {
|
|
145
|
+
"accesskeys": "2.1.1",
|
|
146
|
+
"area-alt": "2.4.4",
|
|
147
|
+
"aria-allowed-attr": "4.1.2",
|
|
148
|
+
"aria-allowed-role": "4.1.2",
|
|
149
|
+
"aria-braille-equivalent": "4.1.2",
|
|
150
|
+
"aria-command-name": "4.1.2",
|
|
151
|
+
"aria-conditional-attr": "4.1.2",
|
|
152
|
+
"aria-deprecated-role": "4.1.2",
|
|
153
|
+
"aria-dialog-name": "4.1.2",
|
|
154
|
+
"aria-hidden-body": "4.1.2",
|
|
155
|
+
"aria-hidden-focus": "4.1.2",
|
|
156
|
+
"aria-input-field-name": "4.1.2",
|
|
157
|
+
"aria-meter-name": "1.1.1",
|
|
158
|
+
"aria-progressbar-name": "1.1.1",
|
|
159
|
+
"aria-prohibited-attr": "4.1.2",
|
|
160
|
+
"aria-required-attr": "4.1.2",
|
|
161
|
+
"aria-required-children": "1.3.1",
|
|
162
|
+
"aria-required-parent": "1.3.1",
|
|
163
|
+
"aria-roledescription": "4.1.2",
|
|
164
|
+
"aria-roles": "4.1.2",
|
|
165
|
+
"aria-text": "4.1.2",
|
|
166
|
+
"aria-toggle-field-name": "4.1.2",
|
|
167
|
+
"aria-tooltip-name": "4.1.2",
|
|
168
|
+
"aria-treeitem-name": "4.1.2",
|
|
169
|
+
"aria-valid-attr": "4.1.2",
|
|
170
|
+
"aria-valid-attr-value": "4.1.2",
|
|
171
|
+
"audio-caption": "1.2.1",
|
|
172
|
+
"autocomplete-valid": "1.3.5",
|
|
173
|
+
"avoid-inline-spacing": "1.4.12",
|
|
174
|
+
"blink": "2.2.2",
|
|
175
|
+
"button-name": "4.1.2",
|
|
176
|
+
"bypass": "2.4.1",
|
|
177
|
+
"color-contrast": "1.4.3",
|
|
178
|
+
"css-orientation-lock": "1.3.4",
|
|
179
|
+
"definition-list": "1.3.1",
|
|
180
|
+
"dlitem": "1.3.1",
|
|
181
|
+
"document-title": "2.4.2",
|
|
182
|
+
"duplicate-id": "4.1.2",
|
|
183
|
+
"duplicate-id-aria": "4.1.2",
|
|
184
|
+
"empty-heading": "2.4.6",
|
|
185
|
+
"empty-table-header": "1.3.1",
|
|
186
|
+
"focus-order-semantics": "2.4.3",
|
|
187
|
+
"form-field-multiple-labels": "3.3.2",
|
|
188
|
+
"frame-focusable-content": "2.1.1",
|
|
189
|
+
"frame-tested": "4.1.2",
|
|
190
|
+
"frame-title": "4.1.2",
|
|
191
|
+
"frame-title-unique": "4.1.2",
|
|
192
|
+
"heading-order": "1.3.1",
|
|
193
|
+
"hidden-content": "4.1.2",
|
|
194
|
+
"html-has-lang": "3.1.1",
|
|
195
|
+
"html-lang-valid": "3.1.1",
|
|
196
|
+
"html-xml-lang-mismatch": "3.1.1",
|
|
197
|
+
"identical-links-same-purpose": "2.4.9",
|
|
198
|
+
"image-alt": "1.1.1",
|
|
199
|
+
"image-redundant-alt": "1.1.1",
|
|
200
|
+
"input-button-name": "4.1.2",
|
|
201
|
+
"input-image-alt": "1.1.1",
|
|
202
|
+
"label": "4.1.2",
|
|
203
|
+
"label-content-name-mismatch": "2.5.3",
|
|
204
|
+
"label-title-only": "3.3.2",
|
|
205
|
+
"landmark-banner-is-top-level": "1.3.6",
|
|
206
|
+
"landmark-complementary-is-top-level": "1.3.6",
|
|
207
|
+
"landmark-contentinfo-is-top-level": "1.3.6",
|
|
208
|
+
"landmark-main-is-top-level": "1.3.6",
|
|
209
|
+
"landmark-no-duplicate-banner": "1.3.6",
|
|
210
|
+
"landmark-no-duplicate-contentinfo": "1.3.6",
|
|
211
|
+
"landmark-no-duplicate-main": "1.3.6",
|
|
212
|
+
"landmark-one-main": "1.3.6",
|
|
213
|
+
"landmark-unique": "1.3.6",
|
|
214
|
+
"link-in-text-block": "1.4.1",
|
|
215
|
+
"link-name": "2.4.4",
|
|
216
|
+
"list": "1.3.1",
|
|
217
|
+
"listitem": "1.3.1",
|
|
218
|
+
"marquee": "2.2.2",
|
|
219
|
+
"meta-refresh": "2.2.1",
|
|
220
|
+
"meta-viewport": "1.4.4",
|
|
221
|
+
"meta-viewport-large": "1.4.4",
|
|
222
|
+
"nested-interactive": "4.1.2",
|
|
223
|
+
"no-autoplay-audio": "1.4.2",
|
|
224
|
+
"object-alt": "1.1.1",
|
|
225
|
+
"p-as-heading": "1.3.1",
|
|
226
|
+
"page-has-heading-one": "2.4.6",
|
|
227
|
+
"presentation-role-conflict": "4.1.2",
|
|
228
|
+
"region": "1.3.6",
|
|
229
|
+
"role-img-alt": "1.1.1",
|
|
230
|
+
"scope-attr-valid": "1.3.1",
|
|
231
|
+
"scrollable-region-focusable": "2.1.1",
|
|
232
|
+
"select-name": "4.1.2",
|
|
233
|
+
"server-side-image-map": "2.1.1",
|
|
234
|
+
"skip-link": "2.4.1",
|
|
235
|
+
"summary-name": "4.1.2",
|
|
236
|
+
"svg-img-alt": "1.1.1",
|
|
237
|
+
"tabindex": "2.4.3",
|
|
238
|
+
"table-duplicate-name": "1.3.1",
|
|
239
|
+
"table-fake-caption": "1.3.1",
|
|
240
|
+
"target-size": "2.5.8",
|
|
241
|
+
"td-has-header": "1.3.1",
|
|
242
|
+
"td-headers-attr": "1.3.1",
|
|
243
|
+
"th-has-data-cells": "1.3.1",
|
|
244
|
+
"valid-lang": "3.1.2",
|
|
245
|
+
"video-caption": "1.2.2"
|
|
246
|
+
},
|
|
247
|
+
"impactedUsers": {
|
|
248
|
+
"accesskeys": "Keyboard-only users and screen reader users (duplicate access keys cause unpredictable focus jumps)",
|
|
249
|
+
"area-alt": "Screen reader users navigating image maps",
|
|
250
|
+
"aria-allowed-attr": "Screen reader users (invalid attributes cause unpredictable AT behavior)",
|
|
251
|
+
"aria-allowed-role": "Screen reader users (mismatched roles cause incorrect element announcements)",
|
|
252
|
+
"aria-braille-equivalent": "Braille display users",
|
|
253
|
+
"aria-command-name": "Screen reader users and voice control users",
|
|
254
|
+
"aria-conditional-attr": "Screen reader users (conditional attributes in incorrect states confuse AT)",
|
|
255
|
+
"aria-deprecated-role": "Screen reader users (deprecated roles may be dropped by AT in future versions)",
|
|
256
|
+
"aria-dialog-name": "Screen reader users (unnamed dialogs are announced without context)",
|
|
257
|
+
"aria-hidden-body": "All users (entire page becomes invisible to assistive technology)",
|
|
258
|
+
"aria-hidden-focus": "Keyboard-only users and screen reader users",
|
|
259
|
+
"aria-input-field-name": "Screen reader users and voice control users",
|
|
260
|
+
"aria-meter-name": "Screen reader users (meters without names are announced as unlabeled gauges)",
|
|
261
|
+
"aria-progressbar-name": "Screen reader users (progress bars without names cannot be identified)",
|
|
262
|
+
"aria-prohibited-attr": "Screen reader users",
|
|
263
|
+
"aria-required-attr": "Screen reader users",
|
|
264
|
+
"aria-required-children": "Screen reader users (missing required child roles break widget navigation)",
|
|
265
|
+
"aria-required-parent": "Screen reader users (orphaned child roles are not recognized by AT)",
|
|
266
|
+
"aria-roledescription": "Screen reader users (misapplied roledescription overrides meaningful role announcements)",
|
|
267
|
+
"aria-roles": "Screen reader users (invalid roles are ignored or misinterpreted by AT)",
|
|
268
|
+
"aria-text": "Screen reader users (elements with role='text' or aria-label on non-interactive elements may cause fragmented or missing announcements)",
|
|
269
|
+
"aria-toggle-field-name": "Screen reader users and voice control users",
|
|
270
|
+
"aria-tooltip-name": "Screen reader users and keyboard-only users",
|
|
271
|
+
"aria-treeitem-name": "Screen reader users navigating tree views",
|
|
272
|
+
"aria-valid-attr": "Screen reader users (invalid ARIA attributes are ignored by AT)",
|
|
273
|
+
"aria-valid-attr-value": "Screen reader users",
|
|
274
|
+
"audio-caption": "Deaf users and users with hearing disabilities",
|
|
275
|
+
"autocomplete-valid": "Users with motor disabilities and cognitive disabilities",
|
|
276
|
+
"avoid-inline-spacing": "Users with low vision and users with reading disabilities who override text spacing",
|
|
277
|
+
"blink": "Users with vestibular disorders, photosensitive epilepsy, and cognitive disabilities",
|
|
278
|
+
"button-name": "Screen reader users and voice control users",
|
|
279
|
+
"bypass": "Keyboard-only users and screen reader users",
|
|
280
|
+
"color-contrast": "Users with low vision or color blindness",
|
|
281
|
+
"css-orientation-lock": "Users with motor disabilities who mount devices in a fixed orientation",
|
|
282
|
+
"definition-list": "Screen reader users (incorrect dl structure breaks term/definition relationships)",
|
|
283
|
+
"dlitem": "Screen reader users (dd/dt elements outside dl lose semantic meaning)",
|
|
284
|
+
"document-title": "Screen reader users and users with cognitive disabilities",
|
|
285
|
+
"duplicate-id": "Screen reader users (broken element references)",
|
|
286
|
+
"duplicate-id-aria": "Screen reader users (broken accessible name, description, or widget relationships)",
|
|
287
|
+
"empty-heading": "Screen reader users navigating by headings",
|
|
288
|
+
"empty-table-header": "Screen reader users (empty headers provide no context for associated data cells)",
|
|
289
|
+
"focus-order-semantics": "Keyboard-only users and screen reader users",
|
|
290
|
+
"form-field-multiple-labels": "Screen reader users",
|
|
291
|
+
"frame-focusable-content": "Keyboard-only users (focusable content trapped in inaccessible frames)",
|
|
292
|
+
"frame-tested": "All users (untested frames may contain undetected accessibility violations)",
|
|
293
|
+
"frame-title": "Screen reader users",
|
|
294
|
+
"frame-title-unique": "Screen reader users navigating between multiple frames",
|
|
295
|
+
"heading-order": "Screen reader users navigating by headings",
|
|
296
|
+
"hidden-content": "Screen reader users (hidden content may still be announced or may hide important information)",
|
|
297
|
+
"html-has-lang": "Screen reader users (language detection for pronunciation)",
|
|
298
|
+
"html-lang-valid": "Screen reader users (language detection for pronunciation)",
|
|
299
|
+
"html-xml-lang-mismatch": "Screen reader users (conflicting language declarations cause pronunciation errors)",
|
|
300
|
+
"identical-links-same-purpose": "Screen reader users navigating the links list and voice control users",
|
|
301
|
+
"image-alt": "Blind users relying on screen readers",
|
|
302
|
+
"image-redundant-alt": "Screen reader users (redundant announcements increase cognitive load)",
|
|
303
|
+
"input-button-name": "Screen reader users and voice control users",
|
|
304
|
+
"input-image-alt": "Blind users relying on screen readers",
|
|
305
|
+
"label": "Screen reader users and voice control users",
|
|
306
|
+
"label-content-name-mismatch": "Voice control users (Dragon NaturallySpeaking, iOS Voice Control)",
|
|
307
|
+
"label-title-only": "Screen reader users and voice control users (title attribute is not universally exposed as the accessible name)",
|
|
308
|
+
"landmark-banner-is-top-level": "Screen reader users navigating by landmarks",
|
|
309
|
+
"landmark-complementary-is-top-level": "Screen reader users navigating by landmarks",
|
|
310
|
+
"landmark-contentinfo-is-top-level": "Screen reader users navigating by landmarks",
|
|
311
|
+
"landmark-main-is-top-level": "Screen reader users navigating by landmarks",
|
|
312
|
+
"landmark-no-duplicate-banner": "Screen reader users navigating by landmarks",
|
|
313
|
+
"landmark-no-duplicate-contentinfo": "Screen reader users navigating by landmarks",
|
|
314
|
+
"landmark-no-duplicate-main": "Screen reader users navigating by landmarks",
|
|
315
|
+
"landmark-one-main": "Screen reader users navigating by landmarks",
|
|
316
|
+
"landmark-unique": "Screen reader users navigating by landmarks",
|
|
317
|
+
"link-in-text-block": "Users with low vision or color blindness who cannot distinguish links by color alone",
|
|
318
|
+
"link-name": "Screen reader users and voice control users",
|
|
319
|
+
"list": "Screen reader users (list item count and navigation)",
|
|
320
|
+
"listitem": "Screen reader users (invalid list structure causes incorrect announcements)",
|
|
321
|
+
"marquee": "Users with vestibular disorders, cognitive disabilities, and screen reader users",
|
|
322
|
+
"meta-refresh": "Users with cognitive disabilities and screen reader users",
|
|
323
|
+
"meta-viewport": "Users who need to zoom (low vision, motor disabilities)",
|
|
324
|
+
"meta-viewport-large": "Users with low vision who need to zoom beyond the default maximum scale",
|
|
325
|
+
"nested-interactive": "Keyboard-only users and screen reader users",
|
|
326
|
+
"no-autoplay-audio": "Screen reader users (audio conflicts with AT speech), users with cognitive disabilities, users with vestibular disorders",
|
|
327
|
+
"object-alt": "Blind users relying on screen readers",
|
|
328
|
+
"p-as-heading": "Screen reader users navigating by headings",
|
|
329
|
+
"page-has-heading-one": "Screen reader users navigating by headings",
|
|
330
|
+
"presentation-role-conflict": "Screen reader users (conflicting roles cause AT to ignore or misrepresent elements)",
|
|
331
|
+
"region": "Screen reader users navigating by landmarks",
|
|
332
|
+
"role-img-alt": "Blind users relying on screen readers",
|
|
333
|
+
"scope-attr-valid": "Screen reader users navigating data tables",
|
|
334
|
+
"scrollable-region-focusable": "Keyboard-only users",
|
|
335
|
+
"select-name": "Screen reader users and voice control users",
|
|
336
|
+
"server-side-image-map": "Keyboard-only users and screen reader users",
|
|
337
|
+
"skip-link": "Keyboard-only users and screen reader users",
|
|
338
|
+
"summary-name": "Screen reader users and voice control users",
|
|
339
|
+
"svg-img-alt": "Blind users relying on screen readers",
|
|
340
|
+
"tabindex": "Keyboard-only users",
|
|
341
|
+
"table-duplicate-name": "Screen reader users (duplicate announcement of table description creates cognitive load)",
|
|
342
|
+
"table-fake-caption": "Screen reader users (spanning cells used as captions are not associated with the table)",
|
|
343
|
+
"target-size": "Mobile/touch users and users with motor disabilities",
|
|
344
|
+
"td-has-header": "Screen reader users navigating data tables",
|
|
345
|
+
"td-headers-attr": "Screen reader users navigating complex tables",
|
|
346
|
+
"th-has-data-cells": "Screen reader users navigating tables",
|
|
347
|
+
"valid-lang": "Screen reader users (language detection for pronunciation)",
|
|
348
|
+
"video-caption": "Deaf users and users with hearing disabilities"
|
|
349
|
+
},
|
|
350
|
+
"expected": {
|
|
351
|
+
"accesskeys": "The accesskey attribute value must be unique across the page to prevent conflicting keyboard shortcuts.",
|
|
352
|
+
"area-alt": "Every <area> element in an image map must have an alt attribute that describes the link destination.",
|
|
353
|
+
"aria-allowed-attr": "ARIA attributes used on an element must be valid for that element's role. Invalid attributes must be removed.",
|
|
354
|
+
"aria-allowed-role": "The role attribute value must be appropriate for the element. Assigning a role that conflicts with the element's native semantics confuses assistive technology.",
|
|
355
|
+
"aria-braille-equivalent": "Elements with aria-braillelabel or aria-brailleroledescription must also have a non-braille accessible name or roledescription.",
|
|
356
|
+
"aria-command-name": "Elements with ARIA command roles (button, link, menuitem) must have a non-empty accessible name.",
|
|
357
|
+
"aria-conditional-attr": "ARIA attributes that are conditional on the element's state or role must only be used when those conditions are met.",
|
|
358
|
+
"aria-deprecated-role": "Elements must not use deprecated ARIA roles. Replace deprecated roles with their modern equivalents.",
|
|
359
|
+
"aria-dialog-name": "Elements with role=\"dialog\" or role=\"alertdialog\" must have a non-empty accessible name via aria-label or aria-labelledby.",
|
|
360
|
+
"aria-hidden-body": "The <body> element must not have aria-hidden=\"true\", as this hides the entire page from assistive technology.",
|
|
361
|
+
"aria-hidden-focus": "Elements with aria-hidden=\"true\" must not be focusable.",
|
|
362
|
+
"aria-input-field-name": "ARIA input roles (textbox, searchbox, spinbutton, slider, combobox) must have an accessible name.",
|
|
363
|
+
"aria-meter-name": "Elements with role=\"meter\" must have a non-empty accessible name via aria-label or aria-labelledby.",
|
|
364
|
+
"aria-progressbar-name": "Elements with role=\"progressbar\" must have a non-empty accessible name via aria-label or aria-labelledby.",
|
|
365
|
+
"aria-prohibited-attr": "ARIA attributes must only be used on roles that allow them per the WAI-ARIA specification.",
|
|
366
|
+
"aria-required-attr": "ARIA roles must include all required attributes defined in the WAI-ARIA spec.",
|
|
367
|
+
"aria-required-children": "ARIA parent roles must contain their required child roles (e.g., role=\"list\" must contain role=\"listitem\").",
|
|
368
|
+
"aria-required-parent": "ARIA child roles must be nested within their required parent roles (e.g., role=\"listitem\" must be inside role=\"list\").",
|
|
369
|
+
"aria-roledescription": "The aria-roledescription attribute must only be used on elements with a valid implicit or explicit ARIA role.",
|
|
370
|
+
"aria-roles": "All role attribute values must be valid ARIA roles from the WAI-ARIA specification.",
|
|
371
|
+
"aria-text": "Elements using role=\"text\" or aria-label on non-interactive container elements should ensure AT reads the content as a single uninterrupted string without losing child semantics.",
|
|
372
|
+
"aria-toggle-field-name": "Toggle fields (checkbox, radio, role='switch') must have an accessible name so AT can announce what is being toggled.",
|
|
373
|
+
"aria-tooltip-name": "Elements with role=\"tooltip\" must have a non-empty accessible name.",
|
|
374
|
+
"aria-treeitem-name": "Elements with role=\"treeitem\" must have a non-empty accessible name.",
|
|
375
|
+
"aria-valid-attr": "All ARIA attributes must be valid and spelled correctly per the WAI-ARIA specification.",
|
|
376
|
+
"aria-valid-attr-value": "ARIA attributes must use only valid values defined in the WAI-ARIA spec.",
|
|
377
|
+
"audio-caption": "All <audio> elements with speech or meaningful audio must provide synchronized captions or a full transcript.",
|
|
378
|
+
"autocomplete-valid": "Inputs collecting personal data must have a valid autocomplete attribute per WCAG 1.3.5.",
|
|
379
|
+
"avoid-inline-spacing": "Inline styles must not use !important on text-spacing properties (letter-spacing, word-spacing, line-height) to allow user overrides (WCAG 1.4.12).",
|
|
380
|
+
"blink": "The <blink> element must not be used. Blinking content cannot be paused or stopped by the user (WCAG 2.2.2).",
|
|
381
|
+
"button-name": "Every <button> and [role=\"button\"] must have a non-empty accessible name.",
|
|
382
|
+
"bypass": "Page must provide a mechanism to skip repetitive navigation (e.g., a skip link).",
|
|
383
|
+
"color-contrast": "Text contrast ratio must be at least 4.5:1 for normal text, 3:1 for large text.",
|
|
384
|
+
"css-orientation-lock": "Content must not be locked to a single display orientation (portrait or landscape) unless a specific orientation is essential (WCAG 1.3.4).",
|
|
385
|
+
"definition-list": "A <dl> element must only contain <dt> and <dd> groups, <div>, <script>, or <template> elements as direct children.",
|
|
386
|
+
"dlitem": "Every <dt> and <dd> element must be contained within a <dl> element.",
|
|
387
|
+
"document-title": "Page must have a descriptive, unique <title> element.",
|
|
388
|
+
"duplicate-id": "All id attributes must be unique within the document.",
|
|
389
|
+
"duplicate-id-aria": "All IDs referenced by ARIA attributes must be unique within the document. Duplicate ARIA-referenced IDs cause AT to resolve to the first matching element, breaking all subsequent references.",
|
|
390
|
+
"empty-heading": "Every heading element must contain non-empty, meaningful text content.",
|
|
391
|
+
"empty-table-header": "Table header cells (<th>) must contain non-empty text content so screen readers can announce column or row context.",
|
|
392
|
+
"focus-order-semantics": "Elements in the focus order must have an appropriate interactive role. Non-interactive elements with tabindex=\"0\" should use a suitable ARIA role.",
|
|
393
|
+
"form-field-multiple-labels": "Each form input must have exactly one accessible name source (label, aria-label, or aria-labelledby).",
|
|
394
|
+
"frame-focusable-content": "Frames with tabindex=\"-1\" must not contain focusable content, as keyboard users cannot reach it.",
|
|
395
|
+
"frame-tested": "All <iframe> elements must be testable by the accessibility engine. Frames that fail to load or block testing may contain undetected violations.",
|
|
396
|
+
"frame-title": "Every <iframe> must have a descriptive title attribute.",
|
|
397
|
+
"frame-title-unique": "Each <iframe> on the page must have a unique title attribute to distinguish it from other frames.",
|
|
398
|
+
"heading-order": "Heading levels must not skip (h1 → h2 → h3, no gaps allowed).",
|
|
399
|
+
"hidden-content": "Content hidden from the page should be reviewed to ensure it is not unintentionally hidden from assistive technology users.",
|
|
400
|
+
"html-has-lang": "The <html> element must have a lang attribute.",
|
|
401
|
+
"html-lang-valid": "The lang attribute on <html> must be a valid BCP 47 language tag.",
|
|
402
|
+
"html-xml-lang-mismatch": "The lang and xml:lang attributes on the <html> element must specify the same base language.",
|
|
403
|
+
"identical-links-same-purpose": "Links with the same accessible name must have the same destination, or their distinct purpose must be distinguishable from context or accessible name.",
|
|
404
|
+
"image-alt": "Every <img> must have an alt attribute. Decorative images use alt=\"\".",
|
|
405
|
+
"image-redundant-alt": "Image alt text must not duplicate adjacent visible text. If adjacent text fully describes the image, use alt='' to mark it as decorative.",
|
|
406
|
+
"input-button-name": "Input elements with type 'button', 'submit', or 'reset' must have a non-empty accessible name via the value attribute or aria-label.",
|
|
407
|
+
"input-image-alt": "Every <input type=\"image\"> must have an alt attribute describing the button's action.",
|
|
408
|
+
"label": "Every form input must have an associated <label>, aria-label, or aria-labelledby.",
|
|
409
|
+
"label-content-name-mismatch": "The accessible name of interactive elements must contain the visible label text (WCAG 2.5.3).",
|
|
410
|
+
"label-title-only": "Form inputs must not rely solely on the title attribute for their accessible name. Use a visible <label> or aria-label instead.",
|
|
411
|
+
"landmark-banner-is-top-level": "The banner landmark (header or role=\"banner\") must be a top-level landmark, not nested inside another landmark.",
|
|
412
|
+
"landmark-complementary-is-top-level": "The complementary landmark (aside or role=\"complementary\") must be a top-level landmark, not nested inside another landmark.",
|
|
413
|
+
"landmark-contentinfo-is-top-level": "The contentinfo landmark (footer or role=\"contentinfo\") must be a top-level landmark, not nested inside another landmark.",
|
|
414
|
+
"landmark-main-is-top-level": "The main landmark must be a top-level landmark, not nested inside another landmark such as a nav or aside.",
|
|
415
|
+
"landmark-no-duplicate-banner": "A page must not have more than one banner landmark (<header> at top level or role='banner').",
|
|
416
|
+
"landmark-no-duplicate-contentinfo": "A page must not have more than one contentinfo landmark (<footer> at top level or role=\"contentinfo\").",
|
|
417
|
+
"landmark-no-duplicate-main": "A page must not have more than one main landmark (<main> or role='main'). Multiple main landmarks break skip navigation.",
|
|
418
|
+
"landmark-one-main": "Page must contain exactly one <main> landmark element.",
|
|
419
|
+
"landmark-unique": "When multiple landmarks of the same type exist (e.g., multiple <nav> elements), each must have a unique accessible label.",
|
|
420
|
+
"link-in-text-block": "Links within blocks of text must be distinguishable from surrounding text by means other than color alone (e.g., underline or other visual indicator).",
|
|
421
|
+
"link-name": "Every <a href> must have descriptive, non-empty text content or an aria-label.",
|
|
422
|
+
"list": "<ul> and <ol> must only contain <li> elements as direct children. Screen readers use this structure to announce the list count and enable list navigation.",
|
|
423
|
+
"listitem": "<li> elements must be direct children of <ul>, <ol>, or <menu> elements.",
|
|
424
|
+
"marquee": "The <marquee> element must not be used. Use CSS animations with pause controls instead (WCAG 2.2.2).",
|
|
425
|
+
"meta-refresh": "Pages must not auto-refresh or auto-redirect with a non-zero delay (WCAG 2.2.1).",
|
|
426
|
+
"meta-viewport": "Viewport meta must not disable user scaling (user-scalable=no is forbidden).",
|
|
427
|
+
"meta-viewport-large": "The viewport meta tag should allow scaling to at least 500% to support users with low vision (WCAG 1.4.4).",
|
|
428
|
+
"nested-interactive": "Interactive elements (a, button, input, select, textarea) must not be nested inside other interactive elements.",
|
|
429
|
+
"no-autoplay-audio": "Audio that plays automatically must stop within 3 seconds, or a mechanism to pause/stop/mute it must be provided at the start of the page (WCAG 1.4.2).",
|
|
430
|
+
"object-alt": "Every <object> must have an accessible name via aria-label or aria-labelledby.",
|
|
431
|
+
"p-as-heading": "Text that visually functions as a section heading must be marked up with a heading element (<h1>–<h6>), not a styled paragraph.",
|
|
432
|
+
"page-has-heading-one": "Page must have exactly one <h1> element as the primary heading.",
|
|
433
|
+
"presentation-role-conflict": "Elements with role=\"presentation\" or role=\"none\" must not have global ARIA attributes or focusable states that conflict with the presentation role.",
|
|
434
|
+
"region": "All visible page content must be contained within a landmark element (main, nav, header, footer, aside).",
|
|
435
|
+
"role-img-alt": "Elements with role=\"img\" must have a non-empty accessible name via aria-label or aria-labelledby.",
|
|
436
|
+
"scope-attr-valid": "The scope attribute on <th> elements must use a valid value (row, col, rowgroup, colgroup) and must not be used on <td> elements.",
|
|
437
|
+
"scrollable-region-focusable": "Any element with scrollable overflow must be reachable via keyboard (tabindex=\"0\" or natively focusable).",
|
|
438
|
+
"select-name": "Every <select> must have an accessible name via <label>, aria-label, or aria-labelledby.",
|
|
439
|
+
"server-side-image-map": "Server-side image maps must not be used. Replace with client-side image maps or accessible alternatives operable via keyboard.",
|
|
440
|
+
"skip-link": "Skip navigation links must have a valid target that exists in the page and is focusable, allowing keyboard users to bypass repetitive content (WCAG 2.4.1).",
|
|
441
|
+
"summary-name": "Every <summary> element must have a non-empty accessible name describing the disclosure widget it controls.",
|
|
442
|
+
"svg-img-alt": "SVG elements used as images must have an accessible name (aria-label or aria-labelledby). Decorative SVGs must be hidden from AT with aria-hidden='true'.",
|
|
443
|
+
"tabindex": "tabindex values must be 0 or -1. Positive values disrupt natural focus order.",
|
|
444
|
+
"table-duplicate-name": "The <caption> and summary attribute of a table must not contain identical text — this causes screen readers to announce the same description twice.",
|
|
445
|
+
"table-fake-caption": "Tables must not use a spanning cell as a pseudo-caption. Use the <caption> element for table titles.",
|
|
446
|
+
"target-size": "All interactive targets must be at least 24×24 CSS pixels (WCAG 2.5.8). Spacing or a larger equivalent target is an acceptable alternative.",
|
|
447
|
+
"td-has-header": "Every data cell (<td>) in a data table must be associated with a header cell (<th>) via scope or headers attributes.",
|
|
448
|
+
"td-headers-attr": "When the headers attribute is used on <td>, every referenced ID must point to a valid <th> element in the same table.",
|
|
449
|
+
"th-has-data-cells": "Every <th> must have at least one associated data cell — a header with no data cells is meaningless structure.",
|
|
450
|
+
"valid-lang": "All lang attributes must use valid BCP 47 language codes.",
|
|
451
|
+
"video-caption": "All <video> elements with audio content must have synchronized captions via a <track kind='captions'> element."
|
|
452
|
+
},
|
|
453
|
+
"tagImpactedUsers": {
|
|
454
|
+
"cat.color": "Users with low vision or color blindness",
|
|
455
|
+
"cat.keyboard": "Keyboard-only users",
|
|
456
|
+
"cat.aria": "Screen reader users",
|
|
457
|
+
"cat.forms": "Screen reader users and voice control users",
|
|
458
|
+
"cat.structure": "Screen reader users navigating by headings or landmarks",
|
|
459
|
+
"cat.semantics": "Screen reader users",
|
|
460
|
+
"cat.text-alternatives": "Blind users relying on screen readers"
|
|
461
|
+
},
|
|
462
|
+
"wcagTagLabels": {
|
|
463
|
+
"wcag22aa": "WCAG 2.2 AA",
|
|
464
|
+
"wcag22a": "WCAG 2.2 A",
|
|
465
|
+
"wcag21aa": "WCAG 2.1 AA",
|
|
466
|
+
"wcag2aa": "WCAG 2.1 AA",
|
|
467
|
+
"wcag21a": "WCAG 2.1 A",
|
|
468
|
+
"wcag2a": "WCAG 2.1 A"
|
|
469
|
+
},
|
|
470
|
+
"wcagTagPrecedence": [
|
|
471
|
+
"wcag22aa",
|
|
472
|
+
"wcag22a",
|
|
473
|
+
"wcag21aa",
|
|
474
|
+
"wcag2aa",
|
|
475
|
+
"wcag21a",
|
|
476
|
+
"wcag2a"
|
|
477
|
+
],
|
|
478
|
+
"implicitRoles": {
|
|
479
|
+
"tagMap": {
|
|
480
|
+
"a": "link",
|
|
481
|
+
"button": "button",
|
|
482
|
+
"dialog": "dialog",
|
|
483
|
+
"select": "listbox",
|
|
484
|
+
"details": "group",
|
|
485
|
+
"summary": "group",
|
|
486
|
+
"table": "table",
|
|
487
|
+
"nav": "navigation",
|
|
488
|
+
"header": "banner",
|
|
489
|
+
"footer": "contentinfo",
|
|
490
|
+
"aside": "complementary",
|
|
491
|
+
"main": "main",
|
|
492
|
+
"form": "form",
|
|
493
|
+
"fieldset": "group",
|
|
494
|
+
"h1": "heading",
|
|
495
|
+
"h2": "heading",
|
|
496
|
+
"h3": "heading",
|
|
497
|
+
"h4": "heading",
|
|
498
|
+
"h5": "heading",
|
|
499
|
+
"h6": "heading"
|
|
500
|
+
},
|
|
501
|
+
"inputTypeMap": {
|
|
502
|
+
"checkbox": "checkbox",
|
|
503
|
+
"radio": "radio",
|
|
504
|
+
"range": "slider"
|
|
505
|
+
}
|
|
506
|
+
},
|
|
507
|
+
"personaMapping": {
|
|
508
|
+
"screenReader": {
|
|
509
|
+
"rules": [
|
|
510
|
+
"frame-title",
|
|
511
|
+
"aria-dialog-name",
|
|
512
|
+
"landmark-unique",
|
|
513
|
+
"aria-allowed-role",
|
|
514
|
+
"nested-interactive",
|
|
515
|
+
"aria-hidden-focus",
|
|
516
|
+
"aria-valid-attr"
|
|
517
|
+
],
|
|
518
|
+
"keywords": [
|
|
519
|
+
"screen reader",
|
|
520
|
+
"assistive technology",
|
|
521
|
+
"aria",
|
|
522
|
+
"label",
|
|
523
|
+
"announced"
|
|
524
|
+
]
|
|
525
|
+
},
|
|
526
|
+
"keyboard": {
|
|
527
|
+
"rules": [
|
|
528
|
+
"nested-interactive",
|
|
529
|
+
"scrollable-region-focusable",
|
|
530
|
+
"focus-order-semantics",
|
|
531
|
+
"tabindex"
|
|
532
|
+
],
|
|
533
|
+
"keywords": [
|
|
534
|
+
"keyboard",
|
|
535
|
+
"focusable",
|
|
536
|
+
"tab order",
|
|
537
|
+
"interactive"
|
|
538
|
+
]
|
|
539
|
+
},
|
|
540
|
+
"vision": {
|
|
541
|
+
"rules": [
|
|
542
|
+
"color-contrast",
|
|
543
|
+
"image-redundant-alt",
|
|
544
|
+
"image-alt"
|
|
545
|
+
],
|
|
546
|
+
"keywords": [
|
|
547
|
+
"vision",
|
|
548
|
+
"color",
|
|
549
|
+
"contrast",
|
|
550
|
+
"blind"
|
|
551
|
+
]
|
|
552
|
+
},
|
|
553
|
+
"cognitive": {
|
|
554
|
+
"rules": [
|
|
555
|
+
"heading-order",
|
|
556
|
+
"empty-heading",
|
|
557
|
+
"page-has-heading-one",
|
|
558
|
+
"duplicate-id"
|
|
559
|
+
],
|
|
560
|
+
"keywords": [
|
|
561
|
+
"cognitive",
|
|
562
|
+
"motor",
|
|
563
|
+
"heading",
|
|
564
|
+
"structure",
|
|
565
|
+
"navigation",
|
|
566
|
+
"hierarchy"
|
|
567
|
+
]
|
|
568
|
+
}
|
|
569
|
+
},
|
|
570
|
+
"personaConfig": {
|
|
571
|
+
"screenReader": {
|
|
572
|
+
"label": "Screen Readers",
|
|
573
|
+
"icon": "<svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>"
|
|
574
|
+
},
|
|
575
|
+
"keyboard": {
|
|
576
|
+
"label": "Keyboard Only",
|
|
577
|
+
"icon": "<svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M3 10h18M7 15h1m4 0h1m4 0h1m-7 4h4M5 5h14a2 2 0 012 2v10a2 2 0 01-2 2H5a2 2 0 01-2-2V7a2 2 0 012-2z\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>"
|
|
578
|
+
},
|
|
579
|
+
"vision": {
|
|
580
|
+
"label": "Color/Low Vision",
|
|
581
|
+
"icon": "<svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>"
|
|
582
|
+
},
|
|
583
|
+
"cognitive": {
|
|
584
|
+
"label": "Cognitive/Motor",
|
|
585
|
+
"icon": "<svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>"
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
}
|