# Notes sur le Projet Sirius en Guadeloupe
## đ Vue d'ensemble
**Version 3 (branche `svelte`)** : migration complĂšte 11ty â **SvelteKit 2 + Svelte 5 + TypeScript**, prĂ©-rendu statique intĂ©gral (`adapter-static`). Les Ăźlots deviennent des composants natifs avec fallback SSR (fin du montage manuel par `mount.js`/IntersectionObserver). L'i18n Paraglide est remplacĂ©e par un routeur maison (`src/lib/i18n/index.ts`) qui consomme **les mĂȘmes catalogues** `src/lib/i18n/{fr,en,ht}.json` (format inlang conservĂ©, Ă©ditables avec les outils inlang) : FR Ă `/`, EN `/en/`, HT `/ht/`, fallback fr automatique. Le sous-rĂ©pertoire GitHub Pages est gĂ©rĂ© nativement par `paths.base: '/gwada-sirius'` (les contournements v2 â filtre `withBase`, plugin `restorePassthroughCopy`, alias `/src` â ont disparu). La v2 (11ty) est dĂ©crite ci-dessous Ă titre historique.
**Ce qui change en v3 par rapport aux notes v2 :**
- §1 i18n : plus de compilation Paraglide â les catalogues JSON sont importĂ©s tels quels, `t(locale, key, vars?)` gĂšre le fallback htâfr.
- §2 alias `/src` : sans objet (plus de Vite-sur-sortie).
- §6 BASE_PATH : remplacé par `paths.base` en dur dans `svelte.config.js` ; liens internes via `resolve()` de `$app/paths`, assets via `%sveltekit.assets%`/`asset()`.
- Polices : dĂ©clarĂ©es une seule fois (`static/fonts/fonts.css`) â la duplication passthrough/bundle de la v2 est corrigĂ©e.
- `aria-current` : bug corrigé (comparaison pathname réel, voir `Nav.svelte`).
- Le piĂšge UTC-4 (§3) reste d'actualitĂ© : il vit dans `src/lib/dates.ts` et `SiriusPredictions.svelte` â parse par composants, jamais `new Date("YYYY-MM-DD")`.
- §5 cache : la discipline d'incrémentation de `CACHE_NAME` s'applique à `src/service-worker.js` (actuellement `gwada-sirius-v3`).
- SEO ajoutĂ© en v3 : `Seo.svelte` (canonical, hreflang Ă3, OG, Twitter), `static/robots.txt`, `static/sitemap.xml` (15 URLs).
---
## Historique â v2 (11ty)
Refonte complÚte (v2) : passage d'une SPA Vite+Svelte 4 à un site **11ty** statique avec **Svelte 5 en ßlots**, un design system CSS natif (oklch, `@layer`, container queries) et une i18n compilée (Paraglide/inlang). Conforme à la doctrine UI/UX OKI : nav à 5 entrées, fonctionne sans JavaScript pour tout le contenu éditorial, budget JS minimal.
## đïž Architecture
- **Contenu** : pages Nunjucks (`src/*.njk`), chacune paginée sur les 3 langues (`fr`/`en`/`ht`) via `pagination.data: locales`.
- **Données** : `src/_data/sites.js` (7 sites d'observation, dates interpolées Jean Meeus / Jeffrey L. Hunt), `src/_data/nav.js`, `src/_data/nextRising.js` (calculé au build).
- **i18n** : catalogues `messages/{fr,en,ht}.json`, compilés par `@inlang/paraglide-js` en `src/paraglide/` avant chaque build (`npm run messages`). `ht` retombe automatiquement sur `fr` pour les clés non traduites (contenu long, cf. portée d'origine).
- **Ălots Svelte 5** (3 seulement, le reste est HTML/CSS pur) :
- `PredictionsCalculator` â hydratation immĂ©diate, amĂ©liore le tableau statique des 7 sites
- `ObservationMap` â vraie carte Leaflet + fond OSM, marqueurs/popups pour les 7 sites, hydratation diffĂ©rĂ©e (IntersectionObserver). Leaflet est utilisĂ© directement (pas de wrapper Svelte type Sveaflet/svelte-openlayers â Ă©valuĂ©s mais Ă©cartĂ©s : le premier cible une prĂ©release de Svelte 5 et vient d'ĂȘtre publiĂ©, le second embarque OpenLayers, bien plus lourd que nĂ©cessaire pour 7 marqueurs)
- `SiriusGlobe` â vague planĂ©taire du lever hĂ©liaque (13 villes), carte canvas schĂ©matique (continents simplifiĂ©s), hydratation diffĂ©rĂ©e
- **Onglets** (Science, Dogon) : 100 % CSS (`input[type=radio]` + `label`), zéro JS.
- **Build** : `@11ty/eleventy-plugin-vite` fait passer la sortie 11ty par Vite (bundling CSS/JS, compilation Svelte). Un plugin maison recopie les assets passthrough aprĂšs le build Vite (voir commentaire dans `eleventy.config.js` â `emptyOutDir` de Vite les efface sinon).
## â ïž Points d'attention connus
1. **`` et `vite-ignore`** : Vite traite tout `` comme une référence d'asset à résoudre, y compris `rel="alternate"`/`rel="icon"`/`rel="preload"`. Un `href="/"` ou `href="/en/"` (URL de répertoire) fait planter le build (`EISDIR`, cf. issue amont). Toujours ajouter `vite-ignore` sur ces `` de métadonnées dans `layouts/base.njk`.
2. **Alias `/src`** : `eleventy-plugin-vite` fait tourner Vite avec pour racine une copie du dossier de **sortie** (`_site`), pas la racine du projet. Toute référence absolue à un fichier source (`/src/styles/app.css`, `/src/islands/.../mount.js`) nécessite l'alias `resolve.alias["/src"]` défini dans `eleventy.config.js`.
3. **Dates ISO sans heure** : `new Date("2026-07-22")` est interprĂ©tĂ© en UTC ; formatĂ© en heure locale Guadeloupe (UTC-4), ça peut reculer d'un jour. Toujours parser les composants (`year, month, day`) et construire la date en local â voir le filtre `formatDate` et `PredictionsCalculator.svelte`.
4. **Slinkity est abandonné** (son créateur travaille sur Astro) : ne pas l'utiliser pour l'intégration 11ty+Svelte, `eleventy-plugin-vite` (officiel) est la voie robuste.
5. **Service worker et cache obsolÚte** : la stratégie stale-while-revalidate de `public/sw.js` peut servir une version périmée des ßlots (vécu pendant le debug de la carte : un visiteur déjà passé sur le site voyait l'ancien composant malgré un déploiement). **Toujours incrémenter `CACHE_NAME` dans `sw.js`** quand un ßlot ou un asset critique change, sinon les visiteurs récurrents restent bloqués sur l'ancienne version jusqu'à revalidation.
6. **GitHub Pages = sous-rĂ©pertoire, pas la racine du domaine** : `https://cyber-mawonaj.github.io/gwada-sirius/` sert le site sous `/gwada-sirius/`, pas `/`. Tous les chemins absolus (`/assets/...`, `/favicon.svg`, liens de nav, `sw.js`) doivent donc ĂȘtre prĂ©fixĂ©s. GĂ©rĂ© via la variable d'env `BASE_PATH` (vide en local/domaine perso, `/gwada-sirius` en CI â voir `.github/workflows/deploy.yml`) : passĂ©e Ă `viteOptions.base` pour les assets bundlĂ©s par Vite, et au filtre maison `withBase`/`localeHref` pour les liens et fichiers passthrough. Le manifest PWA utilise des chemins **relatifs** (`"start_url": "."`) pour ne pas avoir besoin d'ĂȘtre templatĂ©. Pour retester ce scĂ©nario en local : `BASE_PATH=/gwada-sirius npm run build`, puis servir `_site` depuis un dossier `gwada-sirius/` Ă la racine d'un serveur statique.
## đ AmĂ©liorations possibles
- Traduire le contenu long en KreyĂČl (actuellement chrome/labels uniquement, contenu de fond en français)
- Mettre à jour chaque année les informations d'événements associatifs (`associations.njk`, données à vérifier auprÚs des organisateurs)
- Le chunk Leaflet (~44 Ko gzip) n'est chargé qu'au scroll sur la carte (`observer/`), mais reste le plus lourd du site ; envisager des tuiles vectorielles/un fournisseur plus léger si le budget JS devient un problÚme
## đŠ Build pour production
```bash
npm run build
# Sortie dans _site/
```
## đ DĂ©ploiement
GitHub Pages via `.github/workflows/deploy.yml` (upload de `_site/`), déclenché sur push vers `main`.