diff --git a/src/app/components/carousel.tsx b/src/app/components/carousel.tsx index 192c32b..51d30d8 100644 --- a/src/app/components/carousel.tsx +++ b/src/app/components/carousel.tsx @@ -15,6 +15,7 @@ export default function Carousel({ images, className }: Props) { const [emblaRef, emblaApi] = useEmblaCarousel(); const [selectedIndex, setSelectedIndex] = useState(0); const [scrollSnaps, setScrollSnaps] = useState([]); + const [isFocused, setIsFocused] = useState(false); useEffect(() => { if (!emblaApi) return; @@ -22,8 +23,31 @@ export default function Carousel({ images, className }: Props) { emblaApi.on("select", () => setSelectedIndex(emblaApi.selectedScrollSnap())); }, [emblaApi]); + // Handle keyboard events + useEffect(() => { + if (!isFocused || !emblaApi) return; + + const handleKeyDown = (event: KeyboardEvent) => { + switch (event.key) { + case "ArrowLeft": + emblaApi.scrollPrev(); + break; + case "ArrowRight": + emblaApi.scrollNext(); + break; + default: + break; + } + }; + + window.addEventListener("keydown", handleKeyDown); + return () => { + window.removeEventListener("keydown", handleKeyDown); + }; + }, [isFocused, emblaApi]); + return ( -
+
setIsFocused(true)} onMouseLeave={() => setIsFocused(false)}>
{images.map((src, index) => ( diff --git a/src/app/components/image-viewer.tsx b/src/app/components/image-viewer.tsx index c53e704..80e6932 100644 --- a/src/app/components/image-viewer.tsx +++ b/src/app/components/image-viewer.tsx @@ -53,6 +53,32 @@ export default function ImageViewer({ src, alt, width, height, className, images emblaApi.on("select", () => setSelectedIndex(emblaApi.selectedScrollSnap())); }, [emblaApi, images, src]); + // Handle keyboard events + useEffect(() => { + if (!isOpen || !emblaApi) return; + + const handleKeyDown = (event: KeyboardEvent) => { + switch (event.key) { + case "ArrowLeft": + emblaApi.scrollPrev(); + break; + case "ArrowRight": + emblaApi.scrollNext(); + break; + case "Escape": + close(); + break; + default: + break; + } + }; + + window.addEventListener("keydown", handleKeyDown); + return () => { + window.removeEventListener("keydown", handleKeyDown); + }; + }, [isOpen, emblaApi]); + return ( <> {alt} setIsOpen(true)} />