UNPKG

@gambito-corp/mbs-library

Version:

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

71 lines (65 loc) 3.02 kB
import React, { lazy, Suspense } from 'react'; const LazyImage = lazy(() => import('./Image.jsx')); const Image = (props) => ( <Suspense fallback={ <div className="animate-pulse bg-gray-200 rounded inline-flex items-center justify-center" style={{ width: props.size === 'xs' ? '24px' : props.size === 'small' ? '32px' : props.size === 'large' ? '64px' : props.size === 'xl' ? '96px' : '48px', height: props.size === 'xs' ? '24px' : props.size === 'small' ? '32px' : props.size === 'large' ? '64px' : props.size === 'xl' ? '96px' : '48px', borderRadius: props.variant === 'avatar' || props.shape === 'circle' ? '50%' : props.shape === 'square' ? '0' : '8px' }} > {/* Skeleton para icono */} <div className="animate-pulse bg-gray-300 rounded" style={{ width: props.size === 'xs' ? '8px' : props.size === 'small' ? '12px' : props.size === 'large' ? '24px' : props.size === 'xl' ? '32px' : '16px', height: props.size === 'xs' ? '8px' : props.size === 'small' ? '12px' : props.size === 'large' ? '24px' : props.size === 'xl' ? '32px' : '16px' }} ></div> {/* Skeleton para status indicator (solo avatars) */} {props.variant === 'avatar' && props.status && ( <div className="absolute bottom-0 right-0 animate-pulse bg-gray-300 rounded-full border-2 border-white" style={{ width: props.size === 'xs' ? '8px' : props.size === 'small' ? '10px' : props.size === 'large' ? '20px' : props.size === 'xl' ? '24px' : '16px', height: props.size === 'xs' ? '8px' : props.size === 'small' ? '10px' : props.size === 'large' ? '20px' : props.size === 'xl' ? '24px' : '16px' }} ></div> )} {/* Skeleton para badge */} {props.badge && ( <div className="absolute -top-1 -right-1 animate-pulse bg-gray-300 rounded-full" style={{ width: '16px', height: '16px' }} ></div> )} </div> }> <LazyImage {...props} /> </Suspense> ); export default Image;