Files
gong.gp/src/routes/+layout.svelte
T
sucupiraandClaude Opus 4.8 cd9b9b093c 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>
2026-07-24 23:57:37 -04:00

53 lines
1.5 KiB
Svelte

<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>