@voilajsx/uikit
Version:
Cross-platform React components with beautiful themes and OKLCH color science
105 lines (104 loc) • 3.21 kB
JavaScript
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