@ticatec/uniface-element 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/accordion/README.md +169 -0
- package/dist/accordion/README_CN.md +176 -0
- package/dist/action-bar/README.md +275 -0
- package/dist/action-bar/README_CN.md +285 -0
- package/dist/app-layout/README.md +374 -0
- package/dist/app-layout/README_CN.md +381 -0
- package/dist/app-top-bar/README.md +357 -0
- package/dist/app-top-bar/README_CN.md +365 -0
- package/dist/attachment-files/AttachmentFilesField.svelte +67 -1
- package/dist/attachment-files/AttachmentFilesField.svelte.d.ts +8 -1
- package/dist/base-calendar/CalendarBase.svelte +0 -3
- package/dist/box/README.md +385 -0
- package/dist/box/README_CN.md +393 -0
- package/dist/breadcrumbs/README.md +442 -0
- package/dist/breadcrumbs/README_CN.md +442 -0
- package/dist/button/Button.svelte +27 -7
- package/dist/button/Button.svelte.d.ts +3 -1
- package/dist/button/IconButton.svelte +26 -6
- package/dist/button/IconButton.svelte.d.ts +3 -1
- package/dist/button/IconButton_README.md +513 -0
- package/dist/button/IconButton_README_CN.md +513 -0
- package/dist/button/README.md +428 -0
- package/dist/button/README_CN.md +428 -0
- package/dist/button/TextButton.svelte +26 -6
- package/dist/button/TextButton.svelte.d.ts +3 -1
- package/dist/button/TextButton_README.md +571 -0
- package/dist/button/TextButton_README_CN.md +571 -0
- package/dist/card/README.md +666 -0
- package/dist/card/README_CN.md +666 -0
- package/dist/cascade-options-select/CascadeOptionSelect.svelte +43 -7
- package/dist/cascade-options-select/CascadeOptionSelect.svelte.d.ts +3 -4
- package/dist/cascade-options-select/README.md +663 -2
- package/dist/cascade-options-select/README_CN.md +664 -0
- package/dist/checkbox/CheckBox.svelte +20 -6
- package/dist/checkbox/CheckBox.svelte.d.ts +4 -2
- package/dist/checkbox/README.md +562 -0
- package/dist/checkbox/README_CN.md +727 -0
- package/dist/common-editor/NumberInput.svelte +39 -26
- package/dist/common-editor/NumberInput.svelte.d.ts +5 -1
- package/dist/concise-data-table/ConciseListTable.svelte +133 -36
- package/dist/concise-data-table/ConciseListTable.svelte.d.ts +8 -1
- package/dist/concise-data-table/DataCell.svelte +5 -6
- package/dist/concise-data-table/DataRow.svelte +22 -2
- package/dist/concise-data-table/DataRow.svelte.d.ts +1 -0
- package/dist/concise-data-table/README.md +606 -0
- package/dist/concise-data-table/README_CN.md +611 -0
- package/dist/context-menu/ContextMenu.svelte +138 -21
- package/dist/context-menu/ContextMenu.svelte.d.ts +5 -0
- package/dist/context-menu/ContextMenuItem.d.ts +20 -4
- package/dist/context-menu/README.md +551 -0
- package/dist/context-menu/README_CN.md +551 -0
- package/dist/criteria-field/CriteriaField.svelte +3 -5
- package/dist/criteria-field/README.md +532 -0
- package/dist/criteria-field/README_CN.md +532 -0
- package/dist/data-table/README.md +712 -0
- package/dist/data-table/README_CN.md +712 -0
- package/dist/date-picker/DatePicker.svelte +44 -7
- package/dist/date-picker/DatePicker.svelte.d.ts +3 -4
- package/dist/date-picker/DateTimePicker.svelte +32 -8
- package/dist/date-picker/DateTimePicker.svelte.d.ts +3 -4
- package/dist/date-picker/README.md +326 -0
- package/dist/date-picker/README_CN.md +316 -0
- package/dist/date-picker/ScrollBar.svelte +18 -8
- package/dist/date-picker/ScrollBar.svelte.d.ts +1 -1
- package/dist/date-picker/TimePanel.svelte +5 -5
- package/dist/date-picker/TimePanel.svelte.d.ts +1 -1
- package/dist/date-range/README.md +374 -0
- package/dist/date-range/README_CN.md +374 -0
- package/dist/dialog/DialogBoard.svelte +1 -1
- package/dist/dialog/README.md +596 -0
- package/dist/dialog/README_CN.md +596 -0
- package/dist/drawer/README.md +679 -1
- package/dist/drawer/README_CN.md +679 -0
- package/dist/group-box/group-check-box/GroupCheckBox.svelte +62 -5
- package/dist/group-box/group-check-box/GroupCheckBox.svelte.d.ts +7 -2
- package/dist/group-box/group-check-box/README.md +749 -0
- package/dist/group-box/group-check-box/README_CN.md +750 -0
- package/dist/group-box/group-radio-box/GroupRadioBox.svelte +69 -4
- package/dist/group-box/group-radio-box/GroupRadioBox.svelte.d.ts +8 -2
- package/dist/group-box/group-radio-box/README.md +920 -0
- package/dist/group-box/group-radio-box/README_CN.md +920 -0
- package/dist/image-files/README.md +1346 -0
- package/dist/image-files/README_CN.md +1346 -0
- package/dist/input-options-select/InputOptionsSelect.svelte +161 -65
- package/dist/input-options-select/InputOptionsSelect.svelte.d.ts +4 -1
- package/dist/lib/forwardAllEvents.d.ts +3 -0
- package/dist/lib/forwardAllEvents.js +24 -0
- package/dist/list-box/README.md +579 -0
- package/dist/list-box/README_CN.md +682 -0
- package/dist/lookup-editor/LookupEditor.svelte +15 -3
- package/dist/lookup-editor/LookupEditor.svelte.d.ts +3 -4
- package/dist/lookup-editor/README.md +684 -0
- package/dist/lookup-editor/README_CN.md +684 -0
- package/dist/memo-editor/MemoEditor.svelte +77 -27
- package/dist/memo-editor/MemoEditor.svelte.d.ts +6 -3
- package/dist/memo-editor/README.md +819 -0
- package/dist/memo-editor/README_CN.md +819 -0
- package/dist/message-box/README.md +398 -0
- package/dist/message-box/README_CN.md +398 -0
- package/dist/number-editor/NumberEditor.svelte +2 -2
- package/dist/number-editor/NumberEditor.svelte.d.ts +1 -1
- package/dist/number-editor/README.md +353 -22
- package/dist/number-editor/README_CN.md +357 -0
- package/dist/number-range/README.md +443 -0
- package/dist/number-range/README_CN.md +443 -0
- package/dist/options-multi-select/OptionsMultiSelect.svelte +87 -12
- package/dist/options-multi-select/OptionsMultiSelect.svelte.d.ts +3 -1
- package/dist/options-multi-select/README.md +480 -0
- package/dist/options-multi-select/README_CN.md +480 -0
- package/dist/options-select/OptionsSelect.svelte +36 -5
- package/dist/options-select/OptionsSelect.svelte.d.ts +3 -4
- package/dist/options-select/README.md +632 -0
- package/dist/options-select/README_CN.md +632 -0
- package/dist/page/README.md +605 -0
- package/dist/page/README_CN.md +605 -0
- package/dist/pagination/README.md +946 -0
- package/dist/pagination/README_CN.md +946 -0
- package/dist/pagination-panel/README.md +1075 -0
- package/dist/pagination-panel/README_CN.md +1075 -0
- package/dist/popup-hint/README.md +841 -0
- package/dist/popup-hint/README_CN.md +840 -0
- package/dist/progress-bar/README.md +242 -0
- package/dist/progress-bar/README_CN.md +242 -0
- package/dist/progress-step-bar/README.md +316 -0
- package/dist/progress-step-bar/README_CN.md +316 -0
- package/dist/prompts-text-editor/PromptsTextEditor.svelte +6 -3
- package/dist/prompts-text-editor/PromptsTextEditor.svelte.d.ts +3 -1
- package/dist/prompts-text-editor/README.md +329 -0
- package/dist/prompts-text-editor/README_CN.md +329 -0
- package/dist/property-editor/README.md +969 -0
- package/dist/property-editor/README_CN.md +969 -0
- package/dist/radio-button/README.md +372 -0
- package/dist/radio-button/README_CN.md +372 -0
- package/dist/radio-button/RadioButton.svelte +32 -3
- package/dist/radio-button/RadioButton.svelte.d.ts +12 -1
- package/dist/search-box/README.md +425 -0
- package/dist/search-box/README_CN.md +424 -0
- package/dist/search-box/SearchBox.svelte +22 -6
- package/dist/search-box/SearchBox.svelte.d.ts +4 -1
- package/dist/tabs/README.md +919 -0
- package/dist/tabs/README_CN.md +920 -0
- package/dist/tag/README.md +922 -0
- package/dist/tag/README_CN.md +922 -0
- package/dist/text-editor/PasswordEditor.svelte +17 -2
- package/dist/text-editor/PasswordEditor.svelte.d.ts +3 -3
- package/dist/text-editor/PasswordEditor_README.md +551 -0
- package/dist/text-editor/PasswordEditor_README_CN.md +551 -0
- package/dist/text-editor/README.md +466 -0
- package/dist/text-editor/README_CN.md +466 -0
- package/dist/text-editor/TextEditor.svelte +51 -19
- package/dist/text-editor/TextEditor.svelte.d.ts +0 -1
- package/dist/ticatec-uniface-web.css +1 -0
- package/dist/time-editor/README.md +498 -24
- package/dist/time-editor/README_CN.md +498 -0
- package/dist/time-editor/TimeEditor.svelte +7 -3
- package/dist/time-editor/TimeEditor.svelte.d.ts +3 -1
- package/dist/toast/README.md +667 -0
- package/dist/toast/README_CN.md +667 -0
- package/dist/transfer/README.md +795 -0
- package/dist/transfer/Transfer.svelte +6 -4
- package/dist/transfer/Transfer.svelte.d.ts +3 -1
- package/dist/tree-view/README.md +761 -0
- package/dist/tree-view/README_CN.md +761 -0
- package/dist/tree-view/TreeView.svelte +5 -3
- package/dist/tree-view/TreeView.svelte.d.ts +3 -1
- package/dist/unit-number-editor/README.md +546 -20
- package/dist/unit-number-editor/README_CN.md +525 -0
- package/dist/unit-number-editor/UnitNumberEditor.svelte +62 -8
- package/dist/unit-number-editor/UnitNumberEditor.svelte.d.ts +5 -1
- package/docs/form-field/cn/README_CN.md +364 -0
- package/docs/form-field/en/README.md +364 -0
- package/docs/form-panel/flex-form/cn/README_CN.md +586 -0
- package/docs/form-panel/flex-form/en/README.md +586 -0
- package/docs/form-panel/flex-row-form/cn/README_CN.md +787 -0
- package/docs/form-panel/flex-row-form/en/README.md +787 -0
- package/docs/form-panel/grid-form/en/README.md +744 -0
- package/package.json +1 -1
- package/dist/drawer/README-CN.md +0 -1
|
@@ -0,0 +1,586 @@
|
|
|
1
|
+
# FlexForm 弹性表单布局
|
|
2
|
+
|
|
3
|
+
基于网格的弹性表单布局系统,允许您创建具有自动换行和列跨越功能的响应式表单。
|
|
4
|
+
|
|
5
|
+
## 特性
|
|
6
|
+
|
|
7
|
+
- **网格布局系统**: 12列网格系统,实现灵活的表单布局
|
|
8
|
+
- **响应式设计**: 自动换行和响应式行为
|
|
9
|
+
- **列跨越**: 单元格可跨越多列(1-12列)
|
|
10
|
+
- **布局模式**: 支持垂直和水平字段布局
|
|
11
|
+
- **表单字段集成**: 内置FormField集成,支持标签和验证
|
|
12
|
+
- **空单元格支持**: 用于布局对齐的占位单元格
|
|
13
|
+
- **手动换行**: 精确布局控制的手动换行
|
|
14
|
+
|
|
15
|
+
## 安装
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install @ticatec/uniface-element
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## 使用方法
|
|
22
|
+
|
|
23
|
+
### 基本用法
|
|
24
|
+
|
|
25
|
+
```svelte
|
|
26
|
+
<script>
|
|
27
|
+
import FlexForm, { CellField } from '@ticatec/uniface-element/flex-form';
|
|
28
|
+
import TextEditor from '@ticatec/uniface-element/text-editor';
|
|
29
|
+
|
|
30
|
+
let formData = {};
|
|
31
|
+
</script>
|
|
32
|
+
|
|
33
|
+
<FlexForm>
|
|
34
|
+
<CellField span={6} label="名" required>
|
|
35
|
+
<TextEditor bind:value={formData.firstName} />
|
|
36
|
+
</CellField>
|
|
37
|
+
|
|
38
|
+
<CellField span={6} label="姓" required>
|
|
39
|
+
<TextEditor bind:value={formData.lastName} />
|
|
40
|
+
</CellField>
|
|
41
|
+
|
|
42
|
+
<CellField span={12} label="邮箱地址">
|
|
43
|
+
<TextEditor bind:value={formData.email} />
|
|
44
|
+
</CellField>
|
|
45
|
+
</FlexForm>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 完整表单示例
|
|
49
|
+
|
|
50
|
+
```svelte
|
|
51
|
+
<script>
|
|
52
|
+
import FlexForm, { CellField, EmptyCell, RowBreak } from '@ticatec/uniface-element/flex-form';
|
|
53
|
+
import TextEditor from '@ticatec/uniface-element/text-editor';
|
|
54
|
+
import DatePicker from '@ticatec/uniface-element/date-picker';
|
|
55
|
+
import OptionsSelect from '@ticatec/uniface-element/options-select';
|
|
56
|
+
import MemoEditor from '@ticatec/uniface-element/memo-editor';
|
|
57
|
+
|
|
58
|
+
let formData = {};
|
|
59
|
+
let errors = {};
|
|
60
|
+
|
|
61
|
+
const genderOptions = [
|
|
62
|
+
{ code: 'F', text: '女' },
|
|
63
|
+
{ code: 'M', text: '男' }
|
|
64
|
+
];
|
|
65
|
+
|
|
66
|
+
const countries = [
|
|
67
|
+
{ code: 'AU', text: '澳大利亚' },
|
|
68
|
+
{ code: 'NZ', text: '新西兰' },
|
|
69
|
+
{ code: 'US', text: '美国' }
|
|
70
|
+
];
|
|
71
|
+
</script>
|
|
72
|
+
|
|
73
|
+
<FlexForm style="max-width: 800px; margin: 0 auto;">
|
|
74
|
+
<CellField span={4} label="姓名" required error={errors.name}>
|
|
75
|
+
<TextEditor
|
|
76
|
+
bind:value={formData.name}
|
|
77
|
+
variant="filled"
|
|
78
|
+
placeholder="请输入姓名"
|
|
79
|
+
/>
|
|
80
|
+
</CellField>
|
|
81
|
+
|
|
82
|
+
<CellField span={4} label="出生日期" required error={errors.dob}>
|
|
83
|
+
<DatePicker
|
|
84
|
+
bind:value={formData.dob}
|
|
85
|
+
variant="filled"
|
|
86
|
+
max={new Date()}
|
|
87
|
+
/>
|
|
88
|
+
</CellField>
|
|
89
|
+
|
|
90
|
+
<CellField span={4} label="性别" required error={errors.gender}>
|
|
91
|
+
<OptionsSelect
|
|
92
|
+
bind:value={formData.gender}
|
|
93
|
+
variant="filled"
|
|
94
|
+
options={genderOptions}
|
|
95
|
+
/>
|
|
96
|
+
</CellField>
|
|
97
|
+
|
|
98
|
+
<CellField span={6} label="国籍" error={errors.nationality}>
|
|
99
|
+
<OptionsSelect
|
|
100
|
+
bind:value={formData.nationality}
|
|
101
|
+
variant="filled"
|
|
102
|
+
options={countries}
|
|
103
|
+
/>
|
|
104
|
+
</CellField>
|
|
105
|
+
|
|
106
|
+
<EmptyCell span={6} />
|
|
107
|
+
|
|
108
|
+
<CellField span={12} label="备注" error={errors.notes}>
|
|
109
|
+
<MemoEditor
|
|
110
|
+
bind:value={formData.notes}
|
|
111
|
+
variant="filled"
|
|
112
|
+
input$rows={4}
|
|
113
|
+
input$maxLength={300}
|
|
114
|
+
showIndicator
|
|
115
|
+
/>
|
|
116
|
+
</CellField>
|
|
117
|
+
</FlexForm>
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### 水平布局
|
|
121
|
+
|
|
122
|
+
```svelte
|
|
123
|
+
<FlexForm fieldLayout="horizontal">
|
|
124
|
+
<CellField span={6} label="开始日期">
|
|
125
|
+
<DatePicker bind:value={startDate} variant="filled" />
|
|
126
|
+
</CellField>
|
|
127
|
+
|
|
128
|
+
<CellField span={6} label="结束日期">
|
|
129
|
+
<DatePicker bind:value={endDate} variant="filled" />
|
|
130
|
+
</CellField>
|
|
131
|
+
</FlexForm>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## API 参考
|
|
135
|
+
|
|
136
|
+
### FlexForm
|
|
137
|
+
|
|
138
|
+
弹性表单布局的主容器组件。
|
|
139
|
+
|
|
140
|
+
#### 属性
|
|
141
|
+
|
|
142
|
+
| 属性 | 类型 | 默认值 | 描述 |
|
|
143
|
+
|------|------|---------|-------------|
|
|
144
|
+
| `style` | `string` | `''` | 表单容器的自定义CSS样式 |
|
|
145
|
+
| `fieldLayout` | `'vertical' \| 'horizontal'` | `'vertical'` | 表单字段的布局模式 |
|
|
146
|
+
|
|
147
|
+
#### 插槽
|
|
148
|
+
|
|
149
|
+
| 插槽 | 描述 |
|
|
150
|
+
|------|-------------|
|
|
151
|
+
| default | 表单内容,包括CellField、EmptyCell和RowBreak组件 |
|
|
152
|
+
|
|
153
|
+
### CellField
|
|
154
|
+
|
|
155
|
+
在网格中跨越指定列数的表单字段组件。
|
|
156
|
+
|
|
157
|
+
#### 属性
|
|
158
|
+
|
|
159
|
+
| 属性 | 类型 | 默认值 | 描述 |
|
|
160
|
+
|------|------|---------|-------------|
|
|
161
|
+
| `span` | `number` | `1` | 跨越的列数(1-12) |
|
|
162
|
+
| `label` | `string` | `"Label:"` | 表单字段的标签文本 |
|
|
163
|
+
| `style` | `string` | `''` | 字段的自定义CSS样式 |
|
|
164
|
+
| `label$style` | `string` | `''` | 标签的自定义CSS样式 |
|
|
165
|
+
| `required` | `boolean` | `false` | 字段是否必填 |
|
|
166
|
+
| `error` | `string \| null` | `null` | 要显示的错误消息 |
|
|
167
|
+
| `labelSuffix` | `string` | `':'` | 附加到标签的文本 |
|
|
168
|
+
|
|
169
|
+
#### 插槽
|
|
170
|
+
|
|
171
|
+
| 插槽 | 描述 |
|
|
172
|
+
|------|-------------|
|
|
173
|
+
| default | 表单控件内容(输入框、选择器等) |
|
|
174
|
+
|
|
175
|
+
### EmptyCell
|
|
176
|
+
|
|
177
|
+
用于布局间隔和对齐的占位单元格。
|
|
178
|
+
|
|
179
|
+
#### 属性
|
|
180
|
+
|
|
181
|
+
| 属性 | 类型 | 默认值 | 描述 |
|
|
182
|
+
|------|------|---------|-------------|
|
|
183
|
+
| `span` | `number` | `1` | 跨越的列数(1-12) |
|
|
184
|
+
|
|
185
|
+
### RowBreak
|
|
186
|
+
|
|
187
|
+
强制在表单布局中开始新行。
|
|
188
|
+
|
|
189
|
+
## 网格系统
|
|
190
|
+
|
|
191
|
+
FlexForm使用12列网格系统,每个CellField可以跨越1-12列:
|
|
192
|
+
|
|
193
|
+
- **span={1}**: 8.33% 宽度 (1/12)
|
|
194
|
+
- **span={2}**: 16.67% 宽度 (2/12)
|
|
195
|
+
- **span={3}**: 25% 宽度 (3/12)
|
|
196
|
+
- **span={4}**: 33.33% 宽度 (4/12)
|
|
197
|
+
- **span={6}**: 50% 宽度 (6/12)
|
|
198
|
+
- **span={8}**: 66.67% 宽度 (8/12)
|
|
199
|
+
- **span={12}**: 100% 宽度 (12/12)
|
|
200
|
+
|
|
201
|
+
## 布局示例
|
|
202
|
+
|
|
203
|
+
### 三列布局
|
|
204
|
+
|
|
205
|
+
```svelte
|
|
206
|
+
<FlexForm>
|
|
207
|
+
<CellField span={4} label="字段1">
|
|
208
|
+
<TextEditor bind:value={field1} />
|
|
209
|
+
</CellField>
|
|
210
|
+
|
|
211
|
+
<CellField span={4} label="字段2">
|
|
212
|
+
<TextEditor bind:value={field2} />
|
|
213
|
+
</CellField>
|
|
214
|
+
|
|
215
|
+
<CellField span={4} label="字段3">
|
|
216
|
+
<TextEditor bind:value={field3} />
|
|
217
|
+
</CellField>
|
|
218
|
+
</FlexForm>
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### 混合宽度布局
|
|
222
|
+
|
|
223
|
+
```svelte
|
|
224
|
+
<FlexForm>
|
|
225
|
+
<CellField span={8} label="主要字段">
|
|
226
|
+
<TextEditor bind:value={primary} />
|
|
227
|
+
</CellField>
|
|
228
|
+
|
|
229
|
+
<CellField span={4} label="次要字段">
|
|
230
|
+
<TextEditor bind:value={secondary} />
|
|
231
|
+
</CellField>
|
|
232
|
+
|
|
233
|
+
<CellField span={3} label="小字段">
|
|
234
|
+
<TextEditor bind:value={small1} />
|
|
235
|
+
</CellField>
|
|
236
|
+
|
|
237
|
+
<CellField span={3} label="小字段">
|
|
238
|
+
<TextEditor bind:value={small2} />
|
|
239
|
+
</CellField>
|
|
240
|
+
|
|
241
|
+
<CellField span={6} label="中等字段">
|
|
242
|
+
<TextEditor bind:value={medium} />
|
|
243
|
+
</CellField>
|
|
244
|
+
</FlexForm>
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### 带空单元格的布局
|
|
248
|
+
|
|
249
|
+
```svelte
|
|
250
|
+
<FlexForm>
|
|
251
|
+
<CellField span={4} label="左侧字段">
|
|
252
|
+
<TextEditor bind:value={left} />
|
|
253
|
+
</CellField>
|
|
254
|
+
|
|
255
|
+
<EmptyCell span={4} />
|
|
256
|
+
|
|
257
|
+
<CellField span={4} label="右侧字段">
|
|
258
|
+
<TextEditor bind:value={right} />
|
|
259
|
+
</CellField>
|
|
260
|
+
</FlexForm>
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### 手动换行
|
|
264
|
+
|
|
265
|
+
```svelte
|
|
266
|
+
<FlexForm>
|
|
267
|
+
<CellField span={6} label="字段1">
|
|
268
|
+
<TextEditor bind:value={field1} />
|
|
269
|
+
</CellField>
|
|
270
|
+
|
|
271
|
+
<CellField span={4} label="字段2">
|
|
272
|
+
<TextEditor bind:value={field2} />
|
|
273
|
+
</CellField>
|
|
274
|
+
|
|
275
|
+
<RowBreak />
|
|
276
|
+
|
|
277
|
+
<CellField span={8} label="新行字段">
|
|
278
|
+
<TextEditor bind:value={field3} />
|
|
279
|
+
</CellField>
|
|
280
|
+
</FlexForm>
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## 响应式设计
|
|
284
|
+
|
|
285
|
+
FlexForm自动适应不同的屏幕尺寸。您可以使用自定义CSS增强响应性:
|
|
286
|
+
|
|
287
|
+
```svelte
|
|
288
|
+
<FlexForm style="max-width: 1200px; margin: 0 auto;">
|
|
289
|
+
<CellField span={6} label="响应式字段">
|
|
290
|
+
<TextEditor bind:value={value} />
|
|
291
|
+
</CellField>
|
|
292
|
+
</FlexForm>
|
|
293
|
+
|
|
294
|
+
<style>
|
|
295
|
+
@media (max-width: 768px) {
|
|
296
|
+
:global(.flex-form .form-cell) {
|
|
297
|
+
width: 100% !important;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
</style>
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
## 验证和错误处理
|
|
304
|
+
|
|
305
|
+
```svelte
|
|
306
|
+
<script>
|
|
307
|
+
let formData = {
|
|
308
|
+
name: '',
|
|
309
|
+
email: '',
|
|
310
|
+
phone: ''
|
|
311
|
+
};
|
|
312
|
+
|
|
313
|
+
let errors = {};
|
|
314
|
+
|
|
315
|
+
function validateForm() {
|
|
316
|
+
errors = {};
|
|
317
|
+
|
|
318
|
+
if (!formData.name) {
|
|
319
|
+
errors.name = '姓名为必填项';
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
if (!formData.email) {
|
|
323
|
+
errors.email = '邮箱为必填项';
|
|
324
|
+
} else if (!/\S+@\S+\.\S+/.test(formData.email)) {
|
|
325
|
+
errors.email = '请输入有效的邮箱地址';
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
if (!formData.phone) {
|
|
329
|
+
errors.phone = '电话号码为必填项';
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
return Object.keys(errors).length === 0;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function handleSubmit() {
|
|
336
|
+
if (validateForm()) {
|
|
337
|
+
console.log('表单提交:', formData);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
</script>
|
|
341
|
+
|
|
342
|
+
<FlexForm>
|
|
343
|
+
<CellField span={12} label="姓名" required error={errors.name}>
|
|
344
|
+
<TextEditor
|
|
345
|
+
bind:value={formData.name}
|
|
346
|
+
variant="filled"
|
|
347
|
+
placeholder="请输入您的姓名"
|
|
348
|
+
/>
|
|
349
|
+
</CellField>
|
|
350
|
+
|
|
351
|
+
<CellField span={6} label="邮箱地址" required error={errors.email}>
|
|
352
|
+
<TextEditor
|
|
353
|
+
bind:value={formData.email}
|
|
354
|
+
variant="filled"
|
|
355
|
+
placeholder="请输入邮箱地址"
|
|
356
|
+
/>
|
|
357
|
+
</CellField>
|
|
358
|
+
|
|
359
|
+
<CellField span={6} label="电话号码" required error={errors.phone}>
|
|
360
|
+
<TextEditor
|
|
361
|
+
bind:value={formData.phone}
|
|
362
|
+
variant="filled"
|
|
363
|
+
placeholder="请输入电话号码"
|
|
364
|
+
/>
|
|
365
|
+
</CellField>
|
|
366
|
+
|
|
367
|
+
<CellField span={12}>
|
|
368
|
+
<button type="button" on:click={handleSubmit}>
|
|
369
|
+
提交表单
|
|
370
|
+
</button>
|
|
371
|
+
</CellField>
|
|
372
|
+
</FlexForm>
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
## 样式
|
|
376
|
+
|
|
377
|
+
### 自定义表单样式
|
|
378
|
+
|
|
379
|
+
```svelte
|
|
380
|
+
<FlexForm
|
|
381
|
+
style="
|
|
382
|
+
border: 1px solid #e1e5e9;
|
|
383
|
+
border-radius: 8px;
|
|
384
|
+
padding: 24px;
|
|
385
|
+
background: #fafbfc;
|
|
386
|
+
"
|
|
387
|
+
>
|
|
388
|
+
<CellField
|
|
389
|
+
span={6}
|
|
390
|
+
label="样式字段"
|
|
391
|
+
label$style="color: #2563eb; font-weight: 600;"
|
|
392
|
+
>
|
|
393
|
+
<TextEditor bind:value={value} variant="filled" />
|
|
394
|
+
</CellField>
|
|
395
|
+
</FlexForm>
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
### CSS 类
|
|
399
|
+
|
|
400
|
+
```css
|
|
401
|
+
.custom-flex-form {
|
|
402
|
+
max-width: 800px;
|
|
403
|
+
margin: 2rem auto;
|
|
404
|
+
padding: 2rem;
|
|
405
|
+
border: 1px solid #e2e8f0;
|
|
406
|
+
border-radius: 0.5rem;
|
|
407
|
+
background: white;
|
|
408
|
+
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
.custom-flex-form .form-cell {
|
|
412
|
+
margin-bottom: 1rem;
|
|
413
|
+
}
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
## 最佳实践
|
|
417
|
+
|
|
418
|
+
### 1. 一致的跨度设置
|
|
419
|
+
|
|
420
|
+
对相似类型的字段使用一致的列跨度:
|
|
421
|
+
|
|
422
|
+
```svelte
|
|
423
|
+
<FlexForm>
|
|
424
|
+
<!-- 个人信息 -->
|
|
425
|
+
<CellField span={6} label="名" required>
|
|
426
|
+
<TextEditor bind:value={firstName} />
|
|
427
|
+
</CellField>
|
|
428
|
+
|
|
429
|
+
<CellField span={6} label="姓" required>
|
|
430
|
+
<TextEditor bind:value={lastName} />
|
|
431
|
+
</CellField>
|
|
432
|
+
|
|
433
|
+
<!-- 联系信息 -->
|
|
434
|
+
<CellField span={6} label="邮箱" required>
|
|
435
|
+
<TextEditor bind:value={email} />
|
|
436
|
+
</CellField>
|
|
437
|
+
|
|
438
|
+
<CellField span={6} label="电话">
|
|
439
|
+
<TextEditor bind:value={phone} />
|
|
440
|
+
</CellField>
|
|
441
|
+
</FlexForm>
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
### 2. 逻辑分组
|
|
445
|
+
|
|
446
|
+
将相关字段分组,对重要数据使用全宽字段:
|
|
447
|
+
|
|
448
|
+
```svelte
|
|
449
|
+
<FlexForm>
|
|
450
|
+
<!-- 主要标识符使用全宽 -->
|
|
451
|
+
<CellField span={12} label="公司名称" required>
|
|
452
|
+
<TextEditor bind:value={companyName} />
|
|
453
|
+
</CellField>
|
|
454
|
+
|
|
455
|
+
<!-- 地址字段使用较小列 -->
|
|
456
|
+
<CellField span={8} label="街道地址">
|
|
457
|
+
<TextEditor bind:value={address} />
|
|
458
|
+
</CellField>
|
|
459
|
+
|
|
460
|
+
<CellField span={4} label="邮政编码">
|
|
461
|
+
<TextEditor bind:value={postalCode} />
|
|
462
|
+
</CellField>
|
|
463
|
+
</FlexForm>
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### 3. 响应式考虑
|
|
467
|
+
|
|
468
|
+
考虑您的布局在移动设备上的显示效果:
|
|
469
|
+
|
|
470
|
+
```svelte
|
|
471
|
+
<FlexForm class="responsive-form">
|
|
472
|
+
<CellField span={4} label="字段1">
|
|
473
|
+
<TextEditor bind:value={field1} />
|
|
474
|
+
</CellField>
|
|
475
|
+
|
|
476
|
+
<CellField span={4} label="字段2">
|
|
477
|
+
<TextEditor bind:value={field2} />
|
|
478
|
+
</CellField>
|
|
479
|
+
|
|
480
|
+
<CellField span={4} label="字段3">
|
|
481
|
+
<TextEditor bind:value={field3} />
|
|
482
|
+
</CellField>
|
|
483
|
+
</FlexForm>
|
|
484
|
+
|
|
485
|
+
<style>
|
|
486
|
+
@media (max-width: 768px) {
|
|
487
|
+
:global(.responsive-form .form-cell) {
|
|
488
|
+
width: 100% !important;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
</style>
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
### 4. 错误状态管理
|
|
495
|
+
|
|
496
|
+
在所有字段中保持一致的错误处理:
|
|
497
|
+
|
|
498
|
+
```svelte
|
|
499
|
+
<script>
|
|
500
|
+
function validateField(field, value) {
|
|
501
|
+
if (!value || value.trim() === '') {
|
|
502
|
+
return `${field}为必填项`;
|
|
503
|
+
}
|
|
504
|
+
return null;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
$: errors = {
|
|
508
|
+
name: validateField('姓名', formData.name),
|
|
509
|
+
email: validateField('邮箱', formData.email)
|
|
510
|
+
};
|
|
511
|
+
</script>
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
## 与其他组件集成
|
|
515
|
+
|
|
516
|
+
### 与DatePicker集成
|
|
517
|
+
|
|
518
|
+
```svelte
|
|
519
|
+
<FlexForm>
|
|
520
|
+
<CellField span={4} label="开始日期" required>
|
|
521
|
+
<DatePicker
|
|
522
|
+
bind:value={startDate}
|
|
523
|
+
variant="filled"
|
|
524
|
+
max={endDate}
|
|
525
|
+
/>
|
|
526
|
+
</CellField>
|
|
527
|
+
|
|
528
|
+
<CellField span={4} label="结束日期" required>
|
|
529
|
+
<DatePicker
|
|
530
|
+
bind:value={endDate}
|
|
531
|
+
variant="filled"
|
|
532
|
+
min={startDate}
|
|
533
|
+
/>
|
|
534
|
+
</CellField>
|
|
535
|
+
</FlexForm>
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
### 与OptionsSelect集成
|
|
539
|
+
|
|
540
|
+
```svelte
|
|
541
|
+
<FlexForm>
|
|
542
|
+
<CellField span={6} label="国家" required>
|
|
543
|
+
<OptionsSelect
|
|
544
|
+
bind:value={country}
|
|
545
|
+
variant="filled"
|
|
546
|
+
options={countryOptions}
|
|
547
|
+
placeholder="请选择国家"
|
|
548
|
+
/>
|
|
549
|
+
</CellField>
|
|
550
|
+
|
|
551
|
+
<CellField span={6} label="省/州">
|
|
552
|
+
<OptionsSelect
|
|
553
|
+
bind:value={state}
|
|
554
|
+
variant="filled"
|
|
555
|
+
options={stateOptions}
|
|
556
|
+
disabled={!country}
|
|
557
|
+
/>
|
|
558
|
+
</CellField>
|
|
559
|
+
</FlexForm>
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
## 无障碍功能
|
|
563
|
+
|
|
564
|
+
- **语义结构**: 正确的表单字段标签和关联
|
|
565
|
+
- **键盘导航**: 标准表单导航模式
|
|
566
|
+
- **屏幕阅读器支持**: 适当的ARIA属性和角色
|
|
567
|
+
- **错误通知**: 清晰的错误消息关联
|
|
568
|
+
- **焦点管理**: 通过字段的逻辑tab顺序
|
|
569
|
+
|
|
570
|
+
## 浏览器支持
|
|
571
|
+
|
|
572
|
+
- **现代浏览器**: Chrome、Firefox、Safari、Edge(最新版本)
|
|
573
|
+
- **移动浏览器**: iOS Safari、Chrome Mobile、Firefox Mobile
|
|
574
|
+
- **CSS Flexbox**: 布局功能必需
|
|
575
|
+
|
|
576
|
+
## 相关组件
|
|
577
|
+
|
|
578
|
+
- **FormField**: 基础表单字段组件
|
|
579
|
+
- **TextEditor**: 单行文本输入
|
|
580
|
+
- **MemoEditor**: 多行文本区域
|
|
581
|
+
- **DatePicker**: 日期选择组件
|
|
582
|
+
- **OptionsSelect**: 下拉选择组件
|
|
583
|
+
|
|
584
|
+
## 许可证
|
|
585
|
+
|
|
586
|
+
MIT许可证 - 详情请参阅LICENSE文件。
|