Atelier UI®

Read the docsGithub
Docs 0.7.0

Getting started

  • Browse Catalog
  • Installation
  • How to contribute
  • Code of conduct

Collage (01)

  • Fluid Scene

Components (27)

  • Clip Reveal
  • Stripe Wipe
  • Sweep Exit
  • Dither Flow
    pro
  • Glowing Fog
    pro
  • Halftone Glow
    pro
  • Fluid Distortion
  • Image Trail
  • Lens Image
  • Liquid Image
  • Magnetic Dot Grid
  • Pixel Image
  • Pixel Trail
  • Pixelated Text
  • Text Bounce
  • Text Fluid
  • Text Roll
  • Text Scramble
  • Curve Image
  • Elastic Stick
    pro
  • Infinite Gallery
  • Infinite Parallax
  • Infinite Zoom
  • Scattered Scroll
  • Text Split
  • WebGL Image
  • WebGL Text
Atelier UI 0.7.0 ©2026
Star on githubBuy me a coffeellms.txt
  1. Docs
  2. /
  3. Components
  4. /
  5. Clip Reveal

Clip Reveal

A clip-path reveal that scales the content from a starting inset to fullscreen.

Motion
Tailwind CSS
https://atelier-ui.com/clip-reveal

Settings

duration
2.0
depth
2.0
top
70
left
25
bottom
40
right
25
See the documentation below for more options.

Install

npx atelier-ui add clip-reveal
npm install motion
clip-reveal.tsx
"use client"

import { motion } from "motion/react"
import type { Easing } from "motion"
import type { ReactNode } from "react"

const DEFAULT_EASE: Easing = [0.85, 0, 0.2, 1]

export type ClipRevealProps = {
    children: ReactNode
    className?: string
    duration?: number
    ease?: Easing
    depth?: number
    top?: number
    left?: number
    bottom?: number
    right?: number
    trigger?: boolean
    onComplete?: () => void
}

export function ClipReveal({
    children,
    className,
    duration = 2,
    depth = 2,
    ease = DEFAULT_EASE,
    top = 70,
    left = 25,
    bottom = 40,
    right = 25,
    trigger = true,
    onComplete,
}: ClipRevealProps) {
    const insets = `inset(${top}% ${right}% ${bottom}% ${left}%)`

    return (
        <div className={`relative overflow-hidden ${className ?? ""}`}>
            <motion.div
                className="absolute inset-0"
                initial={{ clipPath: insets }}
                animate={{ clipPath: trigger ? "inset(0% 0% 0% 0%)" : insets }}
                transition={{ duration, ease }}
                onAnimationComplete={() => trigger && onComplete?.()}
            >
                <motion.div
                    className="w-full h-full"
                    initial={{ scale: depth }}
                    animate={{ scale: trigger ? 1 : depth }}
                    transition={{ duration, ease }}
                >
                    {children}
                </motion.div>
            </motion.div>
        </div>
    )
}

API

NameTypeDefaultDescription
childrenReactNode—Content to reveal. Required.
classNamestring—Extra classes applied to the wrapper.
durationnumber2Duration of both animations in seconds.
easeEasing[0.85, 0, 0.2, 1]Motion easing: bezier array, named string, or easing function.
depthnumber2Initial scale of the content before reveal.
topnumber70Starting inset from the top in percent.
leftnumber25Starting inset from the left in percent.
bottomnumber40Starting inset from the bottom in percent.
rightnumber25Starting inset from the right in percent.
triggerbooleantrueStarts the animation when set to true.
onComplete() => void—Called when the animation finishes.

Credits

Zajno
Page transition that inspired this effect.

Motion
React animation library.

  • Install
  • API
  • Credits
Star on githubBuy me a coffeellms.txt