Clip Reveal
Scroll-triggered clip-path reveal (from bottom, top, left, right or center) with a subtle scale settle and fade — ideal for screenshots, product mock-ups and cards.
minimal/effect/clip-revealSource
"use client";
import type { ReactNode } from "react";
import { motion, useReducedMotion } from "motion/react";
export interface ClipRevealProps {
children: ReactNode;
/** Edge the reveal starts from. */
from?: "bottom" | "top" | "left" | "right" | "center";
delay?: number;
duration?: number;
repeat?: boolean;
className?: string;
}
const START: Record<NonNullable<ClipRevealProps["from"]>, string> = {
bottom: "inset(100% 0% 0% 0% round 14px)",
top: "inset(0% 0% 100% 0% round 14px)",
left: "inset(0% 100% 0% 0% round 14px)",
right: "inset(0% 0% 0% 100% round 14px)",
center: "inset(20% 20% 20% 20% round 14px)",
};
/** Scroll-triggered clip-path reveal with a slight scale settle — great for screenshots, cards and product mock-ups. */
export function ClipReveal({ children, from = "bottom", delay = 0, duration = 0.9, repeat = false, className }: ClipRevealProps) {
const reduce = useReducedMotion();
// The observer sits on an unclipped wrapper: a fully clipped element never counts as intersecting.
return (
<motion.div className={className} initial={reduce ? false : "hidden"} whileInView="shown" viewport={{ once: !repeat, amount: 0.3 }}>
<motion.div
className="will-change-[clip-path]"
variants={{
hidden: { clipPath: START[from], scale: 1.04, opacity: 0.4 },
shown: { clipPath: "inset(0% 0% 0% 0% round 14px)", scale: 1, opacity: 1, transition: { delay, duration, ease: [0.16, 1, 0.3, 1] } },
}}
>
{children}
</motion.div>
</motion.div>
);
}
export default ClipReveal;
modules/minimal/effect/clip-reveal/index.tsx
Props
| Prop | Type | Default | Description |
|---|---|---|---|
| children* | ReactNode | — | Content. |
| from | "bottom" | "top" | "left" | "right" | "center" | "bottom" | Origin. |
| delay / duration | number | 0 / 0.9 | Timing (s). |
| repeat | boolean | false | Replay on re-entry. |
| className | string | — | Classes. |
Other transition variants in Minimal
Fade Blur Reveal
Scroll-triggered entrance where opacity, an 8px rise and a 6px blur resolve together with an expo-out curve. Single block or staggered children.
Stagger Grid
Grid entrance where children fade, rise and un-blur one by one in reading order or as a diagonal wave from the top-left when the grid scrolls into view.
Word Reveal
Scroll-triggered headline reveal: each word rises out of its own clipping mask with an expo-out ease, staggered word by word. Works for h1–h3 and paragraphs.
Transition in other art directions
Flip Reveal
Scroll-triggered 3D flip: the element swings in on its top or left hinge like a hanging sign board and lands in four hard steps. Stagger siblings with delay.
Slam List
Staggered list entrance: every child slams in from the side or bottom with a tilt and a stiff spring jolt, one after another, when the list scrolls into view. Wraps each child in an li (or div).
Stamp Reveal
Scroll-triggered entrance that stamps content onto the page: drops from above at 125% scale with a tilt and snaps into place in three hard steps. Stagger with delay, optional final tilt.
Wipe Reveal
Scroll-triggered block wipe: a solid DA color slab with ink edges sweeps across the element, the content appears underneath at mid-sweep, then the slab exits the other side. Left, right or up.
Cascade Cards
Scroll-triggered cascade: each child drops in from above with a 3D forward tilt and a soft spring, one after the other — ideal for notification or feed lists.
Circle Reveal
Scroll-triggered circular reveal: content appears through a clip-path circle growing from a chosen origin point while going from blurred to sharp.
Glass Reveal
Scroll-triggered entrance for frosted panels: slides in from bottom/left/right, scales up from 96% with a soft overshoot while the content goes from 14px blur to sharp. Optional built-in glass panel.
Scroll Zoom
Scroll-linked product showcase: as the element rises through the viewport it scales from 82% to 100%, un-tilts from 18° and fades in (motion useScroll).
Curtain Wipe
Block reveal: a solid ink (or signal) curtain covers the content, then slides away to the right, uncovering it — for images and cards entering the viewport.
Inset Reveal
Image entrance: a clip-path inset shrinks from 12% to 0 while the inner content scales from 1.15 to 1 — the frame “opens” onto the image. Observed on an unclipped wrapper.
Line Reveal
Headline revealed line by line: each line slides up from behind its own mask with a sharp ease, staggered, when it enters the viewport — the classic editorial reveal.
Stagger Fade
The quietest entrance: list items simply fade in one after another (no movement), 60ms apart, when the list enters the viewport.
Fade Up
The workhorse scroll entrance: content fades in and rises 16px with a quick ease-out when it enters the viewport. Instant with reduced motion.
Scale In
Product-shot entrance: content scales up from 0.94 (optionally from a slight perspective tilt) and fades in with a gentle ease when it enters the viewport.
Stagger Grid
Responsive grid whose items fade + rise in sequence (row by row, left to right) when the grid scrolls into view; a subtle scale from 0.98 keeps it crisp.
Wipe Reveal
Reveal for images, charts and mockups: a primary bar sweeps across, then the content is unveiled with a clip-path wipe (left→right or bottom→top) on scroll into view.
Arch Reveal
Media reveal through an opening arch: a clip-path ellipse grows from the bottom center until the content is fully shown, leaving an arch-topped frame.
Bloom Stagger
List that blooms open: items fade in one by one while unrotating from a slight alternate tilt and rising, like petals settling, when the list enters the viewport.
Grow In
Sprouting entrance: content grows from 85% scale out of its bottom edge while fading in, with a soft organic overshoot, when it enters the viewport.
Soft Blur In
Dreamy entrance: content comes into focus from a soft blur while fading in and drifting up a few pixels — like morning mist lifting.
Blob Reveal
Reveal where an organic pastel blob springs up behind the content with a slight rotation, then the content fades up on top of it.
Pop In
Scroll-triggered pop: content scales up from 80% with a friendly spring overshoot while fading in; stagger siblings with delay.
Rise Stagger
List entrance: each child rises 24px and fades in one after another with a soft spring bounce when the list scrolls into view.
Swing In
Playful entrance: the element swings in from a side with a rotation like a hanging sign and settles with a springy wobble.