@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.
Files changed (176) hide show
  1. package/AI_READ_FIRST.md +131 -0
  2. package/LICENSE +21 -0
  3. package/README.md +353 -0
  4. package/package.json +67 -0
  5. package/scripts/check-tfds-contract.mjs +334 -0
  6. package/scripts/check-tfds-integration.mjs +263 -0
  7. package/scripts/postinstall-cursor-skill.mjs +382 -0
  8. package/scripts/setup.mjs +520 -0
  9. package/skills/tfds/CHECKLIST.md +205 -0
  10. package/skills/tfds/COMMON_FAILURES.md +238 -0
  11. package/skills/tfds/DESIGN_PRINCIPLES.md +477 -0
  12. package/skills/tfds/GLOBAL_DESIGN_RULES.md +636 -0
  13. package/skills/tfds/LAYOUT_RECIPES.md +140 -0
  14. package/skills/tfds/LAYOUT_RULES.md +1355 -0
  15. package/skills/tfds/PAGE_ARCHETYPES.md +201 -0
  16. package/skills/tfds/SKILL.md +188 -0
  17. package/skills/tfds/components.index.json +7305 -0
  18. package/skills/tfds/components.summary.json +1809 -0
  19. package/src/_b_end_runtime/components/AiSuggestionShared.jsx +166 -0
  20. package/src/_b_end_runtime/components/Avatar.jsx +325 -0
  21. package/src/_b_end_runtime/components/Avatar.tokens.js +76 -0
  22. package/src/_b_end_runtime/components/AvatarGridPreview.jsx +56 -0
  23. package/src/_b_end_runtime/components/AvatarGroup.jsx +80 -0
  24. package/src/_b_end_runtime/components/AvatarGroup.tokens.js +28 -0
  25. package/src/_b_end_runtime/components/Button.jsx +144 -0
  26. package/src/_b_end_runtime/components/Button.tokens.js +90 -0
  27. package/src/_b_end_runtime/components/Card.jsx +460 -0
  28. package/src/_b_end_runtime/components/Card.tokens.js +124 -0
  29. package/src/_b_end_runtime/components/CardPreview.jsx +51 -0
  30. package/src/_b_end_runtime/components/ChatBubble.jsx +384 -0
  31. package/src/_b_end_runtime/components/ChatBubble.tokens.js +60 -0
  32. package/src/_b_end_runtime/components/ChatBubblePreview.jsx +129 -0
  33. package/src/_b_end_runtime/components/ChatInput.jsx +1399 -0
  34. package/src/_b_end_runtime/components/ChatInput.tokens.js +75 -0
  35. package/src/_b_end_runtime/components/ChatMessage.jsx +2215 -0
  36. package/src/_b_end_runtime/components/ChatMessage.tokens.js +257 -0
  37. package/src/_b_end_runtime/components/ChatMessagePreview.jsx +388 -0
  38. package/src/_b_end_runtime/components/Checkbox.jsx +317 -0
  39. package/src/_b_end_runtime/components/Checkbox.tokens.js +59 -0
  40. package/src/_b_end_runtime/components/ConversationList.jsx +1264 -0
  41. package/src/_b_end_runtime/components/ConversationList.tokens.js +135 -0
  42. package/src/_b_end_runtime/components/ConversationListPreview.jsx +108 -0
  43. package/src/_b_end_runtime/components/CustomerServiceWorkspaceFrame.jsx +324 -0
  44. package/src/_b_end_runtime/components/CustomerServiceWorkspaceFrame.tokens.js +69 -0
  45. package/src/_b_end_runtime/components/DatePicker.jsx +739 -0
  46. package/src/_b_end_runtime/components/DatePicker.tokens.js +99 -0
  47. package/src/_b_end_runtime/components/Empty.jsx +141 -0
  48. package/src/_b_end_runtime/components/Empty.tokens.js +40 -0
  49. package/src/_b_end_runtime/components/Form.jsx +609 -0
  50. package/src/_b_end_runtime/components/Form.tokens.js +77 -0
  51. package/src/_b_end_runtime/components/FormFieldStack.jsx +123 -0
  52. package/src/_b_end_runtime/components/FormFieldStack.tokens.js +12 -0
  53. package/src/_b_end_runtime/components/FormTitle.jsx +119 -0
  54. package/src/_b_end_runtime/components/FormTitle.tokens.js +87 -0
  55. package/src/_b_end_runtime/components/FullScreenPage.jsx +97 -0
  56. package/src/_b_end_runtime/components/FullScreenPage.tokens.js +19 -0
  57. package/src/_b_end_runtime/components/Icon.jsx +172 -0
  58. package/src/_b_end_runtime/components/Icon.tokens.js +26 -0
  59. package/src/_b_end_runtime/components/IconGridPreview.jsx +277 -0
  60. package/src/_b_end_runtime/components/InfoDisplayPanel.jsx +620 -0
  61. package/src/_b_end_runtime/components/InfoDisplayPanel.tokens.js +71 -0
  62. package/src/_b_end_runtime/components/InfoDisplayPanelPreview.jsx +133 -0
  63. package/src/_b_end_runtime/components/Input.jsx +258 -0
  64. package/src/_b_end_runtime/components/Input.tokens.js +68 -0
  65. package/src/_b_end_runtime/components/InputNumber.jsx +242 -0
  66. package/src/_b_end_runtime/components/InputNumber.tokens.js +55 -0
  67. package/src/_b_end_runtime/components/Modal.jsx +155 -0
  68. package/src/_b_end_runtime/components/Modal.tokens.js +73 -0
  69. package/src/_b_end_runtime/components/NavBar.jsx +842 -0
  70. package/src/_b_end_runtime/components/NavBar.tokens.js +97 -0
  71. package/src/_b_end_runtime/components/NavBarPreview.jsx +11 -0
  72. package/src/_b_end_runtime/components/Radio.jsx +227 -0
  73. package/src/_b_end_runtime/components/Radio.tokens.js +59 -0
  74. package/src/_b_end_runtime/components/Select.jsx +766 -0
  75. package/src/_b_end_runtime/components/Select.tokens.js +99 -0
  76. package/src/_b_end_runtime/components/Sheet.jsx +132 -0
  77. package/src/_b_end_runtime/components/Sheet.tokens.js +61 -0
  78. package/src/_b_end_runtime/components/Slider.jsx +346 -0
  79. package/src/_b_end_runtime/components/Slider.tokens.js +47 -0
  80. package/src/_b_end_runtime/components/Switch.jsx +124 -0
  81. package/src/_b_end_runtime/components/Switch.tokens.js +38 -0
  82. package/src/_b_end_runtime/components/Table.jsx +1338 -0
  83. package/src/_b_end_runtime/components/Table.tokens.js +147 -0
  84. package/src/_b_end_runtime/components/TablePreview.jsx +599 -0
  85. package/src/_b_end_runtime/components/Tabs.jsx +149 -0
  86. package/src/_b_end_runtime/components/Tabs.tokens.js +102 -0
  87. package/src/_b_end_runtime/components/Tag.jsx +199 -0
  88. package/src/_b_end_runtime/components/Tag.tokens.js +171 -0
  89. package/src/_b_end_runtime/components/TagBar.jsx +1134 -0
  90. package/src/_b_end_runtime/components/TagBar.tokens.js +75 -0
  91. package/src/_b_end_runtime/components/TagGridPreview.jsx +23 -0
  92. package/src/_b_end_runtime/components/TagInput.jsx +382 -0
  93. package/src/_b_end_runtime/components/TagInput.tokens.js +52 -0
  94. package/src/_b_end_runtime/components/TextArea.jsx +363 -0
  95. package/src/_b_end_runtime/components/TextArea.tokens.js +65 -0
  96. package/src/_b_end_runtime/components/TimePicker.jsx +444 -0
  97. package/src/_b_end_runtime/components/TimePicker.tokens.js +77 -0
  98. package/src/_b_end_runtime/components/Toast.jsx +120 -0
  99. package/src/_b_end_runtime/components/Toast.tokens.js +146 -0
  100. package/src/_b_end_runtime/components/Tooltip.jsx +282 -0
  101. package/src/_b_end_runtime/components/Tooltip.tokens.js +48 -0
  102. package/src/_b_end_runtime/components/TooltipPreview.jsx +50 -0
  103. package/src/_b_end_runtime/components/Upload.jsx +455 -0
  104. package/src/_b_end_runtime/components/Upload.tokens.js +47 -0
  105. package/src/_b_end_runtime/components/avatar-assets/avatar-default.png +0 -0
  106. package/src/_b_end_runtime/components/avatar-group-assets/avatar-group-1.png +0 -0
  107. package/src/_b_end_runtime/components/avatar-group-assets/avatar-group-2.png +0 -0
  108. package/src/_b_end_runtime/components/avatar-group-assets/avatar-group-3.png +0 -0
  109. package/src/_b_end_runtime/components/avatar-group-assets/avatar-group-4.png +0 -0
  110. package/src/_b_end_runtime/components/avatar-group-assets/avatar-group-5.png +0 -0
  111. package/src/_b_end_runtime/components/empty-assets/administrator-1.svg +40 -0
  112. package/src/_b_end_runtime/components/empty-assets/administrator-2.svg +33 -0
  113. package/src/_b_end_runtime/components/empty-assets/construction.svg +33 -0
  114. package/src/_b_end_runtime/components/empty-assets/failure.svg +49 -0
  115. package/src/_b_end_runtime/components/empty-assets/idle.svg +34 -0
  116. package/src/_b_end_runtime/components/empty-assets/no-access.svg +36 -0
  117. package/src/_b_end_runtime/components/empty-assets/no-content.svg +77 -0
  118. package/src/_b_end_runtime/components/empty-assets/no-result.svg +61 -0
  119. package/src/_b_end_runtime/components/empty-assets/not-found.svg +46 -0
  120. package/src/_b_end_runtime/components/empty-assets/success.svg +38 -0
  121. package/src/_b_end_runtime/components/file-type-assets/batch-report.png +0 -0
  122. package/src/_b_end_runtime/components/file-type-assets/catcat.svg +21 -0
  123. package/src/_b_end_runtime/components/file-type-assets/code.png +0 -0
  124. package/src/_b_end_runtime/components/file-type-assets/conversation.png +0 -0
  125. package/src/_b_end_runtime/components/file-type-assets/document.png +0 -0
  126. package/src/_b_end_runtime/components/file-type-assets/feishu-card.png +0 -0
  127. package/src/_b_end_runtime/components/file-type-assets/feishu-sheet.png +0 -0
  128. package/src/_b_end_runtime/components/file-type-assets/feishu.png +0 -0
  129. package/src/_b_end_runtime/components/file-type-assets/image.png +0 -0
  130. package/src/_b_end_runtime/components/file-type-assets/index.js +105 -0
  131. package/src/_b_end_runtime/components/file-type-assets/knowledge.png +0 -0
  132. package/src/_b_end_runtime/components/file-type-assets/pdf.png +0 -0
  133. package/src/_b_end_runtime/components/file-type-assets/pe.png +0 -0
  134. package/src/_b_end_runtime/components/file-type-assets/strategy.png +0 -0
  135. package/src/_b_end_runtime/components/file-type-assets/table.png +0 -0
  136. package/src/_b_end_runtime/components/file-type-assets/webpage.png +0 -0
  137. package/src/_b_end_runtime/components/file-type-assets/xmind.png +0 -0
  138. package/src/_b_end_runtime/components/icons/icon-data.js +12496 -0
  139. package/src/_b_end_runtime/components/nav-bar-assets/bytehi-logo-mark.svg +21 -0
  140. package/src/_b_end_runtime/components/table-assets/avatar.png +0 -0
  141. package/src/_b_end_runtime/components/table-assets/button.png +0 -0
  142. package/src/_b_end_runtime/components/table-assets/icon-chevron-down.png +0 -0
  143. package/src/_b_end_runtime/components/table-cell-assets/avatar.png +0 -0
  144. package/src/_b_end_runtime/components/table-cell-assets/button.png +0 -0
  145. package/src/_b_end_runtime/components/table-cell-assets/checkbox.png +0 -0
  146. package/src/_b_end_runtime/components/table-cell-assets/icon-chevron-right.png +0 -0
  147. package/src/_b_end_runtime/components/table-cell-assets/icon.png +0 -0
  148. package/src/_b_end_runtime/components/table-cell-assets/semi-icons-handle.png +0 -0
  149. package/src/_b_end_runtime/components/table-cell-assets/semi-icons-tree-triangle-right.png +0 -0
  150. package/src/_b_end_runtime/components/table-cell-assets/switch.png +0 -0
  151. package/src/_b_end_runtime/components/tagShared.js +3 -0
  152. package/src/_b_end_runtime/components/team-avatar-assets/chengcheng-murphy.png +0 -0
  153. package/src/_b_end_runtime/components/team-avatar-assets/duan-ran.png +0 -0
  154. package/src/_b_end_runtime/components/team-avatar-assets/guo-zhezhi.png +0 -0
  155. package/src/_b_end_runtime/components/team-avatar-assets/li-siru.png +0 -0
  156. package/src/_b_end_runtime/components/team-avatar-assets/liu-delin.png +0 -0
  157. package/src/_b_end_runtime/components.js +3499 -0
  158. package/src/_b_end_runtime/index.js +9 -0
  159. package/src/_b_end_runtime/page-patterns/BasePageFramePattern.jsx +395 -0
  160. package/src/_b_end_runtime/page-patterns/ChatConversationPattern.jsx +989 -0
  161. package/src/_b_end_runtime/page-patterns/ChatHomePagePattern.jsx +281 -0
  162. package/src/_b_end_runtime/page-patterns/CopilotPagePattern.jsx +380 -0
  163. package/src/_b_end_runtime/page-patterns/CustomerServiceWorkspaceFramePattern.jsx +392 -0
  164. package/src/_b_end_runtime/page-patterns/IMConversationPattern.jsx +590 -0
  165. package/src/_b_end_runtime/page-patterns/McpManagementPage.jsx +237 -0
  166. package/src/_b_end_runtime/page-patterns/StrategyListPage.jsx +189 -0
  167. package/src/_b_end_runtime/page-patterns/TabTopBarListPage.jsx +594 -0
  168. package/src/_b_end_runtime/page-patterns/VariableManagementPage.jsx +87 -0
  169. package/src/_b_end_runtime/page-patterns/pageListShared.jsx +177 -0
  170. package/src/_b_end_runtime/patterns.js +428 -0
  171. package/src/_b_end_runtime/preview-registry.jsx +4719 -0
  172. package/src/_b_end_runtime/teamMembers.js +56 -0
  173. package/src/_b_end_runtime/tokens.js +500 -0
  174. package/src/index.d.ts +1073 -0
  175. package/src/index.js +52 -0
  176. package/theme.css +350 -0
