(() => { const tbody = document.getElementById("sitesBody"); const lastUpdatedEl = document.getElementById("lastUpdated"); const formatTimestamp = () => { const formatter = new Intl.DateTimeFormat("en", { dateStyle: "medium", timeStyle: "short", }); lastUpdatedEl.textContent = formatter.format(new Date()); }; const renderRows = () => { if (!Array.isArray(window.sitesDirectory) || !window.sitesDirectory.length) { tbody.innerHTML = ` No entries yet. Update assets/js/data.js to get started. `; return; } const rows = window.sitesDirectory .map((site) => { const { label = "Site", url = "#", ipv4 = [], ipv6 = [], remarks = "", } = site; const ipv4Badges = ipv4 .map((ip) => `${ip}`) .join(""); const ipv6Badges = ipv6 .map((ip) => `${ip}`) .join(""); const ipMarkup = ipv4.length || ipv6.length ? `
${ipv4Badges}${ipv6Badges}
` : ``; return ` ${label}
${url.replace(/^https?:\/\//, "")}
${ipMarkup} ${remarks} `; }) .join(""); tbody.innerHTML = rows; }; const initPhotoSizeControls = () => { const card = document.querySelector(".visual-card"); if (!card) return; const buttons = card.querySelectorAll("[data-photo-size-option]"); if (!buttons.length) return; const setSize = (size) => { card.setAttribute("data-photo-size", size); buttons.forEach((btn) => { btn.classList.toggle("is-active", btn.dataset.photoSizeOption === size); }); }; const initial = card.getAttribute("data-photo-size") || "standard"; setSize(initial); buttons.forEach((button) => { button.addEventListener("click", () => { const size = button.dataset.photoSizeOption; setSize(size); }); }); }; formatTimestamp(); renderRows(); initPhotoSizeControls(); })();