关于 react-shadcn
面向 React SPA(Vite)项目的 shadcn/ui 开发技能,指导使用项目现有的组件基础库构建可访问的 UI。涵盖表单、覆盖层、反馈、数据展示和导航,并将 MCP 注册表检索纳入实现流程。
主要功能
- 01支持 Base UI、Radix UI 和 React Aria
- 02涵盖表单、覆盖层与反馈组件
- 03提供数据展示和导航组件模式
- 04要求先识别组件基础库
- 05通过 CLI 安装注册表组件
适用场景
- 01为 React SPA 添加表单
- 02实现对话框、抽屉和弹出层
- 03构建数据表格与导航菜单
- 04按项目基础库组合 UI 组件
MCP 相关
可通过 shadcn MCP 注册表工具搜索组件、查看源代码和示例,并获取安装命令。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ fusengine/ agents --skill react-shadcn安装后在 Claude Code 中输入/react-shadcn确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/accordion.mdalert-dialog.mdalert.mdaspect-ratio.mdavatar.mdbadge.mdbreadcrumb.mdbutton.mdcalendar.mdcard.mdcarousel.mdchart.mdcheckbox.mdcollapsible.mdcommand.mdconfiguration.mdcontext-menu.mddialog.mddrawer.mddropdown.mdfield-patterns.mdform-examples.mdhover-card.mdinput-otp.mdinput.mdinstallation.mdlabel.mdmenubar.mdnavigation-menu.mdpagination.md详细介绍
要求先从 components.json 检测组件基础,再编写任何组件代码;使用 bunx --bun shadcn@latest add 安装组件(绝不手写),并通过 MCP registry 工具(mcp__shadcn__*)在实现前查找组件。这是适用于纯 React 的 shadcn/ui 版本;Next.js App Router 请参阅 nextjs-shadcn。
React 版 shadcn/ui
基于 Base UI、Radix UI 或 React Aria 原语构建的无障碍、可复制到项目中的组件,采用 Tailwind CSS v4 样式。
Agent 工作流(强制)
任何实现开始前,必须并行启动 3 个 Agent,每个调用 Agent 时都要指定一个 name:
- fuse-ai-pilot:explore-codebase - 分析现有组件和模式
- fuse-ai-pilot:research-expert - 通过 Context7/Exa 核实最新的 shadcn/ui 文档
- mcp__shadcn__* - 在 registry 中搜索可用组件
实现完成后,运行 fuse-ai-pilot:sniper 进行验证。
概览
适用场景
- 为 React 应用(Vite)构建 UI 组件
- 需要无障碍、可自定义的表单组件(输入框、选择框、复选框)
- 实现对话框、侧边面板、抽屉或覆盖层模式
- 创建支持排序、筛选和分页的数据表格
- 构建导航菜单、侧边栏或命令面板
- 需要 Toast 通知或警告反馈组件
为什么选择 shadcn/ui
| 特性 | 优势 |
|---|---|
| 复制/粘贴模式 | 将组件复制到项目中,完全拥有组件 |
| 可选基础 | Base UI(默认)、Radix UI 或 React Aria——组件名称相同 |
| Tailwind CSS v4 样式 | CSS 优先的主题(@theme inline、OKLCH 令牌) |
| 支持 TanStack Form | Field + FieldError 接受 Standard Schema 错误 |
| Lucide 图标(默认) | 在 components.json 中通过 iconLibrary 配置,可通过 migrate icons 切换 |
关键规则
- 先检测组件基础 - 读取
components.json中的style:base-*= Base UI,radix-*/new-york= Radix,aria-*= React Aria。单个组件中绝不可混用不同基础 - 新项目默认使用 Base UI - 除非传入
-b radix/-b aria,否则init会选择 Base UI - 组合方式遵循组件基础 - Base UI 使用
render={<Button />};Radix 使用asChild。在 Base UI 项目中,必须将标记为 Radix 的示例转换后再使用 - 绝不手动创建组件 - 始终使用
bunx --bun shadcn@latest add安装(registry 会提供适配项目组件基础的变体) - 仅使用 TanStack Form - 不得使用 React Hook Form;在
Field上设置data-invalid,并在控件上设置aria-invalid,以关联错误 - SOLID 路径 - 组件位于
@/modules/cores/shadcn/components/ui/
会改变代码的基础差异
| 关注点 | Base UI(默认) | Radix UI |
|---|---|---|
| 包 | @base-ui/react | radix-ui(统一包;从 @radix-ui/react-* 迁移时使用 migrate radix) |
| 将触发器设为自定义元素 | <DialogTrigger render={<Button />}>Open</DialogTrigger> | <DialogTrigger asChild><Button>Open</Button></DialogTrigger> |
| Select | <Select items={items}>、SelectContent alignItemWithTrigger | <SelectContent position="item-aligned" | "popper"> |
| Accordion | multiple、defaultValue={["item-1"]} | type="single" collapsible / type="multiple" |
| Toggle group 的值 | 数组(defaultValue={["bold"]})、multiple | type="single" | "multiple" |
| Checkbox 不确定状态 | indeterminate 属性 | checked="indeterminate" |
| Drawer | Base UI Drawer(swipeDirection) | Vaul(direction) |
| Toast | add toast → toast.add({ title }) | add sonner → 来自 sonner 的 toast("…") |
| 打开状态样式 | data-open / data-closed | data-state="open"(两者都由 shadcn/tailwind.css 中的 data-open: 变体覆盖) |
不同基础之间的共通项:组件名称、DialogContent/SheetContent 上的 showCloseButton、
Field 系列、主题令牌。
架构
组件基础
- 原语 - Base UI / Radix UI / React Aria(由
components.json指定) - Tailwind CSS v4 - 以 CSS 为先的配置:
@import "tailwindcss"、@import "shadcn/tailwind.css"、@custom-variant dark、@theme inline - class-variance-authority - 管理组件样式变体
cn包 - 注册表组件使用import { cn } from "cn"(2026 年 9 月发布,可直接替代twMerge(clsx(...)));lib/utils.ts会重新导出它;使用shadcn migrate cn迁移旧项目
项目结构
组件遵循 SOLID 架构,安装到 @/modules/cores/shadcn/components/ui/。工具函数位于 @/modules/cores/lib/utils.ts(export { cn } from "cn")。
MCP 服务集成
运行 bunx --bun shadcn@latest mcp init --client claude(或创建 .mcp.json),即可与 shadcn 注册表集成到 Claude Code。
可用的 MCP 工具
mcp__shadcn__search_items_in_registries- 搜索可用组件mcp__shadcn__view_items_in_registries- 查看组件源代码mcp__shadcn__get_item_examples_from_registries- 获取用法示例mcp__shadcn__get_add_command_for_items- 获取安装命令
面向 Agent 的 CLI 辅助命令:shadcn info(框架、基础、已安装组件)和 shadcn docs <component> -b <base|radix|aria>。
完整设置说明请参阅 installation.md。
组件类别
| 类别 | 组件 | 主要参考 |
|---|---|---|
| 设置 | 初始化、配置、主题、图标 | installation.md |
| 表单 | Button、Input、Field、Select、Checkbox、Switch、Slider | field-patterns.md |
| 覆盖层 | Dialog、Sheet、Drawer、Popover、Tooltip、HoverCard | dialog.md |
| 反馈 | Alert、Toast(Base UI)/ Sonner(Radix、Aria)、Progress、Skeleton、Spinner | toast.md |
| 数据展示 | Table、Badge、Avatar、Calendar、Chart、Carousel | table.md |
| 导航 | Breadcrumb、DropdownMenu、Command、Sidebar、Tabs | sidebar.md |
| 布局 | Card、Accordion、Separator、ScrollArea、Resizable | card.md |
除非另有标注,组件参考文档展示的是 Radix API;每篇文档都会在顶部列出 Base UI 的差异。
最佳实践
- 字段组件 -
Field+FieldLabel+FieldError errors={field.state.meta.errors} - 客户端组件 - React 应用默认在客户端运行(
"rsc": false) - 按基础组件选择 Toast - 使用 Base UI 时采用 Base UI Toast;使用 Radix/Aria 时采用 Sonner(Radix Toast 已弃用)
- 优先使用 MCP 工具 - 实现前使用
mcp__shadcn__*进行探索 - 通过 CSS 变量设置主题 - 在
src/index.css的:root/.dark中定义 OKLCH 令牌,并通过@theme inline暴露 - 无障碍访问 - 依赖基础组件的键盘导航和 ARIA;在无效控件上保留
aria-invalid
参考指南
| 需求 | 参考资料 |
|---|---|
| 初始设置 | installation.md、configuration.md |
| 表单模式 | field-patterns.md、form-examples.md |
| 主题自定义 | theming.md |
| 数据表格 | table.md |
| 模态对话框 | dialog.md、alert-dialog.md |
| 导航 | sidebar.md、navigation-menu.md |