gust
a gust of wind.
Queued
enter code
$199.85

gust

gust is a zero-added-dependency text animation for React. When a label changes, outgoing characters lift away and incoming ones settle in on a staggered draft — the shared prefix never moves, so only the difference animates. It's driven by the Web Animations API, respects reduced motion, and adds no animation runtime.

$ bunx shadcn@latest add maniktherana/gust/gust

Usage

import { Gust } from "@/components/ui/gust";

// cycle a list of words
<Gust words={["a gust of wind", "a gust of words"]} />

// or drive it yourself — every change animates
<Gust text={copied ? "Copied" : "Copy"} />

Props

PropDefaultDescription
words["a gust of…"]Words to cycle through.
textControlled mode — every change animates.
classNameCSS or Tailwind classes for typography, color, and spacing.
indexPin a specific word, disables the cycle.
interval1600Hold per word, ms.
duration440Enter duration per character, ms.
exitDuration360Exit duration per character, ms.
stagger12Delay between characters, ms.
entranceHeight8Overshoot above the baseline.
entranceScale1.1Peak scale mid-entrance.
exitHeight90Upward exit travel, % of line height.
exitScale0.4Scale characters shrink to on exit.
blurtrueBlur in and out.
scaletrueScale in and out.
preservePrefixtrueKeep the shared prefix still.

Best practices

Use gust for:

  • Button labels that confirm an action — Save, Saving…, Saved.
  • Prices, counts and totals where only some digits change.
  • Statuses: deploys, uploads, presence, build pipelines.
  • Short headlines cycling through a few words.

Avoid gust for:

  • Paragraphs or long sentences — it animates characters, not prose.
  • Text that changes many times a second; the hold is clamped so updates queue up.
  • Anything the user is in the middle of reading or editing.
exit
a gust of wliftinshrinkdblur
enter
a gust of wsettleoovershootrdsrise