Official React library for Pixel Puppy - 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
npm install @pixel-puppy/reactbun add @pixel-puppy/reactimport { 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 identifiersrc(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 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"
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
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"
/>
)
}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.
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}
/>
)
}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"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}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)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}
/>
)
}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>
)
}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>
)
}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:
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
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.
- @pixel-puppy/javascript - Core JavaScript/TypeScript library for building Pixel Puppy URLs
Contributions are welcome! Please see CONTRIBUTING.md for details.
MIT License - see LICENSE for details.
- Documentation: https://pixelpuppy.io/docs
- Issues: https://github.com/Artmann/pixel-puppy-react/issues
- Email: support@pixelpuppy.io