@zayne-labs/ui-react 0.11.8 → 0.11.10

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 (27) hide show
  1. package/dist/components/common/await/index.d.ts +2 -2
  2. package/dist/components/common/await/index.js +1 -1
  3. package/dist/components/common/error-boundary/index.d.ts +1 -1
  4. package/dist/components/common/for/index.d.ts +1 -1
  5. package/dist/components/common/presence/index.js +1 -1
  6. package/dist/components/common/slot/index.js +1 -1
  7. package/dist/components/common/suspense-with-boundary/index.d.ts +1 -1
  8. package/dist/components/{index-dmMYkH2c.d.ts → index-BXWyFo6R.d.ts} +2 -2
  9. package/dist/components/{index-BmD5l0L7.d.ts → index-DgA9ry9R.d.ts} +2 -2
  10. package/dist/components/{presence-DkWhm7xu.js → presence-DDuEcp1q.js} +2 -2
  11. package/dist/components/presence-DDuEcp1q.js.map +1 -0
  12. package/dist/components/{slot-DuwoiC2C.js → slot-B2aEs2RU.js} +2 -3
  13. package/dist/components/{slot-DuwoiC2C.js.map → slot-B2aEs2RU.js.map} +1 -1
  14. package/dist/components/ui/card/index.js +1 -1
  15. package/dist/components/ui/carousel/index.d.ts +3 -1
  16. package/dist/components/ui/carousel/index.js +2 -2
  17. package/dist/components/ui/carousel/index.js.map +1 -1
  18. package/dist/components/ui/drag-scroll/index.d.ts +1 -1
  19. package/dist/components/ui/drag-scroll/index.js +1 -1
  20. package/dist/components/ui/drag-scroll/index.js.map +1 -1
  21. package/dist/components/ui/drop-zone/index.js +2 -2
  22. package/dist/components/ui/drop-zone/index.js.map +1 -1
  23. package/dist/components/ui/form/index.js +1 -1
  24. package/dist/components/ui/form/index.js.map +1 -1
  25. package/dist/style.css +10 -0
  26. package/package.json +9 -9
  27. package/dist/components/presence-DkWhm7xu.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["useHookFormContext","HookFormProvider","ReactFragment","Slot.Root"],"sources":["../../../../src/components/ui/form/icons.tsx","../../../../src/components/ui/form/utils.ts","../../../../src/components/ui/form/form-context.ts","../../../../src/components/ui/form/form.tsx","../../../../src/components/ui/form/form-parts.ts"],"sourcesContent":["export const EyeIconClosed = (props: React.SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t<path\n\t\t\tfill=\"currentColor\"\n\t\t\td=\"M15.175 8.325q.725.725 1.063 1.65t.237 1.9q0 .375-.275.638t-.65.262t-.638-.262t-.262-.638q.125-.65-.075-1.25T13.95 9.6t-1.025-.65t-1.275-.1q-.375 0-.638-.275t-.262-.65t.263-.637t.637-.263q.95-.1 1.875.238t1.65 1.062M12 6q-.475 0-.925.037t-.9.138q-.425.075-.763-.125t-.462-.6t.088-.775t.612-.45q.575-.125 1.163-.175T12 4q3.425 0 6.263 1.8t4.337 4.85q.1.2.15.413t.05.437t-.038.438t-.137.412q-.45 1-1.112 1.875t-1.463 1.6q-.3.275-.7.225t-.65-.4t-.212-.763t.337-.687q.6-.575 1.1-1.25t.875-1.45q-1.25-2.525-3.613-4.012T12 6m0 13q-3.35 0-6.125-1.812T1.5 12.425q-.125-.2-.187-.437T1.25 11.5t.05-.475t.175-.45q.5-1 1.163-1.912T4.15 7L2.075 4.9q-.275-.3-.262-.712T2.1 3.5t.7-.275t.7.275l17 17q.275.275.288.688t-.288.712q-.275.275-.7.275t-.7-.275l-3.5-3.45q-.875.275-1.775.413T12 19M5.55 8.4q-.725.65-1.325 1.425T3.2 11.5q1.25 2.525 3.613 4.013T12 17q.5 0 .975-.062t.975-.138l-.9-.95q-.275.075-.525.113T12 16q-1.875 0-3.188-1.312T7.5 11.5q0-.275.038-.525t.112-.525zm4.2 4.2\"\n\t\t/>\n\t</svg>\n);\n\nexport const EyeIconOpen = (props: React.SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t<path\n\t\t\tfill=\"currentColor\"\n\t\t\td=\"M12 16q1.875 0 3.188-1.312T16.5 11.5t-1.312-3.187T12 7T8.813 8.313T7.5 11.5t1.313 3.188T12 16m0-1.8q-1.125 0-1.912-.788T9.3 11.5t.788-1.912T12 8.8t1.913.788t.787 1.912t-.787 1.913T12 14.2m0 4.8q-3.35 0-6.113-1.8t-4.362-4.75q-.125-.225-.187-.462t-.063-.488t.063-.488t.187-.462q1.6-2.95 4.363-4.75T12 4t6.113 1.8t4.362 4.75q.125.225.188.463t.062.487t-.062.488t-.188.462q-1.6 2.95-4.362 4.75T12 19m0-2q2.825 0 5.188-1.487T20.8 11.5q-1.25-2.525-3.613-4.012T12 6T6.813 7.488T3.2 11.5q1.25 2.525 3.613 4.013T12 17\"\n\t\t/>\n\t</svg>\n);\n","import { isObject } from \"@zayne-labs/toolkit-type-helpers\";\nimport { createElement } from \"react\";\nimport type { FieldErrors, FieldValues } from \"react-hook-form\";\nimport { cnMerge } from \"@/lib/utils/cn\";\nimport type { FormErrorMessagePrimitiveProps, FormInputProps } from \"./form\";\nimport type { FormRootContextType, RenderIconProps } from \"./form-context\";\nimport { EyeIconClosed, EyeIconOpen } from \"./icons\";\n\nexport const getFieldErrorMessage = (options: {\n\terrors: FieldErrors | undefined;\n\tfieldName: string | undefined;\n\ttype: FormErrorMessagePrimitiveProps<FieldValues>[\"type\"];\n}): string | string[] | null | undefined => {\n\tconst { errors, fieldName, type } = options;\n\n\tif (fieldName === undefined || !errors || Object.keys(errors).length === 0) return;\n\n\tif (type === \"root\") {\n\t\treturn errors.root?.[fieldName]?.message;\n\t}\n\n\t// == Handle nested paths like `notifications.0`\n\tconst pathParts = fieldName.includes(\".\") ? fieldName.split(\".\") : null;\n\n\t// == If there are no path parts, return the error message\n\tif (!pathParts) {\n\t\tconst errorMessage = errors[fieldName]?.message;\n\n\t\treturn errorMessage as string | string[];\n\t}\n\n\tlet extractedError = errors;\n\n\tfor (const part of pathParts) {\n\t\tconst currentError = extractedError[part];\n\n\t\tif (!isObject(currentError)) break;\n\n\t\textractedError = currentError as never;\n\t}\n\n\tconst errorMessage = extractedError.message as unknown as string | string[];\n\n\treturn errorMessage;\n};\n\nexport const getEyeIcon = (options: {\n\tclassNames: FormInputProps[\"classNames\"];\n\ticonType: \"closed\" | \"open\";\n\trenderIconProps: RenderIconProps;\n\twithEyeIcon: FormRootContextType[\"withEyeIcon\"];\n}) => {\n\tconst { classNames, iconType, renderIconProps, withEyeIcon } = options;\n\n\tif (!withEyeIcon) {\n\t\treturn null;\n\t}\n\n\tif (withEyeIcon === true) {\n\t\tconst defaultIconMap = {\n\t\t\tclosed: createElement(EyeIconClosed, {\n\t\t\t\tclassName: cnMerge(\"size-full\", classNames?.eyeIcon),\n\t\t\t}),\n\n\t\t\topen: createElement(EyeIconOpen, {\n\t\t\t\tclassName: cnMerge(\"size-full\", classNames?.eyeIcon),\n\t\t\t}),\n\t\t};\n\n\t\treturn defaultIconMap[iconType];\n\t}\n\n\tif (withEyeIcon.renderIcon) {\n\t\treturn withEyeIcon.renderIcon(renderIconProps);\n\t}\n\n\tif (withEyeIcon[iconType]) {\n\t\treturn withEyeIcon[iconType];\n\t}\n\n\treturn null;\n};\n","import { ContextError, createCustomContext } from \"@zayne-labs/toolkit-react\";\nimport type { UnionDiscriminator } from \"@zayne-labs/toolkit-type-helpers\";\nimport {\n\tuseFormState,\n\tuseFormContext as useHookFormContext,\n\ttype Control,\n\ttype FieldValues,\n\ttype UseFormReturn,\n\ttype UseFormStateReturn,\n} from \"react-hook-form\";\nimport { getFieldErrorMessage } from \"./utils\";\n\nexport type RenderIconProps = {\n\tisPasswordVisible: boolean;\n};\n\ntype EyeIconObject = UnionDiscriminator<\n\t[\n\t\t{ closed: React.ReactNode; open: React.ReactNode },\n\t\t{ renderIcon: (props: RenderIconProps) => React.ReactNode },\n\t]\n>;\n\nexport type FormRootContextType = {\n\twithEyeIcon: boolean | EyeIconObject | undefined;\n};\n\nexport const [LaxFormRootProvider, useLaxFormRootContext] = createCustomContext({\n\tdefaultValue: null as unknown as FormRootContextType,\n\thookName: \"useLaxFormRootContext\",\n\tname: \"LaxFormRootContext\",\n\tproviderName: \"FormRoot\",\n\tstrict: false,\n});\n\nexport type UseFormRootContextResult<TStrict extends boolean = true> =\n\tTStrict extends true ? UseFormReturn : UseFormReturn | null;\n\nexport const useFormMethodsContext = <TStrict extends boolean = true>(\n\toptions: { strict?: TStrict } = {}\n): UseFormRootContextResult<TStrict> => {\n\tconst { strict = true } = options;\n\n\tconst formContext = useHookFormContext();\n\n\t// eslint-disable-next-line ts-eslint/no-unnecessary-condition -- Allow\n\tif (strict && !formContext) {\n\t\tthrow new ContextError(\n\t\t\t`useFormMethodsContext returned \"null\". Did you forget to wrap the necessary components within FormRoot?`\n\t\t);\n\t}\n\n\treturn formContext;\n};\n\nexport type FieldContextType = {\n\tformDescriptionId: `${string}-(${string})-form-item-description`;\n\tformItemId: `${string}-(${string})-form-item`;\n\tformMessageId: `${string}-(${string})-form-item-message`;\n\tname: string;\n};\n\nexport const [StrictFormFieldProvider, useStrictFormFieldContext] = createCustomContext<FieldContextType>({\n\thookName: \"useFormFieldContext\",\n\tname: \"StrictFormFieldContext\",\n\tproviderName: \"FormField\",\n});\n\nexport const [LaxFormFieldProvider, useLaxFormFieldContext] = createCustomContext({\n\tdefaultValue: null as unknown as FieldContextType,\n\thookName: \"useLaxFormFieldContext\",\n\tname: \"LaxFormFieldContext\",\n\tproviderName: \"FormField\",\n\tstrict: false,\n});\n\nexport type FieldState = {\n\terrors?: UseFormStateReturn<FieldValues>[\"errors\"];\n\tisDisabled?: boolean;\n\tisInvalid?: boolean;\n};\n\ntype FieldStateOptions<TFieldValues extends FieldValues, TTransformedValues = TFieldValues> =\n\t| {\n\t\t\tcontrol: Control<TFieldValues, unknown, TTransformedValues> | undefined;\n\t\t\tname?: string;\n\t }\n\t| {\n\t\t\tcontrol?: Control<TFieldValues, unknown, TTransformedValues>;\n\t\t\tname: string | undefined;\n\t };\n\nexport const useLaxFormFieldState = <TFieldValues extends FieldValues, TTransformedValues = TFieldValues>(\n\toptions?: FieldStateOptions<TFieldValues, TTransformedValues>\n): FieldState => {\n\tconst { control } = useFormMethodsContext({ strict: false }) ?? {};\n\tconst { name } = useLaxFormFieldContext() ?? {};\n\n\tconst resolvedControl = control ?? options?.control;\n\n\tconst getFormState =\n\t\t// eslint-disable-next-line react-hooks/hooks -- Ignore\n\t\tresolvedControl ? useFormState : ((() => ({})) as typeof useFormState);\n\n\t// eslint-disable-next-line react-hooks/hooks -- Ignore\n\tconst { disabled, errors } = getFormState({\n\t\tcontrol: resolvedControl as never,\n\t\tname: name ?? options?.name,\n\t});\n\n\tconst errorMessage = getFieldErrorMessage({ errors, fieldName: name, type: \"regular\" });\n\n\treturn {\n\t\terrors,\n\t\tisDisabled: disabled,\n\t\tisInvalid: Boolean(errorMessage),\n\t};\n};\n","\"use client\";\n\nimport { dataAttr, on, toArray } from \"@zayne-labs/toolkit-core\";\nimport { ContextError, useCallbackRef, useCompareValue, useToggle } from \"@zayne-labs/toolkit-react\";\nimport {\n\tcomposeRefs,\n\tcomposeTwoEventHandlers,\n\tgetMultipleSlots,\n\ttype DiscriminatedRenderItemProps,\n\ttype DiscriminatedRenderProps,\n\ttype InferProps,\n\ttype PolymorphicPropsStrict,\n} from \"@zayne-labs/toolkit-react/utils\";\nimport { defineEnum, isFunction, type AnyString } from \"@zayne-labs/toolkit-type-helpers\";\nimport { Fragment as ReactFragment, useEffect, useId, useMemo, useRef } from \"react\";\nimport {\n\tController,\n\tFormProvider as HookFormProvider,\n\tuseFormState,\n\tuseWatch,\n\ttype Control,\n\ttype ControllerProps,\n\ttype FieldPath,\n\ttype FieldValues,\n\ttype RegisterOptions,\n\ttype FormStateSubscribeProps as StateSubscribeProps,\n\ttype UseFormReturn,\n\ttype WatchProps,\n} from \"react-hook-form\";\nimport { ForWithWrapper } from \"@/components/common/for\";\nimport { Slot } from \"@/components/common/slot\";\nimport { cnMerge } from \"@/lib/utils/cn\";\nimport {\n\tLaxFormFieldProvider,\n\tLaxFormRootProvider,\n\tStrictFormFieldProvider,\n\tuseFormMethodsContext,\n\tuseLaxFormFieldContext,\n\tuseLaxFormFieldState,\n\tuseLaxFormRootContext,\n\tuseStrictFormFieldContext,\n\ttype FieldContextType,\n\ttype FieldState,\n\ttype FormRootContextType,\n} from \"./form-context\";\nimport { getEyeIcon, getFieldErrorMessage } from \"./utils\";\n\nexport type FormRootProps<TFieldValues extends FieldValues, TTransformedValues> = InferProps<\"form\">\n\t& Partial<FormRootContextType> & {\n\t\tchildren: React.ReactNode;\n\t\tform: UseFormReturn<TFieldValues, unknown, TTransformedValues>;\n\t};\n\nexport function FormRoot<TFieldValues extends FieldValues, TTransformedValues = TFieldValues>(\n\tprops: FormRootProps<TFieldValues, TTransformedValues>\n) {\n\tconst { children, className, form, withEyeIcon, ...restOfProps } = props;\n\n\tconst shallowedComparedWithEyeIcon = useCompareValue(withEyeIcon);\n\n\tconst formContextValue = useMemo(\n\t\t() => ({ withEyeIcon: shallowedComparedWithEyeIcon }),\n\t\t[shallowedComparedWithEyeIcon]\n\t);\n\n\treturn (\n\t\t<HookFormProvider {...form}>\n\t\t\t<LaxFormRootProvider value={formContextValue}>\n\t\t\t\t<form\n\t\t\t\t\tclassName={cnMerge(\"flex flex-col\", className)}\n\t\t\t\t\t{...restOfProps}\n\t\t\t\t\tdata-scope=\"form\"\n\t\t\t\t\tdata-part=\"root\"\n\t\t\t\t\tdata-slot=\"form-root\"\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</form>\n\t\t\t</LaxFormRootProvider>\n\t\t</HookFormProvider>\n\t);\n}\n\nexport type FormFieldProps<\n\tTControl,\n\tTFieldValues extends FieldValues,\n\tTTransformedValues,\n> = (TControl extends Control<infer TValues> ?\n\t{\n\t\tcontrol?: never;\n\t\tname: FieldPath<TValues>;\n\t}\n:\t{\n\t\tcontrol?: Control<TFieldValues, unknown, TTransformedValues>;\n\t\tname: FieldPath<TFieldValues>;\n\t})\n\t& (\n\t\t| (InferProps<\"div\"> & { withWrapper?: true })\n\t\t| { children: React.ReactNode; className?: never; withWrapper: false }\n\t);\n\nexport function FormField<\n\tTControl,\n\tTFieldValues extends FieldValues = FieldValues,\n\tTTransformedValues = TFieldValues,\n>(props: FormFieldProps<TControl, TFieldValues, TTransformedValues>) {\n\tconst { children, className, control, name, withWrapper = true } = props;\n\n\tconst { isDisabled, isInvalid } = useLaxFormFieldState({ control, name });\n\n\tconst uniqueId = useId();\n\n\tconst fieldContextValue = useMemo(\n\t\t() =>\n\t\t\t({\n\t\t\t\tformDescriptionId: `${name}-(${uniqueId})-form-item-description`,\n\t\t\t\tformItemId: `${name}-(${uniqueId})-form-item`,\n\t\t\t\tformMessageId: `${name}-(${uniqueId})-form-item-message`,\n\t\t\t\tname,\n\t\t\t}) satisfies FieldContextType,\n\t\t[name, uniqueId]\n\t);\n\n\tconst WrapperElement = withWrapper ? \"div\" : ReactFragment;\n\n\tconst wrapperElementProps = withWrapper && {\n\t\tclassName: cnMerge(\"flex flex-col gap-2\", className),\n\t\t\"data-part\": \"field\",\n\t\t\"data-scope\": \"form\",\n\t\t\"data-slot\": \"form-field\",\n\t\t/* eslint-disable perfectionist/sort-objects -- order of attributes does not matter */\n\t\t\"data-disabled\": dataAttr(isDisabled),\n\t\t\"data-invalid\": dataAttr(isInvalid),\n\t\t/* eslint-enable perfectionist/sort-objects -- order of attributes does not matter */\n\t};\n\treturn (\n\t\t<StrictFormFieldProvider value={fieldContextValue}>\n\t\t\t<LaxFormFieldProvider value={fieldContextValue}>\n\t\t\t\t<WrapperElement {...wrapperElementProps}>{children}</WrapperElement>\n\t\t\t</LaxFormFieldProvider>\n\t\t</StrictFormFieldProvider>\n\t);\n}\n\nexport type FormFieldWithControllerProps<\n\tTFieldValues extends FieldValues,\n\tTName extends FieldPath<TFieldValues>,\n\tTTransformedValues = TFieldValues,\n> = ControllerProps<TFieldValues, TName, TTransformedValues>;\n\nexport function FormFieldWithController<\n\tTFieldValues extends FieldValues,\n\tTName extends FieldPath<TFieldValues>,\n\tTTransformedValues = TFieldValues,\n>(props: FormFieldWithControllerProps<TFieldValues, TName, TTransformedValues>) {\n\tconst methodsContextValue = useFormMethodsContext({ strict: false });\n\n\tconst { control, name, render, ...restOfProps } = props;\n\n\tconst uniqueId = useId();\n\n\tconst fieldContextValue = useMemo(\n\t\t() =>\n\t\t\t({\n\t\t\t\tformDescriptionId: `${name}-(${uniqueId})-form-item-description`,\n\t\t\t\tformItemId: `${name}-(${uniqueId})-form-item`,\n\t\t\t\tformMessageId: `${name}-(${uniqueId})-form-item-message`,\n\t\t\t\tname,\n\t\t\t}) satisfies FieldContextType,\n\t\t[name, uniqueId]\n\t);\n\n\tconst resolvedControl = control ?? methodsContextValue?.control;\n\n\tif (!resolvedControl) {\n\t\tthrow new ContextError(\n\t\t\t\"<Form.FormFieldWithController> must be provided with an explicit 'control' prop or used within <Form.Root>\"\n\t\t);\n\t}\n\n\treturn (\n\t\t<StrictFormFieldProvider value={fieldContextValue}>\n\t\t\t<LaxFormFieldProvider value={fieldContextValue}>\n\t\t\t\t<Controller\n\t\t\t\t\tcontrol={resolvedControl as never}\n\t\t\t\t\tname={name}\n\t\t\t\t\trender={render as never}\n\t\t\t\t\t{...(restOfProps as object)}\n\t\t\t\t/>\n\t\t\t</LaxFormFieldProvider>\n\t\t</StrictFormFieldProvider>\n\t);\n}\n\nexport type FormFieldBoundControllerProps<TFieldValues extends FieldValues, TTransformedValues> = Omit<\n\tControllerProps<TFieldValues, never, TTransformedValues>,\n\t\"control\" | \"name\"\n>;\n\nexport function FormFieldBoundController<\n\tTFieldValues extends FieldValues = Record<string, never>,\n\tTTransformedValues = TFieldValues,\n>(props: FormFieldBoundControllerProps<TFieldValues, TTransformedValues>) {\n\tconst { control } = useFormMethodsContext();\n\tconst { name } = useStrictFormFieldContext();\n\tconst { render, ...restOfProps } = props;\n\n\treturn (\n\t\t<Controller name={name} control={control} render={render as never} {...(restOfProps as object)} />\n\t);\n}\n\nexport type FormFieldContextProps = DiscriminatedRenderProps<\n\t(contextValue: FieldContextType) => React.ReactNode\n>;\n\nexport function FormFieldContext(props: FormFieldContextProps) {\n\tconst { children, render } = props;\n\tconst fieldContextValues = useStrictFormFieldContext();\n\n\tif (typeof children === \"function\") {\n\t\treturn children(fieldContextValues);\n\t}\n\n\treturn render(fieldContextValues);\n}\n\nexport type FormLabelProps = InferProps<\"label\">;\n\nexport function FormLabel(props: FormLabelProps) {\n\tconst fieldContextValues = useStrictFormFieldContext();\n\n\tconst { children, htmlFor, ...restOfProps } = props;\n\n\tconst { isDisabled, isInvalid } = useLaxFormFieldState({ name: fieldContextValues.name });\n\n\treturn (\n\t\t<label\n\t\t\tdata-scope=\"form\"\n\t\t\tdata-part=\"label\"\n\t\t\tdata-slot=\"form-label\"\n\t\t\tdata-disabled={dataAttr(isDisabled)}\n\t\t\tdata-invalid={dataAttr(isInvalid)}\n\t\t\thtmlFor={Object.hasOwn(props, \"htmlFor\") ? htmlFor : fieldContextValues.formItemId}\n\t\t\t{...restOfProps}\n\t\t>\n\t\t\t{children}\n\t\t</label>\n\t);\n}\n\nexport type FormInputGroupProps = InferProps<\"div\">;\n\nexport function FormInputGroup(props: FormInputGroupProps) {\n\tconst { children, className, ...restOfProps } = props;\n\n\tconst { isDisabled, isInvalid } = useLaxFormFieldState();\n\n\tconst {\n\t\tregularChildren,\n\t\tslots: [leftItemSlot, rightItemSlot],\n\t} = getMultipleSlots(children, [FormInputLeftItem, FormInputRightItem]);\n\n\treturn (\n\t\t<div\n\t\t\tdata-scope=\"form\"\n\t\t\tdata-part=\"input-group\"\n\t\t\tdata-slot=\"form-input-group\"\n\t\t\tdata-invalid={dataAttr(isInvalid)}\n\t\t\tdata-disabled={dataAttr(isDisabled)}\n\t\t\tclassName={cnMerge(\"flex items-center justify-between gap-2\", className)}\n\t\t\t{...restOfProps}\n\t\t>\n\t\t\t{leftItemSlot}\n\t\t\t{regularChildren}\n\t\t\t{rightItemSlot}\n\t\t</div>\n\t);\n}\n\nexport type FormSideItemProps = {\n\tchildren?: React.ReactNode;\n\tclassName?: string;\n};\n\nexport function FormInputLeftItem<TElement extends React.ElementType = \"span\">(\n\tprops: PolymorphicPropsStrict<TElement, FormSideItemProps>\n) {\n\tconst { as: Element = \"span\", children, className, ...restOfProps } = props;\n\n\treturn (\n\t\t<Element\n\t\t\tdata-scope=\"form\"\n\t\t\tdata-part=\"left-item\"\n\t\t\tdata-slot=\"form-left-item\"\n\t\t\tclassName={cnMerge(\"inline-flex items-center justify-center\", className)}\n\t\t\t{...restOfProps}\n\t\t>\n\t\t\t{children}\n\t\t</Element>\n\t);\n}\nFormInputLeftItem.slotSymbol = Symbol(\"input-left-item\");\n\nexport function FormInputRightItem<TElement extends React.ElementType = \"span\">(\n\tprops: PolymorphicPropsStrict<TElement, FormSideItemProps>\n) {\n\tconst { as: Element = \"span\", children, className, ...restOfProps } = props;\n\n\treturn (\n\t\t<Element\n\t\t\tdata-scope=\"form\"\n\t\t\tdata-part=\"right-item\"\n\t\t\tdata-slot=\"form-right-item\"\n\t\t\tclassName={cnMerge(\"inline-flex items-center justify-center\", className)}\n\t\t\t{...restOfProps}\n\t\t>\n\t\t\t{children}\n\t\t</Element>\n\t);\n}\nFormInputRightItem.slotSymbol = Symbol(\"input-right-item\");\n\ntype RulesProp = {\n\trules?: RegisterOptions;\n};\n\nexport type FormInputPrimitiveProps<TFieldValues extends FieldValues> = Omit<\n\tInferProps<\"input\">,\n\t\"children\"\n>\n\t& RulesProp & {\n\t\tclassNames?: { error?: string; eyeIcon?: string; input?: string; inputGroup?: string };\n\t\tcontrol?: Control<TFieldValues>;\n\t\tfieldState?: FieldState;\n\t\tname?: FieldPath<TFieldValues>;\n\t\twithEyeIcon?: FormRootContextType[\"withEyeIcon\"];\n\t};\n\nexport type FormTextAreaPrimitiveProps<TFieldValues extends FieldValues> = InferProps<\"textarea\">\n\t& RulesProp & {\n\t\tclassNames?: { base?: string; error?: string };\n\t\tcontrol?: Control<TFieldValues>;\n\t\tfieldState?: FieldState;\n\t\tname?: FieldPath<TFieldValues>;\n\t};\n\nexport type FormSelectPrimitiveProps<TFieldValues extends FieldValues> = InferProps<\"select\">\n\t& RulesProp & {\n\t\tclassNames?: { base?: string; error?: string };\n\t\tcontrol?: Control<TFieldValues>;\n\t\tfieldState?: FieldState;\n\t\tname?: FieldPath<TFieldValues>;\n\t};\n\nconst inputTypesWithoutFullWidth = new Set<React.HTMLInputTypeAttribute>([\"checkbox\", \"radio\"]);\n\nexport function FormInputPrimitive<TFieldValues extends FieldValues>(\n\tprops: FormInputPrimitiveProps<TFieldValues>\n) {\n\tconst fieldContextValues = useLaxFormFieldContext();\n\n\tconst formRootContextValues = useLaxFormRootContext();\n\n\tconst {\n\t\tclassName,\n\t\tclassNames,\n\t\tcontrol,\n\t\tfieldState,\n\t\tid,\n\t\tname,\n\t\trules,\n\t\ttype = \"text\",\n\t\twithEyeIcon,\n\t\t...restOfProps\n\t} = props;\n\n\tconst resolvedWithEyeIcon = withEyeIcon ?? formRootContextValues?.withEyeIcon ?? true;\n\n\tconst fieldStateFromLaxFormField = useLaxFormFieldState({ control, name });\n\n\tconst { isDisabled, isInvalid } = fieldState ?? fieldStateFromLaxFormField;\n\n\tconst [isPasswordVisible, toggleIsPasswordVisible] = useToggle(false);\n\n\tconst shouldHaveEyeIcon = Boolean(resolvedWithEyeIcon) && type === \"password\";\n\n\tconst WrapperElement = shouldHaveEyeIcon ? FormInputGroup : ReactFragment;\n\n\tconst wrapperElementProps =\n\t\tshouldHaveEyeIcon\n\t\t&& ({\n\t\t\tclassName: cnMerge(\"w-full\", classNames?.inputGroup, isInvalid && classNames?.error),\n\t\t} satisfies InferProps<typeof FormInputGroup>);\n\n\tconst { register } = useFormMethodsContext({ strict: false }) ?? {};\n\n\tconst eyeIcon = getEyeIcon({\n\t\tclassNames,\n\t\ticonType: isPasswordVisible ? \"closed\" : \"open\",\n\t\trenderIconProps: { isPasswordVisible },\n\t\twithEyeIcon: resolvedWithEyeIcon,\n\t});\n\n\treturn (\n\t\t<WrapperElement {...wrapperElementProps}>\n\t\t\t<input\n\t\t\t\tdata-slot=\"form-input\"\n\t\t\t\tdata-scope=\"form\"\n\t\t\t\tdata-part=\"input\"\n\t\t\t\taria-describedby={\n\t\t\t\t\t!isInvalid ?\n\t\t\t\t\t\tfieldContextValues?.formDescriptionId\n\t\t\t\t\t:\t`${fieldContextValues?.formDescriptionId} ${fieldContextValues?.formMessageId}`\n\t\t\t\t}\n\t\t\t\taria-invalid={dataAttr(isInvalid)}\n\t\t\t\tdata-invalid={dataAttr(isInvalid)}\n\t\t\t\tdata-disabled={dataAttr(isDisabled)}\n\t\t\t\tid={Object.hasOwn(props, \"id\") ? id : fieldContextValues?.formItemId}\n\t\t\t\tname={Object.hasOwn(props, \"name\") ? name : fieldContextValues?.name}\n\t\t\t\ttype={type === \"password\" && isPasswordVisible ? \"text\" : type}\n\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t!inputTypesWithoutFullWidth.has(type) && \"w-full min-w-0\",\n\t\t\t\t\t`bg-transparent text-sm outline-hidden transition-[color,box-shadow] selection:bg-zu-primary\n\t\t\t\t\tselection:text-zu-primary-foreground file:inline-flex file:h-7 file:border-0\n\t\t\t\t\tfile:bg-transparent file:font-medium file:text-zu-foreground\n\t\t\t\t\tplaceholder:text-zu-muted-foreground focus-visible:outline-hidden\n\t\t\t\t\tdisabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50`,\n\t\t\t\t\tclassName,\n\t\t\t\t\tclassNames?.input,\n\t\t\t\t\ttype !== \"password\" && isInvalid && classNames?.error\n\t\t\t\t)}\n\t\t\t\t{...(Boolean(name) && register?.(name, rules))}\n\t\t\t\t{...restOfProps}\n\t\t\t/>\n\n\t\t\t{shouldHaveEyeIcon && (\n\t\t\t\t<FormInputRightItem\n\t\t\t\t\tas=\"button\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={toggleIsPasswordVisible}\n\t\t\t\t\tclassName=\"size-5 shrink-0 lg:size-6\"\n\t\t\t\t>\n\t\t\t\t\t{eyeIcon}\n\t\t\t\t</FormInputRightItem>\n\t\t\t)}\n\t\t</WrapperElement>\n\t);\n}\n\nexport function FormTextAreaPrimitive<TFieldValues extends FieldValues>(\n\tprops: FormTextAreaPrimitiveProps<TFieldValues>\n) {\n\tconst fieldContextValues = useLaxFormFieldContext();\n\n\tconst { className, classNames, control, fieldState, id, name, rules, ...restOfProps } = props;\n\n\tconst fieldStateFromLaxFormField = useLaxFormFieldState({ control, name });\n\n\tconst { isDisabled, isInvalid } = fieldState ?? fieldStateFromLaxFormField;\n\n\tconst { register } = useFormMethodsContext({ strict: false }) ?? {};\n\n\treturn (\n\t\t<textarea\n\t\t\tdata-slot=\"form-textarea\"\n\t\t\tdata-scope=\"form\"\n\t\t\tdata-part=\"textarea\"\n\t\t\taria-describedby={\n\t\t\t\t!isInvalid ?\n\t\t\t\t\tfieldContextValues?.formDescriptionId\n\t\t\t\t:\t`${fieldContextValues?.formDescriptionId} ${fieldContextValues?.formMessageId}`\n\t\t\t}\n\t\t\taria-invalid={dataAttr(isInvalid)}\n\t\t\tdata-disabled={dataAttr(isDisabled)}\n\t\t\tdata-invalid={dataAttr(isInvalid)}\n\t\t\tid={Object.hasOwn(props, \"id\") ? id : fieldContextValues?.formItemId}\n\t\t\tname={Object.hasOwn(props, \"name\") ? name : fieldContextValues?.name}\n\t\t\tclassName={cnMerge(\n\t\t\t\t`w-full bg-transparent text-sm placeholder:text-zu-muted-foreground\n\t\t\t\tfocus-visible:outline-hidden disabled:cursor-not-allowed disabled:opacity-50`,\n\t\t\t\tclassName,\n\t\t\t\tclassNames?.base,\n\t\t\t\tisInvalid && classNames?.error\n\t\t\t)}\n\t\t\t{...(Boolean(name) && register?.(name, rules))}\n\t\t\t{...restOfProps}\n\t\t/>\n\t);\n}\nexport function FormSelectPrimitive<TFieldValues extends FieldValues>(\n\tprops: FormSelectPrimitiveProps<TFieldValues>\n) {\n\tconst fieldContextValues = useLaxFormFieldContext();\n\n\tconst { className, classNames, control, fieldState, id, name, rules, ...restOfProps } = props;\n\n\tconst fieldStateFromLaxFormField = useLaxFormFieldState({ control, name });\n\n\tconst { isDisabled, isInvalid } = fieldState ?? fieldStateFromLaxFormField;\n\n\tconst { register } = useFormMethodsContext({ strict: false }) ?? {};\n\n\treturn (\n\t\t<select\n\t\t\tdefaultValue=\"\"\n\t\t\tdata-slot=\"form-select\"\n\t\t\tdata-scope=\"form\"\n\t\t\tdata-part=\"select\"\n\t\t\taria-describedby={\n\t\t\t\t!isInvalid ?\n\t\t\t\t\tfieldContextValues?.formDescriptionId\n\t\t\t\t:\t`${fieldContextValues?.formDescriptionId} ${fieldContextValues?.formMessageId}`\n\t\t\t}\n\t\t\taria-invalid={dataAttr(isInvalid)}\n\t\t\tdata-disabled={dataAttr(isDisabled)}\n\t\t\tdata-invalid={dataAttr(isInvalid)}\n\t\t\tid={id ?? fieldContextValues?.formItemId}\n\t\t\tname={name ?? fieldContextValues?.name}\n\t\t\tclassName={cnMerge(\n\t\t\t\t`w-full bg-transparent text-sm placeholder:text-zu-muted-foreground\n\t\t\t\tfocus-visible:outline-hidden disabled:cursor-not-allowed disabled:opacity-50`,\n\t\t\t\tclassName,\n\t\t\t\tclassNames?.base,\n\t\t\t\tisInvalid && classNames?.error\n\t\t\t)}\n\t\t\t{...(Boolean(name) && register?.(name, rules))}\n\t\t\t{...restOfProps}\n\t\t/>\n\t);\n}\n\ntype PrimitivePropsToOmit = \"control\" | \"formState\" | \"name\";\n\nexport type FormInputProps = Omit<FormInputPrimitiveProps<FieldValues>, PrimitivePropsToOmit>;\n\nexport type FormTextAreaProps = Omit<FormTextAreaPrimitiveProps<FieldValues>, PrimitivePropsToOmit>;\n\nexport type FormSelectProps = Omit<FormSelectPrimitiveProps<FieldValues>, PrimitivePropsToOmit>;\n\nexport type FormInputCombinedProps =\n\t| (FormInputProps & { type?: FormInputProps[\"type\"] })\n\t| (FormSelectProps & { type: \"select\" })\n\t| (FormTextAreaProps & { type: \"textarea\" });\n\nconst InputTypeMap = defineEnum({\n\tselect: FormSelectPrimitive,\n\ttextarea: FormTextAreaPrimitive,\n});\n\nexport function FormInput(props: FormInputCombinedProps) {\n\tconst { onBlur, onChange, ref, rules, type, ...restOfProps } = props;\n\n\tconst { name } = useStrictFormFieldContext();\n\tconst { register } = useFormMethodsContext();\n\n\tconst SelectedInput =\n\t\ttype === \"textarea\" || type === \"select\" ?\n\t\t\tInputTypeMap[type as Exclude<typeof type, AnyString>]\n\t\t:\tFormInputPrimitive;\n\n\tconst registerProps = name ? register(name, rules) : null;\n\n\treturn (\n\t\t<SelectedInput\n\t\t\ttype={type}\n\t\t\tname={name}\n\t\t\t{...registerProps}\n\t\t\t{...(restOfProps as NonNullable<unknown>)}\n\t\t\tref={composeRefs(registerProps?.ref, ref)}\n\t\t\tonChange={composeTwoEventHandlers(registerProps?.onChange, onChange)}\n\t\t\tonBlur={composeTwoEventHandlers(registerProps?.onBlur, onBlur)}\n\t\t/>\n\t);\n}\n\nexport function FormTextArea(props: FormTextAreaProps) {\n\treturn <FormInput {...props} type=\"textarea\" />;\n}\n\nexport function FormSelect(props: FormSelectProps) {\n\treturn <FormInput {...props} type=\"select\" />;\n}\n\nexport type FormDescriptionProps = InferProps<\"p\">;\n\nexport function FormDescription<TElement extends React.ElementType = \"p\">(\n\tprops: PolymorphicPropsStrict<TElement, FormDescriptionProps>\n) {\n\tconst { as: Element = \"p\", className, ...restOfProps } = props;\n\n\tconst { formDescriptionId } = useLaxFormFieldContext() ?? {};\n\n\treturn (\n\t\t<Element\n\t\t\tdata-slot=\"form-description\"\n\t\t\tdata-scope=\"form\"\n\t\t\tdata-part=\"description\"\n\t\t\tid={formDescriptionId}\n\t\t\tclassName={cnMerge(\"text-[12px]\", className)}\n\t\t\t{...restOfProps}\n\t\t/>\n\t);\n}\n\ntype ErrorMessageRenderProps = {\n\tclassName: string;\n\t\"data-index\": number;\n\t\"data-part\": \"error-message\";\n\t\"data-scope\": \"form\";\n\t\"data-slot\": \"form-error-message\";\n\tid: string | undefined;\n};\n\ntype ErrorMessageRenderState = {\n\terrorMessage: string;\n\terrorMessageArray: string[];\n\tindex: number;\n};\n\ntype ErrorMessageRenderFn = (context: {\n\tprops: ErrorMessageRenderProps;\n\tstate: ErrorMessageRenderState;\n}) => React.ReactNode;\n\nexport type FormErrorMessagePrimitiveProps<TFieldValues extends FieldValues> =\n\tDiscriminatedRenderItemProps<ErrorMessageRenderFn> & {\n\t\tclassName?: string;\n\t\tclassNames?: {\n\t\t\tcontainer?: string;\n\t\t\terrorMessage?: string;\n\t\t\terrorMessageAnimation?: string;\n\t\t};\n\t\tcontrol?: Control<TFieldValues>; // == Here for type inference of errorField prop\n\t\tdisableErrorAnimation?: boolean;\n\t\tdisableScrollToErrorField?: boolean;\n\t} & (\n\t\t\t| {\n\t\t\t\t\tfieldName: FieldPath<TFieldValues>;\n\t\t\t\t\ttype?: \"regular\";\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tfieldName: string;\n\t\t\t\t\ttype: \"root\";\n\t\t\t }\n\t\t);\n\ntype FormErrorMessagePrimitiveOverloadType = {\n\t<TFieldValues extends FieldValues>(\n\t\tprops: Extract<FormErrorMessagePrimitiveProps<TFieldValues>, { type?: \"regular\" }>\n\t): React.ReactNode;\n\t<TFieldValues extends FieldValues>(\n\t\t// eslint-disable-next-line ts-eslint/unified-signatures -- Using overloads are better because it gives better error messages\n\t\tprops: Extract<FormErrorMessagePrimitiveProps<TFieldValues>, { type: \"root\" }>\n\t): React.ReactNode;\n};\n\nexport const FormErrorMessagePrimitive: FormErrorMessagePrimitiveOverloadType = (props) => {\n\tconst methodsContextValues = useFormMethodsContext({ strict: false });\n\n\tconst {\n\t\tchildren,\n\t\tclassName,\n\t\tclassNames,\n\t\tcontrol,\n\t\tdisableErrorAnimation = false,\n\t\tdisableScrollToErrorField = false,\n\t\tfieldName,\n\t\trenderItem,\n\t\ttype = \"regular\",\n\t} = props;\n\n\tconst resolvedControl = control ?? methodsContextValues?.control;\n\n\tif (!resolvedControl) {\n\t\tthrow new ContextError(\n\t\t\t\"<Form.ErrorMessagePrimitive> must be provided with an explicit 'control' prop or used within <Form.Root>\"\n\t\t);\n\t}\n\n\tconst { errors } = useLaxFormFieldState({\n\t\tcontrol: resolvedControl as never,\n\t\tname: fieldName,\n\t});\n\n\tconst { formMessageId } = useLaxFormFieldContext() ?? {};\n\n\tconst containerRef = useRef<HTMLUListElement>(null);\n\n\tconst errorAnimationClass = classNames?.errorMessageAnimation ?? \"animate-shake\";\n\n\tconst getErrorElements = useCallbackRef(() => containerRef.current?.children ?? []);\n\n\tuseEffect(() => {\n\t\tif (disableErrorAnimation) return;\n\n\t\tif (!errors || Object.keys(errors).length === 0) return;\n\n\t\tconst errorMessageElements = getErrorElements();\n\n\t\tif (errorMessageElements.length === 0) return;\n\n\t\tconst controller = new AbortController();\n\n\t\tfor (const element of errorMessageElements) {\n\t\t\telement.classList.add(errorAnimationClass);\n\n\t\t\tconst onAnimationEnd = () => element.classList.remove(errorAnimationClass);\n\n\t\t\ton(element, \"animationend\", onAnimationEnd, { once: true, signal: controller.signal });\n\t\t}\n\n\t\treturn () => {\n\t\t\tcontroller.abort();\n\t\t};\n\t}, [disableErrorAnimation, errorAnimationClass, errors, getErrorElements]);\n\n\tuseEffect(() => {\n\t\tif (disableScrollToErrorField) return;\n\n\t\tif (!errors || Object.keys(errors).length === 0) return;\n\n\t\tconst errorMessageElements = getErrorElements();\n\n\t\tif (errorMessageElements.length === 0) return;\n\n\t\tconst firstErrorElement = errorMessageElements[0];\n\n\t\tif (!firstErrorElement) return;\n\n\t\t// == Find the input field associated with this error\n\t\tconst inputField = document.querySelector(`[name='${fieldName}']`);\n\n\t\tconst isFocusableInput = inputField?.matches(\n\t\t\t\":is(input, select, textarea, [contenteditable='true'])\"\n\t\t);\n\n\t\t// == Return early if the input field is focusable (Only scrollIntoView for non-focusable fields)\n\t\tif (isFocusableInput) return;\n\n\t\t// == Get the element's position and scroll in one frame\n\t\tconst frameID = requestAnimationFrame(() => {\n\t\t\tconst elementRect = firstErrorElement.getBoundingClientRect();\n\n\t\t\tif (elementRect.top === 0) return;\n\n\t\t\tconst topWithOffset = elementRect.top - 100;\n\n\t\t\twindow.scrollTo({\n\t\t\t\tbehavior: \"smooth\",\n\t\t\t\ttop: window.scrollY + topWithOffset,\n\t\t\t});\n\t\t});\n\n\t\treturn () => {\n\t\t\tcancelAnimationFrame(frameID);\n\t\t};\n\t}, [disableScrollToErrorField, fieldName, errors, getErrorElements]);\n\n\tconst fieldErrorMessage = getFieldErrorMessage({ errors, fieldName, type });\n\n\tif (!fieldErrorMessage) {\n\t\treturn null;\n\t}\n\n\tconst errorMessageArray = toArray(fieldErrorMessage);\n\n\tif (errorMessageArray.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst getRenderProps = (options: { index: number }): ErrorMessageRenderProps => {\n\t\tconst { index } = options;\n\n\t\treturn {\n\t\t\tclassName: cnMerge(className, classNames?.errorMessage),\n\t\t\t/* eslint-disable perfectionist/sort-objects -- Ignore */\n\t\t\t\"data-slot\": \"form-error-message\",\n\t\t\t\"data-part\": \"error-message\",\n\t\t\t\"data-scope\": \"form\",\n\t\t\t\"data-index\": index,\n\t\t\t/* eslint-enable perfectionist/sort-objects -- Ignore */\n\t\t\tid: formMessageId,\n\t\t};\n\t};\n\n\tconst getRenderState = (options: { errorMessage: string; index: number }): ErrorMessageRenderState => {\n\t\tconst { errorMessage, index } = options;\n\n\t\treturn {\n\t\t\terrorMessage,\n\t\t\terrorMessageArray,\n\t\t\tindex,\n\t\t};\n\t};\n\n\tconst selectedChildren = typeof children === \"function\" ? children : renderItem;\n\n\treturn (\n\t\t<ForWithWrapper\n\t\t\tref={containerRef}\n\t\t\tclassName={cnMerge(\"flex flex-col\", classNames?.container)}\n\t\t\tdata-slot=\"form-error-message-container\"\n\t\t\tdata-scope=\"form\"\n\t\t\tdata-part=\"error-message-container\"\n\t\t\teach={errorMessageArray}\n\t\t\trenderItem={(errorMessage, index) => {\n\t\t\t\treturn selectedChildren({\n\t\t\t\t\tprops: getRenderProps({ index }),\n\t\t\t\t\tstate: getRenderState({ errorMessage, index }),\n\t\t\t\t});\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport type FormErrorMessageProps<TControl, TFieldValues extends FieldValues, TTransformedValues> =\n\t| (TControl extends Control<infer TValues> ?\n\t\t\t{\n\t\t\t\tclassName?: string;\n\t\t\t\tcontrol?: never;\n\t\t\t\terrorField?: FieldPath<TValues>;\n\t\t\t\ttype?: \"regular\";\n\t\t\t}\n\t :\t{\n\t\t\t\tclassName?: string;\n\t\t\t\tcontrol?: Control<TFieldValues, unknown, TTransformedValues>; // == Here for type inference of errorField prop\n\t\t\t\terrorField?: FieldPath<TFieldValues>;\n\t\t\t\ttype?: \"regular\";\n\t\t\t})\n\t| {\n\t\t\tclassName?: string;\n\t\t\terrorField: string;\n\t\t\ttype: \"root\";\n\t };\n\nexport function FormErrorMessage<\n\tTControl,\n\tTFieldValues extends FieldValues = FieldValues,\n\tTTransformedValues = TFieldValues,\n>(props: FormErrorMessageProps<TControl, TFieldValues, TTransformedValues>) {\n\tconst fieldContextValues = useLaxFormFieldContext();\n\n\tconst { className, errorField, type = \"regular\" } = props;\n\n\tconst { control } = useFormMethodsContext();\n\n\treturn (\n\t\t<FormErrorMessagePrimitive\n\t\t\ttype={type as \"root\"}\n\t\t\tcontrol={control}\n\t\t\tfieldName={errorField ?? (fieldContextValues?.name as NonNullable<typeof errorField>)}\n\t\t\trenderItem={({ props: renderProps, state }) => (\n\t\t\t\t<li\n\t\t\t\t\tkey={state.errorMessage}\n\t\t\t\t\t{...renderProps}\n\t\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t\t\"text-[13px] text-zu-destructive\",\n\t\t\t\t\t\t\"data-[index=0]:mt-1\",\n\t\t\t\t\t\trenderProps.className,\n\t\t\t\t\t\tclassName\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{state.errorMessage}\n\t\t\t\t</li>\n\t\t\t)}\n\t\t/>\n\t);\n}\n\nexport type FormSubmitProps<TFieldValues extends FieldValues, TTransformedValues> = Omit<\n\tInferProps<\"button\">,\n\t\"children\"\n> & {\n\tasChild?: boolean;\n} & (\n\t\t| {\n\t\t\t\tchildren: React.ReactNode;\n\t\t\t\tcontrol?: never;\n\t\t }\n\t\t| {\n\t\t\t\tchildren: StateSubscribeProps<TFieldValues, TTransformedValues>[\"render\"];\n\t\t\t\tcontrol?: Control<TFieldValues, unknown, TTransformedValues>;\n\t\t }\n\t);\n\nexport function FormSubmit<\n\tTElement extends React.ElementType = \"button\",\n\tTFieldValues extends FieldValues = Record<string, unknown>,\n\tTTransformedValues = TFieldValues,\n>(props: PolymorphicPropsStrict<TElement, FormSubmitProps<TFieldValues, TTransformedValues>>) {\n\tconst { as: Element = \"button\", asChild, children, control, type = \"submit\", ...restOfProps } = props;\n\n\tconst Component = asChild ? Slot.Root : Element;\n\n\treturn (\n\t\t<Component data-slot=\"form-submit\" data-part=\"submit\" data-scope=\"form\" type={type} {...restOfProps}>\n\t\t\t{isFunction(children) ?\n\t\t\t\t<FormStateSubscribe control={control} render={children} />\n\t\t\t:\tchildren}\n\t\t</Component>\n\t);\n}\n\nexport type FormWatchProps<\n\tTFieldValues extends FieldValues,\n\tTFieldName extends\n\t\t| Array<FieldPath<TFieldValues>>\n\t\t| FieldPath<TFieldValues>\n\t\t| ReadonlyArray<FieldPath<TFieldValues>>\n\t\t| undefined,\n\tTTransformedValues,\n\tTComputeValue,\n\tTComputedProps extends Omit<\n\t\tWatchProps<TFieldName, TFieldValues, unknown, TTransformedValues, TComputeValue>,\n\t\t\"names\"\n\t> = Omit<WatchProps<TFieldName, TFieldValues, unknown, TTransformedValues, TComputeValue>, \"names\">,\n> = DiscriminatedRenderProps<TComputedProps[\"render\"]> & Omit<TComputedProps, \"render\">;\n\nexport function FormWatch<\n\tTFieldValues extends FieldValues = Record<string, unknown>,\n\tconst TFieldName extends\n\t\t| Array<FieldPath<TFieldValues>>\n\t\t| FieldPath<TFieldValues>\n\t\t| ReadonlyArray<FieldPath<TFieldValues>>\n\t\t| undefined = FieldPath<TFieldValues>,\n\tTTransformedValues = TFieldValues,\n\tTComputeValue = undefined,\n>(props: FormWatchProps<TFieldValues, TFieldName, TTransformedValues, TComputeValue>) {\n\tconst fieldContextValue = useLaxFormFieldContext();\n\n\tconst { children, compute, control, defaultValue, disabled, exact, name, render } = props;\n\n\tconst methodsContextValue = useFormMethodsContext({ strict: false });\n\n\tconst resolvedControl = control ?? methodsContextValue?.control;\n\n\tif (!resolvedControl) {\n\t\tthrow new ContextError(\n\t\t\t\"<Form.Watch> must be provided with an explicit 'control' prop or used within <Form.Root>\"\n\t\t);\n\t}\n\n\tconst formValue = useWatch({\n\t\tcompute: compute as never,\n\t\tcontrol: resolvedControl as never,\n\t\tdefaultValue,\n\t\tdisabled,\n\t\texact,\n\t\tname: (name ?? fieldContextValue?.name) as string,\n\t}) as unknown;\n\n\tconst selectedChildren = typeof children === \"function\" ? children : render;\n\n\tconst resolvedChildren = selectedChildren(formValue as never);\n\n\treturn resolvedChildren;\n}\n\nexport type FormStateSubscribeProps<\n\tTFieldValues extends FieldValues,\n\tTTransformedValues,\n\tTComputedProps extends StateSubscribeProps<TFieldValues, TTransformedValues> = StateSubscribeProps<\n\t\tTFieldValues,\n\t\tTTransformedValues\n\t>,\n> = DiscriminatedRenderProps<TComputedProps[\"render\"]> & Omit<TComputedProps, \"render\">;\n\nexport function FormStateSubscribe<\n\tTFieldValues extends FieldValues = Record<string, unknown>,\n\tTTransformedValues = TFieldValues,\n>(props: FormStateSubscribeProps<TFieldValues, TTransformedValues>) {\n\tconst fieldContextValues = useLaxFormFieldContext();\n\n\tconst { children, control, disabled, exact, name, render } = props;\n\n\tconst methodsContextValue = useFormMethodsContext({ strict: false });\n\n\tconst resolvedControl = control ?? methodsContextValue?.control;\n\n\tif (!resolvedControl) {\n\t\tthrow new ContextError(\n\t\t\t\"<Form.StateSubscribe> must be provided with an explicit 'control' prop or used within <Form.Root>\"\n\t\t);\n\t}\n\n\tconst formState = useFormState({\n\t\tcontrol: resolvedControl as never,\n\t\tdisabled,\n\t\texact,\n\t\tname: name ?? (fieldContextValues?.name as never),\n\t});\n\n\tconst selectedChildren = typeof children === \"function\" ? children : render;\n\n\tconst resolvedChildren = selectedChildren(formState);\n\n\treturn resolvedChildren;\n}\n\n<FormStateSubscribe>{(formState) => <p>{formState.isValid ? \"Valid\" : \"Invalid\"}</p>}</FormStateSubscribe>;\n","export {\n\tFormDescription as Description,\n\tFormErrorMessage as ErrorMessage,\n\tFormErrorMessagePrimitive as ErrorMessagePrimitive,\n\tFormField as Field,\n\tFormFieldBoundController as FieldBoundController,\n\tFormFieldContext as FieldContext,\n\tFormFieldWithController as FieldWithController,\n\tFormInput as Input,\n\tFormInputGroup as InputGroup,\n\tFormInputLeftItem as InputLeftItem,\n\tFormInputPrimitive as InputPrimitive,\n\tFormInputRightItem as InputRightItem,\n\tFormLabel as Label,\n\tFormRoot as Root,\n\tFormSelect as Select,\n\tFormStateSubscribe as StateSubscribe,\n\tFormSubmit as Submit,\n\tFormTextArea as TextArea,\n\tFormTextAreaPrimitive as TextAreaPrimitive,\n\tFormWatch as Watch,\n} from \"./form\";\n\nexport type {\n\tFormDescriptionProps,\n\tFormErrorMessagePrimitiveProps,\n\tFormErrorMessageProps,\n\tFormFieldBoundControllerProps,\n\tFormFieldContextProps,\n\tFormFieldProps,\n\tFormFieldWithControllerProps,\n\tFormInputCombinedProps,\n\tFormInputGroupProps,\n\tFormInputPrimitiveProps,\n\tFormInputProps,\n\tFormLabelProps,\n\tFormRootProps,\n\tFormSelectPrimitiveProps,\n\tFormSelectProps,\n\tFormSideItemProps,\n\tFormStateSubscribeProps,\n\tFormSubmitProps,\n\tFormTextAreaPrimitiveProps,\n\tFormTextAreaProps,\n\tFormWatchProps,\n} from \"./form\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["useHookFormContext","HookFormProvider","ReactFragment","Slot.Root"],"sources":["../../../../src/components/ui/form/icons.tsx","../../../../src/components/ui/form/utils.ts","../../../../src/components/ui/form/form-context.ts","../../../../src/components/ui/form/form.tsx","../../../../src/components/ui/form/form-parts.ts"],"sourcesContent":["export const EyeIconClosed = (props: React.SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t<path\n\t\t\tfill=\"currentColor\"\n\t\t\td=\"M15.175 8.325q.725.725 1.063 1.65t.237 1.9q0 .375-.275.638t-.65.262t-.638-.262t-.262-.638q.125-.65-.075-1.25T13.95 9.6t-1.025-.65t-1.275-.1q-.375 0-.638-.275t-.262-.65t.263-.637t.637-.263q.95-.1 1.875.238t1.65 1.062M12 6q-.475 0-.925.037t-.9.138q-.425.075-.763-.125t-.462-.6t.088-.775t.612-.45q.575-.125 1.163-.175T12 4q3.425 0 6.263 1.8t4.337 4.85q.1.2.15.413t.05.437t-.038.438t-.137.412q-.45 1-1.112 1.875t-1.463 1.6q-.3.275-.7.225t-.65-.4t-.212-.763t.337-.687q.6-.575 1.1-1.25t.875-1.45q-1.25-2.525-3.613-4.012T12 6m0 13q-3.35 0-6.125-1.812T1.5 12.425q-.125-.2-.187-.437T1.25 11.5t.05-.475t.175-.45q.5-1 1.163-1.912T4.15 7L2.075 4.9q-.275-.3-.262-.712T2.1 3.5t.7-.275t.7.275l17 17q.275.275.288.688t-.288.712q-.275.275-.7.275t-.7-.275l-3.5-3.45q-.875.275-1.775.413T12 19M5.55 8.4q-.725.65-1.325 1.425T3.2 11.5q1.25 2.525 3.613 4.013T12 17q.5 0 .975-.062t.975-.138l-.9-.95q-.275.075-.525.113T12 16q-1.875 0-3.188-1.312T7.5 11.5q0-.275.038-.525t.112-.525zm4.2 4.2\"\n\t\t/>\n\t</svg>\n);\n\nexport const EyeIconOpen = (props: React.SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t<path\n\t\t\tfill=\"currentColor\"\n\t\t\td=\"M12 16q1.875 0 3.188-1.312T16.5 11.5t-1.312-3.187T12 7T8.813 8.313T7.5 11.5t1.313 3.188T12 16m0-1.8q-1.125 0-1.912-.788T9.3 11.5t.788-1.912T12 8.8t1.913.788t.787 1.912t-.787 1.913T12 14.2m0 4.8q-3.35 0-6.113-1.8t-4.362-4.75q-.125-.225-.187-.462t-.063-.488t.063-.488t.187-.462q1.6-2.95 4.363-4.75T12 4t6.113 1.8t4.362 4.75q.125.225.188.463t.062.487t-.062.488t-.188.462q-1.6 2.95-4.362 4.75T12 19m0-2q2.825 0 5.188-1.487T20.8 11.5q-1.25-2.525-3.613-4.012T12 6T6.813 7.488T3.2 11.5q1.25 2.525 3.613 4.013T12 17\"\n\t\t/>\n\t</svg>\n);\n","import { isObject } from \"@zayne-labs/toolkit-type-helpers\";\nimport { createElement } from \"react\";\nimport type { FieldErrors, FieldValues } from \"react-hook-form\";\nimport { cnMerge } from \"@/lib/utils/cn\";\nimport type { FormErrorMessagePrimitiveProps, FormInputProps } from \"./form\";\nimport type { FormRootContextType, RenderIconProps } from \"./form-context\";\nimport { EyeIconClosed, EyeIconOpen } from \"./icons\";\n\nexport const getFieldErrorMessage = (options: {\n\terrors: FieldErrors | undefined;\n\tfieldName: string | undefined;\n\ttype: FormErrorMessagePrimitiveProps<FieldValues>[\"type\"];\n}): string | string[] | null | undefined => {\n\tconst { errors, fieldName, type } = options;\n\n\tif (fieldName === undefined || !errors || Object.keys(errors).length === 0) return;\n\n\tif (type === \"root\") {\n\t\treturn errors.root?.[fieldName]?.message;\n\t}\n\n\t// == Handle nested paths like `notifications.0`\n\tconst pathParts = fieldName.includes(\".\") ? fieldName.split(\".\") : null;\n\n\t// == If there are no path parts, return the error message\n\tif (!pathParts) {\n\t\tconst errorMessage = errors[fieldName]?.message;\n\n\t\treturn errorMessage as string | string[];\n\t}\n\n\tlet extractedError = errors;\n\n\tfor (const part of pathParts) {\n\t\tconst currentError = extractedError[part];\n\n\t\tif (!isObject(currentError)) break;\n\n\t\textractedError = currentError as never;\n\t}\n\n\tconst errorMessage = extractedError.message as unknown as string | string[];\n\n\treturn errorMessage;\n};\n\nexport const getEyeIcon = (options: {\n\tclassNames: FormInputProps[\"classNames\"];\n\ticonType: \"closed\" | \"open\";\n\trenderIconProps: RenderIconProps;\n\twithEyeIcon: FormRootContextType[\"withEyeIcon\"];\n}) => {\n\tconst { classNames, iconType, renderIconProps, withEyeIcon } = options;\n\n\tif (!withEyeIcon) {\n\t\treturn null;\n\t}\n\n\tif (withEyeIcon === true) {\n\t\tconst defaultIconMap = {\n\t\t\tclosed: createElement(EyeIconClosed, {\n\t\t\t\tclassName: cnMerge(\"size-full\", classNames?.eyeIcon),\n\t\t\t}),\n\n\t\t\topen: createElement(EyeIconOpen, {\n\t\t\t\tclassName: cnMerge(\"size-full\", classNames?.eyeIcon),\n\t\t\t}),\n\t\t};\n\n\t\treturn defaultIconMap[iconType];\n\t}\n\n\tif (withEyeIcon.renderIcon) {\n\t\treturn withEyeIcon.renderIcon(renderIconProps);\n\t}\n\n\tif (withEyeIcon[iconType]) {\n\t\treturn withEyeIcon[iconType];\n\t}\n\n\treturn null;\n};\n","import { ContextError, createCustomContext } from \"@zayne-labs/toolkit-react\";\nimport type { UnionDiscriminator } from \"@zayne-labs/toolkit-type-helpers\";\nimport {\n\tuseFormState,\n\tuseFormContext as useHookFormContext,\n\ttype Control,\n\ttype FieldValues,\n\ttype UseFormReturn,\n\ttype UseFormStateReturn,\n} from \"react-hook-form\";\nimport { getFieldErrorMessage } from \"./utils\";\n\nexport type RenderIconProps = {\n\tisPasswordVisible: boolean;\n};\n\ntype EyeIconObject = UnionDiscriminator<\n\t[\n\t\t{ closed: React.ReactNode; open: React.ReactNode },\n\t\t{ renderIcon: (props: RenderIconProps) => React.ReactNode },\n\t]\n>;\n\nexport type FormRootContextType = {\n\twithEyeIcon: boolean | EyeIconObject | undefined;\n};\n\nexport const [LaxFormRootProvider, useLaxFormRootContext] = createCustomContext({\n\tdefaultValue: null as unknown as FormRootContextType,\n\thookName: \"useLaxFormRootContext\",\n\tname: \"LaxFormRootContext\",\n\tproviderName: \"FormRoot\",\n\tstrict: false,\n});\n\nexport type UseFormRootContextResult<TStrict extends boolean = true> =\n\tTStrict extends true ? UseFormReturn : UseFormReturn | null;\n\nexport const useFormMethodsContext = <TStrict extends boolean = true>(\n\toptions: { strict?: TStrict } = {}\n): UseFormRootContextResult<TStrict> => {\n\tconst { strict = true } = options;\n\n\tconst formContext = useHookFormContext();\n\n\t// eslint-disable-next-line ts-eslint/no-unnecessary-condition -- Allow\n\tif (strict && !formContext) {\n\t\tthrow new ContextError(\n\t\t\t`useFormMethodsContext returned \"null\". Did you forget to wrap the necessary components within FormRoot?`\n\t\t);\n\t}\n\n\treturn formContext;\n};\n\nexport type FieldContextType = {\n\tformDescriptionId: `${string}-(${string})-form-item-description`;\n\tformItemId: `${string}-(${string})-form-item`;\n\tformMessageId: `${string}-(${string})-form-item-message`;\n\tname: string;\n};\n\nexport const [StrictFormFieldProvider, useStrictFormFieldContext] = createCustomContext<FieldContextType>({\n\thookName: \"useFormFieldContext\",\n\tname: \"StrictFormFieldContext\",\n\tproviderName: \"FormField\",\n});\n\nexport const [LaxFormFieldProvider, useLaxFormFieldContext] = createCustomContext({\n\tdefaultValue: null as unknown as FieldContextType,\n\thookName: \"useLaxFormFieldContext\",\n\tname: \"LaxFormFieldContext\",\n\tproviderName: \"FormField\",\n\tstrict: false,\n});\n\nexport type FieldState = {\n\terrors?: UseFormStateReturn<FieldValues>[\"errors\"];\n\tisDisabled?: boolean;\n\tisInvalid?: boolean;\n};\n\ntype FieldStateOptions<TFieldValues extends FieldValues, TTransformedValues = TFieldValues> =\n\t| {\n\t\t\tcontrol: Control<TFieldValues, unknown, TTransformedValues> | undefined;\n\t\t\tname?: string;\n\t }\n\t| {\n\t\t\tcontrol?: Control<TFieldValues, unknown, TTransformedValues>;\n\t\t\tname: string | undefined;\n\t };\n\nexport const useLaxFormFieldState = <TFieldValues extends FieldValues, TTransformedValues = TFieldValues>(\n\toptions?: FieldStateOptions<TFieldValues, TTransformedValues>\n): FieldState => {\n\tconst { control } = useFormMethodsContext({ strict: false }) ?? {};\n\tconst { name } = useLaxFormFieldContext() ?? {};\n\n\tconst resolvedControl = control ?? options?.control;\n\n\tconst getFormState =\n\t\t// eslint-disable-next-line react-hooks/hooks -- Ignore\n\t\tresolvedControl ? useFormState : ((() => ({})) as typeof useFormState);\n\n\t// eslint-disable-next-line react-hooks/hooks -- Ignore\n\tconst { disabled, errors } = getFormState({\n\t\tcontrol: resolvedControl as never,\n\t\tname: name ?? options?.name,\n\t});\n\n\tconst errorMessage = getFieldErrorMessage({ errors, fieldName: name, type: \"regular\" });\n\n\treturn {\n\t\terrors,\n\t\tisDisabled: disabled,\n\t\tisInvalid: Boolean(errorMessage),\n\t};\n};\n","\"use client\";\n\nimport { dataAttr, on, toArray } from \"@zayne-labs/toolkit-core\";\nimport { ContextError, useCallbackRef, useCompareValue, useToggle } from \"@zayne-labs/toolkit-react\";\nimport {\n\tcomposeRefs,\n\tcomposeTwoEventHandlers,\n\tgetMultipleSlots,\n\ttype DiscriminatedRenderItemProps,\n\ttype DiscriminatedRenderProps,\n\ttype InferProps,\n\ttype PolymorphicPropsStrict,\n} from \"@zayne-labs/toolkit-react/utils\";\nimport { defineEnum, isFunction, type AnyString } from \"@zayne-labs/toolkit-type-helpers\";\nimport { Fragment as ReactFragment, useEffect, useId, useMemo, useRef } from \"react\";\nimport {\n\tController,\n\tFormProvider as HookFormProvider,\n\tuseFormState,\n\tuseWatch,\n\ttype Control,\n\ttype ControllerProps,\n\ttype FieldPath,\n\ttype FieldValues,\n\ttype RegisterOptions,\n\ttype FormStateSubscribeProps as StateSubscribeProps,\n\ttype UseFormReturn,\n\ttype WatchProps,\n} from \"react-hook-form\";\nimport { ForWithWrapper } from \"@/components/common/for\";\nimport { Slot } from \"@/components/common/slot\";\nimport { cnMerge } from \"@/lib/utils/cn\";\nimport {\n\tLaxFormFieldProvider,\n\tLaxFormRootProvider,\n\tStrictFormFieldProvider,\n\tuseFormMethodsContext,\n\tuseLaxFormFieldContext,\n\tuseLaxFormFieldState,\n\tuseLaxFormRootContext,\n\tuseStrictFormFieldContext,\n\ttype FieldContextType,\n\ttype FieldState,\n\ttype FormRootContextType,\n} from \"./form-context\";\nimport { getEyeIcon, getFieldErrorMessage } from \"./utils\";\n\nexport type FormRootProps<TFieldValues extends FieldValues, TTransformedValues> = InferProps<\"form\">\n\t& Partial<FormRootContextType> & {\n\t\tchildren: React.ReactNode;\n\t\tform: UseFormReturn<TFieldValues, unknown, TTransformedValues>;\n\t};\n\nexport function FormRoot<TFieldValues extends FieldValues, TTransformedValues = TFieldValues>(\n\tprops: FormRootProps<TFieldValues, TTransformedValues>\n) {\n\tconst { children, className, form, withEyeIcon, ...restOfProps } = props;\n\n\tconst shallowedComparedWithEyeIcon = useCompareValue(withEyeIcon);\n\n\tconst formContextValue = useMemo(\n\t\t() => ({ withEyeIcon: shallowedComparedWithEyeIcon }),\n\t\t[shallowedComparedWithEyeIcon]\n\t);\n\n\treturn (\n\t\t<HookFormProvider {...form}>\n\t\t\t<LaxFormRootProvider value={formContextValue}>\n\t\t\t\t<form\n\t\t\t\t\tclassName={cnMerge(\"flex flex-col\", className)}\n\t\t\t\t\t{...restOfProps}\n\t\t\t\t\tdata-scope=\"form\"\n\t\t\t\t\tdata-part=\"root\"\n\t\t\t\t\tdata-slot=\"form-root\"\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</form>\n\t\t\t</LaxFormRootProvider>\n\t\t</HookFormProvider>\n\t);\n}\n\nexport type FormFieldProps<\n\tTControl,\n\tTFieldValues extends FieldValues,\n\tTTransformedValues,\n> = (TControl extends Control<infer TValues> ?\n\t{\n\t\tcontrol?: never;\n\t\tname: FieldPath<TValues>;\n\t}\n:\t{\n\t\tcontrol?: Control<TFieldValues, unknown, TTransformedValues>;\n\t\tname: FieldPath<TFieldValues>;\n\t})\n\t& (\n\t\t| (InferProps<\"div\"> & { withWrapper?: true })\n\t\t| { children: React.ReactNode; className?: never; withWrapper: false }\n\t);\n\nexport function FormField<\n\tTControl,\n\tTFieldValues extends FieldValues = FieldValues,\n\tTTransformedValues = TFieldValues,\n>(props: FormFieldProps<TControl, TFieldValues, TTransformedValues>) {\n\tconst { children, className, control, name, withWrapper = true } = props;\n\n\tconst { isDisabled, isInvalid } = useLaxFormFieldState({ control, name });\n\n\tconst uniqueId = useId();\n\n\tconst fieldContextValue = useMemo(\n\t\t() =>\n\t\t\t({\n\t\t\t\tformDescriptionId: `${name}-(${uniqueId})-form-item-description`,\n\t\t\t\tformItemId: `${name}-(${uniqueId})-form-item`,\n\t\t\t\tformMessageId: `${name}-(${uniqueId})-form-item-message`,\n\t\t\t\tname,\n\t\t\t}) satisfies FieldContextType,\n\t\t[name, uniqueId]\n\t);\n\n\tconst WrapperElement = withWrapper ? \"div\" : ReactFragment;\n\n\tconst wrapperElementProps = withWrapper && {\n\t\tclassName: cnMerge(\"flex flex-col gap-2\", className),\n\t\t\"data-part\": \"field\",\n\t\t\"data-scope\": \"form\",\n\t\t\"data-slot\": \"form-field\",\n\t\t/* eslint-disable perfectionist/sort-objects -- order of attributes does not matter */\n\t\t\"data-disabled\": dataAttr(isDisabled),\n\t\t\"data-invalid\": dataAttr(isInvalid),\n\t\t/* eslint-enable perfectionist/sort-objects -- order of attributes does not matter */\n\t};\n\treturn (\n\t\t<StrictFormFieldProvider value={fieldContextValue}>\n\t\t\t<LaxFormFieldProvider value={fieldContextValue}>\n\t\t\t\t<WrapperElement {...wrapperElementProps}>{children}</WrapperElement>\n\t\t\t</LaxFormFieldProvider>\n\t\t</StrictFormFieldProvider>\n\t);\n}\n\nexport type FormFieldWithControllerProps<\n\tTFieldValues extends FieldValues,\n\tTName extends FieldPath<TFieldValues>,\n\tTTransformedValues = TFieldValues,\n> = ControllerProps<TFieldValues, TName, TTransformedValues>;\n\nexport function FormFieldWithController<\n\tTFieldValues extends FieldValues,\n\tTName extends FieldPath<TFieldValues>,\n\tTTransformedValues = TFieldValues,\n>(props: FormFieldWithControllerProps<TFieldValues, TName, TTransformedValues>) {\n\tconst methodsContextValue = useFormMethodsContext({ strict: false });\n\n\tconst { control, name, render, ...restOfProps } = props;\n\n\tconst uniqueId = useId();\n\n\tconst fieldContextValue = useMemo(\n\t\t() =>\n\t\t\t({\n\t\t\t\tformDescriptionId: `${name}-(${uniqueId})-form-item-description`,\n\t\t\t\tformItemId: `${name}-(${uniqueId})-form-item`,\n\t\t\t\tformMessageId: `${name}-(${uniqueId})-form-item-message`,\n\t\t\t\tname,\n\t\t\t}) satisfies FieldContextType,\n\t\t[name, uniqueId]\n\t);\n\n\tconst resolvedControl = control ?? methodsContextValue?.control;\n\n\tif (!resolvedControl) {\n\t\tthrow new ContextError(\n\t\t\t\"<Form.FormFieldWithController> must be provided with an explicit 'control' prop or used within <Form.Root>\"\n\t\t);\n\t}\n\n\treturn (\n\t\t<StrictFormFieldProvider value={fieldContextValue}>\n\t\t\t<LaxFormFieldProvider value={fieldContextValue}>\n\t\t\t\t<Controller\n\t\t\t\t\tcontrol={resolvedControl as never}\n\t\t\t\t\tname={name}\n\t\t\t\t\trender={render as never}\n\t\t\t\t\t{...(restOfProps as object)}\n\t\t\t\t/>\n\t\t\t</LaxFormFieldProvider>\n\t\t</StrictFormFieldProvider>\n\t);\n}\n\nexport type FormFieldBoundControllerProps<TFieldValues extends FieldValues, TTransformedValues> = Omit<\n\tControllerProps<TFieldValues, never, TTransformedValues>,\n\t\"control\" | \"name\"\n>;\n\nexport function FormFieldBoundController<\n\tTFieldValues extends FieldValues = Record<string, never>,\n\tTTransformedValues = TFieldValues,\n>(props: FormFieldBoundControllerProps<TFieldValues, TTransformedValues>) {\n\tconst { control } = useFormMethodsContext();\n\tconst { name } = useStrictFormFieldContext();\n\tconst { render, ...restOfProps } = props;\n\n\treturn (\n\t\t<Controller name={name} control={control} render={render as never} {...(restOfProps as object)} />\n\t);\n}\n\nexport type FormFieldContextProps = DiscriminatedRenderProps<\n\t(contextValue: FieldContextType) => React.ReactNode\n>;\n\nexport function FormFieldContext(props: FormFieldContextProps) {\n\tconst { children, render } = props;\n\tconst fieldContextValues = useStrictFormFieldContext();\n\n\tif (typeof children === \"function\") {\n\t\treturn children(fieldContextValues);\n\t}\n\n\treturn render(fieldContextValues);\n}\n\nexport type FormLabelProps = InferProps<\"label\">;\n\nexport function FormLabel(props: FormLabelProps) {\n\tconst fieldContextValues = useStrictFormFieldContext();\n\n\tconst { children, htmlFor, ...restOfProps } = props;\n\n\tconst { isDisabled, isInvalid } = useLaxFormFieldState({ name: fieldContextValues.name });\n\n\treturn (\n\t\t<label\n\t\t\tdata-scope=\"form\"\n\t\t\tdata-part=\"label\"\n\t\t\tdata-slot=\"form-label\"\n\t\t\tdata-disabled={dataAttr(isDisabled)}\n\t\t\tdata-invalid={dataAttr(isInvalid)}\n\t\t\thtmlFor={Object.hasOwn(props, \"htmlFor\") ? htmlFor : fieldContextValues.formItemId}\n\t\t\t{...restOfProps}\n\t\t>\n\t\t\t{children}\n\t\t</label>\n\t);\n}\n\nexport type FormInputGroupProps = InferProps<\"div\">;\n\nexport function FormInputGroup(props: FormInputGroupProps) {\n\tconst { children, className, ...restOfProps } = props;\n\n\tconst { isDisabled, isInvalid } = useLaxFormFieldState();\n\n\tconst {\n\t\tregularChildren,\n\t\tslots: [leftItemSlot, rightItemSlot],\n\t} = getMultipleSlots(children, [FormInputLeftItem, FormInputRightItem]);\n\n\treturn (\n\t\t<div\n\t\t\tdata-scope=\"form\"\n\t\t\tdata-part=\"input-group\"\n\t\t\tdata-slot=\"form-input-group\"\n\t\t\tdata-invalid={dataAttr(isInvalid)}\n\t\t\tdata-disabled={dataAttr(isDisabled)}\n\t\t\tclassName={cnMerge(\"flex items-center justify-between gap-2\", className)}\n\t\t\t{...restOfProps}\n\t\t>\n\t\t\t{leftItemSlot}\n\t\t\t{regularChildren}\n\t\t\t{rightItemSlot}\n\t\t</div>\n\t);\n}\n\nexport type FormSideItemProps = {\n\tchildren?: React.ReactNode;\n\tclassName?: string;\n};\n\nexport function FormInputLeftItem<TElement extends React.ElementType = \"span\">(\n\tprops: PolymorphicPropsStrict<TElement, FormSideItemProps>\n) {\n\tconst { as: Element = \"span\", children, className, ...restOfProps } = props;\n\n\treturn (\n\t\t<Element\n\t\t\tdata-scope=\"form\"\n\t\t\tdata-part=\"left-item\"\n\t\t\tdata-slot=\"form-left-item\"\n\t\t\tclassName={cnMerge(\"inline-flex items-center justify-center\", className)}\n\t\t\t{...restOfProps}\n\t\t>\n\t\t\t{children}\n\t\t</Element>\n\t);\n}\nFormInputLeftItem.slotSymbol = Symbol(\"input-left-item\");\n\nexport function FormInputRightItem<TElement extends React.ElementType = \"span\">(\n\tprops: PolymorphicPropsStrict<TElement, FormSideItemProps>\n) {\n\tconst { as: Element = \"span\", children, className, ...restOfProps } = props;\n\n\treturn (\n\t\t<Element\n\t\t\tdata-scope=\"form\"\n\t\t\tdata-part=\"right-item\"\n\t\t\tdata-slot=\"form-right-item\"\n\t\t\tclassName={cnMerge(\"inline-flex items-center justify-center\", className)}\n\t\t\t{...restOfProps}\n\t\t>\n\t\t\t{children}\n\t\t</Element>\n\t);\n}\nFormInputRightItem.slotSymbol = Symbol(\"input-right-item\");\n\ntype RulesProp = {\n\trules?: RegisterOptions;\n};\n\nexport type FormInputPrimitiveProps<TFieldValues extends FieldValues> = Omit<\n\tInferProps<\"input\">,\n\t\"children\"\n>\n\t& RulesProp & {\n\t\tclassNames?: { error?: string; eyeIcon?: string; input?: string; inputGroup?: string };\n\t\tcontrol?: Control<TFieldValues>;\n\t\tfieldState?: FieldState;\n\t\tname?: FieldPath<TFieldValues>;\n\t\twithEyeIcon?: FormRootContextType[\"withEyeIcon\"];\n\t};\n\nexport type FormTextAreaPrimitiveProps<TFieldValues extends FieldValues> = InferProps<\"textarea\">\n\t& RulesProp & {\n\t\tclassNames?: { base?: string; error?: string };\n\t\tcontrol?: Control<TFieldValues>;\n\t\tfieldState?: FieldState;\n\t\tname?: FieldPath<TFieldValues>;\n\t};\n\nexport type FormSelectPrimitiveProps<TFieldValues extends FieldValues> = InferProps<\"select\">\n\t& RulesProp & {\n\t\tclassNames?: { base?: string; error?: string };\n\t\tcontrol?: Control<TFieldValues>;\n\t\tfieldState?: FieldState;\n\t\tname?: FieldPath<TFieldValues>;\n\t};\n\nconst inputTypesWithoutFullWidth = new Set<React.HTMLInputTypeAttribute>([\"checkbox\", \"radio\"]);\n\nexport function FormInputPrimitive<TFieldValues extends FieldValues>(\n\tprops: FormInputPrimitiveProps<TFieldValues>\n) {\n\tconst fieldContextValues = useLaxFormFieldContext();\n\n\tconst formRootContextValues = useLaxFormRootContext();\n\n\tconst {\n\t\tclassName,\n\t\tclassNames,\n\t\tcontrol,\n\t\tfieldState,\n\t\tid,\n\t\tname,\n\t\trules,\n\t\ttype = \"text\",\n\t\twithEyeIcon,\n\t\t...restOfProps\n\t} = props;\n\n\tconst resolvedWithEyeIcon = withEyeIcon ?? formRootContextValues?.withEyeIcon ?? true;\n\n\tconst fieldStateFromLaxFormField = useLaxFormFieldState({ control, name });\n\n\tconst { isDisabled, isInvalid } = fieldState ?? fieldStateFromLaxFormField;\n\n\tconst [isPasswordVisible, toggleIsPasswordVisible] = useToggle(false);\n\n\tconst shouldHaveEyeIcon = Boolean(resolvedWithEyeIcon) && type === \"password\";\n\n\tconst WrapperElement = shouldHaveEyeIcon ? FormInputGroup : ReactFragment;\n\n\tconst wrapperElementProps =\n\t\tshouldHaveEyeIcon\n\t\t&& ({\n\t\t\tclassName: cnMerge(\"w-full\", classNames?.inputGroup, isInvalid && classNames?.error),\n\t\t} satisfies InferProps<typeof FormInputGroup>);\n\n\tconst { register } = useFormMethodsContext({ strict: false }) ?? {};\n\n\tconst eyeIcon = getEyeIcon({\n\t\tclassNames,\n\t\ticonType: isPasswordVisible ? \"closed\" : \"open\",\n\t\trenderIconProps: { isPasswordVisible },\n\t\twithEyeIcon: resolvedWithEyeIcon,\n\t});\n\n\treturn (\n\t\t<WrapperElement {...wrapperElementProps}>\n\t\t\t<input\n\t\t\t\tdata-slot=\"form-input\"\n\t\t\t\tdata-scope=\"form\"\n\t\t\t\tdata-part=\"input\"\n\t\t\t\taria-describedby={\n\t\t\t\t\t!isInvalid ?\n\t\t\t\t\t\tfieldContextValues?.formDescriptionId\n\t\t\t\t\t:\t`${fieldContextValues?.formDescriptionId} ${fieldContextValues?.formMessageId}`\n\t\t\t\t}\n\t\t\t\taria-invalid={dataAttr(isInvalid)}\n\t\t\t\tdata-invalid={dataAttr(isInvalid)}\n\t\t\t\tdata-disabled={dataAttr(isDisabled)}\n\t\t\t\tid={Object.hasOwn(props, \"id\") ? id : fieldContextValues?.formItemId}\n\t\t\t\tname={Object.hasOwn(props, \"name\") ? name : fieldContextValues?.name}\n\t\t\t\ttype={type === \"password\" && isPasswordVisible ? \"text\" : type}\n\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t!inputTypesWithoutFullWidth.has(type) && \"w-full min-w-0\",\n\t\t\t\t\t`bg-transparent text-sm outline-hidden transition-[color,box-shadow] selection:bg-zu-primary\n\t\t\t\t\tselection:text-zu-primary-foreground file:inline-flex file:h-7 file:border-0\n\t\t\t\t\tfile:bg-transparent file:font-medium file:text-zu-foreground\n\t\t\t\t\tplaceholder:text-zu-muted-foreground focus-visible:outline-hidden\n\t\t\t\t\tdisabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50`,\n\t\t\t\t\tclassName,\n\t\t\t\t\tclassNames?.input,\n\t\t\t\t\ttype !== \"password\" && isInvalid && classNames?.error\n\t\t\t\t)}\n\t\t\t\t{...(Boolean(name) && register?.(name, rules))}\n\t\t\t\t{...restOfProps}\n\t\t\t/>\n\n\t\t\t{shouldHaveEyeIcon && (\n\t\t\t\t<FormInputRightItem\n\t\t\t\t\tas=\"button\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={toggleIsPasswordVisible}\n\t\t\t\t\tclassName=\"size-5 shrink-0 lg:size-6\"\n\t\t\t\t>\n\t\t\t\t\t{eyeIcon}\n\t\t\t\t</FormInputRightItem>\n\t\t\t)}\n\t\t</WrapperElement>\n\t);\n}\n\nexport function FormTextAreaPrimitive<TFieldValues extends FieldValues>(\n\tprops: FormTextAreaPrimitiveProps<TFieldValues>\n) {\n\tconst fieldContextValues = useLaxFormFieldContext();\n\n\tconst { className, classNames, control, fieldState, id, name, rules, ...restOfProps } = props;\n\n\tconst fieldStateFromLaxFormField = useLaxFormFieldState({ control, name });\n\n\tconst { isDisabled, isInvalid } = fieldState ?? fieldStateFromLaxFormField;\n\n\tconst { register } = useFormMethodsContext({ strict: false }) ?? {};\n\n\treturn (\n\t\t<textarea\n\t\t\tdata-slot=\"form-textarea\"\n\t\t\tdata-scope=\"form\"\n\t\t\tdata-part=\"textarea\"\n\t\t\taria-describedby={\n\t\t\t\t!isInvalid ?\n\t\t\t\t\tfieldContextValues?.formDescriptionId\n\t\t\t\t:\t`${fieldContextValues?.formDescriptionId} ${fieldContextValues?.formMessageId}`\n\t\t\t}\n\t\t\taria-invalid={dataAttr(isInvalid)}\n\t\t\tdata-disabled={dataAttr(isDisabled)}\n\t\t\tdata-invalid={dataAttr(isInvalid)}\n\t\t\tid={Object.hasOwn(props, \"id\") ? id : fieldContextValues?.formItemId}\n\t\t\tname={Object.hasOwn(props, \"name\") ? name : fieldContextValues?.name}\n\t\t\tclassName={cnMerge(\n\t\t\t\t`w-full bg-transparent text-sm placeholder:text-zu-muted-foreground\n\t\t\t\tfocus-visible:outline-hidden disabled:cursor-not-allowed disabled:opacity-50`,\n\t\t\t\tclassName,\n\t\t\t\tclassNames?.base,\n\t\t\t\tisInvalid && classNames?.error\n\t\t\t)}\n\t\t\t{...(Boolean(name) && register?.(name, rules))}\n\t\t\t{...restOfProps}\n\t\t/>\n\t);\n}\nexport function FormSelectPrimitive<TFieldValues extends FieldValues>(\n\tprops: FormSelectPrimitiveProps<TFieldValues>\n) {\n\tconst fieldContextValues = useLaxFormFieldContext();\n\n\tconst { className, classNames, control, fieldState, id, name, rules, ...restOfProps } = props;\n\n\tconst fieldStateFromLaxFormField = useLaxFormFieldState({ control, name });\n\n\tconst { isDisabled, isInvalid } = fieldState ?? fieldStateFromLaxFormField;\n\n\tconst { register } = useFormMethodsContext({ strict: false }) ?? {};\n\n\treturn (\n\t\t<select\n\t\t\tdefaultValue=\"\"\n\t\t\tdata-slot=\"form-select\"\n\t\t\tdata-scope=\"form\"\n\t\t\tdata-part=\"select\"\n\t\t\taria-describedby={\n\t\t\t\t!isInvalid ?\n\t\t\t\t\tfieldContextValues?.formDescriptionId\n\t\t\t\t:\t`${fieldContextValues?.formDescriptionId} ${fieldContextValues?.formMessageId}`\n\t\t\t}\n\t\t\taria-invalid={dataAttr(isInvalid)}\n\t\t\tdata-disabled={dataAttr(isDisabled)}\n\t\t\tdata-invalid={dataAttr(isInvalid)}\n\t\t\tid={id ?? fieldContextValues?.formItemId}\n\t\t\tname={name ?? fieldContextValues?.name}\n\t\t\tclassName={cnMerge(\n\t\t\t\t`w-full bg-transparent text-sm placeholder:text-zu-muted-foreground\n\t\t\t\tfocus-visible:outline-hidden disabled:cursor-not-allowed disabled:opacity-50`,\n\t\t\t\tclassName,\n\t\t\t\tclassNames?.base,\n\t\t\t\tisInvalid && classNames?.error\n\t\t\t)}\n\t\t\t{...(Boolean(name) && register?.(name, rules))}\n\t\t\t{...restOfProps}\n\t\t/>\n\t);\n}\n\ntype PrimitivePropsToOmit = \"control\" | \"formState\" | \"name\";\n\nexport type FormInputProps = Omit<FormInputPrimitiveProps<FieldValues>, PrimitivePropsToOmit>;\n\nexport type FormTextAreaProps = Omit<FormTextAreaPrimitiveProps<FieldValues>, PrimitivePropsToOmit>;\n\nexport type FormSelectProps = Omit<FormSelectPrimitiveProps<FieldValues>, PrimitivePropsToOmit>;\n\nexport type FormInputCombinedProps =\n\t| (FormInputProps & { type?: FormInputProps[\"type\"] })\n\t| (FormSelectProps & { type: \"select\" })\n\t| (FormTextAreaProps & { type: \"textarea\" });\n\nconst InputTypeMap = defineEnum({\n\tselect: FormSelectPrimitive,\n\ttextarea: FormTextAreaPrimitive,\n});\n\nexport function FormInput(props: FormInputCombinedProps) {\n\tconst { onBlur, onChange, ref, rules, type, ...restOfProps } = props;\n\n\tconst { name } = useStrictFormFieldContext();\n\tconst { register } = useFormMethodsContext();\n\n\tconst SelectedInput =\n\t\ttype === \"textarea\" || type === \"select\" ?\n\t\t\tInputTypeMap[type as Exclude<typeof type, AnyString>]\n\t\t:\tFormInputPrimitive;\n\n\tconst registerProps = name ? register(name, rules) : null;\n\n\treturn (\n\t\t<SelectedInput\n\t\t\ttype={type}\n\t\t\tname={name}\n\t\t\t{...registerProps}\n\t\t\t{...(restOfProps as NonNullable<unknown>)}\n\t\t\t// eslint-disable-next-line react/refs -- Ignore\n\t\t\tref={composeRefs(registerProps?.ref, ref)}\n\t\t\tonChange={composeTwoEventHandlers(registerProps?.onChange, onChange)}\n\t\t\tonBlur={composeTwoEventHandlers(registerProps?.onBlur, onBlur)}\n\t\t/>\n\t);\n}\n\nexport function FormTextArea(props: FormTextAreaProps) {\n\treturn <FormInput {...props} type=\"textarea\" />;\n}\n\nexport function FormSelect(props: FormSelectProps) {\n\treturn <FormInput {...props} type=\"select\" />;\n}\n\nexport type FormDescriptionProps = InferProps<\"p\">;\n\nexport function FormDescription<TElement extends React.ElementType = \"p\">(\n\tprops: PolymorphicPropsStrict<TElement, FormDescriptionProps>\n) {\n\tconst { as: Element = \"p\", className, ...restOfProps } = props;\n\n\tconst { formDescriptionId } = useLaxFormFieldContext() ?? {};\n\n\treturn (\n\t\t<Element\n\t\t\tdata-slot=\"form-description\"\n\t\t\tdata-scope=\"form\"\n\t\t\tdata-part=\"description\"\n\t\t\tid={formDescriptionId}\n\t\t\tclassName={cnMerge(\"text-[12px]\", className)}\n\t\t\t{...restOfProps}\n\t\t/>\n\t);\n}\n\ntype ErrorMessageRenderProps = {\n\tclassName: string;\n\t\"data-index\": number;\n\t\"data-part\": \"error-message\";\n\t\"data-scope\": \"form\";\n\t\"data-slot\": \"form-error-message\";\n\tid: string | undefined;\n};\n\ntype ErrorMessageRenderState = {\n\terrorMessage: string;\n\terrorMessageArray: string[];\n\tindex: number;\n};\n\ntype ErrorMessageRenderFn = (context: {\n\tprops: ErrorMessageRenderProps;\n\tstate: ErrorMessageRenderState;\n}) => React.ReactNode;\n\nexport type FormErrorMessagePrimitiveProps<TFieldValues extends FieldValues> =\n\tDiscriminatedRenderItemProps<ErrorMessageRenderFn> & {\n\t\tclassName?: string;\n\t\tclassNames?: {\n\t\t\tcontainer?: string;\n\t\t\terrorMessage?: string;\n\t\t\terrorMessageAnimation?: string;\n\t\t};\n\t\tcontrol?: Control<TFieldValues>; // == Here for type inference of errorField prop\n\t\tdisableErrorAnimation?: boolean;\n\t\tdisableScrollToErrorField?: boolean;\n\t} & (\n\t\t\t| {\n\t\t\t\t\tfieldName: FieldPath<TFieldValues>;\n\t\t\t\t\ttype?: \"regular\";\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tfieldName: string;\n\t\t\t\t\ttype: \"root\";\n\t\t\t }\n\t\t);\n\ntype FormErrorMessagePrimitiveOverloadType = {\n\t<TFieldValues extends FieldValues>(\n\t\tprops: Extract<FormErrorMessagePrimitiveProps<TFieldValues>, { type?: \"regular\" }>\n\t): React.ReactNode;\n\t<TFieldValues extends FieldValues>(\n\t\t// eslint-disable-next-line ts-eslint/unified-signatures -- Using overloads are better because it gives better error messages\n\t\tprops: Extract<FormErrorMessagePrimitiveProps<TFieldValues>, { type: \"root\" }>\n\t): React.ReactNode;\n};\n\nexport const FormErrorMessagePrimitive: FormErrorMessagePrimitiveOverloadType = (props) => {\n\tconst methodsContextValues = useFormMethodsContext({ strict: false });\n\n\tconst {\n\t\tchildren,\n\t\tclassName,\n\t\tclassNames,\n\t\tcontrol,\n\t\tdisableErrorAnimation = false,\n\t\tdisableScrollToErrorField = false,\n\t\tfieldName,\n\t\trenderItem,\n\t\ttype = \"regular\",\n\t} = props;\n\n\tconst resolvedControl = control ?? methodsContextValues?.control;\n\n\tif (!resolvedControl) {\n\t\tthrow new ContextError(\n\t\t\t\"<Form.ErrorMessagePrimitive> must be provided with an explicit 'control' prop or used within <Form.Root>\"\n\t\t);\n\t}\n\n\tconst { errors } = useLaxFormFieldState({\n\t\tcontrol: resolvedControl as never,\n\t\tname: fieldName,\n\t});\n\n\tconst { formMessageId } = useLaxFormFieldContext() ?? {};\n\n\tconst containerRef = useRef<HTMLUListElement>(null);\n\n\tconst errorAnimationClass = classNames?.errorMessageAnimation ?? \"animate-shake\";\n\n\tconst getErrorElements = useCallbackRef(() => containerRef.current?.children ?? []);\n\n\tuseEffect(() => {\n\t\tif (disableErrorAnimation) return;\n\n\t\tif (!errors || Object.keys(errors).length === 0) return;\n\n\t\tconst errorMessageElements = getErrorElements();\n\n\t\tif (errorMessageElements.length === 0) return;\n\n\t\tconst controller = new AbortController();\n\n\t\tfor (const element of errorMessageElements) {\n\t\t\telement.classList.add(errorAnimationClass);\n\n\t\t\tconst onAnimationEnd = () => element.classList.remove(errorAnimationClass);\n\n\t\t\ton(element, \"animationend\", onAnimationEnd, { once: true, signal: controller.signal });\n\t\t}\n\n\t\treturn () => {\n\t\t\tcontroller.abort();\n\t\t};\n\t}, [disableErrorAnimation, errorAnimationClass, errors, getErrorElements]);\n\n\tuseEffect(() => {\n\t\tif (disableScrollToErrorField) return;\n\n\t\tif (!errors || Object.keys(errors).length === 0) return;\n\n\t\tconst errorMessageElements = getErrorElements();\n\n\t\tif (errorMessageElements.length === 0) return;\n\n\t\tconst firstErrorElement = errorMessageElements[0];\n\n\t\tif (!firstErrorElement) return;\n\n\t\t// == Find the input field associated with this error\n\t\tconst inputField = document.querySelector(`[name='${fieldName}']`);\n\n\t\tconst isFocusableInput = inputField?.matches(\n\t\t\t\":is(input, select, textarea, [contenteditable='true'])\"\n\t\t);\n\n\t\t// == Return early if the input field is focusable (Only scrollIntoView for non-focusable fields)\n\t\tif (isFocusableInput) return;\n\n\t\t// == Get the element's position and scroll in one frame\n\t\tconst frameID = requestAnimationFrame(() => {\n\t\t\tconst elementRect = firstErrorElement.getBoundingClientRect();\n\n\t\t\tif (elementRect.top === 0) return;\n\n\t\t\tconst topWithOffset = elementRect.top - 100;\n\n\t\t\twindow.scrollTo({\n\t\t\t\tbehavior: \"smooth\",\n\t\t\t\ttop: window.scrollY + topWithOffset,\n\t\t\t});\n\t\t});\n\n\t\treturn () => {\n\t\t\tcancelAnimationFrame(frameID);\n\t\t};\n\t}, [disableScrollToErrorField, fieldName, errors, getErrorElements]);\n\n\tconst fieldErrorMessage = getFieldErrorMessage({ errors, fieldName, type });\n\n\tif (!fieldErrorMessage) {\n\t\treturn null;\n\t}\n\n\tconst errorMessageArray = toArray(fieldErrorMessage);\n\n\tif (errorMessageArray.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst getRenderProps = (options: { index: number }): ErrorMessageRenderProps => {\n\t\tconst { index } = options;\n\n\t\treturn {\n\t\t\tclassName: cnMerge(className, classNames?.errorMessage),\n\t\t\t/* eslint-disable perfectionist/sort-objects -- Ignore */\n\t\t\t\"data-slot\": \"form-error-message\",\n\t\t\t\"data-part\": \"error-message\",\n\t\t\t\"data-scope\": \"form\",\n\t\t\t\"data-index\": index,\n\t\t\t/* eslint-enable perfectionist/sort-objects -- Ignore */\n\t\t\tid: formMessageId,\n\t\t};\n\t};\n\n\tconst getRenderState = (options: { errorMessage: string; index: number }): ErrorMessageRenderState => {\n\t\tconst { errorMessage, index } = options;\n\n\t\treturn {\n\t\t\terrorMessage,\n\t\t\terrorMessageArray,\n\t\t\tindex,\n\t\t};\n\t};\n\n\tconst selectedChildren = typeof children === \"function\" ? children : renderItem;\n\n\treturn (\n\t\t<ForWithWrapper\n\t\t\tref={containerRef}\n\t\t\tclassName={cnMerge(\"flex flex-col\", classNames?.container)}\n\t\t\tdata-slot=\"form-error-message-container\"\n\t\t\tdata-scope=\"form\"\n\t\t\tdata-part=\"error-message-container\"\n\t\t\teach={errorMessageArray}\n\t\t\trenderItem={(errorMessage, index) => {\n\t\t\t\treturn selectedChildren({\n\t\t\t\t\tprops: getRenderProps({ index }),\n\t\t\t\t\tstate: getRenderState({ errorMessage, index }),\n\t\t\t\t});\n\t\t\t}}\n\t\t/>\n\t);\n};\n\nexport type FormErrorMessageProps<TControl, TFieldValues extends FieldValues, TTransformedValues> =\n\t| (TControl extends Control<infer TValues> ?\n\t\t\t{\n\t\t\t\tclassName?: string;\n\t\t\t\tcontrol?: never;\n\t\t\t\terrorField?: FieldPath<TValues>;\n\t\t\t\ttype?: \"regular\";\n\t\t\t}\n\t :\t{\n\t\t\t\tclassName?: string;\n\t\t\t\tcontrol?: Control<TFieldValues, unknown, TTransformedValues>; // == Here for type inference of errorField prop\n\t\t\t\terrorField?: FieldPath<TFieldValues>;\n\t\t\t\ttype?: \"regular\";\n\t\t\t})\n\t| {\n\t\t\tclassName?: string;\n\t\t\terrorField: string;\n\t\t\ttype: \"root\";\n\t };\n\nexport function FormErrorMessage<\n\tTControl,\n\tTFieldValues extends FieldValues = FieldValues,\n\tTTransformedValues = TFieldValues,\n>(props: FormErrorMessageProps<TControl, TFieldValues, TTransformedValues>) {\n\tconst fieldContextValues = useLaxFormFieldContext();\n\n\tconst { className, errorField, type = \"regular\" } = props;\n\n\tconst { control } = useFormMethodsContext();\n\n\treturn (\n\t\t<FormErrorMessagePrimitive\n\t\t\ttype={type as \"root\"}\n\t\t\tcontrol={control}\n\t\t\tfieldName={errorField ?? (fieldContextValues?.name as NonNullable<typeof errorField>)}\n\t\t\trenderItem={({ props: renderProps, state }) => (\n\t\t\t\t<li\n\t\t\t\t\tkey={state.errorMessage}\n\t\t\t\t\t{...renderProps}\n\t\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t\t\"text-[13px] text-zu-destructive\",\n\t\t\t\t\t\t\"data-[index=0]:mt-1\",\n\t\t\t\t\t\trenderProps.className,\n\t\t\t\t\t\tclassName\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{state.errorMessage}\n\t\t\t\t</li>\n\t\t\t)}\n\t\t/>\n\t);\n}\n\nexport type FormSubmitProps<TFieldValues extends FieldValues, TTransformedValues> = Omit<\n\tInferProps<\"button\">,\n\t\"children\"\n> & {\n\tasChild?: boolean;\n} & (\n\t\t| {\n\t\t\t\tchildren: React.ReactNode;\n\t\t\t\tcontrol?: never;\n\t\t }\n\t\t| {\n\t\t\t\tchildren: StateSubscribeProps<TFieldValues, TTransformedValues>[\"render\"];\n\t\t\t\tcontrol?: Control<TFieldValues, unknown, TTransformedValues>;\n\t\t }\n\t);\n\nexport function FormSubmit<\n\tTElement extends React.ElementType = \"button\",\n\tTFieldValues extends FieldValues = Record<string, unknown>,\n\tTTransformedValues = TFieldValues,\n>(props: PolymorphicPropsStrict<TElement, FormSubmitProps<TFieldValues, TTransformedValues>>) {\n\tconst { as: Element = \"button\", asChild, children, control, type = \"submit\", ...restOfProps } = props;\n\n\tconst Component = asChild ? Slot.Root : Element;\n\n\treturn (\n\t\t<Component data-slot=\"form-submit\" data-part=\"submit\" data-scope=\"form\" type={type} {...restOfProps}>\n\t\t\t{isFunction(children) ?\n\t\t\t\t<FormStateSubscribe control={control} render={children} />\n\t\t\t:\tchildren}\n\t\t</Component>\n\t);\n}\n\nexport type FormWatchProps<\n\tTFieldValues extends FieldValues,\n\tTFieldName extends\n\t\t| Array<FieldPath<TFieldValues>>\n\t\t| FieldPath<TFieldValues>\n\t\t| ReadonlyArray<FieldPath<TFieldValues>>\n\t\t| undefined,\n\tTTransformedValues,\n\tTComputeValue,\n\tTComputedProps extends Omit<\n\t\tWatchProps<TFieldName, TFieldValues, unknown, TTransformedValues, TComputeValue>,\n\t\t\"names\"\n\t> = Omit<WatchProps<TFieldName, TFieldValues, unknown, TTransformedValues, TComputeValue>, \"names\">,\n> = DiscriminatedRenderProps<TComputedProps[\"render\"]> & Omit<TComputedProps, \"render\">;\n\nexport function FormWatch<\n\tTFieldValues extends FieldValues = Record<string, unknown>,\n\tconst TFieldName extends\n\t\t| Array<FieldPath<TFieldValues>>\n\t\t| FieldPath<TFieldValues>\n\t\t| ReadonlyArray<FieldPath<TFieldValues>>\n\t\t| undefined = FieldPath<TFieldValues>,\n\tTTransformedValues = TFieldValues,\n\tTComputeValue = undefined,\n>(props: FormWatchProps<TFieldValues, TFieldName, TTransformedValues, TComputeValue>) {\n\tconst fieldContextValue = useLaxFormFieldContext();\n\n\tconst { children, compute, control, defaultValue, disabled, exact, name, render } = props;\n\n\tconst methodsContextValue = useFormMethodsContext({ strict: false });\n\n\tconst resolvedControl = control ?? methodsContextValue?.control;\n\n\tif (!resolvedControl) {\n\t\tthrow new ContextError(\n\t\t\t\"<Form.Watch> must be provided with an explicit 'control' prop or used within <Form.Root>\"\n\t\t);\n\t}\n\n\tconst formValue = useWatch({\n\t\tcompute: compute as never,\n\t\tcontrol: resolvedControl as never,\n\t\tdefaultValue,\n\t\tdisabled,\n\t\texact,\n\t\tname: (name ?? fieldContextValue?.name) as string,\n\t}) as unknown;\n\n\tconst selectedChildren = typeof children === \"function\" ? children : render;\n\n\tconst resolvedChildren = selectedChildren(formValue as never);\n\n\treturn resolvedChildren;\n}\n\nexport type FormStateSubscribeProps<\n\tTFieldValues extends FieldValues,\n\tTTransformedValues,\n\tTComputedProps extends StateSubscribeProps<TFieldValues, TTransformedValues> = StateSubscribeProps<\n\t\tTFieldValues,\n\t\tTTransformedValues\n\t>,\n> = DiscriminatedRenderProps<TComputedProps[\"render\"]> & Omit<TComputedProps, \"render\">;\n\nexport function FormStateSubscribe<\n\tTFieldValues extends FieldValues = Record<string, unknown>,\n\tTTransformedValues = TFieldValues,\n>(props: FormStateSubscribeProps<TFieldValues, TTransformedValues>) {\n\tconst fieldContextValues = useLaxFormFieldContext();\n\n\tconst { children, control, disabled, exact, name, render } = props;\n\n\tconst methodsContextValue = useFormMethodsContext({ strict: false });\n\n\tconst resolvedControl = control ?? methodsContextValue?.control;\n\n\tif (!resolvedControl) {\n\t\tthrow new ContextError(\n\t\t\t\"<Form.StateSubscribe> must be provided with an explicit 'control' prop or used within <Form.Root>\"\n\t\t);\n\t}\n\n\tconst formState = useFormState({\n\t\tcontrol: resolvedControl as never,\n\t\tdisabled,\n\t\texact,\n\t\tname: name ?? (fieldContextValues?.name as never),\n\t});\n\n\tconst selectedChildren = typeof children === \"function\" ? children : render;\n\n\tconst resolvedChildren = selectedChildren(formState);\n\n\treturn resolvedChildren;\n}\n\n<FormStateSubscribe>{(formState) => <p>{formState.isValid ? \"Valid\" : \"Invalid\"}</p>}</FormStateSubscribe>;\n","export {\n\tFormDescription as Description,\n\tFormErrorMessage as ErrorMessage,\n\tFormErrorMessagePrimitive as ErrorMessagePrimitive,\n\tFormField as Field,\n\tFormFieldBoundController as FieldBoundController,\n\tFormFieldContext as FieldContext,\n\tFormFieldWithController as FieldWithController,\n\tFormInput as Input,\n\tFormInputGroup as InputGroup,\n\tFormInputLeftItem as InputLeftItem,\n\tFormInputPrimitive as InputPrimitive,\n\tFormInputRightItem as InputRightItem,\n\tFormLabel as Label,\n\tFormRoot as Root,\n\tFormSelect as Select,\n\tFormStateSubscribe as StateSubscribe,\n\tFormSubmit as Submit,\n\tFormTextArea as TextArea,\n\tFormTextAreaPrimitive as TextAreaPrimitive,\n\tFormWatch as Watch,\n} from \"./form\";\n\nexport type {\n\tFormDescriptionProps,\n\tFormErrorMessagePrimitiveProps,\n\tFormErrorMessageProps,\n\tFormFieldBoundControllerProps,\n\tFormFieldContextProps,\n\tFormFieldProps,\n\tFormFieldWithControllerProps,\n\tFormInputCombinedProps,\n\tFormInputGroupProps,\n\tFormInputPrimitiveProps,\n\tFormInputProps,\n\tFormLabelProps,\n\tFormRootProps,\n\tFormSelectPrimitiveProps,\n\tFormSelectProps,\n\tFormSideItemProps,\n\tFormStateSubscribeProps,\n\tFormSubmitProps,\n\tFormTextAreaPrimitiveProps,\n\tFormTextAreaProps,\n\tFormWatchProps,\n} from \"./form\";\n"],"mappings":"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"}
