@ticatec/uniface-element 0.2.3 → 0.3.0

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 (178) 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/DialogBoard.svelte +1 -1
  70. package/dist/dialog/README.md +596 -0
  71. package/dist/dialog/README_CN.md +596 -0
  72. package/dist/drawer/README.md +679 -1
  73. package/dist/drawer/README_CN.md +679 -0
  74. package/dist/group-box/group-check-box/GroupCheckBox.svelte +62 -5
  75. package/dist/group-box/group-check-box/GroupCheckBox.svelte.d.ts +7 -2
  76. package/dist/group-box/group-check-box/README.md +749 -0
  77. package/dist/group-box/group-check-box/README_CN.md +750 -0
  78. package/dist/group-box/group-radio-box/GroupRadioBox.svelte +69 -4
  79. package/dist/group-box/group-radio-box/GroupRadioBox.svelte.d.ts +8 -2
  80. package/dist/group-box/group-radio-box/README.md +920 -0
  81. package/dist/group-box/group-radio-box/README_CN.md +920 -0
  82. package/dist/image-files/README.md +1346 -0
  83. package/dist/image-files/README_CN.md +1346 -0
  84. package/dist/input-options-select/InputOptionsSelect.svelte +161 -65
  85. package/dist/input-options-select/InputOptionsSelect.svelte.d.ts +4 -1
  86. package/dist/lib/forwardAllEvents.d.ts +3 -0
  87. package/dist/lib/forwardAllEvents.js +24 -0
  88. package/dist/list-box/README.md +579 -0
  89. package/dist/list-box/README_CN.md +682 -0
  90. package/dist/lookup-editor/LookupEditor.svelte +15 -3
  91. package/dist/lookup-editor/LookupEditor.svelte.d.ts +3 -4
  92. package/dist/lookup-editor/README.md +684 -0
  93. package/dist/lookup-editor/README_CN.md +684 -0
  94. package/dist/memo-editor/MemoEditor.svelte +77 -27
  95. package/dist/memo-editor/MemoEditor.svelte.d.ts +6 -3
  96. package/dist/memo-editor/README.md +819 -0
  97. package/dist/memo-editor/README_CN.md +819 -0
  98. package/dist/message-box/README.md +398 -0
  99. package/dist/message-box/README_CN.md +398 -0
  100. package/dist/number-editor/NumberEditor.svelte +2 -2
  101. package/dist/number-editor/NumberEditor.svelte.d.ts +1 -1
  102. package/dist/number-editor/README.md +353 -22
  103. package/dist/number-editor/README_CN.md +357 -0
  104. package/dist/number-range/README.md +443 -0
  105. package/dist/number-range/README_CN.md +443 -0
  106. package/dist/options-multi-select/OptionsMultiSelect.svelte +87 -12
  107. package/dist/options-multi-select/OptionsMultiSelect.svelte.d.ts +3 -1
  108. package/dist/options-multi-select/README.md +480 -0
  109. package/dist/options-multi-select/README_CN.md +480 -0
  110. package/dist/options-select/OptionsSelect.svelte +36 -5
  111. package/dist/options-select/OptionsSelect.svelte.d.ts +3 -4
  112. package/dist/options-select/README.md +632 -0
  113. package/dist/options-select/README_CN.md +632 -0
  114. package/dist/page/README.md +605 -0
  115. package/dist/page/README_CN.md +605 -0
  116. package/dist/pagination/README.md +946 -0
  117. package/dist/pagination/README_CN.md +946 -0
  118. package/dist/pagination-panel/README.md +1075 -0
  119. package/dist/pagination-panel/README_CN.md +1075 -0
  120. package/dist/popup-hint/README.md +841 -0
  121. package/dist/popup-hint/README_CN.md +840 -0
  122. package/dist/progress-bar/README.md +242 -0
  123. package/dist/progress-bar/README_CN.md +242 -0
  124. package/dist/progress-step-bar/README.md +316 -0
  125. package/dist/progress-step-bar/README_CN.md +316 -0
  126. package/dist/prompts-text-editor/PromptsTextEditor.svelte +6 -3
  127. package/dist/prompts-text-editor/PromptsTextEditor.svelte.d.ts +3 -1
  128. package/dist/prompts-text-editor/README.md +329 -0
  129. package/dist/prompts-text-editor/README_CN.md +329 -0
  130. package/dist/property-editor/README.md +969 -0
  131. package/dist/property-editor/README_CN.md +969 -0
  132. package/dist/radio-button/README.md +372 -0
  133. package/dist/radio-button/README_CN.md +372 -0
  134. package/dist/radio-button/RadioButton.svelte +32 -3
  135. package/dist/radio-button/RadioButton.svelte.d.ts +12 -1
  136. package/dist/search-box/README.md +425 -0
  137. package/dist/search-box/README_CN.md +424 -0
  138. package/dist/search-box/SearchBox.svelte +22 -6
  139. package/dist/search-box/SearchBox.svelte.d.ts +4 -1
  140. package/dist/tabs/README.md +919 -0
  141. package/dist/tabs/README_CN.md +920 -0
  142. package/dist/tag/README.md +922 -0
  143. package/dist/tag/README_CN.md +922 -0
  144. package/dist/text-editor/PasswordEditor.svelte +17 -2
  145. package/dist/text-editor/PasswordEditor.svelte.d.ts +3 -3
  146. package/dist/text-editor/PasswordEditor_README.md +551 -0
  147. package/dist/text-editor/PasswordEditor_README_CN.md +551 -0
  148. package/dist/text-editor/README.md +466 -0
  149. package/dist/text-editor/README_CN.md +466 -0
  150. package/dist/text-editor/TextEditor.svelte +51 -19
  151. package/dist/text-editor/TextEditor.svelte.d.ts +0 -1
  152. package/dist/ticatec-uniface-web.css +1 -0
  153. package/dist/time-editor/README.md +498 -24
  154. package/dist/time-editor/README_CN.md +498 -0
  155. package/dist/time-editor/TimeEditor.svelte +7 -3
  156. package/dist/time-editor/TimeEditor.svelte.d.ts +3 -1
  157. package/dist/toast/README.md +667 -0
  158. package/dist/toast/README_CN.md +667 -0
  159. package/dist/transfer/README.md +795 -0
  160. package/dist/transfer/Transfer.svelte +6 -4
  161. package/dist/transfer/Transfer.svelte.d.ts +3 -1
  162. package/dist/tree-view/README.md +761 -0
  163. package/dist/tree-view/README_CN.md +761 -0
  164. package/dist/tree-view/TreeView.svelte +5 -3
  165. package/dist/tree-view/TreeView.svelte.d.ts +3 -1
  166. package/dist/unit-number-editor/README.md +546 -20
  167. package/dist/unit-number-editor/README_CN.md +525 -0
  168. package/dist/unit-number-editor/UnitNumberEditor.svelte +62 -8
  169. package/dist/unit-number-editor/UnitNumberEditor.svelte.d.ts +5 -1
  170. package/docs/form-field/cn/README_CN.md +364 -0
  171. package/docs/form-field/en/README.md +364 -0
  172. package/docs/form-panel/flex-form/cn/README_CN.md +586 -0
  173. package/docs/form-panel/flex-form/en/README.md +586 -0
  174. package/docs/form-panel/flex-row-form/cn/README_CN.md +787 -0
  175. package/docs/form-panel/flex-row-form/en/README.md +787 -0
  176. package/docs/form-panel/grid-form/en/README.md +744 -0
  177. package/package.json +1 -1
  178. package/dist/drawer/README-CN.md +0 -1
