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:
sucupira
2026-07-24 23:57:37 -04:00
co-authored by Claude Opus 4.8
parent b89c1a80b7
commit cd9b9b093c
104 changed files with 14569 additions and 1383 deletions
+52
View File
@@ -0,0 +1,52 @@
# ============================================================================
# gong.gp — configuration Apache (o2switch / hébergement mutualisé statique).
# Le CSP script-src/style-src est géré par la balise <meta> hachée de SvelteKit.
# ============================================================================
# ── HTTPS forcé ──
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
# ── En-têtes de sécurité ──
<IfModule mod_headers.c>
Header always set X-Frame-Options "DENY"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "geolocation=(), camera=(), microphone=(), payment=(), usb=(), interest-cohort=()"
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header always set Content-Security-Policy "frame-ancestors 'none'; base-uri 'self'; form-action 'self'; object-src 'none'"
</IfModule>
# ── Cache : assets immuables ──
<IfModule mod_headers.c>
<FilesMatch "\.(woff2|avif|webp|png|jpg|jpeg|svg|ico)$">
Header set Cache-Control "public, max-age=31536000, immutable"
</FilesMatch>
</IfModule>
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType font/woff2 "access plus 1 year"
ExpiresByType image/avif "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType text/html "access plus 0 seconds"
</IfModule>
# ── Compression ──
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css application/javascript application/json image/svg+xml application/xml
</IfModule>
# ── Page 404 autonome ──
ErrorDocument 404 /404.html
# ── Types ──
<IfModule mod_mime.c>
AddType application/manifest+json .webmanifest
AddType font/woff2 .woff2
AddType image/avif .avif
</IfModule>
+81
View File
@@ -0,0 +1,81 @@
<!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="robots" content="noindex" />
<title>404 — GONG</title>
<link rel="icon" href="/favicon.ico" sizes="32x32" />
<link rel="stylesheet" href="/fonts/fonts.css" />
<style>
:root {
--noir: #0d0d0d;
--creme: #faf6ef;
--rouge: #e11419;
--vert: #00a651;
--muted: rgba(250, 246, 239, 0.68);
}
* {
box-sizing: border-box;
}
body {
margin: 0;
min-height: 100dvh;
display: grid;
place-content: center;
justify-items: center;
text-align: center;
gap: 0.6rem;
padding: 2rem;
background: var(--noir);
color: var(--creme);
font-family: 'Inter', system-ui, sans-serif;
}
.flag {
width: 72px;
height: 6px;
background: linear-gradient(to right, var(--vert) 0 40%, #fff 40% 60%, var(--rouge) 60% 100%);
margin-bottom: 1rem;
}
.code {
font-family: 'Archivo', 'Arial Black', sans-serif;
font-weight: 900;
font-size: clamp(3rem, 2rem + 6vw, 6rem);
line-height: 1;
color: var(--rouge);
margin: 0;
}
h1 {
font-family: 'Archivo', 'Arial Black', sans-serif;
font-weight: 800;
text-transform: uppercase;
margin: 0;
}
p {
max-width: 44ch;
color: var(--muted);
}
a.btn {
display: inline-block;
margin-top: 1rem;
font-family: 'Archivo', sans-serif;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.03em;
text-decoration: none;
padding: 0.85em 1.4em;
border: 2px solid var(--rouge);
border-radius: 3px;
background: var(--rouge);
color: #0d0d0d;
}
</style>
</head>
<body>
<div class="flag"></div>
<p class="code">404</p>
<h1 lang="gcf">Paj-la pa la</h1>
<p>Cette page n'existe pas ou a été déplacée. Mais l'histoire du GONG, elle, est toujours là.</p>
<a class="btn" href="/">Retour à l'accueil</a>
</body>
</html>
+23
View File
@@ -0,0 +1,23 @@
# En-têtes Cloudflare Pages.
# Le CSP script-src/style-src est géré par la balise <meta> hachée de SvelteKit (kit.csp).
# Ici : uniquement les directives d'en-tête (frame-ancestors…) et les en-têtes de sécurité.
/*
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: geolocation=(), camera=(), microphone=(), payment=(), usb=(), interest-cohort=()
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Content-Security-Policy: frame-ancestors 'none'; base-uri 'self'; form-action 'self'; object-src 'none'
# Assets immuables — cache long.
/_app/immutable/*
Cache-Control: public, max-age=31536000, immutable
/fonts/*
Cache-Control: public, max-age=31536000, immutable
# L'administration (Sveltia CMS) doit joindre la forge Gitea.
/admin/*
X-Robots-Tag: noindex
Content-Security-Policy: default-src 'self'; script-src 'self' 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://labola.o-k-i.net; font-src 'self' data:; connect-src 'self' https://labola.o-k-i.net; frame-ancestors 'none'; base-uri 'self'
+5
View File
@@ -0,0 +1,5 @@
# CSP spécifique à l'administration (Sveltia CMS) : doit joindre la forge Gitea.
<IfModule mod_headers.c>
Header always set X-Robots-Tag "noindex, nofollow"
Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://labola.o-k-i.net; font-src 'self' data:; connect-src 'self' https://labola.o-k-i.net; frame-ancestors 'none'; base-uri 'self'"
</IfModule>
+47
View File
@@ -0,0 +1,47 @@
# Sveltia CMS — administration des actualités du GONG.
# Backend git : forge Gitea/Forgejo de l'écosystème OKI (labola.o-k-i.net).
# Prérequis (une seule fois) : créer une application OAuth dans Gitea
# (Paramètres → Applications → Nouvelle application OAuth2),
# URL de redirection : https://gong.gp/admin/ — puis renseigner `app_id` ci-dessous.
# Voir DEPLOIEMENT.md.
backend:
name: gitea
repo: ORGANISATION-KA-INTERNATIONALE/gong.gp
branch: prod # ⚠️ doit correspondre à la branche déployée en production
base_url: https://labola.o-k-i.net
# app_id: "<client-id-oauth-gitea>"
# Édition locale sans authentification : `npx @sveltia/cms-cli` ou ?dev côté outillage.
# media : images des actualités auto-hébergées dans le dépôt.
media_folder: static/images/actualites
public_folder: /images/actualites
# Interface en français.
locale: fr
collections:
- name: actualites
label: Actualités
label_singular: Actualité
description: Communiqués, commémorations et annonces du GONG.
folder: content/actualites
create: true
delete: true
slug: '{{year}}-{{month}}-{{day}}-{{slug}}'
identifier_field: titre
summary: '{{titre}} — {{date}}'
sortable_fields: [date, titre]
fields:
- { name: titre, label: Titre, widget: string }
- name: date
label: Date de publication
widget: datetime
format: 'YYYY-MM-DD'
date_format: 'YYYY-MM-DD'
time_format: false
- { name: chapeau, label: Chapeau (résumé court), widget: text }
- { name: couverture, label: Image de couverture, widget: image, required: false }
- { name: couvertureAlt, label: "Texte alternatif de l'image", widget: string, required: false }
- { name: top, label: Mettre en avant, widget: boolean, default: false }
- { name: body, label: Contenu, widget: markdown }
+14
View File
@@ -0,0 +1,14 @@
<!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="robots" content="noindex, nofollow" />
<title>GONG — Administration</title>
<link rel="icon" href="/favicon.ico" sizes="32x32" />
</head>
<body>
<!-- Sveltia CMS — bundle auto-hébergé (souveraineté + CSP script-src 'self'). -->
<script src="/admin/sveltia-cms.js"></script>
</body>
</html>
File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+69
View File
@@ -0,0 +1,69 @@
/* Polices auto-hébergées — souveraineté numérique, zéro appel Google Fonts.
Archivo (display, titres + boutons) · Inter (corps). Sous-ensemble latin, woff2. */
/* ── Archivo (display) ── */
@font-face {
font-family: 'Archivo';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('/fonts/archivo-latin-600-normal.woff2') format('woff2');
}
@font-face {
font-family: 'Archivo';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('/fonts/archivo-latin-700-normal.woff2') format('woff2');
}
@font-face {
font-family: 'Archivo';
font-style: normal;
font-weight: 800;
font-display: swap;
src: url('/fonts/archivo-latin-800-normal.woff2') format('woff2');
}
@font-face {
font-family: 'Archivo';
font-style: normal;
font-weight: 900;
font-display: swap;
src: url('/fonts/archivo-latin-900-normal.woff2') format('woff2');
}
/* ── Inter (corps) ── */
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('/fonts/inter-latin-400-normal.woff2') format('woff2');
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 500;
font-display: swap;
src: url('/fonts/inter-latin-500-normal.woff2') format('woff2');
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('/fonts/inter-latin-600-normal.woff2') format('woff2');
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('/fonts/inter-latin-700-normal.woff2') format('woff2');
}
@font-face {
font-family: 'Inter';
font-style: normal;
font-weight: 800;
font-display: swap;
src: url('/fonts/inter-latin-800-normal.woff2') format('woff2');
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

+17
View File
@@ -0,0 +1,17 @@
/* ÉQUIPE */
Éditeur : ORGANISATION KA INTERNATIONALE
Site : https://o-k-i.net
Lieu : Basse-Terre, Guadeloupe (971)
/* EN MÉMOIRE */
Pierre Sainton (v.1924 - 2018) — fondateur du GONG
Jacques Nestor (1941 - 1967) — première victime de Mé 67
Et toutes les victimes de mai 1967.
/* SITE */
Objet : dossier documentaire sur le Groupe d'Organisation Nationale de la Guadeloupe (1963-1968)
Dernière refonte : 2026
Standards : HTML5, CSS3, ES2022
Composants : SvelteKit 2, Svelte 5 (runes), TypeScript
Doctrine : souveraineté numérique — zéro service tiers, tout auto-hébergé
Licence : AGPL-3.0
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

+165
View File
@@ -0,0 +1,165 @@
<svg xmlns="http://www.w3.org/2000/svg" style="display:none">
<!-- Set GONG — viewBox 24×24, stroke 2px, currentColor, angles nets. -->
<!-- ka : tambour ka — icône maîtresse (404, loader) -->
<symbol id="ka" viewBox="0 0 24 24">
<path d="M5 7l14-3v13" />
<path d="M5 7v10l14 3V17" />
<path d="M5 7l14 10" />
<path d="M5 17l14-10" />
</symbol>
<!-- glo : poing levé géométrique — luttes -->
<symbol id="glo" viewBox="0 0 24 24">
<path d="M7 21v-6h10v6" />
<path d="M7 15V9l3-1 3 1 4 1v5" />
<path d="M10 8V4l1-1 1 1v4" />
</symbol>
<!-- kle : cadenas ouvert — liberté, open-source -->
<symbol id="kle" viewBox="0 0 24 24">
<rect x="5" y="11" width="14" height="9" />
<path d="M8 11V7a4 4 0 0 1 8 0" />
</symbol>
<!-- flag : drapeau -->
<symbol id="flag" viewBox="0 0 24 24">
<path d="M5 21V4" />
<path d="M5 4h13l-2 4 2 4H5" />
</symbol>
<!-- star : étoile 4 branches -->
<symbol id="star" viewBox="0 0 24 24">
<path d="M12 3l2.2 6.8L21 12l-6.8 2.2L12 21l-2.2-6.8L3 12l6.8-2.2z" />
</symbol>
<!-- document : fichier -->
<symbol id="document" viewBox="0 0 24 24">
<path d="M14 3H6v18h12V7z" />
<path d="M14 3v4h4" />
<path d="M9 12h6M9 16h6" />
</symbol>
<!-- download -->
<symbol id="download" viewBox="0 0 24 24">
<path d="M12 3v11" />
<path d="M7 10l5 5 5-5" />
<path d="M4 20h16" />
</symbol>
<!-- mail -->
<symbol id="mail" viewBox="0 0 24 24">
<rect x="3" y="5" width="18" height="14" />
<path d="M3 6l9 7 9-7" />
</symbol>
<!-- arrow-right -->
<symbol id="arrow-right" viewBox="0 0 24 24">
<path d="M4 12h16" />
<path d="M13 5l7 7-7 7" />
</symbol>
<!-- external : lien externe -->
<symbol id="external" viewBox="0 0 24 24">
<path d="M14 4h6v6" />
<path d="M20 4l-9 9" />
<path d="M18 14v5H5V6h5" />
</symbol>
<!-- close -->
<symbol id="close" viewBox="0 0 24 24">
<path d="M6 6l12 12M18 6L6 18" />
</symbol>
<!-- close-circle -->
<symbol id="close-circle" viewBox="0 0 24 24">
<circle cx="12" cy="12" r="9" />
<path d="M9 9l6 6M15 9l-6 6" />
</symbol>
<!-- calendar : date -->
<symbol id="calendar" viewBox="0 0 24 24">
<rect x="4" y="5" width="16" height="16" />
<path d="M4 9h16M8 3v4M16 3v4" />
</symbol>
<!-- clock : chronologie -->
<symbol id="clock" viewBox="0 0 24 24">
<circle cx="12" cy="12" r="9" />
<path d="M12 7v5l3 3" />
</symbol>
<!-- book : publications, sources -->
<symbol id="book" viewBox="0 0 24 24">
<path d="M4 4h9v16H4z" />
<path d="M13 4h7v16h-7" />
<path d="M4 4a3 3 0 0 1 3 3v13" />
</symbol>
<!-- quote -->
<symbol id="quote" viewBox="0 0 24 24">
<path d="M9 6H5v6h4V8H6" />
<path d="M19 6h-4v6h4V8h-3" />
</symbol>
<!-- users : militants -->
<symbol id="users" viewBox="0 0 24 24">
<circle cx="9" cy="8" r="3" />
<path d="M3 20v-1a5 5 0 0 1 10 0v1" />
<path d="M16 6a3 3 0 0 1 0 6" />
<path d="M17 15a5 5 0 0 1 4 4v1" />
</symbol>
<!-- scale : justice, procès -->
<symbol id="scale" viewBox="0 0 24 24">
<path d="M12 3v18" />
<path d="M6 21h12" />
<path d="M4 7h16" />
<path d="M7 3l-3 8h6z" />
<path d="M17 3l3 8h-6z" />
</symbol>
<!-- memory : mémoire, héritage (flamme) -->
<symbol id="memory" viewBox="0 0 24 24">
<path d="M12 3c3 3 5 5 5 9a5 5 0 0 1-10 0c0-2 1-3 2-4 0 2 1 3 2 3-1-3 1-5 1-8z" />
</symbol>
<!-- map-pin : lieu -->
<symbol id="map-pin" viewBox="0 0 24 24">
<path d="M12 21s7-6 7-12a7 7 0 0 0-14 0c0 6 7 12 7 12z" />
<circle cx="12" cy="9" r="2.5" />
</symbol>
<!-- menu -->
<symbol id="menu" viewBox="0 0 24 24">
<path d="M4 7h16M4 12h16M4 17h16" />
</symbol>
<!-- chevron-down -->
<symbol id="chevron-down" viewBox="0 0 24 24">
<path d="M6 9l6 6 6-6" />
</symbol>
<!-- sun -->
<symbol id="sun" viewBox="0 0 24 24">
<circle cx="12" cy="12" r="4" />
<path d="M12 2v2M12 20v2M4 12H2M22 12h-2M5 5l1.5 1.5M17.5 17.5L19 19M19 5l-1.5 1.5M6.5 17.5L5 19" />
</symbol>
<!-- moon -->
<symbol id="moon" viewBox="0 0 24 24">
<path d="M20 14a8 8 0 0 1-10-10 8 8 0 1 0 10 10z" />
</symbol>
<!-- globe : langue -->
<symbol id="globe" viewBox="0 0 24 24">
<circle cx="12" cy="12" r="9" />
<path d="M3 12h18M12 3c3 3 3 15 0 18M12 3c-3 3-3 15 0 18" />
</symbol>
<!-- video : PeerTube -->
<symbol id="video" viewBox="0 0 24 24">
<rect x="3" y="6" width="12" height="12" />
<path d="M15 10l6-3v10l-6-3z" />
</symbol>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

+51
View File
@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
role="img"
viewBox="0 0 24 24"
version="1.1"
id="svg6"
sodipodi:docname="peertube.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs10" />
<sodipodi:namedview
id="namedview8"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="36.041667"
inkscape:cx="11.986127"
inkscape:cy="12"
inkscape:window-width="1920"
inkscape:window-height="1052"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg6" />
<title
id="title2">PeerTube</title>
<path
d="M12 6.545v10.91L20.727 12M3.273 12v12L12 17.455M3.273 0v12L12 6.545"
id="path4"
style="fill:#ececec;fill-opacity:1" />
<metadata
id="metadata827">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:title>PeerTube</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

+51
View File
@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
role="img"
viewBox="0 0 24 24"
version="1.1"
id="svg6"
sodipodi:docname="protonmail.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs10" />
<sodipodi:namedview
id="namedview8"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="36.041667"
inkscape:cx="11.986127"
inkscape:cy="12"
inkscape:window-width="1920"
inkscape:window-height="1052"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg6" />
<title
id="title2">Proton Mail</title>
<path
d="m15.24 8.998 3.656-3.073v15.81H2.482C1.11 21.735 0 20.609 0 19.223V6.944l7.58 6.38a2.186 2.186 0 0 0 2.871-.042l4.792-4.284h-.003zm-5.456 3.538 1.809-1.616a2.438 2.438 0 0 1-1.178-.533L.905 2.395A.552.552 0 0 0 0 2.826v2.811l8.226 6.923a1.186 1.186 0 0 0 1.558-.024zM23.871 2.463a.551.551 0 0 0-.776-.068l-3.199 2.688v16.653h1.623c1.371 0 2.481-1.127 2.481-2.513V2.824a.551.551 0 0 0-.129-.36z"
id="path4"
style="fill:#f2f2f2;fill-opacity:1" />
<metadata
id="metadata827">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:title>Proton Mail</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+45
View File
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="100px"
width="100px"
fill="#000000"
version="1.1"
x="0px"
y="0px"
viewBox="0 0 95 95"
enable-background="new 0 0 95 95"
xml:space="preserve"
id="svg4"
sodipodi:docname="soapbox.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><sodipodi:namedview
id="namedview6"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="8.65"
inkscape:cx="49.942197"
inkscape:cy="50"
inkscape:window-width="1920"
inkscape:window-height="1052"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" /><metadata
id="metadata10"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs8" /><path
d="M 94.908544,19.37409 C 94.908544,8.673974 86.234574,0 75.534459,0 64.88769,0 56.253997,8.59123 56.169077,19.217312 L 40.538068,21.307689 C 38.577252,15.301122 32.939766,10.958145 26.279956,10.958145 c -8.284207,0 -15.00172,6.716424 -15.00172,15.001721 0,6.64239 4.321202,12.266808 10.302727,14.239602 L 19.376269,56.255087 C 8.716437,56.304077 0.091456,64.955192 0.091456,75.624823 0.091456,86.324936 8.765429,95 19.465544,95 30.142797,95 38.797176,86.361955 38.83528,75.695589 l 18.092647,-2.50083 c 1.979326,5.971729 7.598302,10.285306 14.234162,10.285306 8.284204,0 15.001715,-6.716424 15.001715,-15.001719 0,-6.890622 -4.65218,-12.681619 -10.983188,-14.441019 l 1.36528,-15.339228 C 86.774584,38.167884 94.908544,29.73234 94.908544,19.37409 Z M 56.194119,67.800063 38.078608,70.305248 C 36.245174,63.882785 31.191253,58.833215 24.766611,57.005226 l 2.204694,-16.077393 c 7.712621,-0.353838 13.892294,-6.516095 14.270087,-14.222184 l 15.654962,-2.093642 c 1.894404,6.756707 7.351157,12.008781 14.22545,13.612489 l -1.365279,15.321809 c -7.400151,0.688083 -13.223811,6.753442 -13.562406,14.253758 z"
id="path2"
style="fill:#f2f2f2;fill-opacity:1;stroke-width:1.08873796" /></svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

+17
View File
@@ -0,0 +1,17 @@
{
"name": "GONG — Groupe d'Organisation Nationale de la Guadeloupe",
"short_name": "GONG",
"description": "Histoire du Groupe d'Organisation Nationale de la Guadeloupe (1963-1968) : indépendantisme, Mé 67, procès de 1968.",
"start_url": "/",
"scope": "/",
"display": "standalone",
"lang": "fr",
"dir": "ltr",
"background_color": "#0D0D0D",
"theme_color": "#0D0D0D",
"icons": [
{ "src": "/icon.png", "sizes": "192x192", "type": "image/png", "purpose": "any" },
{ "src": "/gong-logo.png", "sizes": "512x512", "type": "image/png", "purpose": "any" },
{ "src": "/gong-logo.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }
]
}
+9
View File
@@ -0,0 +1,9 @@
// Enregistrement du service worker par fichier statique, chemin ABSOLU
// (évite le ./sw.js relatif cassé sur les routes imbriquées /me-67/, /militants/…).
if ('serviceWorker' in navigator) {
window.addEventListener('load', function () {
navigator.serviceWorker.register('/sw.js', { scope: '/' }).catch(function () {
/* PWA optionnelle — échec silencieux */
});
});
}
+5
View File
@@ -0,0 +1,5 @@
User-agent: *
Allow: /
Disallow: /admin/
Sitemap: https://gong.gp/sitemap.xml
+18
View File
@@ -0,0 +1,18 @@
// Anti-FOUC — exécuté en <head> avant le premier paint (CSP script-src 'self').
// Pose .has-js et applique le thème persisté. Thème sombre = défaut d'identité GONG.
(function () {
var el = document.documentElement;
el.classList.remove('has-no-js');
el.classList.add('has-js');
try {
var pref = localStorage.getItem('gong-theme');
if (pref === 'light') {
el.classList.add('light-theme');
} else if (pref !== 'dark' && window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) {
// Aucune préférence enregistrée : respecter le réglage système clair.
el.classList.add('light-theme');
}
} catch (e) {
/* localStorage indisponible — on reste en sombre */
}
})();