From 0c0ee849a630f125a8f08c10ee71dfdbc6b7c7ce Mon Sep 17 00:00:00 2001 From: schererleander Date: Fri, 27 Jun 2025 00:42:58 +0200 Subject: chore --- src/components/Gallery.tsx | 100 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 src/components/Gallery.tsx (limited to 'src/components/Gallery.tsx') diff --git a/src/components/Gallery.tsx b/src/components/Gallery.tsx new file mode 100644 index 0000000..ffcf0e1 --- /dev/null +++ b/src/components/Gallery.tsx @@ -0,0 +1,100 @@ +import React, { useState, useEffect } from 'react'; + +interface ImageItems { + images: Array<{ + src: string; + alt?: string; + id?: string | number; + }>; +} + +export default function Gallery({ images }: ImageItems) { + const [selectedIndex, setSelectedIndex] = useState(null); + const closeModal = () => setSelectedIndex(null); + const prev = (e?: React.MouseEvent) => { + e?.stopPropagation(); + setSelectedIndex((i) => (i !== null && i > 0 ? i - 1 : i)); + }; + const next = (e?: React.MouseEvent) => { + e?.stopPropagation(); + setSelectedIndex((i) => (i !== null && i < images.length - 1 ? i + 1 : i)); + }; + + useEffect(() => { + function handleKeyDown(event: KeyboardEvent) { + if (selectedIndex === null) return; + if (event.key === 'ArrowLeft') { + prev(); + } else if (event.key === 'ArrowRight') { + next(); + } + } + + window.addEventListener('keydown', handleKeyDown); + return () => window.removeEventListener('keydown', handleKeyDown); + }, [selectedIndex, images.length]); + + return ( + <> +
+ {images.map((image, idx) => ( + + ))} +
+ + {/* Overlay */} + {selectedIndex !== null && ( +
+ {/* Prev arrow */} + + + {images[selectedIndex].alt + + {/* Next arrow */} + + +
+ )} + + ); +} -- cgit v1.3.1