use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MotionPresetToken {
pub mass: f32,
pub stiffness: f32,
pub damping: f32,
pub omega_0: f32,
#[serde(default)]
pub omega_d: Option<f32>,
pub damping_ratio: f32,
pub response: f32,
#[serde(default)]
pub settling_duration: Option<f32>,
#[serde(rename = "$description", default)]
pub description: Option<String>,
}
impl MotionPresetToken {
pub fn to_spring(&self) -> crate::motion::CASpring {
crate::motion::CASpring::new(self.response, self.damping_ratio)
}
pub fn to_spring_physical(&self) -> Option<crate::motion::CASpring> {
if self.mass > 0.0 && self.stiffness > 0.0 && self.damping > 0.0 {
Some(crate::motion::CASpring::from_physical(
self.mass,
self.stiffness,
self.damping,
))
} else {
None
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MacMotionTokens {
pub caspring_default: MotionPresetToken,
pub swiftui_spring_default: MotionPresetToken,
pub swiftui_snappy: MotionPresetToken,
pub swiftui_bouncy: MotionPresetToken,
pub swiftui_smooth: MotionPresetToken,
pub hud_panel_transition: MotionPresetToken,
}