@ticatec/uniface-element 0.2.4 → 0.3.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.
Files changed (177) hide show
  1. package/dist/accordion/README.md +169 -0
  2. package/dist/accordion/README_CN.md +176 -0
  3. package/dist/action-bar/README.md +275 -0
  4. package/dist/action-bar/README_CN.md +285 -0
  5. package/dist/app-layout/README.md +374 -0
  6. package/dist/app-layout/README_CN.md +381 -0
  7. package/dist/app-top-bar/README.md +357 -0
  8. package/dist/app-top-bar/README_CN.md +365 -0
  9. package/dist/attachment-files/AttachmentFilesField.svelte +67 -1
  10. package/dist/attachment-files/AttachmentFilesField.svelte.d.ts +8 -1
  11. package/dist/base-calendar/CalendarBase.svelte +0 -3
  12. package/dist/box/README.md +385 -0
  13. package/dist/box/README_CN.md +393 -0
  14. package/dist/breadcrumbs/README.md +442 -0
  15. package/dist/breadcrumbs/README_CN.md +442 -0
  16. package/dist/button/Button.svelte +27 -7
  17. package/dist/button/Button.svelte.d.ts +3 -1
  18. package/dist/button/IconButton.svelte +26 -6
  19. package/dist/button/IconButton.svelte.d.ts +3 -1
  20. package/dist/button/IconButton_README.md +513 -0
  21. package/dist/button/IconButton_README_CN.md +513 -0
  22. package/dist/button/README.md +428 -0
  23. package/dist/button/README_CN.md +428 -0
  24. package/dist/button/TextButton.svelte +26 -6
  25. package/dist/button/TextButton.svelte.d.ts +3 -1
  26. package/dist/button/TextButton_README.md +571 -0
  27. package/dist/button/TextButton_README_CN.md +571 -0
  28. package/dist/card/README.md +666 -0
  29. package/dist/card/README_CN.md +666 -0
  30. package/dist/cascade-options-select/CascadeOptionSelect.svelte +43 -7
  31. package/dist/cascade-options-select/CascadeOptionSelect.svelte.d.ts +3 -4
  32. package/dist/cascade-options-select/README.md +663 -2
  33. package/dist/cascade-options-select/README_CN.md +664 -0
  34. package/dist/checkbox/CheckBox.svelte +20 -6
  35. package/dist/checkbox/CheckBox.svelte.d.ts +4 -2
  36. package/dist/checkbox/README.md +562 -0
  37. package/dist/checkbox/README_CN.md +727 -0
  38. package/dist/common-editor/NumberInput.svelte +39 -26
  39. package/dist/common-editor/NumberInput.svelte.d.ts +5 -1
  40. package/dist/concise-data-table/ConciseListTable.svelte +133 -36
  41. package/dist/concise-data-table/ConciseListTable.svelte.d.ts +8 -1
  42. package/dist/concise-data-table/DataCell.svelte +5 -6
  43. package/dist/concise-data-table/DataRow.svelte +22 -2
  44. package/dist/concise-data-table/DataRow.svelte.d.ts +1 -0
  45. package/dist/concise-data-table/README.md +606 -0
  46. package/dist/concise-data-table/README_CN.md +611 -0
  47. package/dist/context-menu/ContextMenu.svelte +138 -21
  48. package/dist/context-menu/ContextMenu.svelte.d.ts +5 -0
  49. package/dist/context-menu/ContextMenuItem.d.ts +20 -4
  50. package/dist/context-menu/README.md +551 -0
  51. package/dist/context-menu/README_CN.md +551 -0
  52. package/dist/criteria-field/CriteriaField.svelte +3 -5
  53. package/dist/criteria-field/README.md +532 -0
  54. package/dist/criteria-field/README_CN.md +532 -0
  55. package/dist/data-table/README.md +712 -0
  56. package/dist/data-table/README_CN.md +712 -0
  57. package/dist/date-picker/DatePicker.svelte +44 -7
  58. package/dist/date-picker/DatePicker.svelte.d.ts +3 -4
  59. package/dist/date-picker/DateTimePicker.svelte +32 -8
  60. package/dist/date-picker/DateTimePicker.svelte.d.ts +3 -4
  61. package/dist/date-picker/README.md +326 -0
  62. package/dist/date-picker/README_CN.md +316 -0
  63. package/dist/date-picker/ScrollBar.svelte +18 -8
  64. package/dist/date-picker/ScrollBar.svelte.d.ts +1 -1
  65. package/dist/date-picker/TimePanel.svelte +5 -5
  66. package/dist/date-picker/TimePanel.svelte.d.ts +1 -1
  67. package/dist/date-range/README.md +374 -0
  68. package/dist/date-range/README_CN.md +374 -0
  69. package/dist/dialog/README.md +596 -0
  70. package/dist/dialog/README_CN.md +596 -0
  71. package/dist/drawer/README.md +679 -1
  72. package/dist/drawer/README_CN.md +679 -0
  73. package/dist/group-box/group-check-box/GroupCheckBox.svelte +62 -5
  74. package/dist/group-box/group-check-box/GroupCheckBox.svelte.d.ts +7 -2
  75. package/dist/group-box/group-check-box/README.md +749 -0
  76. package/dist/group-box/group-check-box/README_CN.md +750 -0
  77. package/dist/group-box/group-radio-box/GroupRadioBox.svelte +69 -4
  78. package/dist/group-box/group-radio-box/GroupRadioBox.svelte.d.ts +8 -2
  79. package/dist/group-box/group-radio-box/README.md +920 -0
  80. package/dist/group-box/group-radio-box/README_CN.md +920 -0
  81. package/dist/image-files/README.md +1346 -0
  82. package/dist/image-files/README_CN.md +1346 -0
  83. package/dist/input-options-select/InputOptionsSelect.svelte +161 -65
  84. package/dist/input-options-select/InputOptionsSelect.svelte.d.ts +4 -1
  85. package/dist/lib/forwardAllEvents.d.ts +3 -0
  86. package/dist/lib/forwardAllEvents.js +24 -0
  87. package/dist/list-box/README.md +579 -0
  88. package/dist/list-box/README_CN.md +682 -0
  89. package/dist/lookup-editor/LookupEditor.svelte +15 -3
  90. package/dist/lookup-editor/LookupEditor.svelte.d.ts +3 -4
  91. package/dist/lookup-editor/README.md +684 -0
  92. package/dist/lookup-editor/README_CN.md +684 -0
  93. package/dist/memo-editor/MemoEditor.svelte +77 -27
  94. package/dist/memo-editor/MemoEditor.svelte.d.ts +6 -3
  95. package/dist/memo-editor/README.md +819 -0
  96. package/dist/memo-editor/README_CN.md +819 -0
  97. package/dist/message-box/README.md +398 -0
  98. package/dist/message-box/README_CN.md +398 -0
  99. package/dist/number-editor/NumberEditor.svelte +2 -2
  100. package/dist/number-editor/NumberEditor.svelte.d.ts +1 -1
  101. package/dist/number-editor/README.md +353 -22
  102. package/dist/number-editor/README_CN.md +357 -0
  103. package/dist/number-range/README.md +443 -0
  104. package/dist/number-range/README_CN.md +443 -0
  105. package/dist/options-multi-select/OptionsMultiSelect.svelte +87 -12
  106. package/dist/options-multi-select/OptionsMultiSelect.svelte.d.ts +3 -1
  107. package/dist/options-multi-select/README.md +480 -0
  108. package/dist/options-multi-select/README_CN.md +480 -0
  109. package/dist/options-select/OptionsSelect.svelte +36 -5
  110. package/dist/options-select/OptionsSelect.svelte.d.ts +3 -4
  111. package/dist/options-select/README.md +632 -0
  112. package/dist/options-select/README_CN.md +632 -0
  113. package/dist/page/README.md +605 -0
  114. package/dist/page/README_CN.md +605 -0
  115. package/dist/pagination/README.md +946 -0
  116. package/dist/pagination/README_CN.md +946 -0
  117. package/dist/pagination-panel/README.md +1075 -0
  118. package/dist/pagination-panel/README_CN.md +1075 -0
  119. package/dist/popup-hint/README.md +841 -0
  120. package/dist/popup-hint/README_CN.md +840 -0
  121. package/dist/progress-bar/README.md +242 -0
  122. package/dist/progress-bar/README_CN.md +242 -0
  123. package/dist/progress-step-bar/README.md +316 -0
  124. package/dist/progress-step-bar/README_CN.md +316 -0
  125. package/dist/prompts-text-editor/PromptsTextEditor.svelte +6 -3
  126. package/dist/prompts-text-editor/PromptsTextEditor.svelte.d.ts +3 -1
  127. package/dist/prompts-text-editor/README.md +329 -0
  128. package/dist/prompts-text-editor/README_CN.md +329 -0
  129. package/dist/property-editor/README.md +969 -0
  130. package/dist/property-editor/README_CN.md +969 -0
  131. package/dist/radio-button/README.md +372 -0
  132. package/dist/radio-button/README_CN.md +372 -0
  133. package/dist/radio-button/RadioButton.svelte +32 -3
  134. package/dist/radio-button/RadioButton.svelte.d.ts +12 -1
  135. package/dist/search-box/README.md +425 -0
  136. package/dist/search-box/README_CN.md +424 -0
  137. package/dist/search-box/SearchBox.svelte +22 -6
  138. package/dist/search-box/SearchBox.svelte.d.ts +4 -1
  139. package/dist/tabs/README.md +919 -0
  140. package/dist/tabs/README_CN.md +920 -0
  141. package/dist/tag/README.md +922 -0
  142. package/dist/tag/README_CN.md +922 -0
  143. package/dist/text-editor/PasswordEditor.svelte +17 -2
  144. package/dist/text-editor/PasswordEditor.svelte.d.ts +3 -3
  145. package/dist/text-editor/PasswordEditor_README.md +551 -0
  146. package/dist/text-editor/PasswordEditor_README_CN.md +551 -0
  147. package/dist/text-editor/README.md +466 -0
  148. package/dist/text-editor/README_CN.md +466 -0
  149. package/dist/text-editor/TextEditor.svelte +51 -19
  150. package/dist/text-editor/TextEditor.svelte.d.ts +0 -1
  151. package/dist/ticatec-uniface-web.css +2 -0
  152. package/dist/time-editor/README.md +498 -24
  153. package/dist/time-editor/README_CN.md +498 -0
  154. package/dist/time-editor/TimeEditor.svelte +7 -3
  155. package/dist/time-editor/TimeEditor.svelte.d.ts +3 -1
  156. package/dist/toast/README.md +667 -0
  157. package/dist/toast/README_CN.md +667 -0
  158. package/dist/transfer/README.md +795 -0
  159. package/dist/transfer/Transfer.svelte +6 -4
  160. package/dist/transfer/Transfer.svelte.d.ts +3 -1
  161. package/dist/tree-view/README.md +761 -0
  162. package/dist/tree-view/README_CN.md +761 -0
  163. package/dist/tree-view/TreeView.svelte +5 -3
  164. package/dist/tree-view/TreeView.svelte.d.ts +3 -1
  165. package/dist/unit-number-editor/README.md +546 -20
  166. package/dist/unit-number-editor/README_CN.md +525 -0
  167. package/dist/unit-number-editor/UnitNumberEditor.svelte +62 -8
  168. package/dist/unit-number-editor/UnitNumberEditor.svelte.d.ts +5 -1
  169. package/docs/form-field/cn/README_CN.md +364 -0
  170. package/docs/form-field/en/README.md +364 -0
  171. package/docs/form-panel/flex-form/cn/README_CN.md +586 -0
  172. package/docs/form-panel/flex-form/en/README.md +586 -0
  173. package/docs/form-panel/flex-row-form/cn/README_CN.md +787 -0
  174. package/docs/form-panel/flex-row-form/en/README.md +787 -0
  175. package/docs/form-panel/grid-form/en/README.md +744 -0
  176. package/package.json +1 -1
  177. package/dist/drawer/README-CN.md +0 -1
