What This Template Is For
ARIA (Accessible Rich Internet Applications) attributes bridge the gap between custom UI components and assistive technology. Native HTML elements like The problem is that incorrect ARIA is worse than no ARIA. A Use this template during development of custom interactive components. It pairs with the accessibility audit template for post-build verification and the focus management template for keyboard interaction patterns. The Technical PM Handbook covers how PMs can review technical implementation details like ARIA usage without needing to write the code themselves. For a broader view of accessibility requirements beyond ARIA, the WCAG audit template covers the full compliance picture. Before implementing ARIA on any component, verify these foundations. Browse our full library of PM templates, or generate a custom version with AI. Subscribe to get new templates, frameworks, and PM strategies delivered to your inbox. Join 10,000+ product leaders. Instant PDF download. Want full SaaS idea playbooks with market research?, , and communicate their role, state, and behavior to screen readers automatically. Custom components built from elements do not. ARIA adds that missing semantic layer.
How to Use This Template
is always better than is always better than a custom dropdown with ARIA. The first rule of ARIA is: do not use ARIA if you can use native HTML.
The Template
ARIA First Principles Checklist
button, link, tab, menuitem, etc.) can be reached with Tab and activated with Enter or Space.aria-expanded, aria-selected, aria-checked, or aria-pressed attribute updates in the DOM.aria-label and aria-labelledby values are descriptive sentences or phrases, not CSS class names or developer shorthand. or are redundant and unnecessary.id referenced by aria-labelledby, aria-describedby, aria-controls, or aria-owns is unique on the page.
Component: Modal Dialog
Requirement ARIA Attribute Implementation Detail Status Container has dialog role role="dialog"Set on the outermost modal container ☐ Dialog has accessible name aria-labelledby="title-id"Points to the modal's heading element ☐ Dialog has description (optional) aria-describedby="desc-id"Points to introductory text if present ☐ Modal flag set aria-modal="true"Prevents screen readers from reading content behind the modal ☐ Focus moves to dialog on open Programmatic focus First focusable element or the dialog container itself receives focus ☐ Focus is trapped inside dialog Tab/Shift+Tab cycle Focus wraps from last to first focusable element and vice versa ☐ Escape key closes dialog Keyboard handler keydown listener for Escape on the dialog container☐ Focus returns on close Programmatic focus Focus returns to the element that triggered the modal ☐ Background content is inert inert attribute or aria-hidden="true"All content outside the modal is hidden from assistive technology ☐
Component: Tabs
Requirement ARIA Attribute Implementation Detail Status Tab list container role="tablist"Set on the container holding all tab buttons ☐ Tab list has label aria-label="Section name"Describes what the tabs control ☐ Each tab trigger role="tab"Set on each clickable tab element ☐ Active tab indicated aria-selected="true"Only the active tab has this; others have aria-selected="false"☐ Tab controls its panel aria-controls="panel-id"Each tab points to its corresponding panel ☐ Tab panel container role="tabpanel"Set on each content panel ☐ Panel labeled by tab aria-labelledby="tab-id"Each panel references its corresponding tab ☐ Arrow key navigation Left/Right arrows Arrow keys move between tabs. Home goes to first, End goes to last. ☐ Tab key behavior Tab moves to panel Pressing Tab from the active tab moves focus into the tab panel content, not the next tab ☐
Component: Accordion / Disclosure
Requirement ARIA Attribute Implementation Detail Status Trigger is a button or role="button"Each accordion header trigger is a button element ☐ Expanded state communicated aria-expanded="true/false"Updates when the section opens or closes ☐ Trigger controls content aria-controls="section-id"Points to the expandable content region ☐ Content region has role (optional) role="region"If the content is a significant page section ☐ Content labeled by trigger aria-labelledby="trigger-id"If the content region has role="region"☐ Enter/Space activates Keyboard handler Pressing Enter or Space on the trigger toggles the section ☐
Component: Dropdown Menu
Requirement ARIA Attribute Implementation Detail Status Trigger button aria-haspopup="true"Indicates that the button opens a menu ☐ Trigger expanded state aria-expanded="true/false"Updates when the menu opens or closes ☐ Menu container role="menu"Set on the dropdown container ☐ Menu items role="menuitem"Set on each item in the menu ☐ Menu labeled by trigger aria-labelledby="trigger-id"The menu references its trigger button ☐ Arrow key navigation Up/Down arrows Arrow keys move between menu items. Home goes to first, End goes to last. ☐ Escape closes menu Keyboard handler Returns focus to the trigger button ☐ Type-ahead Character keys Typing a character moves focus to next item starting with that character ☐ Focus management Programmatic focus Focus moves to first menu item on open; returns to trigger on close ☐
Component: Combobox (Autocomplete)
Requirement ARIA Attribute Implementation Detail Status Input has combobox role role="combobox"Set on the text input element ☐ Input has expanded state aria-expanded="true/false"True when suggestion list is visible ☐ Input controls listbox aria-controls="listbox-id"Points to the suggestion list container ☐ Active option announced aria-activedescendant="option-id"Updates as the user arrows through suggestions ☐ Autocomplete type aria-autocomplete="list" or "both"list for suggestions only, both if input also auto-completes☐ Suggestion list role="listbox"Set on the dropdown container ☐ Each suggestion role="option"Set on each item in the listbox ☐ Selected option aria-selected="true"Marks the highlighted option ☐ Arrow key navigation Up/Down arrows Navigate through suggestions without closing the list ☐ Enter selects Keyboard handler Selects the highlighted option and closes the list ☐ Escape closes Keyboard handler Closes the suggestion list without selecting ☐
Component: Toast / Notification
Requirement ARIA Attribute Implementation Detail Status Polite announcements role="status" or aria-live="polite"For success messages, informational toasts ☐ Urgent announcements role="alert" or aria-live="assertive"For error messages, destructive action warnings ☐ Container exists in DOM before content Pre-rendered container The live region element is in the DOM at page load; content is injected into it. Adding aria-live to a newly created element does not work reliably.☐ Atomic updates aria-atomic="true"Screen reader announces the entire region, not just the changed text ☐ Dismissible with keyboard Close button or auto-dismiss If the toast has a close button, it is keyboard accessible. If it auto-dismisses, the timeout is at least 5 seconds. ☐
Component: Custom Toggle / Switch
Requirement ARIA Attribute Implementation Detail Status Switch role role="switch"Set on the toggle element ☐ Checked state aria-checked="true/false"Updates when the toggle changes ☐ Accessible label aria-label or aria-labelledbyDescribes what the switch controls ☐ Space activates Keyboard handler Pressing Space toggles the switch state ☐ Focusable tabindex="0"If not a native , add tabindex for keyboard focus☐
Component: Tree View
Requirement ARIA Attribute Implementation Detail Status Tree container role="tree"Set on the outermost list container ☐ Tree has label aria-label="Navigation"Describes the tree's purpose ☐ Tree items role="treeitem"Set on each item in the tree ☐ Parent items expanded state aria-expanded="true/false"On tree items that have children ☐ Nesting level aria-level="n"Indicates depth if not using nested elements☐ Group container role="group"Wraps child items under a parent ☐ Arrow key navigation Up/Down/Left/Right Up/Down moves between visible items. Right expands a parent. Left collapses. ☐ Selected item aria-selected="true"If tree supports selection ☐
ARIA Live Regions Reference
Use Case Attribute Behavior Form validation error role="alert"Immediately announced, interrupts current speech Success confirmation role="status"Announced at next pause in speech Chat message received aria-live="polite"Announced at next pause Countdown timer aria-live="off" with periodic aria-live="polite" updatesAnnounce at key intervals, not every second Loading spinner role="status" + aria-live="polite""Loading..." announced once; "Content loaded" announced when done Search results count role="status""12 results found" announced after filtering
Audit Summary
Component Total Requirements Passed Failed Not Applicable Notes Modal Dialog 9 Tabs 9 Accordion 6 Dropdown Menu 9 Combobox 11 Toast / Notification 5 Toggle / Switch 5 Tree View 8 Total 62 Frequently Asked Questions
When should I use aria-label versus aria-labelledby?+
What is the difference between aria-live polite and assertive?+
Do I need ARIA if I use semantic HTML?+
How do I test ARIA implementation?+
What happens if I use ARIA incorrectly?+
Explore More Templates
Like This Template?
