@gambito-corp/mbs-library
Version:
Librería de componentes React reutilizables - Sistema de diseño modular y escalable
64 lines (57 loc) • 2.81 kB
JSX
import React, { lazy, Suspense } from 'react';
const LazyInput = lazy(() => import('./Input.jsx'));
const Input = (props) => (
<Suspense fallback={
<div className="input-container w-full">
{/* Skeleton para label */}
{props.label && (
<div className="animate-pulse bg-gray-200 h-4 w-20 rounded mb-2"></div>
)}
{/* Skeleton para input con iconos */}
<div className="relative">
<div
className="animate-pulse bg-gray-200 rounded-lg border"
style={{
height: props.size === 'small' ? '32px' :
props.size === 'large' ? '48px' : '40px',
width: props.fullWidth !== false ? '100%' : '200px'
}}
>
{/* ✅ Skeleton para icono izquierdo */}
{(props.iconLeft || (props.icon && props.iconPosition === 'left')) && (
<div
className="absolute left-3 top-1/2 transform -translate-y-1/2 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 ||
(props.icon && props.iconPosition === 'right') ||
(props.showPasswordToggle && props.type === 'password')) && (
<div
className="absolute right-3 top-1/2 transform -translate-y-1/2 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>
)}
</div>
</div>
{/* Skeleton para mensaje */}
{(props.error || props.success || props.helperText) && (
<div className="animate-pulse bg-gray-200 h-3 w-32 rounded mt-2"></div>
)}
</div>
}>
<LazyInput {...props} />
</Suspense>
);
export default Input;