@tfdesign/b-end 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AI_READ_FIRST.md +131 -0
- package/LICENSE +21 -0
- package/README.md +353 -0
- package/package.json +67 -0
- package/scripts/check-tfds-contract.mjs +334 -0
- package/scripts/check-tfds-integration.mjs +263 -0
- package/scripts/postinstall-cursor-skill.mjs +382 -0
- package/scripts/setup.mjs +520 -0
- package/skills/tfds/CHECKLIST.md +205 -0
- package/skills/tfds/COMMON_FAILURES.md +238 -0
- package/skills/tfds/DESIGN_PRINCIPLES.md +477 -0
- package/skills/tfds/GLOBAL_DESIGN_RULES.md +636 -0
- package/skills/tfds/LAYOUT_RECIPES.md +140 -0
- package/skills/tfds/LAYOUT_RULES.md +1355 -0
- package/skills/tfds/PAGE_ARCHETYPES.md +201 -0
- package/skills/tfds/SKILL.md +188 -0
- package/skills/tfds/components.index.json +7305 -0
- package/skills/tfds/components.summary.json +1809 -0
- package/src/_b_end_runtime/components/AiSuggestionShared.jsx +166 -0
- package/src/_b_end_runtime/components/Avatar.jsx +325 -0
- package/src/_b_end_runtime/components/Avatar.tokens.js +76 -0
- package/src/_b_end_runtime/components/AvatarGridPreview.jsx +56 -0
- package/src/_b_end_runtime/components/AvatarGroup.jsx +80 -0
- package/src/_b_end_runtime/components/AvatarGroup.tokens.js +28 -0
- package/src/_b_end_runtime/components/Button.jsx +144 -0
- package/src/_b_end_runtime/components/Button.tokens.js +90 -0
- package/src/_b_end_runtime/components/Card.jsx +460 -0
- package/src/_b_end_runtime/components/Card.tokens.js +124 -0
- package/src/_b_end_runtime/components/CardPreview.jsx +51 -0
- package/src/_b_end_runtime/components/ChatBubble.jsx +384 -0
- package/src/_b_end_runtime/components/ChatBubble.tokens.js +60 -0
- package/src/_b_end_runtime/components/ChatBubblePreview.jsx +129 -0
- package/src/_b_end_runtime/components/ChatInput.jsx +1399 -0
- package/src/_b_end_runtime/components/ChatInput.tokens.js +75 -0
- package/src/_b_end_runtime/components/ChatMessage.jsx +2215 -0
- package/src/_b_end_runtime/components/ChatMessage.tokens.js +257 -0
- package/src/_b_end_runtime/components/ChatMessagePreview.jsx +388 -0
- package/src/_b_end_runtime/components/Checkbox.jsx +317 -0
- package/src/_b_end_runtime/components/Checkbox.tokens.js +59 -0
- package/src/_b_end_runtime/components/ConversationList.jsx +1264 -0
- package/src/_b_end_runtime/components/ConversationList.tokens.js +135 -0
- package/src/_b_end_runtime/components/ConversationListPreview.jsx +108 -0
- package/src/_b_end_runtime/components/CustomerServiceWorkspaceFrame.jsx +324 -0
- package/src/_b_end_runtime/components/CustomerServiceWorkspaceFrame.tokens.js +69 -0
- package/src/_b_end_runtime/components/DatePicker.jsx +739 -0
- package/src/_b_end_runtime/components/DatePicker.tokens.js +99 -0
- package/src/_b_end_runtime/components/Empty.jsx +141 -0
- package/src/_b_end_runtime/components/Empty.tokens.js +40 -0
- package/src/_b_end_runtime/components/Form.jsx +609 -0
- package/src/_b_end_runtime/components/Form.tokens.js +77 -0
- package/src/_b_end_runtime/components/FormFieldStack.jsx +123 -0
- package/src/_b_end_runtime/components/FormFieldStack.tokens.js +12 -0
- package/src/_b_end_runtime/components/FormTitle.jsx +119 -0
- package/src/_b_end_runtime/components/FormTitle.tokens.js +87 -0
- package/src/_b_end_runtime/components/FullScreenPage.jsx +97 -0
- package/src/_b_end_runtime/components/FullScreenPage.tokens.js +19 -0
- package/src/_b_end_runtime/components/Icon.jsx +172 -0
- package/src/_b_end_runtime/components/Icon.tokens.js +26 -0
- package/src/_b_end_runtime/components/IconGridPreview.jsx +277 -0
- package/src/_b_end_runtime/components/InfoDisplayPanel.jsx +620 -0
- package/src/_b_end_runtime/components/InfoDisplayPanel.tokens.js +71 -0
- package/src/_b_end_runtime/components/InfoDisplayPanelPreview.jsx +133 -0
- package/src/_b_end_runtime/components/Input.jsx +258 -0
- package/src/_b_end_runtime/components/Input.tokens.js +68 -0
- package/src/_b_end_runtime/components/InputNumber.jsx +242 -0
- package/src/_b_end_runtime/components/InputNumber.tokens.js +55 -0
- package/src/_b_end_runtime/components/Modal.jsx +155 -0
- package/src/_b_end_runtime/components/Modal.tokens.js +73 -0
- package/src/_b_end_runtime/components/NavBar.jsx +842 -0
- package/src/_b_end_runtime/components/NavBar.tokens.js +97 -0
- package/src/_b_end_runtime/components/NavBarPreview.jsx +11 -0
- package/src/_b_end_runtime/components/Radio.jsx +227 -0
- package/src/_b_end_runtime/components/Radio.tokens.js +59 -0
- package/src/_b_end_runtime/components/Select.jsx +766 -0
- package/src/_b_end_runtime/components/Select.tokens.js +99 -0
- package/src/_b_end_runtime/components/Sheet.jsx +132 -0
- package/src/_b_end_runtime/components/Sheet.tokens.js +61 -0
- package/src/_b_end_runtime/components/Slider.jsx +346 -0
- package/src/_b_end_runtime/components/Slider.tokens.js +47 -0
- package/src/_b_end_runtime/components/Switch.jsx +124 -0
- package/src/_b_end_runtime/components/Switch.tokens.js +38 -0
- package/src/_b_end_runtime/components/Table.jsx +1338 -0
- package/src/_b_end_runtime/components/Table.tokens.js +147 -0
- package/src/_b_end_runtime/components/TablePreview.jsx +599 -0
- package/src/_b_end_runtime/components/Tabs.jsx +149 -0
- package/src/_b_end_runtime/components/Tabs.tokens.js +102 -0
- package/src/_b_end_runtime/components/Tag.jsx +199 -0
- package/src/_b_end_runtime/components/Tag.tokens.js +171 -0
- package/src/_b_end_runtime/components/TagBar.jsx +1134 -0
- package/src/_b_end_runtime/components/TagBar.tokens.js +75 -0
- package/src/_b_end_runtime/components/TagGridPreview.jsx +23 -0
- package/src/_b_end_runtime/components/TagInput.jsx +382 -0
- package/src/_b_end_runtime/components/TagInput.tokens.js +52 -0
- package/src/_b_end_runtime/components/TextArea.jsx +363 -0
- package/src/_b_end_runtime/components/TextArea.tokens.js +65 -0
- package/src/_b_end_runtime/components/TimePicker.jsx +444 -0
- package/src/_b_end_runtime/components/TimePicker.tokens.js +77 -0
- package/src/_b_end_runtime/components/Toast.jsx +120 -0
- package/src/_b_end_runtime/components/Toast.tokens.js +146 -0
- package/src/_b_end_runtime/components/Tooltip.jsx +282 -0
- package/src/_b_end_runtime/components/Tooltip.tokens.js +48 -0
- package/src/_b_end_runtime/components/TooltipPreview.jsx +50 -0
- package/src/_b_end_runtime/components/Upload.jsx +455 -0
- package/src/_b_end_runtime/components/Upload.tokens.js +47 -0
- package/src/_b_end_runtime/components/avatar-assets/avatar-default.png +0 -0
- package/src/_b_end_runtime/components/avatar-group-assets/avatar-group-1.png +0 -0
- package/src/_b_end_runtime/components/avatar-group-assets/avatar-group-2.png +0 -0
- package/src/_b_end_runtime/components/avatar-group-assets/avatar-group-3.png +0 -0
- package/src/_b_end_runtime/components/avatar-group-assets/avatar-group-4.png +0 -0
- package/src/_b_end_runtime/components/avatar-group-assets/avatar-group-5.png +0 -0
- package/src/_b_end_runtime/components/empty-assets/administrator-1.svg +40 -0
- package/src/_b_end_runtime/components/empty-assets/administrator-2.svg +33 -0
- package/src/_b_end_runtime/components/empty-assets/construction.svg +33 -0
- package/src/_b_end_runtime/components/empty-assets/failure.svg +49 -0
- package/src/_b_end_runtime/components/empty-assets/idle.svg +34 -0
- package/src/_b_end_runtime/components/empty-assets/no-access.svg +36 -0
- package/src/_b_end_runtime/components/empty-assets/no-content.svg +77 -0
- package/src/_b_end_runtime/components/empty-assets/no-result.svg +61 -0
- package/src/_b_end_runtime/components/empty-assets/not-found.svg +46 -0
- package/src/_b_end_runtime/components/empty-assets/success.svg +38 -0
- package/src/_b_end_runtime/components/file-type-assets/batch-report.png +0 -0
- package/src/_b_end_runtime/components/file-type-assets/catcat.svg +21 -0
- package/src/_b_end_runtime/components/file-type-assets/code.png +0 -0
- package/src/_b_end_runtime/components/file-type-assets/conversation.png +0 -0
- package/src/_b_end_runtime/components/file-type-assets/document.png +0 -0
- package/src/_b_end_runtime/components/file-type-assets/feishu-card.png +0 -0
- package/src/_b_end_runtime/components/file-type-assets/feishu-sheet.png +0 -0
- package/src/_b_end_runtime/components/file-type-assets/feishu.png +0 -0
- package/src/_b_end_runtime/components/file-type-assets/image.png +0 -0
- package/src/_b_end_runtime/components/file-type-assets/index.js +105 -0
- package/src/_b_end_runtime/components/file-type-assets/knowledge.png +0 -0
- package/src/_b_end_runtime/components/file-type-assets/pdf.png +0 -0
- package/src/_b_end_runtime/components/file-type-assets/pe.png +0 -0
- package/src/_b_end_runtime/components/file-type-assets/strategy.png +0 -0
- package/src/_b_end_runtime/components/file-type-assets/table.png +0 -0
- package/src/_b_end_runtime/components/file-type-assets/webpage.png +0 -0
- package/src/_b_end_runtime/components/file-type-assets/xmind.png +0 -0
- package/src/_b_end_runtime/components/icons/icon-data.js +12496 -0
- package/src/_b_end_runtime/components/nav-bar-assets/bytehi-logo-mark.svg +21 -0
- package/src/_b_end_runtime/components/table-assets/avatar.png +0 -0
- package/src/_b_end_runtime/components/table-assets/button.png +0 -0
- package/src/_b_end_runtime/components/table-assets/icon-chevron-down.png +0 -0
- package/src/_b_end_runtime/components/table-cell-assets/avatar.png +0 -0
- package/src/_b_end_runtime/components/table-cell-assets/button.png +0 -0
- package/src/_b_end_runtime/components/table-cell-assets/checkbox.png +0 -0
- package/src/_b_end_runtime/components/table-cell-assets/icon-chevron-right.png +0 -0
- package/src/_b_end_runtime/components/table-cell-assets/icon.png +0 -0
- package/src/_b_end_runtime/components/table-cell-assets/semi-icons-handle.png +0 -0
- package/src/_b_end_runtime/components/table-cell-assets/semi-icons-tree-triangle-right.png +0 -0
- package/src/_b_end_runtime/components/table-cell-assets/switch.png +0 -0
- package/src/_b_end_runtime/components/tagShared.js +3 -0
- package/src/_b_end_runtime/components/team-avatar-assets/chengcheng-murphy.png +0 -0
- package/src/_b_end_runtime/components/team-avatar-assets/duan-ran.png +0 -0
- package/src/_b_end_runtime/components/team-avatar-assets/guo-zhezhi.png +0 -0
- package/src/_b_end_runtime/components/team-avatar-assets/li-siru.png +0 -0
- package/src/_b_end_runtime/components/team-avatar-assets/liu-delin.png +0 -0
- package/src/_b_end_runtime/components.js +3499 -0
- package/src/_b_end_runtime/index.js +9 -0
- package/src/_b_end_runtime/page-patterns/BasePageFramePattern.jsx +395 -0
- package/src/_b_end_runtime/page-patterns/ChatConversationPattern.jsx +989 -0
- package/src/_b_end_runtime/page-patterns/ChatHomePagePattern.jsx +281 -0
- package/src/_b_end_runtime/page-patterns/CopilotPagePattern.jsx +380 -0
- package/src/_b_end_runtime/page-patterns/CustomerServiceWorkspaceFramePattern.jsx +392 -0
- package/src/_b_end_runtime/page-patterns/IMConversationPattern.jsx +590 -0
- package/src/_b_end_runtime/page-patterns/McpManagementPage.jsx +237 -0
- package/src/_b_end_runtime/page-patterns/StrategyListPage.jsx +189 -0
- package/src/_b_end_runtime/page-patterns/TabTopBarListPage.jsx +594 -0
- package/src/_b_end_runtime/page-patterns/VariableManagementPage.jsx +87 -0
- package/src/_b_end_runtime/page-patterns/pageListShared.jsx +177 -0
- package/src/_b_end_runtime/patterns.js +428 -0
- package/src/_b_end_runtime/preview-registry.jsx +4719 -0
- package/src/_b_end_runtime/teamMembers.js +56 -0
- package/src/_b_end_runtime/tokens.js +500 -0
- package/src/index.d.ts +1073 -0
- package/src/index.js +52 -0
- package/theme.css +350 -0
package/AI_READ_FIRST.md
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# TFDS(@tf-designsystem/b-end)— 给任何 IDE 的 AI 阅读
|
|
2
|
+
|
|
3
|
+
> **隔离说明(重要)**:本文件仅在用户**显式调用 TFDS**(输入 `/tfds`、`@tfds`,或直接 `@` 引用本文件 / `SKILL.md`)时才应被读取。**禁止**把本文件写进 `AGENTS.md`、`.trae/rules/` 等"始终生效"的全局规则——那样会让 TFDS 规范污染所有与 TFDS 无关的对话。
|
|
4
|
+
|
|
5
|
+
你现在在一个消费方项目中接入 `@tf-designsystem/b-end`(TFDS B 端组件 + 主题 + 规范索引)。你的目标不是"把页面写出来就行",而是**生成的任何页面都必须遵循 TFDS 设计规范**,并能在对方项目里直接运行。
|
|
6
|
+
|
|
7
|
+
适用 IDE:Cursor / Codex / Claude Code / Trae / Copilot 等任何能读文件的 AI。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 📚 规范读取链路(按加载顺序)
|
|
12
|
+
|
|
13
|
+
设计组件数量有限,无法覆盖所有 AI 生成场景。**生成页面前**,按下列顺序加载规范文档;**所有具体硬规则都在这些文件里,本文件不再重复。**
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
| # | 文档 | 路径 | 何时读 |
|
|
17
|
+
| --- | -------------- | ---------------------------------------------------------- | ----------------------------------------------------- |
|
|
18
|
+
| ① | **总指挥(必读)** | `node_modules/@tf-designsystem/b-end/skills/tfds/SKILL.md` | 决定**整个生成流程**:决策树 + 黄金流程 + 生成后 Checklist |
|
|
19
|
+
| ② | **设计原则** | `.../skills/tfds/DESIGN_PRINCIPLES.md` | 判断**页面气质** + UX 取舍 + 视觉权重 + 组件角色 |
|
|
20
|
+
| ③ | **页面范式** | `.../skills/tfds/PAGE_ARCHETYPES.md` | 判断页面属于列表管理、详情编辑、会话工作台、入口首页、多步骤配置等哪类范式 |
|
|
21
|
+
| ④ | **布局 Recipe** | `.../skills/tfds/LAYOUT_RECIPES.md` | 先选唯一页面 recipe,确定容器语义、间距、对齐和滚动归属 |
|
|
22
|
+
| ⑤ | **组件摘要(轻量)** | `.../skills/tfds/components.summary.json` | 快速初选页面模板、业务组件、基础组件;不作为样式权威 |
|
|
23
|
+
| ⑥ | **组件详情索引(权威)** | `.../skills/tfds/components.index.json` | 只在组件命中后读取对应条目,抄 props / rules / examples |
|
|
24
|
+
| ⑦ | **页面布局规范** | `.../skills/tfds/LAYOUT_RULES.md` | 决定**页面骨架** + 宽高自适应 + 滚动层级 + z-index |
|
|
25
|
+
| ⑧ | **全局设计规范** | `.../skills/tfds/GLOBAL_DESIGN_RULES.md` | 组件库**未覆盖的自定义区块**:颜色 / 字体 / 间距 / 圆角 / 阴影 token |
|
|
26
|
+
| ⑨ | **交付自检** | `.../skills/tfds/CHECKLIST.md` | 页面生成后逐项检查组件调用、页面范式、布局、token、文本可读性和工程集成 |
|
|
27
|
+
| ⑩ | **失败修正** | `.../skills/tfds/COMMON_FAILURES.md` | `/tfds` 调用失败、组件像但不准、标题字重不对、白卡/滚动/输入框异常时优先排查 |
|
|
28
|
+
| ⑪ | **本文件(兜底)** | `node_modules/@tf-designsystem/b-end/AI_READ_FIRST.md` | 只读隔离声明 + 安装/自检命令 |
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
⛔ **未读 ②③④⑦⑧ 就动手写页面 / 自定义信息卡 / 状态条 / KPI 块** → AI 几乎必然生成普通 admin 气质、黑色边框、`#000` 硬编码、`text-[15px]` 任意字号,也容易把 AI 入口页错包进大白卡。⛔ **未命中并回查 ⑥ 就写具体组件** → AI 很容易手搓相似组件。**先读再写**。
|
|
32
|
+
|
|
33
|
+
头像类组件默认优先使用包内本地成员头像素材:`Avatar` 图片态未传 `src` 时会自动随机取本地成员头像;IM / ChatBubble / NavBar / Table 负责人列不要生成 pravatar、Unsplash、placeholder 等随机外链头像。
|
|
34
|
+
|
|
35
|
+
> 上述路径是消费方安装 npm 包后的位置;postinstall 也会把 `skills/tfds/` 全目录复制到下列 IDE 标准路径,便于就地读取:
|
|
36
|
+
>
|
|
37
|
+
> - `.cursor/skills/tfds/`(Cursor 重新打开项目 / 新开 Agent 会话后 → `/tfds`)
|
|
38
|
+
> - `.claude/skills/tfds/`(Claude Code 重启会话后 → `/tfds`)
|
|
39
|
+
> - `~/.codex/skills/tfds/`(Codex 用户级 Skill;新开/重启 Codex 会话后 → `/tfds`)
|
|
40
|
+
> - `.codex/skills/tfds/`(Codex 项目内参考)
|
|
41
|
+
> - `.agents/skills/tfds/`(通用 agent 兜底)
|
|
42
|
+
>
|
|
43
|
+
> ⚠️ **故意不写 `.trae/rules/tfds.md`**:Trae rules 是 always-on 全局规则,与本文件第一段隔离声明冲突。Trae 用户请把 `skills/tfds/` 手动加入项目知识库,命名 `tfds`,之后 `@tfds` 引用。
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 1. 安装(两种来源,二选一)
|
|
48
|
+
|
|
49
|
+
### 方式 A:GitHub Packages 私有包
|
|
50
|
+
|
|
51
|
+
```ini
|
|
52
|
+
# .npmrc
|
|
53
|
+
@tf-designsystem:registry=https://npm.pkg.github.com
|
|
54
|
+
//npm.pkg.github.com/:_authToken=YOUR_GITHUB_TOKEN
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npm i react react-dom lucide-react "@tf-designsystem/b-end@^1.0.0" --save
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 方式 B:分发 zip / 本地 file:
|
|
62
|
+
|
|
63
|
+
优先运行 zip 根目录的一键安装入口;它会自动判断目标是已有项目还是全新空文件夹:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
node tfds-npm-distribution/setup.mjs
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
如果 zip 不在业务项目根,显式指定目标项目:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
node "/绝对路径/.../tfds-npm-distribution/setup.mjs" --target "/绝对路径/.../业务项目根"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
仅旧包没有 `setup.mjs` 时,才手动安装:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
npm i react react-dom lucide-react "file:/绝对路径/.../tfds-npm-distribution/tfds-b-end" --save
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
脚本会自动判断:
|
|
82
|
+
|
|
83
|
+
- 已有项目:复用现有 `package.json` / `vite.config` / 入口 CSS,缺什么补什么。
|
|
84
|
+
- 全新空文件夹:自动创建最小 Vite + React 项目,然后继续安装 TFDS。
|
|
85
|
+
|
|
86
|
+
⚠️ 不要从任何 `tmp-*/` 临时目录安装,不要在 `tfds-b-end/` 包自身目录里手动执行 `npm install file:`。
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 2. 必须的工程配置(postinstall 已自动;未自动则手动)
|
|
91
|
+
|
|
92
|
+
```css
|
|
93
|
+
/* src/index.css */
|
|
94
|
+
@import "tailwindcss";
|
|
95
|
+
@import "@tf-designsystem/b-end/theme.css";
|
|
96
|
+
|
|
97
|
+
@source "./**/*.{js,jsx,ts,tsx}";
|
|
98
|
+
@source "../node_modules/@tf-designsystem/b-end/**/*.{js,jsx}";
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 3. 生成后必做:只读自检
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
node node_modules/@tf-designsystem/b-end/scripts/check-tfds-integration.mjs
|
|
107
|
+
node node_modules/@tf-designsystem/b-end/scripts/check-tfds-contract.mjs
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
第二个脚本若提示存在任意值 / 硬编码颜色 / 间距漂移,必须改到通过为止。
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## 4. 强烈推荐:CI 硬门禁(@tfds/eslint-config)
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
npm i -D eslint @eslint/js eslint-plugin-react eslint-plugin-react-hooks globals @tfds/eslint-config
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
```js
|
|
121
|
+
// eslint.config.js
|
|
122
|
+
import tfds from '@tfds/eslint-config/flat';
|
|
123
|
+
export default [...tfds];
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
CI / pre-commit:`npx eslint .`
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
> 想看完整硬规则、决策树、骨架代码、token 表、Checklist?
|
|
131
|
+
> **请打开 `skills/tfds/SKILL.md`**(它会引导你按需加载页面范式、组件摘要和命中的组件详情)。
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) TFDS contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
# @tf-designsystem/b-end(B 端组件库 · 可安装包)
|
|
2
|
+
|
|
3
|
+
这个包的目标:**让对方在任意 Cursor + Vite/React 项目里安装后,可以直接 `import { … } from '@tf-designsystem/b-end'` 使用**与 TFDS 平台一致的 **B 端全量组件**(见包内 `src/index.js`)、**页面模板 / PATTERNS**,并拿到与 TFDS 一致的 **Token / theme.css**。
|
|
4
|
+
|
|
5
|
+
> **独立 npm 安装**:发布时 `prepack` 会把主仓 `src/data/systems/b-end/` 打包到包内 `src/_b_end_runtime/`,因此对方 `npm i @tf-designsystem/b-end` 后**不必 clone 主仓库**即可解析组件源码。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 👀 你是谁?跳到对应章节
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
| 角色 | 你想做什么 | 跳到 |
|
|
13
|
+
| ----------------------------------------------- | --------------------------------- | ------------------------------------------------ |
|
|
14
|
+
| 🎨 **设计师 / PM** | 了解 TFDS 是什么、解决什么问题(**不需要写代码**) | [§ 设计师视角:TFDS 在做什么?](#设计师视角tfds-在做什么) |
|
|
15
|
+
| 👨💻 **前端工程师(已有项目)** | 装包 → 用组件 | [§ TL;DR:安装即完成](#tldr安装即完成全自动) |
|
|
16
|
+
| 👨💻 **前端工程师(空项目)** | 从零搭一个 Vite + React + TFDS | [§ 全新项目?从这里开始](#全新项目从这里开始) |
|
|
17
|
+
| 🤖 **AI / IDE(Cursor / Codex / Trae / Claude)** | 我已被自动配置 → Cursor/Claude/Codex 用 `/tfds`;Trae 用 `@tfds` | `[skills/tfds/SKILL.md](./skills/tfds/SKILL.md)` |
|
|
18
|
+
| 🛠️ **TFDS 维护者** | 发布新版本到 npm 仓库 | 仓库内 `packages/tfds-b-end/PUBLISH.md`(不随 npm 包下发) |
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 设计师视角:TFDS 在做什么?
|
|
24
|
+
|
|
25
|
+
> 给设计师 / PM / 没装过开发环境的同学读,**不涉及任何代码**。
|
|
26
|
+
|
|
27
|
+
**TFDS 是一套"可被 AI 直接调用"的 B 端组件库 + 设计规范**。它解决的核心问题是:
|
|
28
|
+
|
|
29
|
+
1. **AI 不再"凭感觉画"** —— 我们把所有按钮、表单、表格、聊天输入框等组件,连同它们的颜色、字号、间距规则,全部封装成 AI 能"看懂"的指令字典(`skills/tfds/`)。
|
|
30
|
+
2. **设计师改 Figma = 全平台同步** —— 你只需要在 Figma 里维护组件,工程会自动读取最新规则;AI 生成的页面会和你的设计稿保持一致。
|
|
31
|
+
3. **分层规范链路,覆盖所有场景**:
|
|
32
|
+
- **设计原则层**:AI 先判断页面气质、UX 取舍、视觉权重和组件角色
|
|
33
|
+
- **页面范式层**:AI 先判断是列表管理、详情编辑、会话工作台、入口首页还是多步骤配置
|
|
34
|
+
- **组件层**:AI 先读轻量摘要选型,再回查完整组件索引(Button、Card、Tabs…)
|
|
35
|
+
- **布局层**:页面骨架怎么搭(一栏 / 两栏 / IM 聊天 / 工作台…)
|
|
36
|
+
- **token 层**:组件没覆盖的自定义区块,AI 必须用什么颜色/字号/圆角
|
|
37
|
+
|
|
38
|
+
📂 **你只需要优先打开这些文件浏览,就能看到规范如何约束 AI**:
|
|
39
|
+
|
|
40
|
+
- `[skills/tfds/DESIGN_PRINCIPLES.md](./skills/tfds/DESIGN_PRINCIPLES.md)` — 设计原则、页面气质与 UX 取舍
|
|
41
|
+
- `[skills/tfds/PAGE_ARCHETYPES.md](./skills/tfds/PAGE_ARCHETYPES.md)` — 页面范式与信息架构选型
|
|
42
|
+
- `[skills/tfds/LAYOUT_RECIPES.md](./skills/tfds/LAYOUT_RECIPES.md)` — 页面 recipe、容器语义、间距和对齐决策
|
|
43
|
+
- `[skills/tfds/LAYOUT_RULES.md](./skills/tfds/LAYOUT_RULES.md)` — 页面骨架规则
|
|
44
|
+
- `[skills/tfds/GLOBAL_DESIGN_RULES.md](./skills/tfds/GLOBAL_DESIGN_RULES.md)` — 全局 token 规则
|
|
45
|
+
|
|
46
|
+
> 💡 后续 TFDS 平台会把这些规范以可视化形式展示,设计师无需阅读 markdown 也能理解。
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 全新项目?从这里开始
|
|
51
|
+
|
|
52
|
+
如果你还没有业务项目(文件夹里只有下载的包,或者是空文件夹),优先使用平台 zip 内的一键脚本。脚本会自动判断当前文件夹状态:已有项目就复用现有工程,空文件夹就自动创建最小 Vite + React 项目、安装 Tailwind v4、安装 TFDS 并释放 Skill。
|
|
53
|
+
|
|
54
|
+
### 推荐:一条命令完成
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
node tfds-npm-distribution/setup.mjs
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
如果安装包不在业务项目根:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
node "/绝对路径/.../tfds-npm-distribution/setup.mjs" --target "/绝对路径/.../业务项目根"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
安装完成,`postinstall` 会自动配置好 CSS 和 Cursor / Claude / Codex / Agents Skill,直接进入 [TL;DR:安装即完成](#tldr安装即完成全自动) 后的使用环节。
|
|
67
|
+
|
|
68
|
+
### 旧包兜底:手动 file 安装
|
|
69
|
+
|
|
70
|
+
仅当你拿到的旧 zip 没有 `setup.mjs` 时,再手动创建项目并安装:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
npm create vite@latest my-app -- --template react
|
|
74
|
+
cd my-app
|
|
75
|
+
npm install
|
|
76
|
+
npm install tailwindcss @tailwindcss/vite
|
|
77
|
+
npm i "file:/Users/yourname/Downloads/tfds-npm-distribution/tfds-b-end" --save
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
并确保 `vite.config.js` 含 `tailwindcss()`,入口 CSS 含:
|
|
81
|
+
|
|
82
|
+
```js
|
|
83
|
+
import tailwindcss from '@tailwindcss/vite';
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
> ⚠ **关键**:新版离线包优先执行 `node tfds-npm-distribution/setup.mjs`。只有旧包没有 `setup.mjs`、必须手动 `npm i file:.../tfds-b-end` 时,才要求你已经位于含自己 `package.json` 的业务项目根。
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## TL;DR:安装即完成(全自动)
|
|
91
|
+
|
|
92
|
+
`npm install` 完成后,`postinstall` 会自动执行下面几件事,**无需任何手动配置**:
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
| # | 自动完成 | 目标位置 |
|
|
96
|
+
| --- | ---------------------------------------- | -------------------------------------------------- |
|
|
97
|
+
| 1 | 复制 Cursor Skill | `.cursor/skills/tfds/`(Agent 输入 `/tfds` 唤起) |
|
|
98
|
+
| 2 | 复制 Claude Code Skill | `.claude/skills/tfds/`(输入 `/tfds` 唤起) |
|
|
99
|
+
| 3 | 复制 Codex 用户级 Skill | `~/.codex/skills/tfds/`(新开/重启 Codex 后输入 `/tfds`) |
|
|
100
|
+
| 4 | 写入 Codex 项目内参考文件 | `.codex/skills/tfds/` |
|
|
101
|
+
| 5 | 复制 Agents Skill 兜底 | `.agents/skills/tfds/`(通用 agent 客户端) |
|
|
102
|
+
| 6 | **插入 `theme.css` import 与 `@source` 扫描** | `src/index.css`(首个含 `@import "tailwindcss"` 的候选文件) |
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
⚠ **故意不自动写入 `.trae/rules/`**:Trae rules 是 always-on 全局规则,与 TFDS"显式调用才生效"的隔离原则冲突。Trae 用户请把 `node_modules/@tf-designsystem/b-end/skills/tfds/` 手动加入「项目知识库」并命名为 `tfds`,之后在对话里 `@tfds` 引用。
|
|
106
|
+
|
|
107
|
+
Skill 目录内的关键文件:
|
|
108
|
+
|
|
109
|
+
- `SKILL.md`:总控流程、调用优先级、黄金流程。
|
|
110
|
+
- `DESIGN_PRINCIPLES.md` / `PAGE_ARCHETYPES.md`:设计品味、页面范式、布局判断。
|
|
111
|
+
- `components.summary.json`:轻量组件摘要,用于快速初选组件和模板。
|
|
112
|
+
- `components.index.json`:完整组件详情,命中后读取 props / rules / examples。
|
|
113
|
+
- `CHECKLIST.md` / `COMMON_FAILURES.md`:交付前自检与高频问题修正。
|
|
114
|
+
|
|
115
|
+
> **前提**:如果你直接执行 `npm install file:.../tfds-b-end`,需要位于已有业务项目根,且入口 CSS 中已有 `@import "tailwindcss";`。如果是平台 zip,本节前提由 `node tfds-npm-distribution/setup.mjs` 自动补齐,空文件夹也可一键完成。
|
|
116
|
+
>
|
|
117
|
+
> ⚠ 不要只打开/只在解压的 `tfds-b-end/` 目录里操作;不要从 `tmp-*/` 临时目录安装(清理后路径 `ENOENT`)。
|
|
118
|
+
|
|
119
|
+
### 安装方式(任选一种)
|
|
120
|
+
|
|
121
|
+
- **GitHub Packages 私有包(推荐授权成员)**
|
|
122
|
+
先在本机或项目 `.npmrc` 配置(不要追加全局 `--registry`):
|
|
123
|
+
```ini
|
|
124
|
+
@tf-designsystem:registry=https://npm.pkg.github.com
|
|
125
|
+
//npm.pkg.github.com/:_authToken=YOUR_GITHUB_TOKEN
|
|
126
|
+
```
|
|
127
|
+
```bash
|
|
128
|
+
npm i react react-dom lucide-react "@tf-designsystem/b-end@^1.0.0" --save
|
|
129
|
+
```
|
|
130
|
+
- **本地 `file:`(联调最快 / 平台分发 zip)**
|
|
131
|
+
```bash
|
|
132
|
+
npm i react react-dom lucide-react "file:/绝对路径/.../tfds-npm-distribution/tfds-b-end" --save
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### postinstall 自动写入 CSS 的效果
|
|
136
|
+
|
|
137
|
+
脚本在 `@import "tailwindcss";` 之后自动插入(已存在则跳过,不重复写入):
|
|
138
|
+
|
|
139
|
+
```css
|
|
140
|
+
@import "tailwindcss";
|
|
141
|
+
@import "@tf-designsystem/b-end/theme.css";
|
|
142
|
+
@source "./**/*.{js,jsx,ts,tsx}";
|
|
143
|
+
@source "../node_modules/@tf-designsystem/b-end/**/*.{js,jsx}";
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
若入口 CSS **未找到** `@import "tailwindcss"` → 不改写文件,终端打印手动步骤提示。
|
|
147
|
+
|
|
148
|
+
### 跳过自动操作(可选)
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
# 跳过 CSS 自动补丁(保持 CSS 文件不变)
|
|
152
|
+
SKIP_TFDS_CSS_PATCH=1 npm i "@tf-designsystem/b-end" --save
|
|
153
|
+
|
|
154
|
+
# 跳过 Skill 复制(如 CI 环境只需依赖不需 IDE Skill)
|
|
155
|
+
SKIP_TFDS_CURSOR_SKILL=1 npm i "@tf-designsystem/b-end" --save
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### 安装后验证(可选,只读)
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
node node_modules/@tf-designsystem/b-end/scripts/check-tfds-integration.mjs
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## 1) 安装详解
|
|
167
|
+
|
|
168
|
+
### 方式 A:从 Git 安装(推荐团队内部)
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
npm i git+ssh://git@github.com/<org>/<tfds-repo>.git#main
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### 方式 B:本地 file 依赖(联调最快)
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
npm i file:../TFDS-Design-Skill/packages/tfds-b-end
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### 方式 C:GitHub Packages 私有包(授权成员)
|
|
181
|
+
|
|
182
|
+
先在本机或项目 `.npmrc` 配置 GitHub Packages registry 与个人 token:
|
|
183
|
+
|
|
184
|
+
```ini
|
|
185
|
+
@tf-designsystem:registry=https://npm.pkg.github.com
|
|
186
|
+
//npm.pkg.github.com/:_authToken=YOUR_GITHUB_TOKEN
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
npm i react react-dom lucide-react "@tf-designsystem/b-end@^1.0.0" --save
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
安装者需要拥有该 package 的 Read 权限,token 至少需要 `read:packages`。包页:[GitHub Packages 包页](https://github.com/orgs/TF-Designsystem/packages/npm/package/b-end)。维护者发版见仓库内 `packages/tfds-b-end/PUBLISH.md`。
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## 2) 引入主题(postinstall 已自动完成,此节供手动回退参考)
|
|
198
|
+
|
|
199
|
+
若 postinstall 未自动写入(例如 CSS 中尚无 `@import "tailwindcss"`),请手动在全局样式入口(如 `src/index.css`)中补充:
|
|
200
|
+
|
|
201
|
+
```css
|
|
202
|
+
@import "tailwindcss";
|
|
203
|
+
@import "@tf-designsystem/b-end/theme.css";
|
|
204
|
+
|
|
205
|
+
/* Tailwind v4 推荐 @source(与 tailwind.config content 二选一) */
|
|
206
|
+
@source "./**/*.{js,jsx,ts,tsx}";
|
|
207
|
+
@source "../node_modules/@tf-designsystem/b-end/**/*.{js,jsx}";
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
> `theme.css` 包含 `@theme { ... }` 的完整 token 定义(由 TFDS 的 `generateThemeCssVars()` 生成)。
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## 3) Tailwind 扫描说明
|
|
215
|
+
|
|
216
|
+
若你仍使用 `tailwind.config` 的 `content` 方式(Tailwind v3 / 旧项目),在配置里加入:
|
|
217
|
+
|
|
218
|
+
```js
|
|
219
|
+
export default {
|
|
220
|
+
content: [
|
|
221
|
+
'./index.html',
|
|
222
|
+
'./src/**/*.{js,jsx,ts,tsx}',
|
|
223
|
+
'./node_modules/@tf-designsystem/b-end/**/*.{js,jsx}',
|
|
224
|
+
],
|
|
225
|
+
};
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
> 与 `@source` 二选一,不要同时使用。
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## 4) 使用组件
|
|
233
|
+
|
|
234
|
+
**选型先看随包 Skill 的 `skills/tfds/components.summary.json`,具体 props / rules / examples 以 `skills/tfds/components.index.json` 命中条目为准**(全量组件含 Avatar、NavBar、Table、Modal、ChatInput、ChatMessage 等)。
|
|
235
|
+
|
|
236
|
+
头像类组件默认使用包内本地成员头像素材:`Avatar` 图片态未传 `src` 时会随机取本地成员头像;需要稳定绑定时可从包内导出的 `getTeamMemberByIndex` / `getTeamAvatarBySeed` 获取本地头像后传给 `avatarSrc`。不要为默认头像使用 pravatar / Unsplash / placeholder 外链。
|
|
237
|
+
|
|
238
|
+
```jsx
|
|
239
|
+
import { NavBar, Button, Table, ChatInput } from '@tf-designsystem/b-end';
|
|
240
|
+
|
|
241
|
+
export default function Demo() {
|
|
242
|
+
return (
|
|
243
|
+
<div className="flex min-h-screen flex-col gap-4 p-6">
|
|
244
|
+
<NavBar platform="ola" selectedItemId="knowledge" />
|
|
245
|
+
<Button variant="primary">主操作</Button>
|
|
246
|
+
<ChatInput variant="default" />
|
|
247
|
+
</div>
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### 4.1 页面模板:IM 对话(静态片段)
|
|
253
|
+
|
|
254
|
+
```jsx
|
|
255
|
+
import { IMConversationPattern } from '@tf-designsystem/b-end';
|
|
256
|
+
|
|
257
|
+
export default function ImDemoPage() {
|
|
258
|
+
return (
|
|
259
|
+
<div className="p-6" style={{ background: 'var(--color-blueGrey-200)' }}>
|
|
260
|
+
<IMConversationPattern />
|
|
261
|
+
</div>
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
> 重要:`IMConversationPattern` 会间接依赖 `ChatBubble → Avatar/Tooltip/...` 等链路。请确保 Tailwind 扫描覆盖到包内所有 `.jsx`(`node_modules/@tf-designsystem/b-end/**/*.{js,jsx}` 通常足够)。
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## 5) Cursor Agent Skill `tfds`(`/tfds` 唤起)
|
|
271
|
+
|
|
272
|
+
安装包时 `postinstall` 已自动复制 Skill 到 `.cursor/skills/tfds/`。
|
|
273
|
+
|
|
274
|
+
### 5.1 安装后会发生什么
|
|
275
|
+
|
|
276
|
+
- 若 `.cursor/skills/tfds/` 不存在 → 自动复制包内 `skills/tfds/` 到项目根
|
|
277
|
+
- 若目录已存在 → **不覆盖**,终端提示 skipped
|
|
278
|
+
- 若仅有旧大写路径 `.cursor/skills/TFDS/` → 自动**重命名**为 `tfds/`
|
|
279
|
+
|
|
280
|
+
### 5.2 跳过自动释放
|
|
281
|
+
|
|
282
|
+
```bash
|
|
283
|
+
SKIP_TFDS_CURSOR_SKILL=1 npm i @tf-designsystem/b-end
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### 5.3 用户如何在 Cursor 里唤起(`/tfds`)
|
|
287
|
+
|
|
288
|
+
1. 安装完成后,先重新打开项目或新开 Agent 会话,让 Cursor 重新扫描 `.cursor/skills/tfds/`。
|
|
289
|
+
2. 在 **Agent** 聊天输入框输入 `/tfds`,从列表中选择本 Skill(描述含「【TFDS】…」)。
|
|
290
|
+
3. 若列表没有 `tfds`,先确认 `.cursor/skills/tfds/SKILL.md` 存在,再重启 Cursor。
|
|
291
|
+
4. 继续描述要生成的页面(例如「做一个带 IM 会话区 + 底部 ChatInput 的客服页」)。
|
|
292
|
+
5. 模型必须先读取 `.cursor/skills/tfds/components.summary.json` 初选组件,再回查 `.cursor/skills/tfds/components.index.json` 命中条目写 props。
|
|
293
|
+
|
|
294
|
+
### 5.4 与单组件 Skill 的关系
|
|
295
|
+
|
|
296
|
+
- `tfds`(/tfds):总控 Skill,索引里包含 **ChatInput + IMConversationPattern** 等,适合「直接生成页面」。
|
|
297
|
+
- **单组件 zip**:仍可按需额外解压到 `.cursor/skills/...`,与 `tfds` 不冲突;若规则冲突,以 `tfds` + 本包 `components.index.json` 命中条目为准。
|
|
298
|
+
|
|
299
|
+
### 5.5 手动安装 / 平台下载
|
|
300
|
+
|
|
301
|
+
- **手动**:从本仓库复制 `packages/tfds-b-end/skills/tfds` → 对方项目 `.cursor/skills/tfds`。
|
|
302
|
+
- **平台**:亦可在 TFDS Skill 中心下载 **【TFDS】** 对应 zip,解压到 `.cursor/skills/tfds/`(**目录名须为 `tfds`**,否则 `/tfds` 无法命中)。
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## 5.6) 给 AI / Agent 的规范入口
|
|
307
|
+
|
|
308
|
+
TFDS 规范只应在显式调用时读取,**不要**放进 `AGENTS.md`、`.trae/rules/` 等 always-on 规则。
|
|
309
|
+
|
|
310
|
+
- **首选入口**:`/tfds` 或 `@tfds` → `skills/tfds/SKILL.md`
|
|
311
|
+
- **设计原则**:`skills/tfds/DESIGN_PRINCIPLES.md`
|
|
312
|
+
- **页面范式**:`skills/tfds/PAGE_ARCHETYPES.md`
|
|
313
|
+
- **布局 Recipe**:`skills/tfds/LAYOUT_RECIPES.md`
|
|
314
|
+
- **组件轻量摘要**:`skills/tfds/components.summary.json`
|
|
315
|
+
- **组件权威索引**:`skills/tfds/components.index.json`
|
|
316
|
+
- **交付自检 / 失败修正**:`skills/tfds/CHECKLIST.md` / `skills/tfds/COMMON_FAILURES.md`
|
|
317
|
+
- **跨 IDE 兜底入口**:`AI_READ_FIRST.md`
|
|
318
|
+
- **深层规则**:由 `SKILL.md` 按需引导读取 `LAYOUT_RECIPES.md`、`LAYOUT_RULES.md` 与 `GLOBAL_DESIGN_RULES.md`
|
|
319
|
+
|
|
320
|
+
### 各 IDE 调用方式
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
| IDE | 调用方式 | postinstall 是否自动配置 |
|
|
324
|
+
| ------------------ | --------------------------------------------------------------------------------------- | -------------------------------------- |
|
|
325
|
+
| **Cursor** | 重新打开项目 / 新开 Agent 会话后输入 `/tfds`;若未出现,确认 `.cursor/skills/tfds/SKILL.md` 后重启 Cursor | ✅ `.cursor/skills/tfds/` |
|
|
326
|
+
| **Claude Code** | 重启 Claude Code 会话后输入 `/tfds`;若不支持 Skill 热加载,直接引用 `skills/tfds/SKILL.md` | ✅ `.claude/skills/tfds/` |
|
|
327
|
+
| **Codex** | 必须新开/重启 Codex 会话后输入 `/tfds`;当前会话通常不会热加载新安装的 `~/.codex/skills/tfds/` | ✅ `~/.codex/skills/tfds/` + `.codex/skills/tfds/` |
|
|
328
|
+
| **Trae** | 不会自动出现 `/tfds`;把 `node_modules/@tf-designsystem/b-end/skills/tfds/` 加入项目知识库(命名 `tfds`),之后 `@tfds` 引用 | ❌ 故意不写 `.trae/rules/`(避免 always-on 污染) |
|
|
329
|
+
| **其他 IDE / Agent** | 不保证支持 `/tfds`;显式让 AI 先读 `AI_READ_FIRST.md`,再按其指引读取 `skills/tfds/SKILL.md` | — |
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
> 输入 `/` 后没看到 `tfds` 选项?先确认对应 Skill 文件真的存在;再「重启 IDE / 重新打开项目」让 IDE 重新扫描 Skill 目录。Codex 需要新开或重启会话后重新扫描 `~/.codex/skills`。
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## 6) 硬门禁:ESLint(@tfds/eslint-config)
|
|
337
|
+
|
|
338
|
+
仅靠 Skill 无法从工程上禁止 AI/人写出"漂移样式"。请让对方项目安装并使用:
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
npm i -D eslint @eslint/js eslint-plugin-react eslint-plugin-react-hooks globals @tfds/eslint-config
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
新增 `eslint.config.js`:
|
|
345
|
+
|
|
346
|
+
```js
|
|
347
|
+
import tfds from '@tfds/eslint-config/flat';
|
|
348
|
+
export default [...tfds];
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
并在 CI 中执行 `npx eslint .`。
|
|
352
|
+
|
|
353
|
+
规则细节见:`packages/tfds-eslint-config/README.md`。
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tfdesign/b-end",
|
|
3
|
+
"version": "1.0.4",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "TFDS B-end React components + Tailwind v4 theme.css; self-contained npm install (no monorepo clone required).",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"tfds",
|
|
9
|
+
"design-system",
|
|
10
|
+
"react",
|
|
11
|
+
"tailwindcss",
|
|
12
|
+
"b-end",
|
|
13
|
+
"components"
|
|
14
|
+
],
|
|
15
|
+
"author": "duanran_ryan",
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/TF-Designsystem/TFDS.git",
|
|
20
|
+
"directory": "packages/tfds-b-end"
|
|
21
|
+
},
|
|
22
|
+
"bugs": {
|
|
23
|
+
"url": "https://github.com/TF-Designsystem/TFDS/issues"
|
|
24
|
+
},
|
|
25
|
+
"homepage": "https://github.com/TF-Designsystem/TFDS/tree/main/packages/tfds-b-end#readme",
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=18"
|
|
28
|
+
},
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"registry": "https://registry.npmjs.org/",
|
|
31
|
+
"access": "public"
|
|
32
|
+
},
|
|
33
|
+
"bin": {
|
|
34
|
+
"tfds-setup": "./scripts/setup.mjs"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"prepack": "node ../../scripts/generate-tfds-b-end-bundle.mjs && node ../../scripts/generate-tfds-b-end-types.mjs",
|
|
38
|
+
"postinstall": "node ./scripts/postinstall-cursor-skill.mjs"
|
|
39
|
+
},
|
|
40
|
+
"files": [
|
|
41
|
+
"src",
|
|
42
|
+
"theme.css",
|
|
43
|
+
"README.md",
|
|
44
|
+
"AI_READ_FIRST.md",
|
|
45
|
+
"LICENSE",
|
|
46
|
+
"package.json",
|
|
47
|
+
"skills",
|
|
48
|
+
"scripts"
|
|
49
|
+
],
|
|
50
|
+
"sideEffects": [
|
|
51
|
+
"./theme.css"
|
|
52
|
+
],
|
|
53
|
+
"types": "./src/index.d.ts",
|
|
54
|
+
"exports": {
|
|
55
|
+
".": {
|
|
56
|
+
"types": "./src/index.d.ts",
|
|
57
|
+
"import": "./src/index.js",
|
|
58
|
+
"default": "./src/index.js"
|
|
59
|
+
},
|
|
60
|
+
"./theme.css": "./theme.css"
|
|
61
|
+
},
|
|
62
|
+
"peerDependencies": {
|
|
63
|
+
"react": ">=18",
|
|
64
|
+
"react-dom": ">=18",
|
|
65
|
+
"lucide-react": ">=0.400.0"
|
|
66
|
+
}
|
|
67
|
+
}
|