react-loadly
Version:
⚛️ React Loadly - Modern React loader, spinner, and skeleton loader components. High-performance loading indicators for React apps with TypeScript support, Next.js compatibility, accessibility, and 30+ customizable animations. Perfect for dashboards, form
1,502 lines (1,137 loc) • 48.8 kB
Markdown
# ⚛️ React Loadly — React Loader, Spinner & Loading Indicator Components Library
<p align="center">
<img src="./public/images/react-loadly-hero.png" alt="React Loadly - Modern React Loaders, Spinners, Skeleton Loaders, and Loading Indicators for React and Next.js" width="900" />
</p>
**React Loadly** is a modern, high-performance **React loader, spinner, and skeleton loader components library** with **30+ customizable loading animations**. Built with **TypeScript**, optimized for **Next.js and SSR**, and designed with **accessibility (ARIA)** and **developer experience** in mind.
Perfect for building **React applications, React dashboards, forms, and data-driven UIs** where you need smooth, customizable loading states and skeleton screens. Includes **AutoSkeletonLoader** for automatically generating skeleton loaders based on your component structure.
🔍 **Search-friendly features**: React loading spinner | React loader components | React skeleton loader | React loading indicator | Next.js loader | TypeScript loader | Accessible React loader | React loading animation
🏠 **Home Page**: [https://Mostafashadow1.github.io/react-loadly-showCases/](https://Mostafashadow1.github.io/react-loadly-showCases/)
[](https://www.npmjs.com/package/react-loadly)
[](https://bundlephobia.com/result?p=react-loadly)
[](https://github.com/Mostafashadow1/react-loadly/blob/main/LICENSE)
## ✨ Key Features
- **High Performance**: Uses hardware-accelerated CSS transforms and animations.
- **Accessibility First**: Full **ARIA support**, screen reader compatibility, and keyboard navigation.
- **TypeScript Ready**: Comprehensive type definitions for a seamless dev experience.
- **Highly Customizable**: Adjust appearance with CSS variables or component props.
- **Tree-Shakable**: Supports modern bundlers to only include what you use.
- **Reduced Motion**: Respects the user's `prefers-reduced-motion` settings.
- **SSR Compatible**: Works out-of-the-box with frameworks like **Next.js**.
- **Fullscreen Support**: Display loaders in fullscreen mode with customizable backgrounds.
- **AutoSkeletonLoader Support**: Automatically generates skeleton loaders based on your component structure.
---
## 🆕 What's New
We've added **7 exciting new loaders** to expand your loading animation options:
1. **OrbitLoader** - Beautiful orbiting elements around a central point
2. **PlaneLoader** - 3D rotating cube with perspective transforms
3. **RippleLoader** - Expanding ripple rings from a central point
4. **SquaresLoader** - Multiple rotating squares with dynamic grid effect
5. **StairLoader** - Cascading stair steps with progress-like effect
6. **HashtagLoader** - Animated hashtag with progressive drawing
7. **SnakeLoader** - Snake-like slithering animation with flowing segments
All new loaders support:
- ✅ Customizable colors with `secondaryColor` prop
- ✅ Adjustable element count (where applicable)
- ✅ Fullscreen mode support
- ✅ Accessibility features (ARIA labels, reduced motion)
- ✅ Performance optimizations with hardware acceleration
---
## 🚀 Getting Started
### Installation
Install the package using your preferred package manager.
```bash
npm install react-loadly
# or
yarn add react-loadly
# or
pnpm i react-loadly
```
### Bundle Optimization
React Loadly is optimized for minimal bundle size and supports tree shaking:
- **Zero Side Effects**: Set `"sideEffects": false` in your bundler config for optimal tree shaking
- **Individual Imports**: Import only the components you need
- **Separate CSS**: Import styles separately to avoid bundling unused styles
```jsx
// ✅ Recommended: Import only what you need
import { SpinLoader } from "react-loadly";
import "react-loadly/styles.css";
// ✅ Alternative: Import from specific paths (if supported by your bundler)
import { SpinLoader } from "react-loadly/components";
import { useLoaderState } from "react-loadly/hooks";
```
### Quick Usage
Import the components you need along with the base styles, then use them in your React application.
```jsx
import { SpinLoader, PulseLoader } from "react-loadly";
import "react-loadly/styles.css"; // Essential for base styles
function App() {
return (
<div>
{/* Simple spinning loader */}
<SpinLoader />
{/* A customized loader */}
<PulseLoader color="#ff6b6b" size={60} />
</div>
);
}
```
---
## 🎨 Component Showcase
### Geometric Loaders
| Component | Description |
| --------------- | ---------------------------------------------------------------------------- |
| `SpinLoader` | A classic spinner with a minimalist design. |
| `PulseLoader` | A dynamic animation of pulsing dots. |
| `WaveLoader` | A series of bars creating a wave-like effect. |
| `GridLoader` | A grid of squares that animate in sequence. |
| `RingLoader` | A sophisticated ring spinner with dual rotation. |
| `BarsLoader` | Animated bars with staggered timing. |
| `BounceLoader` | Bouncing dots with elastic animation. |
| `RotateLoader` | 3D rotating elements with depth. |
| `OrbitLoader` | Orbiting elements around a central point with customizable count and colors. |
| `PlaneLoader` | 3D rotating cube with perspective transforms. |
| `SquaresLoader` | Multiple rotating squares with varying delays and scales. |
| `StairLoader` | Cascading stair steps creating a progress effect. |
| `HashtagLoader` | Animated hashtag symbol with progressive drawing effect. |
| `SnakeLoader` | Snake-like slithering animation with flowing segments. |
| `RippleLoader` | Expanding ripple rings from a central point. |
---
### Modern Content Loaders
| Component | Description |
| -------------------- | ---------------------------------------------------------------------------------------------- |
| `SkeletonLoader` | Modern skeleton placeholders with shimmer effects. with Sophisticated shimmer wave animations. |
| `AutoSkeletonLoader` | Automatically generates skeleton loaders based on your component structure. |
### Organic & Text-Based Loaders
| Component | Description |
| -------------- | --------------------------------------------------- |
| `BlobLoader` | A liquid-like loader with a smooth, organic feel. |
| `TypingLoader` | A loader that simulates typing or processing text. |
| `DotsLoader` | The familiar three-dot animation, perfect for text. |
| `LiquidLoader` | Fluid, morphing shapes with organic movement. |
| `FlowLoader` | Flowing particles with smooth transitions. |
### Flexible Loaders
| Component | Description |
| -------------------- | ------------------------------------------------------------------------------------ | --- |
| `ElementLoader` | A flexible loader that can display any React element with various animation effects. |
| `FallbackLoader` | Error handling and retry functionality with customizable UI. |
| `LogoSpinLoader` | Specialized loader for logos and brand elements. |
| `ProgressRingLoader` | Accessible progress ring with optional determinate mode. |
| `MorphLoader` | Smooth morphing SVG shapes that interpolate between paths. |
| `SpinDotsLoader` | Circular orbit of dots; perfect for inline text. |
| `HeatmapLoader` | Grid of pulses with staggered timing; useful for dashboards. | |
### ProgressRingLoader Component
The `ProgressRingLoader` is an accessible progress ring component that supports both determinate and indeterminate modes. In determinate mode, it shows the exact progress percentage, while in indeterminate mode, it provides a continuous spinning animation.
#### Basic Usage
```jsx
import { ProgressRingLoader } from "react-loadly";
function App() {
return (
<div>
{/* Indeterminate mode (default) */}
<ProgressRingLoader />
{/* Determinate mode */}
<ProgressRingLoader progress={75} />
{/* Custom size and color */}
<ProgressRingLoader size={60} color="#10b981" thickness={6} />
</div>
);
}
```
#### ProgressRingLoader Props
| Prop | Type | Default | Description |
| ----------- | ---------------- | --------- | ------------------------------------------------ |
| `progress` | number \| null | null | Progress value (0-100) or null for indeterminate |
| `thickness` | number | 4 | Thickness of the ring |
| `size` | number \| string | 40 | Size of the loader |
| `color` | string | "#6366f1" | Color of the progress ring |
All other props are inherited from `IBaseLoaderProps`.
---
### MorphLoader Component
The `MorphLoader` creates smooth morphing SVG shapes that interpolate between different paths. It supports three variants: blob, soft, and sharp.
#### Basic Usage
```jsx
import { MorphLoader } from "react-loadly";
function App() {
return (
<div>
{/* Default blob variant */}
<MorphLoader />
{/* Soft variant */}
<MorphLoader variant="soft" />
{/* Sharp variant */}
<MorphLoader variant="sharp" />
{/* Custom size and color */}
<MorphLoader size={60} color="#10b981" />
</div>
);
}
```
#### MorphLoader Props
| Prop | Type | Default | Description |
| --------- | --------------------------- | --------- | --------------------------- |
| `variant` | "blob" \| "soft" \| "sharp" | "blob" | Morph variant type |
| `speed` | number | 1 | Animation speed multiplier |
| `size` | number \| string | 40 | Size of the loader |
| `color` | string | "#6366f1" | Color of the morphing shape |
All other props are inherited from `IBaseLoaderProps`.
---
### SpinDotsLoader Component
The `SpinDotsLoader` creates a circular orbit of dots, perfect for inline text loading indicators.
#### Basic Usage
```jsx
import { SpinDotsLoader } from "react-loadly";
function App() {
return (
<div>
{/* Default 3 dots */}
<SpinDotsLoader />
{/* Custom number of dots */}
<SpinDotsLoader dots={5} />
{/* Custom size and color */}
<SpinDotsLoader size={50} color="#10b981" />
</div>
);
}
```
#### SpinDotsLoader Props
| Prop | Type | Default | Description |
| ------- | ---------------- | --------- | -------------------------- |
| `dots` | number | 3 | Number of dots in orbit |
| `gap` | number | 8 | Gap between dots |
| `size` | number \| string | 40 | Size of the loader |
| `color` | string | "#6366f1" | Color of the dots |
| `speed` | number | 1 | Animation speed multiplier |
All other props are inherited from `IBaseLoaderProps`.
---
### HeatmapLoader Component
The `HeatmapLoader` displays a grid of pulses with staggered timing, useful for dashboard data placeholders.
#### Basic Usage
```jsx
import { HeatmapLoader } from "react-loadly";
function App() {
return (
<div>
{/* Default 3x5 grid */}
<HeatmapLoader />
{/* Custom grid size */}
<HeatmapLoader rows={4} cols={6} />
{/* Custom size and color */}
<HeatmapLoader size={60} color="#10b981" />
</div>
);
}
```
#### HeatmapLoader Props
| Prop | Type | Default | Description |
| ------- | ---------------- | --------- | -------------------------- |
| `rows` | number | 3 | Number of rows in grid |
| `cols` | number | 5 | Number of columns in grid |
| `size` | number \| string | 40 | Size of the loader |
| `color` | string | "#6366f1" | Color of the cells |
| `speed` | number | 1 | Animation speed multiplier |
All other props are inherited from `IBaseLoaderProps`.
---
### ClockLoader Component
The `ClockLoader` animates like a traditional clock with hour, minute, and second hands.
#### Basic Usage
```jsx
import { ClockLoader } from "react-loadly";
function App() {
return (
<div>
{/* Default clock */}
<ClockLoader />
{/* Custom size */}
<ClockLoader size={60} />
{/* Custom tick speed */}
<ClockLoader tickSpeed={2} />
</div>
);
}
```
#### ClockLoader Props
| Prop | Type | Default | Description |
| ----------- | ---------------- | --------- | ------------------------ |
| `size` | number \| string | 40 | Size of the clock |
| `tickSpeed` | number | 1 | Speed of clock animation |
| `color` | string | "#6366f1" | Color of the clock hands |
All other props are inherited from `IBaseLoaderProps`.
---
### NeumorphicLoader Component
The `NeumorphicLoader` creates a soft neumorphic pill/dots loader for modern UI designs.
#### Basic Usage
```jsx
import { NeumorphicLoader } from "react-loadly";
function App() {
return (
<div>
{/* Default elevation */}
<NeumorphicLoader />
{/* Custom elevation */}
<NeumorphicLoader elevation={8} />
{/* Custom size and color */}
<NeumorphicLoader size={50} color="#10b981" />
</div>
);
}
```
#### NeumorphicLoader Props
| Prop | Type | Default | Description |
| ----------- | ---------------- | --------- | -------------------------- |
| `elevation` | number | 5 | Elevation level (1-10) |
| `size` | number \| string | 40 | Size of the loader |
| `color` | string | "#6366f1" | Color of the loader |
| `speed` | number | 1 | Animation speed multiplier |
All other props are inherited from `IBaseLoaderProps`.
---
### OrbitLoader Component
The `OrbitLoader` creates a beautiful orbital animation with elements rotating around a central point, similar to planets orbiting a star.
#### Basic Usage
```jsx
import { OrbitLoader } from "react-loadly";
function App() {
return (
<div>
{/* Default with 3 orbiting elements */}
<OrbitLoader />
{/* Custom number of orbiting elements */}
<OrbitLoader count={5} />
{/* With secondary color */}
<OrbitLoader count={4} color="#3b82f6" secondaryColor="#f59e0b" />
</div>
);
}
```
#### OrbitLoader Props
| Prop | Type | Default | Description |
| ---------------- | ---------------- | --------- | ---------------------------------------- |
| `count` | number | 3 | Number of orbiting elements |
| `secondaryColor` | string | undefined | Secondary color for alternating elements |
| `size` | number \| string | 60 | Size of the loader |
| `color` | string | "#6366f1" | Primary color of the orbit elements |
| `speed` | number | 1 | Animation speed multiplier |
All other props are inherited from `IBaseLoaderProps`.
---
### PlaneLoader Component
The `PlaneLoader` displays a 3D rotating cube with perspective transforms, creating a modern 3D loading experience.
#### Basic Usage
```jsx
import { PlaneLoader } from "react-loadly";
function App() {
return (
<div>
{/* Default cube */}
<PlaneLoader />
{/* Custom size and color */}
<PlaneLoader size={60} color="#10b981" />
{/* With secondary color for cube faces */}
<PlaneLoader size={70} color="#3b82f6" secondaryColor="#8b5cf6" />
</div>
);
}
```
#### PlaneLoader Props
| Prop | Type | Default | Description |
| ---------------- | ---------------- | --------- | ----------------------------------- |
| `secondaryColor` | string | undefined | Color for the cube face backgrounds |
| `size` | number \| string | 50 | Size of the loader |
| `color` | string | "#6366f1" | Primary color of the cube edges |
| `speed` | number | 1 | Animation speed multiplier |
All other props are inherited from `IBaseLoaderProps`.
---
### RippleLoader Component
The `RippleLoader` creates expanding ripple rings from a central point, similar to water ripples.
#### Basic Usage
```jsx
import { RippleLoader } from "react-loadly";
function App() {
return (
<div>
{/* Default with 3 ripples */}
<RippleLoader />
{/* Custom number of ripples */}
<RippleLoader count={5} />
{/* With secondary color and custom border width */}
<RippleLoader count={4} color="#3b82f6" secondaryColor="#8b5cf6" borderWidth={3} />
</div>
);
}
```
#### RippleLoader Props
| Prop | Type | Default | Description |
| ---------------- | ---------------- | --------- | --------------------------------------- |
| `count` | number | 3 | Number of ripple rings |
| `secondaryColor` | string | undefined | Secondary color for alternating ripples |
| `borderWidth` | number | 2 | Width of the ripple border |
| `size` | number \| string | 50 | Size of the loader |
| `color` | string | "#6366f1" | Primary color of the ripples |
| `speed` | number | 1 | Animation speed multiplier |
All other props are inherited from `IBaseLoaderProps`.
---
### SquaresLoader Component
The `SquaresLoader` displays multiple rotating squares with varying delays and scales for a dynamic grid effect.
#### Basic Usage
```jsx
import { SquaresLoader } from "react-loadly";
function App() {
return (
<div>
{/* Default with 4 squares */}
<SquaresLoader />
{/* Custom number of squares */}
<SquaresLoader count={6} />
{/* With secondary color */}
<SquaresLoader count={9} color="#3b82f6" secondaryColor="#f59e0b" />
</div>
);
}
```
#### SquaresLoader Props
| Prop | Type | Default | Description |
| ---------------- | ---------------- | --------- | --------------------------------------- |
| `count` | number | 4 | Number of squares |
| `secondaryColor` | string | undefined | Secondary color for alternating squares |
| `size` | number \| string | 40 | Size of the loader |
| `color` | string | "#6366f1" | Primary color of the squares |
| `speed` | number | 1 | Animation speed multiplier |
All other props are inherited from `IBaseLoaderProps`.
---
### StairLoader Component
The `StairLoader` creates cascading stair steps that animate in sequence, creating a progress-like effect.
#### Basic Usage
```jsx
import { StairLoader } from "react-loadly";
function App() {
return (
<div>
{/* Default with 5 steps */}
<StairLoader />
{/* Custom number of steps */}
<StairLoader count={7} />
{/* With secondary color */}
<StairLoader count={6} color="#3b82f6" secondaryColor="#8b5cf6" />
</div>
);
}
```
#### StairLoader Props
| Prop | Type | Default | Description |
| ---------------- | ---------------- | --------- | ------------------------------------- |
| `count` | number | 5 | Number of stair steps |
| `secondaryColor` | string | undefined | Secondary color for alternating steps |
| `size` | number \| string | 35 | Size of the loader |
| `color` | string | "#6366f1" | Primary color of the steps |
| `speed` | number | 1 | Animation speed multiplier |
All other props are inherited from `IBaseLoaderProps`.
---
### HashtagLoader Component
The `HashtagLoader` animates a hashtag symbol with a progressive drawing effect.
#### Basic Usage
```jsx
import { HashtagLoader } from "react-loadly";
function App() {
return (
<div>
{/* Default hashtag */}
<HashtagLoader />
{/* Custom size and color */}
<HashtagLoader size={60} color="#10b981" />
{/* With secondary color */}
<HashtagLoader size={70} color="#3b82f6" secondaryColor="#8b5cf6" />
</div>
);
}
```
#### HashtagLoader Props
| Prop | Type | Default | Description |
| ---------------- | ---------------- | --------- | --------------------------------------------- |
| `secondaryColor` | string | undefined | Secondary color for alternating path segments |
| `size` | number \| string | 50 | Size of the loader |
| `color` | string | "#6366f1" | Primary color of the hashtag stroke |
| `speed` | number | 1 | Animation speed multiplier |
All other props are inherited from `IBaseLoaderProps`.
---
### SnakeLoader Component
The `SnakeLoader` creates a snake-like animation with flowing segments that move in a wave pattern.
#### Basic Usage
```jsx
import { SnakeLoader } from "react-loadly";
function App() {
return (
<div>
{/* Default with 6 segments */}
<SnakeLoader />
{/* Custom number of segments */}
<SnakeLoader count={8} />
{/* With secondary color */}
<SnakeLoader count={10} color="#3b82f6" secondaryColor="#f59e0b" />
</div>
);
}
```
#### SnakeLoader Props
| Prop | Type | Default | Description |
| ---------------- | ---------------- | --------- | ---------------------------------------- |
| `count` | number | 6 | Number of snake segments |
| `secondaryColor` | string | undefined | Secondary color for alternating segments |
| `size` | number \| string | 60 | Size of the loader |
| `color` | string | "#6366f1" | Primary color of the snake segments |
| `speed` | number | 1 | Animation speed multiplier |
All other props are inherited from `IBaseLoaderProps`.
---
## 🦴 SkeletonLoader Component
The `SkeletonLoader` is perfect for modern loading states, creating placeholder content that mimics the actual content structure.
### Basic Usage
```jsx
import { SkeletonLoader } from "react-loadly";
function App() {
return (
<div>
{/* Basic skeleton line */}
<SkeletonLoader />
{/* Multiple skeleton lines */}
<SkeletonLoader lines={3} />
{/* Card skeleton */}
<SkeletonLoader variant="card" width={300} height={200} />
{/* Avatar skeleton */}
<SkeletonLoader variant="avatar" size={60} />
</div>
);
}
```
### Skeleton Variants
The SkeletonLoader supports multiple variants to match different content types:
```jsx
// Line skeleton (default) - for text content
<SkeletonLoader variant="line" lines={3} />
// Card skeleton - for image cards or content blocks
<SkeletonLoader variant="card" width={300} height={200} />
// Avatar skeleton - for profile images
<SkeletonLoader variant="avatar" size={60} />
// Text skeleton - for single line text
<SkeletonLoader variant="text" width="100%" height={16} />
// Custom skeleton - for any custom shape
<SkeletonLoader
variant="custom"
width={200}
height={100}
borderRadius="8px"
/>
```
### Variant Details
| Variant | Use Case | Default Dimensions | Default Border Radius |
| -------- | ---------------------------------- | --------------------------- | --------------------- |
| `line` | Paragraphs, lists, general content | width: 100%, height: 16px | 4px |
| `card` | Images, cards, content blocks | width: 300px, height: 200px | 8px |
| `avatar` | Profile pictures, user icons | width: 40px, height: 40px | 50% (circular) |
| `text` | Single line text elements | width: 100%, height: 16px | 4px |
| `custom` | Any custom shape or element | width: 100%, height: 16px | 4px (customizable) |
### Customization Options
```jsx
<SkeletonLoader
lines={3}
color="#f0f0f0"
highlightColor="#e0e0e0"
shimmerColor="rgba(255, 255, 255, 0.6)"
spacing="12px"
shimmer={true}
waveWidth="200px"
waveDirection="left-to-right"
speed={1.5}
/>
```
### SkeletonLoader Props
| Prop | Type | Default | Description |
| ---------------- | ------------------------------------------------------------------------ | ----------------------- | ----------------------------------- |
| `lines` | number | 1 | Number of skeleton lines to display |
| `variant` | "line" \| "card" \| "avatar" \| "text" \| "custom" | "line" | Variant of skeleton to display |
| `width` | number \| string | varies by variant | Width of skeleton elements |
| `height` | number \| string | varies by variant | Height of skeleton elements |
| `borderRadius` | number \| string | varies by variant | Border radius of skeleton elements |
| `spacing` | number \| string | "8px" | Spacing between skeleton lines |
| `shimmer` | boolean | true | Whether to show shimmer animation |
| `shimmerColor` | string | "rgba(255,255,255,0.6)" | Shimmer effect color |
| `highlightColor` | string | "#f1f5f9" | Highlight color for shimmer effect |
| `waveWidth` | number \| string | "200px" | Shimmer wave width |
| `waveDirection` | "left-to-right" \| "right-to-left" \| "top-to-bottom" \| "bottom-to-top" | "left-to-right" | Direction of shimmer animation |
---
## 🤖 AutoSkeletonLoader Component
The `AutoSkeletonLoader` is an advanced component that automatically generates skeleton loaders based on the structure of your actual components. It analyzes your component's JSX tree and creates matching skeleton placeholders.
### Key Features
- **Automatic Generation**: Scans the JSX tree of your component and replaces each element with a matching skeleton placeholder
- **Smart Dimension Estimation**: Automatically estimates skeleton dimensions based on element types and content
- **Style Inheritance**: Optionally inherits inline styles and props directly from the original element
- **Customizable Class Names**: Override styles per element type for fine-grained control
- **Variant Support**: Automatically selects appropriate skeleton variants (rect, circle, text) based on element type
- **Consistent Animations**: Shimmer effect support that's consistent with SkeletonLoader
- **Smooth Transitions**: Built-in fade-in/out animations between skeleton and real component
- **Accessibility**: Full ARIA support and screen reader compatibility
- **Performance Optimized**: Uses React.memo and useMemo for optimal re-rendering
### Basic Usage
```jsx
import { AutoSkeletonLoader } from "react-loadly";
function UserProfile({ user, loading }) {
return <AutoSkeletonLoader loading={loading} component={<UserProfileCard user={user} />} />;
}
function UserProfileCard({ user }) {
return (
<div>
<img src={user.avatar} alt={user.name} width="100" height="100" />
<h3>{user.name}</h3>
<p>{user.bio}</p>
<button>Follow</button>
</div>
);
}
```
### Advanced Usage Examples
#### Style Inheritance
```jsx
// Inherits styles from original elements for more accurate skeletons
<AutoSkeletonLoader loading={loading} component={<UserProfileCard user={user} />} inheritStyles={true} />
```
#### Custom Class Names
```jsx
// Customize skeleton appearance per element type
<AutoSkeleton
loading={loading}
component={<Card data={data} />}
styless={{
p: { height: "0.8em", width: "80%" },
h3: { height: "1.2em", width: "60%", borderRadius: "8px" },
img: { borderRadius: "12px" },
button: { width: "150px", height: "50px" },
}}
/>
```
#### With Shimmer Effects
```jsx
// Enable shimmer animations for a more polished look
<AutoSkeleton
loading={loading}
component={<ProductCard product={product} />}
shimmer={true}
shimmerColor="rgba(255, 255, 255, 0.8)"
highlightColor="#f8fafc"
/>
```
#### Complex Component Example
```jsx
function DashboardCard({ title, metrics, loading }) {
return (
<AutoSkeletonLoader
loading={loading}
component={
<div className="dashboard-card">
<h2>{title}</h2>
<div className="metrics">
{metrics.map((metric, index) => (
<div key={index} className="metric">
<span className="value">{metric.value}</span>
<span className="label">{metric.label}</span>
</div>
))}
</div>
</div>
}
inheritStyles={true}
shimmer={true}
/>
);
}
```
### AutoSkeleton Props
| Prop | Type | Default | Description |
| ---------------- | ------------------------------------------------------------------------ | ----------------------- | ------------------------------------------------ |
| `component` | ReactElement | - | The component to render or analyze for skeletons |
| `inheritStyles` | boolean | false | Whether to inherit styles from original elements |
| `styless` | object | {} | Custom styles for different element types |
| `shimmer` | boolean | true | Whether to show shimmer animation |
| `shimmerColor` | string | "rgba(255,255,255,0.6)" | Shimmer effect color |
| `highlightColor` | string | "#f1f5f9" | Highlight color for shimmer effect |
| `waveWidth` | number \| string | "200px" | Shimmer wave width |
| `waveDirection` | "left-to-right" \| "right-to-left" \| "top-to-bottom" \| "bottom-to-top" | "left-to-right" | Direction of shimmer animation |
All other props are inherited from `IBaseLoaderProps`.
---
## 🎨 New Loaders Feature Guide
### Using Multiple New Loaders Together
Here's how to combine the new loaders for amazing visual effects:
```jsx
import { OrbitLoader, PlaneLoader, RippleLoader, SquaresLoader, StairLoader, HashtagLoader, SnakeLoader } from "react-loadly";
function MultiLoaderShowcase() {
return (
<div style={{ display: "grid", gridTemplateColumns: "repeat(2, 1fr)", gap: "40px", padding: "40px" }}>
{/* Orbital system animation */}
<div style={{ textAlign: "center" }}>
<h3>OrbitLoader - Space Theme</h3>
<OrbitLoader size={80} count={5} color="#0ea5e9" secondaryColor="#fbbf24" />
</div>
{/* 3D cube for tech products */}
<div style={{ textAlign: "center" }}>
<h3>PlaneLoader - 3D Effect</h3>
<PlaneLoader size={70} color="#6366f1" secondaryColor="#8b5cf6" />
</div>
{/* Ripple for notifications */}
<div style={{ textAlign: "center" }}>
<h3>RippleLoader - Pulse Effect</h3>
<RippleLoader size={60} count={4} color="#10b981" borderWidth={3} />
</div>
{/* Dynamic grid */}
<div style={{ textAlign: "center" }}>
<h3>SquaresLoader - Grid Animation</h3>
<SquaresLoader size={50} count={6} color="#3b82f6" />
</div>
{/* Progress stairs */}
<div style={{ textAlign: "center" }}>
<h3>StairLoader - Step Effect</h3>
<StairLoader size={45} count={7} color="#f59e0b" />
</div>
{/* Social media hashtag */}
<div style={{ textAlign: "center" }}>
<h3>HashtagLoader - Social Media</h3>
<HashtagLoader size={65} color="#1da1f2" speed={1.5} />
</div>
{/* Flowing snake */}
<div style={{ textAlign: "center" }}>
<h3>SnakeLoader - Organic Motion</h3>
<SnakeLoader size={70} count={8} color="#ec4899" secondaryColor="#8b5cf6" />
</div>
</div>
);
}
```
### Color Themes for New Loaders
All new loaders support `secondaryColor` for beautiful gradient and alternating color effects:
```jsx
// Ocean theme
<OrbitLoader color="#0ea5e9" secondaryColor="#06b6d4" />
<RippleLoader color="#0891b2" borderWidth={2} />
// Fire theme
<SnakeLoader color="#f97316" secondaryColor="#ef4444" />
<StairLoader color="#ff9500" secondaryColor="#ff6b00" />
// Purple theme
<PlaneLoader color="#7c3aed" secondaryColor="#a78bfa" />
<SquaresLoader color="#8b5cf6" secondaryColor="#c4b5fd" />
// Social media theme
<HashtagLoader color="#1da1f2" /> // Twitter blue
<HashtagLoader color="#E1306C" /> // Instagram pink
```
---
## ⚡ Performance & Best Practices
### Performance Optimization
React Loadly is built with performance in mind:
- **Hardware Acceleration**: All animations use CSS transforms and `will-change` for optimal performance
- **Reduced Motion Support**: Automatically respects user's motion preferences
- **Tree Shaking**: Import only the components you need
- **Memoization**: Components use React.memo and useMemo for optimal re-rendering
- **CSS-in-JS**: Minimal runtime overhead with CSS variables
### Best Practices
```jsx
// ✅ Good: Import only what you need
import { SpinLoader, SkeletonLoader } from "react-loadly";
// ❌ Avoid: Importing everything
import \* as Loaders from "react-loadly";
// ✅ Good: Use appropriate loader for context
function UserProfile({ user, loading }) {
if (loading) {
return (
<div>
<SkeletonLoader variant="avatar" size={60} />
<SkeletonLoader lines={2} />
</div>
);
}
return <div>{/_ User content _/}</div>;
}
// ✅ Good: Conditional rendering
function DataComponent({ data, loading }) {
return <div>{loading ? <SpinLoader /> : <div>{data}</div>}</div>;
}
// ✅ Good: Use fullscreen for page-level loading
function App() {
const [isLoading, setIsLoading] = useState(true);
return (
<div>
{isLoading && <SpinLoader fullscreen loaderCenter screenBackground="rgba(255, 255, 255, 0.9)" />}
{/_ App content _/}
</div>
);
}
```
### Bundle Size Optimization
``jsx
// ✅ Tree-shakable imports
import { SpinLoader } from "react-loadly";
// ✅ CSS imports (only import what you need)
import "react-loadly/styles.css";
// ✅ For Next.js, use dynamic imports for code splitting
import dynamic from "next/dynamic";
const SkeletonLoader = dynamic(() => import("react-loadly").then((mod) => ({ default: mod.SkeletonLoader })));
```
---
## ♿ Accessibility
Accessibility is a core feature, not an afterthought. All loaders include:
- **ARIA attributes** (`role="status"`, `aria-label`) for screen readers.
- Support for **Reduced Motion**.
- **High contrast** and semantic HTML.
<!-- end list -->
``jsx
// Accessible by default
<SpinLoader aria-label="Loading content" />
// Custom accessible text
<PulseLoader showText loadingText="Processing your request..." />
```
---
## 🛠️ Customization
### CSS Variables
Customize the entire loader library globally with CSS variables.
```css
:root {
--loader-color: #3b82f6;
--loader-size: 40px;
--loader-speed: 1s;
--loader-text-color: #6b7280;
}
```
### Component Props
Each loader component accepts a common set of props for fine-grained control.
```typescript
interface BaseLoaderProps {
size?: number | string;
color?: string;
speed?: number;
loading?: boolean;
className?: string;
style?: React.CSSProperties;
showText?: boolean;
loadingText?: string;
// Fullscreen props
fullscreen?: boolean;
screenWidth?: number | string;
screenHeight?: number | string;
loaderCenter?: boolean;
screenBackground?: string;
}
```
### TypeScript Integration
React Loadly provides comprehensive TypeScript definitions for all components and hooks. You can import types and interfaces directly from the library:
``tsx
// ✅ Correct way to import shared interfaces
import type { IBaseLoaderProps, ISkeletonLoaderProps } from "react-loadly";
// For component-specific props
import type {
IOrbitLoaderProps,
IPlaneLoaderProps,
IRippleLoaderProps,
ISquaresLoaderProps,
IStairLoaderProps,
IHashtagLoaderProps,
ISnakeLoaderProps
} from "react-loadly";
// For hook return types
import type { IUseLoaderStateReturn } from "react-loadly/hooks";
// For animation types
import type { AnimationDirectionType } from "react-loadly";
````
All types are properly exported and can be used in your TypeScript projects for better type safety and autocompletion.
**Available Interface Exports:**
- `IBaseLoaderProps` - Base props for all loaders
- `IGeometricLoaderProps` - Base props for geometric loaders (includes `count`, `secondaryColor`, etc.)
- `IOrbitLoaderProps`, `IPlaneLoaderProps`, `IRippleLoaderProps`, etc. - Specific loader props
- `ISkeletonLoaderProps`, `IProgressRingLoaderProps`, `IMorphLoaderProps` - Specialized loader props
Avoid importing directly from internal paths like `react-loadly/types` or `react-loadly/interfaces` as these are not part of the public API and may change.
### Fullscreen Mode
Display any loader in fullscreen mode with customizable dimensions and background:
```jsx
// Fullscreen loader covering entire viewport
<SpinLoader
fullscreen={true}
loaderCenter={true}
screenBackground="#f0f0f0"
/>
// Fullscreen loader with custom dimensions
<PulseLoader
fullscreen={true}
screenWidth={800}
screenHeight={600}
loaderCenter={true}
screenBackground="rgba(0, 0, 0, 0.5)"
/>
```
---
## 🎯 Real-World Examples
### Loading States for Different Content Types
``jsx
import { SkeletonLoader, SpinLoader, PulseLoader } from "react-loadly";
function ContentLoader() {
return (
<div>
{/_ Blog post loading Dashboard loading _/}
<div className="blog-post">
<SkeletonLoader variant="avatar" size={40} />
<SkeletonLoader lines={3} spacing="8px" />
<SkeletonLoader variant="card" width="100%" height={200} />
</div>
{/* Button loading */}
<button disabled>
<SpinLoader size={16} />
Processing...
</button>
{/* Inline loading */}
<div>
Loading data <PulseLoader size={12} />
</div>
</div>
);
}
```
### Form Loading States
``jsx
function FormWithLoading() {
const [isSubmitting, setIsSubmitting] = useState(false);
return (
<form onSubmit={handleSubmit}>
<input type="text" placeholder="Name" />
<input type="email" placeholder="Email" />
<button type="submit" disabled={isSubmitting}>
{isSubmitting ? (
<>
<SpinLoader size={16} />
Submitting...
</>
) : (
"Submit"
)}
</button>
</form>
);
}
```
### Data Table Loading
``jsx
function DataTable({ data, loading }) {
if (loading) {
return (
<div className="data-table">
{/_ Header skeleton _/}
<div className="table-header">
{Array.from({ length: 5 }).map((\_, i) => (
<SkeletonLoader key={i} width={120} height={20} />
))}
</div>
{/* Row skeletons */}
{Array.from({ length: 10 }).map((_, i) => (
<div key={i} className="table-row">
{Array.from({ length: 5 }).map((_, j) => (
<SkeletonLoader key={j} width={100} height={16} />
))}
</div>
))}
</div>
);
}
return <div className="data-table">{/_ Actual table content _/}</div>;
}
```
### Image Gallery Loading
``jsx
function ImageGallery({ images, loading }) {
if (loading) {
return (
<div className="image-gallery">
{Array.from({ length: 6 }).map((_, i) => (
<SkeletonLoader
key={i}
variant="card"
width={200}
height={200}
borderRadius="8px"
shimmer
shimmerColor="#f0f0f0"
waveDirection="left-to-right"
/>
))}
</div>
);
}
return (
<div className="image-gallery">
{images.map((image, i) => (
<img key={i} src={image.url} alt={image.alt} />
))}
</div>
);
}
```
### Social Media Feed Loading
``jsx
function SocialFeed({ posts, loading }) {
if (loading) {
return (
<div className="social-feed">
{Array.from({ length: 5 }).map((_, i) => (
<div key={i} className="feed-card">
<div style={{ display: 'flex', alignItems: 'center', gap: '12px', marginBottom: '12px' }}>
<SkeletonLoader variant="avatar" size={40} />
<SkeletonLoader lines={2} width="80%" />
</div>
<SkeletonLoader variant="card" width="100%" height={200} />
<div style={{ display: 'flex', gap: '8px', marginTop: '12px' }}>
<SnakeLoader size={20} count={4} />
<span>Processing...</span>
</div>
</div>
))}
</div>
);
}
return <div className="social-feed">{posts.map(renderPost)}</div>;
}
```
### Gaming/Entertainment Loading States
``jsx
function GameLoader() {
return (
<div style={{ display: 'flex', flexDirection: 'column', gap: '20px', alignItems: 'center' }}>
{/* Futuristic game loading */}
<OrbitLoader size={80} count={6} color="#00f5ff" secondaryColor="#ff0080" />
{/* Social media hashtag */}
<HashtagLoader size={60} color="#1da1f2" speed={1.5} />
{/* Snake game effect */}
<SnakeLoader size={70} count={8} color="#10b981" secondaryColor="#f59e0b" />
</div>
);
}
```
### 3D and Modern UI Loading
``jsx
function ModernDashboardLoader() {
return (
<div className="dashboard-loader">
{/* 3D rotating cube for tech products */}
<PlaneLoader size={60} color="#6366f1" secondaryColor="#8b5cf6" />
{/* Ripple effect for notifications */}
<RippleLoader size={50} count={4} color="#3b82f6" borderWidth={3} />
{/* Staircase for progress indication */}
<StairLoader count={7} size={40} color="#10b981" />
</div>
);
}
---
## 🧩 Advanced Usage
### `useLoaderState` Hook
Manage loading, error, and retry states for your data fetching with this convenient hook.
```jsx
import { useLoaderState, SpinLoader } from "react-loadly";
function DataComponent() {
const { state, setLoading, setError, retry } = useLoaderState({
timeout: 10000,
maxRetries: 3,
});
const loadData = async () => {
setLoading(true);
try {
await fetch("/api/data");
setLoading(false);
} catch (error) {
setError(error.message);
}
};
if (state.error) {
return (
<div>
Error: {state.error}
<button onClick={retry}>Retry</button>
</div>
);
}
return (
<div>
<SpinLoader loading={state.isLoading} />
<button onClick={loadData} disabled={state.isLoading}>
Load Data
</button>
</div>
);
}
```
---
## 🤝 Contributing
We welcome contributions from the community! Whether you're fixing bugs, adding new features, or improving documentation, your contributions help make React Loadly better for everyone.
### How to Contribute
1. **Fork the repository** on GitHub
2. **Clone your fork** locally:
```bash
git clone https://github.com/your-username/react-loadly.git
cd react-loadly
```
3. **Create a new branch** for your changes:
```bash
git checkout -b feature/your-feature-name
```
4. **Install dependencies**:
```bash
pnpm install
```
5. **Make your changes** and ensure tests pass:
```bash
pnpm test
pnpm build
```
6. **Commit your changes**:
```bash
git commit -m "feat: add your awesome feature"
```
7. **Push to your fork**:
```bash
git push origin feature/your-feature-name
```
8. **Open a Pull Request** with a clear description of your changes
### What You Can Contribute
- 🐛 **Bug fixes** - Help us squash bugs
- ✨ **New loader components** - Add new loading animations
- 📚 **Documentation** - Improve examples and guides
- 🎨 **Design improvements** - Enhance existing components
- 🧪 **Tests** - Add test coverage
- 🌐 **Internationalization** - Help with translations
- 📦 **Build improvements** - Optimize bundle size and build process
### Development Guidelines
- Follow the existing code style and patterns
- Add tests for new features
- Update documentation for API changes
- Ensure accessibility standards are met
- Keep bundle size impact minimal
### Need Help?
- 💬 **Join our discussions** in GitHub Discussions
- 🐛 **Report bugs** in GitHub Issues
- 💡 **Suggest features** in GitHub Issues
- 📖 **Read our contributing guide** for detailed information
---
## 👥 Contributors
Thank you to all the amazing people who have contributed to React Loadly:
<!-- Contributors will be automatically updated by GitHub Actions -->
<!--
<a href="https://github.com/Mostafashadow1/react-loadly/graphs/contributors">
<img src="https://contrib.rocks/image?repo=Mostafashadow1/react-loadly" />
</a>
-->
### Hall of Fame
- **[](https://github.com/Mostafashadow1)** - Creator and maintainer
- _Your name could be here!_ - [Contribute today](#-contributing)
### Recognition
We recognize contributors in several ways:
- 🏆 **Contributor badges** in pull requests
- 📝 **Contributor recognition** in release notes
- 🌟 **Hall of fame** in this README
- 🎉 **Special thanks** in our changelog
---
## 📄 License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
---
## 🙏 Acknowledgments
- Thanks to the React community for inspiration and feedback
- Special thanks to all contributors who help make this project better
- Built with ❤️ for developers who value great UX
---
**Made with ❤️ by the React Loadly community**
````