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,182 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import * as React from "react";
|
|
4
|
-
import * as LabelPrimitive from "@radix-ui/react-label";
|
|
5
|
-
import { Slot } from "@radix-ui/react-slot";
|
|
6
|
-
import {
|
|
7
|
-
Controller,
|
|
8
|
-
FormProvider,
|
|
9
|
-
useFormContext,
|
|
10
|
-
type ControllerProps,
|
|
11
|
-
type FieldPath,
|
|
12
|
-
type FieldValues,
|
|
13
|
-
} from "react-hook-form";
|
|
14
|
-
|
|
15
|
-
import { cn } from "../utils/cn";
|
|
16
|
-
import { Label } from "./Label";
|
|
17
|
-
import { Themes } from "../utils/types";
|
|
18
|
-
import { ReactNode } from "react";
|
|
19
|
-
const Form = FormProvider;
|
|
20
|
-
|
|
21
|
-
type FormFieldContextValue<
|
|
22
|
-
TFieldValues extends FieldValues = FieldValues,
|
|
23
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
24
|
-
> = {
|
|
25
|
-
name: TName;
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
const FormFieldContext = React.createContext<FormFieldContextValue>({} as FormFieldContextValue);
|
|
29
|
-
|
|
30
|
-
const FormField = <
|
|
31
|
-
TFieldValues extends FieldValues = FieldValues,
|
|
32
|
-
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
33
|
-
>({
|
|
34
|
-
...props
|
|
35
|
-
}: ControllerProps<TFieldValues, TName>) => {
|
|
36
|
-
return (
|
|
37
|
-
<FormFieldContext.Provider value={{ name: props.name }}>
|
|
38
|
-
<Controller {...props} />
|
|
39
|
-
</FormFieldContext.Provider>
|
|
40
|
-
);
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
const useFormField = () => {
|
|
44
|
-
const fieldContext = React.useContext(FormFieldContext);
|
|
45
|
-
const itemContext = React.useContext(FormItemContext);
|
|
46
|
-
const { getFieldState, formState } = useFormContext();
|
|
47
|
-
|
|
48
|
-
const fieldState = getFieldState(fieldContext.name, formState);
|
|
49
|
-
|
|
50
|
-
if (!fieldContext) {
|
|
51
|
-
throw new Error("useFormField should be used within <FormField>");
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const { id } = itemContext;
|
|
55
|
-
|
|
56
|
-
return {
|
|
57
|
-
id,
|
|
58
|
-
name: fieldContext.name,
|
|
59
|
-
formItemId: `${id}-form-item`,
|
|
60
|
-
formDescriptionId: `${id}-form-item-description`,
|
|
61
|
-
formMessageId: `${id}-form-item-message`,
|
|
62
|
-
...fieldState,
|
|
63
|
-
};
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
type FormItemContextValue = {
|
|
67
|
-
id: string;
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
const FormItemContext = React.createContext<FormItemContextValue>({} as FormItemContextValue);
|
|
71
|
-
|
|
72
|
-
const FormItem = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
|
|
73
|
-
({ className, ...props }, ref) => {
|
|
74
|
-
const id = React.useId();
|
|
75
|
-
|
|
76
|
-
return (
|
|
77
|
-
<FormItemContext.Provider value={{ id }}>
|
|
78
|
-
<div ref={ref} className={cn("space-y-2", className)} {...props} />
|
|
79
|
-
</FormItemContext.Provider>
|
|
80
|
-
);
|
|
81
|
-
},
|
|
82
|
-
);
|
|
83
|
-
FormItem.displayName = "FormItem";
|
|
84
|
-
|
|
85
|
-
const FormLabel = React.forwardRef<
|
|
86
|
-
React.ElementRef<typeof LabelPrimitive.Root>,
|
|
87
|
-
React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> & {
|
|
88
|
-
label?: ReactNode; // main label
|
|
89
|
-
requiredLabel?: ReactNode; // normal text with required style
|
|
90
|
-
secondaryLabel?: ReactNode; // normal text with secondary style
|
|
91
|
-
as?: React.ElementType;
|
|
92
|
-
asChild?: boolean;
|
|
93
|
-
size?: "S" | "M" | "L";
|
|
94
|
-
variant?: "SystemStyle" | "PresentationStyle";
|
|
95
|
-
theme?: Themes;
|
|
96
|
-
labelsClassName?: string;
|
|
97
|
-
labelDirections?: "vertical" | "horizontal";
|
|
98
|
-
childrenDirections?: "vertical" | "horizontal";
|
|
99
|
-
}
|
|
100
|
-
>(({ className, ...props }, ref) => {
|
|
101
|
-
const { error, formItemId } = useFormField();
|
|
102
|
-
|
|
103
|
-
return (
|
|
104
|
-
<Label
|
|
105
|
-
ref={ref}
|
|
106
|
-
className={cn(error && "text-destructive", className)}
|
|
107
|
-
htmlFor={formItemId}
|
|
108
|
-
{...props}
|
|
109
|
-
/>
|
|
110
|
-
);
|
|
111
|
-
});
|
|
112
|
-
FormLabel.displayName = "FormLabel";
|
|
113
|
-
|
|
114
|
-
const FormControl = React.forwardRef<
|
|
115
|
-
React.ElementRef<typeof Slot>,
|
|
116
|
-
React.ComponentPropsWithoutRef<typeof Slot>
|
|
117
|
-
>(({ ...props }, ref) => {
|
|
118
|
-
const { error, formItemId, formDescriptionId, formMessageId } = useFormField();
|
|
119
|
-
|
|
120
|
-
return (
|
|
121
|
-
<Slot
|
|
122
|
-
ref={ref}
|
|
123
|
-
id={formItemId}
|
|
124
|
-
aria-describedby={!error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`}
|
|
125
|
-
aria-invalid={!!error}
|
|
126
|
-
{...props}
|
|
127
|
-
/>
|
|
128
|
-
);
|
|
129
|
-
});
|
|
130
|
-
FormControl.displayName = "FormControl";
|
|
131
|
-
|
|
132
|
-
const FormDescription = React.forwardRef<
|
|
133
|
-
HTMLParagraphElement,
|
|
134
|
-
React.HTMLAttributes<HTMLParagraphElement>
|
|
135
|
-
>(({ className, ...props }, ref) => {
|
|
136
|
-
const { formDescriptionId } = useFormField();
|
|
137
|
-
|
|
138
|
-
return (
|
|
139
|
-
<p
|
|
140
|
-
ref={ref}
|
|
141
|
-
id={formDescriptionId}
|
|
142
|
-
className={cn("text-[0.8rem] text-muted-foreground", className)}
|
|
143
|
-
{...props}
|
|
144
|
-
/>
|
|
145
|
-
);
|
|
146
|
-
});
|
|
147
|
-
FormDescription.displayName = "FormDescription";
|
|
148
|
-
|
|
149
|
-
const FormMessage = React.forwardRef<
|
|
150
|
-
HTMLParagraphElement,
|
|
151
|
-
React.HTMLAttributes<HTMLParagraphElement>
|
|
152
|
-
>(({ className, children, ...props }, ref) => {
|
|
153
|
-
const { error, formMessageId } = useFormField();
|
|
154
|
-
const body = error ? String(error?.message ?? "") : children;
|
|
155
|
-
|
|
156
|
-
if (!body) {
|
|
157
|
-
return null;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
return (
|
|
161
|
-
<p
|
|
162
|
-
ref={ref}
|
|
163
|
-
id={formMessageId}
|
|
164
|
-
className={cn("text-[0.8rem] font-medium text-destructive", className)}
|
|
165
|
-
{...props}
|
|
166
|
-
>
|
|
167
|
-
{body}
|
|
168
|
-
</p>
|
|
169
|
-
);
|
|
170
|
-
});
|
|
171
|
-
FormMessage.displayName = "FormMessage";
|
|
172
|
-
|
|
173
|
-
export {
|
|
174
|
-
useFormField,
|
|
175
|
-
Form,
|
|
176
|
-
FormItem,
|
|
177
|
-
FormLabel,
|
|
178
|
-
FormControl,
|
|
179
|
-
FormDescription,
|
|
180
|
-
FormMessage,
|
|
181
|
-
FormField,
|
|
182
|
-
};
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { createContext, useContext } from "react";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* How a field row lays out its label against its control.
|
|
7
|
-
*
|
|
8
|
-
* `"flexible"` is the responsive one: stacked, then label-beside-control once the field row itself
|
|
9
|
-
* is past the container `md` breakpoint. It is what you get by leaving `fieldDirection` unset — and
|
|
10
|
-
* it is assignable so you can ask for it back where something else defaults you away from it, most
|
|
11
|
-
* notably a `FormRenderer` drawer, which pins `"vertical"`.
|
|
12
|
-
*/
|
|
13
|
-
export type FieldDirection = "horizontal" | "vertical" | "flexible";
|
|
14
|
-
|
|
15
|
-
/** Loading flag — drives the Submit spinner and disables inputs. */
|
|
16
|
-
export const LoadingContext = createContext<boolean>(false);
|
|
17
|
-
export const useLoading = () => useContext(LoadingContext);
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* The `<form>`'s `id`. Provided by the FormBuilder root so a `FormBuilder.Submit` rendered
|
|
21
|
-
* **outside** the `<form>` element — the absolute header's action pill, or the drawer header —
|
|
22
|
-
* can still submit it via native `form={id}` association without the caller wiring an id by hand.
|
|
23
|
-
*/
|
|
24
|
-
export const FormIdContext = createContext<string | undefined>(undefined);
|
|
25
|
-
export const useFormId = () => useContext(FormIdContext);
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Field row direction — set via `FormBuilder`'s `fieldDirection` prop. `undefined` (the default)
|
|
29
|
-
* means "don't force one": `FieldSection` then uses its own responsive `flexible` layout, which
|
|
30
|
-
* stacks on small screens and goes two-column at `lg`. Only set this to pin a direction.
|
|
31
|
-
*/
|
|
32
|
-
export const DirectionContext = createContext<FieldDirection | undefined>(undefined);
|
|
33
|
-
export const useDirection = () => useContext(DirectionContext);
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Field chrome mode — how much layout a field draws around its control.
|
|
37
|
-
*
|
|
38
|
-
* - `false` (the default) — the full `FieldSection` row: label, required marker, stacked hint.
|
|
39
|
-
* - `"table"` — a `FormBuilder.Table` cell: no row chrome, errors as a tooltip on the control,
|
|
40
|
-
* and the control takes the flush table border treatment via `onTable`.
|
|
41
|
-
* - `"bare"` — chrome-less anywhere else, e.g. a `DataViews` filter or config panel: no row and
|
|
42
|
-
* no stacked hint, but the control keeps its normal standalone border.
|
|
43
|
-
*
|
|
44
|
-
* The two chrome-less modes are deliberately distinct: dropping the label row and taking the
|
|
45
|
-
* table border are different decisions, and only a real table cell wants both.
|
|
46
|
-
*/
|
|
47
|
-
export type CellMode = "table" | "bare" | false;
|
|
48
|
-
|
|
49
|
-
export const CellContext = createContext<CellMode>(false);
|
|
50
|
-
|
|
51
|
-
/** The raw mode. Prefer `useBare` / `useOnTable` — they express the two real questions. */
|
|
52
|
-
export const useCellMode = () => useContext(CellContext);
|
|
53
|
-
/** True when the field renders without `FieldSection` chrome — `"table"` **or** `"bare"`. */
|
|
54
|
-
export const useBare = () => useContext(CellContext) !== false;
|
|
55
|
-
/** True only inside a `FormBuilder.Table` cell — drives the control's `onTable` border style. */
|
|
56
|
-
export const useOnTable = () => useContext(CellContext) === "table";
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* The "(Required)" tag `FieldShell` prints beside a `required` field's label.
|
|
60
|
-
*
|
|
61
|
-
* LOCAL PATCH (Contact Center): upstream hardcodes the English literal, so a
|
|
62
|
-
* localized app cannot translate it. Defaulting to that literal keeps every
|
|
63
|
-
* existing caller identical; provide the context once near the app root to
|
|
64
|
-
* localize every field at once. Logged in TORCH-GLARE-FEEDBACK.md — re-apply
|
|
65
|
-
* after any `npx torch-glare update`.
|
|
66
|
-
*/
|
|
67
|
-
export const RequiredLabelContext = createContext<string>("(Required)");
|
|
68
|
-
export const useRequiredLabel = () => useContext(RequiredLabelContext);
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Step registry — a `FormRenderer.Step` provides this so the fields rendered inside it can
|
|
72
|
-
* register their `name`, and the stepper validates just those names before advancing. `null`
|
|
73
|
-
* when not inside a stepper.
|
|
74
|
-
*
|
|
75
|
-
* The stepper itself lives in `FormRenderer` — it is chrome. This registry stays here because
|
|
76
|
-
* the *fields* are what register into it (see `fields/FieldShell.tsx`), and FormBuilder must
|
|
77
|
-
* stand alone without FormRenderer installed. FormRenderer's `StepSlot` imports it from here;
|
|
78
|
-
* the dependency never points the other way.
|
|
79
|
-
*/
|
|
80
|
-
export interface StepRegistry {
|
|
81
|
-
register: (name: string) => void;
|
|
82
|
-
unregister: (name: string) => void;
|
|
83
|
-
}
|
|
84
|
-
export const StepContext = createContext<StepRegistry | null>(null);
|
|
85
|
-
export const useStepRegistry = () => useContext(StepContext);
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import type { FieldKind } from "./types";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* The stamp that tells a consumer what a `FormBuilder.*` field produces.
|
|
6
|
-
*
|
|
7
|
-
* A form is normally read by the resolver and the submit handler, both of which know the shape
|
|
8
|
-
* they expect. Some consumers do not: `DataViews.Filters` is handed arbitrary fields as children
|
|
9
|
-
* and has to turn each one's value into a filter — a list, a numeric range, a date range — without
|
|
10
|
-
* being told which is which.
|
|
11
|
-
*
|
|
12
|
-
* The alternative is comparing `element.type` against an imported component, which breaks across
|
|
13
|
-
* duplicated module instances and silently stops matching after a hot reload. A property on the
|
|
14
|
-
* component survives both.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
const KEY = "__fieldKind";
|
|
18
|
-
|
|
19
|
-
export function markFieldKind<T>(component: T, kind: FieldKind): T {
|
|
20
|
-
(component as Record<string, unknown>)[KEY] = kind;
|
|
21
|
-
return component;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/** The kind stamped on an element's component, or `undefined` if it is not a marked field. */
|
|
25
|
-
export function fieldKindOf(node: React.ReactNode): FieldKind | undefined {
|
|
26
|
-
if (!React.isValidElement(node)) return undefined;
|
|
27
|
-
return (node.type as unknown as Record<string, unknown> | undefined)?.[KEY] as FieldKind | undefined;
|
|
28
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { LabeledCheckBox } from "../../LabeledCheckBox";
|
|
4
|
-
import { RadioGroup } from "../../Radio";
|
|
5
|
-
import { RadioCard } from "../../RadioCard";
|
|
6
|
-
import { useLoading } from "../context";
|
|
7
|
-
import type { CheckboxFieldProps, RadioCardsFieldProps } from "../types";
|
|
8
|
-
import { FieldShell } from "./FieldShell";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* `FormBuilder.Checkbox` — a single boolean checkbox. The field `label` sits in the
|
|
12
|
-
* normal label column; an optional `subLabel` renders inline beside the checkbox (via
|
|
13
|
-
* the clickable `LabeledCheckBox`).
|
|
14
|
-
*/
|
|
15
|
-
export function CheckboxField({ subLabel, ...props }: CheckboxFieldProps) {
|
|
16
|
-
const loading = useLoading();
|
|
17
|
-
return (
|
|
18
|
-
<FieldShell {...props}>
|
|
19
|
-
{(field) => (
|
|
20
|
-
<div className="flex w-full items-center ps-2.5">
|
|
21
|
-
<LabeledCheckBox
|
|
22
|
-
id={props.name}
|
|
23
|
-
label={subLabel ?? ""}
|
|
24
|
-
checked={!!field.value}
|
|
25
|
-
size="S"
|
|
26
|
-
onCheckedChange={(checked) => field.onChange(checked === true)}
|
|
27
|
-
disabled={props.disabled || loading}
|
|
28
|
-
/>
|
|
29
|
-
</div>
|
|
30
|
-
)}
|
|
31
|
-
</FieldShell>
|
|
32
|
-
);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/** `FormBuilder.RadioCards` — radio options rendered as cards (Glare `RadioCard`). */
|
|
36
|
-
export function RadioCardsField(props: RadioCardsFieldProps) {
|
|
37
|
-
const loading = useLoading();
|
|
38
|
-
return (
|
|
39
|
-
<FieldShell {...props}>
|
|
40
|
-
{(field) => (
|
|
41
|
-
<RadioGroup
|
|
42
|
-
value={field.value ?? ""}
|
|
43
|
-
onValueChange={field.onChange}
|
|
44
|
-
className="grid w-full grid-cols-2 gap-3"
|
|
45
|
-
>
|
|
46
|
-
{props.options.map((opt) => (
|
|
47
|
-
<RadioCard
|
|
48
|
-
key={opt.value}
|
|
49
|
-
id={`${props.name}-${opt.value}`}
|
|
50
|
-
value={opt.value}
|
|
51
|
-
headerLabel={opt.label}
|
|
52
|
-
description={opt.description}
|
|
53
|
-
disabled={opt.disabled || props.disabled || loading}
|
|
54
|
-
/>
|
|
55
|
-
))}
|
|
56
|
-
</RadioGroup>
|
|
57
|
-
)}
|
|
58
|
-
</FieldShell>
|
|
59
|
-
);
|
|
60
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { InputField } from "../../InputField";
|
|
4
|
-
import { ColorPicker, CHECKERBOARD } from "../../ColorPicker";
|
|
5
|
-
import { useLoading } from "../context";
|
|
6
|
-
import type { ColorFieldProps } from "../types";
|
|
7
|
-
import { FieldShell } from "./FieldShell";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* `FormBuilder.Color` — an `InputField` holding the hex text, with a trailing action button that
|
|
11
|
-
* carries the colour itself. That button is the `ColorPicker` trigger: clicking it opens the full
|
|
12
|
-
* palette. Value is a hex string.
|
|
13
|
-
*/
|
|
14
|
-
export function ColorField(props: ColorFieldProps) {
|
|
15
|
-
const loading = useLoading();
|
|
16
|
-
|
|
17
|
-
return (
|
|
18
|
-
<FieldShell {...props}>
|
|
19
|
-
{(field) => {
|
|
20
|
-
const value = typeof field.value === "string" ? field.value : "";
|
|
21
|
-
const disabled = props.disabled || loading;
|
|
22
|
-
return (
|
|
23
|
-
// The InputField IS the trigger: ColorPicker detects it as an input (it takes a `value`)
|
|
24
|
-
// and feeds it the hex, so clicking the field opens the palette.
|
|
25
|
-
<ColorPicker
|
|
26
|
-
value={value || undefined}
|
|
27
|
-
onChange={field.onChange}
|
|
28
|
-
presets={props.presets}
|
|
29
|
-
alpha={props.alpha ?? true}
|
|
30
|
-
disabled={disabled}
|
|
31
|
-
>
|
|
32
|
-
<InputField
|
|
33
|
-
// Explicit — otherwise Radix's trigger `type="button"` would land on the input.
|
|
34
|
-
type="text"
|
|
35
|
-
value={value}
|
|
36
|
-
onChange={(e) => field.onChange(e.target.value)}
|
|
37
|
-
placeholder={props.placeholder ?? "#000000"}
|
|
38
|
-
disabled={disabled}
|
|
39
|
-
className="w-full"
|
|
40
|
-
// The trailing action button holds the colour itself.
|
|
41
|
-
childrenSide={
|
|
42
|
-
<span
|
|
43
|
-
aria-hidden
|
|
44
|
-
className="block h-[26px] w-[26px] shrink-0 overflow-hidden rounded-[6px] border border-border-presentation-action-primary"
|
|
45
|
-
style={CHECKERBOARD}
|
|
46
|
-
>
|
|
47
|
-
<span
|
|
48
|
-
className="block h-full w-full"
|
|
49
|
-
style={{ backgroundColor: value || "#000000" }}
|
|
50
|
-
/>
|
|
51
|
-
</span>
|
|
52
|
-
}
|
|
53
|
-
/>
|
|
54
|
-
</ColorPicker>
|
|
55
|
-
);
|
|
56
|
-
}}
|
|
57
|
-
</FieldShell>
|
|
58
|
-
);
|
|
59
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import type { CustomFieldProps } from "../types";
|
|
4
|
-
import { FieldShell } from "./FieldShell";
|
|
5
|
-
|
|
6
|
-
/** `FormBuilder.Custom` — render any control, keeping the FieldSection + validation wiring. */
|
|
7
|
-
export function CustomField(props: CustomFieldProps) {
|
|
8
|
-
return (
|
|
9
|
-
<FieldShell {...props}>{(field, fieldState) => props.render({ field, fieldState })}</FieldShell>
|
|
10
|
-
);
|
|
11
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { DatePicker } from "../../DatePicker";
|
|
4
|
-
import { useOnTable } from "../context";
|
|
5
|
-
import type { DateFieldProps } from "../types";
|
|
6
|
-
import { FieldShell } from "./FieldShell";
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* `FormBuilder.Date` (single) — and, via `mode`/`timePicker`, the presets
|
|
10
|
-
* `.DateRange` (value `{from,to}`), `.DateMultiple` (value `Date[]`), and
|
|
11
|
-
* `.DateTime` (date + time). All back onto the one Glare `DatePicker`.
|
|
12
|
-
*/
|
|
13
|
-
export function DateField(props: DateFieldProps) {
|
|
14
|
-
const onTable = useOnTable();
|
|
15
|
-
|
|
16
|
-
return (
|
|
17
|
-
<FieldShell {...props}>
|
|
18
|
-
{(field) => (
|
|
19
|
-
<DatePicker
|
|
20
|
-
mode={props.mode ?? "single"}
|
|
21
|
-
timePicker={props.timePicker}
|
|
22
|
-
dateFormat={props.dateFormat}
|
|
23
|
-
value={field.value}
|
|
24
|
-
onTable={onTable}
|
|
25
|
-
onChange={(e) =>
|
|
26
|
-
field.onChange((e as unknown as { target: { value: unknown } }).target.value)
|
|
27
|
-
}
|
|
28
|
-
/>
|
|
29
|
-
)}
|
|
30
|
-
</FieldShell>
|
|
31
|
-
);
|
|
32
|
-
}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useFormContext, useFieldArray, type FieldValues, type ArrayPath } from "react-hook-form";
|
|
4
|
-
|
|
5
|
-
import { Button } from "../../Button";
|
|
6
|
-
import { Card } from "../../Card";
|
|
7
|
-
import type { FieldArrayProps } from "../types";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* `FormBuilder.FieldArray` — a repeating list of sub-fields (RHF `useFieldArray`).
|
|
11
|
-
* `children` renders one row's fields; name them `${rowName}.field`.
|
|
12
|
-
*/
|
|
13
|
-
export function FieldArray(props: FieldArrayProps) {
|
|
14
|
-
const form = useFormContext<FieldValues>();
|
|
15
|
-
const { fields, append, remove } = useFieldArray({
|
|
16
|
-
control: form.control,
|
|
17
|
-
name: props.name as ArrayPath<FieldValues>,
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
if (props.hidden) return null;
|
|
21
|
-
|
|
22
|
-
const addButton = (
|
|
23
|
-
<Button
|
|
24
|
-
type="button"
|
|
25
|
-
size="S"
|
|
26
|
-
variant="BorderStyle"
|
|
27
|
-
onClick={() => append((props.defaultItem ?? {}) as never)}
|
|
28
|
-
>
|
|
29
|
-
<i className="ri-add-line" />
|
|
30
|
-
{props.addLabel ?? "Add"}
|
|
31
|
-
</Button>
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
return (
|
|
35
|
-
<section className="grid w-full max-w-[1200px] gap-3 px-[12px] py-[16px]">
|
|
36
|
-
<div className="flex items-center justify-between">
|
|
37
|
-
{props.label ? (
|
|
38
|
-
<span className="typography-body-medium-medium text-content-presentation-global-primary">
|
|
39
|
-
{props.label}
|
|
40
|
-
</span>
|
|
41
|
-
) : (
|
|
42
|
-
<span />
|
|
43
|
-
)}
|
|
44
|
-
{addButton}
|
|
45
|
-
</div>
|
|
46
|
-
{props.description && (
|
|
47
|
-
<p className="typography-body-small-regular text-content-presentation-global-secondary">
|
|
48
|
-
{props.description}
|
|
49
|
-
</p>
|
|
50
|
-
)}
|
|
51
|
-
|
|
52
|
-
<div className="flex flex-col gap-3">
|
|
53
|
-
{fields.map((f, index) => (
|
|
54
|
-
<Card key={f.id} className="relative gap-3 pr-8">
|
|
55
|
-
<button
|
|
56
|
-
type="button"
|
|
57
|
-
aria-label="Remove"
|
|
58
|
-
onClick={() => remove(index)}
|
|
59
|
-
className="absolute right-2 top-2 inline-flex h-[22px] w-[22px] items-center justify-center rounded-full text-content-presentation-state-negative transition-colors hover:bg-background-presentation-action-hover"
|
|
60
|
-
>
|
|
61
|
-
<i className="ri-close-line text-[16px]" />
|
|
62
|
-
</button>
|
|
63
|
-
{props.children(`${props.name}.${index}`, index, () => remove(index))}
|
|
64
|
-
</Card>
|
|
65
|
-
))}
|
|
66
|
-
{fields.length === 0 && (
|
|
67
|
-
<p className="typography-body-small-regular text-content-presentation-global-secondary">
|
|
68
|
-
No items yet.
|
|
69
|
-
</p>
|
|
70
|
-
)}
|
|
71
|
-
</div>
|
|
72
|
-
</section>
|
|
73
|
-
);
|
|
74
|
-
}
|