UNPKG

@voilajsx/uikit

Version:

Cross-platform React components with beautiful themes and OKLCH color science

105 lines (104 loc) 3.21 kB
import { jsx } from "react/jsx-runtime"; import { createContext, forwardRef, useId, useContext } from "react"; import { Slot } from "@radix-ui/react-slot"; import { useFormContext, FormProvider, Controller } from "react-hook-form"; import { cn } from "./utils.js"; import { Label } from "./label.js"; const Form = FormProvider; const FormFieldContext = createContext({}); const FormItemContext = createContext({}); const FormField = ({ ...props }) => { return /* @__PURE__ */ jsx(FormFieldContext.Provider, { value: { name: props.name }, children: /* @__PURE__ */ jsx(Controller, { ...props }) }); }; const useFormField = () => { const fieldContext = useContext(FormFieldContext); const itemContext = useContext(FormItemContext); const { getFieldState, formState } = useFormContext(); const fieldState = getFieldState(fieldContext.name, formState); if (!fieldContext) { throw new Error("useFormField should be used within <FormField>"); } const { id } = itemContext; return { id, name: fieldContext.name, formItemId: `${id}-form-item`, formDescriptionId: `${id}-form-item-description`, formMessageId: `${id}-form-item-message`, ...fieldState }; }; const FormItem = forwardRef(({ className, ...props }, ref) => { const id = useId(); return /* @__PURE__ */ jsx(FormItemContext.Provider, { value: { id }, children: /* @__PURE__ */ jsx("div", { ref, className: cn("space-y-2", className), ...props }) }); }); FormItem.displayName = "FormItem"; const FormLabel = forwardRef(({ className, ...props }, ref) => { const { error, formItemId } = useFormField(); return /* @__PURE__ */ jsx( Label, { ref, className: cn(error && "text-destructive", className), htmlFor: formItemId, ...props } ); }); FormLabel.displayName = "FormLabel"; const FormControl = forwardRef(({ ...props }, ref) => { const { error, formItemId, formDescriptionId, formMessageId } = useFormField(); return /* @__PURE__ */ jsx( Slot, { ref, id: formItemId, "aria-describedby": !error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`, "aria-invalid": !!error, ...props } ); }); FormControl.displayName = "FormControl"; const FormDescription = forwardRef(({ className, ...props }, ref) => { const { formDescriptionId } = useFormField(); return /* @__PURE__ */ jsx( "p", { ref, id: formDescriptionId, className: cn("text-sm text-muted-foreground", className), ...props } ); }); FormDescription.displayName = "FormDescription"; const FormMessage = forwardRef(({ className, children, ...props }, ref) => { const { error, formMessageId } = useFormField(); const body = error ? String(error?.message) : children; if (!body) { return null; } return /* @__PURE__ */ jsx( "p", { ref, id: formMessageId, className: cn("text-sm font-medium text-destructive", className), ...props, children: body } ); }); FormMessage.displayName = "FormMessage"; export { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, useFormField }; //# sourceMappingURL=form.js.map