@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,463 @@
1
+ # Uniface Form Components Documentation
2
+
3
+ This is the English documentation for Uniface form components, covering all available form input and selection components.
4
+
5
+ ## Component Overview
6
+
7
+ ### Basic Input Components
8
+ - [TextEditor](text-editor.md) - Text input field
9
+ - [NumberEditor](number-editor.md) - Number input field
10
+ - [TimeEditor](time-editor.md) - Time input field
11
+ - [UnitNumberEditor](unit-number-editor.md) - Number input with units
12
+ - [PromptsTextEditor](prompts-text-editor.md) - Text input with prompts
13
+
14
+ ### Selection Components
15
+ - [CheckBox](checkbox.md) - Checkbox
16
+ - [RadioButton](radiobutton.md) - Radio button
17
+ - [GroupCheckBox](group-checkbox.md) - Checkbox group
18
+ - [GroupRadioBox](group-radiobox.md) - Radio button group
19
+ - [Switch](switch.md) - Toggle switch
20
+ - [OptionsSelect](options-select.md) - Options selector
21
+ - [OptionsMultiSelect](options-multi-select.md) - Multi-select selector
22
+ - [InputOptionsSelect](input-options-select.md) - Input options selector
23
+ - [LookupEditor](lookup-editor.md) - Lookup editor
24
+ - [CascadeOptionsSelect](cascade-options-select.md) - Cascade selector
25
+
26
+ ### Date/Time Components
27
+ - [DatePicker](date-picker.md) - Date picker
28
+ - [DateTimePicker](datetime-picker.md) - Date/time picker
29
+
30
+ ## Architecture Overview
31
+
32
+ ### Core Wrapper Components
33
+ All form components are based on two core wrapper components:
34
+ - **CommonEditor** - Provides unified styling and behavior for input components
35
+ - **CommonPicker** - Provides dropdown panel functionality for selection components
36
+
37
+ ### Display Modes
38
+ All components support the `DisplayMode` enum:
39
+ ```typescript
40
+ enum DisplayMode {
41
+ Edit = 0, // Edit mode (default)
42
+ View = 1, // View mode
43
+ Display = 2 // Display mode
44
+ }
45
+ ```
46
+
47
+ ### Common Properties
48
+ Most components share these properties:
49
+ - `variant: '' | 'plain' | 'outlined' | 'filled'` - Appearance variant
50
+ - `disabled: boolean` - Whether disabled
51
+ - `readonly: boolean` - Whether read-only
52
+ - `compact: boolean` - Whether compact mode
53
+ - `style: string` - Custom CSS styles
54
+ - `displayMode: DisplayMode` - Display mode
55
+
56
+ ## Styling and Theming
57
+
58
+ ### CSS Custom Properties
59
+
60
+ All components support theme customization through CSS custom properties:
61
+
62
+ ```css
63
+ :root {
64
+ /* Colors */
65
+ --uniface-primary-color: #007bff;
66
+ --uniface-secondary-color: #6c757d;
67
+ --uniface-success-color: #28a745;
68
+ --uniface-danger-color: #dc3545;
69
+ --uniface-warning-color: #ffc107;
70
+ --uniface-info-color: #17a2b8;
71
+ --uniface-light-color: #f8f9fa;
72
+ --uniface-dark-color: #343a40;
73
+
74
+ /* Borders */
75
+ --uniface-border-color: #dee2e6;
76
+ --uniface-border-radius: 4px;
77
+ --uniface-border-width: 1px;
78
+
79
+ /* Spacing */
80
+ --uniface-padding-sm: 4px 8px;
81
+ --uniface-padding-md: 8px 12px;
82
+ --uniface-padding-lg: 12px 16px;
83
+
84
+ /* Typography */
85
+ --uniface-font-size-sm: 12px;
86
+ --uniface-font-size-md: 14px;
87
+ --uniface-font-size-lg: 16px;
88
+
89
+ /* Shadows */
90
+ --uniface-box-shadow: 0 2px 4px rgba(0,0,0,0.1);
91
+ --uniface-box-shadow-hover: 0 4px 8px rgba(0,0,0,0.15);
92
+ }
93
+ ```
94
+
95
+ ### Variant Styles
96
+
97
+ #### Plain Variant
98
+ ```css
99
+ .uniface-editor.plain {
100
+ border: none;
101
+ background: transparent;
102
+ }
103
+ ```
104
+
105
+ #### Outlined Variant
106
+ ```css
107
+ .uniface-editor.outlined {
108
+ border: 1px solid var(--uniface-border-color);
109
+ background: white;
110
+ }
111
+ ```
112
+
113
+ #### Filled Variant
114
+ ```css
115
+ .uniface-editor.filled {
116
+ border: none;
117
+ background: var(--uniface-light-color);
118
+ }
119
+ ```
120
+
121
+ ### Compact Mode
122
+ ```css
123
+ .uniface-editor.compact {
124
+ padding: var(--uniface-padding-sm);
125
+ font-size: var(--uniface-font-size-sm);
126
+ }
127
+ ```
128
+
129
+ ## Icon Usage
130
+
131
+ All components use the `@ticatec/uniface-google-material-icons` icon library, which is a wrapper for Google Material Icons.
132
+
133
+ ### Common Icons
134
+
135
+ | Icon Class | Description | Usage |
136
+ |------------|-------------|-------|
137
+ | `icon_google_add` | Add | Add buttons, create operations |
138
+ | `icon_google_edit` | Edit | Edit buttons, modify operations |
139
+ | `icon_google_delete` | Delete | Delete buttons, remove operations |
140
+ | `icon_google_search` | Search | Search boxes, find functionality |
141
+ | `icon_google_clear` | Clear | Clear inputs, reset operations |
142
+ | `icon_google_arrow_drop_down` | Dropdown arrow | Dropdown select components |
143
+ | `icon_google_arrow_drop_up` | Collapse arrow | Collapse dropdown panels |
144
+ | `icon_google_check` | Check | Checkboxes, confirm operations |
145
+ | `icon_google_close` | Close | Close buttons, cancel operations |
146
+ | `icon_google_calendar_today` | Calendar | Date pickers |
147
+ | `icon_google_access_time` | Time | Time pickers |
148
+ | `icon_google_keyboard_arrow_down` | Keyboard arrow down | Cascade select components |
149
+ | `icon_google_keyboard_control` | Control key | Lookup editors |
150
+
151
+ ### Icon Usage Examples
152
+
153
+ ```svelte
154
+ <!-- Direct usage in HTML -->
155
+ <i class="icon_google_search"></i>
156
+
157
+ <!-- Usage in component properties -->
158
+ <Button icon="icon_google_add" label="Add User" />
159
+
160
+ <!-- Usage in CSS -->
161
+ <style>
162
+ .custom-icon::before {
163
+ content: '';
164
+ @extend .icon_google_settings;
165
+ }
166
+ </style>
167
+ ```
168
+
169
+ ## Internationalization Support
170
+
171
+ ### Using @ticatec/i18n
172
+
173
+ ```svelte
174
+ <script lang="ts">
175
+ import i18n from '@ticatec/i18n';
176
+
177
+ // Get localized text
178
+ const getText = (key: string, defaultText: string) => {
179
+ return i18n.getText(key, defaultText);
180
+ };
181
+ </script>
182
+
183
+ <TextEditor
184
+ placeholder={getText('uniface.editor.placeholder', 'Please enter content')}
185
+ />
186
+
187
+ <Button
188
+ label={getText('uniface.button.save', 'Save')}
189
+ />
190
+ ```
191
+
192
+ ### Common Internationalization Keys
193
+
194
+ | Key | English | Chinese |
195
+ |-----|---------|---------|
196
+ | `uniface.button.save` | Save | 保存 |
197
+ | `uniface.button.cancel` | Cancel | 取消 |
198
+ | `uniface.button.delete` | Delete | 删除 |
199
+ | `uniface.button.edit` | Edit | 编辑 |
200
+ | `uniface.loadMore` | Load more | 加载更多 |
201
+ | `uniface.noData` | No data | 暂无数据 |
202
+ | `uniface.loading` | Loading... | 加载中... |
203
+ | `uniface.error.required` | This field is required | 此字段为必填项 |
204
+ | `uniface.error.invalid` | Invalid input format | 输入格式无效 |
205
+
206
+ ## Best Practices
207
+
208
+ ### 1. Responsive Design
209
+ ```svelte
210
+ <style>
211
+ .form-container {
212
+ display: grid;
213
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
214
+ gap: 16px;
215
+ }
216
+
217
+ @media (max-width: 768px) {
218
+ .form-container {
219
+ grid-template-columns: 1fr;
220
+ }
221
+ }
222
+ </style>
223
+ ```
224
+
225
+ ### 2. Accessibility
226
+ ```svelte
227
+ <!-- Add labels for each form field -->
228
+ <label for="username">Username:</label>
229
+ <TextEditor id="username" placeholder="Enter username" />
230
+
231
+ <!-- Add descriptions for select components -->
232
+ <OptionsSelect
233
+ aria-describedby="country-description"
234
+ placeholder="Select country"
235
+ options={countries}
236
+ />
237
+ <div id="country-description" class="form-help">
238
+ Please select your country or region
239
+ </div>
240
+ ```
241
+
242
+ ### 3. Performance Optimization
243
+ ```svelte
244
+ <script lang="ts">
245
+ import { onMount } from 'svelte';
246
+
247
+ // Lazy load large option datasets
248
+ onMount(async () => {
249
+ const response = await fetch('/api/options');
250
+ options = await response.json();
251
+ });
252
+
253
+ // Use debouncing for search
254
+ let searchTimeout: number;
255
+ const handleSearch = (keyword: string) => {
256
+ clearTimeout(searchTimeout);
257
+ searchTimeout = setTimeout(() => {
258
+ performSearch(keyword);
259
+ }, 300);
260
+ };
261
+ </script>
262
+ ```
263
+
264
+ ### 4. Error Handling
265
+ ```svelte
266
+ <script lang="ts">
267
+ let loading = false;
268
+ let error: string | null = null;
269
+
270
+ const handleAsyncOperation = async () => {
271
+ loading = true;
272
+ error = null;
273
+
274
+ try {
275
+ await performOperation();
276
+ } catch (err) {
277
+ error = err.message;
278
+ console.error('Operation failed:', err);
279
+ } finally {
280
+ loading = false;
281
+ }
282
+ };
283
+ </script>
284
+
285
+ {#if error}
286
+ <div class="error-alert">
287
+ <i class="icon_google_error"></i>
288
+ {error}
289
+ </div>
290
+ {/if}
291
+ ```
292
+
293
+ ## Form Validation Example
294
+
295
+ ```svelte
296
+ <script lang="ts">
297
+ import TextEditor from '@ticatec/uniface-element/TextEditor';
298
+ import NumberEditor from '@ticatec/uniface-element/NumberEditor';
299
+ import CheckBox from '@ticatec/uniface-element/Checkbox';
300
+
301
+ let formData = {
302
+ name: '',
303
+ email: '',
304
+ age: null as number | null,
305
+ agreed: false
306
+ };
307
+
308
+ let errors: Record<string, string> = {};
309
+
310
+ // Validation rules
311
+ const validators = {
312
+ name: (value: string) => {
313
+ if (!value || value.trim().length === 0) {
314
+ return 'Name cannot be empty';
315
+ }
316
+ if (value.length < 2) {
317
+ return 'Name must be at least 2 characters';
318
+ }
319
+ return null;
320
+ },
321
+ email: (value: string) => {
322
+ if (!value) return 'Email cannot be empty';
323
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
324
+ if (!emailRegex.test(value)) {
325
+ return 'Please enter a valid email address';
326
+ }
327
+ return null;
328
+ },
329
+ age: (value: number | null) => {
330
+ if (value === null) return 'Age cannot be empty';
331
+ if (value < 18) return 'Age must be at least 18';
332
+ if (value > 120) return 'Please enter a valid age';
333
+ return null;
334
+ },
335
+ agreed: (value: boolean) => {
336
+ if (!value) return 'Please agree to the terms';
337
+ return null;
338
+ }
339
+ };
340
+
341
+ // Validate single field
342
+ const validateField = (field: string, value: any) => {
343
+ const error = validators[field]?.(value);
344
+ if (error) {
345
+ errors[field] = error;
346
+ } else {
347
+ delete errors[field];
348
+ }
349
+ errors = { ...errors };
350
+ };
351
+
352
+ // Validate entire form
353
+ const validateForm = () => {
354
+ const newErrors: Record<string, string> = {};
355
+ Object.keys(validators).forEach(field => {
356
+ const error = validators[field](formData[field]);
357
+ if (error) {
358
+ newErrors[field] = error;
359
+ }
360
+ });
361
+ errors = newErrors;
362
+ return Object.keys(errors).length === 0;
363
+ };
364
+
365
+ const handleSubmit = () => {
366
+ if (validateForm()) {
367
+ console.log('Form submitted successfully', formData);
368
+ } else {
369
+ console.log('Form validation failed', errors);
370
+ }
371
+ };
372
+ </script>
373
+
374
+ <form on:submit|preventDefault={handleSubmit}>
375
+ <!-- Name input -->
376
+ <div class="form-field">
377
+ <TextEditor
378
+ placeholder="Enter your name"
379
+ bind:value={formData.name}
380
+ onChange={(value) => validateField('name', value)}
381
+ />
382
+ {#if errors.name}
383
+ <div class="error-message">{errors.name}</div>
384
+ {/if}
385
+ </div>
386
+
387
+ <!-- Email input -->
388
+ <div class="form-field">
389
+ <TextEditor
390
+ placeholder="Enter your email"
391
+ bind:value={formData.email}
392
+ onChange={(value) => validateField('email', value)}
393
+ />
394
+ {#if errors.email}
395
+ <div class="error-message">{errors.email}</div>
396
+ {/if}
397
+ </div>
398
+
399
+ <!-- Age input -->
400
+ <div class="form-field">
401
+ <NumberEditor
402
+ placeholder="Enter your age"
403
+ min={1}
404
+ max={120}
405
+ bind:value={formData.age}
406
+ onChange={(value) => validateField('age', value)}
407
+ />
408
+ {#if errors.age}
409
+ <div class="error-message">{errors.age}</div>
410
+ {/if}
411
+ </div>
412
+
413
+ <!-- Agreement checkbox -->
414
+ <div class="form-field">
415
+ <CheckBox
416
+ label="I agree to the Terms of Service and Privacy Policy"
417
+ bind:value={formData.agreed}
418
+ onChange={(value) => validateField('agreed', value)}
419
+ />
420
+ {#if errors.agreed}
421
+ <div class="error-message">{errors.agreed}</div>
422
+ {/if}
423
+ </div>
424
+
425
+ <button type="submit" disabled={Object.keys(errors).length > 0}>
426
+ Submit Form
427
+ </button>
428
+ </form>
429
+
430
+ <style>
431
+ .form-field {
432
+ margin-bottom: 16px;
433
+ }
434
+
435
+ .error-message {
436
+ color: var(--uniface-danger-color);
437
+ font-size: 12px;
438
+ margin-top: 4px;
439
+ }
440
+
441
+ button:disabled {
442
+ opacity: 0.5;
443
+ cursor: not-allowed;
444
+ }
445
+ </style>
446
+ ```
447
+
448
+ ---
449
+
450
+ ## Summary
451
+
452
+ This documentation covers the complete API and usage of the Uniface form component library. Each component follows unified design principles and interaction patterns, ensuring excellent user and developer experience.
453
+
454
+ Key features:
455
+ - 🎨 Unified visual design and user experience
456
+ - 🔧 TypeScript support with complete type definitions
457
+ - 🌍 Internationalization support
458
+ - ♿ Accessibility considerations
459
+ - 📱 Responsive design
460
+ - 🎯 High-performance implementation
461
+ - 🔌 Flexible extension mechanisms
462
+
463
+ For more information or if you encounter issues, please refer to the relevant component source code or contact the development team.