////
///
/// Wobble Animations Mixin Module
/// ===========================================================================
///
/// Provides unsteady wobbling animations that alternate rotation direction.
/// Includes gentle, rapid, and horizontal variants. Perfect for error states,
/// attention seekers, and playful feedback animations.
///
/// @group Animations
/// @author Scape Agency
/// @link https://move.gl
/// @since 0.1.0 initial release
/// @access public
///
////


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

@use "../../dev" as *;
@use "../../variables" as *;
@use "../keyframes" as *;
@use "base" as *;


// ============================================================================
// Mixins
// ============================================================================

///
/// Wobble Animation
/// ---------------------------------------------------------------------------
/// Creates a wobble effect by rotating an element back and forth.
///
/// @name animate_wobble
/// @param {Angle} $angle [$animate_angle_wobble] - The maximum rotation angle.
/// @param {Time} $duration [$animate_base_duration] - Animation duration.
/// @param {String} $timing_function [$animate_base_timing_function] - Timing function.
/// @param {Number|String} $iteration_count [$animate_base_iteration_count] - Iterations.
///
/// @example scss - Basic usage
///   .element {
///     @include animate_wobble;
///   }
///
@mixin animate_wobble(
    $angle: $animate_angle_wobble,
    $duration: $animate_base_duration,
    $timing_function: $animate_base_timing_function,
    $iteration_count: $animate_base_iteration_count
) {
    @include animate_base(
        animate_wobble,
        $duration,
        $timing_function,
        $iteration_count
    );
    @include keyframes_wobble($angle);
}


///
/// Gentle Wobble Animation
/// ---------------------------------------------------------------------------
/// A slower and subtler wobble animation.
///
/// @name animate_wobble_slow
/// @param {Angle} $angle [$animate_angle_wobble_slow] - Maximum rotation angle.
/// @param {Time} $duration [$animate_base_duration_slow] - Animation duration.
/// @param {String} $timing_function [$animate_base_timing_function] - Timing function.
/// @param {Number|String} $iteration_count [$animate_base_iteration_count] - Iterations.
///
@mixin animate_wobble_slow(
    $angle: $animate_angle_wobble_slow,
    $duration: $animate_base_duration_slow,
    $timing_function: $animate_base_timing_function,
    $iteration_count: $animate_base_iteration_count
) {
    @include animate_base(
        animate_wobble_slow,
        $duration,
        $timing_function,
        $iteration_count
    );
    @include keyframes_wobble_slow($angle);
}


///
/// Rapid Wobble Animation
/// ---------------------------------------------------------------------------
/// A faster and more intense wobble animation.
///
/// @name animate_wobble_fast
/// @param {Angle} $angle [$animate_angle_wobble_fast] - Maximum rotation angle.
/// @param {Time} $duration [$animate_base_duration_fast] - Animation duration.
/// @param {String} $timing_function [$animate_base_timing_function] - Timing function.
/// @param {Number|String} $iteration_count [$animate_base_iteration_count] - Iterations.
///
@mixin animate_wobble_fast(
    $angle: $animate_angle_wobble_fast,
    $duration: $animate_base_duration_fast,
    $timing_function: $animate_base_timing_function,
    $iteration_count: $animate_base_iteration_count
) {
    @include animate_base(
        animate_wobble_fast,
        $duration,
        $timing_function,
        $iteration_count
    );
    @include keyframes_wobble_fast($angle);
}


///
/// Wobble with Scale Animation
/// ---------------------------------------------------------------------------
/// A wobble animation combined with a scaling effect.
///
/// @name animate_wobble_scale
/// @param {Angle} $angle [$animate_angle_wobble] - Maximum rotation angle.
/// @param {Number} $scale [1.1] - Scale factor during wobble.
/// @param {Time} $duration [$animate_base_duration] - Animation duration.
/// @param {String} $timing_function [$animate_base_timing_function] - Timing function.
/// @param {Number|String} $iteration_count [$animate_base_iteration_count] - Iterations.
///
@mixin animate_wobble_scale(
    $angle: $animate_angle_wobble,
    $scale: 1.1,
    $duration: $animate_base_duration,
    $timing_function: $animate_base_timing_function,
    $iteration_count: $animate_base_iteration_count
) {
    @include animate_base(
        animate_wobble_scale,
        $duration,
        $timing_function,
        $iteration_count
    );
    @include keyframes_wobble_scale($angle, $scale);
}


