@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.
Files changed (178) hide show
  1. package/.storybook/Wrappers.js.map +1 -1
  2. package/Accordion/Accordion.js.map +1 -1
  3. package/Alert/Alert.js.map +1 -1
  4. package/Alert/alertVariants.js.map +1 -1
  5. package/AlertDialog/AlertDialog.js.map +1 -1
  6. package/AlertDialog/AlertDialog.stories.js +4 -2
  7. package/AlertDialog/AlertDialog.stories.js.map +1 -1
  8. package/AlertDialog/AlertDialogRoot.js +20 -18
  9. package/AlertDialog/AlertDialogRoot.js.map +1 -1
  10. package/AreaChart/AreaChart.js.map +1 -1
  11. package/Aside/Aside.js.map +1 -1
  12. package/Aside/AsideSidebar.js.map +1 -1
  13. package/AspectRatio/AspectRatio.js.map +1 -1
  14. package/Avatar/Avatar.js.map +1 -1
  15. package/Badge/Badge.js.map +1 -1
  16. package/Badge/badgeVariants.js.map +1 -1
  17. package/Breadcrumb/Breadcrumb.js.map +1 -1
  18. package/Button/Button.js +11 -10
  19. package/Button/Button.js.map +1 -1
  20. package/Button/Button.stories.js.map +1 -1
  21. package/Button/Button.utils.js.map +1 -1
  22. package/Button/ButtonCounterBadge.js.map +1 -1
  23. package/Button/buttonVariants.js.map +1 -1
  24. package/ButtonIcon/ButtonIcon.js +22 -19
  25. package/ButtonIcon/ButtonIcon.js.map +1 -1
  26. package/ButtonIcon/ButtonIcon.stories.js.map +1 -1
  27. package/ButtonIcon/buttonIconVariants.js.map +1 -1
  28. package/CHANGELOG.md +3487 -3487
  29. package/Calendar/Calendar.js +6 -4
  30. package/Calendar/Calendar.js.map +1 -1
  31. package/Card/Card.js.map +1 -1
  32. package/Carousel/Carousel.js +7 -6
  33. package/Carousel/Carousel.js.map +1 -1
  34. package/Chart/Chart.js.map +1 -1
  35. package/Checkbox/Checkbox.js +1 -0
  36. package/Checkbox/Checkbox.js.map +1 -1
  37. package/Checkbox/Checkbox.stories.js.map +1 -1
  38. package/Collapsible/Collapsible.js.map +1 -1
  39. package/Combobox/Combobox.js +10 -10
  40. package/Combobox/Combobox.js.map +1 -1
  41. package/Combobox/Combobox.stories.js.map +1 -1
  42. package/Combobox/Combobox.types.js.map +1 -1
  43. package/Combobox/ComboboxOptionItem.js +19 -18
  44. package/Combobox/ComboboxOptionItem.js.map +1 -1
  45. package/Combobox/ComboboxRenderContent.d.ts.map +1 -1
  46. package/Combobox/ComboboxRenderContent.js +47 -43
  47. package/Combobox/ComboboxRenderContent.js.map +1 -1
  48. package/Combobox/ComboboxRenderOptions.js +5 -5
  49. package/Combobox/ComboboxRenderOptions.js.map +1 -1
  50. package/Combobox/ComboboxRenderTrigger.js +20 -18
  51. package/Combobox/ComboboxRenderTrigger.js.map +1 -1
  52. package/Command/Command.js +22 -21
  53. package/Command/Command.js.map +1 -1
  54. package/ContextPopover/ContextDropdownMenu.js.map +1 -1
  55. package/ContextPopover/ContextPopover.js.map +1 -1
  56. package/ContextPopover/useContextPopoverHandler.js.map +1 -1
  57. package/DataTable/DataTable.js +26 -24
  58. package/DataTable/DataTable.js.map +1 -1
  59. package/DataTable/DataTableColumnFilter.js +7 -6
  60. package/DataTable/DataTableColumnFilter.js.map +1 -1
  61. package/DataTable/useDataTable.js.map +1 -1
  62. package/DatePicker/DatePicker.js +2 -1
  63. package/DatePicker/DatePicker.js.map +1 -1
  64. package/Dialog/Dialog.js +21 -20
  65. package/Dialog/Dialog.js.map +1 -1
  66. package/Dialog/Dialog.stories.js +15 -14
  67. package/Dialog/Dialog.stories.js.map +1 -1
  68. package/Dialog/DialogOverlayScope.js.map +1 -1
  69. package/Dialog/useDialogClosePosition.js.map +1 -1
  70. package/Drawer/Drawer.js.map +1 -1
  71. package/DropdownMenu/DropdownMenu.js.map +1 -1
  72. package/Dropzone/Dropzone.js +81 -80
  73. package/Dropzone/Dropzone.js.map +1 -1
  74. package/Dropzone/Dropzone.stories.js.map +1 -1
  75. package/Dropzone/Dropzone.types.js.map +1 -1
  76. package/Dropzone/DropzoneCoverPreview.js.map +1 -1
  77. package/Dropzone/DropzoneFilePreview.js.map +1 -1
  78. package/Dropzone/DropzoneSinglePickPreview.js +3 -2
  79. package/Dropzone/DropzoneSinglePickPreview.js.map +1 -1
  80. package/Dropzone/DropzoneUtils.js.map +1 -1
  81. package/Form/Form.js +15 -14
  82. package/Form/Form.js.map +1 -1
  83. package/Form/FormRenderControl.js +7 -6
  84. package/Form/FormRenderControl.js.map +1 -1
  85. package/Form/Form_old.js +5 -4
  86. package/Form/Form_old.js.map +1 -1
  87. package/FormCheckbox/FormCheckbox.js +4 -4
  88. package/FormCheckbox/FormCheckbox.js.map +1 -1
  89. package/FormCombobox/FormCombobox.js +4 -4
  90. package/FormCombobox/FormCombobox.js.map +1 -1
  91. package/FormCombobox/FormCombobox.stories.js +19 -17
  92. package/FormCombobox/FormCombobox.stories.js.map +1 -1
  93. package/FormDatePicker/FormDatePicker.js +4 -4
  94. package/FormDatePicker/FormDatePicker.js.map +1 -1
  95. package/FormDropzone/FormDropzone.js +3 -3
  96. package/FormDropzone/FormDropzone.js.map +1 -1
  97. package/FormInput/FormInput.js +6 -6
  98. package/FormInput/FormInput.js.map +1 -1
  99. package/FormInput/FormInput.stories.js +13 -12
  100. package/FormInput/FormInput.stories.js.map +1 -1
  101. package/FormRadio/FormRadio.js.map +1 -1
  102. package/FormSelect/FormSelect.js +15 -12
  103. package/FormSelect/FormSelect.js.map +1 -1
  104. package/FormTextarea/FormTextarea.js +4 -4
  105. package/FormTextarea/FormTextarea.js.map +1 -1
  106. package/Header/Header.js.map +1 -1
  107. package/HoverCard/HoverCard.js.map +1 -1
  108. package/InfoBlock/InfoBlock.js.map +1 -1
  109. package/InfoBlock/InfoBlock.stories.js.map +1 -1
  110. package/InfoBlock/infoBlockVariants.js.map +1 -1
  111. package/Input/Input.js.map +1 -1
  112. package/Input/Input.stories.js.map +1 -1
  113. package/Input/inputVariants.js.map +1 -1
  114. package/InputOTP/InputOTP.d.ts.map +1 -1
  115. package/InputOTP/InputOTP.js.map +1 -1
  116. package/LICENSE +21 -21
  117. package/Label/Label.js.map +1 -1
  118. package/Label/labelVariants.js.map +1 -1
  119. package/LazyLoader/LazyLoader.js +5 -4
  120. package/LazyLoader/LazyLoader.js.map +1 -1
  121. package/LoadedIcon/LoadedIcon.js.map +1 -1
  122. package/LoadingMask/LoadingMask.js.map +1 -1
  123. package/LoadingMask/RenderLoadingMask.js.map +1 -1
  124. package/LoadingProgress/LoadingProgress.js.map +1 -1
  125. package/LoadingProgress/loadingProgressVariants.js.map +1 -1
  126. package/Menubar/Menubar.js.map +1 -1
  127. package/NavigationMenu/NavigationMenu.js.map +1 -1
  128. package/NavigationMenu/navigationMenuVariants.js.map +1 -1
  129. package/Pagination/Pagination.js +1 -0
  130. package/Pagination/Pagination.js.map +1 -1
  131. package/Popover/Popover.js.map +1 -1
  132. package/Progress/Progress.js.map +1 -1
  133. package/README.md +7 -7
  134. package/Radio/Radio.js.map +1 -1
  135. package/RadioGroup/RadioGroup.js.map +1 -1
  136. package/Resizable/Resizable.js.map +1 -1
  137. package/Resizable/Resizable.stories.js.map +1 -1
  138. package/ScrollArea/ScrollArea.js.map +1 -1
  139. package/Search/Search.js +9 -9
  140. package/Search/Search.js.map +1 -1
  141. package/Search/Search.stories.js.map +1 -1
  142. package/Select/Select.js +7 -6
  143. package/Select/Select.js.map +1 -1
  144. package/Select/Select.stories.js.map +1 -1
  145. package/Select/SelectRoot.js.map +1 -1
  146. package/Separator/Separator.js.map +1 -1
  147. package/Sheet/Sheet.js.map +1 -1
  148. package/Sidebar/Sidebar.js +21 -20
  149. package/Sidebar/Sidebar.js.map +1 -1
  150. package/Skeleton/Skeleton.js.map +1 -1
  151. package/Slider/Slider.js.map +1 -1
  152. package/Sonner/Sonner.js.map +1 -1
  153. package/Switch/Switch.js.map +1 -1
  154. package/Switch/Switch.stories.js.map +1 -1
  155. package/Table/Table.js.map +1 -1
  156. package/TablePagination/TablePagination.js +26 -21
  157. package/TablePagination/TablePagination.js.map +1 -1
  158. package/Tabs/Tabs.js.map +1 -1
  159. package/Tabs/TabsRoot.js.map +1 -1
  160. package/Textarea/Textarea.js.map +1 -1
  161. package/Textarea/Textarea.stories.js.map +1 -1
  162. package/Textarea/useAutosizeTextArea.js.map +1 -1
  163. package/Theme/ThemeModeToggle.js +4 -3
  164. package/Theme/ThemeModeToggle.js.map +1 -1
  165. package/Theme/ThemeProvider.js.map +1 -1
  166. package/Toast/Toast.js.map +1 -1
  167. package/Toast/toast.constants.js.map +1 -1
  168. package/Toast/toastVariants.js.map +1 -1
  169. package/Toast/useToast.js.map +1 -1
  170. package/Toaster/Toaster.js.map +1 -1
  171. package/Toggle/Toggle.js.map +1 -1
  172. package/ToggleGroup/ToggleGroup.js.map +1 -1
  173. package/Tooltip/Tooltip.js.map +1 -1
  174. package/Tooltip/TooltipRoot.js.map +1 -1
  175. package/Tooltip/tooltipVariants.js.map +1 -1
  176. package/index.js +289 -289
  177. package/package.json +4 -4
  178. package/vite-env.d.ts +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"Form_old.js","sources":["../../src/Form/Form_old.tsx"],"sourcesContent":["'use client';\r\n\r\nimport * as React from 'react';\r\nimport * as LabelPrimitive from '@radix-ui/react-label';\r\nimport { Slot } from '@radix-ui/react-slot';\r\nimport {\r\n Controller,\r\n ControllerProps,\r\n FieldPath,\r\n FieldValues,\r\n FormProvider,\r\n useFormContext,\r\n} from 'react-hook-form';\r\n\r\nimport { cn } from '@oneplatformdev/utils';\r\nimport { Label } from '../Label';\r\n\r\nconst Form = FormProvider;\r\n\r\ntype FormFieldContextValue<\r\n TFieldValues extends FieldValues = FieldValues,\r\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\r\n> = {\r\n name: TName\r\n}\r\n\r\nconst FormFieldContext = React.createContext<FormFieldContextValue>(\r\n {} as FormFieldContextValue\r\n)\r\n\r\nconst FormField = <\r\n TFieldValues extends FieldValues = FieldValues,\r\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\r\n>({\r\n ...props\r\n}: ControllerProps<TFieldValues, TName>) => {\r\n return (\r\n <FormFieldContext.Provider value={{ name: props.name }}>\r\n <Controller {...props} />\r\n </FormFieldContext.Provider>\r\n )\r\n}\r\n\r\nconst useFormField = () => {\r\n const fieldContext = React.useContext(FormFieldContext)\r\n const itemContext = React.useContext(FormItemContext)\r\n const { getFieldState, formState } = useFormContext()\r\n\r\n const fieldState = getFieldState(fieldContext.name, formState)\r\n\r\n if (!fieldContext) {\r\n throw new Error(\"useFormField should be used within <FormField>\")\r\n }\r\n\r\n const { id } = itemContext\r\n\r\n return {\r\n id,\r\n name: fieldContext.name,\r\n formItemId: `${id}-form-item`,\r\n formDescriptionId: `${id}-form-item-description`,\r\n formMessageId: `${id}-form-item-message`,\r\n ...fieldState,\r\n }\r\n}\r\n\r\ntype FormItemContextValue = {\r\n id: string\r\n}\r\n\r\nconst FormItemContext = React.createContext<FormItemContextValue>(\r\n {} as FormItemContextValue\r\n)\r\n\r\nconst FormItem = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => {\r\n const id = React.useId()\r\n\r\n return (\r\n <FormItemContext.Provider value={{ id }}>\r\n <div ref={ref} className={cn(\"space-y-1\", className)} {...props} />\r\n </FormItemContext.Provider>\r\n )\r\n})\r\nFormItem.displayName = \"FormItem\"\r\n\r\nconst FormLabel = React.forwardRef<\r\n React.ElementRef<typeof LabelPrimitive.Root>,\r\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\r\n>(({ className, ...props }, ref) => {\r\n const { error, formItemId } = useFormField()\r\n\r\n return (\r\n <Label\r\n ref={ref}\r\n data-state={error ? \"invalid\" : \"valid\"}\r\n className={cn(error && \"text-destructive\", className)}\r\n htmlFor={formItemId}\r\n {...props}\r\n />\r\n )\r\n})\r\nFormLabel.displayName = \"FormLabel\"\r\n\r\nconst FormControl = React.forwardRef<\r\n React.ElementRef<typeof Slot>,\r\n React.ComponentPropsWithoutRef<typeof Slot>\r\n>(({ className, ...props }, ref) => {\r\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\r\n\r\n return (\r\n <Slot\r\n ref={ref}\r\n id={formItemId}\r\n data-state={error ? \"invalid\" : \"valid\"}\r\n aria-describedby={\r\n !error\r\n ? `${formDescriptionId}`\r\n : `${formDescriptionId} ${formMessageId}`\r\n }\r\n aria-invalid={!!error}\r\n className={cn('group/form-control', className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nFormControl.displayName = \"FormControl\"\r\n\r\nconst FormDescription = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLParagraphElement>\r\n>(({ className, ...props }, ref) => {\r\n const { formDescriptionId } = useFormField()\r\n\r\n return (\r\n <p\r\n ref={ref}\r\n id={formDescriptionId}\r\n className={cn(\"text-[0.8rem] text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n )\r\n})\r\nFormDescription.displayName = \"FormDescription\"\r\n\r\nconst FormMessage = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLParagraphElement>\r\n>(({ className, children, ...props }, ref) => {\r\n const { error, formMessageId } = useFormField()\r\n const body = error ? String(error?.message) : children\r\n\r\n if (!body) {\r\n return null\r\n }\r\n\r\n return (\r\n <p\r\n ref={ref}\r\n id={formMessageId}\r\n className={cn(\"text-[0.8rem] font-medium text-destructive\", className)}\r\n {...props}\r\n >\r\n {body}\r\n </p>\r\n )\r\n})\r\nFormMessage.displayName = \"FormMessage\"\r\n\r\nexport {\r\n useFormField,\r\n Form,\r\n FormItem,\r\n FormLabel,\r\n FormControl,\r\n FormDescription,\r\n FormMessage,\r\n FormField,\r\n}\r\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
+ {"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 { FormRenderControl as a } from "../Form/FormRenderControl.js";
3
- import { FormControl as l } from "../Form/Form.js";
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
- a,
8
+ l,
9
9
  {
10
10
  form: t,
11
11
  name: h,
12
- render: ({ field: o }) => /* @__PURE__ */ e(l, { children: /* @__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';\r\n\r\nimport { FormControl, FormRenderControl } from '../Form';\r\n\r\nimport { FormCheckboxProps } from './FormCheckbox.types';\r\nimport { CheckboxLabel } from '../Checkbox';\r\n\r\n// TODO: move to @oneplatformdev/ui/FormCheckbox\r\nexport const FormCheckbox = <Data extends FieldValues>(\r\n\tprops: FormCheckboxProps<Data>\r\n) => {\r\n\tconst { form, label, name, onCheckedChange, ...rest } = props;\r\n\treturn (\r\n\t\t<FormRenderControl\r\n\t\t\tform={form}\r\n\t\t\tname={name}\r\n\t\t\trender={({ field }) => (\r\n\t\t\t\t<FormControl>\r\n\t\t\t\t\t<CheckboxLabel\r\n\t\t\t\t\t\t{...field}\r\n\t\t\t\t\t\t{...rest}\r\n\t\t\t\t\t\tlabel={label}\r\n\t\t\t\t\t\tchecked={field.value || false}\r\n\t\t\t\t\t\tonCheckedChange={(v) => {\r\n\t\t\t\t\t\t\tfield.onChange(v);\r\n\t\t\t\t\t\t\tonCheckedChange?.(v);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t</FormControl>\r\n\t\t\t)}\r\n\t\t\t{...rest}\r\n\t\t/>\r\n\t);\r\n};\r\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
+ {"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
- s,
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(b, { children: g === "multi" ? /* @__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';\r\nimport { Combobox, ComboboxSelectedType } from '../Combobox';\r\nimport {\r\n FormComboboxMultiProps, FormComboboxProps,\r\n FormComboboxSingleProps\r\n} from './FormCombobox.types';\r\nimport { FieldValues } from 'react-hook-form';\r\nimport { JSX } from \"react\";\r\n\r\ntype RestOmitedType<T> = Omit<T, 'form' | 'label' | 'tooltip' | 'tooltipProps' | 'name'>;\r\n\r\ntype RestPropsType<\r\n T extends ComboboxSelectedType,\r\n Data extends FieldValues,\r\n Node extends object = object,\r\n> = T extends 'single'\r\n ? RestOmitedType<FormComboboxSingleProps<Data, Node>>\r\n : RestOmitedType<FormComboboxMultiProps<Data, Node>>\r\n\r\nexport function FormCombobox<\r\n Data extends FieldValues,\r\n Node extends object = object\r\n>(props: FormComboboxSingleProps<Data, Node>): JSX.Element;\r\nexport function FormCombobox<\r\n Data extends FieldValues,\r\n Node extends object = object\r\n>(props: FormComboboxMultiProps<Data, Node>): JSX.Element;\r\n\r\nexport function FormCombobox<\r\n Data extends object = object,\r\n Node extends object = object\r\n>(\r\n props: FormComboboxProps<Data, Node>\r\n): JSX.Element {\r\n const { form, label, tooltip, tooltipProps, name, imperativeRef, ...rest } = props;\r\n const type = (props.type ?? 'single') as 'single' | 'multi';\r\n return (\r\n <FormRenderControl\r\n form={form}\r\n label={label}\r\n tooltip={tooltip}\r\n tooltipProps={tooltipProps}\r\n name={name}\r\n render={({ field }) => (\r\n <FormControl>\r\n {type === 'multi' ? (\r\n <Combobox<Node>\r\n {...(rest as RestPropsType<'multi', Data, Node>)}\r\n {...field}\r\n type=\"multi\"\r\n imperativeRef={imperativeRef}\r\n onChange={field.onChange}\r\n />\r\n ) : (\r\n <Combobox<Node>\r\n {...(rest as RestPropsType<'single', Data, Node>)}\r\n {...field}\r\n type=\"single\"\r\n imperativeRef={imperativeRef}\r\n onChange={field.onChange}\r\n />\r\n )}\r\n </FormControl>\r\n )}\r\n />\r\n );\r\n};\r\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
+ {"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 o } from "react/jsx-runtime";
2
- import { useForm as i, FormProvider as n } from "react-hook-form";
3
- import { FormCombobox as m } from "./FormCombobox.js";
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 { FormSelect as c } from "../FormSelect/FormSelect.js";
6
- import { Button as d } from "../Button/Button.js";
7
- import { FormTextarea as u } from "../FormTextarea/FormTextarea.js";
8
- const p = (e) => new Promise((r) => setTimeout(r, e)), a = [
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 ? a.filter((t) => String(t.label).toLowerCase().includes(r)) : a;
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
- ], L = {
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(n, { ...e, children: /* @__PURE__ */ o(
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
- c,
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
- m,
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
- u,
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(d, { type: "submit", disabled: !r || t, className: "w-full", children: "Зберегти" })
94
+ /* @__PURE__ */ l(u, { type: "submit", disabled: !r || t, className: "w-full", children: "Зберегти" })
93
95
  ]
94
96
  }
95
97
  ) });
96
98
  }
