- Accordion
- Alert
- Alert Dialog
- Aspect Ratio
- Attachment
- Avatar
- Badge
- Breadcrumb
- Bubble
- Button
- Button Group
- Calendar
- Card
- Carousel
- Chart
- Checkbox
- Collapsible
- Combobox
- Command
- Context Menu
- Data Table
- Date Picker
- Dialog
- Direction
- Drawer
- Dropdown Menu
- Empty
- Field
- Hover Card
- Input
- Input Group
- Input OTP
- Item
- Kbd
- Label
- Marker
- Menubar
- Message
- Message Scroller
- Native Select
- Navigation Menu
- Pagination
- Popover
- Progress
- Questionnaire
- Radio Group
- Resizable
- Scroll Area
- Select
- Separator
- Sheet
- Sidebar
- Skeleton
- Slider
- Spinner
- Switch
- Table
- Tabs
- Textarea
- Toast
- Toggle
- Toggle Group
- Tooltip
- Typography
September 2026 - cn
Components now import cn from the cn package. One dependency instead of two, and no local helper to maintain.
Every shadcn component now imports cn from the cn package.
For years, every shadcn project started with the same five lines in
lib/utils.ts: import clsx, import twMerge, wrap one in the other, export
it as cn. It worked, but it meant two dependencies and a helper you had to
copy into every project and every registry.
We have moved that into a package. cn is a
drop-in replacement for twMerge(clsx(...)). It is smaller, faster and ships
the same API, so nothing changes at the call site.
import { cn } from "cn"
;<div className={cn("flex items-center", className)} />What changed#
- Registry components, blocks and examples import
cnfromcninstead of@/lib/utils. npx shadcn initinstallscnand generates a one-linelib/utils.ts.- Every registry item that uses
cndeclares it as a dependency, sonpx shadcn addinstalls it in projects created before this change.
lib/utils.ts#
The utils registry item still exists. It now re-exports cn so your own code
keeps working and you still have a single place for project helpers.
export { cn } from "cn"Existing projects#
Nothing breaks. Your lib/utils.ts keeps working and new components install
cn next to it. To move the rest of your project over and drop clsx and
tailwind-merge, run the migration:
pnpm dlx shadcn@latest migrate cn
It rewrites imports, replaces twMerge(clsx(...)) calls and removes the old
packages when nothing references them anymore. See the
CLI docs for details.