@ticatec/uniface-element 0.2.4 → 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/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/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
|
+
A flexible grid-based form layout system that allows you to create responsive forms with automatic row wrapping and column spanning.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Grid-Based Layout**: 12-column grid system for flexible form layouts
|
|
8
|
+
- **Responsive Design**: Automatic wrapping and responsive behavior
|
|
9
|
+
- **Column Spanning**: Cells can span multiple columns (1-12)
|
|
10
|
+
- **Layout Modes**: Supports both vertical and horizontal field layouts
|
|
11
|
+
- **Form Field Integration**: Built-in FormField integration for labels and validation
|
|
12
|
+
- **Empty Cell Support**: Placeholder cells for layout alignment
|
|
13
|
+
- **Row Breaking**: Manual row breaks for precise layout control
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install @ticatec/uniface-element
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
|
|
23
|
+
### Basic Usage
|
|
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="First Name" required>
|
|
35
|
+
<TextEditor bind:value={formData.firstName} />
|
|
36
|
+
</CellField>
|
|
37
|
+
|
|
38
|
+
<CellField span={6} label="Last Name" required>
|
|
39
|
+
<TextEditor bind:value={formData.lastName} />
|
|
40
|
+
</CellField>
|
|
41
|
+
|
|
42
|
+
<CellField span={12} label="Email Address">
|
|
43
|
+
<TextEditor bind:value={formData.email} />
|
|
44
|
+
</CellField>
|
|
45
|
+
</FlexForm>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Complete Form Example
|
|
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: 'Female' },
|
|
63
|
+
{ code: 'M', text: 'Male' }
|
|
64
|
+
];
|
|
65
|
+
|
|
66
|
+
const countries = [
|
|
67
|
+
{ code: 'AU', text: 'Australia' },
|
|
68
|
+
{ code: 'NZ', text: 'New Zealand' },
|
|
69
|
+
{ code: 'US', text: 'United States' }
|
|
70
|
+
];
|
|
71
|
+
</script>
|
|
72
|
+
|
|
73
|
+
<FlexForm style="max-width: 800px; margin: 0 auto;">
|
|
74
|
+
<CellField span={4} label="Full Name" required error={errors.name}>
|
|
75
|
+
<TextEditor
|
|
76
|
+
bind:value={formData.name}
|
|
77
|
+
variant="filled"
|
|
78
|
+
placeholder="Enter full name"
|
|
79
|
+
/>
|
|
80
|
+
</CellField>
|
|
81
|
+
|
|
82
|
+
<CellField span={4} label="Date of Birth" 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="Gender" 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="Nationality" 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="Additional Notes" 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
|
+
### Horizontal Layout
|
|
121
|
+
|
|
122
|
+
```svelte
|
|
123
|
+
<FlexForm fieldLayout="horizontal">
|
|
124
|
+
<CellField span={6} label="Start Date">
|
|
125
|
+
<DatePicker bind:value={startDate} variant="filled" />
|
|
126
|
+
</CellField>
|
|
127
|
+
|
|
128
|
+
<CellField span={6} label="End Date">
|
|
129
|
+
<DatePicker bind:value={endDate} variant="filled" />
|
|
130
|
+
</CellField>
|
|
131
|
+
</FlexForm>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## API Reference
|
|
135
|
+
|
|
136
|
+
### FlexForm
|
|
137
|
+
|
|
138
|
+
Main container component for the flexible form layout.
|
|
139
|
+
|
|
140
|
+
#### Props
|
|
141
|
+
|
|
142
|
+
| Prop | Type | Default | Description |
|
|
143
|
+
|------|------|---------|-------------|
|
|
144
|
+
| `style` | `string` | `''` | Custom CSS styles for the form container |
|
|
145
|
+
| `fieldLayout` | `'vertical' \| 'horizontal'` | `'vertical'` | Layout mode for form fields |
|
|
146
|
+
|
|
147
|
+
#### Slots
|
|
148
|
+
|
|
149
|
+
| Slot | Description |
|
|
150
|
+
|------|-------------|
|
|
151
|
+
| default | Form content including CellField, EmptyCell, and RowBreak components |
|
|
152
|
+
|
|
153
|
+
### CellField
|
|
154
|
+
|
|
155
|
+
A form field component that spans specified columns in the grid.
|
|
156
|
+
|
|
157
|
+
#### Props
|
|
158
|
+
|
|
159
|
+
| Prop | Type | Default | Description |
|
|
160
|
+
|------|------|---------|-------------|
|
|
161
|
+
| `span` | `number` | `1` | Number of columns to span (1-12) |
|
|
162
|
+
| `label` | `string` | `"Label:"` | Label text for the form field |
|
|
163
|
+
| `style` | `string` | `''` | Custom CSS styles for the field |
|
|
164
|
+
| `label$style` | `string` | `''` | Custom CSS styles for the label |
|
|
165
|
+
| `required` | `boolean` | `false` | Whether the field is required |
|
|
166
|
+
| `error` | `string \| null` | `null` | Error message to display |
|
|
167
|
+
| `labelSuffix` | `string` | `':'` | Text to append to the label |
|
|
168
|
+
|
|
169
|
+
#### Slots
|
|
170
|
+
|
|
171
|
+
| Slot | Description |
|
|
172
|
+
|------|-------------|
|
|
173
|
+
| default | Form control content (input, select, etc.) |
|
|
174
|
+
|
|
175
|
+
### EmptyCell
|
|
176
|
+
|
|
177
|
+
A placeholder cell for layout spacing and alignment.
|
|
178
|
+
|
|
179
|
+
#### Props
|
|
180
|
+
|
|
181
|
+
| Prop | Type | Default | Description |
|
|
182
|
+
|------|------|---------|-------------|
|
|
183
|
+
| `span` | `number` | `1` | Number of columns to span (1-12) |
|
|
184
|
+
|
|
185
|
+
### RowBreak
|
|
186
|
+
|
|
187
|
+
Forces a new row in the form layout.
|
|
188
|
+
|
|
189
|
+
## Grid System
|
|
190
|
+
|
|
191
|
+
The FlexForm uses a 12-column grid system where each CellField can span 1-12 columns:
|
|
192
|
+
|
|
193
|
+
- **span={1}**: 8.33% width (1/12)
|
|
194
|
+
- **span={2}**: 16.67% width (2/12)
|
|
195
|
+
- **span={3}**: 25% width (3/12)
|
|
196
|
+
- **span={4}**: 33.33% width (4/12)
|
|
197
|
+
- **span={6}**: 50% width (6/12)
|
|
198
|
+
- **span={8}**: 66.67% width (8/12)
|
|
199
|
+
- **span={12}**: 100% width (12/12)
|
|
200
|
+
|
|
201
|
+
## Layout Examples
|
|
202
|
+
|
|
203
|
+
### Three Column Layout
|
|
204
|
+
|
|
205
|
+
```svelte
|
|
206
|
+
<FlexForm>
|
|
207
|
+
<CellField span={4} label="Field 1">
|
|
208
|
+
<TextEditor bind:value={field1} />
|
|
209
|
+
</CellField>
|
|
210
|
+
|
|
211
|
+
<CellField span={4} label="Field 2">
|
|
212
|
+
<TextEditor bind:value={field2} />
|
|
213
|
+
</CellField>
|
|
214
|
+
|
|
215
|
+
<CellField span={4} label="Field 3">
|
|
216
|
+
<TextEditor bind:value={field3} />
|
|
217
|
+
</CellField>
|
|
218
|
+
</FlexForm>
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Mixed Width Layout
|
|
222
|
+
|
|
223
|
+
```svelte
|
|
224
|
+
<FlexForm>
|
|
225
|
+
<CellField span={8} label="Primary Field">
|
|
226
|
+
<TextEditor bind:value={primary} />
|
|
227
|
+
</CellField>
|
|
228
|
+
|
|
229
|
+
<CellField span={4} label="Secondary">
|
|
230
|
+
<TextEditor bind:value={secondary} />
|
|
231
|
+
</CellField>
|
|
232
|
+
|
|
233
|
+
<CellField span={3} label="Small">
|
|
234
|
+
<TextEditor bind:value={small1} />
|
|
235
|
+
</CellField>
|
|
236
|
+
|
|
237
|
+
<CellField span={3} label="Small">
|
|
238
|
+
<TextEditor bind:value={small2} />
|
|
239
|
+
</CellField>
|
|
240
|
+
|
|
241
|
+
<CellField span={6} label="Medium">
|
|
242
|
+
<TextEditor bind:value={medium} />
|
|
243
|
+
</CellField>
|
|
244
|
+
</FlexForm>
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### Layout with Empty Cells
|
|
248
|
+
|
|
249
|
+
```svelte
|
|
250
|
+
<FlexForm>
|
|
251
|
+
<CellField span={4} label="Left Field">
|
|
252
|
+
<TextEditor bind:value={left} />
|
|
253
|
+
</CellField>
|
|
254
|
+
|
|
255
|
+
<EmptyCell span={4} />
|
|
256
|
+
|
|
257
|
+
<CellField span={4} label="Right Field">
|
|
258
|
+
<TextEditor bind:value={right} />
|
|
259
|
+
</CellField>
|
|
260
|
+
</FlexForm>
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Manual Row Breaks
|
|
264
|
+
|
|
265
|
+
```svelte
|
|
266
|
+
<FlexForm>
|
|
267
|
+
<CellField span={6} label="Field 1">
|
|
268
|
+
<TextEditor bind:value={field1} />
|
|
269
|
+
</CellField>
|
|
270
|
+
|
|
271
|
+
<CellField span={4} label="Field 2">
|
|
272
|
+
<TextEditor bind:value={field2} />
|
|
273
|
+
</CellField>
|
|
274
|
+
|
|
275
|
+
<RowBreak />
|
|
276
|
+
|
|
277
|
+
<CellField span={8} label="New Row Field">
|
|
278
|
+
<TextEditor bind:value={field3} />
|
|
279
|
+
</CellField>
|
|
280
|
+
</FlexForm>
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## Responsive Design
|
|
284
|
+
|
|
285
|
+
The FlexForm automatically adapts to different screen sizes. You can enhance responsiveness with custom CSS:
|
|
286
|
+
|
|
287
|
+
```svelte
|
|
288
|
+
<FlexForm style="max-width: 1200px; margin: 0 auto;">
|
|
289
|
+
<CellField span={6} label="Responsive Field">
|
|
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
|
+
## Validation and Error Handling
|
|
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 = 'Name is required';
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
if (!formData.email) {
|
|
323
|
+
errors.email = 'Email is required';
|
|
324
|
+
} else if (!/\S+@\S+\.\S+/.test(formData.email)) {
|
|
325
|
+
errors.email = 'Please enter a valid email address';
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
if (!formData.phone) {
|
|
329
|
+
errors.phone = 'Phone number is required';
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
return Object.keys(errors).length === 0;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function handleSubmit() {
|
|
336
|
+
if (validateForm()) {
|
|
337
|
+
console.log('Form submitted:', formData);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
</script>
|
|
341
|
+
|
|
342
|
+
<FlexForm>
|
|
343
|
+
<CellField span={12} label="Full Name" required error={errors.name}>
|
|
344
|
+
<TextEditor
|
|
345
|
+
bind:value={formData.name}
|
|
346
|
+
variant="filled"
|
|
347
|
+
placeholder="Enter your full name"
|
|
348
|
+
/>
|
|
349
|
+
</CellField>
|
|
350
|
+
|
|
351
|
+
<CellField span={6} label="Email Address" required error={errors.email}>
|
|
352
|
+
<TextEditor
|
|
353
|
+
bind:value={formData.email}
|
|
354
|
+
variant="filled"
|
|
355
|
+
placeholder="Enter email address"
|
|
356
|
+
/>
|
|
357
|
+
</CellField>
|
|
358
|
+
|
|
359
|
+
<CellField span={6} label="Phone Number" required error={errors.phone}>
|
|
360
|
+
<TextEditor
|
|
361
|
+
bind:value={formData.phone}
|
|
362
|
+
variant="filled"
|
|
363
|
+
placeholder="Enter phone number"
|
|
364
|
+
/>
|
|
365
|
+
</CellField>
|
|
366
|
+
|
|
367
|
+
<CellField span={12}>
|
|
368
|
+
<button type="button" on:click={handleSubmit}>
|
|
369
|
+
Submit Form
|
|
370
|
+
</button>
|
|
371
|
+
</CellField>
|
|
372
|
+
</FlexForm>
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
## Styling
|
|
376
|
+
|
|
377
|
+
### Custom Form Styling
|
|
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="Styled Field"
|
|
391
|
+
label$style="color: #2563eb; font-weight: 600;"
|
|
392
|
+
>
|
|
393
|
+
<TextEditor bind:value={value} variant="filled" />
|
|
394
|
+
</CellField>
|
|
395
|
+
</FlexForm>
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
### CSS Classes
|
|
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
|
+
## Best Practices
|
|
417
|
+
|
|
418
|
+
### 1. Consistent Spanning
|
|
419
|
+
|
|
420
|
+
Use consistent column spans for similar field types:
|
|
421
|
+
|
|
422
|
+
```svelte
|
|
423
|
+
<FlexForm>
|
|
424
|
+
<!-- Personal Information -->
|
|
425
|
+
<CellField span={6} label="First Name" required>
|
|
426
|
+
<TextEditor bind:value={firstName} />
|
|
427
|
+
</CellField>
|
|
428
|
+
|
|
429
|
+
<CellField span={6} label="Last Name" required>
|
|
430
|
+
<TextEditor bind:value={lastName} />
|
|
431
|
+
</CellField>
|
|
432
|
+
|
|
433
|
+
<!-- Contact Information -->
|
|
434
|
+
<CellField span={6} label="Email" required>
|
|
435
|
+
<TextEditor bind:value={email} />
|
|
436
|
+
</CellField>
|
|
437
|
+
|
|
438
|
+
<CellField span={6} label="Phone">
|
|
439
|
+
<TextEditor bind:value={phone} />
|
|
440
|
+
</CellField>
|
|
441
|
+
</FlexForm>
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
### 2. Logical Grouping
|
|
445
|
+
|
|
446
|
+
Group related fields together and use full-width fields for important data:
|
|
447
|
+
|
|
448
|
+
```svelte
|
|
449
|
+
<FlexForm>
|
|
450
|
+
<!-- Full-width for primary identifier -->
|
|
451
|
+
<CellField span={12} label="Company Name" required>
|
|
452
|
+
<TextEditor bind:value={companyName} />
|
|
453
|
+
</CellField>
|
|
454
|
+
|
|
455
|
+
<!-- Address fields in smaller columns -->
|
|
456
|
+
<CellField span={8} label="Street Address">
|
|
457
|
+
<TextEditor bind:value={address} />
|
|
458
|
+
</CellField>
|
|
459
|
+
|
|
460
|
+
<CellField span={4} label="Postal Code">
|
|
461
|
+
<TextEditor bind:value={postalCode} />
|
|
462
|
+
</CellField>
|
|
463
|
+
</FlexForm>
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### 3. Responsive Considerations
|
|
467
|
+
|
|
468
|
+
Consider how your layout will appear on mobile devices:
|
|
469
|
+
|
|
470
|
+
```svelte
|
|
471
|
+
<FlexForm class="responsive-form">
|
|
472
|
+
<CellField span={4} label="Field 1">
|
|
473
|
+
<TextEditor bind:value={field1} />
|
|
474
|
+
</CellField>
|
|
475
|
+
|
|
476
|
+
<CellField span={4} label="Field 2">
|
|
477
|
+
<TextEditor bind:value={field2} />
|
|
478
|
+
</CellField>
|
|
479
|
+
|
|
480
|
+
<CellField span={4} label="Field 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. Error State Management
|
|
495
|
+
|
|
496
|
+
Maintain consistent error handling across all fields:
|
|
497
|
+
|
|
498
|
+
```svelte
|
|
499
|
+
<script>
|
|
500
|
+
function validateField(field, value) {
|
|
501
|
+
if (!value || value.trim() === '') {
|
|
502
|
+
return `${field} is required`;
|
|
503
|
+
}
|
|
504
|
+
return null;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
$: errors = {
|
|
508
|
+
name: validateField('Name', formData.name),
|
|
509
|
+
email: validateField('Email', formData.email)
|
|
510
|
+
};
|
|
511
|
+
</script>
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
## Integration with Other Components
|
|
515
|
+
|
|
516
|
+
### With DatePicker
|
|
517
|
+
|
|
518
|
+
```svelte
|
|
519
|
+
<FlexForm>
|
|
520
|
+
<CellField span={4} label="Start Date" required>
|
|
521
|
+
<DatePicker
|
|
522
|
+
bind:value={startDate}
|
|
523
|
+
variant="filled"
|
|
524
|
+
max={endDate}
|
|
525
|
+
/>
|
|
526
|
+
</CellField>
|
|
527
|
+
|
|
528
|
+
<CellField span={4} label="End Date" required>
|
|
529
|
+
<DatePicker
|
|
530
|
+
bind:value={endDate}
|
|
531
|
+
variant="filled"
|
|
532
|
+
min={startDate}
|
|
533
|
+
/>
|
|
534
|
+
</CellField>
|
|
535
|
+
</FlexForm>
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
### With OptionsSelect
|
|
539
|
+
|
|
540
|
+
```svelte
|
|
541
|
+
<FlexForm>
|
|
542
|
+
<CellField span={6} label="Country" required>
|
|
543
|
+
<OptionsSelect
|
|
544
|
+
bind:value={country}
|
|
545
|
+
variant="filled"
|
|
546
|
+
options={countryOptions}
|
|
547
|
+
placeholder="Select a country"
|
|
548
|
+
/>
|
|
549
|
+
</CellField>
|
|
550
|
+
|
|
551
|
+
<CellField span={6} label="State/Province">
|
|
552
|
+
<OptionsSelect
|
|
553
|
+
bind:value={state}
|
|
554
|
+
variant="filled"
|
|
555
|
+
options={stateOptions}
|
|
556
|
+
disabled={!country}
|
|
557
|
+
/>
|
|
558
|
+
</CellField>
|
|
559
|
+
</FlexForm>
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
## Accessibility Features
|
|
563
|
+
|
|
564
|
+
- **Semantic Structure**: Proper form field labeling and association
|
|
565
|
+
- **Keyboard Navigation**: Standard form navigation patterns
|
|
566
|
+
- **Screen Reader Support**: Proper ARIA attributes and roles
|
|
567
|
+
- **Error Announcements**: Clear error message association
|
|
568
|
+
- **Focus Management**: Logical tab order through fields
|
|
569
|
+
|
|
570
|
+
## Browser Support
|
|
571
|
+
|
|
572
|
+
- **Modern Browsers**: Chrome, Firefox, Safari, Edge (latest versions)
|
|
573
|
+
- **Mobile Browsers**: iOS Safari, Chrome Mobile, Firefox Mobile
|
|
574
|
+
- **CSS Flexbox**: Required for layout functionality
|
|
575
|
+
|
|
576
|
+
## Related Components
|
|
577
|
+
|
|
578
|
+
- **FormField**: Base form field component
|
|
579
|
+
- **TextEditor**: Single-line text input
|
|
580
|
+
- **MemoEditor**: Multi-line text area
|
|
581
|
+
- **DatePicker**: Date selection component
|
|
582
|
+
- **OptionsSelect**: Dropdown selection component
|
|
583
|
+
|
|
584
|
+
## License
|
|
585
|
+
|
|
586
|
+
MIT License - see LICENSE file for details.
|