.js [data-reveal] {
    opacity: 0;
    transition:
        opacity 0.75s ease var(--reveal-delay, 0ms),
        transform 0.75s cubic-bezier(0.2, 0.75, 0.25, 1) var(--reveal-delay, 0ms);
    will-change: opacity, transform;
}

.js [data-reveal="up"] {
    transform: translateY(34px);
}

.js [data-reveal="left"] {
    transform: translateX(-42px);
}

.js [data-reveal="right"] {
    transform: translateX(42px);
}

.js [data-reveal="zoom"] {
    transform: scale(0.94);
}

.js [data-reveal].is-visible {
    opacity: 1;
    transform: none;
}

@keyframes scrollBounce {
    0%, 100% { transform: translateY(0); }
    50% { transform: translateY(8px); }
}

@keyframes statusPulse {
    0%, 100% { box-shadow: 0 0 0 5px rgba(98, 186, 105, 0.14); }
    50% { box-shadow: 0 0 0 9px rgba(98, 186, 105, 0.04); }
}

@keyframes decoFloat {
    0%, 100% { translate: 0 0; }
    50% { translate: 0 -12px; }
}

@media (prefers-reduced-motion: reduce) {
    html {
        scroll-behavior: auto;
    }

    *,
    *::before,
    *::after {
        scroll-behavior: auto !important;
        transition-duration: 0.01ms !important;
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
    }

    .js [data-reveal] {
        opacity: 1;
        transform: none;
    }
}
