This component no longer exists. It was in remotionui’s manifest when we first indexed it and is not there now — the registry served its inventory on 2026-08-11 and this item was not on it. The install command below will fail. It is kept here because a tutorial somewhere still tells people to run it.
blur-reveal
remotionui/blur-revealRemovedComponent
Cut where the outgoing scene softens away and the incoming one resolves out of blur
Live preview
live · rendered by the registry
Rendered by remotionui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://remotionui.com/r/blur-reveal.jsonSource
1import type { TransitionPresentation } from "@remotion/transitions";2import { useMemo } from "react";3import { AbsoluteFill } from "remotion";4import {5 resolveTransitionTiming,6 transitionPhase,7 type TransitionVariant,8} from "@/remotion/lib/transition-timing";910export type BlurRevealProps = {11 maxBlur?: number;12 /** Scale headroom the blur rides on. 0 keeps the frame perfectly still. */13 scaleBy?: number;14 shouldBlurOutExitingScene?: boolean;15};1617const BlurRevealPresentation: React.FC<18 React.ComponentProps<19 NonNullable<TransitionPresentation<BlurRevealProps>["component"]>20 >21> = ({22 children,23 presentationProgress,24 presentationDirection,25 passedProps: {26 maxBlur = 24,27 scaleBy = 0.03,28 shouldBlurOutExitingScene = true,29 },30}) => {31 const isEntering = presentationDirection === "entering";32 const phase = transitionPhase(presentationProgress, presentationDirection, {33 lead: isEntering ? 0.74 : 0.7,34 fade: true,35 });36 const isHeld = !isEntering && !shouldBlurOutExitingScene;3738 const style = useMemo(() => {39 if (isHeld) {40 return { opacity: 1 };41 }4243 // `displace` is 0 whenever the scene is at rest, so a scene that is not44 // mid-transition renders untouched — no blur, no scale.45 return {46 opacity: phase.opacity,47 filter:48 phase.displace > 0.00249 ? `blur(${(phase.displace * maxBlur).toFixed(2)}px)`50 : undefined,51 scale: phase.isEntering52 ? 1 + phase.displace * scaleBy53 : 1 - phase.displace * scaleBy * 0.66,54 };55 }, [56 isHeld,57 maxBlur,58 phase.displace,59 phase.isEntering,60 phase.opacity,61 scaleBy,62 ]);6364 return <AbsoluteFill style={style}>{children}</AbsoluteFill>;65};6667/** Blur + opacity reveal presentation for TransitionSeries */68export function blurReveal(69 props: BlurRevealProps = {},70): TransitionPresentation<BlurRevealProps> {71 return {72 component: BlurRevealPresentation,73 props,74 };75}7677export type TransitionBlurRevealConfig = {78 durationInFrames?: number;79 maxBlur?: number;80 scaleBy?: number;81 variant?: TransitionVariant;82 shouldBlurOutExitingScene?: boolean;83};8485/** Blur reveal transition config for use with TransitionSeries.Transition */86export function transitionBlurReveal({87 durationInFrames = 22,88 maxBlur = 24,89 scaleBy = 0.03,90 variant = "editorial",91 shouldBlurOutExitingScene = true,92}: TransitionBlurRevealConfig = {}) {93 return {94// … truncated
