110k

Changelog

RSS

Latest updates and announcements.

2026年3月 - shadcn/cli v4

我们发布了 shadcn/cli 的第4版。功能更强大,使用更简便。为你和你的编码代理打造。以下是全部新特性。

shadcn/skills

shadcn/skills 为编码代理提供了必要的上下文,使其能够正确地与组件和注册表协作。它涵盖了 Radix 和 Base UI 原语、更新的 API、组件模式和注册流程。该技能还知道如何使用 shadcn CLI、何时调用以及传递哪些标志。代理犯错更少,生成的代码真正匹配你的设计系统。

你可以向代理提出如下请求:

  • “创建一个新的 vite 单体仓库”
  • “帮我找一个 tailark 的英雄组件,加到首页,用 react-bits 的动画来动画文本”
  • “安装并配置 @clerk 的登录页面”
pnpm dlx skills add shadcn/ui

引入 --preset

预设将你整个设计系统配置打包成一个短代码。颜色、主题、图标库、字体、圆角。一个字符串,包含一切。

你可以在 shadcn/create 上构建你的预设,实时预览,准备好时复制代码。

pnpm dlx shadcn@latest init --preset a1Dg5eFl

用它从自定义配置搭建项目,与你的团队共享,或发布到注册表。把它放入提示中,让代理知道从哪里开始。支持 Claude、Codex、v0、Replit 等多平台随身携带你的预设。

切换预设

当你开发新应用时,找到满意的预设可能需要多次尝试,因此我们让切换预设变得非常简单。在你的应用中运行 init --preset,CLI 会重新配置一切,包括组件。

pnpm dlx shadcn@latest init --preset ad3qkJ7

技能 + 预设

你的代理知道如何使用预设。可以搭建项目,切换设计系统,尝试新风格。

  • “用 --preset adtk27v 创建一个新的 next 应用”
  • “我们试试 --preset adtk27v”

全新 shadcn/create

为了帮助你构建自定义预设,我们重构了 shadcn/create。它现在包含了可以用于预览预设的 UI 组件库。在开始构建前,先看看颜色、字体和圆角如何应用于真实组件。

新增 --dry-run、--diff 和 --view 标志

在写入任何文件之前,先查看注册表会向你的项目添加什么。你可以自行审查变更,或传递给编码代理复核。

pnpm dlx shadcn@latest add button --dry-run
npx shadcn@latest add button --diff
npx shadcn@latest add button --view

更新原语

你可以用 --diff 标志检查注册表更新。或者让代理帮你:“检查 @shadcn 的更新并合并到本地改动”。

pnpm dlx shadcn@latest add button --diff

shadcn init --template

shadcn init 现在支持为 Next.js、Vite、Laravel、React Router、Astro 和 TanStack Start 生成完整项目模板。Next.js 和 Vite 含内置暗黑模式。

pnpm dlx shadcn@latest init

选择模板 › - 使用方向键。回车确认。
❯ Next.js
  Vite
  TanStack Start
  React Router
  Astro
  Laravel

使用 --monorepo 参数来搭建单体仓库。

pnpm dlx shadcn@latest init -t next --monorepo

shadcn init --base

选择你的原语。用 --base 参数开始一个 Radix 或 Base UI 项目。

pnpm dlx shadcn@latest init --base radix

shadcn info

info 命令现在显示完整信息:框架、版本、CSS 变量、已安装组件,以及每个组件的文档和示例地址。非常适合给编码代理提供处理你项目所需的上下文。

pnpm dlx shadcn@latest info

shadcn docs

通过 CLI 获取任意 UI 组件的文档、代码和示例。为你的编码代理提供正确使用原语的上下文。

pnpm dlx shadcn@latest docs combobox

combobox
  - 文档      https://ui.shadcn.com/docs/components/radix/combobox
  - 示例      https://raw.githubusercontent.com/shadcn-ui/ui/refs/heads/main/apps/v4/registry/bases/radix/examples/combobox-example.tsx
  - API       https://base-ui.com/react/components/combobox

