////
///
/// Spin Keyframes Mixins Module
/// ===========================================================================
///
/// Defines keyframes for spin/rotation animations including basic spin,
/// reverse spin, spin with effects like scaling and pulsing. These keyframes
/// create continuous rotation effects for loaders and icons.
///
/// @group Keyframes
/// @author Scape Agency
/// @link https://move.gl
/// @since 0.1.0 initial release
/// @access public
///
////


// ============================================================================
// Use
// ============================================================================

@use "../../../variables" as *;
@use "../_base" as *;


// ============================================================================
// Basic Spin Keyframes
// ============================================================================

///
/// Standard continuous spin.
///
/// @param {Angle} $start_angle [0deg] - Starting angle
/// @param {Angle} $end_angle [360deg] - Ending angle
///
@mixin keyframes_spin($start_angle: 0deg, $end_angle: 360deg) {
    @include keyframes(animate_spin) {
        from {
            transform: rotate($start_angle);
        }
        to {
            transform: rotate($end_angle);
        }
    }
}

///
/// Spin with CSS custom property support.
///
@mixin keyframes_animate_spin() {
    @include keyframes(animate_spin) {
        from {
            transform: rotate(var(--animate-spin-start, 0deg));
        }
        to {
            transform: rotate(var(--animate-spin-end, #{$animate_angle_full}));
        }
    }
}


// ============================================================================
// Reverse Spin Keyframes
// ============================================================================

///
/// Counter-clockwise spin.
///
/// @param {Angle} $start_angle [360deg] - Starting angle
/// @param {Angle} $end_angle [0deg] - Ending angle
///
@mixin keyframes_spin_reverse($start_angle: 360deg, $end_angle: 0deg) {
    @include keyframes(animate_spin_reverse) {
        from {
            transform: rotate($start_angle);
        }
        to {
            transform: rotate($end_angle);
        }
    }
}


// ============================================================================
// Spin with Scale Keyframes
// ============================================================================

///
/// Spin combined with growing effect.
///
/// @param {Number} $scale [1.2] - Maximum scale
///
@mixin keyframes_spin_grow($scale: $animate_scale_pop) {
    @include keyframes(animate_spin_grow) {
        0%, 100% {
            transform: scale(1) rotate(0deg);
        }
        50% {
            transform: scale($scale) rotate(180deg);
        }
    }
}

///
/// Spin combined with shrinking effect.
///
/// @param {Number} $scale [0.8] - Minimum scale
///
@mixin keyframes_spin_shrink($scale: $animate_scale_shrink_min) {
    @include keyframes(animate_spin_shrink) {
        0%, 100% {
            transform: scale(1) rotate(0deg);
        }
        50% {
            transform: scale($scale) rotate(180deg);
        }
    }
}


// ============================================================================
// Spin Pulse Keyframes
// ============================================================================

///
/// Spin with pulsing scale effect.
///
/// @param {Number} $scale_min [1] - Minimum scale
/// @param {Number} $scale_max [1.1] - Maximum scale
/// @param {Angle} $rotation [360deg] - Full rotation
///
@mixin keyframes_spin_pulse($scale_min: 1, $scale_max: $animate_scale_bounce, $rotation: $animate_angle_full) {
    @include keyframes(animate_spin_pulse) {
        0%, 100% {
            transform: rotate(0deg) scale($scale_min);
        }
        50% {
            transform: rotate($rotation) scale($scale_max);
        }
    }
}


// ============================================================================
// Spin with Flip Keyframes
// ============================================================================

///
/// Spin combined with 3D flip effect.
///
/// @param {Angle} $rotation [360deg] - Z-axis rotation
/// @param {Angle} $flip [180deg] - Y-axis flip
///
@mixin keyframes_spin_flip($rotation: $animate_angle_full, $flip: 180deg) {
    @include keyframes(animate_spin_flip) {
        0% {
            transform: rotateZ(0deg) rotateY(0deg);
        }
        50% {
            transform: rotateZ($rotation * 0.5) rotateY($flip);
        }
        100% {
            transform: rotateZ($rotation) rotateY($flip * 2);
        }
    }
}


// ============================================================================
// Loader Spin Keyframes
// ============================================================================

///
/// Loader-style spin with easing.
///
@mixin keyframes_spin_loader() {
    @include keyframes(animate_spin_loader) {
        0% {
            transform: rotate(0deg);
        }
        100% {
            transform: rotate(360deg);
        }
    }
}

///
/// Dual ring loader spin.
///
@mixin keyframes_spin_dual() {
    @include keyframes(animate_spin_dual) {
        0% {
            transform: rotate(0deg);
        }
        50% {
            transform: rotate(180deg);
        }
        100% {
            transform: rotate(360deg);
        }
    }
}


// ============================================================================
// Wobble Spin Keyframes
// ============================================================================

///
/// Spin with wobbling effect.
///
/// @param {Angle} $wobble [5deg] - Wobble angle
///
@mixin keyframes_spin_wobble($wobble: $animate_angle_gentle) {
    @include keyframes(animate_spin_wobble) {
        0% {
            transform: rotate(0deg) rotateX(0deg);
        }
        25% {
            transform: rotate(90deg) rotateX($wobble);
        }
        50% {
            transform: rotate(180deg) rotateX(0deg);
        }
        75% {
            transform: rotate(270deg) rotateX(-$wobble);
        }
        100% {
            transform: rotate(360deg) rotateX(0deg);
        }
    }
}


// ============================================================================
// 3D Spin Keyframes
// ============================================================================

///
/// 3D spin on X-axis.
///
/// @param {Angle} $angle [360deg] - Rotation angle
///
@mixin keyframes_spin_x($angle: $animate_angle_full) {
    @include keyframes(animate_spin_x) {
        from {
            transform: perspective(400px) rotateX(0deg);
        }
        to {
            transform: perspective(400px) rotateX($angle);
        }
    }
}

///
/// 3D spin on Y-axis.
///
/// @param {Angle} $angle [360deg] - Rotation angle
///
@mixin keyframes_spin_y($angle: $animate_angle_full) {
    @include keyframes(animate_spin_y) {
        from {
            transform: perspective(400px) rotateY(0deg);
        }
        to {
            transform: perspective(400px) rotateY($angle);
        }
    }
}