@@ -0,0 +1,442 @@
1
+ # 面包屑组件
2
+
3
+ 一个导航组件,显示用户在层次结构中的当前位置,帮助用户了解他们所在的位置并导航回之前的层级。
4
+
5
+ ## 功能特性
6
+
7
+ - **层次导航**: 显示从根目录到当前位置的路径
8
+ - **可点击项目**: 导航到任何先前的层级(当前项除外)
9
+ - **自定义分隔符**: 可配置面包屑项目之间的分隔符
10
+ - **自定义数据**: 与面包屑项目关联任何数据
11
+ - **点击处理器**: 导航操作的自定义逻辑
12
+ - **响应式**: 适应容器宽度
13
+
14
+ ## 基本用法
15
+
16
+ ```svelte
17
+ <script>
18
+ import Breadcrumbs, { type Breadcrumb } from '@ticatec/uniface-element/Breadcrumbs';
19
+
20
+ const breadcrumbItems: Breadcrumb[] = [
21
+ { label: '首页', data: { path: '/' } },
22
+ { label: '产品', data: { path: '/products' } },
23
+ { label: '电子产品', data: { path: '/products/electronics' } },
24
+ { label: '智能手机', data: { path: '/products/electronics/smartphones' } }
25
+ ];
26
+
27
+ const handleItemClick = (data: any) => (event: MouseEvent) => {
28
+ console.log('导航到:', data.path);
29
+ // 处理导航逻辑
30
+ };
31
+ </script>
32
+
33
+ <Breadcrumbs
34
+ items={breadcrumbItems}
35
+ onItemClick={handleItemClick}
36
+ />
37
+ ```
38
+
39
+ ## 属性参数
40
+
41
+ | 属性 | 类型 | 默认值 | 描述 |
42
+ |------|------|---------|-------------|
43
+ | `items` | `Breadcrumb[]` | `[]` | 面包屑项目数组 |
44
+ | `separator` | `string` | `"/"` | 项目之间的分隔符字符 |
45
+ | `onItemClick` | `(item: any) => (event: MouseEvent) => void` | - | 面包屑项目的点击处理器 |
46
+ | `style` | `string` | `''` | 自定义CSS样式 |
47
+
48
+ ## 面包屑接口
49
+
50
+ ```typescript
51
+ interface Breadcrumb {
52
+ label: string; // 面包屑的显示文本
53
+ data: any; // 关联数据(如路由、ID等)
54
+ }
55
+ ```
56
+
57
+ ## 使用示例
58
+
59
+ ### 基础文件系统导航
60
+
61
+ ```svelte
62
+ <script>
63
+ const fileSystemPath = [
64
+ { label: '文档', data: { path: '/documents' } },
65
+ { label: '项目', data: { path: '/documents/projects' } },
66
+ { label: '我的应用', data: { path: '/documents/projects/myapp' } },
67
+ { label: 'src', data: { path: '/documents/projects/myapp/src' } }
68
+ ];
69
+
70
+ const navigateToFolder = (data: any) => (event: MouseEvent) => {
71
+ window.location.href = data.path;
72
+ };
73
+ </script>
74
+
75
+ <Breadcrumbs
76
+ items={fileSystemPath}
77
+ onItemClick={navigateToFolder}
78
+ separator=" > "
79
+ />
80
+ ```
81
+
82
+ ### 电商分类导航
83
+
84
+ ```svelte
85
+ <script>
86
+ const categoryPath = [
87
+ { label: '所有分类', data: { categoryId: null } },
88
+ { label: '电子产品', data: { categoryId: 'electronics' } },
89
+ { label: '计算机', data: { categoryId: 'computers' } },
90
+ { label: '笔记本电脑', data: { categoryId: 'laptops' } }
91
+ ];
92
+
93
+ const goToCategory = (data: any) => (event: MouseEvent) => {
94
+ if (data.categoryId) {
95
+ router.push(`/category/${data.categoryId}`);
96
+ } else {
97
+ router.push('/categories');
98
+ }
99
+ };
100
+ </script>
101
+
102
+ <Breadcrumbs
103
+ items={categoryPath}
104
+ onItemClick={goToCategory}
105
+ separator=" › "
106
+ />
107
+ ```
108
+
109
+ ### 管理面板导航
110
+
111
+ ```svelte
112
+ <script>
113
+ const adminPath = [
114
+ { label: '仪表板', data: { route: '/admin' } },
115
+ { label: '用户管理', data: { route: '/admin/users' } },
116
+ { label: '编辑用户', data: { route: '/admin/users/edit', userId: 123 } }
117
+ ];
118
+
119
+ const navigateToAdminPage = (data: any) => (event: MouseEvent) => {
120
+ // 自定义导航逻辑
121
+ adminRouter.navigate(data.route);
122
+ };
123
+ </script>
124
+
125
+ <Breadcrumbs
126
+ items={adminPath}
127
+ onItemClick={navigateToAdminPage}
128
+ />
129
+ ```
130
+
131
+ ### 文档站点
132
+
133
+ ```svelte
134
+ <script>
135
+ const docsPath = [
136
+ { label: '文档', data: { section: 'home' } },
137
+ { label: '组件', data: { section: 'components' } },
138
+ { label: '表单控件', data: { section: 'forms' } },
139
+ { label: '文本编辑器', data: { section: 'texteditor' } }
140
+ ];
141
+
142
+ const goToDocsSection = (data: any) => (event: MouseEvent) => {
143
+ scrollToSection(data.section);
144
+ };
145
+ </script>
146
+
147
+ <Breadcrumbs
148
+ items={docsPath}
149
+ onItemClick={goToDocsSection}
150
+ separator=" • "
151
+ />
152
+ ```
153
+
154
+ ### 带图标的自定义分隔符
155
+
156
+ ```svelte
157
+ <script>
158
+ const projectPath = [
159
+ { label: '工作区', data: { id: 'workspace' } },
160
+ { label: '项目 Alpha', data: { id: 'project-alpha' } },
161
+ { label: '设置', data: { id: 'settings' } }
162
+ ];
163
+ </script>
164
+
165
+ <Breadcrumbs
166
+ items={projectPath}
167
+ onItemClick={handleNavigation}
168
+ separator=" 🔹 "
169
+ style="font-size: 14px; color: #666;"
170
+ />
171
+ ```
172
+
173
+ ### 自定义样式
174
+
175
+ ```svelte
176
+ <Breadcrumbs
177
+ items={breadcrumbs}
178
+ onItemClick={navigate}
179
+ separator=" / "
180
+ style="
181
+ background: #f8f9fa;
182
+ padding: 8px 16px;
183
+ border-radius: 4px;
184
+ font-size: 13px;
185
+ "
186
+ />
187
+ ```
188
+
189
+ ### 动态面包屑
190
+
191
+ ```svelte
192
+ <script>
193
+ let currentPath = [];
194
+
195
+ // 基于当前路由构建面包屑
196
+ $: breadcrumbs = buildBreadcrumbs($page.url.pathname);
197
+
198
+ function buildBreadcrumbs(pathname) {
199
+ const segments = pathname.split('/').filter(Boolean);
200
+ const items = [{ label: '首页', data: { path: '/' } }];
201
+
202
+ let currentPath = '';
203
+ segments.forEach(segment => {
204
+ currentPath += `/${segment}`;
205
+ items.push({
206
+ label: formatSegment(segment),
207
+ data: { path: currentPath }
208
+ });
209
+ });
210
+
211
+ return items;
212
+ }
213
+
214
+ function formatSegment(segment) {
215
+ return segment.charAt(0).toUpperCase() + segment.slice(1);
216
+ }
217
+
218
+ const navigateTo = (data) => (event) => {
219
+ goto(data.path);
220
+ };
221
+ </script>
222
+
223
+ <Breadcrumbs
224
+ items={breadcrumbs}
225
+ onItemClick={navigateTo}
226
+ />
227
+ ```
228
+
229
+ ## 行为特性
230
+
231
+ ### 点击交互
232
+ - 除最后一项外,所有面包屑项目都可点击
233
+ - 最后一项(当前位置)不可点击,显示为纯文本
234
+ - 点击处理器接收来自面包屑项目的关联数据对象
235
+
236
+ ### 导航模式
237
+ - 通常用于层次导航
238
+ - 帮助用户了解当前位置
239
+ - 提供快速访问父级层级的方式
240
+
241
+ ## 样式定制
242
+
243
+ 组件使用以下CSS类:
244
+
245
+ - `.uniface-breadcrumbs` - 主容器
246
+ - `.breadcrumb` - 单个面包屑项目
247
+
248
+ ### CSS示例
249
+
250
+ ```css
251
+ .uniface-breadcrumbs {
252
+ display: flex;
253
+ align-items: center;
254
+ flex-wrap: wrap;
255
+ gap: 4px;
256
+ font-size: 14px;
257
+ color: #666;
258
+ }
259
+
260
+ .breadcrumb {
261
+ cursor: pointer;
262
+ color: #007acc;
263
+ text-decoration: none;
264
+ }
265
+
266
+ .breadcrumb:hover {
267
+ text-decoration: underline;
268
+ }
269
+
270
+ .breadcrumb:last-child {
271
+ cursor: default;
272
+ color: #333;
273
+ font-weight: 500;
274
+ }
275
+
276
+ /* 响应式设计 */
277
+ @media (max-width: 768px) {
278
+ .uniface-breadcrumbs {
279
+ font-size: 12px;
280
+ }
281
+ }
282
+ ```
283
+
284
+ ## 常见模式
285
+
286
+ ### 页面标题集成
287
+
288
+ ```svelte
289
+ <div class="page-header">
290
+ <Breadcrumbs items={breadcrumbs} onItemClick={navigate} />
291
+ <h1>{currentPageTitle}</h1>
292
+ </div>
293
+ ```
294
+
295
+ ### 带加载状态
296
+
297
+ ```svelte
298
+ <script>
299
+ let loading = false;
300
+ let breadcrumbs = [];
301
+
302
+ const loadBreadcrumbs = async (pageId) => {
303
+ loading = true;
304
+ try {
305
+ breadcrumbs = await fetchBreadcrumbs(pageId);
306
+ } finally {
307
+ loading = false;
308
+ }
309
+ };
310
+ </script>
311
+
312
+ {#if loading}
313
+ <div class="breadcrumb-skeleton">加载中...</div>
314
+ {:else}
315
+ <Breadcrumbs items={breadcrumbs} onItemClick={navigate} />
316
+ {/if}
317
+ ```
318
+
319
+ ### 截断长路径
320
+
321
+ ```svelte
322
+ <script>
323
+ const MAX_ITEMS = 4;
324
+
325
+ $: displayItems = breadcrumbs.length > MAX_ITEMS
326
+ ? [
327
+ breadcrumbs[0],
328
+ { label: '...', data: { truncated: true } },
329
+ ...breadcrumbs.slice(-2)
330
+ ]
331
+ : breadcrumbs;
332
+
333
+ const handleClick = (data) => (event) => {
334
+ if (data.truncated) {
335
+ // 显示包含隐藏项目的下拉菜单
336
+ showFullPath = true;
337
+ return;
338
+ }
339
+ navigate(data);
340
+ };
341
+ </script>
342
+
343
+ <Breadcrumbs
344
+ items={displayItems}
345
+ onItemClick={handleClick}
346
+ />
347
+ ```
348
+
349
+ ## 无障碍访问
350
+
351
+ - 使用语义导航结构
352
+ - 为可点击和不可点击项目提供清晰的视觉区别
353
+ - 确保足够的颜色对比度
354
+ - 考虑为屏幕阅读器提供ARIA标签
355
+
356
+ ```svelte
357
+ <nav aria-label="面包屑导航">
358
+ <Breadcrumbs items={breadcrumbs} onItemClick={navigate} />
359
+ </nav>
360
+ ```
361
+
362
+ ## 路由集成
363
+
364
+ ### SvelteKit集成
365
+
366
+ ```svelte
367
+ <script>
368
+ import { page } from '$app/stores';
369
+ import { goto } from '$app/navigation';
370
+
371
+ $: breadcrumbs = generateBreadcrumbs($page.route.id);
372
+
373
+ function generateBreadcrumbs(routeId) {
374
+ // 基于路由结构生成面包屑
375
+ return routeSegments.map(segment => ({
376
+ label: segment.title,
377
+ data: { path: segment.path }
378
+ }));
379
+ }
380
+
381
+ const navigate = (data) => (event) => {
382
+ goto(data.path);
383
+ };
384
+ </script>
385
+
386
+ <Breadcrumbs items={breadcrumbs} onItemClick={navigate} />
387
+ ```
388
+
389
+ ### React Router集成
390
+
391
+ ```javascript
392
+ // 仅供参考 - 类似模式可以适配
393
+ const breadcrumbs = useBreadcrumbs(routes);
394
+ ```
395
+
396
+ ## 最佳实践
397
+
398
+ 1. **清晰层次**: 确保面包屑反映逻辑层次结构
399
+ 2. **一致命名**: 在类似页面中使用一致的标签
400
+ 3. **响应式设计**: 考虑面包屑在移动设备上的显示方式
401
+ 4. **性能**: 不要过度嵌套面包屑层级
402
+ 5. **用户上下文**: 基于用户入口点显示相关路径
403
+ 6. **跳过导航**: 为无障碍访问提供跳过链接
404
+
405
+ ## 移动设备考虑
406
+
407
+ 对于移动设备,考虑:
408
+
409
+ ```css
410
+ @media (max-width: 480px) {
411
+ .uniface-breadcrumbs {
412
+ overflow-x: auto;
413
+ white-space: nowrap;
414
+ }
415
+
416
+ /* 或者只显示父级和当前页面 */
417
+ .breadcrumb:not(:nth-last-child(2)):not(:last-child) {
418
+ display: none;
419
+ }
420
+ }
421
+ ```
422
+
423
+ ## 测试
424
+
425
+ 测试面包屑时:
426
+
427
+ ```javascript
428
+ // 测试导航
429
+ const breadcrumbs = [
430
+ { label: '首页', data: { path: '/' } },
431
+ { label: '产品', data: { path: '/products' } }
432
+ ];
433
+
434
+ const mockNavigate = vi.fn();
435
+ render(Breadcrumbs, {
436
+ props: { items: breadcrumbs, onItemClick: mockNavigate }
437
+ });
438
+
439
+ // 点击第一个面包屑
440
+ fireEvent.click(screen.getByText('首页'));
441
+ expect(mockNavigate).toHaveBeenCalledWith({ path: '/' });
442
+ ```
@@ -2,13 +2,15 @@
2
2
 
