{
	"$schema": "https://ui.shadcn.com/schema/registry-item.json",
	"name": "form",
	"dependencies": ["react-hook-form", "zod", "@hookform/resolvers"],
	"registryDependencies": ["@9ui/label"],
	"files": [
		{
			"path": "ui/form.tsx",
			"content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n\tController,\n\tFormProvider,\n\tuseFormContext,\n\tuseFormState,\n\ttype ControllerProps,\n\ttype FieldPath,\n\ttype FieldValues,\n} from \"react-hook-form\"\n\nimport { Label } from \"@/components/ui/label\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Form = FormProvider\n\ntype FormFieldContextValue<\n\tTFieldValues extends FieldValues = FieldValues,\n\tTName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n\tname: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>(\n\t{} as FormFieldContextValue\n)\n\nconst FormField = <\n\tTFieldValues extends FieldValues = FieldValues,\n\tTName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n\t...props\n}: ControllerProps<TFieldValues, TName>) => {\n\treturn (\n\t\t<FormFieldContext.Provider value={{ name: props.name }}>\n\t\t\t<Controller {...props} />\n\t\t</FormFieldContext.Provider>\n\t)\n}\n\nconst useFormField = () => {\n\tconst fieldContext = React.useContext(FormFieldContext)\n\tconst itemContext = React.useContext(FormItemContext)\n\tconst { getFieldState } = useFormContext()\n\tconst formState = useFormState({ name: fieldContext.name })\n\tconst fieldState = getFieldState(fieldContext.name, formState)\n\n\tif (!fieldContext) {\n\t\tthrow new Error(\"useFormField should be used within <FormField>\")\n\t}\n\n\tconst { id } = itemContext\n\n\treturn {\n\t\tid,\n\t\tname: fieldContext.name,\n\t\tformItemId: `${id}-form-item`,\n\t\tformDescriptionId: `${id}-form-item-description`,\n\t\tformMessageId: `${id}-form-item-message`,\n\t\t...fieldState,\n\t}\n}\n\ntype FormItemContextValue = {\n\tid: string\n}\n\nconst FormItemContext = React.createContext<FormItemContextValue>(\n\t{} as FormItemContextValue\n)\n\nfunction FormItem({ className, ...props }: React.ComponentProps<\"div\">) {\n\tconst id = React.useId()\n\n\treturn (\n\t\t<FormItemContext.Provider value={{ id }}>\n\t\t\t<div\n\t\t\t\tdata-slot=\"form-item\"\n\t\t\t\tclassName={cn(\"grid gap-2\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</FormItemContext.Provider>\n\t)\n}\n\nfunction FormLabel({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof Label>) {\n\tconst { error, formItemId } = useFormField()\n\n\treturn (\n\t\t<Label\n\t\t\tdata-slot=\"form-label\"\n\t\t\tdata-error={!!error}\n\t\t\tclassName={cn(\"data-[error=true]:text-destructive\", className)}\n\t\t\thtmlFor={formItemId}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FormControl({ ...props }: React.ComponentProps<\"div\">) {\n\tconst { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"form-control\"\n\t\t\tid={formItemId}\n\t\t\taria-describedby={\n\t\t\t\t!error\n\t\t\t\t\t? `${formDescriptionId}`\n\t\t\t\t\t: `${formDescriptionId} ${formMessageId}`\n\t\t\t}\n\t\t\taria-invalid={!!error}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FormDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n\tconst { formDescriptionId } = useFormField()\n\n\treturn (\n\t\t<p\n\t\t\tdata-slot=\"form-description\"\n\t\t\tid={formDescriptionId}\n\t\t\tclassName={cn(\"text-muted-foreground text-sm\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FormMessage({ className, ...props }: React.ComponentProps<\"p\">) {\n\tconst { error, formMessageId } = useFormField()\n\tconst body = error ? String(error?.message ?? \"\") : props.children\n\n\tif (!body) {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<p\n\t\t\tdata-slot=\"form-message\"\n\t\t\tid={formMessageId}\n\t\t\tclassName={cn(\"text-destructive text-sm\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{body}\n\t\t</p>\n\t)\n}\n\nexport {\n\tuseFormField,\n\tForm,\n\tFormItem,\n\tFormLabel,\n\tFormControl,\n\tFormDescription,\n\tFormMessage,\n\tFormField,\n}\n",
			"type": "registry:ui",
			"target": ""
		}
	],
	"type": "registry:ui"
}
