@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
CSS
/* ===== 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) ;
}
.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) ;
}
/* ===== 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% ;
height: auto ;
filter: none ;
transform: none ;
}
}
/* ===== 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 ;
transition: none ;
}
.image--hover-zoom:hover,
.image--hover-scale:hover {
transform: none ;
}
}
/* ===== HIGH CONTRAST ===== */
@media (prefers-contrast: high) {
.image {
filter: contrast(1.2);
}
.image:focus {
outline-width: 3px;
outline-offset: 3px;
}
}