use core::time::Duration;
use waterui::animation::Animation;
use waterui_core::EasingCurve;
pub mod duration {
use core::time::Duration;
pub const SHORT_1: Duration = Duration::from_millis(50);
pub const SHORT_2: Duration = Duration::from_millis(100);
pub const SHORT_3: Duration = Duration::from_millis(150);
pub const SHORT_4: Duration = Duration::from_millis(200);
pub const MEDIUM_1: Duration = Duration::from_millis(250);
pub const MEDIUM_2: Duration = Duration::from_millis(300);
pub const MEDIUM_3: Duration = Duration::from_millis(350);
pub const MEDIUM_4: Duration = Duration::from_millis(400);
pub const LONG_1: Duration = Duration::from_millis(450);
pub const LONG_2: Duration = Duration::from_millis(500);
pub const LONG_3: Duration = Duration::from_millis(550);
pub const LONG_4: Duration = Duration::from_millis(600);
pub const EXTRA_LONG_1: Duration = Duration::from_millis(700);
pub const EXTRA_LONG_2: Duration = Duration::from_millis(800);
pub const EXTRA_LONG_3: Duration = Duration::from_millis(900);
#[allow(
clippy::duration_suboptimal_units,
reason = "the M3 duration scale is specified in milliseconds; from_secs(1) would break the table"
)]
pub const EXTRA_LONG_4: Duration = Duration::from_millis(1000);
}
pub mod easing {
use waterui_core::EasingCurve;
pub const LINEAR: EasingCurve = EasingCurve::bezier(0.0, 0.0, 1.0, 1.0);
pub const STANDARD: EasingCurve = EasingCurve::bezier(0.2, 0.0, 0.0, 1.0);
pub const STANDARD_ACCELERATE: EasingCurve = EasingCurve::bezier(0.3, 0.0, 1.0, 1.0);
pub const STANDARD_DECELERATE: EasingCurve = EasingCurve::bezier(0.0, 0.0, 0.0, 1.0);
pub const EMPHASIZED: EasingCurve = STANDARD;
pub const EMPHASIZED_ACCELERATE: EasingCurve = EasingCurve::bezier(0.3, 0.0, 0.8, 0.15);
pub const EMPHASIZED_DECELERATE: EasingCurve = EasingCurve::bezier(0.05, 0.7, 0.1, 1.0);
}
#[must_use]
pub const fn motion(easing: EasingCurve, duration: Duration) -> Animation {
match easing {
EasingCurve::CubicBezier(x1, y1, x2, y2) => Animation::bezier(duration, x1, y1, x2, y2),
EasingCurve::Spring { .. } => {
panic!("Material motion easing tokens are cubic-bezier curves")
}
}
}
#[cfg(test)]
mod tests {
use super::{duration, easing, motion};
use core::time::Duration;
use waterui::animation::Animation;
use waterui_core::EasingCurve;
#[test]
fn duration_scale_matches_the_material_3_specification() {
let scale = [
(duration::SHORT_1, 50),
(duration::SHORT_2, 100),
(duration::SHORT_3, 150),
(duration::SHORT_4, 200),
(duration::MEDIUM_1, 250),
(duration::MEDIUM_2, 300),
(duration::MEDIUM_3, 350),
(duration::MEDIUM_4, 400),
(duration::LONG_1, 450),
(duration::LONG_2, 500),
(duration::LONG_3, 550),
(duration::LONG_4, 600),
(duration::EXTRA_LONG_1, 700),
(duration::EXTRA_LONG_2, 800),
(duration::EXTRA_LONG_3, 900),
(duration::EXTRA_LONG_4, 1000),
];
for (token, millis) in scale {
assert_eq!(token, Duration::from_millis(millis));
}
}
#[test]
fn easing_set_matches_the_material_3_specification() {
assert_eq!(easing::LINEAR, EasingCurve::bezier(0.0, 0.0, 1.0, 1.0));
assert_eq!(easing::STANDARD, EasingCurve::bezier(0.2, 0.0, 0.0, 1.0));
assert_eq!(
easing::STANDARD_ACCELERATE,
EasingCurve::bezier(0.3, 0.0, 1.0, 1.0)
);
assert_eq!(
easing::STANDARD_DECELERATE,
EasingCurve::bezier(0.0, 0.0, 0.0, 1.0)
);
assert_eq!(easing::EMPHASIZED, easing::STANDARD);
assert_eq!(
easing::EMPHASIZED_ACCELERATE,
EasingCurve::bezier(0.3, 0.0, 0.8, 0.15)
);
assert_eq!(
easing::EMPHASIZED_DECELERATE,
EasingCurve::bezier(0.05, 0.7, 0.1, 1.0)
);
}
#[test]
fn linear_token_agrees_with_the_linear_animation_constructor() {
assert_eq!(
motion(easing::LINEAR, duration::SHORT_4),
Animation::linear(duration::SHORT_4)
);
}
}