use super::types::{SlideDirection, TransitionAnimation};
use crate::animation::Easing;
pub fn material_shared_axis_x() -> TransitionAnimation {
TransitionAnimation::SharedAxisX {
enter_duration_ms: 200,
exit_duration_ms: 300,
overlap_ms: 200, easing: Easing::CubicBezier(0.4, 0.0, 0.2, 1.0),
distance: 45.0,
}
}
pub fn material_shared_axis_y() -> TransitionAnimation {
TransitionAnimation::SharedAxisY {
enter_duration_ms: 200,
exit_duration_ms: 300,
overlap_ms: 200,
easing: Easing::CubicBezier(0.4, 0.0, 0.2, 1.0),
distance: 45.0,
}
}
pub fn material_fade_through() -> TransitionAnimation {
TransitionAnimation::FadeThrough {
exit_duration_ms: 100,
enter_duration_ms: 200,
exit_easing: Easing::Linear,
enter_easing: Easing::CubicBezier(0.4, 0.0, 0.2, 1.0),
enter_scale_from: 0.92,
}
}
pub fn cross_fade() -> TransitionAnimation {
TransitionAnimation::CrossFade {
duration_ms: 300,
easing: Easing::EaseInOutQuad,
}
}
pub fn ios_push() -> TransitionAnimation {
TransitionAnimation::PushLeft {
duration_ms: 350,
easing: Easing::EaseInOutQuad,
old_page_offset: 100.0,
}
}
pub fn slide_over() -> TransitionAnimation {
TransitionAnimation::SlideOver {
duration_ms: 300,
easing: Easing::EaseOutCubic,
direction: SlideDirection::Right,
enter_scale: 0.95,
}
}
pub fn zoom_in() -> TransitionAnimation {
TransitionAnimation::ZoomIn {
duration_ms: 400,
old_scale_to: 0.85,
new_scale_from: 1.2,
easing: Easing::EaseOutQuad,
}
}
pub fn circle_reveal() -> TransitionAnimation {
TransitionAnimation::CircleReveal {
duration_ms: 600,
easing: Easing::EaseOutQuad,
origin_x: 50.0,
origin_y: 50.0,
}
}
pub fn circle_reveal_from(origin_x: f64, origin_y: f64) -> TransitionAnimation {
TransitionAnimation::CircleReveal {
duration_ms: 600,
easing: Easing::EaseOutQuad,
origin_x,
origin_y,
}
}
pub fn stair_cascade() -> TransitionAnimation {
TransitionAnimation::StairCascade {
element_duration_ms: 400,
stagger_delay_ms: 100,
easing: Easing::EaseOutQuad,
old_page_fade_ms: 200,
translate_distance: 20.0,
}
}
pub fn stair_cascade_bounce() -> TransitionAnimation {
TransitionAnimation::StairCascade {
element_duration_ms: 400,
stagger_delay_ms: 80,
easing: Easing::CubicBezier(0.6, -0.05, 0.01, 0.99),
old_page_fade_ms: 200,
translate_distance: 20.0,
}
}
pub fn parallax_slide() -> TransitionAnimation {
TransitionAnimation::ParallaxSlide {
duration_ms: 500,
easing: Easing::EaseInOutQuad,
old_speed: 0.5,
new_speed: 1.0,
}
}
pub fn cross_fade_slow() -> TransitionAnimation {
TransitionAnimation::CrossFade {
duration_ms: 1000,
easing: Easing::EaseInOutQuad,
}
}
pub fn cross_fade_fast() -> TransitionAnimation {
TransitionAnimation::CrossFade {
duration_ms: 200,
easing: Easing::EaseInOutQuad,
}
}
pub fn slide_over_left() -> TransitionAnimation {
TransitionAnimation::SlideOver {
duration_ms: 300,
easing: Easing::EaseOutCubic,
direction: SlideDirection::Left,
enter_scale: 0.95,
}
}
pub fn slide_over_top() -> TransitionAnimation {
TransitionAnimation::SlideOver {
duration_ms: 400,
easing: Easing::EaseOutCubic,
direction: SlideDirection::Up,
enter_scale: 0.95,
}
}
pub fn zoom_out() -> TransitionAnimation {
TransitionAnimation::ZoomIn {
duration_ms: 400,
old_scale_to: 1.15,
new_scale_from: 0.85,
easing: Easing::EaseInQuad,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_material_shared_axis_x() {
let transition = material_shared_axis_x();
assert_eq!(transition.combined_duration_ms(), 300);
}
#[test]
fn test_material_fade_through() {
let transition = material_fade_through();
assert_eq!(transition.combined_duration_ms(), 300);
}
#[test]
fn test_cross_fade() {
let transition = cross_fade();
assert_eq!(transition.combined_duration_ms(), 300);
}
#[test]
fn test_ios_push() {
let transition = ios_push();
assert_eq!(transition.combined_duration_ms(), 350);
}
#[test]
fn test_zoom_in() {
let transition = zoom_in();
assert_eq!(transition.combined_duration_ms(), 400);
}
#[test]
fn test_circle_reveal() {
let transition = circle_reveal();
assert_eq!(transition.combined_duration_ms(), 600);
}
#[test]
fn test_circle_reveal_custom_origin() {
let transition = circle_reveal_from(100.0, 200.0);
if let TransitionAnimation::CircleReveal {
origin_x, origin_y, ..
} = transition
{
assert_eq!(origin_x, 100.0);
assert_eq!(origin_y, 200.0);
} else {
panic!("Expected CircleReveal variant");
}
}
#[test]
fn test_stair_cascade() {
let transition = stair_cascade();
let duration = transition.combined_duration_ms();
assert!(duration >= 200); assert!(duration <= 1500); }
#[test]
fn test_parallax_slide() {
let transition = parallax_slide();
assert_eq!(transition.combined_duration_ms(), 500);
}
#[test]
fn test_crossfade_variants() {
assert_eq!(cross_fade_slow().combined_duration_ms(), 1000);
assert_eq!(cross_fade_fast().combined_duration_ms(), 200);
}
#[test]
fn test_slide_over_directions() {
let left = slide_over_left();
let top = slide_over_top();
if let TransitionAnimation::SlideOver { direction, .. } = left {
assert_eq!(direction, SlideDirection::Left);
}
if let TransitionAnimation::SlideOver { direction, .. } = top {
assert_eq!(direction, SlideDirection::Up);
}
}
}