Skip to content
WANCRAFT

C.09Typography & Text

Kinetic Headline

Display type that rises out of masks line by line, word by word or character by character.

ReactCSSTailwindintermediate

Overview

Kinetic Headline splits a headline into words (and optionally characters), wraps every word in a clipping mask and lets each fragment rise from below its baseline with a staggered CSS transition. Line mode measures the real wrapping, so whole lines move together at any width. It plays once on mount or when scrolled into view; screen readers receive the full sentence once, and reduced-motion users simply see the text.

01Installation

Method 01 · Registry

CLI verified

Uses the shadcn CLI in a project initialised with shadcn init. Installs the file to components/ui/kinetic-headline.tsx and adds its dependencies.

npx shadcn@latest add https://wancraft.my/r/kinetic-headline.json

Method 02 · Copy and paste

  1. 1. No extra dependencies — React and Tailwind CSS only.
  2. 2. Copy the source from the Code tab into components/ui/kinetic-headline.tsx.
  3. 3. Import it and adjust props.
Dependencies
None
Peer
react ≥ 18, tailwindcss ≥ 4
Added
1 Oct 2026
Updated
—

02Usage

The default configuration. Change properties above to generate a tailored example in the Usage tab.

example.tsx
import { KineticHeadline } from "@/components/ui/kinetic-headline";

export function KineticHeadlineExample() {
  return (
    <KineticHeadline className="text-5xl">
      Interfaces that move with intent
    </KineticHeadline>
  );
}

03Props

PropTypeDefaultDescription
childrenstring—The headline text. Use "\n" to force a line break.
as"h1" | "h2" | "h3" | "h4" | "p" | "div""h2"Element to render.
mode"line" | "word" | "char""word"Reveal unit. Line mode groups words by their measured line and re-measures on resize.
trigger"mount" | "view""mount"Play on mount, or once when 35% of the headline is in view.
durationnumber900Duration of each fragment's reveal in ms.
staggernumber60Delay between consecutive fragments in ms.
delaynumber0Delay before the first fragment in ms.
easing"expo" | "back" | "smooth""expo"Timing curve of the reveal.
blurbooleanfalseFade fragments in from a soft blur.
...propsHTMLAttributes—Native attributes (className, style, id, aria-*) are forwarded to the root element. Size the type with className.

04Features

  • 01Line, word and character modes with per-word clipping masks
  • 02Line mode follows the real wrapping and re-measures on resize
  • 03Pure CSS transitions — no animation library, no per-frame JavaScript
  • 04Plays on mount or once when scrolled into view (IntersectionObserver)
  • 05Replay by changing the component's key
motion · staggermotion · tweeninput · viewport

05Accessibility

  • The full headline is rendered once as visually hidden text; the animated fragments are aria-hidden.
  • Uses a real heading element by default (configurable via `as`).
  • With prefers-reduced-motion the plain text is rendered with no animation.

06Limitations

  • Splitting into inline-block fragments disables kerning between characters in character mode.
  • Children must be a plain string; inline markup inside the headline is not supported.