RemotionUI

Liquid Text Morph

Melt one word into the next through a gooey threshold filter. Install with npx remotion-ui@latest add liquid-text-morph.

PrimitivePrimitivesAdvanced

liquid-text-morph30fps · 960×540
Install
$ npx remotion-ui@latest add liquid-text-morph

Cycles a list of words, melting each one into the next.

import { LiquidTextMorph } from "@/remotion/primitives/liquid-text-morph";

<LiquidTextMorph
  words={["Melt", "Merge", "Reform"]}
  holdInFrames={12}
  morphInFrames={22}
/>

Goo, not path interpolation

Both words are drawn at once inside an SVG blur-plus-alpha-threshold, so letterforms that come near each other fuse into one blob and split apart again. Real glyph outline interpolation needs matched node counts between two arbitrary letters — A and s do not have them — and produces tearing where this produces surface tension. Use shape-morph when the two shapes are paths you control.

gooStrength is the blur in em and gooContrast is the alpha threshold on top of it. Raising the blur past about 0.1 fuses the whole line into one mass.

The overlap is a third of the morph, not all of it

The outgoing word plays its own entrance backwards on a clock that runs 1.5× fast, and the incoming word does not start until the melt is 30% through. Running both across the whole morph leaves two complete words stacked at the midpoint and the threshold turns them into an unreadable puddle.

Timing

One cycle is holdInFrames + morphInFrames. loop is on by default and the last word morphs back into the first; turn it off and the final word is held. Both words run through split-text-chars with a frame override, so the stagger semantics are the same as everywhere else — it is fitted to the longest word so a wide stagger cannot leave the last letter half-formed when the hold begins.

A gooey threshold filter, not path interpolation — two arbitrary letters do not have matching node counts. Use `shape-morph` for paths you control.

Agent notes

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

Import
@/remotion/primitives/liquid-text-morph
  • Use when: frame-level motion primitives and reusable animation wrappers.
  • Customize: words, holdInFrames, morphInFrames, loop, 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 { LiquidTextMorph } from "@/remotion/primitives/liquid-text-morph"; <LiquidTextMorph words={["Melt", "Merge", "Reform"]} morphInFrames={22} />

API Reference

PropTypeDescription
wordsstring[]Two or more words. The last melts back into the first when looping.
holdInFramesnumberFrames a word is held before it starts melting.
morphInFramesnumberFrames one word takes to become the next.
loopbooleanKeep cycling. When false the last word is held forever.
gooStrengthnumberBlur feeding the threshold, in em. This is what makes letters merge.
gooContrastnumberAlpha contrast on the blurred layer. Lower is softer and wetter.
staggerInFramesnumberFrames between neighbouring letters melting. Clamped to fit the morph.
fontSizenumberDefaults to a scaled 96px at the composition width.
colorstringInk colour.
fontWeightnumber | stringHeavier weights fuse more readily under the threshold.

Related

On this page