# Accessibility Accessibility is priority #1 in the design system hierarchy. Visual polish never overrides perceivable, operable UI. ## Color contrast - Body text (`foreground` on `background`) and muted text must remain readable in both themes. - Do not place `muted-foreground` on muted backgrounds without checking contrast. - Primary buttons use white label on `#29a19c`—do not lower primary opacity on labels. - Never convey meaning by color alone (pair with text/icon). ## Focus ring Visible focus is mandatory for keyboard users. | Control | Pattern | | --- | --- | | Button | `focus-visible:ring-[3px] focus-visible:ring-ring/40 focus-visible:border-ring` | | Input | `focus-visible:ring-[3px] focus-visible:ring-primary/25 focus-visible:border-primary` | | Generic | Prefer ring tokens; never `outline-none` without replacement | Do not remove focus styles from cards/links that are interactive. ## Keyboard navigation - All buttons, links, and controls reachable via Tab. - Menus / sheets / dialogs use Radix primitives (focus trap + Escape). - Maintain logical RTL tab order; avoid positive `tabIndex` except when necessary. - Icon-only controls need accessible names. ## ARIA expectations | Case | Requirement | | --- | --- | | Icon button | `aria-label` | | Decorative icon/image | `aria-hidden` / empty `alt` | | Expandable | `aria-expanded` + controls id | | Dialogs / sheets | Titled (`SheetTitle`, `DialogTitle`) — `sr-only` if visually hidden | | Invalid fields | `aria-invalid` + error text | | Landmark nav | `aria-label` on primary `