@keyframes zoomEffect {
    from { transform: scale(1); }
    to { transform: scale(1.1); }
}

@keyframes gradientBG {
    0% { background-position: 0% 50%; }
    50% { background-position: 100% 50%; }
    100% { background-position: 0% 50%; }
}

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

/* Horizontal marquee for offers ticker (RTL-friendly) */
@keyframes offers-marquee {
    0% {
        transform: translateX(0);
    }
    100% {
        transform: translateX(-100%);
    }
}

/* Continuous horizontal loop for testimonials: move rightward then jump back for a crisp loop.
   We translate positive X (right) up to 50% of the track width which — with duplicated cards — creates a smooth repeat. */
@keyframes testimonials-marquee {
    0% {
        transform: translateX(0);
    }
    100% {
        transform: translateX(50%);
    }
}

.fade-in-section {
    opacity: 0;
    transform: translateY(20px);
    transition: opacity 0.6s ease-out, transform 0.6s ease-out;
}

.fade-in-section.is-visible {
    opacity: 1;
    transform: none;
}