本文是 Kotodama UI(
@kotodama/lego-react)的规划与落地说明:解决什么问题、如何分期、技术如何选型、代码如何长在仓库里。
叙事札记版见博客:我为什么自研一套 React + Lego 组件库。
成品「全家桶」UI 库(以开源 Ant Design 为代表)在下列维度成本偏高,构成本库的问题陈述:
| 痛点 | 对本库的含义 |
|---|---|
| 设计语言刚性,深定制贵 | 同时服务企业后台与品牌 / 营销站,视觉不能绑死蓝白中后台气质 |
| CSS-in-JS / 重组件性能税 | 样式栈自控;列表 / 表格场景可瘦身 |
rc-* / @rc-component/* 跨仓深 |
不使用 rc-component;交互原语自研或可控白名单 |
| PC / 移动生态割裂(antd vs antd-mobile) | 一套组件 + 自适应样式,不做第二套 mobile-only 库 |
| 对 AI / 低代码不友好 | 组件可描述、可装配;远期产出 LLM 可读契约文件 |
结论: 优先「可扩展积木 + 多场景皮肤」,而不是「复制 antd 组件数量」。
四类目标场景(需求 §4):
工程硬约束(需求 §5.3):组件库为仓库内独立子项目,与 platform/、landing/ 目录 / 依赖 / 构建 / 运行时隔离;唯一接点为 Header 外链 + 网关静态挂载 /ui/。
primitives → patterns → blocks,依赖单向向下| 阶段 | 目标 |
|---|---|
| S0 | 独立子项目骨架 + Lego 规范 + Token + 门禁 + Button/Input/Layout;Rspress + /ui/ |
| S1 | 后台主路径(Form / Table / Nav / Feedback)+ 后台 Demo A |
| S2 | 品牌 / 营销 blocks + 响应式 + 营销 Demo B |
| S3 | 元数据 → LLM 文件 v0;SSR / 静态样式加固 |
| S4+ | 跨平台工具 PoC;AI recipes(非本期) |
本期 MVP 明确不做:antd/rc 封装、大而全复制、原生 App 运行时、完整低代码编辑器、与 antd API 兼容、把文档做进 platform SPA。
rc-component / rc-* / @rc-component/*/ui/ + wrappers 可运行示例| 项 | 定案 | 说明 |
|---|---|---|
| 框架 | React 18+ | 主交付形态为 React 组件 |
| 编写规范 | Lego Modules | state / listeners / render / wrappers / intercepters;对外 wrap 成常规组件 |
| 底层交互 | 零 rc-component | CI check:no-rc 扫描依赖与源码 import |
| 样式 | CSS Variables + 静态 CSS | data-theme / data-density;避免强制运行时 CSS-in-JS |
| 主题 | admin / brand / dark | brand 默认亮色营销面;暗色宿主走 brand 暗色面(暖金),不吞成 admin dark |
| 文档站 | Rspress | 静态导出挂 /ui/;Storybook 可选并行 |
| 工程 | design-system/ |
自有 pnpm workspace;与 platform 三套依赖并存属有意隔离 |
| 包 | @kotodama/tokens + @kotodama/lego-react |
分层 exports:primitives / patterns / blocks / meta |
明暗与 Demo 纪律:文档站壳与组件库 Token 是两套电;嵌在文档里的活示例必须通过 DocsDemoProvider 跟随 Rspress 明暗。营销 Demo 在亮色用 brand 亮面、暗色仍用 brand(暗色面),全局主题切换才有意义。相关踩坑见博客「文档站暗了,Demo 还亮着」。
接点(现网侧,已约定):
landing Header → /ui/docker/nginx.ui-example.conf 静态挂载示例外壳:ConfigProvider / mergePropsWithConfig / 公开 XxxProps。
内核:createComponent 的 state / listeners / render;示范处挂 wrappers。
可运行示例见 Lego wrappers。
[data-theme="admin"|"brand"|"dark"];brand 另有 html.dark / data-scheme="dark" 暗色面kd-*,构建产物 style.css 与分层 primitives.css / patterns.css / blocks.cssdocument / window(见 SSR)| 能力 | 命令 / 位置 |
|---|---|
| 禁止 rc | pnpm check:no-rc |
| 类型 | pnpm typecheck |
| 测试 | pnpm test(Vitest + RTL:Button / Form / Table / createComponent) |
| 元数据覆盖率 | pnpm check:meta-coverage(需先 build:packages) |
| 构建 | pnpm build:packages / pnpm build:docs |
| CI | .github/workflows/design-system.yml(仅 design-system/**,不阻断 platform) |
场景验收:
componentMetaList(props、scenes、antipatterns…)@kotodama/lego-react/meta/llm/components.json(及 yaml)| 文档 | 用途 |
|---|---|
| 快速开始 | 安装与按层引入 |
| 主题切换 | admin / brand / dark |
| Lego wrappers | 换皮扩展路径 |
| 响应式 | 断点、触控、安全区 |
组件库的目标不是多一个 npm 包,而是让后台效率、品牌表达、移动自适应、以及将来的 AI 装配共用一份契约、多种皮肤——并从第一天起不踩现网的脚。