@binclusive/a11y 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.
Files changed (80) hide show
  1. package/README.md +285 -0
  2. package/bin/a11y.mjs +36 -0
  3. package/bin/diff-scope.mjs +29 -0
  4. package/data/baseline-rules.json +892 -0
  5. package/package.json +68 -0
  6. package/src/agent-lane.ts +138 -0
  7. package/src/agents-block.ts +157 -0
  8. package/src/baseline/gen-baseline.ts +166 -0
  9. package/src/cli.ts +1026 -0
  10. package/src/collect-dom.ts +119 -0
  11. package/src/collect-liquid.ts +103 -0
  12. package/src/collect-swift.ts +227 -0
  13. package/src/collect-unity.ts +99 -0
  14. package/src/collect.ts +54 -0
  15. package/src/commands.ts +314 -0
  16. package/src/config-scan.ts +177 -0
  17. package/src/contract.ts +355 -0
  18. package/src/core.ts +546 -0
  19. package/src/detect-stack.ts +207 -0
  20. package/src/diff-scope-cli.ts +12 -0
  21. package/src/diff-scope.ts +150 -0
  22. package/src/emit-contract.ts +181 -0
  23. package/src/enforce.ts +1125 -0
  24. package/src/eslint-plugin-jsx-a11y.d.ts +11 -0
  25. package/src/evidence.ts +308 -0
  26. package/src/github-identity.ts +201 -0
  27. package/src/hook.ts +242 -0
  28. package/src/impact-gate.ts +107 -0
  29. package/src/imports-resolve.ts +248 -0
  30. package/src/index.ts +183 -0
  31. package/src/liquid-ast.ts +203 -0
  32. package/src/liquid-rules.ts +691 -0
  33. package/src/mcp.ts +363 -0
  34. package/src/module-scope.ts +137 -0
  35. package/src/phone-home.ts +470 -0
  36. package/src/pr-comment.ts +250 -0
  37. package/src/pr-summary-cli.ts +182 -0
  38. package/src/pr-summary.ts +291 -0
  39. package/src/registry.ts +605 -0
  40. package/src/reporter/contract.ts +154 -0
  41. package/src/reporter/finding.ts +87 -0
  42. package/src/reporter/github-adapter.ts +183 -0
  43. package/src/reporter/null-adapter.ts +51 -0
  44. package/src/reporter/registry.ts +22 -0
  45. package/src/reporter-cli.ts +48 -0
  46. package/src/resolve-components.ts +579 -0
  47. package/src/runner/budget.ts +90 -0
  48. package/src/runner/codegraph-lookup.test.ts +93 -0
  49. package/src/runner/codegraph-lookup.ts +197 -0
  50. package/src/runner/index.ts +86 -0
  51. package/src/runner/lookup.ts +69 -0
  52. package/src/runner/provider.ts +72 -0
  53. package/src/runner/providers/anthropic.ts +168 -0
  54. package/src/runner/providers/openai.ts +191 -0
  55. package/src/runner/reasoner.ts +73 -0
  56. package/src/runner/reasoning/index.ts +53 -0
  57. package/src/runner/reasoning/prompt.ts +200 -0
  58. package/src/runner/reasoning/react.ts +149 -0
  59. package/src/runner/reasoning/shopify.ts +214 -0
  60. package/src/runner/reasoning/skills-reasoner.ts +117 -0
  61. package/src/runner/reasoning/types.ts +99 -0
  62. package/src/runner/runner.ts +203 -0
  63. package/src/sarif.ts +148 -0
  64. package/src/source-identity.ts +0 -0
  65. package/src/source-trace.ts +814 -0
  66. package/src/suggest.ts +328 -0
  67. package/src/suppression-ranges.ts +354 -0
  68. package/src/suppressor-map.ts +189 -0
  69. package/src/suppressors.ts +284 -0
  70. package/src/tsconfig-aliases.ts +155 -0
  71. package/src/unity-ast.ts +331 -0
  72. package/src/unity-findings.ts +91 -0
  73. package/src/unity-guid-registry.ts +82 -0
  74. package/src/unity-label-resolve.ts +249 -0
  75. package/src/unity-rule-color-only.ts +127 -0
  76. package/src/unity-rule-missing-label.ts +156 -0
  77. package/src/unity-rules-baseline.ts +273 -0
  78. package/src/wcag-map.ts +35 -0
  79. package/src/wcag-tags.ts +35 -0
  80. package/src/workspace-resolve.ts +405 -0
