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
$ npx remotion-ui@latest add liquid-text-morphCycles 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 →
@/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-uinpm package; it is copied into your project.
Usage
import { LiquidTextMorph } from "@/remotion/primitives/liquid-text-morph";
<LiquidTextMorph words={["Melt", "Merge", "Reform"]} morphInFrames={22} />API Reference
| Prop | Type | Default | Description |
|---|---|---|---|
| words | string[] | - | Two or more words. The last melts back into the first when looping. |
| holdInFrames | number | 12 | Frames a word is held before it starts melting. |
| morphInFrames | number | 22 | Frames one word takes to become the next. |
| loop | boolean | true | Keep cycling. When false the last word is held forever. |
| gooStrength | number | 0.045 | Blur feeding the threshold, in em. This is what makes letters merge. |
| gooContrast | number | 18 | Alpha contrast on the blurred layer. Lower is softer and wetter. |
| staggerInFrames | number | 2 | Frames between neighbouring letters melting. Clamped to fit the morph. |
| fontSize | number | - | Defaults to a scaled 96px at the composition width. |
| color | string | "#f4f4f5" | Ink colour. |
| fontWeight | number | string | 700 | Heavier weights fuse more readily under the threshold. |