React Falling Text Effect
Physics-based text animation using Matter.js that makes words fall and bounce with realistic gravity and mouse interaction. Perfect for playful interfaces.
Want to add physics to your text?
Join our Discord community for help from other developers.
Most text animations use predictable CSS transitions that feel mechanical and disconnected from real-world physics. This component creates realistic falling text effects using Matter.js physics engine, making words behave like physical objects with gravity, collision, and mouse interaction.
Physics-powered word dynamics
Text that falls, bounces, and responds to mouse interaction with realistic physics:
Built with TypeScript for React applications, using Matter.js physics engine for realistic gravity simulation, collision detection, and interactive mouse constraints with customizable triggers.
Installation
npx shadcn@latest add https://www.shadcn.io/registry/falling-text.jsonnpx shadcn@latest add https://www.shadcn.io/registry/falling-text.jsonpnpm dlx shadcn@latest add https://www.shadcn.io/registry/falling-text.jsonbunx shadcn@latest add https://www.shadcn.io/registry/falling-text.jsonUsage
import FallingText from "@/components/text/falling-text";
<div className="relative w-full h-full">
<FallingText
text="shadcn/ui components fall gracefully with physics"
highlightWords={["shadcn/ui", "components", "physics"]}
trigger="hover"
backgroundColor="transparent"
wireframes={false}
gravity={0.5}
fontSize="1.5rem"
mouseConstraintStiffness={0.7}
/>
</div>Why CSS animations feel mechanical
Traditional text effects use linear or eased transitions—mathematical curves that don't reflect how objects move in the real world. CSS animations lack the unpredictability and natural variation that makes physical movement compelling and believable.
This React component uses Matter.js to simulate realistic physics for each word, including gravity, momentum, collision detection, and friction. Words fall naturally, bounce when they hit boundaries, and respond organically to mouse interaction, creating text that behaves like physical objects.
The key insight: physics engines create believable motion. When text follows real-world physics laws instead of mathematical easing functions, it creates more engaging and natural-feeling animations that capture user attention.
Features
- Realistic physics simulation using Matter.js engine with gravity, collision detection, and momentum
- Interactive mouse constraints allowing users to grab, drag, and throw individual words
- Multiple trigger options including auto-start, scroll detection, click activation, and hover triggers
- Word highlighting system with customizable styling for emphasized terms and phrases
- Configurable physics parameters including gravity strength, friction, restitution, and air resistance
- Responsive design with automatic boundary detection and container-based physics worlds
- Free open source component compatible with Next.js and shadcn/ui design systems
API Reference
FallingText
Physics-based text animation component with interactive controls.
| Prop | Type | Default | Description |
|---|---|---|---|
text | string | '' | Text content to animate |
highlightWords | string[] | [] | Words to highlight with special styling |
trigger | 'auto' | 'scroll' | 'click' | 'hover' | 'auto' | Animation trigger method |
backgroundColor | string | 'transparent' | Canvas background color |
wireframes | boolean | false | Show physics debug wireframes |
gravity | number | 1 | Gravity strength (0-2 recommended) |
mouseConstraintStiffness | number | 0.2 | Mouse interaction strength (0-1) |
fontSize | string | '1rem' | Text font size |
Trigger Options
Animation activation methods:
| Trigger | Behavior | Best For |
|---|---|---|
| auto | Starts immediately on mount | Hero sections, landing pages |
| scroll | Starts when component enters viewport | Content reveals, storytelling |
| click | Starts on container click | Interactive demonstrations |
| hover | Starts on container hover | Subtle interactive elements |
Physics Parameters
Realistic motion customization:
| Parameter | Range | Effect | Recommended |
|---|---|---|---|
| gravity | 0-2 | Falling speed | 0.5-1.0 for normal, 1.5+ for dramatic |
| mouseConstraintStiffness | 0-1 | Grab strength | 0.2-0.5 for gentle, 0.7+ for strong |
Common gotchas
Matter.js bundle size: The physics engine adds ~100KB gzipped to your bundle. Consider code splitting or lazy loading if physics effects aren't used throughout your application.
Performance with long text: Each word creates a physics body with collision detection. For very long text (100+ words), consider breaking into smaller components or reducing physics complexity.
Mobile touch interactions: Mouse constraints work with touch events, but the interaction feels different from desktop. Consider adjusting mouseConstraintStiffness or providing different parameters for touch devices.
Container sizing issues: The physics world is created based on container dimensions. Ensure the parent container has defined width and height, or words might fall through invisible boundaries.
Highlight word matching: Highlighting uses startsWith matching, so "React" will highlight "ReactJS" but not "MyReact". Adjust the matching logic in the component for more precise control.
Related text components you will also like
Rolling Text
3D character rolling with realistic physics and perspective
Text Trail
Character trails that follow cursor movement
Splitting Text
Character, word, or line splitting with perfect timing
Text Generate Effect
Progressive character generation with realistic typing timing
Text Reveal
Cinematic text reveals with clip-path and mask animations
Writing Text
Word-by-word reveals with natural reading rhythm and flow
Questions developers actually ask
React Decrypted Text Effect
Matrix-style text decryption animation with character scrambling, sequential reveal patterns, and customizable trigger modes. Perfect for cyberpunk interfaces.
React Flip Words
Animated word cycling with letter-by-letter reveals and smooth transitions. Perfect for React applications requiring dynamic text highlights.