12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067 |
- {
- "lang": "xyz",
- "rules": {
- "accesskeys": {
- "description": "Ensures every accesskey attribute value is unique",
- "help": "accesskey attribute value should be unique"
- },
- "area-alt": {
- "description": "Ensures <area> elements of image maps have alternate text",
- "help": "Active <area> elements must have alternate text"
- },
- "aria-allowed-attr": {
- "description": "Ensures ARIA attributes are allowed for an element's role",
- "help": "Elements must only use allowed ARIA attributes"
- },
- "aria-allowed-role": {
- "description": "Ensures role attribute has an appropriate value for the element",
- "help": "ARIA role should be appropriate for the element"
- },
- "aria-command-name": {
- "description": "Ensures every ARIA button, link and menuitem has an accessible name",
- "help": "ARIA commands must have an accessible name"
- },
- "aria-dialog-name": {
- "description": "Ensures every ARIA dialog and alertdialog node has an accessible name",
- "help": "ARIA dialog and alertdialog nodes should have an accessible name"
- },
- "aria-hidden-body": {
- "description": "Ensures aria-hidden='true' is not present on the document body.",
- "help": "aria-hidden='true' must not be present on the document body"
- },
- "aria-hidden-focus": {
- "description": "Ensures aria-hidden elements are not focusable nor contain focusable elements",
- "help": "ARIA hidden element must not be focusable or contain focusable elements"
- },
- "aria-input-field-name": {
- "description": "Ensures every ARIA input field has an accessible name",
- "help": "ARIA input fields must have an accessible name"
- },
- "aria-meter-name": {
- "description": "Ensures every ARIA meter node has an accessible name",
- "help": "ARIA meter nodes must have an accessible name"
- },
- "aria-progressbar-name": {
- "description": "Ensures every ARIA progressbar node has an accessible name",
- "help": "ARIA progressbar nodes must have an accessible name"
- },
- "aria-required-attr": {
- "description": "Ensures elements with ARIA roles have all required ARIA attributes",
- "help": "Required ARIA attributes must be provided"
- },
- "aria-required-children": {
- "description": "Ensures elements with an ARIA role that require child roles contain them",
- "help": "Certain ARIA roles must contain particular children"
- },
- "aria-required-parent": {
- "description": "Ensures elements with an ARIA role that require parent roles are contained by them",
- "help": "Certain ARIA roles must be contained by particular parents"
- },
- "aria-roledescription": {
- "description": "Ensure aria-roledescription is only used on elements with an implicit or explicit role",
- "help": "aria-roledescription must be on elements with a semantic role"
- },
- "aria-roles": {
- "description": "Ensures all elements with a role attribute use a valid value",
- "help": "ARIA roles used must conform to valid values"
- },
- "aria-text": {
- "description": "Ensures \"role=text\" is used on elements with no focusable descendants",
- "help": "\"role=text\" should have no focusable descendants"
- },
- "aria-toggle-field-name": {
- "description": "Ensures every ARIA toggle field has an accessible name",
- "help": "ARIA toggle fields must have an accessible name"
- },
- "aria-tooltip-name": {
- "description": "Ensures every ARIA tooltip node has an accessible name",
- "help": "ARIA tooltip nodes must have an accessible name"
- },
- "aria-treeitem-name": {
- "description": "Ensures every ARIA treeitem node has an accessible name",
- "help": "ARIA treeitem nodes should have an accessible name"
- },
- "aria-valid-attr-value": {
- "description": "Ensures all ARIA attributes have valid values",
- "help": "ARIA attributes must conform to valid values"
- },
- "aria-valid-attr": {
- "description": "Ensures attributes that begin with aria- are valid ARIA attributes",
- "help": "ARIA attributes must conform to valid names"
- },
- "audio-caption": {
- "description": "Ensures <audio> elements have captions",
- "help": "<audio> elements must have a captions track"
- },
- "autocomplete-valid": {
- "description": "Ensure the autocomplete attribute is correct and suitable for the form field",
- "help": "autocomplete attribute must be used correctly"
- },
- "avoid-inline-spacing": {
- "description": "Ensure that text spacing set through style attributes can be adjusted with custom stylesheets",
- "help": "Inline text spacing must be adjustable with custom stylesheets"
- },
- "blink": {
- "description": "Ensures <blink> elements are not used",
- "help": "<blink> elements are deprecated and must not be used"
- },
- "button-name": {
- "description": "Ensures buttons have discernible text",
- "help": "Buttons must have discernible text"
- },
- "bypass": {
- "description": "Ensures each page has at least one mechanism for a user to bypass navigation and jump straight to the content",
- "help": "Page must have means to bypass repeated blocks"
- },
- "color-contrast-enhanced": {
- "description": "Ensures the contrast between foreground and background colors meets WCAG 2 AAA enhanced contrast ratio thresholds",
- "help": "Elements must meet enhanced color contrast ratio thresholds"
- },
- "color-contrast": {
- "description": "Ensures the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
- "help": "Elements must meet minimum color contrast ratio thresholds"
- },
- "css-orientation-lock": {
- "description": "Ensures content is not locked to any specific display orientation, and the content is operable in all display orientations",
- "help": "CSS Media queries must not lock display orientation"
- },
- "definition-list": {
- "description": "Ensures <dl> elements are structured correctly",
- "help": "<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script>, <template> or <div> elements"
- },
- "dlitem": {
- "description": "Ensures <dt> and <dd> elements are contained by a <dl>",
- "help": "<dt> and <dd> elements must be contained by a <dl>"
- },
- "document-title": {
- "description": "Ensures each HTML document contains a non-empty <title> element",
- "help": "Documents must have <title> element to aid in navigation"
- },
- "duplicate-id-active": {
- "description": "Ensures every id attribute value of active elements is unique",
- "help": "IDs of active elements must be unique"
- },
- "duplicate-id-aria": {
- "description": "Ensures every id attribute value used in ARIA and in labels is unique",
- "help": "IDs used in ARIA and labels must be unique"
- },
- "duplicate-id": {
- "description": "Ensures every id attribute value is unique",
- "help": "id attribute value must be unique"
- },
- "empty-heading": {
- "description": "Ensures headings have discernible text",
- "help": "Headings should not be empty"
- },
- "empty-table-header": {
- "description": "Ensures table headers have discernible text",
- "help": "Table header text should not be empty"
- },
- "focus-order-semantics": {
- "description": "Ensures elements in the focus order have a role appropriate for interactive content",
- "help": "Elements in the focus order should have an appropriate role"
- },
- "form-field-multiple-labels": {
- "description": "Ensures form field does not have multiple label elements",
- "help": "Form field must not have multiple label elements"
- },
- "frame-focusable-content": {
- "description": "Ensures <frame> and <iframe> elements with focusable content do not have tabindex=-1",
- "help": "Frames with focusable content must not have tabindex=-1"
- },
- "frame-tested": {
- "description": "Ensures <iframe> and <frame> elements contain the axe-core script",
- "help": "Frames should be tested with axe-core"
- },
- "frame-title-unique": {
- "description": "Ensures <iframe> and <frame> elements contain a unique title attribute",
- "help": "Frames must have a unique title attribute"
- },
- "frame-title": {
- "description": "Ensures <iframe> and <frame> elements have an accessible name",
- "help": "Frames must have an accessible name"
- },
- "heading-order": {
- "description": "Ensures the order of headings is semantically correct",
- "help": "Heading levels should only increase by one"
- },
- "hidden-content": {
- "description": "Informs users about hidden content.",
- "help": "Hidden content on the page should be analyzed"
- },
- "html-has-lang": {
- "description": "Ensures every HTML document has a lang attribute",
- "help": "<html> element must have a lang attribute"
- },
- "html-lang-valid": {
- "description": "Ensures the lang attribute of the <html> element has a valid value",
- "help": "<html> element must have a valid value for the lang attribute"
- },
- "html-xml-lang-mismatch": {
- "description": "Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page",
- "help": "HTML elements with lang and xml:lang must have the same base language"
- },
- "identical-links-same-purpose": {
- "description": "Ensure that links with the same accessible name serve a similar purpose",
- "help": "Links with the same name must have a similar purpose"
- },
- "image-alt": {
- "description": "Ensures <img> elements have alternate text or a role of none or presentation",
- "help": "Images must have alternate text"
- },
- "image-redundant-alt": {
- "description": "Ensure image alternative is not repeated as text",
- "help": "Alternative text of images should not be repeated as text"
- },
- "input-button-name": {
- "description": "Ensures input buttons have discernible text",
- "help": "Input buttons must have discernible text"
- },
- "input-image-alt": {
- "description": "Ensures <input type=\"image\"> elements have alternate text",
- "help": "Image buttons must have alternate text"
- },
- "label-content-name-mismatch": {
- "description": "Ensures that elements labelled through their content must have their visible text as part of their accessible name",
- "help": "Elements must have their visible text as part of their accessible name"
- },
- "label-title-only": {
- "description": "Ensures that every form element has a visible label and is not solely labeled using hidden labels, or the title or aria-describedby attributes",
- "help": "Form elements should have a visible label"
- },
- "label": {
- "description": "Ensures every form element has a label",
- "help": "Form elements must have labels"
- },
- "landmark-banner-is-top-level": {
- "description": "Ensures the banner landmark is at top level",
- "help": "Banner landmark should not be contained in another landmark"
- },
- "landmark-complementary-is-top-level": {
- "description": "Ensures the complementary landmark or aside is at top level",
- "help": "Aside should not be contained in another landmark"
- },
- "landmark-contentinfo-is-top-level": {
- "description": "Ensures the contentinfo landmark is at top level",
- "help": "Contentinfo landmark should not be contained in another landmark"
- },
- "landmark-main-is-top-level": {
- "description": "Ensures the main landmark is at top level",
- "help": "Main landmark should not be contained in another landmark"
- },
- "landmark-no-duplicate-banner": {
- "description": "Ensures the document has at most one banner landmark",
- "help": "Document should not have more than one banner landmark"
- },
- "landmark-no-duplicate-contentinfo": {
- "description": "Ensures the document has at most one contentinfo landmark",
- "help": "Document should not have more than one contentinfo landmark"
- },
- "landmark-no-duplicate-main": {
- "description": "Ensures the document has at most one main landmark",
- "help": "Document should not have more than one main landmark"
- },
- "landmark-one-main": {
- "description": "Ensures the document has a main landmark",
- "help": "Document should have one main landmark"
- },
- "landmark-unique": {
- "help": "Ensures landmarks are unique",
- "description": "Landmarks should have a unique role or role/label/title (i.e. accessible name) combination"
- },
- "link-in-text-block": {
- "description": "Ensure links are distinguished from surrounding text in a way that does not rely on color",
- "help": "Links must be distinguishable without relying on color"
- },
- "link-name": {
- "description": "Ensures links have discernible text",
- "help": "Links must have discernible text"
- },
- "list": {
- "description": "Ensures that lists are structured correctly",
- "help": "<ul> and <ol> must only directly contain <li>, <script> or <template> elements"
- },
- "listitem": {
- "description": "Ensures <li> elements are used semantically",
- "help": "<li> elements must be contained in a <ul> or <ol>"
- },
- "marquee": {
- "description": "Ensures <marquee> elements are not used",
- "help": "<marquee> elements are deprecated and must not be used"
- },
- "meta-refresh-no-exceptions": {
- "description": "Ensures <meta http-equiv=\"refresh\"> is not used for delayed refresh",
- "help": "Delayed refresh must not be used"
- },
- "meta-refresh": {
- "description": "Ensures <meta http-equiv=\"refresh\"> is not used for delayed refresh",
- "help": "Delayed refresh under 20 hours must not be used"
- },
- "meta-viewport-large": {
- "description": "Ensures <meta name=\"viewport\"> can scale a significant amount",
- "help": "Users should be able to zoom and scale the text up to 500%"
- },
- "meta-viewport": {
- "description": "Ensures <meta name=\"viewport\"> does not disable text scaling and zooming",
- "help": "Zooming and scaling must not be disabled"
- },
- "nested-interactive": {
- "description": "Ensures interactive controls are not nested as they are not always announced by screen readers or can cause focus problems for assistive technologies",
- "help": "Interactive controls must not be nested"
- },
- "no-autoplay-audio": {
- "description": "Ensures <video> or <audio> elements do not autoplay audio for more than 3 seconds without a control mechanism to stop or mute the audio",
- "help": "<video> or <audio> elements must not play automatically"
- },
- "object-alt": {
- "description": "Ensures <object> elements have alternate text",
- "help": "<object> elements must have alternate text"
- },
- "p-as-heading": {
- "description": "Ensure bold, italic text and font-size is not used to style <p> elements as a heading",
- "help": "Styled <p> elements must not be used as headings"
- },
- "page-has-heading-one": {
- "description": "Ensure that the page, or at least one of its frames contains a level-one heading",
- "help": "Page should contain a level-one heading"
- },
- "presentation-role-conflict": {
- "description": "Elements marked as presentational should not have global ARIA or tabindex to ensure all screen readers ignore them",
- "help": "Ensure elements marked as presentational are consistently ignored"
- },
- "region": {
- "description": "Ensures all page content is contained by landmarks",
- "help": "All page content should be contained by landmarks"
- },
- "role-img-alt": {
- "description": "Ensures [role='img'] elements have alternate text",
- "help": "[role='img'] elements must have an alternative text"
- },
- "scope-attr-valid": {
- "description": "Ensures the scope attribute is used correctly on tables",
- "help": "scope attribute should be used correctly"
- },
- "scrollable-region-focusable": {
- "description": "Ensure elements that have scrollable content are accessible by keyboard",
- "help": "Scrollable region must have keyboard access"
- },
- "select-name": {
- "description": "Ensures select element has an accessible name",
- "help": "Select element must have an accessible name"
- },
- "server-side-image-map": {
- "description": "Ensures that server-side image maps are not used",
- "help": "Server-side image maps must not be used"
- },
- "skip-link": {
- "description": "Ensure all skip links have a focusable target",
- "help": "The skip-link target should exist and be focusable"
- },
- "svg-img-alt": {
- "description": "Ensures <svg> elements with an img, graphics-document or graphics-symbol role have an accessible text",
- "help": "<svg> elements with an img role must have an alternative text"
- },
- "tabindex": {
- "description": "Ensures tabindex attribute values are not greater than 0",
- "help": "Elements should not have tabindex greater than zero"
- },
- "table-duplicate-name": {
- "description": "Ensure the <caption> element does not contain the same text as the summary attribute",
- "help": "tables should not have the same summary and caption"
- },
- "table-fake-caption": {
- "description": "Ensure that tables with a caption use the <caption> element.",
- "help": "Data or header cells must not be used to give caption to a data table."
- },
- "target-size": {
- "description": "Ensure touch target have sufficient size and space",
- "help": "All touch targets must be 24px large, or leave sufficient space"
- },
- "td-has-header": {
- "description": "Ensure that each non-empty data cell in a <table> larger than 3 by 3 has one or more table headers",
- "help": "Non-empty <td> elements in larger <table> must have an associated table header"
- },
- "td-headers-attr": {
- "description": "Ensure that each cell in a table that uses the headers attribute refers only to other cells in that table",
- "help": "Table cells that use the headers attribute must only refer to cells in the same table"
- },
- "th-has-data-cells": {
- "description": "Ensure that <th> elements and elements with role=columnheader/rowheader have data cells they describe",
- "help": "Table headers in a data table must refer to data cells"
- },
- "valid-lang": {
- "description": "Ensures lang attributes have valid values",
- "help": "lang attribute must have a valid value"
- },
- "video-caption": {
- "description": "Ensures <video> elements have captions",
- "help": "<video> elements must have captions"
- }
- },
- "checks": {
- "abstractrole": {
- "pass": "Abstract roles are not used",
- "fail": {
- "singular": "Abstract role cannot be directly used: ${data.values}",
- "plural": "Abstract roles cannot be directly used: ${data.values}"
- }
- },
- "aria-allowed-attr": {
- "pass": "ARIA attributes are used correctly for the defined role",
- "fail": {
- "singular": "ARIA attribute is not allowed: ${data.values}",
- "plural": "ARIA attributes are not allowed: ${data.values}"
- },
- "incomplete": "Check that there is no problem if the ARIA attribute is ignored on this element: ${data.values}"
- },
- "aria-allowed-role": {
- "pass": "ARIA role is allowed for given element",
- "fail": {
- "singular": "ARIA role ${data.values} is not allowed for given element",
- "plural": "ARIA roles ${data.values} are not allowed for given element"
- },
- "incomplete": {
- "singular": "ARIA role ${data.values} must be removed when the element is made visible, as it is not allowed for the element",
- "plural": "ARIA roles ${data.values} must be removed when the element is made visible, as they are not allowed for the element"
- }
- },
- "aria-busy": {
- "pass": "Element has an aria-busy attribute",
- "fail": "Element uses aria-busy=\"true\" while showing a loader"
- },
- "aria-errormessage": {
- "pass": "aria-errormessage exists and references elements visible to screen readers that use a supported aria-errormessage technique",
- "fail": {
- "singular": "aria-errormessage value `${data.values}` must use a technique to announce the message (e.g., aria-live, aria-describedby, role=alert, etc.)",
- "plural": "aria-errormessage values `${data.values}` must use a technique to announce the message (e.g., aria-live, aria-describedby, role=alert, etc.)",
- "hidden": "aria-errormessage value `${data.values}` cannot reference a hidden element"
- },
- "incomplete": {
- "singular": "ensure aria-errormessage value `${data.values}` references an existing element",
- "plural": "ensure aria-errormessage values `${data.values}` reference existing elements",
- "idrefs": "unable to determine if aria-errormessage element exists on the page: ${data.values}"
- }
- },
- "aria-hidden-body": {
- "pass": "No aria-hidden attribute is present on document body",
- "fail": "aria-hidden=true should not be present on the document body"
- },
- "aria-level": {
- "pass": "aria-level values are valid",
- "incomplete": "aria-level values greater than 6 are not supported in all screenreader and browser combinations"
- },
- "aria-prohibited-attr": {
- "pass": "ARIA attribute is allowed",
- "fail": {
- "hasRolePlural": "${data.prohibited} attributes cannot be used with role \"${data.role}\".",
- "hasRoleSingular": "${data.prohibited} attribute cannot be used with role \"${data.role}\".",
- "noRolePlural": "${data.prohibited} attributes cannot be used on a ${data.nodeName} with no valid role attribute.",
- "noRoleSingular": "${data.prohibited} attribute cannot be used on a ${data.nodeName} with no valid role attribute."
- },
- "incomplete": {
- "hasRoleSingular": "${data.prohibited} attribute is not well supported with role \"${data.role}\".",
- "hasRolePlural": "${data.prohibited} attributes are not well supported with role \"${data.role}\".",
- "noRoleSingular": "${data.prohibited} attribute is not well supported on a ${data.nodeName} with no valid role attribute.",
- "noRolePlural": "${data.prohibited} attributes are not well supported on a ${data.nodeName} with no valid role attribute."
- }
- },
- "aria-required-attr": {
- "pass": "All required ARIA attributes are present",
- "fail": {
- "singular": "Required ARIA attribute not present: ${data.values}",
- "plural": "Required ARIA attributes not present: ${data.values}"
- }
- },
- "aria-required-children": {
- "pass": "Required ARIA children are present",
- "fail": {
- "singular": "Required ARIA child role not present: ${data.values}",
- "plural": "Required ARIA children role not present: ${data.values}",
- "unallowed": "Element has children which are not allowed: ${data.values}"
- },
- "incomplete": {
- "singular": "Expecting ARIA child role to be added: ${data.values}",
- "plural": "Expecting ARIA children role to be added: ${data.values}"
- }
- },
- "aria-required-parent": {
- "pass": "Required ARIA parent role present",
- "fail": {
- "singular": "Required ARIA parent role not present: ${data.values}",
- "plural": "Required ARIA parents role not present: ${data.values}"
- }
- },
- "aria-roledescription": {
- "pass": "aria-roledescription used on a supported semantic role",
- "incomplete": "Check that the aria-roledescription is announced by supported screen readers",
- "fail": "Give the element a role that supports aria-roledescription"
- },
- "aria-unsupported-attr": {
- "pass": "ARIA attribute is supported",
- "fail": "ARIA attribute is not widely supported in screen readers and assistive technologies: ${data.values}"
- },
- "aria-valid-attr-value": {
- "pass": "ARIA attribute values are valid",
- "fail": {
- "singular": "Invalid ARIA attribute value: ${data.values}",
- "plural": "Invalid ARIA attribute values: ${data.values}"
- },
- "incomplete": {
- "noId": "ARIA attribute element ID does not exist on the page: ${data.needsReview}",
- "noIdShadow": "ARIA attribute element ID does not exist on the page or is a descendant of a different shadow DOM tree: ${data.needsReview}",
- "ariaCurrent": "ARIA attribute value is invalid and will be treated as \"aria-current=true\": ${data.needsReview}",
- "idrefs": "Unable to determine if ARIA attribute element ID exists on the page: ${data.needsReview}",
- "empty": "ARIA attribute value is ignored while empty: ${data.needsReview}"
- }
- },
- "aria-valid-attr": {
- "pass": "ARIA attribute name is valid",
- "fail": {
- "singular": "Invalid ARIA attribute name: ${data.values}",
- "plural": "Invalid ARIA attribute names: ${data.values}"
- }
- },
- "deprecatedrole": {
- "pass": "ARIA role is not deprecated",
- "fail": "The role used is deprecated: ${data}"
- },
- "fallbackrole": {
- "pass": "Only one role value used",
- "fail": "Use only one role value, since fallback roles are not supported in older browsers",
- "incomplete": "Use only role 'presentation' or 'none' since they are synonymous."
- },
- "has-global-aria-attribute": {
- "pass": {
- "singular": "Element has global ARIA attribute: ${data.values}",
- "plural": "Element has global ARIA attributes: ${data.values}"
- },
- "fail": "Element does not have global ARIA attribute"
- },
- "has-widget-role": {
- "pass": "Element has a widget role.",
- "fail": "Element does not have a widget role."
- },
- "invalidrole": {
- "pass": "ARIA role is valid",
- "fail": {
- "singular": "Role must be one of the valid ARIA roles: ${data.values}",
- "plural": "Roles must be one of the valid ARIA roles: ${data.values}"
- }
- },
- "is-element-focusable": {
- "pass": "Element is focusable.",
- "fail": "Element is not focusable."
- },
- "no-implicit-explicit-label": {
- "pass": "There is no mismatch between a <label> and accessible name",
- "incomplete": "Check that the <label> does not need be part of the ARIA ${data} field's name"
- },
- "unsupportedrole": {
- "pass": "ARIA role is supported",
- "fail": "The role used is not widely supported in screen readers and assistive technologies: ${data}"
- },
- "valid-scrollable-semantics": {
- "pass": "Element has valid semantics for an element in the focus order.",
- "fail": "Element has invalid semantics for an element in the focus order."
- },
- "color-contrast-enhanced": {
- "pass": "Element has sufficient color contrast of ${data.contrastRatio}",
- "fail": {
- "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}",
- "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}",
- "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}"
- },
- "incomplete": {
- "default": "Unable to determine contrast ratio",
- "bgImage": "Element's background color could not be determined due to a background image",
- "bgGradient": "Element's background color could not be determined due to a background gradient",
- "imgNode": "Element's background color could not be determined because element contains an image node",
- "bgOverlap": "Element's background color could not be determined because it is overlapped by another element",
- "fgAlpha": "Element's foreground color could not be determined because of alpha transparency",
- "elmPartiallyObscured": "Element's background color could not be determined because it's partially obscured by another element",
- "elmPartiallyObscuring": "Element's background color could not be determined because it partially overlaps other elements",
- "outsideViewport": "Element's background color could not be determined because it's outside the viewport",
- "equalRatio": "Element has a 1:1 contrast ratio with the background",
- "shortTextContent": "Element content is too short to determine if it is actual text content",
- "nonBmp": "Element content contains only non-text characters",
- "pseudoContent": "Element's background color could not be determined due to a pseudo element"
- }
- },
- "color-contrast": {
- "pass": {
- "default": "Element has sufficient color contrast of ${data.contrastRatio}",
- "hidden": "Element is hidden"
- },
- "fail": {
- "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}",
- "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}",
- "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}"
- },
- "incomplete": {
- "default": "Unable to determine contrast ratio",
- "bgImage": "Element's background color could not be determined due to a background image",
- "bgGradient": "Element's background color could not be determined due to a background gradient",
- "imgNode": "Element's background color could not be determined because element contains an image node",
- "bgOverlap": "Element's background color could not be determined because it is overlapped by another element",
- "fgAlpha": "Element's foreground color could not be determined because of alpha transparency",
- "elmPartiallyObscured": "Element's background color could not be determined because it's partially obscured by another element",
- "elmPartiallyObscuring": "Element's background color could not be determined because it partially overlaps other elements",
- "outsideViewport": "Element's background color could not be determined because it's outside the viewport",
- "equalRatio": "Element has a 1:1 contrast ratio with the background",
- "shortTextContent": "Element content is too short to determine if it is actual text content",
- "nonBmp": "Element content contains only non-text characters",
- "pseudoContent": "Element's background color could not be determined due to a pseudo element"
- }
- },
- "link-in-text-block-style": {
- "pass": "Links can be distinguished from surrounding text by visual styling",
- "fail": "The link has no styling (such as underline) to distinguish it from the surrounding text"
- },
- "link-in-text-block": {
- "pass": "Links can be distinguished from surrounding text in some way other than by color",
- "fail": {
- "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})",
- "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})"
- },
- "incomplete": {
- "default": "Element's foreground contrast ratio could not be determined",
- "bgContrast": "Element's background contrast ratio could not be determined",
- "bgImage": "Element's contrast ratio could not be determined due to a background image",
- "bgGradient": "Element's contrast ratio could not be determined due to a background gradient",
- "imgNode": "Element's contrast ratio could not be determined because element contains an image node",
- "bgOverlap": "Element's contrast ratio could not be determined because of element overlap"
- }
- },
- "autocomplete-appropriate": {
- "pass": "the autocomplete value is on an appropriate element",
- "fail": "the autocomplete value is inappropriate for this type of input"
- },
- "autocomplete-valid": {
- "pass": "the autocomplete attribute is correctly formatted",
- "fail": "the autocomplete attribute is incorrectly formatted"
- },
- "accesskeys": {
- "pass": "Accesskey attribute value is unique",
- "fail": "Document has multiple elements with the same accesskey"
- },
- "focusable-content": {
- "pass": "Element contains focusable elements",
- "fail": "Element should have focusable content"
- },
- "focusable-disabled": {
- "pass": "No focusable elements contained within element",
- "incomplete": "Check if the focusable elements immediately move the focus indicator",
- "fail": "Focusable content should be disabled or be removed from the DOM"
- },
- "focusable-element": {
- "pass": "Element is focusable",
- "fail": "Element should be focusable"
- },
- "focusable-modal-open": {
- "pass": "No focusable elements while a modal is open",
- "incomplete": "Check that focusable elements are not tabbable in the current state"
- },
- "focusable-no-name": {
- "pass": "Element is not in tab order or has accessible text",
- "fail": "Element is in tab order and does not have accessible text",
- "incomplete": "Unable to determine if element has an accessible name"
- },
- "focusable-not-tabbable": {
- "pass": "No focusable elements contained within element",
- "incomplete": "Check if the focusable elements immediately move the focus indicator",
- "fail": "Focusable content should have tabindex='-1' or be removed from the DOM"
- },
- "frame-focusable-content": {
- "pass": "Element does not have focusable descendants",
- "fail": "Element has focusable descendants",
- "incomplete": "Could not determine if element has descendants"
- },
- "landmark-is-top-level": {
- "pass": "The ${data.role} landmark is at the top level.",
- "fail": "The ${data.role} landmark is contained in another landmark."
- },
- "no-focusable-content": {
- "pass": "Element does not have focusable descendants",
- "fail": {
- "default": "Element has focusable descendants",
- "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')"
- },
- "incomplete": "Could not determine if element has descendants"
- },
- "page-has-heading-one": {
- "pass": "Page has at least one level-one heading",
- "fail": "Page must have a level-one heading"
- },
- "page-has-main": {
- "pass": "Document has at least one main landmark",
- "fail": "Document does not have a main landmark"
- },
- "page-no-duplicate-banner": {
- "pass": "Document does not have more than one banner landmark",
- "fail": "Document has more than one banner landmark"
- },
- "page-no-duplicate-contentinfo": {
- "pass": "Document does not have more than one contentinfo landmark",
- "fail": "Document has more than one contentinfo landmark"
- },
- "page-no-duplicate-main": {
- "pass": "Document does not have more than one main landmark",
- "fail": "Document has more than one main landmark"
- },
- "tabindex": {
- "pass": "Element does not have a tabindex greater than 0",
- "fail": "Element has a tabindex greater than 0"
- },
- "alt-space-value": {
- "pass": "Element has a valid alt attribute value",
- "fail": "Element has an alt attribute containing only a space character, which is not ignored by all screen readers"
- },
- "duplicate-img-label": {
- "pass": "Element does not duplicate existing text in <img> alt text",
- "fail": "Element contains <img> element with alt text that duplicates existing text"
- },
- "explicit-label": {
- "pass": "Form element has an explicit <label>",
- "fail": "Form element does not have an explicit <label>",
- "incomplete": "Unable to determine if form element has an explicit <label>"
- },
- "help-same-as-label": {
- "pass": "Help text (title or aria-describedby) does not duplicate label text",
- "fail": "Help text (title or aria-describedby) text is the same as the label text"
- },
- "hidden-explicit-label": {
- "pass": "Form element has a visible explicit <label>",
- "fail": "Form element has explicit <label> that is hidden",
- "incomplete": "Unable to determine if form element has explicit <label> that is hidden"
- },
- "implicit-label": {
- "pass": "Form element has an implicit (wrapped) <label>",
- "fail": "Form element does not have an implicit (wrapped) <label>",
- "incomplete": "Unable to determine if form element has an implicit (wrapped} <label>"
- },
- "label-content-name-mismatch": {
- "pass": "Element contains visible text as part of it's accessible name",
- "fail": "Text inside the element is not included in the accessible name"
- },
- "multiple-label": {
- "pass": "Form field does not have multiple label elements",
- "incomplete": "Multiple label elements is not widely supported in assistive technologies. Ensure the first label contains all necessary information."
- },
- "title-only": {
- "pass": "Form element does not solely use title attribute for its label",
- "fail": "Only title used to generate label for form element"
- },
- "landmark-is-unique": {
- "pass": "Landmarks must have a unique role or role/label/title (i.e. accessible name) combination",
- "fail": "The landmark must have a unique aria-label, aria-labelledby, or title to make landmarks distinguishable"
- },
- "has-lang": {
- "pass": "The <html> element has a lang attribute",
- "fail": {
- "noXHTML": "The xml:lang attribute is not valid on HTML pages, use the lang attribute.",
- "noLang": "The <html> element does not have a lang attribute"
- }
- },
- "valid-lang": {
- "pass": "Value of lang attribute is included in the list of valid languages",
- "fail": "Value of lang attribute not included in the list of valid languages"
- },
- "xml-lang-mismatch": {
- "pass": "Lang and xml:lang attributes have the same base language",
- "fail": "Lang and xml:lang attributes do not have the same base language"
- },
- "dlitem": {
- "pass": "Description list item has a <dl> parent element",
- "fail": "Description list item does not have a <dl> parent element"
- },
- "listitem": {
- "pass": "List item has a <ul>, <ol> or role=\"list\" parent element",
- "fail": {
- "default": "List item does not have a <ul>, <ol> parent element",
- "roleNotValid": "List item does not have a <ul>, <ol> parent element without a role, or a role=\"list\""
- }
- },
- "only-dlitems": {
- "pass": "dl element only has direct children that are allowed inside; <dt>, <dd>, or <div> elements",
- "fail": "dl element has direct children that are not allowed: ${data.values}"
- },
- "only-listitems": {
- "pass": "List element only has direct children that are allowed inside <li> elements",
- "fail": "List element has direct children that are not allowed: ${data.values}"
- },
- "structured-dlitems": {
- "pass": "When not empty, element has both <dt> and <dd> elements",
- "fail": "When not empty, element does not have at least one <dt> element followed by at least one <dd> element"
- },
- "caption": {
- "pass": "The multimedia element has a captions track",
- "incomplete": "Check that captions is available for the element"
- },
- "frame-tested": {
- "pass": "The iframe was tested with axe-core",
- "fail": "The iframe could not be tested with axe-core",
- "incomplete": "The iframe still has to be tested with axe-core"
- },
- "no-autoplay-audio": {
- "pass": "<video> or <audio> does not output audio for more than allowed duration or has controls mechanism",
- "fail": "<video> or <audio> outputs audio for more than allowed duration and does not have a controls mechanism",
- "incomplete": "Check that the <video> or <audio> does not output audio for more than allowed duration or provides a controls mechanism"
- },
- "css-orientation-lock": {
- "pass": "Display is operable, and orientation lock does not exist",
- "fail": "CSS Orientation lock is applied, and makes display inoperable",
- "incomplete": "CSS Orientation lock cannot be determined"
- },
- "meta-viewport-large": {
- "pass": "<meta> tag does not prevent significant zooming on mobile devices",
- "fail": "<meta> tag limits zooming on mobile devices"
- },
- "meta-viewport": {
- "pass": "<meta> tag does not disable zooming on mobile devices",
- "fail": "${data} on <meta> tag disables zooming on mobile devices"
- },
- "target-offset": {
- "pass": "Target has sufficient offset from its closest neighbor (${data.closestOffset}px should be at least ${data.minOffset}px)",
- "fail": "Target has insufficient offset from its closest neighbor (${data.closestOffset}px should be at least ${data.minOffset}px)",
- "incomplete": {
- "default": "Element with negative tabindex has insufficient offset from its closest neighbor (${data.closestOffset}px should be at least ${data.minOffset}px). Is this a target?",
- "nonTabbableNeighbor": "Target has insufficient offset from a neighbor with negative tabindex (${data.closestOffset}px should be at least ${data.minOffset}px). Is the neighbor a target?"
- }
- },
- "target-size": {
- "pass": {
- "default": "Control has sufficient size (${data.width}px by ${data.height}px, should be at least ${data.minSize}px by ${data.minSize}px)",
- "obscured": "Control is ignored because it is fully obscured and thus not clickable"
- },
- "fail": {
- "default": "Target has insufficient size (${data.width}px by ${data.height}px, should be at least ${data.minSize}px by ${data.minSize}px)",
- "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)"
- },
- "incomplete": {
- "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?",
- "contentOverflow": "Element size could not be accurately determined due to overflow content",
- "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?",
- "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?"
- }
- },
- "header-present": {
- "pass": "Page has a heading",
- "fail": "Page does not have a heading"
- },
- "heading-order": {
- "pass": "Heading order valid",
- "fail": "Heading order invalid",
- "incomplete": "Unable to determine previous heading"
- },
- "identical-links-same-purpose": {
- "pass": "There are no other links with the same name, that go to a different URL",
- "incomplete": "Check that links have the same purpose, or are intentionally ambiguous."
- },
- "internal-link-present": {
- "pass": "Valid skip link found",
- "fail": "No valid skip link found"
- },
- "landmark": {
- "pass": "Page has a landmark region",
- "fail": "Page does not have a landmark region"
- },
- "meta-refresh-no-exceptions": {
- "pass": "<meta> tag does not immediately refresh the page",
- "fail": "<meta> tag forces timed refresh of page"
- },
- "meta-refresh": {
- "pass": "<meta> tag does not immediately refresh the page",
- "fail": "<meta> tag forces timed refresh of page (less than 20 hours)"
- },
- "p-as-heading": {
- "pass": "<p> elements are not styled as headings",
- "fail": "Heading elements should be used instead of styled <p> elements",
- "incomplete": "Unable to determine if <p> elements are styled as headings"
- },
- "region": {
- "pass": "All page content is contained by landmarks",
- "fail": "Some page content is not contained by landmarks"
- },
- "skip-link": {
- "pass": "Skip link target exists",
- "incomplete": "Skip link target should become visible on activation",
- "fail": "No skip link target"
- },
- "unique-frame-title": {
- "pass": "Element's title attribute is unique",
- "fail": "Element's title attribute is not unique"
- },
- "duplicate-id-active": {
- "pass": "Document has no active elements that share the same id attribute",
- "fail": "Document has active elements with the same id attribute: ${data}"
- },
- "duplicate-id-aria": {
- "pass": "Document has no elements referenced with ARIA or labels that share the same id attribute",
- "fail": "Document has multiple elements referenced with ARIA with the same id attribute: ${data}"
- },
- "duplicate-id": {
- "pass": "Document has no static elements that share the same id attribute",
- "fail": "Document has multiple static elements with the same id attribute: ${data}"
- },
- "aria-label": {
- "pass": "aria-label attribute exists and is not empty",
- "fail": "aria-label attribute does not exist or is empty"
- },
- "aria-labelledby": {
- "pass": "aria-labelledby attribute exists and references elements that are visible to screen readers",
- "fail": "aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty",
- "incomplete": "ensure aria-labelledby references an existing element"
- },
- "avoid-inline-spacing": {
- "pass": "No inline styles with '!important' that affect text spacing has been specified",
- "fail": {
- "singular": "Remove '!important' from inline style ${data.values}, as overriding this is not supported by most browsers",
- "plural": "Remove '!important' from inline styles ${data.values}, as overriding this is not supported by most browsers"
- }
- },
- "button-has-visible-text": {
- "pass": "Element has inner text that is visible to screen readers",
- "fail": "Element does not have inner text that is visible to screen readers",
- "incomplete": "Unable to determine if element has children"
- },
- "doc-has-title": {
- "pass": "Document has a non-empty <title> element",
- "fail": "Document does not have a non-empty <title> element"
- },
- "exists": {
- "pass": "Element does not exist",
- "incomplete": "Element exists"
- },
- "has-alt": {
- "pass": "Element has an alt attribute",
- "fail": "Element does not have an alt attribute"
- },
- "has-visible-text": {
- "pass": "Element has text that is visible to screen readers",
- "fail": "Element does not have text that is visible to screen readers",
- "incomplete": "Unable to determine if element has children"
- },
- "important-letter-spacing": {
- "pass": "Letter-spacing in the style attribute is not set to !important, or meets the minimum",
- "fail": "letter-spacing in the style attribute must not use !important, or be at ${data.minValue}em (current ${data.value}em)"
- },
- "important-line-height": {
- "pass": "line-height in the style attribute is not set to !important, or meets the minimum",
- "fail": "line-height in the style attribute must not use !important, or be at ${data.minValue}em (current ${data.value}em)"
- },
- "important-word-spacing": {
- "pass": "word-spacing in the style attribute is not set to !important, or meets the minimum",
- "fail": "word-spacing in the style attribute must not use !important, or be at ${data.minValue}em (current ${data.value}em)"
- },
- "is-on-screen": {
- "pass": "Element is not visible",
- "fail": "Element is visible"
- },
- "non-empty-alt": {
- "pass": "Element has a non-empty alt attribute",
- "fail": {
- "noAttr": "Element has no alt attribute",
- "emptyAttr": "Element has an empty alt attribute"
- }
- },
- "non-empty-if-present": {
- "pass": {
- "default": "Element does not have a value attribute",
- "has-label": "Element has a non-empty value attribute"
- },
- "fail": "Element has a value attribute and the value attribute is empty"
- },
- "non-empty-placeholder": {
- "pass": "Element has a placeholder attribute",
- "fail": {
- "noAttr": "Element has no placeholder attribute",
- "emptyAttr": "Element has an empty placeholder attribute"
- }
- },
- "non-empty-title": {
- "pass": "Element has a title attribute",
- "fail": {
- "noAttr": "Element has no title attribute",
- "emptyAttr": "Element has an empty title attribute"
- }
- },
- "non-empty-value": {
- "pass": "Element has a non-empty value attribute",
- "fail": {
- "noAttr": "Element has no value attribute",
- "emptyAttr": "Element has an empty value attribute"
- }
- },
- "presentational-role": {
- "pass": "Element's default semantics were overriden with role=\"${data.role}\"",
- "fail": {
- "default": "Element's default semantics were not overridden with role=\"none\" or role=\"presentation\"",
- "globalAria": "Element's role is not presentational because it has a global ARIA attribute",
- "focusable": "Element's role is not presentational because it is focusable",
- "both": "Element's role is not presentational because it has a global ARIA attribute and is focusable",
- "iframe": "Using the \"title\" attribute on an ${data.nodeName} element with a presentational role behaves inconsistently between screen readers"
- }
- },
- "role-none": {
- "pass": "Element's default semantics were overriden with role=\"none\"",
- "fail": "Element's default semantics were not overridden with role=\"none\""
- },
- "role-presentation": {
- "pass": "Element's default semantics were overriden with role=\"presentation\"",
- "fail": "Element's default semantics were not overridden with role=\"presentation\""
- },
- "svg-non-empty-title": {
- "pass": "Element has a child that is a title",
- "fail": {
- "noTitle": "Element has no child that is a title",
- "emptyTitle": "Element child title is empty"
- },
- "incomplete": "Unable to determine element has a child that is a title"
- },
- "caption-faked": {
- "pass": "The first row of a table is not used as a caption",
- "fail": "The first child of the table should be a caption instead of a table cell"
- },
- "html5-scope": {
- "pass": "Scope attribute is only used on table header elements (<th>)",
- "fail": "In HTML 5, scope attributes may only be used on table header elements (<th>)"
- },
- "same-caption-summary": {
- "pass": "Content of summary attribute and <caption> are not duplicated",
- "fail": "Content of summary attribute and <caption> element are identical",
- "incomplete": "Unable to determine if <table> element has a caption"
- },
- "scope-value": {
- "pass": "Scope attribute is used correctly",
- "fail": "The value of the scope attribute may only be 'row' or 'col'"
- },
- "td-has-header": {
- "pass": "All non-empty data cells have table headers",
- "fail": "Some non-empty data cells do not have table headers"
- },
- "td-headers-attr": {
- "pass": "The headers attribute is exclusively used to refer to other cells in the table",
- "incomplete": "The headers attribute is empty",
- "fail": "The headers attribute is not exclusively used to refer to other cells in the table"
- },
- "th-has-data-cells": {
- "pass": "All table header cells refer to data cells",
- "fail": "Not all table header cells refer to data cells",
- "incomplete": "Table data cells are missing or empty"
- },
- "hidden-content": {
- "pass": "All content on the page has been analyzed.",
- "fail": "There were problems analyzing the content on this page.",
- "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."
- }
- },
- "failureSummaries": {
- "any": {
- "failureMessage": "Fix any of the following:{{~it:value}}\n {{=value.split('\\n').join('\\n ')}}{{~}}"
- },
- "none": {
- "failureMessage": "Fix all of the following:{{~it:value}}\n {{=value.split('\\n').join('\\n ')}}{{~}}"
- }
- },
- "incompleteFallbackMessage": "axe couldn't tell the reason. Time to break out the element inspector!"
- }
|