registry:base 和 registry:font

注册表现在可以用 registry:base 分发整个设计系统作为单一负载包。包含组件、依赖、CSS 变量、字体、配置。一键安装,全部设置完成。

字体现在是一级注册类型。安装和配置方式与组件相同。

font-inter.json
{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "font-inter",
  "type": "registry:font",
  "font": {
    "family": "'Inter Variable', sans-serif",
    "provider": "google",
    "import": "Inter",
    "variable": "--font-sans",
    "subsets": ["latin"]
  }
}
pnpm dlx shadcn@latest add font-inter

相关链接

2026年2月 - Radix 和 Base UI 的区块

所有区块现已同时支持 Radix 和 Base UI。

  • 两个库的所有区块 - 包含登录、注册、侧边栏和仪表板区块在内的每个区块,现均提供 Radix 和 Base UI 版本。
  • 相同的 CLI 工作流程 - 运行 npx shadcn add,CLI 会根据你的项目配置拉取正确的区块版本。

如果你已经使用 npx shadcn create 设置了项目,区块将自动使用你选择的库。无需额外配置。

pnpm dlx shadcn@latest add login-01

区块页面浏览完整合集。

2026年2月 - 统一的 Radix UI 包

new-york 风格现在使用统一的 radix-ui 包,而不是单独的 @radix-ui/react-* 包。

变更内容

当你使用 new-york 风格添加组件时,它们将从 radix-ui 导入,而不是分别导入各个包:

components/ui/dialog.tsx
- import * as DialogPrimitive from "@radix-ui/react-dialog"
+ import { Dialog as DialogPrimitive } from "radix-ui"

这让你的 package.json 更加简洁,只需要一个 radix-ui 依赖,而不是多个 @radix-ui/react-* 包。

迁移已有项目

如果你已有使用 new-york 风格的项目,可以使用迁移命令升级到新的 radix-ui 包:

pnpm dlx shadcn@latest migrate radix

此命令会更新你所有 UI 组件的导入,并将 radix-ui 添加到依赖中。

如果要迁移 ui 目录外的组件,可以使用 path 参数:

pnpm dlx shadcn@latest migrate radix src/components/custom

完成后,你可以从 package.json 中移除所有未使用的 @radix-ui/react-* 包。

详情请参阅 迁移 radix 文档

2026 年 1 月 - RTL 支持

shadcn/ui 现在对从右到左(RTL)布局提供一流支持。你的组件会自动适配阿拉伯语、希伯来语和波斯语等语言。

这适用于 shadcn/ui 组件 以及 shadcn 注册表中分发的任何组件。

"use client"

import * as React from "react"

我们的 RTL 方案

传统上,支持 RTL 的组件库会自带逻辑类。这意味着即使只构建 LTR 布局,大家也得使用像 ms-4start-2 这样的类。

我们采用了不同的方法。shadcn CLI 在安装时转换类,这样你只有在真正需要时才会看到逻辑类。如果你没有构建 RTL,仍然使用熟悉的类如 ml-4left-2。启用 RTL 后,CLI 会帮你自动转换。

你只有在需要时才必须学习 RTL。

工作原理

当你在 components.json 中设置 rtl: true 时,CLI 会自动将物理 CSS 类如 ml-4text-left 转换为逻辑类如 ms-4text-start

  • 物理定位类如 left-*right-* 被转换为 start-*end-*
  • 外边距和内边距类如 ml-*pr-* 被转换为 ms-*pe-*
  • 文本对齐类如 text-left 改为 text-start
  • 方向相关的属性更新为逻辑值。
  • 支持的图标会自动翻转,使用 rtl:rotate-180
  • 动画类如 slide-in-from-left 变成 slide-in-from-start

每个组件的 RTL 示例

我们为每个组件新增了 RTL 示例。你可以在每个组件页面找到实时预览和代码。

