touch-target-too-small
Medium WCAG 2.5.5What it is
Interactive elements — buttons, links, checkboxes, toggles — have a touch target area smaller than 44×44 CSS pixels. Small targets are difficult to activate accurately on touch screens, especially for users with motor impairments.How QAOS detects it
The agent computes the rendered dimensions of interactive elements from computed CSS styles and flags any with a bounding box smaller than 44×44 pixels.Examples
How to fix
Set minimum dimensions of 44×44px on all interactive elements. If the visual appearance must be smaller (e.g., an 8px radio button), use padding to extend the touch target:touch-target-spacing-too-small
LowWhat it is
Interactive elements are positioned too close together, increasing the risk that a user accidentally activates the wrong element. WCAG 2.5.8 recommends at least 8px of spacing between touch targets.How QAOS detects it
The agent computes the positions of adjacent interactive elements and flags pairs that are closer than 8px apart.Examples
How to fix
Add sufficient margin or padding between adjacent interactive elements. Group related controls and space unrelated groups further apart.horizontal-overflow
MediumWhat it is
One or more elements extend beyond the viewport width, causing the page to require horizontal scrolling. This is almost always unintentional and indicates a responsive design issue.How QAOS detects it
The agent checks the page’s computed layout to detect elements whose rendered width exceeds the viewport width.Common causes
- Fixed-width elements (e.g.,
width: 1200pxon a small screen) - Tables without horizontal scroll wrappers
- Images with
width: autobutmin-widthconstraints - Flex or grid children that don’t wrap at small sizes
- Long unbreakable strings (URLs, email addresses) in text content
How to fix
Use relative units and responsive layout patterns:missing-page-title
High WCAG 2.4.2What it is
The page lacks a<title> element in <head>, or the title is empty (<title></title>). Page titles are announced by screen readers when a page loads and are used as tab labels in browsers.
Why it matters
Screen reader users rely on page titles to understand which page they’ve navigated to, especially when using browser history or switching tabs. Browsers also use page titles for bookmarks and tab management.How QAOS detects it
The agent checks the DOM for the presence of a non-empty<title> element in <head>.
How to fix
Add a descriptive, unique title to every page:Page Name — Site Name so users can distinguish tabs. In React/Next.js, use the framework’s head management:
button-no-icon
LowWhat it is
Text-only buttons that would benefit from an accompanying icon to clarify their purpose — particularly buttons with ambiguous or very long text, or action buttons in dense interfaces where icons provide faster visual scanning.Why it matters
Icons alongside text help users quickly identify action buttons during visual scanning. They also provide redundant communication for users with cognitive disabilities who may process images faster than text.How QAOS detects it
The agent captures a screenshot and uses LLM-based analysis to identify text-only buttons in contexts where an icon would meaningfully improve clarity (e.g., “Click me to continue” with no visual reinforcement).How to fix
Add contextually meaningful icons to action buttons using an icon library:missing-lang-attribute
High WCAG 3.1.1What it is
The<html> element lacks a lang attribute. Screen readers use this attribute to select the correct language engine and pronunciation rules.
Why it matters
Without a language declaration, a screen reader may pronounce the page content using the wrong language rules — making it difficult or impossible to understand for users whose assistive technology defaults to a different language.How QAOS detects it
The agent checks whether the<html> element has a non-empty lang attribute.
Examples
How to fix
Add the appropriate BCP 47 language tag to the<html> element:
next.config.js or the <html> element in your root layout:
missing-meta-viewport
HighWhat it is
The page<head> contains no <meta name="viewport"> tag, causing the page to render at full desktop width on mobile devices rather than scaling to fit the screen.
Why it matters
Without a viewport meta tag, mobile browsers zoom the page out to show the full desktop layout — making text tiny and requiring constant pinch-zooming to read content. This makes the page effectively unusable on mobile.How QAOS detects it
The agent checks the page<head> for the presence of <meta name="viewport">.
How to fix
Add the standard viewport meta tag to every page’s<head>:
user-scalable=no or maximum-scale=1 — these prevent users from zooming to read content, which is a WCAG failure.
non-sequential-heading-hierarchy
Medium WCAG 1.3.1What it is
Heading levels on the page skip ranks — for example, jumping from<h1> directly to <h3>, or from <h2> to <h4>. This breaks the document outline and disrupts screen reader navigation.
Why it matters
Screen reader users navigate pages by jumping between headings. A logical heading hierarchy conveys the structure of the page. Skipped levels imply a missing section and make the structure confusing to navigate.How QAOS detects it
The agent analyzes the heading elements on the page and checks whether any heading level is skipped in the hierarchy.Examples
How to fix
Ensure headings follow a sequential hierarchy without skipping levels. The heading level should reflect the structural importance of the section, not its visual size — use CSS for visual sizing.multiple-h1
MediumWhat it is
The page has more than one<h1> element, which confuses the document outline and makes it unclear what the page’s primary topic is.
Why it matters
The<h1> is the page’s top-level heading — its primary title. Multiple <h1> elements undermine the document structure and make it harder for screen reader users to understand the page hierarchy.
How QAOS detects it
The agent counts the number of<h1> elements on the page and flags any page with more than one.
How to fix
Designate a single<h1> as the primary page title. Other top-level sections should use <h2>:
empty-heading
MediumWhat it is
A heading element (<h1>–<h6>) contains no text content, creating a meaningless invisible entry in the page’s document outline.