@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,454 @@
1
+ # FlexForm 组件
2
+
3
+ 弹性表单布局组件,提供灵活的表单容器,支持垂直和水平字段布局模式。
4
+
5
+ ## 属性
6
+
7
+ | 属性 | 类型 | 默认值 | 描述 |
8
+ |------|------|--------|------|
9
+ | `style` | `string` | `''` | 自定义样式 |
10
+ | `fieldLayout` | `'vertical' \| 'horizontal'` | `'vertical'` | 字段布局方向 |
11
+
12
+ ## 使用示例
13
+
14
+ ### 基础垂直布局表单
15
+
16
+ ```svelte
17
+ <script lang="ts">
18
+ import FlexForm, FormField, TextEditor, NumberEditor from '@ticatec/uniface-element/FlexForm, FormField, TextEditor, NumberEditor';
19
+
20
+ let formData = {
21
+ name: '',
22
+ email: '',
23
+ age: null as number | null
24
+ };
25
+
26
+ const handleSubmit = (): void => {
27
+ console.log('提交表单数据:', formData);
28
+ };
29
+ </script>
30
+
31
+ <FlexForm fieldLayout="vertical">
32
+ <FormField label="姓名" required>
33
+ <TextEditor
34
+ placeholder="请输入姓名"
35
+ bind:value={formData.name}
36
+ />
37
+ </FormField>
38
+
39
+ <FormField label="邮箱">
40
+ <TextEditor
41
+ placeholder="请输入邮箱"
42
+ bind:value={formData.email}
43
+ />
44
+ </FormField>
45
+
46
+ <FormField label="年龄">
47
+ <NumberEditor
48
+ placeholder="请输入年龄"
49
+ min={1}
50
+ max={120}
51
+ bind:value={formData.age}
52
+ />
53
+ </FormField>
54
+
55
+ <div class="form-actions">
56
+ <button type="button" on:click={handleSubmit}>
57
+ 提交
58
+ </button>
59
+ </div>
60
+ </FlexForm>
61
+ ```
62
+
63
+ ### 水平布局表单
64
+
65
+ ```svelte
66
+ <script lang="ts">
67
+ import FlexForm, FormField, TextEditor, OptionsSelect, DatePicker from '@ticatec/uniface-element/FlexForm, FormField, TextEditor, OptionsSelect, DatePicker';
68
+
69
+ interface UserProfile {
70
+ firstName: string;
71
+ lastName: string;
72
+ gender: string;
73
+ birthDate: Date | null;
74
+ }
75
+
76
+ let userProfile: UserProfile = {
77
+ firstName: '',
78
+ lastName: '',
79
+ gender: '',
80
+ birthDate: null
81
+ };
82
+
83
+ const genderOptions = [
84
+ { code: 'male', text: '男' },
85
+ { code: 'female', text: '女' },
86
+ { code: 'other', text: '其他' }
87
+ ];
88
+ </script>
89
+
90
+ <FlexForm fieldLayout="horizontal" style="max-width: 800px;">
91
+ <FormField label="姓">
92
+ <TextEditor bind:value={userProfile.firstName} />
93
+ </FormField>
94
+
95
+ <FormField label="名">
96
+ <TextEditor bind:value={userProfile.lastName} />
97
+ </FormField>
98
+
99
+ <FormField label="性别">
100
+ <OptionsSelect
101
+ options={genderOptions}
102
+ keyField="code"
103
+ textField="text"
104
+ bind:value={userProfile.gender}
105
+ />
106
+ </FormField>
107
+
108
+ <FormField label="出生日期">
109
+ <DatePicker bind:value={userProfile.birthDate} />
110
+ </FormField>
111
+ </FlexForm>
112
+ ```
113
+
114
+ ### 复杂表单布局
115
+
116
+ ```svelte
117
+ <script lang="ts">
118
+ import FlexForm, FormField, TextEditor, NumberEditor, Switch, CheckBox from '@ticatec/uniface-element/FlexForm, FormField, TextEditor, NumberEditor, Switch, CheckBox';
119
+
120
+ interface ContactForm {
121
+ personalInfo: {
122
+ name: string;
123
+ phone: string;
124
+ email: string;
125
+ };
126
+ addressInfo: {
127
+ address: string;
128
+ city: string;
129
+ zipCode: string;
130
+ };
131
+ preferences: {
132
+ newsletter: boolean;
133
+ smsNotify: boolean;
134
+ };
135
+ }
136
+
137
+ let contactForm: ContactForm = {
138
+ personalInfo: {
139
+ name: '',
140
+ phone: '',
141
+ email: ''
142
+ },
143
+ addressInfo: {
144
+ address: '',
145
+ city: '',
146
+ zipCode: ''
147
+ },
148
+ preferences: {
149
+ newsletter: false,
150
+ smsNotify: false
151
+ }
152
+ };
153
+
154
+ const validateForm = (): boolean => {
155
+ // 表单验证逻辑
156
+ return contactForm.personalInfo.name.length > 0 &&
157
+ contactForm.personalInfo.email.length > 0;
158
+ };
159
+
160
+ const handleSave = (): void => {
161
+ if (validateForm()) {
162
+ console.log('保存表单:', contactForm);
163
+ } else {
164
+ alert('请填写必填字段');
165
+ }
166
+ };
167
+ </script>
168
+
169
+ <div class="contact-form-container">
170
+ <h2>联系信息表单</h2>
171
+
172
+ <!-- 个人信息部分 -->
173
+ <section class="form-section">
174
+ <h3>个人信息</h3>
175
+ <FlexForm fieldLayout="vertical">
176
+ <FormField label="姓名" required>
177
+ <TextEditor
178
+ placeholder="请输入姓名"
179
+ bind:value={contactForm.personalInfo.name}
180
+ />
181
+ </FormField>
182
+
183
+ <FormField label="电话">
184
+ <TextEditor
185
+ placeholder="请输入电话号码"
186
+ bind:value={contactForm.personalInfo.phone}
187
+ />
188
+ </FormField>
189
+
190
+ <FormField label="邮箱" required>
191
+ <TextEditor
192
+ placeholder="请输入邮箱地址"
193
+ bind:value={contactForm.personalInfo.email}
194
+ />
195
+ </FormField>
196
+ </FlexForm>
197
+ </section>
198
+
199
+ <!-- 地址信息部分 -->
200
+ <section class="form-section">
201
+ <h3>地址信息</h3>
202
+ <FlexForm fieldLayout="horizontal">
203
+ <FormField label="地址">
204
+ <TextEditor
205
+ placeholder="请输入详细地址"
206
+ bind:value={contactForm.addressInfo.address}
207
+ />
208
+ </FormField>
209
+
210
+ <FormField label="城市">
211
+ <TextEditor
212
+ placeholder="请输入城市"
213
+ bind:value={contactForm.addressInfo.city}
214
+ />
215
+ </FormField>
216
+
217
+ <FormField label="邮编">
218
+ <TextEditor
219
+ placeholder="请输入邮政编码"
220
+ bind:value={contactForm.addressInfo.zipCode}
221
+ />
222
+ </FormField>
223
+ </FlexForm>
224
+ </section>
225
+
226
+ <!-- 偏好设置部分 -->
227
+ <section class="form-section">
228
+ <h3>通知偏好</h3>
229
+ <FlexForm fieldLayout="vertical">
230
+ <FormField label="">
231
+ <CheckBox
232
+ label="订阅邮件通讯"
233
+ bind:value={contactForm.preferences.newsletter}
234
+ />
235
+ </FormField>
236
+
237
+ <FormField label="">
238
+ <CheckBox
239
+ label="接收短信通知"
240
+ bind:value={contactForm.preferences.smsNotify}
241
+ />
242
+ </FormField>
243
+ </FlexForm>
244
+ </section>
245
+
246
+ <div class="form-actions">
247
+ <button type="button" class="btn-secondary">
248
+ 取消
249
+ </button>
250
+ <button type="button" class="btn-primary" on:click={handleSave}>
251
+ 保存
252
+ </button>
253
+ </div>
254
+ </div>
255
+
256
+ <style>
257
+ .contact-form-container {
258
+ max-width: 600px;
259
+ margin: 0 auto;
260
+ padding: 20px;
261
+ }
262
+
263
+ .form-section {
264
+ margin-bottom: 30px;
265
+ padding: 20px;
266
+ border: 1px solid #e1e5e9;
267
+ border-radius: 8px;
268
+ background: #f8f9fa;
269
+ }
270
+
271
+ .form-section h3 {
272
+ margin: 0 0 20px 0;
273
+ color: #495057;
274
+ font-size: 18px;
275
+ }
276
+
277
+ .form-actions {
278
+ display: flex;
279
+ gap: 10px;
280
+ justify-content: flex-end;
281
+ padding-top: 20px;
282
+ border-top: 1px solid #dee2e6;
283
+ }
284
+
285
+ .btn-primary, .btn-secondary {
286
+ padding: 8px 16px;
287
+ border: none;
288
+ border-radius: 4px;
289
+ font-size: 14px;
290
+ cursor: pointer;
291
+ }
292
+
293
+ .btn-primary {
294
+ background: #007bff;
295
+ color: white;
296
+ }
297
+
298
+ .btn-secondary {
299
+ background: #6c757d;
300
+ color: white;
301
+ }
302
+
303
+ .btn-primary:hover {
304
+ background: #0056b3;
305
+ }
306
+
307
+ .btn-secondary:hover {
308
+ background: #545b62;
309
+ }
310
+ </style>
311
+ ```
312
+
313
+ ## 布局模式对比
314
+
315
+ ### 垂直布局 (fieldLayout="vertical")
316
+ - 字段标签和输入控件垂直排列
317
+ - 适合表单字段较多或字段标签较长的情况
318
+ - 在较窄的屏幕上表现更好
319
+ - 每个字段占用完整宽度
320
+
321
+ ### 水平布局 (fieldLayout="horizontal")
322
+ - 字段标签和输入控件水平排列
323
+ - 适合简单表单或需要紧凑布局的情况
324
+ - 在宽屏幕上能更有效利用空间
325
+ - 标签宽度固定,输入控件占用剩余空间
326
+
327
+ ## 响应式设计
328
+
329
+ ```svelte
330
+ <script lang="ts">
331
+ import { onMount } from 'svelte';
332
+
333
+ let isNarrowScreen: boolean = false;
334
+
335
+ const checkScreenWidth = (): void => {
336
+ isNarrowScreen = window.innerWidth < 768;
337
+ };
338
+
339
+ onMount(() => {
340
+ checkScreenWidth();
341
+ window.addEventListener('resize', checkScreenWidth);
342
+ return () => window.removeEventListener('resize', checkScreenWidth);
343
+ });
344
+
345
+ $: fieldLayout = isNarrowScreen ? 'vertical' : 'horizontal';
346
+ </script>
347
+
348
+ <FlexForm {fieldLayout}>
349
+ <!-- 表单字段 -->
350
+ </FlexForm>
351
+ ```
352
+
353
+ ## 样式定制
354
+
355
+ ```css
356
+ /* 自定义FlexForm样式 */
357
+ :global(.flex-form) {
358
+ display: flex;
359
+ flex-direction: column;
360
+ gap: 16px;
361
+ }
362
+
363
+ /* 水平布局样式 */
364
+ :global(.flex-form.field-layout-horizontal) {
365
+ gap: 12px;
366
+ }
367
+
368
+ /* 自定义表单容器 */
369
+ .custom-form {
370
+ background: white;
371
+ padding: 24px;
372
+ border-radius: 8px;
373
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
374
+ }
375
+
376
+ /* 响应式样式 */
377
+ @media (max-width: 768px) {
378
+ :global(.flex-form.field-layout-horizontal) {
379
+ /* 在小屏幕上强制垂直布局 */
380
+ }
381
+ }
382
+ ```
383
+
384
+ ## 最佳实践
385
+
386
+ ### 1. 选择合适的布局模式
387
+ ```svelte
388
+ <!-- 简单表单:使用水平布局 -->
389
+ <FlexForm fieldLayout="horizontal">
390
+ <FormField label="用户名"><TextEditor /></FormField>
391
+ <FormField label="密码"><TextEditor type="password" /></FormField>
392
+ </FlexForm>
393
+
394
+ <!-- 复杂表单:使用垂直布局 -->
395
+ <FlexForm fieldLayout="vertical">
396
+ <FormField label="详细描述">
397
+ <TextEditor multiline rows={4} />
398
+ </FormField>
399
+ </FlexForm>
400
+ ```
401
+
402
+ ### 2. 合理分组表单字段
403
+ ```svelte
404
+ <div class="form-container">
405
+ <section>
406
+ <h3>基本信息</h3>
407
+ <FlexForm fieldLayout="vertical">
408
+ <!-- 基本信息字段 -->
409
+ </FlexForm>
410
+ </section>
411
+
412
+ <section>
413
+ <h3>联系方式</h3>
414
+ <FlexForm fieldLayout="horizontal">
415
+ <!-- 联系方式字段 -->
416
+ </FlexForm>
417
+ </section>
418
+ </div>
419
+ ```
420
+
421
+ ### 3. 表单验证集成
422
+ ```svelte
423
+ <script lang="ts">
424
+ let errors: Record<string, string> = {};
425
+
426
+ const validateField = (field: string, value: any): void => {
427
+ // 验证逻辑
428
+ if (!value) {
429
+ errors[field] = '此字段为必填项';
430
+ } else {
431
+ delete errors[field];
432
+ }
433
+ errors = { ...errors };
434
+ };
435
+ </script>
436
+
437
+ <FlexForm fieldLayout="vertical">
438
+ <FormField label="姓名" required error={errors.name}>
439
+ <TextEditor
440
+ bind:value={formData.name}
441
+ onChange={(value) => validateField('name', value)}
442
+ />
443
+ </FormField>
444
+ </FlexForm>
445
+ ```
446
+
447
+ ## 组件优势
448
+
449
+ 1. **灵活布局** - 支持垂直和水平两种布局模式
450
+ 2. **响应式友好** - 可根据屏幕尺寸动态调整布局
451
+ 3. **简洁API** - 最少的属性配置,易于使用
452
+ 4. **样式可定制** - 通过CSS变量和样式类轻松定制外观
453
+ 5. **语义化结构** - 清晰的HTML结构,有利于SEO和可访问性
454
+ 6. **组合性强** - 与其他表单组件完美配合使用