Custom Rules & Heuristics
A11yEngine pairs standard `axe-core` compliance checks with **10 proprietary local heuristic rules** to audit user interaction patterns, focus safety, and secure PII compliance.
Invisible Keyboard Focus Indicator
Flags elements that override the browser's default focus indicator (using outline:none, outline:0, or focus:outline-none) without declaring a visible fallback ring. Sighted keyboard navigators lose track of their position on the page.
<button class="bg-[#111111] text-white focus:outline-none">
Complete Purchase
</button><button class="bg-[#111111] text-white focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2">
Complete Purchase
</button>Hardcoded Positive Tabindex
Detects element declarations with positive tabindex attributes (tabindex > 0). Hardcoding positive tabindex values disrupts the natural top-down sequential reading and tabbing flow. Keep values to 0 or -1.
<a href="/pricing" tabindex="3">Pricing</a>
<a href="/checkout" tabindex="1">Checkout</a><a href="/pricing">Pricing</a>
<a href="/checkout">Checkout</a>Unreachable Clickable Custom Control
Catches non-interactive elements (like <div> or <span>) that have click listeners or role="button"/"link" attributes but lack a tabindex attribute, rendering them completely unreachable via keyboard navigation.
<div onclick="submitOrder()" role="button">
Buy Now
</div><div onclick="submitOrder()" role="button" tabindex="0" onkeydown="if(event.key==='Enter'||event.key===' '){event.preventDefault();submitOrder();}">
Buy Now
</div>Icon-Only Control Lacks Description
Flags links and buttons containing only SVG, icons, or vector glyphs with no textual label or aria-label attributes. Screen reader users will only hear "button" or "link" without context.
<button>
<svg class="w-4 h-4" fill="none" ...></svg>
</button><button aria-label="Delete item permanently">
<svg class="w-4 h-4" fill="none" ...></svg>
</button>Visible Label Mismatch in ARIA Name
Identifies custom controls where the visible text string is not included inside the aria-label attribute. Speech-to-text (voice control) software users who attempt to vocalize the button name will fail to activate it.
<button aria-label="Submit credit details to bank">
Pay Now
</button><button aria-label="Pay Now and submit credit details">
Pay Now
</button>Autoplay Sound / Video Block
Flags audio or video elements configured to autoplay sound. Autoplay audio overrides screen reader voices, making it impossible for blind users to navigate the screen to locate the pause button.
<video src="/assets/intro.mp4" autoplay></video><video src="/assets/intro.mp4" controls></video>Video Component Lacks Subtitles/Captions
Flags video player elements that do not contain a child <track kind="captions"> or <track kind="subtitles"> node, restricting access for deaf or hard-of-hearing audiences.
<video controls src="/assets/intro.mp4">
</video><video controls src="/assets/intro.mp4">
<track default kind="captions" srclang="en" src="/captions_en.vtt" label="English Captions">
</video>Vague Descriptive Link Labels
Flags links labeled with generic terms like "click here", "read more", or "learn more". Visually impaired users browsing a list of isolated page links cannot identify where they lead.
<a href="/docs/api">Click Here</a> to view docs.<a href="/docs/api">View the API Documentation</a>.Missing "Skip to Main Content" Bypass
Flags pages with navigation headers or sidebars that lack a hidden skip bypass link as the first focusable child, forcing keyboard users to tab through all menus on every page load.
<body>
<nav><!-- Lots of links --></nav>
<main id="main-content"><body>
<a href="#main-content" class="sr-only focus:not-sr-only focus:absolute focus:top-4 focus:left-4 bg-indigo-600 text-white p-2">Skip to Main Content</a>
<nav><!-- Lots of links --></nav>
<main id="main-content">PII Scrubbing Validation Filter
Checks and sanitizes raw DOM strings inside the content sandbox before passing elements to AI systems, automatically redacting credentials, cards, CVVs, and email fields.
<input type="password" name="user_password" value="secret123" /><input type="password" name="user_password" value="[REDACTED_PII]" />