/* Scroll-reveal: elements start hidden and fade/slide in once
   animations.js adds .is-visible (via IntersectionObserver). */
[data-animate] {
    opacity: 0;
    transform: translateY(28px);
    transition: opacity 0.7s ease, transform 0.7s ease;
}
[data-animate].is-visible {
    opacity: 1;
    transform: translateY(0);
}
[data-animate="fade"] { transform: none; }
[data-animate="zoom"] { transform: scale(0.94); }
[data-animate="zoom"].is-visible { transform: scale(1); }

/* Stagger helper: add [data-animate] + style="--delay:2" on siblings */
[data-animate] { transition-delay: calc(var(--delay, 0) * 0.08s); }

@media (prefers-reduced-motion: reduce) {
    [data-animate] {
        opacity: 1 !important;
        transform: none !important;
        transition: none !important;
    }
}

/* Generic hover-lift, used on cards outside services.css */
.hover-lift { transition: transform var(--transition), box-shadow var(--transition); }
.hover-lift:hover { transform: translateY(-6px); box-shadow: var(--shadow-md); }

/* Counter number ticking is handled in JS by rewriting textContent;
   this just makes sure the element doesn't jump around while it does. */
.stat-number { font-variant-numeric: tabular-nums; }
