draftgo-cli 2.0.3 → 2.0.9

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.
@@ -1,320 +0,0 @@
1
- ---
2
- name: draftgo-data-table-guideline
3
- description: Reference UI/UX guidance for data list/table pages. Use it to improve data density, filtering, states, and responsive behavior without forcing every page into one fixed template.
4
- version: 1.0.0
5
- ---
6
-
7
- # 数据列表 UI/UX 设计规范
8
-
9
- > **使用原则**:开发数据列表、表格、多数据管理类页面时,可参考本规范提升信息密度、筛选效率、状态完整和响应式体验;具体布局、控件数量、分页方式和动效由业务目标、数据复杂度和页面风格决定。
10
- >
11
- > 不要为了套用结构而强行加入搜索、高级筛选、列配置或分页;用户真正需要快速找到、比较、编辑、批量处理哪些数据,才是设计依据。
12
-
13
- ---
14
-
15
- ## 1. 工作台空间模型
16
-
17
- 数据列表 / 表格 / 多数据管理页通常是**操作型页面**,应先建立占满可用空间的工作台容器,再放筛选、表格、分页等组件。不要把页面写成普通文档流。
18
-
19
- - 页面根容器占满可用视口 / iframe 内容区,常用 `display:flex; flex-direction:column; min-height:100vh; overflow:hidden`。
20
- - Toolbar / Filter Bar 是稳定控制区,`flex-shrink:0`。
21
- - 表格 / 列表主体是主工作区,`flex:1; min-height:0; overflow:auto`,数据少时也保留工作区空白。
22
- - Pagination / 批量操作栏 / 底部保存栏是流程控制区,`flex-shrink:0`,应贴在当前工作区底部或保持稳定位置。
23
- - 数据只有 1-2 条时,分页不应跟随最后一行上浮;数据很多时,滚动应优先发生在表格主体,而不是把分页挤出视野。
24
-
25
- ### 常见布局参考
26
-
27
- ```
28
- ┌─────────────────────────────────────────────────────────────────┐
29
- │ [🔍 搜索框] [高级筛选▼] [列配置⚙️] │ ← Toolbar
30
- ├─────────────────────────────────────────────────────────────────┤
31
- │ [状态:已发布 ×] [类型:文章 ×] [清除全部] │ ← Filter Bar(有筛选时显示)
32
- ├─────────────────────────────────────────────────────────────────┤
33
- │ □ │ 列A │ 列B │ 列C │ 列D │ 操作 │ ← 表头(sticky)
34
- │───┼──────┼──────┼──────┼──────┼────────────────────────────── │
35
- │ □ │ │ │ │ │ [编辑] [删除] [...] │ ← 数据行
36
- │ □ │ │ │ │ │ │
37
- │ │ │ │ │ │ │ ← 剩余数据区留白
38
- │ │ │ │ │ │ │
39
- │ │ │ │ │ │ │
40
- ├─────────────────────────────────────────────────────────────────┤
41
- │ 共128条 · 第2/13页 每页[20▼]条 [◀ ‹ 1 2 ③ 4 5…13 › ▶] │ ← Pagination
42
- └─────────────────────────────────────────────────────────────────┘
43
- ```
44
-
45
- 上图是高密度管理页的常见结构,不是唯一模板。轻量列表、卡片列表、看板、时间线、图库或移动端优先页面,都可以根据内容形态采用更合适的呈现方式。
46
-
47
- ### CSS 骨架参考
48
-
49
- ```css
50
- .table-workbench {
51
- min-height: 100vh;
52
- display: flex;
53
- flex-direction: column;
54
- overflow: hidden;
55
- }
56
- .table-toolbar,
57
- .filter-bar,
58
- .pagination-bar {
59
- flex-shrink: 0;
60
- }
61
- .table-region {
62
- flex: 1;
63
- min-height: 0;
64
- overflow: auto;
65
- }
66
- ```
67
-
68
- ---
69
-
70
- ## 2. Toolbar 参考
71
-
72
- ### 常见布局
73
-
74
- ```html
75
- <div class="toolbar-area">
76
- <div class="toolbar-left">
77
- <input class="search-input" placeholder="搜索名称、ID…" />
78
- <button class="filter-toggle-btn">高级筛选 ▼</button>
79
- </div>
80
- <div class="toolbar-right">
81
- <button class="column-config-btn"><i class="fa-solid fa-gear"></i></button>
82
- </div>
83
- </div>
84
- ```
85
-
86
- - **toolbar-left**:搜索框 + 高级筛选按钮,左对齐
87
- - **toolbar-right**:列配置按钮,`margin-left: auto` 独立右对齐
88
- - 语义分离:筛选 = 数据范围,列配置 = 视图偏好
89
-
90
- ### 搜索体验建议
91
-
92
- - 搜索框尺寸应匹配工具栏密度和页面宽度,常见管理页可从 240px 起步
93
- - placeholder 写明可搜索的字段(如"搜索名称、ID…"),避免只写"搜索"
94
- - 输入后使用短 debounce,避免频繁请求;具体时长按数据规模和响应速度调整
95
- - 有内容时右侧显示 × 清除按钮
96
-
97
- ### 高级筛选建议
98
-
99
- - 字段较多、条件组合复杂或用户需要反复筛选时再提供高级筛选
100
- - 高级筛选通常放在搜索框附近,便于形成同一组数据范围控制
101
- - 点击展开面板(GSAP slideDown),面板内根据字段类型提供控件
102
- - 确认后在 Filter Bar 显示 pills 标签(如 `状态: 已发布 ×`)
103
- - 支持单个 pill 移除,或「清除全部」
104
-
105
- ### 列配置建议
106
-
107
- - 字段多、角色关注点不同或表格需要长期使用时,可提供列配置
108
- - 常见做法是 popover + checkbox 控制列显隐
109
- - 视图偏好可存 `localStorage`,同页面下次打开保持
110
- - 可选:支持拖拽排序列顺序
111
-
112
- ---
113
-
114
- ## 3. 分页组件
115
-
116
- ### 布局
117
-
118
- | 位置 | 内容 |
119
- |------|------|
120
- | 左侧 | `共{total}条 · 第{current}/{totalPages}页` + `每页 [10/20/50/100▼] 条` |
121
- | 右侧 | `◀` 首页 · `‹` 上一页 · 页码 · 下一页 `›` · 尾页 `▶` |
122
-
123
- ### 页码省略规则
124
-
125
- - 总页数 ≤ 7:全部显示
126
- - 总页数 > 7:当前页 ±2 + 首尾页 + 省略号
127
- - 示例:`1 2 ③ 4 5 … 13`
128
- - 示例:`1 … 5 6 ⑦ 8 9 … 13`
129
- - 点击省略号弹出输入框跳转
130
-
131
- ### 交互规则
132
-
133
- - 当前页高亮(accent 色背景 + 白色文字)
134
- - 首页/末页边界时禁用对应按钮(`opacity: 0.5; cursor: not-allowed`)
135
- - 切换每页条数后重置到第 1 页
136
- - 默认每页数量按数据密度和屏幕空间决定,管理页可从 20 条起步
137
-
138
- ### CSS 参考
139
-
140
- ```css
141
- .pagination-bar {
142
- padding: 12px 24px;
143
- border-top: 1px solid var(--dg-border, #E2E8F0);
144
- background: var(--dg-bg-base, #F8FAFC);
145
- display: flex;
146
- justify-content: space-between;
147
- align-items: center;
148
- flex-shrink: 0;
149
- }
150
- .pagination-info {
151
- font-size: 13px;
152
- color: var(--dg-text-muted, #64748B);
153
- display: flex;
154
- align-items: center;
155
- gap: 8px;
156
- }
157
- .page-num-btn {
158
- min-width: 32px; height: 32px;
159
- padding: 0 8px; font-size: 13px;
160
- border: 1px solid var(--dg-border, #E2E8F0);
161
- background: var(--dg-bg-surface, #fff);
162
- color: var(--dg-text-primary, #334155);
163
- cursor: pointer; border-radius: 6px;
164
- transition: all 0.2s;
165
- }
166
- .page-num-btn.active {
167
- background: var(--dg-accent); color: white;
168
- border-color: var(--dg-accent); font-weight: 600;
169
- }
170
- .page-num-btn:disabled {
171
- opacity: 0.5; cursor: not-allowed;
172
- }
173
- ```
174
-
175
- ---
176
-
177
- ## 4. 表格本体
178
-
179
- | 规则 | 说明 |
180
- |------|------|
181
- | 表头 sticky | 滚动时固定,底部 1px shadow 分隔 |
182
- | 行 hover | `var(--dg-bg-base)` 浅色背景,transition 0.15s |
183
- | 操作列 | 固定右侧,≤3 个内联按钮 + 更多(…) 下拉 |
184
- | 行选择 | 左侧 checkbox,表头全选;选中后顶部出现批量操作栏 |
185
- | 排序 | 可排序列表头带排序图标,点击切换 asc/desc/none |
186
- | 空状态 | icon + 描述文案 + 可选操作按钮,布局可参考 `.empty-dg` |
187
- | 加载态 | 优先使用骨架屏或局部 loading,避免让整个页面空白等待 |
188
-
189
- ### CSS 参考
190
-
191
- ```css
192
- .table-dense {
193
- width: 100%; border-collapse: collapse; text-align: left;
194
- }
195
- .table-dense th {
196
- background: var(--dg-bg-base, #F8FAFC);
197
- font-size: 13px; font-weight: 600;
198
- color: var(--dg-text-muted, #64748B);
199
- padding: 10px 16px;
200
- border-bottom: 1px solid var(--dg-border, #E2E8F0);
201
- position: sticky; top: 0; z-index: 10;
202
- }
203
- .table-dense td {
204
- padding: 10px 16px;
205
- border-bottom: 1px solid var(--dg-border, #E2E8F0);
206
- font-size: 13px;
207
- color: var(--dg-text-primary, #334155);
208
- vertical-align: middle;
209
- }
210
- .table-dense tr:hover td {
211
- background-color: var(--dg-bg-base, #F8FAFC);
212
- }
213
- ```
214
-
215
- ---
216
-
217
- ## 5. GSAP 动效
218
-
219
- 本地可用插件(全部 GSAP 3.15.0,禁止境外 CDN):
220
-
221
- | 路径 | 插件 | 用途 |
222
- |------|------|------|
223
- | `/assets/vendor/gsap/gsap.min.js` | 核心库 | 必须首先引入 |
224
- | `/assets/vendor/gsap/ScrollTrigger.min.js` | ScrollTrigger | 滚动触发动画 |
225
- | `/assets/vendor/gsap/ScrollToPlugin.min.js` | ScrollToPlugin | 滚动定位 |
226
- | `/assets/vendor/gsap/Observer.min.js` | Observer | 输入事件观察 |
227
- | `/assets/vendor/gsap/Draggable.min.js` | Draggable | 拖拽交互 |
228
- | `/assets/vendor/gsap/Flip.min.js` | Flip | 布局过渡(FLIP) |
229
- | `/assets/vendor/gsap/MotionPathPlugin.min.js` | MotionPathPlugin | 路径动画 |
230
- | `/assets/vendor/gsap/SplitText.min.js` | SplitText | 文字拆分动画 |
231
- | `/assets/vendor/gsap/TextPlugin.min.js` | TextPlugin | 文字逐字动画 |
232
- | `/assets/vendor/gsap/CustomEase.min.js` | CustomEase | 自定义缓动曲线 |
233
- | `/assets/vendor/gsap/EasePack.min.js` | EasePack | 扩展缓动(Bounce/Elastic 等) |
234
- | `/assets/vendor/gsap/DrawSVGPlugin.min.js` | DrawSVGPlugin | SVG 路径描边动画 |
235
- | `/assets/vendor/gsap/MorphSVGPlugin.min.js` | MorphSVGPlugin | SVG 形变动画 |
236
-
237
- 引入方式(按需引入,核心库必须在插件前):
238
- ```html
239
- <script src="/assets/vendor/gsap/gsap.min.js"></script>
240
- <!-- 按需添加插件,例如: -->
241
- <script src="/assets/vendor/gsap/ScrollTrigger.min.js"></script>
242
- <script src="/assets/vendor/gsap/CustomEase.min.js"></script>
243
- ```
244
-
245
- 插件注册(引入后必须注册才能使用):
246
- ```javascript
247
- gsap.registerPlugin(ScrollTrigger, CustomEase);
248
- ```
249
-
250
- 动效设计以"帮助用户理解状态变化"为目标,不固定参数。可优先考虑:
251
-
252
- - 首次加载:列表项有节奏地进入,减少突然跳变
253
- - 翻页 / 筛选:旧数据离场、新数据入场,让变化可感知
254
- - 筛选面板:展开收起保持轻快,不抢夺操作注意力
255
- - filter pill:新增、移除时有明确反馈
256
- - 空态 / 批量操作栏:出现和消失要稳定、清楚、不中断任务
257
-
258
- 具体 `duration`、`stagger`、`ease`、位移距离由页面密度、设备性能和品牌气质决定。
259
-
260
- ### 翻页动效实现示例
261
-
262
- ```javascript
263
- async function switchPage(newData) {
264
- const rows = document.querySelectorAll('.table-dense tbody tr');
265
- await gsap.to(rows, { opacity: 0, y: -8, duration: 0.15, stagger: 0.02 });
266
- renderRows(newData);
267
- const newRows = document.querySelectorAll('.table-dense tbody tr');
268
- gsap.from(newRows, { opacity: 0, y: 12, duration: 0.25, stagger: 0.04, ease: 'power2.out' });
269
- }
270
- ```
271
-
272
- ---
273
-
274
- ## 6. 响应式策略
275
-
276
- | 断点 | 行为 |
277
- |------|------|
278
- | ≥1024px | 完整表格模式 |
279
- | 768–1023px | 隐藏次要列,列配置可恢复 |
280
- | <768px | 切换为卡片列表模式,分页改为「加载更多」按钮 |
281
-
282
- ---
283
-
284
- ## 7. 数据加载模式
285
-
286
- ```javascript
287
- const App = window.parent?.App;
288
- let currentPage = 1, pageSize = 20, totalItems = 0;
289
-
290
- async function loadData() {
291
- const res = await App.get('db/items', {
292
- page: currentPage,
293
- page_size: pageSize,
294
- search: searchKeyword || undefined,
295
- ...activeFilters
296
- });
297
- if (res.code !== 200) { App.showError(res.message || '加载失败'); return; }
298
- const { items, total } = res.data;
299
- totalItems = total;
300
- renderTable(items);
301
- renderPagination();
302
- }
303
- ```
304
-
305
- ### 首次加载骨架屏
306
-
307
- 页面初始化时先渲染 3-5 行骨架占位,异步拿到数据后替换为真实行并播放入场动画。
308
-
309
- ---
310
-
311
- ## 8. 适用范围
312
-
313
- 本规范适用于所有数据列表/表格类页面,包括但不限于:
314
- - 用户管理、角色管理
315
- - 页面管理、导航管理
316
- - 日志列表、反馈列表
317
- - 动态 DB 数据管理
318
- - 任何使用分页展示多条数据的场景
319
-
320
- **优先级**:用户有特殊 UIUX 指示时,以用户指示为准。