import { forwardRef, InputHTMLAttributes, useState, useEffect } from "react"; import { twMerge } from "tailwind-merge"; interface TextInputProps extends InputHTMLAttributes { type?: string; storedValue?: string; } const TextInput = forwardRef( ({ type = "text", className, value, defaultValue, onChange, ...props }, ref) => { const [internalValue, setInternalValue] = useState(value ?? defaultValue ?? ""); // Sync when `value` changes (controlled mode) useEffect(() => { if (value !== undefined) { setInternalValue(value); } }, [value]); const handleChange = (e: React.ChangeEvent) => { const newVal = e.target.value; setInternalValue(newVal); onChange?.(e); // Pass event to parent (so Email, Password, etc. still work) }; return ( ); } ); TextInput.displayName = "TextInput"; export default TextInput;