#[derive(Clone, Copy, PartialEq, Debug)]
pub enum SlideDirection {
Top,
Bottom,
Left,
Right,
}
pub fn fade_in(_element_id: &str, duration_ms: u64) -> String {
format!("opacity 0ms ease-out, opacity {}ms ease-out", duration_ms)
}
pub fn fade_out(_element_id: &str, duration_ms: u64) -> String {
format!("opacity 0ms ease-in, opacity {}ms ease-in", duration_ms)
}
pub fn slide_in(
_element_id: &str,
duration_ms: u64,
direction: SlideDirection,
distance: i32,
) -> String {
let _transform_start = match direction {
SlideDirection::Top => format!("translateY(-{}px)", distance),
SlideDirection::Bottom => format!("translateY({}px)", distance),
SlideDirection::Left => format!("translateX(-{}px)", distance),
SlideDirection::Right => format!("translateX({}px)", distance),
};
format!(
"transform 0ms, opacity 0ms, transform {}ms ease-out, opacity {}ms ease-out",
duration_ms, duration_ms
)
}
pub fn slide_out(
_element_id: &str,
duration_ms: u64,
direction: SlideDirection,
distance: i32,
) -> String {
let _transform_end = match direction {
SlideDirection::Top => format!("translateY(-{}px)", distance),
SlideDirection::Bottom => format!("translateY({}px)", distance),
SlideDirection::Left => format!("translateX(-{}px)", distance),
SlideDirection::Right => format!("translateX({}px)", distance),
};
format!(
"transform 0ms, opacity 0ms, transform {}ms ease-in, opacity {}ms ease-in",
duration_ms, duration_ms
)
}
pub fn zoom_in(_element_id: &str, duration_ms: u64) -> String {
format!(
"transform 0ms, opacity 0ms, transform {}ms ease-out-back, opacity {}ms ease-out-back",
duration_ms, duration_ms
)
}
pub fn zoom_out(_element_id: &str, duration_ms: u64) -> String {
format!(
"transform 0ms, opacity 0ms, transform {}ms ease-in-back, opacity {}ms ease-in-back",
duration_ms, duration_ms
)
}
pub fn bounce_in(_element_id: &str, _duration_ms: u64) -> String {
"cubic-bezier(0.68, -0.55, 0.265, 1.55)".to_string()
}
pub fn shake(element_id: &str, duration_ms: u64) -> String {
let keyframes_name = format!("{}-shake", element_id);
let keyframes = format!(
"@keyframes {} {{ 0%, 100% {{ transform: translateX(0); }} 10%, 30%, 50%, 70%, 90% {{ transform: translateX(-10px); }} 20%, 40%, 60%, 80% {{ transform: translateX(10px); }} }}",
keyframes_name
);
let animation = format!(
"animation {}-shake {}ms ease-in-out infinite",
element_id, duration_ms
);
format!("{}; {}", keyframes, animation)
}
pub fn rotate_in(_element_id: &str, duration_ms: u64, _degrees: i32) -> String {
format!("transform {}ms ease-out", duration_ms)
}
pub fn rotate_out(_element_id: &str, duration_ms: u64, _degrees: i32) -> String {
format!("transform {}ms ease-in", duration_ms)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_slide_direction_exists() {
let _directions = [
SlideDirection::Top,
SlideDirection::Bottom,
SlideDirection::Left,
SlideDirection::Right,
];
}
#[test]
fn test_fade_in_generates_css() {
let css = fade_in("my-element", 300);
assert!(css.contains("300ms"));
assert!(css.contains("ease-out"));
}
#[test]
fn test_slide_in_generates_css() {
let css = slide_in("my-element", 300, SlideDirection::Top, 50);
assert!(css.contains("300ms"));
assert!(css.contains("ease-out"));
assert!(css.contains("transform"));
assert!(css.contains("opacity"));
}
#[test]
fn test_zoom_in_generates_css() {
let css = zoom_in("my-element", 300);
assert!(css.contains("300ms"));
assert!(css.contains("ease-out-back"));
}
#[test]
fn test_bounce_in_returns_curve() {
let curve = bounce_in("my-element", 300);
assert!(curve.contains("cubic-bezier"));
assert!(curve.contains("0.68"));
}
#[test]
fn test_shake_generates_keyframes() {
let css = shake("my-element", 500);
assert!(css.contains("@keyframes"));
assert!(css.contains("my-element-shake"));
assert!(css.contains("translateX(-10px)"));
assert!(css.contains("translateX(10px)"));
assert!(css.contains("infinite"));
}
}