Files
gong.gp/src/routes/actualites/[slug]/+page.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

94 lines
2.3 KiB
Svelte

<script lang="ts">
import Seo from '$lib/components/Seo.svelte';
import Breadcrumb from '$lib/components/Breadcrumb.svelte';
import { SITE } from '$lib/data/gong';
let { data } = $props();
const a = $derived(data.article);
const crumbs = $derived([
{ name: 'Accueil', path: '/' },
{ name: 'Actualités', path: '/actualites/' },
{ name: a.titre, path: `/actualites/${a.slug}/` }
]);
const articleNode = $derived({
'@type': 'Article',
'@id': `${SITE.url}/actualites/${a.slug}/#article`,
headline: a.titre,
description: a.chapeau,
datePublished: a.iso,
dateModified: a.iso,
inLanguage: 'fr-FR',
...(a.couverture ? { image: SITE.url + a.couverture } : {}),
author: { '@id': `${SITE.url}/#organization` },
publisher: { '@id': `${SITE.url}/#organization` },
isPartOf: { '@id': `${SITE.url}/#website` },
mainEntityOfPage: `${SITE.url}/actualites/${a.slug}/`
});
</script>
<Seo
title={a.titre}
description={a.chapeau}
path={`/actualites/${a.slug}/`}
type="article"
image={a.couverture ?? '/gong-logo.png'}
imageAlt={a.couvertureAlt ?? a.titre}
publishedTime={a.iso}
modifiedTime={a.iso}
graph={[articleNode]}
breadcrumb={crumbs}
/>
<main id="contenu" class="section">
<div class="container">
<Breadcrumb items={crumbs} />
<article>
<header class="art-head">
<time datetime={a.iso} class="date">{a.date}</time>
<h1>{a.titre}</h1>
<p class="chapeau">{a.chapeau}</p>
</header>
{#if a.couverture}
<figure class="art-cover">
<img src={a.couverture} alt={a.couvertureAlt} width="1200" height="800" />
</figure>
{/if}
<!-- Contenu first-party (Sveltia CMS, rendu markdown côté serveur). -->
<div class="prose art-body">{@html a.html}</div>
</article>
<p><a class="btn btn--ghost" href="/actualites/">← Toutes les actualités</a></p>
</div>
</main>
<style>
.art-head {
max-width: var(--container-lecture);
}
.date {
font-size: 0.85rem;
color: var(--muted-fort);
text-transform: uppercase;
letter-spacing: 0.04em;
}
.chapeau {
font-size: 1.2rem;
color: var(--muted);
font-style: italic;
}
.art-cover {
margin: var(--space-3) 0;
max-width: 900px;
}
.art-cover img {
width: 100%;
border-radius: var(--radius-md);
border: 1px solid var(--line);
}
.art-body {
margin-top: var(--space-3);
}
</style>