_template.json 57 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123
  1. {
  2. "lang": "xyz",
  3. "rules": {
  4. "accesskeys": {
  5. "description": "Ensure every accesskey attribute value is unique",
  6. "help": "accesskey attribute value should be unique"
  7. },
  8. "area-alt": {
  9. "description": "Ensure <area> elements of image maps have alternative text",
  10. "help": "Active <area> elements must have alternative text"
  11. },
  12. "aria-allowed-attr": {
  13. "description": "Ensure an element's role supports its ARIA attributes",
  14. "help": "Elements must only use supported ARIA attributes"
  15. },
  16. "aria-allowed-role": {
  17. "description": "Ensure role attribute has an appropriate value for the element",
  18. "help": "ARIA role should be appropriate for the element"
  19. },
  20. "aria-braille-equivalent": {
  21. "description": "Ensure aria-braillelabel and aria-brailleroledescription have a non-braille equivalent",
  22. "help": "aria-braille attributes must have a non-braille equivalent"
  23. },
  24. "aria-command-name": {
  25. "description": "Ensure every ARIA button, link and menuitem has an accessible name",
  26. "help": "ARIA commands must have an accessible name"
  27. },
  28. "aria-conditional-attr": {
  29. "description": "Ensure ARIA attributes are used as described in the specification of the element's role",
  30. "help": "ARIA attributes must be used as specified for the element's role"
  31. },
  32. "aria-deprecated-role": {
  33. "description": "Ensure elements do not use deprecated roles",
  34. "help": "Deprecated ARIA roles must not be used"
  35. },
  36. "aria-dialog-name": {
  37. "description": "Ensure every ARIA dialog and alertdialog node has an accessible name",
  38. "help": "ARIA dialog and alertdialog nodes should have an accessible name"
  39. },
  40. "aria-hidden-body": {
  41. "description": "Ensure aria-hidden=\"true\" is not present on the document body.",
  42. "help": "aria-hidden=\"true\" must not be present on the document body"
  43. },
  44. "aria-hidden-focus": {
  45. "description": "Ensure aria-hidden elements are not focusable nor contain focusable elements",
  46. "help": "ARIA hidden element must not be focusable or contain focusable elements"
  47. },
  48. "aria-input-field-name": {
  49. "description": "Ensure every ARIA input field has an accessible name",
  50. "help": "ARIA input fields must have an accessible name"
  51. },
  52. "aria-meter-name": {
  53. "description": "Ensure every ARIA meter node has an accessible name",
  54. "help": "ARIA meter nodes must have an accessible name"
  55. },
  56. "aria-progressbar-name": {
  57. "description": "Ensure every ARIA progressbar node has an accessible name",
  58. "help": "ARIA progressbar nodes must have an accessible name"
  59. },
  60. "aria-prohibited-attr": {
  61. "description": "Ensure ARIA attributes are not prohibited for an element's role",
  62. "help": "Elements must only use permitted ARIA attributes"
  63. },
  64. "aria-required-attr": {
  65. "description": "Ensure elements with ARIA roles have all required ARIA attributes",
  66. "help": "Required ARIA attributes must be provided"
  67. },
  68. "aria-required-children": {
  69. "description": "Ensure elements with an ARIA role that require child roles contain them",
  70. "help": "Certain ARIA roles must contain particular children"
  71. },
  72. "aria-required-parent": {
  73. "description": "Ensure elements with an ARIA role that require parent roles are contained by them",
  74. "help": "Certain ARIA roles must be contained by particular parents"
  75. },
  76. "aria-roledescription": {
  77. "description": "Ensure aria-roledescription is only used on elements with an implicit or explicit role",
  78. "help": "aria-roledescription must be on elements with a semantic role"
  79. },
  80. "aria-roles": {
  81. "description": "Ensure all elements with a role attribute use a valid value",
  82. "help": "ARIA roles used must conform to valid values"
  83. },
  84. "aria-text": {
  85. "description": "Ensure role=\"text\" is used on elements with no focusable descendants",
  86. "help": "\"role=text\" should have no focusable descendants"
  87. },
  88. "aria-toggle-field-name": {
  89. "description": "Ensure every ARIA toggle field has an accessible name",
  90. "help": "ARIA toggle fields must have an accessible name"
  91. },
  92. "aria-tooltip-name": {
  93. "description": "Ensure every ARIA tooltip node has an accessible name",
  94. "help": "ARIA tooltip nodes must have an accessible name"
  95. },
  96. "aria-treeitem-name": {
  97. "description": "Ensure every ARIA treeitem node has an accessible name",
  98. "help": "ARIA treeitem nodes should have an accessible name"
  99. },
  100. "aria-valid-attr-value": {
  101. "description": "Ensure all ARIA attributes have valid values",
  102. "help": "ARIA attributes must conform to valid values"
  103. },
  104. "aria-valid-attr": {
  105. "description": "Ensure attributes that begin with aria- are valid ARIA attributes",
  106. "help": "ARIA attributes must conform to valid names"
  107. },
  108. "audio-caption": {
  109. "description": "Ensure <audio> elements have captions",
  110. "help": "<audio> elements must have a captions track"
  111. },
  112. "autocomplete-valid": {
  113. "description": "Ensure the autocomplete attribute is correct and suitable for the form field",
  114. "help": "autocomplete attribute must be used correctly"
  115. },
  116. "avoid-inline-spacing": {
  117. "description": "Ensure that text spacing set through style attributes can be adjusted with custom stylesheets",
  118. "help": "Inline text spacing must be adjustable with custom stylesheets"
  119. },
  120. "blink": {
  121. "description": "Ensure <blink> elements are not used",
  122. "help": "<blink> elements are deprecated and must not be used"
  123. },
  124. "button-name": {
  125. "description": "Ensure buttons have discernible text",
  126. "help": "Buttons must have discernible text"
  127. },
  128. "bypass": {
  129. "description": "Ensure each page has at least one mechanism for a user to bypass navigation and jump straight to the content",
  130. "help": "Page must have means to bypass repeated blocks"
  131. },
  132. "color-contrast-enhanced": {
  133. "description": "Ensure the contrast between foreground and background colors meets WCAG 2 AAA enhanced contrast ratio thresholds",
  134. "help": "Elements must meet enhanced color contrast ratio thresholds"
  135. },
  136. "color-contrast": {
  137. "description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
  138. "help": "Elements must meet minimum color contrast ratio thresholds"
  139. },
  140. "css-orientation-lock": {
  141. "description": "Ensure content is not locked to any specific display orientation, and the content is operable in all display orientations",
  142. "help": "CSS Media queries must not lock display orientation"
  143. },
  144. "definition-list": {
  145. "description": "Ensure <dl> elements are structured correctly",
  146. "help": "<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script>, <template> or <div> elements"
  147. },
  148. "dlitem": {
  149. "description": "Ensure <dt> and <dd> elements are contained by a <dl>",
  150. "help": "<dt> and <dd> elements must be contained by a <dl>"
  151. },
  152. "document-title": {
  153. "description": "Ensure each HTML document contains a non-empty <title> element",
  154. "help": "Documents must have <title> element to aid in navigation"
  155. },
  156. "duplicate-id-active": {
  157. "description": "Ensure every id attribute value of active elements is unique",
  158. "help": "IDs of active elements must be unique"
  159. },
  160. "duplicate-id-aria": {
  161. "description": "Ensure every id attribute value used in ARIA and in labels is unique",
  162. "help": "IDs used in ARIA and labels must be unique"
  163. },
  164. "duplicate-id": {
  165. "description": "Ensure every id attribute value is unique",
  166. "help": "id attribute value must be unique"
  167. },
  168. "empty-heading": {
  169. "description": "Ensure headings have discernible text",
  170. "help": "Headings should not be empty"
  171. },
  172. "empty-table-header": {
  173. "description": "Ensure table headers have discernible text",
  174. "help": "Table header text should not be empty"
  175. },
  176. "focus-order-semantics": {
  177. "description": "Ensure elements in the focus order have a role appropriate for interactive content",
  178. "help": "Elements in the focus order should have an appropriate role"
  179. },
  180. "form-field-multiple-labels": {
  181. "description": "Ensure form field does not have multiple label elements",
  182. "help": "Form field must not have multiple label elements"
  183. },
  184. "frame-focusable-content": {
  185. "description": "Ensure <frame> and <iframe> elements with focusable content do not have tabindex=-1",
  186. "help": "Frames with focusable content must not have tabindex=-1"
  187. },
  188. "frame-tested": {
  189. "description": "Ensure <iframe> and <frame> elements contain the axe-core script",
  190. "help": "Frames should be tested with axe-core"
  191. },
  192. "frame-title-unique": {
  193. "description": "Ensure <iframe> and <frame> elements contain a unique title attribute",
  194. "help": "Frames must have a unique title attribute"
  195. },
  196. "frame-title": {
  197. "description": "Ensure <iframe> and <frame> elements have an accessible name",
  198. "help": "Frames must have an accessible name"
  199. },
  200. "heading-order": {
  201. "description": "Ensure the order of headings is semantically correct",
  202. "help": "Heading levels should only increase by one"
  203. },
  204. "hidden-content": {
  205. "description": "Informs users about hidden content.",
  206. "help": "Hidden content on the page should be analyzed"
  207. },
  208. "html-has-lang": {
  209. "description": "Ensure every HTML document has a lang attribute",
  210. "help": "<html> element must have a lang attribute"
  211. },
  212. "html-lang-valid": {
  213. "description": "Ensure the lang attribute of the <html> element has a valid value",
  214. "help": "<html> element must have a valid value for the lang attribute"
  215. },
  216. "html-xml-lang-mismatch": {
  217. "description": "Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page",
  218. "help": "HTML elements with lang and xml:lang must have the same base language"
  219. },
  220. "identical-links-same-purpose": {
  221. "description": "Ensure that links with the same accessible name serve a similar purpose",
  222. "help": "Links with the same name must have a similar purpose"
  223. },
  224. "image-alt": {
  225. "description": "Ensure <img> elements have alternative text or a role of none or presentation",
  226. "help": "Images must have alternative text"
  227. },
  228. "image-redundant-alt": {
  229. "description": "Ensure image alternative is not repeated as text",
  230. "help": "Alternative text of images should not be repeated as text"
  231. },
  232. "input-button-name": {
  233. "description": "Ensure input buttons have discernible text",
  234. "help": "Input buttons must have discernible text"
  235. },
  236. "input-image-alt": {
  237. "description": "Ensure <input type=\"image\"> elements have alternative text",
  238. "help": "Image buttons must have alternative text"
  239. },
  240. "label-content-name-mismatch": {
  241. "description": "Ensure that elements labelled through their content must have their visible text as part of their accessible name",
  242. "help": "Elements must have their visible text as part of their accessible name"
  243. },
  244. "label-title-only": {
  245. "description": "Ensure that every form element has a visible label and is not solely labeled using hidden labels, or the title or aria-describedby attributes",
  246. "help": "Form elements should have a visible label"
  247. },
  248. "label": {
  249. "description": "Ensure every form element has a label",
  250. "help": "Form elements must have labels"
  251. },
  252. "landmark-banner-is-top-level": {
  253. "description": "Ensure the banner landmark is at top level",
  254. "help": "Banner landmark should not be contained in another landmark"
  255. },
  256. "landmark-complementary-is-top-level": {
  257. "description": "Ensure the complementary landmark or aside is at top level",
  258. "help": "Aside should not be contained in another landmark"
  259. },
  260. "landmark-contentinfo-is-top-level": {
  261. "description": "Ensure the contentinfo landmark is at top level",
  262. "help": "Contentinfo landmark should not be contained in another landmark"
  263. },
  264. "landmark-main-is-top-level": {
  265. "description": "Ensure the main landmark is at top level",
  266. "help": "Main landmark should not be contained in another landmark"
  267. },
  268. "landmark-no-duplicate-banner": {
  269. "description": "Ensure the document has at most one banner landmark",
  270. "help": "Document should not have more than one banner landmark"
  271. },
  272. "landmark-no-duplicate-contentinfo": {
  273. "description": "Ensure the document has at most one contentinfo landmark",
  274. "help": "Document should not have more than one contentinfo landmark"
  275. },
  276. "landmark-no-duplicate-main": {
  277. "description": "Ensure the document has at most one main landmark",
  278. "help": "Document should not have more than one main landmark"
  279. },
  280. "landmark-one-main": {
  281. "description": "Ensure the document has a main landmark",
  282. "help": "Document should have one main landmark"
  283. },
  284. "landmark-unique": {
  285. "description": "Ensure landmarks are unique",
  286. "help": "Landmarks should have a unique role or role/label/title (i.e. accessible name) combination"
  287. },
  288. "link-in-text-block": {
  289. "description": "Ensure links are distinguished from surrounding text in a way that does not rely on color",
  290. "help": "Links must be distinguishable without relying on color"
  291. },
  292. "link-name": {
  293. "description": "Ensure links have discernible text",
  294. "help": "Links must have discernible text"
  295. },
  296. "list": {
  297. "description": "Ensure that lists are structured correctly",
  298. "help": "<ul> and <ol> must only directly contain <li>, <script> or <template> elements"
  299. },
  300. "listitem": {
  301. "description": "Ensure <li> elements are used semantically",
  302. "help": "<li> elements must be contained in a <ul> or <ol>"
  303. },
  304. "marquee": {
  305. "description": "Ensure <marquee> elements are not used",
  306. "help": "<marquee> elements are deprecated and must not be used"
  307. },
  308. "meta-refresh-no-exceptions": {
  309. "description": "Ensure <meta http-equiv=\"refresh\"> is not used for delayed refresh",
  310. "help": "Delayed refresh must not be used"
  311. },
  312. "meta-refresh": {
  313. "description": "Ensure <meta http-equiv=\"refresh\"> is not used for delayed refresh",
  314. "help": "Delayed refresh under 20 hours must not be used"
  315. },
  316. "meta-viewport-large": {
  317. "description": "Ensure <meta name=\"viewport\"> can scale a significant amount",
  318. "help": "Users should be able to zoom and scale the text up to 500%"
  319. },
  320. "meta-viewport": {
  321. "description": "Ensure <meta name=\"viewport\"> does not disable text scaling and zooming",
  322. "help": "Zooming and scaling must not be disabled"
  323. },
  324. "nested-interactive": {
  325. "description": "Ensure interactive controls are not nested as they are not always announced by screen readers or can cause focus problems for assistive technologies",
  326. "help": "Interactive controls must not be nested"
  327. },
  328. "no-autoplay-audio": {
  329. "description": "Ensure <video> or <audio> elements do not autoplay audio for more than 3 seconds without a control mechanism to stop or mute the audio",
  330. "help": "<video> or <audio> elements must not play automatically"
  331. },
  332. "object-alt": {
  333. "description": "Ensure <object> elements have alternative text",
  334. "help": "<object> elements must have alternative text"
  335. },
  336. "p-as-heading": {
  337. "description": "Ensure bold, italic text and font-size is not used to style <p> elements as a heading",
  338. "help": "Styled <p> elements must not be used as headings"
  339. },
  340. "page-has-heading-one": {
  341. "description": "Ensure that the page, or at least one of its frames contains a level-one heading",
  342. "help": "Page should contain a level-one heading"
  343. },
  344. "presentation-role-conflict": {
  345. "description": "Elements marked as presentational should not have global ARIA or tabindex to ensure all screen readers ignore them",
  346. "help": "Ensure elements marked as presentational are consistently ignored"
  347. },
  348. "region": {
  349. "description": "Ensure all page content is contained by landmarks",
  350. "help": "All page content should be contained by landmarks"
  351. },
  352. "role-img-alt": {
  353. "description": "Ensure [role=\"img\"] elements have alternative text",
  354. "help": "[role=\"img\"] elements must have an alternative text"
  355. },
  356. "scope-attr-valid": {
  357. "description": "Ensure the scope attribute is used correctly on tables",
  358. "help": "scope attribute should be used correctly"
  359. },
  360. "scrollable-region-focusable": {
  361. "description": "Ensure elements that have scrollable content are accessible by keyboard",
  362. "help": "Scrollable region must have keyboard access"
  363. },
  364. "select-name": {
  365. "description": "Ensure select element has an accessible name",
  366. "help": "Select element must have an accessible name"
  367. },
  368. "server-side-image-map": {
  369. "description": "Ensure that server-side image maps are not used",
  370. "help": "Server-side image maps must not be used"
  371. },
  372. "skip-link": {
  373. "description": "Ensure all skip links have a focusable target",
  374. "help": "The skip-link target should exist and be focusable"
  375. },
  376. "summary-name": {
  377. "description": "Ensure summary elements have discernible text",
  378. "help": "Summary elements must have discernible text"
  379. },
  380. "svg-img-alt": {
  381. "description": "Ensure <svg> elements with an img, graphics-document or graphics-symbol role have an accessible text",
  382. "help": "<svg> elements with an img role must have an alternative text"
  383. },
  384. "tabindex": {
  385. "description": "Ensure tabindex attribute values are not greater than 0",
  386. "help": "Elements should not have tabindex greater than zero"
  387. },
  388. "table-duplicate-name": {
  389. "description": "Ensure the <caption> element does not contain the same text as the summary attribute",
  390. "help": "Tables should not have the same summary and caption"
  391. },
  392. "table-fake-caption": {
  393. "description": "Ensure that tables with a caption use the <caption> element.",
  394. "help": "Data or header cells must not be used to give caption to a data table."
  395. },
  396. "target-size": {
  397. "description": "Ensure touch targets have sufficient size and space",
  398. "help": "All touch targets must be 24px large, or leave sufficient space"
  399. },
  400. "td-has-header": {
  401. "description": "Ensure that each non-empty data cell in a <table> larger than 3 by 3 has one or more table headers",
  402. "help": "Non-empty <td> elements in larger <table> must have an associated table header"
  403. },
  404. "td-headers-attr": {
  405. "description": "Ensure that each cell in a table that uses the headers attribute refers only to other cells in that table",
  406. "help": "Table cells that use the headers attribute must only refer to cells in the same table"
  407. },
  408. "th-has-data-cells": {
  409. "description": "Ensure that <th> elements and elements with role=columnheader/rowheader have data cells they describe",
  410. "help": "Table headers in a data table must refer to data cells"
  411. },
  412. "valid-lang": {
  413. "description": "Ensure lang attributes have valid values",
  414. "help": "lang attribute must have a valid value"
  415. },
  416. "video-caption": {
  417. "description": "Ensure <video> elements have captions",
  418. "help": "<video> elements must have captions"
  419. }
  420. },
  421. "checks": {
  422. "abstractrole": {
  423. "pass": "Abstract roles are not used",
  424. "fail": {
  425. "singular": "Abstract role cannot be directly used: ${data.values}",
  426. "plural": "Abstract roles cannot be directly used: ${data.values}"
  427. }
  428. },
  429. "aria-allowed-attr": {
  430. "pass": "ARIA attributes are used correctly for the defined role",
  431. "fail": {
  432. "singular": "ARIA attribute is not allowed: ${data.values}",
  433. "plural": "ARIA attributes are not allowed: ${data.values}"
  434. },
  435. "incomplete": "Check that there is no problem if the ARIA attribute is ignored on this element: ${data.values}"
  436. },
  437. "aria-allowed-role": {
  438. "pass": "ARIA role is allowed for given element",
  439. "fail": {
  440. "singular": "ARIA role ${data.values} is not allowed for given element",
  441. "plural": "ARIA roles ${data.values} are not allowed for given element"
  442. },
  443. "incomplete": {
  444. "singular": "ARIA role ${data.values} must be removed when the element is made visible, as it is not allowed for the element",
  445. "plural": "ARIA roles ${data.values} must be removed when the element is made visible, as they are not allowed for the element"
  446. }
  447. },
  448. "aria-busy": {
  449. "pass": "Element has an aria-busy attribute",
  450. "fail": "Element uses aria-busy=\"true\" while showing a loader"
  451. },
  452. "aria-conditional-attr": {
  453. "pass": "ARIA attribute is allowed",
  454. "fail": {
  455. "checkbox": "Remove aria-checked, or set it to \"${data.checkState}\" to match the real checkbox state",
  456. "rowSingular": "This attribute is supported with treegrid rows, but not ${data.ownerRole}: ${data.invalidAttrs}",
  457. "rowPlural": "These attributes are supported with treegrid rows, but not ${data.ownerRole}: ${data.invalidAttrs}"
  458. }
  459. },
  460. "aria-errormessage": {
  461. "pass": "aria-errormessage exists and references elements visible to screen readers that use a supported aria-errormessage technique",
  462. "fail": {
  463. "singular": "aria-errormessage value `${data.values}` must use a technique to announce the message (e.g., aria-live, aria-describedby, role=alert, etc.)",
  464. "plural": "aria-errormessage values `${data.values}` must use a technique to announce the message (e.g., aria-live, aria-describedby, role=alert, etc.)",
  465. "hidden": "aria-errormessage value `${data.values}` cannot reference a hidden element"
  466. },
  467. "incomplete": {
  468. "singular": "Ensure aria-errormessage value `${data.values}` references an existing element",
  469. "plural": "Ensure aria-errormessage values `${data.values}` reference existing elements",
  470. "idrefs": "Unable to determine if aria-errormessage element exists on the page: ${data.values}"
  471. }
  472. },
  473. "aria-hidden-body": {
  474. "pass": "No aria-hidden attribute is present on document body",
  475. "fail": "aria-hidden=true should not be present on the document body"
  476. },
  477. "aria-level": {
  478. "pass": "aria-level values are valid",
  479. "incomplete": "aria-level values greater than 6 are not supported in all screenreader and browser combinations"
  480. },
  481. "aria-prohibited-attr": {
  482. "pass": "ARIA attribute is allowed",
  483. "fail": {
  484. "hasRolePlural": "${data.prohibited} attributes cannot be used with role \"${data.role}\".",
  485. "hasRoleSingular": "${data.prohibited} attribute cannot be used with role \"${data.role}\".",
  486. "noRolePlural": "${data.prohibited} attributes cannot be used on a ${data.nodeName} with no valid role attribute.",
  487. "noRoleSingular": "${data.prohibited} attribute cannot be used on a ${data.nodeName} with no valid role attribute."
  488. },
  489. "incomplete": {
  490. "hasRoleSingular": "${data.prohibited} attribute is not well supported with role \"${data.role}\".",
  491. "hasRolePlural": "${data.prohibited} attributes are not well supported with role \"${data.role}\".",
  492. "noRoleSingular": "${data.prohibited} attribute is not well supported on a ${data.nodeName} with no valid role attribute.",
  493. "noRolePlural": "${data.prohibited} attributes are not well supported on a ${data.nodeName} with no valid role attribute."
  494. }
  495. },
  496. "aria-required-attr": {
  497. "pass": "All required ARIA attributes are present",
  498. "fail": {
  499. "singular": "Required ARIA attribute not present: ${data.values}",
  500. "plural": "Required ARIA attributes not present: ${data.values}"
  501. }
  502. },
  503. "aria-required-children": {
  504. "pass": {
  505. "default": "Required ARIA children are present",
  506. "aria-busy": "Element has an aria-busy attribute, so it is allowed to omit required children"
  507. },
  508. "fail": {
  509. "singular": "Required ARIA child role not present: ${data.values}",
  510. "plural": "Required ARIA children role not present: ${data.values}",
  511. "unallowed": "Element has children which are not allowed: ${data.values}"
  512. },
  513. "incomplete": {
  514. "singular": "Expecting ARIA child role to be added: ${data.values}",
  515. "plural": "Expecting ARIA children role to be added: ${data.values}"
  516. }
  517. },
  518. "aria-required-parent": {
  519. "pass": "Required ARIA parent role present",
  520. "fail": {
  521. "singular": "Required ARIA parent role not present: ${data.values}",
  522. "plural": "Required ARIA parents role not present: ${data.values}"
  523. }
  524. },
  525. "aria-roledescription": {
  526. "pass": "aria-roledescription used on a supported semantic role",
  527. "incomplete": "Check that the aria-roledescription is announced by supported screen readers",
  528. "fail": "Give the element a role that supports aria-roledescription"
  529. },
  530. "aria-unsupported-attr": {
  531. "pass": "ARIA attribute is supported",
  532. "fail": "ARIA attribute is not widely supported in screen readers and assistive technologies: ${data.values}"
  533. },
  534. "aria-valid-attr-value": {
  535. "pass": "ARIA attribute values are valid",
  536. "fail": {
  537. "singular": "Invalid ARIA attribute value: ${data.values}",
  538. "plural": "Invalid ARIA attribute values: ${data.values}"
  539. },
  540. "incomplete": {
  541. "noId": "ARIA attribute element ID does not exist on the page: ${data.needsReview}",
  542. "noIdShadow": "ARIA attribute element ID does not exist on the page or is a descendant of a different shadow DOM tree: ${data.needsReview}",
  543. "ariaCurrent": "ARIA attribute value is invalid and will be treated as \"aria-current=true\": ${data.needsReview}",
  544. "idrefs": "Unable to determine if ARIA attribute element ID exists on the page: ${data.needsReview}",
  545. "empty": "ARIA attribute value is ignored while empty: ${data.needsReview}",
  546. "controlsWithinPopup": "Unable to determine if aria-controls referenced ID exists on the page while using aria-haspopup: ${data.needsReview}"
  547. }
  548. },
  549. "aria-valid-attr": {
  550. "pass": "ARIA attribute name is valid",
  551. "fail": {
  552. "singular": "Invalid ARIA attribute name: ${data.values}",
  553. "plural": "Invalid ARIA attribute names: ${data.values}"
  554. }
  555. },
  556. "braille-label-equivalent": {
  557. "pass": "aria-braillelabel is used on an element with accessible text",
  558. "fail": "aria-braillelabel is used on an element with no accessible text",
  559. "incomplete": "Unable to compute accessible text"
  560. },
  561. "braille-roledescription-equivalent": {
  562. "pass": "aria-brailleroledescription is used on an element with aria-roledescription",
  563. "fail": {
  564. "noRoleDescription": "aria-brailleroledescription is used on an element with no aria-roledescription",
  565. "emptyRoleDescription": "aria-brailleroledescription is used on an element with an empty aria-roledescription"
  566. }
  567. },
  568. "deprecatedrole": {
  569. "pass": "ARIA role is not deprecated",
  570. "fail": "The role used is deprecated: ${data}"
  571. },
  572. "fallbackrole": {
  573. "pass": "Only one role value used",
  574. "fail": "Use only one role value, since fallback roles are not supported in older browsers",
  575. "incomplete": "Use only role 'presentation' or 'none' since they are synonymous."
  576. },
  577. "has-global-aria-attribute": {
  578. "pass": {
  579. "singular": "Element has global ARIA attribute: ${data.values}",
  580. "plural": "Element has global ARIA attributes: ${data.values}"
  581. },
  582. "fail": "Element does not have global ARIA attribute"
  583. },
  584. "has-widget-role": {
  585. "pass": "Element has a widget role.",
  586. "fail": "Element does not have a widget role."
  587. },
  588. "invalidrole": {
  589. "pass": "ARIA role is valid",
  590. "fail": {
  591. "singular": "Role must be one of the valid ARIA roles: ${data.values}",
  592. "plural": "Roles must be one of the valid ARIA roles: ${data.values}"
  593. }
  594. },
  595. "is-element-focusable": {
  596. "pass": "Element is focusable.",
  597. "fail": "Element is not focusable."
  598. },
  599. "no-implicit-explicit-label": {
  600. "pass": "There is no mismatch between a <label> and accessible name",
  601. "incomplete": "Check that the <label> does not need be part of the ARIA ${data} field's name"
  602. },
  603. "unsupportedrole": {
  604. "pass": "ARIA role is supported",
  605. "fail": "The role used is not widely supported in screen readers and assistive technologies: ${data}"
  606. },
  607. "valid-scrollable-semantics": {
  608. "pass": "Element has valid semantics for an element in the focus order.",
  609. "fail": "Element has invalid semantics for an element in the focus order."
  610. },
  611. "color-contrast-enhanced": {
  612. "pass": "Element has sufficient color contrast of ${data.contrastRatio}",
  613. "fail": {
  614. "default": "Element has insufficient color contrast of ${data.contrastRatio} (foreground color: ${data.fgColor}, background color: ${data.bgColor}, font size: ${data.fontSize}, font weight: ${data.fontWeight}). Expected contrast ratio of ${data.expectedContrastRatio}",
  615. "fgOnShadowColor": "Element has insufficient color contrast of ${data.contrastRatio} between the foreground and shadow color (foreground color: ${data.fgColor}, text-shadow color: ${data.shadowColor}, font size: ${data.fontSize}, font weight: ${data.fontWeight}). Expected contrast ratio of ${data.expectedContrastRatio}",
  616. "shadowOnBgColor": "Element has insufficient color contrast of ${data.contrastRatio} between the shadow color and background color (text-shadow color: ${data.shadowColor}, background color: ${data.bgColor}, font size: ${data.fontSize}, font weight: ${data.fontWeight}). Expected contrast ratio of ${data.expectedContrastRatio}"
  617. },
  618. "incomplete": {
  619. "default": "Unable to determine contrast ratio",
  620. "bgImage": "Element's background color could not be determined due to a background image",
  621. "bgGradient": "Element's background color could not be determined due to a background gradient",
  622. "imgNode": "Element's background color could not be determined because element contains an image node",
  623. "bgOverlap": "Element's background color could not be determined because it is overlapped by another element",
  624. "fgAlpha": "Element's foreground color could not be determined because of alpha transparency",
  625. "elmPartiallyObscured": "Element's background color could not be determined because it's partially obscured by another element",
  626. "elmPartiallyObscuring": "Element's background color could not be determined because it partially overlaps other elements",
  627. "outsideViewport": "Element's background color could not be determined because it's outside the viewport",
  628. "equalRatio": "Element has a 1:1 contrast ratio with the background",
  629. "shortTextContent": "Element content is too short to determine if it is actual text content",
  630. "nonBmp": "Element content contains only non-text characters",
  631. "pseudoContent": "Element's background color could not be determined due to a pseudo element"
  632. }
  633. },
  634. "color-contrast": {
  635. "pass": {
  636. "default": "Element has sufficient color contrast of ${data.contrastRatio}",
  637. "hidden": "Element is hidden"
  638. },
  639. "fail": {
  640. "default": "Element has insufficient color contrast of ${data.contrastRatio} (foreground color: ${data.fgColor}, background color: ${data.bgColor}, font size: ${data.fontSize}, font weight: ${data.fontWeight}). Expected contrast ratio of ${data.expectedContrastRatio}",
  641. "fgOnShadowColor": "Element has insufficient color contrast of ${data.contrastRatio} between the foreground and shadow color (foreground color: ${data.fgColor}, text-shadow color: ${data.shadowColor}, font size: ${data.fontSize}, font weight: ${data.fontWeight}). Expected contrast ratio of ${data.expectedContrastRatio}",
  642. "shadowOnBgColor": "Element has insufficient color contrast of ${data.contrastRatio} between the shadow color and background color (text-shadow color: ${data.shadowColor}, background color: ${data.bgColor}, font size: ${data.fontSize}, font weight: ${data.fontWeight}). Expected contrast ratio of ${data.expectedContrastRatio}"
  643. },
  644. "incomplete": {
  645. "default": "Unable to determine contrast ratio",
  646. "bgImage": "Element's background color could not be determined due to a background image",
  647. "bgGradient": "Element's background color could not be determined due to a background gradient",
  648. "imgNode": "Element's background color could not be determined because element contains an image node",
  649. "bgOverlap": "Element's background color could not be determined because it is overlapped by another element",
  650. "complexTextShadows": "Element's contrast could not be determined because it uses complex text shadows",
  651. "fgAlpha": "Element's foreground color could not be determined because of alpha transparency",
  652. "elmPartiallyObscured": "Element's background color could not be determined because it's partially obscured by another element",
  653. "elmPartiallyObscuring": "Element's background color could not be determined because it partially overlaps other elements",
  654. "outsideViewport": "Element's background color could not be determined because it's outside the viewport",
  655. "equalRatio": "Element has a 1:1 contrast ratio with the background",
  656. "shortTextContent": "Element content is too short to determine if it is actual text content",
  657. "nonBmp": "Element content contains only non-text characters",
  658. "pseudoContent": "Element's background color could not be determined due to a pseudo element"
  659. }
  660. },
  661. "link-in-text-block-style": {
  662. "pass": "Links can be distinguished from surrounding text by visual styling",
  663. "incomplete": {
  664. "default": "Check if the link needs styling to distinguish it from nearby text",
  665. "pseudoContent": "Check if the link's pseudo style is sufficient to distinguish it from the surrounding text"
  666. },
  667. "fail": "The link has no styling (such as underline) to distinguish it from the surrounding text"
  668. },
  669. "link-in-text-block": {
  670. "pass": "Links can be distinguished from surrounding text in some way other than by color",
  671. "fail": {
  672. "fgContrast": "The link has insufficient color contrast of ${data.contrastRatio}:1 with the surrounding text. (Minimum contrast is ${data.requiredContrastRatio}:1, link text: ${data.nodeColor}, surrounding text: ${data.parentColor})",
  673. "bgContrast": "The link background has insufficient color contrast of ${data.contrastRatio} (Minimum contrast is ${data.requiredContrastRatio}:1, link background color: ${data.nodeBackgroundColor}, surrounding background color: ${data.parentBackgroundColor})"
  674. },
  675. "incomplete": {
  676. "default": "Element's foreground contrast ratio could not be determined",
  677. "bgContrast": "Element's background contrast ratio could not be determined",
  678. "bgImage": "Element's contrast ratio could not be determined due to a background image",
  679. "bgGradient": "Element's contrast ratio could not be determined due to a background gradient",
  680. "imgNode": "Element's contrast ratio could not be determined because element contains an image node",
  681. "bgOverlap": "Element's contrast ratio could not be determined because of element overlap"
  682. }
  683. },
  684. "autocomplete-appropriate": {
  685. "pass": "The autocomplete value is on an appropriate element",
  686. "fail": "The autocomplete value is inappropriate for this type of input"
  687. },
  688. "autocomplete-valid": {
  689. "pass": "the autocomplete attribute is correctly formatted",
  690. "fail": "the autocomplete attribute is incorrectly formatted",
  691. "incomplete": "the autocomplete attribute has a non-standard value. Check whether any standard value could be used instead."
  692. },
  693. "accesskeys": {
  694. "pass": "Accesskey attribute value is unique",
  695. "fail": "Document has multiple elements with the same accesskey"
  696. },
  697. "focusable-content": {
  698. "pass": "Element contains focusable elements",
  699. "fail": "Element should have focusable content"
  700. },
  701. "focusable-disabled": {
  702. "pass": "No focusable elements contained within element",
  703. "incomplete": "Check if the focusable elements immediately move the focus indicator",
  704. "fail": "Focusable content should be disabled or be removed from the DOM"
  705. },
  706. "focusable-element": {
  707. "pass": "Element is focusable",
  708. "fail": "Element should be focusable"
  709. },
  710. "focusable-modal-open": {
  711. "pass": "No focusable elements while a modal is open",
  712. "incomplete": "Check that focusable elements are not tabbable in the current state"
  713. },
  714. "focusable-no-name": {
  715. "pass": "Element is not in tab order or has accessible text",
  716. "fail": "Element is in tab order and does not have accessible text",
  717. "incomplete": "Unable to determine if element has an accessible name"
  718. },
  719. "focusable-not-tabbable": {
  720. "pass": "No focusable elements contained within element",
  721. "incomplete": "Check if the focusable elements immediately move the focus indicator",
  722. "fail": "Focusable content should have tabindex=\"-1\" or be removed from the DOM"
  723. },
  724. "frame-focusable-content": {
  725. "pass": "Element does not have focusable descendants",
  726. "fail": "Element has focusable descendants",
  727. "incomplete": "Could not determine if element has descendants"
  728. },
  729. "landmark-is-top-level": {
  730. "pass": "The ${data.role} landmark is at the top level.",
  731. "fail": "The ${data.role} landmark is contained in another landmark."
  732. },
  733. "no-focusable-content": {
  734. "pass": "Element does not have focusable descendants",
  735. "fail": {
  736. "default": "Element has focusable descendants",
  737. "notHidden": "Using a negative tabindex on an element inside an interactive control does not prevent assistive technologies from focusing the element (even with aria-hidden=\"true\")"
  738. },
  739. "incomplete": "Could not determine if element has descendants"
  740. },
  741. "page-has-heading-one": {
  742. "pass": "Page has at least one level-one heading",
  743. "fail": "Page must have a level-one heading"
  744. },
  745. "page-has-main": {
  746. "pass": "Document has at least one main landmark",
  747. "fail": "Document does not have a main landmark"
  748. },
  749. "page-no-duplicate-banner": {
  750. "pass": "Document does not have more than one banner landmark",
  751. "fail": "Document has more than one banner landmark"
  752. },
  753. "page-no-duplicate-contentinfo": {
  754. "pass": "Document does not have more than one contentinfo landmark",
  755. "fail": "Document has more than one contentinfo landmark"
  756. },
  757. "page-no-duplicate-main": {
  758. "pass": "Document does not have more than one main landmark",
  759. "fail": "Document has more than one main landmark"
  760. },
  761. "tabindex": {
  762. "pass": "Element does not have a tabindex greater than 0",
  763. "fail": "Element has a tabindex greater than 0"
  764. },
  765. "alt-space-value": {
  766. "pass": "Element has a valid alt attribute value",
  767. "fail": "Element has an alt attribute containing only a space character, which is not ignored by all screen readers"
  768. },
  769. "duplicate-img-label": {
  770. "pass": "Element does not duplicate existing text in <img> alt text",
  771. "fail": "Element contains <img> element with alt text that duplicates existing text"
  772. },
  773. "explicit-label": {
  774. "pass": "Element has an explicit <label>",
  775. "fail": "Element does not have an explicit <label>",
  776. "incomplete": "Unable to determine if form element has an explicit <label>"
  777. },
  778. "help-same-as-label": {
  779. "pass": "Help text (title or aria-describedby) does not duplicate label text",
  780. "fail": "Help text (title or aria-describedby) text is the same as the label text"
  781. },
  782. "hidden-explicit-label": {
  783. "pass": "Form element has a visible explicit <label>",
  784. "fail": "Form element has explicit <label> that is hidden",
  785. "incomplete": "Unable to determine if form element has explicit <label> that is hidden"
  786. },
  787. "implicit-label": {
  788. "pass": "Element has an implicit (wrapped) <label>",
  789. "fail": "Element does not have an implicit (wrapped) <label>",
  790. "incomplete": "Unable to determine if form element has an implicit (wrapped) <label>"
  791. },
  792. "label-content-name-mismatch": {
  793. "pass": "Element contains visible text as part of it's accessible name",
  794. "fail": "Text inside the element is not included in the accessible name"
  795. },
  796. "multiple-label": {
  797. "pass": "Form field does not have multiple label elements",
  798. "incomplete": "Multiple label elements is not widely supported in assistive technologies. Ensure the first label contains all necessary information."
  799. },
  800. "title-only": {
  801. "pass": "Form element does not solely use title attribute for its label",
  802. "fail": "Only title used to generate label for form element"
  803. },
  804. "landmark-is-unique": {
  805. "pass": "Landmarks must have a unique role or role/label/title (i.e. accessible name) combination",
  806. "fail": "The landmark must have a unique aria-label, aria-labelledby, or title to make landmarks distinguishable"
  807. },
  808. "has-lang": {
  809. "pass": "The <html> element has a lang attribute",
  810. "fail": {
  811. "noXHTML": "The xml:lang attribute is not valid on HTML pages, use the lang attribute.",
  812. "noLang": "The <html> element does not have a lang attribute"
  813. }
  814. },
  815. "valid-lang": {
  816. "pass": "Value of lang attribute is included in the list of valid languages",
  817. "fail": "Value of lang attribute not included in the list of valid languages"
  818. },
  819. "xml-lang-mismatch": {
  820. "pass": "Lang and xml:lang attributes have the same base language",
  821. "fail": "Lang and xml:lang attributes do not have the same base language"
  822. },
  823. "dlitem": {
  824. "pass": "Description list item has a <dl> parent element",
  825. "fail": "Description list item does not have a <dl> parent element"
  826. },
  827. "listitem": {
  828. "pass": "List item has a <ul>, <ol> or role=\"list\" parent element",
  829. "fail": {
  830. "default": "List item does not have a <ul>, <ol> parent element",
  831. "roleNotValid": "List item parent element has a role that is not role=\"list\""
  832. }
  833. },
  834. "only-dlitems": {
  835. "pass": "dl element only has direct children that are allowed inside; <dt>, <dd>, or <div> elements",
  836. "fail": "dl element has direct children that are not allowed: ${data.values}"
  837. },
  838. "only-listitems": {
  839. "pass": "List element only has direct children that are allowed inside <li> elements",
  840. "fail": "List element has direct children that are not allowed: ${data.values}"
  841. },
  842. "structured-dlitems": {
  843. "pass": "When not empty, element has both <dt> and <dd> elements",
  844. "fail": "When not empty, element does not have at least one <dt> element followed by at least one <dd> element"
  845. },
  846. "caption": {
  847. "pass": "The multimedia element has a captions track",
  848. "incomplete": "Check that captions are available for the element"
  849. },
  850. "frame-tested": {
  851. "pass": "The iframe was tested with axe-core",
  852. "fail": "The iframe could not be tested with axe-core",
  853. "incomplete": "The iframe still has to be tested with axe-core"
  854. },
  855. "no-autoplay-audio": {
  856. "pass": "<video> or <audio> does not output audio for more than allowed duration or has controls mechanism",
  857. "fail": "<video> or <audio> outputs audio for more than allowed duration and does not have a controls mechanism",
  858. "incomplete": "Check that the <video> or <audio> does not output audio for more than allowed duration or provides a controls mechanism"
  859. },
  860. "css-orientation-lock": {
  861. "pass": "Display is operable, and orientation lock does not exist",
  862. "fail": "CSS Orientation lock is applied, and makes display inoperable",
  863. "incomplete": "CSS Orientation lock cannot be determined"
  864. },
  865. "meta-viewport-large": {
  866. "pass": "<meta> tag does not prevent significant zooming on mobile devices",
  867. "fail": "<meta> tag limits zooming on mobile devices"
  868. },
  869. "meta-viewport": {
  870. "pass": "<meta> tag does not disable zooming on mobile devices",
  871. "fail": "${data} on <meta> tag disables zooming on mobile devices"
  872. },
  873. "target-offset": {
  874. "pass": {
  875. "default": "Target has sufficient space from its closest neighbors. Safe clickable space has a diameter of ${data.closestOffset}px which is at least ${data.minOffset}px.",
  876. "large": "Target far exceeds the minimum size of ${data.minOffset}px."
  877. },
  878. "fail": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of ${data.closestOffset}px instead of at least ${data.minOffset}px.",
  879. "incomplete": {
  880. "default": "Element with negative tabindex has insufficient space to its closest neighbors. Safe clickable space has a diameter of ${data.closestOffset}px instead of at least ${data.minOffset}px. Is this a target?",
  881. "nonTabbableNeighbor": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of ${data.closestOffset}px instead of at least ${data.minOffset}px. Is the neighbor a target?",
  882. "tooManyRects": "Could not get the target size because there are too many overlapping elements"
  883. }
  884. },
  885. "target-size": {
  886. "pass": {
  887. "default": "Control has sufficient size (${data.width}px by ${data.height}px, should be at least ${data.minSize}px by ${data.minSize}px)",
  888. "obscured": "Control is ignored because it is fully obscured and thus not clickable",
  889. "large": "Target far exceeds the minimum size of ${data.minSize}px."
  890. },
  891. "fail": {
  892. "default": "Target has insufficient size (${data.width}px by ${data.height}px, should be at least ${data.minSize}px by ${data.minSize}px)",
  893. "partiallyObscured": "Target has insufficient size because it is partially obscured (smallest space is ${data.width}px by ${data.height}px, should be at least ${data.minSize}px by ${data.minSize}px)"
  894. },
  895. "incomplete": {
  896. "default": "Element with negative tabindex has insufficient size (${data.width}px by ${data.height}px, should be at least ${data.minSize}px by ${data.minSize}px). Is this a target?",
  897. "contentOverflow": "Element size could not be accurately determined due to overflow content",
  898. "partiallyObscured": "Element with negative tabindex has insufficient size because it is partially obscured (smallest space is ${data.width}px by ${data.height}px, should be at least ${data.minSize}px by ${data.minSize}px). Is this a target?",
  899. "partiallyObscuredNonTabbable": "Target has insufficient size because it is partially obscured by a neighbor with negative tabindex (smallest space is ${data.width}px by ${data.height}px, should be at least ${data.minSize}px by ${data.minSize}px). Is the neighbor a target?",
  900. "tooManyRects": "Could not get the target size because there are too many overlapping elements"
  901. }
  902. },
  903. "header-present": {
  904. "pass": "Page has a heading",
  905. "fail": "Page does not have a heading"
  906. },
  907. "heading-order": {
  908. "pass": "Heading order valid",
  909. "fail": "Heading order invalid",
  910. "incomplete": "Unable to determine previous heading"
  911. },
  912. "identical-links-same-purpose": {
  913. "pass": "There are no other links with the same name, that go to a different URL",
  914. "incomplete": "Check that links have the same purpose, or are intentionally ambiguous."
  915. },
  916. "internal-link-present": {
  917. "pass": "Valid skip link found",
  918. "fail": "No valid skip link found"
  919. },
  920. "landmark": {
  921. "pass": "Page has a landmark region",
  922. "fail": "Page does not have a landmark region"
  923. },
  924. "meta-refresh-no-exceptions": {
  925. "pass": "<meta> tag does not immediately refresh the page",
  926. "fail": "<meta> tag forces timed refresh of page"
  927. },
  928. "meta-refresh": {
  929. "pass": "<meta> tag does not immediately refresh the page",
  930. "fail": "<meta> tag forces timed refresh of page (less than 20 hours)"
  931. },
  932. "p-as-heading": {
  933. "pass": "<p> elements are not styled as headings",
  934. "fail": "Heading elements should be used instead of styled <p> elements",
  935. "incomplete": "Unable to determine if <p> elements are styled as headings"
  936. },
  937. "region": {
  938. "pass": "All page content is contained by landmarks",
  939. "fail": "Some page content is not contained by landmarks"
  940. },
  941. "skip-link": {
  942. "pass": "Skip link target exists",
  943. "incomplete": "Skip link target should become visible on activation",
  944. "fail": "No skip link target"
  945. },
  946. "unique-frame-title": {
  947. "pass": "Element's title attribute is unique",
  948. "fail": "Element's title attribute is not unique"
  949. },
  950. "duplicate-id-active": {
  951. "pass": "Document has no active elements that share the same id attribute",
  952. "fail": "Document has active elements with the same id attribute: ${data}"
  953. },
  954. "duplicate-id-aria": {
  955. "pass": "Document has no elements referenced with ARIA or labels that share the same id attribute",
  956. "fail": "Document has multiple elements referenced with ARIA with the same id attribute: ${data}"
  957. },
  958. "duplicate-id": {
  959. "pass": "Document has no static elements that share the same id attribute",
  960. "fail": "Document has multiple static elements with the same id attribute: ${data}"
  961. },
  962. "aria-label": {
  963. "pass": "aria-label attribute exists and is not empty",
  964. "fail": "aria-label attribute does not exist or is empty"
  965. },
  966. "aria-labelledby": {
  967. "pass": "aria-labelledby attribute exists and references elements that are visible to screen readers",
  968. "fail": "aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty",
  969. "incomplete": "Ensure aria-labelledby references an existing element"
  970. },
  971. "avoid-inline-spacing": {
  972. "pass": "No inline styles with '!important' that affect text spacing has been specified",
  973. "fail": {
  974. "singular": "Remove '!important' from inline style ${data.values}, as overriding this is not supported by most browsers",
  975. "plural": "Remove '!important' from inline styles ${data.values}, as overriding this is not supported by most browsers"
  976. }
  977. },
  978. "button-has-visible-text": {
  979. "pass": "Element has inner text that is visible to screen readers",
  980. "fail": "Element does not have inner text that is visible to screen readers",
  981. "incomplete": "Unable to determine if element has children"
  982. },
  983. "doc-has-title": {
  984. "pass": "Document has a non-empty <title> element",
  985. "fail": "Document does not have a non-empty <title> element"
  986. },
  987. "exists": {
  988. "pass": "Element does not exist",
  989. "incomplete": "Element exists"
  990. },
  991. "has-alt": {
  992. "pass": "Element has an alt attribute",
  993. "fail": "Element does not have an alt attribute"
  994. },
  995. "has-visible-text": {
  996. "pass": "Element has text that is visible to screen readers",
  997. "fail": "Element does not have text that is visible to screen readers",
  998. "incomplete": "Unable to determine if element has children"
  999. },
  1000. "important-letter-spacing": {
  1001. "pass": "Letter-spacing in the style attribute is not set to !important, or meets the minimum",
  1002. "fail": "letter-spacing in the style attribute must not use !important, or be at ${data.minValue}em (current ${data.value}em)"
  1003. },
  1004. "important-line-height": {
  1005. "pass": "line-height in the style attribute is not set to !important, or meets the minimum",
  1006. "fail": "line-height in the style attribute must not use !important, or be at ${data.minValue}em (current ${data.value}em)"
  1007. },
  1008. "important-word-spacing": {
  1009. "pass": "word-spacing in the style attribute is not set to !important, or meets the minimum",
  1010. "fail": "word-spacing in the style attribute must not use !important, or be at ${data.minValue}em (current ${data.value}em)"
  1011. },
  1012. "is-on-screen": {
  1013. "pass": "Element is not visible",
  1014. "fail": "Element is visible"
  1015. },
  1016. "non-empty-alt": {
  1017. "pass": "Element has a non-empty alt attribute",
  1018. "fail": {
  1019. "noAttr": "Element has no alt attribute",
  1020. "emptyAttr": "Element has an empty alt attribute"
  1021. }
  1022. },
  1023. "non-empty-if-present": {
  1024. "pass": {
  1025. "default": "Element does not have a value attribute",
  1026. "has-label": "Element has a non-empty value attribute"
  1027. },
  1028. "fail": "Element has a value attribute and the value attribute is empty"
  1029. },
  1030. "non-empty-placeholder": {
  1031. "pass": "Element has a placeholder attribute",
  1032. "fail": {
  1033. "noAttr": "Element has no placeholder attribute",
  1034. "emptyAttr": "Element has an empty placeholder attribute"
  1035. }
  1036. },
  1037. "non-empty-title": {
  1038. "pass": "Element has a title attribute",
  1039. "fail": {
  1040. "noAttr": "Element has no title attribute",
  1041. "emptyAttr": "Element has an empty title attribute"
  1042. }
  1043. },
  1044. "non-empty-value": {
  1045. "pass": "Element has a non-empty value attribute",
  1046. "fail": {
  1047. "noAttr": "Element has no value attribute",
  1048. "emptyAttr": "Element has an empty value attribute"
  1049. }
  1050. },
  1051. "presentational-role": {
  1052. "pass": "Element's default semantics were overridden with role=\"${data.role}\"",
  1053. "fail": {
  1054. "default": "Element's default semantics were not overridden with role=\"none\" or role=\"presentation\"",
  1055. "globalAria": "Element's role is not presentational because it has a global ARIA attribute",
  1056. "focusable": "Element's role is not presentational because it is focusable",
  1057. "both": "Element's role is not presentational because it has a global ARIA attribute and is focusable",
  1058. "iframe": "Using the \"title\" attribute on an ${data.nodeName} element with a presentational role behaves inconsistently between screen readers"
  1059. }
  1060. },
  1061. "role-none": {
  1062. "pass": "Element's default semantics were overridden with role=\"none\"",
  1063. "fail": "Element's default semantics were not overridden with role=\"none\""
  1064. },
  1065. "role-presentation": {
  1066. "pass": "Element's default semantics were overridden with role=\"presentation\"",
  1067. "fail": "Element's default semantics were not overridden with role=\"presentation\""
  1068. },
  1069. "svg-non-empty-title": {
  1070. "pass": "Element has a child that is a title",
  1071. "fail": {
  1072. "noTitle": "Element has no child that is a title",
  1073. "emptyTitle": "Element child title is empty"
  1074. },
  1075. "incomplete": "Unable to determine element has a child that is a title"
  1076. },
  1077. "caption-faked": {
  1078. "pass": "The first row of a table is not used as a caption",
  1079. "fail": "The first child of the table should be a caption instead of a table cell"
  1080. },
  1081. "html5-scope": {
  1082. "pass": "Scope attribute is only used on table header elements (<th>)",
  1083. "fail": "In HTML 5, scope attributes may only be used on table header elements (<th>)"
  1084. },
  1085. "same-caption-summary": {
  1086. "pass": "Content of summary attribute and <caption> are not duplicated",
  1087. "fail": "Content of summary attribute and <caption> element are identical",
  1088. "incomplete": "Unable to determine if <table> element has a caption"
  1089. },
  1090. "scope-value": {
  1091. "pass": "Scope attribute is used correctly",
  1092. "fail": "The value of the scope attribute may only be 'row' or 'col'"
  1093. },
  1094. "td-has-header": {
  1095. "pass": "All non-empty data cells have table headers",
  1096. "fail": "Some non-empty data cells do not have table headers"
  1097. },
  1098. "td-headers-attr": {
  1099. "pass": "The headers attribute is exclusively used to refer to other cells in the table",
  1100. "incomplete": "The headers attribute is empty",
  1101. "fail": "The headers attribute is not exclusively used to refer to other cells in the table"
  1102. },
  1103. "th-has-data-cells": {
  1104. "pass": "All table header cells refer to data cells",
  1105. "fail": "Not all table header cells refer to data cells",
  1106. "incomplete": "Table data cells are missing or empty"
  1107. },
  1108. "hidden-content": {
  1109. "pass": "All content on the page has been analyzed.",
  1110. "fail": "There were problems analyzing the content on this page.",
  1111. "incomplete": "There is hidden content on the page that was not analyzed. You will need to trigger the display of this content in order to analyze it."
  1112. }
  1113. },
  1114. "failureSummaries": {
  1115. "any": {
  1116. "failureMessage": "Fix any of the following:{{~it:value}}\n {{=value.split('\\n').join('\\n ')}}{{~}}"
  1117. },
  1118. "none": {
  1119. "failureMessage": "Fix all of the following:{{~it:value}}\n {{=value.split('\\n').join('\\n ')}}{{~}}"
  1120. }
  1121. },
  1122. "incompleteFallbackMessage": "axe couldn't tell the reason. Time to break out the element inspector!"
  1123. }