"use strict"; /** * Hash-router voor de single-page shell. Houdt semantische, leesbare paden aan * (bijv. #/producten/hdmi-naar-tuinslang) en werkt zonder serverconfiguratie, * ook bij direct openen van het bestand. */ (function () { const CL = (window.CL = window.CL || {}); const pages = CL.pages; const headerEl = document.getElementById("site-header"); const appEl = document.getElementById("app"); const footerEl = document.getElementById("site-footer"); // Statische routes -> view-functies. const routes = { "/": pages.home, "/producten": pages.producten, "/catalogus": pages.catalogus, "/specificaties": pages.specificaties, "/aanbiedingen": pages.aanbiedingen, "/bedrijf": pages.bedrijf, "/over-ons": pages.overOns, "/contact": pages.contact, "/vacatures": pages.vacatures, "/voorwaarden": pages.voorwaarden, "/privacy": pages.privacy, "/disclaimer": pages.disclaimer, }; function parsePath() { const raw = location.hash.replace(/^#/, ""); const path = raw.split("?")[0] || "/"; return path === "" ? "/" : path; } // Bepaalt welke view bij een pad hoort (incl. dynamische productroute). function resolve(path) { if (routes[path]) return routes[path](); const productMatch = path.match(/^\/producten\/([^/]+)$/); if (productMatch) return pages.productDetail(decodeURIComponent(productMatch[1])); return pages.notFound(); } // Het pad dat de header gebruikt voor de actieve-link-markering. function navPathFor(path) { if (/^\/producten\/[^/]+$/.test(path)) return "/producten"; return path; } function render() { const path = parsePath(); const view = resolve(path); headerEl.innerHTML = CL.components.header(navPathFor(path)); appEl.innerHTML = view.html; document.title = view.title; CL.ui.bindHeader(); CL.ui.updateCartCount(); if (typeof view.onMount === "function") view.onMount(); window.scrollTo({ top: 0, behavior: "auto" }); } function boot() { footerEl.innerHTML = CL.components.footer(); CL.ui.init(); // Mandje-wijzigingen werken de teller en de lade overal bij. CL.store.subscribe(() => { CL.ui.updateCartCount(); CL.ui.renderCart(); }); window.addEventListener("hashchange", render); if (!location.hash) location.replace("#/"); render(); CL.ui.renderCart(); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", boot); } else { boot(); } })();