@surea11y/core 1.1.2 → 1.3.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 (160) hide show
  1. package/CHANGELOG.md +48 -4
  2. package/LICENSE +373 -21
  3. package/README.md +70 -1
  4. package/bin/core.js +240 -11
  5. package/docs/API_STABILITY.md +61 -0
  6. package/docs/BASELINE.md +66 -0
  7. package/docs/BINDING_AUTHORS_GUIDE.md +9 -9
  8. package/docs/CI_INTEGRATIONS.md +103 -0
  9. package/docs/CLI.md +80 -1
  10. package/docs/ENGINE_OPTIONS.md +4 -0
  11. package/docs/INTEGRATION.md +19 -1
  12. package/docs/OUTPUT_SCHEMA.md +2 -2
  13. package/docs/REPORT.md +33 -0
  14. package/docs/RULE_AUTHORING.md +31 -0
  15. package/docs/RULE_CATALOG.md +1 -1
  16. package/docs/SARIF.md +59 -0
  17. package/package.json +15 -4
  18. package/src/baseline.js +0 -0
  19. package/src/catalogs/composites.wcag.js +414 -450
  20. package/src/checks/automatic/area-alt-present.js +59 -25
  21. package/src/checks/automatic/aria-allowed-attr.js +193 -33
  22. package/src/checks/automatic/aria-allowed-role.js +21 -7
  23. package/src/checks/automatic/aria-braille-equivalent.js +32 -10
  24. package/src/checks/automatic/aria-conditional-attr.js +24 -7
  25. package/src/checks/automatic/aria-deprecated-role.js +22 -8
  26. package/src/checks/automatic/aria-hidden-body.js +50 -19
  27. package/src/checks/automatic/aria-hidden-focus.js +408 -53
  28. package/src/checks/automatic/aria-prohibited-attr.js +296 -22
  29. package/src/checks/automatic/aria-prohibited-children.js +125 -29
  30. package/src/checks/automatic/aria-required-attr.js +23 -8
  31. package/src/checks/automatic/aria-required-children.js +37 -14
  32. package/src/checks/automatic/aria-required-parent.js +48 -14
  33. package/src/checks/automatic/aria-role-name-present.js +47 -21
  34. package/src/checks/automatic/aria-roles-valid.js +22 -12
  35. package/src/checks/automatic/aria-valid-attr-value.js +28 -7
  36. package/src/checks/automatic/aria-valid-attr.js +17 -5
  37. package/src/checks/automatic/autocomplete-valid.js +74 -16
  38. package/src/checks/automatic/avoid-inline-spacing.js +20 -6
  39. package/src/checks/automatic/binary-control-name-present.js +60 -50
  40. package/src/checks/automatic/button-name-present.js +48 -18
  41. package/src/checks/automatic/bypass-blocks-present.js +50 -25
  42. package/src/checks/automatic/canvas-text-alternative-present.js +57 -26
  43. package/src/checks/automatic/combobox-name-present.js +38 -45
  44. package/src/checks/automatic/contrast-computable.js +361 -341
  45. package/src/checks/automatic/contrast-enhanced.js +487 -466
  46. package/src/checks/automatic/contrast-minimum.js +486 -465
  47. package/src/checks/automatic/css-orientation-lock.js +39 -9
  48. package/src/checks/automatic/definition-list-children-valid.js +40 -19
  49. package/src/checks/automatic/deprecated-elements-not-used.js +21 -7
  50. package/src/checks/automatic/dialog-name-present.js +37 -75
  51. package/src/checks/automatic/dlitem-parent-valid.js +23 -8
  52. package/src/checks/automatic/duplicate-id-aria.js +24 -6
  53. package/src/checks/automatic/embed-text-alternative-present.js +86 -35
  54. package/src/checks/automatic/form-control-programmatic-label-present.js +79 -196
  55. package/src/checks/automatic/form-control-single-label.js +47 -10
  56. package/src/checks/automatic/html-xml-lang-mismatch.js +43 -19
  57. package/src/checks/automatic/iframe-focusable-content.js +26 -11
  58. package/src/checks/automatic/iframe-name-present.js +31 -9
  59. package/src/checks/automatic/iframe-title-unique.js +29 -8
  60. package/src/checks/automatic/img-alt-present.js +47 -43
  61. package/src/checks/automatic/input-image-alt-present.js +143 -112
  62. package/src/checks/automatic/label-in-name.js +50 -22
  63. package/src/checks/automatic/language-page-present.js +117 -109
  64. package/src/checks/automatic/link-in-text-block.js +59 -19
  65. package/src/checks/automatic/link-name-present.js +45 -14
  66. package/src/checks/automatic/list-children-valid.js +26 -9
  67. package/src/checks/automatic/listbox-name-present.js +39 -19
  68. package/src/checks/automatic/listitem-parent-valid.js +18 -6
  69. package/src/checks/automatic/menuitem-name-present.js +39 -61
  70. package/src/checks/automatic/meta-refresh-no-exceptions.js +37 -8
  71. package/src/checks/automatic/meta-refresh-timing-absent.js +28 -6
  72. package/src/checks/automatic/meta-viewport-zoom-enabled.js +32 -7
  73. package/src/checks/automatic/meter-name-present.js +36 -33
  74. package/src/checks/automatic/nested-interactive-controls-absent.js +31 -10
  75. package/src/checks/automatic/object-text-alternative-present.js +91 -39
  76. package/src/checks/automatic/option-name-present.js +38 -21
  77. package/src/checks/automatic/page-title-present.js +26 -7
  78. package/src/checks/automatic/progressbar-name-present.js +41 -34
  79. package/src/checks/automatic/role-img-alt-present.js +209 -157
  80. package/src/checks/automatic/searchbox-name-present.js +39 -19
  81. package/src/checks/automatic/server-side-image-map-absent.js +23 -8
  82. package/src/checks/automatic/slider-name-present.js +40 -47
  83. package/src/checks/automatic/spinbutton-name-present.js +39 -19
  84. package/src/checks/automatic/summary-name-present.js +37 -17
  85. package/src/checks/automatic/svg-image-text-alternative-present.js +114 -47
  86. package/src/checks/automatic/svg-text-alternative-present.js +246 -226
  87. package/src/checks/automatic/tab-name-present.js +37 -60
  88. package/src/checks/automatic/table-headers-attr-valid.js +24 -8
  89. package/src/checks/automatic/table-th-has-data-cells.js +22 -8
  90. package/src/checks/automatic/target-size-minimum.js +118 -48
  91. package/src/checks/automatic/td-has-header.js +29 -11
  92. package/src/checks/automatic/textbox-name-present.js +39 -19
  93. package/src/checks/automatic/tooltip-name-present.js +37 -18
  94. package/src/checks/automatic/treeitem-name-present.js +38 -21
  95. package/src/checks/automatic/valid-lang.js +20 -6
  96. package/src/checks/automatic/video-poster-text-alternative-present.js +79 -36
  97. package/src/checks/manual/accesskeys-manual.js +14 -5
  98. package/src/checks/manual/area-alt-decorative-manual.js +192 -193
  99. package/src/checks/manual/area-alt-quality-manual.js +182 -141
  100. package/src/checks/manual/aria-checked-state-mismatch-manual.js +34 -11
  101. package/src/checks/manual/aria-text-manual.js +14 -6
  102. package/src/checks/manual/canvas-text-alternative-quality-manual.js +149 -114
  103. package/src/checks/manual/css-hidden-focus.js +196 -165
  104. package/src/checks/manual/embed-text-alternative-quality-manual.js +171 -160
  105. package/src/checks/manual/empty-heading-manual.js +24 -12
  106. package/src/checks/manual/empty-table-header-manual.js +21 -14
  107. package/src/checks/manual/focus-order-semantics-manual.js +45 -10
  108. package/src/checks/manual/form-control-programmatic-label-quality-manual.js +207 -246
  109. package/src/checks/manual/heading-order-manual.js +22 -12
  110. package/src/checks/manual/identical-links-same-purpose-manual.js +34 -12
  111. package/src/checks/manual/image-redundant-alt-manual.js +17 -7
  112. package/src/checks/manual/img-alt-decorative-manual.js +131 -96
  113. package/src/checks/manual/img-alt-quality-manual.js +176 -127
  114. package/src/checks/manual/input-image-alt-decorative-manual.js +125 -92
  115. package/src/checks/manual/input-image-alt-quality-manual.js +125 -92
  116. package/src/checks/manual/label-title-only-manual.js +14 -5
  117. package/src/checks/manual/landmark-banner-is-top-level-manual.js +95 -29
  118. package/src/checks/manual/landmark-contentinfo-is-top-level-manual.js +82 -29
  119. package/src/checks/manual/landmark-main-is-top-level-manual.js +64 -23
  120. package/src/checks/manual/landmark-no-duplicate-banner-manual.js +54 -23
  121. package/src/checks/manual/landmark-no-duplicate-contentinfo-manual.js +54 -23
  122. package/src/checks/manual/landmark-no-duplicate-main-manual.js +17 -8
  123. package/src/checks/manual/landmark-one-main-manual.js +35 -21
  124. package/src/checks/manual/landmark-unique-manual.js +73 -45
  125. package/src/checks/manual/link-name-quality-manual.js +43 -12
  126. package/src/checks/manual/media-transcript-present-manual.js +35 -22
  127. package/src/checks/manual/meta-viewport-large-manual.js +25 -6
  128. package/src/checks/manual/mouse-only-event-handlers-manual.js +38 -11
  129. package/src/checks/manual/no-autoplay-audio-manual.js +20 -6
  130. package/src/checks/manual/object-text-alternative-quality-manual.js +175 -154
  131. package/src/checks/manual/p-as-heading-manual.js +22 -7
  132. package/src/checks/manual/page-has-heading-one-manual.js +40 -23
  133. package/src/checks/manual/page-title-patterns-manual.js +87 -51
  134. package/src/checks/manual/presentation-role-conflict-manual.js +59 -19
  135. package/src/checks/manual/region-manual.js +275 -62
  136. package/src/checks/manual/scope-attr-valid-manual.js +11 -9
  137. package/src/checks/manual/scrollable-region-focusable-manual.js +37 -11
  138. package/src/checks/manual/skip-link-manual.js +35 -12
  139. package/src/checks/manual/svg-text-alternative-quality-manual.js +206 -165
  140. package/src/checks/manual/tabindex-manual.js +11 -9
  141. package/src/checks/manual/table-duplicate-name-manual.js +17 -7
  142. package/src/checks/manual/table-fake-caption-manual.js +24 -7
  143. package/src/checks/manual/video-caption-manual.js +15 -4
  144. package/src/checks/manual-review.js +56 -12
  145. package/src/core/aria-helpers.js +1128 -823
  146. package/src/core/contrast-helpers.js +1217 -1062
  147. package/src/core/dom-helpers.js +4176 -3886
  148. package/src/core/dom-runner.js +720 -596
  149. package/src/core/frame-messaging.js +189 -138
  150. package/src/core/frame-scan.js +94 -82
  151. package/src/core/rollup-composites.js +94 -102
  152. package/src/core/rule-meta.js +71 -35
  153. package/src/core.js +37939 -29121
  154. package/src/i18n/en.js +1194 -887
  155. package/src/i18n/fr.js +1136 -793
  156. package/src/policy/contracts.js +13 -13
  157. package/src/policy/resolvePolicy.js +48 -44
  158. package/src/report.js +502 -0
  159. package/src/sarif.js +175 -0
  160. package/surea11y.browser.js +36042 -0
