Accessibility

Fidus is built for everyone. We follow WCAG 2.1 Level AA standards to ensure our application is usable by people with disabilities, including those using screen readers, keyboard navigation, and assistive technologies.

WCAG 2.1 Level AA Compliance

We commit to meeting Web Content Accessibility Guidelines (WCAG) 2.1 Level AA. This includes:

Perceivable

Information presented in ways users can perceive (text alternatives, captions, color contrast)

Operable

Interface components operable by everyone (keyboard navigation, sufficient time, no seizures)

Understandable

Information and operation understandable (readable, predictable, input assistance)

Robust

Content robust enough to work with assistive technologies (valid HTML, ARIA)

Color Contrast

All text meets WCAG 2.1 AA contrast requirements:

Normal Text (14px+)

Minimum contrast ratio

4.5:1

Large Text (18px+ or 14px+ bold)

Minimum contrast ratio

3:1

UI Components & Graphics

Icons, borders, focus indicators

3:1

Testing Contrast

Tools:

  • • WebAIM Contrast Checker
  • • Chrome DevTools Accessibility panel
  • • Figma Contrast plugin

Keyboard Navigation

All interactive elements must be keyboard accessible:

TabNavigate forward

Move focus to next interactive element

Shift + TabNavigate backward

Move focus to previous interactive element

Enter / SpaceActivate

Activate buttons, links, toggles

EscapeClose/Cancel

Close modals, dismiss cards

Arrow KeysNavigate within

Navigate within radio groups, tabs, menus

Interactive Keyboard Navigation Demo

Try navigating through these buttons using Tab, Shift+Tab, and Enter:

Focus Indicators

All focusable elements have visible focus indicators:

/* Global focus styles */
*:focus-visible {
  outline: 2px solid var(--color-primary);
  outline-offset: 2px;
}

Screen Reader Support

Semantic HTML

Use proper HTML elements for their intended purpose:

✓ Good

<button onClick={...}>
  Submit
</button>

<nav>
  <a href="/dashboard">
    Dashboard
  </a>
</nav>

✗ Bad

<div onClick={...}>
  Submit
</div>

<div>
  <div onClick={...}>
    Dashboard
  </div>
</div>

ARIA Labels

Provide labels for elements when visual text isn't sufficient:

// Icon-only button
<button aria-label="Close card">
  <X className="h-4 w-4" />
</button>

// Decorative image
<img src="banner.jpg" alt="" role="presentation" />

// Form input
<label htmlFor="email">Email</label>
<input id="email" type="email" aria-required="true" />

ARIA Roles & States

Use ARIA attributes to communicate state changes:

aria-expanded="true|false"

Indicates whether collapsible content is expanded

aria-selected="true|false"

Indicates selection state (tabs, options)

aria-disabled="true|false"

Indicates disabled state

aria-live="polite|assertive"

Announces dynamic content changes

Screen Reader Testing Guide

Testing with screen readers is essential for ensuring your application is truly accessible. Here's how to test with the most common screen readers:

VoiceOver (macOS/iOS)

Enable: System Preferences → Accessibility → VoiceOver

Keyboard Shortcut: Cmd + F5

Common Commands:

  • VO + Right Arrow - Navigate to next item
  • VO + Left Arrow - Navigate to previous item
  • VO + Space - Activate item (click)
  • VO + A - Read entire page
  • VO + H - Next heading
  • VO + U - Open rotor (navigation menu)

NVDA (Windows - Free)

Download: nvaccess.org

Start: Ctrl + Alt + N

Common Commands:

  • Down Arrow - Next item
  • Up Arrow - Previous item
  • Enter - Activate link/button
  • H - Next heading
  • Shift + H - Previous heading
  • B - Next button
  • Insert + Down Arrow - Read all from cursor

JAWS (Windows - Commercial)

Download: freedomscientific.com

Note: Most widely used professional screen reader, similar commands to NVDA

Common Commands:

  • Down Arrow - Next line
  • H - Next heading
  • T - Next table
  • F - Next form field
  • Insert + F5 - List form fields
  • Insert + F6 - List headings

