# Basalt Animations Basalt provides a powerful animation system that allows you to create smooth transitions and effects for UI elements. ## Basic Concepts Animations in Basalt work with: - **Sequences**: Groups of animations that play one after another - **Chains**: Multiple sequences that can be controlled together - **Timing**: Control over duration and easing of animations `element:animate()` creates a new Animation object. Each animation method accepts a duration parameter (in seconds). ### Core Animation Methods ```lua element:animate() :move(x, y, duration) -- Animate move :moveOffset(x, y, duration) -- Animate offset :resize(w, h, duration) -- Animate size :number(property, targetNumber, duration) -- Animate number :entries(property, entryList, duration) -- Cycles through a list of values (e.g. colors, text) for any property over the specified duration :morphText(property, targetText, duration) -- Animate text :typewrite(property, targetText, duration) -- Animate text :fadeText(property, targetText, duration) -- Animate text :scrollText(property, targetText, duration) -- Animate text ``` ### Animation Control ```lua local anim = element:animate() :moveOffset(5, 0, 1) :start() -- Start the animation anim:pause() -- Pause animation anim:resume() -- Resume animation anim:stop() -- Stop animation ``` ## Understanding Sequences Sequences allow you to create complex animations by controlling when each animation plays. By default, all animations in a chain play simultaneously. Using `:sequence()` creates a new group that waits for the previous animations to complete. ### Basic Example ```lua -- Without sequences (animations play at the same time): element:animate() :move(10, 5, 1) -- These three animations :resize(5, 5, 1) -- all start and play :morphText("text", "newText" 1) -- simultaneously :start() -- With sequences (animations play one after another): element:animate() :move(10, 5, 1) -- Plays first :sequence() :resize(5, 5, 1) -- Starts after position completes :sequence() :morphText("text", "newText" 1) -- starts after resizing completes :start() ``` ### Advanced Usage ```lua -- Complex movement pattern element:animate() :move(10, 5, 0.5) -- Move right :sequence() :move(10, 10, 0.5) -- Then down :sequence() :move(5, 10, 0.5) -- Then left :sequence() :move(5, 5, 0.5) -- Then up :onDone(function() -- Called when entire sequence completes end) :start() -- Mixing simultaneous and sequential animations element:animate() -- These two happen together :move(10, 5, 1) :morphText("text", "newText" 1) -- simultaneously :sequence() -- These two also happen together, but after the first group :move(5, 5, 1) :morphText("text", "anotherText" 1) -- simultaneously :start() ``` ### Callbacks ```lua element:animate() :moveOffset(5, 0, 1) :onStart(function() end) -- When animation starts :onDone(function() end) -- When animation completes :onStep(function() end) -- Every animation step :start() ``` ## Tips & Best Practices - Use sequences for complex animations - Keep duration times reasonable (0.1-2 seconds) - Consider using callbacks for state management