testilo 42.3.1 → 43.0.1

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.
@@ -1,5 +1,5 @@
1
1
  /*
2
- © 2024 CVS Health and/or one of its affiliates. All rights reserved.
2
+ © 2025 CVS Health and/or one of its affiliates. All rights reserved.
3
3
 
4
4
  Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  of this software and associated documentation files (the "Software"), to deal
@@ -21,10 +21,10 @@
21
21
  */
22
22
 
23
23
  /*
24
- tic49
25
- Testilo issue classification 49
24
+ tic
25
+ Testilo issue classification
26
26
 
27
- Classifies about 990 rules of the tools of Testaro into about 310 issues.
27
+ Classifies about 1000 rules of the tools of Testaro into about 310 issues.
28
28
 
29
29
  Issue properties:
30
30
  summary: minimal description
@@ -50,7 +50,19 @@ exports.issues = {
50
50
  wcag: '',
51
51
  weight: 0,
52
52
  tools: {
53
+ alfa: {
54
+ r73: {
55
+ variable: false,
56
+ quality: 1,
57
+ what: 'Text line height is not at least 1.5 [invalid]'
58
+ }
59
+ },
53
60
  aslint: {
61
+ capital_letters_words: {
62
+ variable: false,
63
+ quality: 1,
64
+ what: 'Element or its title has entirely upper-case words [invalid]'
65
+ },
54
66
  color_contrast_aa: {
55
67
  variable: false,
56
68
  quality: 0,
@@ -91,6 +103,11 @@ exports.issues = {
91
103
  quality: 1,
92
104
  what: 'Element is a link, but its style properties do not differentiate it from its parent [irrelevant]'
93
105
  },
106
+ links_same_content_different_url: {
107
+ variable: false,
108
+ quality: 1,
109
+ what: 'Links with the same text content have different destination URLs [invalid]'
110
+ },
94
111
  meaningful_content_sequence: {
95
112
  variable: false,
96
113
  quality: 0,
@@ -186,6 +203,11 @@ exports.issues = {
186
203
  variable: false,
187
204
  quality: 1,
188
205
  what: 'Child element has a role not allowed for the role of the parent [invalid]'
206
+ },
207
+ aria_landmark_name_unique: {
208
+ variable: false,
209
+ quality: 1,
210
+ what: 'Multiple landmarks with the same parent region are not distinguished from one another [invalid on invisible elements]'
189
211
  }
190
212
  },
191
213
  nuVal: {
@@ -194,18 +216,38 @@ exports.issues = {
194
216
  quality: 1,
195
217
  what: 'head element has no child title element [invalid]'
196
218
  },
219
+ 'Element img is missing required attribute src.': {
220
+ variable: false,
221
+ quality: 1,
222
+ what: 'img element has no src attribute [invalid]'
223
+ },
197
224
  'Element mediaelementwrapper not allowed as child of element div in this context. (Suppressing further errors from this subtree.)': {
198
225
  variable: false,
199
226
  quality: 0,
200
227
  what: 'Element contains a prohibited mediaelementwrapper element [invalid]'
228
+ },
229
+ 'Trailing slash on void elements has no effect and interacts badly with unquoted attribute values.': {
230
+ variable: false,
231
+ quality: 1,
232
+ what: 'Void element has a useless trailing slash. [invalid]'
201
233
  }
202
234
  },
203
235
  qualWeb: {
236
+ 'QW-ACT-R10': {
237
+ variable: false,
238
+ quality: 1,
239
+ what: 'iframe elements with identical accessible names have different purposes [invalid on invisible elements]'
240
+ },
204
241
  'QW-ACT-R13': {
205
242
  variable: false,
206
243
  quality: 1,
207
244
  what: 'Element with aria-hidden has focusable content [invalid]'
208
245
  },
246
+ 'QW-ACT-R41': {
247
+ variable: false,
248
+ quality: 1,
249
+ what: 'Error message describes no invalid form field value [speculative]'
250
+ },
209
251
  'QW-ACT-R52': {
210
252
  variable: false,
211
253
  quality: 0,
@@ -296,6 +338,11 @@ exports.issues = {
296
338
  quality: 0,
297
339
  what: 'summary attribute is not used to give an overview of a data table [invalid]'
298
340
  },
341
+ 'QW-WCAG-T8': {
342
+ variable: false,
343
+ quality: 1,
344
+ what: 'Text alternative is suspect [invalid]'
345
+ },
299
346
  'QW-WCAG-T9': {
300
347
  variable: false,
301
348
  quality: 0,
@@ -321,6 +368,16 @@ exports.issues = {
321
368
  quality: 0.5,
322
369
  what: 'Script removes the focus when focus is received [invalid]'
323
370
  },
371
+ 'QW-WCAG-T28': {
372
+ variable: false,
373
+ quality: 0.8,
374
+ what: 'Font size set to an absolute unit value [invalid]'
375
+ },
376
+ 'QW-WCAG-T31': {
377
+ variable: false,
378
+ quality: 1,
379
+ what: 'Foreground or background color is specified but not both [invalid on invisible elements'
380
+ },
324
381
  'QW-WCAG-T32': {
325
382
  variable: false,
326
383
  quality: 1,
@@ -331,6 +388,18 @@ exports.issues = {
331
388
  quality: 1,
332
389
  what: 'Several elements have this id attribute value [invalid]'
333
390
  }
391
+ },
392
+ wax: {
393
+ 'Check that the link text combined with programmatically determined link context identifies the purpose of the link.': {
394
+ variable: false,
395
+ quality: 1,
396
+ what: 'Link purpose may be undisclosed [speculative]'
397
+ },
398
+ 'Check that the link text combined with programmatically determined link context, or its title attribute, identifies the purpose of the link.': {
399
+ variable: false,
400
+ quality: 1,
401
+ what: 'Link purpose may be undisclosed [speculative]'
402
+ }
334
403
  }
335
404
  }
336
405
  },
@@ -420,6 +489,13 @@ exports.issues = {
420
489
  quality: 1,
421
490
  what: 'id attribute value is not unique'
422
491
  }
492
+ },
493
+ wax: {
494
+ '^Duplicate id attribute value .+ found on the web page.+$': {
495
+ variable: true,
496
+ quality: 1,
497
+ what: 'id attribute value is not unique'
498
+ }
423
499
  }
424
500
  }
425
501
  },
@@ -435,6 +511,35 @@ exports.issues = {
435
511
  quality: 1,
436
512
  what: 'Element has no accessible name, although its role requires one'
437
513
  }
514
+ },
515
+ wax: {
516
+ 'Provide accessible names for ARIA button, link, and menuitem elements.': {
517
+ variable: false,
518
+ quality: 1,
519
+ what: 'Element is a button, link, or menuitem, but has no accessible name'
520
+ }
521
+ }
522
+ }
523
+ },
524
+ progressNoText: {
525
+ summary: 'progress bar not named',
526
+ why: 'User cannot get help understanding the state of a process',
527
+ wcag: '4.1.2',
528
+ weight: 4,
529
+ tools: {
530
+ axe: {
531
+ 'aria-progressbar-name': {
532
+ variable: false,
533
+ quality: 1,
534
+ what: 'Progress bar has no accessible name'
535
+ }
536
+ },
537
+ wax: {
538
+ 'Ensure ARIA progressbar elements have accessible names.': {
539
+ variable: false,
540
+ quality: 1,
541
+ what: 'Progress bar has no accessible name'
542
+ }
438
543
  }
439
544
  }
440
545
  },
@@ -519,6 +624,43 @@ exports.issues = {
519
624
  quality: 1,
520
625
  what: 'input element has no accessible name'
521
626
  }
627
+ },
628
+ wax: {
629
+ 'Provide accessible names for ARIA input fields.': {
630
+ variable: false,
631
+ quality: 1,
632
+ what: 'Element with an input role has no accessible name'
633
+ },
634
+ 'This emailinput element does not have a name available to an accessibility API. Valid names are: label element, title , aria-label , aria-labelledby , aria-description , aria-describedby .': {
635
+ variable: false,
636
+ quality: 1,
637
+ what: 'email input element has no accessible name'
638
+ },
639
+ 'This searchinput element does not have a name available to an accessibility API. Valid names are: label element, title , aria-label , aria-labelledby , aria-description , aria-describedby .': {
640
+ variable: false,
641
+ quality: 1,
642
+ what: 'search input element has no accessible name'
643
+ },
644
+ 'This textinput element does not have a name available to an accessibility API. Valid names are: label element, title , aria-label , aria-labelledby , aria-description , aria-describedby .': {
645
+ variable: false,
646
+ quality: 1,
647
+ what: 'text input element has no accessible name'
648
+ }
649
+ }
650
+ }
651
+ },
652
+ checkboxNoText: {
653
+ summary: 'checkbox input not named',
654
+ why: 'User cannot get help on whether to check a checkbox',
655
+ wcag: '4.1.2',
656
+ weight: 4,
657
+ tools: {
658
+ wax: {
659
+ 'This checkboxinput element does not have a name available to an accessibility API. Valid names are: label element, title , aria-label , aria-labelledby , aria-description , aria-describedby .': {
660
+ variable: false,
661
+ quality: 1,
662
+ what: 'checkbox input element has no accessible name'
663
+ }
522
664
  }
523
665
  }
524
666
  },
@@ -537,6 +679,21 @@ exports.issues = {
537
679
  }
538
680
  }
539
681
  },
682
+ placeholderPlusAria: {
683
+ summary: 'element has competing placeholder attributes',
684
+ why: 'User gets conflicting help on what information to enter in a form item',
685
+ wcag: '4.1.2',
686
+ weight: 3,
687
+ tools: {
688
+ nuVal: {
689
+ 'The aria-placeholder attribute must not be specified on elements that have a placeholder attribute.': {
690
+ variable: false,
691
+ quality: 1,
692
+ what: 'Element has both placeholder and aria-placeholder attributes'
693
+ }
694
+ }
695
+ }
696
+ },
540
697
  imageButtonNoText: {
541
698
  summary: 'image button not named',
542
699
  why: 'User cannot get help understanding an image used as a button',
@@ -583,6 +740,21 @@ exports.issues = {
583
740
  }
584
741
  }
585
742
  },
743
+ numberInputNoText: {
744
+ summary: 'number input not named',
745
+ why: 'User cannot get help understanding what to enter into a number field',
746
+ wcag: '4.1.2',
747
+ weight: 4,
748
+ tools: {
749
+ wax: {
750
+ 'This numberinput element does not have a name available to an accessibility API. Valid names are: label element, title , aria-label , aria-labelledby , aria-description , aria-describedby .': {
751
+ variable: false,
752
+ quality: 1,
753
+ what: 'Element is an input of type number but has no accessible name'
754
+ }
755
+ }
756
+ }
757
+ },
586
758
  imageInputNoText: {
587
759
  summary: 'image input not named',
588
760
  why: 'User cannot get help understanding an image used as a submission button',
@@ -721,6 +893,36 @@ exports.issues = {
721
893
  variable: false,
722
894
  quality: 1,
723
895
  what: 'Image has no text alternative'
896
+ },
897
+ 'Img element missing an alt attribute. Use the alt attribute to specify a short text alternative.': {
898
+ variable: false,
899
+ quality: 1,
900
+ what: 'Image has no text alternative'
901
+ },
902
+ 'Provide alternate text for <img> elements or use role=\'none\' or \'presentation\'.': {
903
+ variable: false,
904
+ quality: 1,
905
+ what: 'Image has no text alternative'
906
+ },
907
+ 'Provide alternate text for elements with [role=\'img\'].': {
908
+ variable: false,
909
+ quality: 1,
910
+ what: 'Element with an img role has no text alternative'
911
+ }
912
+ }
913
+ }
914
+ },
915
+ svgNoText: {
916
+ summary: 'SVG image not named',
917
+ why: 'User cannot get help to know what is in an image',
918
+ wcag: '1.1.1',
919
+ weight: 4,
920
+ tools: {
921
+ wax: {
922
+ 'Add alternative text to <svg> elements with an img, graphics-document, or graphics-symbol role.': {
923
+ variable: false,
924
+ quality: 1,
925
+ what: 'Element is svg with an image role but has no accessible name'
724
926
  }
725
927
  }
726
928
  }
@@ -802,6 +1004,13 @@ exports.issues = {
802
1004
  what: 'Image text alternative is a URL instead'
803
1005
  }
804
1006
  },
1007
+ testaro: {
1008
+ altScheme: {
1009
+ variable: false,
1010
+ quality: 1,
1011
+ what: 'Image text alternative is a URL'
1012
+ }
1013
+ }
805
1014
  }
806
1015
  },
807
1016
  imageTextRisk: {
@@ -822,13 +1031,6 @@ exports.issues = {
822
1031
  what: 'Text alternative may fail to give information provided by colors'
823
1032
  }
824
1033
  },
825
- qualWeb: {
826
- 'QW-WCAG-T8': {
827
- variable: false,
828
- quality: 1,
829
- what: 'Text alternative is suspect'
830
- }
831
- },
832
1034
  wave: {
833
1035
  alt_suspicious: {
834
1036
  variable: false,
@@ -838,21 +1040,6 @@ exports.issues = {
838
1040
  }
839
1041
  }
840
1042
  },
841
- imageNoSource: {
842
- summary: 'image has no src',
843
- why: 'Image to be shown cannot be found',
844
- wcag: '1.3.1',
845
- weight: 4,
846
- tools: {
847
- nuVal: {
848
- 'Element img is missing required attribute src.': {
849
- variable: false,
850
- quality: 1,
851
- what: 'img element has no src attribute'
852
- }
853
- }
854
- }
855
- },
856
1043
  sourceEmpty: {
857
1044
  summary: 'src empty',
858
1045
  why: 'Image, audio, or video to be shown cannot be found',
@@ -1172,6 +1359,11 @@ exports.issues = {
1172
1359
  variable: false,
1173
1360
  quality: 1,
1174
1361
  what: 'html element has no lang attribute'
1362
+ },
1363
+ 'The html element should have a lang or xml:lang attribute which describes the language of the document.': {
1364
+ variable: false,
1365
+ quality: 1,
1366
+ what: 'html element has no lang or xml:lang attribute'
1175
1367
  }
1176
1368
  }
1177
1369
  }
@@ -1229,6 +1421,13 @@ exports.issues = {
1229
1421
  quality: 1,
1230
1422
  what: 'HTML lang and xml:lang do not match'
1231
1423
  }
1424
+ },
1425
+ wax: {
1426
+ 'Use valid values for lang attributes.': {
1427
+ variable: false,
1428
+ quality: 1,
1429
+ what: 'lang attribute of the html element has an invalid value'
1430
+ }
1232
1431
  }
1233
1432
  }
1234
1433
  },
@@ -1322,6 +1521,11 @@ exports.issues = {
1322
1521
  variable: false,
1323
1522
  quality: 1,
1324
1523
  what: 'Node is ARIA dialog or alertdialog but has no accessible name'
1524
+ },
1525
+ 'Add accessible names to ARIA dialog and alertdialog elements.': {
1526
+ variable: false,
1527
+ quality: 1,
1528
+ what: 'Node is ARIA dialog or alertdialog but has no accessible name'
1325
1529
  }
1326
1530
  }
1327
1531
  }
@@ -1601,6 +1805,13 @@ exports.issues = {
1601
1805
  quality: 1,
1602
1806
  what: 'Broken same-page link'
1603
1807
  }
1808
+ },
1809
+ wax: {
1810
+ '^This link points to a named anchor ".+" within the document, but no anchor exists with that name.+$': {
1811
+ variable: true,
1812
+ quality: 1,
1813
+ what: 'Broken same-page link'
1814
+ }
1604
1815
  }
1605
1816
  }
1606
1817
  },
@@ -1637,6 +1848,13 @@ exports.issues = {
1637
1848
  quality: 1,
1638
1849
  what: 'for attribute of the label element does not reference a non-hidden form control'
1639
1850
  }
1851
+ },
1852
+ wax: {
1853
+ 'This label\'s "for" attribute contains an ID for an element that is not a form control. Ensure that you have entered the correct ID for the intended element.': {
1854
+ variable: false,
1855
+ quality: 1,
1856
+ what: 'for attribute of the label element does not reference a form control'
1857
+ }
1640
1858
  }
1641
1859
  }
1642
1860
  },
@@ -1840,6 +2058,18 @@ exports.issues = {
1840
2058
  quality: 1,
1841
2059
  what: 'Orphaned form label'
1842
2060
  }
2061
+ },
2062
+ wax: {
2063
+ '^This form control contains an aria-labelledby attribute, however it includes an ID "[^"]+" that does not exist on an element. The aria-labelledby attribute will be ignored for labelling test purposes\.$': {
2064
+ variable: true,
2065
+ quality: 1,
2066
+ what: 'aria-labelledby value is not the id of any element'
2067
+ },
2068
+ 'This label\'s "for" attribute contains an ID that does not exist in the document fragment.': {
2069
+ variable: false,
2070
+ quality: 1,
2071
+ what: 'label has a for attribute whose value is not the id of any element'
2072
+ }
1843
2073
  }
1844
2074
  }
1845
2075
  },
@@ -1916,13 +2146,6 @@ exports.issues = {
1916
2146
  what: 'Link has no accessible name'
1917
2147
  }
1918
2148
  },
1919
- aslint: {
1920
- img_empty_alt_in_link: {
1921
- variable: false,
1922
- quality: 1,
1923
- what: 'Element is an image in a link but has no text alternative'
1924
- }
1925
- },
1926
2149
  axe: {
1927
2150
  'link-name': {
1928
2151
  variable: false,
@@ -1931,11 +2154,6 @@ exports.issues = {
1931
2154
  }
1932
2155
  },
1933
2156
  ed11y: {
1934
- altEmptyLinked: {
1935
- variable: false,
1936
- quality: 1,
1937
- what: 'Link name is only an image with no text alternative'
1938
- },
1939
2157
  linkNoText: {
1940
2158
  variable: false,
1941
2159
  quality: 1,
@@ -1943,11 +2161,6 @@ exports.issues = {
1943
2161
  }
1944
2162
  },
1945
2163
  htmlcs: {
1946
- 'AAA.1_1_1.H30.2': {
1947
- variable: false,
1948
- quality: 1,
1949
- what: 'img element is the only link content but has no text alternative'
1950
- },
1951
2164
  'AAA.4_1_2.H91.A.Empty': {
1952
2165
  variable: false,
1953
2166
  quality: 1,
@@ -1981,11 +2194,6 @@ exports.issues = {
1981
2194
  variable: false,
1982
2195
  quality: 1,
1983
2196
  what: 'Link has no accessible name'
1984
- },
1985
- 'QW-WCAG-T21': {
1986
- variable: false,
1987
- quality: 1,
1988
- what: 'Accessible name is not provided for an image which is the only content in a link'
1989
2197
  }
1990
2198
  },
1991
2199
  wave: {
@@ -1993,7 +2201,67 @@ exports.issues = {
1993
2201
  variable: false,
1994
2202
  quality: 1,
1995
2203
  what: 'Link contains not named'
2204
+ }
2205
+ },
2206
+ wax: {
2207
+ 'Links must have discernible text': {
2208
+ variable: false,
2209
+ quality: 1,
2210
+ what: 'Link has no discernible text'
1996
2211
  },
2212
+ 'Provide discernible text for links.': {
2213
+ variable: false,
2214
+ quality: 1,
2215
+ what: 'Link has no discernible text'
2216
+ },
2217
+ 'Anchor element found with a valid href attribute, but no link content has been supplied.': {
2218
+ variable: false,
2219
+ quality: 1,
2220
+ what: 'Link has an href attribute but no content'
2221
+ },
2222
+ 'Anchor element found with no link content and no name and/or ID attribute.': {
2223
+ variable: false,
2224
+ quality: 1,
2225
+ what: 'Link has no content, accessible name, or id attribute'
2226
+ }
2227
+ }
2228
+ }
2229
+ },
2230
+ imageLinkNoText: {
2231
+ summary: 'link not named',
2232
+ why: 'User cannot get help understanding what a link points to',
2233
+ wcag: '2.4.4',
2234
+ weight: 4,
2235
+ tools: {
2236
+ aslint: {
2237
+ img_empty_alt_in_link: {
2238
+ variable: false,
2239
+ quality: 1,
2240
+ what: 'Element is an image in a link but has no text alternative'
2241
+ }
2242
+ },
2243
+ ed11y: {
2244
+ altEmptyLinked: {
2245
+ variable: false,
2246
+ quality: 1,
2247
+ what: 'Link name is only an image with no text alternative'
2248
+ }
2249
+ },
2250
+ htmlcs: {
2251
+ 'AAA.1_1_1.H30.2': {
2252
+ variable: false,
2253
+ quality: 1,
2254
+ what: 'img element is the only link content but has no text alternative'
2255
+ }
2256
+ },
2257
+ qualWeb: {
2258
+ 'QW-WCAG-T21': {
2259
+ variable: false,
2260
+ quality: 1,
2261
+ what: 'Accessible name is not provided for an image which is the only content in a link'
2262
+ }
2263
+ },
2264
+ wave: {
1997
2265
  alt_link_missing: {
1998
2266
  variable: false,
1999
2267
  quality: 1,
@@ -2001,10 +2269,15 @@ exports.issues = {
2001
2269
  }
2002
2270
  },
2003
2271
  wax: {
2004
- 'Links must have discernible text': {
2272
+ 'Img element is the only content of the link, but is missing alt text.': {
2005
2273
  variable: false,
2006
2274
  quality: 1,
2007
- what: 'Link has no discernible text'
2275
+ what: 'Link content is an image without a text alternative'
2276
+ },
2277
+ 'Img element is the only content of the link, but is missing alt text. The alt text should describe the purpose of the link.': {
2278
+ variable: false,
2279
+ quality: 1,
2280
+ what: 'Link content is an image without a text alternative describing the link purpose'
2008
2281
  }
2009
2282
  }
2010
2283
  }
@@ -2021,6 +2294,13 @@ exports.issues = {
2021
2294
  quality: 1,
2022
2295
  what: 'Link has text but no href, id, or name attribute'
2023
2296
  }
2297
+ },
2298
+ wax: {
2299
+ 'Anchor element found with link content, but no href, ID or name attribute has been supplied.': {
2300
+ variable: false,
2301
+ quality: 1,
2302
+ what: 'Link has text but no href, id, or name attribute'
2303
+ }
2024
2304
  }
2025
2305
  }
2026
2306
  },
@@ -2048,6 +2328,13 @@ exports.issues = {
2048
2328
  quality: 1,
2049
2329
  what: 'Element has an empty href attribute'
2050
2330
  }
2331
+ },
2332
+ wax: {
2333
+ 'Link element is missing a non-empty href attribute pointing to the resource being linked.': {
2334
+ variable: false,
2335
+ quality: 1,
2336
+ what: 'link element is missing a non-empty href for the linked resource'
2337
+ }
2051
2338
  }
2052
2339
  }
2053
2340
  },
@@ -2186,6 +2473,13 @@ exports.issues = {
2186
2473
  quality: 1,
2187
2474
  what: 'textarea element has no accessible name'
2188
2475
  }
2476
+ },
2477
+ wax: {
2478
+ 'This textarea element does not have a name available to an accessibility API. Valid names are: label element, title , aria-label , aria-labelledby , aria-description , aria-describedby .': {
2479
+ variable: false,
2480
+ quality: 1,
2481
+ what: 'textarea element has no accessible name'
2482
+ }
2189
2483
  }
2190
2484
  }
2191
2485
  },
@@ -2210,13 +2504,6 @@ exports.issues = {
2210
2504
  wcag: '2.4.4',
2211
2505
  weight: 2,
2212
2506
  tools: {
2213
- aslint: {
2214
- links_same_content_different_url: {
2215
- variable: false,
2216
- quality: 1,
2217
- what: 'Links with the same text content have different destination URLs'
2218
- }
2219
- },
2220
2507
  qualWeb: {
2221
2508
  'QW-ACT-R9': {
2222
2509
  variable: false,
@@ -2269,7 +2556,7 @@ exports.issues = {
2269
2556
  }
2270
2557
  },
2271
2558
  linkPair: {
2272
- summary: 'text and image link not combined',
2559
+ summary: 'adjacent links not combined',
2273
2560
  why: 'Keyboard-only user expends extra effort to skip a link',
2274
2561
  wcag: '2.4.4',
2275
2562
  weight: 2,
@@ -2443,6 +2730,11 @@ exports.issues = {
2443
2730
  variable: false,
2444
2731
  quality: 1,
2445
2732
  what: 'Element is select and has no multiple attribute, but has more than 1 selected option'
2733
+ },
2734
+ 'A select element with a required attribute, and without a multiple attribute, and without a size attribute whose value is greater than 1, must have a child option element.': {
2735
+ variable: false,
2736
+ quality: 1,
2737
+ what: 'Element is select and has no child option element, but its attributes require one'
2446
2738
  }
2447
2739
  }
2448
2740
  }
@@ -2462,9 +2754,24 @@ exports.issues = {
2462
2754
  }
2463
2755
  }
2464
2756
  },
2757
+ buttonNoContent: {
2758
+ summary: 'button name not visible',
2759
+ why: 'User cannot get help explaining a button',
2760
+ wcag: '4.1.2',
2761
+ weight: 1,
2762
+ tools: {
2763
+ aslint: {
2764
+ empty_button_description: {
2765
+ variable: false,
2766
+ quality: 1,
2767
+ what: 'button element has no visible accessible name'
2768
+ }
2769
+ }
2770
+ }
2771
+ },
2465
2772
  buttonNoText: {
2466
2773
  summary: 'button not named',
2467
- why: 'User cannot get help explaing a button',
2774
+ why: 'User cannot get help explaining a button',
2468
2775
  wcag: '4.1.2',
2469
2776
  weight: 4,
2470
2777
  tools: {
@@ -2475,13 +2782,6 @@ exports.issues = {
2475
2782
  what: 'button element has no accessible name'
2476
2783
  }
2477
2784
  },
2478
- aslint: {
2479
- empty_button_description: {
2480
- variable: false,
2481
- quality: 1,
2482
- what: 'button element has no visible accessible name'
2483
- }
2484
- },
2485
2785
  axe: {
2486
2786
  'aria-command-name': {
2487
2787
  variable: false,
@@ -2563,10 +2863,35 @@ exports.issues = {
2563
2863
  quality: 1,
2564
2864
  what: 'button element has no discernible text'
2565
2865
  },
2866
+ 'This button element does not have a name available to an accessibility API. Valid names are: title , element content, aria-label , aria-labelledby , aria-description , aria-describedby .': {
2867
+ variable: false,
2868
+ quality: 1,
2869
+ what: 'button element has no accessible name'
2870
+ },
2871
+ 'This element has role of "button" but does not have a name available to an accessibility API. Valid names are: element content, aria-label , aria-labelledby , aria-description , aria-describedby .': {
2872
+ variable: false,
2873
+ quality: 1,
2874
+ what: 'Element with a button role has no accessible name'
2875
+ },
2876
+ 'This element has role of "button" but does not have a name available to an accessibility API. Valid names are: title , element content, aria-label , aria-labelledby , aria-description , aria-describedby .': {
2877
+ variable: false,
2878
+ quality: 1,
2879
+ what: 'Element with a button role has no accessible name'
2880
+ },
2566
2881
  'Input buttons must have discernible text': {
2567
2882
  variable: false,
2568
2883
  quality: 1,
2569
2884
  what: 'input element with button type has no discernible text'
2885
+ },
2886
+ 'Provide discernible text for input buttons.': {
2887
+ variable: false,
2888
+ quality: 1,
2889
+ what: 'input element with button type has no discernible text'
2890
+ },
2891
+ 'This buttoninput element does not have a name available to an accessibility API. Valid names are: value , aria-label , aria-labelledby , aria-description , aria-describedby .': {
2892
+ variable: false,
2893
+ quality: 1,
2894
+ what: 'input element with button type has no accessible name'
2570
2895
  }
2571
2896
  }
2572
2897
  }
@@ -2632,6 +2957,11 @@ exports.issues = {
2632
2957
  variable: false,
2633
2958
  quality: 1,
2634
2959
  what: 'ARIA role is not contained by a required parent'
2960
+ },
2961
+ 'Ensure elements with ARIA roles are within required parent roles.': {
2962
+ variable: false,
2963
+ quality: 1,
2964
+ what: 'ARIA role is not contained by a required parent'
2635
2965
  }
2636
2966
  }
2637
2967
  }
@@ -2656,6 +2986,13 @@ exports.issues = {
2656
2986
  what: 'ARIA role does not contain a required child'
2657
2987
  }
2658
2988
  },
2989
+ nuVal: {
2990
+ '^Element .+ is missing a required instance of child element .+$': {
2991
+ variable: true,
2992
+ quality: 1,
2993
+ what: 'Element is missing a required child'
2994
+ }
2995
+ },
2659
2996
  qualWeb: {
2660
2997
  'QW-ACT-R38': {
2661
2998
  variable: false,
@@ -2668,6 +3005,11 @@ exports.issues = {
2668
3005
  variable: false,
2669
3006
  quality: 1,
2670
3007
  what: 'ARIA role does not contain a required child'
3008
+ },
3009
+ 'Ensure elements with ARIA roles contain required child roles.': {
3010
+ variable: false,
3011
+ quality: 1,
3012
+ what: 'Element does not contain a child required by its ARIA role'
2671
3013
  }
2672
3014
  }
2673
3015
  }
@@ -2857,6 +3199,11 @@ exports.issues = {
2857
3199
  variable: false,
2858
3200
  quality: 1,
2859
3201
  what: 'Element disables zooming or scaling'
3202
+ },
3203
+ 'Ensure <meta name="viewport"> does not disable text scaling and zooming.': {
3204
+ variable: false,
3205
+ quality: 1,
3206
+ what: 'Element disables zooming or scaling'
2860
3207
  }
2861
3208
  }
2862
3209
  }
@@ -2873,13 +3220,6 @@ exports.issues = {
2873
3220
  quality: 1,
2874
3221
  what: 'Paragraph text has an absolute font size'
2875
3222
  }
2876
- },
2877
- qualWeb: {
2878
- 'QW-WCAG-T28': {
2879
- variable: false,
2880
- quality: 0.8,
2881
- what: 'Font size set to an absolute unit value'
2882
- }
2883
3223
  }
2884
3224
  }
2885
3225
  },
@@ -3003,13 +3343,6 @@ exports.issues = {
3003
3343
  wcag: '1.4.8',
3004
3344
  weight: 2,
3005
3345
  tools: {
3006
- alfa: {
3007
- r73: {
3008
- variable: false,
3009
- quality: 1,
3010
- what: 'Text line height is not at least 1.5'
3011
- }
3012
- },
3013
3346
  testaro: {
3014
3347
  lineHeight: {
3015
3348
  variable: false,
@@ -3114,7 +3447,7 @@ exports.issues = {
3114
3447
  }
3115
3448
  }
3116
3449
  },
3117
- linkElementBad: {
3450
+ linkElementMisplaced: {
3118
3451
  summary: 'link element invalid',
3119
3452
  why: 'Document fails to get a needed external resource',
3120
3453
  wcag: '1.3.1',
@@ -3125,7 +3458,31 @@ exports.issues = {
3125
3458
  variable: false,
3126
3459
  quality: 1,
3127
3460
  what: 'Element is not in the document head'
3128
- },
3461
+ }
3462
+ },
3463
+ nuVal: {
3464
+ 'A link element must not appear as a descendant of a body element unless the link element has an itemprop attribute or has a rel attribute whose value contains dns-prefetch, modulepreload, pingback, preconnect, prefetch, preload, prerender, or stylesheet.': {
3465
+ variable: false,
3466
+ quality: 1,
3467
+ what: 'Element has a body ancestor but no itemprop or valid rel attribute'
3468
+ }
3469
+ },
3470
+ wax: {
3471
+ 'Link elements can only be located in the head section of the document.': {
3472
+ variable: false,
3473
+ quality: 1,
3474
+ what: 'link element is not located in the head element'
3475
+ }
3476
+ }
3477
+ }
3478
+ },
3479
+ linkElementBad: {
3480
+ summary: 'link element invalid',
3481
+ why: 'Document fails to get a needed external resource',
3482
+ wcag: '1.3.1',
3483
+ weight: 4,
3484
+ tools: {
3485
+ htmlcs: {
3129
3486
  'AAA.2_4_8.H59.2a': {
3130
3487
  variable: false,
3131
3488
  quality: 1,
@@ -3138,11 +3495,6 @@ exports.issues = {
3138
3495
  }
3139
3496
  },
3140
3497
  nuVal: {
3141
- 'A link element must not appear as a descendant of a body element unless the link element has an itemprop attribute or has a rel attribute whose value contains dns-prefetch, modulepreload, pingback, preconnect, prefetch, preload, prerender, or stylesheet.': {
3142
- variable: false,
3143
- quality: 1,
3144
- what: 'Element has a body ancestor but no itemprop or valid rel attribute'
3145
- },
3146
3498
  'A link element with an as attribute must have a rel attribute that contains the value preload or the value modulepreload or the value prefetch.': {
3147
3499
  variable: false,
3148
3500
  quality: 1,
@@ -3158,6 +3510,13 @@ exports.issues = {
3158
3510
  quality: 1,
3159
3511
  what: 'Element has a color attribute but no rel attribute with mask-icon as its value'
3160
3512
  }
3513
+ },
3514
+ wax: {
3515
+ 'Link element is missing a non-empty rel attribute identifying the link type.': {
3516
+ variable: false,
3517
+ quality: 1,
3518
+ what: 'Element is link, but its rel attribute is empty or missing'
3519
+ }
3161
3520
  }
3162
3521
  }
3163
3522
  },
@@ -3216,6 +3575,21 @@ exports.issues = {
3216
3575
  }
3217
3576
  }
3218
3577
  },
3578
+ metaMisplaced: {
3579
+ summary: 'meta element in invalid location',
3580
+ why: 'Document fails to provide needed data',
3581
+ wcag: '1.3.1',
3582
+ weight: 4,
3583
+ tools: {
3584
+ nuVal: {
3585
+ 'meta element between head and body.': {
3586
+ variable: false,
3587
+ quality: 1,
3588
+ what: 'meta element is between the head and body elements'
3589
+ }
3590
+ }
3591
+ }
3592
+ },
3219
3593
  scriptElementBad: {
3220
3594
  summary: 'script element invalid',
3221
3595
  why: 'Browser processes the document improperly',
@@ -3318,11 +3692,6 @@ exports.issues = {
3318
3692
  }
3319
3693
  },
3320
3694
  qualWeb: {
3321
- 'QW-ACT-R10': {
3322
- variable: false,
3323
- quality: 1,
3324
- what: 'iframe elements with identical accessible names have different purposes'
3325
- },
3326
3695
  'QW-ACT-R19': {
3327
3696
  variable: false,
3328
3697
  quality: 1,
@@ -3339,6 +3708,11 @@ exports.issues = {
3339
3708
  variable: false,
3340
3709
  quality: 1,
3341
3710
  what: 'iframe or frame element has no accessible name'
3711
+ },
3712
+ 'Iframe element requires a non-empty title attribute that identifies the frame.': {
3713
+ variable: false,
3714
+ quality: 1,
3715
+ what: 'iframe element has no title attribute identifying it'
3342
3716
  }
3343
3717
  }
3344
3718
  }
@@ -3655,7 +4029,12 @@ exports.issues = {
3655
4029
  'Elements must only use allowed ARIA attributes': {
3656
4030
  variable: false,
3657
4031
  quality: 1,
3658
- what: 'Element has an attribute that is not allowed'
4032
+ what: 'Element has an ARIA attribute that is not allowed'
4033
+ },
4034
+ 'Ensure ARIA attributes used are permitted for the element\'s role.': {
4035
+ variable: false,
4036
+ quality: 1,
4037
+ what: 'Element has an ARIA attribute that is invalid for the role of the element'
3659
4038
  }
3660
4039
  },
3661
4040
  }
@@ -3699,6 +4078,13 @@ exports.issues = {
3699
4078
  quality: 1,
3700
4079
  what: 'script element with a defer attribute has type="module"'
3701
4080
  }
4081
+ },
4082
+ wax: {
4083
+ 'Ensure ARIA attributes have valid values as per specifications.': {
4084
+ variable: false,
4085
+ quality: 1,
4086
+ what: 'Value of an ARIA attribute on the element is invalid'
4087
+ }
3702
4088
  }
3703
4089
  }
3704
4090
  },
@@ -3708,20 +4094,6 @@ exports.issues = {
3708
4094
  wcag: '4.1.2',
3709
4095
  weight: 4,
3710
4096
  tools: {
3711
- axe: {
3712
- 'aria-required-attr': {
3713
- variable: false,
3714
- quality: 1,
3715
- what: 'Required ARIA attribute is not provided'
3716
- }
3717
- },
3718
- ibm: {
3719
- aria_attribute_required: {
3720
- variable: false,
3721
- quality: 1,
3722
- what: 'Element does not have the ARIA attribute required by its role'
3723
- }
3724
- },
3725
4097
  nuVal: {
3726
4098
  '^Element image is missing required attribute (?:height|width).*$': {
3727
4099
  variable: true,
@@ -3794,6 +4166,20 @@ exports.issues = {
3794
4166
  what: 'Element does not have all required states and properties'
3795
4167
  }
3796
4168
  },
4169
+ axe: {
4170
+ 'aria-required-attr': {
4171
+ variable: false,
4172
+ quality: 1,
4173
+ what: 'Required ARIA attribute is not provided'
4174
+ }
4175
+ },
4176
+ ibm: {
4177
+ aria_attribute_required: {
4178
+ variable: false,
4179
+ quality: 1,
4180
+ what: 'Element does not have an ARIA attribute required by its role'
4181
+ }
4182
+ },
3797
4183
  nuVal: {
3798
4184
  '^Element .+ is missing required attribute aria-.+$': {
3799
4185
  variable: true,
@@ -3807,6 +4193,13 @@ exports.issues = {
3807
4193
  quality: 1,
3808
4194
  what: 'Element with a role attribute does not have the required states and properties'
3809
4195
  }
4196
+ },
4197
+ wax: {
4198
+ 'Include required ARIA attributes for elements with ARIA roles.': {
4199
+ variable: false,
4200
+ quality: 1,
4201
+ what: 'Element does not have an ARIA attribute required by the role of the element'
4202
+ }
3810
4203
  }
3811
4204
  }
3812
4205
  },
@@ -3886,6 +4279,11 @@ exports.issues = {
3886
4279
  quality: 1,
3887
4280
  what: 'ARIA attribute is invalid for the role'
3888
4281
  },
4282
+ aria_attribute_exists: {
4283
+ variable: false,
4284
+ quality: 1,
4285
+ what: 'ARIA attribute has an empty value'
4286
+ },
3889
4287
  Rpt_Aria_ValidPropertyValue: {
3890
4288
  variable: false,
3891
4289
  quality: 1,
@@ -3955,6 +4353,18 @@ exports.issues = {
3955
4353
  quality: 1,
3956
4354
  what: 'ARIA state or property has an invalid value'
3957
4355
  }
4356
+ },
4357
+ wax: {
4358
+ 'Apply aria-roledescription only to elements with a valid ARIA role.': {
4359
+ variable: false,
4360
+ quality: 1,
4361
+ what: 'Element has no valid ARIA role but has an aria-roledescription attribute'
4362
+ },
4363
+ 'Use only valid ARIA attributes that conform to specifications.': {
4364
+ variable: false,
4365
+ quality: 1,
4366
+ what: 'Element has an invalid ARIA attribute'
4367
+ }
3958
4368
  }
3959
4369
  }
3960
4370
  },
@@ -3985,6 +4395,21 @@ exports.issues = {
3985
4395
  }
3986
4396
  }
3987
4397
  },
4398
+ ariaVersusHTML: {
4399
+ summary: 'aria and HTML attributes have conflicting value',
4400
+ why: 'User gets erroneous help with content',
4401
+ wcag: '4.1.2',
4402
+ weight: 4,
4403
+ tools: {
4404
+ ibm: {
4405
+ aria_attribute_conflict: {
4406
+ variable: false,
4407
+ quality: 1,
4408
+ what: 'ARIA and HTML attributes on the same element have conflicting values'
4409
+ }
4410
+ }
4411
+ }
4412
+ },
3988
4413
  ariaReferenceBad: {
3989
4414
  summary: 'aria reference invalid',
3990
4415
  why: 'Item behavior violates user expectations',
@@ -4066,6 +4491,13 @@ exports.issues = {
4066
4491
  quality: 1,
4067
4492
  what: 'autocomplete attribute has no valid value'
4068
4493
  }
4494
+ },
4495
+ wax: {
4496
+ '^Element does not belong to .+ control group\. Invalid autocomplete value has been provided - .+$': {
4497
+ variable: true,
4498
+ quality: 1,
4499
+ what: 'autocomplete attribute has an invalid value'
4500
+ }
4069
4501
  }
4070
4502
  }
4071
4503
  },
@@ -4096,6 +4528,13 @@ exports.issues = {
4096
4528
  quality: 1,
4097
4529
  what: 'Element contains a potentially faulty value in its autocomplete attribute'
4098
4530
  }
4531
+ },
4532
+ wax: {
4533
+ 'This element contains a potentially faulty value in its autocomplete attribute: .': {
4534
+ variable: false,
4535
+ quality: 1,
4536
+ what: 'Element contains a potentially faulty value in its autocomplete attribute'
4537
+ }
4099
4538
  }
4100
4539
  }
4101
4540
  },
@@ -4129,9 +4568,9 @@ exports.issues = {
4129
4568
  }
4130
4569
  }
4131
4570
  },
4132
- textContrastAA: {
4133
- summary: 'text contrast poor',
4134
- why: 'Text is difficult to read',
4571
+ contrastAA: {
4572
+ summary: 'contrast poor',
4573
+ why: 'Content is difficult to understand',
4135
4574
  wcag: '1.4.3',
4136
4575
  weight: 4,
4137
4576
  tools: {
@@ -4165,7 +4604,7 @@ exports.issues = {
4165
4604
  'AAA.1_4_3.G145.Fail': {
4166
4605
  variable: false,
4167
4606
  quality: 1,
4168
- what: 'Contrast between the text and its background is less than 3:1.'
4607
+ what: 'Contrast between the text and its background is less than 3:1'
4169
4608
  },
4170
4609
  'AAA.1_4_3.G18.Fail': {
4171
4610
  variable: false,
@@ -4185,55 +4624,30 @@ exports.issues = {
4185
4624
  what: 'Text has a contrast with its background less than the WCAG AA minimum for its size and weight'
4186
4625
  }
4187
4626
  },
4188
- qualWeb: {
4189
- 'QW-ACT-R37': {
4190
- variable: false,
4191
- quality: 1,
4192
- what: 'Text has less than the minimum contrast'
4193
- }
4194
- },
4195
4627
  wave: {
4196
4628
  contrast: {
4197
4629
  variable: false,
4198
4630
  quality: 1,
4199
4631
  what: 'Very low contrast'
4200
4632
  }
4201
- }
4202
- }
4203
- },
4204
- colorMissing: {
4205
- summary: 'color missing',
4206
- why: 'Content is impossible to perceive under some conditions',
4207
- wcag: '1.4.3',
4208
- weight: 4,
4209
- tools: {
4210
- qualWeb: {
4211
- 'QW-WCAG-T31': {
4212
- variable: false,
4633
+ },
4634
+ wax: {
4635
+ '^This element has insufficient contrast at this conformance level\. Expected a contrast ratio of at least 3:1, but text in this element has a contrast ratio of .+\. Recommendation: change .+ to #.+$': {
4636
+ variable: true,
4213
4637
  quality: 1,
4214
- what: 'Foreground or background color is specified but not both'
4215
- }
4216
- }
4217
- }
4218
- },
4219
- colorNamedRisk: {
4220
- summary: 'color perception required?',
4221
- why: 'Content is impossible to perceive under some conditions',
4222
- wcag: '1.4.1',
4223
- weight: 1,
4224
- tools: {
4225
- qualWeb: {
4226
- 'text-color-convey-information': {
4227
- variable: false,
4638
+ what: 'Contrast between the element text and its background is less than 3:1'
4639
+ },
4640
+ '^This element has insufficient contrast at this conformance level\. Expected a contrast ratio of at least 4\.5:1, but text in this element has a contrast ratio of .+\. Recommendation: change .+ to #.+$': {
4641
+ variable: true,
4228
4642
  quality: 1,
4229
- what: 'Text naming a color may require the ability to distinguish colors'
4643
+ what: 'Contrast between the element text and its background is less than 4.5:1'
4230
4644
  }
4231
4645
  }
4232
4646
  }
4233
4647
  },
4234
4648
  contrastAAA: {
4235
4649
  summary: 'text contrast improvable',
4236
- why: 'Text is difficult to read',
4650
+ why: 'Content is not easy to understand',
4237
4651
  wcag: '1.4.6',
4238
4652
  weight: 1,
4239
4653
  tools: {
@@ -4279,7 +4693,14 @@ exports.issues = {
4279
4693
  'QW-ACT-R76': {
4280
4694
  variable: false,
4281
4695
  quality: 1,
4282
- what: 'Text has less than the enhanced minimum contrast'
4696
+ what: 'Text has less than the enhanced minimum contrast'
4697
+ }
4698
+ },
4699
+ wax: {
4700
+ '^This element has insufficient contrast at this conformance level\. Expected a contrast ratio of at least 7:1, but text in this element has a contrast ratio of .+\. Recommendation: change .+ to #.+$': {
4701
+ variable: true,
4702
+ quality: 1,
4703
+ what: 'Contrast between the element text and its background is less than 7:1'
4283
4704
  }
4284
4705
  }
4285
4706
  }
@@ -4375,6 +4796,28 @@ exports.issues = {
4375
4796
  quality: 1,
4376
4797
  what: 'Contrast between the text and its background image may be less than 7:1'
4377
4798
  }
4799
+ },
4800
+ qualWeb: {
4801
+ 'QW-ACT-R37': {
4802
+ variable: false,
4803
+ quality: 1,
4804
+ what: 'Text has less than the minimum contrast or has an image background'
4805
+ }
4806
+ }
4807
+ }
4808
+ },
4809
+ colorNamedRisk: {
4810
+ summary: 'color perception required?',
4811
+ why: 'Content is impossible to perceive under some conditions',
4812
+ wcag: '1.4.1',
4813
+ weight: 1,
4814
+ tools: {
4815
+ qualWeb: {
4816
+ 'text-color-convey-information': {
4817
+ variable: false,
4818
+ quality: 1,
4819
+ what: 'Text naming a color may require the ability to distinguish colors'
4820
+ }
4378
4821
  }
4379
4822
  }
4380
4823
  },
@@ -4511,6 +4954,13 @@ exports.issues = {
4511
4954
  quality: 1,
4512
4955
  what: 'No content between two headings of the same level'
4513
4956
  }
4957
+ },
4958
+ wax: {
4959
+ 'Heading tag found with no content. Text that is not intended as a heading should not be marked up with heading tags.': {
4960
+ variable: false,
4961
+ quality: 1,
4962
+ what: 'No content after a heading'
4963
+ }
4514
4964
  }
4515
4965
  }
4516
4966
  },
@@ -4681,6 +5131,13 @@ exports.issues = {
4681
5131
  quality: 1,
4682
5132
  what: 'Element has an empty title attribute'
4683
5133
  }
5134
+ },
5135
+ wax: {
5136
+ 'This form control has a "title" attribute that is empty or contains only spaces. It will be ignored for labelling test purposes.': {
5137
+ variable: false,
5138
+ quality: 1,
5139
+ what: 'Element has an empty title attribute'
5140
+ }
4684
5141
  }
4685
5142
  }
4686
5143
  },
@@ -4826,6 +5283,11 @@ exports.issues = {
4826
5283
  variable: false,
4827
5284
  quality: 1,
4828
5285
  what: 'Document contains no title element'
5286
+ },
5287
+ 'A title should be provided for the document, using a non-empty title element in the head section.': {
5288
+ variable: false,
5289
+ quality: 1,
5290
+ what: 'Document contains no title element in the head element'
4829
5291
  }
4830
5292
  }
4831
5293
  }
@@ -4891,6 +5353,11 @@ exports.issues = {
4891
5353
  variable: false,
4892
5354
  quality: 1,
4893
5355
  what: 'Heading levels do not increase by only one'
5356
+ },
5357
+ 'Maintain a logical order by only increasing heading levels by one.': {
5358
+ variable: false,
5359
+ quality: 1,
5360
+ what: 'Heading levels do not increase by only one'
4894
5361
  }
4895
5362
  }
4896
5363
  }
@@ -4914,6 +5381,13 @@ exports.issues = {
4914
5381
  quality: 1,
4915
5382
  what: 'Heading level is incorrect'
4916
5383
  }
5384
+ },
5385
+ testaro: {
5386
+ secHeading: {
5387
+ variable: false,
5388
+ quality: 1,
5389
+ what: 'Sectioning container heading level is incorrect'
5390
+ }
4917
5391
  }
4918
5392
  }
4919
5393
  },
@@ -4936,6 +5410,13 @@ exports.issues = {
4936
5410
  quality: 1,
4937
5411
  what: 'Heading has the same text as a previous sibling heading at the same level'
4938
5412
  }
5413
+ },
5414
+ wax: {
5415
+ '^The heading structure is not logically nested. This h. element should be an h. to be properly nested.+$': {
5416
+ variable: true,
5417
+ quality: 1,
5418
+ what: 'Heading level is illogical'
5419
+ }
4939
5420
  }
4940
5421
  }
4941
5422
  },
@@ -5022,6 +5503,22 @@ exports.issues = {
5022
5503
  }
5023
5504
  }
5024
5505
  },
5506
+ docHeadingNotH1: {
5507
+ summary: 'primary heading not h1',
5508
+ why: 'User cannot understand the topic of the document',
5509
+ wcag: '1.3.1',
5510
+ weight: 2,
5511
+ max: 1,
5512
+ tools: {
5513
+ wax: {
5514
+ '^The heading structure is not logically nested. This h. element appears to be the primary document heading, so should be an h1 element.+$': {
5515
+ variable: true,
5516
+ quality: 1,
5517
+ what: 'Apparent primary document heading is not h1'
5518
+ }
5519
+ }
5520
+ }
5521
+ },
5025
5522
  articleHeadingless: {
5026
5523
  summary: 'article heading missing',
5027
5524
  why: 'User cannot understand the topic of a part of the document',
@@ -5163,6 +5660,20 @@ exports.issues = {
5163
5660
  quality: 1,
5164
5661
  what: 'Special text is designated nonsemantically with a (deprecated) font element'
5165
5662
  }
5663
+ },
5664
+ wax: {
5665
+ 'Semantic markup should be used to mark emphasised or special text so that it can be programmatically determined.': {
5666
+ variable: false,
5667
+ quality: 1,
5668
+ what: 'Special text is designated with styles instead of semantically'
5669
+ }
5670
+ },
5671
+ testaro: {
5672
+ textSem: {
5673
+ variable: false,
5674
+ quality: 1,
5675
+ what: 'Element is a nonsemantic i, b, or small element'
5676
+ }
5166
5677
  }
5167
5678
  }
5168
5679
  },
@@ -5306,6 +5817,11 @@ exports.issues = {
5306
5817
  variable: false,
5307
5818
  quality: 1,
5308
5819
  what: 'Element is ul or ol but directly contains an element other than li, script, or template'
5820
+ },
5821
+ 'Ensure lists are structured correctly with <li> elements.': {
5822
+ variable: false,
5823
+ quality: 1,
5824
+ what: 'List contains non-li items'
5309
5825
  }
5310
5826
  }
5311
5827
  }
@@ -5328,6 +5844,11 @@ exports.issues = {
5328
5844
  variable: false,
5329
5845
  quality: 1,
5330
5846
  what: 'Element is li but is not contained by a ul or ol element'
5847
+ },
5848
+ 'Ensure <li> elements are contained within <ul> or <ol>.': {
5849
+ variable: false,
5850
+ quality: 1,
5851
+ what: 'Element is li but is not contained by a ul or ol element'
5331
5852
  }
5332
5853
  }
5333
5854
  }
@@ -5473,6 +5994,11 @@ exports.issues = {
5473
5994
  variable: false,
5474
5995
  quality: 1,
5475
5996
  what: 'select element has no accessible name'
5997
+ },
5998
+ 'This select element does not have a name available to an accessibility API. Valid names are: label element, title , aria-label , aria-labelledby , aria-description , aria-describedby .': {
5999
+ variable: false,
6000
+ quality: 1,
6001
+ what: 'select element has no accessible name'
5476
6002
  }
5477
6003
  }
5478
6004
  }
@@ -5535,11 +6061,25 @@ exports.issues = {
5535
6061
  what: 'accesskey attribute value is not unique'
5536
6062
  }
5537
6063
  },
6064
+ ibm: {
6065
+ element_accesskey_unique: {
6066
+ variable: false,
6067
+ quality: 1,
6068
+ what: 'accesskey attribute value is not unique'
6069
+ }
6070
+ },
5538
6071
  wave: {
5539
6072
  accesskey: {
5540
6073
  variable: false,
5541
6074
  quality: 1,
5542
- what: 'Accesskey'
6075
+ what: 'accesskey invalid'
6076
+ }
6077
+ },
6078
+ wax: {
6079
+ 'Assign unique values to each accesskey attribute to avoid conflicts.': {
6080
+ variable: false,
6081
+ quality: 1,
6082
+ what: 'accesskey attribute value is not unique'
5543
6083
  }
5544
6084
  }
5545
6085
  }
@@ -5592,6 +6132,13 @@ exports.issues = {
5592
6132
  quality: 1,
5593
6133
  what: 'Radio buttons or check boxes may require a group description via a fieldset element'
5594
6134
  }
6135
+ },
6136
+ wax: {
6137
+ 'If these radio buttons or check boxes require a further group-level description, they should be contained within a fieldset element.': {
6138
+ variable: false,
6139
+ quality: 1,
6140
+ what: 'Radio buttons or check boxes may require a group description via a fieldset element'
6141
+ }
5595
6142
  }
5596
6143
  }
5597
6144
  },
@@ -5648,7 +6195,14 @@ exports.issues = {
5648
6195
  legend_missing: {
5649
6196
  variable: false,
5650
6197
  quality: 1,
5651
- what: 'Element has no legend element'
6198
+ what: 'fieldset element has no legend element'
6199
+ }
6200
+ },
6201
+ wax: {
6202
+ 'Fieldset does not contain a legend element. All fieldsets should contain a legend element that describes a description of the field group.': {
6203
+ variable: false,
6204
+ quality: 1,
6205
+ what: 'fieldset element has no legend element'
5652
6206
  }
5653
6207
  }
5654
6208
  }
@@ -5670,20 +6224,27 @@ exports.issues = {
5670
6224
  'AAA.4_1_2.H91.Fieldset.Name': {
5671
6225
  variable: false,
5672
6226
  quality: 1,
5673
- what: 'Fieldset has no accessible name'
6227
+ what: 'fieldset element has no accessible name'
5674
6228
  }
5675
6229
  },
5676
6230
  ibm: {
5677
6231
  group_withInputs_hasName: {
5678
6232
  variable: false,
5679
6233
  quality: 1,
5680
- what: 'Groups with nested inputs has no unique accessible name'
6234
+ what: 'Group with nested inputs has no unique accessible name'
5681
6235
  },
5682
6236
  fieldset_label_valid: {
5683
6237
  variable: false,
5684
6238
  quality: 1,
5685
6239
  what: 'Group or fieldset has no accessible name'
5686
6240
  }
6241
+ },
6242
+ wax: {
6243
+ 'This fieldset element does not have a name available to an accessibility API. Valid names are: legend element, aria-label , aria-labelledby , aria-description , aria-describedby .': {
6244
+ variable: false,
6245
+ quality: 1,
6246
+ what: 'fieldset element has no accessible name'
6247
+ }
5687
6248
  }
5688
6249
  }
5689
6250
  },
@@ -5693,6 +6254,13 @@ exports.issues = {
5693
6254
  wcag: '1.3.1',
5694
6255
  weight: 2,
5695
6256
  tools: {
6257
+ ibm: {
6258
+ table_structure_misuse: {
6259
+ variable: false,
6260
+ quality: 1,
6261
+ what: 'table has a presentation or none role but has a summary attribute or structural elements'
6262
+ }
6263
+ },
5696
6264
  qualWeb: {
5697
6265
  'QW-WCAG-T12': {
5698
6266
  variable: false,
@@ -6250,6 +6818,16 @@ exports.issues = {
6250
6818
  variable: false,
6251
6819
  quality: 1,
6252
6820
  what: 'Form input element has no label'
6821
+ },
6822
+ 'Ensure form elements have associated labels.': {
6823
+ variable: false,
6824
+ quality: 1,
6825
+ what: 'Form control element has no label'
6826
+ },
6827
+ 'Avoid using hidden labels, title, or aria-describedby attributes as the sole label for form elements.': {
6828
+ variable: false,
6829
+ quality: 1,
6830
+ what: 'Form control element has a substitute for a valid label'
6253
6831
  }
6254
6832
  }
6255
6833
  }
@@ -6360,7 +6938,7 @@ exports.issues = {
6360
6938
  }
6361
6939
  },
6362
6940
  testaro: {
6363
- targetSize: {
6941
+ targetSmall: {
6364
6942
  variable: false,
6365
6943
  quality: 1,
6366
6944
  what: 'Button, input, or non-inline link is smaller than 44 px wide and high'
@@ -6380,6 +6958,28 @@ exports.issues = {
6380
6958
  quality: 1,
6381
6959
  what: 'Target size is substandard'
6382
6960
  }
6961
+ },
6962
+ testaro: {
6963
+ targetTiny: {
6964
+ variable: false,
6965
+ quality: 1,
6966
+ what: 'Button, input, or non-inline link is smaller than 24 px wide and high'
6967
+ }
6968
+ }
6969
+ }
6970
+ },
6971
+ targetsNear: {
6972
+ summary: 'small targets too near to each other',
6973
+ why: 'User cannot reliably choose an item to click or tap',
6974
+ wcag: '2.5.8',
6975
+ weight: 3,
6976
+ tools: {
6977
+ ibm: {
6978
+ target_spacing_sufficient: {
6979
+ variable: false,
6980
+ quality: 1,
6981
+ what: 'Small targets are not far enough apart'
6982
+ }
6383
6983
  }
6384
6984
  }
6385
6985
  },
@@ -6511,6 +7111,11 @@ exports.issues = {
6511
7111
  variable: false,
6512
7112
  quality: 1,
6513
7113
  what: 'Interactive controls are nested'
7114
+ },
7115
+ 'Avoid nesting interactive controls to prevent screen reader and focus issues.': {
7116
+ variable: false,
7117
+ quality: 1,
7118
+ what: 'Interactive controls are nested'
6514
7119
  }
6515
7120
  }
6516
7121
  }
@@ -6586,13 +7191,6 @@ exports.issues = {
6586
7191
  what: 'Paragraph text is uppercased'
6587
7192
  }
6588
7193
  },
6589
- aslint: {
6590
- capital_letters_words: {
6591
- variable: false,
6592
- quality: 1,
6593
- what: 'Element or its title has entirely upper-case words'
6594
- }
6595
- },
6596
7194
  ed11y: {
6597
7195
  textUppercase: {
6598
7196
  variable: false,
@@ -6728,6 +7326,11 @@ exports.issues = {
6728
7326
  variable: false,
6729
7327
  quality: 1,
6730
7328
  what: 'Element is contentinfo but is within another landmark'
7329
+ },
7330
+ 'Ensure the contentinfo landmark is at the top level without being nested.': {
7331
+ variable: false,
7332
+ quality: 1,
7333
+ what: 'Element is contentinfo but is nested in another landmark'
6731
7334
  }
6732
7335
  }
6733
7336
  }
@@ -6792,6 +7395,13 @@ exports.issues = {
6792
7395
  quality: 1,
6793
7396
  what: 'main landmark is not at the top level'
6794
7397
  }
7398
+ },
7399
+ wax: {
7400
+ 'Place the main landmark at the top level, not within another landmark.': {
7401
+ variable: false,
7402
+ quality: 1,
7403
+ what: 'main landmark is not at the top level'
7404
+ }
6795
7405
  }
6796
7406
  }
6797
7407
  },
@@ -6858,6 +7468,13 @@ exports.issues = {
6858
7468
  quality: 1,
6859
7469
  what: 'Page includes more than 1 visible main element'
6860
7470
  }
7471
+ },
7472
+ wax: {
7473
+ 'Include only one main landmark in the document.': {
7474
+ variable: false,
7475
+ quality: 1,
7476
+ what: 'Page includes more than 1 main element'
7477
+ }
6861
7478
  }
6862
7479
  }
6863
7480
  },
@@ -6887,6 +7504,11 @@ exports.issues = {
6887
7504
  variable: false,
6888
7505
  quality: 1,
6889
7506
  what: 'Page has more than 1 banner landmark'
7507
+ },
7508
+ 'Limit the document to a single banner landmark.': {
7509
+ variable: false,
7510
+ quality: 1,
7511
+ what: 'Page has more than 1 banner landmark'
6890
7512
  }
6891
7513
  }
6892
7514
  }
@@ -6910,6 +7532,13 @@ exports.issues = {
6910
7532
  quality: 1,
6911
7533
  what: 'banner landmark is not at the top level'
6912
7534
  }
7535
+ },
7536
+ wax: {
7537
+ 'Place the banner landmark at the top level, not within another landmark.': {
7538
+ variable: false,
7539
+ quality: 1,
7540
+ what: 'banner is within another landmark'
7541
+ }
6913
7542
  }
6914
7543
  }
6915
7544
  },
@@ -6968,6 +7597,11 @@ exports.issues = {
6968
7597
  variable: false,
6969
7598
  quality: 1,
6970
7599
  what: 'Page has more than 1 contentinfo landmark'
7600
+ },
7601
+ 'Ensure there is only one contentinfo landmark in the document.': {
7602
+ variable: false,
7603
+ quality: 1,
7604
+ what: 'Page has more than 1 contentinfo landmark'
6971
7605
  }
6972
7606
  }
6973
7607
  }
@@ -6990,11 +7624,6 @@ exports.issues = {
6990
7624
  variable: false,
6991
7625
  quality: 1,
6992
7626
  what: 'Landmark has no unique aria-labelledby or aria-label among landmarks in the same parent region'
6993
- },
6994
- aria_landmark_name_unique: {
6995
- variable: false,
6996
- quality: 1,
6997
- what: 'Multiple landmarks with the same parent region are not distinguished from one another'
6998
7627
  }
6999
7628
  },
7000
7629
  wax: {
@@ -7002,6 +7631,11 @@ exports.issues = {
7002
7631
  variable: false,
7003
7632
  quality: 1,
7004
7633
  what: 'Landmark is indistinguishable from another by role or accessible name'
7634
+ },
7635
+ 'Provide unique role or role/label/title combinations for landmarks.': {
7636
+ variable: false,
7637
+ quality: 1,
7638
+ what: 'Landmark is indistinguishable from another by role, label, or title'
7005
7639
  }
7006
7640
  }
7007
7641
  }
@@ -7341,6 +7975,21 @@ exports.issues = {
7341
7975
  }
7342
7976
  }
7343
7977
  },
7978
+ datalistRef: {
7979
+ summary: 'ambiguous or missing datalist reference',
7980
+ why: 'User cannot get help on the permitted input values',
7981
+ wcag: '3.3.2',
7982
+ weight: 4,
7983
+ tools: {
7984
+ testaro: {
7985
+ datalistRef: {
7986
+ variable: false,
7987
+ quality: 1,
7988
+ what: 'Datalist reference is ambiguous or missing'
7989
+ }
7990
+ }
7991
+ }
7992
+ },
7344
7993
  multipleLabelees: {
7345
7994
  summary: 'labeled element ambiguous',
7346
7995
  why: 'User cannot get help on the topic of a form item',
@@ -7378,12 +8027,19 @@ exports.issues = {
7378
8027
  'AAA.1_3_1.F68.Hidden': {
7379
8028
  variable: false,
7380
8029
  quality: 1,
7381
- what: 'Hidden form field is needlessly labeled.'
8030
+ what: 'Hidden form field is needlessly labeled'
7382
8031
  },
7383
8032
  'AAA.1_3_1.F68.HiddenAttr': {
7384
8033
  variable: false,
7385
8034
  quality: 1,
7386
- what: 'Form field with a hidden attribute is needlessly labeled.'
8035
+ what: 'Form field with a hidden attribute is needlessly labeled'
8036
+ }
8037
+ },
8038
+ wax: {
8039
+ 'This hidden form field is labelled in some way. There should be no need to label a hidden form field.': {
8040
+ variable: false,
8041
+ quality: 1,
8042
+ what: 'Hidden form field is needlessly labeled'
7387
8043
  }
7388
8044
  }
7389
8045
  }
@@ -7581,6 +8237,13 @@ exports.issues = {
7581
8237
  quality: 1,
7582
8238
  what: 'Empty form label'
7583
8239
  }
8240
+ },
8241
+ wax: {
8242
+ 'This form control has an "aria-label" attribute that is empty or contains only spaces. It will be ignored for labelling test purposes.': {
8243
+ variable: false,
8244
+ quality: 1,
8245
+ what: 'Element is a form control but has a label whose value is empty or only whitespace'
8246
+ }
7584
8247
  }
7585
8248
  }
7586
8249
  },
@@ -7966,21 +8629,6 @@ exports.issues = {
7966
8629
  }
7967
8630
  }
7968
8631
  },
7969
- filterStyle: {
7970
- summary: 'filter style',
7971
- why: 'Item is too distorted for understandability',
7972
- wcag: '4.1',
7973
- weight: 1,
7974
- tools: {
7975
- testaro: {
7976
- filter: {
7977
- variable: false,
7978
- quality: 1,
7979
- what: 'Element styles include filter'
7980
- }
7981
- }
7982
- }
7983
- },
7984
8632
  zIndexNotZero: {
7985
8633
  summary: 'z-index not zero',
7986
8634
  why: 'User cannot predict the effect of clicking',
@@ -8028,6 +8676,11 @@ exports.issues = {
8028
8676
  variable: false,
8029
8677
  quality: 1,
8030
8678
  what: 'Element has a positive tabIndex attribute'
8679
+ },
8680
+ 'Remove or adjust tabindex attributes greater than zero.': {
8681
+ variable: false,
8682
+ quality: 1,
8683
+ what: 'Element has a positive tabIndex attribute'
8031
8684
  }
8032
8685
  }
8033
8686
  }
@@ -8401,6 +9054,13 @@ exports.issues = {
8401
9054
  quality: 1,
8402
9055
  what: 'Skip-navigation link has no target or is not keyboard accessible'
8403
9056
  }
9057
+ },
9058
+ wax: {
9059
+ 'Ensure that any common navigation elements can be bypassed; for instance, by use of skip links, header elements, or ARIA landmark roles.': {
9060
+ variable: false,
9061
+ quality: 1,
9062
+ what: 'Page provides no way to quickly navigate to the main content'
9063
+ }
8404
9064
  }
8405
9065
  }
8406
9066
  },
@@ -8477,11 +9137,11 @@ exports.issues = {
8477
9137
  wcag: '3.3.1',
8478
9138
  weight: 4,
8479
9139
  tools: {
8480
- qualWeb: {
8481
- 'QW-ACT-R41': {
9140
+ ibm: {
9141
+ error_message_exists: {
8482
9142
  variable: false,
8483
9143
  quality: 1,
8484
- what: 'Error message describes no invalid form field value'
9144
+ what: 'Element has an aria-errormessage attribute whose value is an invalid id'
8485
9145
  }
8486
9146
  }
8487
9147
  }
@@ -8587,6 +9247,11 @@ exports.issues = {
8587
9247
  quality: 1,
8588
9248
  what: 'charset attribute has a value other than utf-8 and is unnecessary'
8589
9249
  },
9250
+ 'The only allowed value for the charset attribute for the meta element is utf-8.': {
9251
+ variable: false,
9252
+ quality: 1,
9253
+ what: 'charset attribute has a value other than utf-8 and is unnecessary'
9254
+ },
8590
9255
  'The name attribute is obsolete. Consider putting an id attribute on the nearest container instead.': {
8591
9256
  variable: false,
8592
9257
  quality: 1,
@@ -8901,6 +9566,16 @@ exports.issues = {
8901
9566
  quality: 1,
8902
9567
  what: 'CSS webkit-mask linear-gradient property has too few values'
8903
9568
  },
9569
+ 'CSS: --solidHeaderNavigationColor: Cannot invoke "org.w3c.css.values.CssValue.getType()" because "val" is null.': {
9570
+ variable: false,
9571
+ quality: 1,
9572
+ what: 'CSS solidHeaderNavigationColor property is null'
9573
+ },
9574
+ 'CSS: --gradientHeaderBackgroundColor: Cannot invoke "org.w3c.css.values.CssValue.getType()" because "val" is null.': {
9575
+ variable: false,
9576
+ quality: 1,
9577
+ what: 'CSS gradientHeaderBackgroundColor property is null'
9578
+ },
8904
9579
  '^CSS: In CSS1, a class name could start with a digit .+, unless it was a dimension .+ In CSS2, such classes are parsed as unknown dimensions .+ To make .+ a valid class, CSS2 requires the first digit to be escaped: .+$': {
8905
9580
  variable: true,
8906
9581
  quality: 0.5,
@@ -8991,7 +9666,7 @@ exports.issues = {
8991
9666
  weight: 3,
8992
9667
  tools: {
8993
9668
  nuVal: {
8994
- '^Bad value [^ ]+ Tab, new line or carriage return found.*$': {
9669
+ '^Bad value [^`]+ Tab, new line or carriage return found.*$': {
8995
9670
  variable: true,
8996
9671
  quality: 1,
8997
9672
  what: 'Attribute value contains an illegal spacing character'
@@ -9131,11 +9806,6 @@ exports.issues = {
9131
9806
  quality: 1,
9132
9807
  what: 'Invalid start tag'
9133
9808
  },
9134
- '^Element .+ is missing a required instance of child element .+$': {
9135
- variable: true,
9136
- quality: 1,
9137
- what: 'Element is missing a required child'
9138
- },
9139
9809
  'Saw <!-- within a comment. Probable cause: Nested comment (not allowed).': {
9140
9810
  variable: false,
9141
9811
  quality: 1,
@@ -9228,21 +9898,6 @@ exports.issues = {
9228
9898
  }
9229
9899
  }
9230
9900
  },
9231
- slashParseRisk: {
9232
- summary: 'void element has trailing slash',
9233
- why: 'Document contains invalid code',
9234
- wcag: '4.1',
9235
- weight: 1,
9236
- tools: {
9237
- nuVal: {
9238
- 'Trailing slash on void elements has no effect and interacts badly with unquoted attribute values.': {
9239
- variable: false,
9240
- quality: 1,
9241
- what: 'Void element has a useless trailing slash.'
9242
- }
9243
- }
9244
- }
9245
- },
9246
9901
  encodingMisdeclared: {
9247
9902
  summary: 'text encoding wrongly declared',
9248
9903
  why: 'User cannot read all of the text',