(function () { var grid = document.getElementById("portfolio-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 }, ); })();