Accessible component showcase

Five core widgets built to the WAI-ARIA Authoring Practices — correct focus management, live state, and honest ARIA wiring. No mouse required: Tab through the page and try the keys listed in each contract.

  • Vanilla JS
  • Zero dependencies
  • Reduced-motion aware

Modal dialog

A modal that owns focus while open: Tab and Shift+Tab cycle inside, the page behind goes inert, and focus lands back on the trigger when it closes.

Tab / Shift+Tab cycle inside Esc closes backdrop click closes focus returns to trigger

Dropdown menu

A command menu with roving tabindex. Arrow keys move between items, Enter or Space performs the action, and Escape sends focus back to the button.

↓ opens on first item ↑↓ navigate (wraps) Home/End jump Enter selects Esc closes → button Tab closes, moves on

Tabs

One tab in the tab order, arrows to travel, and the hidden attribute — not CSS — keeping inactive panels out of the accessibility tree.

Praxis UI ships five core primitives. Each one exposes its state through ARIA that mirrors what you see on screen — if it looks open, it announces open.

Read the tab pattern spec

←→ switch tabs Home/End first / last only the active tab is tabbable panel content reachable by Tab

Combobox

An autocomplete input using the aria-activedescendant pattern — the listbox is never focusable; the highlight is announced through the input's own ARIA state.

↓ opens the list type to filter ↑↓ move highlight Enter selects Esc closes + reverts focus-out closes

Accordion

Disclosure buttons that animate height with the Web Animations API — hidden is only toggled when the animation finishes, so assistive tech never sees a half-open region.

Enter / Space toggle multiple panels may stay open animation respects prefers-reduced-motion