Motion Wrappers

13 Framer Motion animation primitives for scroll reveals, stagger lists, interactive cards, floating elements, counters, and more. Requires framer-motion as a peer dependency.

Preview

Usage

tsx
import {
  ScrollReveal,
  StaggerList,
  StaggerItem,
  InteractiveCard,
  Floating,
  CountUp,
  TextReveal,
} from "zostel-ui";

// Scroll reveal
<ScrollReveal>
  <Card>Appears on scroll</Card>
</ScrollReveal>

// Stagger list
<StaggerList>
  <StaggerItem><Card>1</Card></StaggerItem>
  <StaggerItem><Card>2</Card></StaggerItem>
</StaggerList>

// Interactive card
<InteractiveCard onClick={handleClick}>
  <Card>Hover lift + tap scale</Card>
</InteractiveCard>

// CountUp
<CountUp to={1500} duration={2} />

// Text reveal
<TextReveal text="Live Free" />

Components

ScrollReveal

variants
Type: Variants
Default: fadeUpVariants

Framer Motion variants for enter/exit.

once
Type: boolean
Default: true

Only animate once when scrolled into view.

amount
Type: number
Default: 0.3

Viewport intersection threshold (0-1).

delay
Type: number
Default: 0

Delay in seconds before animation starts.

StaggerList

staggerDelay
Type: number
Default: 0.08

Delay between each child in seconds.

once
Type: boolean
Default: true

Only stagger once.

amount
Type: number
Default: 0.2

Viewport intersection threshold.

StaggerItem

variants
Type: Variants
Default: fadeUpVariants

Animation variants for this item.

InteractiveCard

onClick
Type: () => void
Default: -

Click handler.

disabled
Type: boolean
Default: false

Disable hover/tap interactions.

Floating

distance
Type: number
Default: 10

Float distance in pixels.

duration
Type: number
Default: 3

Full cycle duration in seconds.

PulseGlow

scale
Type: number
Default: 1.05

Peak scale value.

duration
Type: number
Default: 2

Full cycle duration in seconds.

Spinner

duration
Type: number
Default: 8

Full rotation duration in seconds.

Shake

trigger
Type: boolean
Default: false

Set to true to trigger the shake.

intensity
Type: number
Default: 8

Shake intensity in pixels.

TapBounce

scale
Type: number
Default: 0.95

Scale on tap (< 1 for press-in).

CountUp

from
Type: number
Default: 0

Starting number.

to
Type: number
Default: required

Target number.

duration
Type: number
Default: 2

Animation duration in seconds.

formatter
Type: (value: number) => string
Default: Math.round + toLocaleString

Custom number formatter.

TextReveal

text
Type: string
Default: required

Text to reveal character by character.

charDelay
Type: number
Default: 0.03

Delay between each character in seconds.

once
Type: boolean
Default: true

Only reveal once.

Parallax

speed
Type: number
Default: 0.5

Parallax speed multiplier.

PageTransition

No additional props. Wraps children with enter/exit opacity + y transitions.