pda-kit-mcp-server 2.0.1
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 +107 -0
- package/bin/pda-kit-mcp.js +35 -0
- package/dist/file-reader.d.ts +83 -0
- package/dist/file-reader.d.ts.map +1 -0
- package/dist/file-reader.js +170 -0
- package/dist/file-reader.js.map +1 -0
- package/dist/http-entry.d.ts +12 -0
- package/dist/http-entry.d.ts.map +1 -0
- package/dist/http-entry.js +149 -0
- package/dist/http-entry.js.map +1 -0
- package/dist/http-server.d.ts +5 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +114 -0
- package/dist/http-server.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +90 -0
- package/dist/index.js.map +1 -0
- package/dist/paths.d.ts +37 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +52 -0
- package/dist/paths.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +308 -0
- package/dist/server.js.map +1 -0
- package/dist/stdio-server.d.ts +8 -0
- package/dist/stdio-server.d.ts.map +1 -0
- package/dist/stdio-server.js +83 -0
- package/dist/stdio-server.js.map +1 -0
- package/dist/tools/generate-component.d.ts +54 -0
- package/dist/tools/generate-component.d.ts.map +1 -0
- package/dist/tools/generate-component.js +80 -0
- package/dist/tools/generate-component.js.map +1 -0
- package/dist/tools/get-component-spec.d.ts +70 -0
- package/dist/tools/get-component-spec.d.ts.map +1 -0
- package/dist/tools/get-component-spec.js +95 -0
- package/dist/tools/get-component-spec.js.map +1 -0
- package/dist/tools/get-global-rules.d.ts +42 -0
- package/dist/tools/get-global-rules.d.ts.map +1 -0
- package/dist/tools/get-global-rules.js +83 -0
- package/dist/tools/get-global-rules.js.map +1 -0
- package/dist/tools/list-components.d.ts +52 -0
- package/dist/tools/list-components.d.ts.map +1 -0
- package/dist/tools/list-components.js +104 -0
- package/dist/tools/list-components.js.map +1 -0
- package/dist/tools/search-components.d.ts +54 -0
- package/dist/tools/search-components.d.ts.map +1 -0
- package/dist/tools/search-components.js +124 -0
- package/dist/tools/search-components.js.map +1 -0
- package/dist/tools/validate-html.d.ts +43 -0
- package/dist/tools/validate-html.d.ts.map +1 -0
- package/dist/tools/validate-html.js +116 -0
- package/dist/tools/validate-html.js.map +1 -0
- package/package.json +59 -0
- package/spec-data/badge.md +461 -0
- package/spec-data/button.md +148 -0
- package/spec-data/camera.md +622 -0
- package/spec-data/dialog.md +419 -0
- package/spec-data/divider.md +208 -0
- package/spec-data/drawer.md +301 -0
- package/spec-data/empty-state.md +336 -0
- package/spec-data/home-page.md +352 -0
- package/spec-data/input-row.md +346 -0
- package/spec-data/layout-page.md +317 -0
- package/spec-data/list-item.md +128 -0
- package/spec-data/location-selector.md +630 -0
- package/spec-data/more-actions.md +427 -0
- package/spec-data/navbar.md +482 -0
- package/spec-data/photo-list.md +461 -0
- package/spec-data/picker-single.md +199 -0
- package/spec-data/picker.md +586 -0
- package/spec-data/scan-input.md +304 -0
- package/spec-data/section-heading.md +268 -0
- package/spec-data/selectable-list.md +331 -0
- package/spec-data/stepper.md +247 -0
- package/spec-data/tab-bar.md +254 -0
- package/spec-data/tab.md +349 -0
- package/spec-data/tag.md +363 -0
- package/spec-data/tooltip.md +202 -0
- package/spec-data/waybill-number.md +257 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: scan-input
|
|
3
|
+
name: ScanInput 扫描输入框
|
|
4
|
+
category: molecule
|
|
5
|
+
version: 3.1.0
|
|
6
|
+
tokens:
|
|
7
|
+
layout: "block w-[456px] h-[60px] flex-shrink-0 my-2 px-4"
|
|
8
|
+
theme: "bg-grey-1 border border-grey-3 rounded-4dp"
|
|
9
|
+
focus-theme: "border-main-6"
|
|
10
|
+
success-theme: "bg-green-1 border-green-6"
|
|
11
|
+
error-theme: "bg-red-1 border-red-6"
|
|
12
|
+
composes:
|
|
13
|
+
- icon: "icons/icons-sprite.svg#common_ic_scanning_o"
|
|
14
|
+
triggers:
|
|
15
|
+
- PDA 物理扫描键(主要触发方式)
|
|
16
|
+
- 键盘 Enter(桌面端调试 Fallback)
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# ScanInput 扫描输入框规范
|
|
20
|
+
|
|
21
|
+
> **🧠 AI 绝对死线(MANDATORY,任何违反视为不合格代码):**
|
|
22
|
+
>
|
|
23
|
+
> - ⛔ **严禁生成任何形式的 Web 端"屏幕点击扫描按钮"**。PDA 扫描由物理硬件触发,右侧不准与任何按钮/图标并列。
|
|
24
|
+
> - ⛔ **严禁自作聪明给左侧图标添加 onclick 点击事件**,必须锁死 `cursor: default`。
|
|
25
|
+
> - ⛔ **严禁使用任何 `transition` 属性或动画过渡**,状态切换(如 focus/success/error)必须秒级闪切。
|
|
26
|
+
> - ⛔ **严禁使用大圆角**,必须锁死在 `rounded-4dp` (4px)。
|
|
27
|
+
> - ⛔ **严禁手写 SVG `<path>`**,必须严格通过 `<svg><use href="..."/></svg>` 结构从统一的全局 sprite 中调用。
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 1. 语义骨架 (Semantic Structure)
|
|
32
|
+
|
|
33
|
+
AI 生成该组件时,必须 100% 像素级复刻以下 HTML DOM 结构与 Tailwind 基础类名,严禁更改嵌套关系:
|
|
34
|
+
|
|
35
|
+
```html
|
|
36
|
+
<div class="scan-container block w-[456px] h-[60px] flex-shrink-0 my-2 px-4 flex items-center bg-grey-1 border border-grey-3 rounded-4dp">
|
|
37
|
+
|
|
38
|
+
<svg class="scan-status-icon w-6 h-6 flex-shrink-0 text-black-3 select-none" style="cursor: default;">
|
|
39
|
+
<use href="../icons/icons-sprite.svg#common_ic_scanning_o"/>
|
|
40
|
+
</svg>
|
|
41
|
+
|
|
42
|
+
<input
|
|
43
|
+
type="text"
|
|
44
|
+
class="scan-input flex-1 h-full mx-2 bg-transparent border-none outline-none font-sans text-[20px] font-normal text-black-6 placeholder-black-3"
|
|
45
|
+
placeholder="扫描或输入运单号"
|
|
46
|
+
autocomplete="off"
|
|
47
|
+
>
|
|
48
|
+
|
|
49
|
+
</div>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 1.1 类名锁定表
|
|
53
|
+
|
|
54
|
+
| 元素 | 类名 | 严禁修改 |
|
|
55
|
+
|------|------|---------|
|
|
56
|
+
| 容器 | `scan-container` | 必须,用于状态切换 |
|
|
57
|
+
| 容器布局 | `block w-[456px] h-[60px] flex-shrink-0 my-2 px-4 flex items-center` | 必须 |
|
|
58
|
+
| 容器主题 | `bg-grey-1 border border-grey-3 rounded-4dp` | idle 状态 |
|
|
59
|
+
| 图标 | `scan-status-icon` | 必须 |
|
|
60
|
+
| 图标布局 | `w-6 h-6 flex-shrink-0` | 必须 |
|
|
61
|
+
| 图标主题 | `text-black-3 select-none` | idle: grey |
|
|
62
|
+
| 输入框 | `scan-input` | 必须 |
|
|
63
|
+
| 输入框布局 | `flex-1 h-full mx-2 bg-transparent border-none outline-none` | 必须 |
|
|
64
|
+
| 输入框主题 | `font-sans text-[20px] font-normal text-black-6 placeholder-black-3` | 必须 |
|
|
65
|
+
|
|
66
|
+
### 1.2 内联样式锁定
|
|
67
|
+
|
|
68
|
+
```html
|
|
69
|
+
<svg style="cursor: default;">
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
- ⛔ 严禁改为 `cursor: pointer`
|
|
73
|
+
- ⛔ 严禁添加 `onclick` 事件
|
|
74
|
+
- ✅ 必须锁死 `cursor: default`
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## 2. 状态机 (State Machine)
|
|
79
|
+
|
|
80
|
+
状态切换通过 JavaScript 动态添加/移除 Tailwind 类名实现,**严禁使用 CSS 伪类**(如 `:focus`, `:hover`)。
|
|
81
|
+
|
|
82
|
+
### 2.1 状态映射表
|
|
83
|
+
|
|
84
|
+
| 状态 | 容器类名变更 | 图标类名变更 | 触发条件 |
|
|
85
|
+
|------|-------------|-------------|---------|
|
|
86
|
+
| **idle** | `bg-grey-1 border-grey-3` | `text-black-3` | 页面初始 / 失焦 |
|
|
87
|
+
| **focused** | `+ border-main-6` | `text-green-6` | 输入框聚焦 |
|
|
88
|
+
| **success** | `bg-green-1 border-green-6` | `text-green-6` | 扫描/输入成功 |
|
|
89
|
+
| **error** | `bg-red-1 border-red-6` | `text-red-6` | 扫描/输入失败 |
|
|
90
|
+
|
|
91
|
+
### 2.2 状态切换实现
|
|
92
|
+
|
|
93
|
+
```javascript
|
|
94
|
+
/**
|
|
95
|
+
* 设置 ScanInput 状态
|
|
96
|
+
* @param {'idle'|'focused'|'success'|'error'} state
|
|
97
|
+
*/
|
|
98
|
+
function setScanState(state) {
|
|
99
|
+
const container = document.querySelector('.scan-container');
|
|
100
|
+
const icon = document.querySelector('.scan-status-icon');
|
|
101
|
+
|
|
102
|
+
// 重置所有状态类
|
|
103
|
+
container.classList.remove(
|
|
104
|
+
'border-main-6', 'bg-green-1', 'border-green-6', 'bg-red-1', 'border-red-6'
|
|
105
|
+
);
|
|
106
|
+
icon.classList.remove('text-green-6', 'text-red-6');
|
|
107
|
+
|
|
108
|
+
// 应用新状态
|
|
109
|
+
switch(state) {
|
|
110
|
+
case 'focused':
|
|
111
|
+
container.classList.add('border-main-6');
|
|
112
|
+
icon.classList.add('text-green-6');
|
|
113
|
+
break;
|
|
114
|
+
case 'success':
|
|
115
|
+
container.classList.add('bg-green-1', 'border-green-6');
|
|
116
|
+
icon.classList.add('text-green-6');
|
|
117
|
+
break;
|
|
118
|
+
case 'error':
|
|
119
|
+
container.classList.add('bg-red-1', 'border-red-6');
|
|
120
|
+
icon.classList.add('text-red-6');
|
|
121
|
+
break;
|
|
122
|
+
default: // idle
|
|
123
|
+
// 保持默认类名
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// 事件绑定
|
|
129
|
+
document.querySelector('.scan-input').addEventListener('focus', () => {
|
|
130
|
+
setScanState('focused');
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
document.querySelector('.scan-input').addEventListener('blur', () => {
|
|
134
|
+
setScanState('idle');
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
document.querySelector('.scan-input').addEventListener('keydown', (e) => {
|
|
138
|
+
if (e.key === 'Enter') {
|
|
139
|
+
const value = e.target.value;
|
|
140
|
+
if (value) {
|
|
141
|
+
setScanState('success');
|
|
142
|
+
// 3秒后恢复 idle
|
|
143
|
+
setTimeout(() => setScanState('idle'), 3000);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### 2.3 状态切换原则
|
|
150
|
+
|
|
151
|
+
- ⛔ **严禁使用 CSS `:focus` 伪类** 实现聚焦状态
|
|
152
|
+
- ⛔ **严禁使用 `transition`** 实现状态过渡
|
|
153
|
+
- ✅ **必须使用 JavaScript 动态切换类名**
|
|
154
|
+
- ✅ **状态切换必须是秒级闪切**,无渐变效果
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 3. 资源引用 (Asset References)
|
|
159
|
+
|
|
160
|
+
### 3.1 图标引用(强制)
|
|
161
|
+
|
|
162
|
+
```html
|
|
163
|
+
<svg class="scan-status-icon ...">
|
|
164
|
+
<use href="../icons/icons-sprite.svg#common_ic_scanning_o"/>
|
|
165
|
+
</svg>
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**路径规则:**
|
|
169
|
+
- HTML 在 `demos/` 目录:`../icons/icons-sprite.svg#common_ic_scanning_o`
|
|
170
|
+
- HTML 在根目录:`./icons/icons-sprite.svg#common_ic_scanning_o`
|
|
171
|
+
|
|
172
|
+
**严禁:**
|
|
173
|
+
- ⛔ `<img src="...">` 引用 SVG
|
|
174
|
+
- ⛔ 手写 `<svg><path d="..."/></svg>`
|
|
175
|
+
- ⛔ 使用 `icons/assets/` 下的独立 SVG 文件
|
|
176
|
+
|
|
177
|
+
### 3.2 依赖 Token
|
|
178
|
+
|
|
179
|
+
```yaml
|
|
180
|
+
colors:
|
|
181
|
+
- --color-grey-1: #FFFFFF (idle 背景)
|
|
182
|
+
- --color-grey-3: #E0E4F0 (idle 边框)
|
|
183
|
+
- --color-main-6: #6445D1 (focused 边框)
|
|
184
|
+
- --color-green-1: #F6FFED (success 背景)
|
|
185
|
+
- --color-green-6: #52C41A (success 边框/图标)
|
|
186
|
+
- --color-red-1: #FFF1F0 (error 背景)
|
|
187
|
+
- --color-red-6: #FF4D4F (error 边框/图标)
|
|
188
|
+
- --color-black-3: #BBBBBB (idle 图标)
|
|
189
|
+
- --color-black-6: #333333 (输入文字)
|
|
190
|
+
|
|
191
|
+
radius:
|
|
192
|
+
- --radius-4dp: 4px (唯一允许的圆角值)
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## 4. 反模式对照 (Anti-Patterns)
|
|
198
|
+
|
|
199
|
+
| 反模式 | 错误代码 | 正确代码 | 后果 |
|
|
200
|
+
|--------|---------|---------|------|
|
|
201
|
+
| 右侧扫描按钮 | `<button class="scan-btn">扫描</button>` | 无,右侧必须为空 | P0-致命,代码废弃 |
|
|
202
|
+
| 图标可点击 | `onclick="startScan()"` | 无 onclick,cursor: default | P0-致命,代码废弃 |
|
|
203
|
+
| 使用 transition | `transition: border-color 0.3s` | 无 transition | P0-致命,代码废弃 |
|
|
204
|
+
| 大圆角 | `rounded-lg (8px)` | `rounded-4dp (4px)` | P1-严重,必须修复 |
|
|
205
|
+
| 手写 SVG path | `<svg><path d="..."/></svg>` | `<svg><use href="..."/></svg>` | P1-严重,必须修复 |
|
|
206
|
+
| 裸 Hex 颜色 | `#333333` | `text-black-6` | P1-严重,必须修复 |
|
|
207
|
+
| CSS :focus 伪类 | `.scan-input:focus {...}` | JS 动态切换类名 | P1-严重,必须修复 |
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## 5. 完整示例 (Complete Example)
|
|
212
|
+
|
|
213
|
+
```html
|
|
214
|
+
<!DOCTYPE html>
|
|
215
|
+
<html>
|
|
216
|
+
<head>
|
|
217
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
|
218
|
+
<script src="../tokens/tailwind.config.js"></script>
|
|
219
|
+
</head>
|
|
220
|
+
<body class="bg-grey-2">
|
|
221
|
+
|
|
222
|
+
<!-- ScanInput 组件 -->
|
|
223
|
+
<div class="scan-container block w-[456px] h-[60px] flex-shrink-0 my-2 px-4 flex items-center bg-grey-1 border border-grey-3 rounded-4dp">
|
|
224
|
+
|
|
225
|
+
<svg class="scan-status-icon w-6 h-6 flex-shrink-0 text-black-3 select-none" style="cursor: default;">
|
|
226
|
+
<use href="../icons/icons-sprite.svg#common_ic_scanning_o"/>
|
|
227
|
+
</svg>
|
|
228
|
+
|
|
229
|
+
<input
|
|
230
|
+
type="text"
|
|
231
|
+
class="scan-input flex-1 h-full mx-2 bg-transparent border-none outline-none font-sans text-[20px] font-normal text-black-6 placeholder-black-3"
|
|
232
|
+
placeholder="扫描或输入运单号"
|
|
233
|
+
autocomplete="off"
|
|
234
|
+
>
|
|
235
|
+
|
|
236
|
+
</div>
|
|
237
|
+
|
|
238
|
+
<script>
|
|
239
|
+
// 状态控制
|
|
240
|
+
function setScanState(state) {
|
|
241
|
+
const container = document.querySelector('.scan-container');
|
|
242
|
+
const icon = document.querySelector('.scan-status-icon');
|
|
243
|
+
|
|
244
|
+
container.classList.remove(
|
|
245
|
+
'border-main-6', 'bg-green-1', 'border-green-6', 'bg-red-1', 'border-red-6'
|
|
246
|
+
);
|
|
247
|
+
icon.classList.remove('text-green-6', 'text-red-6');
|
|
248
|
+
|
|
249
|
+
switch(state) {
|
|
250
|
+
case 'focused':
|
|
251
|
+
container.classList.add('border-main-6');
|
|
252
|
+
icon.classList.add('text-green-6');
|
|
253
|
+
break;
|
|
254
|
+
case 'success':
|
|
255
|
+
container.classList.add('bg-green-1', 'border-green-6');
|
|
256
|
+
icon.classList.add('text-green-6');
|
|
257
|
+
break;
|
|
258
|
+
case 'error':
|
|
259
|
+
container.classList.add('bg-red-1', 'border-red-6');
|
|
260
|
+
icon.classList.add('text-red-6');
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// 事件绑定
|
|
266
|
+
const input = document.querySelector('.scan-input');
|
|
267
|
+
|
|
268
|
+
input.addEventListener('focus', () => setScanState('focused'));
|
|
269
|
+
input.addEventListener('blur', () => setScanState('idle'));
|
|
270
|
+
input.addEventListener('keydown', (e) => {
|
|
271
|
+
if (e.key === 'Enter' && e.target.value) {
|
|
272
|
+
setScanState('success');
|
|
273
|
+
setTimeout(() => setScanState('idle'), 3000);
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
</script>
|
|
277
|
+
|
|
278
|
+
</body>
|
|
279
|
+
</html>
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## 6. AI 生成检查清单
|
|
285
|
+
|
|
286
|
+
生成代码后必须逐项确认:
|
|
287
|
+
|
|
288
|
+
- [ ] 容器类名包含 `block w-[456px] h-[60px] flex-shrink-0 my-2 px-4 flex items-center`
|
|
289
|
+
- [ ] 容器主题类名包含 `bg-grey-1 border border-grey-3 rounded-4dp`
|
|
290
|
+
- [ ] 图标使用 `<svg><use href="../icons/icons-sprite.svg#common_ic_scanning_o"/></svg>`
|
|
291
|
+
- [ ] 图标类名包含 `w-6 h-6 flex-shrink-0 text-black-3 select-none`
|
|
292
|
+
- [ ] 图标内联样式为 `cursor: default`
|
|
293
|
+
- [ ] 输入框类名包含 `flex-1 h-full mx-2 bg-transparent border-none outline-none font-sans text-[20px] font-normal text-black-6 placeholder-black-3`
|
|
294
|
+
- [ ] 右侧**无任何按钮/图标**
|
|
295
|
+
- [ ] 无 `transition` / `animation` 属性
|
|
296
|
+
- [ ] 圆角值为 `4px` (rounded-4dp)
|
|
297
|
+
- [ ] 状态切换通过 JavaScript 实现,非 CSS 伪类
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
**文档版本:** v3.1.0
|
|
302
|
+
**最后更新:** 2024-01-01
|
|
303
|
+
**状态:** 强制生效
|
|
304
|
+
**适用范围:** AI 代码生成、人工编码、代码审查
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: section-heading
|
|
3
|
+
name: 模块标题
|
|
4
|
+
category: "布局/Layout"
|
|
5
|
+
version: "1.0.0"
|
|
6
|
+
source: PDAKit-基础组件
|
|
7
|
+
source_url: https://mastergo.ky-tech.com.cn/goto/TY6b0Zcx
|
|
8
|
+
source_doc_id: 103417331857122
|
|
9
|
+
component_count: 3
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# 模块标题 Section Heading
|
|
13
|
+
|
|
14
|
+
页面/卡片模块标题栏,用于分割内容区块并提供标题 + 辅助说明 + 右侧操作入口。宽度撑满容器(480px),左对齐标题组 + 右对齐按钮组。
|
|
15
|
+
|
|
16
|
+
> **颜色规则**:全部使用 Token(`--color-{色系}-{色阶}`),禁止 Hex。
|
|
17
|
+
> **字体**:PingFang SC。
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 组件总览
|
|
22
|
+
|
|
23
|
+
| 组件实例 | Node ID | 说明 |
|
|
24
|
+
|----------|---------|------|
|
|
25
|
+
| 模块标题/仅大标题 | `25383:09800` | 大标题 + 右侧操作,无辅助说明 |
|
|
26
|
+
| 模块标题/大标题+辅助说明 | `25453:11158` | 大标题 + 辅助说明 + 右侧操作 |
|
|
27
|
+
| 模块标题/大标题+辅助说明+按钮 | `25563:73521` | 大标题 + 辅助说明 + 右侧双按钮 |
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Props
|
|
32
|
+
|
|
33
|
+
| Prop | 类型 | 值 | 默认 |
|
|
34
|
+
|------|------|-----|------|
|
|
35
|
+
| 类型 | enum | `大标题` / `小标题`(待补充) | `大标题` |
|
|
36
|
+
| 标题名称 | string | 任意文字 | `请输入标题名称` |
|
|
37
|
+
| 显示辅助说明 | boolean | `true` / `false` | `false` |
|
|
38
|
+
| 辅助说明 | string | 任意文字(仅在 `显示辅助说明=true` 时生效) | `请输入输入辅助说明文本` |
|
|
39
|
+
| 显示右侧操作 | boolean | `true` / `false` | `false` |
|
|
40
|
+
| 显示分割线 | boolean | `true` / `false` | `false` |
|
|
41
|
+
|
|
42
|
+
> 本次仅选中「大标题」类型。**小标题**类型存在但未选中导出,待后续补充。
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 规格
|
|
47
|
+
|
|
48
|
+
### 容器
|
|
49
|
+
|
|
50
|
+
| 属性 | 值 |
|
|
51
|
+
|------|------|
|
|
52
|
+
| 宽度 | `471px`(撑满 480px 页面减去内边距) |
|
|
53
|
+
| 高度 | `68px`(无辅助说明) / `84px`(有辅助说明) |
|
|
54
|
+
| 背景 | `--color-grey-1`(`#FFFFFF`) |
|
|
55
|
+
| 内边距 | `16px` |
|
|
56
|
+
| 布局 | `flex-row`,`space-between`,`align-items: flex-start` |
|
|
57
|
+
|
|
58
|
+
### 标题文字
|
|
59
|
+
|
|
60
|
+
| 属性 | 值 |
|
|
61
|
+
|------|------|
|
|
62
|
+
| 字体 | PingFang SC,`22px / 30px`,Semibold(`600`) |
|
|
63
|
+
| 颜色 | `--color-black-6`(`#333333`) |
|
|
64
|
+
| 对齐 | 左对齐 |
|
|
65
|
+
|
|
66
|
+
### 辅助说明文字(可选)
|
|
67
|
+
|
|
68
|
+
| 属性 | 值 |
|
|
69
|
+
|------|------|
|
|
70
|
+
| 字体 | PingFang SC,`16px / 22px`,Regular(`400`) |
|
|
71
|
+
| 颜色 | `--color-black-5`(`#666666`) |
|
|
72
|
+
| 对齐 | 左对齐 |
|
|
73
|
+
|
|
74
|
+
### 右侧操作区(可选)
|
|
75
|
+
|
|
76
|
+
| 属性 | 值 |
|
|
77
|
+
|------|------|
|
|
78
|
+
| 布局 | `flex-row`,`gap: 8px` |
|
|
79
|
+
| 按钮类型 | 文字按钮 / Large(`20px / 28px`,颜色 `--color-main-6`) |
|
|
80
|
+
| 按钮数量 | 1-2 个 |
|
|
81
|
+
| 按钮尺寸 | 最小 `56×36`,最大 `168×40`,内边距 `4px 8px` |
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## 布局结构
|
|
86
|
+
|
|
87
|
+
### 大标题 + 辅助说明 + 右侧操作(高度 84px)
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
┌──────────────────────────────────────────────────────┐
|
|
91
|
+
│ 请输入标题名称 按钮 按钮 │ ← padding: 16px
|
|
92
|
+
│ 请输入输入辅助说明文本 │
|
|
93
|
+
└──────────────────────────────────────────────────────┘
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### 仅大标题 + 右侧操作(高度 68px)
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
┌──────────────────────────────────────────────────────┐
|
|
100
|
+
│ 请输入标题名称 按钮 按钮 │ ← padding: 16px
|
|
101
|
+
└──────────────────────────────────────────────────────┘
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## HTML 示例
|
|
107
|
+
|
|
108
|
+
### 场景 A:大标题 + 辅助说明 + 右侧操作
|
|
109
|
+
|
|
110
|
+
```html
|
|
111
|
+
<div class="section-heading section-heading-large">
|
|
112
|
+
<div class="section-heading-inner">
|
|
113
|
+
<!-- 左侧标题组 -->
|
|
114
|
+
<div class="section-heading-text">
|
|
115
|
+
<h3 class="section-heading-title">运单管理</h3>
|
|
116
|
+
<p class="section-heading-subtitle">今日已处理 128 个运单</p>
|
|
117
|
+
</div>
|
|
118
|
+
<!-- 右侧操作 -->
|
|
119
|
+
<div class="section-heading-actions">
|
|
120
|
+
<span class="section-heading-btn">筛选</span>
|
|
121
|
+
<span class="section-heading-btn">一键签收</span>
|
|
122
|
+
</div>
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 场景 B:仅大标题 + 右侧操作(无辅助说明)
|
|
128
|
+
|
|
129
|
+
```html
|
|
130
|
+
<div class="section-heading section-heading-large section-heading-no-subtitle">
|
|
131
|
+
<div class="section-heading-inner">
|
|
132
|
+
<div class="section-heading-text">
|
|
133
|
+
<h3 class="section-heading-title">运单管理</h3>
|
|
134
|
+
</div>
|
|
135
|
+
<div class="section-heading-actions">
|
|
136
|
+
<span class="section-heading-btn">筛选</span>
|
|
137
|
+
</div>
|
|
138
|
+
</div>
|
|
139
|
+
</div>
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### 场景 C:仅大标题(无辅助说明、无右侧操作)
|
|
143
|
+
|
|
144
|
+
```html
|
|
145
|
+
<div class="section-heading section-heading-large section-heading-no-subtitle">
|
|
146
|
+
<div class="section-heading-inner">
|
|
147
|
+
<div class="section-heading-text">
|
|
148
|
+
<h3 class="section-heading-title">运单管理</h3>
|
|
149
|
+
</div>
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## CSS
|
|
157
|
+
|
|
158
|
+
```css
|
|
159
|
+
/* 容器 */
|
|
160
|
+
.section-heading {
|
|
161
|
+
width: 100%;
|
|
162
|
+
background: var(--color-grey-1);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/* 高 84px(有辅助说明) */
|
|
166
|
+
.section-heading-large {
|
|
167
|
+
height: 84px;
|
|
168
|
+
}
|
|
169
|
+
/* 高 68px(无辅助说明) */
|
|
170
|
+
.section-heading-no-subtitle {
|
|
171
|
+
height: 68px;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/* 内层 */
|
|
175
|
+
.section-heading-inner {
|
|
176
|
+
display: flex;
|
|
177
|
+
justify-content: space-between;
|
|
178
|
+
align-items: flex-start;
|
|
179
|
+
padding: 16px;
|
|
180
|
+
height: 100%;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/* 左侧标题组 */
|
|
184
|
+
.section-heading-text {
|
|
185
|
+
display: flex;
|
|
186
|
+
flex-direction: column;
|
|
187
|
+
justify-content: flex-start;
|
|
188
|
+
align-items: flex-start;
|
|
189
|
+
flex-shrink: 0;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/* 标题 */
|
|
193
|
+
.section-heading-title {
|
|
194
|
+
color: var(--color-black-6);
|
|
195
|
+
font-size: 22px;
|
|
196
|
+
line-height: 30px;
|
|
197
|
+
font-weight: 600;
|
|
198
|
+
font-family: PingFang SC;
|
|
199
|
+
margin: 0;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/* 辅助说明 */
|
|
203
|
+
.section-heading-subtitle {
|
|
204
|
+
color: var(--color-black-5);
|
|
205
|
+
font-size: 16px;
|
|
206
|
+
line-height: 22px;
|
|
207
|
+
font-family: PingFang SC;
|
|
208
|
+
margin: 0;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/* 右侧操作区 */
|
|
212
|
+
.section-heading-actions {
|
|
213
|
+
display: flex;
|
|
214
|
+
justify-content: flex-start;
|
|
215
|
+
align-items: flex-start;
|
|
216
|
+
gap: 8px;
|
|
217
|
+
flex-shrink: 0;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/* 右侧按钮(文字按钮/Large) */
|
|
221
|
+
.section-heading-btn {
|
|
222
|
+
min-width: 56px;
|
|
223
|
+
max-width: 168px;
|
|
224
|
+
min-height: 36px;
|
|
225
|
+
max-height: 40px;
|
|
226
|
+
display: flex;
|
|
227
|
+
justify-content: center;
|
|
228
|
+
align-items: center;
|
|
229
|
+
gap: 8px;
|
|
230
|
+
padding: 4px 8px;
|
|
231
|
+
border-radius: 4px;
|
|
232
|
+
border: none;
|
|
233
|
+
background: transparent;
|
|
234
|
+
color: var(--color-main-6);
|
|
235
|
+
font-size: 20px;
|
|
236
|
+
line-height: 28px;
|
|
237
|
+
font-family: PingFang SC;
|
|
238
|
+
text-align: right;
|
|
239
|
+
cursor: pointer;
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## 颜色 Token
|
|
246
|
+
|
|
247
|
+
| Token | 色值 | 使用场景 |
|
|
248
|
+
|-------|------|---------|
|
|
249
|
+
| `--color-grey-1` | `#FFFFFF` | 容器背景 |
|
|
250
|
+
| `--color-black-6` | `#333333` | 标题文字 |
|
|
251
|
+
| `--color-black-5` | `#666666` | 辅助说明文字 |
|
|
252
|
+
| `--color-main-6` | `#6445D1` | 右侧操作按钮文字 |
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## 使用规则(AI 必读)
|
|
257
|
+
|
|
258
|
+
1. **场景选型**:
|
|
259
|
+
| 场景 | 配置 |
|
|
260
|
+
|------|------|
|
|
261
|
+
| 简单列表模块 | 仅大标题 + 右侧操作 |
|
|
262
|
+
| 需补充说明的模块 | 大标题 + 辅助说明 + 右侧操作 |
|
|
263
|
+
| 纯展示标题 | 仅大标题 |
|
|
264
|
+
2. **高度自适应**:有辅助说明 `84px`,无辅助说明 `68px`,通过 class 控制
|
|
265
|
+
3. **右侧按钮**:1-2 个文字按钮(Large),颜色 `--color-main-6`,按需显隐
|
|
266
|
+
4. **宽度撑满**:容器宽度 100%,内边距 16px 由父级模块控制
|
|
267
|
+
5. **颜色用 Token**:禁止裸 Hex,全部用 `--color-*` 引用
|
|
268
|
+
6. **分割线按需**:`显示分割线=true` 时在容器底部追加 1px 分割线
|