react-native-auto-skeleton
Version:
🚀 Automatically generates skeleton based on your existing UI layout without manual configuration.
163 lines (124 loc) • 5.68 kB
Markdown
# React Native Auto Skeleton – Lightweight Skeleton Loader for React Native
**`react-native-auto-skeleton`** is a modern **skeleton loader for React Native**, designed to automatically render **loading placeholders** (shimmer-style) based on your existing layout.
> Ideal replacement for `react-native-skeleton-placeholder` and other manual solutions.
<div align="center" style="max-width: 400px; margin: auto;">
<a href="https://www.npmjs.com/package/react-native-auto-skeleton">
<img src="https://img.shields.io/npm/v/react-native-auto-skeleton.svg" alt="npm version" />
</a>
<a href="https://www.npmjs.com/package/react-native-auto-skeleton">
<img src="https://img.shields.io/npm/dm/react-native-auto-skeleton.svg" alt="npm downloads" />
</a>
<img src="https://img.shields.io/badge/platform-iOS-blue?logo=apple" alt="iOS" />
<img src="https://img.shields.io/badge/platform-Android-green?logo=android" alt="Android" />
<img src="https://img.shields.io/badge/types-TypeScript-blue?logo=typescript" alt="TypeScript" />
<img src="https://img.shields.io/badge/license-MIT-yellow.svg" alt="MIT License" />
<a href="https://bundlephobia.com/result?p=react-native-auto-skeleton">
<img src="https://img.shields.io/bundlephobia/minzip/react-native-auto-skeleton" alt="Bundle size" />
</a>
</div>
## Demo
<p align="center">
<img src="./assets/demo.gif" width="500" alt="react-native-auto-skeleton demo" />
</p>
## ✅ Platform Support
| Platform | Old Arch | Fabric |
|----------|----------|--------|
| iOS | ✅ | ✅ |
| Android | ✅ | ✅ |
## Installation
Using npm:
```bash
npm install react-native-auto-skeleton
```
Using yarn:
```bash
yarn add react-native-auto-skeleton
```
### Expo
This library works in Expo (with `expo prebuild`) without additional configuration.
## Usage
> ⚠️ **Warning:** On Android, automatic detection of a view’s border-radius is not supported. You can override it manually via the defaultRadius prop.
Here's a quick example to get started:
```tsx
import { AutoSkeletonView, AutoSkeletonIgnoreView } from 'react-native-auto-skeleton';
...
<AutoSkeletonView isLoading={isLoading}>
...YOUR VIEWS
<AutoSkeletonIgnoreView> // Content that will be ignored by the skeleton
... Views without skeleton
</AutoSkeletonIgnoreView>
</AutoSkeletonView>
```
Full example
```tsx
import { AutoSkeletonView } from 'react-native-auto-skeleton';
interface IProfile {
name: string;
jobTitle: string;
avatar: string;
}
const getProfile = async (): Promise<IProfile> => {
// Fetch profile data from your API
};
export default function App() {
const [isLoading, setIsLoading] = useState(true);
const [profile, setProfile] = useState<IProfile>({} as IProfile);
useEffect(() => {
(async () => {
const res = await getProfile();
setProfile(res);
setIsLoading(false);
})();
}, []);
return (
<AutoSkeletonView isLoading={isLoading}>
<View style={styles.avatarWithName}>
<Image style={styles.avatar} source={{ uri: profile.avatar }} />
<View style={{ flex: 1 }}>
<Text style={styles.name}>{profile.name}</Text>
<Text style={styles.jobTitle}>{profile.jobTitle}</Text>
</View>
</View>
{/* This buttons block will have skeleton applied */}
<View style={styles.buttons}>
<TouchableOpacity style={styles.button}>
<Text style={styles.buttonTitle}>Add</Text>
</TouchableOpacity>
<TouchableOpacity style={styles.button}>
<Text style={styles.buttonTitle}>Delete</Text>
</TouchableOpacity>
</View>
{/* Alternatively, to exclude buttons from skeleton rendering: */}
<AutoSkeletonIgnoreView>
<View style={styles.buttons}>
...
</View>
</AutoSkeletonIgnoreView>
</AutoSkeletonView>
);
}
```
## API
| Prop | type | Description |
|---|---|---|
| **isLoading** | boolean | Enables or disables the skeleton state|
| **shimmerSpeed** | number | Duration of one shimmer animation cycle in seconds. Lower values = faster shimmer |
| **shimmerBackgroundColor** | string | Background color for animation types: `pulse` and `none` |
| **gradientColors** | [string,string] | Gradient colors for the skeleton gradient |
| **defaultRadius** | number | Default corner radius for skeleton elements that don't have a defined `borderRadius` | |
| **animationType** | `"gradient"` \| `"pulse"` \| `"none"` | Skeleton animation | |
## Best Practices
- For rapid implementation, wrap entire UI sections with `<AutoSkeletonView>`.
- For precise control, wrap individual UI components or groups separately.
- Ensure components have clearly defined dimensions, backgrounds, or styles for optimal skeleton rendering.
- To exclude specific components from skeleton rendering, wrap them with `<AutoSkeletonIgnoreView>`. Any content inside this wrapper will not be processed by the skeleton system.
## 🔁 Alternative Solutions
You may also know:
- [`react-native-skeleton-placeholder`](https://github.com/chramos/react-native-skeleton-placeholder)
- [`react-content-loader`](https://github.com/danilowoz/react-content-loader)
If you're looking for a **React Native skeleton loader** that works **automatically**, with **Fabric support**, and no manual configuration, `react-native-auto-skeleton` is your go-to solution.
## License
[MIT](LICENSE)
---
## 📌 Keywords
React Native Skeleton, React Native Placeholder, react-native skeleton loader, react native shimmer, loading indicator React Native, Fabric placeholder view, auto skeleton view, react native content loader.