@@ -0,0 +1,892 @@
1
+ {
2
+ "_meta": {
3
+ "note": "BASELINE rule catalog — coverage layer, NOT audit-frequency data. Generated mechanically from axe-core's published per-rule metadata (getRules() + axe._audit.rules[].impact). Covers every axe/WCAG rule with a WCAG SC, axe's default impact, a standard fix (help), and a helpUrl. Carries NO org count and NO frequency tier — those live only in the corpus snapshot (the real-audit moat). Regenerate with `pnpm gen:baseline`.",
4
+ "source": "axe-core getRules() + axe._audit.rules[].impact",
5
+ "axeVersion": "4.11.4",
6
+ "ruleCount": 104
7
+ },
8
+ "rules": [
9
+ {
10
+ "ruleId": "accesskeys",
11
+ "sc": [],
12
+ "impact": "serious",
13
+ "help": "accesskey attribute value should be unique",
14
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/accesskeys?application=axeAPI"
15
+ },
16
+ {
17
+ "ruleId": "area-alt",
18
+ "sc": [
19
+ "2.4.4",
20
+ "4.1.2"
21
+ ],
22
+ "impact": "critical",
23
+ "help": "Active <area> elements must have alternative text",
24
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/area-alt?application=axeAPI"
25
+ },
26
+ {
27
+ "ruleId": "aria-allowed-attr",
28
+ "sc": [
29
+ "4.1.2"
30
+ ],
31
+ "impact": "critical",
32
+ "help": "Elements must only use supported ARIA attributes",
33
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-allowed-attr?application=axeAPI"
34
+ },
35
+ {
36
+ "ruleId": "aria-allowed-role",
37
+ "sc": [],
38
+ "impact": "minor",
39
+ "help": "ARIA role should be appropriate for the element",
40
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-allowed-role?application=axeAPI"
41
+ },
42
+ {
43
+ "ruleId": "aria-braille-equivalent",
44
+ "sc": [
45
+ "4.1.2"
46
+ ],
47
+ "impact": "serious",
48
+ "help": "aria-braille attributes must have a non-braille equivalent",
49
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-braille-equivalent?application=axeAPI"
50
+ },
51
+ {
52
+ "ruleId": "aria-command-name",
53
+ "sc": [
54
+ "4.1.2"
55
+ ],
56
+ "impact": "serious",
57
+ "help": "ARIA commands must have an accessible name",
58
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-command-name?application=axeAPI"
59
+ },
60
+ {
61
+ "ruleId": "aria-conditional-attr",
62
+ "sc": [
63
+ "4.1.2"
64
+ ],
65
+ "impact": "serious",
66
+ "help": "ARIA attributes must be used as specified for the element's role",
67
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-conditional-attr?application=axeAPI"
68
+ },
69
+ {
70
+ "ruleId": "aria-deprecated-role",
71
+ "sc": [
72
+ "4.1.2"
73
+ ],
74
+ "impact": "minor",
75
+ "help": "Deprecated ARIA roles must not be used",
76
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-deprecated-role?application=axeAPI"
77
+ },
78
+ {
79
+ "ruleId": "aria-dialog-name",
80
+ "sc": [],
81
+ "impact": "serious",
82
+ "help": "ARIA dialog and alertdialog nodes should have an accessible name",
83
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-dialog-name?application=axeAPI"
84
+ },
85
+ {
86
+ "ruleId": "aria-hidden-body",
87
+ "sc": [
88
+ "1.3.1",
89
+ "4.1.2"
90
+ ],
91
+ "impact": "critical",
92
+ "help": "aria-hidden=\"true\" must not be present on the document body",
93
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-hidden-body?application=axeAPI"
94
+ },
95
+ {
96
+ "ruleId": "aria-hidden-focus",
97
+ "sc": [
98
+ "4.1.2"
99
+ ],
100
+ "impact": "serious",
101
+ "help": "ARIA hidden element must not be focusable or contain focusable elements",
102
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-hidden-focus?application=axeAPI"
103
+ },
104
+ {
105
+ "ruleId": "aria-input-field-name",
106
+ "sc": [
107
+ "4.1.2"
108
+ ],
109
+ "impact": "serious",
110
+ "help": "ARIA input fields must have an accessible name",
111
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-input-field-name?application=axeAPI"
112
+ },
113
+ {
114
+ "ruleId": "aria-meter-name",
115
+ "sc": [
116
+ "1.1.1"
117
+ ],
118
+ "impact": "serious",
119
+ "help": "ARIA meter nodes must have an accessible name",
120
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-meter-name?application=axeAPI"
121
+ },
122
+ {
123
+ "ruleId": "aria-progressbar-name",
124
+ "sc": [
125
+ "1.1.1"
126
+ ],
127
+ "impact": "serious",
128
+ "help": "ARIA progressbar nodes must have an accessible name",
129
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-progressbar-name?application=axeAPI"
130
+ },
131
+ {
132
+ "ruleId": "aria-prohibited-attr",
133
+ "sc": [
134
+ "4.1.2"
135
+ ],
136
+ "impact": "serious",
137
+ "help": "Elements must only use permitted ARIA attributes",
138
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-prohibited-attr?application=axeAPI"
139
+ },
140
+ {
141
+ "ruleId": "aria-required-attr",
142
+ "sc": [
143
+ "4.1.2"
144
+ ],
145
+ "impact": "critical",
146
+ "help": "Required ARIA attributes must be provided",
147
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-required-attr?application=axeAPI"
148
+ },
149
+ {
150
+ "ruleId": "aria-required-children",
151
+ "sc": [
152
+ "1.3.1"
153
+ ],
154
+ "impact": "critical",
155
+ "help": "Certain ARIA roles must contain particular children",
156
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-required-children?application=axeAPI"
157
+ },
158
+ {
159
+ "ruleId": "aria-required-parent",
160
+ "sc": [
161
+ "1.3.1"
162
+ ],
163
+ "impact": "critical",
164
+ "help": "Certain ARIA roles must be contained by particular parents",
165
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-required-parent?application=axeAPI"
166
+ },
167
+ {
168
+ "ruleId": "aria-roledescription",
169
+ "sc": [
170
+ "4.1.2"
171
+ ],
172
+ "impact": "serious",
173
+ "help": "aria-roledescription must be on elements with a semantic role",
174
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-roledescription?application=axeAPI"
175
+ },
176
+ {
177
+ "ruleId": "aria-roles",
178
+ "sc": [
179
+ "4.1.2"
180
+ ],
181
+ "impact": "critical",
182
+ "help": "ARIA roles used must conform to valid values",
183
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-roles?application=axeAPI"
184
+ },
185
+ {
186
+ "ruleId": "aria-text",
187
+ "sc": [],
188
+ "impact": "serious",
189
+ "help": "\"role=text\" should have no focusable descendants",
190
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-text?application=axeAPI"
191
+ },
192
+ {
193
+ "ruleId": "aria-toggle-field-name",
194
+ "sc": [
195
+ "4.1.2"
196
+ ],
197
+ "impact": "serious",
198
+ "help": "ARIA toggle fields must have an accessible name",
199
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-toggle-field-name?application=axeAPI"
200
+ },
201
+ {
202
+ "ruleId": "aria-tooltip-name",
203
+ "sc": [
204
+ "4.1.2"
205
+ ],
206
+ "impact": "serious",
207
+ "help": "ARIA tooltip nodes must have an accessible name",
208
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-tooltip-name?application=axeAPI"
209
+ },
210
+ {
211
+ "ruleId": "aria-treeitem-name",
212
+ "sc": [],
213
+ "impact": "serious",
214
+ "help": "ARIA treeitem nodes should have an accessible name",
215
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-treeitem-name?application=axeAPI"
216
+ },
217
+ {
218
+ "ruleId": "aria-valid-attr",
219
+ "sc": [
220
+ "4.1.2"
221
+ ],
222
+ "impact": "critical",
223
+ "help": "ARIA attributes must conform to valid names",
224
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-valid-attr?application=axeAPI"
225
+ },
226
+ {
227
+ "ruleId": "aria-valid-attr-value",
228
+ "sc": [
229
+ "4.1.2"
230
+ ],
231
+ "impact": "critical",
232
+ "help": "ARIA attributes must conform to valid values",
233
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/aria-valid-attr-value?application=axeAPI"
234
+ },
235
+ {
236
+ "ruleId": "audio-caption",
237
+ "sc": [
238
+ "1.2.1"
239
+ ],
240
+ "impact": "critical",
241
+ "help": "<audio> elements must have a captions track",
242
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/audio-caption?application=axeAPI"
243
+ },
244
+ {
245
+ "ruleId": "autocomplete-valid",
246
+ "sc": [
247
+ "1.3.5"
248
+ ],
249
+ "impact": "serious",
250
+ "help": "autocomplete attribute must be used correctly",
251
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/autocomplete-valid?application=axeAPI"
252
+ },
253
+ {
254
+ "ruleId": "avoid-inline-spacing",
255
+ "sc": [
256
+ "1.4.12"
257
+ ],
258
+ "impact": "serious",
259
+ "help": "Inline text spacing must be adjustable with custom stylesheets",
260
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/avoid-inline-spacing?application=axeAPI"
261
+ },
262
+ {
263
+ "ruleId": "blink",
264
+ "sc": [
265
+ "2.2.2"
266
+ ],
267
+ "impact": "serious",
268
+ "help": "<blink> elements are deprecated and must not be used",
269
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/blink?application=axeAPI"
270
+ },
271
+ {
272
+ "ruleId": "button-name",
273
+ "sc": [
274
+ "4.1.2"
275
+ ],
276
+ "impact": "critical",
277
+ "help": "Buttons must have discernible text",
278
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/button-name?application=axeAPI"
279
+ },
280
+ {
281
+ "ruleId": "bypass",
282
+ "sc": [
283
+ "2.4.1"
284
+ ],
285
+ "impact": "serious",
286
+ "help": "Page must have means to bypass repeated blocks",
287
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/bypass?application=axeAPI"
288
+ },
289
+ {
290
+ "ruleId": "color-contrast",
291
+ "sc": [
292
+ "1.4.3"
293
+ ],
294
+ "impact": "serious",
295
+ "help": "Elements must meet minimum color contrast ratio thresholds",
296
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/color-contrast?application=axeAPI"
297
+ },
298
+ {
299
+ "ruleId": "color-contrast-enhanced",
300
+ "sc": [
301
+ "1.4.6"
302
+ ],
303
+ "impact": "serious",
304
+ "help": "Elements must meet enhanced color contrast ratio thresholds",
305
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/color-contrast-enhanced?application=axeAPI"
306
+ },
307
+ {
308
+ "ruleId": "css-orientation-lock",
309
+ "sc": [
310
+ "1.3.4"
311
+ ],
312
+ "impact": "serious",
313
+ "help": "CSS Media queries must not lock display orientation",
314
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/css-orientation-lock?application=axeAPI"
315
+ },
316
+ {
317
+ "ruleId": "definition-list",
318
+ "sc": [
319
+ "1.3.1"
320
+ ],
321
+ "impact": "serious",
322
+ "help": "<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script>, <template> or <div> elements",
323
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/definition-list?application=axeAPI"
324
+ },
325
+ {
326
+ "ruleId": "dlitem",
327
+ "sc": [
328
+ "1.3.1"
329
+ ],
330
+ "impact": "serious",
331
+ "help": "<dt> and <dd> elements must be contained by a <dl>",
332
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/dlitem?application=axeAPI"
333
+ },
334
+ {
335
+ "ruleId": "document-title",
336
+ "sc": [
337
+ "2.4.2"
338
+ ],
339
+ "impact": "serious",
340
+ "help": "Documents must have <title> element to aid in navigation",
341
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/document-title?application=axeAPI"
342
+ },
343
+ {
344
+ "ruleId": "duplicate-id",
345
+ "sc": [
346
+ "4.1.1"
347
+ ],
348
+ "impact": "minor",
349
+ "help": "id attribute value must be unique",
350
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/duplicate-id?application=axeAPI"
351
+ },
352
+ {
353
+ "ruleId": "duplicate-id-active",
354
+ "sc": [
355
+ "4.1.1"
356
+ ],
357
+ "impact": "serious",
358
+ "help": "IDs of active elements must be unique",
359
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/duplicate-id-active?application=axeAPI"
360
+ },
361
+ {
362
+ "ruleId": "duplicate-id-aria",
363
+ "sc": [
364
+ "4.1.2"
365
+ ],
366
+ "impact": "critical",
367
+ "help": "IDs used in ARIA and labels must be unique",
368
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/duplicate-id-aria?application=axeAPI"
369
+ },
370
+ {
371
+ "ruleId": "empty-heading",
372
+ "sc": [],
373
+ "impact": "minor",
374
+ "help": "Headings should not be empty",
375
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/empty-heading?application=axeAPI"
376
+ },
377
+ {
378
+ "ruleId": "empty-table-header",
379
+ "sc": [],
380
+ "impact": "minor",
381
+ "help": "Table header text should not be empty",
382
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/empty-table-header?application=axeAPI"
383
+ },
384
+ {
385
+ "ruleId": "focus-order-semantics",
386
+ "sc": [],
387
+ "impact": "minor",
388
+ "help": "Elements in the focus order should have an appropriate role",
389
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/focus-order-semantics?application=axeAPI"
390
+ },
391
+ {
392
+ "ruleId": "form-field-multiple-labels",
393
+ "sc": [
394
+ "3.3.2"
395
+ ],
396
+ "impact": "moderate",
397
+ "help": "Form field must not have multiple label elements",
398
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/form-field-multiple-labels?application=axeAPI"
399
+ },
400
+ {
401
+ "ruleId": "frame-focusable-content",
402
+ "sc": [
403
+ "2.1.1"
404
+ ],
405
+ "impact": "serious",
406
+ "help": "Frames with focusable content must not have tabindex=-1",
407
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/frame-focusable-content?application=axeAPI"
408
+ },
409
+ {
410
+ "ruleId": "frame-tested",
411
+ "sc": [],
412
+ "impact": "critical",
413
+ "help": "Frames should be tested with axe-core",
414
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/frame-tested?application=axeAPI"
415
+ },
416
+ {
417
+ "ruleId": "frame-title",
418
+ "sc": [
419
+ "4.1.2"
420
+ ],
421
+ "impact": "serious",
422
+ "help": "Frames must have an accessible name",
423
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/frame-title?application=axeAPI"
424
+ },
425
+ {
426
+ "ruleId": "frame-title-unique",
427
+ "sc": [
428
+ "4.1.2"
429
+ ],
430
+ "impact": "serious",
431
+ "help": "Frames must have a unique title attribute",
432
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/frame-title-unique?application=axeAPI"
433
+ },
434
+ {
435
+ "ruleId": "heading-order",
436
+ "sc": [],
437
+ "impact": "moderate",
438
+ "help": "Heading levels should only increase by one",
439
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/heading-order?application=axeAPI"
440
+ },
441
+ {
442
+ "ruleId": "hidden-content",
443
+ "sc": [],
444
+ "impact": "minor",
445
+ "help": "Hidden content on the page should be analyzed",
446
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/hidden-content?application=axeAPI"
447
+ },
448
+ {
449
+ "ruleId": "html-has-lang",
450
+ "sc": [
451
+ "3.1.1"
452
+ ],
453
+ "impact": "serious",
454
+ "help": "<html> element must have a lang attribute",
455
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/html-has-lang?application=axeAPI"
456
+ },
457
+ {
458
+ "ruleId": "html-lang-valid",
459
+ "sc": [
460
+ "3.1.1"
461
+ ],
462
+ "impact": "serious",
463
+ "help": "<html> element must have a valid value for the lang attribute",
464
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/html-lang-valid?application=axeAPI"
465
+ },
466
+ {
467
+ "ruleId": "html-xml-lang-mismatch",
468
+ "sc": [
469
+ "3.1.1"
470
+ ],
471
+ "impact": "moderate",
472
+ "help": "HTML elements with lang and xml:lang must have the same base language",
473
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/html-xml-lang-mismatch?application=axeAPI"
474
+ },
475
+ {
476
+ "ruleId": "identical-links-same-purpose",
477
+ "sc": [
478
+ "2.4.9"
479
+ ],
480
+ "impact": "minor",
481
+ "help": "Links with the same name must have a similar purpose",
482
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/identical-links-same-purpose?application=axeAPI"
483
+ },
484
+ {
485
+ "ruleId": "image-alt",
486
+ "sc": [
487
+ "1.1.1"
488
+ ],
489
+ "impact": "critical",
490
+ "help": "Images must have alternative text",
491
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/image-alt?application=axeAPI"
492
+ },
493
+ {
494
+ "ruleId": "image-redundant-alt",
495
+ "sc": [],
496
+ "impact": "minor",
497
+ "help": "Alternative text of images should not be repeated as text",
498
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/image-redundant-alt?application=axeAPI"
499
+ },
500
+ {
501
+ "ruleId": "input-button-name",
502
+ "sc": [
503
+ "4.1.2"
504
+ ],
505
+ "impact": "critical",
506
+ "help": "Input buttons must have discernible text",
507
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/input-button-name?application=axeAPI"
508
+ },
509
+ {
510
+ "ruleId": "input-image-alt",
511
+ "sc": [
512
+ "1.1.1",
513
+ "4.1.2"
514
+ ],
515
+ "impact": "critical",
516
+ "help": "Image buttons must have alternative text",
517
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/input-image-alt?application=axeAPI"
518
+ },
519
+ {
520
+ "ruleId": "label",
521
+ "sc": [
522
+ "4.1.2"
523
+ ],
524
+ "impact": "critical",
525
+ "help": "Form elements must have labels",
526
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/label?application=axeAPI"
527
+ },
528
+ {
529
+ "ruleId": "label-content-name-mismatch",
530
+ "sc": [
531
+ "2.5.3"
532
+ ],
533
+ "impact": "serious",
534
+ "help": "Elements must have their visible text as part of their accessible name",
535
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/label-content-name-mismatch?application=axeAPI"
536
+ },
537
+ {
538
+ "ruleId": "label-title-only",
539
+ "sc": [],
540
+ "impact": "serious",
541
+ "help": "Form elements should have a visible label",
542
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/label-title-only?application=axeAPI"
543
+ },
544
+ {
545
+ "ruleId": "landmark-banner-is-top-level",
546
+ "sc": [],
547
+ "impact": "moderate",
548
+ "help": "Banner landmark should not be contained in another landmark",
549
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/landmark-banner-is-top-level?application=axeAPI"
550
+ },
551
+ {
552
+ "ruleId": "landmark-complementary-is-top-level",
553
+ "sc": [],
554
+ "impact": "moderate",
555
+ "help": "Aside should not be contained in another landmark",
556
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/landmark-complementary-is-top-level?application=axeAPI"
557
+ },
558
+ {
559
+ "ruleId": "landmark-contentinfo-is-top-level",
560
+ "sc": [],
561
+ "impact": "moderate",
562
+ "help": "Contentinfo landmark should not be contained in another landmark",
563
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/landmark-contentinfo-is-top-level?application=axeAPI"
564
+ },
565
+ {
566
+ "ruleId": "landmark-main-is-top-level",
567
+ "sc": [],
568
+ "impact": "moderate",
569
+ "help": "Main landmark should not be contained in another landmark",
570
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/landmark-main-is-top-level?application=axeAPI"
571
+ },
572
+ {
573
+ "ruleId": "landmark-no-duplicate-banner",
574
+ "sc": [],
575
+ "impact": "moderate",
576
+ "help": "Document should not have more than one banner landmark",
577
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/landmark-no-duplicate-banner?application=axeAPI"
578
+ },
579
+ {
580
+ "ruleId": "landmark-no-duplicate-contentinfo",
581
+ "sc": [],
582
+ "impact": "moderate",
583
+ "help": "Document should not have more than one contentinfo landmark",
584
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/landmark-no-duplicate-contentinfo?application=axeAPI"
585
+ },
586
+ {
587
+ "ruleId": "landmark-no-duplicate-main",
588
+ "sc": [],
589
+ "impact": "moderate",
590
+ "help": "Document should not have more than one main landmark",
591
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/landmark-no-duplicate-main?application=axeAPI"
592
+ },
593
+ {
594
+ "ruleId": "landmark-one-main",
595
+ "sc": [],
596
+ "impact": "moderate",
597
+ "help": "Document should have one main landmark",
598
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/landmark-one-main?application=axeAPI"
599
+ },
600
+ {
601
+ "ruleId": "landmark-unique",
602
+ "sc": [],
603
+ "impact": "moderate",
604
+ "help": "Landmarks should have a unique role or role/label/title (i.e. accessible name) combination",
605
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/landmark-unique?application=axeAPI"
606
+ },
607
+ {
608
+ "ruleId": "link-in-text-block",
609
+ "sc": [
610
+ "1.4.1"
611
+ ],
612
+ "impact": "serious",
613
+ "help": "Links must be distinguishable without relying on color",
614
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/link-in-text-block?application=axeAPI"
615
+ },
616
+ {
617
+ "ruleId": "link-name",
618
+ "sc": [
619
+ "2.4.4",
620
+ "4.1.2"
621
+ ],
622
+ "impact": "serious",
623
+ "help": "Links must have discernible text",
624
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/link-name?application=axeAPI"
625
+ },
626
+ {
627
+ "ruleId": "list",
628
+ "sc": [
629
+ "1.3.1"
630
+ ],
631
+ "impact": "serious",
632
+ "help": "<ul> and <ol> must only directly contain <li>, <script> or <template> elements",
633
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/list?application=axeAPI"
634
+ },
635
+ {
636
+ "ruleId": "listitem",
637
+ "sc": [
638
+ "1.3.1"
639
+ ],
640
+ "impact": "serious",
641
+ "help": "<li> elements must be contained in a <ul> or <ol>",
642
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/listitem?application=axeAPI"
643
+ },
644
+ {
645
+ "ruleId": "marquee",
646
+ "sc": [
647
+ "2.2.2"
648
+ ],
649
+ "impact": "serious",
650
+ "help": "<marquee> elements are deprecated and must not be used",
651
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/marquee?application=axeAPI"
652
+ },
653
+ {
654
+ "ruleId": "meta-refresh",
655
+ "sc": [
656
+ "2.2.1"
657
+ ],
658
+ "impact": "critical",
659
+ "help": "Delayed refresh under 20 hours must not be used",
660
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/meta-refresh?application=axeAPI"
661
+ },
662
+ {
663
+ "ruleId": "meta-refresh-no-exceptions",
664
+ "sc": [
665
+ "2.2.4",
666
+ "3.2.5"
667
+ ],
668
+ "impact": "minor",
669
+ "help": "Delayed refresh must not be used",
670
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/meta-refresh-no-exceptions?application=axeAPI"
671
+ },
672
+ {
673
+ "ruleId": "meta-viewport",
674
+ "sc": [
675
+ "1.4.4"
676
+ ],
677
+ "impact": "moderate",
678
+ "help": "Zooming and scaling must not be disabled",
679
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/meta-viewport?application=axeAPI"
680
+ },
681
+ {
682
+ "ruleId": "meta-viewport-large",
683
+ "sc": [],
684
+ "impact": "minor",
685
+ "help": "Users should be able to zoom and scale the text up to 500%",
686
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/meta-viewport-large?application=axeAPI"
687
+ },
688
+ {
689
+ "ruleId": "nested-interactive",
690
+ "sc": [
691
+ "4.1.2"
692
+ ],
693
+ "impact": "serious",
694
+ "help": "Interactive controls must not be nested",
695
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/nested-interactive?application=axeAPI"
696
+ },
697
+ {
698
+ "ruleId": "no-autoplay-audio",
699
+ "sc": [
700
+ "1.4.2"
701
+ ],
702
+ "impact": "moderate",
703
+ "help": "<video> or <audio> elements must not play automatically",
704
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/no-autoplay-audio?application=axeAPI"
705
+ },
706
+ {
707
+ "ruleId": "object-alt",
708
+ "sc": [
709
+ "1.1.1"
710
+ ],
711
+ "impact": "serious",
712
+ "help": "<object> elements must have alternative text",
713
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/object-alt?application=axeAPI"
714
+ },
715
+ {
716
+ "ruleId": "p-as-heading",
717
+ "sc": [
718
+ "1.3.1"
719
+ ],
720
+ "impact": "serious",
721
+ "help": "Styled <p> elements must not be used as headings",
722
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/p-as-heading?application=axeAPI"
723
+ },
724
+ {
725
+ "ruleId": "page-has-heading-one",
726
+ "sc": [],
727
+ "impact": "moderate",
728
+ "help": "Page should contain a level-one heading",
729
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/page-has-heading-one?application=axeAPI"
730
+ },
731
+ {
732
+ "ruleId": "presentation-role-conflict",
733
+ "sc": [],
734
+ "impact": "minor",
735
+ "help": "Elements marked as presentational should be consistently ignored",
736
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/presentation-role-conflict?application=axeAPI"
737
+ },
738
+ {
739
+ "ruleId": "region",
740
+ "sc": [],
741
+ "impact": "moderate",
742
+ "help": "All page content should be contained by landmarks",
743
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/region?application=axeAPI"
744
+ },
745
+ {
746
+ "ruleId": "role-img-alt",
747
+ "sc": [
748
+ "1.1.1"
749
+ ],
750
+ "impact": "serious",
751
+ "help": "[role=\"img\"] elements must have alternative text",
752
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/role-img-alt?application=axeAPI"
753
+ },
754
+ {
755
+ "ruleId": "scope-attr-valid",
756
+ "sc": [],
757
+ "impact": "moderate",
758
+ "help": "scope attribute should be used correctly",
759
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/scope-attr-valid?application=axeAPI"
760
+ },
761
+ {
762
+ "ruleId": "scrollable-region-focusable",
763
+ "sc": [
764
+ "2.1.1",
765
+ "2.1.3"
766
+ ],
767
+ "impact": "serious",
768
+ "help": "Scrollable region must have keyboard access",
769
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/scrollable-region-focusable?application=axeAPI"
770
+ },
771
+ {
772
+ "ruleId": "select-name",
773
+ "sc": [
774
+ "4.1.2"
775
+ ],
776
+ "impact": "critical",
777
+ "help": "Select element must have an accessible name",
778
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/select-name?application=axeAPI"
779
+ },
780
+ {
781
+ "ruleId": "server-side-image-map",
782
+ "sc": [
783
+ "2.1.1"
784
+ ],
785
+ "impact": "minor",
786
+ "help": "Server-side image maps must not be used",
787
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/server-side-image-map?application=axeAPI"
788
+ },
789
+ {
790
+ "ruleId": "skip-link",
791
+ "sc": [],
792
+ "impact": "moderate",
793
+ "help": "The skip-link target should exist and be focusable",
794
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/skip-link?application=axeAPI"
795
+ },
796
+ {
797
+ "ruleId": "summary-name",
798
+ "sc": [
799
+ "4.1.2"
800
+ ],
801
+ "impact": "serious",
802
+ "help": "Summary elements must have discernible text",
803
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/summary-name?application=axeAPI"
804
+ },
805
+ {
806
+ "ruleId": "svg-img-alt",
807
+ "sc": [
808
+ "1.1.1"
809
+ ],
810
+ "impact": "serious",
811
+ "help": "<svg> elements with an img role must have alternative text",
812
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/svg-img-alt?application=axeAPI"
813
+ },
814
+ {
815
+ "ruleId": "tabindex",
816
+ "sc": [],
817
+ "impact": "serious",
818
+ "help": "Elements should not have tabindex greater than zero",
819
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/tabindex?application=axeAPI"
820
+ },
821
+ {
822
+ "ruleId": "table-duplicate-name",
823
+ "sc": [],
824
+ "impact": "minor",
825
+ "help": "Tables should not have the same summary and caption",
826
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/table-duplicate-name?application=axeAPI"
827
+ },
828
+ {
829
+ "ruleId": "table-fake-caption",
830
+ "sc": [
831
+ "1.3.1"
832
+ ],
833
+ "impact": "serious",
834
+ "help": "Data or header cells must not be used to give caption to a data table.",
835
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/table-fake-caption?application=axeAPI"
836
+ },
837
+ {
838
+ "ruleId": "target-size",
839
+ "sc": [
840
+ "2.5.8"
841
+ ],
842
+ "impact": "serious",
843
+ "help": "All touch targets must be 24px large, or leave sufficient space",
844
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/target-size?application=axeAPI"
845
+ },
846
+ {
847
+ "ruleId": "td-has-header",
848
+ "sc": [
849
+ "1.3.1"
850
+ ],
851
+ "impact": "critical",
852
+ "help": "Non-empty <td> elements in larger <table> must have an associated table header",
853
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/td-has-header?application=axeAPI"
854
+ },
855
+ {
856
+ "ruleId": "td-headers-attr",
857
+ "sc": [
858
+ "1.3.1"
859
+ ],
860
+ "impact": "serious",
861
+ "help": "Table cell headers attributes must refer to other <th> elements in the same table",
862
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/td-headers-attr?application=axeAPI"
863
+ },
864
+ {
865
+ "ruleId": "th-has-data-cells",
866
+ "sc": [
867
+ "1.3.1"
868
+ ],
869
+ "impact": "serious",
870
+ "help": "Table headers in a data table must refer to data cells",
871
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/th-has-data-cells?application=axeAPI"
872
+ },
873
+ {
874
+ "ruleId": "valid-lang",
875
+ "sc": [
876
+ "3.1.2"
877
+ ],
878
+ "impact": "serious",
879
+ "help": "lang attribute must have a valid value",
880
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/valid-lang?application=axeAPI"
881
+ },
882
+ {
883
+ "ruleId": "video-caption",
884
+ "sc": [
885
+ "1.2.2"
886
+ ],
887
+ "impact": "critical",
888
+ "help": "<video> elements must have captions",
889
+ "helpUrl": "https://dequeuniversity.com/rules/axe/4.11/video-caption?application=axeAPI"
890
+ }
891
+ ]
892
+ }