148 lines
4.7 KiB
JavaScript
148 lines
4.7 KiB
JavaScript
function activateSelfDeactivateSibs(button) {
|
|
if (button.classList.contains("active")) return;
|
|
|
|
Array.from(button.parentNode.children).forEach(s => {
|
|
if (s === button){
|
|
button.classList.add('active');
|
|
} else {
|
|
s.classList.remove('active');
|
|
}
|
|
const targetId = s.dataset.targetId;
|
|
const target = document.getElementById(targetId);
|
|
|
|
if (!target) return;
|
|
|
|
if (s.classList.contains('active')) {
|
|
target.classList.add('active');
|
|
target.dispatchEvent(new CustomEvent("tab-activated", {bubbles: false}))
|
|
} else {
|
|
target.classList.remove('active');
|
|
}
|
|
});
|
|
}
|
|
|
|
function openLightbox(post, idx) {
|
|
lightboxCurrentPost = post;
|
|
lightboxCurrentIdx = idx;
|
|
lightboxObj.img.src = lightboxImages.get(post)[idx].src;
|
|
lightboxObj.openOriginalAnchor.href = lightboxImages.get(post)[idx].src
|
|
lightboxObj.prevButton.disabled = lightboxImages.get(post).length === 1
|
|
lightboxObj.nextButton.disabled = lightboxImages.get(post).length === 1
|
|
lightboxObj.imageCount.textContent = `Image ${idx + 1} of ${lightboxImages.get(post).length}`
|
|
|
|
if (!lightboxObj.dialog.open) {
|
|
lightboxObj.dialog.showModal();
|
|
}
|
|
}
|
|
|
|
const modulo = (n, m) => ((n % m) + m) % m
|
|
|
|
function lightboxNext() {
|
|
const l = lightboxImages.get(lightboxCurrentPost).length;
|
|
const target = modulo(lightboxCurrentIdx + 1, l);
|
|
openLightbox(lightboxCurrentPost, target);
|
|
}
|
|
|
|
function lightboxPrev() {
|
|
const l = lightboxImages.get(lightboxCurrentPost).length;
|
|
const target = modulo(lightboxCurrentIdx - 1, l);
|
|
openLightbox(lightboxCurrentPost, target);
|
|
}
|
|
|
|
function constructLightbox() {
|
|
const dialog = document.createElement("dialog");
|
|
dialog.classList.add("lightbox-dialog");
|
|
dialog.addEventListener("click", (e) => {
|
|
if (e.target === dialog) {
|
|
dialog.close();
|
|
}
|
|
})
|
|
const dialogInner = document.createElement("div");
|
|
dialogInner.classList.add("lightbox-inner");
|
|
dialog.appendChild(dialogInner);
|
|
const img = document.createElement("img");
|
|
img.classList.add("lightbox-image")
|
|
dialogInner.appendChild(img);
|
|
const openOriginalAnchor = document.createElement("a")
|
|
openOriginalAnchor.text = "Open original in new window"
|
|
openOriginalAnchor.target = "_blank"
|
|
openOriginalAnchor.rel = "noopener noreferrer nofollow"
|
|
dialogInner.appendChild(openOriginalAnchor);
|
|
|
|
const navSpan = document.createElement("span");
|
|
navSpan.classList.add("lightbox-nav");
|
|
const prevButton = document.createElement("button");
|
|
prevButton.type = "button";
|
|
prevButton.textContent = "Previous";
|
|
prevButton.addEventListener("click", lightboxPrev);
|
|
const nextButton = document.createElement("button");
|
|
nextButton.type = "button";
|
|
nextButton.textContent = "Next";
|
|
nextButton.addEventListener("click", lightboxNext);
|
|
const imageCount = document.createElement("span");
|
|
imageCount.textContent = "Image of ";
|
|
navSpan.appendChild(prevButton);
|
|
navSpan.appendChild(imageCount);
|
|
navSpan.appendChild(nextButton);
|
|
|
|
dialogInner.appendChild(navSpan);
|
|
return {
|
|
img: img,
|
|
dialog: dialog,
|
|
openOriginalAnchor: openOriginalAnchor,
|
|
prevButton: prevButton,
|
|
nextButton: nextButton,
|
|
imageCount: imageCount,
|
|
}
|
|
}
|
|
|
|
let lightboxImages = new Map(); //.post-inner : Array<Object>
|
|
let lightboxObj = null;
|
|
let lightboxCurrentPost = null;
|
|
let lightboxCurrentIdx = -1;
|
|
|
|
document.addEventListener("DOMContentLoaded", () => {
|
|
// tabs
|
|
document.querySelectorAll(".tab-button").forEach(button => {
|
|
button.addEventListener("click", () => {
|
|
activateSelfDeactivateSibs(button);
|
|
});
|
|
});
|
|
|
|
// accordions
|
|
const accordions = document.querySelectorAll(".accordion");
|
|
accordions.forEach(accordion => {
|
|
const header = accordion.querySelector(".accordion-header");
|
|
const toggleButton = header.querySelector(".accordion-toggle");
|
|
const content = accordion.querySelector(".accordion-content");
|
|
|
|
const toggle = (e) => {
|
|
e.stopPropagation();
|
|
accordion.classList.toggle("hidden");
|
|
content.classList.toggle("hidden");
|
|
toggleButton.textContent = content.classList.contains("hidden") ? "►" : "▼"
|
|
}
|
|
|
|
toggleButton.addEventListener("click", toggle);
|
|
});
|
|
|
|
//lightboxes
|
|
lightboxObj = constructLightbox();
|
|
document.body.appendChild(lightboxObj.dialog);
|
|
const postImages = document.querySelectorAll(".post-inner img.block-img");
|
|
postImages.forEach(postImage => {
|
|
const belongingTo = postImage.closest(".post-inner");
|
|
const images = lightboxImages.get(belongingTo) ?? [];
|
|
images.push({
|
|
src: postImage.src,
|
|
alt: postImage.alt,
|
|
});
|
|
const idx = images.length - 1;
|
|
lightboxImages.set(belongingTo, images);
|
|
postImage.style.cursor = "pointer";
|
|
postImage.addEventListener("click", () => {
|
|
openLightbox(belongingTo, idx);
|
|
});
|
|
});
|
|
});
|