Join our Discord Community

React Splitting Text

Text that reveals piece by piece without looking like a glitchy typewriter. Smooth staggered animations for characters, words, or lines that actually flow naturally. Built with Framer Motion, TypeScript, and shadcn/ui.

Trying to implement text animations?

Join our Discord community for help from other developers.


Ever tried to animate text revealing and it either all pops in at once (boring) or staggers so slowly it feels like watching paint dry? Most split text animations either have terrible timing or split at weird places, making sentences look broken. This component gets the rhythm right—characters flow smoothly, words feel natural, lines cascade properly.

Character-by-character reveals with perfect timing

Text that splits and reveals with natural stagger patterns:

Loading component...

Built with TypeScript and shadcn/ui, using Framer Motion for precise stagger control in React applications. Whether you split by character, word, or line, the timing feels natural and the text maintains proper spacing and flow throughout the animation.

Installation

npx shadcn@latest add https://www.shadcn.io/registry/splitting-text.json
npx shadcn@latest add https://www.shadcn.io/registry/splitting-text.json
pnpm dlx shadcn@latest add https://www.shadcn.io/registry/splitting-text.json
bunx shadcn@latest add https://www.shadcn.io/registry/splitting-text.json

Usage

import { SplittingText } from "@/components/text/splitting-text";

<SplittingText
  text="Smooth text reveals that actually work"
  type="words"
  inView={true}
  motionVariants={{
    initial: { opacity: 0, x: 100 },
    animate: { opacity: 1, x: 0 },
    transition: { duration: 0.5 },
    stagger: 0.1
  }}
/>;

Why most split text animations suck

Most developers just throw a delay on each element without considering how humans actually read. Characters that appear too fast blur together, too slow feels broken. Words that split randomly break readability. Lines that cascade without rhythm look like a broken marquee.

This React component uses different stagger timings for each split type: 50ms for characters (fast enough to feel smooth), 200ms for words (time to process each one), 300ms for lines (dramatic without dragging). We preserve proper spacing and line breaks so text never looks broken during animation.

The motion variants are customizable but the defaults were tested for readability. Text slides in from the right with opacity fade, matching how eyes naturally scan left-to-right. No bouncing, no rotating, no effects that compete with actual reading.

Examples

Word-by-word reveals

Perfect timing for headlines and taglines:

Loading component...

Line-by-line cascading

Dramatic reveals for poetry or step-by-step content:

Loading component...

Custom animation variants

Fully customizable motion for brand-specific effects:

Loading component...

Features

  • Three splitting modes optimized for different content types in React applications
  • Stagger timing that matches natural reading rhythm and comprehension
  • Custom motion variants with complete animation control for JavaScript projects
  • In-view detection so animations trigger when users actually see them
  • Complete TypeScript support with full motion variant type definitions
  • Preserves text formatting and whitespace during all animation states
  • Free open source component that works seamlessly with shadcn/ui in Next.js

API Reference

SplittingText

Text animation with character, word, or line splitting options.

PropTypeDefaultDescription
textstring | string[]requiredText or array of lines to animate
type'chars' | 'words' | 'lines''chars'How to split text for animation
motionVariantsMotionVariants-Custom Framer Motion variants
inViewbooleanfalseOnly animate when visible
inViewMarginstring"0px"Viewport margin for trigger
inViewOncebooleantrueAnimate only once
delaynumber0Start delay in milliseconds
classNamestring-Additional CSS classes
...propsHTMLAttributes<HTMLDivElement>-Standard div attributes

Motion Variants Interface

Customize how text elements animate:

motionVariants?: {
  initial?: Record<string, any>;    // Starting state
  animate?: Record<string, any>;    // Final state  
  transition?: Record<string, any>; // Timing config
  stagger?: number;                 // Override default stagger
}

Optimal Stagger Timing

Tested values for natural reading flow:

Split TypeDefault StaggerReading SpeedBest For
chars0.05sFastHeadlines, short phrases
words0.2sNaturalSentences, taglines
lines0.3sDramaticPoetry, step lists

Common gotchas

Text looks broken during animation: Make sure the container has enough width in React applications. Character splitting with narrow containers causes weird wrapping during the reveal.

Stagger timing feels wrong: Default timings work for English text with TypeScript optimization. Other languages or very long text might need custom stagger values. Test with actual content, not Lorem ipsum.

Animation performance issues: Each character/word/line creates individual animated elements in JavaScript applications. Very long text (500+ words) might be slow on older devices—consider splitting into smaller chunks.

Whitespace disappears: The component preserves spacing, but custom CSS might override it in Next.js projects. Check for white-space or word-spacing styles that could interfere.

Lines don't break properly: For line splitting, pass an array of strings, not a single string with \n characters. Each array item becomes one animated line.

Integration with other components

Perfect for hero sections in Card layouts or dramatic reveals in Sheet overlays within React applications. Combines well with Button components for call-to-action sequences in Next.js projects.

For storytelling interfaces, pair with Progress indicators showing reading progress or Tabs for chapter navigation. This free open source component works great with Avatar for quote attributions and Badge for content tags, all with complete TypeScript integration.

Questions developers actually ask