What you'll learn
- Pick a styling stack from your product goal, not from a trend list
- Match a UI need to headless primitives, a full kit or icons
- Use design tokens and CSS variables for theme switching
- Know when a component library helps and when it fights your brand
Styling is where product taste meets engineering defaults. The wrong library makes every screen a theme override. The right one disappears into a short set of tokens and a few owned components.
This page helps you choose an approach, then lists the libraries that still earn a place in production React apps. For forms, charts and other non-style packages, see Ecosystem. For accessible markup, see Accessibility & Semantics.

Before you install anything, check your editor. Tailwind teams get a lot from the Tailwind IntelliSense extension and the Tailwind Prettier plugin for class order.
How to choose a styling approach
- Start from ownership. Do you want to own every pixel, or ship with a kit and theme it lightly?
- Separate behavior from looks. Accessible dialogs and menus can come from headless libraries while CSS stays yours.
- Put tokens in one place. Colors, spacing, radius and type should not live as magic numbers in random components.
- Prefer fewer styling systems. Mixing Tailwind, Emotion and a full kit in one app usually means three ways to do the same button.

Pick a styling stack

Try it: styling stack picker
Pick how you want to ship UI. You get a short stack, why it fits, and a first-week plan.
Goal
Your stack
Utility-first with copyable components
Most new web apps move fastest with Tailwind plus accessible primitives you own in the repo.
- Tailwind CSS
Utility classes and a huge ecosystem.
- shadcn/ui
Copy components into your repo; you own the code.
- Radix UI
Accessible primitives under many shadcn pieces.
- Lucide
Consistent icon set that pairs well with Tailwind.
First week
Install Tailwind, set up IntelliSense, add one shadcn button and dialog, and map brand colors to CSS variables.
Stacks are starting points. If brand control and accessibility both matter, prefer headless primitives plus tokens over fighting a full kit theme.
Checkpoint
A greenfield marketing site wants fast UI and owned components. What fits first?
Pick an answer, or press A, B, C on your keyboard.
Match a UI need
Try it: match a UI need
Choose what you need from the UI layer. The matcher points to one primary pick and an optional alternate.
Need
The problem
You need dialogs, menus and selects that work with keyboard and screen readers, styled to your brand.
Also consider
React AriaPrefer React Aria when you want Adobe-level behavior and internationalization hooks.
Related on this site: Accessibility and semantics
One library will not fix unclear design ownership. Agree on tokens and accessibility checks before you scale the component count.
Key takeaway
Headless primitives plus tokens scale better than fighting a full kit when brand control matters. Full kits win when speed and dense admin patterns matter more than unique visuals.
Utility approach
Utility-first CSS builds UI from small classes. It shines when the team likes markup-visible styles and a shared design language.
-
Tailwind CSS (opens in a new tab)
Insight: Most popular utility-first choice with a huge ecosystem. -
UnoCSS (opens in a new tab)
Insight: Customizable atomic engine when you want Tailwind-like DX with more control. -
Panda CSS (opens in a new tab)
Insight: Design-token-first utilities and typed recipes.
Useful Tailwind companions: inline fold for long className strings, shadcn/ui, Preline, and awesome-tailwindcss.
CSS and CSS-in-JS
-
CSS Modules (opens in a new tab)
Insight: Still one of the cleanest defaults for component-scoped CSS with no runtime. -
vanilla-extract (opens in a new tab)
Insight: Static extraction plus type-safe tokens. Strong for design systems. -
Emotion (opens in a new tab)
Insight: Flexible CSS-in-JS when you need runtime styling. -
styled-components (opens in a new tab)
Insight: Mature API and large ecosystem; weigh runtime cost on new apps.
Design tokens and theming
Tokens are the contract between design and code.
- Prefer one source of truth for colors, spacing, radius and typography.
- Map UI to semantic tokens (
surface,text-muted,danger) instead of raw hex in components. - Use CSS variables for light, dark and brand switches instead of duplicating style objects.
- Use container queries and modern CSS (
@container,:has) when they remove JS layout hacks. - Keep motion light: prefer transform and opacity. Check contrast and focus early; see Semantics.

Component libraries
Opinionated kits ship styles already applied. They help small apps and internal tools. They fight you when every screen needs a custom brand.
- Material UI (opens in a new tab)
- Chakra UI (opens in a new tab)
- HeroUI (opens in a new tab)
Insight: Formerly NextUI. Prefer@heroui/reactfor new installs. - Ant Design (opens in a new tab)
- Fluent UI (opens in a new tab)
- Carbon Design System (opens in a new tab)
- Mantine (opens in a new tab)
If you need deep visual control, prefer headless primitives instead of overriding an entire kit.
Headless component libraries
Headless libraries give behavior and accessibility. You bring the CSS.

-
Radix UI (opens in a new tab)
Insight: Common base under shadcn and many custom systems. -
Headless UI (opens in a new tab)
Insight: Unstyled components from the Tailwind team. -
React Aria (opens in a new tab)
Insight: Deep accessibility and i18n-minded primitives. -
Ariakit (opens in a new tab)
Insight: Flexible accessible components with a lower-level feel.
Recommended combinations
- Radix UI + Tailwind
- Headless UI + Tailwind
- shadcn/ui + Tailwind + Radix primitives
- Base UI or React Aria + CSS Modules
- Chakra UI + Emotion (when you already live in that stack)
Checkpoint
When should you prefer a headless library over Material UI or Ant Design?
Pick an answer, or press A, B, C on your keyboard.
Universal and mobile
-
Tamagui (opens in a new tab)
Insight: Shared UI ideas across web and React Native. - React Native Paper (opens in a new tab)
- React Native Elements (opens in a new tab)
- Ionic (opens in a new tab)
- Expo UI ecosystem (opens in a new tab)
Icons
-
shadcn/ui (opens in a new tab)
Insight: Not only icons: copyable Radix + Tailwind components. -
Lucide (opens in a new tab)
Insight: Consistent SVG icons for most web apps. -
Heroicons (opens in a new tab)
Insight: Clean set that pairs well with Tailwind.
The key habit
Pick one styling system, put tokens in one place, and prefer headless behavior when brand control matters.
Styling checklist
- One primary styling approach is agreed for the app
- Tokens cover color, space, radius and type
- Interactive widgets have keyboard and focus styles
- Theme switching uses CSS variables or a single theme API
- Bundle cost of any full UI kit is acceptable
- Icons come from one set, not five random SVGs
Further reading
Conclusion
Styling choices compound. A short stack with clear tokens beats a drawer full of half-adopted libraries.
Choose ownership, lock tokens, then add components only when a need is real.
The key takeaway
Own your tokens, borrow behavior from headless libraries when you need it, and treat full UI kits as a speed trade, not a default forever.
Check your understanding
What should you decide before picking Tailwind vs a full kit?
Pick an answer, or press A, B, C on your keyboard.
Recap
What to remember from this article
Sections read
0
Questions
0
none answered yet
Quiz
0
not taken yet
Up next: Ecosystem & npm libraries · 7 min
Continue