(function () { window.initAlbum = function () { var old = document.getElementById('lightbox') if (old) old.remove() var grid = document.getElementById('album-grid') if (!grid) return var items = Array.from(grid.children) if (!items.length) return var lb = document.createElement('div') lb.id = 'lightbox' lb.innerHTML = '' + '' + '' + '' document.body.appendChild(lb) var lbImg = lb.querySelector('img') var current = -1 function open(idx) { current = idx var img = items[current].querySelector('img') lbImg.removeAttribute('src') lbImg.alt = '' lb.classList.add('open') lbImg.src = img.src lbImg.alt = img.alt } function close() { lb.classList.remove('open') current = -1 } function prev() { if (current < 0) return open((current - 1 + items.length) % items.length) } function next() { if (current < 0) return open((current + 1) % items.length) } items.forEach(function (item, i) { item.addEventListener('click', function () { open(i) }) }) lb.querySelector('#lb-close').addEventListener('click', close) lb.querySelector('#lb-prev').addEventListener('click', function (e) { e.stopPropagation() prev() }) lb.querySelector('#lb-next').addEventListener('click', function (e) { e.stopPropagation() next() }) document.addEventListener('keydown', function (e) { if (!lb.classList.contains('open')) return if (e.key === 'Escape') { close(); e.preventDefault() } if (e.key === 'ArrowLeft') { prev(); e.preventDefault() } if (e.key === 'ArrowRight') { next(); e.preventDefault() } }) lb.addEventListener('click', function (e) { if (e.target === lb) close() }) var touchStartX = 0 var touchStartY = 0 lb.addEventListener('touchstart', function (e) { touchStartX = e.changedTouches[0].screenX touchStartY = e.changedTouches[0].screenY }, { passive: true }) lb.addEventListener('touchend', function (e) { var dx = e.changedTouches[0].screenX - touchStartX var dy = e.changedTouches[0].screenY - touchStartY if (Math.abs(dx) > Math.abs(dy) && Math.abs(dx) > 50) { if (dx < 0) next() else prev() } }, { passive: true }) } window.initAlbum() document.addEventListener('htmx:afterSwap', window.initAlbum) })()