3
3
  import type {ButtonType} from "./ButtonType";
4
4
 
5
- export let type: ButtonType = 'default'; // 默认按钮类型
5
+ export let type: ButtonType = 'default';
6
6
  export let label: string = '';
7
7
  export let variant: 'plain' | 'round' | '' = '';
8
8
  export let disabled: boolean = false;
9
9
  export let style: string = '';
10
10
  export let size: 'big' | 'medium' | 'mini' = 'medium';
11
- export let onClick: (event: MouseEvent) => void;
11
+ export let onclick: (event: MouseEvent) => void;
12
+ export let onfocus: (event: FocusEvent) => void = () => {};
13
+ export let onblur: (event: FocusEvent) => void = () => {};
12
14
  export let icon: string | null = null;
13
15
 
14
16
  let enableClick: boolean = true;
@@ -16,19 +18,37 @@
16
18
  const handleClick = (e: MouseEvent) => {
17
19
  if (!disabled && enableClick) {
18
20
  enableClick = false;
19
- onClick?.(e);
21
+ onclick?.(e);
20
22
  setTimeout(() => {
21
23
  enableClick = true
22
24
  }, 500);
23
25
  }
24
26
  e.stopPropagation();
25
- e.preventDefault();
27
+ }
28
+
29
+ const handleFocus = (e: FocusEvent) => {
30
+ if (!disabled) {
31
+ onfocus?.(e);
32
+ }
33
+ }
34
+
35
+ const handleBlur = (e: FocusEvent) => {
36
+ if (!disabled) {
37
+ onblur?.(e);
38
+ }
26
39
  }
