Effect

An entrance that combines fade, blur, slide and zoom on load or when elements scroll into view.

Design
Build
Ship
"use client"

import * as React from "react"
import { Effects } from "@animate-ui/react/primitives/effects/effect"
import { RepeatIcon } from "@hugeicons/core-free-icons"
import { HugeiconsIcon } from "@hugeicons/react"

import { Button } from "@/components/ui/button"

const ITEMS = ["Design", "Build", "Ship"]

export default function EffectDemo({
  delay = 0,
  blur = true,
  slide = true,
  fade = true,
  zoom = true,
}: {
  delay?: number
  blur?: boolean
  slide?: boolean
  fade?: boolean
  zoom?: boolean
}) {
  const [key, setKey] = React.useState(0)

  return (
    <div className="flex flex-col items-center gap-6">
      <div
        key={`${key}-${delay}-${blur}-${slide}-${fade}-${zoom}`}
        className="flex gap-3"
      >
        <Effects
          holdDelay={100}
          delay={delay}
          blur={blur}
          slide={slide}
          fade={fade}
          zoom={zoom}
        >
          {ITEMS.map((item) => (
            <div
              key={item}
              className="flex h-20 w-24 items-center justify-center rounded-xl bg-accent text-sm font-medium"
            >
              {item}
            </div>
          ))}
        </Effects>
      </div>
      <Button variant="outline" size="sm" onClick={() => setKey((k) => k + 1)}>
        <HugeiconsIcon icon={RepeatIcon} strokeWidth={2} />
        Replay
      </Button>
    </div>
  )
}

Installation

npm install @animate-ui/react motion
pnpm add @animate-ui/react motion
yarn add @animate-ui/react motion
bun add @animate-ui/react motion

Usage

import { Effect, Effects } from '@animate-ui/react/primitives/effects/effect';

export function Hero() {
  return (
    <>
      <Effect fade blur slide zoom>
        <h1>Animated primitives for React</h1>
      </Effect>

      {/* Staggered: each child starts 100ms after the previous one. */}
      <Effects holdDelay={100} fade blur slide zoom>
        <Card />
        <Card />
        <Card />
      </Effects>
    </>
  );
}

With asChild, the animation is applied to your element instead of a wrapping div.

Animation

  • Pick any combination of fade, blur, slide and zoom. true uses each effect's defaults; an object customizes it.
  • Everything animates together on one spring (stiffness 200, damping 20). Slide (x / y) and zoom (scale) are hardware-accelerated transforms.
  • Under reduced motion, there is no travel or scale: the fade and the blur still play.
  • inView waits for the element to scroll into view, once by default.
  • <AnimateUIProvider tempo> paces the default spring.

API Reference

Effect

PropTypeDefault
asChild?
booleanfalse
fade?
boolean | { initialOpacity?: number; opacity?: number }false
blur?
boolean | { initialBlur?: number; blur?: number }false
slide?
boolean | { direction?: 'up' | 'down' | 'left' | 'right'; offset?: number }false
zoom?
boolean | { initialScale?: number; scale?: number }false
delay?
number0
transition?
Transition{ type: 'spring', stiffness: 200, damping: 20 }
inView?
booleanfalse
inViewOnce?
booleantrue
inViewMargin?
string'0px'
...props?
HTMLMotionProps<'div'>-

Effects

Wraps each child in an Effect, delaying each one a little more than the previous.

PropTypeDefault
children
React.ReactElement | React.ReactElement[]-
holdDelay?
number0
...props?
EffectProps-

Built by Skyleen. The source code is available on GitHub.

Last updated: 10/18/2026

On this page