package/dist/style.css CHANGED
@@ -205,12 +205,18 @@
205
205
  .end {
206
206
  inset-inline-end: var(--spacing);
207
207
  }
208
+ .top-0 {
209
+ top: calc(var(--spacing) * 0);
210
+ }
208
211
  .top-1\/2 {
209
212
  top: calc(1 / 2 * 100%);
210
213
  }
211
214
  .right-0 {
212
215
  right: calc(var(--spacing) * 0);
213
216
  }
217
+ .bottom-0 {
218
+ bottom: calc(var(--spacing) * 0);
219
+ }
214
220
  .bottom-6 {
215
221
  bottom: calc(var(--spacing) * 6);
216
222
  }
@@ -310,6 +316,10 @@
310
316
  --tw-translate-y: calc(calc(1 / 2 * 100%) * -1);
311
317
  translate: var(--tw-translate-x) var(--tw-translate-y);
312
318
  }
319
+ .-translate-x-1\/2 {
320
+ --tw-translate-x: calc(calc(1 / 2 * 100%) * -1);
321
+ translate: var(--tw-translate-x) var(--tw-translate-y);
322
+ }
313
323
  .translate-x-\(--translate-distance\) {
314
324
  --tw-translate-x: var(--translate-distance);
315
325
  translate: var(--tw-translate-x) var(--tw-translate-y);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zayne-labs/ui-react",
3
3
  "type": "module",
4
- "version": "0.11.8",
4
+ "version": "0.11.10",
5
5
  "description": "A composable UI/UI-utilities components library. ",
6
6
  "author": "Ryan Zayne",
7
7
  "license": "MIT",
@@ -32,7 +32,7 @@
32
32
  "peerDependencies": {
33
33
  "react": "^19.2.5",
34
34
  "react-dom": "^19.2.5",
35
- "react-hook-form": "^7.74.0",
35
+ "react-hook-form": "^7.75.0",
36
36
  "tailwind-merge": "^3.5.0",
37
37
  "tailwindcss": "^4.2.4"
38
38
  },
@@ -45,9 +45,9 @@
45
45
  }
