RemotionUI

Slit Scan

Slit-scan time displacement: each strip of any child — rows, columns, rings or a gradient map — shows that child at a different moment, deterministically. Install with npx remotion-ui@latest add slit-scan.

PrimitiveMotion graphicsAdvanced

slit-scan30fps · 960×540
Install
$ npx remotion-ui@latest add slit-scan

The frame is cut into strips and each strip shows the child a little earlier than the one before, so motion bends, smears and spirals across the frame. The preview is three nested stars turning at different speeds seen through 120 rings of time: the outer rings are up to 40 frames behind the centre, so the arms curl into a vortex.

  • bands slices straight strips perpendicular to angle (0 = vertical slits sweeping left→right, 90 = horizontal slits sweeping down). radial slices rings around center.
  • curve maps strip position to delay — a sine gives a travelling time-wave, a power curve pushes the lag to the edges.
  • loopFrames wraps sampled frames into the child's loop, so strips looking back past frame 0 see the end of the previous cycle and a looping piece stays seamless.

Cost. Each distinct delay is one <Freeze> of the child, so a slit-scan costs levels renders of the child per frame — strips are free. Delays are fractional, so a fast child does not step between strips, but a smooth radial spiral wants one level per ring (the preview uses 120). Start around 16–24 levels for footage and raise it only if you see steps.

Usage

import { SlitScan } from "@/remotion/primitives/slit-scan";

// Vertical slits, the right edge a second behind the left.
<SlitScan mode="bands" angle={0} strips={96} levels={24} maxDelay={30}>
  <OffthreadVideo src={staticFile("clip.mp4")} />
</SlitScan>

// A travelling time-wave.
<SlitScan mode="bands" angle={90} strips={80} levels={32} maxDelay={20} curve={(t) => 0.5 + 0.5 * Math.sin(t * Math.PI * 4)}>
  <MyScene />
</SlitScan>
Cost is `levels` renders of the child per frame. Each strip is a <Freeze> of the child clipped with a CSS path() clip.

Agent notes

Install first, then import the copied source component locally. AI guide →

Import
@/remotion/primitives/slit-scan
  • Use when: After Effects-style motion graphics built from composable, keyframeable operators.
  • Customize: width, height, mode, strips, plus copied source for timing, layout, colors, and typography.
  • Rule: do not import this component from the remotion-ui npm package; it is copied into your project.

Usage

Example
import { SlitScan } from "@/remotion/primitives/slit-scan"; <SlitScan mode="radial" strips={120} levels={60} maxDelay={30} loopFrames={150}> <MyLoopingScene /> </SlitScan>

API Reference

PropTypeDescription
children*ReactNodeAnything time-based: footage, a scene, another motion component.
widthnumberFrame width in px.
heightnumberFrame height in px.
mode"bands" | "radial"Straight strips at an angle, or rings around a centre.
stripsnumberNumber of strips. Free — levels sets the cost.
anglenumberBands: direction the delay grows along, degrees.
center[number, number]Radial: centre as shares of the frame.
maxDelaynumberDelay of the last strip, in frames (fractional ok).
levelsnumberDistinct delays = renders of the child per frame.
curve(t: number) => numberMaps strip position 0–1 to delay share 0–1. Default linear.
loopFramesnumberWrap sampled frames into a loop, so strips look back into the previous cycle.
framenumberRender this frame instead of the current one.

On this page