@oneplatformdev/ui 0.1.99-beta.302 → 0.1.99-beta.304
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/.storybook/Wrappers.js.map +1 -1
- package/Accordion/Accordion.js.map +1 -1
- package/Alert/Alert.js.map +1 -1
- package/Alert/alertVariants.js.map +1 -1
- package/AlertDialog/AlertDialog.js.map +1 -1
- package/AlertDialog/AlertDialog.stories.js +4 -2
- package/AlertDialog/AlertDialog.stories.js.map +1 -1
- package/AlertDialog/AlertDialogRoot.js +20 -18
- package/AlertDialog/AlertDialogRoot.js.map +1 -1
- package/AreaChart/AreaChart.js.map +1 -1
- package/Aside/Aside.js.map +1 -1
- package/Aside/AsideSidebar.js.map +1 -1
- package/AspectRatio/AspectRatio.js.map +1 -1
- package/Avatar/Avatar.js.map +1 -1
- package/Badge/Badge.js.map +1 -1
- package/Badge/badgeVariants.js.map +1 -1
- package/Breadcrumb/Breadcrumb.js.map +1 -1
- package/Button/Button.js +11 -10
- package/Button/Button.js.map +1 -1
- package/Button/Button.stories.js.map +1 -1
- package/Button/Button.utils.js.map +1 -1
- package/Button/ButtonCounterBadge.js.map +1 -1
- package/Button/buttonVariants.js.map +1 -1
- package/ButtonIcon/ButtonIcon.js +22 -19
- package/ButtonIcon/ButtonIcon.js.map +1 -1
- package/ButtonIcon/ButtonIcon.stories.js.map +1 -1
- package/ButtonIcon/buttonIconVariants.js.map +1 -1
- package/CHANGELOG.md +3487 -3487
- package/Calendar/Calendar.js +6 -4
- package/Calendar/Calendar.js.map +1 -1
- package/Card/Card.js.map +1 -1
- package/Carousel/Carousel.js +7 -6
- package/Carousel/Carousel.js.map +1 -1
- package/Chart/Chart.js.map +1 -1
- package/Checkbox/Checkbox.js +1 -0
- package/Checkbox/Checkbox.js.map +1 -1
- package/Checkbox/Checkbox.stories.js.map +1 -1
- package/Collapsible/Collapsible.js.map +1 -1
- package/Combobox/Combobox.js +10 -10
- package/Combobox/Combobox.js.map +1 -1
- package/Combobox/Combobox.stories.js.map +1 -1
- package/Combobox/Combobox.types.js.map +1 -1
- package/Combobox/ComboboxOptionItem.js +19 -18
- package/Combobox/ComboboxOptionItem.js.map +1 -1
- package/Combobox/ComboboxRenderContent.d.ts.map +1 -1
- package/Combobox/ComboboxRenderContent.js +47 -43
- package/Combobox/ComboboxRenderContent.js.map +1 -1
- package/Combobox/ComboboxRenderOptions.js +5 -5
- package/Combobox/ComboboxRenderOptions.js.map +1 -1
- package/Combobox/ComboboxRenderTrigger.js +20 -18
- package/Combobox/ComboboxRenderTrigger.js.map +1 -1
- package/Command/Command.js +22 -21
- package/Command/Command.js.map +1 -1
- package/ContextPopover/ContextDropdownMenu.js.map +1 -1
- package/ContextPopover/ContextPopover.js.map +1 -1
- package/ContextPopover/useContextPopoverHandler.js.map +1 -1
- package/DataTable/DataTable.js +26 -24
- package/DataTable/DataTable.js.map +1 -1
- package/DataTable/DataTableColumnFilter.js +7 -6
- package/DataTable/DataTableColumnFilter.js.map +1 -1
- package/DataTable/useDataTable.js.map +1 -1
- package/DatePicker/DatePicker.js +2 -1
- package/DatePicker/DatePicker.js.map +1 -1
- package/Dialog/Dialog.js +21 -20
- package/Dialog/Dialog.js.map +1 -1
- package/Dialog/Dialog.stories.js +15 -14
- package/Dialog/Dialog.stories.js.map +1 -1
- package/Dialog/DialogOverlayScope.js.map +1 -1
- package/Dialog/useDialogClosePosition.js.map +1 -1
- package/Drawer/Drawer.js.map +1 -1
- package/DropdownMenu/DropdownMenu.js.map +1 -1
- package/Dropzone/Dropzone.js +81 -80
- package/Dropzone/Dropzone.js.map +1 -1
- package/Dropzone/Dropzone.stories.js.map +1 -1
- package/Dropzone/Dropzone.types.js.map +1 -1
- package/Dropzone/DropzoneCoverPreview.js.map +1 -1
- package/Dropzone/DropzoneFilePreview.js.map +1 -1
- package/Dropzone/DropzoneSinglePickPreview.js +3 -2
- package/Dropzone/DropzoneSinglePickPreview.js.map +1 -1
- package/Dropzone/DropzoneUtils.js.map +1 -1
- package/Form/Form.js +15 -14
- package/Form/Form.js.map +1 -1
- package/Form/FormRenderControl.js +7 -6
- package/Form/FormRenderControl.js.map +1 -1
- package/Form/Form_old.js +5 -4
- package/Form/Form_old.js.map +1 -1
- package/FormCheckbox/FormCheckbox.js +4 -4
- package/FormCheckbox/FormCheckbox.js.map +1 -1
- package/FormCombobox/FormCombobox.js +4 -4
- package/FormCombobox/FormCombobox.js.map +1 -1
- package/FormCombobox/FormCombobox.stories.js +19 -17
- package/FormCombobox/FormCombobox.stories.js.map +1 -1
- package/FormDatePicker/FormDatePicker.js +4 -4
- package/FormDatePicker/FormDatePicker.js.map +1 -1
- package/FormDropzone/FormDropzone.js +3 -3
- package/FormDropzone/FormDropzone.js.map +1 -1
- package/FormInput/FormInput.js +6 -6
- package/FormInput/FormInput.js.map +1 -1
- package/FormInput/FormInput.stories.js +13 -12
- package/FormInput/FormInput.stories.js.map +1 -1
- package/FormRadio/FormRadio.js.map +1 -1
- package/FormSelect/FormSelect.js +15 -12
- package/FormSelect/FormSelect.js.map +1 -1
- package/FormTextarea/FormTextarea.js +4 -4
- package/FormTextarea/FormTextarea.js.map +1 -1
- package/Header/Header.js.map +1 -1
- package/HoverCard/HoverCard.js.map +1 -1
- package/InfoBlock/InfoBlock.js.map +1 -1
- package/InfoBlock/InfoBlock.stories.js.map +1 -1
- package/InfoBlock/infoBlockVariants.js.map +1 -1
- package/Input/Input.js.map +1 -1
- package/Input/Input.stories.js.map +1 -1
- package/Input/inputVariants.js.map +1 -1
- package/InputOTP/InputOTP.d.ts.map +1 -1
- package/InputOTP/InputOTP.js.map +1 -1
- package/LICENSE +21 -21
- package/Label/Label.js.map +1 -1
- package/Label/labelVariants.js.map +1 -1
- package/LazyLoader/LazyLoader.js +5 -4
- package/LazyLoader/LazyLoader.js.map +1 -1
- package/LoadedIcon/LoadedIcon.js.map +1 -1
- package/LoadingMask/LoadingMask.js.map +1 -1
- package/LoadingMask/RenderLoadingMask.js.map +1 -1
- package/LoadingProgress/LoadingProgress.js.map +1 -1
- package/LoadingProgress/loadingProgressVariants.js.map +1 -1
- package/Menubar/Menubar.js.map +1 -1
- package/NavigationMenu/NavigationMenu.js.map +1 -1
- package/NavigationMenu/navigationMenuVariants.js.map +1 -1
- package/Pagination/Pagination.js +1 -0
- package/Pagination/Pagination.js.map +1 -1
- package/Popover/Popover.js.map +1 -1
- package/Progress/Progress.js.map +1 -1
- package/README.md +7 -7
- package/Radio/Radio.js.map +1 -1
- package/RadioGroup/RadioGroup.js.map +1 -1
- package/Resizable/Resizable.js.map +1 -1
- package/Resizable/Resizable.stories.js.map +1 -1
- package/ScrollArea/ScrollArea.js.map +1 -1
- package/Search/Search.js +9 -9
- package/Search/Search.js.map +1 -1
- package/Search/Search.stories.js.map +1 -1
- package/Select/Select.js +7 -6
- package/Select/Select.js.map +1 -1
- package/Select/Select.stories.js.map +1 -1
- package/Select/SelectRoot.js.map +1 -1
- package/Separator/Separator.js.map +1 -1
- package/Sheet/Sheet.js.map +1 -1
- package/Sidebar/Sidebar.js +21 -20
- package/Sidebar/Sidebar.js.map +1 -1
- package/Skeleton/Skeleton.js.map +1 -1
- package/Slider/Slider.js.map +1 -1
- package/Sonner/Sonner.js.map +1 -1
- package/Switch/Switch.js.map +1 -1
- package/Switch/Switch.stories.js.map +1 -1
- package/Table/Table.js.map +1 -1
- package/TablePagination/TablePagination.js +26 -21
- package/TablePagination/TablePagination.js.map +1 -1
- package/Tabs/Tabs.js.map +1 -1
- package/Tabs/TabsRoot.js.map +1 -1
- package/Textarea/Textarea.js.map +1 -1
- package/Textarea/Textarea.stories.js.map +1 -1
- package/Textarea/useAutosizeTextArea.js.map +1 -1
- package/Theme/ThemeModeToggle.js +4 -3
- package/Theme/ThemeModeToggle.js.map +1 -1
- package/Theme/ThemeProvider.js.map +1 -1
- package/Toast/Toast.js.map +1 -1
- package/Toast/toast.constants.js.map +1 -1
- package/Toast/toastVariants.js.map +1 -1
- package/Toast/useToast.js.map +1 -1
- package/Toaster/Toaster.js.map +1 -1
- package/Toggle/Toggle.js.map +1 -1
- package/ToggleGroup/ToggleGroup.js.map +1 -1
- package/Tooltip/Tooltip.js.map +1 -1
- package/Tooltip/TooltipRoot.js.map +1 -1
- package/Tooltip/tooltipVariants.js.map +1 -1
- package/index.js +289 -289
- package/package.json +4 -4
- package/vite-env.d.ts +7 -7
package/Form/Form_old.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Form_old.js","sources":["../../src/Form/Form_old.tsx"],"sourcesContent":["'use client';\
|
|
1
|
+
{"version":3,"file":"Form_old.js","sources":["../../src/Form/Form_old.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport * as LabelPrimitive from '@radix-ui/react-label';\nimport { Slot } from '@radix-ui/react-slot';\nimport {\n Controller,\n ControllerProps,\n FieldPath,\n FieldValues,\n FormProvider,\n useFormContext,\n} from 'react-hook-form';\n\nimport { cn } from '@oneplatformdev/utils';\nimport { Label } from '../Label';\n\nconst Form = FormProvider;\n\ntype FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\n> = {\n name: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>(\n {} as FormFieldContextValue\n)\n\nconst FormField = <\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\n>({\n ...props\n}: ControllerProps<TFieldValues, TName>) => {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n )\n}\n\nconst useFormField = () => {\n const fieldContext = React.useContext(FormFieldContext)\n const itemContext = React.useContext(FormItemContext)\n const { getFieldState, formState } = useFormContext()\n\n const fieldState = getFieldState(fieldContext.name, formState)\n\n if (!fieldContext) {\n throw new Error(\"useFormField should be used within <FormField>\")\n }\n\n const { id } = itemContext\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n }\n}\n\ntype FormItemContextValue = {\n id: string\n}\n\nconst FormItemContext = React.createContext<FormItemContextValue>(\n {} as FormItemContextValue\n)\n\nconst FormItem = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const id = React.useId()\n\n return (\n <FormItemContext.Provider value={{ id }}>\n <div ref={ref} className={cn(\"space-y-1\", className)} {...props} />\n </FormItemContext.Provider>\n )\n})\nFormItem.displayName = \"FormItem\"\n\nconst FormLabel = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(({ className, ...props }, ref) => {\n const { error, formItemId } = useFormField()\n\n return (\n <Label\n ref={ref}\n data-state={error ? \"invalid\" : \"valid\"}\n className={cn(error && \"text-destructive\", className)}\n htmlFor={formItemId}\n {...props}\n />\n )\n})\nFormLabel.displayName = \"FormLabel\"\n\nconst FormControl = React.forwardRef<\n React.ElementRef<typeof Slot>,\n React.ComponentPropsWithoutRef<typeof Slot>\n>(({ className, ...props }, ref) => {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n\n return (\n <Slot\n ref={ref}\n id={formItemId}\n data-state={error ? \"invalid\" : \"valid\"}\n aria-describedby={\n !error\n ? `${formDescriptionId}`\n : `${formDescriptionId} ${formMessageId}`\n }\n aria-invalid={!!error}\n className={cn('group/form-control', className)}\n {...props}\n />\n )\n})\nFormControl.displayName = \"FormControl\"\n\nconst FormDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => {\n const { formDescriptionId } = useFormField()\n\n return (\n <p\n ref={ref}\n id={formDescriptionId}\n className={cn(\"text-[0.8rem] text-muted-foreground\", className)}\n {...props}\n />\n )\n})\nFormDescription.displayName = \"FormDescription\"\n\nconst FormMessage = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, children, ...props }, ref) => {\n const { error, formMessageId } = useFormField()\n const body = error ? String(error?.message) : children\n\n if (!body) {\n return null\n }\n\n return (\n <p\n ref={ref}\n id={formMessageId}\n className={cn(\"text-[0.8rem] font-medium text-destructive\", className)}\n {...props}\n >\n {body}\n </p>\n )\n})\nFormMessage.displayName = \"FormMessage\"\n\nexport {\n useFormField,\n Form,\n FormItem,\n FormLabel,\n FormControl,\n FormDescription,\n FormMessage,\n FormField,\n}\n"],"names":["Form","FormProvider","FormFieldContext","React","FormField","props","jsx","Controller","useFormField","fieldContext","itemContext","FormItemContext","getFieldState","formState","useFormContext","fieldState","id","FormItem","className","ref","cn","FormLabel","error","formItemId","Label","FormControl","formDescriptionId","formMessageId","Slot","FormDescription","FormMessage","children","body"],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { jsx as e } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { FormControl as a } from "../Form/Form.js";
|
|
3
|
+
import { FormRenderControl as l } from "../Form/FormRenderControl.js";
|
|
4
4
|
import { CheckboxLabel as k } from "../Checkbox/Checkbox.js";
|
|
5
5
|
const f = (m) => {
|
|
6
6
|
const { form: t, label: c, name: h, onCheckedChange: C, ...r } = m;
|
|
7
7
|
return /* @__PURE__ */ e(
|
|
8
|
-
|
|
8
|
+
l,
|
|
9
9
|
{
|
|
10
10
|
form: t,
|
|
11
11
|
name: h,
|
|
12
|
-
render: ({ field: o }) => /* @__PURE__ */ e(
|
|
12
|
+
render: ({ field: o }) => /* @__PURE__ */ e(a, { children: /* @__PURE__ */ e(
|
|
13
13
|
k,
|
|
14
14
|
{
|
|
15
15
|
...o,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormCheckbox.js","sources":["../../src/FormCheckbox/FormCheckbox.tsx"],"sourcesContent":["import { FieldValues } from 'react-hook-form';\
|
|
1
|
+
{"version":3,"file":"FormCheckbox.js","sources":["../../src/FormCheckbox/FormCheckbox.tsx"],"sourcesContent":["import { FieldValues } from 'react-hook-form';\n\nimport { FormControl, FormRenderControl } from '../Form';\n\nimport { FormCheckboxProps } from './FormCheckbox.types';\nimport { CheckboxLabel } from '../Checkbox';\n\n// TODO: move to @oneplatformdev/ui/FormCheckbox\nexport const FormCheckbox = <Data extends FieldValues>(\n\tprops: FormCheckboxProps<Data>\n) => {\n\tconst { form, label, name, onCheckedChange, ...rest } = props;\n\treturn (\n\t\t<FormRenderControl\n\t\t\tform={form}\n\t\t\tname={name}\n\t\t\trender={({ field }) => (\n\t\t\t\t<FormControl>\n\t\t\t\t\t<CheckboxLabel\n\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t{...rest}\n\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\tchecked={field.value || false}\n\t\t\t\t\t\tonCheckedChange={(v) => {\n\t\t\t\t\t\t\tfield.onChange(v);\n\t\t\t\t\t\t\tonCheckedChange?.(v);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</FormControl>\n\t\t\t)}\n\t\t\t{...rest}\n\t\t/>\n\t);\n};\n"],"names":["FormCheckbox","props","form","label","name","onCheckedChange","rest","jsx","FormRenderControl","field","FormControl","CheckboxLabel","v"],"mappings":";;;;AAQO,MAAMA,IAAe,CAC3BC,MACI;AACJ,QAAM,EAAE,MAAAC,GAAM,OAAAC,GAAO,MAAAC,GAAM,iBAAAC,GAAiB,GAAGC,MAASL;AACxD,SACC,gBAAAM;AAAA,IAACC;AAAA,IAAA;AAAA,MACA,MAAAN;AAAA,MACA,MAAAE;AAAA,MACA,QAAQ,CAAC,EAAE,OAAAK,EAAA,wBACTC,GAAA,EACA,UAAA,gBAAAH;AAAA,QAACI;AAAA,QAAA;AAAA,UACC,GAAGF;AAAA,UACH,GAAGH;AAAA,UACJ,OAAAH;AAAA,UACA,SAASM,EAAM,SAAS;AAAA,UACxB,iBAAiB,CAACG,MAAM;AACvB,YAAAH,EAAM,SAASG,CAAC,GAChBP,IAAkBO,CAAC;AAAA,UACpB;AAAA,QAAA;AAAA,MAAA,GAEF;AAAA,MAEA,GAAGN;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { jsx as r } from "react/jsx-runtime";
|
|
2
|
+
import { FormControl as s } from "../Form/Form.js";
|
|
3
|
+
import { FormRenderControl as b } from "../Form/FormRenderControl.js";
|
|
2
4
|
import { Combobox as m } from "../Combobox/Combobox.js";
|
|
3
|
-
import { FormRenderControl as s } from "../Form/FormRenderControl.js";
|
|
4
|
-
import { FormControl as b } from "../Form/Form.js";
|
|
5
5
|
function x(t) {
|
|
6
6
|
const { form: i, label: p, tooltip: l, tooltipProps: C, name: a, imperativeRef: n, ...e } = t, g = t.type ?? "single";
|
|
7
7
|
return /* @__PURE__ */ r(
|
|
8
|
-
|
|
8
|
+
b,
|
|
9
9
|
{
|
|
10
10
|
form: i,
|
|
11
11
|
label: p,
|
|
12
12
|
tooltip: l,
|
|
13
13
|
tooltipProps: C,
|
|
14
14
|
name: a,
|
|
15
|
-
render: ({ field: o }) => /* @__PURE__ */ r(
|
|
15
|
+
render: ({ field: o }) => /* @__PURE__ */ r(s, { children: g === "multi" ? /* @__PURE__ */ r(
|
|
16
16
|
m,
|
|
17
17
|
{
|
|
18
18
|
...e,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormCombobox.js","sources":["../../src/FormCombobox/FormCombobox.tsx"],"sourcesContent":["import { FormControl, FormRenderControl } from '../Form';\
|
|
1
|
+
{"version":3,"file":"FormCombobox.js","sources":["../../src/FormCombobox/FormCombobox.tsx"],"sourcesContent":["import { FormControl, FormRenderControl } from '../Form';\nimport { Combobox, ComboboxSelectedType } from '../Combobox';\nimport {\n FormComboboxMultiProps, FormComboboxProps,\n FormComboboxSingleProps\n} from './FormCombobox.types';\nimport { FieldValues } from 'react-hook-form';\nimport { JSX } from \"react\";\n\ntype RestOmitedType<T> = Omit<T, 'form' | 'label' | 'tooltip' | 'tooltipProps' | 'name'>;\n\ntype RestPropsType<\n T extends ComboboxSelectedType,\n Data extends FieldValues,\n Node extends object = object,\n> = T extends 'single'\n ? RestOmitedType<FormComboboxSingleProps<Data, Node>>\n : RestOmitedType<FormComboboxMultiProps<Data, Node>>\n\nexport function FormCombobox<\n Data extends FieldValues,\n Node extends object = object\n>(props: FormComboboxSingleProps<Data, Node>): JSX.Element;\nexport function FormCombobox<\n Data extends FieldValues,\n Node extends object = object\n>(props: FormComboboxMultiProps<Data, Node>): JSX.Element;\n\nexport function FormCombobox<\n Data extends object = object,\n Node extends object = object\n>(\n props: FormComboboxProps<Data, Node>\n): JSX.Element {\n const { form, label, tooltip, tooltipProps, name, imperativeRef, ...rest } = props;\n const type = (props.type ?? 'single') as 'single' | 'multi';\n return (\n <FormRenderControl\n form={form}\n label={label}\n tooltip={tooltip}\n tooltipProps={tooltipProps}\n name={name}\n render={({ field }) => (\n <FormControl>\n {type === 'multi' ? (\n <Combobox<Node>\n {...(rest as RestPropsType<'multi', Data, Node>)}\n {...field}\n type=\"multi\"\n imperativeRef={imperativeRef}\n onChange={field.onChange}\n />\n ) : (\n <Combobox<Node>\n {...(rest as RestPropsType<'single', Data, Node>)}\n {...field}\n type=\"single\"\n imperativeRef={imperativeRef}\n onChange={field.onChange}\n />\n )}\n </FormControl>\n )}\n />\n );\n};\n"],"names":["FormCombobox","props","form","label","tooltip","tooltipProps","name","imperativeRef","rest","type","jsx","FormRenderControl","field","FormControl","Combobox"],"mappings":";;;;AA4BO,SAASA,EAIdC,GACa;AACb,QAAM,EAAE,MAAAC,GAAM,OAAAC,GAAO,SAAAC,GAAS,cAAAC,GAAc,MAAAC,GAAM,eAAAC,GAAe,GAAGC,EAAA,IAASP,GACvEQ,IAAQR,EAAM,QAAQ;AAC5B,SACE,gBAAAS;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAAT;AAAA,MACA,OAAAC;AAAA,MACA,SAAAC;AAAA,MACA,cAAAC;AAAA,MACA,MAAAC;AAAA,MACA,QAAQ,CAAC,EAAE,OAAAM,EAAA,MACT,gBAAAF,EAACG,GAAA,EACE,gBAAS,UACR,gBAAAH;AAAA,QAACI;AAAA,QAAA;AAAA,UACE,GAAIN;AAAA,UACJ,GAAGI;AAAA,UACJ,MAAK;AAAA,UACL,eAAAL;AAAA,UACA,UAAUK,EAAM;AAAA,QAAA;AAAA,MAAA,IAGlB,gBAAAF;AAAA,QAACI;AAAA,QAAA;AAAA,UACE,GAAIN;AAAA,UACJ,GAAGI;AAAA,UACJ,MAAK;AAAA,UACL,eAAAL;AAAA,UACA,UAAUK,EAAM;AAAA,QAAA;AAAA,MAAA,EAClB,CAEJ;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import { jsx as l, jsxs as
|
|
2
|
-
import { useForm as i, FormProvider as
|
|
3
|
-
import { FormCombobox as
|
|
1
|
+
import { jsx as l, jsxs as a } from "react/jsx-runtime";
|
|
2
|
+
import { useForm as i, FormProvider as m } from "react-hook-form";
|
|
3
|
+
import { FormCombobox as n } from "./FormCombobox.js";
|
|
4
4
|
import { FormInput as s } from "../FormInput/FormInput.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
5
|
+
import { FormTextarea as c } from "../FormTextarea/FormTextarea.js";
|
|
6
|
+
import { FormSelect as d } from "../FormSelect/FormSelect.js";
|
|
7
|
+
import { Button as u } from "../Button/Button.js";
|
|
8
|
+
import "../Button/buttonVariants.js";
|
|
9
|
+
import "react";
|
|
10
|
+
const p = (e) => new Promise((r) => setTimeout(r, e)), o = [
|
|
9
11
|
{ value: "ua", label: "Ukraine" },
|
|
10
12
|
{ value: "pl", label: "Poland" },
|
|
11
13
|
{ value: "de", label: "Germany" },
|
|
@@ -15,12 +17,12 @@ const p = (e) => new Promise((r) => setTimeout(r, e)), a = [
|
|
|
15
17
|
], b = async ({ search: e }) => {
|
|
16
18
|
await p(200);
|
|
17
19
|
const r = (e ?? "").trim().toLowerCase();
|
|
18
|
-
return r ?
|
|
20
|
+
return r ? o.filter((t) => String(t.label).toLowerCase().includes(r)) : o;
|
|
19
21
|
}, f = [
|
|
20
22
|
{ value: "admin", label: "Адміністратор" },
|
|
21
23
|
{ value: "manager", label: "Менеджер" },
|
|
22
24
|
{ value: "user", label: "Користувач" }
|
|
23
|
-
],
|
|
25
|
+
], C = {
|
|
24
26
|
title: "Forms/HybridValidation",
|
|
25
27
|
parameters: {
|
|
26
28
|
layout: "centered"
|
|
@@ -41,7 +43,7 @@ function h() {
|
|
|
41
43
|
resolver: y,
|
|
42
44
|
defaultValues: { fullName: "", role: "", country: "", description: "" }
|
|
43
45
|
}), { isValid: r, isSubmitting: t } = e.formState;
|
|
44
|
-
return /* @__PURE__ */ l(
|
|
46
|
+
return /* @__PURE__ */ l(m, { ...e, children: /* @__PURE__ */ a(
|
|
45
47
|
"form",
|
|
46
48
|
{
|
|
47
49
|
className: "space-y-4",
|
|
@@ -59,7 +61,7 @@ function h() {
|
|
|
59
61
|
}
|
|
60
62
|
),
|
|
61
63
|
/* @__PURE__ */ l(
|
|
62
|
-
|
|
64
|
+
d,
|
|
63
65
|
{
|
|
64
66
|
form: e,
|
|
65
67
|
name: "role",
|
|
@@ -69,7 +71,7 @@ function h() {
|
|
|
69
71
|
}
|
|
70
72
|
),
|
|
71
73
|
/* @__PURE__ */ l(
|
|
72
|
-
|
|
74
|
+
n,
|
|
73
75
|
{
|
|
74
76
|
form: e,
|
|
75
77
|
name: "country",
|
|
@@ -81,7 +83,7 @@ function h() {
|
|
|
81
83
|
}
|
|
82
84
|
),
|
|
83
85
|
/* @__PURE__ */ l(
|
|
84
|
-
|
|
86
|
+
c,
|
|
85
87
|
{
|
|
86
88
|
form: e,
|
|
87
89
|
name: "description",
|
|
@@ -89,16 +91,16 @@ function h() {
|
|
|
89
91
|
placeholder: "Мінімум 10 символів"
|
|
90
92
|
}
|
|
91
93
|
),
|
|
92
|
-
/* @__PURE__ */ l(
|
|
94
|
+
/* @__PURE__ */ l(u, { type: "submit", disabled: !r || t, className: "w-full", children: "Зберегти" })
|
|
93
95
|
]
|
|
94
96
|
}
|
|
95
97
|
) });
|
|
96
98
|
}
|
|
97
|
-
const
|
|
99
|
+
const O = {
|
|
98
100
|
render: () => /* @__PURE__ */ l(h, {})
|
|
99
101
|
};
|
|
100
102
|
export {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
+
O as AllFields,
|
|
104
|
+
C as default
|
|
103
105
|
};
|
|
104
106
|
//# sourceMappingURL=FormCombobox.stories.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormCombobox.stories.js","sources":["../../src/FormCombobox/FormCombobox.stories.tsx"],"sourcesContent":["import React from 'react';\nimport type { Meta, StoryObj } from '@storybook/react';\nimport { FormProvider, useForm } from 'react-hook-form';\n\nimport { FormCombobox } from './FormCombobox';\nimport { FormInput } from '../FormInput';\nimport { FormTextarea } from '../FormTextarea';\nimport { FormSelect } from '../FormSelect';\nimport { Button } from '../Button';\nimport { ComboboxOption, ComboboxProps } from '../Combobox';\n\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nconst COUNTRIES: ComboboxOption[] = [\n { value: 'ua', label: 'Ukraine' },\n { value: 'pl', label: 'Poland' },\n { value: 'de', label: 'Germany' },\n { value: 'fr', label: 'France' },\n { value: 'es', label: 'Spain' },\n { value: 'it', label: 'Italy' },\n];\n\nconst loadCountries: ComboboxProps['loadData'] = async ({ search }) => {\n await sleep(200);\n const q = (search ?? '').trim().toLowerCase();\n if (!q) return COUNTRIES;\n return COUNTRIES.filter((o) => String(o.label).toLowerCase().includes(q));\n};\n\nconst ROLE_OPTIONS = [\n { value: 'admin', label: 'Адміністратор' },\n { value: 'manager', label: 'Менеджер' },\n { value: 'user', label: 'Користувач' },\n];\n\nconst meta = {\n title: 'Forms/HybridValidation',\n parameters: {\n layout: 'centered',\n },\n decorators: [\n (Story) => (\n <div className=\"p-6 w-[420px]\">\n <Story />\n </div>\n ),\n ],\n} satisfies Meta;\n\nexport default meta;\n\ntype Story = StoryObj<typeof meta>;\n\n// Гібридна модель валідації (feat/1856 + feat/3677):\n// - mode: \"onTouched\" — помилка зʼявляється після blur поля\n// - для Combobox: blur спрацьовує на закриття дропдауна (відкрив → закрив без вибору → помилка)\n// - помилка зникає миттєво при виправленні (on change), щойно значення валідне\n// - кнопка submit disabled, поки форма невалідна\ntype FormValues = {\n fullName: string;\n role: string;\n country: string;\n description: string;\n};\n\nconst resolver = (values: FormValues) => {\n const errors: Record<string, { type: string; message: string }> = {};\n\n if (!values.fullName?.trim()) {\n errors.fullName = { type: 'required', message: 'Обовʼязкове поле' };\n }\n if (!values.role) {\n errors.role = { type: 'required', message: 'Оберіть роль' };\n }\n if (!values.country) {\n errors.country = { type: 'required', message: 'Оберіть країну' };\n }\n if (!values.description?.trim()) {\n errors.description = { type: 'required', message: 'Обовʼязкове поле' };\n } else if (values.description.trim().length < 10) {\n errors.description = { type: 'minLength', message: 'Мінімум 10 символів' };\n }\n\n return {\n values: Object.keys(errors).length ? {} : values,\n errors,\n };\n};\n\nfunction HybridForm() {\n const form = useForm<FormValues>({\n mode: 'onTouched',\n resolver,\n defaultValues: { fullName: '', role: '', country: '', description: '' },\n });\n\n const { isValid, isSubmitting } = form.formState;\n\n return (\n <FormProvider {...form}>\n <form\n className=\"space-y-4\"\n onSubmit={form.handleSubmit(() => {\n alert('Форму надіслано ✅');\n })}\n >\n <FormInput<FormValues>\n form={form}\n name=\"fullName\"\n label=\"Імʼя\"\n placeholder=\"Іван Петренко\"\n />\n\n <FormSelect<FormValues, unknown>\n form={form}\n name=\"role\"\n label=\"Роль\"\n placeholder=\"Оберіть роль\"\n options={ROLE_OPTIONS}\n />\n\n <FormCombobox<FormValues>\n form={form}\n name=\"country\"\n label=\"Країна\"\n placeholder=\"Оберіть країну\"\n searchLabel=\"Пошук...\"\n emptyLabel=\"Нічого не знайдено\"\n loadData={loadCountries}\n />\n\n <FormTextarea<FormValues>\n form={form}\n name=\"description\"\n label=\"Опис\"\n placeholder=\"Мінімум 10 символів\"\n />\n\n <Button type=\"submit\" disabled={!isValid || isSubmitting} className=\"w-full\">\n Зберегти\n </Button>\n </form>\n </FormProvider>\n );\n}\n\nexport const AllFields: Story = {\n render: () => <HybridForm />,\n};\n"],"names":["sleep","ms","COUNTRIES","loadCountries","search","q","o","ROLE_OPTIONS","meta","Story","jsx","resolver","values","errors","HybridForm","form","useForm","isValid","isSubmitting","FormProvider","jsxs","FormInput","FormSelect","FormCombobox","FormTextarea","Button","AllFields"],"mappings":"
|
|
1
|
+
{"version":3,"file":"FormCombobox.stories.js","sources":["../../src/FormCombobox/FormCombobox.stories.tsx"],"sourcesContent":["import React from 'react';\nimport type { Meta, StoryObj } from '@storybook/react';\nimport { FormProvider, useForm } from 'react-hook-form';\n\nimport { FormCombobox } from './FormCombobox';\nimport { FormInput } from '../FormInput';\nimport { FormTextarea } from '../FormTextarea';\nimport { FormSelect } from '../FormSelect';\nimport { Button } from '../Button';\nimport { ComboboxOption, ComboboxProps } from '../Combobox';\n\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nconst COUNTRIES: ComboboxOption[] = [\n { value: 'ua', label: 'Ukraine' },\n { value: 'pl', label: 'Poland' },\n { value: 'de', label: 'Germany' },\n { value: 'fr', label: 'France' },\n { value: 'es', label: 'Spain' },\n { value: 'it', label: 'Italy' },\n];\n\nconst loadCountries: ComboboxProps['loadData'] = async ({ search }) => {\n await sleep(200);\n const q = (search ?? '').trim().toLowerCase();\n if (!q) return COUNTRIES;\n return COUNTRIES.filter((o) => String(o.label).toLowerCase().includes(q));\n};\n\nconst ROLE_OPTIONS = [\n { value: 'admin', label: 'Адміністратор' },\n { value: 'manager', label: 'Менеджер' },\n { value: 'user', label: 'Користувач' },\n];\n\nconst meta = {\n title: 'Forms/HybridValidation',\n parameters: {\n layout: 'centered',\n },\n decorators: [\n (Story) => (\n <div className=\"p-6 w-[420px]\">\n <Story />\n </div>\n ),\n ],\n} satisfies Meta;\n\nexport default meta;\n\ntype Story = StoryObj<typeof meta>;\n\n// Гібридна модель валідації (feat/1856 + feat/3677):\n// - mode: \"onTouched\" — помилка зʼявляється після blur поля\n// - для Combobox: blur спрацьовує на закриття дропдауна (відкрив → закрив без вибору → помилка)\n// - помилка зникає миттєво при виправленні (on change), щойно значення валідне\n// - кнопка submit disabled, поки форма невалідна\ntype FormValues = {\n fullName: string;\n role: string;\n country: string;\n description: string;\n};\n\nconst resolver = (values: FormValues) => {\n const errors: Record<string, { type: string; message: string }> = {};\n\n if (!values.fullName?.trim()) {\n errors.fullName = { type: 'required', message: 'Обовʼязкове поле' };\n }\n if (!values.role) {\n errors.role = { type: 'required', message: 'Оберіть роль' };\n }\n if (!values.country) {\n errors.country = { type: 'required', message: 'Оберіть країну' };\n }\n if (!values.description?.trim()) {\n errors.description = { type: 'required', message: 'Обовʼязкове поле' };\n } else if (values.description.trim().length < 10) {\n errors.description = { type: 'minLength', message: 'Мінімум 10 символів' };\n }\n\n return {\n values: Object.keys(errors).length ? {} : values,\n errors,\n };\n};\n\nfunction HybridForm() {\n const form = useForm<FormValues>({\n mode: 'onTouched',\n resolver,\n defaultValues: { fullName: '', role: '', country: '', description: '' },\n });\n\n const { isValid, isSubmitting } = form.formState;\n\n return (\n <FormProvider {...form}>\n <form\n className=\"space-y-4\"\n onSubmit={form.handleSubmit(() => {\n alert('Форму надіслано ✅');\n })}\n >\n <FormInput<FormValues>\n form={form}\n name=\"fullName\"\n label=\"Імʼя\"\n placeholder=\"Іван Петренко\"\n />\n\n <FormSelect<FormValues, unknown>\n form={form}\n name=\"role\"\n label=\"Роль\"\n placeholder=\"Оберіть роль\"\n options={ROLE_OPTIONS}\n />\n\n <FormCombobox<FormValues>\n form={form}\n name=\"country\"\n label=\"Країна\"\n placeholder=\"Оберіть країну\"\n searchLabel=\"Пошук...\"\n emptyLabel=\"Нічого не знайдено\"\n loadData={loadCountries}\n />\n\n <FormTextarea<FormValues>\n form={form}\n name=\"description\"\n label=\"Опис\"\n placeholder=\"Мінімум 10 символів\"\n />\n\n <Button type=\"submit\" disabled={!isValid || isSubmitting} className=\"w-full\">\n Зберегти\n </Button>\n </form>\n </FormProvider>\n );\n}\n\nexport const AllFields: Story = {\n render: () => <HybridForm />,\n};\n"],"names":["sleep","ms","COUNTRIES","loadCountries","search","q","o","ROLE_OPTIONS","meta","Story","jsx","resolver","values","errors","HybridForm","form","useForm","isValid","isSubmitting","FormProvider","jsxs","FormInput","FormSelect","FormCombobox","FormTextarea","Button","AllFields"],"mappings":"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"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { jsx as r } from "react/jsx-runtime";
|
|
2
2
|
import { DatePicker as s } from "../DatePicker/DatePicker.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { FormControl as C } from "../Form/Form.js";
|
|
4
|
+
import { FormRenderControl as D } from "../Form/FormRenderControl.js";
|
|
5
5
|
const P = (t) => {
|
|
6
6
|
const { form: n, name: m, tooltip: a, tooltipProps: p, label: i, onDateChange: l, ...c } = t;
|
|
7
7
|
return /* @__PURE__ */ r(
|
|
8
|
-
|
|
8
|
+
D,
|
|
9
9
|
{
|
|
10
10
|
form: n,
|
|
11
11
|
name: m,
|
|
12
12
|
tooltip: a,
|
|
13
13
|
tooltipProps: p,
|
|
14
14
|
label: i,
|
|
15
|
-
render: ({ field: o }) => /* @__PURE__ */ r(
|
|
15
|
+
render: ({ field: o }) => /* @__PURE__ */ r(C, { children: /* @__PURE__ */ r(
|
|
16
16
|
s,
|
|
17
17
|
{
|
|
18
18
|
...o,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormDatePicker.js","sources":["../../src/FormDatePicker/FormDatePicker.tsx"],"sourcesContent":["'use client';\
|
|
1
|
+
{"version":3,"file":"FormDatePicker.js","sources":["../../src/FormDatePicker/FormDatePicker.tsx"],"sourcesContent":["'use client';\n\nimport { DatePicker } from '../DatePicker';\nimport { FormControl, FormRenderControl } from '../Form';\nimport { FieldValues } from 'react-hook-form';\nimport { FormDatePickerProps } from './FormDatePicker.types';\n\n// TODO: add description\nexport const FormDatePicker = <Data extends FieldValues>(\n props: FormDatePickerProps<Data>\n) => {\n const { form, name, tooltip, tooltipProps, label, onDateChange, ...rest } = props;\n return (\n <FormRenderControl\n form={form}\n name={name}\n tooltip={tooltip}\n tooltipProps={tooltipProps}\n label={label}\n render={({ field }) => (\n <FormControl>\n <DatePicker\n { ...field }\n { ...rest }\n selectedDate={field.value}\n onDateChange={(date: Date | undefined) => {\n field.onChange(date);\n onDateChange?.(date);\n }}\n />\n </FormControl>\n )}\n />\n );\n};\n"],"names":["FormDatePicker","props","form","name","tooltip","tooltipProps","label","onDateChange","rest","jsx","FormRenderControl","field","FormControl","DatePicker","date"],"mappings":";;;;AAQO,MAAMA,IAAiB,CAC5BC,MACG;AACH,QAAM,EAAE,MAAAC,GAAM,MAAAC,GAAM,SAAAC,GAAS,cAAAC,GAAc,OAAAC,GAAO,cAAAC,GAAc,GAAGC,EAAA,IAASP;AAC5E,SACE,gBAAAQ;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAAR;AAAA,MACA,MAAAC;AAAA,MACA,SAAAC;AAAA,MACA,cAAAC;AAAA,MACA,OAAAC;AAAA,MACA,QAAQ,CAAC,EAAE,OAAAK,EAAA,wBACRC,GAAA,EACC,UAAA,gBAAAH;AAAA,QAACI;AAAA,QAAA;AAAA,UACG,GAAGF;AAAA,UACH,GAAGH;AAAA,UACL,cAAcG,EAAM;AAAA,UACpB,cAAc,CAACG,MAA2B;AACxC,YAAAH,EAAM,SAASG,CAAI,GACnBP,IAAeO,CAAI;AAAA,UACrB;AAAA,QAAA;AAAA,MAAA,EACF,CACF;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as o } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { FormControl as a } from "../Form/Form.js";
|
|
3
3
|
import { FormRenderControl as s } from "../Form/FormRenderControl.js";
|
|
4
|
-
import {
|
|
4
|
+
import { Dropzone as f } from "../Dropzone/Dropzone.js";
|
|
5
5
|
const d = (n) => {
|
|
6
6
|
const { form: t, label: e, tooltip: m, tooltipProps: p, name: l, ...i } = n;
|
|
7
7
|
return /* @__PURE__ */ o(
|
|
@@ -12,7 +12,7 @@ const d = (n) => {
|
|
|
12
12
|
tooltip: m,
|
|
13
13
|
tooltipProps: p,
|
|
14
14
|
name: l,
|
|
15
|
-
render: ({ field: r }) => /* @__PURE__ */ o(
|
|
15
|
+
render: ({ field: r }) => /* @__PURE__ */ o(a, { children: /* @__PURE__ */ o(f, { ...i, ...r, onChangeValue: r.onChange }) })
|
|
16
16
|
}
|
|
17
17
|
);
|
|
18
18
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormDropzone.js","sources":["../../src/FormDropzone/FormDropzone.tsx"],"sourcesContent":["import { FormControl, FormRenderControl } from '../Form';\
|
|
1
|
+
{"version":3,"file":"FormDropzone.js","sources":["../../src/FormDropzone/FormDropzone.tsx"],"sourcesContent":["import { FormControl, FormRenderControl } from '../Form';\nimport { Dropzone } from '../Dropzone';\nimport { FieldValues } from 'react-hook-form';\nimport { FormDropzoneProps } from './FormDropzone.types';\n\nexport const FormDropzone = <Data extends FieldValues>(\n props: FormDropzoneProps<Data>\n) => {\n const { form, label, tooltip, tooltipProps, name, ...rest } = props;\n\n return (\n <FormRenderControl\n form={form}\n label={label}\n tooltip={tooltip}\n tooltipProps={tooltipProps}\n name={name}\n render={({ field }) => (\n <FormControl>\n <Dropzone {...rest} {...field} onChangeValue={field.onChange} />\n </FormControl>\n )}\n />\n );\n};\n"],"names":["FormDropzone","props","form","label","tooltip","tooltipProps","name","rest","jsx","FormRenderControl","field","FormControl","Dropzone"],"mappings":";;;;AAKO,MAAMA,IAAe,CAC1BC,MACG;AACH,QAAM,EAAE,MAAAC,GAAM,OAAAC,GAAO,SAAAC,GAAS,cAAAC,GAAc,MAAAC,GAAM,GAAGC,MAASN;AAE9D,SACE,gBAAAO;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAAP;AAAA,MACA,OAAAC;AAAA,MACA,SAAAC;AAAA,MACA,cAAAC;AAAA,MACA,MAAAC;AAAA,MACA,QAAQ,CAAC,EAAE,OAAAI,EAAA,wBACRC,GAAA,EACC,UAAA,gBAAAH,EAACI,GAAA,EAAU,GAAGL,GAAO,GAAGG,GAAO,eAAeA,EAAM,UAAU,EAAA,CAChE;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
package/FormInput/FormInput.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsx as m } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { FormControl as S } from "../Form/Form.js";
|
|
3
3
|
import { FormRenderControl as V } from "../Form/FormRenderControl.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { Input as j } from "../Input/Input.js";
|
|
5
|
+
import { forwardRef as q } from "react";
|
|
6
6
|
function w(D, o) {
|
|
7
7
|
const { form: a, tooltip: x, tooltipProps: P, label: b, name: u, maxLength: s, counter: y, onChange: C, onBlur: F, onPaste: A, style: I, onPastePrepare: p, ...B } = D;
|
|
8
8
|
return /* @__PURE__ */ m(
|
|
@@ -13,8 +13,8 @@ function w(D, o) {
|
|
|
13
13
|
tooltip: x,
|
|
14
14
|
tooltipProps: P,
|
|
15
15
|
label: b,
|
|
16
|
-
render: ({ field: n, fieldState: R }) => /* @__PURE__ */ m(
|
|
17
|
-
|
|
16
|
+
render: ({ field: n, fieldState: R }) => /* @__PURE__ */ m(S, { children: /* @__PURE__ */ m(
|
|
17
|
+
j,
|
|
18
18
|
{
|
|
19
19
|
...n,
|
|
20
20
|
...B,
|
|
@@ -62,7 +62,7 @@ function w(D, o) {
|
|
|
62
62
|
}
|
|
63
63
|
);
|
|
64
64
|
}
|
|
65
|
-
const G =
|
|
65
|
+
const G = q(w);
|
|
66
66
|
export {
|
|
67
67
|
G as FormInput
|
|
68
68
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormInput.js","sources":["../../src/FormInput/FormInput.tsx"],"sourcesContent":["import { FormControl, FormRenderControl } from '../Form';\
|
|
1
|
+
{"version":3,"file":"FormInput.js","sources":["../../src/FormInput/FormInput.tsx"],"sourcesContent":["import { FormControl, FormRenderControl } from '../Form';\nimport { Input } from '../Input';\nimport { FormInputProps } from './FormInput.types';\nimport { FieldValues, Path, PathValue } from 'react-hook-form';\nimport { forwardRef, ReactElement, Ref, RefObject } from 'react';\n\n// TODO: add description\n// export const FormInput = <Data extends FieldValues>(\n// props: FormInputProps<Data> & { inputRef?: Ref<HTMLInputElement> }\n// ) => {\n// const { inputRef, form, label, name, onChange, onBlur, style, ...rest } =\n// props;\n// return (\n// <FormRenderControl\n// form={form}\n// name={name}\n// label={label}\n// render={({ field }) => (\n// <FormControl>\n// <Input\n// {...field}\n// {...rest}\n// ref={(el) => {\n// field.ref(el);\n// if (typeof inputRef === 'function') {\n// inputRef(el);\n// } else if (inputRef) {\n// (inputRef as RefObject<HTMLInputElement | null>).current = el;\n// }\n// }}\n// style={style}\n// value={field.value || ''}\n// onChange={(...rest) => {\n// field.onChange?.(...rest);\n// onChange?.(...rest);\n// }}\n// onBlur={(...rest) => {\n// field.onBlur?.();\n// onBlur?.(...rest);\n// }}\n// />\n// </FormControl>\n// )}\n// />\n// );\n// };\n\nfunction FormInputInner<Data extends FieldValues>(\n props: FormInputProps<Data>,\n ref: Ref<HTMLInputElement>\n) {\n const { form, tooltip, tooltipProps, label, name, maxLength, counter, onChange, onBlur, onPaste, style, onPastePrepare, ...rest } = props;\n return (\n <FormRenderControl\n form={form}\n name={name}\n tooltip={tooltip}\n tooltipProps={tooltipProps}\n label={label}\n render={({ field, fieldState }) => (\n <FormControl>\n <Input\n {...field}\n {...rest}\n counter={!!fieldState.error ? false : counter}\n maxLength={maxLength}\n ref={(el) => {\n field.ref(el);\n if (typeof ref === 'function') {\n ref(el);\n } else if (ref) {\n (ref as RefObject<HTMLInputElement | null>).current = el;\n }\n }}\n style={style}\n value={field.value || ''}\n onChange={(...rest) => {\n field.onChange?.(...rest);\n onChange?.(...rest);\n }}\n onPaste={(e) => {\n const pasted = e.clipboardData.getData('text');\n const input = e.currentTarget;\n\n const start = input.selectionStart ?? input.value.length;\n const end = input.selectionEnd ?? input.value.length;\n\n const current = input.value;\n\n let next = current.slice(0, start) + pasted + current.slice(end);\n\n if (onPastePrepare) {\n next = onPastePrepare(next, e);\n }\n\n if (typeof maxLength !== 'number') {\n e.preventDefault();\n\n form.setValue(name, next as PathValue<Data, Path<Data>>, {\n shouldDirty: true,\n shouldTouch: true,\n });\n\n return;\n }\n\n const before = current.slice(0, start);\n const after = current.slice(end);\n\n const available = maxLength - (before.length + after.length);\n\n if (available <= 0) {\n e.preventDefault();\n return;\n }\n\n const limitedPaste = pasted.slice(0, available);\n const limitedNext = before + limitedPaste + after;\n\n e.preventDefault();\n\n form.setValue(name, limitedNext as PathValue<Data, Path<Data>>, {\n shouldDirty: true,\n shouldTouch: true,\n });\n\n requestAnimationFrame(() => {\n input.setSelectionRange(\n before.length + limitedPaste.length,\n before.length + limitedPaste.length\n );\n });\n }}\n onBlur={(...rest) => {\n field.onBlur?.();\n onBlur?.(...rest);\n }}\n />\n </FormControl>\n )}\n />\n );\n}\n\nexport const FormInput = forwardRef(FormInputInner) as <Data extends FieldValues>(\n props: FormInputProps<Data> & { ref?: Ref<HTMLInputElement> }\n) => ReactElement;\n"],"names":["FormInputInner","props","ref","form","tooltip","tooltipProps","label","name","maxLength","counter","onChange","onBlur","onPaste","style","onPastePrepare","rest","jsx","FormRenderControl","field","fieldState","FormControl","Input","el","e","pasted","input","start","end","current","next","before","after","available","limitedPaste","limitedNext","FormInput","forwardRef"],"mappings":";;;;;AA+CA,SAASA,EACPC,GACAC,GACA;AACA,QAAM,EAAE,MAAAC,GAAM,SAAAC,GAAS,cAAAC,GAAc,OAAAC,GAAO,MAAAC,GAAM,WAAAC,GAAW,SAAAC,GAAS,UAAAC,GAAU,QAAAC,GAAQ,SAAAC,GAAS,OAAAC,GAAO,gBAAAC,GAAgB,GAAGC,MAASd;AACpI,SACE,gBAAAe;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAAd;AAAA,MACA,MAAAI;AAAA,MACA,SAAAH;AAAA,MACA,cAAAC;AAAA,MACA,OAAAC;AAAA,MACA,QAAQ,CAAC,EAAE,OAAAY,GAAO,YAAAC,EAAA,wBACfC,GAAA,EACC,UAAA,gBAAAJ;AAAA,QAACK;AAAA,QAAA;AAAA,UACE,GAAGH;AAAA,UACH,GAAGH;AAAA,UACJ,SAAWI,EAAW,QAAQ,KAAQV;AAAA,UACtC,WAAAD;AAAA,UACA,KAAK,CAACc,MAAO;AACX,YAAAJ,EAAM,IAAII,CAAE,GACR,OAAOpB,KAAQ,aACjBA,EAAIoB,CAAE,IACGpB,MACRA,EAA2C,UAAUoB;AAAA,UAE1D;AAAA,UACA,OAAAT;AAAA,UACA,OAAOK,EAAM,SAAS;AAAA,UACtB,UAAU,IAAIH,MAAS;AACrB,YAAAG,EAAM,WAAW,GAAGH,CAAI,GACxBL,IAAW,GAAGK,CAAI;AAAA,UACpB;AAAA,UACA,SAAS,CAACQ,MAAM;AACd,kBAAMC,IAASD,EAAE,cAAc,QAAQ,MAAM,GACvCE,IAAQF,EAAE,eAEVG,IAAQD,EAAM,kBAAkBA,EAAM,MAAM,QAC5CE,IAAMF,EAAM,gBAAgBA,EAAM,MAAM,QAExCG,IAAUH,EAAM;AAEtB,gBAAII,IAAOD,EAAQ,MAAM,GAAGF,CAAK,IAAIF,IAASI,EAAQ,MAAMD,CAAG;AAM/D,gBAJIb,MACFe,IAAOf,EAAee,GAAMN,CAAC,IAG3B,OAAOf,KAAc,UAAU;AACjC,cAAAe,EAAE,eAAA,GAEFpB,EAAK,SAASI,GAAMsB,GAAqC;AAAA,gBACvD,aAAa;AAAA,gBACb,aAAa;AAAA,cAAA,CACd;AAED;AAAA,YACF;AAEA,kBAAMC,IAASF,EAAQ,MAAM,GAAGF,CAAK,GAC/BK,IAAQH,EAAQ,MAAMD,CAAG,GAEzBK,IAAYxB,KAAasB,EAAO,SAASC,EAAM;AAErD,gBAAIC,KAAa,GAAG;AAClB,cAAAT,EAAE,eAAA;AACF;AAAA,YACF;AAEA,kBAAMU,IAAeT,EAAO,MAAM,GAAGQ,CAAS,GACxCE,IAAcJ,IAASG,IAAeF;AAE5C,YAAAR,EAAE,eAAA,GAEFpB,EAAK,SAASI,GAAM2B,GAA4C;AAAA,cAC9D,aAAa;AAAA,cACb,aAAa;AAAA,YAAA,CACd,GAED,sBAAsB,MAAM;AAC1B,cAAAT,EAAM;AAAA,gBACJK,EAAO,SAASG,EAAa;AAAA,gBAC7BH,EAAO,SAASG,EAAa;AAAA,cAAA;AAAA,YAEjC,CAAC;AAAA,UACH;AAAA,UACA,QAAQ,IAAIlB,MAAS;AACnB,YAAAG,EAAM,SAAA,GACNP,IAAS,GAAGI,CAAI;AAAA,UAClB;AAAA,QAAA;AAAA,MAAA,EACF,CACF;AAAA,IAAA;AAAA,EAAA;AAIR;AAEO,MAAMoB,IAAYC,EAAWpC,CAAc;"}
|
|
@@ -4,7 +4,8 @@ import { useForm as n, FormProvider as m } from "react-hook-form";
|
|
|
4
4
|
import { FormInput as o } from "./FormInput.js";
|
|
5
5
|
import { FormTextarea as c } from "../FormTextarea/FormTextarea.js";
|
|
6
6
|
import { Button as d } from "../Button/Button.js";
|
|
7
|
-
|
|
7
|
+
import "../Button/buttonVariants.js";
|
|
8
|
+
function p({ initialValue: e = "", ...t }) {
|
|
8
9
|
const a = n({
|
|
9
10
|
defaultValues: {
|
|
10
11
|
name: e
|
|
@@ -32,7 +33,7 @@ function f({ initialValue: e = "", ...t }) {
|
|
|
32
33
|
] })
|
|
33
34
|
] }) });
|
|
34
35
|
}
|
|
35
|
-
const
|
|
36
|
+
const I = {
|
|
36
37
|
title: "FormInput",
|
|
37
38
|
component: o,
|
|
38
39
|
parameters: {
|
|
@@ -54,10 +55,10 @@ const w = {
|
|
|
54
55
|
decorators: [
|
|
55
56
|
(e) => /* @__PURE__ */ r("div", { className: "p-6 w-[420px]", children: /* @__PURE__ */ r(e, {}) })
|
|
56
57
|
]
|
|
57
|
-
},
|
|
58
|
-
render: (e) => /* @__PURE__ */ r(
|
|
58
|
+
}, V = {
|
|
59
|
+
render: (e) => /* @__PURE__ */ r(p, { ...e })
|
|
59
60
|
};
|
|
60
|
-
function
|
|
61
|
+
function f(e) {
|
|
61
62
|
const t = n({ defaultValues: { name: "" } });
|
|
62
63
|
return i(() => {
|
|
63
64
|
t.setError("name", { message: "Це поле обовʼязкове" });
|
|
@@ -71,8 +72,8 @@ function p(e) {
|
|
|
71
72
|
}
|
|
72
73
|
) }) });
|
|
73
74
|
}
|
|
74
|
-
const
|
|
75
|
-
render: (e) => /* @__PURE__ */ r(
|
|
75
|
+
const E = {
|
|
76
|
+
render: (e) => /* @__PURE__ */ r(f, { ...e })
|
|
76
77
|
}, u = (e) => {
|
|
77
78
|
const t = {};
|
|
78
79
|
return e.email?.trim() ? /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e.email.trim()) || (t.email = { type: "pattern", message: "Невірний формат пошти" }) : t.email = { type: "required", message: "Обовʼязкове поле" }, e.fullName?.trim() || (t.fullName = { type: "required", message: "Обовʼязкове поле" }), e.description?.trim() ? e.description.trim().length < 10 && (t.description = { type: "minLength", message: "Мінімум 10 символів" }) : t.description = { type: "required", message: "Обовʼязкове поле" }, {
|
|
@@ -126,13 +127,13 @@ function h() {
|
|
|
126
127
|
}
|
|
127
128
|
) });
|
|
128
129
|
}
|
|
129
|
-
const
|
|
130
|
+
const L = {
|
|
130
131
|
render: () => /* @__PURE__ */ r(h, {})
|
|
131
132
|
};
|
|
132
133
|
export {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
134
|
+
V as Default,
|
|
135
|
+
L as HybridValidation,
|
|
136
|
+
E as WithError,
|
|
137
|
+
I as default
|
|
137
138
|
};
|
|
138
139
|
//# sourceMappingURL=FormInput.stories.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormInput.stories.js","sources":["../../src/FormInput/FormInput.stories.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\
|
|
1
|
+
{"version":3,"file":"FormInput.stories.js","sources":["../../src/FormInput/FormInput.stories.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\nimport type { Meta, StoryObj } from '@storybook/react';\nimport { FormProvider, useForm } from 'react-hook-form';\n\nimport { FormInput } from './FormInput';\nimport { FormTextarea } from '../FormTextarea';\nimport { Button } from '../Button';\n\ntype FormValues = {\n name: string;\n};\n\ntype ControlledProps = Omit<\n React.ComponentProps<typeof FormInput<FormValues>>,\n 'form' | 'name'\n> & {\n initialValue?: string;\n};\n\nfunction ControlledFormInput({ initialValue = '', ...args }: ControlledProps) {\n const form = useForm<FormValues>({\n defaultValues: {\n name: initialValue,\n },\n });\n\n const value = form.watch('name');\n const tooltip = \"UX/UI принципи, композиція, типографіка, колір, дизайн-системи та робота з інтерфейсами\"\n return (\n <FormProvider {...form}>\n <div className=\"max-w-sm space-y-3\">\n <FormInput<FormValues>\n form={form}\n name=\"name\"\n counter\n maxLength={255}\n tooltip={tooltip}\n label={\"Label\"}\n />\n\n <div className=\"text-xs text-muted-foreground\">\n value: <span className=\"font-mono\">{value}</span>\n </div>\n\n <div className=\"text-xs text-muted-foreground\">\n length: <span className=\"font-mono\">\n {value?.length ?? 0}\n </span>\n </div>\n </div>\n </FormProvider>\n );\n}\n\nconst meta = {\n title: 'FormInput',\n component: FormInput,\n parameters: {\n layout: 'centered',\n },\n args: {\n label: 'Input label',\n placeholder: 'Type something...',\n disabled: false,\n },\n argTypes: {\n form: { control: false },\n name: { control: false },\n onChange: { control: false },\n onBlur: { control: false },\n onPaste: { control: false },\n onPastePrepare: { control: false },\n },\n decorators: [\n (Story) => (\n <div className=\"p-6 w-[420px]\">\n <Story />\n </div>\n ),\n ],\n} satisfies Meta<typeof FormInput>;\n\nexport default meta;\n\ntype Story = StoryObj<typeof meta>;\n\nexport const Default: Story = {\n render: (args) => <ControlledFormInput {...args} />,\n};\n\nfunction FormInputWithError(args: ControlledProps) {\n const form = useForm<FormValues>({ defaultValues: { name: '' } });\n\n useEffect(() => {\n form.setError('name', { message: 'Це поле обовʼязкове' });\n }, []);\n\n return (\n <FormProvider {...form}>\n <div className=\"max-w-sm\">\n <FormInput<FormValues>\n form={form}\n name=\"name\"\n label=\"Label\"\n {...args}\n />\n </div>\n </FormProvider>\n );\n}\n\nexport const WithError: Story = {\n render: (args) => <FormInputWithError {...args} />,\n};\n\n// Демонстрація гібридної моделі валідації (feat/1856):\n// - помилка з'являється на blur (mode: \"onTouched\")\n// - зникає миттєво при виправленні (on change), щойно значення стає валідним\n// - червона рамка + текст помилки під полем\n// - кнопка submit disabled, поки форма невалідна\ntype HybridValues = {\n email: string;\n fullName: string;\n description: string;\n};\n\nconst hybridResolver = (values: HybridValues) => {\n const errors: Record<string, { type: string; message: string }> = {};\n\n if (!values.email?.trim()) {\n errors.email = { type: 'required', message: \"Обовʼязкове поле\" };\n } else if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(values.email.trim())) {\n errors.email = { type: 'pattern', message: 'Невірний формат пошти' };\n }\n\n if (!values.fullName?.trim()) {\n errors.fullName = { type: 'required', message: \"Обовʼязкове поле\" };\n }\n\n if (!values.description?.trim()) {\n errors.description = { type: 'required', message: \"Обовʼязкове поле\" };\n } else if (values.description.trim().length < 10) {\n errors.description = { type: 'minLength', message: 'Мінімум 10 символів' };\n }\n\n return {\n values: Object.keys(errors).length ? {} : values,\n errors,\n };\n};\n\nfunction HybridValidationForm() {\n const form = useForm<HybridValues>({\n mode: 'onTouched',\n resolver: hybridResolver,\n defaultValues: { email: '', fullName: '', description: '' },\n });\n\n const { isValid, isSubmitting } = form.formState;\n\n return (\n <FormProvider {...form}>\n <form\n className=\"max-w-sm space-y-4\"\n onSubmit={form.handleSubmit(() => {\n alert('Форму надіслано ✅');\n })}\n >\n <FormInput<HybridValues>\n form={form}\n name=\"email\"\n label=\"Email\"\n placeholder=\"name@example.com\"\n />\n <FormInput<HybridValues>\n form={form}\n name=\"fullName\"\n label=\"Імʼя\"\n placeholder=\"Іван Петренко\"\n />\n <FormTextarea<HybridValues>\n form={form}\n name=\"description\"\n label=\"Опис\"\n placeholder=\"Мінімум 10 символів\"\n />\n <Button type=\"submit\" disabled={!isValid || isSubmitting} className=\"w-full\">\n Зберегти\n </Button>\n </form>\n </FormProvider>\n );\n}\n\nexport const HybridValidation: Story = {\n render: () => <HybridValidationForm />,\n};\n"],"names":["ControlledFormInput","initialValue","args","form","useForm","value","FormProvider","jsxs","jsx","FormInput","meta","Story","Default","FormInputWithError","useEffect","WithError","hybridResolver","values","errors","HybridValidationForm","isValid","isSubmitting","FormTextarea","Button","HybridValidation"],"mappings":";;;;;;;AAmBA,SAASA,EAAoB,EAAE,cAAAC,IAAe,IAAI,GAAGC,KAAyB;AAC5E,QAAMC,IAAOC,EAAoB;AAAA,IAC/B,eAAe;AAAA,MACb,MAAMH;AAAA,IAAA;AAAA,EACR,CACD,GAEKI,IAAQF,EAAK,MAAM,MAAM;AAE/B,2BACGG,GAAA,EAAc,GAAGH,GAChB,UAAA,gBAAAI,EAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,MAAAN;AAAA,QACA,MAAK;AAAA,QACL,SAAO;AAAA,QACP,WAAW;AAAA,QACX,SATQ;AAAA,QAUR,OAAO;AAAA,MAAA;AAAA,IAAA;AAAA,IAGT,gBAAAI,EAAC,OAAA,EAAI,WAAU,iCAAgC,UAAA;AAAA,MAAA;AAAA,MACtC,gBAAAC,EAAC,QAAA,EAAK,WAAU,aAAa,UAAAH,EAAA,CAAM;AAAA,IAAA,GAC5C;AAAA,IAEA,gBAAAE,EAAC,OAAA,EAAI,WAAU,iCAAgC,UAAA;AAAA,MAAA;AAAA,wBACpC,QAAA,EAAK,WAAU,aACrB,UAAAF,GAAO,UAAU,EAAA,CACpB;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;AAEA,MAAMK,IAAO;AAAA,EACX,OAAO;AAAA,EACP,WAAWD;AAAA,EACX,YAAY;AAAA,IACV,QAAQ;AAAA,EAAA;AAAA,EAEV,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,UAAU;AAAA,EAAA;AAAA,EAEZ,UAAU;AAAA,IACR,MAAM,EAAE,SAAS,GAAA;AAAA,IACjB,MAAM,EAAE,SAAS,GAAA;AAAA,IACjB,UAAU,EAAE,SAAS,GAAA;AAAA,IACrB,QAAQ,EAAE,SAAS,GAAA;AAAA,IACnB,SAAS,EAAE,SAAS,GAAA;AAAA,IACpB,gBAAgB,EAAE,SAAS,GAAA;AAAA,EAAM;AAAA,EAEnC,YAAY;AAAA,IACV,CAACE,MACC,gBAAAH,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA,gBAAAA,EAACG,KAAM,EAAA,CACT;AAAA,EAAA;AAGN,GAMaC,IAAiB;AAAA,EAC5B,QAAQ,CAACV,MAAS,gBAAAM,EAACR,GAAA,EAAqB,GAAGE,EAAA,CAAM;AACnD;AAEA,SAASW,EAAmBX,GAAuB;AACjD,QAAMC,IAAOC,EAAoB,EAAE,eAAe,EAAE,MAAM,GAAA,GAAM;AAEhE,SAAAU,EAAU,MAAM;AACd,IAAAX,EAAK,SAAS,QAAQ,EAAE,SAAS,uBAAuB;AAAA,EAC1D,GAAG,CAAA,CAAE,qBAGFG,GAAA,EAAc,GAAGH,GAChB,UAAA,gBAAAK,EAAC,OAAA,EAAI,WAAU,YACb,UAAA,gBAAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAAN;AAAA,MACA,MAAK;AAAA,MACL,OAAM;AAAA,MACL,GAAGD;AAAA,IAAA;AAAA,EAAA,GAER,EAAA,CACF;AAEJ;AAEO,MAAMa,IAAmB;AAAA,EAC9B,QAAQ,CAACb,MAAS,gBAAAM,EAACK,GAAA,EAAoB,GAAGX,EAAA,CAAM;AAClD,GAaMc,IAAiB,CAACC,MAAyB;AAC/C,QAAMC,IAA4D,CAAA;AAElE,SAAKD,EAAO,OAAO,SAEP,6BAA6B,KAAKA,EAAO,MAAM,KAAA,CAAM,MAC/DC,EAAO,QAAQ,EAAE,MAAM,WAAW,SAAS,wBAAA,KAF3CA,EAAO,QAAQ,EAAE,MAAM,YAAY,SAAS,mBAAA,GAKzCD,EAAO,UAAU,WACpBC,EAAO,WAAW,EAAE,MAAM,YAAY,SAAS,mBAAA,IAG5CD,EAAO,aAAa,SAEdA,EAAO,YAAY,KAAA,EAAO,SAAS,OAC5CC,EAAO,cAAc,EAAE,MAAM,aAAa,SAAS,sBAAA,KAFnDA,EAAO,cAAc,EAAE,MAAM,YAAY,SAAS,mBAAA,GAK7C;AAAA,IACL,QAAQ,OAAO,KAAKA,CAAM,EAAE,SAAS,CAAA,IAAKD;AAAA,IAC1C,QAAAC;AAAA,EAAA;AAEJ;AAEA,SAASC,IAAuB;AAC9B,QAAMhB,IAAOC,EAAsB;AAAA,IACjC,MAAM;AAAA,IACN,UAAUY;AAAA,IACV,eAAe,EAAE,OAAO,IAAI,UAAU,IAAI,aAAa,GAAA;AAAA,EAAG,CAC3D,GAEK,EAAE,SAAAI,GAAS,cAAAC,EAAA,IAAiBlB,EAAK;AAEvC,SACE,gBAAAK,EAACF,GAAA,EAAc,GAAGH,GAChB,UAAA,gBAAAI;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,UAAUJ,EAAK,aAAa,MAAM;AAChC,cAAM,mBAAmB;AAAA,MAC3B,CAAC;AAAA,MAED,UAAA;AAAA,QAAA,gBAAAK;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,MAAAN;AAAA,YACA,MAAK;AAAA,YACL,OAAM;AAAA,YACN,aAAY;AAAA,UAAA;AAAA,QAAA;AAAA,QAEd,gBAAAK;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,MAAAN;AAAA,YACA,MAAK;AAAA,YACL,OAAM;AAAA,YACN,aAAY;AAAA,UAAA;AAAA,QAAA;AAAA,QAEd,gBAAAK;AAAA,UAACc;AAAA,UAAA;AAAA,YACC,MAAAnB;AAAA,YACA,MAAK;AAAA,YACL,OAAM;AAAA,YACN,aAAY;AAAA,UAAA;AAAA,QAAA;AAAA,QAEd,gBAAAK,EAACe,GAAA,EAAO,MAAK,UAAS,UAAU,CAACH,KAAWC,GAAc,WAAU,UAAS,UAAA,WAAA,CAE7E;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;AAEO,MAAMG,IAA0B;AAAA,EACrC,QAAQ,MAAM,gBAAAhB,EAACW,GAAA,CAAA,CAAqB;AACtC;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormRadio.js","sources":["../../src/FormRadio/FormRadio.tsx"],"sourcesContent":["import { FieldValues } from 'react-hook-form';\
|
|
1
|
+
{"version":3,"file":"FormRadio.js","sources":["../../src/FormRadio/FormRadio.tsx"],"sourcesContent":["import { FieldValues } from 'react-hook-form';\n\nimport { FormControl, FormItem } from '../Form/Form';\nimport { FormRenderControl } from '../Form/FormRenderControl';\nimport { Radio } from '../Radio';\n\nimport type { FormRadioGroupProps } from './FormRadio.types.ts';\n\nexport const FormRadio = <Data extends FieldValues>(\n props: FormRadioGroupProps<Data>\n) => {\n const {\n form,\n name,\n label,\n onValueChange,\n value,\n defaultValue,\n renderOption,\n ...rest\n } = props;\n return (\n <FormRenderControl\n form={form}\n name={name}\n label={label}\n render={({ field }) => (\n <FormControl>\n <Radio\n {...field}\n {...rest}\n defaultValue={defaultValue || field.value}\n value={value || field.value}\n onValueChange={(value) => {\n field.onChange(value);\n onValueChange?.(value);\n }}\n renderOption={(option, DefaultOptionComponent) => {\n return (\n <FormItem key={option.value}>\n <FormControl>\n {renderOption?.(option, DefaultOptionComponent) || (\n <DefaultOptionComponent {...option} />\n )}\n </FormControl>\n </FormItem>\n );\n }}\n />\n </FormControl>\n )}\n />\n );\n};\n"],"names":["FormRadio","props","form","name","label","onValueChange","value","defaultValue","renderOption","rest","jsx","FormRenderControl","field","FormControl","Radio","option","DefaultOptionComponent","FormItem"],"mappings":";;;;AAQO,MAAMA,IAAY,CACvBC,MACG;AACH,QAAM;AAAA,IACJ,MAAAC;AAAA,IACA,MAAAC;AAAA,IACA,OAAAC;AAAA,IACA,eAAAC;AAAA,IACA,OAAAC;AAAA,IACA,cAAAC;AAAA,IACA,cAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,IACDR;AACJ,SACE,gBAAAS;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAAT;AAAA,MACA,MAAAC;AAAA,MACA,OAAAC;AAAA,MACA,QAAQ,CAAC,EAAE,OAAAQ,EAAA,wBACRC,GAAA,EACC,UAAA,gBAAAH;AAAA,QAACI;AAAA,QAAA;AAAA,UACE,GAAGF;AAAA,UACH,GAAGH;AAAA,UACJ,cAAcF,KAAgBK,EAAM;AAAA,UACpC,OAAON,KAASM,EAAM;AAAA,UACtB,eAAe,CAACN,MAAU;AACxB,YAAAM,EAAM,SAASN,CAAK,GACpBD,IAAgBC,CAAK;AAAA,UACvB;AAAA,UACA,cAAc,CAACS,GAAQC,MAEnB,gBAAAN,EAACO,GAAA,EACC,UAAA,gBAAAP,EAACG,GAAA,EACE,cAAeE,GAAQC,CAAsB,KAC5C,gBAAAN,EAACM,KAAwB,GAAGD,EAAA,CAAQ,GAExC,EAAA,GALaA,EAAO,KAMtB;AAAA,QAEJ;AAAA,MAAA,EACF,CACF;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
package/FormSelect/FormSelect.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { jsx as n } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { FormControl as B } from "../Form/Form.js";
|
|
3
3
|
import { FormRenderControl as F } from "../Form/FormRenderControl.js";
|
|
4
|
-
import
|
|
5
|
-
|
|
4
|
+
import "@radix-ui/react-select";
|
|
5
|
+
import "lucide-react";
|
|
6
|
+
import "@oneplatformdev/utils";
|
|
7
|
+
import { Select as P } from "../Select/Select.js";
|
|
8
|
+
const V = (m) => {
|
|
6
9
|
const {
|
|
7
|
-
value:
|
|
8
|
-
form:
|
|
9
|
-
label:
|
|
10
|
+
value: i = void 0,
|
|
11
|
+
form: p,
|
|
12
|
+
label: l,
|
|
10
13
|
tooltip: a,
|
|
11
14
|
tooltipProps: g,
|
|
12
15
|
name: s,
|
|
@@ -21,16 +24,16 @@ const b = (m) => {
|
|
|
21
24
|
return /* @__PURE__ */ n(
|
|
22
25
|
F,
|
|
23
26
|
{
|
|
24
|
-
form:
|
|
27
|
+
form: p,
|
|
25
28
|
name: s,
|
|
26
29
|
tooltip: a,
|
|
27
30
|
tooltipProps: g,
|
|
28
|
-
label:
|
|
31
|
+
label: l,
|
|
29
32
|
containerProps: h,
|
|
30
33
|
render: ({ field: e }) => /* @__PURE__ */ n(
|
|
31
|
-
|
|
34
|
+
P,
|
|
32
35
|
{
|
|
33
|
-
value: e.value ?? (
|
|
36
|
+
value: e.value ?? (i || ""),
|
|
34
37
|
options: c,
|
|
35
38
|
onBlur: () => {
|
|
36
39
|
e.onBlur(), d?.();
|
|
@@ -39,7 +42,7 @@ const b = (m) => {
|
|
|
39
42
|
const o = t ? t(r) : r;
|
|
40
43
|
e.onChange(o), u?.(r, o);
|
|
41
44
|
},
|
|
42
|
-
renderTrigger: (r, o) => /* @__PURE__ */ n(
|
|
45
|
+
renderTrigger: (r, o) => /* @__PURE__ */ n(B, { children: C?.(r, o) || o }),
|
|
43
46
|
...x
|
|
44
47
|
}
|
|
45
48
|
)
|
|
@@ -47,6 +50,6 @@ const b = (m) => {
|
|
|
47
50
|
);
|
|
48
51
|
};
|
|
49
52
|
export {
|
|
50
|
-
|
|
53
|
+
V as FormSelect
|
|
51
54
|
};
|
|
52
55
|
//# sourceMappingURL=FormSelect.js.map
|