Copy-paste-Komponenten auf Radix + Tailwind, kein klassischer Component-Lib-Lock.
shadcn/ui ist keine Component-Library im klassischen Sinn — es ist ein CLI, das Source-Code von Komponenten (Radix UI + Tailwind) in dein Repo kopiert. Du besitzt den Code, kannst alles anpassen, kein Versions-Lock-in.
pnpm dlx shadcn@latest init
pnpm dlx shadcn@latest add button card dialog dropdown-menu
Komponenten landen in components/ui/, Utils in lib/utils.ts. components.json konfiguriert Pfade und Style.
asChild (Radix-Pattern):
<Button asChild><Link href="/foo">Go</Link></Button>
cva (class-variance-authority) — siehe button.tsx.add.add re-runnen und Diffs mergen.cn() aus lib/utils.ts ist Pflicht für Variant-Merging — sonst doppelte/konflikt-Klassen.id nicht stabil. useId() nutzen.globals.css müssen sowohl :root als auch .dark definieren.react-hook-form + zod — Setup ist nicht trivial, aber Standard.Wenn du keine Kontrolle über Component-Source brauchst und Auto-Updates willst → Mantine, MUI, Chakra. Bei reinem Headless-Need ohne Tailwind → Radix UI direkt.