, "layout" | "layoutDependency" | "width" | "height"> {
alt: string;
/** Intrinsic width in pixels, used to reserve the image's cover crop. */
width: number;
/** Intrinsic height in pixels. Keep these dimensions accurate for the source. */
height: number;
}
export function AspectRatioImage({
width,
height,
className,
style,
draggable = false,
...props
}: AspectRatioImageProps) {
const context = useContext(AspectRatioContext);
if (!context) throw new Error("AspectRatioImage must be inside AspectRatio.");
if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {
throw new RangeError("AspectRatioImage: width and height must be finite, positive numbers.");
}
const fillWidth = context.ratio >= width / height;
return (
{/* The image box keeps its intrinsic ratio at both endpoints. Its layout
projection therefore scales uniformly while the frame reshapes. */}
{/* biome-ignore lint/performance/noImgElement: Copy-paste registry components work outside Next.js. */}
);
}