27
40
 
28
41
  </script>
29
42
 
30
- <div {style} class="uniface-button common-button {variant} {size} {type}" aria-hidden="true" class:disabled
31
- on:click={handleClick}>
43
+ <button
44
+ {style}
45
+ class="uniface-button common-button {variant} {size} {type}"
46
+ class:disabled
47
+ {disabled}
48
+ on:click={handleClick}
49
+ on:focus={handleFocus}
50
+ on:blur={handleBlur}
51
+ >
32
52
  {#if icon != null}
33
53
  <i class={icon}></i>
34
54
  {/if}
@@ -37,5 +57,5 @@
37
57
  <span style="flex: 1 1 auto">{label}</span>
38
58
  {/if}
39
59
  </slot>
40
- </div>
60
+ </button>
41
61
 
@@ -24,7 +24,9 @@ declare const Button: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWit
24
24
  disabled?: boolean;
25
25
  style?: string;
26
26
  size?: "big" | "medium" | "mini";
27
- onClick: (event: MouseEvent) => void;
27
+ onclick: (event: MouseEvent) => void;
28
+ onfocus?: (event: FocusEvent) => void;
29
+ onblur?: (event: FocusEvent) => void;
28
30
  icon?: string | null;
29
31
  }, {
30
32
  default: {};
@@ -5,27 +5,47 @@
5
5
  export let size: 'big' | 'medium' | 'mini' = 'medium';
6
6
  export let style: string = '';
7
7
  export let icon: string = '';
8
- export let onClick: (event: MouseEvent) => void;
9
-
8
+ export let onclick: (event: MouseEvent) => void;
9
+ export let onfocus: (event: FocusEvent) => void = () => {};
10
+ export let onblur: (event: FocusEvent) => void = () => {};
10
11
 
11
12
  let enableClick: boolean = true;
12
13
 
13
14
  const handleClick = (e: MouseEvent) => {
14
15
  if (!disabled && enableClick) {
15
16
  enableClick = false;
16
- onClick?.(e);
17
+ onclick?.(e);
17
18
  setTimeout(() => {
18
19
  enableClick = true
19
20
  }, 500);
20
21
  }
21
22
  e.stopPropagation();
22
- e.preventDefault();
23
+ }
24
+
25
+ const handleFocus = (e: FocusEvent) => {
26
+ if (!disabled) {
27
+ onfocus?.(e);
28
+ }
29
+ }
30
+
31
+ const handleBlur = (e: FocusEvent) => {
32
+ if (!disabled) {
33
+ onblur?.(e);
34
+ }
23
35
  }
24
36
 
25
37
  </script>
26
38
 
27
- <div {style} class="uniface-button icon-button {size} {type}" aria-hidden="true" class:disabled on:click={handleClick}>
39
+ <button
40
+ {style}
41
+ class="uniface-button icon-button {size} {type}"
42
+ class:disabled
43
+ {disabled}
44
+ on:click={handleClick}
45
+ on:focus={handleFocus}
46
+ on:blur={handleBlur}
47
+ >
28
48
  <slot>
29
49
  <i class={icon}></i>
30
50
  </slot>
31
- </div>
51
+ </button>
@@ -22,7 +22,9 @@ declare const IconButton: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_Prop
22
22
  size?: "big" | "medium" | "mini";
23
23
  style?: string;
24
24
  icon?: string;
25
- onClick: (event: MouseEvent) => void;
25
+ onclick: (event: MouseEvent) => void;
26
+ onfocus?: (event: FocusEvent) => void;
27
+ onblur?: (event: FocusEvent) => void;
26
28
  }, {
27
29
  default: {};
28
30
  }>, {