react-infinite-gallery
Version:
A beautiful infinite wraparound gallery React component.
146 lines (119 loc) âĸ 4.75 kB
Markdown
# React Infinite Gallery đŧī¸
<p align="center">
<img src="infinite-gallery.png" alt="Infinite Gallery" width="600" />
</p>
A beautiful infinite wraparound gallery React component that supports both images and videos with smooth animations and interactions.
## Live Demo đ
Check out the [live demo](https://codesandbox.io/p/sandbox/djftlv) to see the component in action!
## Installation đĻ
```bash
npm install react-infinite-gallery
```
Or:
```bash
yarn add react-infinite-gallery
```
## Features â¨
- đ Infinite scrolling with smooth loading
- đą Fully responsive grid layout
- đ¯ Lazy loading of images for better performance
- âī¸ Highly customizable grid settings
- đ¨ Clean and modern design
- đ Lightweight and optimized for performance
- đ¨ Clean and modern design
- đ Lightweight and optimized for performance
## Usage đģ
```jsx
import React from 'react';
import InfiniteGallery from 'react-infinite-gallery';
import 'react-infinite-gallery/dist/InfiniteGallery.css';
const itemsData = [
{
id: 1,
type: 'image',
content: 'https://example.com/image1.jpg',
badgeText: 'Sample',
color: '#EF5350', // Optional: custom color
rotation: 2, // Optional: custom rotation
scale: 1.1 // Optional: custom scale
},
{
id: 2,
type: 'video',
content: 'https://example.com/video1.mp4',
badgeText: 'Video',
color: '#42A5F5' // Optional: custom color
},
// Add more items as needed
];
function App() {
return (
<InfiniteGallery
itemsData={itemsData}
cardWidth={280}
cardHeight={380}
headerContent={<h1>Infinite Gallery</h1>}
footerContent={<p>Gallery Footer</p>}
galleryAnimate={true}
badgeClass="custom-badge"
stackInDuration={1500}
stackOutDuration={1000}
playButtonProps={{
className: 'custom-play-btn',
style: { backgroundColor: 'rgba(0,0,0,0.5)' },
children: 'âļ'
}}
expandButtonProps={{
className: 'custom-expand-btn',
style: { backgroundColor: 'rgba(0,0,0,0.5)' }
}}
infoButton={<button>âšī¸</button>}
/>
);
}
```
## Props đ§
| Prop | Type | Default | Description |
|------|------|---------|-------------|
| `itemsData` | Array | `[]` | Array of items to display. Each item should have: `id`, `type` ('image' or 'video'), `content` (URL), and optional `badgeText`, `color`, `rotation`, and `scale` |
| `cardWidth` | number | `280` | Width of each card in pixels |
| `cardHeight` | number | `380` | Height of each card in pixels |
| `headerContent` | ReactNode | `null` | Content to display at the top of the gallery |
| `footerContent` | ReactNode | `null` | Content to display at the bottom of the gallery |
| `galleryAnimate` | boolean | `true` | Whether to show the initial animation |
| `badgeClass` | string | `''` | Custom CSS class for badges |
| `stackInDuration` | number | `1500` | Duration of stack-in animation in milliseconds |
| `stackOutDuration` | number | `1000` | Duration of stack-out animation in milliseconds |
| `playButtonProps` | object | `{}` | Props for customizing the video play button |
| `expandButtonProps` | object | `{}` | Props for customizing the expand button |
| `infoButton` | ReactNode | `null` | Custom info button component |
## Item Data Structure
Each item in the `itemsData` array should have the following structure:
```typescript
interface GalleryItem {
id: number | string; // Unique identifier
type: 'image' | 'video'; // Type of content
content: string; // URL of the content
badgeText?: string; // Optional badge text
color?: string; // Optional custom color
rotation?: number; // Optional rotation in degrees
scale?: number; // Optional scale factor
}
```
## CSS Customization
The component comes with default styles but can be customized using CSS classes:
- `.ig-gallery` - Main gallery container
- `.ig-card` - Individual card container
- `.ig-badge` - Badge element
- `.ig-play-btn` - Video play button
- `.ig-expand-btn` - Expand button
- `.ig-info-panel` - Info panel
## Important Notes â ī¸
- A minimum of 20 images is required for optimal performance and user experience
- Supported image formats: jpg, png, webp
- For best performance, use appropriately sized and optimized images
- Make sure to import the CSS file as shown in the usage example
## Example
Check out the `usage-example.jsx` file in the repository for a complete implementation example.
## License đ
MIT