UNPKG

@gambito-corp/mbs-library

Version:

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

216 lines (178 loc) 3.87 kB
/* ===== BLOCK: image ===== */ .image { display: block; max-width: 100%; height: auto; object-fit: cover; border: none; outline: none; user-select: none; cursor: default; } /* ===== MODIFIERS: Hover Effects ===== */ .image--hover-zoom { cursor: pointer; overflow: hidden; } .image--hover-zoom:hover { transform: scale(1.05); } .image--hover-brightness { cursor: pointer; } .image--hover-brightness:hover { filter: brightness(1.2) !important; } .image--hover-scale { cursor: pointer; } .image--hover-scale:hover { transform: scale(1.1); } .image--hover-blur { cursor: pointer; } .image--hover-blur:hover { filter: blur(2px) !important; } /* ===== MODIFIERS: Estados ===== */ .image--fade-in { animation: imageFadeIn 0.3s ease-in-out; } .image--zoomable { cursor: zoom-in; } .image--zoomable:hover { cursor: zoom-out; } /* ===== ANIMACIONES ===== */ @keyframes imageFadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes imageSkeleton { 0% { background-position: -200px 0; } 100% { background-position: calc(200px + 100%) 0; } } /* ===== PLACEHOLDER SKELETON ===== */ .image--skeleton { background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); background-size: 200px 100%; animation: imageSkeleton 1.5s infinite; } /* ===== ESTADOS DE CARGA ===== */ .image--loading { opacity: 0.6; filter: blur(1px); } .image--error { background-color: #fee2e2; border: 2px dashed #ef4444; display: flex; align-items: center; justify-content: center; color: #ef4444; font-size: 14px; } .image--error::before { content: "⚠️ Error al cargar imagen"; } /* ===== FILTROS PREDEFINIDOS ===== */ .image--grayscale { filter: grayscale(100%); } .image--sepia { filter: sepia(100%); } .image--blur { filter: blur(5px); } .image--bright { filter: brightness(1.3); } .image--contrast { filter: contrast(1.3); } .image--saturate { filter: saturate(1.5); } /* ===== OBJECT FIT VARIANTS ===== */ .image--fit-contain { object-fit: contain; } .image--fit-cover { object-fit: cover; } .image--fit-fill { object-fit: fill; } .image--fit-none { object-fit: none; } .image--fit-scale-down { object-fit: scale-down; } /* ===== ACCESIBILIDAD ===== */ .image:focus { outline: 2px solid #3b82f6; outline-offset: 2px; } /* ===== RESPONSIVE ===== */ @media (max-width: 768px) { .image--hover-zoom:hover, .image--hover-scale:hover { transform: none; } } /* ===== MODO OSCURO ===== */ [data-theme="dark"] .image { filter: brightness(0.9); } [data-theme="dark"] .image--error { background-color: #7f1d1d; border-color: #dc2626; color: #fca5a5; } /* ===== PRINT STYLES ===== */ @media print { .image { max-width: 100% !important; height: auto !important; filter: none !important; transform: none !important; } } /* ===== REDUCED MOTION ===== */ @media (prefers-reduced-motion: reduce) { .image, .image--fade-in, .image--hover-zoom, .image--hover-brightness, .image--hover-scale, .image--hover-blur { animation: none !important; transition: none !important; } .image--hover-zoom:hover, .image--hover-scale:hover { transform: none !important; } } /* ===== HIGH CONTRAST ===== */ @media (prefers-contrast: high) { .image { filter: contrast(1.2); } .image:focus { outline-width: 3px; outline-offset: 3px; } }