///
/// Advanced Wobble Animation (Animate.css style)
/// ---------------------------------------------------------------------------
/// Complex wobble with translation, similar to Animate.css wobble.
///
/// @name animate_wobble_advanced
/// @param {Time} $duration [$animate_base_duration] - Animation duration.
/// @param {String} $timing_function [$animate_base_timing_function] - Timing function.
/// @param {Number|String} $iteration_count [$animate_base_iteration_count] - Iterations.
///
/// @example scss - Usage
///   .attention-element {
///     @include animate_wobble_advanced;
///   }
///
@mixin animate_wobble_advanced(
    $duration: $animate_base_duration,
    $timing_function: $animate_base_timing_function,
    $iteration_count: $animate_base_iteration_count
) {
    @include animate_base(
        animate_wobble_advanced,
        $duration,
        $timing_function,
        $iteration_count
    );
    @include keyframes_wobble_advanced();
}


///
/// Horizontal Wobble Animation
/// ---------------------------------------------------------------------------
/// Wobble animation using horizontal translation.
///
/// @name animate_wobble_horizontal
/// @param {Length} $distance [5%] - Maximum horizontal distance.
/// @param {Time} $duration [$animate_base_duration] - Animation duration.
/// @param {String} $timing_function [$animate_base_timing_function] - Timing function.
/// @param {Number|String} $iteration_count [$animate_base_iteration_count] - Iterations.
///
@mixin animate_wobble_horizontal(
    $distance: 5%,
    $duration: $animate_base_duration,
    $timing_function: $animate_base_timing_function,
    $iteration_count: $animate_base_iteration_count
) {
    @include animate_base(
        animate_wobble_horizontal,
        $duration,
        $timing_function,
        $iteration_count
    );
    @include keyframes_wobble_horizontal($distance);
}


///
/// Vertical Wobble Animation
/// ---------------------------------------------------------------------------
/// Wobble animation using vertical translation.
///
/// @name animate_wobble_vertical
/// @param {Length} $distance [5%] - Maximum vertical distance.
/// @param {Time} $duration [$animate_base_duration] - Animation duration.
/// @param {String} $timing_function [$animate_base_timing_function] - Timing function.
/// @param {Number|String} $iteration_count [$animate_base_iteration_count] - Iterations.
///
@mixin animate_wobble_vertical(
    $distance: 5%,
    $duration: $animate_base_duration,
    $timing_function: $animate_base_timing_function,
    $iteration_count: $animate_base_iteration_count
) {
    @include animate_base(
        animate_wobble_vertical,
        $duration,
        $timing_function,
        $iteration_count
    );
    @include keyframes_wobble_vertical($distance);
}


///
/// Skew Wobble Animation
/// ---------------------------------------------------------------------------
/// Wobble animation using skew transformation.
///
/// @name animate_wobble_skew
/// @param {Angle} $skew [5deg] - Maximum skew angle.
/// @param {Time} $duration [$animate_base_duration] - Animation duration.
/// @param {String} $timing_function [$animate_base_timing_function] - Timing function.
/// @param {Number|String} $iteration_count [$animate_base_iteration_count] - Iterations.
///
@mixin animate_wobble_skew(
    $skew: 5deg,
    $duration: $animate_base_duration,
    $timing_function: $animate_base_timing_function,
    $iteration_count: $animate_base_iteration_count
) {
    @include animate_base(
        animate_wobble_skew,
        $duration,
        $timing_function,
        $iteration_count
    );
    @include keyframes_wobble_skew($skew);
}


///
/// Pendulum Wobble Animation
/// ---------------------------------------------------------------------------
/// Pendulum-style wobble from top origin.
///
/// @name animate_wobble_pendulum
/// @param {Angle} $angle [10deg] - Maximum swing angle.
/// @param {Time} $duration [$animate_base_duration] - Animation duration.
/// @param {String} $timing_function [$animate_base_timing_function] - Timing function.
/// @param {Number|String} $iteration_count [$animate_base_iteration_count] - Iterations.
///
@mixin animate_wobble_pendulum(
    $angle: 10deg,
    $duration: $animate_base_duration,
    $timing_function: $animate_base_timing_function,
    $iteration_count: $animate_base_iteration_count
) {
    @include animate_base(
        animate_wobble_pendulum,
        $duration,
        $timing_function,
        $iteration_count
    );
    @include keyframes_wobble_pendulum($angle);
}