97
- const q = {
99
+ const O = {
98
100
  render: () => /* @__PURE__ */ l(h, {})
99
101
  };
100
102
  export {
101
- q as AllFields,
102
- L as default
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":"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"}
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 { FormRenderControl as C } from "../Form/FormRenderControl.js";
4
- import { FormControl as D } from "../Form/Form.js";
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
- C,
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(D, { children: /* @__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';\r\n\r\nimport { DatePicker } from '../DatePicker';\r\nimport { FormControl, FormRenderControl } from '../Form';\r\nimport { FieldValues } from 'react-hook-form';\r\nimport { FormDatePickerProps } from './FormDatePicker.types';\r\n\r\n// TODO: add description\r\nexport const FormDatePicker = <Data extends FieldValues>(\r\n props: FormDatePickerProps<Data>\r\n) => {\r\n const { form, name, tooltip, tooltipProps, label, onDateChange, ...rest } = props;\r\n return (\r\n <FormRenderControl\r\n form={form}\r\n name={name}\r\n tooltip={tooltip}\r\n tooltipProps={tooltipProps}\r\n label={label}\r\n render={({ field }) => (\r\n <FormControl>\r\n <DatePicker\r\n { ...field }\r\n { ...rest }\r\n selectedDate={field.value}\r\n onDateChange={(date: Date | undefined) => {\r\n field.onChange(date);\r\n onDateChange?.(date);\r\n }}\r\n />\r\n </FormControl>\r\n )}\r\n />\r\n );\r\n};\r\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
+ {"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 { Dropzone as a } from "../Dropzone/Dropzone.js";
2
+ import { FormControl as a } from "../Form/Form.js";
3
3
  import { FormRenderControl as s } from "../Form/FormRenderControl.js";
4
- import { FormControl as f } from "../Form/Form.js";
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(f, { children: /* @__PURE__ */ o(a, { ...i, ...r, onChangeValue: r.onChange }) })
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';\r\nimport { Dropzone } from '../Dropzone';\r\nimport { FieldValues } from 'react-hook-form';\r\nimport { FormDropzoneProps } from './FormDropzone.types';\r\n\r\nexport const FormDropzone = <Data extends FieldValues>(\r\n props: FormDropzoneProps<Data>\r\n) => {\r\n const { form, label, tooltip, tooltipProps, name, ...rest } = props;\r\n\r\n return (\r\n <FormRenderControl\r\n form={form}\r\n label={label}\r\n tooltip={tooltip}\r\n tooltipProps={tooltipProps}\r\n name={name}\r\n render={({ field }) => (\r\n <FormControl>\r\n <Dropzone {...rest} {...field} onChangeValue={field.onChange} />\r\n </FormControl>\r\n )}\r\n />\r\n );\r\n};\r\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;"}
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;"}
@@ -1,8 +1,8 @@
1
1
  import { jsx as m } from "react/jsx-runtime";
2
- import { forwardRef as S } from "react";
2
+ import { FormControl as S } from "../Form/Form.js";
3
3
  import { FormRenderControl as V } from "../Form/FormRenderControl.js";
4
- import { FormControl as j } from "../Form/Form.js";
5
- import { Input as q } from "../Input/Input.js";
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(j, { children: /* @__PURE__ */ m(
17
- q,
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 = S(w);
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';\r\nimport { Input } from '../Input';\r\nimport { FormInputProps } from './FormInput.types';\r\nimport { FieldValues, Path, PathValue } from 'react-hook-form';\r\nimport { forwardRef, ReactElement, Ref, RefObject } from 'react';\r\n\r\n// TODO: add description\r\n// export const FormInput = <Data extends FieldValues>(\r\n// props: FormInputProps<Data> & { inputRef?: Ref<HTMLInputElement> }\r\n// ) => {\r\n// const { inputRef, form, label, name, onChange, onBlur, style, ...rest } =\r\n// props;\r\n// return (\r\n// <FormRenderControl\r\n// form={form}\r\n// name={name}\r\n// label={label}\r\n// render={({ field }) => (\r\n// <FormControl>\r\n// <Input\r\n// {...field}\r\n// {...rest}\r\n// ref={(el) => {\r\n// field.ref(el);\r\n// if (typeof inputRef === 'function') {\r\n// inputRef(el);\r\n// } else if (inputRef) {\r\n// (inputRef as RefObject<HTMLInputElement | null>).current = el;\r\n// }\r\n// }}\r\n// style={style}\r\n// value={field.value || ''}\r\n// onChange={(...rest) => {\r\n// field.onChange?.(...rest);\r\n// onChange?.(...rest);\r\n// }}\r\n// onBlur={(...rest) => {\r\n// field.onBlur?.();\r\n// onBlur?.(...rest);\r\n// }}\r\n// />\r\n// </FormControl>\r\n// )}\r\n// />\r\n// );\r\n// };\r\n\r\nfunction FormInputInner<Data extends FieldValues>(\r\n props: FormInputProps<Data>,\r\n ref: Ref<HTMLInputElement>\r\n) {\r\n const { form, tooltip, tooltipProps, label, name, maxLength, counter, onChange, onBlur, onPaste, style, onPastePrepare, ...rest } = props;\r\n return (\r\n <FormRenderControl\r\n form={form}\r\n name={name}\r\n tooltip={tooltip}\r\n tooltipProps={tooltipProps}\r\n label={label}\r\n render={({ field, fieldState }) => (\r\n <FormControl>\r\n <Input\r\n {...field}\r\n {...rest}\r\n counter={!!fieldState.error ? false : counter}\r\n maxLength={maxLength}\r\n ref={(el) => {\r\n field.ref(el);\r\n if (typeof ref === 'function') {\r\n ref(el);\r\n } else if (ref) {\r\n (ref as RefObject<HTMLInputElement | null>).current = el;\r\n }\r\n }}\r\n style={style}\r\n value={field.value || ''}\r\n onChange={(...rest) => {\r\n field.onChange?.(...rest);\r\n onChange?.(...rest);\r\n }}\r\n onPaste={(e) => {\r\n const pasted = e.clipboardData.getData('text');\r\n const input = e.currentTarget;\r\n\r\n const start = input.selectionStart ?? input.value.length;\r\n const end = input.selectionEnd ?? input.value.length;\r\n\r\n const current = input.value;\r\n\r\n let next = current.slice(0, start) + pasted + current.slice(end);\r\n\r\n if (onPastePrepare) {\r\n next = onPastePrepare(next, e);\r\n }\r\n\r\n if (typeof maxLength !== 'number') {\r\n e.preventDefault();\r\n\r\n form.setValue(name, next as PathValue<Data, Path<Data>>, {\r\n shouldDirty: true,\r\n shouldTouch: true,\r\n });\r\n\r\n return;\r\n }\r\n\r\n const before = current.slice(0, start);\r\n const after = current.slice(end);\r\n\r\n const available = maxLength - (before.length + after.length);\r\n\r\n if (available <= 0) {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n const limitedPaste = pasted.slice(0, available);\r\n const limitedNext = before + limitedPaste + after;\r\n\r\n e.preventDefault();\r\n\r\n form.setValue(name, limitedNext as PathValue<Data, Path<Data>>, {\r\n shouldDirty: true,\r\n shouldTouch: true,\r\n });\r\n\r\n requestAnimationFrame(() => {\r\n input.setSelectionRange(\r\n before.length + limitedPaste.length,\r\n before.length + limitedPaste.length\r\n );\r\n });\r\n }}\r\n onBlur={(...rest) => {\r\n field.onBlur?.();\r\n onBlur?.(...rest);\r\n }}\r\n />\r\n </FormControl>\r\n )}\r\n />\r\n );\r\n}\r\n\r\nexport const FormInput = forwardRef(FormInputInner) as <Data extends FieldValues>(\r\n props: FormInputProps<Data> & { ref?: Ref<HTMLInputElement> }\r\n) => ReactElement;\r\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;"}
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
- function f({ initialValue: e = "", ...t }) {
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 w = {
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
- }, I = {
58
- render: (e) => /* @__PURE__ */ r(f, { ...e })
58
+ }, V = {
59
+ render: (e) => /* @__PURE__ */ r(p, { ...e })
59
60
  };
60
- function p(e) {
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 V = {
75
- render: (e) => /* @__PURE__ */ r(p, { ...e })
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 E = {
130
+ const L = {
130
131
  render: () => /* @__PURE__ */ r(h, {})
131
132
  };
132
133
  export {
133
- I as Default,
134
- E as HybridValidation,
135
- V as WithError,
136
- w as default
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';\r\nimport type { Meta, StoryObj } from '@storybook/react';\r\nimport { FormProvider, useForm } from 'react-hook-form';\r\n\r\nimport { FormInput } from './FormInput';\r\nimport { FormTextarea } from '../FormTextarea';\r\nimport { Button } from '../Button';\r\n\r\ntype FormValues = {\r\n name: string;\r\n};\r\n\r\ntype ControlledProps = Omit<\r\n React.ComponentProps<typeof FormInput<FormValues>>,\r\n 'form' | 'name'\r\n> & {\r\n initialValue?: string;\r\n};\r\n\r\nfunction ControlledFormInput({ initialValue = '', ...args }: ControlledProps) {\r\n const form = useForm<FormValues>({\r\n defaultValues: {\r\n name: initialValue,\r\n },\r\n });\r\n\r\n const value = form.watch('name');\r\n const tooltip = \"UX/UI принципи, композиція, типографіка, колір, дизайн-системи та робота з інтерфейсами\"\r\n return (\r\n <FormProvider {...form}>\r\n <div className=\"max-w-sm space-y-3\">\r\n <FormInput<FormValues>\r\n form={form}\r\n name=\"name\"\r\n counter\r\n maxLength={255}\r\n tooltip={tooltip}\r\n label={\"Label\"}\r\n />\r\n\r\n <div className=\"text-xs text-muted-foreground\">\r\n value: <span className=\"font-mono\">{value}</span>\r\n </div>\r\n\r\n <div className=\"text-xs text-muted-foreground\">\r\n length: <span className=\"font-mono\">\r\n {value?.length ?? 0}\r\n </span>\r\n </div>\r\n </div>\r\n </FormProvider>\r\n );\r\n}\r\n\r\nconst meta = {\r\n title: 'FormInput',\r\n component: FormInput,\r\n parameters: {\r\n layout: 'centered',\r\n },\r\n args: {\r\n label: 'Input label',\r\n placeholder: 'Type something...',\r\n disabled: false,\r\n },\r\n argTypes: {\r\n form: { control: false },\r\n name: { control: false },\r\n onChange: { control: false },\r\n onBlur: { control: false },\r\n onPaste: { control: false },\r\n onPastePrepare: { control: false },\r\n },\r\n decorators: [\r\n (Story) => (\r\n <div className=\"p-6 w-[420px]\">\r\n <Story />\r\n </div>\r\n ),\r\n ],\r\n} satisfies Meta<typeof FormInput>;\r\n\r\nexport default meta;\r\n\r\ntype Story = StoryObj<typeof meta>;\r\n\r\nexport const Default: Story = {\r\n render: (args) => <ControlledFormInput {...args} />,\r\n};\r\n\r\nfunction FormInputWithError(args: ControlledProps) {\r\n const form = useForm<FormValues>({ defaultValues: { name: '' } });\r\n\r\n useEffect(() => {\r\n form.setError('name', { message: 'Це поле обовʼязкове' });\r\n }, []);\r\n\r\n return (\r\n <FormProvider {...form}>\r\n <div className=\"max-w-sm\">\r\n <FormInput<FormValues>\r\n form={form}\r\n name=\"name\"\r\n label=\"Label\"\r\n {...args}\r\n />\r\n </div>\r\n </FormProvider>\r\n );\r\n}\r\n\r\nexport const WithError: Story = {\r\n render: (args) => <FormInputWithError {...args} />,\r\n};\r\n\r\n// Демонстрація гібридної моделі валідації (feat/1856):\r\n// - помилка з'являється на blur (mode: \"onTouched\")\r\n// - зникає миттєво при виправленні (on change), щойно значення стає валідним\r\n// - червона рамка + текст помилки під полем\r\n// - кнопка submit disabled, поки форма невалідна\r\ntype HybridValues = {\r\n email: string;\r\n fullName: string;\r\n description: string;\r\n};\r\n\r\nconst hybridResolver = (values: HybridValues) => {\r\n const errors: Record<string, { type: string; message: string }> = {};\r\n\r\n if (!values.email?.trim()) {\r\n errors.email = { type: 'required', message: \"Обовʼязкове поле\" };\r\n } else if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(values.email.trim())) {\r\n errors.email = { type: 'pattern', message: 'Невірний формат пошти' };\r\n }\r\n\r\n if (!values.fullName?.trim()) {\r\n errors.fullName = { type: 'required', message: \"Обовʼязкове поле\" };\r\n }\r\n\r\n if (!values.description?.trim()) {\r\n errors.description = { type: 'required', message: \"Обовʼязкове поле\" };\r\n } else if (values.description.trim().length < 10) {\r\n errors.description = { type: 'minLength', message: 'Мінімум 10 символів' };\r\n }\r\n\r\n return {\r\n values: Object.keys(errors).length ? {} : values,\r\n errors,\r\n };\r\n};\r\n\r\nfunction HybridValidationForm() {\r\n const form = useForm<HybridValues>({\r\n mode: 'onTouched',\r\n resolver: hybridResolver,\r\n defaultValues: { email: '', fullName: '', description: '' },\r\n });\r\n\r\n const { isValid, isSubmitting } = form.formState;\r\n\r\n return (\r\n <FormProvider {...form}>\r\n <form\r\n className=\"max-w-sm space-y-4\"\r\n onSubmit={form.handleSubmit(() => {\r\n alert('Форму надіслано ✅');\r\n })}\r\n >\r\n <FormInput<HybridValues>\r\n form={form}\r\n name=\"email\"\r\n label=\"Email\"\r\n placeholder=\"name@example.com\"\r\n />\r\n <FormInput<HybridValues>\r\n form={form}\r\n name=\"fullName\"\r\n label=\"Імʼя\"\r\n placeholder=\"Іван Петренко\"\r\n />\r\n <FormTextarea<HybridValues>\r\n form={form}\r\n name=\"description\"\r\n label=\"Опис\"\r\n placeholder=\"Мінімум 10 символів\"\r\n />\r\n <Button type=\"submit\" disabled={!isValid || isSubmitting} className=\"w-full\">\r\n Зберегти\r\n </Button>\r\n </form>\r\n </FormProvider>\r\n );\r\n}\r\n\r\nexport const HybridValidation: Story = {\r\n render: () => <HybridValidationForm />,\r\n};\r\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":"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"}
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":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FormRadio.js","sources":["../../src/FormRadio/FormRadio.tsx"],"sourcesContent":["import { FieldValues } from 'react-hook-form';\r\n\r\nimport { FormControl, FormItem } from '../Form/Form';\r\nimport { FormRenderControl } from '../Form/FormRenderControl';\r\nimport { Radio } from '../Radio';\r\n\r\nimport type { FormRadioGroupProps } from './FormRadio.types.ts';\r\n\r\nexport const FormRadio = <Data extends FieldValues>(\r\n props: FormRadioGroupProps<Data>\r\n) => {\r\n const {\r\n form,\r\n name,\r\n label,\r\n onValueChange,\r\n value,\r\n defaultValue,\r\n renderOption,\r\n ...rest\r\n } = props;\r\n return (\r\n <FormRenderControl\r\n form={form}\r\n name={name}\r\n label={label}\r\n render={({ field }) => (\r\n <FormControl>\r\n <Radio\r\n {...field}\r\n {...rest}\r\n defaultValue={defaultValue || field.value}\r\n value={value || field.value}\r\n onValueChange={(value) => {\r\n field.onChange(value);\r\n onValueChange?.(value);\r\n }}\r\n renderOption={(option, DefaultOptionComponent) => {\r\n return (\r\n <FormItem key={option.value}>\r\n <FormControl>\r\n {renderOption?.(option, DefaultOptionComponent) || (\r\n <DefaultOptionComponent {...option} />\r\n )}\r\n </FormControl>\r\n </FormItem>\r\n );\r\n }}\r\n />\r\n </FormControl>\r\n )}\r\n />\r\n );\r\n};\r\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;"}
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;"}
@@ -1,12 +1,15 @@
1
1
  import { jsx as n } from "react/jsx-runtime";
2
- import { Select as B } from "../Select/Select.js";
2
+ import { FormControl as B } from "../Form/Form.js";
3
3
  import { FormRenderControl as F } from "../Form/FormRenderControl.js";
4
- import { FormControl as P } from "../Form/Form.js";
5
- const b = (m) => {
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: l = void 0,
8
- form: i,
9
- label: p,
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: i,
27
+ form: p,
25
28
  name: s,
26
29
  tooltip: a,
27
30
  tooltipProps: g,
28
- label: p,
31
+ label: l,
29
32
  containerProps: h,
30
33
  render: ({ field: e }) => /* @__PURE__ */ n(
31
- B,
34
+ P,
32
35
  {
33
- value: e.value ?? (l || ""),
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(P, { children: C?.(r, o) || o }),
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
- b as FormSelect
53
+ V as FormSelect
51
54
  };
52
55
  //# sourceMappingURL=FormSelect.js.map