@pixel-puppy/react
v1.0.2
Published
Official React library for Pixel Puppy - Transform and optimize images with WebP conversion and smart resizing
Maintainers
Readme
@pixel-puppy/react
Official React library for Pixel Puppy - Transform and optimize images with WebP conversion and smart resizing.
Features
- 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
Installation
npm
npm install @pixel-puppy/reactBun
bun add @pixel-puppy/reactQuick Start
import { Image } from '@pixel-puppy/react'
function App() {
return (
<Image
alt="A beautiful photo"
project="my-project"
src="https://example.com/photo.jpg"
/>
)
}API Reference
Image Component Props
Required Props
project(string) - Your Pixel Puppy project identifiersrc(string) - The URL of the original image to transform
Transformation Options
width(number, optional) - The desired width in pixels. The image will be resized to this width while maintaining aspect ratio. When provided withoutsizes, 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 accessibilityclassName- CSS classesstyle- Inline stylesloading- 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:
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"
/>
)
}Responsive Image Strategies
The Image component automatically selects the best responsive image strategy based on the props you provide:
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.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.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.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.
Usage Examples
Non-responsive Mode (Single URL)
For when you need a specific size without responsive behavior:
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}
/>
)
}Default Strategy (Full-Width Images)
Automatically generates srcset for all device breakpoints:
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"Width-based Strategy (Fixed Width with Mobile Alternatives)
Provides ALL breakpoints plus your width plus 2x for retina:
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}Sizes-based Strategy (Custom Responsive Behavior)
Filter breakpoints based on your layout needs:
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)Custom Format
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}
/>
)
}Lazy Loading
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>
)
}Responsive Images for Different Screen Sizes
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>
)
}With Tailwind CSS
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>
)
}TypeScript Support
This library is written in TypeScript and provides comprehensive type definitions:
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} />
}How It Works
The Image component uses the
@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:
- Fetches your original image
- Converts it to the specified format (WebP by default)
- Resizes it to the specified width (if provided)
- 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 - Core JavaScript/TypeScript library for building Pixel Puppy URLs
Contributing
Contributions are welcome! Please see CONTRIBUTING.md for details.
License
MIT License - see LICENSE for details.
Support
- Documentation: https://pixelpuppy.io/docs
- Issues: https://github.com/Artmann/pixel-puppy-react/issues
- Email: [email protected]
