import { useMemo } from 'react' import type { ReactNode } from 'react' interface TextareaProps extends React.TextareaHTMLAttributes { label?: string error?: string helperText?: string leftIcon?: ReactNode rightIcon?: ReactNode } function generateId(prefix: string, providedId?: string): string { if (providedId) { return providedId } return `${prefix}-${Date.now().toString(36)}-${Math.random().toString(36).substr(2, 5)}` } function getErrorClasses(error: string | undefined): string { if (!error) { return '' } return 'border-red-500/50 focus:border-red-500 focus:ring-red-500/50' } function getTextareaClasses(params: { error: string | undefined leftIcon: ReactNode | undefined rightIcon: ReactNode | undefined className: string }): string { const baseClasses = 'block w-full px-3 py-2 border rounded-lg bg-cyber-dark text-cyber-accent placeholder-cyber-accent/50 focus:outline-none focus:ring-2 focus:ring-neon-cyan focus:border-neon-cyan transition-colors resize-y' const errorClasses = getErrorClasses(params.error) const paddingLeft = params.leftIcon ? 'pl-10' : '' const paddingRight = params.rightIcon ? 'pr-10' : '' return `${baseClasses} ${errorClasses} ${paddingLeft} ${paddingRight} ${params.className}`.trim() } function getAriaDescribedBy(textareaId: string, error: string | undefined, helperText: string | undefined): string | undefined { if (error) { return `${textareaId}-error` } if (helperText) { return `${textareaId}-helper` } return undefined } function TextareaLabel({ textareaId, label }: { textareaId: string; label: string }): React.ReactElement { return ( ) } function TextareaIcons({ leftIcon, rightIcon }: { leftIcon?: ReactNode; rightIcon?: ReactNode }): React.ReactElement | null { if (!leftIcon && !rightIcon) { return null } return ( <> {leftIcon && (
{leftIcon}
)} {rightIcon && (
{rightIcon}
)} ) } function TextareaError({ textareaId, error }: { textareaId: string; error: string }): React.ReactElement { return ( ) } function TextareaHelper({ textareaId, helperText }: { textareaId: string; helperText: string }): React.ReactElement { return (

{helperText}

) } export function Textarea({ label, error, helperText, leftIcon, rightIcon, className = '', id, ...props }: TextareaProps): React.ReactElement { const textareaId = useMemo(() => generateId('textarea', id), [id]) const textareaClasses = useMemo( () => getTextareaClasses({ error, leftIcon, rightIcon, className }), [error, leftIcon, rightIcon, className] ) const ariaDescribedBy = useMemo(() => getAriaDescribedBy(textareaId, error, helperText), [textareaId, error, helperText]) return (
{label && }