torch-glare 2.5.6 → 2.6.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/README.md +4 -3
- package/dist/bin/index.js +9 -24
- package/dist/bin/index.js.map +1 -1
- package/dist/src/commands/add.d.ts +2 -2
- package/dist/src/commands/add.d.ts.map +1 -1
- package/dist/src/commands/add.js +4 -70
- package/dist/src/commands/add.js.map +1 -1
- package/dist/src/commands/hook.d.ts +5 -4
- package/dist/src/commands/hook.d.ts.map +1 -1
- package/dist/src/commands/hook.js +7 -75
- package/dist/src/commands/hook.js.map +1 -1
- package/dist/src/commands/init.js +1 -1
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/layout.d.ts +5 -4
- package/dist/src/commands/layout.d.ts.map +1 -1
- package/dist/src/commands/layout.js +7 -75
- package/dist/src/commands/layout.js.map +1 -1
- package/dist/src/commands/provider.d.ts +5 -4
- package/dist/src/commands/provider.d.ts.map +1 -1
- package/dist/src/commands/provider.js +7 -75
- package/dist/src/commands/provider.js.map +1 -1
- package/dist/src/commands/update.d.ts.map +1 -1
- package/dist/src/commands/update.js +78 -43
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/commands/utils.d.ts +5 -4
- package/dist/src/commands/utils.d.ts.map +1 -1
- package/dist/src/commands/utils.js +7 -80
- package/dist/src/commands/utils.js.map +1 -1
- package/dist/src/shared/addFromRegistry.d.ts +16 -0
- package/dist/src/shared/addFromRegistry.d.ts.map +1 -0
- package/dist/src/shared/addFromRegistry.js +88 -0
- package/dist/src/shared/addFromRegistry.js.map +1 -0
- package/dist/src/shared/getInstallCommand.d.ts.map +1 -1
- package/dist/src/shared/getInstallCommand.js +5 -0
- package/dist/src/shared/getInstallCommand.js.map +1 -1
- package/dist/src/shared/installDependencies.d.ts +0 -10
- package/dist/src/shared/installDependencies.d.ts.map +1 -1
- package/dist/src/shared/installDependencies.js +0 -17
- package/dist/src/shared/installDependencies.js.map +1 -1
- package/dist/src/shared/installFromPlan.d.ts +7 -5
- package/dist/src/shared/installFromPlan.d.ts.map +1 -1
- package/dist/src/shared/installFromPlan.js +103 -36
- package/dist/src/shared/installFromPlan.js.map +1 -1
- package/dist/src/shared/loadRegistry.d.ts +12 -3
- package/dist/src/shared/loadRegistry.d.ts.map +1 -1
- package/dist/src/shared/loadRegistry.js +19 -20
- package/dist/src/shared/loadRegistry.js.map +1 -1
- package/dist/src/shared/registryClient.d.ts +19 -0
- package/dist/src/shared/registryClient.d.ts.map +1 -0
- package/dist/src/shared/registryClient.js +128 -0
- package/dist/src/shared/registryClient.js.map +1 -0
- package/dist/src/shared/resolveEntry.d.ts +10 -7
- package/dist/src/shared/resolveEntry.d.ts.map +1 -1
- package/dist/src/shared/resolveEntry.js +18 -13
- package/dist/src/shared/resolveEntry.js.map +1 -1
- package/dist/src/shared/suggestOtherCommand.d.ts +7 -1
- package/dist/src/shared/suggestOtherCommand.d.ts.map +1 -1
- package/dist/src/shared/suggestOtherCommand.js +29 -23
- package/dist/src/shared/suggestOtherCommand.js.map +1 -1
- package/dist/src/types/main.d.ts +31 -2
- package/dist/src/types/main.d.ts.map +1 -1
- package/package.json +6 -11
- package/apps/lib/components/ActionButton.tsx +0 -93
- package/apps/lib/components/ActionsGroup.tsx +0 -27
- package/apps/lib/components/AlertDialog.tsx +0 -204
- package/apps/lib/components/Avatar.tsx +0 -46
- package/apps/lib/components/Badge.tsx +0 -250
- package/apps/lib/components/BadgeField.tsx +0 -403
- package/apps/lib/components/Breadcrumb.tsx +0 -280
- package/apps/lib/components/Button.tsx +0 -325
- package/apps/lib/components/ButtonGroup.tsx +0 -190
- package/apps/lib/components/Calendar.tsx +0 -115
- package/apps/lib/components/Card.tsx +0 -95
- package/apps/lib/components/Checkbox.tsx +0 -42
- package/apps/lib/components/ColorPicker.tsx +0 -441
- package/apps/lib/components/ConclusionHeader.tsx +0 -148
- package/apps/lib/components/ContextMenu.tsx +0 -571
- package/apps/lib/components/CountBadge.tsx +0 -52
- package/apps/lib/components/DataTable.tsx +0 -213
- package/apps/lib/components/DataViews/badge.ts +0 -49
- package/apps/lib/components/DataViews/cell.tsx +0 -324
- package/apps/lib/components/DataViews/context.ts +0 -144
- package/apps/lib/components/DataViews/data-views.tsx +0 -395
- package/apps/lib/components/DataViews/filters/children.tsx +0 -98
- package/apps/lib/components/DataViews/filters/custom.tsx +0 -34
- package/apps/lib/components/DataViews/filters/filters.tsx +0 -157
- package/apps/lib/components/DataViews/filters/index.ts +0 -4
- package/apps/lib/components/DataViews/filters/labelled.tsx +0 -20
- package/apps/lib/components/DataViews/filters/presets.tsx +0 -65
- package/apps/lib/components/DataViews/filters/sync.tsx +0 -35
- package/apps/lib/components/DataViews/filters/values.ts +0 -173
- package/apps/lib/components/DataViews/header.tsx +0 -220
- package/apps/lib/components/DataViews/hooks/index.ts +0 -5
- package/apps/lib/components/DataViews/hooks/useActiveRow.ts +0 -22
- package/apps/lib/components/DataViews/hooks/useControllable.ts +0 -52
- package/apps/lib/components/DataViews/index.ts +0 -88
- package/apps/lib/components/DataViews/panel/columns.tsx +0 -153
- package/apps/lib/components/DataViews/panel/controls.tsx +0 -106
- package/apps/lib/components/DataViews/panel/index.ts +0 -3
- package/apps/lib/components/DataViews/panel/panel.tsx +0 -164
- package/apps/lib/components/DataViews/panel/saved-views.tsx +0 -67
- package/apps/lib/components/DataViews/panel/section.tsx +0 -81
- package/apps/lib/components/DataViews/panel/sort.tsx +0 -42
- package/apps/lib/components/DataViews/panel/tab.tsx +0 -31
- package/apps/lib/components/DataViews/slots.ts +0 -72
- package/apps/lib/components/DataViews/states.tsx +0 -73
- package/apps/lib/components/DataViews/types.ts +0 -510
- package/apps/lib/components/DataViews/views/board-view.tsx +0 -381
- package/apps/lib/components/DataViews/views/card-rows.tsx +0 -36
- package/apps/lib/components/DataViews/views/inbox-view.tsx +0 -260
- package/apps/lib/components/DataViews/views/pane-views.tsx +0 -196
- package/apps/lib/components/DataViews/views/table-view.tsx +0 -493
- package/apps/lib/components/DataViews/views/tree-view.tsx +0 -367
- package/apps/lib/components/DatePicker.tsx +0 -232
- package/apps/lib/components/Dialog.tsx +0 -116
- package/apps/lib/components/Divider.tsx +0 -28
- package/apps/lib/components/Drawer.tsx +0 -451
- package/apps/lib/components/DropdownMenu.tsx +0 -554
- package/apps/lib/components/FieldHint.tsx +0 -69
- package/apps/lib/components/Form.tsx +0 -182
- package/apps/lib/components/FormBuilder/context.ts +0 -85
- package/apps/lib/components/FormBuilder/field-kind.ts +0 -28
- package/apps/lib/components/FormBuilder/fields/ChoiceFields.tsx +0 -60
- package/apps/lib/components/FormBuilder/fields/ColorField.tsx +0 -59
- package/apps/lib/components/FormBuilder/fields/CustomField.tsx +0 -11
- package/apps/lib/components/FormBuilder/fields/DateField.tsx +0 -32
- package/apps/lib/components/FormBuilder/fields/FieldArray.tsx +0 -74
- package/apps/lib/components/FormBuilder/fields/FieldShell.tsx +0 -168
- package/apps/lib/components/FormBuilder/fields/FileField.tsx +0 -39
- package/apps/lib/components/FormBuilder/fields/OptionListFields.tsx +0 -132
- package/apps/lib/components/FormBuilder/fields/OtpField.tsx +0 -31
- package/apps/lib/components/FormBuilder/fields/PhoneField.tsx +0 -109
- package/apps/lib/components/FormBuilder/fields/RichTextEditorField.tsx +0 -31
- package/apps/lib/components/FormBuilder/fields/SelectField.tsx +0 -114
- package/apps/lib/components/FormBuilder/fields/SignatureField.tsx +0 -157
- package/apps/lib/components/FormBuilder/fields/SliderField.tsx +0 -67
- package/apps/lib/components/FormBuilder/fields/SwitchBoxField.tsx +0 -41
- package/apps/lib/components/FormBuilder/fields/TableField.tsx +0 -336
- package/apps/lib/components/FormBuilder/fields/TextField.tsx +0 -213
- package/apps/lib/components/FormBuilder/fields/TreeSelectField.tsx +0 -43
- package/apps/lib/components/FormBuilder/fields/countries.ts +0 -303
- package/apps/lib/components/FormBuilder/fields/index.ts +0 -25
- package/apps/lib/components/FormBuilder/form-builder.tsx +0 -198
- package/apps/lib/components/FormBuilder/index.ts +0 -31
- package/apps/lib/components/FormBuilder/numberFormat.ts +0 -16
- package/apps/lib/components/FormBuilder/submit.tsx +0 -67
- package/apps/lib/components/FormBuilder/types.ts +0 -316
- package/apps/lib/components/FormRenderer/FormDrawer.tsx +0 -250
- package/apps/lib/components/FormRenderer/detail.tsx +0 -256
- package/apps/lib/components/FormRenderer/form-renderer.tsx +0 -358
- package/apps/lib/components/FormRenderer/header.tsx +0 -88
- package/apps/lib/components/FormRenderer/index.ts +0 -17
- package/apps/lib/components/FormRenderer/notch-action.tsx +0 -64
- package/apps/lib/components/FormRenderer/section.tsx +0 -39
- package/apps/lib/components/FormRenderer/stepper.tsx +0 -393
- package/apps/lib/components/FormRenderer/types.ts +0 -115
- package/apps/lib/components/FormSummary.tsx +0 -282
- package/apps/lib/components/HeaderBar.tsx +0 -117
- package/apps/lib/components/ImageAttachment.tsx +0 -209
- package/apps/lib/components/InnerLabelField.tsx +0 -154
- package/apps/lib/components/Input.tsx +0 -224
- package/apps/lib/components/InputField.tsx +0 -147
- package/apps/lib/components/InputOTP.tsx +0 -84
- package/apps/lib/components/Label.tsx +0 -129
- package/apps/lib/components/LabelField.tsx +0 -76
- package/apps/lib/components/LabeledCheckBox.tsx +0 -51
- package/apps/lib/components/LabeledRadio.tsx +0 -51
- package/apps/lib/components/LinkButton.tsx +0 -94
- package/apps/lib/components/LoginButton.tsx +0 -51
- package/apps/lib/components/PasswordLevel.tsx +0 -58
- package/apps/lib/components/Popover.tsx +0 -312
- package/apps/lib/components/ProfileMenu.tsx +0 -85
- package/apps/lib/components/Radio.tsx +0 -59
- package/apps/lib/components/RadioCard.tsx +0 -50
- package/apps/lib/components/ScrollArea.tsx +0 -54
- package/apps/lib/components/SearchField.tsx +0 -62
- package/apps/lib/components/SearchableSelect.tsx +0 -318
- package/apps/lib/components/SearchableTable.tsx +0 -344
- package/apps/lib/components/SearchableTree.tsx +0 -485
- package/apps/lib/components/SearchableTreeDialog.tsx +0 -502
- package/apps/lib/components/SectionBlock.tsx +0 -168
- package/apps/lib/components/Select.tsx +0 -347
- package/apps/lib/components/SimpleSelect.tsx +0 -225
- package/apps/lib/components/Skeleton.tsx +0 -12
- package/apps/lib/components/SlideDatePicker.tsx +0 -255
- package/apps/lib/components/SpinLoading.tsx +0 -174
- package/apps/lib/components/Stepper.tsx +0 -480
- package/apps/lib/components/Switch.tsx +0 -82
- package/apps/lib/components/TabFormItem.tsx +0 -153
- package/apps/lib/components/TabSwitch.tsx +0 -172
- package/apps/lib/components/Table.tsx +0 -597
- package/apps/lib/components/TextEditor/ChartBlockTool.ts +0 -676
- package/apps/lib/components/TextEditor/RichTextField.tsx +0 -46
- package/apps/lib/components/TextEditor/TableDnDWrapper.ts +0 -462
- package/apps/lib/components/TextEditor/TextEditor.tsx +0 -1164
- package/apps/lib/components/TextEditor/TextEditorToolbar.tsx +0 -429
- package/apps/lib/components/TextEditor/editor-tools/AlignmentTune.ts +0 -70
- package/apps/lib/components/TextEditor/editor-tools/ColorInlineTool.ts +0 -50
- package/apps/lib/components/TextEditor/editor-tools/StrikethroughInlineTool.ts +0 -48
- package/apps/lib/components/TextEditor/editor-tools/inlineFormat.ts +0 -98
- package/apps/lib/components/TextEditor/editorjs.d.ts +0 -60
- package/apps/lib/components/TextEditor/index.ts +0 -7
- package/apps/lib/components/TextEditor/markdownParser.ts +0 -346
- package/apps/lib/components/Textarea.tsx +0 -117
- package/apps/lib/components/Timeline.tsx +0 -263
- package/apps/lib/components/Toast.tsx +0 -87
- package/apps/lib/components/Toggle.tsx +0 -125
- package/apps/lib/components/ToggleButton.tsx +0 -140
- package/apps/lib/components/Tooltip.tsx +0 -116
- package/apps/lib/components/TransparentLabel.tsx +0 -71
- package/apps/lib/components/TreeDropDown.tsx +0 -115
- package/apps/lib/components/TreeFolder/TreeFolder.tsx +0 -380
- package/apps/lib/components/TreeFolder/TreeFolderBreadcrumb.tsx +0 -75
- package/apps/lib/components/TreeFolder/TreeFolderRow.tsx +0 -354
- package/apps/lib/components/TreeFolder/TreeFolderStyles.tsx +0 -60
- package/apps/lib/components/TreeFolder/icons.tsx +0 -60
- package/apps/lib/components/TreeFolder/index.ts +0 -24
- package/apps/lib/components/TreeFolder/treeFolderUtils.ts +0 -109
- package/apps/lib/components/TreeFolder/types.ts +0 -77
- package/apps/lib/components/TreeFolder/useTreeFolderDnD.ts +0 -118
- package/apps/lib/hooks/useActiveTreeItem.ts +0 -61
- package/apps/lib/hooks/useClickOutside.ts +0 -27
- package/apps/lib/hooks/useDragDrop.tsx +0 -365
- package/apps/lib/hooks/useHtmlDir.ts +0 -31
- package/apps/lib/hooks/useInfiniteScroll.ts +0 -108
- package/apps/lib/hooks/useIsMobile.ts +0 -21
- package/apps/lib/hooks/useResize.ts +0 -67
- package/apps/lib/hooks/useTagSelection.ts +0 -300
- package/apps/lib/layouts/CNLayout.tsx +0 -372
- package/apps/lib/layouts/DataViewCard.tsx +0 -62
- package/apps/lib/layouts/FieldSection.tsx +0 -91
- package/apps/lib/layouts/TreeSubLayout.tsx +0 -173
- package/apps/lib/providers/ThemeProvider.tsx +0 -84
- package/apps/lib/registry.json +0 -1217
- package/apps/lib/tsconfig.json +0 -9
- package/apps/lib/tsconfig.tsbuildinfo +0 -1
- package/apps/lib/utils/cn.ts +0 -6
- package/apps/lib/utils/color.ts +0 -175
- package/apps/lib/utils/dataViews/path.ts +0 -67
- package/apps/lib/utils/dataViews/query.ts +0 -73
- package/apps/lib/utils/dataViews/types.ts +0 -187
- package/apps/lib/utils/dateFormat.ts +0 -108
- package/apps/lib/utils/resize.ts +0 -31
- package/apps/lib/utils/scroller.ts +0 -26
- package/apps/lib/utils/types.ts +0 -16
- package/docs/BLOCKS.md +0 -129
- package/docs/CHANGELOG-1.1.16.md +0 -108
- package/docs/Cover.png +0 -0
- package/docs/README.md +0 -215
- package/docs/components/action-button.md +0 -638
- package/docs/components/actions-group.md +0 -708
- package/docs/components/alert-dialog.md +0 -920
- package/docs/components/avatar.md +0 -709
- package/docs/components/badge-field.md +0 -738
- package/docs/components/badge.md +0 -301
- package/docs/components/breadcrumb.md +0 -930
- package/docs/components/button-group.md +0 -650
- package/docs/components/button.md +0 -639
- package/docs/components/calendar.md +0 -555
- package/docs/components/card.md +0 -622
- package/docs/components/chart-block-tool.md +0 -129
- package/docs/components/checkbox.md +0 -699
- package/docs/components/cn-layout.md +0 -854
- package/docs/components/color-picker.md +0 -101
- package/docs/components/conclusion-header.md +0 -80
- package/docs/components/context-menu.md +0 -483
- package/docs/components/count-badge.md +0 -560
- package/docs/components/data-table.md +0 -854
- package/docs/components/data-views/backend-response.md +0 -324
- package/docs/components/data-views/examples/a11y-rtl.md +0 -250
- package/docs/components/data-views/examples/api-orders-route.md +0 -130
- package/docs/components/data-views/examples/fields.md +0 -362
- package/docs/components/data-views/examples/filters.md +0 -307
- package/docs/components/data-views/examples/inbox-routing.md +0 -218
- package/docs/components/data-views/examples/index.md +0 -29
- package/docs/components/data-views/examples/overview.md +0 -244
- package/docs/components/data-views/examples/panel.md +0 -212
- package/docs/components/data-views/examples/scale.md +0 -231
- package/docs/components/data-views/examples/server-side.md +0 -210
- package/docs/components/data-views/examples/state.md +0 -250
- package/docs/components/data-views/examples/tree-custom.md +0 -388
- package/docs/components/data-views/examples/view-registry.md +0 -313
- package/docs/components/data-views/examples/views.md +0 -534
- package/docs/components/data-views/guide.md +0 -405
- package/docs/components/data-views/index.md +0 -1521
- package/docs/components/data-views/migration.md +0 -81
- package/docs/components/date-picker.md +0 -857
- package/docs/components/dialog.md +0 -929
- package/docs/components/divider.md +0 -766
- package/docs/components/drawer.md +0 -654
- package/docs/components/dropdown-menu.md +0 -668
- package/docs/components/field-hint.md +0 -898
- package/docs/components/field-section.md +0 -781
- package/docs/components/form-builder.md +0 -284
- package/docs/components/form-renderer.md +0 -396
- package/docs/components/form-summary.md +0 -138
- package/docs/components/form.md +0 -785
- package/docs/components/header-bar.md +0 -188
- package/docs/components/image-attachment.md +0 -906
- package/docs/components/inner-label-field.md +0 -819
- package/docs/components/input-field.md +0 -623
- package/docs/components/input-otp.md +0 -756
- package/docs/components/input.md +0 -634
- package/docs/components/label-field.md +0 -770
- package/docs/components/label.md +0 -761
- package/docs/components/labeled-check-box.md +0 -642
- package/docs/components/labeled-radio.md +0 -796
- package/docs/components/link-button.md +0 -685
- package/docs/components/login-button.md +0 -872
- package/docs/components/password-level.md +0 -803
- package/docs/components/popover.md +0 -649
- package/docs/components/profile-menu.md +0 -656
- package/docs/components/radio-card.md +0 -801
- package/docs/components/radio.md +0 -735
- package/docs/components/scroll-area.md +0 -691
- package/docs/components/search-field.md +0 -702
- package/docs/components/searchable-select.md +0 -368
- package/docs/components/searchable-table.md +0 -438
- package/docs/components/searchable-tree-dialog.md +0 -190
- package/docs/components/searchable-tree.md +0 -200
- package/docs/components/section-block.md +0 -483
- package/docs/components/select.md +0 -709
- package/docs/components/simple-select.md +0 -741
- package/docs/components/skeleton.md +0 -706
- package/docs/components/slide-date-picker.md +0 -837
- package/docs/components/spin-loading.md +0 -696
- package/docs/components/stepper.md +0 -316
- package/docs/components/switch.md +0 -770
- package/docs/components/tab-form-item.md +0 -773
- package/docs/components/tab-switch.md +0 -170
- package/docs/components/table-dnd-wrapper.md +0 -107
- package/docs/components/table.md +0 -1088
- package/docs/components/text-editor.md +0 -735
- package/docs/components/textarea.md +0 -681
- package/docs/components/timeline.md +0 -254
- package/docs/components/toast.md +0 -773
- package/docs/components/toggle-button.md +0 -643
- package/docs/components/toggle.md +0 -882
- package/docs/components/tooltip.md +0 -513
- package/docs/components/transparent-label.md +0 -721
- package/docs/components/tree-drop-down.md +0 -740
- package/docs/components/tree-folder.md +0 -110
- package/docs/components/tree-sub-layout.md +0 -707
- package/docs/explanation/architecture.md +0 -54
- package/docs/explanation/design-system.md +0 -52
- package/docs/how-to/form-and-list-recipes.md +0 -386
- package/docs/how-to/forms-with-form-builder.md +0 -472
- package/docs/how-to/guides.md +0 -1027
- package/docs/migration/changelog.md +0 -60
- package/docs/migration/form-builder-2.5.2.md +0 -113
- package/docs/reference/cli.md +0 -112
- package/docs/reference/components.md +0 -572
- package/docs/reference/hooks.md +0 -1523
- package/docs/reference/providers.md +0 -866
- package/docs/reference/tailwind-plugins.md +0 -942
- package/docs/reference/theme.md +0 -85
- package/docs/reference/types.md +0 -1016
- package/docs/reference/utilities.md +0 -726
- package/docs/tutorials/building-first-form.md +0 -846
- package/docs/tutorials/component-composition.md +0 -882
- package/docs/tutorials/getting-started.md +0 -302
- package/docs/tutorials/theming-basics.md +0 -785
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useForm, type FieldValues } from "react-hook-form";
|
|
4
|
-
|
|
5
|
-
import { cn } from "../../utils/cn";
|
|
6
|
-
import { Form } from "../Form";
|
|
7
|
-
import { LoadingContext, DirectionContext, FormIdContext } from "./context";
|
|
8
|
-
import { markFieldKind } from "./field-kind";
|
|
9
|
-
import type { FormBuilderRootProps } from "./types";
|
|
10
|
-
import {
|
|
11
|
-
TextField,
|
|
12
|
-
EmailField,
|
|
13
|
-
PasswordField,
|
|
14
|
-
NumberField,
|
|
15
|
-
CurrencyField,
|
|
16
|
-
TextareaField,
|
|
17
|
-
SelectField,
|
|
18
|
-
SearchableSelectField,
|
|
19
|
-
MultiSelectField,
|
|
20
|
-
CheckboxField,
|
|
21
|
-
RadioCardsField,
|
|
22
|
-
RadioListField,
|
|
23
|
-
CheckboxGroupField,
|
|
24
|
-
SwitchBoxField,
|
|
25
|
-
DateField,
|
|
26
|
-
OtpField,
|
|
27
|
-
TreeSelectField,
|
|
28
|
-
SliderField,
|
|
29
|
-
ColorField,
|
|
30
|
-
SignatureField,
|
|
31
|
-
PhoneField,
|
|
32
|
-
FieldArray,
|
|
33
|
-
TableField,
|
|
34
|
-
FileField,
|
|
35
|
-
RichTextField,
|
|
36
|
-
CustomField,
|
|
37
|
-
} from "./fields";
|
|
38
|
-
import { SubmitButton } from "./submit";
|
|
39
|
-
|
|
40
|
-
// ─── Root ────────────────────────────────────────────────────────────────────
|
|
41
|
-
|
|
42
|
-
function FormBuilderRoot<T extends FieldValues = FieldValues>({
|
|
43
|
-
children,
|
|
44
|
-
id,
|
|
45
|
-
form: formProp,
|
|
46
|
-
onSubmit,
|
|
47
|
-
onInvalid,
|
|
48
|
-
resolver,
|
|
49
|
-
defaultValues,
|
|
50
|
-
values,
|
|
51
|
-
loading = false,
|
|
52
|
-
fieldDirection,
|
|
53
|
-
resetOnSuccess,
|
|
54
|
-
className,
|
|
55
|
-
}: FormBuilderRootProps<T>) {
|
|
56
|
-
// Hooks can't be conditional, so always create one; `formProp` wins when given
|
|
57
|
-
// (the caller hoisted `useForm` to share values with something outside the form).
|
|
58
|
-
const ownForm = useForm<T>({ resolver, defaultValues, values });
|
|
59
|
-
const form = formProp ?? ownForm;
|
|
60
|
-
// Don't force a direction — left undefined, FieldSection uses its responsive `flexible`
|
|
61
|
-
// layout (stacked on small screens, two-column at `lg`). Only a caller-set `fieldDirection`
|
|
62
|
-
// (e.g. vertical inside a drawer) pins it.
|
|
63
|
-
const direction = fieldDirection;
|
|
64
|
-
|
|
65
|
-
const handleValid = async (v: T) => {
|
|
66
|
-
await onSubmit(v);
|
|
67
|
-
if (resetOnSuccess) form.reset();
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
// The `<form>` IS the outermost element — FormBuilder draws no frame of its own. `gap-4` is the
|
|
71
|
-
// spacing between sections, which is field structure; `@container` scopes any container query a
|
|
72
|
-
// field wants to the form's own width. Everything that used to wrap this — the page gutters, the
|
|
73
|
-
// scroll shell, the header, the stepper rail, the summary column — belongs to `FormRenderer`.
|
|
74
|
-
//
|
|
75
|
-
// `className` lands here, so a parent still lays the form out (e.g. `flex-1 min-h-0`).
|
|
76
|
-
return (
|
|
77
|
-
<FormIdContext.Provider value={id}>
|
|
78
|
-
<LoadingContext.Provider value={loading}>
|
|
79
|
-
<DirectionContext.Provider value={direction}>
|
|
80
|
-
<Form {...form}>
|
|
81
|
-
<form
|
|
82
|
-
id={id}
|
|
83
|
-
className={cn("flex w-full min-w-0 flex-col gap-4 @container", className)}
|
|
84
|
-
onSubmit={form.handleSubmit(handleValid, onInvalid)}
|
|
85
|
-
>
|
|
86
|
-
{children}
|
|
87
|
-
</form>
|
|
88
|
-
</Form>
|
|
89
|
-
</DirectionContext.Provider>
|
|
90
|
-
</LoadingContext.Provider>
|
|
91
|
-
</FormIdContext.Provider>
|
|
92
|
-
);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* FormBuilder — a compound, composition-based form. Author a form as JSX:
|
|
97
|
-
*
|
|
98
|
-
* ```tsx
|
|
99
|
-
* <FormBuilder onSubmit={fn} resolver={r} defaultValues={d}>
|
|
100
|
-
* <FormBuilder.Text name="name" label="Name" required />
|
|
101
|
-
* <FormBuilder.Select name="category" label="Category" options={CATEGORY} />
|
|
102
|
-
* </FormBuilder>
|
|
103
|
-
* ```
|
|
104
|
-
*
|
|
105
|
-
* **FormBuilder is the fields and nothing else** — the `<form>`, its react-hook-form context and
|
|
106
|
-
* the field components. Each field draws its own `FieldSection` row (label, required marker,
|
|
107
|
-
* hint); beyond that FormBuilder draws no frame at all: no titled section cards, no page gutters,
|
|
108
|
-
* no scroll shell, no title header, no stepper rail, no summary column. Rendered bare it fills
|
|
109
|
-
* whatever you put it in, which is what an embedded form — a settings rail, a `DataViews` filter
|
|
110
|
-
* panel — wants.
|
|
111
|
-
*
|
|
112
|
-
* For a real page or drawer form, wrap it in `FormRenderer`, which owns all of that chrome:
|
|
113
|
-
* `display` (page vs drawer), `header`, `actions`, `summary`, `FormRenderer.Section` and the
|
|
114
|
-
* wizard (`FormRenderer.Stepper` + `FormRenderer.Step`).
|
|
115
|
-
*
|
|
116
|
-
* `FormBuilder.Submit` stays here — it is the form's own submit button, wired to the `<form>` by
|
|
117
|
-
* id so it works even when the chrome renders it outside the element.
|
|
118
|
-
*/
|
|
119
|
-
export const FormBuilder = Object.assign(FormBuilderRoot, {
|
|
120
|
-
// fields
|
|
121
|
-
Text: TextField,
|
|
122
|
-
Email: EmailField,
|
|
123
|
-
Password: PasswordField,
|
|
124
|
-
Number: NumberField,
|
|
125
|
-
Currency: CurrencyField,
|
|
126
|
-
Textarea: TextareaField,
|
|
127
|
-
Select: SelectField,
|
|
128
|
-
SearchableSelect: SearchableSelectField,
|
|
129
|
-
MultiSelect: MultiSelectField,
|
|
130
|
-
Tags: MultiSelectField,
|
|
131
|
-
RadioList: RadioListField,
|
|
132
|
-
RadioCards: RadioCardsField,
|
|
133
|
-
Checkbox: CheckboxField,
|
|
134
|
-
CheckboxGroup: CheckboxGroupField,
|
|
135
|
-
SwitchBox: SwitchBoxField,
|
|
136
|
-
Otp: OtpField,
|
|
137
|
-
TreeSelect: TreeSelectField,
|
|
138
|
-
Slider: SliderField,
|
|
139
|
-
Color: ColorField,
|
|
140
|
-
Signature: SignatureField,
|
|
141
|
-
Phone: PhoneField,
|
|
142
|
-
FieldArray: FieldArray,
|
|
143
|
-
Table: TableField,
|
|
144
|
-
Date: DateField,
|
|
145
|
-
DateRange: (props: Parameters<typeof DateField>[0]) => <DateField {...props} mode="range" />,
|
|
146
|
-
DateMultiple: (props: Parameters<typeof DateField>[0]) => (
|
|
147
|
-
<DateField {...props} mode="multiple" />
|
|
148
|
-
),
|
|
149
|
-
DateTime: (props: Parameters<typeof DateField>[0]) => <DateField {...props} timePicker />,
|
|
150
|
-
File: FileField,
|
|
151
|
-
Image: (props: Parameters<typeof FileField>[0]) => <FileField {...props} image />,
|
|
152
|
-
RichText: RichTextField,
|
|
153
|
-
Custom: CustomField,
|
|
154
|
-
// the form's own submit button
|
|
155
|
-
Submit: SubmitButton,
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* What each field produces, for consumers that read a form they did not author.
|
|
160
|
-
*
|
|
161
|
-
* Stamped here rather than on the field definitions because the aliases — `DateRange`, `Tags`,
|
|
162
|
-
* `Image` — only exist in the table above, and a reader checking "is this list complete?" should
|
|
163
|
-
* have one place to look. `Tags` and `MultiSelect` are the same component, so the repeat is
|
|
164
|
-
* harmless.
|
|
165
|
-
*/
|
|
166
|
-
(
|
|
167
|
-
[
|
|
168
|
-
[FormBuilder.Text, "text"],
|
|
169
|
-
[FormBuilder.Email, "text"],
|
|
170
|
-
[FormBuilder.Password, "text"],
|
|
171
|
-
[FormBuilder.Textarea, "text"],
|
|
172
|
-
[FormBuilder.Otp, "text"],
|
|
173
|
-
[FormBuilder.Color, "text"],
|
|
174
|
-
[FormBuilder.Phone, "text"],
|
|
175
|
-
[FormBuilder.Number, "number"],
|
|
176
|
-
[FormBuilder.Currency, "number"],
|
|
177
|
-
[FormBuilder.Select, "choice"],
|
|
178
|
-
[FormBuilder.SearchableSelect, "choice"],
|
|
179
|
-
[FormBuilder.RadioList, "choice"],
|
|
180
|
-
[FormBuilder.RadioCards, "choice"],
|
|
181
|
-
[FormBuilder.MultiSelect, "multiChoice"],
|
|
182
|
-
[FormBuilder.Tags, "multiChoice"],
|
|
183
|
-
[FormBuilder.CheckboxGroup, "multiChoice"],
|
|
184
|
-
[FormBuilder.TreeSelect, "multiChoice"],
|
|
185
|
-
[FormBuilder.Checkbox, "boolean"],
|
|
186
|
-
[FormBuilder.SwitchBox, "boolean"],
|
|
187
|
-
[FormBuilder.Date, "date"],
|
|
188
|
-
[FormBuilder.DateRange, "date"],
|
|
189
|
-
[FormBuilder.DateTime, "date"],
|
|
190
|
-
[FormBuilder.DateMultiple, "date"],
|
|
191
|
-
[FormBuilder.Slider, "slider"],
|
|
192
|
-
[FormBuilder.Custom, "custom"],
|
|
193
|
-
[FormBuilder.File, "custom"],
|
|
194
|
-
[FormBuilder.Image, "custom"],
|
|
195
|
-
[FormBuilder.Signature, "custom"],
|
|
196
|
-
[FormBuilder.RichText, "custom"],
|
|
197
|
-
] as const
|
|
198
|
-
).forEach(([component, kind]) => markFieldKind(component, kind));
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
export { FormBuilder } from "./form-builder";
|
|
2
|
-
export { fieldKindOf, markFieldKind } from "./field-kind";
|
|
3
|
-
export { RichTextField } from "../TextEditor/RichTextField";
|
|
4
|
-
export type { FieldDirection, CellMode } from "./context";
|
|
5
|
-
export type {
|
|
6
|
-
BaseFieldProps,
|
|
7
|
-
FieldKind,
|
|
8
|
-
OptionItem,
|
|
9
|
-
SelectFieldProps,
|
|
10
|
-
SearchableSelectFieldProps,
|
|
11
|
-
OptionsFieldProps,
|
|
12
|
-
CurrencyFieldProps,
|
|
13
|
-
FileFieldProps,
|
|
14
|
-
CustomFieldProps,
|
|
15
|
-
DateFieldProps,
|
|
16
|
-
OtpFieldProps,
|
|
17
|
-
RadioCardOption,
|
|
18
|
-
RadioCardsFieldProps,
|
|
19
|
-
SwitchBoxFieldProps,
|
|
20
|
-
CheckboxFieldProps,
|
|
21
|
-
TreeSelectFieldProps,
|
|
22
|
-
PasswordFieldProps,
|
|
23
|
-
SliderFieldProps,
|
|
24
|
-
ColorFieldProps,
|
|
25
|
-
SignatureFieldProps,
|
|
26
|
-
PhoneFieldProps,
|
|
27
|
-
FieldArrayProps,
|
|
28
|
-
TableColumn,
|
|
29
|
-
TableFieldProps,
|
|
30
|
-
FormBuilderRootProps,
|
|
31
|
-
} from "./types";
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
const nf = new Intl.NumberFormat("en-US", { maximumFractionDigits: 20 });
|
|
2
|
-
|
|
3
|
-
/** Format a number with thousands separators (e.g. 1299 → "1,299"). Blank for empty. */
|
|
4
|
-
export function formatNumber(value: unknown): string {
|
|
5
|
-
if (value == null || value === "") return "";
|
|
6
|
-
const n = typeof value === "number" ? value : Number(String(value).replace(/,/g, ""));
|
|
7
|
-
return Number.isNaN(n) ? "" : nf.format(n);
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/** Parse a possibly comma-formatted string to a number (or undefined when blank). */
|
|
11
|
-
export function parseNumber(raw: string): number | undefined {
|
|
12
|
-
const cleaned = raw.replace(/,/g, "").trim();
|
|
13
|
-
if (cleaned === "" || cleaned === "-" || cleaned === ".") return undefined;
|
|
14
|
-
const n = Number(cleaned);
|
|
15
|
-
return Number.isNaN(n) ? undefined : n;
|
|
16
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { ReactNode } from "react";
|
|
4
|
-
|
|
5
|
-
import { cn } from "../../utils/cn";
|
|
6
|
-
import { Button } from "../Button";
|
|
7
|
-
import { useFormId, useLoading } from "./context";
|
|
8
|
-
|
|
9
|
-
export interface SubmitButtonProps {
|
|
10
|
-
children?: ReactNode;
|
|
11
|
-
className?: string;
|
|
12
|
-
loadingText?: ReactNode;
|
|
13
|
-
/**
|
|
14
|
-
* The form to submit, by `id`. Defaults to the enclosing FormBuilder's own form id (via
|
|
15
|
-
* context), so a bare `<FormBuilder.Submit>` works even in a header / action bar rendered
|
|
16
|
-
* **outside** the `<form>` element. Set it explicitly only to target a different form.
|
|
17
|
-
*/
|
|
18
|
-
form?: string;
|
|
19
|
-
/**
|
|
20
|
-
* LOCAL PATCH (Contact Center): upstream removed this in 2.5.5, leaving no way to
|
|
21
|
-
* disable a Save. Re-apply after any `npx torch-glare update`.
|
|
22
|
-
*
|
|
23
|
-
* Disable the button while leaving the form readable.
|
|
24
|
-
*
|
|
25
|
-
* Used by permission gating: someone with read access should still SEE a
|
|
26
|
-
* record, so a Save they may not use is disabled rather than removed --
|
|
27
|
-
* a missing button looks broken, a disabled one says "not yours to change".
|
|
28
|
-
* The server refuses the write either way.
|
|
29
|
-
*/
|
|
30
|
-
disabled?: boolean;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/** `FormBuilder.Submit` — a loading-aware submit button, hidden in view mode. */
|
|
34
|
-
export function SubmitButton({
|
|
35
|
-
children,
|
|
36
|
-
className,
|
|
37
|
-
loadingText,
|
|
38
|
-
form,
|
|
39
|
-
disabled,
|
|
40
|
-
}: SubmitButtonProps) {
|
|
41
|
-
const loading = useLoading();
|
|
42
|
-
const ctxFormId = useFormId();
|
|
43
|
-
|
|
44
|
-
return (
|
|
45
|
-
<Button
|
|
46
|
-
type="submit"
|
|
47
|
-
// Defaults to the enclosing form's id, so a Save in the header (outside the `<form>`)
|
|
48
|
-
// still submits it via native form-association.
|
|
49
|
-
form={form ?? ctxFormId}
|
|
50
|
-
// The blue fill, because Save is the form's primary action and a primary action is blue.
|
|
51
|
-
// Deliberately not a prop: a form has one primary action, and letting each caller pick a
|
|
52
|
-
// variant is how the rule stops being a rule.
|
|
53
|
-
variant="BluColStyle"
|
|
54
|
-
is_loading={loading}
|
|
55
|
-
// LOCAL PATCH (Contact Center) -- see `disabled` in SubmitButtonProps.
|
|
56
|
-
disabled={disabled}
|
|
57
|
-
// `w-fit` because the FormBuilder root is a flex COLUMN: a direct child with `width: auto`
|
|
58
|
-
// inherits `align-items: stretch` and spans the whole form. Sections want that (SectionBlock
|
|
59
|
-
// sets its own `w-full`); a Save button does not. `w-fit` rather than `self-start` so the
|
|
60
|
-
// header action bar — a row with `items-center` — is untouched at every button size.
|
|
61
|
-
// Merged through `cn` so a caller can still opt into `className="w-full"` in a narrow drawer.
|
|
62
|
-
className={cn("w-fit", className)}
|
|
63
|
-
>
|
|
64
|
-
{loading ? (loadingText ?? children ?? "Saving…") : (children ?? "Save")}
|
|
65
|
-
</Button>
|
|
66
|
-
);
|
|
67
|
-
}
|
|
@@ -1,316 +0,0 @@
|
|
|
1
|
-
import { ReactNode } from "react";
|
|
2
|
-
import type {
|
|
3
|
-
ControllerRenderProps,
|
|
4
|
-
ControllerFieldState,
|
|
5
|
-
DefaultValues,
|
|
6
|
-
FieldErrors,
|
|
7
|
-
FieldValues,
|
|
8
|
-
Resolver,
|
|
9
|
-
UseFormReturn,
|
|
10
|
-
} from "react-hook-form";
|
|
11
|
-
import type { FieldDirection } from "./context";
|
|
12
|
-
import type { SectionColor } from "../SectionBlock";
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* What shape of value a field produces, stamped on each `FormBuilder.*` field component.
|
|
16
|
-
*
|
|
17
|
-
* This is for consumers that have to interpret a form they did not author — `DataViews.Filters`
|
|
18
|
-
* reads it to decide whether a child's value becomes a list, a numeric range or a date range. It
|
|
19
|
-
* describes the field, not any one consumer's use of it.
|
|
20
|
-
*
|
|
21
|
-
* Read it with `fieldKindOf(element)` rather than comparing `element.type` against an imported
|
|
22
|
-
* component: identity comparison breaks across duplicated module instances and stops matching
|
|
23
|
-
* after a hot reload.
|
|
24
|
-
*/
|
|
25
|
-
export type FieldKind =
|
|
26
|
-
/** A string value — `Text`, `Textarea`, `Email`, `Password`, `Color`, `Phone`, `Otp`. */
|
|
27
|
-
| "text"
|
|
28
|
-
/** A number — `Number`, `Currency`. */
|
|
29
|
-
| "number"
|
|
30
|
-
/** One of a supplied list — `Select`, `SearchableSelect`, `RadioList`, `RadioCards`. */
|
|
31
|
-
| "choice"
|
|
32
|
-
/** Several of a supplied list — `MultiSelect`, `Tags`, `CheckboxGroup`, `TreeSelect`. */
|
|
33
|
-
| "multiChoice"
|
|
34
|
-
/** A boolean — `Checkbox`, `SwitchBox`. */
|
|
35
|
-
| "boolean"
|
|
36
|
-
/** A date or date range — `Date`, `DateRange`, `DateTime`, `DateMultiple`. */
|
|
37
|
-
| "date"
|
|
38
|
-
/** Two numbers when `range`, otherwise one — `Slider`. */
|
|
39
|
-
| "slider"
|
|
40
|
-
/** Whatever the caller renders — `Custom`, `File`, `Image`, `Signature`, `RichText`. */
|
|
41
|
-
| "custom";
|
|
42
|
-
|
|
43
|
-
/** Props shared by every `FormBuilder.*` field. `name` is the RHF path. */
|
|
44
|
-
/**
|
|
45
|
-
* One alert under a field. Mirrors `FieldHint`'s own props so the design system stays the single
|
|
46
|
-
* source of truth for how each state looks.
|
|
47
|
-
*/
|
|
48
|
-
export interface FieldHintSpec {
|
|
49
|
-
label: ReactNode;
|
|
50
|
-
state?: "info" | "warning" | "error" | "success";
|
|
51
|
-
icon?: ReactNode;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export interface BaseFieldProps {
|
|
55
|
-
name: string;
|
|
56
|
-
label?: ReactNode;
|
|
57
|
-
placeholder?: string;
|
|
58
|
-
description?: ReactNode;
|
|
59
|
-
required?: boolean;
|
|
60
|
-
disabled?: boolean;
|
|
61
|
-
hidden?: boolean;
|
|
62
|
-
/** Span the full section width. */
|
|
63
|
-
fullWidth?: boolean;
|
|
64
|
-
/**
|
|
65
|
-
* Alerts stacked under the field. The validation error, when there is one, always renders first —
|
|
66
|
-
* it is the actionable message — and these follow in order. Ignored in `bare` mode (a
|
|
67
|
-
* `FormBuilder.Table` cell), where errors surface as a tooltip to keep the row one line tall.
|
|
68
|
-
*/
|
|
69
|
-
hints?: FieldHintSpec[];
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export interface OptionItem {
|
|
73
|
-
label: string;
|
|
74
|
-
value: string;
|
|
75
|
-
icon?: ReactNode;
|
|
76
|
-
/** Secondary row label — shown by `FormBuilder.RadioList` / `.CheckboxGroup`. */
|
|
77
|
-
description?: string;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/** `FormBuilder.Select` / `.SearchableSelect` — supports async option loading. */
|
|
81
|
-
/** `FormBuilder.Select` — the plain `Select` dropdown. */
|
|
82
|
-
export interface SelectFieldProps extends BaseFieldProps {
|
|
83
|
-
options: OptionItem[];
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* `FormBuilder.SearchableSelect` — the `SearchableSelect` combobox: a search box with
|
|
88
|
-
* client-side filtering, or server-side search + infinite scroll via the async props.
|
|
89
|
-
*/
|
|
90
|
-
export interface SearchableSelectFieldProps extends SelectFieldProps {
|
|
91
|
-
/** Filter `options` locally (default). Set false for server-side search. */
|
|
92
|
-
filterClientSide?: boolean;
|
|
93
|
-
/** Debounced as the user types — refetch your data here. */
|
|
94
|
-
onSearchChange?: (query: string) => void;
|
|
95
|
-
/** Called when the list bottom scrolls into view and `hasMore && !loading`. */
|
|
96
|
-
onLoadMore?: () => void;
|
|
97
|
-
hasMore?: boolean;
|
|
98
|
-
loading?: boolean;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/** `FormBuilder.MultiSelect` / `.Tags`, `.Radio`. */
|
|
102
|
-
export interface OptionsFieldProps extends BaseFieldProps {
|
|
103
|
-
options: OptionItem[];
|
|
104
|
-
/**
|
|
105
|
-
* LOCAL PATCH (Contact Center): `MultiSelect`/`Tags` only — let the user type a value that is
|
|
106
|
-
* not in `options` and have it become a badge. Pass `options={[]}` for a pure free-text list.
|
|
107
|
-
*/
|
|
108
|
-
creatable?: boolean;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/** `FormBuilder.Currency`. */
|
|
112
|
-
export interface CurrencyFieldProps extends BaseFieldProps {
|
|
113
|
-
currencySymbol?: ReactNode;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/** `FormBuilder.File` / `.Image`. */
|
|
117
|
-
export interface FileFieldProps extends BaseFieldProps {
|
|
118
|
-
accept?: string;
|
|
119
|
-
multiple?: boolean;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/** `FormBuilder.Custom` — bring your own control, keeping the FieldSection + validation wiring. */
|
|
123
|
-
export interface CustomFieldProps extends BaseFieldProps {
|
|
124
|
-
render: (args: {
|
|
125
|
-
field: ControllerRenderProps<FieldValues, string>;
|
|
126
|
-
fieldState: ControllerFieldState;
|
|
127
|
-
}) => ReactNode;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/** `FormBuilder.Date` / `.DateRange` / `.DateMultiple` / `.DateTime`. */
|
|
131
|
-
export interface DateFieldProps extends BaseFieldProps {
|
|
132
|
-
mode?: "single" | "multiple" | "range";
|
|
133
|
-
timePicker?: boolean;
|
|
134
|
-
/** Display format, e.g. "yyyy/MM/dd" (DatePicker default). */
|
|
135
|
-
dateFormat?: string;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/** `FormBuilder.Otp` — code input; value is a string of `length` digits. */
|
|
139
|
-
export interface OtpFieldProps extends BaseFieldProps {
|
|
140
|
-
/** Number of digit slots (default 6). */
|
|
141
|
-
length?: number;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/** `FormBuilder.SwitchBox` — a switch inside a `#f9f9f9` field box. */
|
|
145
|
-
export interface SwitchBoxFieldProps extends BaseFieldProps {
|
|
146
|
-
/** Text shown inside the box, left of the divider (the design's "Sub-Field-Header"). */
|
|
147
|
-
subLabel?: string;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/** `FormBuilder.Checkbox` — a single boolean checkbox with an optional inline label. */
|
|
151
|
-
export interface CheckboxFieldProps extends BaseFieldProps {
|
|
152
|
-
/** Text shown inline next to the checkbox (in addition to the field `label`). */
|
|
153
|
-
subLabel?: string;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/** One option for `FormBuilder.RadioCards`. */
|
|
157
|
-
export interface RadioCardOption {
|
|
158
|
-
label: ReactNode;
|
|
159
|
-
value: string;
|
|
160
|
-
description?: ReactNode;
|
|
161
|
-
disabled?: boolean;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/** `FormBuilder.RadioCards` — radio options rendered as cards. */
|
|
165
|
-
export interface RadioCardsFieldProps extends BaseFieldProps {
|
|
166
|
-
options: RadioCardOption[];
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/** `FormBuilder.TreeSelect` (SearchableTree) — hierarchical single-select; value = node id. */
|
|
170
|
-
export interface TreeSelectFieldProps<T = unknown> extends BaseFieldProps {
|
|
171
|
-
nodes: T[];
|
|
172
|
-
getNodeId: (node: T) => string;
|
|
173
|
-
getNodeLabel: (node: T) => ReactNode;
|
|
174
|
-
/** Nested data: expose each node's children. */
|
|
175
|
-
getNodeChildren?: (node: T) => T[] | undefined;
|
|
176
|
-
/** Flat data: the key on each node pointing at its parent's id. */
|
|
177
|
-
parentIdKey?: string;
|
|
178
|
-
/** Allow selecting branch (folder) nodes too. */
|
|
179
|
-
selectableFolders?: boolean;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/** `FormBuilder.Password` — optionally show a strength meter. */
|
|
183
|
-
export interface PasswordFieldProps extends BaseFieldProps {
|
|
184
|
-
strengthMeter?: boolean;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/** `FormBuilder.Slider` — numeric slider; value `number` (or `[number, number]` with `range`). */
|
|
188
|
-
export interface SliderFieldProps extends BaseFieldProps {
|
|
189
|
-
min?: number;
|
|
190
|
-
max?: number;
|
|
191
|
-
step?: number;
|
|
192
|
-
/** Two thumbs — value becomes `[number, number]`. */
|
|
193
|
-
range?: boolean;
|
|
194
|
-
/** Appended to the value readout, e.g. `"%"` → `50%`. */
|
|
195
|
-
suffix?: string;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/** `FormBuilder.Color` — color picker; value hex `string`. */
|
|
199
|
-
export interface ColorFieldProps extends BaseFieldProps {
|
|
200
|
-
presets?: string[];
|
|
201
|
-
/** Enable the opacity slider and `#rrggbbaa` output (default true). */
|
|
202
|
-
alpha?: boolean;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
/** `FormBuilder.Phone` — country dial-code + number; value `string`. */
|
|
206
|
-
export interface PhoneFieldProps extends BaseFieldProps {
|
|
207
|
-
defaultCountry?: string;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
/** `FormBuilder.Signature` — freehand signature pad; value is a PNG data-URL `string`. */
|
|
211
|
-
export interface SignatureFieldProps extends BaseFieldProps {
|
|
212
|
-
/** Stroke color (default `#111827`). */
|
|
213
|
-
penColor?: string;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/** `FormBuilder.FieldArray` — a repeating list of sub-fields (RHF `useFieldArray`). */
|
|
217
|
-
export interface FieldArrayProps {
|
|
218
|
-
name: string;
|
|
219
|
-
label?: ReactNode;
|
|
220
|
-
description?: ReactNode;
|
|
221
|
-
hidden?: boolean;
|
|
222
|
-
addLabel?: ReactNode;
|
|
223
|
-
/** Value for a newly-added row. */
|
|
224
|
-
defaultItem?: Record<string, unknown>;
|
|
225
|
-
/** Render a row's sub-fields; use names like `${rowName}.field`. */
|
|
226
|
-
children: (rowName: string, index: number, remove: () => void) => ReactNode;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/** One column of `FormBuilder.Table`. `cell` renders any `FormBuilder.*` field for a row. */
|
|
230
|
-
export interface TableColumn {
|
|
231
|
-
header: ReactNode;
|
|
232
|
-
/** Fixed column width in px (otherwise the column sizes to content). */
|
|
233
|
-
width?: number;
|
|
234
|
-
align?: "start" | "center" | "end";
|
|
235
|
-
/**
|
|
236
|
-
* The row-object key this column edits. Set it to make the column header **sortable** — a
|
|
237
|
-
* sort toggle appears and clicking it reorders the rows by this key (asc/desc). Omit for
|
|
238
|
-
* non-sortable columns.
|
|
239
|
-
*/
|
|
240
|
-
sortKey?: string;
|
|
241
|
-
/**
|
|
242
|
-
* Render the cell's field. `rowName` is the array path for this row (e.g. `lines.0`), so name
|
|
243
|
-
* sub-fields `${rowName}.<key>`. The field renders "bare" (control only, error as a tooltip).
|
|
244
|
-
*/
|
|
245
|
-
cell: (rowName: string, index: number) => ReactNode;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
/**
|
|
249
|
-
* `FormBuilder.Table` — an editable table field (built on RHF `useFieldArray`). Each row is a
|
|
250
|
-
* record; each column cell is any `FormBuilder.*` field. Supports per-row checkbox selection
|
|
251
|
-
* (+ select-all + bulk delete), drag-drop reordering, and add/remove rows. Renders inside a
|
|
252
|
-
* `SectionBlock`, so place it as a top-level child (not inside a `FormRenderer.Section`).
|
|
253
|
-
*/
|
|
254
|
-
export interface TableFieldProps {
|
|
255
|
-
name: string;
|
|
256
|
-
/** SectionBlock title. */
|
|
257
|
-
title?: ReactNode;
|
|
258
|
-
/** SectionBlock color badge (default `"Blue"`). */
|
|
259
|
-
color?: SectionColor;
|
|
260
|
-
icon?: ReactNode;
|
|
261
|
-
description?: ReactNode;
|
|
262
|
-
hidden?: boolean;
|
|
263
|
-
columns: TableColumn[];
|
|
264
|
-
/** Value for a newly-added row. */
|
|
265
|
-
defaultItem?: Record<string, unknown>;
|
|
266
|
-
addLabel?: ReactNode;
|
|
267
|
-
/** Per-row checkboxes + select-all + bulk delete (default `true`). */
|
|
268
|
-
selectable?: boolean;
|
|
269
|
-
/** Drag-drop row reordering (default `true`). */
|
|
270
|
-
reorderable?: boolean;
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
/** Root `<FormBuilder>` props. */
|
|
274
|
-
export interface FormBuilderRootProps<T extends FieldValues = FieldValues> {
|
|
275
|
-
children: ReactNode;
|
|
276
|
-
/** `id` on the underlying `<form>` — lets an outside button submit it via `form={id}`. */
|
|
277
|
-
id?: string;
|
|
278
|
-
/**
|
|
279
|
-
* An existing react-hook-form instance. Pass one when something **outside** the
|
|
280
|
-
* form needs the same values — e.g. a `FormSummary` rendered beside it:
|
|
281
|
-
*
|
|
282
|
-
* ```tsx
|
|
283
|
-
* const form = useForm({ resolver, defaultValues })
|
|
284
|
-
* <FormBuilder form={form} …>…</FormBuilder>
|
|
285
|
-
* <FormSummary form={form}>…</FormSummary>
|
|
286
|
-
* ```
|
|
287
|
-
*
|
|
288
|
-
* When omitted, FormBuilder creates its own from `resolver`/`defaultValues`/`values`.
|
|
289
|
-
*/
|
|
290
|
-
form?: UseFormReturn<T>;
|
|
291
|
-
onSubmit: (values: T) => void | Promise<void>;
|
|
292
|
-
onInvalid?: (errors: FieldErrors<T>) => void;
|
|
293
|
-
/** RHF resolver — e.g. `zodResolver(schema)`. Library stays validation-agnostic. */
|
|
294
|
-
resolver?: Resolver<T>;
|
|
295
|
-
defaultValues?: DefaultValues<T>;
|
|
296
|
-
/** Controlled values for edit — the form re-syncs when this changes. */
|
|
297
|
-
values?: T;
|
|
298
|
-
/** Loading flag — Submit shows a spinner and inputs disable. */
|
|
299
|
-
loading?: boolean;
|
|
300
|
-
/**
|
|
301
|
-
* Field row direction. Unset means `"flexible"` — stacked, then label-beside-control once the
|
|
302
|
-
* field row passes the container `md` breakpoint. `FormRenderer` pins `"vertical"` in a drawer;
|
|
303
|
-
* pass `"flexible"` there to get the responsive layout back.
|
|
304
|
-
*/
|
|
305
|
-
fieldDirection?: FieldDirection;
|
|
306
|
-
/** Reset to defaults after a successful submit. */
|
|
307
|
-
resetOnSuccess?: boolean;
|
|
308
|
-
/**
|
|
309
|
-
* Lands on the `<form>` element itself — FormBuilder renders nothing around it. Use it to let
|
|
310
|
-
* the form fill its parent (e.g. `"flex-1 min-h-0"` inside a flex column that has a height).
|
|
311
|
-
*
|
|
312
|
-
* There is no `layout` prop: the fields always fill their container. The page framing that
|
|
313
|
-
* used to live here — the 1100px cap and 48px gutters — belongs to `FormRenderer`.
|
|
314
|
-
*/
|
|
315
|
-
className?: string;
|
|
316
|
-
}
|