768 && scale > 1 && startDrag($event)"
@mousemove="window.innerWidth > 768 && scale > 1 && onDrag($event)"
@mouseup="endDrag()"
@mouseleave="endDrag()"
@touchstart="window.innerWidth > 768 && scale > 1 && startDrag($event.touches[0])"
@touchmove="window.innerWidth > 768 && scale > 1 && onDrag($event.touches[0])"
@touchend="endDrag()"
x-show="fullscreenSrc"
class="fixed inset-0 z-50 flex items-center justify-center bg-black"
style="touch-action: none;"
@keydown.escape.window="closeFullscreen()"
x-data
x-init="
let startY = 0;
let lastOffset = 0;
// wheel support
$el.addEventListener('wheel', e => {
e.preventDefault();
e.deltaY > 0 ? nextImage() : prevImage();
}, { passive: false });
// touch start
$el.addEventListener('touchstart', e => {
startY = e.touches[0].clientY;
lastOffset = 0;
});
// touch move → change image relative to drag distance
$el.addEventListener('touchmove', e => {
const currentY = e.touches[0].clientY;
const diff = currentY - startY;
// how many pixels equal one image step
const threshold = $el.clientHeight / totalImages;
// offset in frames
const offset = Math.round(diff / threshold);
if (offset !== lastOffset) {
let newIndex = currentImage - offset;
// clamp to valid range
if (newIndex < 0) newIndex = 0;
if (newIndex > totalImages - 1) newIndex = totalImages - 1;
changeImage(newIndex);
lastOffset = offset;
}
});
// touch end / cancel → reset
const resetDrag = () => {
startY = 0;
lastOffset = 0;
};
$el.addEventListener('touchend', resetDrag);
$el.addEventListener('touchcancel', resetDrag);
">