简介

设计精美的组件,你可以直接复制并粘贴到你的应用程序中。无障碍支持。可高度定制。完全开源。

什么是 shadcn/ui?

不是一个组件库。它是一套可重用的组件集合,你可以通过复制粘贴将其集成到你的项目中。

“不是组件库”是什么意思?

这意味着你不需要将其作为依赖项安装。它不通过 npm 或 yarn 分发。

你只需要挑选你需要的组件。将代码复制并粘贴到你的项目中,并根据你的需要进行定制。代码是属于你的。

为什么要这样做?

我们相信开发者应该拥有对代码的绝对所有权和控制权。这让你能够决定组件是如何构建和装饰的,而不是受制于第三方库的 API 限制。

  • 基于 Radix UI 构建交互原语。
  • 使用 Tailwind CSS 处理样式。
  • 透明度:每一行代码都在你眼前,没有黑盒。
  • AI 友好:由于代码就在你的项目中,LLM 可以轻松阅读、理解并根据需求进行改进。

安装

shadcn/ui 支持多种框架和工具。推荐的方式是使用 CLI 工具来初始化你的项目。

项目初始化

在你的终端中运行以下命令:

npx shadcn@latest init

该命令会引导你完成 `components.json` 的配置:

  • 是否使用 TypeScript? (yes/no)
  • 你希望使用哪种样式风格? (Default / New York)
  • 基础色系选择 (Slate / Gray / Zinc / Neutral / Stone)
  • 全局 CSS 文件的位置?
  • 是否使用 CSS 变量来处理颜色?

支持的框架

不论你使用的是哪种现代 React 框架,我们都提供了适配方案:

  • Next.js:大多数应用的首选推荐。
  • Vite:适用于不含 SSR 的 React 项目。
  • Astro:内容驱动型网站的绝佳选择。
  • Remix:全栈 React 应用。

CLI 命令行工具

使用 CLI 轻松添加组件并管理你的项目配置。

常用命令

init

初始化项目并创建 `components.json` 配置文件。

npx shadcn@latest init

add

向项目中添加特定组件。例如添加按钮组件:

npx shadcn@latest add button

常用选项

  • -y, --yes:跳过确认提示,直接执行。
  • -o, --overwrite:覆盖已存在的组件文件。
  • -c, --cwd <path>:指定工作目录。

主题定制

shadcn/ui 使用 CSS 变量 (CSS Variables) 进行主题化管理。这让你可以直接改变全局外观而无需修改单个组件逻辑。

CSS 变量配置

我们在全局 CSS 文件中使用 `:root` 定义颜色变量。所有的变量都采用 HSL 格式以便于 Tailwind 进行透明度处理。

:root { --background: 0 0% 100%; --foreground: 222.2 47.4% 11.2%; --primary: 222.2 47.4% 11.2%; --border: 214.3 31.8% 91.4%; /* ...其他变量 */ }

定制约定

  • HSL 格式:所有颜色必须遵循 HSL 定义(如 0 0% 100%)。
  • 无障碍性:在定制主色调时,请务必检查背景与前景的对比度。
  • 圆角半径:通过 --radius 变量统一控制全站组件圆角。

暗黑模式

通过 `next-themes` 或原生的 Tailwind `class` 策略为你的站点添加暗黑模式支持。

Next.js 实现步骤

  1. 安装依赖:npm install next-themes
  2. 在根布局中使用 ThemeProvider 包裹子组件。
  3. 添加一个模式切换按钮 (Mode Toggle)。
import { ThemeProvider } from "next-themes" export function Providers({ children }) { return ( <ThemeProvider attribute="class" defaultTheme="system" enableSystem> {children} </ThemeProvider> ) }

排版规范

我们为标题、段落、列表等元素预设了一系列一致的排版样式。

常用基础样式

一级标题 (H1)

scroll-m-20 text-4xl font-extrabold tracking-tight lg:text-5xl

二级标题 (H2)

scroll-m-20 border-b pb-2 text-3xl font-semibold tracking-tight

正文段落 (P)

leading-7 [&:not(:first-child)]:mt-6

调用示例

export function TypographyH1() { return ( <h1 className="scroll-m-20 text-4xl font-extrabold tracking-tight lg:text-5xl"> 这是一个极致极简的文档标题 </h1> ) }

Accordion 手风琴

一组垂直堆叠的交互式标题,每个标题都能展示一个内容区域。

说明

此组件基于 Radix UI 的 Accordion 原语构建,并由 Tailwind CSS 定义样式。它完全支持键盘导航和屏幕阅读器。

安装

npx shadcn@latest add accordion

用法示例

import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion" export function AccordionDemo() { return ( <Accordion type="single" collapsible defaultValue="item-1"> <AccordionItem value="item-1"> <AccordionTrigger>它是否支持无障碍?</AccordionTrigger> <AccordionContent> 是的。它完全遵循 WAI-ARIA 设计模式。 </AccordionContent> </AccordionItem> </Accordion> ) }

API 参考

  • Accordion 根容器。类型可选 singlemultiple
  • AccordionItem 包含触点和内容的包装器。
  • AccordionTrigger 触发展开/关闭的标题部分。
  • AccordionContent 被折叠的面板内容。

Button 按钮

具有多种样式变体和尺寸的通用按钮。支持加载状态、图标集成以及作为子元素分发。

安装

npx shadcn@latest add button

用法

import { Button } from "@/components/ui/button" export function ButtonDemo() { return <Button variant="outline">确定</Button> }

属性 (Props)

属性 类型 默认值 说明
variant default | outline | ghost... default 视觉变体
size default | sm | lg | icon default 尺寸步阶
asChild boolean false 是否渲染为子元素容器

Dialog 对话框

覆盖在主窗口之上的模态弹出框。通常用于关键性确认或输入任务。

说明

对话框会在打开时锁定背景滚动,并提供完整的焦点捕获(Focus Trap)与无障碍属性(Aria-labelledby / describedby)。

安装

npx shadcn@latest add dialog

用法示例

import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" export function DialogDemo() { return ( <Dialog> <DialogTrigger>打开对话框</DialogTrigger> <DialogContent> <DialogHeader> <DialogTitle>确认此操作?</DialogTitle> <DialogDescription> 此操作无法撤销。系统将永久删除相关的用户记录。 </DialogDescription> </DialogHeader> </DialogContent> </Dialog> ) }

核心组件

  • Dialog 主容器,通过 Context 共享状态。
  • DialogTrigger 交互触发器,通常为一个按钮。
  • DialogContent 实际渲染在 Portal 中的弹出内容。
  • DialogHeader / Footer 预置的结构化布局。