import { useState } from "react"; interface SideBySideComparisonProps { beforeSrc: string; afterSrc: string; beforeSize?: number; afterSize?: number; } function formatSize(bytes: number): string { if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; return `${(bytes / (1024 * 1024)).toFixed(2)} MB`; } export function SideBySideComparison({ beforeSrc, afterSrc, beforeSize, afterSize, }: SideBySideComparisonProps) { const [beforeDims, setBeforeDims] = useState<{ w: number; h: number } | null>(null); const [afterDims, setAfterDims] = useState<{ w: number; h: number } | null>(null); const savingsPercent = beforeSize && afterSize && beforeSize > 0 ? ((1 - afterSize / beforeSize) * 100).toFixed(1) : null; return (
{/* Side-by-side images */}
{/* Original */}
Original
Original { const img = e.currentTarget; setBeforeDims({ w: img.naturalWidth, h: img.naturalHeight }); }} />
{beforeDims && (

{beforeDims.w} × {beforeDims.h}

)} {beforeSize != null &&

{formatSize(beforeSize)}

}
{/* Processed */}
Processed
Processed { const img = e.currentTarget; setAfterDims({ w: img.naturalWidth, h: img.naturalHeight }); }} />
{afterDims && (

{afterDims.w} × {afterDims.h}

)} {afterSize != null &&

{formatSize(afterSize)}

}
{/* Size savings */} {savingsPercent !== null && (

0 ? "text-green-600 dark:text-green-400" : "text-red-500"}`} > {Number(savingsPercent) > 0 ? `${savingsPercent}% smaller` : `${Math.abs(Number(savingsPercent))}% larger`}

)}
); }