use super::types::ListAnimation;
use crate::animation::easing::Easing;
use crate::animation::stagger::{GridOrigin, DistanceMetric};
use std::time::Duration;
pub fn cascade_fade_in() -> ListAnimation {
ListAnimation::CascadeFadeIn {
per_item_delay: Duration::from_millis(50),
item_duration: Duration::from_millis(300),
easing: Easing::EaseOutCubic,
slide_distance: 30.0,
}
}
pub fn anime_grid_ripple() -> ListAnimation {
ListAnimation::GridRipple {
rows: 17,
cols: 17,
delay_per_unit: Duration::from_millis(100),
item_duration: Duration::from_millis(1700),
easing: Easing::EaseInOutQuad,
metric: DistanceMetric::Euclidean,
}
}
pub fn grid_wave_from_corner() -> ListAnimation {
ListAnimation::GridWave {
rows: 5,
cols: 10,
origin: GridOrigin::TopLeft,
delay_per_unit: Duration::from_millis(80),
item_duration: Duration::from_millis(500),
easing: Easing::EaseInOutQuad,
metric: DistanceMetric::Manhattan,
}
}
pub fn diagonal_sweep() -> ListAnimation {
ListAnimation::DiagonalSweep {
rows: 10,
cols: 10,
delay_per_step: Duration::from_millis(30),
item_duration: Duration::from_millis(600),
easing: Easing::EaseInOutCubic,
}
}
pub fn masonry_random() -> ListAnimation {
ListAnimation::MasonryLoad {
item_duration: Duration::from_millis(400),
stagger_delay: Duration::from_millis(30),
easing: Easing::EaseOutCubic,
slide_distance: 20.0,
}
}
pub fn expand_collapse() -> ListAnimation {
ListAnimation::ExpandCollapse {
duration: Duration::from_millis(300),
easing: Easing::EaseInOutCubic,
from_height: 0.0,
to_height: 1.0, }
}
pub fn scale_pop_stagger() -> ListAnimation {
ListAnimation::ScalePopIn {
per_item_delay: Duration::from_millis(40),
item_duration: Duration::from_millis(600),
easing: Easing::EaseOutBack,
overshoot: 1.2,
}
}
pub fn slide_from_left() -> ListAnimation {
ListAnimation::SlideFromSide {
per_item_delay: Duration::from_millis(60),
item_duration: Duration::from_millis(400),
easing: Easing::EaseOutCubic,
slide_distance: -20.0,
from_left: true,
}
}
pub fn slide_from_right() -> ListAnimation {
ListAnimation::SlideFromSide {
per_item_delay: Duration::from_millis(60),
item_duration: Duration::from_millis(400),
easing: Easing::EaseOutCubic,
slide_distance: 20.0,
from_left: false,
}
}
pub fn framer_stagger_children() -> ListAnimation {
ListAnimation::FramerStagger {
delay_children: Duration::from_millis(200),
stagger_children: Duration::from_millis(100),
item_duration: Duration::from_millis(400),
easing: Easing::EaseOutCubic,
}
}
pub fn checkerboard_reveal() -> ListAnimation {
ListAnimation::CheckerboardReveal {
rows: 8,
cols: 8,
even_delay: Duration::from_millis(0),
odd_delay: Duration::from_millis(400),
item_duration: Duration::from_millis(400),
easing: Easing::EaseInOutCubic,
}
}
pub fn spiral_reveal() -> ListAnimation {
ListAnimation::SpiralReveal {
rows: 8,
cols: 8,
delay_per_step: Duration::from_millis(30),
item_duration: Duration::from_millis(600),
easing: Easing::EaseOutElastic,
}
}
pub fn snake_pattern() -> ListAnimation {
ListAnimation::SnakePattern {
rows: 10,
cols: 10,
delay_per_step: Duration::from_millis(40),
item_duration: Duration::from_millis(500),
easing: Easing::EaseOutQuad,
}
}
pub fn flip_reorder() -> ListAnimation {
ListAnimation::FlipReorder {
duration: Duration::from_millis(400),
easing: Easing::EaseInOutCubic,
}
}
pub fn cascade_fast() -> ListAnimation {
ListAnimation::CascadeFadeIn {
per_item_delay: Duration::from_millis(30),
item_duration: Duration::from_millis(200),
easing: Easing::EaseOutQuad,
slide_distance: 20.0,
}
}
pub fn cascade_dramatic() -> ListAnimation {
ListAnimation::CascadeFadeIn {
per_item_delay: Duration::from_millis(100),
item_duration: Duration::from_millis(600),
easing: Easing::EaseOutExpo,
slide_distance: 50.0,
}
}
pub fn grid_from_corners() -> ListAnimation {
ListAnimation::GridWave {
rows: 10,
cols: 10,
origin: GridOrigin::Center,
delay_per_unit: Duration::from_millis(50),
item_duration: Duration::from_millis(600),
easing: Easing::EaseOutExpo,
metric: DistanceMetric::Euclidean,
}
}
pub fn grid_compact() -> ListAnimation {
ListAnimation::GridRipple {
rows: 8,
cols: 8,
delay_per_unit: Duration::from_millis(20),
item_duration: Duration::from_millis(300),
easing: Easing::EaseOutCubic,
metric: DistanceMetric::Manhattan,
}
}
pub fn grid_large() -> ListAnimation {
ListAnimation::GridRipple {
rows: 20,
cols: 20,
delay_per_unit: Duration::from_millis(150),
item_duration: Duration::from_millis(1000),
easing: Easing::EaseInOutQuad,
metric: DistanceMetric::Euclidean,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_all_presets_instantiate() {
let _a1 = cascade_fade_in();
let _a2 = anime_grid_ripple();
let _a3 = grid_wave_from_corner();
let _a4 = diagonal_sweep();
let _a5 = masonry_random();
let _a6 = expand_collapse();
let _a7 = scale_pop_stagger();
let _a8 = slide_from_left();
let _a9 = slide_from_right();
let _a10 = framer_stagger_children();
let _a11 = checkerboard_reveal();
let _a12 = spiral_reveal();
let _a13 = snake_pattern();
let _a14 = flip_reorder();
let _a15 = cascade_fast();
let _a16 = cascade_dramatic();
let _a17 = grid_from_corners();
let _a18 = grid_compact();
let _a19 = grid_large();
}
#[test]
fn test_cascade_generates_delays() {
let anim = cascade_fade_in();
let delays = anim.delays_for_count(5);
assert_eq!(delays.len(), 5);
assert!(delays[0] < delays[1]);
assert!(delays[1] < delays[2]);
}
#[test]
fn test_grid_ripple_generates_delays() {
let anim = anime_grid_ripple();
let delays = anim.delays_for_grid(17, 17);
assert_eq!(delays.len(), 17 * 17);
}
#[test]
fn test_framer_stagger_has_delay_children() {
let anim = framer_stagger_children();
let delays = anim.delays_for_count(5);
assert_eq!(delays.len(), 5);
assert!(delays[0] >= Duration::from_millis(200));
}
}