use super::types::{ButtonAnimation, SlideOrigin, SweepDirection};
use crate::animation::{Easing, Spring};
pub fn material_hover() -> ButtonAnimation {
ButtonAnimation::Hover {
duration_ms: 200,
easing: Easing::EaseOutCubic,
opacity_from: 0.0,
opacity_to: 0.08,
}
}
pub fn fast_subtle_hover() -> ButtonAnimation {
ButtonAnimation::Hover {
duration_ms: 150,
easing: Easing::Linear,
opacity_from: 0.0,
opacity_to: 0.05,
}
}
pub fn ios_press() -> ButtonAnimation {
ButtonAnimation::Press {
duration_ms: 100,
easing: Easing::CubicBezier(0.4, 0.0, 0.2, 1.0),
scale: 0.97,
}
}
pub fn simple_press() -> ButtonAnimation {
ButtonAnimation::Press {
duration_ms: 100,
easing: Easing::EaseOutCubic,
scale: 0.95,
}
}
pub fn bounce_press() -> ButtonAnimation {
ButtonAnimation::Press {
duration_ms: 100,
easing: Easing::EaseInCubic,
scale: 0.9,
}
}
pub fn ios_release() -> ButtonAnimation {
ButtonAnimation::Release {
spring: Spring::new().stiffness(350.0).damping(28.0),
}
}
pub fn framer_spring_press() -> ButtonAnimation {
ButtonAnimation::Release {
spring: Spring::new().stiffness(400.0).damping(17.0),
}
}
pub fn material_ripple() -> ButtonAnimation {
ButtonAnimation::Ripple {
duration_ms: 400,
easing: Easing::CubicBezier(0.0, 0.0, 0.2, 1.0),
scale_from: 0.0,
scale_to: 4.0,
opacity_from: 0.12,
opacity_to: 0.0,
}
}
pub fn elastic_scale_hover() -> ButtonAnimation {
ButtonAnimation::ElasticScale {
spring: Spring::new().stiffness(300.0).damping(15.0),
target_scale: 1.1,
}
}
pub fn subtle_elastic_hover() -> ButtonAnimation {
ButtonAnimation::ElasticScale {
spring: Spring::new().stiffness(200.0).damping(20.0),
target_scale: 1.05,
}
}
pub fn glow_pulse() -> ButtonAnimation {
ButtonAnimation::GlowPulse {
duration_ms: 2000,
easing: Easing::EaseInOutSine,
intensity_from: 1.0,
intensity_to: 1.5,
}
}
pub fn fast_glow_pulse() -> ButtonAnimation {
ButtonAnimation::GlowPulse {
duration_ms: 1000,
easing: Easing::EaseInOutSine,
intensity_from: 1.0,
intensity_to: 1.3,
}
}
pub fn underline_slide() -> ButtonAnimation {
ButtonAnimation::UnderlineSlide {
duration_ms: 250,
easing: Easing::EaseOutCubic,
origin: SlideOrigin::Left,
}
}
pub fn underline_slide_center() -> ButtonAnimation {
ButtonAnimation::UnderlineSlide {
duration_ms: 250,
easing: Easing::EaseOutCubic,
origin: SlideOrigin::Center,
}
}
pub fn fill_sweep() -> ButtonAnimation {
ButtonAnimation::FillSweep {
duration_ms: 300,
easing: Easing::EaseOutCubic,
direction: SweepDirection::LeftToRight,
}
}
pub fn fill_sweep_vertical() -> ButtonAnimation {
ButtonAnimation::FillSweep {
duration_ms: 350,
easing: Easing::EaseOutCubic,
direction: SweepDirection::BottomToTop,
}
}
pub fn border_draw() -> ButtonAnimation {
ButtonAnimation::BorderDraw {
duration_ms: 600,
easing: Easing::EaseInOutCubic,
stagger_delay_ms: 100,
}
}
pub fn fast_border_draw() -> ButtonAnimation {
ButtonAnimation::BorderDraw {
duration_ms: 400,
easing: Easing::EaseOutCubic,
stagger_delay_ms: 50,
}
}
pub fn magnetic_pull() -> ButtonAnimation {
ButtonAnimation::MagneticPull {
spring: Spring::new().stiffness(150.0).damping(20.0),
max_distance: 100.0,
strength: 0.3,
}
}
pub fn strong_magnetic_pull() -> ButtonAnimation {
ButtonAnimation::MagneticPull {
spring: Spring::new().stiffness(200.0).damping(15.0),
max_distance: 150.0,
strength: 0.5,
}
}
pub fn lift_shadow() -> ButtonAnimation {
ButtonAnimation::LiftShadow {
duration_ms: 250,
easing: Easing::EaseOutCubic,
shadow_y_from: 2.0,
shadow_y_to: 8.0,
shadow_blur_from: 4.0,
shadow_blur_to: 16.0,
lift_distance: 2.0,
}
}
pub fn dramatic_lift() -> ButtonAnimation {
ButtonAnimation::LiftShadow {
duration_ms: 300,
easing: Easing::EaseOutCubic,
shadow_y_from: 2.0,
shadow_y_to: 16.0,
shadow_blur_from: 4.0,
shadow_blur_to: 24.0,
lift_distance: 4.0,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_material_hover() {
let anim = material_hover();
assert_eq!(anim.duration_ms(), 200);
}
#[test]
fn test_ios_press() {
let anim = ios_press();
assert_eq!(anim.duration_ms(), 100);
}
#[test]
fn test_ios_release() {
let anim = ios_release();
let duration = anim.duration_ms();
assert!(duration > 0);
assert!(duration < 5000);
}
#[test]
fn test_material_ripple() {
let anim = material_ripple();
assert_eq!(anim.duration_ms(), 400);
}
#[test]
fn test_elastic_scale_hover() {
let anim = elastic_scale_hover();
let duration = anim.duration_ms();
assert!(duration > 0);
}
#[test]
fn test_all_presets_compile() {
let _ = material_hover();
let _ = fast_subtle_hover();
let _ = ios_press();
let _ = simple_press();
let _ = bounce_press();
let _ = ios_release();
let _ = framer_spring_press();
let _ = material_ripple();
let _ = elastic_scale_hover();
let _ = subtle_elastic_hover();
let _ = glow_pulse();
let _ = fast_glow_pulse();
let _ = underline_slide();
let _ = underline_slide_center();
let _ = fill_sweep();
let _ = fill_sweep_vertical();
let _ = border_draw();
let _ = fast_border_draw();
let _ = magnetic_pull();
let _ = strong_magnetic_pull();
let _ = lift_shadow();
let _ = dramatic_lift();
}
}