a11y:img-alt | Images have alt text |
a11y:img-button-alt | Image buttons (input[type=image]) have alt |
a11y:img-alt-redundant | No redundant "image/photo" words in alt |
a11y:button-name | Buttons have accessible names |
a11y:link-name | Links have accessible names |
a11y:link-distinct | Identical link text → identical destination |
a11y:link-empty-broken | Links are not empty/broken |
a11y:link-text-descriptive | Descriptive link text (not "click here") |
a11y:form-label | Form controls have associated labels |
a11y:form-label-single | Exactly one label per field |
a11y:input-name | All inputs have accessible names |
a11y:select-name | Selects have accessible names |
a11y:toggle-name | Toggle fields (checkbox/radio/switch) named |
a11y:aria-valid | ARIA attribute names are valid |
a11y:aria-valid-value | ARIA attribute values are valid tokens |
a11y:aria-deprecated-role | No abstract/deprecated ARIA roles |
a11y:aria-role-valid | ARIA role values are valid |
a11y:landmark-unique | Landmarks are unique |
a11y:landmark-main | Exactly one <main> landmark |
a11y:landmark-nav | Multiple <nav> have distinct labels |
a11y:landmark-regions | Landmark regions used correctly |
headings:single-h1 | Exactly one h1 |
headings:order | Logical heading order (no skipped levels) |
headings:non-empty | Headings contain text |
html:lang | <html lang> present (BCP 47) |
html:dir-rtl | RTL languages set dir="rtl" |
html:lang-xml-match | lang matches xml:lang |
a11y:skip-link | Skip-to-content link present |
a11y:iframe-title | iframes/frames have titles |
a11y:table-headers | Data tables have <th> headers |
a11y:table-header-scope | Headers scoped to cells |
a11y:table-cell-headers | Cells linked to headers via ids |
a11y:table-unique-name | Tables have unique accessible names |
a11y:table-semantic | Semantic table markup (caption/role) |
a11y:video-captions | <video> has <track kind="captions"> |
a11y:video-audio-desc | <video> has <track kind="descriptions"> |
a11y:autofocus-absent | No autofocus on fields |
a11y:aria-hidden-body-absent | No aria-hidden on <body> |
a11y:focusable-in-aria-hidden-absent | No focusable child in aria-hidden |
a11y:list-structure | <li> inside ul/ol/menu |
a11y:list-correct | ul/ol contain only <li> |
a11y:list-semantic | Semantic list elements used |
a11y:dl-structure | Valid <dl> (only dt/dd) |
a11y:dl-wrap | dt/dd wrapped in <dl> |
a11y:decorative-hidden | Decorative elements hidden from AT |
a11y:object-alt | <object> has alternative content |
a11y:meta-refresh-absent | No meta refresh redirect |
a11y:accesskey-unique | Unique accesskey values |
a11y:unique-id | Unique element ids |
a11y:aria-ref-unique | ARIA-referenced ids unique/exist |
a11y:tabindex-appropriate | No positive tabindex |
a11y:role-text-no-focusable | role="text" has no focusable child |
a11y:dialog-name | Dialogs have accessible names |
a11y:meter-name | Meter elements named |
a11y:progress-name | Progress bars named |
a11y:tooltip-name | Tooltips named |
a11y:treeitem-name | Tree items named |
a11y:command-name | ARIA command elements named |
a11y:interactive-name | Role-based interactive els named |
a11y:autoplay-media | No autoplaying media |
a11y:paste-allowed | Pasting allowed in inputs |
a11y:autocomplete-auth | Auth inputs support autocomplete |
a11y:links-in-text-distinguishable | Links distinct beyond color (CSS) |
a11y:reduced-motion | Respects prefers-reduced-motion (CSS) |
a11y:instant-anchor-scroll | Instant anchor-scroll option (CSS) |