Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | import { forwardRef, InputHTMLAttributes } from 'react'; import { cn } from '../../lib/utils'; export interface InputProps extends InputHTMLAttributes<HTMLInputElement> { label?: string; error?: string; } export const Input = forwardRef<HTMLInputElement, InputProps>( ({ className, label, error, id, ...props }, ref) => { const inputId = id || label?.toLowerCase().replace(/\s+/g, '-'); return ( <div className="w-full"> {label && ( <label htmlFor={inputId} className="block text-xs text-gray-500 dark:text-gray-400 mb-1" > {label} </label> )} <input ref={ref} id={inputId} className={cn( 'w-full text-sm border border-gray-200 rounded-lg px-3 py-2', 'bg-white dark:bg-gray-800 dark:border-gray-700 dark:text-gray-100', 'placeholder:text-gray-400 dark:placeholder:text-gray-500', 'focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent', 'transition-colors duration-fast', error && 'border-red-500 focus:ring-red-500', className )} {...props} /> {error && ( <p className="mt-1 text-xs text-red-500">{error}</p> )} </div> ); } ); Input.displayName = 'Input'; |