# Lilt ![rust](https://github.com/ejjonny/lilt/actions/workflows/rust.yml/badge.svg) [![coverage](https://codecov.io/github/ejjonny/lilt/main/graph/badge.svg?token=4XJNXRSQNX)](https://codecov.io/github/ejjonny/lilt) [![crates.io](https://img.shields.io/crates/v/lilt.svg)](https://crates.io/crates/lilt) [![downloads](https://img.shields.io/crates/d/lilt.svg)](https://crates.io/crates/lilt) [![license](https://img.shields.io/crates/l/lilt.svg)](https://github.com/lilt/blob/master/LICENSE) A simple, dependency free library for running interruptable, transition based animations as a function of time. This library only implements animations & would be most useful along with a GUI library that can do GUI things (like [iced](https://github.com/iced-rs/iced)). ## Getting Started ### Define Embed the state you want to animate in an `Animated` struct. ```rust struct MyViewState { toggle: Animated, } ``` When you initialize your view state - define the initial state & configure the animation to your liking. ```rust let mut state = MyViewState { toggle: Animated::new(false) .duration(300.) .easing(Easing::EaseOut) .delay(30.) .repeat(3), }; ``` ### Transition When your state needs an update, call the `transition` function on your animated state, passing the current time. ```rust let now = std::time::Instant::now(); state .toggle .transition(!state.animated_toggle.value, now); ``` ### Render While rendering a view based on your state - use the `animate` function on your state to get the interpolated value for the current frame. ```rust let now = std::time::Instant::now(); // The wrapped value can be used to interpolate any values that implement `Interpolable` let animated_width = self.toggle.animate_bool(100., 500., now); // If the wrapped value itself is `Interpolable`, it can easily be interpolated in place let animated_width = self.width.animate_wrapped(now); // There are plenty of `animate` methods for interpolating things based on the wrapped value. ``` ### What's the point? lilt emerged from the need for ELM compatible / reactive animations. The animations modeled by this library don't require periodic mutation like a 'tick' function - all interim states of the animation are predefined when 'transition' is called, & then accessed while rendering based on the current time. lilt animations are fully independent of frame rate or tick frequency & only need to be computed if they're used during rendering. ## [Examples](examples/) ![indicator](https://github.com/ejjonny/lilt/assets/17223924/e4f81d63-67a4-4586-a2cf-309c687fd59d)