تسجيل الدخول إلى حسابك
أدخل بريدك الإلكتروني أدناه لتسجيل الدخول إلى حسابك
"use client"

import * as React from "react"

CLI 更新

新项目:使用 initcreate 命令时加上 --rtl 标志,即可从一开始就启用 RTL。

pnpm dlx shadcn@latest init --rtl
pnpm dlx shadcn@latest create --rtl

现有项目:使用 migrate rtl 命令迁移你的组件。

pnpm dlx shadcn@latest migrate rtl

这会将 ui 目录下的所有组件转换为使用逻辑类。你也可以传入具体路径或通配符。

试用一下

点击以下链接,在 v0 中打开一个支持 RTL 的 Next.js 项目。

在 v0 中打开

相关链接

2026年1月 - 内联起始和结束样式

我们更新了 Base UI 组件的样式以支持 inline-startinline-end 侧值。以下组件现已支持这些值:

  • Tooltip(工具提示)
  • Popover(弹出框)
  • Combobox(组合框)
  • Context Menu(上下文菜单)
  • Dropdown Menu(下拉菜单)
  • Hover Card(悬停卡片)
  • Menubar(菜单栏)
  • Select(选择框)

变更内容

我们添加了新的 Tailwind 类以支持逻辑侧值:

<PopoverPrimitive.Popup
  className={cn(
    "... data-[side=bottom]:slide-in-from-top-2
    data-[side=left]:slide-in-from-right-2
    data-[side=right]:slide-in-from-left-2
    data-[side=top]:slide-in-from-bottom-2
+   data-[side=inline-start]:slide-in-from-right-2
+   data-[side=inline-end]:slide-in-from-left-2 ...",
    className
  )}
/>

使用示例

<Popover>
  <PopoverTrigger>Open</PopoverTrigger>
  <PopoverContent side="inline-start">
    {/* 在 LTR 中向左打开,在 RTL 中向右打开 */}
  </PopoverContent>
</Popover>

LLM 提示

通过运行以下提示,要求你的 LLM 更新你的组件:

Add inline-start and inline-end support to my shadcn/ui components. Add the following Tailwind classes to each component:
 
| File | Component | Add Classes |
|------|-----------|-------------|
| tooltip.tsx | TooltipContent | `data-[side=inline-start]:slide-in-from-right-2 data-[side=inline-end]:slide-in-from-left-2` |
| tooltip.tsx | TooltipArrow | `data-[side=inline-start]:top-1/2! data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-y-1/2
data-[side=inline-end]:top-1/2! data-[side=inline-end]:-left-1 data-[side=inline-end]:-translate-y-1/2` |
| popover.tsx | PopoverContent | `data-[side=inline-start]:slide-in-from-right-2 data-[side=inline-end]:slide-in-from-left-2` |
| hover-card.tsx | HoverCardContent | `data-[side=inline-start]:slide-in-from-right-2 data-[side=inline-end]:slide-in-from-left-2` |
| select.tsx | SelectContent | `data-[side=inline-start]:slide-in-from-right-2 data-[side=inline-end]:slide-in-from-left-2
data-[align-trigger=true]:animate-none` and add `data-align-trigger={alignItemWithTrigger}` attribute |
| combobox.tsx | ComboboxContent | `data-[side=inline-start]:slide-in-from-right-2 data-[side=inline-end]:slide-in-from-left-2` |
| dropdown-menu.tsx | DropdownMenuContent | `data-[side=inline-start]:slide-in-from-right-2 data-[side=inline-end]:slide-in-from-left-2` |
| context-menu.tsx | ContextMenuContent | `data-[side=inline-start]:slide-in-from-right-2 data-[side=inline-end]:slide-in-from-left-2` |
| menubar.tsx | MenubarContent | `data-[side=inline-start]:slide-in-from-right-2 data-[side=inline-end]:slide-in-from-left-2` |
 
Add these classes next to the existing `data-[side=top]`, `data-[side=bottom]`, `data-[side=left]`, `data-[side=right]` classes.