@@ -0,0 +1,205 @@
1
+ # TFDS 生成后自检 Checklist
2
+
3
+ > **作用域**:页面或组件生成完成后,按本文件逐项检查。任一项失败,先修复再交付。
4
+
5
+ ---
6
+
7
+ ## 1. Skill 读取链路
8
+
9
+ - 已读取 `DESIGN_PRINCIPLES.md` 判断页面气质。
10
+ - 已读取 `PAGE_ARCHETYPES.md` 判断页面范式。
11
+ - 已读取 `LAYOUT_RECIPES.md` 并选择唯一主 recipe(`base-management` / `chat-home` / `chat-conversation` / `copilot-workbench` / `im-thread`)。
12
+ - 已用 `components.summary.json` 做组件初选。
13
+ - 已对命中的组件读取 `components.index.json` 中完整 props / rules / examples。
14
+ - 自定义区块已查 `LAYOUT_RULES.md` 与 `GLOBAL_DESIGN_RULES.md`。
15
+
16
+ ---
17
+
18
+ ## 2. 组件调用
19
+
20
+ - `components.index.json` 里有对应组件时,已整体 import 使用。
21
+ - 没有用 `div/span` 手搓 Tag、Button、Tabs、Card、FormTitle、ChatInput、Table。
22
+ - **Tabs 尺寸默认铁律**:页面内/白卡内/面板内/表单分段/筛选维度/Playground 内的 `<Tabs />` **默认一律 SM**(省略 `size` 或显式 `size="sm"`);只有平台顶部 header / 页面级顶导 / 产品级一级导航才允许使用 `md/lg`。
23
+ - 页面标题、白卡标题、面板标题、section 标题全部使用 `FormTitle`。
24
+ - 状态、类型、风险、数量徽标优先使用 `Tag`。
25
+ - 所有纯图标按钮必须使用 `<Button iconOnly tooltip="操作文案" />`,不论 primary / outline / ghost / text 任一变体;禁止只放 icon 让用户猜操作含义。
26
+ - 对话、消息、输入使用 `ChatMessage` / `ChatBubble` / `ChatInput`。
27
+ - 所有人像类头像使用 `Avatar` / `AvatarGroup` 等 TFDS 组件,并默认优先使用包内本地成员头像素材;未使用 pravatar / Unsplash / placeholder 等随机外链头像。
28
+
29
+ ---
30
+
31
+ ## 3. 页面范式
32
+
33
+ - 页面第一屏能看出当前对象、关键状态和下一步操作。
34
+ - 页面主 recipe 与用户第一步动作一致:对象管理走 `base-management`,从 0 发起 AI 任务走 `chat-home`,持续 AI 协作走 `chat-conversation`,对象/产物主工作区 + AI 侧助走 `copilot-workbench`,真人会话走 `im-thread`。
35
+ - 页面 header 直接坐灰底,没有被错误包进白卡。
36
+ - 内容白卡只承载真实工作区:表格、列表、表单、对话、编辑器、运行结果。
37
+ - 复杂任务使用稳定分屏,而不是纵向堆叠成长页面。
38
+ - 入口页主行动居中,模板/案例卡片只做辅助路径;`ChatHomePagePattern` 右侧主内容区保持浅灰底,未用大白卡包住 Hero / ChatInput / Tabs / Card 网格。
39
+ - 产物预览像可交付文档,不被压缩成普通信息卡。
40
+
41
+ ---
42
+
43
+ ## 4. 布局与滚动
44
+
45
+ - 根容器 `h-dvh` / `h-full` 链路完整,关键层有 `min-h-0` / `min-w-0`。
46
+ - 表格、消息流、编辑器、产物区在自身容器内滚动。
47
+ - Playground、会话、多面板页没有错误地整页滚动。
48
+ - 双栏 / 三栏布局中固定侧 `shrink-0`,主内容 `flex-1 min-w-0`。
49
+ - **横向并列大卡工作区**(如双白卡 / 左筛选 + 右主表):辅助侧默认具备宽度拖拽(`resizable` + `minWidth` / `maxWidth` / `overflow-visible`),主卡 `flex-1 min-w-0`;对照 `LAYOUT_RULES.md` §3.2 / `McpManagementPage`。
50
+ - 白卡距浏览器边缘约 16px,卡与卡之间约 8px。
51
+ - 白卡内部 padding 使用 24px,未误用到页面外框。
52
+ - PageMetaBar / 白卡 Header / 筛选栏 / 卡片网格已按 `LAYOUT_RECIPES.md` 对齐:左侧标题 `min-w-0 flex-1`,右侧操作 `shrink-0 flex-wrap gap-2`;筛选栏固定宽而非全宽;卡片网格使用 `auto-fit/minmax`。
53
+ - AI 入口页的 Hero、`ChatInput`、Tabs、搜索和模板网格直接坐灰底;模板卡 `Card color="white"`;网格 `gap-4`;Tabs 为 `size="sm"`。
54
+ - `ChatMessage role="user"` 默认保持 `userBubbleTone="auto"`;白色大背景 / 白色工作卡内用户气泡应自动呈现 `fill-default` 灰底,浅灰或其他非白背景上应呈现白色气泡;不要在白底上强行写 `userBubbleTone="surface"`。
55
+
56
+ ---
57
+
58
+ ## 5. Token 与视觉
59
+
60
+ - 无硬编码 `#000` / `#fff` / `#333` 等颜色。
61
+ - 无 Tailwind 任意值 `text-[15px]` / `p-[18px]` / `rounded-[10px]` 等。
62
+ - 须与设计一致的字重使用 `[font-weight:var(--font-semibold)]` / `[font-weight:var(--font-bold)]`,避免裸 `font-semibold` / `font-bold`(见 `GLOBAL_DESIGN_RULES.md` §2.2)。
63
+ - 最外层白卡为纯白底 + 12px 圆角 + 无 border + 无 shadow。
64
+ - 品牌青绿只用于焦点、激活、链接、品牌状态和标题竖条。
65
+ - AI 渐变只出现在明确 AI 语义面。
66
+ - 每个区域最多一个 primary 主按钮。
67
+
68
+ ---
69
+
70
+ ## 6. 文本与可读性
71
+
72
+ - 核心说明、错误原因、状态说明完整可读,不被静默裁切。
73
+ - 列表预览、文件名、对象 ID 可省略,但有 Tooltip 或详情入口。
74
+ - 标题横向可读,没有一字一行、竖排、过窄标题列。
75
+ - 普通标题默认不展示 description;只有确有说明诉求才开启。
76
+
77
+ ---
78
+
79
+ ## 7. 工程集成
80
+
81
+ - 全局 CSS 已引入 `@import "@tf-designsystem/b-end/theme.css"`。
82
+ - Tailwind 已扫描 `node_modules/@tf-designsystem/b-end/**/*.{js,jsx}`。
83
+ - 交付前可运行:
84
+
85
+ ```bash
86
+ node node_modules/@tf-designsystem/b-end/scripts/check-tfds-integration.mjs
87
+ node node_modules/@tf-designsystem/b-end/scripts/check-tfds-contract.mjs
88
+ ```
89
+
90
+ ---
91
+
92
+ ## 8. FormTitle 真伪五件套(每个标题逐项目测)
93
+
94
+ 仅"竖条 + 文字"**不算**用对 FormTitle,必须**逐项**通过;任一不中即视为伪 FormTitle,必须改:
95
+
96
+ 1. **字重 = 600**(与组件一致:`[font-weight:var(--font-semibold)]`,禁止依赖裸 `font-semibold` 类)
97
+ 2. **字色 = `var(--color-foreground)` 深色**(不是 secondary 灰色)
98
+ 3. **竖条 = brand-500 蓝绿色 3×14/16px 圆角条**(不是品牌浅底、不是 1px border-left 直线)
99
+ 4. **描述默认隐藏**:无明确说明诉求时不写 `description`;确需展示时必须写 `showDescription`
100
+ 5. **描述位置正确**:`form` / `level-1` 描述在标题**下方独占一行**;`level-2` / `level-3` 描述在标题**同行右侧**;`card` 标题描述同排且**无竖条**
101
+ 6. **标题横向可读**:主标题保持横排,标题区最小宽度不低于 120px,右侧操作宁可换行也不能挤压标题
102
+
103
+ **variant 选型速记**:整体页面左上角总标题 / 工作台名 → `form`;列表/管理页单张主白卡顶栏、页内一级板块标题 → `level-1`;白卡内 section 区块标题("Prompt Workspace / System Prompt / Conversation / Tools / Run Result"等)→ `level-2`;level-2 之下子分区 → `level-3`;Card 内嵌摘要条 → `card`。
104
+
105
+ **常见伪装**(命中即必须替换为 `<FormTitle />`):
106
+
107
+ - ❌ 手搓竖条:`<div className="flex gap-2"><div className="w-1 h-4 bg-teal-500 rounded" /><h3 className="text-base">Prompt Workspace</h3></div>`
108
+ - ❌ 错用 `variant="card"` 当面板主标题(card 是弱化标题,不能用于 Workspace / System Prompt 等面板主标题)
109
+ - ❌ `<FormTitle className="font-normal text-gray-600" />`(违反"严禁覆写"铁律)
110
+ - ❌ 用 `<p>` 代替 `description` prop
111
+ - ❌ 标题竖排/逐字换行:`writing-mode: vertical-rl` / `break-all` / 给标题列固定 12-24px 宽
112
+
113
+ **标题状态 Tag 必须用 `titleSuffix`**:标题旁的状态 / 数量 / 身份 Tag(如 `0 条消息`、`Beta`、`只读`、`推荐`)必须作为 `titleSuffix` 紧跟主标题,不能放进右侧 action 区。
114
+
115
+ ✅ Good:`<FormTitle variant="level-2" title="Conversation" titleSuffix={<Tag variant="grey" size="m">0 条消息</Tag>} />`
116
+
117
+ ---
118
+
119
+ ## 9. 黑色边框误用 → 正确组件映射(高频)
120
+
121
+ | 误用场景 | 必须改成 |
122
+ | --------------------------------------------------- | ------------------------------------------------- |
123
+ | 数值型模型参数(Temperature/Top-P/Max Tokens/阈值/权重) | `<InputNumber />` |
124
+ | System Prompt / 模型高级参数 JSON / 请求参数 / 代码参数 / 代码输入 | `<TextArea variant="code" minRows={5} />` |
125
+ | 模型 ID/URL 输入 | `<TextArea minRows={1} />` |
126
+ | 操作描述 | `<TextArea minRows={2} />` |
127
+ | 表单备注 | `<TextArea minRows={3} />` |
128
+ | 模型/Effort 枚举 | `<Select />` |
129
+ | user/assistant 角色切换 | `<Tabs variant="segment" />` |
130
+ | Model List / 查看全部 文字链 | `<Button variant="text-brand" />` |
131
+
132
+ ---
133
+
134
+ ## 10. TextArea 撑满卡片高度(卡片主编辑区标准结构)
135
+
136
+ 主编辑区(System Prompt / 模型高级参数 / 代码 / JSON / 长文本)**必须**:
137
+
138
+ ```jsx
139
+ <section className="flex-1 min-h-0 flex flex-col overflow-hidden">
140
+ <header className="shrink-0 px-6 py-4">
141
+ <FormTitle variant="level-2" title="System Prompt" />
142
+ </header>
143
+ <div className="flex-1 min-h-0 overflow-hidden px-6 pb-6">
144
+ <TextArea variant="code" fillHeight resize="none" className="flex-1 min-h-0 w-full" />
145
+ </div>
146
+ </section>
147
+ ```
148
+
149
+ ⛔ Bad:`<TextArea minRows={5} />` 直接放在高卡片里,导致控件不撑满、下方空白。
150
+ ✅ Good:header `shrink-0` 固定,body `flex-1 min-h-0 overflow-hidden`,TextArea `fillHeight` 后内部滚动。
151
+
152
+ **code 字号铁律**:`variant="code"` 正文与行号必须保持 14px / 20px,⛔ 禁止外层套 `text-base` / `text-lg` / `leading-7` / `style={{ fontSize: 16 }}`。
153
+
154
+ ---
155
+
156
+ ## 11. 多面板 / Playground 嵌套结构(防整页滚)
157
+
158
+ **触发关键词**:`playground` / `调试` / `试验` / `IDE` / `多面板` / `prompt editor` / `prompt workspace` / `runtime` / `run result` / `输入区+输出区+参数区` / `A/B 对比` / `编辑器+预览`。
159
+
160
+ **必须从根到面板正文逐层匹配此骨架**:
161
+
162
+ ```
163
+ h-dvh + overflow-hidden ← 根:永不滚
164
+ └─ main: flex-1 min-h-0 + overflow-hidden ← 主区:永不滚
165
+ └─ section/aside(横向子项)
166
+ └─ flex-1 min-h-0 min-w-0 + flex-col + overflow-hidden (或 shrink-0 w-[Npx])
167
+ ├─ header: shrink-0
168
+ └─ body: flex-1 min-h-0 overflow-y-auto ← 唯一滚动层
169
+ ```
170
+
171
+ 任一层 `overflow-y-auto` 写在错误位置或漏 `min-h-0`,整页就会一起滚。
172
+
173
+ 仅 **Dashboard / 入口聚合首页 / KPI 看板**(纯堆叠浏览,无面板内编辑)才允许整页滚(LAYOUT_RULES § 12.4)。
174
+
175
+ ---
176
+
177
+ ## 12. 页面 header 灰底裸放(Bad / Good 对照)
178
+
179
+ **白卡装什么 / 灰底装什么**:
180
+
181
+ | 内容类型 | 装在哪 | 理由 |
182
+ | ------------------------------------- | ------ | --------------------------- |
183
+ | 列表 / 表格 / 对话流 / 参数表单 / 运行结果 / 编辑器主体 | ✅ 白卡 | 用户在这里"做事"——这是工作区 |
184
+ | 页面标题 + 描述 + 主次操作按钮(返回/导入/导出) | ✅ 灰底裸放 | 用户"了解 / 切换位置 / 触发动作"——页面元数据 |
185
+ | 面包屑 / 页面级 Pill Tabs(业务模块切换) | ✅ 灰底裸放 | 页面级导航,不是卡内子页签 |
186
+ | 全局浮窗工具条(Floating Action Bar) | ✅ 灰底裸放 | 页面级动作 |
187
+ | 白卡内的子区块标题(FormTitle level-2/3) | ✅ 在白卡内 | 卡内层级,不是页面级 header |
188
+
189
+ | ❌ 误用 | ✅ 必须改成 |
190
+ | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
191
+ | `<div bg=surface rounded-lg p-6>{标题 + 描述 + 操作按钮}</div>` | `<header className="shrink-0 px-4 pt-3 pb-2 flex justify-between">{...}</header>`(直接坐灰底,参照 LAYOUT_RULES § 1.5.2) |
192
+ | 把页面级 Pill Tabs(业务模块切换)放进白卡 | Pill Tabs 直接坐灰底(参照 CopilotPagePattern 的 TopBarTabs) |
193
+ | "标题白卡 + Tab 白卡 + 内容白卡"三张白卡叠加 | 顶部一行灰底裸放 + 一张内容白卡 |
194
+
195
+ **参考样本**:`CopilotPagePattern` TopBar = 裸顶导栏标杆;`BasePageFramePattern` = 顶部灰底 PageHeader + 单白卡 / 双白卡内容区组合。
196
+
197
+ ---
198
+
199
+ ## 13. 全宽撑满 / 左右大空白专项
200
+
201
+ - `main` padding **只能是 `p-4`(16px)**,⛔ 禁止 `p-2` / `p-6` / `p-8` 当外框间距
202
+ - ⛔ **禁止**在 `main` 内套 `<div className="max-w-* mx-auto">` 居中容器
203
+ - 白卡 div 自身**不加 `mx-` 外边距**,靠 `flex-1` / `shrink-0 w-[Npx]` 控制宽度
204
+ - ⛔ 禁止根容器 / `main` 加 `max-w-screen-xl` / `max-w-7xl` / `max-w-[1440px]` 等收窄值
205
+ - AI 入口页(`ChatHomePagePattern`)右侧主内容区禁止用 `bg-surface` / 白卡 wrapper 包住 Hero + ChatInput + Tabs + Card 网格;只允许模板卡自身是 `<Card color="white" />`
@@ -0,0 +1,238 @@
1
+ # TFDS 常见失败模式与修复
2
+
3
+ > **作用域**:当生成页面“不像 TFDS”、组件看起来对但细节不对、或 IDE 不能稳定调用 `/tfds` 时,先查本文件。
4
+
5
+ ---
6
+
7
+ ## 目录
8
+
9
+ - §1 `/tfds` 没有真正加载规范
10
+ - §2 只读了设计原则,没有读组件详情
11
+ - §3 手写“看起来像”的组件
12
+ - §4 FormTitle 仍然是细体或伪标题
13
+ - §5 白卡被灰边框或阴影圈死
14
+ - §6 页面 header 被包进白卡
15
+ - §7 多面板页整页滚动
16
+ - §8 AI 入口页被大白卡包住
17
+ - §9 输入框在白卡正文里没有撑满
18
+ - §10 Tabs 被 Button 或 Tag 冒充
19
+ - §11 TextArea 代码字号偏大
20
+ - §12 Tailwind 没扫描包内组件
21
+ - §13 字重用了裸 `font-semibold` / `font-bold`
22
+ - §14 没有先选布局 Recipe,导致容器和间距混乱
23
+ - §15 头像用了随机外链或手写 img
24
+ - §16 ChatMessage 用户气泡在白底上仍是白色
25
+
26
+ ---
27
+
28
+ ## 1. `/tfds` 没有真正加载规范
29
+
30
+ **现象**:AI 说按 TFDS 做了,但仍在手搓组件、写 hex、用普通后台模板。
31
+
32
+ **原因**:当前对话没有加载 Skill,或 IDE 未重新扫描安装后的 Skill 目录。
33
+
34
+ **修复**:
35
+
36
+ - Cursor / Claude Code:重启 IDE 或重新打开项目后输入 `/tfds`。
37
+ - Codex:新开/重启会话后输入 `/tfds`;不出现时引用 `~/.codex/skills/tfds/SKILL.md`。
38
+ - 其他 IDE:先读 `AI_READ_FIRST.md`,再按其中链路读取 Skill 文档。
39
+
40
+ ---
41
+
42
+ ## 2. 只读了设计原则,没有读组件详情
43
+
44
+ **现象**:页面气质接近,但 props、尺寸、交互和组件不一致。
45
+
46
+ **原因**:只读了 `DESIGN_PRINCIPLES.md` 或 `components.summary.json`,没有读取命中组件在 `components.index.json` 里的完整 rules。
47
+
48
+ **修复**:每个命中组件必须回查 `components.index.json#组件 id`。
49
+
50
+ ---
51
+
52
+ ## 3. 手写“看起来像”的组件
53
+
54
+ **现象**:Tag、Button、Tabs、FormTitle、ChatInput 看起来接近,但 hover、focus、字号、状态不一致。
55
+
56
+ **原因**:用 `div/span/button` 仿样式,而不是 import 组件。
57
+
58
+ **修复**:凡 `components.summary.json` 命中组件,必须整体 import:
59
+
60
+ ```jsx
61
+ import { FormTitle, Tag, Button, Tabs } from '@tf-designsystem/b-end';
62
+ ```
63
+
64
+ ---
65
+
66
+ ## 4. FormTitle 仍然是细体或伪标题
67
+
68
+ **现象**:标题左侧有竖条,但文字不是 600 字重,或仍是 `<h2>` / `<span>`。
69
+
70
+ **原因**:没有使用 `FormTitle`,或外部 className 覆写了组件字体。
71
+
72
+ **修复**:
73
+
74
+ - 页面、白卡、面板、section 标题全部用 `<FormTitle />`。
75
+ - 不传 `font-`*、`text-`* 覆写标题;字重以组件内 `[font-weight:var(--font-semibold)]` 为准(见 `GLOBAL_DESIGN_RULES.md` §2.2)。
76
+ - 状态数量用 `titleSuffix`。
77
+
78
+ ---
79
+
80
+ ## 5. 白卡被灰边框或阴影圈死
81
+
82
+ **现象**:页面看起来像旧式 admin,白卡边界很硬。
83
+
84
+ **原因**:最外层白卡加了 `border`、`outline`、`ring`、`shadow`。
85
+
86
+ **修复**:最外层工作白卡只保留:
87
+
88
+ ```jsx
89
+ style={{ background: 'var(--color-surface)', borderRadius: 'var(--radius-lg)' }}
90
+ ```
91
+
92
+ 内部 Input / Select / Table / Tag 的描边保留。
93
+
94
+ ---
95
+
96
+ ## 6. 页面 header 被包进白卡
97
+
98
+ **现象**:顶部“标题 + 描述 + 操作按钮”是一张白卡,下方内容又是一张白卡,主从混乱。
99
+
100
+ **原因**:把页面元信息误当成工作区内容。
101
+
102
+ **修复**:页面 header 直接坐灰底;只有列表、表格、表单、对话、编辑器、运行结果进入白卡。
103
+
104
+ ---
105
+
106
+ ## 7. 多面板页整页滚动
107
+
108
+ **现象**:写 prompt、调参数、看结果需要上下滚,输入输出无法对照。
109
+
110
+ **原因**:Playground / 会话 / 编辑详情页误用了普通 Dashboard 滚动模型。
111
+
112
+ **修复**:整页 `overflow-hidden`,每个面板内部滚动;标题栏 `shrink-0`,正文 `flex-1 min-h-0 overflow-y-auto`。
113
+
114
+ ---
115
+
116
+ ## 8. AI 入口页被大白卡包住
117
+
118
+ **现象**:AI 入口首页外层是浅灰底,但右侧内容区又套了一整张很大的白色圆角卡,里面再放 `ChatInput` 和模板卡片,视觉变成“灰底 → 大白卡 → 卡片”。
119
+
120
+ **原因**:AI 把“白卡承载工作内容”泛化到入口页,把 Hero / 输入框 / 模板广场误判为结构化管理页工作区。
121
+
122
+ **修复**:
123
+
124
+ - 先确认页面是否是 `ChatHomePagePattern`:用户尚未进入上下文,第一步是输入需求 / 搜索助手 / 从模板开始。
125
+ - 若命中入口页,右侧主内容区保持 `var(--color-blueGrey-200)` 浅灰底。
126
+ - Hero、`ChatInput`、Tabs、搜索框、模板 Card 网格直接坐灰底。
127
+ - 删除包住整块首页内容的 `bg-surface rounded-*` / `background: var(--color-surface)` wrapper。
128
+ - 模板卡片自身使用 `<Card color="white" />`;只有列表管理、表单详情、表格、编辑器、多面板工作区才进入白色工作卡。
129
+
130
+ ---
131
+
132
+ ## 9. 输入框在白卡正文里没有撑满
133
+
134
+ **现象**:配置项、名称、标题输入框只占一小段,显得不专业。
135
+
136
+ **原因**:把筛选栏固定宽规则误用到正文表单。
137
+
138
+ **修复**:
139
+
140
+ - 筛选栏:固定宽。
141
+ - 白卡正文单列字段:`w-full`。
142
+
143
+ ---
144
+
145
+ ## 10. Tabs 被 Button 或 Tag 冒充
146
+
147
+ **现象**:一排按钮用于切换内容,状态和交互不像平台组件。
148
+
149
+ **原因**:没有区分“动作”和“视图切换”。
150
+
151
+ **修复**:
152
+
153
+ - 同一区域互斥内容切换必须用 `<Tabs />`(禁止用 Button/Tag 冒充)。
154
+ - 内容区(白卡/面板/表单分段/筛选维度/Playground)默认 **一律** `size="sm"`(省略 size 也等价);只有平台顶部 header / 页面级顶导 / 产品级一级导航才允许 `md/lg`。
155
+
156
+ ---
157
+
158
+ ## 11. TextArea 代码字号偏大
159
+
160
+ **现象**:JSON / Prompt / 代码编辑区像放大版文本,行号和正文不稳。
161
+
162
+ **原因**:给 `TextArea variant="code"` 外部传了 `text-base` / `leading-6` 等覆写。
163
+
164
+ **修复**:直接使用组件默认 code variant,保持 14px / 20px。
165
+
166
+ ---
167
+
168
+ ## 12. Tailwind 没扫描包内组件
169
+
170
+ **现象**:组件样式缺失,黑边框、默认字体、颜色退化。
171
+
172
+ **原因**:缺少 theme.css 或 `@source`。
173
+
174
+ **修复**:
175
+
176
+ ```css
177
+ @import "tailwindcss";
178
+ @import "@tf-designsystem/b-end/theme.css";
179
+
180
+ @source "./**/*.{js,jsx,ts,tsx}";
181
+ @source "../node_modules/@tf-designsystem/b-end/**/*.{js,jsx}";
182
+ ```
183
+
184
+ ## 13. 字重用了裸 `font-semibold` / `font-bold`
185
+
186
+ **现象**:标题或列表主文案「看起来加粗了」,但和预览 / Token 面板不一致,或在不同 Tailwind 版本下忽粗忽细。
187
+
188
+ **原因**:直接用 Tailwind 语义类 `font-semibold` / `font-bold`;在 Tailwind v4 下 `--font-`* 可能与 font-family 语义冲突。
189
+
190
+ **修复**:
191
+
192
+ - 需要 **600** 时写:`[font-weight:var(--font-semibold)]`(与 `FormTitle` / `Button` / `Form` 标签等一致)。
193
+ - 需要 **700** 且组件 rules 允许时写:`[font-weight:var(--font-bold)]`。
194
+ - 页面标题一律用 `<FormTitle />`,不要手写 `h2 + font-semibold`。
195
+
196
+ ---
197
+
198
+ ## 14. 没有先选布局 Recipe,导致容器和间距混乱
199
+
200
+ **现象**:页面看起来用了 TFDS 组件,但布局像拼贴:入口页被白卡包住、列表页左右留白过大、筛选栏控件不齐、卡片网格间距不统一、Tabs 尺寸忽大忽小。
201
+
202
+ **原因**:AI 直接从组件开始写 JSX,没有先判断页面属于 `base-management` / `chat-home` / `chat-conversation` / `copilot-workbench` / `im-thread` 哪个 recipe。
203
+
204
+ **修复**:
205
+
206
+ 1. 回到 `PAGE_ARCHETYPES.md`,用“用户第一步动作”选模板。
207
+ 2. 打开 `LAYOUT_RECIPES.md`,选择唯一主 recipe。
208
+ 3. 按 recipe 决定容器:灰底直排、白色工作卡、会话流、Copilot 工作台或 IM 线程。
209
+ 4. 再补组件:`FormTitle`、`Tabs`、`Input`、`Table`、`ChatInput`、`Card` 等。
210
+ 5. 最后扫描反例:`main p-2/px-6`、`max-w-* mx-auto`、`bg-surface rounded` 包入口页、筛选栏 `w-full`、内容区 `Tabs size="md"`。
211
+
212
+ ---
213
+
214
+ ## 15. 头像用了随机外链或手写 img
215
+
216
+ **现象**:IM 对话、ChatBubble、Table 负责人列、NavBar 底部用户头像使用 `https://i.pravatar.cc`、Unsplash、placeholder 图片,或手写 `<img className="rounded-full">`。
217
+
218
+ **原因**:AI 把头像当成普通图片占位,没有读取 `Avatar` / `ChatBubble` / `Table` 的素材来源规则。
219
+
220
+ **修复**:
221
+
222
+ - 人像类头像必须用 `Avatar` / `AvatarGroup`,IM 气泡用 `ChatBubble`,表格头像列用 `Table type="avatar"` / `type="avatarText"`。
223
+ - 缺省头像不要传随机外链;`Avatar` 图片态未传 `src` 时会自动随机使用包内本地成员头像素材。
224
+ - 需要稳定绑定成员时,从包内导出的 `getTeamMemberByIndex` / `getTeamAvatarBySeed` 取本地成员头像,再传给 `avatarSrc`。
225
+
226
+ ---
227
+
228
+ ## 16. ChatMessage 用户气泡在白底上仍是白色
229
+
230
+ **现象**:白色大背景 / 白色工作卡内,`ChatMessage role="user"` 仍然是纯白气泡,气泡边界和父背景混在一起。
231
+
232
+ **原因**:旧规则要求手动传 `userBubbleTone="fill"`,AI 容易漏传;或直接写死 `userBubbleTone="surface"`,导致白底上仍使用白色气泡。
233
+
234
+ **修复**:
235
+
236
+ - 默认不传 `userBubbleTone`,让组件使用 `auto` 根据最近父级背景自动适配。
237
+ - 白色大背景 / 白色工作卡内应呈现灰色 `fill` 气泡;复杂白底无法识别时显式传 `userBubbleTone="fill"`。
238
+ - 浅灰、蓝灰、AI 会话灰底等非白背景应呈现白色 `surface` 气泡;只有复杂非白背景无法识别时才显式传 `userBubbleTone="surface"`。