NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #403 most downloaded on npm
Implements https://w3c.github.io/accname/
Last release 10 months ago
27 Nov 2025
Release timing varies
gaps range from 1 weeks to 1.3 years
Nearly every release is documented
notes for 33 of 35 stable releases
Nothing withdrawn
no release was ever pulled
7 years old
35 releases · first in 2019
Patch Changes #1090 3c0b608 Thanks @eps1lon ! - Switch to trusted publishing
Should improve performance in environments that don't cache these results natively e.g. JSDOM. This increases memory usage. If this results in adverse
#1048 d9ad334 Thanks @TomPridham! - Cache window.getComputedStyle results
Should improve performance in environments that don't cache these results natively e.g. JSDOM.
This increases memory usage.
If this results in adverse effects (e.g. resource constrained browser environments), please file an issue.
One column per quarter.
Patch Changes #996 a6c21d5 Thanks @eps1lon ! - Ensure types are declared first in exports field
Patch Changes #978 0128d16 Thanks @hiebj ! - Add explicit typings location to support use in TypeScript ESM modules
Patch Changes #934 8acefc3 Thanks @alonidiom ! - Support aria-description as descriptor #933 a593ee0 Thanks @jlp-craigmorten ! - Support "none" role a
#934 8acefc3 Thanks @alonidiom! - Support aria-description as descriptor
#933 a593ee0 Thanks @jlp-craigmorten! - Support "none" role as a synonym for the "presentation" role
Minor Changes #919 215955e Thanks @MatanBobi ! - add an isDisabled function to check if elements are disabled or not
215955e Thanks @MatanBobi! - add an isDisabled function to check if elements are disabled or notPatch Changes #902 df97b80 Thanks @eps1lon ! - Fix a case of maximum call stack size exceeded when a node referenced itself in aria-labelledby .
Effectively ensures that title will not have precedence over name from content. For example, the option in <option title="Title">Content</option> will
Patch Changes #827 a1daca5 Thanks @nolanlawson ! - Follow aria-labelledby and aria-describedby if they point to elements in the same shadow root.
a1daca5 Thanks @nolanlawson! - Follow aria-labelledby and aria-describedby if they point to elements in the same shadow root.const name = computeAccessibleName(<button title="from-title">from-content</button>); - 'from-title' === name + 'from-content' === name
#811 5b0f48e Thanks @eps1lon! - Prefer button subtree over title attribute.
const name = computeAccessibleName(<button title="from-title">from-content</button>);
-'from-title' === name
+'from-content' === name<button title="from-title">from-content</button> would previously compute the accessible name "from-title".
This is correct in ACCNAME 1.2 but is changed in the latest editors draft.
The latest editors draft specifically refers to HTML-AAM which says that the subtree should take precedent over the title attribute.
computeAccessibleName now calculates "from-content" as the accessible name.
### Patch Changes - #800 `de554b0` Thanks @pablo-abc! - Remover circular dependency, which fixes warnings thrown in certain environments.
de554b0 Thanks @pablo-abc! - Remover circular dependency, which fixes warnings thrown in certain environments.### Patch Changes - #796 `cb38778` Thanks @calebeby! - now maps to role spinbutton (was textbox before).
This is mainly targetted at integration with @testing-library/dom. But it can also be used as a general performance boost when used in a JSDOM environ
#770 7066180 Thanks @eps1lon! - Allow computing name for inaccessible elements
This is mainly targetted at integration with @testing-library/dom.
But it can also be used as a general performance boost when used in a JSDOM environment.
The rationale is that most elements are part of the a11y tree.
In those cases computing a11y tree exclusion is wasted.
Since it's expensive, we can disable it.
The recommendation is to only ignore a11y tree inclusion locally and specifically
enable it for the tests where you do know that a11y tree inclusion will play a role.
Previously we wouldn't compute any name for menu to pass some web-platform-tests that covered an exotic use case. Now we correctly respect name from a
isInaccessible implements . isSubtreeInaccessible can be used to inject a memoized version of that function into isInaccessible.
#343 3d755c2 Thanks @eps1lon! - Add isInaccessible and isSubtreeInaccessible.
isInaccessible implements https://www.w3.org/TR/wai-aria-1.2/#tree_exclusion.
isSubtreeInaccessible can be used to inject a memoized version of that function into isInaccessible.
### Patch Changes - #718 `6154760` Thanks @calebeby! - Remove implicit "document" role on and add it to
Previously the accessible name of the would ignore the . However, an ` ` is labelable and therefore the accessible name is now computed using elements
#666 26ee73d Thanks @eps1lon! - Consider <label /> when computing the accessible name of <output />
Given
<label for="outputid">Output Label</label> <output id="outputid"></output>
Previously the accessible name of the <output /> would ignore the <label />.
However, an <output /> is labelable and therefore the accessible name is now computed using <label /> elements if they exists.
In this example the accessible name is "Output Label".
`diff -const [item] = list; +const item = list[0]; `
#627 0485441 Thanks @eps1lon! - Ensure certain babel helpers aren't required
Source:
-const [item] = list;
+const item = list[0];
Transpiled:
-var _trim$split = list.trim().split(" "),
-_trim$split2 = _slicedToArray(_trim$split, 1),
-item = _trim$split2[0]
+var item = list[0];
#629 383bdb6 Thanks @eps1lon! - Use label attribute for naming of <optgroup> elements.
Given
<select>
<optgroup label="foo">
<option value="1">bar</option>
</optgroup>
</select>
Previously the <optgroup /> would not have an accessible name.
Though 2D in accname 1.2 could be interpreted to use the label attribute:
Otherwise, if the current node's native markup provides an attribute (e.g. title) or element (e.g. HTML label) that defines a text alternative, return that alternative [...]
This was confirmed in NVDA + FireFox.
`3866289` #442 Thanks @geoffrich! - Correctly determine accessible name when element contains a slot.
3866289 #442 Thanks @geoffrich! - Correctly determine accessible name when element contains a slot.
Previously, computing the accessible name would only examine child nodes. However, content placed in a slot is is an assigned node, not a child node.
If you have a custom element custom-button with a slot:
<button><slot></slot></button>
<!-- accname of inner <button> is 'Custom name' (previously '') -->
<custom-button>Custom name</custom-button>
If you have a custom element custom-button-default with default content in the slot:
<button><slot>Default name</slot></button>
<!-- accname of inner <button> is 'Custom name' (previously 'Default name') -->
<custom-button-default>Custom name</custom-button-default>
<!-- accname of inner <button> is 'Default name' (previously 'Default name') -->
<custom-button-default></custom-button-default>
This is not currently defined in the accname spec but reflects current browser behavior.
`76e8f93` #430 Thanks @ckundo! - Maintain img role for img with missing alt attribute.
76e8f93 #430 Thanks @ckundo! - Maintain img role for img with missing alt attribute.
Previously <img /> would be treated the same as <img alt />.
<img /> is now treated as role="img" as specified.
`03273b7` #406 Thanks @eps1lon! - Fix various issues for input types submit, reset and image
03273b7 #406 Thanks @eps1lon! - Fix various issues for input types submit, reset and image
Prefer input value when type is reset or submit:
<input type="submit" value="Submit values">
-// accessible name: "Submit"
+// accessible name: "Submit values"
<input type="reset" value="Reset form">
-// accessible name: "Reset"
+// accessible name: "Reset form"
For input type image consider alt attribute or fall back to "Submit query".
`fcc66ae` #394 Thanks @marcosvega91! - Ignore title attribute if it is empty.
fcc66ae #394 Thanks @marcosvega91! - Ignore title attribute if it is empty.
Previously <button title="">Hello, Dave!</button> would wrongly compute an empty name.
`9e46c51` #380 Thanks @eps1lon! - BREAKING CHANGE
9e46c51 #380 Thanks @eps1lon! - BREAKING CHANGE
Ignore ::before and ::after by default.
This was necessary to prevent excessive warnings in jsdom@^16.4.0.
If you use this package in a browser that supports the second argument of window.getComputedStyle you can set the computedStyleSupportsPseudoElements option to true:
computeAccessibleName(element, {
computedStyleSupportsPseudoElements: true
});
computeAccessibleDescription(element, {
computedStyleSupportsPseudoElements: true
});
If you pass a custom implementation of getComputedStyle then this option defaults to true.
The following two calls are equivalent:
computeAccessibleName(element, {
computedStyleSupportsPseudoElements: true
});
computeAccessibleName(element, {
getComputedStyle: (element, pseudoElement) => {
// custom implementation
}
});
`d6c4455` #352 Thanks @eps1lon! - Support native labels in IE 11
`85f0032` #324 Thanks @juanca! - Consider for the name of its element.
f7c1981 #288 Thanks @eps1lon! - Drop node 13 support
We only stopped testing. Probability of breakage should be very low.
New policy:
Only active node versions are supported. Inactive node versions can stop working in a SemVer MINOR release.
fa53c51 #210 Thanks @eps1lon! - Implement accessbile description computation
import { computeAccessibleDescription } from "dom-accessibility-api";
const description = computeAccessibleDescription(element);
Warning: It always considers title attributes if the description is empty.
Even if the title attribute was already used for the accessible name.
This is fails a web-platform-test.
The other failing test is due to aria-label being ignored for the description which is correct by spec.
It's likely an issue with wpt.
The other tests are passing (13/15).
`d668f72` #273 Thanks @eps1lon! - fix: Concatenate text nodes without space
`e79f620` #208 Thanks @eps1lon! - Add support for node 14
737dfae #234 Thanks @willamzv! - Consider <legend> for the name of its <fieldset> element.
<fieldset>
<legend><em>my</em> fieldset</legend>
</fieldset>
Computing the name for this fieldset would've returned an empty string previously. It now correctly computes my fieldset following the accessible name computation for fieldset elements
969da7d #240 Thanks @eps1lon! - Reduce over-transpilation
Switched from
for-of to .forEach or a basic for looparray.push(...otherArray) to push.apply(array, otherArray)This removed a bunch of babel junk that wasn't needed.
d578329 #248 Thanks @eps1lon! - Consider <caption> for the name of its <table> element.
<table>
<caption>
<em>my</em>
table
</caption>
</table>
Computing the name for this table would've returned an empty string previously. It now correctly computes my table following the accessible name computation for table elements
`b421d9e` #168 Thanks @eps1lon! - fix: Use relative paths in exports field
`0897630` #155 - Publish version using ES6 modules allongside current CommonJS modules
`e80a1fb` #141 Thanks @eps1lon! - Support ES5 environments
Incomplete release. Please use 0.4.1 instead.
Incomplete release. Please use 0.4.1 instead.
### Minor Changes - 7f1ada0: Internal polish
eb86842: Add option to mock window.getComputedStyle
eb86842: Add option to mock window.getComputedStyle
This option has two use cases in mind:
window.getComputedStyle. We don't implement any because the returned CSSStyleDeclaration is only live in a browser. jsdom does not implement live declarations.Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →