@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,676 @@
1
+ # GridForm 组件
2
+
3
+ 网格表单布局组件,提供基于CSS Grid的表单容器,支持灵活的网格布局和字段排列。
4
+
5
+ ## 属性
6
+
7
+ | 属性 | 类型 | 默认值 | 描述 |
8
+ |------|------|--------|------|
9
+ | `style` | `string` | `''` | 自定义样式 |
10
+ | `columns` | `number` | `6` | 网格列数 |
11
+ | `fieldLayout` | `'vertical' \| 'horizontal'` | `'vertical'` | 字段布局方向 |
12
+
13
+ ## 使用示例
14
+
15
+ ### 基础网格表单
16
+
17
+ ```svelte
18
+ <script lang="ts">
19
+ import GridForm, FormField, TextEditor, NumberEditor, OptionsSelect from '@ticatec/uniface-element/GridForm, FormField, TextEditor, NumberEditor, OptionsSelect';
20
+
21
+ interface UserProfile {
22
+ firstName: string;
23
+ lastName: string;
24
+ age: number | null;
25
+ gender: string;
26
+ email: string;
27
+ phone: string;
28
+ }
29
+
30
+ let userProfile: UserProfile = {
31
+ firstName: '',
32
+ lastName: '',
33
+ age: null,
34
+ gender: '',
35
+ email: '',
36
+ phone: ''
37
+ };
38
+
39
+ const genderOptions = [
40
+ { code: 'male', text: '男' },
41
+ { code: 'female', text: '女' },
42
+ { code: 'other', text: '其他' }
43
+ ];
44
+
45
+ const handleSubmit = (): void => {
46
+ console.log('提交用户信息:', userProfile);
47
+ };
48
+ </script>
49
+
50
+ <!-- 6列网格布局 -->
51
+ <GridForm columns={6} fieldLayout="vertical">
52
+ <FormField label="姓" style="grid-column: span 2;">
53
+ <TextEditor
54
+ placeholder="请输入姓氏"
55
+ bind:value={userProfile.firstName}
56
+ />
57
+ </FormField>
58
+
59
+ <FormField label="名" style="grid-column: span 2;">
60
+ <TextEditor
61
+ placeholder="请输入名字"
62
+ bind:value={userProfile.lastName}
63
+ />
64
+ </FormField>
65
+
66
+ <FormField label="年龄" style="grid-column: span 2;">
67
+ <NumberEditor
68
+ placeholder="请输入年龄"
69
+ min={1}
70
+ max={120}
71
+ bind:value={userProfile.age}
72
+ />
73
+ </FormField>
74
+
75
+ <FormField label="性别" style="grid-column: span 3;">
76
+ <OptionsSelect
77
+ options={genderOptions}
78
+ keyField="code"
79
+ textField="text"
80
+ bind:value={userProfile.gender}
81
+ />
82
+ </FormField>
83
+
84
+ <FormField label="电话" style="grid-column: span 3;">
85
+ <TextEditor
86
+ placeholder="请输入电话号码"
87
+ bind:value={userProfile.phone}
88
+ />
89
+ </FormField>
90
+
91
+ <FormField label="邮箱" style="grid-column: span 6;">
92
+ <TextEditor
93
+ placeholder="请输入邮箱地址"
94
+ bind:value={userProfile.email}
95
+ />
96
+ </FormField>
97
+
98
+ <div style="grid-column: span 6;" class="form-actions">
99
+ <button type="button" on:click={handleSubmit}>
100
+ 提交
101
+ </button>
102
+ </div>
103
+ </GridForm>
104
+
105
+ <style>
106
+ .form-actions {
107
+ display: flex;
108
+ justify-content: center;
109
+ margin-top: 20px;
110
+ }
111
+
112
+ .form-actions button {
113
+ padding: 10px 24px;
114
+ background: #007bff;
115
+ color: white;
116
+ border: none;
117
+ border-radius: 4px;
118
+ cursor: pointer;
119
+ }
120
+
121
+ .form-actions button:hover {
122
+ background: #0056b3;
123
+ }
124
+ </style>
125
+ ```
126
+
127
+ ### 复杂网格表单布局
128
+
129
+ ```svelte
130
+ <script lang="ts">
131
+ import GridForm, FormField, TextEditor, NumberEditor, DatePicker, OptionsSelect, CheckBox from '@ticatec/uniface-element/GridForm, FormField, TextEditor, NumberEditor, DatePicker, OptionsSelect, CheckBox';
132
+
133
+ interface ProductForm {
134
+ basicInfo: {
135
+ name: string;
136
+ category: string;
137
+ brand: string;
138
+ model: string;
139
+ };
140
+ pricing: {
141
+ cost: number | null;
142
+ price: number | null;
143
+ discount: number | null;
144
+ };
145
+ inventory: {
146
+ stock: number | null;
147
+ minStock: number | null;
148
+ maxStock: number | null;
149
+ };
150
+ details: {
151
+ description: string;
152
+ specifications: string;
153
+ launchDate: Date | null;
154
+ };
155
+ settings: {
156
+ isActive: boolean;
157
+ isFeatured: boolean;
158
+ allowBackorder: boolean;
159
+ };
160
+ }
161
+
162
+ let productData: ProductForm = {
163
+ basicInfo: {
164
+ name: '',
165
+ category: '',
166
+ brand: '',
167
+ model: ''
168
+ },
169
+ pricing: {
170
+ cost: null,
171
+ price: null,
172
+ discount: null
173
+ },
174
+ inventory: {
175
+ stock: null,
176
+ minStock: null,
177
+ maxStock: null
178
+ },
179
+ details: {
180
+ description: '',
181
+ specifications: '',
182
+ launchDate: null
183
+ },
184
+ settings: {
185
+ isActive: true,
186
+ isFeatured: false,
187
+ allowBackorder: false
188
+ }
189
+ };
190
+
191
+ const categoryOptions = [
192
+ { code: 'electronics', text: '电子产品' },
193
+ { code: 'clothing', text: '服装' },
194
+ { code: 'books', text: '图书' },
195
+ { code: 'home', text: '家居用品' }
196
+ ];
197
+
198
+ const validateForm = (): boolean => {
199
+ return productData.basicInfo.name.length > 0 &&
200
+ productData.basicInfo.category.length > 0 &&
201
+ productData.pricing.price !== null;
202
+ };
203
+
204
+ const handleSave = (): void => {
205
+ if (validateForm()) {
206
+ console.log('保存产品信息:', productData);
207
+ } else {
208
+ alert('请填写必填字段');
209
+ }
210
+ };
211
+ </script>
212
+
213
+ <div class="product-form">
214
+ <h2>产品信息表单</h2>
215
+
216
+ <GridForm columns={12} fieldLayout="vertical">
217
+ <!-- 基本信息部分 -->
218
+ <div style="grid-column: span 12;" class="section-header">
219
+ <h3>基本信息</h3>
220
+ </div>
221
+
222
+ <FormField label="产品名称" required style="grid-column: span 6;">
223
+ <TextEditor
224
+ placeholder="请输入产品名称"
225
+ bind:value={productData.basicInfo.name}
226
+ />
227
+ </FormField>
228
+
229
+ <FormField label="产品分类" required style="grid-column: span 3;">
230
+ <OptionsSelect
231
+ options={categoryOptions}
232
+ keyField="code"
233
+ textField="text"
234
+ placeholder="请选择分类"
235
+ bind:value={productData.basicInfo.category}
236
+ />
237
+ </FormField>
238
+
239
+ <FormField label="品牌" style="grid-column: span 3;">
240
+ <TextEditor
241
+ placeholder="请输入品牌"
242
+ bind:value={productData.basicInfo.brand}
243
+ />
244
+ </FormField>
245
+
246
+ <FormField label="型号" style="grid-column: span 6;">
247
+ <TextEditor
248
+ placeholder="请输入产品型号"
249
+ bind:value={productData.basicInfo.model}
250
+ />
251
+ </FormField>
252
+
253
+ <FormField label="发布日期" style="grid-column: span 6;">
254
+ <DatePicker bind:value={productData.details.launchDate} />
255
+ </FormField>
256
+
257
+ <!-- 价格信息部分 -->
258
+ <div style="grid-column: span 12;" class="section-header">
259
+ <h3>价格信息</h3>
260
+ </div>
261
+
262
+ <FormField label="成本价" style="grid-column: span 4;">
263
+ <NumberEditor
264
+ placeholder="请输入成本价"
265
+ min={0}
266
+ precision={2}
267
+ bind:value={productData.pricing.cost}
268
+ />
269
+ </FormField>
270
+
271
+ <FormField label="销售价" required style="grid-column: span 4;">
272
+ <NumberEditor
273
+ placeholder="请输入销售价"
274
+ min={0}
275
+ precision={2}
276
+ bind:value={productData.pricing.price}
277
+ />
278
+ </FormField>
279
+
280
+ <FormField label="折扣(%)" style="grid-column: span 4;">
281
+ <NumberEditor
282
+ placeholder="请输入折扣"
283
+ min={0}
284
+ max={100}
285
+ precision={1}
286
+ bind:value={productData.pricing.discount}
287
+ />
288
+ </FormField>
289
+
290
+ <!-- 库存信息部分 -->
291
+ <div style="grid-column: span 12;" class="section-header">
292
+ <h3>库存信息</h3>
293
+ </div>
294
+
295
+ <FormField label="当前库存" style="grid-column: span 4;">
296
+ <NumberEditor
297
+ placeholder="请输入库存数量"
298
+ min={0}
299
+ bind:value={productData.inventory.stock}
300
+ />
301
+ </FormField>
302
+
303
+ <FormField label="最小库存" style="grid-column: span 4;">
304
+ <NumberEditor
305
+ placeholder="请输入最小库存"
306
+ min={0}
307
+ bind:value={productData.inventory.minStock}
308
+ />
309
+ </FormField>
310
+
311
+ <FormField label="最大库存" style="grid-column: span 4;">
312
+ <NumberEditor
313
+ placeholder="请输入最大库存"
314
+ min={0}
315
+ bind:value={productData.inventory.maxStock}
316
+ />
317
+ </FormField>
318
+
319
+ <!-- 详细信息部分 -->
320
+ <div style="grid-column: span 12;" class="section-header">
321
+ <h3>详细信息</h3>
322
+ </div>
323
+
324
+ <FormField label="产品描述" style="grid-column: span 6;">
325
+ <TextEditor
326
+ multiline
327
+ rows={4}
328
+ placeholder="请输入产品描述"
329
+ bind:value={productData.details.description}
330
+ />
331
+ </FormField>
332
+
333
+ <FormField label="技术规格" style="grid-column: span 6;">
334
+ <TextEditor
335
+ multiline
336
+ rows={4}
337
+ placeholder="请输入技术规格"
338
+ bind:value={productData.details.specifications}
339
+ />
340
+ </FormField>
341
+
342
+ <!-- 设置选项部分 -->
343
+ <div style="grid-column: span 12;" class="section-header">
344
+ <h3>设置选项</h3>
345
+ </div>
346
+
347
+ <FormField label="" style="grid-column: span 4;">
348
+ <CheckBox
349
+ label="启用产品"
350
+ bind:value={productData.settings.isActive}
351
+ />
352
+ </FormField>
353
+
354
+ <FormField label="" style="grid-column: span 4;">
355
+ <CheckBox
356
+ label="推荐产品"
357
+ bind:value={productData.settings.isFeatured}
358
+ />
359
+ </FormField>
360
+
361
+ <FormField label="" style="grid-column: span 4;">
362
+ <CheckBox
363
+ label="允许缺货预订"
364
+ bind:value={productData.settings.allowBackorder}
365
+ />
366
+ </FormField>
367
+
368
+ <!-- 操作按钮 -->
369
+ <div style="grid-column: span 12;" class="form-actions">
370
+ <button type="button" class="btn-secondary">
371
+ 取消
372
+ </button>
373
+ <button type="button" class="btn-primary" on:click={handleSave}>
374
+ 保存产品
375
+ </button>
376
+ </div>
377
+ </GridForm>
378
+ </div>
379
+
380
+ <style>
381
+ .product-form {
382
+ max-width: 1000px;
383
+ margin: 0 auto;
384
+ padding: 20px;
385
+ }
386
+
387
+ .product-form h2 {
388
+ margin-bottom: 30px;
389
+ color: #333;
390
+ text-align: center;
391
+ }
392
+
393
+ .section-header {
394
+ margin: 20px 0 10px 0;
395
+ }
396
+
397
+ .section-header h3 {
398
+ margin: 0;
399
+ padding: 10px 0;
400
+ color: #495057;
401
+ font-size: 16px;
402
+ border-bottom: 2px solid #007bff;
403
+ background: linear-gradient(90deg, #f8f9fa 0%, transparent 100%);
404
+ padding-left: 10px;
405
+ }
406
+
407
+ .form-actions {
408
+ display: flex;
409
+ gap: 15px;
410
+ justify-content: center;
411
+ margin-top: 30px;
412
+ padding-top: 20px;
413
+ border-top: 1px solid #dee2e6;
414
+ }
415
+
416
+ .btn-primary, .btn-secondary {
417
+ padding: 12px 24px;
418
+ border: none;
419
+ border-radius: 4px;
420
+ font-size: 14px;
421
+ font-weight: 500;
422
+ cursor: pointer;
423
+ transition: all 0.2s;
424
+ }
425
+
426
+ .btn-primary {
427
+ background: #007bff;
428
+ color: white;
429
+ }
430
+
431
+ .btn-secondary {
432
+ background: #6c757d;
433
+ color: white;
434
+ }
435
+
436
+ .btn-primary:hover {
437
+ background: #0056b3;
438
+ transform: translateY(-1px);
439
+ }
440
+
441
+ .btn-secondary:hover {
442
+ background: #545b62;
443
+ transform: translateY(-1px);
444
+ }
445
+ </style>
446
+ ```
447
+
448
+ ### 响应式网格表单
449
+
450
+ ```svelte
451
+ <script lang="ts">
452
+ import { onMount } from 'svelte';
453
+
454
+ let screenWidth: number = 0;
455
+
456
+ const updateScreenWidth = (): void => {
457
+ screenWidth = window.innerWidth;
458
+ };
459
+
460
+ onMount(() => {
461
+ updateScreenWidth();
462
+ window.addEventListener('resize', updateScreenWidth);
463
+ return () => window.removeEventListener('resize', updateScreenWidth);
464
+ });
465
+
466
+ // 响应式列数计算
467
+ $: columns = screenWidth < 768 ? 2 : (screenWidth < 1024 ? 4 : 6);
468
+ $: fieldLayout = screenWidth < 768 ? 'vertical' : 'horizontal';
469
+
470
+ interface ContactForm {
471
+ name: string;
472
+ email: string;
473
+ phone: string;
474
+ address: string;
475
+ }
476
+
477
+ let contactData: ContactForm = {
478
+ name: '',
479
+ email: '',
480
+ phone: '',
481
+ address: ''
482
+ };
483
+ </script>
484
+
485
+ <div class="responsive-form">
486
+ <h3>响应式网格表单 (当前列数: {columns})</h3>
487
+
488
+ <GridForm {columns} {fieldLayout}>
489
+ <FormField
490
+ label="姓名"
491
+ style="grid-column: span {Math.min(columns, 3)};"
492
+ >
493
+ <TextEditor bind:value={contactData.name} />
494
+ </FormField>
495
+
496
+ <FormField
497
+ label="邮箱"
498
+ style="grid-column: span {Math.min(columns, 3)};"
499
+ >
500
+ <TextEditor bind:value={contactData.email} />
501
+ </FormField>
502
+
503
+ <FormField
504
+ label="电话"
505
+ style="grid-column: span {Math.min(columns, 2)};"
506
+ >
507
+ <TextEditor bind:value={contactData.phone} />
508
+ </FormField>
509
+
510
+ <FormField
511
+ label="地址"
512
+ style="grid-column: span {columns};"
513
+ >
514
+ <TextEditor
515
+ multiline
516
+ rows={2}
517
+ bind:value={contactData.address}
518
+ />
519
+ </FormField>
520
+ </GridForm>
521
+ </div>
522
+
523
+ <style>
524
+ .responsive-form {
525
+ max-width: 800px;
526
+ margin: 0 auto;
527
+ padding: 20px;
528
+ }
529
+
530
+ .responsive-form h3 {
531
+ margin-bottom: 20px;
532
+ color: #495057;
533
+ text-align: center;
534
+ }
535
+ </style>
536
+ ```
537
+
538
+ ## 网格跨列控制
539
+
540
+ 使用CSS Grid的`grid-column: span X`语法来控制字段占用的列数:
541
+
542
+ ```svelte
543
+ <GridForm columns={12}>
544
+ <!-- 占用2列 -->
545
+ <FormField label="姓名" style="grid-column: span 2;">
546
+ <TextEditor />
547
+ </FormField>
548
+
549
+ <!-- 占用4列 -->
550
+ <FormField label="邮箱地址" style="grid-column: span 4;">
551
+ <TextEditor />
552
+ </FormField>
553
+
554
+ <!-- 占用6列 -->
555
+ <FormField label="详细地址" style="grid-column: span 6;">
556
+ <TextEditor />
557
+ </FormField>
558
+
559
+ <!-- 占用整行(12列) -->
560
+ <FormField label="备注" style="grid-column: span 12;">
561
+ <TextEditor multiline rows={3} />
562
+ </FormField>
563
+ </GridForm>
564
+ ```
565
+
566
+ ## 常用列数配置
567
+
568
+ | 列数 | 适用场景 | 典型用途 |
569
+ |------|----------|----------|
570
+ | 2 | 移动端或简单表单 | 左右两栏布局 |
571
+ | 3 | 平板或中等复杂度表单 | 三栏等宽布局 |
572
+ | 4 | 桌面端标准表单 | 四栏布局,灵活组合 |
573
+ | 6 | 复杂表单 | 支持1/2、1/3、1/6等比例 |
574
+ | 12 | 高度灵活的表单 | Bootstrap式12栅格系统 |
575
+
576
+ ## 最佳实践
577
+
578
+ ### 1. 合理规划网格列数
579
+ ```svelte
580
+ <!-- 移动优先的响应式设计 -->
581
+ <script lang="ts">
582
+ $: columns = window.innerWidth < 768 ? 2 :
583
+ window.innerWidth < 1024 ? 4 : 6;
584
+ </script>
585
+
586
+ <GridForm {columns}>
587
+ <!-- 字段配置 -->
588
+ </GridForm>
589
+ ```
590
+
591
+ ### 2. 逻辑分组和对齐
592
+ ```svelte
593
+ <GridForm columns={6}>
594
+ <!-- 相关字段保持同一行 -->
595
+ <FormField label="姓" style="grid-column: span 2;">
596
+ <TextEditor />
597
+ </FormField>
598
+ <FormField label="名" style="grid-column: span 2;">
599
+ <TextEditor />
600
+ </FormField>
601
+ <FormField label="年龄" style="grid-column: span 2;">
602
+ <NumberEditor />
603
+ </FormField>
604
+
605
+ <!-- 长字段独占一行 -->
606
+ <FormField label="详细地址" style="grid-column: span 6;">
607
+ <TextEditor />
608
+ </FormField>
609
+ </GridForm>
610
+ ```
611
+
612
+ ### 3. 响应式网格间隙
613
+ ```css
614
+ /* 响应式间隙控制 */
615
+ :global(.grid-form > div) {
616
+ gap: 16px;
617
+ }
618
+
619
+ @media (max-width: 768px) {
620
+ :global(.grid-form > div) {
621
+ gap: 12px;
622
+ }
623
+ }
624
+
625
+ @media (max-width: 480px) {
626
+ :global(.grid-form > div) {
627
+ gap: 8px;
628
+ }
629
+ }
630
+ ```
631
+
632
+ ## 样式定制
633
+
634
+ ```css
635
+ /* 网格表单容器 */
636
+ :global(.grid-form) {
637
+ display: block;
638
+ width: 100%;
639
+ }
640
+
641
+ /* 网格内容区域 */
642
+ :global(.grid-form > div) {
643
+ display: grid;
644
+ gap: 16px;
645
+ align-items: start;
646
+ }
647
+
648
+ /* 水平布局样式 */
649
+ :global(.grid-form.field-layout-horizontal > div) {
650
+ align-items: center;
651
+ }
652
+
653
+ /* 自定义网格项样式 */
654
+ .grid-item {
655
+ padding: 8px;
656
+ background: #f8f9fa;
657
+ border-radius: 4px;
658
+ }
659
+
660
+ /* 分组样式 */
661
+ .section-divider {
662
+ grid-column: 1 / -1;
663
+ height: 1px;
664
+ background: #dee2e6;
665
+ margin: 20px 0;
666
+ }
667
+ ```
668
+
669
+ ## 组件优势
670
+
671
+ 1. **灵活的网格系统** - 基于CSS Grid,支持任意列数配置
672
+ 2. **精确的布局控制** - 可以精确控制每个字段的占用列数
673
+ 3. **响应式友好** - 易于实现响应式布局调整
674
+ 4. **对齐一致** - 自动对齐表单字段,保持视觉一致性
675
+ 5. **扩展性强** - 支持复杂的表单布局需求
676
+ 6. **性能优化** - CSS Grid原生支持,性能优异