- 手风琴
- 提示
- 警告对话框
- 宽高比
- 头像
- 徽章
- 面包屑导航
- 按钮
- 按钮组
- 日历 Calendar
- 卡片
- Carousel
- 图表 Chart
- 复选框
- 折叠面板
- 组合框
- 命令
- 上下文菜单
- 数据表格 Data Table
- 日期选择器 Date Picker
- 对话框 Dialog
- 抽屉
- 下拉菜单
- Empty
- 字段
- 悬停卡片
- 输入
- 输入组
- 输入 OTP
- 项目
- Kbd
- 标签
- 菜单栏
- 原生选择框
- 导航菜单 Navigation Menu
- 分页
- 弹出框
- 进度 Progress
- 单选框组
- 可调整大小
- 滚动区域 Scroll Area
- 选择框
- 分隔符 Separator
- 侧边栏 Sheet
- 侧边栏 Sidebar
- 骨架屏
- 滑块
- Sonner
- 加载指示器 Spinner
- 开关
- 表格
- 标签页 Tabs
- 文本域
- 吐司
- 切换按钮 Toggle
- 切换组
- 提示 Tooltip
- 排版
我们诚邀社区成员为 块库 贡献组件。与其他开发者分享您的组件和块,帮助构建一个高质量、可复用组件的库。
我们期待看到各种类型的块:应用程序、营销、产品等。
设置您的工作区
Fork 仓库
git clone https://github.com/shadcn-ui/ui.git新建一个分支
git checkout -b username/my-new-block安装依赖
pnpm install启动开发服务器
pnpm www:dev添加一个块
一个块可以是一个单独的组件(例如一个 UI 组件的变体),也可以是一个复杂组件(例如一个仪表盘),包含多个组件、hooks 和工具函数。
创建一个新块
在 apps/www/registry/new-york/blocks 目录下创建一个新文件夹。确保文件夹名采用 kebab-case 格式,且在 new-york 目录下。
apps
└── www
└── registry
└── new-york
└── blocks
└── dashboard-01注意: 构建脚本会负责为 default 样式构建该块。
添加块文件
将您的文件添加到块文件夹中。下面是一个包含页面、组件、hooks 和工具函数的块示例。
dashboard-01
└── page.tsx
└── components
└── hello-world.tsx
└── example-card.tsx
└── hooks
└── use-hello-world.ts
└── lib
└── format-date.ts注意: 您可以从一个文件开始,后续再添加更多文件。
将您的块添加到注册表
在 registry-blocks.tsx 中添加块定义
要将您的块添加到注册表,需要将块定义加入到 registry-blocks.ts 中。
该定义遵循注册表的模式,参考https://ui.shadcn.com/schema/registry-item.json。
export const blocks = [
// ...
{
name: "dashboard-01",
author: "shadcn (https://ui.shadcn.com)",
title: "Dashboard",
description: "一个带有 Hello World 组件的简单仪表盘。",
type: "registry:block",
registryDependencies: ["input", "button", "card"],
dependencies: ["zod"],
files: [
{
path: "blocks/dashboard-01/page.tsx",
type: "registry:page",
target: "app/dashboard/page.tsx",
},
{
path: "blocks/dashboard-01/components/hello-world.tsx",
type: "registry:component",
},
{
path: "blocks/dashboard-01/components/example-card.tsx",
type: "registry:component",
},
{
path: "blocks/dashboard-01/hooks/use-hello-world.ts",
type: "registry:hook",
},
{
path: "blocks/dashboard-01/lib/format-date.ts",
type: "registry:lib",
},
],
categories: ["dashboard"],
},
]确保您填写了 name、description、type、registryDependencies、dependencies、files 和 categories。我们将在模式文档(即将发布)中详细介绍这些字段。
运行构建脚本
pnpm registry:build注意: 不需要每次更改都运行该脚本,仅在更新块定义时运行它即可。
查看您的块
构建脚本完成后,您可以在 http://localhost:3333/blocks/[CATEGORY] 查看您的块,或者在 http://localhost:3333/view/styles/new-york/dashboard-01 进行全屏预览。


构建您的块
您现在可以通过编辑块文件夹中的文件来构建您的块,并在浏览器中查看更改。
如果添加了更多文件,请确保在块定义中的 files 数组中添加它们。
发布您的块
准备好发布您的块后,您可以提交一个 pull request 到主仓库。
运行构建脚本
pnpm registry:build捕获截图
pnpm registry:capture注意: 如果之前运行过捕获截图的脚本,可能需要删除 apps/www/public/r/styles/new-york 目录下已有的截图(包含明暗模式),然后重新运行脚本。
提交 Pull Request
提交您的更改并创建一个 Pull Request 到主仓库。
您的块将被审核合并。合并后,将发布到网站,并通过 CLI 可供安装。
分类
categories 属性用于在注册表中组织您的块。
添加分类
如果需要添加新分类,可以在 apps/www/registry/registry-categories.ts 中的 registryCategories 数组添加。
export const registryCategories = [
// ...
{
name: "Input",
slug: "input",
hidden: false,
},
]指南
以下是向块库贡献时的部分规范:
- 块定义必须包含的属性有:
name、description、type、files和categories。 - 确保在
registryDependencies中列出所有注册表依赖。注册表依赖是注册表中组件的名称,如input、button、card等。 - 确保在
dependencies中列出所有包依赖。包依赖是注册表中包的名称,如zod、sonner等。 - 如果您的块包含页面(可选),应将其作为
files数组中的第一个条目,并包含target属性。这有助于 CLI 将页面放置在文件路由的正确位置。 - 导入语句应始终使用
@/registry路径。 例如:import { Input } from "@/registry/new-york/input"