46
46
  },
47
47
  "dependencies": {
48
- "@zayne-labs/toolkit-core": "0.12.49",
49
- "@zayne-labs/toolkit-react": "0.12.49",
50
- "@zayne-labs/toolkit-type-helpers": "0.12.49"
48
+ "@zayne-labs/toolkit-core": "0.12.50",
49
+ "@zayne-labs/toolkit-react": "0.12.50",
50
+ "@zayne-labs/toolkit-type-helpers": "0.12.50"
51
51
  },
52
52
  "devDependencies": {
53
53
  "@arethetypeswrong/cli": "0.18.2",
@@ -57,18 +57,18 @@
57
57
  "@total-typescript/ts-reset": "0.6.1",
58
58
  "@types/react": "19.2.14",
59
59
  "@types/react-dom": "19.2.3",
60
- "@zayne-labs/prettier-config": "0.13.5",
61
- "@zayne-labs/tsconfig": "0.13.5",
60
+ "@zayne-labs/prettier-config": "0.13.11",
61
+ "@zayne-labs/tsconfig": "0.13.11",
62
62
  "concurrently": "9.2.1",
63
63
  "cross-env": "10.1.0",
64
64
  "prettier": "3.8.3",
65
65
  "prettier-plugin-classnames": "0.10.1",
66
66
  "prettier-plugin-merge": "0.10.1",
67
- "prettier-plugin-tailwindcss": "0.7.3",
67
+ "prettier-plugin-tailwindcss": "0.8.0",
68
68
  "publint": "0.3.18",
69
69
  "react": "^19.2.5",
70
70
  "react-dom": "^19.2.5",
71
- "react-hook-form": "^7.74.0",
71
+ "react-hook-form": "^7.75.0",
72
72
  "size-limit": "12.1.0",
73
73
  "tailwind-merge": "^3.5.0",
74
74
  "tailwindcss": "^4.2.4",
@@ -1 +0,0 @@
1
- {"version":3,"file":"presence-DkWhm7xu.js","names":["Slot.Root"],"sources":["../../src/components/common/presence/use-presence.ts","../../src/components/common/presence/presence.tsx"],"sourcesContent":["import { on } from \"@zayne-labs/toolkit-core\";\nimport { useCallbackRef, useToggle } from \"@zayne-labs/toolkit-react\";\nimport type { InferProps } from \"@zayne-labs/toolkit-react/utils\";\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useReducer, useRef, useState } from \"react\";\n\ntype StateMachineConfig<TState extends string, TEvent extends string> = {\n\tinitial: TState;\n\tstates: Record<TState, Partial<Record<TEvent, TState>>>;\n};\n\nconst useStateMachine = <TState extends string, TEvent extends string>(\n\tconfig: StateMachineConfig<TState, TEvent>\n) => {\n\tconst reducer = (prevState: TState, event: TEvent): TState => {\n\t\tconst newState = config.states[prevState][event] ?? prevState;\n\n\t\treturn newState;\n\t};\n\n\treturn useReducer(reducer, config.initial);\n};\n\nconst getAnimationName = (styles: CSSStyleDeclaration | null) => styles?.animationName ?? \"none\";\n\nexport type UsePresenceOptions = {\n\tonExitComplete?: () => void;\n\tpresent: boolean;\n\t/**\n\t * @default \"animation\"\n\t */\n\tvariant?: \"animation\" | \"transition\";\n};\n\nexport type PresencePropGetters = {\n\tgetPresenceProps: (innerProps: InferProps<HTMLElement>) => InferProps<HTMLElement>;\n};\n\nexport type UsePresenceResult = {\n\tisMounted: boolean;\n\tisTransitionComplete: boolean;\n\tpropGetters: PresencePropGetters;\n\tref: React.Ref<HTMLElement>;\n};\n\n/**\n * React hook that provides the ability to animate the mount/unmount of a component.\n * @see https://github.com/radix-ui/primitives/blob/main/packages/react/presence/src/presence.tsx\n */\n\nconst usePresence = (options: UsePresenceOptions): UsePresenceResult => {\n\tconst { onExitComplete, present: presentProp, variant = \"animation\" } = options;\n\n\tconst stableOnExitComplete = useCallbackRef(onExitComplete);\n\n\tconst [node, setNode] = useState<HTMLElement | null>(null);\n\n\tconst [isTransitionComplete, toggleIsTransitionComplete] = useToggle(false);\n\n\tconst stylesRef = useRef<CSSStyleDeclaration | null>(null);\n\n\tconst prevNodeStateRef = useRef({\n\t\tprevAnimationName: \"none\",\n\t\tprevPresent: presentProp,\n\t});\n\n\tconst initialState = presentProp ? \"mounted\" : \"unmounted\";\n\n\tconst [mountState, send] = useStateMachine({\n\t\tinitial: initialState,\n\t\tstates: {\n\t\t\tmounted: {\n\t\t\t\tANIMATION_OUT: \"unmountSuspended\",\n\t\t\t\tUNMOUNT: \"unmounted\",\n\t\t\t},\n\t\t\tunmounted: {\n\t\t\t\tMOUNT: \"mounted\",\n\t\t\t},\n\t\t\tunmountSuspended: {\n\t\t\t\tANIMATION_END: \"unmounted\",\n\t\t\t\tMOUNT: \"mounted\",\n\t\t\t},\n\t\t},\n\t});\n\n\tuseEffect(() => {\n\t\tconst currentAnimationName = getAnimationName(stylesRef.current);\n\n\t\tprevNodeStateRef.current.prevAnimationName =\n\t\t\tmountState === \"mounted\" ? currentAnimationName : \"none\";\n\t}, [mountState]);\n\n\tuseLayoutEffect(() => {\n\t\tconst styles = stylesRef.current;\n\t\tconst wasPresent = prevNodeStateRef.current.prevPresent;\n\t\tconst hasPresentChanged = wasPresent !== presentProp;\n\n\t\tif (!hasPresentChanged) return;\n\n\t\tconst prevAnimationName = prevNodeStateRef.current.prevAnimationName;\n\t\tconst currentAnimationName = getAnimationName(styles);\n\n\t\tswitch (true) {\n\t\t\tcase presentProp: {\n\t\t\t\tsend(\"MOUNT\");\n\n\t\t\t\tif (variant === \"transition\") {\n\t\t\t\t\trequestAnimationFrame(() => toggleIsTransitionComplete(true));\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase Boolean(node): {\n\t\t\t\tif (variant === \"animation\") {\n\t\t\t\t\tconst hasAnimation = currentAnimationName !== \"none\" && styles?.display !== \"none\";\n\n\t\t\t\t\t/**\n\t\t\t\t\t * When `present` changes to `false`, we check changes to animation-name to\n\t\t\t\t\t * determine whether an animation has started. We chose this approach (reading\n\t\t\t\t\t * computed styles) because there is no `animationrun` event (like the `transitionrun` event) and `animationstart`\n\t\t\t\t\t * fires after `animation-delay` has expired which would be too late.\n\t\t\t\t\t */\n\n\t\t\t\t\tconst isAnimationStarted = hasAnimation && prevAnimationName !== currentAnimationName;\n\n\t\t\t\t\tconst isAnimatingOut = wasPresent && isAnimationStarted;\n\n\t\t\t\t\tsend(isAnimatingOut ? \"ANIMATION_OUT\" : \"UNMOUNT\");\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tsend(\"UNMOUNT\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tprevNodeStateRef.current.prevPresent = presentProp;\n\t}, [presentProp, node, send, variant, toggleIsTransitionComplete]);\n\n\tuseLayoutEffect(() => {\n\t\tif (!node) {\n\t\t\t// Transition to the unmounted state if the node is removed prematurely.\n\t\t\t// We avoid doing so during cleanup as the node may change but still exist.\n\t\t\tsend(\"ANIMATION_END\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst setupAnimationListeners = () => {\n\t\t\tlet timeoutId: number;\n\n\t\t\tconst ownerWindow = node.ownerDocument.defaultView ?? globalThis;\n\n\t\t\tconst handleAnimationStart = (event: AnimationEvent) => {\n\t\t\t\tconst isTargetAnimatingNode = event.target === node;\n\n\t\t\t\tif (!isTargetAnimatingNode) return;\n\n\t\t\t\tprevNodeStateRef.current.prevAnimationName = getAnimationName(stylesRef.current);\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * @description Triggering an ANIMATION_OUT during an ANIMATION_IN will fire an `animationcancel`\n\t\t\t * event for ANIMATION_IN after we have entered `unmountSuspended` state. So, we\n\t\t\t * make sure we only trigger ANIMATION_END for the currently active animation.\n\t\t\t */\n\t\t\tconst handleAnimationEnd = (event: AnimationEvent) => {\n\t\t\t\tconst currentAnimationName = getAnimationName(stylesRef.current);\n\n\t\t\t\t// The event.animationName is unescaped for CSS syntax, so we need to escape it to compare with the animationName computed from the style.\n\t\t\t\tconst isCurrentAnimation = currentAnimationName.includes(CSS.escape(event.animationName));\n\n\t\t\t\tconst isTargetAnimatingNode = event.target === node && isCurrentAnimation;\n\n\t\t\t\tif (!isTargetAnimatingNode) return;\n\n\t\t\t\t// With React 18 concurrency this update is applied a frame after the\n\t\t\t\t// animation ends, creating a flash of visible content. By setting the\n\t\t\t\t// animation fill mode to \"forwards\", we force the node to keep the\n\t\t\t\t// styles of the last keyframe, removing the flash.\n\n\t\t\t\t// Previously we flushed the update via ReactDom.flushSync, but with\n\t\t\t\t// exit animations this resulted in the node being removed from the\n\t\t\t\t// DOM before the synthetic animationEnd event was dispatched, meaning\n\t\t\t\t// user-provided event handlers would not be called.\n\t\t\t\t// https://github.com/radix-ui/primitives/pull/1849\n\t\t\t\tsend(\"ANIMATION_END\");\n\n\t\t\t\tif (!prevNodeStateRef.current.prevPresent) {\n\t\t\t\t\tconst currentFillMode = node.style.animationFillMode;\n\t\t\t\t\tnode.style.animationFillMode = \"forwards\";\n\n\t\t\t\t\t// Reset the style after the node had time to unmount (for cases\n\t\t\t\t\t// where the component chooses not to unmount). Doing this any\n\t\t\t\t\t// sooner than `setTimeout` (e.g. with `requestAnimationFrame`)\n\t\t\t\t\t// still causes a flash.\n\t\t\t\t\ttimeoutId = ownerWindow.setTimeout(() => {\n\t\t\t\t\t\tif (node.style.animationFillMode === \"forwards\") {\n\t\t\t\t\t\t\tnode.style.animationFillMode = currentFillMode;\n\t\t\t\t\t\t}\n\t\t\t\t\t}) as never;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst onAnimationStartCleanup = on(node, \"animationstart\", handleAnimationStart);\n\t\t\tconst onAnimationEndCleanup = on(node, \"animationend\", handleAnimationEnd);\n\t\t\tconst onAnimationCancelCleanup = on(node, \"animationcancel\", handleAnimationEnd);\n\n\t\t\tconst cleanup = () => {\n\t\t\t\townerWindow.clearTimeout(timeoutId);\n\t\t\t\tonAnimationStartCleanup();\n\t\t\t\tonAnimationEndCleanup();\n\t\t\t\tonAnimationCancelCleanup();\n\t\t\t};\n\n\t\t\treturn cleanup;\n\t\t};\n\n\t\tconst setupTransitionListeners = () => {\n\t\t\tconst handleTransitionRun = (event: TransitionEvent) => {\n\t\t\t\tconst isTargetTransitioningNode = event.target === node;\n\n\t\t\t\tif (!isTargetTransitioningNode) return;\n\n\t\t\t\tsend(\"ANIMATION_OUT\");\n\t\t\t};\n\n\t\t\tconst handleTransitionEnd = (event: TransitionEvent) => {\n\t\t\t\tconst isTargetTransitioningNode =\n\t\t\t\t\tevent.target === node && !prevNodeStateRef.current.prevPresent;\n\n\t\t\t\tif (!isTargetTransitioningNode) return;\n\n\t\t\t\tsend(\"ANIMATION_END\");\n\t\t\t};\n\n\t\t\tconst onTransitionRunCleanup = on(node, \"transitionrun\", handleTransitionRun);\n\t\t\tconst onTransitionEndCleanup = on(node, \"transitionend\", handleTransitionEnd);\n\t\t\tconst onTransitionCancelCleanup = on(node, \"transitioncancel\", handleTransitionEnd);\n\n\t\t\tconst cleanup = () => {\n\t\t\t\tonTransitionRunCleanup();\n\t\t\t\tonTransitionEndCleanup();\n\t\t\t\tonTransitionCancelCleanup();\n\t\t\t};\n\n\t\t\treturn cleanup;\n\t\t};\n\n\t\tswitch (variant) {\n\t\t\tcase \"animation\": {\n\t\t\t\tconst cleanup = setupAnimationListeners();\n\n\t\t\t\treturn cleanup;\n\t\t\t}\n\n\t\t\tcase \"transition\": {\n\t\t\t\tconst cleanup = setupTransitionListeners();\n\n\t\t\t\treturn cleanup;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tvariant satisfies never;\n\t\t\t\tthrow new Error(`Invalid variant: ${variant}`);\n\t\t\t}\n\t\t}\n\t}, [node, send, variant]);\n\n\tuseEffect(() => {\n\t\tconst isExitCompleted = !presentProp && mountState === \"unmounted\";\n\n\t\tif (isExitCompleted) {\n\t\t\ttoggleIsTransitionComplete(false);\n\t\t\tstableOnExitComplete?.();\n\t\t}\n\t}, [mountState, presentProp, stableOnExitComplete, toggleIsTransitionComplete]);\n\n\tconst ref = useCallbackRef((refNode: HTMLElement | null) => {\n\t\tsetNode(refNode);\n\n\t\tif (refNode) {\n\t\t\tstylesRef.current = getComputedStyle(refNode);\n\t\t}\n\t});\n\n\tconst MOUNTED_STATES = [\"mounted\", \"unmountSuspended\"] satisfies Array<typeof mountState>;\n\tconst isMounted = MOUNTED_STATES.includes(mountState);\n\tconst transitionPhase = presentProp && isTransitionComplete ? \"enter\" : \"exit\";\n\tconst animationPhase = presentProp ? \"enter\" : \"exit\";\n\n\tconst getPresenceProps: PresencePropGetters[\"getPresenceProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\treturn {\n\t\t\t\t\"data-mounted\": isMounted,\n\t\t\t\t\"data-present\": presentProp,\n\t\t\t\t\"data-variant\": variant,\n\t\t\t\t...(variant === \"animation\" && { \"data-animation-phase\": animationPhase }),\n\t\t\t\t...(variant === \"transition\" && { \"data-transition-phase\": transitionPhase }),\n\t\t\t\t...innerProps,\n\t\t\t\tclassName: innerProps.className,\n\t\t\t};\n\t\t},\n\t\t[animationPhase, isMounted, presentProp, transitionPhase, variant]\n\t);\n\n\tconst propGetters = useMemo(\n\t\t() => ({\n\t\t\tgetPresenceProps,\n\t\t}),\n\t\t[getPresenceProps]\n\t);\n\n\tconst result = useMemo<UsePresenceResult>(\n\t\t() =>\n\t\t\t({\n\t\t\t\tisMounted,\n\t\t\t\tisTransitionComplete,\n\t\t\t\tpropGetters,\n\t\t\t\tref,\n\t\t\t}) satisfies UsePresenceResult,\n\t\t[isMounted, isTransitionComplete, propGetters, ref]\n\t);\n\n\treturn result;\n};\n\nexport { usePresence };\n","\"use client\";\n\nimport { useComposeRefs } from \"@zayne-labs/toolkit-react\";\nimport { isFunction, type UnknownObject } from \"@zayne-labs/toolkit-type-helpers\";\nimport { Slot } from \"../slot\";\nimport { usePresence, type UsePresenceOptions, type UsePresenceResult } from \"./use-presence\";\n\ntype RefProp = { ref?: React.Ref<HTMLElement> };\n\ntype RenderPropContext = Omit<UsePresenceResult, \"propGetters\" | \"ref\">\n\t& Pick<UsePresenceOptions, \"present\">;\n\nexport type PresenceProps = UsePresenceOptions & {\n\tchildren?: React.ReactElement<RefProp> | ((props: RenderPropContext) => React.ReactElement<RefProp>);\n\tclassName?: string;\n\tforceMount?: boolean;\n};\n\nfunction Presence(props: PresenceProps) {\n\tconst { children, className, forceMount = false, onExitComplete, present, variant } = props;\n\n\tconst {\n\t\tisMounted,\n\t\tisTransitionComplete,\n\t\tpropGetters,\n\t\tref: presenceRef,\n\t} = usePresence({ onExitComplete, present, variant });\n\n\tconst context = {\n\t\tisMounted,\n\t\tisTransitionComplete,\n\t\tpresent,\n\t} satisfies RenderPropContext;\n\n\tconst resolvedChild = isFunction(children) ? children(context) : children;\n\n\tconst childRef = (resolvedChild?.props.ref\n\t\t?? (resolvedChild as unknown as UnknownObject).ref) as React.Ref<HTMLElement>;\n\n\tconst ref = useComposeRefs(presenceRef, childRef);\n\n\tconst shouldRender =\n\t\tforceMount || (variant === \"transition\" ? isMounted || isTransitionComplete : isMounted);\n\n\tif (!shouldRender) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<Slot.Root ref={ref} {...propGetters.getPresenceProps({ className })}>\n\t\t\t{resolvedChild}\n\t\t</Slot.Root>\n\t);\n}\n\nexport { Presence };\n"],"mappings":"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"}