WICK-AG-Lens is a professional visual accessibility inspector for Web Developers and QA. It operates as a Chrome browser extension that generates visual overlays on elements to indicate accessibility violations, maps structural information, and provides a rigorous engine to simulate visual impairments directly within your page layout. Designed for modern web applications, it features a real-time sync engine that automatically re-audits the page when new elements are injected or made visible, seamlessly handling Single Page Application (SPA) routing and navigation without requiring a manual refresh. Also includes a simulation Mode and a PDF Gatekeeper Auditing engine.
You can install WICK-AG-Lens from the Chrome Web Store: Install Here.
WICK-AG-Lens is built for developers and QA engineers. It runs static analysis against the DOM and computed CSS styles to highlight accessibility patterns, while also offering dynamic rendering filters to simulate specific user conditions and a binary scanner for PDF documents.
Installing WICK-AG-Lens takes just a few clicks from the official Chrome Web Store.
F12 or Ctrl+Shift+I on Windows/Linux, Cmd+Option+I on Mac).>> icon if your DevTools window is narrow.The inspector categorizes 55 heuristic rulesets across two primary tabs: Violations & Warnings (actionable failures) and Informative & Structure (valid page architecture and semantic patterns).
[ i ] icon next to any audit expands an inline panel detailing exactly What it highlights, Why it’s important, and How to fix it, complete with links directly to the official W3C WCAG documentation.
Switch from the standard “Inspect Mode” into “Simulate Mode” using the top header toggle to visually alter the host page, allowing developers to experience structural boundaries and contrast failures firsthand.
feColorMatrix transformations to emulate Achromatopsia, Protanopia, Deuteranopia, and Tritanopia.Color Blindness:

Impaired Vision:

Analyze raw PDF binary streams directly in the browser. Since Chrome’s native PDF viewer is securely isolated and cannot be visually overlaid, this mode programmatically inspects the Document Catalog and Metadata dictionaries via an ArrayBuffer stream.
/MarkInfo << /Marked true >>), Scope Guidance, and specific Remediation steps across Adobe Acrobat, Microsoft Word, and InDesign.Copy Tab Report (📋) button allows you to instantly export all 4 PDF gatekeeper checks, their statuses, technical outputs, and software-specific remediation instructions directly to your clipboard.PDF Gatekeeper Auditing:

Impaired Vision:

Clicking on any highlighted badge directly on the page summons a detailed DevTools-style toast notification. This panel provides immediate context for the audit, explaining what was flagged, why it creates a barrier for users, and how to fix it (utilizing clean, collapsible native HTML accordions to keep the UI compact and prevent screen clutter).
Crucially, the panel extracts a clean, extension-sanitized HTML Snippet of the target element, styled with VS Code dark-theme syntax highlighting, alongside the precise CSS Selector. Dedicated “Copy” buttons (📋) allow you to instantly grab the code or selector for bug reports without opening the native Elements panel.

For audits that return multiple findings, clicking the “View Elements” (list icon) button inside the DevTools panel opens a comprehensive details modal displaying a hierarchically sorted list of every flagged element.
Copy All button allows you to copy the exact list of isolated elements, their labels, and their CSS selectors directly to your clipboard.
To streamline QA ticketing, WICK-AG-Lens features a global clipboard export function. Clicking the clipboard icon (📋) at the top of either the Violations or Informative tabs generates a fully formatted text report of your current analysis.
(No matching elements found) for active audits that currently pass.
WICK-AG-Lens features a Dual-Debounce MutationObserver to handle modern Single Page Applications (React, Vue, Angular) and dynamic content seamlessly.
display: none or aria-hidden on modals and dropdowns). Once the DOM settles, it silently runs a background rescan to attach new highlights and update holistic contexts without flashing the screen.
When elements are pushed off-screen or hidden inside overflow: hidden containers (like carousel slides or scrollable panels), the extension detects their clipping bounds. Instead of ignoring them or drawing misleading boxes, WICK-AG-Lens renders these hidden elements using a specialized “X-Ray” ghosted hatched pattern. This allows auditors to visualize the exact footprint of hidden interactive elements and invisible focus traps without breaking the page layout.

