/*
 * Testimonials widget — slide-up entrance animation.
 *
 * Only non-cloned slides are hidden initially so the Slick infinite-loop
 * clones are always visible when the carousel wraps around.
 */

.widget-testimonials.will-animate
    .slick-slide:not(.slick-cloned)
    [class*="testimonials-item"] {
    opacity: 0;
    transform: translateY(var(--animate-distance, 36px));
    transition:
        opacity   var(--animate-duration, 600ms) ease,
        transform var(--animate-duration, 600ms) ease;
    transition-delay: calc(
        var(--animate-stagger, 150ms) * 0.3 +
        var(--col-index, 0) * var(--animate-stagger, 150ms)
    );
}

.widget-testimonials.will-animate
    .slick-slide:not(.slick-cloned)
    [class*="testimonials-item"].is-animated {
    opacity: 1;
    transform: translateY(0);
}

/* Skip animation in Elementor editor */
.elementor-editor-active
    .widget-testimonials.will-animate
    .slick-slide:not(.slick-cloned)
    [class*="testimonials-item"] {
    opacity: 1;
    transform: none;
    transition: none;
}

/* ── Typewriter effect on the last 20% of description text ── */

.widget-testimonials.will-animate .tw-char {
    opacity: 0;
    transition: opacity 55ms linear;
    /* transition-delay is set inline per character by JS */
}

/* Reveal chars once the parent card is marked as animated */
.widget-testimonials.will-animate
    [class*="testimonials-item"].is-animated
    .tw-char {
    opacity: 1;
}

/* Editor: always show chars */
.elementor-editor-active .widget-testimonials .tw-char {
    opacity: 1;
    transition: none;
}