@@ -8,483 +8,447 @@
8
8
  * For now, composites are grouped per WCAG Success Criterion (SC).
9
9
  */
10
10
  module.exports = [
11
- {
12
- id: 'wcag-1.1.1-non-text-content',
13
- checksIds: [
14
- 'area-alt-present',
15
- 'img-alt-decorative',
16
- 'img-alt-quality',
17
- 'area-alt-decorative',
18
- 'area-alt-quality',
19
- 'canvas-text-alternative-quality',
20
- 'canvas-text-alternative-present',
21
- 'embed-text-alternative-present',
22
- 'img-alt-present',
23
- 'input-image-alt-present',
24
- 'object-text-alternative-present',
25
- 'role-img-text-alternative-present',
26
- 'svg-image-text-alternative-present',
27
- 'svg-text-alternative-present',
28
- 'video-poster-text-alternative-present',
29
- 'embed-text-alternative-quality',
30
- 'input-image-alt-decorative',
31
- 'input-image-alt-quality',
32
- 'object-text-alternative-quality',
33
- 'svg-text-alternative-quality',
34
- 'meter-name-present',
35
- 'progressbar-name-present'
36
- ],
37
- meta: {
38
- title: 'Non-text content: text alternatives',
39
- description: 'Rollup of checks ensuring non-text content has an appropriate text alternative.',
40
- wcagSc: ['1.1.1'],
41
- level: 'A'
42
- }
43
- },
11
+ {
12
+ id: 'wcag-1.1.1-non-text-content',
13
+ checksIds: [
14
+ 'area-alt-present',
15
+ 'img-alt-decorative',
16
+ 'img-alt-quality',
17
+ 'area-alt-decorative',
18
+ 'area-alt-quality',
19
+ 'canvas-text-alternative-quality',
20
+ 'canvas-text-alternative-present',
21
+ 'embed-text-alternative-present',
22
+ 'img-alt-present',
23
+ 'input-image-alt-present',
24
+ 'object-text-alternative-present',
25
+ 'role-img-text-alternative-present',
26
+ 'svg-image-text-alternative-present',
27
+ 'svg-text-alternative-present',
28
+ 'video-poster-text-alternative-present',
29
+ 'embed-text-alternative-quality',
30
+ 'input-image-alt-decorative',
31
+ 'input-image-alt-quality',
32
+ 'object-text-alternative-quality',
33
+ 'svg-text-alternative-quality',
34
+ 'meter-name-present',
35
+ 'progressbar-name-present'
36
+ ],
37
+ meta: {
38
+ title: 'Non-text content: text alternatives',
39
+ description:
40
+ 'Rollup of checks ensuring non-text content has an appropriate text alternative.',
41
+ wcagSc: ['1.1.1'],
42
+ level: 'A'
43
+ }
44
+ },
44
45
 
45
- {
46
- id: 'wcag-1.2.1-audio-only-video-only-prerecorded',
47
- checksIds: [
48
- 'media-alternative-transcript-evidence'
49
- ],
50
- meta: {
51
- title: 'Audio-only and video-only (prerecorded): transcript',
52
- description: 'Rollup of checks for transcript availability for prerecorded audio-only/video-only media.',
53
- wcagSc: ['1.2.1'],
54
- level: 'A'
55
- }
56
- },
46
+ {
47
+ id: 'wcag-1.2.1-audio-only-video-only-prerecorded',
48
+ checksIds: ['media-alternative-transcript-evidence'],
49
+ meta: {
50
+ title: 'Audio-only and video-only (prerecorded): transcript',
51
+ description:
52
+ 'Rollup of checks for transcript availability for prerecorded audio-only/video-only media.',
53
+ wcagSc: ['1.2.1'],
54
+ level: 'A'
55
+ }
56
+ },
57
57
 
58
- {
59
- id: 'wcag-1.2.2-captions-prerecorded',
60
- checksIds: [
61
- 'video-caption'
62
- ],
63
- meta: {
64
- title: 'Captions (Prerecorded)',
65
- description: 'Rollup of checks for captions-track evidence on prerecorded video.',
66
- wcagSc: ['1.2.2'],
67
- level: 'A'
68
- }
69
- },
58
+ {
59
+ id: 'wcag-1.2.2-captions-prerecorded',
60
+ checksIds: ['video-caption'],
61
+ meta: {
62
+ title: 'Captions (Prerecorded)',
63
+ description: 'Rollup of checks for captions-track evidence on prerecorded video.',
64
+ wcagSc: ['1.2.2'],
65
+ level: 'A'
66
+ }
67
+ },
70
68
 
71
- {
72
- id: 'wcag-1.3.1-info-and-relationships',
73
- checksIds: [
74
- 'table-headers-attr-valid',
75
- 'table-th-has-data-cells',
76
- 'aria-hidden-body',
77
- 'list-children-valid',
78
- 'listitem-parent-valid',
79
- 'definition-list-children-valid',
80
- 'dlitem-parent-valid',
81
- 'form-control-programmatic-label-present',
82
- 'p-as-heading',
83
- 'table-fake-caption',
84
- 'td-has-header'
85
- ],
86
- meta: {
87
- title: 'Info and Relationships',
88
- description: 'Rollup of checks ensuring information, structure, and relationships conveyed through presentation are programmatically determinable.',
89
- wcagSc: ['1.3.1'],
90
- level: 'A'
91
- }
92
- },
69
+ {
70
+ id: 'wcag-1.3.1-info-and-relationships',
71
+ checksIds: [
72
+ 'table-headers-attr-valid',
73
+ 'table-th-has-data-cells',
74
+ 'aria-hidden-body',
75
+ 'list-children-valid',
76
+ 'listitem-parent-valid',
77
+ 'definition-list-children-valid',
78
+ 'dlitem-parent-valid',
79
+ 'form-control-programmatic-label-present',
80
+ 'p-as-heading',
81
+ 'table-fake-caption',
82
+ 'td-has-header'
83
+ ],
84
+ meta: {
85
+ title: 'Info and Relationships',
86
+ description:
87
+ 'Rollup of checks ensuring information, structure, and relationships conveyed through presentation are programmatically determinable.',
88
+ wcagSc: ['1.3.1'],
89
+ level: 'A'
90
+ }
91
+ },
93
92
 
94
- {
95
- id: 'wcag-1.4.1-use-of-color',
96
- checksIds: [
97
- 'link-in-text-block'
98
- ],
99
- meta: {
100
- title: 'Use of Color',
101
- description: 'Rollup of checks ensuring color is not used as the only visual means of conveying information.',
102
- wcagSc: ['1.4.1'],
103
- level: 'A'
104
- }
105
- },
93
+ {
94
+ id: 'wcag-1.4.1-use-of-color',
95
+ checksIds: ['link-in-text-block'],
96
+ meta: {
97
+ title: 'Use of Color',
98
+ description:
99
+ 'Rollup of checks ensuring color is not used as the only visual means of conveying information.',
100
+ wcagSc: ['1.4.1'],
101
+ level: 'A'
102
+ }
103
+ },
106
104
 
107
- {
108
- id: 'wcag-1.4.2-audio-control',
109
- checksIds: [
110
- 'no-autoplay-audio'
111
- ],
112
- meta: {
113
- title: 'Audio Control',
114
- description: 'Rollup of checks for a pause/stop or volume-control mechanism on autoplaying audio.',
115
- wcagSc: ['1.4.2'],
116
- level: 'A'
117
- }
118
- },
105
+ {
106
+ id: 'wcag-1.4.2-audio-control',
107
+ checksIds: ['no-autoplay-audio'],
108
+ meta: {
109
+ title: 'Audio Control',
110
+ description:
111
+ 'Rollup of checks for a pause/stop or volume-control mechanism on autoplaying audio.',
112
+ wcagSc: ['1.4.2'],
113
+ level: 'A'
114
+ }
115
+ },
119
116
 
120
- {
121
- id: 'wcag-1.4.3-contrast-minimum',
122
- checksIds: [
123
- 'contrast-computable',
124
- 'contrast-minimum'
125
- ],
126
- meta: {
127
- title: 'Contrast: minimum',
128
- description: 'Rollup of checks for minimum text contrast.',
129
- wcagSc: ['1.4.3'],
130
- level: 'AA'
131
- }
132
- },
117
+ {
118
+ id: 'wcag-1.4.3-contrast-minimum',
119
+ checksIds: ['contrast-computable', 'contrast-minimum'],
120
+ meta: {
121
+ title: 'Contrast: minimum',
122
+ description: 'Rollup of checks for minimum text contrast.',
123
+ wcagSc: ['1.4.3'],
124
+ level: 'AA'
125
+ }
126
+ },
133
127
 
134
- {
135
- id: 'wcag-1.4.6-contrast-enhanced',
136
- checksIds: [
137
- 'contrast-computable',
138
- 'contrast-enhanced'
139
- ],
140
- meta: {
141
- title: 'Contrast: enhanced',
142
- description: 'Rollup of checks for enhanced text contrast.',
143
- wcagSc: ['1.4.6'],
144
- level: 'AAA'
145
- }
146
- },
128
+ {
129
+ id: 'wcag-1.4.6-contrast-enhanced',
130
+ checksIds: ['contrast-computable', 'contrast-enhanced'],
131
+ meta: {
132
+ title: 'Contrast: enhanced',
133
+ description: 'Rollup of checks for enhanced text contrast.',
134
+ wcagSc: ['1.4.6'],
135
+ level: 'AAA'
136
+ }
137
+ },
147
138
 
148
- {
149
- id: 'wcag-2.1.1-keyboard',
150
- checksIds: [
151
- 'manual-review',
152
- 'iframe-focusable-content',
153
- 'server-side-image-map-absent',
154
- 'scrollable-region-focusable',
155
- 'mouse-only-event-handlers'
156
- ],
157
- meta: {
158
- title: 'Keyboard',
159
- description: 'Rollup of checks ensuring functionality is operable through a keyboard interface.',
160
- wcagSc: ['2.1.1'],
161
- level: 'A'
162
- }
163
- },
139
+ {
140
+ id: 'wcag-2.1.1-keyboard',
141
+ checksIds: [
142
+ 'manual-review',
143
+ 'iframe-focusable-content',
144
+ 'server-side-image-map-absent',
145
+ 'scrollable-region-focusable',
146
+ 'mouse-only-event-handlers'
147
+ ],
148
+ meta: {
149
+ title: 'Keyboard',
150
+ description:
151
+ 'Rollup of checks ensuring functionality is operable through a keyboard interface.',
152
+ wcagSc: ['2.1.1'],
153
+ level: 'A'
154
+ }
155
+ },
164
156
 
165
- {
166
- id: 'wcag-2.1.3-keyboard-no-exception',
167
- checksIds: [
168
- 'scrollable-region-focusable'
169
- ],
170
- meta: {
171
- title: 'Keyboard (No Exception)',
172
- description: 'Rollup of checks ensuring functionality is operable through a keyboard interface with no exceptions (AAA).',
173
- wcagSc: ['2.1.3'],
174
- level: 'AAA'
175
- }
176
- },
157
+ {
158
+ id: 'wcag-2.1.3-keyboard-no-exception',
159
+ checksIds: ['scrollable-region-focusable'],
160
+ meta: {
161
+ title: 'Keyboard (No Exception)',
162
+ description:
163
+ 'Rollup of checks ensuring functionality is operable through a keyboard interface with no exceptions (AAA).',
164
+ wcagSc: ['2.1.3'],
165
+ level: 'AAA'
166
+ }
167
+ },
177
168
 
178
- {
179
- id: 'wcag-2.2.2-pause-stop-hide',
180
- checksIds: [
181
- 'deprecated-elements-not-used'
182
- ],
183
- meta: {
184
- title: 'Pause, Stop, Hide',
185
- description: 'Rollup of checks ensuring moving, blinking, or auto-scrolling content can be paused, stopped, or hidden.',
186
- wcagSc: ['2.2.2'],
187
- level: 'A'
188
- }
189
- },
169
+ {
170
+ id: 'wcag-2.2.2-pause-stop-hide',
171
+ checksIds: ['deprecated-elements-not-used'],
172
+ meta: {
173
+ title: 'Pause, Stop, Hide',
174
+ description:
175
+ 'Rollup of checks ensuring moving, blinking, or auto-scrolling content can be paused, stopped, or hidden.',
176
+ wcagSc: ['2.2.2'],
177
+ level: 'A'
178
+ }
179
+ },
190
180
 
191
- {
192
- id: 'wcag-2.4.1-bypass-blocks',
193
- checksIds: [
194
- 'bypass-blocks-present'
195
- ],
196
- meta: {
197
- title: 'Bypass Blocks',
198
- description: 'Rollup of checks ensuring the page provides a way to bypass repeated blocks of content.',
199
- wcagSc: ['2.4.1'],
200
- level: 'A'
201
- }
202
- },
181
+ {
182
+ id: 'wcag-2.4.1-bypass-blocks',
183
+ checksIds: ['bypass-blocks-present'],
184
+ meta: {
185
+ title: 'Bypass Blocks',
186
+ description:
187
+ 'Rollup of checks ensuring the page provides a way to bypass repeated blocks of content.',
188
+ wcagSc: ['2.4.1'],
189
+ level: 'A'
190
+ }
191
+ },
203
192
 
204
- {
205
- id: 'wcag-2.4.2-page-titled',
206
- checksIds: [
207
- 'page-title-patterns',
208
- 'page-title-present'
209
- ],
210
- meta: {
211
- title: 'Page titled',
212
- description: 'Rollup of checks ensuring documents have a meaningful page title.',
213
- wcagSc: ['2.4.2'],
214
- level: 'A'
215
- }
216
- },
193
+ {
194
+ id: 'wcag-2.4.2-page-titled',
195
+ checksIds: ['page-title-patterns', 'page-title-present'],
196
+ meta: {
197
+ title: 'Page titled',
198
+ description: 'Rollup of checks ensuring documents have a meaningful page title.',
199
+ wcagSc: ['2.4.2'],
200
+ level: 'A'
201
+ }
202
+ },
217
203
 
218
- {
219
- id: 'wcag-2.4.3-focus-order',
220
- checksIds: [
221
- 'manual-review'
222
- ],
223
- meta: {
224
- title: 'Focus order',
225
- description: 'Rollup of checks ensuring focus moves through content in a meaningful order.',
226
- wcagSc: ['2.4.3'],
227
- level: 'A'
228
- }
229
- },
204
+ {
205
+ id: 'wcag-2.4.3-focus-order',
206
+ checksIds: ['manual-review'],
207
+ meta: {
208
+ title: 'Focus order',
209
+ description: 'Rollup of checks ensuring focus moves through content in a meaningful order.',
210
+ wcagSc: ['2.4.3'],
211
+ level: 'A'
212
+ }
213
+ },
230
214
 
231
- {
232
- id: 'wcag-2.4.4-link-purpose-in-context',
233
- checksIds: [
234
- 'link-name-quality'
235
- ],
236
- meta: {
237
- title: 'Link Purpose (In Context)',
238
- description: 'Rollup of checks flagging links whose text alone is a known non-descriptive/generic phrase.',
239
- wcagSc: ['2.4.4'],
240
- level: 'A'
241
- }
242
- },
215
+ {
216
+ id: 'wcag-2.4.4-link-purpose-in-context',
217
+ checksIds: ['link-name-quality'],
218
+ meta: {
219
+ title: 'Link Purpose (In Context)',
220
+ description:
221
+ 'Rollup of checks flagging links whose text alone is a known non-descriptive/generic phrase.',
222
+ wcagSc: ['2.4.4'],
223
+ level: 'A'
224
+ }
225
+ },
243
226
 
244
- {
245
- id: 'wcag-2.4.7-focus-visible',
246
- checksIds: [
247
- 'aria-hidden-focus',
248
- 'css-hidden-focus',
249
- 'manual-review'
250
- ],
251
- meta: {
252
- title: 'Focus visible',
253
- description: 'Rollup of checks ensuring keyboard focus is not hidden and remains perceivable.',
254
- wcagSc: ['2.4.7'],
255
- level: 'AA'
256
- }
257
- },
227
+ {
228
+ id: 'wcag-2.4.7-focus-visible',
229
+ checksIds: ['aria-hidden-focus', 'css-hidden-focus', 'manual-review'],
230
+ meta: {
231
+ title: 'Focus visible',
232
+ description:
233
+ 'Rollup of checks ensuring keyboard focus is not hidden and remains perceivable.',
234
+ wcagSc: ['2.4.7'],
235
+ level: 'AA'
236
+ }
237
+ },
258
238
 
259
- {
260
- id: 'wcag-2.4.9-link-purpose-link-only',
261
- checksIds: [
262
- 'identical-links-same-purpose'
263
- ],
264
- meta: {
265
- title: 'Link Purpose (Link Only)',
266
- description: 'Rollup of checks ensuring links with the same accessible name serve the same purpose (AAA).',
267
- wcagSc: ['2.4.9'],
268
- level: 'AAA'
269
- }
270
- },
271
- {
272
- id: 'wcag-2.5.3-label-in-name',
273
- checksIds: [
274
- 'label-in-name'
275
- ],
276
- meta: {
277
- title: 'Label in name',
278
- description: 'Rollup of checks ensuring that when a control has a visible text label, the accessible name contains that visible label text.',
279
- wcagSc: ['2.5.3'],
280
- level: 'A'
281
- }
282
- },
283
- {
284
- id: 'wcag-2.5.8-target-size-minimum',
285
- checksIds: [
286
- 'target-size-minimum'
287
- ],
288
- meta: {
289
- title: 'Target size: minimum',
290
- description: 'Rollup of checks ensuring pointer targets meet minimum size requirements.',
291
- wcagSc: ['2.5.8'],
292
- level: 'AA'
293
- }
294
- },
239
+ {
240
+ id: 'wcag-2.4.9-link-purpose-link-only',
241
+ checksIds: ['identical-links-same-purpose'],
242
+ meta: {
243
+ title: 'Link Purpose (Link Only)',
244
+ description:
245
+ 'Rollup of checks ensuring links with the same accessible name serve the same purpose (AAA).',
246
+ wcagSc: ['2.4.9'],
247
+ level: 'AAA'
248
+ }
249
+ },
250
+ {
251
+ id: 'wcag-2.5.3-label-in-name',
252
+ checksIds: ['label-in-name'],
253
+ meta: {
254
+ title: 'Label in name',
255
+ description:
256
+ 'Rollup of checks ensuring that when a control has a visible text label, the accessible name contains that visible label text.',
257
+ wcagSc: ['2.5.3'],
258
+ level: 'A'
259
+ }
260
+ },
261
+ {
262
+ id: 'wcag-2.5.8-target-size-minimum',
263
+ checksIds: ['target-size-minimum'],
264
+ meta: {
265
+ title: 'Target size: minimum',
266
+ description: 'Rollup of checks ensuring pointer targets meet minimum size requirements.',
267
+ wcagSc: ['2.5.8'],
268
+ level: 'AA'
269
+ }
270
+ },
295
271
 
296
- {
297
- id: 'wcag-3.1.1-language-of-page',
298
- checksIds: [
299
- 'html-lang-attr-present',
300
- 'html-xml-lang-mismatch'
301
- ],
302
- meta: {
303
- title: 'Language of page',
304
- description: 'Rollup of checks ensuring the page language is specified.',
305
- wcagSc: ['3.1.1'],
306
- level: 'A'
307
- }
308
- },
272
+ {
273
+ id: 'wcag-3.1.1-language-of-page',
274
+ checksIds: ['html-lang-attr-present', 'html-xml-lang-mismatch'],
275
+ meta: {
276
+ title: 'Language of page',
277
+ description: 'Rollup of checks ensuring the page language is specified.',
278
+ wcagSc: ['3.1.1'],
279
+ level: 'A'
280
+ }
281
+ },
309
282
 
310
- {
311
- id: 'wcag-3.1.2-language-of-parts',
312
- checksIds: [
313
- 'valid-lang'
314
- ],
315
- meta: {
316
- title: 'Language of Parts',
317
- description: 'Rollup of checks ensuring elements whose language differs from the page default declare it correctly.',
318
- wcagSc: ['3.1.2'],
319
- level: 'AA'
320
- }
321
- },
283
+ {
284
+ id: 'wcag-3.1.2-language-of-parts',
285
+ checksIds: ['valid-lang'],
286
+ meta: {
287
+ title: 'Language of Parts',
288
+ description:
289
+ 'Rollup of checks ensuring elements whose language differs from the page default declare it correctly.',
290
+ wcagSc: ['3.1.2'],
291
+ level: 'AA'
292
+ }
293
+ },
322
294
 
323
- {
324
- id: 'wcag-1.3.4-orientation',
325
- checksIds: [
326
- 'css-orientation-lock'
327
- ],
328
- meta: {
329
- title: 'Orientation',
330
- description: 'Rollup of checks ensuring content does not restrict its view to a single display orientation.',
331
- wcagSc: ['1.3.4'],
332
- level: 'AA'
333
- }
334
- },
295
+ {
296
+ id: 'wcag-1.3.4-orientation',
297
+ checksIds: ['css-orientation-lock'],
298
+ meta: {
299
+ title: 'Orientation',
300
+ description:
301
+ 'Rollup of checks ensuring content does not restrict its view to a single display orientation.',
302
+ wcagSc: ['1.3.4'],
303
+ level: 'AA'
304
+ }
305
+ },
335
306
 
336
- {
337
- id: 'wcag-1.3.5-identify-input-purpose',
338
- checksIds: [
339
- 'autocomplete-valid'
340
- ],
341
- meta: {
342
- title: 'Identify Input Purpose',
343
- description: 'Rollup of checks ensuring the autocomplete attribute correctly identifies input purpose.',
344
- wcagSc: ['1.3.5'],
345
- level: 'AA'
346
- }
347
- },
307
+ {
308
+ id: 'wcag-1.3.5-identify-input-purpose',
309
+ checksIds: ['autocomplete-valid'],
310
+ meta: {
311
+ title: 'Identify Input Purpose',
312
+ description:
313
+ 'Rollup of checks ensuring the autocomplete attribute correctly identifies input purpose.',
314
+ wcagSc: ['1.3.5'],
315
+ level: 'AA'
316
+ }
317
+ },
348
318
 
349
- {
350
- id: 'wcag-1.4.12-text-spacing',
351
- checksIds: [
352
- 'avoid-inline-spacing'
353
- ],
354
- meta: {
355
- title: 'Text Spacing',
356
- description: 'Rollup of checks ensuring inline styles do not block user text-spacing overrides.',
357
- wcagSc: ['1.4.12'],
358
- level: 'AA'
359
- }
360
- },
319
+ {
320
+ id: 'wcag-1.4.12-text-spacing',
321
+ checksIds: ['avoid-inline-spacing'],
322
+ meta: {
323
+ title: 'Text Spacing',
324
+ description:
325
+ 'Rollup of checks ensuring inline styles do not block user text-spacing overrides.',
326
+ wcagSc: ['1.4.12'],
327
+ level: 'AA'
328
+ }
329
+ },
361
330
 
362
- {
363
- id: 'wcag-2.2.4-interruptions',
364
- checksIds: [
365
- 'meta-refresh-no-exceptions'
366
- ],
367
- meta: {
368
- title: 'Interruptions',
369
- description: 'Rollup of checks ensuring automatic context changes only happen at the user\'s request (AAA).',
370
- wcagSc: ['2.2.4'],
371
- level: 'AAA'
372
- }
373
- },
331
+ {
332
+ id: 'wcag-2.2.4-interruptions',
333
+ checksIds: ['meta-refresh-no-exceptions'],
334
+ meta: {
335
+ title: 'Interruptions',
336
+ description:
337
+ "Rollup of checks ensuring automatic context changes only happen at the user's request (AAA).",
338
+ wcagSc: ['2.2.4'],
339
+ level: 'AAA'
340
+ }
341
+ },
374
342
 
375
- {
376
- id: 'wcag-3.2.5-change-on-request',
377
- checksIds: [
378
- 'meta-refresh-no-exceptions'
379
- ],
380
- meta: {
381
- title: 'Change on Request',
382
- description: 'Rollup of checks ensuring context changes only happen at the user\'s request (AAA).',
383
- wcagSc: ['3.2.5'],
384
- level: 'AAA'
385
- }
386
- },
343
+ {
344
+ id: 'wcag-3.2.5-change-on-request',
345
+ checksIds: ['meta-refresh-no-exceptions'],
346
+ meta: {
347
+ title: 'Change on Request',
348
+ description:
349
+ "Rollup of checks ensuring context changes only happen at the user's request (AAA).",
350
+ wcagSc: ['3.2.5'],
351
+ level: 'AAA'
352
+ }
353
+ },
387
354
 
388
- {
389
- id: 'wcag-4.1.2-name',
390
- checksIds: [
391
- 'aria-role-name-present',
392
- 'binary-control-name-present',
393
- 'button-name-present',
394
- 'combobox-name-present',
395
- 'dialog-name-present',
396
- 'form-control-programmatic-label-present',
397
- 'iframe-name-present',
398
- 'iframe-title-unique',
399
- 'link-name-present',
400
- 'listbox-name-present',
401
- 'menuitem-name-present',
402
- 'option-name-present',
403
- 'searchbox-name-present',
404
- 'slider-name-present',
405
- 'spinbutton-name-present',
406
- 'tab-name-present',
407
- 'textbox-name-present',
408
- 'treeitem-name-present',
409
- 'aria-hidden-focus',
410
- 'aria-hidden-body',
411
- 'form-control-programmatic-label-quality',
412
- 'summary-name-present',
413
- 'tooltip-name-present'
414
- ],
415
- meta: {
416
- title: 'Name, role, value: accessible name',
417
- description: 'Rollup of checks that common interactive elements expose a non-empty accessible name.',
418
- wcagSc: ['4.1.2'],
419
- level: 'A'
420
- }
421
- },
355
+ {
356
+ id: 'wcag-4.1.2-name',
357
+ checksIds: [
358
+ 'aria-role-name-present',
359
+ 'binary-control-name-present',
360
+ 'button-name-present',
361
+ 'combobox-name-present',
362
+ 'dialog-name-present',
363
+ 'form-control-programmatic-label-present',
364
+ 'iframe-name-present',
365
+ 'iframe-title-unique',
366
+ 'link-name-present',
367
+ 'listbox-name-present',
368
+ 'menuitem-name-present',
369
+ 'option-name-present',
370
+ 'searchbox-name-present',
371
+ 'slider-name-present',
372
+ 'spinbutton-name-present',
373
+ 'tab-name-present',
374
+ 'textbox-name-present',
375
+ 'treeitem-name-present',
376
+ 'aria-hidden-focus',
377
+ 'aria-hidden-body',
378
+ 'form-control-programmatic-label-quality',
379
+ 'summary-name-present',
380
+ 'tooltip-name-present'
381
+ ],
382
+ meta: {
383
+ title: 'Name, role, value: accessible name',
384
+ description:
385
+ 'Rollup of checks that common interactive elements expose a non-empty accessible name.',
386
+ wcagSc: ['4.1.2'],
387
+ level: 'A'
388
+ }
389
+ },
422
390
 
423
- {
424
- id: 'wcag-4.1.2-aria-validity',
425
- checksIds: [
426
- 'aria-roles-valid',
427
- 'aria-deprecated-role',
428
- 'aria-valid-attr',
429
- 'aria-valid-attr-value',
430
- 'aria-allowed-attr',
431
- 'aria-prohibited-attr',
432
- 'aria-required-attr',
433
- 'aria-allowed-role',
434
- 'aria-required-children',
435
- 'aria-prohibited-children',
436
- 'aria-required-parent',
437
- 'duplicate-id-aria',
438
- 'nested-interactive-controls-absent',
439
- 'aria-braille-equivalent',
440
- 'aria-conditional-attr',
441
- 'aria-checked-state-mismatch'
442
- ],
443
- meta: {
444
- title: 'Name, role, value: ARIA validity',
445
- description: 'Rollup of checks that ARIA role and attribute usage conforms to the WAI-ARIA specification (valid roles, valid attributes, valid values, required attributes/relationships, unique ARIA-referenced ids).',
446
- wcagSc: ['4.1.2'],
447
- level: 'A'
448
- }
449
- },
391
+ {
392
+ id: 'wcag-4.1.2-aria-validity',
393
+ checksIds: [
394
+ 'aria-roles-valid',
395
+ 'aria-deprecated-role',
396
+ 'aria-valid-attr',
397
+ 'aria-valid-attr-value',
398
+ 'aria-allowed-attr',
399
+ 'aria-prohibited-attr',
400
+ 'aria-required-attr',
401
+ 'aria-allowed-role',
402
+ 'aria-required-children',
403
+ 'aria-prohibited-children',
404
+ 'aria-required-parent',
405
+ 'duplicate-id-aria',
406
+ 'nested-interactive-controls-absent',
407
+ 'aria-braille-equivalent',
408
+ 'aria-conditional-attr',
409
+ 'aria-checked-state-mismatch'
410
+ ],
411
+ meta: {
412
+ title: 'Name, role, value: ARIA validity',
413
+ description:
414
+ 'Rollup of checks that ARIA role and attribute usage conforms to the WAI-ARIA specification (valid roles, valid attributes, valid values, required attributes/relationships, unique ARIA-referenced ids).',
415
+ wcagSc: ['4.1.2'],
416
+ level: 'A'
417
+ }
418
+ },
450
419
 
451
- {
452
- id: 'wcag-1.4.4-resize-text',
453
- checksIds: [
454
- 'meta-viewport-zoom-enabled'
455
- ],
456
- meta: {
457
- title: 'Resize Text',
458
- description: 'Rollup of checks ensuring the viewport meta tag does not prevent users from zooming text up to 200%.',
459
- wcagSc: ['1.4.4'],
460
- level: 'AA'
461
- }
462
- },
420
+ {
421
+ id: 'wcag-1.4.4-resize-text',
422
+ checksIds: ['meta-viewport-zoom-enabled'],
423
+ meta: {
424
+ title: 'Resize Text',
425
+ description:
426
+ 'Rollup of checks ensuring the viewport meta tag does not prevent users from zooming text up to 200%.',
427
+ wcagSc: ['1.4.4'],
428
+ level: 'AA'
429
+ }
430
+ },
463
431
 
464
- {
465
- id: 'wcag-2.2.1-timing-adjustable',
466
- checksIds: [
467
- 'meta-refresh-timing-absent'
468
- ],
469
- meta: {
470
- title: 'Timing Adjustable',
471
- description: 'Rollup of checks ensuring the page does not impose a timed refresh the user cannot control.',
472
- wcagSc: ['2.2.1'],
473
- level: 'A'
474
- }
475
- },
432
+ {
433
+ id: 'wcag-2.2.1-timing-adjustable',
434
+ checksIds: ['meta-refresh-timing-absent'],
435
+ meta: {
436
+ title: 'Timing Adjustable',
437
+ description:
438
+ 'Rollup of checks ensuring the page does not impose a timed refresh the user cannot control.',
439
+ wcagSc: ['2.2.1'],
440
+ level: 'A'
441
+ }
442
+ },
476
443
 
477
- {
478
- id: 'wcag-3.3.2-labels-or-instructions',
479
- checksIds: [
480
- 'form-control-single-label',
481
- 'form-control-programmatic-label-present'
482
- ],
483
- meta: {
484
- title: 'Labels or Instructions',
485
- description: 'Rollup of checks ensuring form controls have unambiguous labeling.',
486
- wcagSc: ['3.3.2'],
487
- level: 'A'
488
- }
444
+ {
445
+ id: 'wcag-3.3.2-labels-or-instructions',
446
+ checksIds: ['form-control-single-label', 'form-control-programmatic-label-present'],
447
+ meta: {
448
+ title: 'Labels or Instructions',
449
+ description: 'Rollup of checks ensuring form controls have unambiguous labeling.',
450
+ wcagSc: ['3.3.2'],
451
+ level: 'A'
489
452
  }
453
+ }
490
454
  ];