import { useState } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { Loader2 } from 'lucide-react'; interface ForensicLensProps { originalUrl: string | null; fftUrl?: string | null; heatmapUrl?: string | null; elaUrl?: string | null; isLoading: boolean; } const TABS = [ { id: 'original', label: 'Original', color: '#00E5CC' }, { id: 'fft', label: 'FFT Spectrum', color: '#00E5CC' }, { id: 'heatmap', label: 'Noise Map', color: '#f97316' }, { id: 'ela', label: 'ELA', color: '#eab308' }, ]; const TAB_DESCRIPTIONS: Record = { original: 'Raw input capture', fft: '1/f² power — deviations indicate AI generator upsampling artifacts', heatmap: 'Pixel-residual map — camera sensor fingerprint analysis', ela: 'Error Level Analysis — compression uniformity (flat = AI)', }; export default function ForensicLens({ originalUrl, fftUrl, heatmapUrl, elaUrl, isLoading }: ForensicLensProps) { const [activeTab, setActiveTab] = useState('original'); const imageFor = (tab: string) => { if (tab === 'original') return originalUrl; if (tab === 'fft') return fftUrl; if (tab === 'heatmap') return heatmapUrl; if (tab === 'ela') return elaUrl; return null; }; const activeTabCfg = TABS.find(t => t.id === activeTab)!; const currentImage = imageFor(activeTab); return (
{/* Tab bar */}
{TABS.map(tab => ( ))}
{/* Description bar */}
ANALYSIS: {TAB_DESCRIPTIONS[activeTab]}
{/* Image area */}
{isLoading ? (

PROCESSING IMAGE SIGNAL...

) : ( {currentImage ? ( ) : (
📡

{activeTab === 'original' ? 'Upload an image to begin' : 'Signal data unavailable'}

)}
)}
); }