https://github.com/cyypherus/lilt
A simple library for running interruptable, transition based animations as a function of time.
https://github.com/cyypherus/lilt
animation animations rust
Last synced: 3 months ago
JSON representation
A simple library for running interruptable, transition based animations as a function of time.
- Host: GitHub
- URL: https://github.com/cyypherus/lilt
- Owner: cyypherus
- License: mit
- Created: 2024-06-22T22:31:29.000Z (12 months ago)
- Default Branch: main
- Last Pushed: 2025-02-03T19:44:01.000Z (4 months ago)
- Last Synced: 2025-02-28T16:56:55.663Z (3 months ago)
- Topics: animation, animations, rust
- Language: Rust
- Homepage:
- Size: 528 KB
- Stars: 40
- Watchers: 2
- Forks: 4
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Lilt

[](https://codecov.io/github/ejjonny/lilt)
[](https://crates.io/crates/lilt)
[](https://docs.rs/lilt)
[](https://crates.io/crates/lilt)
[](https://github.com/lilt/blob/master/LICENSE)A simple 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/)

### Contributing
This repo uses `cargo insta` to snapshot test the public API.
If your PR changes the public API, one of the checks will fail by default.
If the changes to the public API were intentional you can update the snapshot by running:
`INSTA_UPDATE=always cargo test --features test-api`