Home/Frontend & UI/Radix UI
Frontend & UI
radix-ui

Radix UI

TypeScriptReactAccessibleOpen-sourceHeadless

Unstyled, accessible component primitives for React. Radix UI is the foundation of shadcn/ui — providing battle-tested accessibility, keyboard navigation, and WAI-ARIA compliance out of the box.

License

MIT

Language

TypeScript

33
Trust
Limited

Why Radix UI?

Building a custom design system on top of accessible primitives

You need WCAG-compliant components without fighting existing styles

Implementing complex UI patterns (modals, popovers, tooltips)

Signal Breakdown

What drives the Trust Score

npm downloads
4M / wk
Commits (90d)
100 commits
GitHub stars
15k ★
Stack Overflow
3k q's
Community
Large
Weighted Trust Score33 / 100

Download Trend

Last 12 months

Tradeoffs & Caveats

Know before you commit

You want pre-styled components (use shadcn/ui which wraps Radix)

Non-React projects

Simple UIs where accessibility overhead isn't worth it

Pricing

Free tier & paid plans

Free tier

100% free, open-source (MIT)

Paid

Free & open-source

No paid tiers

Alternative Tools

Other options worth considering

shadcn-ui
shadcn/ui84Strong

Not a library — a collection of re-usable components you copy into your project. Built on Radix UI primitives and styled with Tailwind CSS. The fastest way to build beautiful, accessible React UIs that you fully own.

Often Used Together

Complementary tools that pair well with Radix UI

shadcn-ui

shadcn/ui

Frontend & UI

84Strong
View
tailwind-css

Tailwind CSS

Frontend & UI

90Excellent
View
nextjs

Next.js

Frontend & UI

98Excellent
View
framer-motion

Framer Motion

Frontend & UI

58Fair
View
clerk

Clerk

Auth & Users

80Strong
View

Learning Resources

Docs, videos, tutorials, and courses

Get Started

Repository and installation options

View on GitHub

github.com/radix-ui/primitives

npmnpm install @radix-ui/react-dialog

Quick Start

Copy and adapt to get going fast

import * as Dialog from '@radix-ui/react-dialog';

export function Modal({ trigger, children }: { trigger: React.ReactNode; children: React.ReactNode }) {
  return (
    <Dialog.Root>
      <Dialog.Trigger asChild>{trigger}</Dialog.Trigger>
      <Dialog.Portal>
        <Dialog.Overlay className="fixed inset-0 bg-black/50" />
        <Dialog.Content className="fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 bg-white rounded-xl p-6">
          {children}
        </Dialog.Content>
      </Dialog.Portal>
    </Dialog.Root>
  );
}

Code Examples

Common usage patterns

Accessible dropdown

Fully accessible dropdown menu

import * as DropdownMenu from '@radix-ui/react-dropdown-menu';

<DropdownMenu.Root>
  <DropdownMenu.Trigger asChild>
    <button>Options</button>
  </DropdownMenu.Trigger>
  <DropdownMenu.Content>
    <DropdownMenu.Item onSelect={() => edit()}>Edit</DropdownMenu.Item>
    <DropdownMenu.Item onSelect={() => del()} className="text-red-600">Delete</DropdownMenu.Item>
  </DropdownMenu.Content>
</DropdownMenu.Root>

Tooltip component

Accessible tooltip with delay

import * as Tooltip from '@radix-ui/react-tooltip';

<Tooltip.Provider delayDuration={300}>
  <Tooltip.Root>
    <Tooltip.Trigger asChild><button>?</button></Tooltip.Trigger>
    <Tooltip.Content side="top" className="bg-gray-900 text-white text-xs px-2 py-1 rounded">
      Helpful explanation here
      <Tooltip.Arrow className="fill-gray-900" />
    </Tooltip.Content>
  </Tooltip.Root>
</Tooltip.Provider>

Community Notes

Real experiences from developers who've used this tool