Skip to content

Addon-a11y: Replace element parameter with context #31036

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 26 commits into from
Apr 22, 2025

Conversation

JReinhold
Copy link
Contributor

@JReinhold JReinhold commented Apr 2, 2025

Closes #30947

What I did

Replaced the a11y.element parameter with a a11y.context, which more closely aligns with axe-core's context API: https://github.com/dequelabs/axe-core/blob/develop/doc/context.md

It doesn't support Node nor NodeList, because trying to do something like:

const MyStory = {
  parameters: {
    a11y: {
      context: document.getElementById('my-target')
    }
  }
}

Would try to get the element when the stories module is loaded, way before the story is rendered, so the DOM element wouldn't exist. Therefore we only support the more basic string-based options, which should be enough for all use cases.

I also excluded a handful of internal elements that Storybook includes by default to all previews.

Checklist for Contributors

Testing

The changes in this PR are covered in the following automated tests:

  • stories
  • unit tests
  • integration tests
  • end-to-end tests

Manual testing

This section is mandatory for all contributions. If you believe no manual test is necessary, please state so explicitly. Thanks!

Documentation

  • Add or update documentation reflecting your changes
  • If you are deprecating/removing a feature, make sure to update
    MIGRATION.MD

Checklist for Maintainers

  • When this PR is ready for testing, make sure to add ci:normal, ci:merged or ci:daily GH label to it to run a specific set of sandboxes. The particular set of sandboxes can be found in code/lib/cli-storybook/src/sandbox-templates.ts

  • Make sure this PR contains one of the labels below:

    Available labels
    • bug: Internal changes that fixes incorrect behavior.
    • maintenance: User-facing maintenance tasks.
    • dependencies: Upgrading (sometimes downgrading) dependencies.
    • build: Internal-facing build tooling & test updates. Will not show up in release changelog.
    • cleanup: Minor cleanup style change. Will not show up in release changelog.
    • documentation: Documentation only changes. Will not show up in release changelog.
    • feature request: Introducing a new feature.
    • BREAKING CHANGE: Changes that break compatibility in some way with current major version.
    • other: Changes that don't fit in the above categories.

🦋 Canary release

This pull request has been released as version 0.0.0-pr-31036-sha-81a9cd5f. Try it out in a new sandbox by running npx storybook@0.0.0-pr-31036-sha-81a9cd5f sandbox or in an existing project with npx storybook@0.0.0-pr-31036-sha-81a9cd5f upgrade.

More information
Published version 0.0.0-pr-31036-sha-81a9cd5f
Triggered by @yannbf
Repository storybookjs/storybook
Branch jeppe/support-axe-context-api
Commit 81a9cd5f
Datetime Wed Apr 2 21:22:14 UTC 2025 (1743628934)
Workflow run 14229869368

To request a new release of this pull request, mention the @storybookjs/core team.

core team members can create a new canary release here or locally with gh workflow run --repo storybookjs/storybook canary-release-pr.yml --field pr=31036

Greptile Summary

This PR updates the a11y addon to replace the deprecated 'element' parameter with 'context', aligning it with axe-core’s context API and preventing premature DOM queries.

  • Updated parameter validation in code/addons/a11y/src/a11yRunner.ts to throw errors for deprecated 'element' usage.
  • Revised type definitions in code/addons/a11y/src/params.ts to support only allowed string-based inputs.
  • Documented migration details in MIGRATION.md for users.
  • Added a new error in code/core/src/preview-errors.ts for misconfiguration.
  • Introduced automigration fixes with tests in code/lib/cli-storybook/src/automigrate/fixes and helpers.

Copy link
Contributor

github-actions bot commented Apr 2, 2025

Fails
🚫 PR is marked with "BREAKING CHANGE" label.

Generated by 🚫 dangerJS against e91d788

Copy link

nx-cloud bot commented Apr 2, 2025

View your CI Pipeline Execution ↗ for commit e91d788.

Command Status Duration Result
nx run-many -t build --parallel=3 ✅ Succeeded 1m 40s View ↗

☁️ Nx Cloud last updated this comment at 2025-04-22 11:09:22 UTC

Comment on lines 58 to 81
const context: ContextSpec = DEFAULT_CONTEXT;

if (input.context) {
// 1. if context exists, but it's not an object with include or exclude, it's an implicit include to be used directly
if (
!(
typeof input.context === 'object' &&
('include' in input.context || 'exclude' in input.context)
)
) {
context.include = input.context as ContextProp;
} else if (typeof input.context === 'object' && 'include' in input.context) {
// 2. if context.include exists, use it
context.include = input.context.include as ContextProp;
}

// 3. if context.exclude exists, merge it with the default exclude
if (
typeof input.context === 'object' &&
'exclude' in input.context &&
input.context.exclude !== undefined
) {
context.exclude = (DEFAULT_CONTEXT.exclude as any).concat(input.context.exclude);
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we didn't wanted to exclude the internal Storybook elements like .sb-wrapper - because they are excluded by default because they have display: none - then we wouldn't need this logic at all and could just pass in the context directly to axe.

I'm fine with either.

@JReinhold JReinhold marked this pull request as ready for review April 4, 2025 08:23
Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

10 file(s) reviewed, 4 comment(s)
Edit PR Review Bot Settings | Greptile

@JReinhold JReinhold requested review from ghengeveld and yannbf April 10, 2025 16:54
Copy link
Member

@ghengeveld ghengeveld left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't thoroughly review the automigrations but otherwise this is fine. I like that you added the stories and tests.

@ghengeveld ghengeveld self-assigned this Apr 16, 2025
@yannbf yannbf added ci:merged Run the CI jobs that normally run when merged. and removed ci:normal labels Apr 22, 2025
@yannbf yannbf merged commit 773ce3c into next Apr 22, 2025
5 checks passed
@yannbf yannbf deleted the jeppe/support-axe-context-api branch April 22, 2025 11:04
@github-actions github-actions bot mentioned this pull request Apr 22, 2025
28 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
addon: a11y BREAKING CHANGE ci:merged Run the CI jobs that normally run when merged.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add full support for Axe context parameter in a11y addon
3 participants