commit c77e6c2d171bcd09def06eefcd9799a2636d3041 Author: wehub-skill-sync Date: Mon Jul 13 21:36:22 2026 +0800 chore: import zh skill shadcn diff --git a/README.wehub.md b/README.wehub.md new file mode 100644 index 0000000..b2da4ec --- /dev/null +++ b/README.wehub.md @@ -0,0 +1,9 @@ +# WeHub 来源说明 + +- Skill 名称:`shadcn` +- 中文类目:shadcn/ui 组件初始化与定制 +- 上游仓库:`sickn33__antigravity-awesome-skills` +- 上游路径:`plugins/antigravity-awesome-skills-claude/skills/shadcn/SKILL.md` +- 上游链接:https://github.com/sickn33/antigravity-awesome-skills/blob/HEAD/plugins/antigravity-awesome-skills-claude/skills/shadcn/SKILL.md +- 本仓库为 WeHub 中文 Skill 汉化包,基于 skill 市场筛选 Top200 清单整理 +- 原作者、版权和许可证信息以上游仓库为准 diff --git a/SKILL.md b/SKILL.md new file mode 100644 index 0000000..06afb53 --- /dev/null +++ b/SKILL.md @@ -0,0 +1,254 @@ +--- +name: shadcn +description: 管理 shadcn/ui 组件和项目,提供上下文、文档和使用模式,用于构建现代设计系统。 +user-invocable: false +risk: safe +source: https://github.com/shadcn-ui/ui/tree/main/skills/shadcn +date_added: "2026-03-07" +--- + +# shadcn/ui + +一个用于构建 UI、组件和设计系统的框架。组件通过 CLI 以源代码形式添加到用户项目中。 + +> **重要提示:** 使用项目的包运行器执行所有 CLI 命令:`npx shadcn@latest`、`pnpm dlx shadcn@latest` 或 `bunx --bun shadcn@latest`——基于项目的 `packageManager`。以下示例使用 `npx shadcn@latest`,但请替换为项目对应的正确运行器。 + +## 何时使用 +- 当从 shadcn/ui 或社区注册表添加新组件时使用。 +- 当对现有 shadcn/ui 组件进行样式设置、组合或调试时使用。 +- 当初始化新项目或切换设计系统预设时使用。 +- 用于获取组件文档、示例和 API 参考。 + +## 当前项目上下文 + +```json +!`npx shadcn@latest info --json 2>/dev/null || echo '{"error": "No shadcn project found. Run shadcn init first."}'` +``` + +上述 JSON 包含项目配置和已安装的组件。使用 `npx shadcn@latest docs ` 获取任意组件的文档和示例 URL。 + +## 原则 + +1. **优先使用现有组件。** 在编写自定义 UI 之前,使用 `npx shadcn@latest search` 检查注册表。同时也要检查社区注册表。 +2. **组合,不要重新发明。** 设置页面 = Tabs + Card + 表单控件。仪表板 = Sidebar + Card + Chart + Table。 +3. **优先使用内置变体,而非自定义样式。** 例如 `variant="outline"`、`size="sm"` 等。 +4. **使用语义化颜色。** 例如 `bg-primary`、`text-muted-foreground`——绝不使用 `bg-blue-500` 这样的原始值。 + +## 关键规则 + +以下规则**始终强制执行**。每条规则链接到一个包含错误/正确代码对的文件。 + +### 样式与 Tailwind → [styling.md](./rules/styling.md) + +- **`className` 用于布局,而非样式。** 切勿覆盖组件的颜色或排版。 +- **不要使用 `space-x-*` 或 `space-y-*`。** 使用 `flex` 配合 `gap-*`。对于垂直堆叠,使用 `flex flex-col gap-*`。 +- **当宽度和高度相等时使用 `size-*`。** 使用 `size-10` 而非 `w-10 h-10`。 +- **使用 `truncate` 简写。** 而非 `overflow-hidden text-ellipsis whitespace-nowrap`。 +- **不要手动使用 `dark:` 颜色覆盖。** 使用语义化令牌(`bg-background`、`text-muted-foreground`)。 +- **使用 `cn()` 处理条件类名。** 不要手写模板字面量三元表达式。 +- **覆盖类组件上不要手动设置 `z-index`。** Dialog、Sheet、Popover 等会自行处理层级。 + +### 表单与输入 → [forms.md](./rules/forms.md) + +- **表单使用 `FieldGroup` + `Field`。** 切勿在表单布局中使用原始的 `div` 配合 `space-y-*` 或 `grid gap-*`。 +- **`InputGroup` 使用 `InputGroupInput`/`InputGroupTextarea`。** 切勿在 `InputGroup` 内部使用原始的 `Input`/`Textarea`。 +- **输入框内的按钮使用 `InputGroup` + `InputGroupAddon`。** +- **选项集(2–7 个选项)使用 `ToggleGroup`。** 不要循环使用 `Button` 并手动维护激活状态。 +- **使用 `FieldSet` + `FieldLegend` 对相关复选框/单选框进行分组。** 不要使用带标题的 `div`。 +- **字段验证使用 `data-invalid` + `aria-invalid`。** 在 `Field` 上使用 `data-invalid`,在控件上使用 `aria-invalid`。对于禁用状态:在 `Field` 上使用 `data-disabled`,在控件上使用 `disabled`。 + +### 组件结构 → [composition.md](./rules/composition.md) + +- **项始终放在其 Group 内部。** `SelectItem` → `SelectGroup`。`DropdownMenuItem` → `DropdownMenuGroup`。`CommandItem` → `CommandGroup`。 +- **使用 `asChild`(radix)或 `render`(base)实现自定义触发器。** 从 `npx shadcn@latest info` 检查 `base` 字段。→ [base-vs-radix.md](./rules/base-vs-radix.md) +- **Dialog、Sheet 和 Drawer 始终需要 Title。** `DialogTitle`、`SheetTitle`、`DrawerTitle` 对无障碍访问是必需的。如果视觉上需要隐藏,使用 `className="sr-only"`。 +- **使用完整的 Card 组合。** `CardHeader`/`CardTitle`/`CardDescription`/`CardContent`/`CardFooter`。不要把所有内容都塞进 `CardContent`。 +- **Button 没有 `isPending`/`isLoading`。** 使用 `Spinner` + `data-icon` + `disabled` 组合。 +- **`TabsTrigger` 必须放在 `TabsList` 内部。** 切勿直接在 `Tabs` 中渲染触发器。 +- **`Avatar` 始终需要 `AvatarFallback`。** 用于图片加载失败的情况。 + +### 使用组件,而非自定义标记 → [composition.md](./rules/composition.md) + +- **在编写自定义标记之前,优先使用现有组件。** 在编写带样式的 `div` 之前,先检查是否存在可用的组件。 +- **提示/标注使用 `Alert`。** 不要构建自定义样式的 div。 +- **空状态使用 `Empty`。** 不要构建自定义的空状态标记。 +- **Toast 通过 `sonner` 实现。** 使用 `sonner` 中的 `toast()` 函数。 +- **使用 `Separator`** 替代 `
` 或 `
`。 +- **使用 `Skeleton`** 作为加载占位符。不要使用自定义的 `animate-pulse` div。 +- **使用 `Badge`** 替代自定义样式的 span。 + +### 图标 → [icons.md](./rules/icons.md) + +- **`Button` 中的图标使用 `data-icon`。** 在图标上使用 `data-icon="inline-start"` 或 `data-icon="inline-end"`。 +- **组件内部的图标不要添加尺寸类。** 组件通过 CSS 处理图标尺寸。不要使用 `size-4` 或 `w-4 h-4`。 +- **将图标作为对象传递,而非字符串键。** 使用 `icon={CheckIcon}`,而不是字符串查找。 + +### CLI + +- **切勿手动解码或获取预设代码。** 直接将其传递给 `npx shadcn@latest init --preset `。 + +## 关键模式 + +以下是区分正确 shadcn/ui 代码的最常见模式。对于边界情况,请参见上面链接的规则文件。 + +```tsx +// 表单布局:使用 FieldGroup + Field,而非 div + Label。 + + + 邮箱 + + + + +// 验证:在 Field 上使用 data-invalid,在控件上使用 aria-invalid。 + + 邮箱 + + 无效的邮箱地址。 + + +// 按钮中的图标:使用 data-icon,不要添加尺寸类。 + + +// 间距:使用 gap-*,而非 space-y-*。 +
// 正确 +
// 错误 + +// 相等尺寸:使用 size-*,而非 w-* h-*。 + // 正确 + // 错误 + +// 状态颜色:使用 Badge 变体或语义化令牌,而非原始颜色。 ++20.1% // 正确 ++20.1% // 错误 +``` + +## 组件选择 + +| 需求 | 使用 | +| ------------------------ | ---------------------------------------------------------------------------------------------------- | +| 按钮/操作 | `Button`,配合适当的 variant | +| 表单输入 | `Input`、`Select`、`Combobox`、`Switch`、`Checkbox`、`RadioGroup`、`Textarea`、`InputOTP`、`Slider` | +| 在 2–5 个选项之间切换 | `ToggleGroup` + `ToggleGroupItem` | +| 数据展示 | `Table`、`Card`、`Badge`、`Avatar` | +| 导航 | `Sidebar`、`NavigationMenu`、`Breadcrumb`、`Tabs`、`Pagination` | +| 覆盖层 | `Dialog`(模态框)、`Sheet`(侧面板)、`Drawer`(底部面板)、`AlertDialog`(确认弹窗) | +| 反馈 | `sonner`(Toast)、`Alert`、`Progress`、`Skeleton`、`Spinner` | +| 命令面板 | `Dialog` 内部的 `Command` | +| 图表 | `Chart`(封装 Recharts) | +| 布局 | `Card`、`Separator`、`Resizable`、`ScrollArea`、`Accordion`、`Collapsible` | +| 空状态 | `Empty` | +| 菜单 | `DropdownMenu`、`ContextMenu`、`Menubar` | +| 工具提示/信息 | `Tooltip`、`HoverCard`、`Popover` | + +## 关键字段 + +注入的项目上下文包含以下关键字段: + +- **`aliases`** → 为导入使用实际的别名前缀(例如 `@/`、`~/`),切勿硬编码。 +- **`isRSC`** → 当为 `true` 时,使用 `useState`、`useEffect`、事件处理器或浏览器 API 的组件需要在文件顶部添加 `"use client"`。在就此指令提供建议时,始终参考此字段。 +- **`tailwindVersion`** → `"v4"` 使用 `@theme inline` 块;`"v3"` 使用 `tailwind.config.js`。 +- **`tailwindCssFile`** → 定义自定义 CSS 变量的全局 CSS 文件。始终编辑此文件,切勿新建。 +- **`style`** → 组件视觉风格(例如 `nova`、`vega`)。 +- **`base`** → 底层基础库(`radix` 或 `base`)。影响组件 API 和可用属性。 +- **`iconLibrary`** → 决定图标的导入来源。`lucide` 使用 `lucide-react`,`tabler` 使用 `@tabler/icons-react`,以此类推。切勿假设使用 `lucide-react`。 +- **`resolvedPaths`** → 组件、工具函数、Hook 等的精确文件系统目标路径。 +- **`framework`** → 路由和文件约定(例如 Next.js App Router 与 Vite SPA)。 +- **`packageManager`** → 用于安装任何非 shadcn 依赖(例如 `pnpm add date-fns` 与 `npm install date-fns`)。 + +完整字段参考请参见 [cli.md — `info` 命令](./cli.md)。 + +## 组件文档、示例与用法 + +运行 `npx shadcn@latest docs ` 获取组件的文档、示例和 API 参考的 URL。获取这些 URL 以查看实际内容。 + +```bash +npx shadcn@latest docs button dialog select +``` + +**在创建、修复、调试或使用组件时,始终先运行 `npx shadcn@latest docs` 并获取 URL。** 这确保你使用的是正确的 API 和使用模式,而非凭空猜测。 + +## 工作流程 + +1. **获取项目上下文**——已在上方注入。如果需要刷新,再次运行 `npx shadcn@latest info`。 +2. **首先检查已安装的组件**——在运行 `add` 之前,始终检查项目上下文中的 `components` 列表,或列出 `resolvedPaths.ui` 目录。不要导入尚未添加的组件,也不要重复添加已安装的组件。 +3. **查找组件**——`npx shadcn@latest search`。 +4. **获取文档和示例**——运行 `npx shadcn@latest docs ` 获取 URL,然后获取这些 URL 的内容。使用 `npx shadcn@latest view` 浏览尚未安装的注册表项。要预览对已安装组件的更改,使用 `npx shadcn@latest add --diff`。 +5. **安装或更新**——`npx shadcn@latest add`。更新现有组件时,先使用 `--dry-run` 和 `--diff` 预览更改(请参见下文[更新组件](#updating-components))。 +6. **修复第三方组件中的导入路径**——从社区注册表(例如 `@bundui`、`@magicui`)添加组件后,检查新增的非 UI 文件中是否存在硬编码的导入路径(如 `@/components/ui/...`)。这些路径可能与项目实际的别名不匹配。使用 `npx shadcn@latest info` 获取正确的 `ui` 别名(例如 `@workspace/ui/components`)并相应重写导入。CLI 会为其自己的 UI 文件重写导入路径,但第三方注册表组件可能使用与项目不匹配的默认路径。 +7. **审查新增的组件**——从任何注册表添加组件或块之后,**始终读取新增的文件并验证其正确性**。检查是否缺少子组件(例如 `SelectItem` 没有 `SelectGroup`)、缺少导入、组合不正确或违反[关键规则](#关键规则)。同时将所有图标导入替换为项目上下文中的 `iconLibrary`(例如,如果注册表项使用 `lucide-react` 但项目使用 `hugeicons`,则相应替换导入和图标名称)。解决所有问题后再继续。 +8. **注册表必须明确指定**——当用户要求添加块或组件时,**不要猜测注册表**。如果没有指定注册表(例如用户说"添加一个登录块"但没有指定 `@shadcn`、`@tailark` 等),询问使用哪个注册表。切勿代表用户默认选择注册表。 +9. **切换预设**——先询问用户:**重新安装(reinstall)**、**合并(merge)** 还是 **跳过(skip)**? + - **重新安装**:`npx shadcn@latest init --preset --force --reinstall`。覆盖所有组件。 + - **合并**:`npx shadcn@latest init --preset --force --no-reinstall`,然后运行 `npx shadcn@latest info` 列出已安装的组件,再对每个已安装组件分别使用 `--dry-run` 和 `--diff` 进行[智能合并](#updating-components)。 + - **跳过**:`npx shadcn@latest init --preset --force --no-reinstall`。仅更新配置和 CSS,组件保持不变。 + +## 更新组件 + +当用户要求从上游更新组件同时保留本地更改时,使用 `--dry-run` 和 `--diff` 进行智能合并。**切勿手动从 GitHub 获取原始文件——始终使用 CLI。** + +1. 运行 `npx shadcn@latest add --dry-run` 查看所有会受到影响的文件。 +2. 对每个文件,运行 `npx shadcn@latest add --diff ` 查看上游与本地之间的差异。 +3. 根据差异逐文件决定: + - 无本地更改→可安全覆盖。 + - 有本地更改→读取本地文件,分析差异,在保留本地修改的同时应用上游更新。 + - 用户说"直接更新所有内容"→使用 `--overwrite`,但先确认。 +4. **未经用户明确批准,切勿使用 `--overwrite`。** + +## 快速参考 + +```bash +# 创建新项目。 +npx shadcn@latest init --name my-app --preset base-nova +npx shadcn@latest init --name my-app --preset a2r6bw --template vite + +# 创建单体仓库项目。 +npx shadcn@latest init --name my-app --preset base-nova --monorepo +npx shadcn@latest init --name my-app --preset base-nova --template next --monorepo + +# 初始化现有项目。 +npx shadcn@latest init --preset base-nova +npx shadcn@latest init --defaults # 快捷方式:--template=next --preset=base-nova + +# 添加组件。 +npx shadcn@latest add button card dialog +npx shadcn@latest add @magicui/shimmer-button +npx shadcn@latest add --all + +# 在添加/更新之前预览更改。 +npx shadcn@latest add button --dry-run +npx shadcn@latest add button --diff button.tsx +npx shadcn@latest add @acme/form --view button.tsx + +# 搜索注册表。 +npx shadcn@latest search @shadcn -q "sidebar" +npx shadcn@latest search @tailark -q "stats" + +# 获取组件文档和示例 URL。 +npx shadcn@latest docs button dialog select + +# 查看注册表项详情(针对尚未安装的项)。 +npx shadcn@latest view @shadcn/button +``` + +**命名预设:** `base-nova`、`radix-nova` +**模板:** `next`、`vite`、`start`、`react-router`、`astro`(均支持 `--monorepo`)和 `laravel`(不支持单体仓库) +**预设代码:** 以 `a` 开头的 Base62 字符串(例如 `a2r6bw`),来自 [ui.shadcn.com](https://ui.shadcn.com)。 + +## 详细参考 + +- [rules/forms.md](./rules/forms.md) — FieldGroup、Field、InputGroup、ToggleGroup、FieldSet、验证状态 +- [rules/composition.md](./rules/composition.md) — Groups、覆盖层、Card、Tabs、Avatar、Alert、Empty、Toast、Separator、Skeleton、Badge、Button 加载状态 +- [rules/icons.md](./rules/icons.md) — data-icon、图标尺寸、将图标作为对象传递 +- [rules/styling.md](./rules/styling.md) — 语义化颜色、变体、className、间距、尺寸、truncate、深色模式、cn()、z-index +- [rules/base-vs-radix.md](./rules/base-vs-radix.md) — asChild 与 render、Select、ToggleGroup、Slider、Accordion +- [cli.md](./cli.md) — 命令、标志、预设、模板 +- [customization.md](./customization.md) — 主题化、CSS 变量、扩展组件 + +## 限制 +- 仅当任务明确符合上述范围时使用此技能。 +- 请勿将输出视为环境特定验证、测试或专家审查的替代方案。 +- 如果缺少必要的输入、权限、安全边界或成功标准,请停下来并要求澄清。 diff --git a/agents/openai.yml b/agents/openai.yml new file mode 100644 index 0000000..ab636da --- /dev/null +++ b/agents/openai.yml @@ -0,0 +1,5 @@ +interface: + display_name: "shadcn/ui" + short_description: "Manages shadcn/ui components — adding, searching, fixing, debugging, styling, and composing UI." + icon_small: "./assets/shadcn-small.png" + icon_large: "./assets/shadcn.png" diff --git a/assets/shadcn-small.png b/assets/shadcn-small.png new file mode 100644 index 0000000..547154b Binary files /dev/null and b/assets/shadcn-small.png differ diff --git a/assets/shadcn.png b/assets/shadcn.png new file mode 100644 index 0000000..b7b6814 Binary files /dev/null and b/assets/shadcn.png differ diff --git a/cli.md b/cli.md new file mode 100644 index 0000000..9c6341a --- /dev/null +++ b/cli.md @@ -0,0 +1,255 @@ +# shadcn CLI 参考 + +配置从 `components.json` 中读取。 + +> **重要说明:** 始终使用项目的包管理器来运行命令:`npx shadcn@latest`、`pnpm dlx shadcn@latest` 或 `bunx --bun shadcn@latest`。从项目上下文中检查 `packageManager` 以选择正确的命令。以下示例使用 `npx shadcn@latest`,但请替换为项目对应的正确运行器。 + +> **重要说明:** 只使用下面列出的标志。不要发明或猜测标志——如果某个标志未在此处列出,则它不存在。CLI 会从项目的锁定文件中自动检测包管理器;没有 `--package-manager` 标志。 + +## 目录 + +- 命令:init、add(空跑、智能合并)、search、view、docs、info、build +- 模板:next、vite、start、react-router、astro +- 预设:命名、代码、URL 格式与字段 +- 切换预设 + +--- + +## 命令 + +### `init` — 初始化或创建项目 + +```bash +npx shadcn@latest init [components...] [options] +``` + +在已有项目中初始化 shadcn/ui,或创建新项目(当提供了 `--name` 时)。可选地在同一步骤中安装组件。 + +| 标志 | 缩写 | 描述 | 默认值 | +| ------------------------ | --- | -------------------------------------------------- | ------- | +| `--template