Ripple Zoom

Fly the camera through the center of grainy ripple rings while the next scene approaches from the depth

Installation

$ pnpm dlx shadcn@latest add @remocn/ripple-zoom

Usage

rippleZoom() is a Remotion transition presentation. Pass it to a TransitionSeries.Transition between two sequences. The outgoing scene blows past the camera, a grain-gradient ripple field opens up, and the camera dives through the center of the rings — the field magnifies toward zoom while the incoming scene counter-scales up from the depth, so the two motions read as one continuous dolly onto the new scene. Keep the incoming scene transparent so it lands on the ripple field. Give the flight enough frames to read (88 works well).

import { TransitionSeries, linearTiming } from "@remotion/transitions";
import { rippleZoom } from "@/components/remocn/ripple-zoom";
 
export const MyVideo = () => (
  <TransitionSeries>
    <TransitionSeries.Sequence durationInFrames={102}>
      <SceneA />
    </TransitionSeries.Sequence>
    <TransitionSeries.Transition
      timing={linearTiming({ durationInFrames: 88 })}
      presentation={rippleZoom()}
    />
    <TransitionSeries.Sequence durationInFrames={102}>
      <SceneB />
    </TransitionSeries.Sequence>
  </TransitionSeries>
);

Props

rippleZoom(props) accepts:

PropTypeDefaultDescription
colors
string[]["#3a3a52", "#4a4a68", "#8f88ae"]Colors of the ripple rings.
colorBack
string"#141318"Backdrop color between the rings. Match it to the scene backgrounds for a seamless dive.
intensity
number0.5Distortion strength of the ripple rings.
softness
number0.5Blending softness between the ring colors.
noise
number0.5Amount of per-pixel grain over the rings.
zoom
number4Final magnification of the ripple field — how deep the camera dives through the rings.
speed
number1Shader animation speed of the rings.