Accessibility
Building inclusive experiences that work for everyone.
Principles
Perceivable
Information must be presentable in ways all users can perceive.
Operable
Interface components must be operable by all users.
Understandable
Information and UI operation must be understandable.
Robust
Content must be robust enough for assistive technologies.
We follow WCAG 2.1 Level AA guidelines as our minimum standard.
Color Contrast
Text must have sufficient contrast against its background. Minimum ratios: 4.5:1 for normal text, 3:1 for large text (18px+).
Abyss on Cloud
15.6:1
Lagoon on Cloud
9.2:1
Tide on Cloud
4.5:1
Cloud on Tide
4.5:1
Cloud on Abyss
15.6:1
Bubble on Cloud
2.1:1
- • Abyss text on Cloud/Breeze/Mist backgrounds
- • Cloud text on Tide/Abyss backgrounds
- • Lagoon text on Cloud/Breeze backgrounds
- • Tide text on Cloud background
- • Bubble text on any light background
- • Mist text on Cloud background
- • Sunshine text on Cloud (decorative only)
- • Low contrast color combinations
Focus States
All interactive elements must have visible focus indicators for keyboard navigation.
Buttons
focus:ring-2 focus:ring-tide focus:ring-offset-2Inputs
focus:border-tide focus:ring-1 focus:ring-tideLinks
focus:outline-none focus:ring-2 focus:ring-tide focus:ring-offset-2 roundedCards
focus-within:ring-2 focus-within:ring-tideNever use outline: none without providing an alternative focus indicator.
Keyboard Navigation
All functionality must be accessible via keyboard. Common patterns:
| Key | Action |
|---|---|
| Tab | Move focus to next focusable element |
| Shift + Tab | Move focus to previous focusable element |
| Enter / Space | Activate buttons, links, and controls |
| Escape | Close modals, dropdowns, and overlays |
| Arrow Keys | Navigate within menus, tabs, and lists |
| Home / End | Jump to first/last item in a list |
Screen Reader Support
ARIA Labels
aria-labelProvide text label for elements without visible text
<button aria-label="Close modal"> <XIcon /> </button>
aria-describedbyLink element to its description
<input aria-describedby="email-hint" /> <p id="email-hint">We'll never share your email</p>
Semantic HTML
<button>Clickable actions (not <div onClick>)<a href>Navigation links (not <span onClick>)<nav>Navigation regions (not <div class='nav'>)<main>Main content area (not <div class='main'>)<h1>-<h6>Section headings (not <p class='title'>)<ul>, <ol>Lists of items (not <div> with bullets)
Motion Sensitivity
Some users are sensitive to motion. Always respect the prefers-reduced-motion media query.
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}- • Color transitions
- • Opacity fades
- • Small scale changes
- • Parallax effects
- • Auto-playing animations
- • Large sliding transitions