-
Notifications
You must be signed in to change notification settings - Fork 9
Guide Animation
A unified animation system providing preset animations, easing functions, and orchestration capabilities.
The animation module provides a comprehensive set of tools for creating smooth, performant UI animations. It builds on top of gpui's Animation and Transition APIs, offering:
- Easing functions: 20+ mathematical easing functions
- Preset animations: Ready-to-use common animation patterns
- Animation configuration: Flexible configuration options
- Orchestration: Sequence and parallel animation playback
use yororen_ui::animation::{
Animation, AnimationExt, ease_out_quint,
constants::duration::MENU_OPEN,
};
// Using with gpui's animation system
menu.with_animation(
"popover-menu",
Animation::new(MENU_OPEN).with_easing(ease_out_quint()),
|this, delta| this.opacity(delta),
)- Menu/dropdown open/close animations
- Modal dialog transitions
- Loading states (pulse, spin)
- Hover/focus state transitions
- Page/component entrance animations
Not a good fit:
- Complex physics-based animations (use custom implementation)
- Frame-by-frame procedural animations
Located in easing.rs, provides mathematical easing functions:
-
Linear:
ease_linear -
Quadratic:
ease_in_quad,ease_out_quad,ease_in_out_quad -
Cubic:
ease_in_cubic,ease_out_cubic,ease_in_out_cubic -
Quartic:
ease_in_quart,ease_out_quart,ease_in_out_quart -
Quintic:
ease_in_quint,ease_out_quint,ease_in_out_quint -
Sine:
ease_in_sine,ease_out_sine,ease_in_out_sine -
Exponential:
ease_in_expo,ease_out_expo,ease_in_out_expo -
Circular:
ease_in_circ,ease_out_circ -
Back (Overshoot):
ease_out_back,ease_in_out_back -
Elastic:
ease_in_elastic,ease_out_elastic,ease_in_out_elastic -
Bounce:
ease_in_bounce,ease_out_bounce,ease_in_out_bounce
Located in preset.rs, provides ready-to-use animations:
-
fade_slide_in(duration)- Fade + slide for menus -
fade_slide_out(duration)- Reverse of fade_slide_in -
pulse(duration)- Loading pulse animation -
fade_slide_in_left(distance)- Slide from left -
fade_slide_in_right(distance)- Slide from right -
fade_slide_in_up(distance)- Slide from top -
fade_slide_in_down(distance)- Slide from bottom
Located in constants.rs, provides timing constants:
// Menu/Dropdown
duration::MENU_OPEN // 160ms
duration::MENU_OPEN_FAST // 100ms
duration::MENU_OPEN_SLOW // 250ms
// Navigator/Slider
duration::NAVIGATOR_SLIDER // 200ms
duration::TAB_SWITCH // 150ms
// Loading/Skeleton
duration::SKELETON_PULSE_1 // 1100ms
duration::SKELETON_PULSE_2 // 1200ms
// Progress
duration::PROGRESS_SPINNER // 850ms
duration::PROGRESS_CIRCLE // 900ms
duration::PROGRESS_BAR // 1500ms
// Modal
duration::MODAL_FADE_IN // 200ms
duration::MODAL_SLIDE_UP // 250ms
// General
duration::VERY_FAST // 100ms
duration::FAST // 150ms
duration::NORMAL // 200ms
duration::SLOW // 300ms
duration::VERY_SLOW // 400msLocated in orchestrator.rs, provides sequencing capabilities:
use yororen_ui::animation::{AnimationSequence, AnimationParallel};
// Sequence: run animations one after another
let sequence = AnimationSequence::new()
.then(duration::MODAL_FADE_IN)
.then(duration::MODAL_SLIDE_UP);
// Parallel: run animations simultaneously
let parallel = AnimationParallel::new()
.with(duration::FAST)
.with(duration::FAST);Extension trait for animating gpui elements:
use yororen_ui::animation::AnimateExt;
// Fade animation
div.animate_fade("my-id", Duration::from_millis(200), 0.5);
// Slide animation
div.animate_slide("my-id", SlideDirection::Up, px(10.0), Duration::from_millis(200), 0.5);- Use preset durations: Stick to the defined constants for consistency
-
Choose appropriate easing:
-
ease_out_*for entrance animations (fast start, smooth end) -
ease_in_*for exit animations (smooth start, fast end) -
ease_in_out_*for equal emphasis
-
- Keep animations short: Most UI animations should be 100-300ms
- Consider accessibility: Some users prefer reduced motion
If you have existing code using direct animation constants:
// Before
use crate::constants::animation::MENU_OPEN;
// After
use yororen_ui::animation::constants::duration::MENU_OPEN;Yororen UI v0.3.0 · repository · Apache-2.0 · This wiki documents Yororen UI v0.3.0.
This wiki documents Yororen UI v0.3.0 — the headless-core, swappable-renderer build.