import * as React from 'react'; import * as LabelPrimitive from '@radix-ui/react-label'; import { Slot } from '@radix-ui/react-slot'; import { Controller, FormProvider, useFormContext, type ControllerProps, type FieldPath, type FieldValues, } from 'react-hook-form'; import { cn } from '../lib/cn.js'; import { Label } from './label.js'; export const Form = FormProvider; type FormFieldContextValue< TFieldValues extends FieldValues = FieldValues, TName extends FieldPath = FieldPath, > = { name: TName }; const FormFieldContext = React.createContext({} as FormFieldContextValue); export const FormField = < TFieldValues extends FieldValues = FieldValues, TName extends FieldPath = FieldPath, >({ ...props }: ControllerProps) => ( ); type FormItemContextValue = { id: string }; const FormItemContext = React.createContext({} as FormItemContextValue); export const FormItem = React.forwardRef>( ({ className, ...props }, ref) => { const id = React.useId(); return (
); }, ); FormItem.displayName = 'FormItem'; export function useFormField() { const fieldContext = React.useContext(FormFieldContext); const itemContext = React.useContext(FormItemContext); const { getFieldState, formState } = useFormContext(); if (!fieldContext) throw new Error('useFormField must be used within '); const fieldState = getFieldState(fieldContext.name, formState); const { id } = itemContext; return { id, name: fieldContext.name, formItemId: `${id}-form-item`, formDescriptionId: `${id}-form-item-description`, formMessageId: `${id}-form-item-message`, ...fieldState, }; } export const FormLabel = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => { const { error, formItemId } = useFormField(); return (