| 'use client'; | |
| import { Input } from '@/components/ui/input'; | |
| import { Textarea } from '@/components/ui/textarea'; | |
| import { Label } from '@/components/ui/label'; | |
| import { cn } from '@/lib/utils'; | |
| export interface TextInputProps { | |
| label: string; | |
| value?: string; | |
| defaultValue?: string; | |
| onChange: (value: string) => void; | |
| type?: 'text' | 'email' | 'password' | 'url' | 'tel'; | |
| className?: string; | |
| disabled?: boolean; | |
| placeholder?: string; | |
| helpText?: string; | |
| required?: boolean; | |
| maxLength?: number; | |
| minLength?: number; | |
| pattern?: string; | |
| isTextarea?: boolean; | |
| rows?: number; | |
| } | |
| export default function TextInput({ | |
| label, | |
| value, | |
| defaultValue = '', | |
| onChange, | |
| type = 'text', | |
| className = '', | |
| disabled = false, | |
| placeholder, | |
| helpText, | |
| required = false, | |
| maxLength, | |
| minLength, | |
| pattern, | |
| isTextarea = false, | |
| rows = 3, | |
| }: TextInputProps) { | |
| const currentValue = value ?? defaultValue; | |
| return ( | |
| <div className={className}> | |
| <Label> | |
| {label} | |
| {required && <span className="text-destructive ml-1">*</span>} | |
| </Label> | |
| {isTextarea ? ( | |
| <Textarea | |
| value={currentValue} | |
| placeholder={placeholder} | |
| onChange={(e) => onChange(e.target.value)} | |
| disabled={disabled} | |
| required={required} | |
| maxLength={maxLength} | |
| minLength={minLength} | |
| rows={rows} | |
| className={cn("mt-2", disabled && "opacity-50 cursor-not-allowed")} | |
| /> | |
| ) : ( | |
| <Input | |
| type={type} | |
| value={currentValue} | |
| placeholder={placeholder} | |
| onChange={(e) => onChange(e.target.value)} | |
| disabled={disabled} | |
| required={required} | |
| maxLength={maxLength} | |
| minLength={minLength} | |
| pattern={pattern} | |
| className={cn("mt-2", disabled && "opacity-50 cursor-not-allowed")} | |
| /> | |
| )} | |
| {helpText && ( | |
| <p className="text-xs text-muted-foreground mt-1"> | |
| {helpText} | |
| </p> | |
| )} | |
| </div> | |
| ); | |
| } |