# SUI > SUI 是基于 Base UI 和 Tailwind CSS 构建的可组合 React 组件库。本文档包含工作区中的完整示例源码 # CLI 使用 shadcn 搜索、查看、安装和更新 SUI 源码 页面: https://sui.draco.dev/zh-CN/docs/cli SUI 使用 shadcn CLI。在消费应用中完成 [registry 配置](/zh-CN/docs/installation#prepare-the-consuming-application),然后在该应用目录运行命令。 ## 搜索与查看 ```bash bunx --bun shadcn@latest search @sui -q input bunx --bun shadcn@latest view @sui/sensitive-input ``` 搜索匹配条目名称与描述。查看命令可在安装前检查文件和依赖。[Registry 指南](/zh-CN/docs/registry)介绍索引和条目的格式。 ## 安装源码 ```bash bunx --bun shadcn@latest add @sui/button @sui/sensitive-input bunx --bun shadcn@latest add @sui/data-table ``` CLI 将所需源码复制到配置的 `ui`、`components`、`lib` 和 `hooks` 目录,安装包依赖,并将 SUI 样式合并到 `components.json` 指定的 CSS 文件。安装后的文件属于应用,可以直接修改。 每个条目包含完整的本地依赖,安装单个组件时无需先安装整个组件库。`@sui/sui` 安装完整集合,`@sui/sui-style` 安装共享 CSS,`@sui/sui-theme` 安装主题工具与样式。 Editor 和完整集合需要本地 Monaco worker 支持,详见[兼容性说明](/zh-CN/docs/compatibility#editor-workers)。 ## 检查更新 ```bash bunx --bun shadcn@latest add @sui/button --dry-run bunx --bun shadcn@latest add @sui/button --diff ``` 更新可能同时影响共享依赖和 CSS。覆盖文件前先对比本地修改。安装属于源码复制,文件不会自动跟随 SUI 仓库的后续变更。 ## 常见问题 | 现象 | 检查项 | | --- | --- | | 找不到 `@sui` registry | 在消费应用目录执行,检查该应用的 `components.json` | | GitHub 返回 `404` | 检查配置的地址,以及 registry 是否包含所需条目 | | 导入路径与文档示例不同 | 使用配置的别名替换工作区路径,见[导入映射](/zh-CN/docs/installation#import-installed-source) | | 缺少动画或主题样式 | 确认应用已加载配置的 CSS 文件 | | Monaco worker 导入失败 | 使用兼容的 `?worker` 加载器,并包含安装的类型声明 | 通过助手安装时参阅 [MCP](/zh-CN/docs/mcp),读取 API 和示例文本时参阅 [LLMs](/zh-CN/docs/llms-txt)。 --- # LLMs 以纯文本读取 SUI 文档和完整示例 页面: https://sui.draco.dev/zh-CN/docs/llms-txt 通过 LLM 接口向助手提供当前 SUI API 和示例。这些接口用于读取文档;安装组件源码时使用 [MCP](/zh-CN/docs/mcp) 或 [CLI](/zh-CN/docs/cli)。 ## 文档入口 | 内容 | English | 简体中文 | | --- | --- | --- | | 页面索引 | [`/llms.txt`](/llms.txt) | [`/zh-CN/llms.txt`](/zh-CN/llms.txt) | | 完整文档 | [`/llms-full.txt`](/llms-full.txt) | [`/zh-CN/llms-full.txt`](/zh-CN/llms-full.txt) | | 单个组件 | [Button Markdown](/api/llms-markdown?locale=en-US&slug=components/button) | [Button Markdown](/api/llms-markdown?locale=zh-CN&slug=components/button) | 这些路径属于当前文档站的访问地址。GitHub raw 托管 [registry](/zh-CN/docs/registry) JSON,LLM 接口则由文档站提供。 索引按指南、组件、Blocks 和工具整理页面,并链接到对应 Markdown。建议先读取索引,再读取任务相关页面。完整文档包含所有页面,通常比单次请求所需的上下文更大。 ## 读取单个页面 `/api/llms-markdown` 接受 `locale` 和 `slug`: | 参数 | 可选值 | 默认值 | | --- | --- | --- | | `locale` | `en-US`、`zh-CN` | `en-US` | | `slug` | 不含 `/docs/` 的文档路径,如 `components/button`、`blocks/data-table` 或 `theming` | 省略时返回简介 | 无效语言和不存在的文档返回 `404`。显式访问 `/en-US/llms.txt` 或 `/en-US/llms-full.txt` 时,会重定向到没有语言前缀的英文地址。 [读取 Sensitive Input Markdown](/api/llms-markdown?locale=zh-CN&slug=components/sensitive-input) 结果包含标题、描述、页面地址、API 说明,以及该页面共享示例的完整源码。预览和代码展示读取同一份示例文件,纯文本内容也与可运行文档保持一致。 ## 从页面复制 页面头部提供**复制 Markdown**和**打开**。复制 Markdown 获取原始 MDX 文档;打开菜单可将展开后的 LLM Markdown 提供给助手。程序读取时,`/api/markdown` 返回原始文档,`/api/llms-markdown` 会将共享示例展开为代码块。 ## 请求示例 ```text 读取 SUI 的 llms.txt,再阅读 Field 和 Sensitive Input 文档。 组合一个带标签的敏感输入框,校验信息由应用提供。 验证逻辑和翻译文案保留在应用中。 安装源码后,使用我的 components.json 中配置的导入别名。 ``` 文档示例使用 `@workspace/ui/components/button` 等工作区路径。安装源码后使用应用自身的别名,映射方式见[安装指南](/zh-CN/docs/installation#import-installed-source)。读取文档不会安装文件或配置 MCP 客户端。 --- # MCP 将 AI 助手连接到 SUI registry 页面: https://sui.draco.dev/zh-CN/docs/mcp 使用官方 [shadcn MCP 服务](https://ui.shadcn.com/docs/mcp),让 AI 助手浏览 SUI registry。服务通过 stdio 在本地运行,并读取消费应用的 `components.json`。SUI 提供 registry JSON 文件;registry URL 是 HTTP 数据源,不是 MCP 服务地址。 需要 API 说明和完整使用示例时,向助手提供 [LLMs 文档](/zh-CN/docs/llms-txt)。MCP 用于查询和查看可安装源码。其 `get_add_command_for_items` 工具返回 CLI 命令,随后由助手在应用中执行命令安装文件。 ## 配置应用 按照[安装指南](/zh-CN/docs/installation)准备消费应用。将以下 registry 条目合并到应用现有的 `components.json`,保留应用的别名和 CSS 配置: ```json { "registries": { "@sui": "https://raw.githubusercontent.com/draco-china/sui/main/registry/r/{name}.json" } } ``` 目录索引为 `https://raw.githubusercontent.com/draco-china/sui/main/registry/r/registry.json`。CLI 与 MCP 使用同一份配置。 在 MCP 客户端中打开消费应用,以包含其 `components.json` 的目录作为服务工作目录。在 monorepo 中,使用应用目录,而非没有该文件的仓库根目录。[CLI](/zh-CN/docs/cli) 也使用同一份配置。 ## 配置客户端 以下示例使用 Bun 启动官方服务: ```bash bunx --bun shadcn@latest mcp ``` MCP 客户端启动此进程,通过 stdin/stdout 通信。将对应配置合并到项目现有的客户端配置文件,然后重启或启用服务。客户端进程的环境中必须能找到 Bun。 ### Claude Code 使用项目的 `.mcp.json`: ```json { "mcpServers": { "shadcn": { "command": "bunx", "args": ["--bun", "shadcn@latest", "mcp"] } } } ``` 重启 Claude Code,使用 `/mcp` 检查连接状态。 ### Cursor 使用项目的 `.cursor/mcp.json`: ```json { "mcpServers": { "shadcn": { "command": "bunx", "args": ["--bun", "shadcn@latest", "mcp"] } } } ``` 在 Cursor 的 MCP 设置中启用 shadcn 服务,并确认工具已列出。 ### VS Code 使用 GitHub Copilot 时,配置项目的 `.vscode/mcp.json`。VS Code 使用 `servers` 字段: ```json { "servers": { "shadcn": { "command": "bunx", "args": ["--bun", "shadcn@latest", "mcp"] } } } ``` 打开文件,通过 VS Code 的 MCP 控件启动服务。客户端配置文件位置与字段遵循 [shadcn 官方配置指南](https://ui.shadcn.com/docs/mcp#configuration)。 ### Codex 将以下配置合并到消费应用的 `.codex/config.toml`。将占位路径替换为应用的绝对目录: ```toml [mcp_servers.shadcn] command = "bunx" args = ["--bun", "shadcn@latest", "mcp"] cwd = "/absolute/path/to/app" ``` Codex 对受信任的项目加载项目配置。编辑后打开或重启该项目,并确认服务工具可用。参见 OpenAI 官方文档的[项目配置](https://learn.chatgpt.com/docs/config-file/config-basic)与 [MCP 设置](https://learn.chatgpt.com/docs/extend/mcp?surface=cli)。 ## 浏览、查看与安装 向助手明确指定 `@sui` 命名空间: > 在 @sui 中搜索表格组件,查看 @sui/data-table 及其依赖,然后在当前应用中安装它,并按我的别名配置适配文档示例。 服务提供以下工具完成此流程: | 工具 | 用途 | | --- | --- | | `get_project_registries` | 确认应用已配置 `@sui`。 | | `list_items_in_registries` | 列出 `@sui` 条目。 | | `search_items_in_registries` | 在 `@sui` 中搜索名称与描述。 | | `view_items_in_registries` | 查看条目的 manifest 和文件内容。 | | `get_add_command_for_items` | 返回所选条目的 CLI 安装命令。 | 例如,以 `registries: ["@sui"]` 和 `query: "table"` 搜索,再以 `items: ["@sui/data-table"]` 查看源码。拿到安装命令后,助手在消费应用目录执行。使用 Bun 时,对应命令为: ```bash bunx --bun shadcn@latest add @sui/data-table ``` 检查安装后的文件、样式与依赖。变更预览方式见 [CLI](/zh-CN/docs/cli),运行环境要求见[兼容性指南](/zh-CN/docs/compatibility)。 SUI 当前目录索引包含可安装的组件、业务区块、样式和工具,没有独立的 demo 或 example 条目。完整示例与 API 说明请使用 [LLMs 文档](/zh-CN/docs/llms-txt),不要期待 MCP 示例搜索返回 `@sui/*-demo` 条目。 ## 故障排查 | 现象 | 检查方式 | | --- | --- | | GitHub registry 返回 404 | 检查配置的地址、仓库访问权限,以及所需条目是否存在。 | | Unknown registry 或缺少 `@sui` | 检查消费应用 `components.json` 中的命名空间,再调用 `get_project_registries`。 | | 服务读取了其他项目 | 检查工作目录,必须指向包含 `components.json` 的消费应用;修改后重启服务。 | | 找不到 `bunx` | 确保客户端进程的 `PATH` 能找到 Bun,或在服务配置中使用 `bunx` 可执行文件的绝对路径。 | | 工具可用,但没有安装文件 | `get_add_command_for_items` 只返回命令,助手仍需在应用中执行它。 | 在与 MCP 相同的应用目录运行以下命令,可单独排查 registry 访问问题: ```bash bunx --bun shadcn@latest search @sui -q button bunx --bun shadcn@latest view @sui/button ``` 配置与条目说明见 [Registry](/zh-CN/docs/registry),安装与更新命令见 [CLI](/zh-CN/docs/cli)。 --- # Registry 了解 SUI 条目、共享样式和 GitHub 分发方式 页面: https://sui.draco.dev/zh-CN/docs/registry SUI registry 通过 [CLI](/zh-CN/docs/cli) 和 [MCP](/zh-CN/docs/mcp) 分发可编辑的组件源码。按照[安装指南](/zh-CN/docs/installation)配置 `@sui` 命名空间。 ## GitHub 文件 ```json { "registries": { "@sui": "https://raw.githubusercontent.com/draco-china/sui/main/registry/r/{name}.json" } } ``` `registry/r/registry.json` 是可搜索的目录索引,`registry/r/button.json` 等文件包含对应组件的安装内容。条目名称不带语言前缀,安装的组件使用英文默认文案,并接受应用提供的文本。 | 条目 | 内容 | | --- | --- | | `button` 等组件名称 | 组件、传递的本地依赖文件、包依赖、CSS 和主题 token | | `data-table`、`delete-resource`、`tanstack-form` | Block 及其所需源码和样式 | | `sui-style` | 共享主题与组件 CSS | | `sui-theme` | 主题工具与共享样式 | | `sui` | 全部组件和 Blocks | ## 文件与依赖 条目使用 shadcn registry schema。`dependencies` 和 `devDependencies` 声明包版本,`files` 包含源码及根据应用别名解析的目标路径,`css` 和 `cssVars` 合并到配置的样式文件。 每个条目自包含所需的本地 hooks、工具、类型声明和被引用组件。这样不会依赖消费应用的命名空间,也不会意外从其他 registry 安装同名组件。索引只描述条目,完整源码放在对应的安装文件中。 CLI 根据别名重写导入,文档工作区路径的替换方式见[导入映射](/zh-CN/docs/installation#import-installed-source)。安装后的主题值和源码可以修改;接入已有设计系统时先检查差异。 ## 更新已安装源码 通过 [CLI](/zh-CN/docs/cli#review-an-update) 预览变更后,再更新组件与共享依赖。安装属于源码复制,文件不会自动跟随组件库变更。保留应用的包管理器锁文件,并检查样式与本地修改。 LLM 文档由文档站的[纯文本接口](/zh-CN/docs/llms-txt)提供。Registry JSON 用于安装数据,MCP 客户端则单独启动 shadcn stdio 服务。 --- # 主题 语义颜色、明暗表面与可复用配色 页面: https://sui.draco.dev/zh-CN/docs/theming SUI 的颜色描述元素的用途。卡片使用 `card` 与 `card-foreground`,主要操作使用 `primary` 与 `primary-foreground`。切换配色或外观时,同一组件会随之适配。 共享 CSS 颜色变量统一使用 OKLCH,七套预设和自定义配色也输出 OKLCH;这是原颜色的等价转换,不改变配色。自定义输入和预设种子仍使用 HEX,对比度仍按 sRGB 相对亮度计算。共享包只提供通用语义变量,文档应用直接使用 `accent-foreground` 和 `ring` 表达链接与焦点。 ## 语义颜色的使用 先按用途选择变量,再将表面与对应的前景色配对使用。如果组件的内置变体已经表达该用途,优先使用变体。 **推荐** ```tsx import { Button } from "@workspace/ui/components/button";
修改已准备就绪。
修改已准备就绪。
{zh ? cn : en}
{dark ? stateLabels.dark : stateLabels.light}
{zh ? "每套配色包含五个协调色" : "Each palette contains five coordinated colors"}
{zh ? "明暗切换仅作用于这些预览,不改变整站主题或浏览器存储" : "Appearance switches affect these previews without changing the site theme or browser storage."}
{zh ? "输入三位或六位 HEX;当前有效配色保持不变" : "Enter a three- or six-digit HEX. The current valid palette is unchanged."}
)}{zh ? "内容文字" : "Content text"}
; } function AvoidSample({ locale }: ExampleProps) { const zh = locale === "zh-CN"; return{zh ? "内容文字" : "Content text"}
; } export default function Example({ locale }: ExampleProps) { return (Content text
; ``` **避免** ```tsxContent text
; ``` ## 标题使用句首大写 英文标题使用句首大写,不要把每个单词的首字母都大写,也不要把整个标题转换为大写。产品名称保留其规范的大小写。中文标题按自然语言书写。 避免栏同时展示逐词首字母大写,以及使用 `uppercase` 转换为全大写的情况。 ### 示例: design-guidelines-heading-case ```tsx import { DesignComparison } from "../design-guidelines-comparison"; import type { ExampleProps } from "../types"; function RecommendedSample() { return{zh ? "无需修改代码即可衡量网站访问量" : "Measure site traffic without changing your code."}
{zh ? "无需修改代码即可衡量网站访问量" : "Measure site traffic without changing your code."}
Measure site traffic without changing your code.
Measure site traffic without changing your code.
{zh ? "这段文字可能会换行,但图标仍应与第一行保持对齐" : "Text that may wrap onto multiple lines and still align with the icon."}
{zh ? "这段文字可能会换行,但图标仍应与第一行保持对齐" : "Text that may wrap onto multiple lines and still align with the icon."}
{zh ? "这段文字可能会换行,但图标仍应与第一行保持对齐" : "Text that may wrap onto multiple lines and still align with the icon."}
Text that may wrap onto multiple lines and still align with the icon.
Text that may wrap onto multiple lines and still align with the icon.
Text that may wrap onto multiple lines and still align with the icon.
{zh ? "编辑 " : "Edit "}
config.ts
{zh ? " 后继续" : " to continue."}
{zh ? "编辑 " : "Edit "}
config.ts
{zh ? " 后继续" : " to continue."}
Edit config.ts to continue.
Edit config.ts to continue.
{zh ? "请求" : "Request"} {request.number}
))}{zh ? "请求" : "Request"} {request.number}
))}Request {request.number}
))}Request {request.number}
))}