Blur

An entrance that brings elements into focus on load or when they scroll into view.

Design
Build
Ship
"use client"

import * as React from "react"
import { Blurs } from "@animate-ui/react/primitives/effects/blur"
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 BlurDemo({
  delay = 0,
  initialBlur = 10,
  blur = 0,
}: {
  delay?: number
  initialBlur?: number
  blur?: number
}) {
  const [key, setKey] = React.useState(0)

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

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

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

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

Animation

  • The element sharpens from initialBlur to blur on a spring (stiffness 200, damping 20): about 250ms from 10px to sharp.
  • Under reduced motion, it still comes into focus: a blur doesn't move anything.
  • inView waits for the element to scroll into view, once by default.
  • <AnimateUIProvider tempo> paces the default spring.

API Reference

Blur

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

Blurs

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

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

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

Last updated: 10/18/2026

On this page