parent
439e27c603
commit
6bace7d311
|
@ -8,7 +8,7 @@
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
z-index: 10000;
|
z-index: 99999;
|
||||||
animation: 300ms fadeIn;
|
animation: 300ms fadeIn;
|
||||||
animation-fill-mode: forwards;
|
animation-fill-mode: forwards;
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,12 @@ export const Lightbox = (props: Props) => {
|
||||||
current: null,
|
current: null,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handleSmoothAction = (action: () => void) => {
|
||||||
|
setTransitionEnabled(true)
|
||||||
|
action()
|
||||||
|
setTimeout(() => setTransitionEnabled(false), TRANSITION_SPEED)
|
||||||
|
}
|
||||||
|
|
||||||
const closeLightbox = () => {
|
const closeLightbox = () => {
|
||||||
lightboxRef.current?.classList.add(styles.fadeOut)
|
lightboxRef.current?.classList.add(styles.fadeOut)
|
||||||
|
|
||||||
|
@ -40,34 +46,48 @@ export const Lightbox = (props: Props) => {
|
||||||
|
|
||||||
const zoomIn = (event) => {
|
const zoomIn = (event) => {
|
||||||
event.stopPropagation()
|
event.stopPropagation()
|
||||||
setTransitionEnabled(true)
|
|
||||||
setZoomLevel(zoomLevel() * ZOOM_STEP)
|
handleSmoothAction(() => {
|
||||||
setTimeout(() => setTransitionEnabled(false), TRANSITION_SPEED)
|
setZoomLevel(zoomLevel() * ZOOM_STEP)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const zoomOut = (event) => {
|
const zoomOut = (event) => {
|
||||||
event.stopPropagation()
|
event.stopPropagation()
|
||||||
setTransitionEnabled(true)
|
|
||||||
setZoomLevel(zoomLevel() / ZOOM_STEP)
|
handleSmoothAction(() => {
|
||||||
setTimeout(() => setTransitionEnabled(false), TRANSITION_SPEED)
|
setZoomLevel(zoomLevel() / ZOOM_STEP)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const positionReset = () => {
|
||||||
|
setTranslateX(0)
|
||||||
|
setTranslateY(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
const zoomReset = (event) => {
|
const zoomReset = (event) => {
|
||||||
event.stopPropagation()
|
event.stopPropagation()
|
||||||
setZoomLevel(1)
|
|
||||||
|
handleSmoothAction(() => {
|
||||||
|
setZoomLevel(1)
|
||||||
|
positionReset()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleWheelZoom = (event) => {
|
const handleMouseWheelZoom = (event) => {
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
|
event.stopPropagation()
|
||||||
|
|
||||||
|
const isTrackpad = event.ctrlKey
|
||||||
|
if (isTrackpad) return
|
||||||
|
|
||||||
let scale = zoomLevel()
|
let scale = zoomLevel()
|
||||||
|
|
||||||
scale += event.deltaY * -0.01
|
scale += event.deltaY * -0.01
|
||||||
|
|
||||||
scale = Math.min(Math.max(0.125, scale), 4)
|
scale = Math.min(Math.max(0.125, scale), 4)
|
||||||
|
|
||||||
setTransitionEnabled(true)
|
handleSmoothAction(() => {
|
||||||
setZoomLevel(scale * ZOOM_STEP)
|
setZoomLevel(scale * ZOOM_STEP)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
useEscKeyDownHandler(closeLightbox)
|
useEscKeyDownHandler(closeLightbox)
|
||||||
|
@ -130,6 +150,7 @@ export const Lightbox = (props: Props) => {
|
||||||
<div
|
<div
|
||||||
class={clsx(styles.Lightbox, props.class)}
|
class={clsx(styles.Lightbox, props.class)}
|
||||||
onClick={closeLightbox}
|
onClick={closeLightbox}
|
||||||
|
onWheel={(e) => e.preventDefault()}
|
||||||
ref={(el) => (lightboxRef.current = el)}
|
ref={(el) => (lightboxRef.current = el)}
|
||||||
>
|
>
|
||||||
<Show when={pictureScalePercentage()}>
|
<Show when={pictureScalePercentage()}>
|
||||||
|
@ -154,7 +175,7 @@ export const Lightbox = (props: Props) => {
|
||||||
src={getImageUrl(props.image, { noSizeUrlPart: true })}
|
src={getImageUrl(props.image, { noSizeUrlPart: true })}
|
||||||
alt={props.imageAlt || ''}
|
alt={props.imageAlt || ''}
|
||||||
onClick={(event) => event.stopPropagation()}
|
onClick={(event) => event.stopPropagation()}
|
||||||
onWheel={handleWheelZoom}
|
onWheel={handleMouseWheelZoom}
|
||||||
style={lightboxStyle()}
|
style={lightboxStyle()}
|
||||||
onMouseDown={onMouseDown}
|
onMouseDown={onMouseDown}
|
||||||
/>
|
/>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user