import navaid from "navaid"; import { page } from "./page.svelte"; import { navigation } from "./navigation.svelte"; import { site } from "./site.svelte"; import { locale } from "./locale.svelte"; export const router = navaid("/", () => { // Default handler }); async function loadPage(path) { navigation.setLoading(true); page.setLoading(true); try { const response = await fetch(`${path}.json`); if (!response.ok) { throw new Error(`Failed to load page: ${response.status}`); } const data = await response.json(); if (data.site) { site.set(data.site); locale.initialize(data.site.language, data.site.languages); } page.set({ data, template: data.template || "default", url: path, loading: false, error: null, }); window.scrollTo(0, 0); } catch (error) { console.error("Failed to load page:", error); page.setError(error); } finally { navigation.setLoading(false); } } // Route handlers router .on("/", () => loadPage("/home")) .on("/expertise", () => loadPage("/expertise")) .on("/portfolio", () => loadPage("/portfolio")) .on("/portfolio/:slug", ({ slug }) => loadPage(`/portfolio/${slug}`)) .on("/jouer", () => loadPage("/jouer")) .on("/jouer/:slug", ({ slug }) => loadPage(`/jouer/${slug}`)) .on("/a-propos", () => loadPage("/a-propos")) .on("/blog", () => loadPage("/blog")) .on("/blog/:slug", ({ slug }) => loadPage(`/blog/${slug}`)) .on("*", (params) => { // Fallback for other routes loadPage(window.location.pathname); }); export function initRouter() { // Start listening to route changes router.listen(); // Intercept internal link clicks document.addEventListener("click", (e) => { const link = e.target.closest("a"); if (!link) return; const url = new URL(link.href, window.location.origin); // Only intercept same-origin links without target attribute if ( url.origin === window.location.origin && !link.target && !link.hasAttribute("download") ) { e.preventDefault(); navigateTo(url.pathname); } }); // Handle browser back/forward window.addEventListener("popstate", () => { router.run(window.location.pathname); }); } export function navigateTo(path) { window.history.pushState({}, "", path); loadPage(path); }