TipTune is committed to providing an inclusive experience for all users, including those with disabilities. This document outlines the accessibility features implemented and guidelines for maintaining WCAG 2.1 Level AA compliance.
- Overview
- Keyboard Navigation
- Screen Reader Support
- Visual Accessibility
- Forms
- Media
- Testing
- Components
TipTune implements WCAG 2.1 Level AA accessibility standards, ensuring:
- All interactive elements are keyboard accessible
- Screen readers can navigate and understand content
- Color contrast meets minimum ratios (4.5:1 for normal text, 3:1 for large text)
- Animations respect user preferences for reduced motion
- Forms have proper labels and error associations
| Key | Action |
|---|---|
? |
Open keyboard shortcuts help |
Tab |
Navigate to next element |
Shift + Tab |
Navigate to previous element |
Escape |
Close modals |
| Key | Action |
|---|---|
Space |
Play/Pause |
← |
Previous track |
→ |
Next track |
↑ |
Increase volume |
↓ |
Decrease volume |
M |
Mute/Unmute |
- Skip Link: Press
Tabon page load to access "Skip to main content" link - Focus Trap: Modals trap focus within the dialog
- Focus Restoration: Focus returns to trigger element when modals close
- Visible Focus: All interactive elements show visible focus indicators
The app uses ARIA live regions to announce dynamic content changes:
- Polite announcements: Track changes, volume adjustments
- Assertive announcements: Critical errors, important state changes
- Proper heading hierarchy (h1 → h2 → h3)
- Landmark regions (
main,nav,header,footer) - Lists use semantic
<ul>and<li>elements - Forms use proper
<label>associations
aria-label: Provides accessible names for icon buttonsaria-labelledby: References visible labelsaria-describedby: Links descriptions to elementsaria-expanded: Indicates expandable statearia-pressed: Indicates toggle button statearia-current: Indicates current page/itemaria-live: Announces dynamic contentaria-busy: Indicates loading staterole="slider": For progress/volume barsrole="dialog": For modalsaria-modal: For modal dialogs
All text meets WCAG AA contrast requirements:
- Primary text on dark backgrounds: #FFFFFF on #0B1C2D
- Primary text on light backgrounds: #1E293B on #FFFFFF
- Accent colors maintain 4.5:1 ratio
Users who prefer reduced motion will have:
- All animations disabled
- Transitions set to instant
- Scroll behavior set to auto
This is controlled via CSS @media (prefers-reduced-motion: reduce).
The app supports prefers-contrast: more media query for users who need higher contrast.
- Text scales up to 200% without horizontal scrolling
- No text truncation or overlap at larger sizes
- Units use relative values (rem, em) where appropriate
- All form fields have associated
<label>elements - Labels are visible and positioned close to their fields
- Required fields are marked with visual and programmatic indicators
- Error messages are associated with fields via
aria-describedby - Errors are announced to screen readers
- Inline validation provides immediate feedback
- All meaningful images have descriptive
alttext - Decorative images use
alt=""oraria-hidden="true" - Album art includes artist and track information
- Custom controls are fully keyboard accessible
- Progress and volume sliders use
role="slider"with appropriate ARIA attributes - State changes (play/pause) are announced
The following tools are integrated:
- eslint-plugin-jsx-a11y: Linting rules for accessibility
- @axe-core/react: Runtime accessibility testing
Test with:
- Screen readers: NVDA (Windows), VoiceOver (macOS/iOS), JAWS
- Keyboard-only navigation
- Browser zoom at 100%, 150%, 200%
- High contrast mode
# Run ESLint with a11y rules
npm run lint
# axe-core runs automatically in development mode
npm run dev- Native
<button>element - Visible focus indicators
- Loading state with
aria-busy - Disabled state communicated to assistive tech
- Focus trap implementation
- Escape key closes modal
- Focus restoration on close
- Proper
role="dialog"andaria-modal - Backdrop click closes modal
- Full keyboard navigation
- Screen reader announcements for state changes
- Accessible sliders for progress and volume
- ARIA labels for all controls
Utility functions for:
- Focus management
- Screen reader announcements
- Focus trapping
- Reduced motion detection
- Time/number formatting for screen readers
- Always test with keyboard: Navigate using Tab, Enter, Space, Arrow keys
- Use semantic HTML: Prefer native elements over custom implementations
- Provide text alternatives: All non-text content needs alternatives
- Don't rely on color alone: Use icons, text, or patterns in addition to color
- Test with screen readers: Regular testing with actual assistive technology
- Run automated tests: Fix all a11y linting errors before committing
- Document accessibility features: Update this doc when adding new features
If you encounter accessibility barriers, please report them by creating an issue on GitHub with the label accessibility.
Last updated: February 2026