2026-02-19 12:38:07 +01:00
|
|
|
import { slides } from "@state/slides.svelte";
|
2026-02-18 12:08:03 +01:00
|
|
|
import { site } from "@state/site.svelte";
|
|
|
|
|
import { locale } from "@state/locale.svelte";
|
Migration vers architecture Svelte + Kirby inspirée de design-to-pack
- Mise en place de Svelte 4 avec Vite pour le frontend (SPA)
- Simplification des templates PHP (header/footer minimalistes)
- Création de templates JSON pour API (home, about, expertise, portfolio, jouer, game, blog, article, project)
- Ajout d'un controller de site pour définir genericData globalement
- Structure des stores Svelte (page, navigation, locale, site)
- Router avec navaid pour navigation SPA et interception des liens
- Composants layout (Header, Footer, Cursor) et vues de base
- Build Vite vers assets/dist/ (index.js/css)
- Header PHP détecte assets/dist pour basculer dev/prod
Architecture fonctionnelle de base établie, à améliorer et compléter.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 16:30:15 +01:00
|
|
|
|
2026-02-19 12:38:07 +01:00
|
|
|
let siteInitialized = false;
|
Migration vers architecture Svelte + Kirby inspirée de design-to-pack
- Mise en place de Svelte 4 avec Vite pour le frontend (SPA)
- Simplification des templates PHP (header/footer minimalistes)
- Création de templates JSON pour API (home, about, expertise, portfolio, jouer, game, blog, article, project)
- Ajout d'un controller de site pour définir genericData globalement
- Structure des stores Svelte (page, navigation, locale, site)
- Router avec navaid pour navigation SPA et interception des liens
- Composants layout (Header, Footer, Cursor) et vues de base
- Build Vite vers assets/dist/ (index.js/css)
- Header PHP détecte assets/dist pour basculer dev/prod
Architecture fonctionnelle de base établie, à améliorer et compléter.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 16:30:15 +01:00
|
|
|
|
2026-02-19 12:38:07 +01:00
|
|
|
function normalizePath(path) {
|
2026-03-18 16:17:16 +01:00
|
|
|
const stripped = path.replace(/^\/en(\/|$)/, "$1") || "/";
|
|
|
|
|
return stripped === "/" ? "/home" : stripped;
|
Feat: intégration multilingue FR/EN (i18n)
- Ajout de src/i18n/index.js : dictionnaire centralisé + fonction t(key, vars)
- Ajout de LanguageSwitcher.svelte : toggle FR/EN avec persistance localStorage
- Router : normalizePath strip /en/, apiPrefix() pour les fetches, détection langue (URL > localStorage > navigator)
- Tous les composants (Header, Menu, Footer, Article, Blog, Play) migrent vers t() depuis @i18n
- Blog : navigation interne (fetch, history, getSlugFromUrl) locale-aware
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 11:57:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function apiPrefix() {
|
2026-03-18 16:17:16 +01:00
|
|
|
return locale.current === "en" ? "/en" : "";
|
2026-02-19 12:38:07 +01:00
|
|
|
}
|
Migration vers architecture Svelte + Kirby inspirée de design-to-pack
- Mise en place de Svelte 4 avec Vite pour le frontend (SPA)
- Simplification des templates PHP (header/footer minimalistes)
- Création de templates JSON pour API (home, about, expertise, portfolio, jouer, game, blog, article, project)
- Ajout d'un controller de site pour définir genericData globalement
- Structure des stores Svelte (page, navigation, locale, site)
- Router avec navaid pour navigation SPA et interception des liens
- Composants layout (Header, Footer, Cursor) et vues de base
- Build Vite vers assets/dist/ (index.js/css)
- Header PHP détecte assets/dist pour basculer dev/prod
Architecture fonctionnelle de base établie, à améliorer et compléter.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 16:30:15 +01:00
|
|
|
|
Feat: pages Article + navigation blog/article interne
- Router: findSlideIndex() avec fallback parent path
(/blog/slug → /blog) pour sub-pages
- article.json.php: réécriture — date, intro, cover, body (blocks→HTML),
related articles (fallback siblings si vide)
- Article.svelte: sous-composant — topbar date+retour, titre Terminal,
intro, cover, body rich text (styles :global pour blocks Kirby),
related articles grid, responsive
- Blog.svelte: gère deux modes (liste + article) —
intercepte les clics article via stopPropagation (avant le router),
fetch article data, pushState pour URL, popstate pour back/forward,
direct navigation /blog/slug sur mount
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-10 16:55:34 +01:00
|
|
|
/**
|
|
|
|
|
* Trouve l'index de la slide correspondant au path.
|
|
|
|
|
* Si le path exact n'existe pas, essaie le chemin parent
|
|
|
|
|
* (ex: /blog/article-slug → /blog).
|
|
|
|
|
*/
|
|
|
|
|
function findSlideIndex(path) {
|
|
|
|
|
let idx = slides.getIndexByPath(path);
|
|
|
|
|
if (idx !== -1) return idx;
|
|
|
|
|
const parentPath = path.replace(/\/[^/]+$/, "");
|
|
|
|
|
if (parentPath) return slides.getIndexByPath(parentPath);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-19 12:38:07 +01:00
|
|
|
async function loadSlide(path) {
|
Feat: pages Article + navigation blog/article interne
- Router: findSlideIndex() avec fallback parent path
(/blog/slug → /blog) pour sub-pages
- article.json.php: réécriture — date, intro, cover, body (blocks→HTML),
related articles (fallback siblings si vide)
- Article.svelte: sous-composant — topbar date+retour, titre Terminal,
intro, cover, body rich text (styles :global pour blocks Kirby),
related articles grid, responsive
- Blog.svelte: gère deux modes (liste + article) —
intercepte les clics article via stopPropagation (avant le router),
fetch article data, pushState pour URL, popstate pour back/forward,
direct navigation /blog/slug sur mount
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-10 16:55:34 +01:00
|
|
|
let slidePath = path;
|
|
|
|
|
let idx = slides.getIndexByPath(slidePath);
|
|
|
|
|
|
|
|
|
|
// Sub-page: resolve to parent slide (ex: /blog/slug → /blog)
|
|
|
|
|
if (idx === -1) {
|
|
|
|
|
const parentPath = path.replace(/\/[^/]+$/, "");
|
2026-03-10 19:19:05 +01:00
|
|
|
if (parentPath && parentPath !== path) {
|
|
|
|
|
const parentIdx = slides.getIndexByPath(parentPath);
|
|
|
|
|
if (parentIdx !== -1) {
|
|
|
|
|
idx = parentIdx;
|
|
|
|
|
slidePath = parentPath;
|
|
|
|
|
} else if (!siteInitialized) {
|
|
|
|
|
// Slides not yet initialized — assume sub-page, fetch parent to bootstrap
|
|
|
|
|
slidePath = parentPath;
|
|
|
|
|
}
|
|
|
|
|
}
|
Feat: pages Article + navigation blog/article interne
- Router: findSlideIndex() avec fallback parent path
(/blog/slug → /blog) pour sub-pages
- article.json.php: réécriture — date, intro, cover, body (blocks→HTML),
related articles (fallback siblings si vide)
- Article.svelte: sous-composant — topbar date+retour, titre Terminal,
intro, cover, body rich text (styles :global pour blocks Kirby),
related articles grid, responsive
- Blog.svelte: gère deux modes (liste + article) —
intercepte les clics article via stopPropagation (avant le router),
fetch article data, pushState pour URL, popstate pour back/forward,
direct navigation /blog/slug sur mount
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-10 16:55:34 +01:00
|
|
|
}
|
|
|
|
|
|
2026-02-19 12:38:07 +01:00
|
|
|
if (idx !== -1) {
|
|
|
|
|
const slide = slides.all[idx];
|
|
|
|
|
if (slide.loaded || slide.loading) return;
|
Feat: pages Article + navigation blog/article interne
- Router: findSlideIndex() avec fallback parent path
(/blog/slug → /blog) pour sub-pages
- article.json.php: réécriture — date, intro, cover, body (blocks→HTML),
related articles (fallback siblings si vide)
- Article.svelte: sous-composant — topbar date+retour, titre Terminal,
intro, cover, body rich text (styles :global pour blocks Kirby),
related articles grid, responsive
- Blog.svelte: gère deux modes (liste + article) —
intercepte les clics article via stopPropagation (avant le router),
fetch article data, pushState pour URL, popstate pour back/forward,
direct navigation /blog/slug sur mount
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-10 16:55:34 +01:00
|
|
|
slides.setLoading(slidePath, true);
|
2026-02-19 12:38:07 +01:00
|
|
|
}
|
Migration vers architecture Svelte + Kirby inspirée de design-to-pack
- Mise en place de Svelte 4 avec Vite pour le frontend (SPA)
- Simplification des templates PHP (header/footer minimalistes)
- Création de templates JSON pour API (home, about, expertise, portfolio, jouer, game, blog, article, project)
- Ajout d'un controller de site pour définir genericData globalement
- Structure des stores Svelte (page, navigation, locale, site)
- Router avec navaid pour navigation SPA et interception des liens
- Composants layout (Header, Footer, Cursor) et vues de base
- Build Vite vers assets/dist/ (index.js/css)
- Header PHP détecte assets/dist pour basculer dev/prod
Architecture fonctionnelle de base établie, à améliorer et compléter.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 16:30:15 +01:00
|
|
|
|
2026-02-19 12:38:07 +01:00
|
|
|
try {
|
Feat: intégration multilingue FR/EN (i18n)
- Ajout de src/i18n/index.js : dictionnaire centralisé + fonction t(key, vars)
- Ajout de LanguageSwitcher.svelte : toggle FR/EN avec persistance localStorage
- Router : normalizePath strip /en/, apiPrefix() pour les fetches, détection langue (URL > localStorage > navigator)
- Tous les composants (Header, Menu, Footer, Article, Blog, Play) migrent vers t() depuis @i18n
- Blog : navigation interne (fetch, history, getSlugFromUrl) locale-aware
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 11:57:59 +01:00
|
|
|
const response = await fetch(`${apiPrefix()}${slidePath}.json`);
|
2026-02-19 12:38:07 +01:00
|
|
|
if (!response.ok) throw new Error(`HTTP ${response.status}`);
|
Migration vers architecture Svelte + Kirby inspirée de design-to-pack
- Mise en place de Svelte 4 avec Vite pour le frontend (SPA)
- Simplification des templates PHP (header/footer minimalistes)
- Création de templates JSON pour API (home, about, expertise, portfolio, jouer, game, blog, article, project)
- Ajout d'un controller de site pour définir genericData globalement
- Structure des stores Svelte (page, navigation, locale, site)
- Router avec navaid pour navigation SPA et interception des liens
- Composants layout (Header, Footer, Cursor) et vues de base
- Build Vite vers assets/dist/ (index.js/css)
- Header PHP détecte assets/dist pour basculer dev/prod
Architecture fonctionnelle de base établie, à améliorer et compléter.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 16:30:15 +01:00
|
|
|
const data = await response.json();
|
2026-03-20 11:52:37 +01:00
|
|
|
console.log("slide data", data);
|
Migration vers architecture Svelte + Kirby inspirée de design-to-pack
- Mise en place de Svelte 4 avec Vite pour le frontend (SPA)
- Simplification des templates PHP (header/footer minimalistes)
- Création de templates JSON pour API (home, about, expertise, portfolio, jouer, game, blog, article, project)
- Ajout d'un controller de site pour définir genericData globalement
- Structure des stores Svelte (page, navigation, locale, site)
- Router avec navaid pour navigation SPA et interception des liens
- Composants layout (Header, Footer, Cursor) et vues de base
- Build Vite vers assets/dist/ (index.js/css)
- Header PHP détecte assets/dist pour basculer dev/prod
Architecture fonctionnelle de base établie, à améliorer et compléter.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 16:30:15 +01:00
|
|
|
|
2026-02-19 12:38:07 +01:00
|
|
|
if (!siteInitialized && data.site) {
|
2026-02-07 08:26:28 +01:00
|
|
|
site.set(data.site);
|
|
|
|
|
locale.initialize(data.site.language, data.site.languages);
|
2026-02-19 12:38:07 +01:00
|
|
|
slides.init(data.site.navigation);
|
|
|
|
|
siteInitialized = true;
|
Migration vers architecture Svelte + Kirby inspirée de design-to-pack
- Mise en place de Svelte 4 avec Vite pour le frontend (SPA)
- Simplification des templates PHP (header/footer minimalistes)
- Création de templates JSON pour API (home, about, expertise, portfolio, jouer, game, blog, article, project)
- Ajout d'un controller de site pour définir genericData globalement
- Structure des stores Svelte (page, navigation, locale, site)
- Router avec navaid pour navigation SPA et interception des liens
- Composants layout (Header, Footer, Cursor) et vues de base
- Build Vite vers assets/dist/ (index.js/css)
- Header PHP détecte assets/dist pour basculer dev/prod
Architecture fonctionnelle de base établie, à améliorer et compléter.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 16:30:15 +01:00
|
|
|
}
|
|
|
|
|
|
Feat: pages Article + navigation blog/article interne
- Router: findSlideIndex() avec fallback parent path
(/blog/slug → /blog) pour sub-pages
- article.json.php: réécriture — date, intro, cover, body (blocks→HTML),
related articles (fallback siblings si vide)
- Article.svelte: sous-composant — topbar date+retour, titre Terminal,
intro, cover, body rich text (styles :global pour blocks Kirby),
related articles grid, responsive
- Blog.svelte: gère deux modes (liste + article) —
intercepte les clics article via stopPropagation (avant le router),
fetch article data, pushState pour URL, popstate pour back/forward,
direct navigation /blog/slug sur mount
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-10 16:55:34 +01:00
|
|
|
slides.setData(slidePath, data);
|
Migration vers architecture Svelte + Kirby inspirée de design-to-pack
- Mise en place de Svelte 4 avec Vite pour le frontend (SPA)
- Simplification des templates PHP (header/footer minimalistes)
- Création de templates JSON pour API (home, about, expertise, portfolio, jouer, game, blog, article, project)
- Ajout d'un controller de site pour définir genericData globalement
- Structure des stores Svelte (page, navigation, locale, site)
- Router avec navaid pour navigation SPA et interception des liens
- Composants layout (Header, Footer, Cursor) et vues de base
- Build Vite vers assets/dist/ (index.js/css)
- Header PHP détecte assets/dist pour basculer dev/prod
Architecture fonctionnelle de base établie, à améliorer et compléter.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 16:30:15 +01:00
|
|
|
} catch (error) {
|
Feat: pages Article + navigation blog/article interne
- Router: findSlideIndex() avec fallback parent path
(/blog/slug → /blog) pour sub-pages
- article.json.php: réécriture — date, intro, cover, body (blocks→HTML),
related articles (fallback siblings si vide)
- Article.svelte: sous-composant — topbar date+retour, titre Terminal,
intro, cover, body rich text (styles :global pour blocks Kirby),
related articles grid, responsive
- Blog.svelte: gère deux modes (liste + article) —
intercepte les clics article via stopPropagation (avant le router),
fetch article data, pushState pour URL, popstate pour back/forward,
direct navigation /blog/slug sur mount
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-10 16:55:34 +01:00
|
|
|
console.error(`[router] Failed to load slide ${slidePath}:`, error);
|
|
|
|
|
slides.setLoading(slidePath, false);
|
Migration vers architecture Svelte + Kirby inspirée de design-to-pack
- Mise en place de Svelte 4 avec Vite pour le frontend (SPA)
- Simplification des templates PHP (header/footer minimalistes)
- Création de templates JSON pour API (home, about, expertise, portfolio, jouer, game, blog, article, project)
- Ajout d'un controller de site pour définir genericData globalement
- Structure des stores Svelte (page, navigation, locale, site)
- Router avec navaid pour navigation SPA et interception des liens
- Composants layout (Header, Footer, Cursor) et vues de base
- Build Vite vers assets/dist/ (index.js/css)
- Header PHP détecte assets/dist pour basculer dev/prod
Architecture fonctionnelle de base établie, à améliorer et compléter.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 16:30:15 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-19 12:38:07 +01:00
|
|
|
function loadAllSlidesInBackground(exceptPath) {
|
|
|
|
|
slides.all
|
|
|
|
|
.filter((s) => s.path !== exceptPath)
|
|
|
|
|
.forEach((s) => loadSlide(s.path));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function slideTo(path, { skipHistory = false } = {}) {
|
|
|
|
|
path = normalizePath(path);
|
|
|
|
|
|
|
|
|
|
if (!skipHistory) {
|
2026-03-18 16:17:16 +01:00
|
|
|
const historyPath =
|
|
|
|
|
locale.current === "en"
|
|
|
|
|
? path === "/home"
|
|
|
|
|
? "/en"
|
|
|
|
|
: `/en${path}`
|
|
|
|
|
: path === "/home"
|
|
|
|
|
? "/"
|
|
|
|
|
: path;
|
|
|
|
|
history.pushState({}, "", historyPath);
|
2026-02-19 12:38:07 +01:00
|
|
|
}
|
|
|
|
|
|
Feat: pages Article + navigation blog/article interne
- Router: findSlideIndex() avec fallback parent path
(/blog/slug → /blog) pour sub-pages
- article.json.php: réécriture — date, intro, cover, body (blocks→HTML),
related articles (fallback siblings si vide)
- Article.svelte: sous-composant — topbar date+retour, titre Terminal,
intro, cover, body rich text (styles :global pour blocks Kirby),
related articles grid, responsive
- Blog.svelte: gère deux modes (liste + article) —
intercepte les clics article via stopPropagation (avant le router),
fetch article data, pushState pour URL, popstate pour back/forward,
direct navigation /blog/slug sur mount
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-10 16:55:34 +01:00
|
|
|
const idx = findSlideIndex(path);
|
|
|
|
|
const slidePath = idx !== -1 ? slides.all[idx].path : path;
|
|
|
|
|
|
2026-02-19 12:38:07 +01:00
|
|
|
if (idx !== -1 && slides.all[idx].title) {
|
2026-03-18 16:20:47 +01:00
|
|
|
document.title = `World Game - ${slides.all[idx].title}`;
|
2026-02-19 12:38:07 +01:00
|
|
|
}
|
|
|
|
|
|
2026-03-21 09:36:51 +01:00
|
|
|
// Si on navigue vers la slide déjà active (ex: clic sur "Blog" depuis un article),
|
|
|
|
|
// déclencher popstate pour que la vue puisse réagir au changement d'URL.
|
|
|
|
|
if (idx === slides.activeIndex && !skipHistory) {
|
|
|
|
|
window.dispatchEvent(new PopStateEvent('popstate'));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
Feat: pages Article + navigation blog/article interne
- Router: findSlideIndex() avec fallback parent path
(/blog/slug → /blog) pour sub-pages
- article.json.php: réécriture — date, intro, cover, body (blocks→HTML),
related articles (fallback siblings si vide)
- Article.svelte: sous-composant — topbar date+retour, titre Terminal,
intro, cover, body rich text (styles :global pour blocks Kirby),
related articles grid, responsive
- Blog.svelte: gère deux modes (liste + article) —
intercepte les clics article via stopPropagation (avant le router),
fetch article data, pushState pour URL, popstate pour back/forward,
direct navigation /blog/slug sur mount
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-10 16:55:34 +01:00
|
|
|
slides.slideTo(slidePath);
|
2026-02-19 12:38:07 +01:00
|
|
|
|
|
|
|
|
if (idx !== -1 && !slides.all[idx].loaded) {
|
Feat: pages Article + navigation blog/article interne
- Router: findSlideIndex() avec fallback parent path
(/blog/slug → /blog) pour sub-pages
- article.json.php: réécriture — date, intro, cover, body (blocks→HTML),
related articles (fallback siblings si vide)
- Article.svelte: sous-composant — topbar date+retour, titre Terminal,
intro, cover, body rich text (styles :global pour blocks Kirby),
related articles grid, responsive
- Blog.svelte: gère deux modes (liste + article) —
intercepte les clics article via stopPropagation (avant le router),
fetch article data, pushState pour URL, popstate pour back/forward,
direct navigation /blog/slug sur mount
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-10 16:55:34 +01:00
|
|
|
loadSlide(slidePath);
|
2026-02-19 12:38:07 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export async function initRouter() {
|
Feat: intégration multilingue FR/EN (i18n)
- Ajout de src/i18n/index.js : dictionnaire centralisé + fonction t(key, vars)
- Ajout de LanguageSwitcher.svelte : toggle FR/EN avec persistance localStorage
- Router : normalizePath strip /en/, apiPrefix() pour les fetches, détection langue (URL > localStorage > navigator)
- Tous les composants (Header, Menu, Footer, Article, Blog, Play) migrent vers t() depuis @i18n
- Blog : navigation interne (fetch, history, getSlugFromUrl) locale-aware
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 11:57:59 +01:00
|
|
|
// Language detection: URL prefix > localStorage > navigator
|
2026-03-18 16:17:16 +01:00
|
|
|
const hasEnPrefix = window.location.pathname.startsWith("/en");
|
Feat: intégration multilingue FR/EN (i18n)
- Ajout de src/i18n/index.js : dictionnaire centralisé + fonction t(key, vars)
- Ajout de LanguageSwitcher.svelte : toggle FR/EN avec persistance localStorage
- Router : normalizePath strip /en/, apiPrefix() pour les fetches, détection langue (URL > localStorage > navigator)
- Tous les composants (Header, Menu, Footer, Article, Blog, Play) migrent vers t() depuis @i18n
- Blog : navigation interne (fetch, history, getSlugFromUrl) locale-aware
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 11:57:59 +01:00
|
|
|
if (hasEnPrefix) {
|
2026-03-18 16:17:16 +01:00
|
|
|
locale.setLanguage("en");
|
|
|
|
|
localStorage.setItem("wg_lang", "en");
|
|
|
|
|
} else if (!localStorage.getItem("wg_lang")) {
|
|
|
|
|
const navLang = navigator.language || navigator.languages?.[0] || "fr";
|
|
|
|
|
if (navLang.startsWith("en")) {
|
|
|
|
|
window.location.replace("/en" + window.location.pathname);
|
Feat: intégration multilingue FR/EN (i18n)
- Ajout de src/i18n/index.js : dictionnaire centralisé + fonction t(key, vars)
- Ajout de LanguageSwitcher.svelte : toggle FR/EN avec persistance localStorage
- Router : normalizePath strip /en/, apiPrefix() pour les fetches, détection langue (URL > localStorage > navigator)
- Tous les composants (Header, Menu, Footer, Article, Blog, Play) migrent vers t() depuis @i18n
- Blog : navigation interne (fetch, history, getSlugFromUrl) locale-aware
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 11:57:59 +01:00
|
|
|
return;
|
|
|
|
|
}
|
2026-03-18 16:17:16 +01:00
|
|
|
} else if (localStorage.getItem("wg_lang") === "en") {
|
|
|
|
|
window.location.replace("/en" + window.location.pathname);
|
Feat: intégration multilingue FR/EN (i18n)
- Ajout de src/i18n/index.js : dictionnaire centralisé + fonction t(key, vars)
- Ajout de LanguageSwitcher.svelte : toggle FR/EN avec persistance localStorage
- Router : normalizePath strip /en/, apiPrefix() pour les fetches, détection langue (URL > localStorage > navigator)
- Tous les composants (Header, Menu, Footer, Article, Blog, Play) migrent vers t() depuis @i18n
- Blog : navigation interne (fetch, history, getSlugFromUrl) locale-aware
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 11:57:59 +01:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-19 12:38:07 +01:00
|
|
|
const initialPath = normalizePath(window.location.pathname);
|
|
|
|
|
|
|
|
|
|
await loadSlide(initialPath);
|
|
|
|
|
|
Feat: pages Article + navigation blog/article interne
- Router: findSlideIndex() avec fallback parent path
(/blog/slug → /blog) pour sub-pages
- article.json.php: réécriture — date, intro, cover, body (blocks→HTML),
related articles (fallback siblings si vide)
- Article.svelte: sous-composant — topbar date+retour, titre Terminal,
intro, cover, body rich text (styles :global pour blocks Kirby),
related articles grid, responsive
- Blog.svelte: gère deux modes (liste + article) —
intercepte les clics article via stopPropagation (avant le router),
fetch article data, pushState pour URL, popstate pour back/forward,
direct navigation /blog/slug sur mount
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-10 16:55:34 +01:00
|
|
|
const idx = findSlideIndex(initialPath);
|
2026-02-19 12:38:07 +01:00
|
|
|
if (idx !== -1) {
|
|
|
|
|
slides.setActiveIndex(idx);
|
|
|
|
|
}
|
Migration vers architecture Svelte + Kirby inspirée de design-to-pack
- Mise en place de Svelte 4 avec Vite pour le frontend (SPA)
- Simplification des templates PHP (header/footer minimalistes)
- Création de templates JSON pour API (home, about, expertise, portfolio, jouer, game, blog, article, project)
- Ajout d'un controller de site pour définir genericData globalement
- Structure des stores Svelte (page, navigation, locale, site)
- Router avec navaid pour navigation SPA et interception des liens
- Composants layout (Header, Footer, Cursor) et vues de base
- Build Vite vers assets/dist/ (index.js/css)
- Header PHP détecte assets/dist pour basculer dev/prod
Architecture fonctionnelle de base établie, à améliorer et compléter.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 16:30:15 +01:00
|
|
|
|
2026-03-18 16:17:16 +01:00
|
|
|
loadAllSlidesInBackground(idx !== -1 ? slides.all[idx].path : initialPath);
|
2026-02-19 12:38:07 +01:00
|
|
|
|
|
|
|
|
window.addEventListener("popstate", () => {
|
|
|
|
|
const path = normalizePath(window.location.pathname);
|
|
|
|
|
slideTo(path, { skipHistory: true });
|
|
|
|
|
});
|
Migration vers architecture Svelte + Kirby inspirée de design-to-pack
- Mise en place de Svelte 4 avec Vite pour le frontend (SPA)
- Simplification des templates PHP (header/footer minimalistes)
- Création de templates JSON pour API (home, about, expertise, portfolio, jouer, game, blog, article, project)
- Ajout d'un controller de site pour définir genericData globalement
- Structure des stores Svelte (page, navigation, locale, site)
- Router avec navaid pour navigation SPA et interception des liens
- Composants layout (Header, Footer, Cursor) et vues de base
- Build Vite vers assets/dist/ (index.js/css)
- Header PHP détecte assets/dist pour basculer dev/prod
Architecture fonctionnelle de base établie, à améliorer et compléter.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 16:30:15 +01:00
|
|
|
|
|
|
|
|
document.addEventListener("click", (e) => {
|
|
|
|
|
const link = e.target.closest("a");
|
|
|
|
|
if (!link) return;
|
|
|
|
|
|
|
|
|
|
const url = new URL(link.href, window.location.origin);
|
|
|
|
|
if (
|
|
|
|
|
url.origin === window.location.origin &&
|
|
|
|
|
!link.target &&
|
|
|
|
|
!link.hasAttribute("download")
|
|
|
|
|
) {
|
|
|
|
|
e.preventDefault();
|
2026-02-19 12:38:07 +01:00
|
|
|
slideTo(url.pathname);
|
Migration vers architecture Svelte + Kirby inspirée de design-to-pack
- Mise en place de Svelte 4 avec Vite pour le frontend (SPA)
- Simplification des templates PHP (header/footer minimalistes)
- Création de templates JSON pour API (home, about, expertise, portfolio, jouer, game, blog, article, project)
- Ajout d'un controller de site pour définir genericData globalement
- Structure des stores Svelte (page, navigation, locale, site)
- Router avec navaid pour navigation SPA et interception des liens
- Composants layout (Header, Footer, Cursor) et vues de base
- Build Vite vers assets/dist/ (index.js/css)
- Header PHP détecte assets/dist pour basculer dev/prod
Architecture fonctionnelle de base établie, à améliorer et compléter.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-06 16:30:15 +01:00
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-19 12:38:07 +01:00
|
|
|
// Keep navigateTo as alias so existing views don't break
|
|
|
|
|
export const navigateTo = slideTo;
|