import { cloneElement, ReactElement, ReactNode } from "react"; import { faExclamationTriangle, faQuestionCircle } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import * as Label from "@radix-ui/react-label"; import { twMerge } from "tailwind-merge"; import { Tooltip } from "../Tooltip"; export type FormLabelProps = { id?: string; isRequired?: boolean; isOptional?: boolean; label?: ReactNode; icon?: ReactNode; className?: string; tooltipClassName?: string; tooltipText?: ReactNode; }; export const FormLabel = ({ id, label, isRequired, icon, className, isOptional, tooltipClassName, tooltipText }: FormLabelProps) => ( {label} {isRequired && *} {isOptional && - Optional} {icon && !tooltipText && ( {icon} )} {tooltipText && ( )} ); export type FormHelperTextProps = { isError?: boolean; text?: ReactNode; }; export const FormHelperText = ({ isError, text }: FormHelperTextProps) => (
{isError && ( )} {text}
); export type FormControlProps = { id?: string; isRequired?: boolean; isOptional?: boolean; isError?: boolean; label?: ReactNode; helperText?: ReactNode; errorText?: ReactNode; children: JSX.Element; className?: string; icon?: ReactNode; tooltipText?: ReactElement | string; tooltipClassName?: string; }; export const FormControl = ({ children, isRequired, isOptional, label, helperText, errorText, id, isError, icon, className, tooltipText, tooltipClassName }: FormControlProps): JSX.Element => { return (
{typeof label === "string" ? ( ) : ( label )} {cloneElement(children, { isRequired, "data-required": isRequired, isError })} {!isError && helperText && } {isError && errorText && }
); };