shadcn/ui
shadcn/ui 表示项目采用官方 shadcn/ui 风格的 checked-in component layer:components.json、@/components/ui aliases、Radix primitives、Tailwind utilities、class-variance-authority、tailwind-merge、clsx 和 Lucide icons 共同构成组件约定。
- 前端
目录
Definition
shadcn/ui 表示项目采用官方 shadcn/ui 风格的 checked-in component layer:components.json、@/components/ui aliases、Radix primitives、Tailwind utilities、class-variance-authority、tailwind-merge、clsx 和 Lucide icons 共同构成组件约定。官方名称保留 slash,因此 Topic token 也写作 shadcn/ui。
这个 Topic 的重点是 open-code component ownership:组件源码在项目里,维护者需要审查 variants、tokens、accessibility state、dark/light theme、表单语义和复用边界。它不是 npm 组件库标签,也不是“看起来像 shadcn”的视觉判断;必须有 components.json 或项目快照中的 checked-in UI layer 证据(projects/proxy-broker.md、projects/kaisoumail.md)。
When to use
当 repo 里有 components.json 指向 ui.shadcn.com/schema.json,或项目 snapshot 明确引用 checked-in components/ui 组件层时使用。不要仅因视觉风格相似或使用 Radix/Tailwind 就套用。
如果改动触及按钮、表单、Dialog、Popover、Sidebar、Table、Toast、Theme、icon button 或 Tailwind/CVA 变体,应使用本 Topic。若项目只是使用 Radix primitive、Tailwind utilities 或 Lucide icons,但没有 shadcn/ui 组件层与 alias contract,应保留在 React app 或 TypeScript web 范畴(projects/flux-purr.md)。
Habits / defaults
- 把 shadcn/ui 当 open-code 组件层维护,组件源码归项目所有,不能当黑盒 npm 组件库。
- 组件系统 Topic 与
React app正交;React 是 runtime,shadcn/ui 是组件组合约定。 - Storybook component QA/a11y 应覆盖重要组件状态,尤其是 Dialog、Popover、Table、Form、Sidebar。
- 保持官方大小写和 slash,不写成
Shadcn UI、shadcnui或 repo/path 名。 - 新增组件默认遵守项目已有 open-code 习惯:少造新抽象,优先扩展现有
components/ui、tokens 和 variants;只有跨多个页面反复出现的复杂行为才提升为新组件(projects/proxy-broker.md)。 - 组件变更应同步 Storybook 或可控视觉证据,尤其是 owner-facing 管理台、设备控制台和操作型表单;只凭 DOM 快照或类型检查不足以证明交互状态正确(
projects/kaisoumail.md、projects/flux-purr.md)。 - 默认先看
components.json和别名约定,再谈视觉层。radix-nova、new-york、Tailwind CSS variables、icon 选择和@/components/uialias 都是维护契约,不是无关配置(projects/xp.md、projects/flux-purr.md)。 - 对 shadcn/ui 组件的修改,要把“这个组件是在表达设计 token,还是在表达业务语义”分开。业务型 Console 组件常常需要同时保留组件层可复用性和产品上下文,不能一把全推回通用
Button/Card。
Reference implementations
projects/proxy-broker.md:operator console 使用 shadcn/ui、Storybook a11y 和 Playwright。projects/kaisoumail.md:Cloudflare control plane 采用 React + shadcn/ui。projects/flux-purr.md:设备控制台用web/components.json固定 aliases 和 Lucide。projects/xp.md:cluster manager admin UI 使用radix-novastyle。skills/style-playbook/references/topics/storybook-component-qa/TOPIC.md:说明 shadcn/ui open-code 组件层为什么需要 Storybook 状态枚举和截图/interaction gate。skills/style-playbook/references/topics/storybook-accessibility/TOPIC.md:说明 Dialog、Popover、Form 等组件为什么需要 a11y addon 作为早期筛查。
Failure modes
- 把 shadcn/ui 命名随意大小写,会让 Topic 看起来草率。
- 只打 React app 不打 shadcn/ui,会丢失组件系统约定。
- 复制组件后不维护 Storybook/visual states,会让 open-code 组件层变成不可审查资产。
- 直接从别的项目复制组件但不调整 tokens、aliases、theme 和交互状态,会制造“看起来能用、维护时失控”的 UI 层。修正方式是回读
components.json、components/ui和对应 Storybook 证据(projects/proxy-broker.md)。 - 把官方名称写成随意大小写或去掉 slash,会破坏 Topic 命名规范;本知识库保留官方
shadcn/ui写法,并用 slugshadcn-ui作为机器 ID(skills/style-playbook-write/SKILL.md)。 - 把 shadcn/ui 当“现成模板”而不是项目自有组件层,会让后续维护者回避必要的源码重构。这个 Topic 的前提就是 open-code ownership,不能只会复制、不会治理。
Evidence index
projects/proxy-broker.mdprojects/kaisoumail.mdprojects/flux-purr.mdprojects/xp.mdskills/style-playbook-write/SKILL.md
相关内容
Flux Purr
项目实践Flux Purr 是 embedded firmware + React control console 的设备 mono-repo。README.md 将仓库组织为 firmware/、web/、tools/flux-purr-devd/、docs/specs/、docs/hardware/、.
KaisouMail
项目实践KaisouMail 是 Cloudflare temporary email platform,基于 Email Routing、Workers、D1、R2,以及 React + shadcn/ui control plane。README.md 和 README.zh-CN.md 同时存在,说明文档需要中英双语入口;公开 docs site 与 Storybook 也是产品交付面,而不只是开发辅助。
OctoRill
项目实践OctoRill 把与 Ivan 相关的 GitHub 动态整理成适合持续阅读的工作区:发布更新、获星/关注动态、日报和 Inbox,发布内容还支持中文翻译和要点整理。README.md 同时指向 public docs-site、quick start、config、product 和 internal docs,说明它是产品化 Rust 服务 + React UI + 文档站,而不是一次性脚本。
Proxy Broker
项目实践Proxy Broker 是 standalone Rust service,用于加载 mihomo subscriptions,按 IP 构建带 probe/geo metadata 的代理池,按选择的 IP 开关本地 proxy listener sessions,并从同一 binary 提供 Bun-built operator web console。README.
XP Cluster Manager
项目实践XP Cluster Manager 是 self-hosted multi-host Xray cluster manager。README.md 明确每台 host 运行 xp 和 xray 两个进程,xp 用 OpenRaft 保存 cluster-wide desired state,并通过 Xray gRPC API reconcile 本地 runtime。