1
1
"use client"
2
2
3
3
import { useRef , useState } from "react"
4
- import { motion , useMotionTemplate , useSpring } from "motion/react"
5
4
import { clsx } from "clsx"
6
5
import Image from "next-image-export-optimizer"
7
6
import type { StaticImageData } from "next/image"
8
7
9
8
import { Marquee } from "@/app/conf/_design-system/marquee"
10
- import ZoomInIcon from "../../pixelarticons/zoom-in.svg?svgr"
11
- import ZoomOutIcon from "../../pixelarticons/zoom-out.svg?svgr"
12
9
13
10
import { imagesByYear } from "./images"
14
11
@@ -20,8 +17,6 @@ export interface GalleryStripProps extends React.HTMLAttributes<HTMLElement> {}
20
17
export function GalleryStrip ( { className, ...rest } : GalleryStripProps ) {
21
18
const [ selectedYear , setSelectedYear ] = useState < Year > ( "2024" )
22
19
23
- const previousZoomedImage = useRef < HTMLElement | null > ( null )
24
-
25
20
return (
26
21
< section
27
22
role = "presentation"
@@ -52,73 +47,22 @@ export function GalleryStrip({ className, ...rest }: GalleryStripProps) {
52
47
speedOnHover = { 15 }
53
48
drag
54
49
reverse
55
- className = "!overflow-visible"
50
+ className = "cursor-[var(--cursor-grabbing,grab)] !overflow-visible"
56
51
>
57
52
{ imagesByYear [ selectedYear ] . map ( ( image , i ) => {
58
53
const key = `${ selectedYear } -${ i } `
59
54
60
- return (
61
- < GalleryStripImage
62
- key = { key }
63
- image = { image }
64
- previousZoomedImage = { previousZoomedImage }
65
- />
66
- )
55
+ return < GalleryStripImage key = { key } image = { image } />
67
56
} ) }
68
57
</ Marquee >
69
58
</ div >
70
59
</ section >
71
60
)
72
61
}
73
62
74
- function GalleryStripImage ( {
75
- image,
76
- previousZoomedImage,
77
- } : {
78
- image : StaticImageData
79
- previousZoomedImage : React . MutableRefObject < HTMLElement | null >
80
- } ) {
81
- const [ isZoomed , setIsZoomed ] = useState ( false )
82
- const scale = useSpring ( 1 )
83
- const transform = useMotionTemplate `translate3d(0,0,var(--translate-z,-16px)) scale(${ scale } )`
84
-
85
- // if we set scale in useEffect the UI glitches
86
- const zoomIn = ( current : HTMLElement | null ) => {
87
- if ( previousZoomedImage . current ) {
88
- previousZoomedImage . current . style . zIndex = "0"
89
- previousZoomedImage . current . style . setProperty ( "--translate-z" , "0px" )
90
- }
91
-
92
- if ( current ) {
93
- current . style . zIndex = "2"
94
- current . style . setProperty ( "--translate-z" , "16px" )
95
- }
96
-
97
- previousZoomedImage . current = current
98
-
99
- scale . set ( 1.665625 )
100
- setIsZoomed ( true )
101
- }
102
-
103
- const zoomOut = ( ) => {
104
- scale . set ( 1 )
105
- setIsZoomed ( false )
106
- }
107
-
63
+ function GalleryStripImage ( { image } : { image : StaticImageData } ) {
108
64
return (
109
- < motion . div
110
- role = "presentation"
111
- className = "relative md:px-2"
112
- style = { { transform } }
113
- onPointerOut = { event => {
114
- const target = event . currentTarget
115
- const relatedTarget = event . relatedTarget as Node | null
116
-
117
- if ( ! relatedTarget || ! target . contains ( relatedTarget ) ) {
118
- zoomOut ( )
119
- }
120
- } }
121
- >
65
+ < div role = "presentation" className = "relative md:px-2" >
122
66
< Image
123
67
src = { image }
124
68
alt = ""
@@ -127,19 +71,6 @@ function GalleryStripImage({
127
71
height = { 533 }
128
72
className = "pointer-events-none aspect-[799/533] h-[320px] w-auto object-cover"
129
73
/>
130
- < button
131
- type = "button"
132
- className = "absolute right-2 top-0 z-[1] bg-neu-50/10 p-4"
133
- onClick = { event => {
134
- isZoomed ? zoomOut ( ) : zoomIn ( event . currentTarget . parentElement )
135
- } }
136
- >
137
- { isZoomed ? (
138
- < ZoomOutIcon className = "size-12" />
139
- ) : (
140
- < ZoomInIcon className = "size-12" />
141
- ) }
142
- </ button >
143
- </ motion . div >
74
+ </ div >
144
75
)
145
76
}
0 commit comments