@@ -0,0 +1,667 @@
1
+ # Toast 通知组件
2
+
3
+ 一个轻量级的 Toast 通知系统,用于向用户展示临时消息。支持自定义类型(成功、错误、信息)、自动消失和流畅的动画效果。非常适合状态更新、错误消息和用户反馈。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install @ticatec/uniface-element
9
+ ```
10
+
11
+ ## 导入
12
+
13
+ ```typescript
14
+ import ToastBoard, { type Toast } from "@ticatec/uniface-element/ToastBoard";
15
+ ```
16
+
17
+ ## 基本用法
18
+
19
+ ```svelte
20
+ <script>
21
+ import ToastBoard from "@ticatec/uniface-element/ToastBoard";
22
+
23
+ function showSuccessToast() {
24
+ window.Toast.show("操作成功完成!", "success", 3);
25
+ }
26
+
27
+ function showErrorToast() {
28
+ window.Toast.show("出现错误!", "error", 5);
29
+ }
30
+
31
+ function showInfoToast() {
32
+ window.Toast.show("信息消息", "info");
33
+ }
34
+ </script>
35
+
36
+ <!-- 在根布局中包含 ToastBoard 组件 -->
37
+ <ToastBoard />
38
+
39
+ <!-- 从任何地方触发 Toast -->
40
+ <button on:click={showSuccessToast}>显示成功</button>
41
+ <button on:click={showErrorToast}>显示错误</button>
42
+ <button on:click={showInfoToast}>显示信息</button>
43
+ ```
44
+
45
+ ## 属性 (ToastBoard)
46
+
47
+ | 属性 | 类型 | 默认值 | 描述 |
48
+ |------|------|---------|-------------|
49
+ | `fromBottom` | `boolean` | `false` | 是否从屏幕底部显示 Toast |
50
+
51
+ ## 全局 Toast API
52
+
53
+ 一旦 ToastBoard 被挂载,全局 `window.Toast` 对象即可使用:
54
+
55
+ ### Toast.show()
56
+
57
+ ```typescript
58
+ window.Toast.show(message: string, type?: "error" | "info" | "success", duration?: number)
59
+ ```
60
+
61
+ | 参数 | 类型 | 默认值 | 描述 |
62
+ |-----------|------|---------|-------------|
63
+ | `message` | `string` | 必需 | 要显示的消息 |
64
+ | `type` | `"error" \| "info" \| "success"` | `"error"` | Toast 类型/样式 |
65
+ | `duration` | `number` | `3` | 自动消失前的持续时间(秒) |
66
+
67
+ ## 类型
68
+
69
+ ### 成功 Toast
70
+ - **颜色**:绿色背景 (`#2DC071`)
71
+ - **用途**:成功操作、确认
72
+ - **示例**: "数据保存成功!"
73
+
74
+ ### 错误 Toast
75
+ - **颜色**:红色背景 (`#FF685B`)
76
+ - **用途**:错误消息、失败操作
77
+ - **示例**: "数据保存失败"
78
+
79
+ ### 信息 Toast
80
+ - **颜色**:蓝色背景 (`#0061FF`)
81
+ - **用途**:一般信息、通知
82
+ - **示例**: "有新更新可用"
83
+
84
+ ## 示例
85
+
86
+ ### 基本实现
87
+
88
+ ```svelte
89
+ <script>
90
+ import ToastBoard from "@ticatec/uniface-element/ToastBoard";
91
+
92
+ // 简单的 Toast 函数
93
+ function success() {
94
+ window.Toast.show("成功!数据已保存。", "success", 4);
95
+ }
96
+
97
+ function error() {
98
+ window.Toast.show("错误!无法处理请求。", "error", 6);
99
+ }
100
+
101
+ function info() {
102
+ window.Toast.show("信息:请检查您的电子邮件以获取更新。", "info", 3);
103
+ }
104
+ </script>
105
+
106
+ <!-- 挂载 Toast 面板 -->
107
+ <ToastBoard />
108
+
109
+ <div class="demo">
110
+ <h3>Toast 通知</h3>
111
+ <button on:click={success}>成功 Toast</button>
112
+ <button on:click={error}>错误 Toast</button>
113
+ <button on:click={info}>信息 Toast</button>
114
+ </div>
115
+
116
+ <style>
117
+ .demo {
118
+ padding: 20px;
119
+ }
120
+
121
+ button {
122
+ margin: 0 8px 8px 0;
123
+ padding: 8px 16px;
124
+ border: none;
125
+ border-radius: 4px;
126
+ cursor: pointer;
127
+ }
128
+ </style>
129
+ ```
130
+
131
+ ### 表单验证与 Toast
132
+
133
+ ```svelte
134
+ <script>
135
+ import ToastBoard from "@ticatec/uniface-element/ToastBoard";
136
+
137
+ let email = '';
138
+ let password = '';
139
+ let loading = false;
140
+
141
+ async function handleSubmit() {
142
+ if (!email) {
143
+ window.Toast.show("电子邮件为必填项", "error", 4);
144
+ return;
145
+ }
146
+
147
+ if (!email.includes('@')) {
148
+ window.Toast.show("请输入有效的电子邮件地址", "error", 4);
149
+ return;
150
+ }
151
+
152
+ if (!password) {
153
+ window.Toast.show("密码为必填项", "error", 4);
154
+ return;
155
+ }
156
+
157
+ if (password.length < 6) {
158
+ window.Toast.show("密码必须至少包含 6 个字符", "error", 4);
159
+ return;
160
+ }
161
+
162
+ loading = true;
163
+
164
+ try {
165
+ // 模拟 API 调用
166
+ await new Promise(resolve => setTimeout(resolve, 2000));
167
+
168
+ if (Math.random() > 0.5) {
169
+ window.Toast.show("登录成功!欢迎回来。", "success", 3);
170
+ // 重定向或更新 UI
171
+ } else {
172
+ window.Toast.show("无效的凭据,请重试。", "error", 5);
173
+ }
174
+ } catch (error) {
175
+ window.Toast.show("网络错误,请检查您的连接。", "error", 5);
176
+ } finally {
177
+ loading = false;
178
+ }
179
+ }
180
+ </script>
181
+
182
+ <ToastBoard />
183
+
184
+ <form on:submit|preventDefault={handleSubmit}>
185
+ <h3>登录表单</h3>
186
+
187
+ <div class="field">
188
+ <label>电子邮件:</label>
189
+ <input
190
+ type="email"
191
+ bind:value={email}
192
+ placeholder="请输入您的电子邮件"
193
+ disabled={loading}
194
+ />
195
+ </div>
196
+
197
+ <div class="field">
198
+ <label>密码:</label>
199
+ <input
200
+ type="password"
201
+ bind:value={password}
202
+ placeholder="请输入您的密码"
203
+ disabled={loading}
204
+ />
205
+ </div>
206
+
207
+ <button type="submit" disabled={loading}>
208
+ {loading ? '登录中...' : '登录'}
209
+ </button>
210
+ </form>
211
+
212
+ <style>
213
+ form {
214
+ max-width: 300px;
215
+ margin: 20px;
216
+ padding: 20px;
217
+ border: 1px solid #ddd;
218
+ border-radius: 8px;
219
+ }
220
+
221
+ .field {
222
+ margin-bottom: 16px;
223
+ }
224
+
225
+ label {
226
+ display: block;
227
+ margin-bottom: 4px;
228
+ font-weight: 500;
229
+ }
230
+
231
+ input {
232
+ width: 100%;
233
+ padding: 8px 12px;
234
+ border: 1px solid #ccc;
235
+ border-radius: 4px;
236
+ box-sizing: border-box;
237
+ }
238
+
239
+ button {
240
+ width: 100%;
241
+ padding: 10px;
242
+ background: #007bff;
243
+ color: white;
244
+ border: none;
245
+ border-radius: 4px;
246
+ cursor: pointer;
247
+ }
248
+
249
+ button:disabled {
250
+ background: #ccc;
251
+ cursor: not-allowed;
252
+ }
253
+ </style>
254
+ ```
255
+
256
+ ### 文件上传与进度 Toast
257
+
258
+ ```svelte
259
+ <script>
260
+ import ToastBoard from "@ticatec/uniface-element/ToastBoard";
261
+
262
+ let fileInput;
263
+ let uploading = false;
264
+
265
+ async function handleFileUpload(event) {
266
+ const file = event.target.files[0];
267
+
268
+ if (!file) {
269
+ window.Toast.show("请选择要上传的文件", "error", 3);
270
+ return;
271
+ }
272
+
273
+ // 文件大小验证(5MB 限制)
274
+ if (file.size > 5 * 1024 * 1024) {
275
+ window.Toast.show("文件大小必须小于 5MB", "error", 4);
276
+ return;
277
+ }
278
+
279
+ // 文件类型验证
280
+ const allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
281
+ if (!allowedTypes.includes(file.type)) {
282
+ window.Toast.show("仅允许上传 JPEG、PNG 和 GIF 文件", "error", 4);
283
+ return;
284
+ }
285
+
286
+ uploading = true;
287
+ window.Toast.show("开始文件上传...", "info", 2);
288
+
289
+ try {
290
+ // 模拟上传进度
291
+ await simulateUpload(file);
292
+
293
+ window.Toast.show(`文件 "${file.name}" 上传成功!`, "success", 4);
294
+
295
+ // 清空输入框
296
+ fileInput.value = '';
297
+
298
+ } catch (error) {
299
+ window.Toast.show("上传失败,请重试。", "error", 5);
300
+ } finally {
301
+ uploading = false;
302
+ }
303
+ }
304
+
305
+ async function simulateUpload(file) {
306
+ // 模拟上传阶段
307
+ await new Promise(resolve => setTimeout(resolve, 1000));
308
+ window.Toast.show("处理文件中...", "info", 2);
309
+
310
+ await new Promise(resolve => setTimeout(resolve, 1500));
311
+ window.Toast.show("上传至服务器...", "info", 2);
312
+
313
+ await new Promise(resolve => setTimeout(resolve, 1000));
314
+
315
+ // 随机失败模拟
316
+ if (Math.random() < 0.2) {
317
+ throw new Error("上传失败");
318
+ }
319
+ }
320
+ </script>
321
+
322
+ <ToastBoard />
323
+
324
+ <div class="upload-container">
325
+ <h3>文件上传</h3>
326
+
327
+ <div class="upload-area">
328
+ <input
329
+ bind:this={fileInput}
330
+ type="file"
331
+ accept="image/*"
332
+ on:change={handleFileUpload}
333
+ disabled={uploading}
334
+ id="file-upload"
335
+ />
336
+ <label for="file-upload" class:uploading>
337
+ {uploading ? '⏳ 上传中...' : '📁 选择文件'}
338
+ </label>
339
+ </div>
340
+
341
+ <p class="help-text">
342
+ 选择 JPEG、PNG 或 GIF 文件(最大 5MB)
343
+ </p>
344
+ </div>
345
+
346
+ <style>
347
+ .upload-container {
348
+ max-width: 400px;
349
+ margin: 20px;
350
+ padding: 20px;
351
+ border: 1px solid #ddd;
352
+ border-radius: 8px;
353
+ }
354
+
355
+ .upload-area {
356
+ margin: 16px 0;
357
+ }
358
+
359
+ input[type="file"] {
360
+ display: none;
361
+ }
362
+
363
+ label {
364
+ display: inline-block;
365
+ padding: 12px 24px;
366
+ background: #007bff;
367
+ color: white;
368
+ border-radius: 4px;
369
+ cursor: pointer;
370
+ transition: background 0.2s;
371
+ }
372
+
373
+ label:hover {
374
+ background: #0056b3;
375
+ }
376
+
377
+ label.uploading {
378
+ background: #6c757d;
379
+ cursor: not-allowed;
380
+ }
381
+
382
+ .help-text {
383
+ font-size: 14px;
384
+ color: #666;
385
+ margin: 8px 0 0 0;
386
+ }
387
+ </style>
388
+ ```
389
+
390
+ ### API 集成与 Toast
391
+
392
+ ```svelte
393
+ <script>
394
+ import ToastBoard from "@ticatec/uniface-element/ToastBoard";
395
+
396
+ let users = [];
397
+ let loading = false;
398
+ let newUser = { name: '', email: '' };
399
+
400
+ async function fetchUsers() {
401
+ loading = true;
402
+ window.Toast.show("加载用户中...", "info", 2);
403
+
404
+ try {
405
+ // 模拟 API 调用
406
+ await new Promise(resolve => setTimeout(resolve, 1500));
407
+
408
+ // 模拟数据
409
+ users = [
410
+ { id: 1, name: '张伟', email: 'zhangwei@example.com' },
411
+ { id: 2, name: '李娜', email: 'lina@example.com' }
412
+ ];
413
+
414
+ window.Toast.show(`成功加载 ${users.length} 个用户`, "success", 3);
415
+
416
+ } catch (error) {
417
+ window.Toast.show("加载用户失败", "error", 4);
418
+ } finally {
419
+ loading = false;
420
+ }
421
+ }
422
+
423
+ async function addUser() {
424
+ if (!newUser.name || !newUser.email) {
425
+ window.Toast.show("请填写所有字段", "error", 3);
426
+ return;
427
+ }
428
+
429
+ loading = true;
430
+
431
+ try {
432
+ // 模拟 API 调用
433
+ await new Promise(resolve => setTimeout(resolve, 1000));
434
+
435
+ const user = {
436
+ id: Date.now(),
437
+ name: newUser.name,
438
+ email: newUser.email
439
+ };
440
+
441
+ users = [...users, user];
442
+ newUser = { name: '', email: '' };
443
+
444
+ window.Toast.show("用户添加成功!", "success", 3);
445
+
446
+ } catch (error) {
447
+ window.Toast.show("添加用户失败", "error", 4);
448
+ } finally {
449
+ loading = false;
450
+ }
451
+ }
452
+
453
+ async function deleteUser(userId) {
454
+ if (!confirm('您确定要删除此用户吗?')) {
455
+ return;
456
+ }
457
+
458
+ try {
459
+ // 模拟 API 调用
460
+ await new Promise(resolve => setTimeout(resolve, 800));
461
+
462
+ users = users.filter(u => u.id !== userId);
463
+ window.Toast.show("用户删除成功", "success", 3);
464
+
465
+ } catch (error) {
466
+ window.Toast.show("删除用户失败", "error", 4);
467
+ }
468
+ }
469
+ </script>
470
+
471
+ <ToastBoard />
472
+
473
+ <div class="app">
474
+ <h3>用户管理</h3>
475
+
476
+ <div class="actions">
477
+ <button on:click={fetchUsers} disabled={loading}>
478
+ {loading ? '加载中...' : '加载用户'}
479
+ </button>
480
+ </div>
481
+
482
+ <div class="add-user">
483
+ <h4>添加新用户</h4>
484
+ <input
485
+ bind:value={newUser.name}
486
+ placeholder="姓名"
487
+ disabled={loading}
488
+ />
489
+ <input
490
+ bind:value={newUser.email}
491
+ placeholder="电子邮件"
492
+ disabled={loading}
493
+ />
494
+ <button on:click={addUser} disabled={loading}>
495
+ {loading ? '添加中...' : '添加用户'}
496
+ </button>
497
+ </div>
498
+
499
+ <div class="users">
500
+ <h4>用户 ({users.length})</h4>
501
+ {#each users as user}
502
+ <div class="user-item">
503
+ <div>
504
+ <strong>{user.name}</strong>
505
+ <span>{user.email}</span>
506
+ </div>
507
+ <button on:click={() => deleteUser(user.id)}>删除</button>
508
+ </div>
509
+ {/each}
510
+ </div>
511
+ </div>
512
+
513
+ <style>
514
+ .app {
515
+ max-width: 600px;
516
+ margin: 20px;
517
+ padding: 20px;
518
+ border: 1px solid #ddd;
519
+ border-radius: 8px;
520
+ }
521
+
522
+ .actions {
523
+ margin-bottom: 20px;
524
+ }
525
+
526
+ .add-user {
527
+ margin-bottom: 20px;
528
+ padding: 16px;
529
+ background: #f8f9fa;
530
+ border-radius: 4px;
531
+ }
532
+
533
+ .add-user h4 {
534
+ margin: 0 0 12px 0;
535
+ }
536
+
537
+ .add-user input {
538
+ margin: 0 8px 8px 0;
539
+ padding: 8px 12px;
540
+ border: 1px solid #ccc;
541
+ border-radius: 4px;
542
+ }
543
+
544
+ .users h4 {
545
+ margin-bottom: 12px;
546
+ }
547
+
548
+ .user-item {
549
+ display: flex;
550
+ justify-content: space-between;
551
+ align-items: center;
552
+ padding: 12px;
553
+ border: 1px solid #eee;
554
+ border-radius: 4px;
555
+ margin-bottom: 8px;
556
+ }
557
+
558
+ .user-item div {
559
+ display: flex;
560
+ flex-direction: column;
561
+ }
562
+
563
+ .user-item span {
564
+ font-size: 14px;
565
+ color: #666;
566
+ }
567
+
568
+ button {
569
+ padding: 8px 16px;
570
+ border: none;
571
+ border-radius: 4px;
572
+ cursor: pointer;
573
+ background: #007bff;
574
+ color: white;
575
+ }
576
+
577
+ button:disabled {
578
+ background: #ccc;
579
+ cursor: not-allowed;
580
+ }
581
+ </style>
582
+ ```
583
+
584
+ ### 底部定位的 Toast
585
+
586
+ ```svelte
587
+ <script>
588
+ import ToastBoard from "@ticatec/uniface-element/ToastBoard";
589
+
590
+ function showBottomToast() {
591
+ window.Toast.show("此 Toast 从底部显示!", "info", 4);
592
+ }
593
+ </script>
594
+
595
+ <!-- 将 Toast 定位在屏幕底部 -->
596
+ <ToastBoard fromBottom={true} />
597
+
598
+ <button on:click={showBottomToast}>显示底部 Toast</button>
599
+ ```
600
+
601
+ ## 功能
602
+
603
+ - **多种类型**:成功、错误和信息类型,带有不同的颜色
604
+ - **自动消失**:可配置的持续时间,自动隐藏
605
+ - **流畅动画**:从顶部或底部飞入的过渡效果
606
+ - **全局访问**:通过 `window.Toast.show()` 从任何地方调用
607
+ - **定位**:支持屏幕顶部或底部定位
608
+ - **堆叠**:支持多个 Toast 按顺序显示
609
+ - **响应式**:适用于所有屏幕尺寸
610
+
611
+ ## 样式
612
+
613
+ Toast 组件使用 CSS 自定义属性进行主题化:
614
+
615
+ ```css
616
+ :root {
617
+ --uniface-toast-text-color: #ffffff;
618
+ --uniface-toast-error-background-color: #FF685B;
619
+ --uniface-toast-info-background-color: #0061FF;
620
+ --uniface-toast-successful-background-color: #2DC071;
621
+ }
622
+ ```
623
+
624
+ ### 自定义样式
625
+
626
+ ```css
627
+ /* 覆盖 Toast 颜色 */
628
+ :root {
629
+ --uniface-toast-error-background-color: #dc3545;
630
+ --uniface-toast-info-background-color: #17a2b8;
631
+ --uniface-toast-successful-background-color: #28a745;
632
+ }
633
+
634
+ /* 自定义 Toast 面板样式 */
635
+ .uniface-toast-board {
636
+ /* 你的自定义样式 */
637
+ }
638
+ ```
639
+
640
+ ## 最佳实践
641
+
642
+ 1. **全局设置**:在根布局/应用组件中仅包含一次 ToastBoard
643
+ 2. **消息清晰**:使用用户能快速理解的简洁消息
644
+ 3. **持续时间**:错误消息使用较长的持续时间,成功消息使用较短的时间
645
+ 4. **类型一致性**:在整个应用中保持一致的 Toast 类型
646
+ 5. **定位**:根据你的 UI 布局选择顶部或底部定位
647
+ 6. **错误处理**:为异步操作始终显示 Toast 反馈
648
+
649
+ ## 可访问性
650
+
651
+ - 高对比度颜色以提高可读性
652
+ - 自动消失防止屏幕杂乱
653
+ - 非侵入式定位
654
+ - 具有不同颜色的清晰视觉层次
655
+
656
+ ## 浏览器支持
657
+
658
+ - 支持 CSS 自定义属性的现代浏览器
659
+ - 兼容 Svelte 5+
660
+ - 支持流畅动画的浏览器
661
+ - 为旧浏览器提供优雅的降级支持
662
+
663
+ ## 相关组件
664
+
665
+ - `MessageBox` - 用于重要消息的模态对话框
666
+ - `AlertBar` - 持久化的警告通知
667
+ - `NotificationCenter` - 高级通知管理