@pixel-puppy/react
Version:
Official React library for Pixel Puppy - Transform and optimize images with WebP conversion and smart resizing
367 lines (289 loc) • 9.3 kB
Markdown
Official React library for [Pixel Puppy](https://pixelpuppy.io) - Transform and
optimize images with WebP conversion and smart resizing.
- **Simple React Component** - Drop-in replacement for `<img>` tags
- **Automatic WebP Conversion** - Serve modern image formats for better
performance
- **Smart Responsive Images** - Automatic srcset generation with device
breakpoints for optimal loading on all screen sizes
- **Multiple Strategies** - Intelligent selection between non-responsive, default,
width-based, and sizes-based strategies
- **TypeScript Support** - Fully typed with comprehensive type definitions
- **Zero Configuration** - Works out of the box with sensible defaults
- **Ref Forwarding** - Access the underlying img element when needed
```bash
npm install @pixel-puppy/react
```
```bash
bun add @pixel-puppy/react
```
```tsx
import { Image } from '@pixel-puppy/react'
function App() {
return (
<Image
alt="A beautiful photo"
project="my-project"
src="https://example.com/photo.jpg"
/>
)
}
```
- `project` (string) - Your Pixel Puppy project identifier
- `src` (string) - The URL of the original image to transform
- `width` (number, optional) - The desired width in pixels. The image will be
resized to this width while maintaining aspect ratio. When provided without
`sizes`, generates srcset with ALL common breakpoints plus width plus 2x
variant.
- `format` ('webp' | 'png', optional) - The desired output format. Defaults to
'webp' for optimal performance.
- `responsive` (boolean, optional) - Whether to generate responsive image
attributes (srcset, sizes). When false, returns only a single src URL.
Defaults to true.
- `sizes` (string, optional) - HTML sizes attribute value for responsive images.
Describes the image's display size across different viewport widths. When
provided, uses sizes-based srcset strategy with filtered breakpoints.
Example: `"(min-width: 768px) 50vw, 100vw"`
#### Standard HTML Img Attributes
The Image component supports all standard HTML img element attributes including:
- `alt` - Alternative text for accessibility
- `className` - CSS classes
- `style` - Inline styles
- `loading` - Loading strategy ('lazy' | 'eager')
- `decoding` - Decoding hint ('async' | 'auto' | 'sync')
- `crossOrigin` - CORS settings
- And all other standard img attributes
### Ref Forwarding
The Image component forwards refs to the underlying img element:
```tsx
import { useRef } from 'react'
import { Image } from '@pixel-puppy/react'
function App() {
const imgRef = useRef<HTMLImageElement>(null)
return (
<Image
alt="A photo"
project="my-project"
ref={imgRef}
src="https://example.com/photo.jpg"
/>
)
}
```
The Image component automatically selects the best responsive image strategy
based on the props you provide:
1. **Non-responsive Strategy** (`responsive={false}`): Returns only a single src
URL with no srcset or sizes. Use this when you want a specific image size
without responsive behavior.
2. **Default Strategy** (no width or sizes): Generates srcset with all common
device breakpoints (480w, 640w, 750w, 828w, 1080w, 1200w, 1920w, 2048w,
3840w) and sets `sizes="100vw"`. Ideal for full-width images like heroes or
banners.
3. **Width-based Strategy** (width provided, no sizes): Generates srcset with
ALL common device breakpoints PLUS your provided width PLUS a 2x variant.
Sets `sizes="(min-width: 1024px) 1024px, 100vw"`. Ensures mobile
alternatives are always available while supporting high-DPI displays.
4. **Sizes-based Strategy** (sizes provided): Generates srcset filtered based on
the smallest vw value in your sizes attribute. Automatically excludes
unnecessary breakpoints for optimal performance.
For when you need a specific size without responsive behavior:
```tsx
import { Image } from '@pixel-puppy/react'
function Avatar() {
return (
<Image
alt="User avatar"
project="my-project"
responsive={false}
src="https://example.com/avatar.jpg"
width={64}
/>
)
}
```
Automatically generates srcset for all device breakpoints:
```tsx
import { Image } from '@pixel-puppy/react'
function Hero() {
return (
<Image
alt="Hero image"
className="w-full h-auto"
project="my-project"
src="https://example.com/hero.jpg"
/>
)
}
// Generates srcset: 480w, 640w, 750w, 828w, 1080w, 1200w, 1920w, 2048w, 3840w
// Sets sizes="100vw"
```
Provides ALL breakpoints plus your width plus 2x for retina:
```tsx
import { Image } from '@pixel-puppy/react'
function ProductImage() {
return (
<Image
alt="Product photo"
project="my-project"
src="https://example.com/product.jpg"
width={800}
/>
)
}
// Generates srcset: 480w, 640w, 750w, 800w, 1600w (2x), 1920w, 2048w, 3840w
// Sets sizes="(min-width: 1024px) 1024px, 100vw"
// Sets width={800}
```
Filter breakpoints based on your layout needs:
```tsx
import { Image } from '@pixel-puppy/react'
function SidebarImage() {
return (
<Image
alt="Sidebar image"
project="my-project"
sizes="(min-width: 1024px) 33vw, (min-width: 768px) 50vw, 100vw"
src="https://example.com/sidebar.jpg"
width={600}
/>
)
}
// Automatically filters breakpoints based on smallest vw (33vw)
// Only includes breakpoints >= ~160px (33% of 480px)
```
```tsx
import { Image } from '@pixel-puppy/react'
function Logo() {
return (
<Image
alt="Company logo"
format="png"
project="my-project"
src="https://example.com/logo.png"
width={200}
/>
)
}
```
```tsx
import { Image } from '@pixel-puppy/react'
function ProductGrid() {
return (
<div className="grid grid-cols-3 gap-4">
{products.map((product) => (
<Image
key={product.id}
alt={product.name}
className="rounded-lg"
loading="lazy"
project="my-project"
src={product.imageUrl}
width={400}
/>
))}
</div>
)
}
```
```tsx
import { Image } from '@pixel-puppy/react'
function ResponsiveImage() {
return (
<picture>
<source
media="(min-width: 1024px)"
srcSet="https://pixelpuppy.io/api/image?project=my-project&url=https://example.com/photo.jpg&format=webp&width=1920"
/>
<source
media="(min-width: 768px)"
srcSet="https://pixelpuppy.io/api/image?project=my-project&url=https://example.com/photo.jpg&format=webp&width=1024"
/>
<Image
alt="Responsive photo"
project="my-project"
src="https://example.com/photo.jpg"
width={640}
/>
</picture>
)
}
```
```tsx
import { Image } from '@pixel-puppy/react'
function Card() {
return (
<div className="max-w-sm rounded overflow-hidden shadow-lg">
<Image
alt="Card image"
className="w-full"
project="my-project"
src="https://example.com/card-image.jpg"
width={400}
/>
<div className="px-6 py-4">
<div className="font-bold text-xl mb-2">Card Title</div>
<p className="text-gray-700 text-base">Card description</p>
</div>
</div>
)
}
```
This library is written in TypeScript and provides comprehensive type
definitions:
```tsx
import { Image, type ImageProps } from '@pixel-puppy/react'
const imageProps: ImageProps = {
alt: 'A photo',
format: 'webp',
project: 'my-project',
src: 'https://example.com/photo.jpg',
width: 800
}
function MyImage() {
return <Image {...imageProps} />
}
```
The Image component uses the
[@pixel-puppy/javascript](https://www.npmjs.com/package/@pixel-puppy/javascript)
library under the hood to build optimized image URLs. When you provide a
`project`, `src`, and optional transformation options, it constructs a Pixel
Puppy API URL that:
1. Fetches your original image
2. Converts it to the specified format (WebP by default)
3. Resizes it to the specified width (if provided)
4. Serves the optimized result through a global CDN
The component is a thin wrapper around the standard HTML `<img>` element,
forwarding all standard attributes and supporting ref forwarding.
## Related Packages
- [@pixel-puppy/javascript](https://www.npmjs.com/package/@pixel-puppy/javascript) -
Core JavaScript/TypeScript library for building Pixel Puppy URLs
## Contributing
Contributions are welcome! Please see [CONTRIBUTING.md](./CONTRIBUTING.md) for
details.
## License
MIT License - see [LICENSE](./LICENSE) for details.
## Support
- Documentation: https://pixelpuppy.io/docs
- Issues: https://github.com/Artmann/pixel-puppy-react/issues
- Email: support@pixelpuppy.io