You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Body:
New rules (36 → 40):
- anchor-is-valid: flags missing/invalid href and onClick-without-href
- no-interactive-element-to-noninteractive-role: prevents role=none/presentation
stripping semantics from button, a[href], input, select, textarea, summary
- no-noninteractive-element-to-interactive-role: requires tabIndex + keyboard
handler when adding interactive ARIA roles to static elements
- no-redundant-roles: flags role attributes matching the element's implicit
ARIA role (e.g. <button role=button>) with auto-fix suggestion
Bug fixes:
- image-alt: extend coverage to <input type=image> and <area>; allow empty
alt on <area> without href (inactive image map areas)
- link-text: fix false positive on <a><img alt=Home /></a> — img alt
provides an accessible name for the link
- form-label: remove cross-file false positive; a control with an id is
now treated as having a labeling mechanism (label may be in another file)
Bumps version to 0.15.0. recommended config: 24 → 28 rules,
strict config: 36 → 40 rules.
Copy file name to clipboardExpand all lines: CHANGELOG.md
+26-5Lines changed: 26 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,21 +7,42 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
8
8
## [Unreleased]
9
9
10
+
## [0.15.0] - 2026-02-23
11
+
12
+
### Added
13
+
- 4 new accessibility rules (total: 40 rules)
14
+
-`anchor-is-valid` — anchors must have a real href; flags empty `""`, `"#"`, and `javascript:` hrefs, and onClick-without-href (prefer `<button>`)
15
+
-`no-interactive-element-to-noninteractive-role` — prevents `role="none"` or `role="presentation"` on interactive elements (`button`, `a[href]`, `input`, `select`, `textarea`, `summary`)
16
+
-`no-noninteractive-element-to-interactive-role` — prevents interactive ARIA roles (button, link, checkbox, etc.) on non-interactive elements without both `tabIndex` and a keyboard event handler
17
+
-`no-redundant-roles` — flags explicit `role` attributes that match the element's implicit ARIA role (e.g. `<button role="button">`, `<nav role="navigation">`) with auto-fix suggestion
18
+
10
19
### Fixed
20
+
-`image-alt` now also checks `<input type="image">` and `<area>` elements, not just `<img>`; empty alt on `<area>` without `href` is correctly allowed
21
+
-`link-text` no longer false-positives on `<a><img alt="Home" /></a>` — an img child with a non-empty alt provides an accessible name for the link
22
+
-`form-label` no longer false-positives when a form control has an `id` but its `<label for>` is in a different component file; presence of `id` is now treated as sufficient (label association may be elsewhere)
23
+
24
+
### Changed
25
+
-`recommended` config grows from 24 → 28 rules (new: `anchor-is-valid` as error, `no-interactive-element-to-noninteractive-role` as error, `no-noninteractive-element-to-interactive-role` as warn, `no-redundant-roles` as warn)
26
+
-`strict` config grows from 36 → 40 rules (all new rules set to error)
Copy file name to clipboardExpand all lines: package.json
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
{
2
2
"name": "eslint-plugin-test-a11y-js",
3
-
"version": "0.14.0",
3
+
"version": "0.15.0",
4
4
"description": "ESLint accessibility (a11y) plugin for React, Vue, and JSX with flat-config (ESLint v9+) support and a matching runtime A11yChecker API. Alternative to eslint-plugin-jsx-a11y for modern design systems.",
0 commit comments