/*
 * FILE: assets/css/animations.css
 * PURPOSE: Animaciones y transiciones controladas por JS.
 *          Siempre respetar prefers-reduced-motion en este archivo.
 *
 * IMPORTANTE: el JS añade/quita clases — el CSS define el efecto visual.
 * Regla: no poner lógica de negocio acá, solo propiedades de presentación.
 */

/* ============================================================
   SCROLL REVEAL — Clases aplicadas por scroll-reveal.js
   ============================================================ */

/*
 * Progressive enhancement:
 * Por defecto (sin JS o si el JS falla) → contenido VISIBLE.
 * Solo se oculta para animar si <html> tiene la clase .js-ready
 * (la añade scroll-reveal.js apenas arranca).
 *
 * Esto garantiza que la web nunca quede en blanco aunque el JS no cargue.
 */
.reveal {
    opacity: 1;
    transform: none;
    transition:
        opacity   0.55s cubic-bezier(0.16, 1, 0.3, 1),
        transform 0.55s cubic-bezier(0.16, 1, 0.3, 1);
}

.js-ready .reveal {
    opacity: 0;
    transform: translateY(28px);
    will-change: opacity, transform;
}

.js-ready .reveal--fade-left  { transform: translateX(-32px); }
.js-ready .reveal--fade-right { transform: translateX(32px); }
.js-ready .reveal--scale      { transform: scale(0.94); }

/* Estado visible — el JS añade esta clase al entrar al viewport */
.reveal--visible,
.js-ready .reveal--visible {
    opacity: 1;
    transform: translate(0) scale(1);
}

/* ============================================================
   OBRAS FILTER — Clases aplicadas por obras-filter.js
   ============================================================ */

/*
 * .is-visible → mostrar con fade-in + ligero slide-up
 * .is-hidden  → ocultar con fade-out
 * JS pone hidden="" después de transitionend cuando is-hidden está activo
 */
.obras-grid__item {
    transition:
        opacity   0.3s ease,
        transform 0.3s ease;
}

.obras-grid__item.is-hidden {
    opacity: 0;
    transform: scale(0.96);
    pointer-events: none;
}

.obras-grid__item.is-visible {
    opacity: 1;
    transform: scale(1);
}

/* ============================================================
   NAVBAR — Clases aplicadas por navbar.js
   ============================================================ */

/* Sombra al hacer scroll */
.navbar--scrolled {
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.25);
}

/* Hamburger → X cuando el menú está abierto */
.navbar__hamburger.is-active .navbar__hamburger-bar:nth-child(1) {
    transform: translateY(7px) rotate(45deg);
}
.navbar__hamburger.is-active .navbar__hamburger-bar:nth-child(2) {
    opacity: 0;
    transform: scaleX(0);
}
.navbar__hamburger.is-active .navbar__hamburger-bar:nth-child(3) {
    transform: translateY(-7px) rotate(-45deg);
}

.navbar__hamburger-bar {
    transition:
        transform var(--transition-normal),
        opacity   var(--transition-fast);
}

/* Body lock — previene scroll de fondo en mobile */
.body--menu-open {
    overflow: hidden;
}

/* ============================================================
   ACCESIBILIDAD — Clase de utilidad para lectores de pantalla
   ============================================================ */

/* Visualmente oculto pero accesible para screen readers */
.sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

/* ============================================================
   PREFERS-REDUCED-MOTION — Deshabilitar todo para usuarios sensibles
   ============================================================ */
@media (prefers-reduced-motion: reduce) {
    .reveal,
    .reveal--fade-left,
    .reveal--fade-right,
    .reveal--scale {
        opacity: 1;
        transform: none;
        transition: none;
    }

    .obras-grid__item {
        transition: none;
    }

    .navbar__hamburger-bar {
        transition: none;
    }

    .navbar--scrolled {
        transition: none;
    }
}
