Text Effect
Reveals text word by word, letter by letter or line by line, with blur, slide, scale or fade presets.
Motion
Playground
Tweak the props, the preview and the code follow.
Props
0.08
0
import { TextEffect } from "@/components/ui/text-effect"
<TextEffect>
Interfaces that feel alive
</TextEffect>Installation
npx @plumsydev/plum-ui add text-effectUsage
import { TextEffect } from "@/components/ui/text-effect"<TextEffect per="word" preset="blur">
Ship interfaces people remember.
</TextEffect>Examples
Presets
Switch preset and granularity — the effect replays on every change.
Streaming answer
Pair it with TextShimmer for an AI response that thinks, then flows in.
When should I use a spring instead of an easing curve?
Press send to get an answer.
Per line
per="line" with trigger="inView" for quotes and long-form copy.
API Reference
TextEffect
| Prop | Type | Default |
|---|---|---|
children*The text to animate. | string | — |
perGranularity of each animated segment. | "word" | "char" | "line" | "word" |
presetEntrance style of each segment. | "fade" | "blur" | "slide" | "scale" | "blur" |
asElement to render. | "p" | "span" | "div" | "h1" | "h2" | "h3" | "p" |
delaySeconds before the first segment. | number | 0 |
staggerSeconds between segments (0.03 char, 0.08 word, 0.16 line). | number | per-dependent |
triggerPlay immediately or when scrolled into view. | "mount" | "inView" | "mount" |
onceWith `inView`, only play the first time. | boolean | true |
segmentClassNameClasses applied to each segment. | string | — |
onCompleteCalled when the last segment has landed. | () => void | — |
Notes
- Screen readers get the full sentence through
aria-label; the animated segments are hidden from assistive tech. - Change the
keyto replay the animation. - With reduced motion, segments simply fade in together.