use std::time::Duration;
use gpui_kit::base::{Easing, Transition};
#[derive(Clone)]
#[non_exhaustive]
pub struct MotionTokens {
pub fast: Duration,
pub normal: Duration,
pub slow: Duration,
pub enter: Easing,
pub exit: Easing,
pub fold: Easing,
pub stagger: Duration,
}
impl Default for MotionTokens {
fn default() -> Self {
Self {
fast: Duration::from_millis(120),
normal: Duration::from_millis(180),
slow: Duration::from_millis(280),
enter: Easing::cubic_bezier(0.16, 1.0, 0.3, 1.0).expect("valid enter curve"),
exit: Easing::cubic_bezier(0.4, 0.0, 1.0, 1.0).expect("valid exit curve"),
fold: Easing::cubic_bezier(0.4, 0.0, 0.2, 1.0).expect("valid fold curve"),
stagger: Duration::from_millis(40),
}
}
}
impl MotionTokens {
pub fn fold_transition(&self) -> Transition {
Transition::new(self.slow).easing(self.fold.clone())
}
pub fn slide_transition(&self) -> Transition {
Transition::new(self.fast).easing(self.fold.clone())
}
pub fn glide_transition(&self) -> Transition {
Transition::new(self.normal).easing(self.enter.clone())
}
pub fn fast_transition(&self) -> Transition {
Transition::new(self.fast).easing(self.enter.clone())
}
pub fn enter_transition(&self) -> Transition {
Transition::new(self.normal).easing(self.enter.clone())
}
pub fn exit_transition(&self) -> Transition {
Transition::new(self.normal).easing(self.exit.clone())
}
pub fn slow_transition(&self) -> Transition {
Transition::new(self.slow).easing(self.enter.clone())
}
pub fn none() -> Self {
Self {
fast: Duration::ZERO,
normal: Duration::ZERO,
slow: Duration::ZERO,
stagger: Duration::ZERO,
..Self::default()
}
}
}