Clidey UXDocs

Accessible product interfaces

Radix-backed controls provide keyboard and focus behavior. Accessible products also need labels, understandable content, appropriate structure, and testing in context.

Name every control#

TSX

import { Button, IconSearch, Input, Label } from '@clidey/ux';

<Label htmlFor="project-search">Find a project</Label>
<Input id="project-search" type="search" />
<Button size="icon" aria-label="Search projects"><IconSearch /></Button>

A placeholder is supporting text, not a label. Decorative icons should not repeat a control's accessible name. Use words alongside status colors.

Keep keyboard paths predictable#

  • Tab through the main workflow without using a mouse.
  • Check Enter and Space on actions and arrow keys in composite widgets.
  • Open and dismiss overlays, then confirm focus returns to the trigger.
  • Keep a visible focus indicator against every palette surface.
  • Avoid a document-level keyboard shortcut while someone is typing in a field.

Explain dialogs and validation#

Provide DialogTitle and DialogDescription, including when their visual presentation is subtle. Associate help and error text with fields using aria-describedby. Set aria-invalid when a value fails validation, and announce asynchronous failure without clearing the user's input.

Test themes and motion#

Review light and dark, the intended palettes, high zoom, narrow windows, and reduced motion. Palette selection is not a guarantee that every custom combination meets your contrast needs. Give chart series labels or patterns in addition to color.

Verify behavior, not implementation#

In component tests, query by role and accessible name. In a browser, complete a real task with only the keyboard. Include loading, empty, error, and disabled states. Automated checks help find issues; they do not replace a manual pass with assistive technology.

Was this page helpful?