-
Notifications
You must be signed in to change notification settings - Fork 0
a11y
github-actions[bot] edited this page Sep 6, 2026
·
1 revision
The a11y category contains static analysis rules for code quality, architectural constraints, and design system governance.
| Rule ID | Severity | Summary | Full Specification | Status |
|---|---|---|---|---|
a11y.button-type-missing |
WARN |
Enforces explicit type attribute on elements inside forms to prevent unintended form submission | a11y.button-type-missing |
enabled |
a11y.dialog-missing-aria |
ERROR |
Enforces that custom modal dialogs declare aria-modal="true" and have an accessible name | a11y.dialog-missing-aria |
enabled |
a11y.empty-interactive |
ERROR |
Enforces accessible names on interactive elements (buttons, links) containing only icons or visual elements | a11y.empty-interactive |
enabled |
a11y.error-not-announced |
ERROR |
Ensures form controls with aria-invalid are programmatically linked to error messages via aria-describedby (WCAG 3.3.1) | a11y.error-not-announced |
enabled |
a11y.form-input-missing-name |
WARN |
Ensures form input controls declare an identifying name or id attribute for form submission and autofill (WCAG 4.1.2) | a11y.form-input-missing-name |
enabled |
a11y.form-label-composite-control |
WARN |
Warns when is directly bound to a composite multi-field control causing screen reader ambiguity | a11y.form-label-composite-control |
enabled |
a11y.form-label-missing-control |
ERROR |
Enforces that Shadcn UI containing also contains an associated or input element | a11y.form-label-missing-control |
enabled |
a11y.img-missing-alt |
ERROR |
Enforces required 'alt' attribute on Astro |
a11y.img-missing-alt |
enabled |
a11y.input-cramped-padding |
WARN |
Flags input controls with cramped vertical padding or height under 42px that clip text and impede touch targeting | a11y.input-cramped-padding |
enabled |
a11y.input-ios-zoom-hazard |
WARN |
Prevents forced Safari iOS viewport auto-zoom by requiring at least 16px font size on inputs on mobile viewports | a11y.input-ios-zoom-hazard |
enabled |
a11y.keyboard-trap-missing-escape |
ERROR |
Enforces that custom modal dialogs provide an Escape key listener or an accessible dismiss mechanism | a11y.keyboard-trap-missing-escape |
enabled |
a11y.label-missing-control |
ERROR |
Ensures label htmlFor attributes match an existing input control ID in the same document (WCAG 1.3.1) | a11y.label-missing-control |
enabled |
a11y.missing-focus-ring |
WARN |
Enforces visible focus indicator when suppressing default outline with outline-none (WCAG 2.4.7) | a11y.missing-focus-ring |
enabled |
a11y.placeholder-as-label |
ERROR |
Flags form inputs relying solely on placeholder attributes without a persistent label or accessible name (WCAG 3.3.2) | a11y.placeholder-as-label |
enabled |
a11y.touch-target-size |
WARN |
Enforces minimum 44x44px physical touch target size on interactive controls (Apple HIG / WCAG 2.5.8) | a11y.touch-target-size |
enabled |
a11y.touch-target-spacing |
WARN |
Enforces at least 8px spacing between adjacent interactive elements to prevent miss-taps (WCAG 2.5.8) | a11y.touch-target-spacing |
enabled |
The a11y static analysis engine evaluates template markup and cross-references resolved design tokens for WCAG 2.2 accessibility compliance:
flowchart LR
subgraph Inputs ["1. Workspace Inputs"]
Components["Component Markup (*.astro, *.tsx)"]
TokenCtx["Token Context Facade (internal/token)"]
end
subgraph ASTInspection ["2. Semantic AST Traversal"]
Components --> Visitor["AST Visitor Engine"]
Visitor --> Interactive["Interactive Elements (button, a, input)"]
Visitor --> Media["Media & Landmark Elements (img, svg, nav)"]
end
subgraph Verification ["3. A11y & Contrast Evaluation"]
Interactive --> ARIA["ARIA Attributes & Role Invariants"]
Interactive --> Focus["Keyboard & Focus Traps"]
Media --> AltText["Alt-Text & Accessible Names"]
Interactive --> Colors["Color Class Extractor"]
TokenCtx -.-> Colors
Colors --> Contrast["WCAG 2.2 Contrast Ratio (>= 4.5:1 / 3:1)"]
end
subgraph Output ["4. Results"]
ARIA --> Results{"WCAG Conformance Check"}
Focus --> Results
AltText --> Results
Contrast --> Results
Results -- "Compliant" --> Safe["Pass"]
Results -- "Violation" --> Diag["Diagnostic: a11y.*"]
end
- Semantic DOM Traversal: Inspects interactive elements, form controls, images, and landmark regions.
-
Token-Aware Contrast Calculation: Resolves foreground and background color classes into concrete color values using
token.Context, computing relative luminance ratios without requiring a headless browser. - Standards Conformance: Enforces WCAG 2.2 AA standards (minimum 4.5:1 for normal text, 3:1 for large text and UI controls).
-
Accessible Structure Validation: Validates image
altattributes, accessible button names, and form label associations.
Accessibility rules are verified against comprehensive test suites:
-
1-SSOT Golden Tri-Corpus (
tests/correctness/a11y.*/):- Positive: Flags contrast ratios dropping below 4.5:1 under light or dark themes, missing alt text, and unlabelled icon buttons.
- Negative: Confirms clean passes for semantic HTML5 controls and mathematically verified token pairings.
- Adversarial: Asserts resilience against dynamic aria-labels, visually hidden decorative elements, and complex nested layouts.
A11y (16 rules)
- A11y Overview
a11y.button-type-missinga11y.dialog-missing-ariaa11y.empty-interactivea11y.error-not-announceda11y.form-input-missing-namea11y.form-label-composite-controla11y.form-label-missing-controla11y.img-missing-alta11y.input-cramped-paddinga11y.input-ios-zoom-hazarda11y.keyboard-trap-missing-escapea11y.label-missing-controla11y.missing-focus-ringa11y.placeholder-as-labela11y.touch-target-sizea11y.touch-target-spacing
Browser (12 rules)
- Browser Overview
browser.appearance-native-overridebrowser.chrome-only-apibrowser.date-input-format-assumptionbrowser.experimental-api-no-featuredetectbrowser.firefox-only-apibrowser.hover-only-interactionbrowser.non-passive-scroll-listenerbrowser.obsolete-vendor-prefixbrowser.safari-only-apibrowser.scrollbar-vendor-incompletebrowser.user-agent-sniffingbrowser.webkit-only-api
Cls (16 rules)
- Cls Overview
cls.client-only-hydration-popcls.collapsible-height-jumpcls.dynamic-content-without-reserved-spacecls.dynamic-table-reflowcls.font-display-missingcls.font-import-late-discoverycls.layout-trigger-animationcls.layout-trigger-transitioncls.text-icon-late-reflowcls.unadjusted-font-metriccls.unconstrained-carouselcls.unreserved-ad-containercls.unreserved-fixed-headercls.unsized-embed-framecls.unsized-imagecls.unstable-scrollbar-gutter
Design (1 rules)
Ergonomy (5 rules)
Inp (16 rules)
- Inp Overview
inp.context-re-render-cascadeinp.expensive-render-computationinp.expensive-style-mutationinp.heavy-event-handlerinp.hydration-contentioninp.hydration-heavy-islandinp.large-interaction-layout-scopeinp.layout-thrashinginp.missing-start-transitioninp.missing-touch-actioninp.render-blocking-scriptinp.repeated-state-updateinp.sync-layout-effectinp.unbounded-collection-renderinp.unbounded-effect-depsinp.unyielded-long-task
Lcp (16 rules)
- Lcp Overview
lcp.blocked-critical-fontlcp.client-only-lcp-contentlcp.critical-head-style-bloatlcp.external-font-discovery-delaylcp.heavy-raster-lcp-assetlcp.image-source-density-mismatchlcp.lazy-loaded-lcp-imagelcp.lcp-content-visibility-suppressionlcp.legacy-critical-font-resourcelcp.missing-critical-origin-hintlcp.missing-lcp-image-preloadlcp.oversized-lcp-resource-selectionlcp.preload-font-cors-mismatchlcp.render-blocking-head-scriptlcp.undiscoverable-lcp-imagelcp.unhinted-lcp-image-priority
Mobile (5 rules)
Performance (16 rules)
- Performance Overview
performance.astro-island-boundary-overlapperformance.astro-over-prefetchingperformance.astro-unnecessary-client-directiveperformance.astro-unoptimized-local-imageperformance.react-context-domain-couplingperformance.react-derived-state-in-effectperformance.react-effect-missing-cleanupperformance.react-index-as-keyperformance.react-inline-prop-memoperformance.react-redundant-function-memoizationperformance.react-static-heavy-importperformance.react-unstable-hook-referenceperformance.tailwind-duplicate-arbitrary-rulesperformance.tailwind-duplicate-utility-definitionperformance.tailwind-dynamic-class-concatenationperformance.tailwind-untracked-package-source
Pwa (10 rules)
- Pwa Overview
pwa.apple-meta-missingpwa.icon-maskable-missingpwa.insecure-context-resourcepwa.manifest-missingpwa.manifest-required-fields-missingpwa.pwa-cache-runtime-api-riskpwa.service-worker-missingpwa.service-worker-no-offline-fallbackpwa.service-worker-registrationpwa.start-url-inconsistency
Responsive (18 rules)
- Responsive Overview
responsive.aspect-ratio-overflowresponsive.container-overconstraintresponsive.desktop-only-contentresponsive.dynamic-viewport-inconsistencyresponsive.fixed-width-overflowresponsive.flex-child-overflowresponsive.fractional-width-gap-driftresponsive.grid-min-columnresponsive.horizontal-overflowresponsive.image-overflowresponsive.keyboard-obstructionresponsive.missing-breakpointresponsive.mobile-density-overloadresponsive.mobile-text-overflowresponsive.safe-area-missingresponsive.unwrapped-table-overflowresponsive.viewport-meta-missingresponsive.viewport-unit-leak
Semantic (1 rules)
Theme (32 rules)
- Theme Overview
theme.apply-bloattheme.backdrop-blur-hardcodetheme.chart-color-hardcodetheme.dual-strategy-collisiontheme.dynamic-classtheme.focus-ring-hardcodetheme.gradient-hardcodetheme.hardcode-border-colortheme.hardcode-border-radiustheme.hardcode-colortheme.hardcode-monochrometheme.hardcode-opacity-colortheme.hardcode-shadow-colortheme.hardcode-sizetheme.hardcode-z-indextheme.hydration-theme-mismatchtheme.image-theme-hardcodetheme.important-overridetheme.inline-style-hardcodetheme.meta-theme-color-mismatchtheme.missing-color-schemetheme.missing-token-fallbacktheme.nested-opacity-contrasttheme.no-reduced-motiontheme.primitive-in-componenttheme.pseudo-hardcode-colortheme.shadow-without-border-darktheme.split-theme-statetheme.svg-hardcode-filltheme.token-source-drifttheme.unlayered-token-definitiontheme.unpaired-dark-variant
Ux (20 rules)
- Ux Overview
ux.camouflaged-linkux.competing-primary-ctaux.destructive-action-unconfirmedux.disabled-control-no-explanationux.empty-collection-unhandledux.missing-autofillux.monolithic-form-bloatux.multiline-input-misuseux.nav-overflow-chunkingux.number-input-identity-misuseux.number-input-missing-boundsux.orphaned-error-stateux.radio-overchoiceux.silent-catch-swallowux.spacing-inversionux.spacing-rhythm-driftux.submit-feedback-missingux.unbounded-async-flagux.unconventional-home-linkux.unthrottled-input-handler