@ticatec/uniface-element 0.2.0 → 0.2.2

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 (209) hide show
  1. package/README.md +320 -1
  2. package/README_CN.md +392 -0
  3. package/dist/accordion/Accordion.svelte +1 -1
  4. package/dist/action-bar/ActionBar.svelte +7 -1
  5. package/dist/attachment-files/FileRender.svelte +1 -1
  6. package/dist/attachment-files/FileUploadBar.svelte +7 -6
  7. package/dist/attachment-files/FileUploadPanel.svelte +2 -2
  8. package/dist/base-calendar/DateContext.js +5 -4
  9. package/dist/base-calendar/YearPickupPanel.svelte +4 -4
  10. package/dist/card/Card.svelte +1 -1
  11. package/dist/card/Card.svelte.d.ts +1 -1
  12. package/dist/cascade-options-select/CascadeOptionSelect.svelte +2 -3
  13. package/dist/cascade-options-select/CascadeOptionSelect.svelte.d.ts +46 -1
  14. package/dist/cascade-options-select/CascadePanel.svelte +1 -1
  15. package/dist/checkbox/CheckBox.svelte +1 -1
  16. package/dist/color-picker/ColorPicker.svelte +9 -9
  17. package/dist/color-picker/ColorPicker.svelte.d.ts +0 -2
  18. package/dist/color-picker/ColorPickerPanel.svelte +11 -15
  19. package/dist/color-picker/ColorPickerPanel.svelte.d.ts +1 -1
  20. package/dist/common/CommonPicker.svelte +2 -2
  21. package/dist/common/CommonPicker.svelte.d.ts +1 -1
  22. package/dist/common/MouseClickHandler.d.ts +1 -1
  23. package/dist/common/Popover.svelte +28 -6
  24. package/dist/common/Popover.svelte.d.ts +9 -3
  25. package/dist/common/uniface-utils.js +6 -4
  26. package/dist/common-editor/CommonEditor.svelte +1 -1
  27. package/dist/common-editor/CommonEditor.svelte.d.ts +1 -1
  28. package/dist/common-editor/NumberInput.svelte +1 -1
  29. package/dist/common-editor/NumberInput.svelte.d.ts +1 -1
  30. package/dist/concise-data-table/ConciseListTable.svelte +7 -2
  31. package/dist/concise-data-table/ConciseListTable.svelte.d.ts +1 -0
  32. package/dist/concise-data-table/DataRow.svelte +1 -1
  33. package/dist/concise-data-table/TableOptions.d.ts +1 -1
  34. package/dist/data-table/DataTable.svelte +1 -1
  35. package/dist/data-table/parts/ActionsPanel.svelte +4 -3
  36. package/dist/data-table/parts/ActionsRow.svelte +3 -3
  37. package/dist/data-table/parts/ContentPanel.svelte +3 -2
  38. package/dist/data-table/parts/FixedColumnsPanel.svelte +0 -1
  39. package/dist/data-table/parts/FixedColumnsPanel.svelte.d.ts +1 -2
  40. package/dist/data-table/parts/FixedHeaderPanel.svelte +2 -2
  41. package/dist/data-table/parts/FixedRow.svelte +2 -1
  42. package/dist/data-table/parts/FixedRow.svelte.d.ts +1 -1
  43. package/dist/data-table/parts/HrefCell.svelte +23 -2
  44. package/dist/data-table/parts/PopupMenu.svelte +25 -2
  45. package/dist/data-table/parts/PopupMenu.svelte.d.ts +8 -1
  46. package/dist/date-picker/DatePicker.svelte +0 -1
  47. package/dist/date-picker/DateTimePicker.svelte +3 -3
  48. package/dist/date-picker/ScrollBar.svelte +4 -7
  49. package/dist/date-range/DateRangeEditor.svelte +1 -1
  50. package/dist/dialog/CommonDialog.svelte +8 -5
  51. package/dist/dialog/CommonDialog.svelte.d.ts +2 -1
  52. package/dist/dialog/Dialog.svelte +37 -12
  53. package/dist/dialog/Dialog.svelte.d.ts +4 -3
  54. package/dist/dialog/DialogBoard.svelte +11 -8
  55. package/dist/dialog/DialogWrapper.svelte +10 -0
  56. package/dist/{common-editor/DateInput.svelte.d.ts → dialog/DialogWrapper.svelte.d.ts} +6 -13
  57. package/dist/dialog/Dialogs.js +1 -1
  58. package/dist/dialog/ModalResult.d.ts +5 -0
  59. package/dist/dialog/ModalResult.js +5 -0
  60. package/dist/drawer/Drawer.svelte +1 -1
  61. package/dist/form-field/FormField.svelte +2 -1
  62. package/dist/form-field/FormField.svelte.d.ts +1 -0
  63. package/dist/form-panel/flex-row-form/FormContainer.svelte +1 -1
  64. package/dist/form-panel/grid-form/EmptyCell.svelte +8 -7
  65. package/dist/form-panel/grid-form/EmptyCell.svelte.d.ts +2 -2
  66. package/dist/form-panel/grid-form/GridField.svelte +1 -1
  67. package/dist/i18nRes/i18nRes.d.ts +2 -0
  68. package/dist/i18nRes/i18nRes.js +44 -0
  69. package/dist/i18nRes/index.d.ts +2 -0
  70. package/dist/i18nRes/index.js +2 -0
  71. package/dist/image-files/ImageFilesField.svelte +1 -1
  72. package/dist/indicator/IndicatorBoard.svelte +1 -1
  73. package/dist/inline-cell-editor/InvalidEditor.svelte +1 -0
  74. package/dist/input-options-select/InputOptionsSelect.svelte +6 -6
  75. package/dist/input-options-select/InputOptionsSelect.svelte.d.ts +1 -1
  76. package/dist/layout/flex/FlexBlock.svelte +1 -1
  77. package/dist/lookup-editor/LookupEditor.svelte +1 -1
  78. package/dist/memo-editor/MemoEditor.svelte +2 -2
  79. package/dist/message-box/IMessageBox.d.ts +2 -4
  80. package/dist/message-box/IMessageBox.js +4 -6
  81. package/dist/message-box/MessageBoxBoard.svelte +1 -3
  82. package/dist/options-multi-select/OptionsMultiSelect.svelte +1 -1
  83. package/dist/prompts-text-editor/PromptsTextEditor.svelte +2 -2
  84. package/dist/prompts-text-editor/PromptsTextEditor.svelte.d.ts +1 -1
  85. package/dist/property-editor/PropertyEditor.svelte +3 -3
  86. package/dist/text-editor/PasswordEditor.svelte +1 -1
  87. package/dist/transfer/Transfer.svelte +17 -12
  88. package/dist/transfer/Transfer.svelte.d.ts +0 -1
  89. package/dist/unit-number-editor/UnitNumberEditor.svelte +2 -2
  90. package/docs/buttons/cn/ActionBar.md +459 -0
  91. package/docs/buttons/cn/Button.md +228 -0
  92. package/docs/buttons/cn/IconButton.md +294 -0
  93. package/docs/buttons/cn/README.md +600 -0
  94. package/docs/buttons/cn/TextButton.md +163 -0
  95. package/docs/buttons/en/ActionBar.md +459 -0
  96. package/docs/buttons/en/Button.md +228 -0
  97. package/docs/buttons/en/IconButton.md +294 -0
  98. package/docs/buttons/en/README.md +600 -0
  99. package/docs/buttons/en/TextButton.md +163 -0
  100. package/docs/containers/cn/accordion.md +622 -0
  101. package/docs/containers/cn/box.md +445 -0
  102. package/docs/containers/cn/card.md +404 -0
  103. package/docs/containers/cn/page.md +576 -0
  104. package/docs/containers/cn/tabs.md +686 -0
  105. package/docs/containers/en/accordion.md +622 -0
  106. package/docs/containers/en/box.md +445 -0
  107. package/docs/containers/en/card.md +404 -0
  108. package/docs/containers/en/page.md +576 -0
  109. package/docs/containers/en/tabs.md +686 -0
  110. package/docs/data-display/cn/concise-data-table.md +731 -0
  111. package/docs/data-display/cn/listbox.md +786 -0
  112. package/docs/data-display/cn/treeview.md +863 -0
  113. package/docs/data-display/en/concise-data-table.md +732 -0
  114. package/docs/data-display/en/listbox.md +786 -0
  115. package/docs/data-display/en/treeview.md +863 -0
  116. package/docs/data-table/cn/README.md +596 -0
  117. package/docs/data-table/en/README.md +596 -0
  118. package/docs/dialog/cn/README.md +767 -0
  119. package/docs/dialog/en/README.md +767 -0
  120. package/docs/form/cn/README.md +847 -0
  121. package/docs/form/en/README.md +847 -0
  122. package/docs/form-components/cn/README.md +495 -0
  123. package/docs/form-components/cn/attachmentfilesfield.md +757 -0
  124. package/docs/form-components/cn/cascade-options-select.md +374 -0
  125. package/docs/form-components/cn/checkbox.md +58 -0
  126. package/docs/form-components/cn/date-picker.md +138 -0
  127. package/docs/form-components/cn/datetime-picker.md +228 -0
  128. package/docs/form-components/cn/group-checkbox.md +405 -0
  129. package/docs/form-components/cn/group-radiobox.md +525 -0
  130. package/docs/form-components/cn/imagefilesfield.md +651 -0
  131. package/docs/form-components/cn/input-options-select.md +250 -0
  132. package/docs/form-components/cn/lookup-editor.md +406 -0
  133. package/docs/form-components/cn/memoeditor.md +409 -0
  134. package/docs/form-components/cn/number-editor.md +261 -0
  135. package/docs/form-components/cn/options-multi-select.md +177 -0
  136. package/docs/form-components/cn/options-select.md +83 -0
  137. package/docs/form-components/cn/passwordeditor.md +538 -0
  138. package/docs/form-components/cn/prompts-text-editor.md +241 -0
  139. package/docs/form-components/cn/radiobutton.md +84 -0
  140. package/docs/form-components/cn/switch.md +178 -0
  141. package/docs/form-components/cn/text-editor.md +142 -0
  142. package/docs/form-components/cn/time-editor.md +159 -0
  143. package/docs/form-components/cn/unit-number-editor.md +164 -0
  144. package/docs/form-components/en/README.md +463 -0
  145. package/docs/form-components/en/attachmentfilesfield.md +757 -0
  146. package/docs/form-components/en/cascade-options-select.md +358 -0
  147. package/docs/form-components/en/checkbox.md +59 -0
  148. package/docs/form-components/en/date-picker.md +138 -0
  149. package/docs/form-components/en/datetime-picker.md +228 -0
  150. package/docs/form-components/en/group-checkbox.md +395 -0
  151. package/docs/form-components/en/group-radiobox.md +498 -0
  152. package/docs/form-components/en/imagefilesfield.md +651 -0
  153. package/docs/form-components/en/input-options-select.md +239 -0
  154. package/docs/form-components/en/lookup-editor.md +389 -0
  155. package/docs/form-components/en/memoeditor.md +409 -0
  156. package/docs/form-components/en/number-editor.md +249 -0
  157. package/docs/form-components/en/options-multi-select.md +177 -0
  158. package/docs/form-components/en/options-select.md +83 -0
  159. package/docs/form-components/en/passwordeditor.md +538 -0
  160. package/docs/form-components/en/prompts-text-editor.md +241 -0
  161. package/docs/form-components/en/radiobutton.md +84 -0
  162. package/docs/form-components/en/switch.md +180 -0
  163. package/docs/form-components/en/text-editor.md +142 -0
  164. package/docs/form-components/en/time-editor.md +159 -0
  165. package/docs/form-components/en/unit-number-editor.md +164 -0
  166. package/docs/form-layout/cn/criteria-field.md +652 -0
  167. package/docs/form-layout/cn/flex-form.md +454 -0
  168. package/docs/form-layout/cn/flex-row-form.md +542 -0
  169. package/docs/form-layout/cn/form-field.md +923 -0
  170. package/docs/form-layout/cn/grid-form.md +676 -0
  171. package/docs/form-layout/en/criteria-field.md +652 -0
  172. package/docs/form-layout/en/flex-form.md +454 -0
  173. package/docs/form-layout/en/flex-row-form.md +542 -0
  174. package/docs/form-layout/en/form-field.md +923 -0
  175. package/docs/form-layout/en/grid-form.md +676 -0
  176. package/docs/global/cn/README.md +534 -0
  177. package/docs/global/en/README.md +534 -0
  178. package/docs/layout/cn/classiclayout.md +460 -0
  179. package/docs/layout/cn/headerlayout.md +524 -0
  180. package/docs/layout/cn/sidebarlayout.md +263 -0
  181. package/docs/layout/en/classiclayout.md +951 -0
  182. package/docs/layout/en/headerlayout.md +524 -0
  183. package/docs/layout/en/sidebarlayout.md +262 -0
  184. package/docs/misc/cn/README.md +1217 -0
  185. package/docs/misc/en/README.md +1217 -0
  186. package/docs/navigation/cn/breadcrumb.md +291 -0
  187. package/docs/navigation/cn/navigator.md +322 -0
  188. package/docs/navigation/cn/navigatormenu.md +512 -0
  189. package/docs/navigation/cn/progressbar.md +199 -0
  190. package/docs/navigation/cn/progressstepbar.md +299 -0
  191. package/docs/navigation/en/breadcrumb.md +291 -0
  192. package/docs/navigation/en/navigator.md +322 -0
  193. package/docs/navigation/en/navigatormenu.md +512 -0
  194. package/docs/navigation/en/progressbar.md +199 -0
  195. package/docs/navigation/en/progressstepbar.md +299 -0
  196. package/docs/search-filters/cn/daterange.md +1156 -0
  197. package/docs/search-filters/cn/numberrange.md +688 -0
  198. package/docs/search-filters/cn/searchbox.md +1582 -0
  199. package/docs/search-filters/en/daterange.md +1156 -0
  200. package/docs/search-filters/en/numberrange.md +688 -0
  201. package/docs/search-filters/en/searchbox.md +1582 -0
  202. package/package.json +53 -13
  203. package/dist/common-editor/DateInput.svelte +0 -27
  204. package/dist/i18n_resources/index.d.ts +0 -3
  205. package/dist/i18n_resources/index.js +0 -3
  206. /package/dist/{i18n_resources → i18nRes}/uniface_cn_resource.d.ts +0 -0
  207. /package/dist/{i18n_resources → i18nRes}/uniface_cn_resource.js +0 -0
  208. /package/dist/{i18n_resources → i18nRes}/uniface_en_resource.d.ts +0 -0
  209. /package/dist/{i18n_resources → i18nRes}/uniface_en_resource.js +0 -0
