Introduction
Accessible React primitives for token-aligned product interfaces with predictable behavior.
Aria UI is a collection of accessible React primitives for building product interfaces that need predictable behavior and local design-system control. It gives you composable component parts, keyboard-aware interactions, and state attributes you can style with your own Tailwind CSS classes and tokens.
Use Aria UI when you want the interaction model handled by the component, but the visual language to stay owned by your application. Start with one primitive, wire it into your existing UI, and expand from there as your interface grows.
What Aria UI provides
- composable primitives for overlays, forms, navigation, feedback, and structured views
- accessible roles, states, keyboard behavior, and focus management where the pattern requires them
- token-aligned examples that map color, spacing, radii, shadows, and typography to your product system
- small package boundaries so components can be adopted incrementally
When to use Aria UI
Build from primitives when you need more control than a styled component kit can offer, but you still want interaction behavior to be consistent and tested. Aria UI is a good fit for design systems, internal tools, SaaS interfaces, dashboards, editors, and other product surfaces where details like focus return, keyboard navigation, and disabled states need to behave the same way everywhere.
It is also useful when you are migrating an existing interface. Because each package is scoped to one component family, you can replace a single menu, dialog, input, or navigation pattern without committing the whole application to a new visual system.
How the primitives fit together
Aria UI components are intentionally split into parts such as Root, Trigger, Content, Item, and Group. Those parts share context internally, expose state through attributes, and leave layout decisions to the consuming app.
This structure keeps the API flexible without making every component a blank slate. For example, a trigger can own the open state for a floating surface, content can handle dismissal and focus behavior, and individual items can expose selection or disabled state for styling. You compose the parts that match the interface you are building.
Styling with tokens
The examples use Tailwind CSS classes because they are easy to copy, inspect, and adapt. The important contract is not Tailwind itself, but the token-aligned approach: colors, spacing, radii, typography, and shadows should map back to your product system.
Aria UI does not inject a finished visual theme. Components provide behavior, accessibility attributes, and predictable DOM structure; your app supplies the final density, contrast, motion, and brand expression.
Design principles
Aria UI keeps behavior and presentation separate. Components expose the state and interaction contracts, while your app decides the final markup structure, styling, and layout density.
The library favors native HTML first, WAI-ARIA patterns when a richer widget needs them, and predictable focus behavior across transient surfaces. That keeps components practical for product teams without hiding the accessibility model.
Adoption path
Adoption can be incremental. Start with a component that has meaningful interaction complexity, such as Dialog, Popover, Select, or Context Menu, then style the parts to match your current system. Once the pattern is stable, reuse the same tokens and conventions across related components.
For teams building a design system, the component docs can act as implementation references. Use the live examples to inspect expected states, the anatomy sections to understand part composition, and the accessibility notes to confirm keyboard and focus behavior before rolling a primitive into a shared component wrapper.
Where to go next
- Browse the component docs to see the available primitives and examples.
- Read the accessibility model to understand the keyboard, semantics, and focus contracts Aria UI optimizes for.
- Use the CLI to install editable component source into a React project.