@blocklet/component-studio-cli 0.4.134
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/README.md +84 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +11 -0
- package/dist/commands/add.d.ts +2 -0
- package/dist/commands/add.js +140 -0
- package/dist/commands/component-studio.d.ts +2 -0
- package/dist/commands/component-studio.js +70 -0
- package/dist/commands/dev.d.ts +2 -0
- package/dist/commands/dev.js +87 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +114 -0
- package/dist/commands/migrate.d.ts +2 -0
- package/dist/commands/migrate.js +177 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.js +22 -0
- package/dist/utils/display-logo.d.ts +2 -0
- package/dist/utils/display-logo.js +24 -0
- package/dist/utils/helper.d.ts +97 -0
- package/dist/utils/helper.js +479 -0
- package/package.json +58 -0
- package/templates/add/components/HelloWorld/@metadata.json +433 -0
- package/templates/add/components/HelloWorld/@template.json +4 -0
- package/templates/add/components/HelloWorld/index.tsx +560 -0
- package/templates/add/tools/cursor-rules/.cursor/rules/@metadata-json.mdc +549 -0
- package/templates/add/tools/cursor-rules/.cursor/rules/component-studio.mdc +138 -0
- package/templates/add/tools/cursor-rules/.cursor/rules/index-tsx.mdc +192 -0
- package/templates/add/tools/cursor-rules/@template.json +4 -0
- package/templates/init/0-basic/@template.json +4 -0
- package/templates/init/0-basic/README.md +30 -0
- package/templates/init/0-basic/package.json +26 -0
- package/templates/init/0-basic/src/HelloWorld/@metadata.json +433 -0
- package/templates/init/0-basic/src/HelloWorld/index.tsx +560 -0
- package/templates/init/1-professional/@template.json +4 -0
- package/templates/init/1-professional/README.md +75 -0
- package/templates/init/1-professional/biome.json +36 -0
- package/templates/init/1-professional/global.d.ts +131 -0
- package/templates/init/1-professional/package.json +73 -0
- package/templates/init/1-professional/scripts/bump-version.mjs +35 -0
- package/templates/init/1-professional/src/atoms/AnimationWrapper.tsx +95 -0
- package/templates/init/1-professional/src/atoms/ArrayTable.tsx +114 -0
- package/templates/init/1-professional/src/atoms/Card.tsx +52 -0
- package/templates/init/1-professional/src/atoms/ContentWrapper.tsx +72 -0
- package/templates/init/1-professional/src/atoms/CopyrightFooter.tsx +31 -0
- package/templates/init/1-professional/src/atoms/DataDisplays.tsx +157 -0
- package/templates/init/1-professional/src/atoms/GradientTitle.tsx +64 -0
- package/templates/init/1-professional/src/atoms/Logo.tsx +58 -0
- package/templates/init/1-professional/src/atoms/index.ts +27 -0
- package/templates/init/1-professional/src/components/HelloWorld/@metadata.json +433 -0
- package/templates/init/1-professional/src/components/HelloWorld/index.tsx +224 -0
- package/templates/init/1-professional/src/type.d.ts +42 -0
- package/templates/init/1-professional/src/utils/index.ts +1 -0
- package/templates/init/1-professional/tsconfig.json +102 -0
- package/templates/init/1-professional/version +1 -0
- package/templates/init/2-blank/@template.json +4 -0
- package/templates/init/2-blank/README.md +27 -0
- package/templates/init/2-blank/package.json +26 -0
- package/templates/workspace/.component-studio-runtime/_theme.tsx +4 -0
- package/templates/workspace/.editorconfig +23 -0
- package/templates/workspace/.env +1 -0
- package/templates/workspace/.init-component-studio +0 -0
- package/templates/workspace/LICENSE +13 -0
- package/templates/workspace/README.md +127 -0
- package/templates/workspace/api/dev.ts +21 -0
- package/templates/workspace/api/src/index.ts +50 -0
- package/templates/workspace/api/src/libs/auth.ts +17 -0
- package/templates/workspace/api/src/libs/env.ts +6 -0
- package/templates/workspace/api/src/libs/logger.ts +3 -0
- package/templates/workspace/api/src/routes/index.ts +12 -0
- package/templates/workspace/api/third.d.ts +17 -0
- package/templates/workspace/biome.json +36 -0
- package/templates/workspace/blocklet.md +8 -0
- package/templates/workspace/blocklet.yml +58 -0
- package/templates/workspace/index.html +15 -0
- package/templates/workspace/logo.png +0 -0
- package/templates/workspace/package.json +125 -0
- package/templates/workspace/pnpm-workspace.yaml +3 -0
- package/templates/workspace/scripts/build-clean.mjs +6 -0
- package/templates/workspace/scripts/bump-version.mjs +39 -0
- package/templates/workspace/scripts/init-component-studio.mjs +36 -0
- package/templates/workspace/tsconfig.api.json +12 -0
- package/templates/workspace/tsconfig.json +102 -0
- package/templates/workspace/version +1 -0
- package/templates/workspace/vite-server.config.ts +39 -0
- package/templates/workspace/vite.config.ts +68 -0
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
---
|
|
2
|
+
description:
|
|
3
|
+
globs:
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
# @metadata.json 文件说明
|
|
7
|
+
|
|
8
|
+
## 概述
|
|
9
|
+
`@metadata.json` 是 Component Studio 中的组件元数据配置文件,用于定义组件的基本信息和可配置属性。
|
|
10
|
+
|
|
11
|
+
## 作用
|
|
12
|
+
- 定义组件的基本信息和可配置属性
|
|
13
|
+
- 支持多语言(国际化)配置
|
|
14
|
+
- 控制属性在编辑器中的显示顺序和可见性
|
|
15
|
+
- 为属性提供默认值
|
|
16
|
+
- 支持多种数据类型和嵌套属性
|
|
17
|
+
|
|
18
|
+
## 维护要点
|
|
19
|
+
- 保持 `id` 唯一性
|
|
20
|
+
- 所有 `id` 都是 16 位的 uuid,不需要语意化,需要乱序字母和数字组合(非常重要!)
|
|
21
|
+
- 确保 `properties` 中每个属性有唯一的标识符
|
|
22
|
+
- 维护多语言支持(至少包含 en/zh)
|
|
23
|
+
- 管理属性的显示顺序(通过 index 字段)
|
|
24
|
+
- 适当设置默认值和可见性
|
|
25
|
+
- 正确配置复杂类型的嵌套属性(subProperties)
|
|
26
|
+
|
|
27
|
+
## 最佳实践
|
|
28
|
+
- 属性键名 `key` 使用驼峰命名(如 `titleColor` )保持一致性
|
|
29
|
+
- 为所有属性设置合适的默认值,尤其是复杂类型
|
|
30
|
+
- 属性分组时保持相关属性的索引 `index` 连续
|
|
31
|
+
- 多语言配置保持一致性,确保 zh/en 都有对应内容
|
|
32
|
+
- 修改已使用的组件时,不要更改现有属性的 ID 和 key
|
|
33
|
+
|
|
34
|
+
## 字段含义
|
|
35
|
+
|
|
36
|
+
### 顶层字段
|
|
37
|
+
| 字段 | 含义 |
|
|
38
|
+
|------|------|
|
|
39
|
+
| `id` | 组件唯一标识符 |
|
|
40
|
+
| `createdAt` | 创建时间戳 |
|
|
41
|
+
| `updatedAt` | 更新时间戳 |
|
|
42
|
+
| `name` | 组件显示名称 |
|
|
43
|
+
| `description` | 组件描述 |
|
|
44
|
+
| `properties` | 包含所有可配置属性的对象 |
|
|
45
|
+
|
|
46
|
+
### 属性定义 (properties 内)
|
|
47
|
+
每个属性都有一个唯一 ID 作为键,包含以下内容:
|
|
48
|
+
|
|
49
|
+
#### 基本结构
|
|
50
|
+
```json
|
|
51
|
+
"id": {
|
|
52
|
+
"index": 0,
|
|
53
|
+
"data": {
|
|
54
|
+
"id": "id",
|
|
55
|
+
"key": "key",
|
|
56
|
+
"type": "string",
|
|
57
|
+
"visible": true,
|
|
58
|
+
"locales": {
|
|
59
|
+
"zh": {},
|
|
60
|
+
"en": {}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
说明:
|
|
67
|
+
- `index`: 排序号,从0开始
|
|
68
|
+
- `id`: 属性唯一标识符,16 位的 uuid,不需要语意化,需要乱序字母和数字组合(非常重要!)
|
|
69
|
+
- `key`: 属性键名,在代码中引用时使用
|
|
70
|
+
- `type`: 属性类型,默认为 string
|
|
71
|
+
- `visible`: 是否在编辑器中可见,默认为 true
|
|
72
|
+
|
|
73
|
+
#### 属性字段说明
|
|
74
|
+
- `index`: 显示顺序编号
|
|
75
|
+
- `data`:
|
|
76
|
+
- `id`: 属性唯一标识符,16 位的 uuid,不需要语意化,需要乱序字母和数字组合(非常重要!)
|
|
77
|
+
- `key`: 属性键名,用于代码中引用
|
|
78
|
+
- `type`: 属性数据类型,支持以下类型:
|
|
79
|
+
- `string`: 文本
|
|
80
|
+
- `multiline`: 多行文本
|
|
81
|
+
- `number`: 整数
|
|
82
|
+
- `decimal`: 小数
|
|
83
|
+
- `boolean`: 布尔值
|
|
84
|
+
- `color`: 颜色
|
|
85
|
+
- `url`: URL链接
|
|
86
|
+
- `json`: JSON对象
|
|
87
|
+
- `array`: 数组
|
|
88
|
+
- `yaml`: YAML配置
|
|
89
|
+
- `component`: 组件,支持内嵌组件
|
|
90
|
+
- `visible`: 是否在编辑器中可见
|
|
91
|
+
- `locales`: 多语言配置
|
|
92
|
+
- `zh`/`en`: 不同语言的配置
|
|
93
|
+
- `name`: 属性显示名称
|
|
94
|
+
- `defaultValue`: 默认值,可以是简单值或复杂对象
|
|
95
|
+
- `subProperties`: 嵌套属性定义,用于 yaml、json、array 等复杂类型
|
|
96
|
+
|
|
97
|
+
### 嵌套属性 (subProperties)
|
|
98
|
+
在 `yaml`, `json`, `array` 等复杂类型中可以定义子属性(subProperties)。子属性的结构与主属性列表结构相同,用于定义复杂数据类型的内部结构。
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
## 常见问题
|
|
102
|
+
|
|
103
|
+
**Q: 添加新属性后,组件中无法访问到该属性值?**
|
|
104
|
+
A: 检查属性的`visible`是否为true,并确保属性的`key`在组件代码中正确引用。
|
|
105
|
+
|
|
106
|
+
**Q: 如何在开发时测试不同语言环境?**
|
|
107
|
+
A: 可以通过修改浏览器语言设置或使用开发工具中的语言切换功能来测试。
|
|
108
|
+
|
|
109
|
+
**Q: 修改属性类型后,原有的defaultValue不生效了?**
|
|
110
|
+
A: 不同类型需要匹配相应格式的默认值,修改类型时需同步更新defaultValue。
|
|
111
|
+
|
|
112
|
+
## `@metadata.json` 示例
|
|
113
|
+
请仔细查看它的结构,其它 `@metadata.json` 的结构与其基本一致,只是其中 `properties` 中的差别
|
|
114
|
+
请注意:所有 `id` 都是 16 位的 uuid,不需要语意化,需要乱序字母和数字组合(非常重要!)
|
|
115
|
+
```json
|
|
116
|
+
{
|
|
117
|
+
"id": "KEHGy3vdflE8JGrV",
|
|
118
|
+
"createdAt": "2025-03-20T16:01:56.655Z",
|
|
119
|
+
"updatedAt": "2025-03-21T01:24:04.008Z",
|
|
120
|
+
"name": "HelloWorld",
|
|
121
|
+
"description": "",
|
|
122
|
+
"properties": {
|
|
123
|
+
"gs1rn5jmxfvpxptx": {
|
|
124
|
+
"index": 0,
|
|
125
|
+
"data": {
|
|
126
|
+
"id": "gs1rn5jmxfvpxptx",
|
|
127
|
+
"key": "title",
|
|
128
|
+
"type": "string",
|
|
129
|
+
"visible": true,
|
|
130
|
+
"locales": {
|
|
131
|
+
"zh": {
|
|
132
|
+
"name": "标题",
|
|
133
|
+
"defaultValue": "Hello World"
|
|
134
|
+
},
|
|
135
|
+
"en": {
|
|
136
|
+
"name": "Title",
|
|
137
|
+
"defaultValue": "Hello World"
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
"9ajrz12ik7esfk1z": {
|
|
143
|
+
"index": 1,
|
|
144
|
+
"data": {
|
|
145
|
+
"id": "9ajrz12ik7esfk1z",
|
|
146
|
+
"key": "description",
|
|
147
|
+
"type": "string",
|
|
148
|
+
"visible": true,
|
|
149
|
+
"locales": {
|
|
150
|
+
"zh": {
|
|
151
|
+
"name": "描述",
|
|
152
|
+
"defaultValue": "这是你的创意实验室,在这里可以:\n- 设计和构建各类强大组件\n- 将创意转化为可复用代码\n- 打造专属于您的组件库\n释放你的开发潜能,开始创作吧!"
|
|
153
|
+
},
|
|
154
|
+
"en": {
|
|
155
|
+
"name": "Description",
|
|
156
|
+
"defaultValue": "This is your creative lab, where you can:\n- Design and build powerful components\n- Transform ideas into reusable code\n- Create your own component library\nUnleash your development potential and start creating!"
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
"3ckcfvf6b7zyskk8": {
|
|
162
|
+
"index": 2,
|
|
163
|
+
"data": {
|
|
164
|
+
"id": "3ckcfvf6b7zyskk8",
|
|
165
|
+
"key": "logo",
|
|
166
|
+
"type": "url",
|
|
167
|
+
"visible": true,
|
|
168
|
+
"locales": {
|
|
169
|
+
"zh": {
|
|
170
|
+
"defaultValue": {
|
|
171
|
+
"url": "/.well-known/service/blocklet/logo?imageFilter=convert&f=png&h=80",
|
|
172
|
+
"mediaKitUrl": "/.well-known/service/blocklet/logo?imageFilter=convert&f=png&h=80"
|
|
173
|
+
},
|
|
174
|
+
"name": "Logo"
|
|
175
|
+
},
|
|
176
|
+
"en": {
|
|
177
|
+
"defaultValue": {
|
|
178
|
+
"url": "/.well-known/service/blocklet/logo?imageFilter=convert&f=png&h=80",
|
|
179
|
+
"mediaKitUrl": "/.well-known/service/blocklet/logo?imageFilter=convert&f=png&h=80"
|
|
180
|
+
},
|
|
181
|
+
"name": "Logo"
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
"subProperties": {
|
|
185
|
+
"ML-CDw7LvtlhM_cl": {
|
|
186
|
+
"index": 0,
|
|
187
|
+
"data": {
|
|
188
|
+
"id": "ML-CDw7LvtlhM_cl",
|
|
189
|
+
"key": "url",
|
|
190
|
+
"locales": {
|
|
191
|
+
"en": {
|
|
192
|
+
"name": "url"
|
|
193
|
+
},
|
|
194
|
+
"zh": {
|
|
195
|
+
"name": "url"
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
"K-HYgPHtAsmO_mer": {
|
|
201
|
+
"index": 1,
|
|
202
|
+
"data": {
|
|
203
|
+
"id": "K-HYgPHtAsmO_mer",
|
|
204
|
+
"key": "mediaKitUrl",
|
|
205
|
+
"locales": {
|
|
206
|
+
"en": {
|
|
207
|
+
"name": "mediaKitUrl"
|
|
208
|
+
},
|
|
209
|
+
"zh": {
|
|
210
|
+
"name": "mediaKitUrl"
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
"evequmAWgWEWZLex": {
|
|
216
|
+
"index": 2,
|
|
217
|
+
"data": {
|
|
218
|
+
"id": "evequmAWgWEWZLex",
|
|
219
|
+
"key": "width",
|
|
220
|
+
"locales": {
|
|
221
|
+
"en": {
|
|
222
|
+
"name": "width"
|
|
223
|
+
},
|
|
224
|
+
"zh": {
|
|
225
|
+
"name": "width"
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
"poeAwflRHJeUmfLa": {
|
|
231
|
+
"index": 3,
|
|
232
|
+
"data": {
|
|
233
|
+
"id": "poeAwflRHJeUmfLa",
|
|
234
|
+
"key": "height",
|
|
235
|
+
"locales": {
|
|
236
|
+
"en": {
|
|
237
|
+
"name": "height"
|
|
238
|
+
},
|
|
239
|
+
"zh": {
|
|
240
|
+
"name": "height"
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
"x3lqht8ikble1itx": {
|
|
249
|
+
"index": 3,
|
|
250
|
+
"data": {
|
|
251
|
+
"id": "x3lqht8ikble1itx",
|
|
252
|
+
"key": "copyright",
|
|
253
|
+
"type": "string",
|
|
254
|
+
"visible": false,
|
|
255
|
+
"locales": {
|
|
256
|
+
"zh": {
|
|
257
|
+
"name": "版权信息",
|
|
258
|
+
"defaultValue": "由 Component Studio 提供支持"
|
|
259
|
+
},
|
|
260
|
+
"en": {
|
|
261
|
+
"name": "Copyright",
|
|
262
|
+
"defaultValue": "Powered by Component Studio"
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
},
|
|
267
|
+
"q0ezdj81v0m14y5m": {
|
|
268
|
+
"index": 4,
|
|
269
|
+
"data": {
|
|
270
|
+
"id": "q0ezdj81v0m14y5m",
|
|
271
|
+
"key": "number",
|
|
272
|
+
"type": "number",
|
|
273
|
+
"visible": true,
|
|
274
|
+
"locales": {
|
|
275
|
+
"zh": {
|
|
276
|
+
"name": "整数",
|
|
277
|
+
"defaultValue": 42
|
|
278
|
+
},
|
|
279
|
+
"en": {
|
|
280
|
+
"name": "Integer",
|
|
281
|
+
"defaultValue": 42
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
"bl0rimfebwbencoj": {
|
|
287
|
+
"index": 5,
|
|
288
|
+
"data": {
|
|
289
|
+
"id": "bl0rimfebwbencoj",
|
|
290
|
+
"key": "decimal",
|
|
291
|
+
"type": "decimal",
|
|
292
|
+
"visible": true,
|
|
293
|
+
"locales": {
|
|
294
|
+
"zh": {
|
|
295
|
+
"name": "小数",
|
|
296
|
+
"defaultValue": 3.14
|
|
297
|
+
},
|
|
298
|
+
"en": {
|
|
299
|
+
"name": "Decimal",
|
|
300
|
+
"defaultValue": 3.14
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
},
|
|
305
|
+
"gioetxz8d13jabz6": {
|
|
306
|
+
"index": 6,
|
|
307
|
+
"data": {
|
|
308
|
+
"id": "gioetxz8d13jabz6",
|
|
309
|
+
"key": "showCopyright",
|
|
310
|
+
"type": "boolean",
|
|
311
|
+
"visible": true,
|
|
312
|
+
"locales": {
|
|
313
|
+
"zh": {
|
|
314
|
+
"name": "是否展示 Copyright",
|
|
315
|
+
"defaultValue": true
|
|
316
|
+
},
|
|
317
|
+
"en": {
|
|
318
|
+
"name": "Show Description",
|
|
319
|
+
"defaultValue": true
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
},
|
|
324
|
+
"yi1oj4rq1eziup1d": {
|
|
325
|
+
"index": 7,
|
|
326
|
+
"data": {
|
|
327
|
+
"id": "yi1oj4rq1eziup1d",
|
|
328
|
+
"key": "titleColor",
|
|
329
|
+
"type": "color",
|
|
330
|
+
"visible": true,
|
|
331
|
+
"locales": {
|
|
332
|
+
"zh": {
|
|
333
|
+
"defaultValue": "rgb(45, 36, 45)",
|
|
334
|
+
"name": "标题颜色"
|
|
335
|
+
},
|
|
336
|
+
"en": {
|
|
337
|
+
"defaultValue": "rgb(44, 39, 44)",
|
|
338
|
+
"name": "Title Color"
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
},
|
|
343
|
+
"4f49q5uidkcp5ak4": {
|
|
344
|
+
"index": 8,
|
|
345
|
+
"data": {
|
|
346
|
+
"id": "4f49q5uidkcp5ak4",
|
|
347
|
+
"key": "json",
|
|
348
|
+
"type": "json",
|
|
349
|
+
"visible": true,
|
|
350
|
+
"locales": {
|
|
351
|
+
"zh": {
|
|
352
|
+
"name": "JSON 数据",
|
|
353
|
+
"defaultValue": {
|
|
354
|
+
"foo": "-",
|
|
355
|
+
"bar": "-"
|
|
356
|
+
}
|
|
357
|
+
},
|
|
358
|
+
"en": {
|
|
359
|
+
"name": "JSON Data",
|
|
360
|
+
"defaultValue": {
|
|
361
|
+
"foo": "foo",
|
|
362
|
+
"bar": "bar"
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
},
|
|
366
|
+
"subProperties": {
|
|
367
|
+
"gpy89bsxc6ovvlsp": {
|
|
368
|
+
"index": 0,
|
|
369
|
+
"data": {
|
|
370
|
+
"id": "gpy89bsxc6ovvlsp",
|
|
371
|
+
"key": "foo",
|
|
372
|
+
"type": "string",
|
|
373
|
+
"visible": true,
|
|
374
|
+
"locales": {
|
|
375
|
+
"zh": {
|
|
376
|
+
"name": "名称",
|
|
377
|
+
"defaultValue": "-"
|
|
378
|
+
},
|
|
379
|
+
"en": {
|
|
380
|
+
"name": "Foo",
|
|
381
|
+
"defaultValue": "foo"
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
},
|
|
386
|
+
"1j34jdhdptp2xm5e": {
|
|
387
|
+
"index": 1,
|
|
388
|
+
"data": {
|
|
389
|
+
"id": "1j34jdhdptp2xm5e",
|
|
390
|
+
"key": "bar",
|
|
391
|
+
"type": "string",
|
|
392
|
+
"visible": true,
|
|
393
|
+
"locales": {
|
|
394
|
+
"zh": {
|
|
395
|
+
"name": "属性",
|
|
396
|
+
"defaultValue": "-"
|
|
397
|
+
},
|
|
398
|
+
"en": {
|
|
399
|
+
"name": "Bar",
|
|
400
|
+
"defaultValue": "bar"
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
},
|
|
408
|
+
"lbclpm6mxrp10w2k": {
|
|
409
|
+
"index": 9,
|
|
410
|
+
"data": {
|
|
411
|
+
"id": "lbclpm6mxrp10w2k",
|
|
412
|
+
"key": "array",
|
|
413
|
+
"type": "array",
|
|
414
|
+
"visible": true,
|
|
415
|
+
"locales": {
|
|
416
|
+
"zh": {
|
|
417
|
+
"name": "数组数据",
|
|
418
|
+
"defaultValue": [
|
|
419
|
+
{
|
|
420
|
+
"name": "示例用户",
|
|
421
|
+
"bio": "这是一个示例用户"
|
|
422
|
+
}
|
|
423
|
+
]
|
|
424
|
+
},
|
|
425
|
+
"en": {
|
|
426
|
+
"name": "Array Data",
|
|
427
|
+
"defaultValue": [
|
|
428
|
+
{
|
|
429
|
+
"name": "Example User",
|
|
430
|
+
"bio": "This is an example user"
|
|
431
|
+
}
|
|
432
|
+
]
|
|
433
|
+
}
|
|
434
|
+
},
|
|
435
|
+
"subProperties": {
|
|
436
|
+
"1c5vl2p9cn9ryvgh": {
|
|
437
|
+
"index": 0,
|
|
438
|
+
"data": {
|
|
439
|
+
"id": "1c5vl2p9cn9ryvgh",
|
|
440
|
+
"key": "name",
|
|
441
|
+
"type": "string",
|
|
442
|
+
"visible": true,
|
|
443
|
+
"locales": {
|
|
444
|
+
"zh": {
|
|
445
|
+
"name": "姓名",
|
|
446
|
+
"defaultValue": ""
|
|
447
|
+
},
|
|
448
|
+
"en": {
|
|
449
|
+
"name": "Name",
|
|
450
|
+
"defaultValue": ""
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
},
|
|
455
|
+
"c5whnccwzqqzaa0w": {
|
|
456
|
+
"index": 1,
|
|
457
|
+
"data": {
|
|
458
|
+
"id": "c5whnccwzqqzaa0w",
|
|
459
|
+
"key": "bio",
|
|
460
|
+
"type": "multiline",
|
|
461
|
+
"visible": true,
|
|
462
|
+
"locales": {
|
|
463
|
+
"zh": {
|
|
464
|
+
"name": "简介",
|
|
465
|
+
"defaultValue": ""
|
|
466
|
+
},
|
|
467
|
+
"en": {
|
|
468
|
+
"name": "Bio",
|
|
469
|
+
"defaultValue": ""
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
},
|
|
477
|
+
"s0tund4p07bzizgv": {
|
|
478
|
+
"index": 10,
|
|
479
|
+
"data": {
|
|
480
|
+
"id": "s0tund4p07bzizgv",
|
|
481
|
+
"key": "yaml",
|
|
482
|
+
"type": "yaml",
|
|
483
|
+
"visible": true,
|
|
484
|
+
"locales": {
|
|
485
|
+
"zh": {
|
|
486
|
+
"name": "YAML 配置",
|
|
487
|
+
"defaultValue": ""
|
|
488
|
+
},
|
|
489
|
+
"en": {
|
|
490
|
+
"name": "YAML Configuration",
|
|
491
|
+
"defaultValue": "ya: ya\nml: ml\n"
|
|
492
|
+
}
|
|
493
|
+
},
|
|
494
|
+
"subProperties": {
|
|
495
|
+
"1q8tsreh4k2mhbgs": {
|
|
496
|
+
"index": 0,
|
|
497
|
+
"data": {
|
|
498
|
+
"id": "1q8tsreh4k2mhbgs",
|
|
499
|
+
"key": "ya",
|
|
500
|
+
"type": "string",
|
|
501
|
+
"visible": true,
|
|
502
|
+
"locales": {
|
|
503
|
+
"en": {
|
|
504
|
+
"name": "Ya",
|
|
505
|
+
"defaultValue": "ya"
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
},
|
|
510
|
+
"09w8sncxwrj6tldi": {
|
|
511
|
+
"index": 1,
|
|
512
|
+
"data": {
|
|
513
|
+
"id": "09w8sncxwrj6tldi",
|
|
514
|
+
"key": "ml",
|
|
515
|
+
"type": "string",
|
|
516
|
+
"visible": true,
|
|
517
|
+
"locales": {
|
|
518
|
+
"en": {
|
|
519
|
+
"name": "Ml",
|
|
520
|
+
"defaultValue": "ml"
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
},
|
|
528
|
+
"8e7g6c61pxcy0q4w": {
|
|
529
|
+
"index": 11,
|
|
530
|
+
"data": {
|
|
531
|
+
"id": "8e7g6c61pxcy0q4w",
|
|
532
|
+
"key": "children",
|
|
533
|
+
"type": "component",
|
|
534
|
+
"visible": true,
|
|
535
|
+
"locales": {
|
|
536
|
+
"zh": {
|
|
537
|
+
"name": "子组件",
|
|
538
|
+
"defaultValue": {}
|
|
539
|
+
},
|
|
540
|
+
"en": {
|
|
541
|
+
"name": "Children Components",
|
|
542
|
+
"defaultValue": {}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
```
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
---
|
|
2
|
+
description:
|
|
3
|
+
globs:
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
# Component Studio 说明
|
|
7
|
+
|
|
8
|
+
## 概述
|
|
9
|
+
Component Studio 是一个强大的组件开发环境,让开发者能够创建、配置和管理可复用的组件。它通过声明式配置和实现分离的方式,实现了组件的高度可定制性和易用性。
|
|
10
|
+
|
|
11
|
+
## 工作原理
|
|
12
|
+
Component Studio 基于两个核心文件协同工作:
|
|
13
|
+
- `@metadata.json`:声明组件的元数据和可配置属性
|
|
14
|
+
- `index.tsx`:实现组件的渲染逻辑和交互行为
|
|
15
|
+
|
|
16
|
+
这种分离架构使得组件能够同时满足开发便捷性和使用灵活性的需求。
|
|
17
|
+
|
|
18
|
+
## 项目结构
|
|
19
|
+
|
|
20
|
+
项目需要遵循工程化思想,减少代码堆积
|
|
21
|
+
**重要提醒** 尤其是对于 EditComponent 可以抽离公用的配置逻辑,最后通过 JSON Schema 进行渲染
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
your-component-studio/
|
|
25
|
+
├── api/ # 后端API代码
|
|
26
|
+
│ ├── dev.ts # 开发服务器入口
|
|
27
|
+
│ ├── src/ # API源代码目录
|
|
28
|
+
│ └── third.d.ts # 三方库类型声明
|
|
29
|
+
├── scripts/ # 构建和版本管理脚本
|
|
30
|
+
│ ├── build-clean.mjs # 清理构建脚本
|
|
31
|
+
│ └── bump-version.mjs # 版本升级脚本
|
|
32
|
+
├── src/ # 前端源代码
|
|
33
|
+
│ ├── HelloWorld/ # 示例HelloWorld区块
|
|
34
|
+
│ │ └── index.tsx # 区块入口
|
|
35
|
+
│ │ └── @metadata.json # 区块元数据
|
|
36
|
+
│ │ └── @preview-images/ # 区块预览图目录
|
|
37
|
+
│ └── <your-component-name>/ # 你的区块目录
|
|
38
|
+
│ | └── index.tsx # 区块入口
|
|
39
|
+
│ | └── @metadata.json # 区块元数据
|
|
40
|
+
│ | └── @preview-images/ # 区块预览图目录
|
|
41
|
+
│ └── components/ # 组件目录
|
|
42
|
+
│ └── utils/ # 工具函数目录
|
|
43
|
+
│ └── types/ # 类型声明目录
|
|
44
|
+
├── package.json # 项目配置和依赖
|
|
45
|
+
├── vite.config.mts # Vite客户端配置
|
|
46
|
+
└── vite-server.config.ts # Vite服务端配置
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
## 核心功能
|
|
51
|
+
|
|
52
|
+
### 组件定义与配置
|
|
53
|
+
- 通过 `@metadata.json` 定义组件的基本信息和属性
|
|
54
|
+
- 支持丰富的属性类型(文本、数值、颜色、对象等)
|
|
55
|
+
- 提供多语言支持和国际化能力
|
|
56
|
+
- 控制属性在编辑器中的显示方式
|
|
57
|
+
|
|
58
|
+
### 组件实现与渲染
|
|
59
|
+
- 在 `index.tsx` 中实现组件的具体行为
|
|
60
|
+
- 使用 React 函数组件和 TypeScript 类型系统
|
|
61
|
+
- 支持自定义编辑界面(EditComponent)
|
|
62
|
+
- 提供响应式和交互体验
|
|
63
|
+
|
|
64
|
+
## 开发注意事项
|
|
65
|
+
|
|
66
|
+
### 上下文与依赖管理
|
|
67
|
+
- **避免使用 React Context** - 组件可能在无特定上下文的环境中运行,依赖上下文会导致组件失效
|
|
68
|
+
- **谨慎选择第三方库** - 避免使用依赖于全局上下文或特定环境的第三方库
|
|
69
|
+
- **依赖最小化** - 组件应尽可能减少外部依赖,确保高度独立性
|
|
70
|
+
- **明确依赖声明** - 必要的依赖应在文档中明确说明,并在项目配置中正确引用
|
|
71
|
+
|
|
72
|
+
### 容错与健壮性
|
|
73
|
+
- **防御性编程** - 实现空值检查和类型验证,防止运行时错误
|
|
74
|
+
- **优雅降级** - 当属性缺失或格式错误时,组件应能优雅降级而非崩溃
|
|
75
|
+
- **边界情况处理** - 考虑并测试极端情况(空数据、超长文本、网络错误等)
|
|
76
|
+
- **错误边界** - 使用 React 错误边界捕获渲染错误,避免整个应用崩溃
|
|
77
|
+
|
|
78
|
+
### 工程化与复用
|
|
79
|
+
- **组件封装** - 确保组件功能内聚,接口清晰,方便在不同项目中复用
|
|
80
|
+
- **版本控制** - 使用语义化版本管理组件更新
|
|
81
|
+
- **文档完善** - 提供详细的使用文档和示例,降低使用门槛
|
|
82
|
+
- **测试覆盖** - 编写单元测试和集成测试,确保组件质量
|
|
83
|
+
- **构建优化** - 配置合适的构建流程,减小打包体积
|
|
84
|
+
|
|
85
|
+
## 设计与用户体验要求
|
|
86
|
+
|
|
87
|
+
### 视觉设计原则
|
|
88
|
+
- **美观性** - 组件应具有现代、专业的外观,符合当代设计趋势
|
|
89
|
+
- **一致性** - 组件样式应与整体设计系统保持一致
|
|
90
|
+
- **层次感** - 使用适当的阴影、间距和颜色创造视觉层次
|
|
91
|
+
- **动效适度** - 添加适当的过渡动画,提升用户体验,但避免过度装饰
|
|
92
|
+
|
|
93
|
+
### 用户体验标准
|
|
94
|
+
- **响应灵敏** - 组件应对用户操作提供即时反馈
|
|
95
|
+
- **容错设计** - 妥善处理各种边缘情况和错误状态
|
|
96
|
+
- **直观操作** - 用户无需额外说明即可理解如何使用组件
|
|
97
|
+
- **可访问性** - 符合WCAG 2.1标准,支持键盘导航和屏幕阅读器
|
|
98
|
+
|
|
99
|
+
### 性能要求
|
|
100
|
+
- 组件初始渲染时间应控制在300ms以内
|
|
101
|
+
- 交互响应延迟不应超过100ms
|
|
102
|
+
- 优化重渲染逻辑,避免不必要的DOM更新
|
|
103
|
+
- 大型组件应考虑代码分割和懒加载策略
|
|
104
|
+
|
|
105
|
+
## 文件关系详解
|
|
106
|
+
|
|
107
|
+
### @metadata.json 与 index.tsx 的映射关系
|
|
108
|
+
- `@metadata.json` 中的 `properties.[id].data.key` 对应 `index.tsx` 中 BlockProps 的属性名
|
|
109
|
+
- `@metadata.json` 中的属性类型转换为 TypeScript 类型定义
|
|
110
|
+
- `@metadata.json` 中的默认值在 `index.tsx` 中作为组件默认参数
|
|
111
|
+
- `@metadata.json` 中的嵌套属性(subProperties)在 `index.tsx` 中体现为嵌套接口
|
|
112
|
+
|
|
113
|
+
### 文件依赖与更新
|
|
114
|
+
1. 修改 `@metadata.json` 后需同步更新 `index.tsx` 中的类型定义
|
|
115
|
+
2. 在 `index.tsx` 中添加新功能时,可能需要在 `@metadata.json` 中添加相应配置
|
|
116
|
+
3. 两个文件的同步性对组件的正常运行至关重要
|
|
117
|
+
|
|
118
|
+
## 组件开发流程
|
|
119
|
+
1. 在 `@metadata.json` 中定义组件属性和元数据
|
|
120
|
+
2. 在 `index.tsx` 中实现组件的 BlockProps 接口
|
|
121
|
+
3. 编写组件的渲染逻辑和行为
|
|
122
|
+
4. 进行视觉设计和用户体验优化
|
|
123
|
+
5. 可选:实现 EditComponent 提供自定义编辑体验
|
|
124
|
+
6. 测试组件在不同配置和设备下的表现
|
|
125
|
+
|
|
126
|
+
## 最佳实践
|
|
127
|
+
- 保持 `@metadata.json` 和 `index.tsx` 的同步更新
|
|
128
|
+
- 遵循 TypeScript 和 React 的最佳实践
|
|
129
|
+
- 使用语义化的属性命名
|
|
130
|
+
- 为组件提供合理的默认值
|
|
131
|
+
- 优先考虑移动端体验,实现响应式设计
|
|
132
|
+
- 通过用户测试验证组件的可用性
|
|
133
|
+
- 使用CSS变量实现主题定制能力
|
|
134
|
+
|
|
135
|
+
## 补充资源
|
|
136
|
+
组件开发中可参考同目录下 2 个规则
|
|
137
|
+
- `@metadat-json.mdc`
|
|
138
|
+
- `index-tsx.mdc`
|