Cinematic Text

v1.0.1
FreeTypography

Cinematic typography that reveals a looping video through bold text, with cursor-driven SVG distortion shaders (liquid, prism, glitch, wave, melt) and optional 3D tilt. Dependency-free.

Cinematic Text

Installation

Step 1. Initialize ProjectOne-time setup

Run once in your project root to configure paths and dependencies:

npx vectorvesper init
Step 2. Add ComponentInstalls source & assets

Downloads and registers the component in your project:

npx vectorvesper add cinematic-text
Requires Tailwind CSS to be configured in your project.

Usage

Import

import { WarpedVideoText } from "@/components/vv/cinematic-text";

Usage

<WarpedVideoText />
This component respects prefers-reduced-motion and provides a graceful fallback.
Tailwind CSS must be configured in your project for styles to apply correctly.

Props

Big display type with video playing inside the letters, warped by one of five distortion effects. The block tilts toward the cursor. Text is sized to fit the box automatically, so long words shrink rather than overflow.

<WarpedVideoText />

The whole block — type, video fill, warp and tilt.

PropTypeDefaultDescription
textstring"CREATIVE"The word or line to render. Short words read best at display size.
videostring""Video shown through the letters. With none set the type renders as a flat fill.
posterstringStill shown until the video can play.
isPlayingbooleantrueWhether the video runs. Set false to freeze it on the current frame.
fx"liquid" | "prism" | "glitch" | "wave" | "melt""liquid"Which distortion runs over the letters. Liquid ripples, prism splits colour, glitch tears in blocks, wave undulates, melt drips downward.
freqnumber0.015Scale of the distortion — lower gives broad slow shapes, higher a finer ripple.
dampnumber8How strongly the distortion is held back. Higher is calmer.
enableTiltbooleantrueTilts the whole block toward the cursor.
tiltMaxXnumber12Maximum tilt away from level, in degrees, on the vertical axis.
tiltMaxYnumber12The same on the horizontal axis.
tiltPerspectivenumber1200Depth of the viewing frustum in pixels. Lower exaggerates the tilt.
tiltLerpnumber0.08How quickly the tilt follows the cursor, per frame. Lower trails further behind.
fontstring"font-sans"Class applied to the type. Point it at your own display face.
fontSizenumber145Base size before fitting. Treated as a ceiling when fitText is on.
fitTextbooleantrueShrinks the text horizontally so it fits the box. Turn it off to let long words overflow instead.
minTextScaleXnumber0.4How far fitting may squeeze the letters before it stops. Below about 0.5 the type starts to look condensed.
charWidthRationumber0.55Assumed width of a character relative to its height, used to estimate the fit. Raise it for a wide face, lower it for a condensed one.
widthnumber1200Width of the drawing surface.
heightnumber300Height of the drawing surface.
innerWidthnumberOptional narrower width for the text itself, leaving margin inside the box.
videoFit"cover" | "contain" | "fill""cover"How the video maps into the letters.
videoScalenumber1.04Slight zoom on the video. Just over 1 by default so the warp never exposes an edge.
videoPositionstring"center"Which part of the video to favour when it is cropped.
bleednumber0Extra area drawn beyond the box, to stop the warp clipping at the edges.
filterMarginnumber20Padding reserved around the type for the distortion to spill into. Raise it if a strong effect looks cut off.
clipOverflowbooleantrueClips anything outside the box. Turn it off to let the warp run past the edges.
classNamestring""Applied to the wrapper.
styleReact.CSSPropertiesInline styles merged onto the wrapper.
aria-labelstringthe text propLabel announced for the block. Falls back to whatever `text` is, so it is usually already correct.

Examples

Video through the letters
import WarpedVideoText from "@/components/vv/cinematic-text/WarpedVideoText";

<WarpedVideoText
  text="ATLAS"
  video="/reel.mp4"
  poster="/reel-poster.webp"
  fx="liquid"
/>
Calmer, in your own face
<WarpedVideoText
  text="STUDIO NORTH"
  video="/reel.mp4"
  fx="wave"
  damp={16}
  freq={0.008}
  font="font-display"
  enableTilt={false}
/>
A long line that has to fit
<WarpedVideoText
  text="EVERYTHING IN MOTION"
  video="/reel.mp4"
  width={1600}
  minTextScaleX={0.35}
  charWidthRatio={0.48}
/>
The warp and the tilt both keep running under reduced motion. Pass enableTilt={false} and isPlaying={false} when the preference is set for a still version that still reads.
The distortion is recomputed as the video plays, which is the expensive part. A short, small, looping clip costs far less than a full-resolution one.
Client component. It measures the box and reads the pointer, so it has to run in the browser.

Source

/**
 * Cinematic Text — Vector Vesper
 * https://vectorvesper.dev/components
 *
 * Copyright (c) 2026 Vector Vesper
 * Released under the MIT License. This notice must be retained in copies and
 * substantial portions of the file. https://vectorvesper.dev/license
 */
export { default as WarpedVideoText } from "./WarpedVideoText";
export type { WarpedVideoTextProps } from "./WarpedVideoText";
View on GitHubReport an issue