@tfdesign/b-end 1.0.6 → 1.0.8
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 +13 -18
- package/README.md +3 -2
- package/package.json +1 -1
- package/scripts/check-tfds-integration.mjs +8 -3
- package/scripts/postinstall-cursor-skill.mjs +7 -7
- package/scripts/setup.mjs +1 -1
- package/skills/tfds/CHECKLIST.md +9 -4
- package/skills/tfds/COMMON_FAILURES.md +3 -3
- package/skills/tfds/GLOBAL_DESIGN_RULES.md +46 -19
- package/skills/tfds/LAYOUT_RULES.md +1 -1
- package/skills/tfds/PAGE_ARCHETYPES.md +3 -0
- package/skills/tfds/SKILL.md +10 -10
- package/skills/tfds/components.index.json +11 -29
- package/skills/tfds/components.summary.json +4 -4
- package/src/_b_end_runtime/components/TagInput.jsx +34 -172
- package/src/_b_end_runtime/components/TextArea.tokens.js +3 -3
- package/src/_b_end_runtime/components/Toast.jsx +1 -1
- package/src/_b_end_runtime/components/Toast.tokens.js +2 -2
- package/src/_b_end_runtime/components.js +10 -12
- package/src/_b_end_runtime/page-patterns/TabTopBarListPage.jsx +5 -5
- package/src/_b_end_runtime/preview-registry.jsx +186 -146
- package/src/_b_end_runtime/tokens.js +1 -1
- package/src/index.d.ts +0 -8
- package/theme.css +1 -1
package/AI_READ_FIRST.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# TFDS(@
|
|
1
|
+
# TFDS(@tfdesign/b-end)— 给任何 IDE 的 AI 阅读
|
|
2
2
|
|
|
3
3
|
> **隔离说明(重要)**:本文件仅在用户**显式调用 TFDS**(输入 `/tfds`、`@tfds`,或直接 `@` 引用本文件 / `SKILL.md`)时才应被读取。**禁止**把本文件写进 `AGENTS.md`、`.trae/rules/` 等"始终生效"的全局规则——那样会让 TFDS 规范污染所有与 TFDS 无关的对话。
|
|
4
4
|
|
|
5
|
-
你现在在一个消费方项目中接入 `@
|
|
5
|
+
你现在在一个消费方项目中接入 `@tfdesign/b-end`(TFDS B 端组件 + 主题 + 规范索引)。你的目标不是"把页面写出来就行",而是**生成的任何页面都必须遵循 TFDS 设计规范**,并能在对方项目里直接运行。
|
|
6
6
|
|
|
7
7
|
适用 IDE:Cursor / Codex / Claude Code / Trae / Copilot 等任何能读文件的 AI。
|
|
8
8
|
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
| # | 文档 | 路径 | 何时读 |
|
|
17
17
|
| --- | -------------- | ---------------------------------------------------------- | ----------------------------------------------------- |
|
|
18
|
-
| ① | **总指挥(必读)** | `node_modules/@
|
|
18
|
+
| ① | **总指挥(必读)** | `node_modules/@tfdesign/b-end/skills/tfds/SKILL.md` | 决定**整个生成流程**:决策树 + 黄金流程 + 生成后 Checklist |
|
|
19
19
|
| ② | **设计原则** | `.../skills/tfds/DESIGN_PRINCIPLES.md` | 判断**页面气质** + UX 取舍 + 视觉权重 + 组件角色 |
|
|
20
20
|
| ③ | **页面范式** | `.../skills/tfds/PAGE_ARCHETYPES.md` | 判断页面属于列表管理、详情编辑、会话工作台、入口首页、多步骤配置等哪类范式 |
|
|
21
21
|
| ④ | **布局 Recipe** | `.../skills/tfds/LAYOUT_RECIPES.md` | 先选唯一页面 recipe,确定容器语义、间距、对齐和滚动归属 |
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
| ⑧ | **全局设计规范** | `.../skills/tfds/GLOBAL_DESIGN_RULES.md` | 组件库**未覆盖的自定义区块**:颜色 / 字体 / 间距 / 圆角 / 阴影 token |
|
|
26
26
|
| ⑨ | **交付自检** | `.../skills/tfds/CHECKLIST.md` | 页面生成后逐项检查组件调用、页面范式、布局、token、文本可读性和工程集成 |
|
|
27
27
|
| ⑩ | **失败修正** | `.../skills/tfds/COMMON_FAILURES.md` | `/tfds` 调用失败、组件像但不准、标题字重不对、白卡/滚动/输入框异常时优先排查 |
|
|
28
|
-
| ⑪ | **本文件(兜底)** | `node_modules/@
|
|
28
|
+
| ⑪ | **本文件(兜底)** | `node_modules/@tfdesign/b-end/AI_READ_FIRST.md` | 只读隔离声明 + 安装/自检命令 |
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
⛔ **未读 ②③④⑦⑧ 就动手写页面 / 自定义信息卡 / 状态条 / KPI 块** → AI 几乎必然生成普通 admin 气质、黑色边框、`#000` 硬编码、`text-[15px]` 任意字号,也容易把 AI 入口页错包进大白卡。⛔ **未命中并回查 ⑥ 就写具体组件** → AI 很容易手搓相似组件。**先读再写**。
|
|
@@ -39,23 +39,18 @@
|
|
|
39
39
|
> - `~/.codex/skills/tfds/`(Codex 用户级 Skill;新开/重启 Codex 会话后 → `/tfds`)
|
|
40
40
|
> - `.codex/skills/tfds/`(Codex 项目内参考)
|
|
41
41
|
> - `.agents/skills/tfds/`(通用 agent 兜底)
|
|
42
|
+
> - `.trae-cn/skills/tfds/`(Trae CN 重新打开项目 / 新开会话后 → `Use Skill: tfds`)
|
|
42
43
|
>
|
|
43
|
-
> ⚠️ **故意不写 `.trae/rules/tfds.md`**:Trae rules 是 always-on
|
|
44
|
+
> ⚠️ **故意不写 `.trae/rules/tfds.md`**:Trae rules 是 always-on 全局规则,与本文件第一段隔离声明冲突;`.trae-cn/skills/tfds/` 是按需 Skill 目录。
|
|
44
45
|
|
|
45
46
|
---
|
|
46
47
|
|
|
47
|
-
## 1.
|
|
48
|
+
## 1. 安装(npm 官网 / 本地 zip 二选一)
|
|
48
49
|
|
|
49
|
-
### 方式 A:
|
|
50
|
-
|
|
51
|
-
```ini
|
|
52
|
-
# .npmrc
|
|
53
|
-
@tf-designsystem:registry=https://npm.pkg.github.com
|
|
54
|
-
//npm.pkg.github.com/:_authToken=YOUR_GITHUB_TOKEN
|
|
55
|
-
```
|
|
50
|
+
### 方式 A:npm 官网一键安装
|
|
56
51
|
|
|
57
52
|
```bash
|
|
58
|
-
|
|
53
|
+
npx -y -p @tfdesign/b-end@latest tfds-setup
|
|
59
54
|
```
|
|
60
55
|
|
|
61
56
|
### 方式 B:分发 zip / 本地 file:
|
|
@@ -92,10 +87,10 @@ npm i react react-dom lucide-react "file:/绝对路径/.../tfds-npm-distribution
|
|
|
92
87
|
```css
|
|
93
88
|
/* src/index.css */
|
|
94
89
|
@import "tailwindcss";
|
|
95
|
-
@import "@
|
|
90
|
+
@import "@tfdesign/b-end/theme.css";
|
|
96
91
|
|
|
97
92
|
@source "./**/*.{js,jsx,ts,tsx}";
|
|
98
|
-
@source "../node_modules/@
|
|
93
|
+
@source "../node_modules/@tfdesign/b-end/**/*.{js,jsx}";
|
|
99
94
|
```
|
|
100
95
|
|
|
101
96
|
---
|
|
@@ -103,8 +98,8 @@ npm i react react-dom lucide-react "file:/绝对路径/.../tfds-npm-distribution
|
|
|
103
98
|
## 3. 生成后必做:只读自检
|
|
104
99
|
|
|
105
100
|
```bash
|
|
106
|
-
node node_modules/@
|
|
107
|
-
node node_modules/@
|
|
101
|
+
node node_modules/@tfdesign/b-end/scripts/check-tfds-integration.mjs
|
|
102
|
+
node node_modules/@tfdesign/b-end/scripts/check-tfds-contract.mjs
|
|
108
103
|
```
|
|
109
104
|
|
|
110
105
|
第二个脚本若提示存在任意值 / 硬编码颜色 / 间距漂移,必须改到通过为止。
|
package/README.md
CHANGED
|
@@ -99,10 +99,11 @@ import tailwindcss from '@tailwindcss/vite';
|
|
|
99
99
|
| 3 | 复制 Codex 用户级 Skill | `~/.codex/skills/tfds/`(新开/重启 Codex 后输入 `/tfds`) |
|
|
100
100
|
| 4 | 写入 Codex 项目内参考文件 | `.codex/skills/tfds/` |
|
|
101
101
|
| 5 | 复制 Agents Skill 兜底 | `.agents/skills/tfds/`(通用 agent 客户端) |
|
|
102
|
-
| 6 |
|
|
102
|
+
| 6 | 复制 Trae CN Skill | `.trae-cn/skills/tfds/`(Use Skill: tfds) |
|
|
103
|
+
| 7 | **插入 `theme.css` import 与 `@source` 扫描** | `src/index.css`(首个含 `@import "tailwindcss"` 的候选文件) |
|
|
103
104
|
|
|
104
105
|
|
|
105
|
-
⚠ **故意不自动写入 `.trae/rules/`**:Trae rules 是 always-on 全局规则,与 TFDS"显式调用才生效"的隔离原则冲突。Trae
|
|
106
|
+
⚠ **故意不自动写入 `.trae/rules/`**:Trae rules 是 always-on 全局规则,与 TFDS"显式调用才生效"的隔离原则冲突。Trae CN 使用 `.trae-cn/skills/tfds/` 作为按需 Skill 目录,重新打开项目 / 新开会话后使用 `Use Skill: tfds`。
|
|
106
107
|
|
|
107
108
|
Skill 目录内的关键文件:
|
|
108
109
|
|
package/package.json
CHANGED
|
@@ -225,9 +225,14 @@ function main() {
|
|
|
225
225
|
successSuffix: '(通用 agent 兜底)',
|
|
226
226
|
});
|
|
227
227
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
228
|
+
checkSkillDir('Trae CN', path.join(projectRoot, '.trae-cn', 'skills', 'tfds'), {
|
|
229
|
+
required: true,
|
|
230
|
+
successSuffix: '(Use Skill: tfds)',
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
// Trae:只检查 opt-in Skill 目录,故意不自动写入 .trae/rules/(避免 always-on 污染)
|
|
234
|
+
if (exists(path.join(projectRoot, '.trae', 'rules'))) {
|
|
235
|
+
ok.push('Trae 隔离提示:本工具不会写入 .trae/rules/,避免 TFDS 规范污染所有对话。');
|
|
231
236
|
}
|
|
232
237
|
|
|
233
238
|
printReport(issues, ok);
|
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
// → .codex/skills/tfds/ (Codex → 项目内参考)
|
|
7
7
|
// → ~/.codex/skills/tfds/ (Codex → 用户级 /tfds Skill,需新开/重启 Codex 会话)
|
|
8
8
|
// → .agents/skills/tfds/ (通用 agent 兜底,与 .codex 并存)
|
|
9
|
+
// → .trae-cn/skills/tfds/ (Trae CN → Use Skill: tfds)
|
|
9
10
|
// ⚠️ 不再自动写 .trae/rules/tfds.md:Trae rules 是 always-on 全局规则,
|
|
10
|
-
// 与 TFDS"显式调用才生效"原则冲突。
|
|
11
|
+
// 与 TFDS"显式调用才生效"原则冲突。
|
|
11
12
|
// 跳过:SKIP_TFDS_CURSOR_SKILL=1;目标已存在且完整时不覆盖,旧版/缺文件时自动同步
|
|
12
13
|
//
|
|
13
14
|
// 2. 入口 CSS 自动补丁(最关键步骤,消除手动操作)
|
|
@@ -137,11 +138,12 @@ const SKILL_DIR_TARGETS = {
|
|
|
137
138
|
claude: { base: path.join(projectRoot, '.claude', 'skills'), label: 'Claude Code Skill → .claude/skills/tfds/ (唤起:/tfds)' },
|
|
138
139
|
codex: { base: path.join(projectRoot, '.codex', 'skills'), label: 'Codex 参考文件 → .codex/skills/tfds/ (若 /tfds 不出现,请用下方手动提示词)' },
|
|
139
140
|
agents: { base: path.join(projectRoot, '.agents', 'skills'), label: 'Agents Skill → .agents/skills/tfds/ (通用 agent 兜底)' },
|
|
141
|
+
traeCn: { base: path.join(projectRoot, '.trae-cn', 'skills'), label: 'Trae CN Skill → .trae-cn/skills/tfds/ (Use Skill: tfds)' },
|
|
140
142
|
};
|
|
141
143
|
|
|
142
144
|
/**
|
|
143
145
|
* 复制整个 skill 目录到指定 IDE 的 skills 路径。
|
|
144
|
-
* @param {'cursor'|'claude'|'codex'|'agents'} which
|
|
146
|
+
* @param {'cursor'|'claude'|'codex'|'agents'|'traeCn'} which
|
|
145
147
|
*/
|
|
146
148
|
function installSkillDir(which) {
|
|
147
149
|
const target = SKILL_DIR_TARGETS[which];
|
|
@@ -228,15 +230,13 @@ if (process.env.SKIP_TFDS_CURSOR_SKILL === '1') {
|
|
|
228
230
|
installSkillDir('claude'); // Claude Code → .claude/skills/tfds/
|
|
229
231
|
installSkillDir('codex'); // Codex → .codex/skills/tfds/
|
|
230
232
|
installSkillDir('agents'); // 通用兜底 → .agents/skills/tfds/
|
|
233
|
+
installSkillDir('traeCn'); // Trae CN → .trae-cn/skills/tfds/
|
|
231
234
|
if (process.env.SKIP_TFDS_CODEX_GLOBAL === '1') {
|
|
232
235
|
done.push('Codex 用户级 Skill 复制已跳过(SKIP_TFDS_CODEX_GLOBAL=1)');
|
|
233
236
|
} else {
|
|
234
237
|
installCodexUserSkill();
|
|
235
238
|
}
|
|
236
|
-
// Trae
|
|
237
|
-
todo.push(
|
|
238
|
-
'Trae 用户请手动操作:把 node_modules/@tfdesign/b-end/skills/tfds/ 加入 Trae 项目知识库(命名 tfds),之后 @tfds 引用。',
|
|
239
|
-
);
|
|
239
|
+
// Trae:只写 opt-in Skill 目录,故意不自动写 .trae/rules/(避免 always-on 污染所有对话)
|
|
240
240
|
}
|
|
241
241
|
|
|
242
242
|
// ─────────────────────────────────────────────────────────────────
|
|
@@ -366,7 +366,7 @@ console.log(' 规范仅在你主动调用时生效(opt-in,不影响其他
|
|
|
366
366
|
console.log(' Cursor → 重新打开项目 / 新开 Agent 会话后输入 /tfds');
|
|
367
367
|
console.log(' Claude Code → 重启当前 Claude Code 会话后输入 /tfds');
|
|
368
368
|
console.log(' Codex → 新开/重启 Codex 会话后输入 /tfds(当前会话通常不会热加载)');
|
|
369
|
-
console.log(' Trae
|
|
369
|
+
console.log(' Trae CN → 重新打开项目 / 新开会话后使用 Use Skill: tfds');
|
|
370
370
|
console.log('');
|
|
371
371
|
console.log(' ⚠ 勿把 TFDS 规范写入 AGENTS.md / .trae/rules/(全局通道会污染所有对话)');
|
|
372
372
|
console.log(' ⚠ 输入 / 后没看到 tfds?这通常是 IDE 尚未重新扫描 Skill 目录;请重启 IDE / 重新打开项目 / 新开会话。');
|
package/scripts/setup.mjs
CHANGED
|
@@ -514,7 +514,7 @@ if (fs.existsSync(checkScript)) {
|
|
|
514
514
|
|
|
515
515
|
console.log('\n──────────────────────────────────────────────────────');
|
|
516
516
|
console.log(' 安装已完成!');
|
|
517
|
-
console.log(' 输入 /tfds 即可开始生成页面,如果输入后没有显示具体引用,可以尝试重新打开项目或新开会话。');
|
|
517
|
+
console.log(' 输入 /tfds 或 Use Skill: tfds 即可开始生成页面,如果输入后没有显示具体引用,可以尝试重新打开项目或新开会话。');
|
|
518
518
|
console.log(' 或者输入以下固定提示词开始生成页面:');
|
|
519
519
|
console.log(' 按 TFDS 设计规范生成页面。先读取 node_modules/@tfdesign/b-end/AI_READ_FIRST.md。需求为:……');
|
|
520
520
|
console.log('──────────────────────────────────────────────────────\n');
|
package/skills/tfds/CHECKLIST.md
CHANGED
|
@@ -20,6 +20,8 @@
|
|
|
20
20
|
- `components.index.json` 里有对应组件时,已整体 import 使用。
|
|
21
21
|
- 没有用 `div/span` 手搓 Tag、Button、Tabs、Card、FormTitle、ChatInput、Table。
|
|
22
22
|
- **Tabs 尺寸默认铁律**:页面内/白卡内/面板内/表单分段/筛选维度/Playground 内的 `<Tabs />` **默认一律 SM**(省略 `size` 或显式 `size="sm"`);只有平台顶部 header / 页面级顶导 / 产品级一级导航才允许使用 `md/lg`。
|
|
23
|
+
- 涉及客服业务、客服工作台、客服接待、工单处理、售后处理、订单/商品上下文核对等场景时,客服工单信息、商品信息、订单信息、用户信息、客服信息、沟通记录、处理日志等辅助信息区已优先使用 `InfoDisplayPanel`,没有用多个 `Card` / `div` / 自制 tabs 拼接信息侧栏。
|
|
24
|
+
- 客服信息区存在多个分类时,已通过 `InfoDisplayPanel` 顶部 Tabs 切换分类;只有单一分类时才降级为标题 + 内容结构。
|
|
23
25
|
- 页面标题、白卡标题、面板标题、section 标题全部使用 `FormTitle`。
|
|
24
26
|
- 状态、类型、风险、数量徽标优先使用 `Tag`。
|
|
25
27
|
- 所有纯图标按钮必须使用 `<Button iconOnly tooltip="操作文案" />`,不论 primary / outline / ghost / text 任一变体;禁止只放 icon 让用户猜操作含义。
|
|
@@ -50,6 +52,9 @@
|
|
|
50
52
|
- 白卡距浏览器边缘约 16px,卡与卡之间约 8px。
|
|
51
53
|
- 白卡内部 padding 使用 24px,未误用到页面外框。
|
|
52
54
|
- PageMetaBar / 白卡 Header / 筛选栏 / 卡片网格已按 `LAYOUT_RECIPES.md` 对齐:左侧标题 `min-w-0 flex-1`,右侧操作 `shrink-0 flex-wrap gap-2`;筛选栏固定宽而非全宽;卡片网格使用 `auto-fit/minmax`。
|
|
55
|
+
- 表单正文宽度已按 `GLOBAL_DESIGN_RULES.md` §3.1 对齐:页面主表单、白卡表单、抽屉 / 弹窗正文表单、侧栏详情表单中的 `Input` / `Select` / `TextArea` / `InputNumber` / `DatePicker` / `TimePicker` / `TagInput` 均撑满字段列,并且左右边界一致。
|
|
56
|
+
- 没有把筛选栏 / 工具条的固定宽 `160/200/240px` 或示意宽 `300px` 套到业务表单正文;只有筛选栏、紧凑查询区、工具条允许固定宽。
|
|
57
|
+
- 使用 `Form children` 或 `item.control` 自定义字段时,自定义控件外层已补 `w-full min-w-0 max-w-full`,没有绕过 `Form` 的字段宽度约束。
|
|
53
58
|
- AI 入口页的 Hero、`ChatInput`、Tabs、搜索和模板网格直接坐灰底;模板卡 `Card color="white"`;网格 `gap-4`;Tabs 为 `size="sm"`。
|
|
54
59
|
- `ChatMessage role="user"` 默认保持 `userBubbleTone="auto"`;白色大背景 / 白色工作卡内用户气泡应自动呈现 `fill-default` 灰底,浅灰或其他非白背景上应呈现白色气泡;不要在白底上强行写 `userBubbleTone="surface"`。
|
|
55
60
|
|
|
@@ -78,13 +83,13 @@
|
|
|
78
83
|
|
|
79
84
|
## 7. 工程集成
|
|
80
85
|
|
|
81
|
-
- 全局 CSS 已引入 `@import "@
|
|
82
|
-
- Tailwind 已扫描 `node_modules/@
|
|
86
|
+
- 全局 CSS 已引入 `@import "@tfdesign/b-end/theme.css"`。
|
|
87
|
+
- Tailwind 已扫描 `node_modules/@tfdesign/b-end/**/*.{js,jsx}`。
|
|
83
88
|
- 交付前可运行:
|
|
84
89
|
|
|
85
90
|
```bash
|
|
86
|
-
node node_modules/@
|
|
87
|
-
node node_modules/@
|
|
91
|
+
node node_modules/@tfdesign/b-end/scripts/check-tfds-integration.mjs
|
|
92
|
+
node node_modules/@tfdesign/b-end/scripts/check-tfds-contract.mjs
|
|
88
93
|
```
|
|
89
94
|
|
|
90
95
|
---
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
**修复**:凡 `components.summary.json` 命中组件,必须整体 import:
|
|
59
59
|
|
|
60
60
|
```jsx
|
|
61
|
-
import { FormTitle, Tag, Button, Tabs } from '@
|
|
61
|
+
import { FormTitle, Tag, Button, Tabs } from '@tfdesign/b-end';
|
|
62
62
|
```
|
|
63
63
|
|
|
64
64
|
---
|
|
@@ -175,10 +175,10 @@ style={{ background: 'var(--color-surface)', borderRadius: 'var(--radius-lg)' }}
|
|
|
175
175
|
|
|
176
176
|
```css
|
|
177
177
|
@import "tailwindcss";
|
|
178
|
-
@import "@
|
|
178
|
+
@import "@tfdesign/b-end/theme.css";
|
|
179
179
|
|
|
180
180
|
@source "./**/*.{js,jsx,ts,tsx}";
|
|
181
|
-
@source "../node_modules/@
|
|
181
|
+
@source "../node_modules/@tfdesign/b-end/**/*.{js,jsx}";
|
|
182
182
|
```
|
|
183
183
|
|
|
184
184
|
## 13. 字重用了裸 `font-semibold` / `font-bold`
|
|
@@ -106,7 +106,7 @@ B 端主路径的**标题与密集区强调文案**默认以 **600(`--font-sem
|
|
|
106
106
|
- **600**:`[font-weight:var(--font-semibold)]`(必要时强制:`![font-weight:var(--font-semibold)]`)
|
|
107
107
|
- **700**:`[font-weight:var(--font-bold)]`
|
|
108
108
|
|
|
109
|
-
**分档速查(与当前 `@
|
|
109
|
+
**分档速查(与当前 `@tfdesign/b-end` 实现一致)**
|
|
110
110
|
|
|
111
111
|
|
|
112
112
|
| 语义档 | Token | 数值 | 典型落点 |
|
|
@@ -221,7 +221,34 @@ B 端主路径的**标题与密集区强调文案**默认以 **600(`--font-sem
|
|
|
221
221
|
|
|
222
222
|
⛔ 禁止为了“刚好对齐”新增 10px / 14px / 18px 这类任意值;设计稿落在中间值时取最近的 token 档。
|
|
223
223
|
|
|
224
|
-
### 3.1
|
|
224
|
+
### 3.1 表单控件宽度与对齐铁律
|
|
225
|
+
|
|
226
|
+
页面主表单、白卡表单、抽屉 / 弹窗正文表单、侧栏详情表单中的所有可输入控件默认必须撑满字段内容列。
|
|
227
|
+
|
|
228
|
+
- ✅ `Form` 外层:`w-full min-w-0 self-stretch`
|
|
229
|
+
- ✅ 字段列:`w-full min-w-0 max-w-full`
|
|
230
|
+
- ✅ 控件本体:`Input` / `Select` / `TextArea` / `InputNumber` / `DatePicker` / `TimePicker` / `TagInput` 默认使用 `w-full min-w-0 max-w-full`
|
|
231
|
+
- ✅ `labelPosition="left"`:标签列固定 96px,右侧控件列必须 `flex-1 min-w-0 w-full`
|
|
232
|
+
- ✅ 同一表单区域内,所有输入控件的左右边界必须对齐;不要让 `Input` 满宽、`Select` 只有 240px、`DatePicker` 又是 300px
|
|
233
|
+
- ✅ 自定义 `children` 或 `item.control` 时,外层必须补 `className="w-full min-w-0 max-w-full"`,不能绕过 `Form` 的宽度约束
|
|
234
|
+
- ✅ 只有筛选栏 / 工具条 / 紧凑查询区允许固定宽:搜索 240px,枚举 / 状态选择 160-200px;禁止把这些固定宽套到业务表单正文
|
|
235
|
+
- ⛔ 禁止在表单正文控件上写 `w-[160px]` / `w-[200px]` / `w-[240px]` / `w-[300px]` / `max-w-sm` / `inline-flex` 固定宽来破坏对齐
|
|
236
|
+
|
|
237
|
+
```jsx
|
|
238
|
+
<section className="flex w-full min-w-0 flex-col gap-4">
|
|
239
|
+
<Form
|
|
240
|
+
className="w-full min-w-0 self-stretch"
|
|
241
|
+
items={[
|
|
242
|
+
{ id: 'name', label: '名称', type: 'input' },
|
|
243
|
+
{ id: 'type', label: '类型', type: 'select' },
|
|
244
|
+
{ id: 'date', label: '生效日期', type: 'date-picker' },
|
|
245
|
+
{ id: 'desc', label: '描述', type: 'textarea' },
|
|
246
|
+
]}
|
|
247
|
+
/>
|
|
248
|
+
</section>
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### 3.2 卡片内长内容控件的高度节奏
|
|
225
252
|
|
|
226
253
|
白卡里如果有“标题 + 长内容控件”(TextArea / JSON / 代码块 / 日志 / 列表),视觉节奏必须是:
|
|
227
254
|
|
|
@@ -490,7 +517,7 @@ B 端主路径的**标题与密集区强调文案**默认以 **600(`--font-sem
|
|
|
490
517
|
|
|
491
518
|
## 9. 全局图标规则
|
|
492
519
|
|
|
493
|
-
- ✅ **必须**用 `<Icon name="kebab-case" />`(来自 `@
|
|
520
|
+
- ✅ **必须**用 `<Icon name="kebab-case" />`(来自 `@tfdesign/b-end`)
|
|
494
521
|
- ⛔ **禁止**直接 `import { ChevronDown } from 'lucide-react'` 替代 TFDS Icon(线宽不一致)
|
|
495
522
|
- **图标尺寸**:
|
|
496
523
|
|
|
@@ -532,28 +559,28 @@ Tabs 是“切换视图”的控件,不是动作按钮;它在内容区需要
|
|
|
532
559
|
|
|
533
560
|
## 12. 空状态 / 错误页 / 加载中规则
|
|
534
561
|
|
|
535
|
-
- ✅
|
|
536
|
-
-
|
|
562
|
+
- ✅ 页面、容器、表单、列表、板块本应有内容但为空时,必须优先使用基础组件 `Empty`
|
|
563
|
+
- ✅ 无权限 / 建设中整页场景可使用 `NoAccessPage` / `ConstructionPage`;加载中可使用 `Skeleton`
|
|
564
|
+
- ⛔ 禁止手写 `暂无数据` 文案块、灰色占位 div、裸 Icon + 文案组合来冒充空状态
|
|
537
565
|
|
|
538
566
|
```jsx
|
|
539
|
-
<
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
点击下方按钮新建第一条记录
|
|
546
|
-
</div>
|
|
547
|
-
<Button size="md" variant="primary">新建</Button>
|
|
548
|
-
</div>
|
|
567
|
+
<Empty
|
|
568
|
+
illustrationType="no-content"
|
|
569
|
+
title="暂无数据"
|
|
570
|
+
description="当前没有可显示的内容"
|
|
571
|
+
primaryLabel="立即创建"
|
|
572
|
+
/>
|
|
549
573
|
```
|
|
550
574
|
|
|
551
575
|
**关键约束**:
|
|
552
576
|
|
|
553
|
-
-
|
|
554
|
-
-
|
|
555
|
-
-
|
|
556
|
-
-
|
|
577
|
+
- 数据为空:`illustrationType="no-content"`
|
|
578
|
+
- 搜索 / 筛选无结果:`illustrationType="no-result"`
|
|
579
|
+
- 页面不存在:`illustrationType="not-found"`
|
|
580
|
+
- 无权限:`illustrationType="no-access"` 或使用页面模板 `NoAccessPage`
|
|
581
|
+
- 加载 / 网络失败:`illustrationType="failure"`,可配 `linkText="刷新重试"`
|
|
582
|
+
- 功能建设中:`illustrationType="construction"` 或使用页面模板 `ConstructionPage`
|
|
583
|
+
- 主行动通过 `primaryLabel` / `secondaryLabel` / `tertiaryLabel` 配置,按钮尺寸由 `Empty` 内部复用 `Button size="md"`
|
|
557
584
|
|
|
558
585
|
---
|
|
559
586
|
|
|
@@ -73,7 +73,7 @@ prompt editor / prompt workspace / runtime / run result /
|
|
|
73
73
|
|
|
74
74
|
当你不确定某个布局细节(外框间距、白卡对齐、双栏分割、表格如何撑满、哪里滚动)时,**不要凭感觉**,直接对照以下“规范源”学习:
|
|
75
75
|
|
|
76
|
-
- **基础页面框架(页面模式 / page-pattern)**:`@
|
|
76
|
+
- **基础页面框架(页面模式 / page-pattern)**:`@tfdesign/b-end` 的 `BasePageFramePattern`
|
|
77
77
|
- 源文件:`packages/tfds-b-end/src/_b_end_runtime/page-patterns/BasePageFramePattern.jsx`
|
|
78
78
|
- 作用:提供“左 NavBar + 右主区”的最基础骨架,并承载 6 个页面示例的切换。
|
|
79
79
|
- **页面示例 0~5(可复制的模板 / page-template)**:用于强化“列表页/双白卡/顶部胶囊 Tab/空状态”的对齐方式
|
|
@@ -142,12 +142,15 @@
|
|
|
142
142
|
- 气泡色随背景定:白底用左灰右绿或右 AI;灰底用左灰右白,明确 AI 回复再用右 AI。
|
|
143
143
|
- 底部输入、确认、执行按钮固定,不随消息流滚走。
|
|
144
144
|
- 右侧用户信息、订单、工单详情只做辅助,不抢会话主线。
|
|
145
|
+
- 右侧或辅助区需要展示客服工单信息、商品信息、订单信息、用户信息、客服信息、沟通记录、处理日志等板块时,默认优先使用 `InfoDisplayPanel`;不要用多个 `Card` 或手写 tabs 拼客服信息侧栏。
|
|
146
|
+
- 信息板块存在多个分类时,必须通过 `InfoDisplayPanel` 顶部 Tabs 切换分类;只有单一分类时才可降级为标题 + 内容结构。
|
|
145
147
|
|
|
146
148
|
**优先组件**:
|
|
147
149
|
|
|
148
150
|
- 消息:`ChatMessage` / `ChatBubble`
|
|
149
151
|
- 输入:`ChatInput`
|
|
150
152
|
- 静态 IM 剧本:`IMConversationPattern`
|
|
153
|
+
- 辅助信息区:`InfoDisplayPanel`
|
|
151
154
|
|
|
152
155
|
---
|
|
153
156
|
|
package/skills/tfds/SKILL.md
CHANGED
|
@@ -10,7 +10,7 @@ metadata:
|
|
|
10
10
|
|
|
11
11
|
# 【TFDS】B 端页面生成 Skill
|
|
12
12
|
|
|
13
|
-
你是 **TFDS 前端实现助手**。用户已通过 `npm` 安装 `@
|
|
13
|
+
你是 **TFDS 前端实现助手**。用户已通过 `npm` 安装 `@tfdesign/b-end`,并在项目里安装了本 Skill(路径通常为 `.cursor/skills/tfds/`、`.agents/skills/tfds/`、`.claude/skills/tfds/` 之一)。
|
|
14
14
|
|
|
15
15
|
> 本文件只保留**决策树 + 5 条铁律 + 必读链路**。逐项 Bad/Good 反例与五件套下沉到 [CHECKLIST.md](./CHECKLIST.md) 与 [COMMON_FAILURES.md](./COMMON_FAILURES.md):高风险场景(FormTitle / Playground / ChatHome / 多面板 / IM)生成前按需读取命中章节,交付前再全量自检。
|
|
16
16
|
|
|
@@ -22,7 +22,7 @@ metadata:
|
|
|
22
22
|
| --------------------------------------------------------------- | ---- | ---------------------------------------- |
|
|
23
23
|
| 用户输入 `/tfds`、`@tfds`、点名「【TFDS】」 | 🟢 强 | **必须**完整执行本 Skill 流程 |
|
|
24
24
|
| 用户说「按 TFDS 生成 / 用 b-end 设计 / 按设计系统做」 | 🟢 强 | **必须**完整执行本 Skill 流程 |
|
|
25
|
-
| 当前业务项目已 `import` 了 `@
|
|
25
|
+
| 当前业务项目已 `import` 了 `@tfdesign/b-end` 且用户在写 React/Vite 页面 | 🟡 中 | 主动应用本 Skill;若用户明显意图不在 UI(如改 API/写测试),不强制 |
|
|
26
26
|
| 其他对话(聊天、写后端、写脚本等) | ⚪ 无 | **不要**启动本 Skill |
|
|
27
27
|
|
|
28
28
|
启动后**先看下方 5 条铁律**(最高优先级),再按"必读文档"和"黄金流程"执行。
|
|
@@ -49,7 +49,7 @@ metadata:
|
|
|
49
49
|
1. ✅ **优先调用私有组件,整体复用**
|
|
50
50
|
组件索引里有对应组件 → **必须**直接 `import` 整体使用 + 通过 props 配置;
|
|
51
51
|
⛔ **禁止**"参考样式自己手搓相似组件";⛔ **禁止**仅改颜色/字号等样式片段后冒充组件(如把 `<Tag />` 写成 `<span className="rounded bg-… text-…">`)。
|
|
52
|
-
**标题是最高频组件,不是排版细节**:任何页面标题、白卡标题、面板标题、卡片左上角标题、section 标题、workspace 标题、Conversation/Settings/Result 标题,必须先 `import { FormTitle } from '@
|
|
52
|
+
**标题是最高频组件,不是排版细节**:任何页面标题、白卡标题、面板标题、卡片左上角标题、section 标题、workspace 标题、Conversation/Settings/Result 标题,必须先 `import { FormTitle } from '@tfdesign/b-end'` 并用 `<FormTitle />`;⛔ 禁止手写 `h2/h3/span + 自绘竖条`。
|
|
53
53
|
2. ✅ **私有未覆盖时走通用规范**
|
|
54
54
|
组件索引找不到对应模块 → **必须**按 `LAYOUT_RULES.md` + `GLOBAL_DESIGN_RULES.md` 用现有 token 拼装出新模块,**不**回退到"裸 div + 自定义样式"。
|
|
55
55
|
3. ✅ **混合使用必须对齐原子变量**
|
|
@@ -99,7 +99,7 @@ metadata:
|
|
|
99
99
|
|
|
100
100
|
## 2. 黄金流程(生成任意页面前必走)
|
|
101
101
|
|
|
102
|
-
1. **栈对齐**:项目为 Vite + React + Tailwind v4;全局样式已 `@import "tailwindcss"` 且已 `@import "@
|
|
102
|
+
1. **栈对齐**:项目为 Vite + React + Tailwind v4;全局样式已 `@import "tailwindcss"` 且已 `@import "@tfdesign/b-end/theme.css"`;Tailwind 已扫描 `node_modules/@tfdesign/b-end/**/*.{js,jsx}`。
|
|
103
103
|
2. **先选页面骨架**:按 `PAGE_ARCHETYPES.md` 判断页面范式 → 按 `LAYOUT_RECIPES.md` 选唯一主 recipe → 用 `components.summary.json` 初选 `kind: "page-pattern"` / `kind: "page-template"` → 回查 `components.index.json`:
|
|
104
104
|
- **结构化对象管理** → `BasePageFramePattern`(浅灰底整页 + 多白卡分区,贴浏览器边缘,无外圈圆角/描边)
|
|
105
105
|
- **从 0 发起 AI 任务** → `ChatHomePagePattern`(右侧主内容区**保持灰底**,⛔ 禁止包大白卡 wrapper;模板卡用 `<Card color="white" />`)
|
|
@@ -151,17 +151,17 @@ metadata:
|
|
|
151
151
|
|
|
152
152
|
## 4. 隔离保证(按需调用时生效)
|
|
153
153
|
|
|
154
|
-
`@
|
|
154
|
+
`@tfdesign/b-end` 可与项目内任何其他资源共存。AI 工具**不会**因为安装了这个包就把 TFDS 规范应用到所有对话——只有用户明确表达 TFDS / b-end / 设计系统意图,或当前项目已接入 `@tfdesign/b-end` 且任务是 UI 生成时,规范才生效。
|
|
155
155
|
|
|
156
156
|
| IDE | 调用指令 | 隔离原理 |
|
|
157
157
|
| ---------------- | ----------------------------------------- | ------------------------------------------------------------ |
|
|
158
158
|
| **Cursor** | `/tfds` | 本文件已设 `disable-model-invocation: true`;Cursor 不会自动纳入对话,仅显式触发 |
|
|
159
159
|
| **Codex** | `/tfds` 或 `@.agents/skills/tfds/SKILL.md` | 隔离靠"不放入 `AGENTS.md`"维护;⛔ 禁止把 TFDS 内容写入项目根 `AGENTS.md` |
|
|
160
160
|
| **Claude Code** | `/tfds` | 通过 `.claude/skills/tfds/` 显式加载 |
|
|
161
|
-
| **Trae**
|
|
161
|
+
| **Trae CN** | `Use Skill: tfds` | 通过 `.trae-cn/skills/tfds/` 显式加载;⛔ 禁止放进 `.trae/rules/`(always-on 目录) |
|
|
162
162
|
| **其它 Agent IDE** | `@` 引用本文件 / `AI_READ_FIRST.md` | 通用原则:放在按需引用知识库,不要放进全局 prompt / 项目规则 |
|
|
163
163
|
|
|
164
|
-
**Trae
|
|
164
|
+
**Trae CN 自动设置**:一键安装会同步 `.trae-cn/skills/tfds/`,重新打开项目 / 新开会话后使用 `Use Skill: tfds`;若 IDE 未刷新到 Skill,请确认该目录存在且包含 `SKILL.md`、`components.summary.json`、`components.index.json`。
|
|
165
165
|
|
|
166
166
|
> **Cursor 规范**([Agent Skills](https://cursor.com/docs/context/skills)):`name` 必须与父文件夹名 `tfds` 一致;已设 `disable-model-invocation: true` 确保不自动触发。
|
|
167
167
|
|
|
@@ -171,10 +171,10 @@ metadata:
|
|
|
171
171
|
|
|
172
172
|
```bash
|
|
173
173
|
# 集成检测(只读,检查 theme.css 引入、@source 扫描、Skill 目录)
|
|
174
|
-
node node_modules/@
|
|
174
|
+
node node_modules/@tfdesign/b-end/scripts/check-tfds-integration.mjs
|
|
175
175
|
|
|
176
176
|
# 契约自检(只读,扫描 #hex、任意值、间距漂移等)
|
|
177
|
-
node node_modules/@
|
|
177
|
+
node node_modules/@tfdesign/b-end/scripts/check-tfds-contract.mjs
|
|
178
178
|
```
|
|
179
179
|
|
|
180
180
|
---
|
|
@@ -185,4 +185,4 @@ node node_modules/@tf-designsystem/b-end/scripts/check-tfds-contract.mjs
|
|
|
185
185
|
|
|
186
186
|
---
|
|
187
187
|
|
|
188
|
-
**版本**:与本目录 `components.index.json` / `components.summary.json` 同步迭代(由主仓 `npm run generate:tfds-b-end-bundle` 生成)。升级 `@
|
|
188
|
+
**版本**:与本目录 `components.index.json` / `components.summary.json` 同步迭代(由主仓 `npm run generate:tfds-b-end-bundle` 生成)。升级 `@tfdesign/b-end` 后若需更新 Skill:删除 `.cursor/skills/tfds` 后重新执行 `npm i`,或手动复制 `node_modules/@tfdesign/b-end/skills/tfds`。
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"system": "b-end",
|
|
3
3
|
"skill": "tfds",
|
|
4
|
-
"generatedAt": "2026-05-
|
|
4
|
+
"generatedAt": "2026-05-10T15:23:05.199Z",
|
|
5
5
|
"summary": "B 端 COMPONENTS 36 条 + 列表页模板 4 + PATTERNS 6;import 一律来自 @tf-designsystem/b-end。",
|
|
6
6
|
"components": [
|
|
7
7
|
{
|
|
@@ -1524,6 +1524,8 @@
|
|
|
1524
1524
|
"【字重实现规范】涉及 semibold / bold 的运行时字重时,不要直接依赖 `font-semibold`、`font-bold` 等 Tailwind 语义类;统一改用显式 `font-weight` token 写法:600 → `[font-weight:var(--font-semibold)]`,700 → `[font-weight:var(--font-bold)]`(需提高优先级时对整条任意属性加 Tailwind important 前缀)。原因:Tailwind v4 下以 `--font-` 开头的 token 名可能被误解析到 font-family 语义,导致字重不稳定。分档与典型落点见 Skill `GLOBAL_DESIGN_RULES.md` §2.2:`FormTitle`/表单字段标题/会话列表项标题/Button/Tabs 选中等主路径为 600;700 仅组件 rules 已约定处。",
|
|
1525
1525
|
"【组件定位】InfoDisplayPanel 是“信息展示面板框架”,只负责外框、顶部 Tabs、拆分/合并、分栏调宽、内容插槽和基础间距;它不提供业务内容默认占位,不替代 Card、Table、Form、ConversationList 或客服工作台整页框架。",
|
|
1526
1526
|
"【触发引用】当页面需要在同一工作区右侧并列查看“托管助手 / 历史工单 / 工单日志 / 信息工具 / 视频信息 / 用户信息 / 沟通记录”等多个详情面板,并且用户需要把当前关注的 tab 临时拆出来并排对照时,优先使用 InfoDisplayPanel;如果只是单块内容展示或普通 tabs 切换,不应使用该业务框架。",
|
|
1527
|
+
"【客服业务优先规则】只要页面触及客服业务、客服工作台、客服接待、工单处理、售后处理、订单/商品上下文核对、客服资料查看等场景,并需要展示客服工单信息、商品信息、订单信息、用户信息、客服相关信息或沟通记录等辅助信息板块,默认优先使用 InfoDisplayPanel 承载这些信息区;禁止用多个 Card、div 白卡或自制 tabs 临时拼出客服信息侧栏。",
|
|
1528
|
+
"【客服分类 Tabs】客服信息区涉及多个分类时,必须通过 InfoDisplayPanel 顶部 Tabs 切换分类,常见分类包括“工单信息 / 商品信息 / 订单信息 / 用户信息 / 客服信息 / 沟通记录 / 处理日志 / 风险提示”。分类名称、顺序和内容必须来自当前业务上下文;不要把这些示例硬编码成所有页面的固定 tab。",
|
|
1527
1529
|
"【适用场景】客服工作台主白卡内部的信息区、在线 Agent 辅助信息区、工单处理详情侧、多来源上下文对照区、质检 / 审核 / 申诉处理工作区。",
|
|
1528
1530
|
"【不适用场景】整页客服工作台外框用 CustomerServiceWorkspaceFrame;左侧会话 / 工单队列用 ConversationList;单个业务摘要用 Card;字段型详情或可批量操作数据用 Form / Table。",
|
|
1529
1531
|
"【结构】外层为一个白色圆角容器,默认使用 `w-full` 撑满父容器可用宽度;内部按“拆分栏数组 + 主栏”组织。每一栏都必须包含 56px 顶部 Tabs 栏和内容区;顶部横线只保留 Header 内 1 条通栏下描边,左右贴满当前栏容器。Tabs 交互、文字、选中态与 3px Brand 指示线必须复用基础 `Tabs variant=\"line\" size=\"lg\"`,禁止手写 tab button 或手写选中线。栏与栏之间用 1px 垂直分隔线,禁止通过 gap 制造分栏空隙。",
|
|
@@ -3170,8 +3172,10 @@
|
|
|
3170
3172
|
"【组件定位】Form 是字段组合层,只管理 label、提示、错误反馈、top/left 布局和字段编排,不重新定义已有表单控件样式",
|
|
3171
3173
|
"【控件复用】已有基础组件必须复用:input 复用 Input,textarea 复用 TextArea(仅传基组件已有 props,默认 minRows=3、resize 纵向增高与 TextArea 一致;System Prompt / JSON / 代码参数字段必须传 variant=\"code\"),input-number 复用 InputNumber,select 复用 Select,tag-input 复用 TagInput,checkbox 复用 CheckboxGroup,radio 复用 RadioGroup,switch 复用 Switch,date-picker 复用 DatePicker,time-picker 复用 TimePicker,slider 复用 Slider,upload 复用 Upload",
|
|
3172
3174
|
"【布局】Form 在页面主内容区、白色卡片容器与纵向堆叠场景中默认 `w-full min-w-0 self-stretch`;labelPosition=\"top\" 时字段容器与控件区都默认全宽,label 与控件间距 4px;labelPosition=\"left\" 时标签列固定 96px、间距 24px、右侧控件区使用 `flex-1 min-w-0 w-full` 撑满剩余宽度",
|
|
3175
|
+
"【表单宽度铁律】页面主表单、白卡表单、抽屉/弹窗正文表单、侧栏详情表单中,Input / Select / TextArea / InputNumber / DatePicker / TimePicker / TagInput 必须默认撑满字段内容列,且同一区域左右边界对齐;只有筛选栏、工具条、紧凑查询区允许固定宽 160/200/240px,禁止把 300px 示意宽或筛选栏固定宽套到业务表单正文",
|
|
3176
|
+
"【自定义控件宽度】使用 children 或 item.control 传入自定义字段时,外层必须补 `className=\"w-full min-w-0 max-w-full\"`;否则会绕过 Form 内置的 `!w-full` 控件宽度约束,导致 Input、Select、TextArea 等宽度不一致",
|
|
3173
3177
|
"【详情页全集预览】组件详情页的“全集”分类按字段类型从上到下单列排列,每个组件间距 40px,超出预览画布时在画布内滚动查看",
|
|
3174
|
-
"【字段配置】items 数组每项支持 id、label、type、required、labelPosition、middleHelpText、helpText、error、errorText、disabled、value/defaultValue/onChange 等字段;当字段命中 AI 推荐语义时,可继续透传 aiSuggestion、aiSuggestions、onAdoptSuggestion、onRefreshAiSuggestions 到 Input / Select / TextArea
|
|
3178
|
+
"【字段配置】items 数组每项支持 id、label、type、required、labelPosition、middleHelpText、helpText、error、errorText、disabled、value/defaultValue/onChange 等字段;当字段命中 AI 推荐语义时,可继续透传 aiSuggestion、aiSuggestions、onAdoptSuggestion、onRefreshAiSuggestions 到 Input / Select / TextArea",
|
|
3175
3179
|
"【标题附加样式】单字段标题支持 labelOptional、labelRequired、labelAi、labelHelp 四个布尔开关,可与纯文字标题组合显示;渲染顺序固定为 可选 -> 必填 -> AI -> Help",
|
|
3176
3180
|
"【标题字重】字段标题、必填星号与可选文案统一使用 `semibold` token,即 `[font-weight:var(--font-semibold)]`;不要继续使用 `font-bold` 或手写 700 字重",
|
|
3177
3181
|
"【AI 标签】当 labelAi=true 时,必须复用标准 `<Tag variant=\"ai\" radius=\"full\" fontWeight=\"bold\" size=\"m\">AI</Tag>`;禁止在 Form 内手写渐变胶囊、手写圆角块或用普通文字 span 模拟 AI 标签",
|
|
@@ -3851,7 +3855,7 @@
|
|
|
3851
3855
|
],
|
|
3852
3856
|
"rules": [
|
|
3853
3857
|
"【⛔ AI 强制使用场景】所有数字类参数字段必须使用 InputNumber,禁止用 `<input type=\"number\">` 或 Input 组件代替。典型场景:Temperature(0~2 精度 0.01)、Top-P(0~1 精度 0.01)、Max Tokens(整数步进)、学习率、权重、阈值等一切数值配置项。原生 input 会产生黑色边框并丢失步进、范围约束、精度控制能力",
|
|
3854
|
-
"【组件定位】InputNumber 是数字输入原子组件,输入框视觉必须复用 Input
|
|
3858
|
+
"【组件定位】InputNumber 是数字输入原子组件,输入框视觉必须复用 Input:表单正文默认随字段列满宽,MD 高 36px、圆角 8px、白底灰边框、聚焦 1px 绿色描边;仅筛选栏/工具条/详情预览示意可由父容器限制为 160/200/240/300px",
|
|
3855
3859
|
"【按钮布局】默认 outer 外置步进按钮:位于输入框右侧,宽 16px、高 36px,与输入框间距 4px,上下两个箭头图标均为 8×8px",
|
|
3856
3860
|
"【内置按钮】innerButtons=true 时步进按钮内嵌在输入框右侧,默认隐藏,仅在容器 hover 或 focus-within 时显示,输入内容需预留右侧空间",
|
|
3857
3861
|
"【禁用态】disabled 时输入框与步进按钮同步进入浅灰底、禁用文字和 0.6 透明度;按钮不可点击",
|
|
@@ -4060,7 +4064,7 @@
|
|
|
4060
4064
|
"【关闭】点击触发器、选项或外部 mousedown(触发器与面板均排除)关闭",
|
|
4061
4065
|
"【键盘】Enter/Space 展开或选中高亮项;↑/↓ 移动高亮;Esc 关闭;Tab 失焦关闭",
|
|
4062
4066
|
"【无障碍】触发器 role=\"combobox\" aria-expanded;列表 role=\"listbox\" 与 role=\"option\"",
|
|
4063
|
-
"【宽度】触发器为 w-full min-w-0 max-w-full
|
|
4067
|
+
"【宽度】触发器为 w-full min-w-0 max-w-full,表单正文默认随字段列满宽;筛选栏、工具条或详情预览示意才允许由父容器限制宽度,禁止在业务表单正文把 Select 固定为 300px 导致与 Input / TextArea 不对齐",
|
|
4064
4068
|
"【右侧图标】下拉箭头、清除按钮与自定义 indicator 均固定为 16×16px",
|
|
4065
4069
|
"【尺寸】仅保留 MD 一种尺寸,触发器高度固定 36px;与 Input 保持一致"
|
|
4066
4070
|
],
|
|
@@ -5203,7 +5207,7 @@
|
|
|
5203
5207
|
"【场景·daterange / datetimerange】表格/列表顶部时间范围筛选、统计报表数据周期选择、合同有效期区间",
|
|
5204
5208
|
"【禁忌】不要用 type=\"date\" 代替 type=\"datetime\"(会丢失时分信息);不要把两个 DatePicker 手拼成范围选择(直接用 type=\"daterange\");不要在极紧凑行内(宽度 < 200px)使用,面板最小宽度 280px",
|
|
5205
5209
|
"【类型说明】date / datetime → 单月面板单值选择;daterange / datetimerange → 双月面板范围选择,范围中间区间浅色连续高亮",
|
|
5206
|
-
"
|
|
5210
|
+
"【宽度】表单正文默认随字段列满宽;筛选栏、工具条或详情预览示意才允许由父容器限制宽度(date / datetime / daterange 常用 300px,datetimerange 常用 400px)。禁止在业务表单正文把 DatePicker 固定为 300px 导致与 Input / Select 不对齐",
|
|
5207
5211
|
"【面板行为】单值点击即选中并关闭;范围需点击两次确定起止后自动关闭",
|
|
5208
5212
|
"【时间栏】datetime / datetimerange 面板底部固定显示 52px 日期/时间信息栏",
|
|
5209
5213
|
"【组合·表单】配 Form 使用时包在 Form.Item(type=\"date-picker\")里;时间范围筛选常配合 Table 顶部工具栏 + \"查询\"Button 使用",
|
|
@@ -5341,7 +5345,7 @@
|
|
|
5341
5345
|
"rules": [
|
|
5342
5346
|
"【字重实现规范】涉及 semibold / bold 的运行时字重时,不要直接依赖 `font-semibold`、`font-bold` 等 Tailwind 语义类;统一改用显式 `font-weight` token 写法:600 → `[font-weight:var(--font-semibold)]`,700 → `[font-weight:var(--font-bold)]`(需提高优先级时对整条任意属性加 Tailwind important 前缀)。原因:Tailwind v4 下以 `--font-` 开头的 token 名可能被误解析到 font-family 语义,导致字重不稳定。分档与典型落点见 Skill `GLOBAL_DESIGN_RULES.md` §2.2:`FormTitle`/表单字段标题/会话列表项标题/Button/Tabs 选中等主路径为 600;700 仅组件 rules 已约定处。",
|
|
5343
5347
|
"【类型】time 为单时间输入框;timerange 为时间范围输入框",
|
|
5344
|
-
"【触发器】视觉对齐 Figma / DatePicker
|
|
5348
|
+
"【触发器】视觉对齐 Figma / DatePicker:表单正文默认随字段列满宽,详情预览示意可用 300px;36px 高、白底、1px 默认描边、8px 圆角,内容默认左对齐,右侧时钟图标固定为 16×16px",
|
|
5345
5349
|
"【面板】点击 Trigger 展开浮层;面板默认与 Trigger 等宽,最小宽度 150px;单时间面板高 252px,无标题;时间范围面板高 304px,顶部显示开始/结束标题",
|
|
5346
5350
|
"【固定选择区】面板中间固定 36px 高浅绿选择区,时/分列按面板宽度等分并居中对齐;timerange 使用同一条横跨四列的固定选择区,四列都支持真实滚动选择",
|
|
5347
5351
|
"【选择】点击任一时间项会滚动到中间选择区;滚动时/分列时实时同步选择区内最近项,停止后自动吸附",
|
|
@@ -5749,26 +5753,6 @@
|
|
|
5749
5753
|
"type": "function",
|
|
5750
5754
|
"default": null
|
|
5751
5755
|
},
|
|
5752
|
-
{
|
|
5753
|
-
"name": "aiSuggestion",
|
|
5754
|
-
"type": "array | string | object",
|
|
5755
|
-
"default": null
|
|
5756
|
-
},
|
|
5757
|
-
{
|
|
5758
|
-
"name": "aiSuggestions",
|
|
5759
|
-
"type": "array",
|
|
5760
|
-
"default": null
|
|
5761
|
-
},
|
|
5762
|
-
{
|
|
5763
|
-
"name": "onAdoptSuggestion",
|
|
5764
|
-
"type": "function",
|
|
5765
|
-
"default": null
|
|
5766
|
-
},
|
|
5767
|
-
{
|
|
5768
|
-
"name": "onRefreshAiSuggestions",
|
|
5769
|
-
"type": "function",
|
|
5770
|
-
"default": null
|
|
5771
|
-
},
|
|
5772
5756
|
{
|
|
5773
5757
|
"name": "closable",
|
|
5774
5758
|
"type": "boolean",
|
|
@@ -5810,15 +5794,13 @@
|
|
|
5810
5794
|
}
|
|
5811
5795
|
],
|
|
5812
5796
|
"rules": [
|
|
5813
|
-
"【视觉】容器对齐 Figma taginput
|
|
5797
|
+
"【视觉】容器对齐 Figma taginput:表单正文默认随字段列满宽,详情预览示意可用 300px;36px 高、白底、1px 默认描边、8px 圆角,空态显示“请输入”",
|
|
5814
5798
|
"【Tag 复用】已选项、+N 折叠项、Tooltip 内省略项、隐藏测量项都必须使用平台现有 Tag 组件;TagInput 不自绘任何标签视觉",
|
|
5815
5799
|
"【宽度自适应】通过 ResizeObserver 监听容器宽度,按真实 Tag 宽度计算可见数量;宽度变窄自动折叠,变宽自动展开",
|
|
5816
5800
|
"【溢出折叠】可见区域放不下的标签折叠为 +N,+N 固定在末尾并以 Tag 渲染;悬浮 +N 使用白底 tone=\"light\" Tooltip 展示被省略的所有 Tag,该白底样式仅用于 TagInput 更多标签场景",
|
|
5817
5801
|
"【删除】closable=true 时每个可见 Tag 显示关闭按钮,删除后触发 onChange(nextTags, removedTag) 与 onRemove(removedTag)",
|
|
5818
5802
|
"【受控】传 value 时为受控模式,非受控使用 defaultValue;value/defaultValue 支持字符串数组或 { value, label, variant } 对象数组",
|
|
5819
5803
|
"【状态】status=\"error\" 使用浅红底与红色聚焦描边;disabled 叠加禁用背景、透明度并关闭删除操作",
|
|
5820
|
-
"【AI推荐】支持推荐单个标签或推荐标签集合;推荐区展示在 TagInput 下方,默认支持真实点击采纳与刷新推荐,不允许只展示静态建议文案",
|
|
5821
|
-
"【AI推荐采纳】点击推荐后,TagInput 默认按“追加去重”把推荐标签写入当前标签列表,并触发 onAdoptSuggestion(suggestedTags);若传入 onRefreshAiSuggestions,应在本地轮换建议之外继续向外通知",
|
|
5822
5804
|
"【Form】Form 的 type=\"tag-input\" 字段必须完整引用 TagInput,不再用 Select 或原生结构临时代替",
|
|
5823
5805
|
"【尺寸】仅保留 MD 一种尺寸,高度固定 36px;与 Input 保持一致"
|
|
5824
5806
|
],
|