@@ -0,0 +1,600 @@
1
+ # 按钮组件系统
2
+
3
+ Uniface Element 按钮系统为 Svelte 应用程序提供了全面的交互式按钮组件集。它包括标准按钮、文本按钮、图标按钮和用于组织多个操作的灵活操作栏组件。
4
+
5
+ ## 组件概览
6
+
7
+ 按钮系统由四个主要组件组成,每个组件都有特定的用途和设计目标:
8
+
9
+ ### [Button 组件](./Button.md)
10
+ 支持图标和标签的全功能按钮组件,适用于大多数交互场景。
11
+
12
+ **特性:**
13
+ - 支持图标 + 文本标签
14
+ - 多种大小和样式变体
15
+ - 完整的主题支持
16
+ - 异步操作处理
17
+
18
+ **适用场景:** 主要操作、表单提交、对话框确认
19
+
20
+ ### [TextButton 组件](./TextButton.md)
21
+ 针对纯文本按钮优化的轻量级组件,采用最小化样式。
22
+
23
+ **特性:**
24
+ - 纯文本显示
25
+ - 最小化视觉样式
26
+ - 快速加载和渲染
27
+ - 支持自定义内容插槽
28
+
29
+ **适用场景:** 导航链接、内联操作、对话框取消按钮
30
+
31
+ ### [IconButton 组件](./IconButton.md)
32
+ 专为紧凑界面设计的纯图标按钮组件。
33
+
34
+ **特性:**
35
+ - 纯图标显示
36
+ - 紧凑的空间占用
37
+ - 多种图标库支持
38
+ - 适应性大小调整
39
+
40
+ **适用场景:** 工具栏、数据表格操作、卡片操作
41
+
42
+ ### [ActionBar 组件](./ActionBar.md)
43
+ 用于组织和管理多个按钮操作的容器组件。
44
+
45
+ **特性:**
46
+ - 统一的按钮布局管理
47
+ - 自动间距和对齐
48
+ - 支持分隔符
49
+ - 响应式布局
50
+
51
+ **适用场景:** 表单操作栏、对话框底部、工具栏布局
52
+
53
+ ## 架构图
54
+
55
+ ```mermaid
56
+ graph TD
57
+ A[ActionBar 操作栏] --> B[Button Components 按钮组件]
58
+ B --> C[Button 标准按钮]
59
+ B --> D[TextButton 文本按钮]
60
+ B --> E[IconButton 图标按钮]
61
+ F[ButtonAction 按钮配置] --> A
62
+ G[ButtonType 按钮类型] --> B
63
+ H[MouseClickHandler 点击处理] --> B
64
+ ```
65
+
66
+ ## 快速开始
67
+
68
+ ### 安装和导入
69
+
70
+ ```typescript
71
+ // 导入所需的组件
72
+ import Button from '@ticatec/uniface-element/Button';
73
+ import TextButton from '@ticatec/uniface-element/TextButton';
74
+ import IconButton from '@ticatec/uniface-element/IconButton';
75
+ import ActionBar from '@ticatec/uniface-element/ActionBar';
76
+ import type { ButtonActions } from '@ticatec/uniface-element';
77
+ ```
78
+
79
+ ### 基本示例
80
+
81
+ ```svelte
82
+ <script lang="ts">
83
+ import Button from '@ticatec/uniface-element/Button';
84
+ import TextButton from '@ticatec/uniface-element/TextButton';
85
+ import IconButton from '@ticatec/uniface-element/IconButton';
86
+ import ActionBar from '@ticatec/uniface-element/ActionBar';
87
+ import type { ButtonActions } from '@ticatec/uniface-element';
88
+
89
+ const handleSave = async () => {
90
+ // 保存操作
91
+ };
92
+
93
+ const actions: ButtonActions = [
94
+ { label: "取消", type: "secondary", handler: async () => {} },
95
+ { label: "保存", type: "primary", handler: handleSave }
96
+ ];
97
+ </script>
98
+
99
+ <!-- 标准按钮 -->
100
+ <Button label="保存" type="primary" icon="icon_google_save" onClick={handleSave} />
101
+
102
+ <!-- 文本按钮 -->
103
+ <TextButton label="取消" type="secondary" onClick={async () => {}} />
104
+
105
+ <!-- 图标按钮 -->
106
+ <IconButton icon="icon_google_edit" type="primary" onClick={async () => {}} />
107
+
108
+ <!-- 操作栏 -->
109
+ <ActionBar buttons={actions} />
110
+ ```
111
+
112
+ ## 按钮类型 & 样式
113
+
114
+ ### ButtonType 选项
115
+
116
+ ```typescript
117
+ type ButtonType = 'default' | 'primary' | 'secondary' | 'third' | 'forth';
118
+ ```
119
+
120
+ ### 视觉外观
121
+
122
+ - **default**: 标准中性按钮外观
123
+ - **primary**: 强调主要操作的按钮(通常为蓝色)
124
+ - **secondary**: 次要操作按钮(通常为灰色)
125
+ - **third**: 替代样式(通常用于警告/注意)
126
+ - **forth**: 附加样式变体
127
+
128
+ ### 大小变体
129
+
130
+ - **big**: 大按钮尺寸,用于突出操作
131
+ - **medium**: 标准按钮尺寸,适用于大多数使用场景
132
+ - **mini**: 小按钮尺寸,用于紧凑界面
133
+
134
+ ### 样式变体(仅限 Button)
135
+
136
+ - **plain**: 最小化样式变体
137
+ - **round**: 圆角变体
138
+ - **'' (空字符串)**: 标准样式
139
+
140
+ ## API 参考
141
+
142
+ ### ButtonAction 接口
143
+
144
+ ```typescript
145
+ interface ButtonAction {
146
+ /** 按钮标签文本 */
147
+ label: string;
148
+
149
+ /** 按钮是否禁用 */
150
+ disabled?: boolean;
151
+
152
+ /** 图标类(如 Google Material Icons) */
153
+ icon?: string;
154
+
155
+ /** 按钮类型用于样式设置 */
156
+ type?: ButtonType;
157
+
158
+ /** 点击事件处理器 */
159
+ handler?: MouseClickHandler;
160
+ }
161
+
162
+ type ButtonActions = Array<ButtonAction | null>;
163
+ ```
164
+
165
+ ### MouseClickHandler 类型
166
+
167
+ ```typescript
168
+ type MouseClickHandler = (event: MouseEvent) => Promise<void>;
169
+ ```
170
+
171
+ ### 点击节流
172
+
173
+ 所有按钮组件都实现了自动点击节流,具有 500ms 冷却时间,以防止意外的双击并确保正确的异步操作处理。
174
+
175
+ ### 图标使用
176
+
177
+ 组件使用 `@ticatec/uniface-google-material-icons` 作为图标库。只需传入图标类名:
178
+
179
+ ```svelte
180
+ <!-- 常用 Material Icons -->
181
+ <Button icon="icon_google_save" label="保存" />
182
+ <Button icon="icon_google_edit" label="编辑" />
183
+ <Button icon="icon_google_delete" label="删除" />
184
+ <Button icon="icon_google_add" label="添加" />
185
+ <Button icon="icon_google_remove" label="移除" />
186
+ <Button icon="icon_google_search" label="搜索" />
187
+ <Button icon="icon_google_settings" label="设置" />
188
+ <Button icon="icon_google_home" label="主页" />
189
+ <Button icon="icon_google_check" label="确认" />
190
+ <Button icon="icon_google_arrow_back" label="返回" />
191
+ ```
192
+
193
+ ## 使用示例
194
+
195
+ ### 对话框操作
196
+
197
+ ```svelte
198
+ <script lang="ts">
199
+ import ActionBar from '@ticatec/uniface-element/ActionBar';
200
+ import type { ButtonActions } from '@ticatec/uniface-element';
201
+
202
+ export let onSave: () => Promise<void>;
203
+ export let onCancel: () => void;
204
+
205
+ const dialogActions: ButtonActions = [
206
+ {
207
+ label: "取消",
208
+ type: "secondary",
209
+ handler: async () => {
210
+ onCancel();
211
+ }
212
+ },
213
+ {
214
+ label: "保存更改",
215
+ type: "primary",
216
+ icon: "icon_google_save",
217
+ handler: async () => {
218
+ await onSave();
219
+ }
220
+ }
221
+ ];
222
+ </script>
223
+
224
+ <div class="dialog-footer">
225
+ <ActionBar buttons={dialogActions} style="justify-content: flex-end;" />
226
+ </div>
227
+ ```
228
+
229
+ ### 数据表格操作
230
+
231
+ ```svelte
232
+ <script lang="ts">
233
+ import IconButton from '@ticatec/uniface-element/IconButton';
234
+
235
+ export let item: any;
236
+ export let onEdit: (item: any) => Promise<void>;
237
+ export let onDelete: (item: any) => Promise<void>;
238
+ export let onView: (item: any) => Promise<void>;
239
+ </script>
240
+
241
+ <div class="table-actions">
242
+ <IconButton
243
+ icon="icon_google_visibility"
244
+ type="default"
245
+ onClick={async () => await onView(item)}
246
+ />
247
+ <IconButton
248
+ icon="icon_google_edit"
249
+ type="primary"
250
+ onClick={async () => await onEdit(item)}
251
+ />
252
+ <IconButton
253
+ icon="icon_google_delete"
254
+ type="third"
255
+ onClick={async () => await onDelete(item)}
256
+ />
257
+ </div>
258
+
259
+ <style>
260
+ .table-actions {
261
+ display: flex;
262
+ gap: 4px;
263
+ }
264
+ </style>
265
+ ```
266
+
267
+ ### 表单按钮
268
+
269
+ ```svelte
270
+ <script lang="ts">
271
+ import Button from '@ticatec/uniface-element/Button';
272
+ import TextButton from '@ticatec/uniface-element/TextButton';
273
+
274
+ let formData = {};
275
+ let isSubmitting = false;
276
+ let isDraft = false;
277
+
278
+ const handleSubmit = async () => {
279
+ isSubmitting = true;
280
+ try {
281
+ await submitForm(formData);
282
+ } finally {
283
+ isSubmitting = false;
284
+ }
285
+ };
286
+
287
+ const handleSaveDraft = async () => {
288
+ isDraft = true;
289
+ try {
290
+ await saveDraft(formData);
291
+ } finally {
292
+ isDraft = false;
293
+ }
294
+ };
295
+
296
+ const handleReset = async () => {
297
+ formData = {};
298
+ };
299
+ </script>
300
+
301
+ <form>
302
+ <!-- 表单字段在此 -->
303
+
304
+ <div class="form-actions">
305
+ <TextButton
306
+ label="重置"
307
+ type="default"
308
+ onClick={handleReset}
309
+ />
310
+
311
+ <Button
312
+ label={isDraft ? "保存中..." : "保存草稿"}
313
+ type="secondary"
314
+ icon="icon_google_save"
315
+ disabled={isDraft}
316
+ onClick={handleSaveDraft}
317
+ />
318
+
319
+ <Button
320
+ label={isSubmitting ? "提交中..." : "提交"}
321
+ type="primary"
322
+ icon="icon_google_send"
323
+ disabled={isSubmitting}
324
+ onClick={handleSubmit}
325
+ />
326
+ </div>
327
+ </form>
328
+
329
+ <style>
330
+ .form-actions {
331
+ display: flex;
332
+ gap: 12px;
333
+ justify-content: flex-end;
334
+ margin-top: 24px;
335
+ }
336
+ </style>
337
+ ```
338
+
339
+ ### 工具栏实现
340
+
341
+ ```svelte
342
+ <script lang="ts">
343
+ import ActionBar from '@ticatec/uniface-element/ActionBar';
344
+ import type { ButtonActions } from '@ticatec/uniface-element';
345
+
346
+ let selectedItems = [];
347
+
348
+ const toolbarActions: ButtonActions = [
349
+ {
350
+ label: "全选",
351
+ icon: "icon_google_check_box",
352
+ type: "default",
353
+ handler: async () => {
354
+ selectAll();
355
+ }
356
+ },
357
+ null, // 分隔符
358
+ {
359
+ label: "导出",
360
+ icon: "icon_google_download",
361
+ type: "secondary",
362
+ disabled: selectedItems.length === 0,
363
+ handler: async () => {
364
+ await exportItems(selectedItems);
365
+ }
366
+ },
367
+ {
368
+ label: "删除选中",
369
+ icon: "icon_google_delete",
370
+ type: "third",
371
+ disabled: selectedItems.length === 0,
372
+ handler: async () => {
373
+ if (confirm(`删除 ${selectedItems.length} 个项目?`)) {
374
+ await deleteItems(selectedItems);
375
+ }
376
+ }
377
+ }
378
+ ];
379
+ </script>
380
+
381
+ <div class="toolbar">
382
+ <div class="toolbar-info">
383
+ 已选择 {selectedItems.length} 个项目
384
+ </div>
385
+ <ActionBar buttons={toolbarActions} />
386
+ </div>
387
+
388
+ <style>
389
+ .toolbar {
390
+ display: flex;
391
+ justify-content: space-between;
392
+ align-items: center;
393
+ padding: 12px;
394
+ border-bottom: 1px solid #eee;
395
+ }
396
+
397
+ .toolbar-info {
398
+ color: #666;
399
+ font-size: 14px;
400
+ }
401
+ </style>
402
+ ```
403
+
404
+ ## 最佳实践
405
+
406
+ ### 1. 使用合适的按钮类型
407
+
408
+ 根据操作重要性选择正确的按钮类型:
409
+
410
+ ```svelte
411
+ <!-- 主要操作 -->
412
+ <Button label="保存" type="primary" />
413
+ <Button label="提交" type="primary" />
414
+
415
+ <!-- 次要操作 -->
416
+ <Button label="取消" type="secondary" />
417
+ <Button label="预览" type="secondary" />
418
+
419
+ <!-- 危险操作 -->
420
+ <Button label="删除" type="third" />
421
+ <Button label="移除" type="third" />
422
+ ```
423
+
424
+ ### 2. 正确处理异步操作
425
+
426
+ 始终处理加载状态和错误:
427
+
428
+ ```svelte
429
+ <script lang="ts">
430
+ let isLoading = false;
431
+ let error = null;
432
+
433
+ const handleAction = async () => {
434
+ isLoading = true;
435
+ error = null;
436
+
437
+ try {
438
+ await performAction();
439
+ } catch (err) {
440
+ error = err.message;
441
+ } finally {
442
+ isLoading = false;
443
+ }
444
+ };
445
+ </script>
446
+
447
+ <Button
448
+ label={isLoading ? "处理中..." : "开始处理"}
449
+ type="primary"
450
+ disabled={isLoading}
451
+ onClick={handleAction}
452
+ />
453
+
454
+ {#if error}
455
+ <div class="error">{error}</div>
456
+ {/if}
457
+ ```
458
+
459
+ ### 3. 使用 ActionBar 组织相关操作
460
+
461
+ 将相关操作组合在一起:
462
+
463
+ ```svelte
464
+ <script lang="ts">
465
+ const dialogActions = [
466
+ { label: "取消", type: "secondary", handler: cancel },
467
+ { label: "应用", type: "primary", handler: apply }
468
+ ];
469
+
470
+ const editActions = [
471
+ { label: "撤销", icon: "icon_google_undo", handler: undo },
472
+ { label: "重做", icon: "icon_google_redo", handler: redo },
473
+ null, // 分隔符
474
+ { label: "保存", type: "primary", handler: save }
475
+ ];
476
+ </script>
477
+ ```
478
+
479
+ ### 4. 提供视觉反馈
480
+
481
+ 使用图标和适当的样式:
482
+
483
+ ```svelte
484
+ <!-- 成功操作 -->
485
+ <Button label="保存" icon="icon_google_save" type="primary" />
486
+
487
+ <!-- 危险操作 -->
488
+ <Button label="删除" icon="icon_google_delete" type="third" />
489
+
490
+ <!-- 导航操作 -->
491
+ <Button label="返回" icon="icon_google_arrow_back" type="secondary" />
492
+ ```
493
+
494
+ ### 5. 考虑移动端响应式
495
+
496
+ 为不同屏幕尺寸使用合适的大小:
497
+
498
+ ```svelte
499
+ <div class="responsive-buttons">
500
+ <!-- 桌面端: 普通大小,移动端: 更大以适应触摸 -->
501
+ <Button label="操作" size="big" class="mobile-friendly" />
502
+ </div>
503
+
504
+ <style>
505
+ .responsive-buttons .mobile-friendly {
506
+ /* 响应式样式 */
507
+ }
508
+
509
+ @media (max-width: 768px) {
510
+ .responsive-buttons .mobile-friendly {
511
+ min-height: 44px; /* iOS 推荐的触摸目标大小 */
512
+ }
513
+ }
514
+ </style>
515
+ ```
516
+
517
+ ## 无障碍性
518
+
519
+ ### 当前限制
520
+
521
+ **⚠️ 重要提示**:当前的按钮组件存在以下无障碍性限制:
522
+
523
+ - **非语义化元素**:所有按钮都使用 `<div>` 元素而不是 `<button>`
524
+ - **对屏幕阅读器隐藏**:所有按钮默认都有 `aria-hidden="true"`
525
+ - **无键盘导航**:组件不支持 Tab 导航或 Enter/Space 激活
526
+ - **无焦点管理**:组件不提供 focus 方法或支持 `bind:this`
527
+ - **无 ARIA 属性支持**:自定义 aria-* 属性无法传递
528
+
529
+ ### 更好的无障碍性建议
530
+
531
+ 对于需要完全无障碍性遵循的生产应用程序,考虑:
532
+
533
+ 1. **在正确的按钮元素中包装组件**:
534
+ ```svelte
535
+ <button
536
+ class="custom-button-wrapper"
537
+ disabled={disabled}
538
+ aria-label="编辑用户资料"
539
+ on:click={handleClick}
540
+ >
541
+ <IconButton
542
+ icon="icon_google_edit"
543
+ onClick={() => {}} // 通过外部按钮处理
544
+ />
545
+ </button>
546
+ ```
547
+
548
+ 2. **添加键盘事件处理器**:
549
+ ```svelte
550
+ <script>
551
+ const handleKeydown = (e) => {
552
+ if (e.key === 'Enter' || e.key === ' ') {
553
+ e.preventDefault();
554
+ handleClick(e);
555
+ }
556
+ };
557
+ </script>
558
+
559
+ <div
560
+ class="accessible-button"
561
+ role="button"
562
+ tabindex="0"
563
+ aria-label="操作描述"
564
+ on:click={handleClick}
565
+ on:keydown={handleKeydown}
566
+ >
567
+ <Button onClick={() => {}} label="操作" />
568
+ </div>
569
+ ```
570
+
571
+ 3. **程序化管理焦点**:
572
+ ```svelte
573
+ <script>
574
+ let buttonElement;
575
+
576
+ const focusButton = () => {
577
+ buttonElement?.focus();
578
+ };
579
+ </script>
580
+
581
+ <div
582
+ bind:this={buttonElement}
583
+ class="focusable-wrapper"
584
+ tabindex="0"
585
+ role="button"
586
+ on:click={handleAction}
587
+ >
588
+ <Button onClick={() => {}} label="可聚焦操作" />
589
+ </div>
590
+ ```
591
+
592
+ ### 所需的未来改进
593
+
594
+ 为了使这些组件完全无障碍,建议进行以下更改:
595
+
596
+ - 将 `<div>` 替换为 `<button>` 元素
597
+ - 移除 `aria-hidden="true"` 并允许 ARIA 属性自定义
598
+ - 添加键盘事件处理
599
+ - 支持使用 `bind:this` 进行焦点管理
600
+ - 添加正确的语义角色和状态