关于 shadcn-baseui
shadcn-baseui 是为 shadcn/ui 与 Base UI 项目提供的开发指南,帮助按 Base UI 的 API 编写组件代码。它重点说明 `render` 插槽模式及 Accordion、Button、Select 等组件与 Radix UI 用法的差异。
主要功能
- 01检查项目是否使用 Base UI
- 02使用 `render` 替代 `asChild`
- 03说明 Accordion 属性差异
- 04说明 Button 的 `nativeButton` 用法
- 05说明 Select 的对齐属性
适用场景
- 01为 Base UI 项目编写组件
- 02将 Radix UI 风格代码改为 Base UI 用法
- 03配置 Accordion 单项或多项模式
- 04用 Button 包装链接元素
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ thunderboltdev/ shadcn-baseui --skill shadcn-baseui安装后在 Claude Code 中输入/shadcn-baseui确认已加载。
附带文件LICENSEREADME.md
详细介绍
shadcn/ui + Base UI 指南
使用 Base UI 时如何使用 shadcn/ui 组件的指南。避免大模型错误地建议 Radix UI 模式(如 asChild 等)。
⚠️ 重要: 在建议任何代码之前,请检查 components.json,确认这是一个 Base UI 项目。style 字段应以 "base-" 开头(例如 "base-vega"、"base-nova"、"base-maia"、"base-lyra"、"base-mira")。如果它以其他内容开头,则此指南不适用。
确保已安装 @base-ui/react 包。如果尚未安装,请使用适当的包管理器安装。
Slot 模式
Radix UI 与 Base UI 的主要区别在于 Slot 模式。Radix UI 使用 asChild,而 Base UI 使用 render 属性。始终优先使用 render 属性,而不是 asChild。
规则: 所有触发器/包装组件都必须使用 render 属性,而不是 asChild。
适用于:DialogTrigger、AlertDialogTrigger、PopoverTrigger、DropdownMenuTrigger、TooltipTrigger、SelectTrigger、TabsTrigger、AccordionTrigger、Button(包装链接时)等。
// ❌ INCORRECT
<DialogTrigger asChild>
<Button variant="outline">Click me</Button>
</DialogTrigger>
// ✅ CORRECT
<DialogTrigger render={<Button variant="outline" />}>
Click me
</DialogTrigger>
// ✅ ALSO CORRECT
<DialogTrigger render={<Button variant="outline">Click me</Button>} />
属性
除了 Slot 模式之外,只有以下组件的属性有所不同。使用这些组件时,请遵循对应的组件指南。
Accordion
Accordion 组件没有 type 属性,请改用布尔属性 multiple。defaultValue 属性始终基于数组。
- 单选模式
// ❌ INCORRECT
<Accordion type="single" defaultValue="item-1">
<AccordionItem value="item-1">
// ...
</AccordionItem>
</Accordion>
// ✅ CORRECT
<Accordion defaultValue={["item-1"]}>
<AccordionItem value="item-1">
// ...
</AccordionItem>
</Accordion>
- 多选模式
// ❌ INCORRECT
<Accordion type="multiple" defaultValue={["item-1", "item-2"]}>
<AccordionItem value="item-1">...</AccordionItem>
<AccordionItem value="item-2">...</AccordionItem>
</Accordion>
// ✅ CORRECT
<Accordion multiple defaultValue={["item-1", "item-2"]}>
<AccordionItem value="item-1">...</AccordionItem>
<AccordionItem value="item-2">...</AccordionItem>
</Accordion>
Button(特殊情况)
将 Button 渲染为非按钮元素(例如 Link)时,必须添加 nativeButton={false}。
// ❌ INCORRECT - Radix pattern
import Link from "next/link";
<Button asChild variant="ghost">
<Link href="/dashboard">Dashboard</Link>
</Button>
// ✅ CORRECT - Base UI pattern
import Link from "next/link";
<Button render={<Link href="/dashboard" />} variant="ghost" nativeButton={false}>
Dashboard
</Button>
Select
position 属性已被布尔属性 alignItemWithTrigger 替代,该属性默认为 true。
// ❌ INCORRECT
<SelectContent position="popper">
// ...
</SelectContent>
// ✅ CORRECT
<SelectContent alignItemWithTrigger={false}>
// ...
</SelectContent>