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,358 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { Children, useId, type ReactElement, type ReactNode } from "react";
|
|
4
|
-
import { useForm, type Control, type FieldValues } from "react-hook-form";
|
|
5
|
-
|
|
6
|
-
import { cn } from "../../utils/cn";
|
|
7
|
-
import { FormBuilder } from "../FormBuilder";
|
|
8
|
-
import { FormIdContext, LoadingContext } from "../FormBuilder/context";
|
|
9
|
-
import {
|
|
10
|
-
DetailSidebar,
|
|
11
|
-
DetailTab,
|
|
12
|
-
DetailGrid,
|
|
13
|
-
DetailRow,
|
|
14
|
-
DetailTabsView,
|
|
15
|
-
isDetailSidebarElement,
|
|
16
|
-
isDetailTabElement,
|
|
17
|
-
} from "./detail";
|
|
18
|
-
import { FormDrawer } from "./FormDrawer";
|
|
19
|
-
import { FormHeaderBar } from "./header";
|
|
20
|
-
import { NotchAction, isNotchActionElement } from "./notch-action";
|
|
21
|
-
import { Section } from "./section";
|
|
22
|
-
import {
|
|
23
|
-
Back,
|
|
24
|
-
Next,
|
|
25
|
-
Step,
|
|
26
|
-
StepSlot,
|
|
27
|
-
Stepper,
|
|
28
|
-
StepperActions,
|
|
29
|
-
StepperContext,
|
|
30
|
-
StepperNav,
|
|
31
|
-
isStepElement,
|
|
32
|
-
isStepperElement,
|
|
33
|
-
useStepperState,
|
|
34
|
-
type StepProps,
|
|
35
|
-
} from "./stepper";
|
|
36
|
-
import type { FormRendererProps } from "./types";
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* FormRenderer — the chrome around a `FormBuilder`.
|
|
40
|
-
*
|
|
41
|
-
* `FormBuilder` is the fields and nothing else: a `<form>`, its react-hook-form context, and the
|
|
42
|
-
* field components. Every pixel drawn *around* those fields is here — page-vs-drawer display, the
|
|
43
|
-
* absolute title header, the `actions` bar, titled `FormRenderer.Section` cards, the page gutters,
|
|
44
|
-
* the scroll shell, the wizard rail (`FormRenderer.Stepper`), and the `summary` column.
|
|
45
|
-
*
|
|
46
|
-
* FormRenderer never manufactures a Submit — you compose it and hand it to `actions`
|
|
47
|
-
* (`actions={<FormBuilder.Submit>Save</FormBuilder.Submit>}`). It renders in the form's header
|
|
48
|
-
* action pill (page) or the drawer header (drawer), and auto-targets this form.
|
|
49
|
-
*
|
|
50
|
-
* Give it `FormRenderer.Sidebar` + `FormRenderer.Tab` children instead of fields and it switches to
|
|
51
|
-
* a **detail-tabs** view: a display-only page (no `<form>`) whose sidebar swaps
|
|
52
|
-
* `FormRenderer.Section` panels — the sidebar sits where a stepper's rail would.
|
|
53
|
-
*/
|
|
54
|
-
function FormRendererRoot<T extends FieldValues = FieldValues>({
|
|
55
|
-
children,
|
|
56
|
-
id,
|
|
57
|
-
onSubmit,
|
|
58
|
-
onInvalid,
|
|
59
|
-
resolver,
|
|
60
|
-
defaultValues,
|
|
61
|
-
values,
|
|
62
|
-
loading,
|
|
63
|
-
resetOnSuccess,
|
|
64
|
-
fieldDirection,
|
|
65
|
-
form,
|
|
66
|
-
display = "page",
|
|
67
|
-
header,
|
|
68
|
-
summary,
|
|
69
|
-
className,
|
|
70
|
-
actions,
|
|
71
|
-
open = false,
|
|
72
|
-
onOpenChange,
|
|
73
|
-
title,
|
|
74
|
-
badge,
|
|
75
|
-
onOpenInNewTab,
|
|
76
|
-
// LOCAL PATCH (Contact Center): detail-tabs control — see FormRendererProps.
|
|
77
|
-
activeTab,
|
|
78
|
-
onTabChange,
|
|
79
|
-
embedded,
|
|
80
|
-
// LOCAL PATCH (Contact Center): external stepper control — see FormRendererProps.
|
|
81
|
-
activeStep,
|
|
82
|
-
onStepChange,
|
|
83
|
-
// LOCAL PATCH (Contact Center): drawer layout — see FormRendererProps.
|
|
84
|
-
drawer,
|
|
85
|
-
}: FormRendererProps<T>) {
|
|
86
|
-
const isDrawer = display === "drawer";
|
|
87
|
-
|
|
88
|
-
// FormRenderer owns the display decision: a drawer form lays out vertically.
|
|
89
|
-
const effectiveDirection = fieldDirection ?? (isDrawer ? "vertical" : undefined);
|
|
90
|
-
// The absolute title header is a page concern — the drawer has its own header.
|
|
91
|
-
const useHeader = !!header && !isDrawer;
|
|
92
|
-
// A stable `id` lets a button OUTSIDE the form submit it via `form={id}` (the header action
|
|
93
|
-
// pill / drawer header). Falls back to a generated id, provided to the Submit via context.
|
|
94
|
-
const autoId = useId();
|
|
95
|
-
const formId = id ?? autoId;
|
|
96
|
-
|
|
97
|
-
// The form instance is created HERE, not in FormBuilder, because the stepper needs `trigger` to
|
|
98
|
-
// validate a step before advancing — and the rail that calls it renders outside the `<form>`.
|
|
99
|
-
// Same pattern FormBuilder uses: one is always created (hooks can't be conditional), the
|
|
100
|
-
// caller's hoisted instance wins when given.
|
|
101
|
-
const ownForm = useForm<T>({ resolver, defaultValues, values });
|
|
102
|
-
const formInstance = form ?? ownForm;
|
|
103
|
-
|
|
104
|
-
const childArray = Children.toArray(children);
|
|
105
|
-
|
|
106
|
-
// Detail-tabs mode: a `FormRenderer.Sidebar` + `FormRenderer.Tab` children mean a display-only
|
|
107
|
-
// detail page (no `<form>`) — the sidebar swaps Section panels via Radix Tabs. Detected here so
|
|
108
|
-
// the form props below are simply unused.
|
|
109
|
-
const detailSidebar = childArray.find(isDetailSidebarElement);
|
|
110
|
-
const detailTabs = childArray.filter(isDetailTabElement);
|
|
111
|
-
|
|
112
|
-
// Split out a `FormRenderer.Stepper`: its Steps become the visibility-toggled slots inside the
|
|
113
|
-
// `<form>`, its non-Step children a footer, and its state drives the rail beside them.
|
|
114
|
-
// LOCAL PATCH (Contact Center): lift `FormRenderer.NotchAction` children out of the form
|
|
115
|
-
// body and into the drawer's notch. Authored as children so the caller owns the label (and
|
|
116
|
-
// therefore its translation) instead of the component hardcoding English — see notch-action.tsx.
|
|
117
|
-
const notchActions = childArray.filter(isNotchActionElement);
|
|
118
|
-
const bodyChildren = notchActions.length
|
|
119
|
-
? childArray.filter((n) => !isNotchActionElement(n))
|
|
120
|
-
: children;
|
|
121
|
-
|
|
122
|
-
const stepperEl = childArray.find(isStepperElement);
|
|
123
|
-
const stepChildren = stepperEl ? Children.toArray(stepperEl.props.children) : [];
|
|
124
|
-
const steps = stepChildren.filter(isStepElement) as ReactElement<StepProps>[];
|
|
125
|
-
const stepExtras = stepChildren.filter((n) => !isStepElement(n));
|
|
126
|
-
const isStepper = !!stepperEl;
|
|
127
|
-
|
|
128
|
-
// Called unconditionally (inert when there are no steps) to keep hooks order stable.
|
|
129
|
-
const stepper = useStepperState(
|
|
130
|
-
steps,
|
|
131
|
-
formInstance.trigger as Parameters<typeof useStepperState>[1],
|
|
132
|
-
// LOCAL PATCH (Contact Center): undefined `activeStep` leaves the stepper uncontrolled.
|
|
133
|
-
{ activeStep, onStepChange },
|
|
134
|
-
);
|
|
135
|
-
|
|
136
|
-
if (detailSidebar && detailTabs.length > 0) {
|
|
137
|
-
const detailView = (
|
|
138
|
-
<DetailTabsView
|
|
139
|
-
// In a drawer the tray already paints the surface and the drawer header carries the
|
|
140
|
-
// title, so the view drops its own card and its own floating header.
|
|
141
|
-
header={isDrawer ? undefined : header}
|
|
142
|
-
actions={isDrawer ? undefined : actions}
|
|
143
|
-
sidebar={detailSidebar}
|
|
144
|
-
tabs={detailTabs}
|
|
145
|
-
className={className}
|
|
146
|
-
// LOCAL PATCH (Contact Center): lets the caller keep the tab in the URL, and render
|
|
147
|
-
// inside a surface that already draws its own card. Both optional.
|
|
148
|
-
value={activeTab}
|
|
149
|
-
onValueChange={onTabChange}
|
|
150
|
-
embedded={embedded ?? isDrawer}
|
|
151
|
-
/>
|
|
152
|
-
);
|
|
153
|
-
|
|
154
|
-
// LOCAL PATCH (Contact Center): a detail view can be a DRAWER too.
|
|
155
|
-
//
|
|
156
|
-
// Upstream returned the detail surface here unconditionally, *before* the `isDrawer` branch
|
|
157
|
-
// below — so `FormRenderer.Sidebar` + `display="drawer"` silently rendered a full page inside
|
|
158
|
-
// whatever the caller put it in, and a quick-view drawer had to be hand-rolled around the
|
|
159
|
-
// detail view instead. A record looks the same whether you opened it from a row or from its
|
|
160
|
-
// own route; only the surface differs, which is exactly what `display` is for.
|
|
161
|
-
if (!isDrawer) return detailView;
|
|
162
|
-
return (
|
|
163
|
-
<FormDrawer
|
|
164
|
-
open={open}
|
|
165
|
-
onOpenChange={onOpenChange ?? (() => {})}
|
|
166
|
-
title={title ?? header?.title}
|
|
167
|
-
badge={badge ?? header?.label}
|
|
168
|
-
variant={header?.variant}
|
|
169
|
-
actions={actions}
|
|
170
|
-
onOpenInNewTab={onOpenInNewTab}
|
|
171
|
-
notchActions={notchActions.length > 0 ? notchActions : undefined}
|
|
172
|
-
// `DetailTabsView` already owns its scroll container and already offsets for a header,
|
|
173
|
-
// so the drawer must not add a second of each — that is what `bareBody` is for. The
|
|
174
|
-
// drawer's own header still renders, carrying the title and actions.
|
|
175
|
-
bareBody
|
|
176
|
-
{...drawer}
|
|
177
|
-
>
|
|
178
|
-
{detailView}
|
|
179
|
-
</FormDrawer>
|
|
180
|
-
);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// The fields the `<form>` wraps: the stepper's steps (+ any custom footer extras), or the
|
|
184
|
-
// children as authored. Every step stays mounted so the whole form is registered at all times.
|
|
185
|
-
const fields: ReactNode = isStepper ? (
|
|
186
|
-
<>
|
|
187
|
-
{steps.map((step, i) => (
|
|
188
|
-
<StepSlot key={i} index={i} active={i === stepper.currentStep}>
|
|
189
|
-
{step.props.children}
|
|
190
|
-
</StepSlot>
|
|
191
|
-
))}
|
|
192
|
-
{stepExtras}
|
|
193
|
-
</>
|
|
194
|
-
) : (
|
|
195
|
-
bodyChildren
|
|
196
|
-
);
|
|
197
|
-
|
|
198
|
-
const formEl = (
|
|
199
|
-
<FormBuilder
|
|
200
|
-
id={formId}
|
|
201
|
-
form={formInstance}
|
|
202
|
-
onSubmit={onSubmit ?? (() => {})}
|
|
203
|
-
onInvalid={onInvalid}
|
|
204
|
-
loading={loading}
|
|
205
|
-
fieldDirection={effectiveDirection}
|
|
206
|
-
resetOnSuccess={resetOnSuccess}
|
|
207
|
-
>
|
|
208
|
-
{fields}
|
|
209
|
-
</FormBuilder>
|
|
210
|
-
);
|
|
211
|
-
|
|
212
|
-
// The fields column caps at 1100px and centres — standalone, and as the middle column of the
|
|
213
|
-
// stepper grid. This is page framing, which is why it wraps FormBuilder rather than living
|
|
214
|
-
// inside it: a form embedded in a 260px rail has no room to give up 96px to gutters.
|
|
215
|
-
const fieldsColumn = <div className="mx-auto w-full max-w-[1100px] px-[48px]">{formEl}</div>;
|
|
216
|
-
|
|
217
|
-
// Inside the form surface: the stepper rail beside the fields. Columns never wrap — the layout
|
|
218
|
-
// stays side-by-side at every screen size; when space runs short the fields column shrinks and
|
|
219
|
-
// the rail's labels truncate.
|
|
220
|
-
//
|
|
221
|
-
// `minmax(180px,1fr)` and not a bare `1fr` on the side tracks. `1fr` means `minmax(auto,1fr)`,
|
|
222
|
-
// whose *auto* minimum stops a track shrinking below its content — so a long step label made the
|
|
223
|
-
// rail's track wider than the empty track opposite it, and the two side tracks being equal is the
|
|
224
|
-
// only thing centring the middle column. Hovering a step made it visibly worse: the label's
|
|
225
|
-
// padding grows 6px→9px on hover (FormStepper), so the centre jumped 3px every time.
|
|
226
|
-
//
|
|
227
|
-
// The minimum is a fixed 180px rather than `auto` precisely so it cannot depend on the labels:
|
|
228
|
-
// both side tracks size identically whatever the rail holds, so the middle column stays centred,
|
|
229
|
-
// and the rail still has room to be legible (a plain `minmax(0,…)` let it collapse to 0 in a
|
|
230
|
-
// narrow preview frame). Past that floor the labels truncate instead of pushing.
|
|
231
|
-
const bodyInner = isStepper ? (
|
|
232
|
-
// `@container` on the wrapper, not on the grid: an element cannot query its own size, so the
|
|
233
|
-
// measured box has to be an ancestor. It sits here rather than on the scroll body because
|
|
234
|
-
// `bodyInner` is also used directly when there is no header, and this way both paths get a
|
|
235
|
-
// container. The form then reacts to the width it is actually given — a rail, a drawer, a
|
|
236
|
-
// narrow preview frame — instead of the viewport's.
|
|
237
|
-
<div className="@container w-full">
|
|
238
|
-
{/* Below `@lg` the balancing column is dropped: it is empty, and in a narrow container its
|
|
239
|
-
180px floor plus a 32px gap is width the fields column needs more than the centring.
|
|
240
|
-
Both halves are required — a `display:none` child is not a grid item, but the third
|
|
241
|
-
track would still be reserved if the template kept describing it. */}
|
|
242
|
-
<div className="grid w-full grid-cols-[minmax(180px,1fr)_minmax(0,1100px)] gap-8 @lg:grid-cols-[minmax(180px,1fr)_minmax(0,1100px)_minmax(180px,1fr)]">
|
|
243
|
-
<StepperNav control={formInstance.control as Control<FieldValues>} />
|
|
244
|
-
{fieldsColumn}
|
|
245
|
-
{/* Empty third column — balances the rail's gutter so the middle column is centred. */}
|
|
246
|
-
<div className="hidden @lg:block" />
|
|
247
|
-
</div>
|
|
248
|
-
</div>
|
|
249
|
-
) : (
|
|
250
|
-
fieldsColumn
|
|
251
|
-
);
|
|
252
|
-
|
|
253
|
-
const surface = useHeader ? (
|
|
254
|
-
// Scroll shell: the absolute header floats over the scrollable body. No fixed height — it
|
|
255
|
-
// fills whatever the parent gives it (like the drawer's panel fills its tray) and the body
|
|
256
|
-
// scrolls internally.
|
|
257
|
-
<div className="relative isolate flex h-full w-full flex-col overflow-hidden rounded-2xl bg-background-presentation-body-primary">
|
|
258
|
-
<FormHeaderBar title={header!.title} label={header!.label} variant={header!.variant}>
|
|
259
|
-
{/* A stepper form prepends chevron Back/Next + a divider before the Submit. */}
|
|
260
|
-
{actions && <StepperActions>{actions}</StepperActions>}
|
|
261
|
-
</FormHeaderBar>
|
|
262
|
-
<div className="relative z-[1] flex min-h-0 w-full flex-1 flex-col overflow-y-auto px-6 py-6 pt-[72px] scrollbar-hide">
|
|
263
|
-
{bodyInner}
|
|
264
|
-
</div>
|
|
265
|
-
</div>
|
|
266
|
-
) : (
|
|
267
|
-
bodyInner
|
|
268
|
-
);
|
|
269
|
-
|
|
270
|
-
// The summary (right) lives OUTSIDE the scroll surface — its own panel beside it (mirroring the
|
|
271
|
-
// drawer's tray, a 6px gutter). Only the surface's body scrolls; the summary stays put. In a
|
|
272
|
-
// drawer it goes to FormDrawer's tray instead.
|
|
273
|
-
const pageBody =
|
|
274
|
-
summary && !isDrawer ? (
|
|
275
|
-
<div className="flex h-full flex-row items-stretch">
|
|
276
|
-
<div className="min-h-0 min-w-0 flex-1">{surface}</div>
|
|
277
|
-
{/* LOCAL PATCH (Contact Center): `ms-`, not `ml-`. Under `dir="rtl"` the summary sits to
|
|
278
|
-
the LEFT of the surface, so a physical left margin puts the gutter on its far side and
|
|
279
|
-
the two panels butt together. */}
|
|
280
|
-
<div className="ms-[6px] flex min-h-0">{summary}</div>
|
|
281
|
-
</div>
|
|
282
|
-
) : (
|
|
283
|
-
surface
|
|
284
|
-
);
|
|
285
|
-
|
|
286
|
-
// `className` lands on the OUTERMOST element — the one a parent lays out (e.g. `flex-1 min-h-0`
|
|
287
|
-
// to fill a flex column). `h-full` fills a parent that has a definite height.
|
|
288
|
-
//
|
|
289
|
-
// The form-id and loading contexts are supplied HERE as well as inside FormBuilder, because the
|
|
290
|
-
// header's action pill renders outside the `<FormBuilder>` subtree: a bare `FormBuilder.Submit`
|
|
291
|
-
// in `actions` reads the id from context to target the `<form>` by native form-association.
|
|
292
|
-
// Same reason the drawer branch below re-provides them around its own header.
|
|
293
|
-
const inner = (
|
|
294
|
-
<LoadingContext.Provider value={!!loading}>
|
|
295
|
-
<FormIdContext.Provider value={formId}>
|
|
296
|
-
<div className={cn("h-full w-full", !isDrawer && className)}>{pageBody}</div>
|
|
297
|
-
</FormIdContext.Provider>
|
|
298
|
-
</LoadingContext.Provider>
|
|
299
|
-
);
|
|
300
|
-
|
|
301
|
-
// One provider around the whole tree: the rail renders outside the `<form>`, the step slots
|
|
302
|
-
// inside it, and both read the same state.
|
|
303
|
-
const tree = isStepper ? (
|
|
304
|
-
<StepperContext.Provider value={stepper}>{inner}</StepperContext.Provider>
|
|
305
|
-
) : (
|
|
306
|
-
inner
|
|
307
|
-
);
|
|
308
|
-
|
|
309
|
-
if (isDrawer) {
|
|
310
|
-
return (
|
|
311
|
-
<FormDrawer
|
|
312
|
-
open={open}
|
|
313
|
-
onOpenChange={onOpenChange ?? (() => {})}
|
|
314
|
-
title={title ?? header?.title}
|
|
315
|
-
badge={badge ?? header?.label}
|
|
316
|
-
variant={header?.variant}
|
|
317
|
-
summary={summary}
|
|
318
|
-
// The drawer header sits outside the `<form>`, so re-supply the form-id and loading
|
|
319
|
-
// context a bare `FormBuilder.Submit` reads (on the page it gets these from the tree).
|
|
320
|
-
actions={
|
|
321
|
-
actions ? (
|
|
322
|
-
<LoadingContext.Provider value={!!loading}>
|
|
323
|
-
<FormIdContext.Provider value={formId}>{actions}</FormIdContext.Provider>
|
|
324
|
-
</LoadingContext.Provider>
|
|
325
|
-
) : undefined
|
|
326
|
-
}
|
|
327
|
-
onOpenInNewTab={onOpenInNewTab}
|
|
328
|
-
notchActions={notchActions.length > 0 ? notchActions : undefined}
|
|
329
|
-
{...drawer}
|
|
330
|
-
>
|
|
331
|
-
{tree}
|
|
332
|
-
</FormDrawer>
|
|
333
|
-
);
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
return tree;
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
/**
|
|
340
|
-
* FormRenderer — see {@link FormRendererRoot}. The compound statics are the form's chrome:
|
|
341
|
-
*
|
|
342
|
-
* - `FormRenderer.Section` — a titled card grouping fields (or display rows).
|
|
343
|
-
* - `FormRenderer.Stepper` / `.Step` — the wizard; `.Back` / `.Next` are the chevron controls,
|
|
344
|
-
* which the header's action bar already prepends for you.
|
|
345
|
-
* - `FormRenderer.Sidebar` / `.Tab` / `.Grid` / `.Row` — the display-only **detail-tabs** view.
|
|
346
|
-
*/
|
|
347
|
-
export const FormRenderer = Object.assign(FormRendererRoot, {
|
|
348
|
-
Section,
|
|
349
|
-
Stepper,
|
|
350
|
-
Step,
|
|
351
|
-
Back,
|
|
352
|
-
Next,
|
|
353
|
-
NotchAction,
|
|
354
|
-
Sidebar: DetailSidebar,
|
|
355
|
-
Tab: DetailTab,
|
|
356
|
-
Grid: DetailGrid,
|
|
357
|
-
Row: DetailRow,
|
|
358
|
-
});
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { ReactNode } from "react";
|
|
4
|
-
|
|
5
|
-
import { cn } from "../../utils/cn";
|
|
6
|
-
import { HeaderBar } from "../HeaderBar";
|
|
7
|
-
|
|
8
|
-
export type HeaderVariant = "new" | "edit" | "detail";
|
|
9
|
-
|
|
10
|
-
const DEFAULT_LABEL: Record<HeaderVariant, string> = {
|
|
11
|
-
new: "New",
|
|
12
|
-
edit: "Edit",
|
|
13
|
-
detail: "View",
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export interface FormHeaderBarProps {
|
|
17
|
-
/** Plain title text (uppercased), e.g. the entity label or SKU. */
|
|
18
|
-
title: string;
|
|
19
|
-
/** Badge text — defaults from `variant` (New / Edit / View). */
|
|
20
|
-
label?: string;
|
|
21
|
-
/** Colored badge variant. */
|
|
22
|
-
variant?: HeaderVariant;
|
|
23
|
-
/** Action buttons shown in the right-hand action pill. */
|
|
24
|
-
children?: ReactNode;
|
|
25
|
-
className?: string;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* The floating form header: a `HeaderBar` title pill on the left and a dark action
|
|
30
|
-
* pill on the right, absolutely positioned over the scrollable body.
|
|
31
|
-
*
|
|
32
|
-
* Shared by all three FormRenderer surfaces — the page form, `FormDrawer` and the
|
|
33
|
-
* detail view — so a form's title looks identical wherever it is rendered. This is
|
|
34
|
-
* chrome, so it lives here rather than in `FormBuilder`: a bare `<FormBuilder>` is
|
|
35
|
-
* fields and nothing else.
|
|
36
|
-
*
|
|
37
|
-
* Per the design both pills are 44px tall, reached differently: the title pill is
|
|
38
|
-
* 6px padding + 32px content, the action pill 8px + 28px.
|
|
39
|
-
*/
|
|
40
|
-
export function FormHeaderBar({
|
|
41
|
-
title,
|
|
42
|
-
label,
|
|
43
|
-
variant = "new",
|
|
44
|
-
children,
|
|
45
|
-
className,
|
|
46
|
-
}: FormHeaderBarProps) {
|
|
47
|
-
return (
|
|
48
|
-
<div
|
|
49
|
-
className={cn(
|
|
50
|
-
"absolute inset-x-0 top-0 z-[2] flex w-full items-start justify-between gap-2 p-1",
|
|
51
|
-
className,
|
|
52
|
-
)}
|
|
53
|
-
>
|
|
54
|
-
<HeaderBar
|
|
55
|
-
variant={variant}
|
|
56
|
-
label={label ?? DEFAULT_LABEL[variant]}
|
|
57
|
-
title={title}
|
|
58
|
-
theme="dark"
|
|
59
|
-
/>
|
|
60
|
-
|
|
61
|
-
{children && (
|
|
62
|
-
<div
|
|
63
|
-
data-theme="dark"
|
|
64
|
-
className="flex flex-col items-start rounded-[14px] border border-border-presentation-global-primary bg-background-presentation-form-base shadow-[0_0_32px_0_rgba(0,0,0,0.15)]"
|
|
65
|
-
>
|
|
66
|
-
<div className="sticky top-0 flex w-full items-center justify-between p-2">
|
|
67
|
-
<div className="flex h-7 items-center justify-center gap-2">{children}</div>
|
|
68
|
-
</div>
|
|
69
|
-
</div>
|
|
70
|
-
)}
|
|
71
|
-
</div>
|
|
72
|
-
);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* The `header` prop's shape — `header={{ title, label, variant }}` on `FormRenderer`.
|
|
77
|
-
* There is no `FormRenderer.Header` component: the header is a prop, not a child, so a
|
|
78
|
-
* child element can never reconfigure the surrounding layout the way the old
|
|
79
|
-
* `FormBuilder.Header` did.
|
|
80
|
-
*/
|
|
81
|
-
export interface HeaderConfig {
|
|
82
|
-
/** Plain title text (uppercased), e.g. the entity label or SKU. */
|
|
83
|
-
title: string;
|
|
84
|
-
/** Badge text — defaults from `variant` (New / Edit / View). */
|
|
85
|
-
label?: string;
|
|
86
|
-
/** Colored badge variant. */
|
|
87
|
-
variant?: HeaderVariant;
|
|
88
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export { FormRenderer } from "./form-renderer";
|
|
2
|
-
export { FormDrawer } from "./FormDrawer";
|
|
3
|
-
export type { FormDrawerProps } from "./FormDrawer";
|
|
4
|
-
export { FormHeaderBar } from "./header";
|
|
5
|
-
export { NotchAction } from "./notch-action";
|
|
6
|
-
export type { NotchActionProps } from "./notch-action";
|
|
7
|
-
export type { HeaderConfig, HeaderVariant, FormHeaderBarProps } from "./header";
|
|
8
|
-
export type { SectionProps } from "./section";
|
|
9
|
-
export type { StepProps, StepperProps } from "./stepper";
|
|
10
|
-
export type { FormRendererProps, FormRendererDisplay, FieldDirection } from "./types";
|
|
11
|
-
export type {
|
|
12
|
-
DetailSidebarProps,
|
|
13
|
-
DetailSidebarItemProps,
|
|
14
|
-
DetailTabProps,
|
|
15
|
-
DetailRowProps,
|
|
16
|
-
DetailGridProps,
|
|
17
|
-
} from "./detail";
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import * as React from "react";
|
|
4
|
-
|
|
5
|
-
import { cn } from "../../utils/cn";
|
|
6
|
-
import { DrawerNotchPill } from "../Drawer";
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* `FormRenderer.NotchAction` — a button in the drawer's notch, authored as a CHILD.
|
|
10
|
-
*
|
|
11
|
-
* LOCAL PATCH (Contact Center). Upstream models the one notch action it ships as a pair of
|
|
12
|
-
* props on `FormDrawer` / `FormRenderer`: `onOpenInNewTab` (a handler) plus a hardcoded
|
|
13
|
-
* English "Open in new tab" label. That shape has two problems:
|
|
14
|
-
*
|
|
15
|
-
* 1. The label is the component's, not the caller's, so a localized app cannot translate it
|
|
16
|
-
* without a second prop — which is exactly the `openInNewTabLabel` patch we kept having
|
|
17
|
-
* to re-apply after every `npx torch-glare update`.
|
|
18
|
-
* 2. It only ever admits ONE action, and only that action. Anything else in the notch means
|
|
19
|
-
* another prop pair.
|
|
20
|
-
*
|
|
21
|
-
* Passing the button as a child fixes both at once: the caller owns the text (so i18n is just
|
|
22
|
-
* `{t(...)}`, no prop), owns the icon, and can render more than one. Same bargain the rest of
|
|
23
|
-
* the library strikes — `DataViews` registers a view because you rendered it, `FormRenderer`
|
|
24
|
-
* renders a step because you wrote a `<Step>`.
|
|
25
|
-
*
|
|
26
|
-
* It renders nothing where it is written: `FormRenderer` lifts it out of the children and hands
|
|
27
|
-
* it to `FormDrawer`'s notch, the same way it lifts a `Stepper`. Ignored entirely on a page-display
|
|
28
|
-
* form, which has no notch.
|
|
29
|
-
*
|
|
30
|
-
* ```tsx
|
|
31
|
-
* <FormRenderer display="drawer" …>
|
|
32
|
-
* <FormRenderer.NotchAction onClick={openInTab}>
|
|
33
|
-
* {t("contacts.formShell.openInNewTab")}
|
|
34
|
-
* <i className="ri-arrow-right-up-line text-[12px]" />
|
|
35
|
-
* </FormRenderer.NotchAction>
|
|
36
|
-
* <FormRenderer.Section …>…</FormRenderer.Section>
|
|
37
|
-
* </FormRenderer>
|
|
38
|
-
* ```
|
|
39
|
-
*/
|
|
40
|
-
export interface NotchActionProps
|
|
41
|
-
extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "color"> {
|
|
42
|
-
/** Pill colour, matching `DrawerNotchPill`. Defaults to the yellow "open elsewhere" pill. */
|
|
43
|
-
color?: React.ComponentProps<typeof DrawerNotchPill>["color"];
|
|
44
|
-
children?: React.ReactNode;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export function NotchAction({ color = "Yellow", className, children, ...props }: NotchActionProps) {
|
|
48
|
-
return (
|
|
49
|
-
<DrawerNotchPill color={color} className={cn(className)} {...props}>
|
|
50
|
-
{children}
|
|
51
|
-
</DrawerNotchPill>
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
(NotchAction as unknown as { __isFormNotchAction: boolean }).__isFormNotchAction = true;
|
|
56
|
-
|
|
57
|
-
export function isNotchActionElement(
|
|
58
|
-
node: React.ReactNode,
|
|
59
|
-
): node is React.ReactElement<NotchActionProps> {
|
|
60
|
-
return (
|
|
61
|
-
React.isValidElement(node) &&
|
|
62
|
-
(node.type as { __isFormNotchAction?: boolean })?.__isFormNotchAction === true
|
|
63
|
-
);
|
|
64
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { ReactNode } from "react";
|
|
4
|
-
|
|
5
|
-
import { SectionBlock, type SectionColor, type SectionVariant } from "../SectionBlock";
|
|
6
|
-
|
|
7
|
-
export interface SectionProps {
|
|
8
|
-
title?: ReactNode;
|
|
9
|
-
color?: SectionColor;
|
|
10
|
-
icon?: ReactNode;
|
|
11
|
-
/**
|
|
12
|
-
* `"Table"` switches to the full-bleed table shell — no body padding, a rule under
|
|
13
|
-
* the header, and the card clipped to its radius. `FormBuilder.Table` uses it; pass
|
|
14
|
-
* it here only when hand-composing a table inside a section.
|
|
15
|
-
*/
|
|
16
|
-
variant?: SectionVariant;
|
|
17
|
-
/** Right-aligned content on the title row — e.g. action buttons. */
|
|
18
|
-
action?: ReactNode;
|
|
19
|
-
children: ReactNode;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* `FormRenderer.Section` — a titled Glare `SectionBlock` grouping fields.
|
|
24
|
-
*
|
|
25
|
-
* It lives here, not on `FormBuilder`, because it is presentation: a coloured card with a title
|
|
26
|
-
* row and an action slot. It holds no form state and reads no form context, so it works just as
|
|
27
|
-
* well around the read-only `FormRenderer.Grid` rows of a detail page as it does around fields.
|
|
28
|
-
*
|
|
29
|
-
* The per-field row layout — label, required marker, hint, the two-column split — is a different
|
|
30
|
-
* thing entirely: that is `FieldSection`, applied by every field itself, and it stays inside
|
|
31
|
-
* FormBuilder where the fields are.
|
|
32
|
-
*/
|
|
33
|
-
export function Section({ title, color, icon, variant, action, children }: SectionProps) {
|
|
34
|
-
return (
|
|
35
|
-
<SectionBlock title={title} color={color} icon={icon} variant={variant} action={action}>
|
|
36
|
-
{children}
|
|
37
|
-
</SectionBlock>
|
|
38
|
-
);
|
|
39
|
-
}
|