Restyle the app without rebuilding its interaction model.

Focus management, ARIA, and dismissal behavior live in the headless layer. A visual theme can change independently, while the finished composition still receives keyboard, screen-reader, contrast, and focus-visibility testing.

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.

  1. 01

    Headless components

    Keyboard behavior, focus relationships, labels, state, and composition without a mandatory visual identity.

    @askrjs/ui
  2. 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.

View the theme system

Ship the default theme, or make it yours.