@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,542 @@
1
+ # FlexRowForm 组件
2
+
3
+ 灵活的行式表单布局组件,提供基于行的表单容器,支持垂直和水平字段布局模式。
4
+
5
+ ## 组件说明
6
+
7
+ FlexRowForm 组件由以下子组件组成:
8
+ - **FormContainer** - 主容器组件
9
+ - **Row** - 行组件,用于组织表单行
10
+ - **Cell** - 单元格组件,用于放置表单字段
11
+
12
+ ## FormContainer 属性
13
+
14
+ | 属性 | 类型 | 默认值 | 描述 |
15
+ |------|------|--------|------|
16
+ | `style` | `string` | `''` | 自定义样式 |
17
+ | `fieldLayout` | `'vertical' \| 'horizontal'` | `'vertical'` | 字段布局方向 |
18
+
19
+ ## 使用示例
20
+
21
+ ### 基础行式布局
22
+
23
+ ```svelte
24
+ <script lang="ts">
25
+ import FormContainer, Row, Cell, FormField, TextEditor, NumberEditor from '@ticatec/uniface-element/FormContainer, Row, Cell, FormField, TextEditor, NumberEditor';
26
+
27
+ interface UserInfo {
28
+ firstName: string;
29
+ lastName: string;
30
+ age: number | null;
31
+ email: string;
32
+ }
33
+
34
+ let userInfo: UserInfo = {
35
+ firstName: '',
36
+ lastName: '',
37
+ age: null,
38
+ email: ''
39
+ };
40
+
41
+ const handleSubmit = (): void => {
42
+ console.log('提交用户信息:', userInfo);
43
+ };
44
+ </script>
45
+
46
+ <FormContainer fieldLayout="horizontal">
47
+ <Row>
48
+ <Cell>
49
+ <FormField label="姓">
50
+ <TextEditor
51
+ placeholder="请输入姓氏"
52
+ bind:value={userInfo.firstName}
53
+ />
54
+ </FormField>
55
+ </Cell>
56
+
57
+ <Cell>
58
+ <FormField label="名">
59
+ <TextEditor
60
+ placeholder="请输入名字"
61
+ bind:value={userInfo.lastName}
62
+ />
63
+ </FormField>
64
+ </Cell>
65
+
66
+ <Cell>
67
+ <FormField label="年龄">
68
+ <NumberEditor
69
+ placeholder="请输入年龄"
70
+ min={1}
71
+ max={120}
72
+ bind:value={userInfo.age}
73
+ />
74
+ </FormField>
75
+ </Cell>
76
+ </Row>
77
+
78
+ <Row>
79
+ <Cell>
80
+ <FormField label="邮箱">
81
+ <TextEditor
82
+ placeholder="请输入邮箱地址"
83
+ bind:value={userInfo.email}
84
+ />
85
+ </FormField>
86
+ </Cell>
87
+ </Row>
88
+
89
+ <Row>
90
+ <Cell>
91
+ <div class="form-actions">
92
+ <button type="button" on:click={handleSubmit}>
93
+ 提交
94
+ </button>
95
+ </div>
96
+ </Cell>
97
+ </Row>
98
+ </FormContainer>
99
+ ```
100
+
101
+ ### 复杂表单布局
102
+
103
+ ```svelte
104
+ <script lang="ts">
105
+ import FormContainer, Row, Cell, FormField, TextEditor, OptionsSelect, DatePicker, CheckBox from '@ticatec/uniface-element/FormContainer, Row, Cell, FormField, TextEditor, OptionsSelect, DatePicker, CheckBox';
106
+
107
+ interface EmployeeForm {
108
+ personalInfo: {
109
+ firstName: string;
110
+ lastName: string;
111
+ gender: string;
112
+ birthDate: Date | null;
113
+ };
114
+ workInfo: {
115
+ department: string;
116
+ position: string;
117
+ startDate: Date | null;
118
+ };
119
+ contact: {
120
+ phone: string;
121
+ email: string;
122
+ address: string;
123
+ };
124
+ preferences: {
125
+ emailNotifications: boolean;
126
+ newsletter: boolean;
127
+ };
128
+ }
129
+
130
+ let employeeData: EmployeeForm = {
131
+ personalInfo: {
132
+ firstName: '',
133
+ lastName: '',
134
+ gender: '',
135
+ birthDate: null
136
+ },
137
+ workInfo: {
138
+ department: '',
139
+ position: '',
140
+ startDate: null
141
+ },
142
+ contact: {
143
+ phone: '',
144
+ email: '',
145
+ address: ''
146
+ },
147
+ preferences: {
148
+ emailNotifications: true,
149
+ newsletter: false
150
+ }
151
+ };
152
+
153
+ const genderOptions = [
154
+ { code: 'male', text: '男' },
155
+ { code: 'female', text: '女' },
156
+ { code: 'other', text: '其他' }
157
+ ];
158
+
159
+ const departmentOptions = [
160
+ { code: 'engineering', text: '工程部' },
161
+ { code: 'marketing', text: '市场部' },
162
+ { code: 'sales', text: '销售部' },
163
+ { code: 'hr', text: '人事部' }
164
+ ];
165
+
166
+ const validateForm = (): boolean => {
167
+ return employeeData.personalInfo.firstName.length > 0 &&
168
+ employeeData.personalInfo.lastName.length > 0 &&
169
+ employeeData.contact.email.length > 0;
170
+ };
171
+
172
+ const handleSave = (): void => {
173
+ if (validateForm()) {
174
+ console.log('保存员工信息:', employeeData);
175
+ } else {
176
+ alert('请填写必填字段');
177
+ }
178
+ };
179
+ </script>
180
+
181
+ <div class="employee-form">
182
+ <h2>员工信息表单</h2>
183
+
184
+ <FormContainer fieldLayout="horizontal">
185
+ <!-- 个人信息行 -->
186
+ <Row>
187
+ <Cell>
188
+ <h3>个人信息</h3>
189
+ </Cell>
190
+ </Row>
191
+
192
+ <Row>
193
+ <Cell>
194
+ <FormField label="姓" required>
195
+ <TextEditor bind:value={employeeData.personalInfo.firstName} />
196
+ </FormField>
197
+ </Cell>
198
+
199
+ <Cell>
200
+ <FormField label="名" required>
201
+ <TextEditor bind:value={employeeData.personalInfo.lastName} />
202
+ </FormField>
203
+ </Cell>
204
+
205
+ <Cell>
206
+ <FormField label="性别">
207
+ <OptionsSelect
208
+ options={genderOptions}
209
+ keyField="code"
210
+ textField="text"
211
+ bind:value={employeeData.personalInfo.gender}
212
+ />
213
+ </FormField>
214
+ </Cell>
215
+ </Row>
216
+
217
+ <Row>
218
+ <Cell>
219
+ <FormField label="出生日期">
220
+ <DatePicker bind:value={employeeData.personalInfo.birthDate} />
221
+ </FormField>
222
+ </Cell>
223
+ </Row>
224
+
225
+ <!-- 工作信息行 -->
226
+ <Row>
227
+ <Cell>
228
+ <h3>工作信息</h3>
229
+ </Cell>
230
+ </Row>
231
+
232
+ <Row>
233
+ <Cell>
234
+ <FormField label="部门">
235
+ <OptionsSelect
236
+ options={departmentOptions}
237
+ keyField="code"
238
+ textField="text"
239
+ bind:value={employeeData.workInfo.department}
240
+ />
241
+ </FormField>
242
+ </Cell>
243
+
244
+ <Cell>
245
+ <FormField label="职位">
246
+ <TextEditor bind:value={employeeData.workInfo.position} />
247
+ </FormField>
248
+ </Cell>
249
+
250
+ <Cell>
251
+ <FormField label="入职日期">
252
+ <DatePicker bind:value={employeeData.workInfo.startDate} />
253
+ </FormField>
254
+ </Cell>
255
+ </Row>
256
+
257
+ <!-- 联系信息行 -->
258
+ <Row>
259
+ <Cell>
260
+ <h3>联系信息</h3>
261
+ </Cell>
262
+ </Row>
263
+
264
+ <Row>
265
+ <Cell>
266
+ <FormField label="电话">
267
+ <TextEditor bind:value={employeeData.contact.phone} />
268
+ </FormField>
269
+ </Cell>
270
+
271
+ <Cell>
272
+ <FormField label="邮箱" required>
273
+ <TextEditor bind:value={employeeData.contact.email} />
274
+ </FormField>
275
+ </Cell>
276
+ </Row>
277
+
278
+ <Row>
279
+ <Cell>
280
+ <FormField label="地址">
281
+ <TextEditor
282
+ multiline
283
+ rows={2}
284
+ bind:value={employeeData.contact.address}
285
+ />
286
+ </FormField>
287
+ </Cell>
288
+ </Row>
289
+
290
+ <!-- 偏好设置行 -->
291
+ <Row>
292
+ <Cell>
293
+ <h3>通知偏好</h3>
294
+ </Cell>
295
+ </Row>
296
+
297
+ <Row>
298
+ <Cell>
299
+ <FormField label="">
300
+ <CheckBox
301
+ label="接收邮件通知"
302
+ bind:value={employeeData.preferences.emailNotifications}
303
+ />
304
+ </FormField>
305
+ </Cell>
306
+
307
+ <Cell>
308
+ <FormField label="">
309
+ <CheckBox
310
+ label="订阅公司通讯"
311
+ bind:value={employeeData.preferences.newsletter}
312
+ />
313
+ </FormField>
314
+ </Cell>
315
+ </Row>
316
+
317
+ <!-- 操作按钮行 -->
318
+ <Row>
319
+ <Cell>
320
+ <div class="form-actions">
321
+ <button type="button" class="btn-secondary">
322
+ 取消
323
+ </button>
324
+ <button type="button" class="btn-primary" on:click={handleSave}>
325
+ 保存
326
+ </button>
327
+ </div>
328
+ </Cell>
329
+ </Row>
330
+ </FormContainer>
331
+ </div>
332
+
333
+ <style>
334
+ .employee-form {
335
+ max-width: 800px;
336
+ margin: 0 auto;
337
+ padding: 20px;
338
+ }
339
+
340
+ .employee-form h2 {
341
+ margin-bottom: 30px;
342
+ color: #333;
343
+ }
344
+
345
+ .employee-form h3 {
346
+ margin: 20px 0 10px 0;
347
+ color: #666;
348
+ font-size: 16px;
349
+ border-bottom: 1px solid #e1e5e9;
350
+ padding-bottom: 5px;
351
+ }
352
+
353
+ .form-actions {
354
+ display: flex;
355
+ gap: 10px;
356
+ justify-content: flex-end;
357
+ margin-top: 20px;
358
+ }
359
+
360
+ .btn-primary, .btn-secondary {
361
+ padding: 10px 20px;
362
+ border: none;
363
+ border-radius: 4px;
364
+ font-size: 14px;
365
+ cursor: pointer;
366
+ }
367
+
368
+ .btn-primary {
369
+ background: #007bff;
370
+ color: white;
371
+ }
372
+
373
+ .btn-secondary {
374
+ background: #6c757d;
375
+ color: white;
376
+ }
377
+
378
+ .btn-primary:hover {
379
+ background: #0056b3;
380
+ }
381
+
382
+ .btn-secondary:hover {
383
+ background: #545b62;
384
+ }
385
+ </style>
386
+ ```
387
+
388
+ ### 响应式行布局
389
+
390
+ ```svelte
391
+ <script lang="ts">
392
+ import { onMount } from 'svelte';
393
+
394
+ let screenWidth: number = 0;
395
+
396
+ const updateScreenWidth = (): void => {
397
+ screenWidth = window.innerWidth;
398
+ };
399
+
400
+ onMount(() => {
401
+ updateScreenWidth();
402
+ window.addEventListener('resize', updateScreenWidth);
403
+ return () => window.removeEventListener('resize', updateScreenWidth);
404
+ });
405
+
406
+ // 根据屏幕宽度调整布局
407
+ $: fieldLayout = screenWidth < 768 ? 'vertical' : 'horizontal';
408
+ $: cellsPerRow = screenWidth < 768 ? 1 : (screenWidth < 1024 ? 2 : 3);
409
+ </script>
410
+
411
+ <FormContainer {fieldLayout}>
412
+ <Row>
413
+ {#each Array(cellsPerRow) as _, i}
414
+ <Cell>
415
+ <FormField label={`字段 ${i + 1}`}>
416
+ <TextEditor placeholder={`输入字段 ${i + 1}`} />
417
+ </FormField>
418
+ </Cell>
419
+ {/each}
420
+ </Row>
421
+ </FormContainer>
422
+ ```
423
+
424
+ ## 组件特点
425
+
426
+ ### 1. 灵活的行列结构
427
+ - **Row** 组件定义表单行
428
+ - **Cell** 组件定义行内的单元格
429
+ - 可以自由组合行和列的布局
430
+
431
+ ### 2. 支持多种布局模式
432
+ - **垂直布局**:标签在上,控件在下
433
+ - **水平布局**:标签在左,控件在右
434
+
435
+ ### 3. 响应式设计友好
436
+ - 可以根据屏幕尺寸调整每行的单元格数量
437
+ - 支持在不同设备上切换布局模式
438
+
439
+ ## 与FlexForm的对比
440
+
441
+ | 特性 | FlexForm | FlexRowForm |
442
+ |------|----------|-------------|
443
+ | 结构 | 简单的容器结构 | 基于行列的网格结构 |
444
+ | 布局控制 | 整体布局模式 | 可以逐行控制布局 |
445
+ | 复杂度 | 简单,适合基本表单 | 复杂,适合大型表单 |
446
+ | 响应式 | 整体响应式 | 可以精确控制每行的响应式行为 |
447
+ | 使用场景 | 简单表单 | 复杂的多段表单 |
448
+
449
+ ## 最佳实践
450
+
451
+ ### 1. 合理规划行结构
452
+ ```svelte
453
+ <!-- 相关字段分组在同一行 -->
454
+ <Row>
455
+ <Cell><FormField label="姓"><TextEditor /></FormField></Cell>
456
+ <Cell><FormField label="名"><TextEditor /></FormField></Cell>
457
+ </Row>
458
+
459
+ <!-- 独立字段单独成行 -->
460
+ <Row>
461
+ <Cell><FormField label="详细地址"><TextEditor multiline /></FormField></Cell>
462
+ </Row>
463
+ ```
464
+
465
+ ### 2. 响应式设计
466
+ ```svelte
467
+ <script lang="ts">
468
+ // 根据屏幕尺寸调整每行的字段数量
469
+ $: isMobile = window.innerWidth < 768;
470
+ </script>
471
+
472
+ {#if isMobile}
473
+ <!-- 移动端:每行一个字段 -->
474
+ <Row><Cell><FormField label="姓名"><TextEditor /></FormField></Cell></Row>
475
+ <Row><Cell><FormField label="邮箱"><TextEditor /></FormField></Cell></Row>
476
+ {:else}
477
+ <!-- 桌面端:每行多个字段 -->
478
+ <Row>
479
+ <Cell><FormField label="姓名"><TextEditor /></FormField></Cell>
480
+ <Cell><FormField label="邮箱"><TextEditor /></FormField></Cell>
481
+ </Row>
482
+ {/if}
483
+ ```
484
+
485
+ ### 3. 标题和分组
486
+ ```svelte
487
+ <FormContainer>
488
+ <!-- 分组标题行 -->
489
+ <Row>
490
+ <Cell><h3>个人信息</h3></Cell>
491
+ </Row>
492
+
493
+ <!-- 相关字段行 -->
494
+ <Row>
495
+ <Cell><FormField label="姓名"><TextEditor /></FormField></Cell>
496
+ <Cell><FormField label="年龄"><NumberEditor /></FormField></Cell>
497
+ </Row>
498
+ </FormContainer>
499
+ ```
500
+
501
+ ## 样式定制
502
+
503
+ ```css
504
+ /* 行容器样式 */
505
+ :global(.flex-row-form) {
506
+ display: flex;
507
+ flex-direction: column;
508
+ gap: 16px;
509
+ }
510
+
511
+ /* 水平布局样式 */
512
+ :global(.flex-row-form.field-layout-horizontal) {
513
+ gap: 12px;
514
+ }
515
+
516
+ /* 自定义行样式 */
517
+ .custom-row {
518
+ padding: 10px;
519
+ border: 1px solid #e1e5e9;
520
+ border-radius: 4px;
521
+ }
522
+
523
+ /* 自定义单元格样式 */
524
+ .custom-cell {
525
+ padding: 8px;
526
+ }
527
+
528
+ /* 响应式样式 */
529
+ @media (max-width: 768px) {
530
+ :global(.flex-row-form) {
531
+ gap: 8px;
532
+ }
533
+ }
534
+ ```
535
+
536
+ ## 组件优势
537
+
538
+ 1. **精确布局控制** - 可以逐行控制布局和字段排列
539
+ 2. **结构化组织** - 清晰的行列结构,便于管理复杂表单
540
+ 3. **高度可定制** - 每个行和单元格都可以独立定制样式
541
+ 4. **响应式友好** - 支持精确的响应式布局控制
542
+ 5. **可维护性强** - 结构化的组织方式便于后期维护和修改