Skip to content

Commit 4ab1926

Browse files
committed
trials of banshee + images scroll
1 parent c7c907d commit 4ab1926

File tree

12 files changed

+83
-16
lines changed

12 files changed

+83
-16
lines changed
1.62 MB
Loading
842 KB
Loading
1.03 MB
Loading
250 KB
Loading
1.57 MB
Loading
381 KB
Loading
427 KB
Loading
725 KB
Loading

src/components/App.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export default function App() {
1919
<>
2020
<header className="flex items-center w-full h-14 px-4 border-b border-b-prim/5">
2121
<div className="container mx-auto flex flex-row items-center gap-3 md:gap-12">
22-
<Link to="/" className="flex flex-col text-sm md:text-xl font-bold">
22+
<Link to="/" className="flex flex-col text-xs md:text-xl font-bold">
2323
Léo Riera
2424
<span className="text-xs font-normal text-prim/60">Developer/</span>
2525
</Link>

src/components/ImageViewer.tsx

Lines changed: 46 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,31 +10,63 @@ export default function ImageViewer() {
1010
const [images, setImages] = useState<string[]>([]);
1111
const [index, setIndex] = useState<number>(0);
1212

13-
function updateImages(event: CustomEventInit<ImageEvent>) {
14-
const { images, index } = event.detail as ImageEvent;
15-
setImages(images);
16-
setIndex(index);
17-
setVisible(true);
18-
console.log(event);
19-
}
20-
2113
useEffect(() => {
14+
function updateImages(event: CustomEventInit<ImageEvent>) {
15+
const { images, index } = event.detail as ImageEvent;
16+
setImages(images);
17+
setIndex(index);
18+
setVisible(true);
19+
}
20+
21+
function keyPressed(event: KeyboardEvent) {
22+
if (event.key === "Escape") {
23+
setVisible(false);
24+
}
25+
}
26+
2227
window.addEventListener("image-viewer", updateImages);
28+
window.addEventListener("keyup", keyPressed);
2329
return () => {
2430
window.removeEventListener("image-viewer", updateImages);
31+
window.removeEventListener("keyup", keyPressed);
2532
};
2633
}, []);
2734

35+
useEffect(() => {
36+
document.body.style.overflow = visible ? "hidden" : "";
37+
}, [visible]);
38+
39+
useEffect(() => {
40+
const target = document.querySelector(`[data-image-index="${index}"]`);
41+
if (target) {
42+
target.scrollIntoView({
43+
behavior: "smooth",
44+
block: "nearest",
45+
inline: "center",
46+
});
47+
}
48+
}, [index, images]);
49+
2850
return (
2951
<div
30-
className={`${visible ? "fixed" : "hidden"} top-0 left-0 w-full h-full flex justify-center items-center bg-black/50 backdrop-blur`}
52+
className={`${visible ? "fixed" : "hidden"} top-0 left-0 w-full h-full bg-black/50 backdrop-blur`}
3153
onClick={() => setVisible(false)}
3254
>
33-
<img
34-
src={images[index]}
35-
alt={`Big image ${index + 1}`}
36-
className="max-h-3/5 max-w-3/5 shadow-xl rounded"
37-
/>
55+
<div className="relative w-full h-full flex items-center gap-20 snap-x snap-mandatory overflow-x-auto px-2 md:px-10 lg:px-20">
56+
{images.map((image, i) => (
57+
<div
58+
key={i}
59+
className="w-full h-full md:h-4/5 md:w-4/5 shrink-0 snap-center"
60+
data-image-index={i}
61+
>
62+
<img
63+
src={image}
64+
alt={`Big image ${i}`}
65+
className="w-full h-full object-contain shrink-0 shadow-xl rounded"
66+
/>
67+
</div>
68+
))}
69+
</div>
3870
</div>
3971
);
4072
}

0 commit comments

Comments
 (0)