Accessibility
WCAG AA is the baseline for all Ledger UI components and templates. Low-literacy and low-bandwidth contexts are first-class design constraints.
Standards
| Standard | Level | Status |
|---|---|---|
| WCAG 2.1 | AA | Baseline for all components |
| WCAG 2.1 | AAA | Target for contrast ratios |
| Section 508 | — | Compliant via WCAG AA |
| ARIA 1.2 | — | Used throughout |
Built-in Features
Color Contrast
All semantic color tokens meet WCAG AA contrast ratios (4.5:1 for normal text, 3:1 for large text). The dark theme maintains the same contrast guarantees.
// Token system enforces contrast
import { semanticColors } from '@gtcx/tokens';
// These pairs are guaranteed AA-compliant:
// semanticColors.text.primary on semanticColors.bg.default
// semanticColors.text.onPrimary on semanticColors.primaryKeyboard Navigation
Every interactive component supports full keyboard operation:
| Component | Keys |
|---|---|
| Button, Toggle, Switch | Enter, Space |
| Select, DropdownMenu | Arrow keys, Enter, Escape |
| Dialog, Sheet | Escape to close, Tab trap |
| Tabs | Arrow keys to switch, Enter to activate |
| Accordion | Enter/Space to toggle, Arrow keys to navigate |
| Calendar | Arrow keys for dates, Enter to select |
| Command | Type to filter, Arrow keys, Enter |
Focus Management
- Focus trap — Dialogs, Sheets, and AlertDialogs trap focus within the overlay
- Focus restoration — Focus returns to the trigger element when overlays close
- Focus indicators — Visible focus rings on all interactive elements (2px solid, primary color)
- Skip links —
MetronicLayoutincludes a skip-to-content link
Screen Readers
- All components use semantic HTML elements where possible
- ARIA attributes are applied automatically (roles, labels, descriptions, live regions)
- Status changes are announced via
aria-liveregions - The
toastsystem usesrole="status"for non-critical androle="alert"for errors
Reduced Motion
Components respect prefers-reduced-motion:
@media (prefers-reduced-motion: reduce) {
/* Transitions are shortened to near-instant */
/* Animations are disabled */
/* Scroll behavior becomes instant */
}Testing
Storybook Addon
Every story includes the @storybook/addon-a11y panel with automated axe-core checks:
pnpm --filter @gtcx/storybook dev # Check a11y panel per storyAutomated Suite
Run axe checks across all stories:
pnpm --filter @gtcx/storybook test:a11yIn CI, Storybook a11y runs as a blocking gate (storybook-a11y-audit). Latest full run on February 20, 2026: 70 suites passed and 202 tests passed with no accessibility violations.
Manual Checklist
For each new component or template, verify:
- Tab order follows visual order
- All interactive elements are reachable via keyboard
- Focus indicator is visible
- Color is not the only means of conveying information
- Text alternatives exist for non-text content
- Content is readable at 200% zoom
- Works with screen reader (VoiceOver on macOS)
RTL Support
All components support right-to-left layouts via CSS logical properties. Enable RTL through GtcxConfigProvider:
<GtcxConfigProvider direction="rtl" locale="ar">
<App />
</GtcxConfigProvider>See the RTL guide for details.