Skip to main content

Best Tailwind v4 Component Libraries 2026

·PkgPulse Team

TL;DR

Tailwind v4 is a fundamental redesign — CSS variables for everything, no tailwind.config.js, @theme directive instead of extend. Most component libraries are in the process of migrating. Shadcn/ui has Tailwind v4 support via shadcn@canary. DaisyUI v5 is the first major library with full v4 support. Flowbite is mid-migration. The key v4 change: all theme values are CSS custom properties, making runtime theming trivially easy.

Key Takeaways

  • Tailwind v4 core change: @theme { --color-primary: oklch(...) } replaces config file
  • Migration: @tailwindcss/upgrade CLI handles most of the work automatically
  • Shadcn/ui v4: Available via npx shadcn@canary or stable release (mid-2026)
  • DaisyUI v5: First major library with native v4 support
  • Dark mode: Now @variant dark in CSS instead of darkMode: 'class' config
  • Performance: 2-5x faster builds in v4 (Lightning CSS instead of PostCSS)

What Changed in Tailwind v4

/* Tailwind v3 — all config in JS: */
/* tailwind.config.ts */
/* theme: { extend: { colors: { primary: '#3b82f6' } } } */

/* Tailwind v4 — config in CSS with @theme: */
@import "tailwindcss";

@theme {
  --color-primary: oklch(0.637 0.237 264.376);
  --color-primary-foreground: oklch(0.99 0.01 0);
  --color-background: oklch(0.99 0.01 0);
  --color-foreground: oklch(0.141 0.005 285.823);
  
  --radius: 0.625rem;
  --font-sans: "Inter Variable", ui-sans-serif, system-ui;
  --font-mono: "Fira Code", ui-monospace;
  
  --spacing-4: 1rem;  /* Override spacing scale */
  --spacing-px: 1px;
}

/* Dark mode with @variant: */
@variant dark {
  --color-background: oklch(0.141 0.005 285.823);
  --color-foreground: oklch(0.99 0.01 0);
}
/* Tailwind v4 — using theme values: */
.my-button {
  background-color: var(--color-primary);     /* CSS variable */
  color: var(--color-primary-foreground);
  border-radius: var(--radius);
}

/* Or via utility classes (auto-generated from @theme): */
/* bg-primary, text-foreground, rounded-md — still work! */

Shadcn/ui on Tailwind v4

# Shadcn/ui v4 init:
npx shadcn@latest init  # Detects Tailwind v4 automatically

# Or explicitly:
npx shadcn@canary init --tailwind-version 4
/* globals.css — Tailwind v4 shadcn theme: */
@import "tailwindcss";

@theme inline {
  --color-background: oklch(1 0 0);
  --color-foreground: oklch(0.145 0 0);
  --color-primary: oklch(0.205 0 0);
  --color-primary-foreground: oklch(0.985 0 0);
  --color-secondary: oklch(0.97 0 0);
  --color-secondary-foreground: oklch(0.205 0 0);
  --color-muted: oklch(0.97 0 0);
  --color-muted-foreground: oklch(0.556 0 0);
  --color-accent: oklch(0.97 0 0);
  --color-accent-foreground: oklch(0.205 0 0);
  --color-destructive: oklch(0.577 0.245 27.325);
  --color-border: oklch(0.922 0 0);
  --color-input: oklch(0.922 0 0);
  --color-ring: oklch(0.708 0 0);
  
  --radius: 0.625rem;
}

@variant dark {
  --color-background: oklch(0.145 0 0);
  --color-foreground: oklch(0.985 0 0);
  --color-border: oklch(1 0 0 / 15%);
  /* ... rest of dark tokens */
}

DaisyUI v5: First v4-Native Library

npm install -D daisyui@latest
/* DaisyUI v5 with Tailwind v4: */
@import "tailwindcss";
@plugin "daisyui";

/* Optional: configure themes */
@plugin "daisyui" {
  themes: light dark cupcake emerald;
  darkTheme: dark;
  base: true;
  styled: true;
  utils: true;
}
<!-- DaisyUI v5 components (all work with v4): -->
<button class="btn btn-primary">Click me</button>
<div class="card bg-base-100 shadow-xl">
  <div class="card-body">
    <h2 class="card-title">Card Title</h2>
    <p>Content here</p>
    <div class="card-actions justify-end">
      <button class="btn btn-primary">Buy Now</button>
    </div>
  </div>
</div>
<input type="text" placeholder="Type here" class="input input-bordered w-full max-w-xs" />

Flowbite: Mid-Migration

npm install flowbite flowbite-react
/* Flowbite v3 with Tailwind v4 (partial support): */
@import "tailwindcss";
@plugin "flowbite/plugin";

@source "../node_modules/flowbite-react/dist";
// Flowbite React components:
import { Button, Card, Modal, TextInput, Label } from 'flowbite-react';

function MyForm() {
  const [open, setOpen] = useState(false);
  return (
    <div>
      <Button onClick={() => setOpen(true)}>Open Modal</Button>
      <Modal show={open} onClose={() => setOpen(false)}>
        <Modal.Header>Create User</Modal.Header>
        <Modal.Body>
          <div className="space-y-4">
            <div>
              <Label htmlFor="name">Name</Label>
              <TextInput id="name" placeholder="John Doe" />
            </div>
          </div>
        </Modal.Body>
        <Modal.Footer>
          <Button onClick={() => setOpen(false)}>Submit</Button>
        </Modal.Footer>
      </Modal>
    </div>
  );
}

Migration: v3 → v4

# Automated migration:
npx @tailwindcss/upgrade

# This:
# - Converts tailwind.config.js to @theme in CSS
# - Updates PostCSS config
# - Updates class names that changed (e.g. shadow → shadow-sm)
# - Updates darkMode config to @variant dark

# Manual steps after upgrade:
# 1. Test dark mode behavior (different toggle method)
# 2. Check any custom plugins (API changed)
# 3. Update `tw-merge` / `clsx` patterns if needed

Component Library v4 Support Status (2026)

Libraryv4 SupportStatus
Shadcn/ui✅ CanaryStable release mid-2026
DaisyUI v5✅ FullFirst major v4-native
Flowbite v3⚠️ PartialActive migration
Preline UIUpdated
Ripple UIUpdated
HyperUI⚠️Updating
Tailwind ElementsNo v4 yet
Meraki UI⚠️Partial

Decision Guide

For React + Tailwind v4:
  → Shadcn/ui (canary/latest) — copy-paste, Radix-based
  → DaisyUI v5 — class-based, semantic HTML
  
For Vue/Nuxt + Tailwind v4:
  → DaisyUI v5 (framework-agnostic)
  → Flowbite (has Vue components)
  
For server-rendered/static (no JS components):
  → DaisyUI v5 (pure CSS classes, no JS)
  → Preline UI (Tailwind v4 ready)
  
Still on Tailwind v3?
  → Shadcn/ui stable — works great on v3
  → DaisyUI v4 — full v3 support
  → No rush to upgrade v3 → v4 for existing projects

Compare Tailwind, shadcn/ui, and DaisyUI download trends on PkgPulse.

Comments

Stay Updated

Get the latest package insights, npm trends, and tooling tips delivered to your inbox.