@erosnicolau/animated-text
Version:
Advanced React animated text component with comprehensive animation effects
421 lines (310 loc) • 13 kB
Markdown
# @erosnicolau/animated-text
Advanced React animated text component with comprehensive animation effects and performance optimization.
## Features
- 🎨 **5 Animation Types** - Block, phrase, word, typewriter, and word-typewriter animations
- 🚀 **Performance Optimized** - FPS monitoring with automatic degradation
- 🔧 **Highly Configurable** - Extensive customization options for timing, effects, and styling
- 📱 **Responsive** - Automatic font scaling and mobile-optimized animations
- ♿ **Accessible** - Respects `prefers-reduced-motion` with graceful fallbacks
- 🎯 **TypeScript** - Full type safety with comprehensive interfaces
- 🌐 **i18n Ready** - Built for multilingual applications with phrase-based styling
- 🎬 **Group Coordination** - Synchronize multiple animated text elements
## Installation
```bash
npm install @erosnicolau/animated-text
```
## Quick Start
```tsx
import AnimatedText from '@erosnicolau/animated-text'
function MyComponent() {
return <AnimatedText content="Hello, World!" animation="word" wordEffect={['fadeIn', 'slide-up']} />
}
```
## Animation Types
### 1. Block Animation
Animates the entire text block as one unit.
```tsx
<AnimatedText
content="Welcome to our website"
animation="block"
blockEffect={['fadeIn', 'slide-up']}
blockDuration={800}
/>
```
### 2. Phrase Animation
Animates phrases separated by "|" character with individual styling.
```tsx
<AnimatedText
content="First phrase | Second phrase | Third phrase"
animation="phrases"
phraseStyles={[
{ phrase: 1, effect: ['fadeIn', 'slide-up'], className: 'text-blue-600' },
{ phrase: 2, effect: ['fadeIn', 'slide-up'], delayBefore: 300, className: 'text-green-600' },
{ phrase: 3, effect: ['fadeIn', 'slide-up'], delayBefore: 600, className: 'text-purple-600' }
]}
/>
```
### 3. Word Animation
Animates each word sequentially.
```tsx
<AnimatedText
content="Each word appears individually"
animation="word"
wordEffect={['fadeIn', 'scale']}
wordSpacing={200}
/>
```
### 4. Typewriter Animation
Animates each letter individually for a classic typewriter effect.
```tsx
<AnimatedText
content="Letter by letter animation"
animation="typewriter"
typewriterEffect={['fadeIn']}
typewriterDelay={50}
/>
```
### 5. Word-Typewriter Animation
Hybrid animation: letters appear individually with longer pauses between words for natural reading flow.
```tsx
<AnimatedText
content="Natural reading flow with pauses"
animation="word-typewriter"
wordTypewriterEffect={['fadeIn']}
wordTypewriterLetterDelay={40}
wordTypewriterWordDelay={300}
/>
```
## Effects System
The component supports composable effects that can be combined for sophisticated animations:
### Simple Effects
- **Opacity**: `fade`, `fadeIn`, `fadeOut`
- **Movement**: `slide-up`, `slide-down`, `slide-left`, `slide-right`
- **Scale**: `scale`, `scaleX`, `scaleY`
- **Rotation**: `rotate`, `rotateX`, `rotateY`
- **Filters**: `blur`, `brightness`, `contrast`
### Advanced Object Effects
For precise control, use object notation with custom values:
```tsx
<AnimatedText
content="Advanced effects"
animation="block"
blockEffect={[
'fadeIn',
{ type: 'slide', x: 0, y: -30 },
{ type: 'scale', from: 0.5, to: 1 },
{ type: 'rotate', from: 15, to: 0 },
{ type: 'fontSize', from: '12px', to: '48px' },
{ type: 'letterSpacing', from: '8px', to: '2px' },
{ type: 'textShadow', from: 'none', to: '0 0 20px #8b5cf6' },
{ type: 'color', from: '#8b5cf6', to: '#1e40af' }
]}
blockDuration={3000}
/>
```
### Typography Effects
- **Font**: `fontSize`, `fontWeight`, `letterSpacing`, `lineHeight`
- **Color**: `color`, `textShadow`
- **Spacing**: `margin`, `padding`, `width`, `height`
### Visual Effects
- **Borders**: `borderColor`, `borderWidth`, `borderRadius`
- **Shadows**: `textShadow`, `boxShadow`
- **Background**: `backgroundColor`, `backdropFilter`
### Effect Categories by Complexity
#### Basic (String Effects)
```tsx
wordEffect={['fadeIn', 'slide-up', 'scale']}
```
#### Advanced (Object Effects)
```tsx
blockEffect={[
'fadeIn',
{ type: 'fontSize', from: '16px', to: '32px' },
{ type: 'color', from: '#000', to: '#ff6b6b' }
]}
```
#### Ultimate (8+ Effect Combinations)
```tsx
blockEffect={[
'fadeIn',
{ type: 'slide', x: 0, y: -30 },
{ type: 'scale', from: 0.5, to: 1 },
{ type: 'rotate', from: 15, to: 0 },
{ type: 'fontSize', from: '12px', to: '48px' },
{ type: 'letterSpacing', from: '8px', to: '2px' },
{ type: 'textShadow', from: 'none', to: '0 0 20px #8b5cf6' },
{ type: 'color', from: '#8b5cf6', to: '#1e40af' }
]}
```
## Performance Features
### FPS Monitoring
Automatic performance monitoring with graceful degradation:
```tsx
import { getFPSMetrics, updateFPSThreshold } from '@erosnicolau/animated-text'
// Monitor performance
const metrics = getFPSMetrics()
console.log(`Current FPS: ${metrics.currentFPS}`)
// Adjust performance threshold
updateFPSThreshold(30) // Switch to simplified animations below 30 FPS
```
### Virtualization
Features intersection observer-based virtualization for performance optimization with large amounts of text.
## Group Coordination
Coordinate multiple animated text elements:
```tsx
import { AnimatedTextGroup } from '@erosnicolau/animated-text'
function Showcase() {
return (
<AnimatedTextGroup coordinationMode="sequential" staggerDelay={300}>
<AnimatedText content="First text" animation="word" />
<AnimatedText content="Second text" animation="block" />
<AnimatedText content="Third text" animation="typewriter" />
</AnimatedTextGroup>
)
}
```
### Coordination Modes
- `parallel` - All animations start simultaneously
- `sequential` - Animations start one after another
- `cascade` - Overlapping start times with stagger delay
- `wave` - Wave-like propagation effect
## Internationalization
Built for multilingual applications:
```tsx
<AnimatedText
content="Bună ziua | Salut | Welcome"
animation="phrases"
phraseStyles={[{ className: 'text-blue-600' }, { className: 'text-green-600' }, { className: 'text-purple-600' }]}
/>
```
## Font Scaling System
### 3-Level Priority Font System
The component uses a sophisticated 3-level priority system for font sizing:
#### Level 1: Explicit className (Highest Priority)
When you provide explicit font classes in `className`, they take full precedence:
```tsx
<AnimatedText
content="Custom sizing"
className="text-2xl md:text-3xl lg:text-4xl"
// fontPreset and fontScale are ignored
/>
```
#### Level 2: Font Presets (Medium Priority)
Use predefined responsive font combinations:
```tsx
<AnimatedText
content="Preset sizing"
fontPreset="hero" // 'hero', 'section', 'subsection', 'body'
// Only applies when no explicit font classes in className
/>
```
**Available Presets:**
- `hero`: Large display text (text-4xl md:text-5xl lg:text-6xl)
- `section`: Section headings (text-3xl md:text-4xl lg:text-5xl) - **default**
- `subsection`: Subsection headings (text-2xl md:text-3xl lg:text-4xl)
- `body`: Body text (text-lg md:text-xl lg:text-2xl)
#### Level 3: Font Scaling (Lowest Priority)
Proportionally scale any preset:
```tsx
<AnimatedText
content="Scaled preset"
fontPreset="section"
fontScale={1.2} // 20% larger than section preset
/>
<AnimatedText
content="Smaller version"
fontPreset="hero"
fontScale={0.8} // 20% smaller than hero preset
/>
```
### Semantic Elements
Control the HTML element used:
```tsx
<AnimatedText
content="Page Title"
as="h1" // h1, h2, h3, h4, h5, h6, p, div, span
fontPreset="hero"
/>
```
## Advanced Props
### AnimatedTextProps
| Prop | Type | Default | Description |
| ------------- | --------------- | --------- | ------------------------------ |
| `content` | `string` | - | Text content (required) |
| `animation` | `AnimationType` | `'block'` | Animation type |
| `allowHtml` | `boolean` | `false` | Enable HTML parsing |
| `startDelay` | `number` | `300` | Initial delay before animation |
| `itemSpacing` | `number` | `600` | Default spacing between items |
### Block Animation Props
| Prop | Type | Default | Description |
| --------------- | ------------------ | ------------------------ | ------------------------ |
| `blockEffect` | `ComposableEffect` | `['fadeIn', 'slide-up']` | Block animation effects |
| `blockDuration` | `number` | `600` | Block animation duration |
| `blockEasing` | `AnimationEasing` | `'ease-out'` | Block animation easing |
### Word Animation Props
| Prop | Type | Default | Description |
| -------------- | ------------------ | ------------ | ---------------------- |
| `wordEffect` | `ComposableEffect` | `['fadeIn']` | Word animation effects |
| `wordDuration` | `number` | `400` | Duration per word |
| `wordSpacing` | `number` | `200` | Time between words |
| `wordEasing` | `AnimationEasing` | `'ease-out'` | Word animation easing |
### Typewriter Animation Props
| Prop | Type | Default | Description |
| -------------------- | ------------------ | ------------ | ------------------------ |
| `typewriterEffect` | `ComposableEffect` | `['fadeIn']` | Letter animation effects |
| `typewriterDuration` | `number` | `200` | Duration per letter |
| `typewriterDelay` | `number` | `50` | Time between letters |
| `typewriterEasing` | `AnimationEasing` | `'ease-out'` | Letter animation easing |
### Word-Typewriter Animation Props
| Prop | Type | Default | Description |
| --------------------------- | ------------------ | ------------ | ----------------------------- |
| `wordTypewriterEffect` | `ComposableEffect` | `['fadeIn']` | Letter animation effects |
| `wordTypewriterDuration` | `number` | `150` | Duration per letter |
| `wordTypewriterLetterDelay` | `number` | `50` | Time between letters |
| `wordTypewriterWordDelay` | `number` | `400` | Time delay at word boundaries |
| `wordTypewriterEasing` | `AnimationEasing` | `'ease-out'` | Letter animation easing |
### Phrase Animation Props
| Prop | Type | Default | Description |
| -------------- | --------------- | ------- | ------------------------------------ |
| `phraseStyles` | `PhraseStyle[]` | `[]` | Individual phrase styling and timing |
## Demo
The package includes a comprehensive demo showcasing all features:
```tsx
import { AnimatedTextDemo } from '@erosnicolau/animated-text/demo'
function App() {
return <AnimatedTextDemo />
}
```
### Demo Sections Available
- **Animation Types**: All 5 animation modes with live examples
- **Composable Effects**: Mix and match effect combinations
- **Ultimate Effects**: 8+ effect combinations showing maximum capabilities
- **Font Effects**: fontSize, fontWeight, letterSpacing, lineHeight animations
- **Visual Effects**: Colors, shadows, borders, backgrounds
- **Layout Effects**: Width, height, margin, padding animations
- **Typography Showcases**: Real-world text animation scenarios
- **Group Animations**: Coordinated multi-element animations
- **Creative Demos**: Artistic, cinematic, gaming, and agency-style presentations
- **Static Styling**: Non-animated styling options
- **Border Effects**: Comprehensive border animation examples
## CSS Import
Don't forget to import the CSS file:
```tsx
import '@erosnicolau/animated-text/dist/AnimatedText.css'
```
## TypeScript Support
Full TypeScript support with exported types:
```tsx
import type { AnimatedTextProps, AnimationEffect, ComposableEffect, FPSMetrics } from '@erosnicolau/animated-text'
```
## Performance Recommendations
1. **Monitor FPS** in production with `getFPSMetrics()`
2. **Limit concurrent animations** (< 10 simultaneously)
3. **Prefer `transform` and `opacity`** effects for best performance
4. **Test on mobile devices** for performance validation
## License
MIT License - see package.json for details.
## Contributing
This package is part of the Eros Nicolau portfolio project. For bugs or feature requests, please open an issue.
---
**Made with ❤️ by Eros Nicolau**