Skip to main content
← Back to writing

Radix UI: Accessible Primitives Without the Styling Opinions

TL;DR: Radix UI gives you the hard parts of UI components — accessibility, keyboard interaction, focus management, ARIA — as unstyled React primitives, and leaves every visual decision to you. For a React/Next team building a design system, that’s close to the ideal trade: correct behavior for free, your identity on top. The price is that “unstyled” means you bring all the CSS. Verdict: 🟡 adopt it.

🎯 The Part Teams Get Wrong

The thing most teams quietly botch on custom components is accessibility — focus traps, ARIA roles, keyboard handling. It’s tedious, easy to get subtly wrong, and the bugs are invisible until someone on assistive tech hits them. Radix UI’s whole pitch is to make that the library’s problem while staying out of your design’s way. For a React/Next-oriented team, that maps perfectly onto “ship accessible components without inheriting someone else’s look.”

🔍 What Makes It Different

Most component libraries ship styled components with opinions baked in. Radix inverts the model:

  • Unstyled by default — no preset colors, fonts, or spacing. The components are behavior and accessibility, nothing else.
  • WAI-ARIA from the start — built to the guidelines so assistive tech works without you hand-rolling roles and states.
  • Style it with anything — SCSS, Tailwind, CSS-in-JS all work, precisely because Radix has no opinion to argue with.

That’s exactly the right shape for a design system: you inherit correct, accessible behavior and paint your own visual identity over the top.

👍 Strengths · 👎 Weaknesses

StrengthsWeaknesses
Accessibility built in (WAI-ARIA)Styling learning curve — you build all of it
Total customizabilityNo pre-styled components to start from
Focus on core functionalityPer-component package installs
Modular and composable
Strong developer experience

Setup is quick — under ~15 minutes — but mind the model: you install a separate package per component as you adopt them, rather than pulling in one bundle.

🧭 Use Cases

The headline fit is building a design system, but it also pays off for rapid prototyping of accessible interfaces and for the fiddly interactive components — dropdowns, dialogs, tooltips — where getting accessibility right by hand is genuinely painful. One practical habit from the trial: to build something Radix doesn’t ship directly, you usually compose two or more existing primitives rather than starting from zero.

Verdict

🟡 Adopt it. It changes essentially nothing about how we work — it slots into a React/Next workflow and raises the accessibility floor of everything built on it. The natural proof point: a small POC styling the same primitives three ways (SCSS, Tailwind, Styled Components) to demonstrate the versatility, and a look at whether it can level up an existing in-house component library rather than replace it.