Skip to content

feat(a11y): fix WCAG 2.2 accessibility issues (wave 1 + 2) - #2612

Merged
kolaente merged 12 commits into
mainfrom
feat-a11y-fixes
Apr 21, 2026
Merged

feat(a11y): fix WCAG 2.2 accessibility issues (wave 1 + 2)#2612
kolaente merged 12 commits into
mainfrom
feat-a11y-fixes

Conversation

@tink-bot

Copy link
Copy Markdown
Collaborator

Fixes 12 WCAG 2.2 accessibility findings from an a11y audit — all frontend-only changes.

Critical (Level A):

  • Skip-to-content link + <main> landmark on auth pages (WCAG 2.4.1)
  • aria-label on all icon-only buttons (WCAG 4.1.2)
  • aria-live region on toast notifications (WCAG 4.1.3)
  • aria-invalid / aria-describedby / role="alert" on form errors (WCAG 3.3.1)

Major:

  • aria-label on modal dialogs via attribute inheritance (WCAG 4.1.2)
  • autocomplete="new-password" on register form (WCAG 1.3.5)
  • aria-label on color picker and sort select (WCAG 3.3.2)
  • Heading hierarchy: single H1 per page, breadcrumb <nav> instead of <h6> (WCAG 1.3.1)

Minor:

  • Logo link aria-label matches visible text (WCAG 2.5.3)
  • Descriptive aria-label on task checkboxes (WCAG 2.4.6)
  • font-weight: 700 on active sidebar link for non-color distinction (WCAG 1.4.1)

Test plan

  • Tab through the login page — skip link appears on first Tab press and jumps to main content
  • Tab through authenticated pages — icon-only buttons announce their purpose in screen reader
  • Open a modal dialog — screen reader announces dialog name
  • Register page password field has autocomplete="new-password" in DOM
  • Active sidebar item is visually bold in addition to colored

@github-actions github-actions Bot added area/frontend Frontend-only code or UI work concern/accessibility Accessibility / a11y, keyboard nav, screen reader labels Apr 12, 2026
@github-actions

github-actions Bot commented Apr 12, 2026

Copy link
Copy Markdown

Preview Deployment

Preview deployments for this PR are available at:

URL Tag Commit
https://pr-2612.preview.vikunja.dev ghcr.io/go-vikunja/vikunja:pr-2612 latest
https://sha-9d25864b2526c732849d0b0acae2d458034ca789.preview.vikunja.dev ghcr.io/go-vikunja/vikunja:sha-9d25864b2526c732849d0b0acae2d458034ca789 9d25864
https://sha-b90e67d7ca009e5a893271fdd33f346b2b2b193b.preview.vikunja.dev ghcr.io/go-vikunja/vikunja:sha-b90e67d7ca009e5a893271fdd33f346b2b2b193b b90e67d
https://sha-2d2dbf67a0f6e5770c703fd99dafe38add628e54.preview.vikunja.dev ghcr.io/go-vikunja/vikunja:sha-2d2dbf67a0f6e5770c703fd99dafe38add628e54 2d2dbf6
https://sha-010be2824983ba4e13e6ed7e496d98b6eed78b87.preview.vikunja.dev ghcr.io/go-vikunja/vikunja:sha-010be2824983ba4e13e6ed7e496d98b6eed78b87 010be28
https://sha-540beefabcc74f00b69bd23d455d765e390509fb.preview.vikunja.dev ghcr.io/go-vikunja/vikunja:sha-540beefabcc74f00b69bd23d455d765e390509fb 540beef

The preview environment will start automatically on first visit. Subsequent pushes to this PR will update the pr-2612 image — the preview picks up the new version on restart. The per-commit URLs point to a specific version and will not change.

Run locally with Docker
docker pull ghcr.io/go-vikunja/vikunja:pr-2612
docker run -p 3456:3456 ghcr.io/go-vikunja/vikunja:pr-2612

Last updated for commit 9d25864

kolaente added 12 commits April 21, 2026 13:30
Adds a visually-hidden skip-to-content link as the first focusable
element. Adds id='main-content' to the <main> element. Changes
<section> to <main> on auth pages for proper landmark navigation.

Fixes WCAG 2.4.1 (Bypass Blocks).
Adds aria-label to sidebar toggle, mobile overlay, banner close,
modal close, quick actions close, task detail close, and dropdown
trigger buttons. Adds triggerLabel prop to Dropdown component.

Fixes WCAG 4.1.2 (Name, Role, Value).
Adds role='status' and aria-live='polite' to the notification
container so screen readers announce status messages.

Fixes WCAG 4.1.3 (Status Messages).
Passes aria-label to the <dialog> element via attribute inheritance
so screen readers announce the dialog's purpose.

Fixes WCAG 4.1.2 (Name, Role, Value).
Adds autocomplete prop to Password component (defaults to
'current-password'). Register page passes 'new-password' so
password managers offer to generate a strong password.

Fixes WCAG 1.3.5 (Identify Input Purpose).
Changes aria-label from 'Overview' to 'Vikunja home' so the
accessible name includes the visible text.

Fixes WCAG 2.5.3 (Label in Name).
Adds aria-invalid, aria-describedby, and role='alert' to error
messages in FormField and Password components so screen readers
announce validation errors.

Fixes WCAG 3.3.1 (Error Identification).
Adds aria-label to the color input and sort select elements
so screen readers announce their purpose.

Fixes WCAG 3.3.2 (Labels or Instructions).
- Home: greeting H2 → H1 (page needs a top-level heading)
- Task detail: task ID H1 → span (only title should be H1)
- Task detail: H6 breadcrumb → nav element
- App header: project title H1 → span (avoids duplicate H1)

Fixes WCAG 1.3.1 (Info and Relationships) and 2.4.6 (Headings).
Adds aria-label='Mark {task} as done' to task checkboxes so
screen readers can distinguish between them. Passes ariaLabel
prop through FancyCheckbox → BaseCheckbox → input.

Fixes WCAG 2.4.6 (Headings and Labels).
Wire aria-invalid, aria-describedby and role=alert on the form
primitive components so errors raised directly on FormInput or
FormSelect are announced by assistive tech and programmatically
linked to the control.
@kolaente
kolaente enabled auto-merge April 21, 2026 11:40
@kolaente
kolaente added this pull request to the merge queue Apr 21, 2026
Merged via the queue into main with commit 2829a85 Apr 21, 2026
37 checks passed
@kolaente
kolaente deleted the feat-a11y-fixes branch April 21, 2026 11:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/frontend Frontend-only code or UI work concern/accessibility Accessibility / a11y, keyboard nav, screen reader

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants