cn()
A utility function that merges Tailwind CSS classes with clsx and tailwind-merge, resolving conflicts automatically.
Preview
Click to toggle — cn() merges base + conditional classes, resolving Tailwind conflicts automatically.
Installation
npx shadcn@latest add @shadszn/utilsSource
import { type ClassValue, clsx } from "clsx"
import { twMerge } from "tailwind-merge"
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
}Usage Examples
import { cn } from "@/lib/utils"
// Merge static classes
cn("px-4 py-2", "bg-blue-500")
// => "px-4 py-2 bg-blue-500"
// Resolve conflicts (last wins)
cn("px-4", "px-6")
// => "px-6"
// Conditional classes
cn("text-sm", isActive && "text-blue-500", isDisabled && "opacity-50")
// => "text-sm text-blue-500" (if isActive is true)
// With component className prop
function MyComponent({ className }: { className?: string }) {
return (
<div className={cn("rounded-xl bg-white p-4", className)}>
Content
</div>
)
}
// User can override defaults:
<MyComponent className="bg-red-500 p-8" />
// => "rounded-xl bg-red-500 p-8" (bg-white and p-4 replaced)Why cn()?
- clsx handles conditional class joining -- arrays, objects, and falsy values
- tailwind-merge resolves Tailwind conflicts so later classes override earlier ones
- Together, they let component consumers safely override default styles via className