What is @storybook/addon-a11y?
The @storybook/addon-a11y package is an addon for Storybook that helps you improve the accessibility of your UI components. It integrates with Storybook to provide automated checks and manual testing tools for accessibility issues, allowing developers to ensure their components are accessible to as many users as possible.
What are @storybook/addon-a11y's main functionalities?
Automated accessibility checks
Automatically run accessibility checks on your components within the Storybook UI. It uses the axe-core library to test each component for accessibility issues and provides a report.
import { withA11y } from '@storybook/addon-a11y';
export default {
title: 'Button',
decorators: [withA11y],
};
export const AccessibleButton = () => <button>Click me</button>;
export const InAccessibleButton = () => <button style={{ color: 'white', backgroundColor: 'white' }}>Can't see me</button>;
Manual accessibility testing tools
Provides tools for manual accessibility testing, such as color contrast checkers and keyboard event simulation, to complement the automated checks.
N/A
Customizable rules
Allows customization of the accessibility rules used for testing, enabling or disabling specific rules to tailor the checks to your project's needs.
import { withA11y } from '@storybook/addon-a11y';
export default {
title: 'Button',
decorators: [withA11y],
parameters: {
a11y: {
config: {
rules: [{ id: 'color-contrast', enabled: false }]
}
}
}
};
Other packages similar to @storybook/addon-a11y
axe-core
A core library for accessibility testing used by many tools and services, including @storybook/addon-a11y. It can be integrated directly into testing workflows or used as part of other tools.
eslint-plugin-jsx-a11y
An ESLint plugin that enforces accessibility rules in JSX elements. Unlike @storybook/addon-a11y, which is used within Storybook, this plugin integrates with the ESLint static code analysis tool to catch accessibility issues during code linting.
react-axe
A library that can be used in React applications to audit accessibility in real-time during development. It also uses axe-core under the hood but is used directly in the app rather than in Storybook.
pa11y
An automated accessibility testing tool that runs in the command line or as part of your build process. It provides a different approach to accessibility testing compared to the Storybook addon, as it can be used for testing entire pages and is not specific to a component development environment.
Storybook Accessibility Addon
The @storybook/addon-a11y package provides accessibility testing for Storybook stories. It uses axe-core to run the tests.
Getting Started
Add the addon to an existing Storybook
npx storybook add @storybook/addon-a11y
More on getting started with the accessibility addon
8.6.0
The 8.6 release focuses on Storybook Test, which brings realtime component, accessibility, and visual UI tests to your favorite component workshop.
Here’s what’s new:
- 🎁 Storybook Test installer for out-of-the-box tests in new projects
- 🦾 Accessibility “todo” workflow to systematically fix a11y violations
- 🗜️ 80% smaller create-storybook package for much faster installs
- 🧪 Dozens of Test fixes based on user feedback
- 📕 Docs fixes for table of contents, code snippets, and more
- 🚨 Key security fixes for Vite and ESbuild
- 💯 Hundreds more improvements
<details>
<summary>List of all updates</summary>
- Addon A11y: Introduce parameters.a11y.test - #30516, thanks @valentinpalkovic!
- Addon-A11y: Fix preset loading when loaded via getAbsolutePath - #30563, thanks @valentinpalkovic!
- Addon-Docs: Change URL hash when TOC item is clicked, and fix TOC loading bugs - #30130, thanks @Sidnioulz!
- Addon-docs: Consider custom code snippet in story code panel and update styles - #30179, thanks @larsrickert!
- Addon-Test: Add telemetry data for Focused Tests - #30568, thanks @JReinhold!
- Addon-Test: Fix config and watch mode inconsistencies - #30491, thanks @JReinhold!
- Addon-Test: Fix console error in build mode - #30625, thanks @JReinhold!
- Addon-Test: Make sure that only one global portable story config is ever loaded - #30582, thanks @kasperpeulen!
- Angular: Fix accent character issue - #30276, thanks @valentinpalkovic!
- Angular: Support experimental zoneless mode - #28657, thanks @anedomansky!
- Angular: Support v19.2 when @angular/animations is not installed - #30611, thanks @valentinpalkovic!
- Builder-Vite: Fix resolve id warning - #30511, thanks @valentinpalkovic!
- Builder-Vite: Fix runtime and iframe 404 on first load - #30567, thanks @valentinpalkovic!
- Bun: Add support for text lock file - #30160, thanks @Arctomachine!
- Cleanup: Remove unused constants in viewport addon - #30479, thanks @Guria!
- CLI: Don't initially select Documentation and Testing features - #30599, thanks @ghengeveld!
- CLI: Fix peer dep issues for npm users during upgrade - #30616, thanks @valentinpalkovic!
- CLI: Fix printing of selected features - #30605, thanks @ghengeveld!
- CLI: Make telemetry data an object - #30581, thanks @ndelangen!
- CLI: Prompt users for RN vs RNW on init - #30635, thanks @shilman!
- CLI: Reimplement features prompt logic to handle
--yes
and fix --features
- #30534, thanks @ghengeveld!
- CLI: Remove Storybook dependencies before adding re-adding them - #30600, thanks @valentinpalkovic!
- CLI: Use correct storybook internals import in automigration - #30290, thanks @yannbf!
- Codemod: Always get real path of files - #30650, thanks @yannbf!
- Codemod: Handle addon essentials differently in csf factories - #30649, thanks @yannbf!
- Codemod: Migrate meta.args to meta.input.args in csf factories - #30641, thanks @yannbf!
- Codemod: Use real path from symbolic links - #30642, thanks @yannbf!
- Core: Add
UniversalStore
API to sync state/events between multiple environments - #30445, thanks @JReinhold!
- Core: Add connection timeout notification - #30288, thanks @valentinpalkovic!
- Core: Allow empty render functions in CSF factories - #30565, thanks @kasperpeulen!
- Core: Always place cache dir inside
node_modules
- #30643, thanks @ndelangen!
- Core: Don't set process.env.NODE_ENV and process.env.DEV - #30651, thanks @valentinpalkovic!
- Core: Fix addon essentials preview preset - #30647, thanks @yannbf!
- Core: Fix extracting import path when it's not a core addon - #30640, thanks @yannbf!
- Core: Fix invalid Websocket termination - #30408, thanks @valentinpalkovic!
- Core: Fix statically serving single files and multiple dirs on the same endpoint - #30467, thanks @JReinhold!
- Core: Fix undeclared internal dependencies - #30566, thanks @kasperpeulen!
- Core: Improve type compatibility with React 19 - #30031, thanks @mrginglymus!
- Core: Move CSF to monorepo - #30488, thanks @kasperpeulen!
- Csf Tools: Allow ConfigFile to create more import syntaxes - #30204, thanks @yannbf!
- CSF: Add support for CSF factories - #30197, thanks @kasperpeulen!
- Essentials: Fix
addon-essentials
not working when used with getAbsolutePath
- #30557, thanks @JReinhold!
- Manager: Escape single quotes in dynamic import paths in wrapManagerEntries function - #30278, thanks @valentinpalkovic!
- Manager: Fix escaping of single quotes in dynamic import paths - #30278, thanks @valentinpalkovic!
- Manager: Fix panel reactivity - #30638, thanks @valentinpalkovic!
- React: Fix incorrect import in preview.ts - #30542, thanks @mrginglymus!
- Svelte: Fix conflicting variable names and support for
+page.svelte
files - #30369, thanks @xeho91!
- Test addon: Only update
vitest.config.ts
with workspaces, otherwise create vitest.workspace.ts
- #30583, thanks @ghengeveld!
</details>