Testing Checklist for Screen Readers

  • ✓ All interactive elements are announced with their role (button, link, etc.)
  • ✓ Form inputs have clear labels that are read before the input
  • ✓ Error messages are announced when validation fails
  • ✓ Dynamic content changes are announced (use aria-live)
  • ✓ Headings create a logical document outline
  • ✓ Images have descriptive alt text (or alt="" if decorative)
  • ✓ Navigation can be done using heading/landmark shortcuts
  • ✓ Modal dialogs trap focus and announce their role

Touch Targets

All interactive elements meet minimum touch target size:

Minimum Size: 44x44 pixels

Applies to:

  • • Buttons (primary, secondary, icon buttons)
  • • Links (when standalone)
  • • Form inputs (checkboxes, radio buttons)
  • • Toggle switches
  • • Close buttons (X)
  • • Swipeable areas on cards

Forms & Input

Labels & Descriptions

<label htmlFor="username">Username</label>
<input
  id="username"
  type="text"
  aria-describedby="username-hint"
  aria-required="true"
/>
<span id="username-hint">
  Must be 3-20 characters
</span>

Error Messages

<input
  id="email"
  type="email"
  aria-invalid="true"
  aria-describedby="email-error"
/>
<span id="email-error" role="alert">
  Please enter a valid email address
</span>

Reduced Motion

Respect user preferences for reduced motion. Users who enable this setting should see instant state changes:

@media (prefers-reduced-motion: reduce) {
  * {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}

// In Tailwind
<div className="transition-all motion-reduce:transition-none">

Accessibility Testing Checklist

Use this comprehensive checklist to ensure your features meet accessibility standards before deployment:

Automated Testing Tools

Automated tools catch 30-50% of accessibility issues. Use them as a first pass, then perform manual testing:

axe DevTools (Browser Extension)

Industry-standard accessibility testing tool available for Chrome, Firefox, and Edge

Install: Available in Chrome Web Store and Firefox Add-ons

Usage: Open DevTools → Axe DevTools tab → "Scan All of My Page"

Features:

  • • Automated full-page scans
  • • Detailed issue descriptions with remediation guidance
  • • WCAG 2.1 Level A, AA, and AAA compliance checks
  • • Highlight issues directly on page

WAVE (Web Accessibility Evaluation Tool)

Visual accessibility testing tool by WebAIM

Access: wave.webaim.org or Browser Extension

Usage: Enter URL or use extension to scan current page

Features:

  • • Visual feedback with icons on page
  • • Color-coded issues (errors, alerts, features)
  • • Contrast checker
  • • Works on live and local sites

Lighthouse (Chrome DevTools)

Built-in accessibility auditing in Chrome DevTools

Access: Chrome DevTools → Lighthouse tab

Usage: Select "Accessibility" category → Generate report

Features:

  • • Comprehensive accessibility score (0-100)
  • • Performance impact analysis
  • • Mobile and desktop testing
  • • CI/CD integration available

Pa11y CI (Automated Testing)

Command-line tool for accessibility testing in CI/CD pipelines

Install: npm install -g pa11y-ci

Usage: pa11y-ci --sitemap https://your-site.com/sitemap.xml

Features:

  • • Test multiple URLs automatically
  • • Configurable WCAG levels
  • • CI/CD integration (GitHub Actions, Jenkins)
  • • JSON/HTML reports

Related Components

Resources

Key Takeaways

  • ✅ WCAG 2.1 Level AA compliance required for all features
  • ✅ 4.5:1 contrast ratio for normal text, 3:1 for large text and UI components
  • ✅ All features must be fully keyboard accessible with visible focus indicators
  • ✅ 44x44px minimum touch target size for all interactive elements
  • ✅ Use semantic HTML and proper ARIA attributes for screen reader support
  • ✅ Test with screen readers (VoiceOver, NVDA, JAWS) before release
  • ✅ Run automated tools (axe DevTools, WAVE, Lighthouse) and fix critical issues
  • ✅ Respect prefers-reduced-motion for all animations and transitions
  • ✅ Provide clear labels, error messages, and form validation feedback
  • ✅ Maintain logical heading hierarchy and document structure