Restyle the whole app without re-testing every keyboard interaction.
Focus order, ARIA, and dismissal behavior live in the headless layer. Rip out the visual theme and none of that has to be re-verified.
Two packages, two jobs
One owns whether a dialog traps focus correctly. The other owns whether it's blue or dark-mode-aware. Neither has to change when you touch the other.
- 01
Headless components
Keyboard behavior, focus relationships, labels, state, and composition without a mandatory visual identity.
@askrjs/ui - 02
Themes
Styled components and named tokens for color, type, space, radius, and motion. Replace them without rewriting behavior.
@askrjs/themes
Ship the default theme, or rebuild it from tokens
The default theme is a real, usable design — not a scaffold you're expected to throw away. When you do want your own look, colors, spacing, radius, and motion are all token-driven, so a rebrand is a token change, not a component rewrite.
Icons, brand logos, charts, and a Monaco editor integration ship as separate packages you opt into. None of this replaces your accessibility testing — it gives you a tested starting point instead of building focus management from scratch.
Explore the theme system