โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ ๐ shadcn/components/changelog.md โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ
For this round of components, I looked at what we build every day, the boring stuff we rebuild over and over, and made reusable abstractions you can actually use.
These components work with every component library, Radix, Base UI, React Aria, you name it. Copy and paste to your projects.
Spinner: An indicator to show a loading state.
Kbd: Display a keyboard key or group of keys.
Button Group: A group of buttons for actions and split buttons.
Input Group: Input with icons, buttons, labels and more.
Field: One component. All your forms.
Item: Display lists of items, cards, and more.
Empty: Use this one for empty states.
Spinner
Okay let's start with the easiest ones: Spinner and Kbd. Pretty basic. We all know what they do.
Here's how you render a spinner:
Here's what it looks like:
Here's what it looks like in a button:
You can edit the code and replace it with your own spinner.
Kbd Kbd is a component that renders a keyboard key.
Use KbdGroup to group keyboard keys together.
โโงโฅโCtrl+B
You can add it to buttons, tooltips, input groups, and more.
Button Group
I got a lot of requests for this one: Button Group. It's a container that groups related buttons together with consistent styling. Great for action groups, split buttons, and more.
Here's the code:
You can nest button groups to create more complex layouts with spacing.
Use ButtonGroupSeparator to create split buttons. Classic dropdown pattern.
You can also use it to add prefix or suffix buttons and text to inputs.
Input Group Input Group lets you add icons, buttons, and more to your inputs. You know, all those little bits you always need around your inputs.
Here's a preview with icons:
You can also add buttons to the input group.
https://script.js
Oh here are some cool ones with spinners:
Saving...Please wait...
Field Introducing Field, a component for building really complex forms. The abstraction here is beautiful.
It took me a long time to get it right but I made it work with all your form libraries: Server Actions, React Hook Form, TanStack Form, Bring Your Own Form.
Here's a basic field with an input:
Username Choose a unique username for your account. Password Must be at least 8 characters long.
It works with all form controls. Inputs, textareas, selects, checkboxes, radios, switches, sliders, you name it. Here's a full example:
Payment Method All transactions are secure and encrypted Name on CardCard Number Enter your 16-digit card number Month010203040506070809101112Year202420252026202720282029CVVBilling AddressThe billing address associated with your payment method Same as shipping addressCommentsSync Desktop & Documents foldersYour Desktop & Documents folders are being synced with iCloud Drive. You can access them from other devices.
You can group fields together using FieldGroup and FieldSet. Perfect for multi-section forms.
Address Information We need your address to deliver your order. Street AddressCityPostal Code
Making it responsive is easy. Use orientation="responsive" and it switches between vertical and horizontal layouts based on container width. Done.
Profile Fill in your profile information. Name Provide your full name for identification Message You can write your message here. Keep it short, preferably under 100 characters. Virtual Machine Access a VM configured cluster to run GPU workloads.
Evil Rabbit Last seen 5 months ago No Team MembersInvite your team to collaborate on this project. maxleitermaxleiter@vercel.com evilrabbitevilrabbit@vercel.com
Need it as a link? Use the asChild prop:
[Visit our documentation Learn how to get started with our components.
](#)[External resourceOpens in a new tab with security attributes.
](#)
Empty Okay last one: Empty. Use this to display empty states in your app.
Here's how you use it:
No Projects YetYou haven't created any projects yet. Get started by creating your first project.
Or with input groups for things like search results or email subscriptions:
404 - Not FoundThe page you're looking for doesn't exist. Try searching for what you need below. /Need help? Contact support
That's it. Seven new components. Works with all your libraries. Ready for your projects.
We've created an index of open source registries that you can install items from.
You can search, view and add items from the registry index without configuring the .components.json file.
They'll be automatically added to your components.json file for you.
The full list of registries is available at https://ui.shadcn.com/r/registries.json.
To add a registry to the index, submit a PR to the shadcn/ui repository. See the registry index documentation for more details.
We just shipped shadcn CLI 3.0 with support for namespaced registries, advanced authentication, new commands and a completely rewritten registry engine.
What's New
Namespaced Registries - Install components using @registry/name format.
Private Registries - Secure your registry with advanced authentication.
Search & Discovery - New commands to find and view code before installing.
MCP Server - MCP server for all registries.
Faster Everything - Completely rewritten registry resolution.
Improved Error Handling - Better error messages for users and LLMs.
Upgrade Guide - Migration notes for existing users.
Namespaced Registries
The biggest change in 3.0 is namespaced registries. You can now install components from registries: a community registry, your company's private registry or internal registry, using the @registry/name format.
This makes it easier to distribute code across teams and projects.
Configure registries in your components.json:
Then use the @registry/name format to install components:
It's completely decentralized. There's no central registrar. Create any namespace you want and organize components however makes sense for your team.
Components can even depend on resources from different registries. Everything gets resolved and installed automatically from the right sources.
Private Registries
Need to keep your components private? We've got you covered. Configure authentication with tokens, API keys, or custom headers:
Your private components stay private. Perfect for enterprise teams with proprietary UI libraries.
We support all major authentication methods: basic auth, bearer token, api key query params and custom headers.
See the authentication docs for more details.
Search & Discovery
Three new commands make it easy to find exactly what you need:
Preview components before installing them. Search across multiple registries. See the code and all dependencies upfront.
MCP Server
Back in April, we introduced the first version of the MCP server. Since then, we've taken everything we learned and built a better MCP server.
Here's what's new:
Works with all registries. Zero config
One command to add to your favorite MCP clients
We improved the underlying tools
Better integration with the CLI and registries
Support for multiple registries in the same project
Add the MCP server to your project:
See the docs for more details.
Faster Everything
We completely rewrote the registry resolution engine from scratch. It's faster, smarter, and handles even the trickiest dependency trees.
Up to 3x faster dependency resolution
Smarter file deduplication and merging
Better monorepo support out of the box
Updated build command for registry authors
Improved Error Handling
Registry developers can now provide custom error messages to help guide users (and LLMs) when things go wrong. The CLI displays helpful, actionable errors for common issues:
Missing environment variables? The CLI tells you exactly what's needed:
Registry authors can provide custom error messages in their responses to help users and AI agents understand and fix issues quickly.
Upgrade Guide
Here's the best part: there are no breaking changes for users. Your existing components.json works exactly the same. All your installed components work exactly the same.
For developers, if you're using the programmatic APIs directly, we've deprecated a few functions in favor of better ones:
fetchRegistry โ getRegistry
resolveRegistryTree โ resolveRegistryItems
Schema moved from shadcn/registry to shadcn/schema package
That's it. Seriously. Everything else just works.
We've added support for universal registry items. This allows you to create registry items that can be distributed to any project i.e. no framework, no components.json, no tailwind, no react required.
This new registry item type unlocks a lot of new workflows. You can now distribute code, config, rules, docs, anything to any code project.
See the docs for more details and examples.
The shadcn CLI now supports local files. Initialize projects and add components, themes, hooks, utils and more from local JSON files.
This feature enables powerful new workflows:
Zero setup - No remote registries required
Faster development - Test registry items locally before publishing
Enhanced workflow for agents and MCP - Generate and run registry items locally
Private components - Keep proprietary components local and private.
We've added a new command to migrate to the new radix-ui package. This command will replace all @radix-ui/react-* imports with radix-ui.
It will automatically update all imports in your ui components and install radix-ui as a dependency.
Make sure to test your components and project after running the command.
Note: To update imports for newly added components, run the migration command again.
We've upgraded the Calendar component to the latest version of React DayPicker.
This is a major upgrade and includes a lot of new features and improvements. We've also built a collection of 30+ calendar blocks that you can use to build your own calendar components.
See all calendar blocks in the Blocks Library page.
To upgrade your project to the latest version of the Calendar component, see the upgrade guide.
We've upgraded ui.shadcn.com to Next.js 15.3 and Tailwind v4. The site now uses the upgraded new-york components.
We've also made some minor design updates to make the site faster and easier to navigate.
This upgrade unlocks a lot of new features that we're working on. More to come.
We're working on zero-config MCP support for shadcn/ui registry. One command npx shadcn registry:mcp to make any registry mcp-compatible.
Learn more in the thread here.
We tagged shadcn 2.5.0 earlier this week. It comes with a pretty cool feature: resolve anywhere.
Registries can now place files anywhere in an app and we'll properly resolve imports. No need to stick to a fixed file structure. It can even add files outside the registry itself.
On install, we track all files and perform a multi-pass resolution to correctly handle imports and aliases. It's fast.
The shadcn CLI can now auto-detect your framework and adapts routes for you.
Works with all frameworks including Laravel, Vite and React Router.
We shipped the first preview of Tailwind v4 and React 19. Ready for you to try out. You can start using it today.
What's New:
The CLI can now initialize projects with Tailwind v4.
Full support for the new @theme directive and @theme inline option.
All components are updated for Tailwind v4 and React 19.
We've removed the forwardRefs and adjusted the types.
Every primitive now has a data-slot attribute for styling.
We've fixed and cleaned up the style of the components.
We're deprecating the toast component in favor of sonner.
Buttons now use the default cursor.
We're deprecating the default style. New projects will use new-york.
HSL colors are now converted to OKLCH.
Read more in the docs.
We're updating the registry schema to support more features.
Define code as a flat JSON file and distribute it via the CLI.
Custom styles: bring your own design system, components & tokens
Extend, override, mix & match components from third-party registries and LLMs
Install themes, CSS vars, hooks, animations, and Tailwind layers & utilities
We are inviting the community to contribute to the blocks library. Share your components and blocks with other developers and help build a library of high-quality, reusable components.
We'd love to see all types of blocks: applications, marketing, products, and more.
See the docs page to get started.
Until now, using shadcn/ui in a monorepo was a bit of a pain. You could add components using the CLI, but you had to manage where the components were installed and manually fix import paths.
With the new monorepo support in the CLI, we've made it a lot easier to use shadcn/ui in a monorepo.
The CLI now understands the monorepo structure and will install the components, dependencies and registry dependencies to the correct paths and handle imports for you.
Read more in the docs.
An update on icons. The new-york style now uses Lucide as the default icon set.
New projects will use Lucide by default
No breaking changes for existing projects
Use the CLI to (optionally) migrate primitives to Lucide
For more info on why we're doing this, see the thread.
shadcn/ui is now compatible with React 19 and Next.js 15.
We published a guide to help you upgrade your project to React 19.
Read more here.
Introducing sidebar.tsx: 25 components to help you build all kinds of sidebars.
I don't like building sidebars. So I built 30+ of them. All types. Then simplified the core into sidebar.tsx: a strong foundation to build on top of.
It works with Next.js, Remix, Vite & Laravel.
See the announcement here.
The new CLI is now available. It's a complete rewrite with a lot of new features and improvements. You can now install components, themes, hooks, utils and more using npx shadcn add.
This is a major step towards distributing code that you and your LLMs can access and use.
First up, the cli now has support for all major React framework out of the box. Next.js, Remix, Vite and Laravel. And when you init into a new app, we update your existing Tailwind files instead of overriding.
A component now ship its own dependencies. Take the accordion for example, it can define its Tailwind keyframes. When you add it to your project, we'll update your tailwind.config.ts file accordingly.
You can also install remote components using url. npx shadcn add https://acme.com/registry/navbar.json.
We have also improve the init command. It does framework detection and can even init a brand new Next.js app in one command. npx shadcn init.
We have created a new schema that you can use to ship your own component registry. And since it has support for urls, you can even use it to distribute private components.
And a few more updates like better error handling and monorepo support.
You can try the new cli today.
Update Your Project
To update an existing project to use the new CLI, update your components.json file to include import aliases for your components, utils, ui, lib and hooks.
If you're using a different import alias prefix eg ~, replace @ with your prefix.
We're introducing a new mode for Blocks called Lift Mode.
Enable Lift Mode to automatically "lift" smaller components from a block template for copy and paste.
With Lift Mode, you'll be able to copy the smaller components that make up a block template, like cards, buttons, and forms, and paste them directly into your project.
Visit the Blocks page to try it out.
One of the most requested features since launch has been layouts: admin dashboards with sidebar, marketing page sections, cards and more.
Today, we're launching Blocks.
Blocks are ready-made components that you can use to build your apps. They are fully responsive, accessible, and composable, meaning they are built using the same principles as the rest of the components in shadcn/ui.
We're starting with dashboard layouts and authentication pages, with plans to add more blocks in the coming weeks.
Open Source
Blocks are open source. You can find the source on GitHub. Use them in your projects, customize them and contribute back.
View the blocks library Request a Block
We're also introducing a "Request a Block" feature. If there's a specific block you'd like to see, simply create a request on GitHub and the community can upvote and build it.
If you have a v0 account, you can use the Edit in v0 feature to open the code on v0 for prompting and further generation.
That's it. Looking forward to seeing what you build with Blocks.
We've added a new Breadcrumb component and an Input OTP component.
Breadcrumb
An accessible and flexible breadcrumb component. It has support for collapsed items, custom separators, bring-your-own routing <Link /> and composable with other shadcn/ui components.
Breadcrumb
Input OTP
A fully featured input OTP component. It has support for numeric and alphanumeric codes, custom length, copy-paste and accessible. Input OTP is built on top of input-otp by @guilherme_rodz.
[data-input-otp] { --nojs-bg: white !important; --nojs-fg: black !important;
background-color: var(--nojs-bg) !important; color: var(--nojs-fg) !important; caret-color: var(--nojs-fg) !important; letter-spacing: .25em !important; text-align: center !important; border: 1px solid var(--nojs-fg) !important; border-radius: 4px !important; width: 100% !important; } @media (prefers-color-scheme: dark) { [data-input-otp] { --nojs-bg: black !important; --nojs-fg: white !important; } }
If you have a v0, the new components are available for generation.
We've added new components to shadcn/ui and made a lot of improvements to the CLI.
Here's a quick overview of what's new:
Carousel - A carousel component with motion, swipe gestures and keyboard support.
Drawer - A drawer component that looks amazing on mobile.
Pagination - A pagination component with page navigation, previous and next buttons.
Resizable - A resizable component for building resizable panel groups and layouts.
Sonner - The last toast component you'll ever need.
CLI updates - Support for custom Tailwind prefix and tailwind.config.ts.
Carousel
We've added a fully featured carousel component with motion, swipe gestures and keyboard support. Built on top of Embla Carousel.
It has support for infinite looping, autoplay, vertical orientation, and more.
12345
Drawer Oh the drawer component ๐. Built on top of Vaul by emilkowalski_.
Try opening the following drawer on mobile. It looks amazing!
CLI updates
This has been one of the most requested features. You can now configure a custom Tailwind prefix and the cli will automatically prefix your utility classes when adding components.
This means you can now easily add shadcn/ui components to existing projects like Docusaurus, Nextra...etc. A drop-in for your existing design system with no conflict. ๐ฅ
It works with cn, cva and CSS variables.
The cli can now also detect tailwind.config.ts and add the TypeScript version of the config for you.
That's it. Happy Holidays.
This project and the components are written in TypeScript. We recommend using TypeScript for your project as well.
However we provide a JavaScript version of the components, available via the cli.
To opt-out of TypeScript, you can use the tsx flag in your components.json file.
To configure import aliases, you can use the following jsconfig.json:
I have a lot of updates to share with you today:
New CLI - Rewrote the CLI from scratch. You can now add components, dependencies and configure import paths.
Theming - Choose between using CSS variables or Tailwind CSS utility classes for theming.
Base color - Configure the base color for your project. This will be used to generate the default color palette for your components.
React Server Components - Opt out of using React Server Components. The CLI will automatically append or remove the use client directive.
Styles - Introducing a new concept called Style. A style comes with its own set of components, animations, icons and more.
Exit animations - Added exit animations to all components.
Other updates - New icon button size, updated sheet component and more.
Updating your project - How to update your project to get the latest changes.
New CLI
I've been working on a new CLI for the past few weeks. It's a complete rewrite. It comes with a lot of new features and improvements.
init
When you run the init command, you will be asked a few questions to configure components.json:
This file contains all the information about your components: where to install them, the import paths, how they are styled...etc.
You can use this file to change the import path of a component, set a baseColor or change the styling method.
This means you can now use the CLI with any directory structure including src and app directories.
add
The add command is now much more capable. You can now add UI components but also import more complex components (coming soon).
The CLI will automatically resolve all components and dependencies, format them based on your custom config and add them to your project.
diff (experimental)
We're also introducing a new diff command to help you keep track of upstream updates.
You can use this command to see what has changed in the upstream repository and update your project accordingly.
Run the diff command to get a list of components that have updates available:
Then run diff [component] to see the changes:
Theming with CSS Variables or Tailwind Colors
You can choose between using CSS variables or Tailwind CSS utility classes for theming.
When you add new components, the CLI will automatically use the correct theming methods based on your components.json configuration.
Utility classes
To use utility classes for theming set tailwind.cssVariables to false in your components.json file.
CSS Variables
To use CSS variables classes for theming set tailwind.cssVariables to true in your components.json file.
Base color
You can now configure the base color for your project. This will be used to generate the default color palette for your components.
Choose between gray, neutral, slate, stone or zinc.
If you have cssVariables set to true, we will set the base colors as CSS variables in your globals.css file. If you have cssVariables set to false, we will inline the Tailwind CSS utility classes in your components.
React Server Components
If you're using a framework that does not support React Server Components, you can now opt out by setting rsc to false. We will automatically append or remove the use client directive when adding components.
Styles
We are introducing a new concept called Style.
You can think of style as the visual foundation: shapes, icons, animations & typography. A style comes with its own set of components, animations, icons and more.
We are shipping two styles: default and new-york (with more coming soon).
The default style is the one you are used to. It's the one we've been using since the beginning of this project. It uses lucide-react for icons and tailwindcss-animate for animations.
The new-york style is a new style. It ships with smaller buttons, cards with shadows and a new set of icons from Radix Icons.
When you run the init command, you will be asked which style you would like to use. This is saved in your components.json file.
Theming
Start with a style as the base then theme using CSS variables or Tailwind CSS utility classes to completely change the look of your components.
Exit animations
I added exit animations to all components. Click on the combobox below to see the subtle exit animation.
The animations can be customized using utility classes.
Other updates Button
Sheet
toprightbottomleft
Updating your project Since we follow a copy and paste approach, you will need to manually update your project to get the latest changes.
Note: we are working on a diff command to help you keep track of upstream updates.
Add components.json Creating a components.json file at the root:
Update the values for tailwind.css and aliases to match your project structure. Button Add the icon size to the buttonVariants:
Sheet
Thank you
I'd like to thank everyone who has been using this project, providing feedback and contributing to it. I really appreciate it. Thank you ๐
โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