Skip to content

[Improvement] Add comprehensive accessibility (a11y) improvements across all dashboard components #222

Description

@Sendi0011

Getting Started

  1. Fork the repository: https://github.com/JointSave-org/Joint_Save
  2. Clone your fork:
git clone https://github.com/<your-username>/Joint_Save.git
cd Joint_Save
  1. Create a new branch:
git checkout -b improve/accessibility-audit

Overview

JointSave's dashboard has several accessibility gaps that prevent users relying on screen readers, keyboard navigation, or other assistive technologies from using the platform effectively.

Checked key components and found:

  • frontend/components/group/group-details.tsx: pool status badges are visual-only (no aria-label)
  • frontend/components/dashboard/dashboard-tabs.tsx: tabs are not keyboard navigable (no arrow key support)
  • frontend/components/notifications/notification-bell.tsx: dropdown is not focus-trapped when open
  • frontend/components/explore/pool-card.tsx: pool cards are not announced by screen readers
  • frontend/app/dashboard/page.tsx: no skip-to-content link
  • Color contrast issues on several text elements using low-opacity Tailwind classes

This issue conducts a comprehensive accessibility audit and fixes the identified issues, targeting WCAG 2.1 AA compliance.

Requirements

Global Fixes

  • Add skip-to-content link at the top of the dashboard layout
  • Ensure all pages have proper <h1> headings (only one per page)
  • Add lang attribute to <html> tag (dynamic based on i18n locale)

Component-Level Fixes

  1. Tabs: Add role="tablist", role="tab", aria-selected, aria-controls, keyboard navigation with Left/Right arrow keys
  2. Notification Bell: Add aria-label, aria-expanded, focus trapping, close on Escape
  3. Pool Cards: Add role="article", aria-label with pool name and stats, focusable with Enter key
  4. Status Badges: Add aria-label to all status badges (color is never the only indicator)
  5. Forms: All fields have associated <label> elements, error messages linked via aria-describedby, required fields marked with aria-required
  6. Modal Dialogs: Focus trapped, focus returned on close, aria-modal="true", role="dialog"
  7. Buttons and Links: All icon-only buttons get aria-label

Color Contrast Fixes

  • Audit all text elements for WCAG AA contrast ratio (4.5:1)
  • Replace text-gray-400 on white backgrounds with text-gray-500 or darker

Testing

  • Install @axe-core/react for development-time accessibility warnings
  • Run axe audit on all dashboard pages and fix reported violations
  • Verify all fixes with keyboard-only navigation

Acceptance Criteria

  • Skip-to-content link is present and functional
  • All tabs are keyboard navigable with arrow keys
  • Notification dropdown is focus-trapped and closes on Escape
  • Pool cards have proper ARIA labels and are announced by screen readers
  • All form fields have associated labels and error descriptions
  • All modals trap focus and return focus on close
  • All icon-only buttons have aria-labels
  • Color contrast meets WCAG AA (4.5:1) for all text
  • axe-core reports zero critical violations on dashboard pages
  • All critical user flows are usable with keyboard only

Metadata

Metadata

Assignees

Labels

GrantFox OSSIssue tracked in GrantFox OSSMaybe RewardedIssue may be eligible for a GrantFox rewardThird CampaignCampaign: Third Campaignimprovementmedium-complexityNot too complex, Few files and some planning needed

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions