Skip to content

Enable vuejs-accessibility lint rules and remediate violations across Vue files#14640

Open
rtibblesbot wants to merge 8 commits into
learningequality:developfrom
rtibblesbot:issue-14637-af778f
Open

Enable vuejs-accessibility lint rules and remediate violations across Vue files#14640
rtibblesbot wants to merge 8 commits into
learningequality:developfrom
rtibblesbot:issue-14637-af778f

Conversation

@rtibblesbot
Copy link
Copy Markdown
Contributor

@rtibblesbot rtibblesbot commented Apr 23, 2026

Plan: Enable eslint-plugin-vuejs-accessibility in kolibri-format's ESLint flat config and remediate all resulting violations across the ~612 Vue files in the codebase.

  • Add the dependency and bump the version
  • Configure the plugin in ESLint flat config
  • Run lint and catalog all violations
  • Fix alt-text violations
  • Fix click-events-have-key-events violations
  • Fix no-static-element-interactions violations
  • Fix mouse-events-have-key-events violations
  • Fix interactive-supports-focus violations
  • Fix label-has-for violations
  • Fix remaining violation categories
  • Handle violations that cannot be fixed at the template level
  • Final lint verification

status

Summary

Enable eslint-plugin-vuejs-accessibility in kolibri-format and remediate the resulting violations across Kolibri's Vue files.

  • Added eslint-plugin-vuejs-accessibility@^2.5.0 to kolibri-format.
  • Registered the flat/recommended preset in eslint.config.mjs.
  • Fixed violations across ~75 .vue files: alt-text, click-events-have-key-events, no-static-element-interactions, mouse-events-have-key-events, interactive-supports-focus, label-has-for, iframe-has-title, media-has-caption.
  • no-autofocus violations suppressed with inline disables — every instance is intentional focus management (first input in a modal, picture-password selector autofocus).
  • Applied pre-existing kolibri-format auto-fixes to kolibri-build (import ordering, arrow-function parens, trailing commas) — triggered by pre-commit when the ESLint config was updated; no semantic changes.

Note on screenshots: all template changes add ARIA attributes and keyboard handlers with no visual effect. A dev server was not available in this environment; the verifiable evidence is pnpm run lint-frontend passing with zero vuejs-accessibility errors.

References

Closes #14637

Reviewer guidance

Run pnpm run lint-frontend — should exit 0 with no vuejs-accessibility errors.

Risky areas:

  • SafeHtmlImage.vue / Lightbox.vue: keyboard focus management added (tab-trap, focus restoration on close) — verify focus trap and restoration behave correctly in the presentation player.
  • no-autofocus inline disables: confirm each suppressed instance is genuinely intentional focus-on-open behaviour, not noise suppression.

AI usage

Implemented with Claude Code. Violations were catalogued by rule frequency, fixed category-by-category in separate commits, and each file was verified with pre-commit run --files before staging.


@rtibblesbot's comments are generated by an LLM, and should be evaluated accordingly

How was this generated?
  • Ran pre-flight CI checks (lint, format, tests) and verified all pass
  • Rebased onto the target branch and resolved any conflicts
  • Reorganized commit history into clean, logical commits
  • Audited the diff to ensure only issue-relevant files are changed
  • Built PR body from the repository's PR template with evidence blocks

@github-actions github-actions Bot added DEV: renderers HTML5 apps, videos, exercises, etc. APP: Device Re: Device App (content import/export, facility-syncing, user permissions, etc.) APP: Facility Re: Facility App (user/class management, facility settings, csv import/export, etc.) APP: Learn Re: Learn App (content, quizzes, lessons, etc.) APP: Coach Re: Coach App (lessons, quizzes, groups, reports, etc.) APP: User Re: User app (sign-in, sign-up, user profile, etc.) APP: Setup Wizard Re: Setup Wizard (facility import, superuser creation, settings, etc.) DEV: frontend SIZE: very large labels Apr 23, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 23, 2026

npm Package Versions

Warning

The following packages have changed files but no version bump:

Package Version Changed files
kolibri-build 1.1.2 3
kolibri-format 2.3.0 2
kolibri 0.18.0 6

If these changes affect published code, consider bumping the version.

@radinamatic radinamatic added the TAG: a11y Affecting accessibility label Apr 23, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 23, 2026

@rtibblesbot rtibblesbot marked this pull request as ready for review April 23, 2026 02:45
@rtibblesbot rtibblesbot force-pushed the issue-14637-af778f branch from c4c8e82 to dfa36f5 Compare May 7, 2026 14:04
@rtibblesbot rtibblesbot force-pushed the issue-14637-af778f branch from dfa36f5 to cf09194 Compare May 7, 2026 15:03
@rtibblesbot rtibblesbot force-pushed the issue-14637-af778f branch from cf09194 to 9b5a1c2 Compare May 21, 2026 20:50
rtibblesbot and others added 8 commits May 21, 2026 14:20
Adds eslint-plugin-vuejs-accessibility v2.5.0 as a dependency of
kolibri-format, spreads flat/recommended into eslint.config.mjs
(after pluginJestDom, before eslintConfigPrettier), and bumps the
kolibri-format version from 2.2.0 to 2.3.0.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Running kolibri-format --write during the a11y remediation pass also
fixed pre-existing formatting violations in three kolibri-build files.
Committed separately so the a11y diff stays uncluttered.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…g elements

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… focus management

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ents

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…media captions

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…th form controls

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…focus management

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@rtibblesbot rtibblesbot force-pushed the issue-14637-af778f branch from 9b5a1c2 to a417a09 Compare May 21, 2026 21:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

APP: Coach Re: Coach App (lessons, quizzes, groups, reports, etc.) APP: Device Re: Device App (content import/export, facility-syncing, user permissions, etc.) APP: Facility Re: Facility App (user/class management, facility settings, csv import/export, etc.) APP: Learn Re: Learn App (content, quizzes, lessons, etc.) APP: Setup Wizard Re: Setup Wizard (facility import, superuser creation, settings, etc.) APP: User Re: User app (sign-in, sign-up, user profile, etc.) DEV: frontend DEV: renderers HTML5 apps, videos, exercises, etc. SIZE: large TAG: a11y Affecting accessibility

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Enable Vue accessibility linting via eslint-plugin-vuejs-accessibility

2 participants