Accessible UI component implementations across React, Vue, Svelte, and Astro following WAI-ARIA APG patterns
日本語 | English
This project provides accessible UI components and test cases that follow the WAI-ARIA Authoring Practices Guide (APG) patterns.
Each component is implemented across four major frontend frameworks: React, Vue, Svelte, and Astro (Web Components), providing familiar implementation examples to help you learn about accessibility and WAI-ARIA.
Each component includes tests to verify APG pattern compliance, which you can use directly to ensure accessibility of your own components. The test documentation is also designed in an AI-friendly format, making it easy to generate test cases.
Additionally, we provide styling that supports dark mode, high contrast mode, and forced colors mode to further assist in developing accessible components.
| Pattern | React | Vue | Svelte | Astro | E2E | Status |
|---|---|---|---|---|---|---|
| Accordion | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Alert | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Alert Dialog | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Breadcrumb | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Button | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Carousel | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Checkbox | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Combobox | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Data Grid | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Dialog | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Disclosure | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Feed | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Grid | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Landmarks | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Link | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Listbox | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Menubar | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Menu Button | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Meter | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Radio Group | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Slider | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Slider (Multi-Thumb) | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Spinbutton | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Switch | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Table | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Tabs | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Toggle Button | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Toolbar | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Tooltip | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Tree View | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Treegrid | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
| Window Splitter | ✅ | ✅ | ✅ | ✅ | ✅ | Complete |
We welcome contributions! Please see our Contributing Guide for details on:
git checkout -b feature/amazing-componentA daily GitHub Actions workflow polls w3c/aria-practices and opens one issue per APG slug whenever new commits land on a tracked pattern path. Reviewers can decide in a single place whether each upstream change needs reflecting in this site.
apg-upstream..github/workflows/apg-upstream-watch.yml.dry_run=true: print intended actions, no issue creation, no state commit.since_override=<ISO8601>: process commits since the given time for all slugs (useful for first backfill).patterns=<id,id,...>: limit to the given site patternIds..github/apg-state.json records, per APG slug, the last commit SHA and timestamp the watcher has already turned into an issue. The bot user commits state updates with [skip ci]. On first encounter of a slug, the watcher records the latest commit as a baseline and creates no issue (so we don't drown in years of history).
Each issue body contains a hidden marker <!-- apg-upstream:slug=<apg-slug> -->. The watcher uses this marker (not the title) to find existing open issues for follow-up comments, so renaming the title is safe.
GITHUB_TOKEN=$(gh auth token) DRY_RUN=true PATTERNS_FILTER=button \
SINCE_OVERRIDE=2025-12-01T00:00:00Z \
npm run watch:apg
For security concerns or to report vulnerabilities, please see our Security Policy.
This project is licensed under the MIT License - see the LICENSE file for details.