Fade

An entrance that fades elements in on load or when they scroll into view.

Design
Build
Ship
"use client"

import * as React from "react"
import { Fades } from "@animate-ui/react/primitives/effects/fade"
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 FadeDemo({
  delay = 0,
  initialOpacity = 0,
  opacity = 1,
}: {
  delay?: number
  initialOpacity?: number
  opacity?: number
}) {
  const [key, setKey] = React.useState(0)

  return (
    <div className="flex flex-col items-center gap-6">
      <div key={`${key}-${delay}-${initialOpacity}-${opacity}`} className="flex gap-3">
        <Fades holdDelay={100} delay={delay} initialOpacity={initialOpacity} opacity={opacity}>
          {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>
          ))}
        </Fades>
      </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 { Fade, Fades } from '@animate-ui/react/primitives/effects/fade';

export function Hero() {
  return (
    <>
      <Fade>
        <h1>Animated primitives for React</h1>
      </Fade>

      {/* Staggered: each child starts 100ms after the previous one. */}
      <Fades holdDelay={100}>
        <Card />
        <Card />
        <Card />
      </Fades>
    </>
  );
}

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

Animation

  • The element fades from initialOpacity to opacity on a spring (stiffness 200, damping 20): about 250ms.
  • Only opacity animates, so it stays the same under reduced motion.
  • inView waits for the element to scroll into view, once by default.
  • <AnimateUIProvider tempo> paces the default spring.

API Reference

Fade

PropTypeDefault
asChild?
booleanfalse
initialOpacity?
number0
opacity?
number1
delay?
number0
transition?
Transition{ type: 'spring', stiffness: 200, damping: 20 }
inView?
booleanfalse
inViewOnce?
booleantrue
inViewMargin?
string'0px'
...props?
HTMLMotionProps<'div'>-

Fades

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

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

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

Last updated: 10/18/2026

On this page