Radix Primitives
Unstyled, accessible behaviour for the components that are hard to get right
Radix Primitives implements the interaction and accessibility layer for dialogs, menus, popovers, tooltips, selects and the rest of the genuinely difficult components, with no styling at all. It is the layer most polished React libraries, including shadcn/ui, are built on.
What you are buying
Focus management, keyboard navigation, screen reader semantics, portal and layering behaviour, and the dozens of edge cases in each. These are the parts that take weeks to discover and are almost never finished in a hand rolled component.
Everything ships unstyled, which is the point. You keep every visual decision and give up only the decisions you should not be making.
Where the friction is
The composition style is verbose. A dialog is five or six nested components before you have written any of your own markup, which is correct and still feels heavy the first several times.
Because it owns behaviour and not appearance, an unstyled Radix app looks broken until you style it. Budget for that in an evaluation rather than judging the first render.
Reach for it when
- you have your own visual language and need the behaviour underneath it
- accessibility is a requirement rather than an aspiration
- you are building a component library other teams will use
Watch out for
- the composition API is verbose, and that never stops being true
- nothing is styled, so evaluating it means doing the styling work first
- React only, with no story for other frameworks
Compare with these
- UI componentsFree
shadcn/ui
Components you copy into your repository and then own outright
- react
- tailwind
- registry
MITRead - UI componentsFree tier
21st.dev
A searchable marketplace of community components with a prompt for each one
- react
- tailwind
- directory
Varies by component, most are MITRead - UI componentsFree
Base UI
Headless primitives from the people behind MUI and Radix
- react
- headless
- accessibility
MITRead