Accessibility auditing shouldn’t require constantly hunting for internet resources. WICK-AG-Lens includes a fully embedded, offline-ready reference guide. Clicking the book icon in the extension header opens a comprehensive modal detailing every single rule, its WCAG mapping, technical limitations, and precise heuristic logic, ensuring your QA team always has context at their fingertips.

The extension’s DevTools panel fully respects your system and browser theme preferences, automatically switching between light and dark modes. It utilizes strictly WCAG 2.2 AAA compliant color contrast variables across both themes, ensuring that the auditing tool itself is accessible and easy on the eyes during long debugging sessions.
The following details the complete list of heuristic evaluations performed by the inspector, their classification, standard outputs, and the corresponding W3C WCAG guidelines.
| Audit | Classification | Badge Output | WCAG Criteria | Logic |
|---|---|---|---|---|
| Document Title | Critical | "Missing Document Title" |
2.4.2 (A) | View |
| Page Encoding | Moderate | Encoding: {val} |
1.3.1 (A) | View |
| Auto-playing Media | Serious | "Autoplay Media" |
1.4.2 (A) | View |
| Heading Hierarchy Errors | Moderate | "{TAG} (Skipped)" or "Fake Heading" |
1.3.1 (A) | View |
<title> tag or if it is empty. Screen readers announce the page title first.autoplay. Unexpected audio conflicts with screen reader announcements.H1 to H3) or fake non-semantic headings. Note: Starting a page directly with an H2 is not flagged as a skipped level. Skipping levels confuses screen reader navigation.| Audit | Classification | Badge Output | WCAG Criteria | Logic |
|---|---|---|---|---|
| Inaccessible SVGs | Critical | "Inaccessible SVG" |
1.1.1 (A) | View |
| Missing Alt Text | Critical | "Missing alt" or "Tracking Pixel" |
1.1.1 (A) | View |
| Uncaptioned Video | Critical | "<video> (No Captions)" |
1.2.2 (A) | View |
| Redundant Alt Text | Minor | Redundant alt: "{text}" |
1.1.1 (A) | View |
<svg> elements exposed to screen readers lacking an accessible name. Screen readers will read out raw SVG code nodes.<img> elements completely lacking an alt attribute. Explicitly segregates 1x1 tracking pixels. Screen readers will read the raw image filename or URL if the attribute is missing, which is highly disruptive for hidden tracking pixels.<video> elements missing nested <track> elements. Deaf or hard of hearing users require captions for video content.alt attributes containing words like ‘image of’ or ‘photo of’. Screen readers automatically announce images, making these prefixes redundant.| Audit | Classification | Badge Output | WCAG Criteria | Logic |
|---|---|---|---|---|
| Empty Links | Critical | "Empty Link" |
2.4.4 (A) | View |
| Suspicious Link Targets | Critical / Serious | "Fake Button (JS)" or "Fake Button (#)" |
4.1.2 (A) | View |
| Generic Link Text | Moderate | Generic link: "{text}" |
2.4.4 (A) | View |
| Unwarned New Window Links | Moderate | 'target="_blank" (No Warning)' |
3.2.5 (AAA) | View |
<a> tags lacking readable text or accessible names. Screen readers will read the URL, which is often confusing.role='button'). Using links to trigger JS actions confuses screen readers.target='_blank' links without text or ARIA warnings. Unexpectedly opening new tabs disorients cognitive and screen reader users.| Audit | Classification | Badge Output | WCAG Criteria | Logic |
|---|---|---|---|---|
| Unlabeled Form Inputs | Critical | "Unlabeled Input" |
3.3.2 (A) | View |
| Empty Buttons | Critical | "Empty Button" |
4.1.2 (A) | View |
| Placeholder as Label | Serious | "Placeholder as Label" |
4.1.2 (A) | View |
| Invalid Autocomplete | Moderate | Invalid autocomplete="{val}" |
1.3.5 (AA) | View |
<label> wrappers, aria-labels, or for attributes. Screen readers cannot announce what the input is for.aria-label. Screen readers will only announce ‘Button’, providing no context.placeholder attribute. Placeholders disappear on typing and often lack sufficient contrast.autocomplete contains unrecognized HTML5 tokens. Invalid tokens prevent browsers and password managers from functioning correctly.| Audit | Classification | Badge Output | WCAG Criteria | Logic |
|---|---|---|---|---|
| Unfocusable Clickables | Critical | "Unfocusable Clickable" |
2.1.1 (A) | View |
| Tabindex Violations | Serious | tabindex="{val}" |
2.4.3 (A) | View |
| Accesskey Attributes | Moderate | accesskey="{val}" |
2.1.4 (A) | View |
| Disabled Focus Outlines (Heuristic) | Manual | "Manual Check: Focus Ring" |
2.4.7 (AA) | View |
onclick handlers lacking a tabindex and a valid semantic role. Keyboard users cannot tab to or activate these elements.tabindex > 0. Overrides natural DOM focus order, creating unpredictable navigation paths.accesskey definitions. Often conflicts with native browser or screen reader shortcuts.outline: none or 0 is applied on the :focus state. Because this is a static CSS check, it cannot account for complex CSS cascade overrides and marks findings for manual review. Sighted keyboard users rely entirely on focus rings.| Audit | Classification | Badge Output | WCAG Criteria | Logic |
|---|---|---|---|---|
| Prohibited Author Names | Serious | Prohibited name on role="{role}" |
4.1.2 (A) | View |
| Label in Name Mismatch | Serious | "Mismatch: "{txt}" != "{aria}"" |
2.5.3 (A) | View |
| Duplicate ID Attributes | Critical | Duplicate ID: "{id}" ({v} vis, {h} hid) or [Hidden] |
1.3.1 (A) | View |
| Broken ARIA References | Critical | Broken Ref: {attr}="{id}" |
1.3.1 (A) | View |
presentation) containing aria-label or aria-labelledby. Adding a name to a transparent structural role breaks its semantics.aria-label that does not include the visible text. Voice dictation users rely on visible text commands.id attribute. Screen readers and label mappings will only find the first ID.| Audit | Classification | Badge Output | WCAG Criteria | Logic |
|---|---|---|---|---|
| Focusable in Aria-Hidden | Critical | "aria-hidden (Focusable)" |
4.1.2 (A) | View |
| Invalid ARIA State | Serious | 'aria-invalid="true"' |
3.3.1 (A) | View |
aria-hidden='true' trees. Keyboard users can reach them, but screen readers cannot, creating a severe mismatch.aria-invalid='true'. Identifies application-enforced validation errors.| Audit | Classification | Badge Output | WCAG Criteria | Logic |
|---|---|---|---|---|
| Text Color Contrast | Critical | AA Fail, AAA Fail, Manual Check |
1.4.3 (AA), 1.4.6 (AAA) | View |
font-size and font-weight against WCAG large-text thresholds. Elements over images/gradients are flagged for manual review.| Audit | Classification | Badge Output | WCAG Criteria | Logic |
|---|---|---|---|---|
| Valid Heading Order | Informative | <{tag}> |
1.3.1 (A) | View |
| Landmark Regions | Informative | <{role or tag}> |
2.4.1 (A) | View |
| Table & Grid Structure | Informative | <{tag}> or role="{role}" |
1.3.1 (A) | View |
| Lists and List Items | Informative | <{tag}> |
1.3.1 (A) | View |
| Language Definitions | Informative | "Missing Root Lang", Root lang="{val}", or lang="{val}" |
3.1.1 (A) | View |
H1-H6 structural outline. Verifies the logical outline of the page.<table> and ARIA data grids. Visually maps data structures and verifies custom UI grids implement semantic headers.<ul>), ordered (<ol>), and definition lists (<dl>). Ensures related items are programmatically grouped.lang declarations. Screen readers rely on the language tag to load the correct accent and pronunciation rules.| Audit | Classification | Badge Output | WCAG Criteria | Logic |
|---|---|---|---|---|
| Display Image Alternatives | Informative | alt="{val}", alt="", "Missing alt", or "[Pixel] ..." |
1.1.1 (A) | View |
| Captioned Video | Informative | "<video> (Captioned)" |
1.2.2 (A) | View |
| Iframe Context & Titles | Informative | title="{title}", "Hidden Iframe" |
4.1.2 (A) | View |
alt text directly over all <img> elements, explicitly segregating 1x1 tracking pixels. Allows rapid visual auditing of alternative text descriptions.<track> elements. Confirms proper multimedia accessibility setup.title attributes. Screen readers announce the title to inform the user what the sub-document contains.| Audit | Classification | Badge Output | WCAG Criteria | Logic |
|---|---|---|---|---|
| Warned New Window Links | Informative | 'target="_blank" (Warned)' |
3.2.5 (AAA) | View |
target='_blank' links with proper warning. Confirms proper communication of context shifts to assistive technologies.| Audit | Classification | Badge Output | WCAG Criteria | Logic |
|---|---|---|---|---|
| Fieldsets & Captions | Informative | <{tag}> |
1.3.1 (A) | View |
| Touch Target Sizes | Informative | {width}x{height}px |
2.5.8 (AA) | View |
| Read-Only Fields | Informative | "readonly" |
1.3.1 (A) | View |
<fieldset>). Crucial for grouping related radio buttons or complex form sections.width / height). Undersized targets prevent users with fine motor impairments from activating controls accurately.readonly or aria-readonly. Read-only fields must remain focusable (unlike disabled fields) so screen readers can access their content.| Audit | Classification | Badge Output | WCAG Criteria | Logic |
|---|---|---|---|---|
| Tabindex (Comparison) | Informative | tabindex="{val}" |
2.4.3 (A) | View |
| Display Focus Order | Informative | #{num}: <{tag}> |
2.4.3 (A) | View |
tabindex usages. Provides a sweeping visual map of the programmatic focus strategy.[Iframe] #4.1) for isolated DOM boundaries, connected by dynamic SVG paths and numerical pills. Simulates the exact path of the TAB key route.| Audit | Classification | Badge Output | WCAG Criteria | Logic |
|---|---|---|---|---|
| ARIA Roles & Attributes | Informative | role="{val}" |
4.1.2 (A) | View |
| Aria-Roledescription | Informative | roledescription="{val}" |
4.1.2 (A) | View |
role definitions. Allows rapid structural auditing of custom widget semantics.aria-roledescription. Overrides the native role announcement (e.g., turning ‘button’ into ‘slide’).| Audit | Classification | Badge Output | WCAG Criteria | Logic |
|---|---|---|---|---|
| Accessible Name Resolution | Informative | "[id] {name}", "[aria] {name}", "[text] {name}", or "Missing Name" |
4.1.2 (A) | View |
| Form Field Descriptions | Informative | "aria-describedby" or "title" |
3.3.2 (A) | View |
| Aria-Details | Informative | "aria-details" |
4.1.2 (A) | View |
| Aria-Controls | Informative | "aria-controls" |
4.1.2 (A) | View |
| Aria-Owns | Informative | "aria-owns" |
4.1.2 (A) | View |
| List Set & Position | Informative | "Item X of Y" |
1.3.1 (A) | View |
aria-labelledby, then aria-label, then native associated labels/text, and finally title. Reveals exactly what a screen reader will announce.aria-describedby). Ensures extended hints or error messages are programmatically tied to inputs.aria-details. Links complex, rich explanations to an element (allows structured HTML in the description).aria-controls). Links trigger mechanisms to their targets.aria-owns). Reconstructs accessibility tree hierarchy for disjointed widgets.aria-setsize, aria-posinset). Tells screen readers the total size of a list and the element’s position, even if all items aren’t in the DOM.| Audit | Classification | Badge Output | WCAG Criteria | Logic |
|---|---|---|---|---|
| ARIA Live Regions | Informative | aria-live="{val}" |
4.1.3 (AA) | View |
| Required Fields | Informative | "required" or 'aria-required="true"' |
3.3.1 (A) | View |
| Aria-Expanded State | Informative | aria-expanded="{val}" |
4.1.2 (A) | View |
| Aria-Pressed State | Informative | aria-pressed="{val}" |
4.1.2 (A) | View |
| Aria-Value Properties | Informative | value="{val}" |
4.1.2 (A) | View |
| Aria-Haspopup | Informative | haspopup="{val}" |
4.1.2 (A) | View |
aria-live injection containers. Ensures dynamic content updates are announced to screen readers.required / aria-required). Ensures required status is programmatically available.aria-expanded). Visualizes the current programmatic state of accordions and menus.aria-pressed). Visualizes the programmatic state of toggle buttons (e.g., Mute/Unmute, Play/Pause).valuenow, valuetext). Ensures visual slider values match their programmatic data.aria-haspopup). Prepares users for a context shift by announcing an interactive overlay.Elements hidden via CSS parameters like display: none or visibility: hidden, or by using the HTML inert attribute, are excluded by the global DOM processing logic before the specific audits run.
DOM Traversal: The extension utilizes a custom deep querySelectorAll function combined with bottom-up ancestor mapping. This allows the scanner to properly pierce standard (open) Shadow DOM boundaries and fully traverse the internal DOM of same-origin iframes, guaranteeing accurate visibility tracking across complex widget architectures.
Self-Auditing Guard: The injected extension UI elements (like the overlay boxes and the information toast panels) are specifically excluded from audits to prevent false positives.
html. The logic checks if document.title is missing or entirely empty strings.html. The logic evaluates document.characterSet to ensure it is defined and set to UTF-8.audio[autoplay], video[autoplay]. Elements matching the selector are flagged.h1, h2, h3, h4, h5, h6, [role='heading'], [class*='heading'], [class*='title']. The logic tracks the integer level of headings, intentionally ignoring missing H1s at the start of the document. It flags an element if the current heading level skips sequentially past the previous tracked level. It also flags generic elements without a role attribute if the text length is under 80 characters, utilizing a heuristic wrapper safeguard to actively ignore generic containers that correctly wrap (or are wrapped by) valid native headings to prevent false positives. Outputs are separated into distinct “Skipped Level” and “Fake Heading” legends.svg:not([aria-hidden='true']):not([aria-hidden='1']). The logic ignores SVGs explicitly hidden from screen readers. For exposed SVGs, it checks if it lacks an aria-label, lacks a nested <title>, and is not nested within an interactive parent (like a <button>) that already provides an accessible name.img:not([alt]). Evaluates getBoundingClientRect() to distinctly categorize sub-2px tracking pixels apart from standard image violations to reduce UI noise.video. The logic queries descendants for track[kind="captions"], track[kind="subtitles"]. If the result length is 0, the video is flagged.img[alt]. The logic reads the alt attribute and uses the regular expression /\b(image|img|photo|picture|graphic)\b/i to identify redundant terms before flagging.a[href]. The logic evaluates the text content, ARIA labels, and child image alt text. If all sources of accessible names are empty, it triggers a violation.a[href='#'], a[href^='javascript:']. The logic ignores elements that possess role="button". It categorizes the remaining matches based on whether the href prefix is javascript or a hash.a[href]. The logic trims the text content and applies an exact word boundary regular expression /\b(click here|read more|learn more|more|link|here)\b/i to flag matching elements.a[target='_blank']. The logic concatenates the text content and aria-label to test against the regular expression /new (window|tab)/. If no match is found, it flags a violation.input:not([type='hidden']):not([type='submit']):not([type='button']), select, textarea. The logic searches the document for a <label> with a for attribute matching the input ID. It also checks the element for aria-label or aria-labelledby attributes, or if it is nested directly inside a label element. If all checks fail, it is flagged.button, [role='button']. The logic checks the text content of the element, the presence of aria-label or aria-labelledby, and the presence of child img[alt] elements. If the trimmed text is empty and alternative names are missing, it flags a violation.input[placeholder], textarea[placeholder]. The logic checks if the element lacks a label[for] referencing its ID and lacks aria-label or aria-labelledby attributes.input[autocomplete], select[autocomplete], textarea[autocomplete]. The logic splits the token values and validates them against the official W3C HTML5 autocomplete token registry.div[onclick], span[onclick], section[onclick]. The Javascript logic evaluates each element to ensure it lacks a role attribute or lacks a tabindex attribute before flagging a violation.[tabindex]. The logic parses the attribute value as a base 10 integer and triggers a violation if the value is strictly greater than 0.[accesskey]. All elements matching this selector are flagged.a[href], button, input, select, textarea, [tabindex]:not([tabindex='-1']). The Javascript logic iterates through document.styleSheets and checks each CSSRule.STYLE_RULE to see if the selector includes :focus or :focus-visible. It reads the outline, outlineWidth, boxShadow, and border properties. If outline rules contain none or 0px and no fallback border or shadow is provided in the same rule, the selector is recorded. Any interactive element matching that recorded selector is flagged for manual review, as the script cannot natively account for subsequent CSS cascade overrides.[role='presentation'], [role='none'], [role='generic']. The logic triggers a violation if the matched element has an aria-label or aria-labelledby attribute.button[aria-label], a[href][aria-label], [role='button'][aria-label], [role='link'][aria-label]. The logic normalizes whitespace, strips punctuation, and lowercases both the visible innerText and the computed aria-label. If the visible text is not found as a substring within the aria-label, it throws a violation.[id]. The logic tracks processed IDs to prevent redundant processing. When a duplicate is found, it uses document.querySelectorAll with CSS.escape() to fetch all colliding nodes. It evaluates offsetWidth/offsetHeight to categorize each node as visible or hidden, explicitly registering hidden duplicates with a lighter-colored legend so they appear distinctly in the Details Modal without rendering layout-breaking zero-pixel boxes on the screen.[aria-labelledby], [aria-describedby], [aria-controls], [aria-owns], [aria-errormessage], [aria-details], [aria-activedescendant]. The logic splits the attribute values by whitespace into individual ID strings and checks if document.getElementById() returns null. Flags the element if any referenced ID is missing from the DOM.aria-hidden='true'. Pierces Shadow DOMs and iframes to ensure accurate detection of ghost focus traps.[aria-invalid='true']. Elements matching the selector are flagged.h1, p, span, button. The logic verifies child text nodes exist. It uses window.getComputedStyle to retrieve colors, dynamically factoring in font-size and font-weight against WCAG large-text thresholds. It calculates the WCAG relative luminance formula and dynamically evaluates failures against the user’s active UI filters (AA vs AAA) so strict AAA failures are correctly caught even when AA filters are unchecked. Elements over background images or CSS gradients are automatically flagged for manual review.h1, h2, h3, h4, h5, h6. Elements matching the selector are highlighted.main, nav, header, footer, aside, [role='main'], [role='navigation'], [role='banner'], [role='contentinfo']. The logic retrieves the role attribute or the HTML tag name for the badge output.table, caption, th, [role='table'], [role='grid'], [role='treegrid'], [role='columnheader'], [role='rowheader']. The logic applies a dashed style to header roles and tags, and applies a solid style for grid and table containers.ul, ol, li, dl, dt, dd. Elements matching the selector are highlighted.html, [lang], [xml\\:lang]. The logic checks if the element is the root html tag. It flags the element if the root tag is missing a language attribute. It categorizes root language declarations separately from inline phonetic shifts.img. The logic calculates bounding box dimensions to isolate tracking pixels, and assigns distinct legends based on whether the alt attribute is completely missing, present but empty, or populated.video. The logic checks for child track[kind="captions"] or track[kind="subtitles"] elements to highlight the video.iframe. The logic checks if the iframe has aria-hidden set to true or tabindex set to -1. It flags missing titles if the title attribute is missing or empty, otherwise, it outputs the title text.a[target='_blank']. The logic combines the text content and aria-label to test against the regular expression /new (window|tab)/. Matches are highlighted.fieldset, legend. Elements matching the selector are highlighted.button, link, checkbox, slider. The logic uses getBoundingClientRect() to compute width and height. It finds the minimum of the two dimensions and categorizes the element based on strict WCAG thresholds: < 24px (WCAG 2.2 AA Fail), 24-43px (WCAG 2.1 AAA Fail), and 44px+ (WCAG 2.1 AAA Pass).[readonly], [aria-readonly='true']. Highlights controls marked as read-only.[tabindex]. The logic parses the attribute as an integer and assigns different visual legends based on whether the value is equal to 0, less than 0, or greater than 0.aria-hidden='true' on the element or an ancestor.[role]. The logic retrieves the value of the role attribute for display.[aria-roledescription]. Retrieves the value of the attribute for display.aria-labelledby, aria-label, native associated labels/inner text, and finally the title attribute to print exactly what the screen reader will announce.[aria-describedby], [title]. The logic outputs the presence of these specific attributes to the badge.[aria-details]. Elements matching the selector are highlighted.[aria-controls]. Elements matching the selector are highlighted.[aria-owns]. Elements matching the selector are highlighted.[aria-setsize], [aria-posinset]. The logic retrieves the position and set size values for the badge output.[aria-live]. The logic retrieves the value of the aria-live attribute for display.[required], [aria-required='true']. The logic distinguishes between HTML required attributes and ARIA required attributes for the output.[aria-expanded]. The logic categorizes the element based on whether the attribute equals true or false.[aria-pressed]. The logic categorizes the toggle button state based on whether the attribute equals true, false, or mixed.[aria-valuenow], [aria-valuetext]. Retrieves the active numerical or text value of the slider/progress bar.[aria-haspopup]. Retrieves the overlay type parameter for display.The Simulate Mode provides an empathetic heuristic overlay to help developers identify critical contrast and layout barriers by simulating severe visual impairments directly in the DOM. These modules map to documented mathematical approximations rather than applying arbitrary color tints.
feColorMatrix mapped strictly to the WCAG relative luminance formula (0.2126 R + 0.7152 G + 0.0722 B) to ensure colors are converted to grayscale in direct proportion to their perceived brightness.feColorMatrix.feOffset function combined with an alpha reduction (feFuncA) and composites it using feBlend directly into the page layer.contrast() function to reduce the luminance amplitude difference between elements while purposefully maintaining structural color (unlike other tools that biologically misrepresent contrast loss by aggressively converting the page to grayscale).sepia() tone (which unrealistically paints everything brown), it uses a custom SVG feColorMatrix that fundamentally degrades the blue channel to replicate the actual biological absorption of short-wavelength light.The PDF Mode provides a programmatic structural verification of essential PDF/UA and WCAG gatekeeper indicators directly from the active binary stream.
/MarkInfo dictionary. Ensures /Marked true is present and /Marked false is not. A missing tag tree prevents screen readers from understanding reading order and semantics (WCAG 1.3.1 & ISO 14289-1)./Title metadata, and verifies if /DisplayDocTitle is enforced (WCAG 2.4.2)./Lang ISO language code identifier to ensure speech synthesizers load the correct phonetic dictionary (WCAG 3.1.1)./P). Evaluates Bit 10 (value 512, 0x200) to ensure assistive technologies are mathematically permitted to extract text contents if the document is encrypted (Robust Principle).display: none, visibility: hidden, hidden, or inert are strictly excluded from all analysis to match native accessibility tree behavior.overflow: hidden containers (like carousels) are successfully detected and rendered with a ghosted X-Ray hatched pattern.z-index modal).Tab execution, prioritizing tabindex > 0, respecting native Radio Group bundling, and tracing hierarchical paths inside nested iframes./ObjStm).activeTab and storage permissions.WICK-AG-Lens is available under the MIT License. Reference the LICENSE.md file for standard permissions and limitations.
First off, thanks for taking the time to contribute!
To contribute, please follow the process described in CONTRIBUTING.md
And if you like the project but just don’t have the time to contribute, that’s fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about:
Thank you for your support!
The following deliberately inaccessible and accessible demonstration websites were utilized extensively during the development and testing of WICK-AG-Lens to verify the accuracy of the heuristic audits:
aria-pressed, aria-valuenow, aria-haspopup, aria-roledescription, and aria-setsize.Inaccessible SVGs check that smartly ignores properly nested or purely decorative vector images while flagging true failures.Duplicate ID Attributes audit using modern CSS.escape() parsing to avoid crashes on dynamically generated framework IDs.Broken ARIA References audit to strictly validate relationship graphs (aria-labelledby, describedby, controls, owns, etc.) against the physical DOM.Document Title, Page Encoding, and Invalid Autocomplete tokens.Unchecked runtime.lastError warnings triggered by back/forward cache (bfcache) tab navigation by wrapping DevTools messages in a safe evaluation helper.<div> elements containing valid nested headings.H2 is explicitly allowed and does not trigger a skipped level warning.feColorMatrix implementations (Achromatopsia, Protanopia, Deuteranopia via Viénot models, and Tritanopia).class, style, hidden, inert, aria-hidden, and aria-expanded state changes.aria-labelledby > aria-label > native text > title).[Hidden] label.[Iframe] #4.1) to the Focus Order audit to perfectly trace keyboard paths inside isolated sub-documents.outline, permanently eliminating layout reflow loops and infinite scroll-bar expansion bugs.