Echo Stack

A word focuses in at the center while outline copies of it unfold above and below and keep drifting, like the one clear line on a spinning drum

Installation
$ pnpm dlx shadcn@latest add @remocn/echo-stack

Usage

// src/Root.tsx
import { AbsoluteFill, Composition } from "remotion";
import { EchoStack } from "@/components/remocn/echo-stack";
 
const Beat = () => (
  <AbsoluteFill style={{ backgroundColor: "#0a0a0a" }}>
    <EchoStack text="Bold." />
  </AbsoluteFill>
);
 
export const RemotionRoot = () => (
  <Composition
    id="EchoStack"
    component={Beat}
    durationInFrames={120}
    fps={30}
    width={1280}
    height={720}
  />
);

The word focuses in over 14 frames. From frame 8 the echoes unfold out of it: the column starts compressed and opens to its full pitch by frame 26. After that the column keeps scrolling one row every cycle frames in direction, and loops without a seam. Echoes are hidden while they pass behind the word and fade out toward the edges, so only about echoes rows show on each side.

The echo outline is built from the filled glyphs with an SVG filter rather than a text stroke. Variable fonts keep overlapping contours inside letters like M and K, and a text stroke draws them. The component paints no background and centers the word in its parent. Sizes scale with height / 720.

Props
PropTypeDefaultDescription
text
string"Bold."The word at the center
fontSize
number170Font size in reference px at 720p
fontWeight
number800Font weight
fontFamily
stringInterFont family
color
string"#fafafa"Color of the main word
echoColor
stringsame as colorOutline color of the echoes
echoes
number3Echo rows on each side before they fade out
echoOpacity
number0.35Opacity of the nearest echo
strokeWidth
number1.5Echo outline width in reference px
direction
"up" | "down""up"Which way the column drifts
cycle
number60Frames for the column to move one row
speed
number1Timeline speed multiplier
className
string—Optional className passed to the wrapper