'use client'; import { useState } from 'react'; import { ChevronLeftIcon, ImagesIcon, XIcon } from 'lucide-react'; import { AnimatePresence, motion } from 'motion/react'; import { type GeneratedImage, useGeneratedImages } from '@/hooks/useGeneratedImages'; import { cn } from '@/lib/shadcn/utils'; const MotionPanel = motion.create('div'); const MotionOverlay = motion.create('div'); interface ThumbnailProps { image: GeneratedImage; onClick: () => void; } function Thumbnail({ image, onClick }: ThumbnailProps) { return ( ); } interface FullImageViewProps { image: GeneratedImage; onBack: () => void; } function FullImageView({ image, onBack }: FullImageViewProps) { return ( {/* eslint-disable-next-line @next/next/no-img-element */} {image.prompt} {image.prompt &&

{image.prompt}

}
); } /** * Floating gallery button + slide-in panel for all agent-generated images. * The button appears once at least one image has been generated. */ export function ImageGallery() { const images = useGeneratedImages(); const [open, setOpen] = useState(false); const [selected, setSelected] = useState(null); if (images.length === 0) return null; return ( <> {/* Floating trigger button */} {!open && ( )} {/* Gallery panel + backdrop */} {open && ( <> { setSelected(null); setOpen(false); }} /> {/* Header */}

Generated images

{images.length} {images.length === 1 ? 'image' : 'images'}

{/* Content */}
{selected ? ( setSelected(null)} /> ) : ( {[...images].reverse().map((img) => ( setSelected(img)} /> ))} )}
)}
); }