A slider allows a user to select one or more values within a range.
Installation
Install the packages
Add the shadcn/ui component
Animate it
The CLI finds your shadcn/ui components through components.json, swaps their primitive imports for Animate UI's and removes the CSS animation classes Motion replaces.
Usage
Import from Animate UI instead of react-aria-components: it re-exports all of React Aria, with animated Slider, SliderFill and SliderThumb. Everything else stays the same.
import {
Label,
Slider,
SliderFill,
SliderOutput,
SliderThumb,
SliderTrack,
} from '@animate-ui/react/primitives/react-aria';
export function Volume() {
return (
<Slider defaultValue={50}>
<Label>Volume</Label>
<SliderOutput />
<SliderTrack>
<SliderFill />
<SliderThumb />
</SliderTrack>
</Slider>
);
}Animation
Animate UI v1 had no slider: it moves like v1's switch thumb.
- The dragged (React Aria's
isDragging) thumb stretches along the track: its width grows by 3/16 (a 16px thumb becomes 19px, v1's switchpressedWidth), on a spring (stiffness 400, damping 32), and springs back on release. It's the thumb's real width, so its round ends stay round, and React Aria centers it on its value, so it grows on both sides (along its height in a vertical slider). - A press on the track glides the thumb and the fill to the new value on the same spring: as quick as v1's switch thumb, calmer (it goes about 1.5% past the value, where v1's switch thumb went about 4%). React Aria positions them with layout: they jump to the new place, and a transform offset springs back (FLIP), so nothing animates
left. With a range slider, only the thumb that moves glides. - Dragging follows the pointer instantly, and keyboard changes are instant. Dragging right after a press cancels the glide: the thumb sits under the pointer.
- Under reduced motion, presses jump and nothing stretches.
API Reference
Every part takes exactly the props of React Aria's Slider. Animate UI adds the animation props below.
Slider, SliderTrack, SliderOutput
React Aria props only. Presses are tracked on the Slider.
SliderFill
React Aria props, plus:
| Prop | Type | Default |
|---|---|---|
transition? | Transition | { type: 'spring', stiffness: 400, damping: 32 } |
SliderThumb
React Aria props, plus:
| Prop | Type | Default |
|---|---|---|
transition? | Transition | { type: 'spring', stiffness: 400, damping: 32 } |
AnimateUIProvider's tempo scales these transitions with everything else.