Media
ImageWithFallback
Image element that swaps in a neutral placeholder graphic when the source fails.
npx bezel-add add image-with-fallbackAbout
A React image component with a fallback for broken images. If the source fails to load it swaps in a neutral grey placeholder graphic while keeping your class names and inline styles, so layouts do not collapse or show the browser's broken image icon. It accepts every normal img attribute and stores the failed URL in a data attribute for debugging.
Key props: src (image URL to try), alt (alt text for the real image), className / style (applied to both the image and the fallback box)
packages/ui/src/media/ImageWithFallback.tsx · 30 lines
"use client";
import { useState } from "react";
const ERROR_IMG_SRC =
"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODgiIGhlaWdodD0iODgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBvcGFjaXR5PSIuMyIgZmlsbD0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIzLjciPjxyZWN0IHg9IjE2IiB5PSIxNiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiByeD0iNiIvPjxwYXRoIGQ9Im0xNiA1OCAxNi0xOCAzMiAzMiIvPjxjaXJjbGUgY3g9IjUzIiBjeT0iMzUiIHI9IjciLz48L3N2Zz4KCg==";
export function ImageWithFallback(props: React.ImgHTMLAttributes<HTMLImageElement>) {
const [didError, setDidError] = useState(false);
const { src, alt, style, className, ...rest } = props;
return didError ? (
<div
className={`inline-block bg-gray-100 text-center align-middle ${className ?? ""}`}
style={style}
>
<div className="flex items-center justify-center w-full h-full">
<img src={ERROR_IMG_SRC} alt="Error loading image" {...rest} data-original-url={src} />
</div>
</div>
) : (
<img
src={src}
alt={alt}
className={className}
style={style}
{...rest}
onError={() => setDidError(true)}
/>
);
}