UNPKG

@gambito-corp/mbs-library

Version:

Librería de componentes React reutilizables - Sistema de diseño modular y escalable

78 lines (70 loc) 3.41 kB
import React, { lazy, Suspense } from 'react'; const LazyTextArea = lazy(() => import('./TextArea.jsx')); const TextArea = (props) => ( <Suspense fallback={ <div className="textarea-container w-full"> {/* Skeleton para label */} {props.label && ( <div className="animate-pulse bg-gray-200 h-4 w-24 rounded mb-2"></div> )} {/* Skeleton para textarea con iconos */} <div className="relative"> <div className="animate-pulse bg-gray-200 rounded-lg border" style={{ height: props.autoGrow ? `${(props.minRows || 3) * 1.5}rem` : `${(props.rows || 3) * 1.5}rem`, width: props.fullWidth !== false ? '100%' : '300px', minHeight: '60px' }} > {/* Skeleton para icono izquierdo */} {(props.iconLeft) && ( <div className="absolute left-3 top-4 bg-gray-300 rounded" style={{ width: props.size === 'small' ? '12px' : props.size === 'large' ? '20px' : '16px', height: props.size === 'small' ? '12px' : props.size === 'large' ? '20px' : '16px' }} ></div> )} {/* Skeleton para icono derecho */} {(props.iconRight) && ( <div className="absolute right-3 top-4 bg-gray-300 rounded" style={{ width: props.size === 'small' ? '12px' : props.size === 'large' ? '20px' : '16px', height: props.size === 'small' ? '12px' : props.size === 'large' ? '20px' : '16px' }} ></div> )} {/* Skeleton para texto */} <div className="p-3 space-y-2"> <div className="animate-pulse bg-gray-300 h-3 w-3/4 rounded"></div> <div className="animate-pulse bg-gray-300 h-3 w-1/2 rounded"></div> {(props.rows > 2 || props.autoGrow) && ( <div className="animate-pulse bg-gray-300 h-3 w-2/3 rounded"></div> )} </div> </div> </div> {/* Skeleton para mensaje y contador */} <div className="flex justify-between items-start mt-2"> {(props.error || props.success || props.helperText) && ( <div className="animate-pulse bg-gray-200 h-3 w-32 rounded"></div> )} {props.maxLength && ( <div className="animate-pulse bg-gray-200 h-3 w-16 rounded ml-auto"></div> )} </div> </div> }> <LazyTextArea {...props} /> </Suspense> ); export default TextArea;