npm / axe-core
axe-core
What changed in axe-core 4, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-17.
7 breaking2 deprecations16 new APIs and options1 performance29 behavior and defaults31 fixes and other
See which of these apply to your code, ranked, in your agent:
npx @unstale/cli initaxe-core 486 changes
Breaking changes 7
The rule now reports case-sensitive ARIA attributes with non-lowercase values.
Empty low-contrast text inputs are now reported as incomplete.
The rule is now enabled by default, which can increase issue totals after upgrading.
Value-text roles are now marked incomplete.
Restricts br and wbr elements to aria-hidden only.
Now shows an error message when aria-busy is used with unallowed children.
The rule no longer skips a page in certain edge cases, so pages that were not tested may now report color contrast issues.
Deprecations 2
This misspelled function is deprecated in favor of the correct spelling.
Deprecates the rule because ARIA no longer requires complementary landmarks to be top-level.
New APIs and options 16
An Azerbaijani locale is available for localized axe-core output.
A new function retrieves ARIA values from a node.
A new function checks whether a node has an ARIA value.
ARIA attribute standards data now has a caseInsensitive property.
A new function retrieves resolved virtual nodes for idrefs.
A new match is available for checking whether an element has a child.
A new match is available for identifying sectioning content.
A new match is available for identifying a summary associated with details.
The sectionfooter ARIA role is now supported.
The sectionheader ARIA role is now supported.
A Swedish locale is now available.
Adds a rule that checks whether role="tab" elements have an accessible name.
Adds a public API for setting elementInternal data.
Adds a method to restore the default locale.
Adds an external script as part of preparations for Element Internal support.
Exposes normalizeRunOptions for use by developers.
Performance 1
Performance improvements should speed runs by 20%–40% on most pages; especially large pages showed a 15x improvement.
Behavior and default changes 29
Failure messages now suggest removing aria-hidden.
No-role messages now quote the element name.
The rule now allows caption in table, grid and treegrid.
Messages now explain presentational children that cannot be ignored.
Checks that can return undefined now provide incomplete messages.
Listitem failure messages are now actionable.
The rule now supports CJK word splitting when comparing labels and names.
Visible labels are compared to accessible names by word.
Parenthesised content is ignored during label and name comparison.
The default failure message now explains how to fix the issue.
Array values in processed messages are now separated with a comma and a space.
Scrollable content with negative tabindex now needs review instead of failing outright.
The rule now includes EN 301 549 v4 tags, allowing it to be targeted using those tags.
axe-core now allows aria-actions as an ARIA attribute.
Deprecated ARIA attributes are flagged as needs-review.
The rule now allows roles on a summary that is not part of details, and restricts figure roles when there is a child figcaption.
More elements may be named, while label and body may not; visible aria-labelledby requires review only.
ElementInternals support is enabled by default, including support for ARIA properties and form-associated labels.
Whitespace alt text is now allowed on presentational images.
axe-core treats role=image as equivalent to role=img.
The enabled property of RuleMetadata is now optional, so TypeScript users do not need to provide it.
Partially supports element internals roles when checking allowed and prohibited ARIA attributes.
Adds support for radio.
Partially supports element internals roles when checking required parent and child relationships.
Returned rule objects now include the rule's enabled state.
Supports element internals roles for list and listitem checks.
Ignores widgets that are inline with other inline elements.
axe.run contexts now allow shadow roots.
The mapping of aria-hidden-* and valid-lang was adjusted, changing which rules run and how they map to RGAA.
Fixes and other changes 31
Setting isDefault when adding a reporter now makes that reporter the default.
The rule now tests the text that gets spacing from the element.
Color parsing now handles "none" and exponents in color strings.
An @import URL is now resolved against the stylesheet that contains it.
Dialogs are treated as non-modal when elementsFromPoint is unsupported.
When a check has no incomplete message, axe-core now uses the fallback message.
CJK and full-width text is normalized before comparison.
The rule now ignores paragraphs with heading roles.
Overlapping links with the same destination are now ignored.
The ARIA standard data now identifies aria-details as an idref.
The ARIA standard data now identifies aria-errormessage as an idref.
Various stacking context bugs are fixed.
Attribute selectors now escape control characters.
Sections and forms with non-landmark roles are excluded from landmark matching.
The image role is now named in the rule metadata.
The image role is now named in the rule metadata.
Matches visible text with aria-label and excludes invisible text.
Corrects offset detection for inline targets and ignores offscreen fixed elements and widgets inline with other inline elements.
Node names are escaped in ancestry selectors.
Excludes natively hidden elements from accessible-name computation for aria-labelledby.
Ignores position: fixed elements that are offscreen when the page is scrolled, addressing false positives.
Handles multiple aria-errormessage IDs.
No longer fails scroll areas when all content is visible without scrolling.
Clarifies that the issue addressed by the rule is in Safari.
Determines offset using clientRects when a target is display:inline.
The rule now handles oklch and oklab colors with none.
The rule no longer marks textarea as incomplete.
The luminance threshold constant changed from 0.03928 to 0.04045.
Rules that select html are no longer run on nested html elements.
Out-of-gamut oklch colors now match browser behavior.
The rule now recognizes newer language codes.