Registry
shadcn registry 端点与全量索引的生成方式。
registry 是什么
Registry 是 shadcn 的源码分发格式。本项目产出两类文件:
- 可安装端点
https://tennantite.rikka.cc/r/<name>.json:每个核心组件一个文件,内联全部源码content与target,shadcn CLI 可直接消费。 - 全量索引
registry/registry.json:覆盖@tennantite/ui与全部 mod 包组件(311 个条目),供目录与文档引用;mod 包条目仍只有path,不参与 CLI 拷贝。
生成
pnpm registry
# 等价于
node registry/build.mjs
覆盖范围
可安装端点覆盖 @tennantite/ui 内 5 组组件(primitives、containers、screens/containers、screens/hud、screens/menus)共 63 个组件条目,外加 tennantite-base 与 4 个共享条目:
tennantite-base:仅声明@tennantite/tokens与@tennantite/textures两个 npm 依赖,并落下一个记录资产 CSS 引入方式的base.css;首次 add 任一组件时 CLI 会一并安装。tennantite-utils:cn与gui共享工具,落在components/tennantite/lib/tennantite-utils.ts,不覆盖消费者的@/lib/utils。screen-types:ScreenSlot、padSlots等 screen 共享类型。screen-parts/screen-slot:容器界面共享的槽位与部件组件。
mod 包(mekanism、ic2、ae2 等)不在 CLI 拷贝范围内:它们大量通过 @tennantite/ui barrel 导入,拷贝改写成本不成比例,保持 pnpm add @tennantite/<mod> 的 npm 安装模式。
消费方式
方式一:components.json 配置 namespace registry 后按名安装:
{
"registries": {
"@tennantite": "https://tennantite.rikka.cc/r/{name}.json"
}
}
npx shadcn add @tennantite/button
方式二:直接 URL,无需配置:
npx shadcn add https://tennantite.rikka.cc/r/button.json
item 结构
每个条目内联源码,CLI 无需再解析仓库路径:
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "card",
"type": "registry:component",
"dependencies": ["cn"],
"registryDependencies": ["@tennantite/tennantite-base", "@tennantite/panel", "@tennantite/title-bar"],
"files": [
{
"content": "import { Panel } from \"@/components/tennantite/panel\";\n// …",
"target": "components/tennantite/card/index.tsx",
"type": "registry:component"
}
]
}
导入改写规则
生成器对每个内联文件按以下规则改写导入(改写失败会直接报错,不产出坏条目):
- 相对导入解析后落在组件自身目录内(
./types、./styles)→ 保持不变。 - 指向其他组件目录(如
../panel/index)→ 改写为@/components/tennantite/panel,并写入registryDependencies。 - 指向
lib/utils.ts、screen 共享类型 → 改写为@/components/tennantite/lib/tennantite-utils、@/components/tennantite/lib/screen-types。 @tennantite/textures保留不改写,追加进该条目的 npmdependencies。
registryDependencies 中的每个条目都会自动追加 @tennantite/tennantite-base,保证 L0 资产包(tokens/textures)随首次安装到位;跨 item 依赖必须写全 namespace(@tennantite/<name>),否则 CLI 会到官方 registry 解析。