"use client"; /* eslint-disable no-void */ /* eslint-disable jsx-a11y/no-static-element-interactions */ /* eslint-disable jsx-a11y/click-events-have-key-events */ /* eslint-disable jsx-a11y/label-has-associated-control */ import type { VariantProps } from "class-variance-authority"; import { AlertCircle } from "lucide-react"; import * as React from "react"; import { cn } from "@/libs/utils"; import styles from "./input.module.css"; import { containerVariants, iconVariants, inputVariants, labelVariants, } from "./input.variants"; export interface InputHandles { focus: () => void; } export interface InputProps extends Omit, "size">, VariantProps { leftIcon?: React.ReactNode; rightIcon?: React.ReactNode; isDisabled?: boolean; helperText?: string; isInvalid?: boolean; label?: string; errorMessage?: string; inputContentClassName?: string; fullWidth?: boolean; containerClassName?: string; innerRef?: unknown; as?: any; asProps?: InputProps["as"]; } const Input = React.forwardRef( ( { type, size = "md", leftIcon, isDisabled, helperText, errorMessage, isInvalid, rightIcon, label, className, inputContentClassName, containerClassName, fullWidth = false, innerRef, asProps, ...props }, ref, ) => { const localInputRef = React.useRef(null); const inputRef = innerRef ?? localInputRef; const hasLabel = !!label; React.useImperativeHandle(ref, () => ({ focus: () => { (inputRef as React.RefObject).current?.focus(); }, })); return (
void ( inputRef as React.RefObject ).current?.focus() : undefined } className={cn( containerVariants({ size, invalid: isInvalid, fullWidth, disabled: isDisabled, }), containerClassName, )} >
{props.as ? ( ) : ( )} {label && ( )}
{leftIcon && (
{leftIcon}
)} {(rightIcon || isInvalid) && (
{isInvalid ? ( // eslint-disable-next-line tailwindcss/no-unnecessary-arbitrary-value ) : ( rightIcon )}
)}
{errorMessage && (
{errorMessage}
)} {helperText && (
{helperText}
)}
); }, ); Input.displayName = "Input"; export { Input };