/* Explain: CSS for various animations and transitions for dynamic page elements. */
/* ===== Mouvements & apparitions ===== */

:root {
    --ease-soft: cubic-bezier(0.22, 0.61, 0.36, 1);
}

@keyframes fadeUp {
    from {
        opacity: 0;
        transform: translateY(26px);
    }
    to {
        opacity: 1;
        transform: translateY(0);
    }
}

@keyframes heroZoom {
    from {
        transform: scale(1.06);
    }
    to {
        transform: scale(1);
    }
}

@keyframes floatY {
    0%, 100% {
        transform: translateY(0);
    }
    50% {
        transform: translateY(-10px);
    }
}

@keyframes softPulse {
    0%, 100% {
        box-shadow: 0 0 0 0 var(--sage-soft);
    }
    50% {
        box-shadow: 0 0 0 14px rgba(47, 125, 69, 0);
    }
}

@keyframes scrollCue {
    0%, 100% {
        transform: translate(-50%, 0);
        opacity: 0.65;
    }
    50% {
        transform: translate(-50%, 12px);
        opacity: 1;
    }
}

/* Apparition des sections au défilement */
.reveal {
    opacity: 0;
    transform: translateY(30px);
    transition: opacity 0.8s var(--ease-soft), transform 0.8s var(--ease-soft);
    will-change: opacity, transform;
}

.reveal.is-visible {
    opacity: 1;
    transform: none;
}

/* Héros animé */
.hero-title {
    animation: fadeUp 1s 0.1s both;
}

.hero-sub {
    animation: fadeUp 1s 0.28s both;
}

.hero-actions {
    animation: fadeUp 1s 0.46s both;
}

.hero-full-bg {
    animation: heroZoom 14s ease-out both;
}

.hero-scroll {
    animation: scrollCue 2.2s ease-in-out infinite;
}

/* Micro-interactions des boutons */
.btn {
    transition-property: transform, box-shadow, background-color, border-color, color;
    transition-duration: 0.3s;
    transition-timing-function: ease;
}

.btn:hover {
    transform: translateY(-3px);
}

.btn:active {
    transform: translateY(-1px);
}

.brand-mark {
    transition: transform 0.35s ease;
}

a:hover > .brand-mark {
    transform: rotate(-6deg) scale(1.05);
}

/* Zoom doux sur les images */
.media-frame img,
.split-media img,
.program-card-media img {
    transition: transform 0.8s ease;
}

.media-frame:hover img,
.split-media:hover img {
    transform: scale(1.05);
}

/* Éléments décoratifs */
.float-slow {
    animation: floatY 6s ease-in-out infinite;
}

.pulse-soft {
    animation: softPulse 3.6s ease-in-out infinite;
}

/* Image de héros : zoom lent et vivant, en continu */
@keyframes heroMediaZoom {
    0% {
        transform: scale(1) translate3d(0, 0, 0);
    }
    50% {
        transform: scale(1.08) translate3d(-1.6%, -1.6%, 0);
    }
    100% {
        transform: scale(1) translate3d(0, 0, 0);
    }
}

.hero-media-animated img {
    animation: heroMediaZoom 18s ease-in-out infinite;
    will-change: transform;
}

@media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
        animation: none !important;
        transition: none !important;
    }

    .reveal {
        opacity: 1;
        transform: none;
    }
}