czay.dev
Writing

Choosing a React UI Library: Which One to Use in 2026?

MUI, Ant Design, Mantine, Chakra, and shadcn/ui — up-to-date npm numbers, how Server Components impact your choice, and the real question: do you want a dependency or code ownership?

Furkan ÖzayJune 13, 2025 · 8 min read

There's no answer to "What's the best React UI library?" because it's the wrong question. The right question is: who will maintain the project, for how long, and under what constraints? An admin dashboard shipped in three weeks and a product built to last five years don't have the same answer.

This post starts with up-to-date figures for 2026, then covers the two real trade-offs that drive the decision: the ownership model and the Server Components boundary.

First, the numbers

As of September 2, 2026 from the npm registry:

PackageVersionReact peerWeekly downloads
@radix-ui/react-dialog1.1.23^16.8 – ^1971,400,000
@mui/material9.4.0^17 || ^18 || ^1910,360,000
react-aria-components1.21.0^16.8 – ^194,020,000
antd6.6.2>=183,750,000
@mantine/core9.6.0^19.2.02,550,000
@chakra-ui/react3.37.0>=181,800,000
@heroui/react3.2.4>=19536,000

The most striking row in this table is the first one. A single component from Radix gets downloaded more than all the "all-in-one" libraries combined. Here's why: Radix isn't a component library; it's a headless behavior layer — it brings no styles, solving only accessibility and keyboard interactions. Plenty of tools—including shadcn/ui—are built on top of it.

In other words, the market has shifted from "install an all-in-one component package" to "get behavior off the shelf, write the styles yourself." That's the real divide when making your choice.

Trade-off 1: Dependency vs. Ownership

Explanation: Two models

The Dependency model (MUI, Ant Design, Mantine, Chakra): You install the package, you import components. You customize styles through their theme system. When a new version drops, you run npm update.

The Ownership model (shadcn/ui): The component source code is copied into your project via a CLI command. components/ui/button.tsx is now your file. Modify it however you like — but updating it is also on you.

Both models come with trade-offs, and the cost varies depending on the lifespan of your project:

  • The dependency model gets you up and running fast. The cost: your design can only be as unique as the library permits. The moment you want to step outside its theme system, you enter !important hell.
  • The ownership model gives you complete freedom, but the upfront effort is higher and maintenance is entirely on you. On the flip side, major version upgrades of an external library aren't your problem anymore.

Warning: The Chakra v3 example

Chakra UI v3 isn't a continuation of v2; it's a complete rewrite with the styling layer moved to Panda CSS and component logic to Ark UI. That means upgrading a v2 project isn't an npm update — it's a migration project. This is the real cost of the dependency model: a pivot by the library dictates your schedule.

Another angle of the same risk appears in Mantine: v9 now requires react: ^19.2.0. If you can't upgrade React in your project, you can't upgrade the UI library either.

Trade-off 2: The Server Components Boundary

If you're using the Next.js App Router, this is less about selection and more about architecture.

Interactive components — dropdowns, modals, tabs, forms — hold state, listen to events, and use context. Every single one of them is a Client Component. So regardless of which library you choose, wherever you use those components will fall inside a "use client" boundary and ship code to the browser.

Tip: What does this mean in practice?

If you pull in a library at the root of your page (a theme provider or layout component), you drag the entire page to the client side. Instead, keep the boundary at the leaves: keep pages and layouts as Server Components, and make only the interactive parts Client Components.

Here lies a subtle advantage of the ownership model: since the file is yours, you decide where to put the "use client" directive. With a pre-built library, that decision was made inside the npm package.

Five Options: When is Each One Right?

MUI (Material UI)

With over 10 million downloads a week, it's the largest full-featured library. Extensive component set, good documentation, well-recognized in enterprise environments.

  • When it's right: Internal admin dashboards, enterprise apps where unique design isn't a priority, projects without dedicated designers.
  • When it's wrong: Customer-facing products where brand identity matters. Making MUI not look like Material Design takes more effort than building from scratch.

Ant Design

Alibaba's library; extremely powerful for data-heavy UI. Its table component alone is more capable than entire UI libraries: virtualization, column pinning, filtering, export.

  • When it's right: Large tables, complex forms, enterprise dashboards requiring i18n and RTL support.
  • When it's wrong: Marketing sites and small apps. You only get your money's worth for its bundle weight on data-dense screens.

Mantine

Over 100 components and — its most valuable part — handy hooks (useForm, useDisclosure, useLocalStorage). Its aesthetic is more neutral than Material, making it easier to brand.

  • When it's right: Projects that need to move fast without the Material look; form-heavy applications.
  • Watch out: v9 strictly requires React 19.2 and above.

Chakra UI

Made a name for itself with accessibility and DX. Rewritten in v3 on top of Panda CSS + Ark UI.

  • When it's right: Brand-new projects being set up from scratch with v3.
  • Watch out: Upgrading a project stuck on v2 means a migration. When starting fresh, keep in mind that this architectural shift is still relatively recent in the ecosystem.

shadcn/ui

Not an npm package; it's a collection of components built on Radix + Tailwind that you copy into your project. That's why it doesn't appear in the table above — it's not installed from npm.

  • When it's right: Long-lived projects where design is a core product differentiator. If you already use Tailwind, friction is near zero.
  • When it's wrong: Teams not using Tailwind and quick jobs expecting an "install and forget" workflow. Maintaining every copied component is now on you.

Decision Matrix

ScenarioRecommendation
Internal admin dashboard, design doesn't matterMUI or Ant Design
Data-dense tables, enterpriseAnt Design
Need to move fast, don't want MaterialMantine
Using Tailwind, design is part of the brand identityshadcn/ui
Custom design system to implementRadix / React Aria + custom components
Prototype, one-week jobWhichever you already know

That last row isn't a joke: the learning curve for an unfamiliar library usually outweighs the differences between libraries on short projects.

What do I use?

On the site you're reading right now, there is no UI library at all. Tailwind CSS v4, clsx and class-variance-authority for class merging, lucide-react for icons, motion for animations — every component was written by hand.

I don't recommend this for every project. There are three reasons it works here:

  1. The design system is part of the work itself. Constraints (a single accent color, hair-thin borders, a 36px button) conflict with a library's defaults; fighting those defaults would take longer than writing from scratch.
  2. The component count is low. Buttons, badges, cards, dropdowns. If I needed to build a complex table component, my decision would have been different.
  3. I'm the sole maintainer. As a team grows, the documentation of a shared library becomes far more valuable than the tribal knowledge of custom-built components.

Summary

  • The question isn't "which is best," but "how many years will this project live and how crucial is design?"
  • The market shifted from all-in-one components to headless behavior layers — Radix alone gets downloaded more than all of them combined
  • The dependency model gets you started fast, but dictates your schedule during major version shifts (see Chakra v3)
  • The ownership model grants total freedom, but dumps maintenance on you
  • In the App Router, whichever library you pick, interactive components stay on the client side; keep your "use client" boundary at the leaves

Note: Source

Version numbers, React peer dependencies, and download counts were retrieved from the npm registry and npm download API on September 2, 2026. These numbers change quickly; I recommend checking them yourself before deciding.