Refonte complète en SvelteKit (méthode OKI, AI-Overview ready)
Reconstruit le site statique mono-page (Bulma + htmx + Strapi) en SvelteKit 2 + Svelte 5 (runes) + TypeScript, 100 % statique (adapter-static), auto-hébergé. - Contenu enrichi à partir du dossier documentaire sourcé : 28 pages (histoire, Mé 67, procès 1968, 9 fiches militants, idéologie, héritage, publications, charte, orientation, sources, FAQ, actualités, contact, mentions légales). - Souveraineté : retrait de Bulma/htmx/mustache/ionicons/Plausible/Google Fonts et de l'API Strapi. Polices Archivo/Inter et sprite SVG auto-hébergés (zéro emoji). - Identité GONG (drapeau vert/blanc/rouge), thème sombre par défaut + clair AA, cadences motion gwoka, KineticText, timeline, 404 kréyòl, PWA hors-ligne. - SEO/AI-Overview : HTML sémantique, JSON-LD (Organization, Person, Event, FAQPage, Article...), hreflang, sitemap dynamique, robots/humans.txt. - Sécurité : CSP hachée + en-têtes (.htaccess o2switch + _headers Cloudflare), HSTS. - Actualités éditées via Sveltia CMS (git-based) ; Strapi retiré. npm run build : vert · npm run check : 0 erreur / 0 warning · JS 97 Ko gzip. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
b89c1a80b7
commit
cd9b9b093c
@@ -0,0 +1,52 @@
|
||||
<script lang="ts">
|
||||
import '$lib/styles/gong-tokens.css';
|
||||
import '$lib/styles/base.css';
|
||||
import { onMount } from 'svelte';
|
||||
import { onNavigate, afterNavigate } from '$app/navigation';
|
||||
import Nav from '$lib/components/Nav.svelte';
|
||||
import Footer from '$lib/components/Footer.svelte';
|
||||
import ScrollProgressBar from '$lib/components/ScrollProgressBar.svelte';
|
||||
import { initSmoothScroll } from '$lib/motion/scroll';
|
||||
|
||||
let { children } = $props();
|
||||
|
||||
// Smooth scroll Lenis — une seule instance, gate reduced-motion interne.
|
||||
onMount(() => {
|
||||
let cleanup: (() => void) | undefined;
|
||||
initSmoothScroll().then((c) => (cleanup = c));
|
||||
return () => cleanup?.();
|
||||
});
|
||||
|
||||
// Transitions de page — View Transitions API, fallback = navigation instantanée.
|
||||
onNavigate((navigation) => {
|
||||
if (!document.startViewTransition) return;
|
||||
return new Promise((resolve) => {
|
||||
document.startViewTransition(async () => {
|
||||
resolve();
|
||||
await navigation.complete;
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// Accessibilité : après un changement de route, déplacer le focus sur le contenu.
|
||||
afterNavigate(() => {
|
||||
const main = document.getElementById('contenu');
|
||||
if (main) {
|
||||
main.setAttribute('tabindex', '-1');
|
||||
main.focus({ preventScroll: true });
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<a class="skip-link" href="#contenu">Aller au contenu</a>
|
||||
<ScrollProgressBar />
|
||||
<Nav />
|
||||
{@render children()}
|
||||
<Footer />
|
||||
|
||||
<style>
|
||||
:global(::view-transition-old(root)),
|
||||
:global(::view-transition-new(root)) {
|
||||
animation-duration: var(--dur-mesure);
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user