Guides

Accessibility

Keyboard operation, associated labels, focus rings and WCAG 2.x contrast in light, dark and forced-colors.

The bar

Texuli components target WCAG 2.1 A/AA. Contrast is measured with WCAG 2.x algorithms — APCA is intentionally out of scope. Forced-colors maps use system keywords (CanvasText, ButtonText, Highlight), not decorative yellows that fail on Canvas.

Labels and names

Prefer a visible label. When the control already has accessible text, do not add a conflicting aria-label. Field wires id, aria-describedby and aria-invalid for you.

import { Field } from 'texuli/field';
import { Input } from 'texuli/input';

<Field label="Workspace name" description="Shown on invoices." required>
  {#snippet children(control)}
    <Input {...control.props} bind:value={name} />
  {/snippet}
</Field>

Keyboard

Every interactive control is reachable by Tab, activates with Enter or Space where expected, and exposes a visible focus ring from --tx-ring. Composite widgets (menus, grids, tabs) use roving tabindex from @texuli/core/roving.

Live controls

Live · labels, description and keyboard

Announced with the control via aria-describedby.

Tab to the field, switch and buttons. Focus rings come from theme tokens (--tx-ring), not custom outlines.