Snapshot de l'existant avant application du playbook OKI : background shader Three.js, carte graphe 3D, timeline statique.
11 KiB
Prompt : Migration "Le Grand Atlas du Fédiverse" vers PWA SvelteKit
Ce prompt est destiné a Kimi CLI. Il transforme le projet "Le Grand Atlas du Fédiverse v4.0" (actuellement React + Vite + Tailwind) en PWA SvelteKit 2 + Svelte 5, en respectant integralement la doctrine UI/UX OKI (document "UI UX souveraine Fondements.md").
1. CONTEXTE DU PROJET
Le projet est une cartographie interactive du Fediverse (reseau social decentralise) :
- Site web : https://vhgsr7e3fioam.kimi.page (reference visuelle)
- Donnees : 105 logiciels, 12 protocoles, 14 categories, chronologie 2008-2026, ponts Nostr-ActivityPub
- Pages : Accueil (hero shader + graphe 3D + timeline + catalogue + protocoles), page Nostr dediee, page SimpleX dediee
- Stack actuelle : React 19 + Vite + Tailwind CSS + shadcn/ui + Three.js + D3 (a migrer)
- Licence : CC BY-SA 4.0
- Langue : Francais (avec preparation pour bilinguisme FR/créole)
2. STACK CIBLE (OBLIGATOIRE — non negociable)
Svelte 5 (runes : $state, $derived, $effect)
SvelteKit 2 (SSR par defaut, adapter-static pour PWA)
CSS natif sur design tokens (PAS Tailwind, PAS shadcn, PAS framework CSS)
Three.js + D3 (conserves pour le graphe 3D — lazy loaded)
Bits UI ou Melt UI (headless uniquement — comportement + ARIA, pas de styles imposes)
Pourquoi pas Tailwind : redondant avec CSS scopé Svelte, disperse le design system dans les templates, court-circuite la comprehension de la cascade. Voir doctrine OKI §5.2.
3. ARCHITECTURE CSS (OBLIGATOIRE)
src/styles/
tokens.css /* custom properties oklch, typo fluide clamp(), espacements */
reset.css /* reset moderne minimal */
base.css /* HTML semantique, focus visible */
layouts.css /* .stack, .cluster, .sidebar, .center (Every Layout) */
themes/
default.css /* tokens couleurs du projet */
src/app.css /* @layer reset, tokens, base, layouts, components, utilities */
Tokens couleurs (oklch, methodologie modus-vivendi) :
:root {
color-scheme: light dark;
--ink: light-dark(oklch(22% 0.02 260), oklch(92% 0.01 260));
--surface: light-dark(oklch(98% 0.005 90), oklch(15% 0.02 260));
--surface-2: light-dark(oklch(95% 0.01 90), oklch(20% 0.02 260));
--accent: oklch(55% 0.2 350); /* rose coral #F72585 */
--accent-2: oklch(70% 0.15 250); /* bleu #4CC9F0 */
--accent-3: oklch(65% 0.18 80); /* orange Nostr #F7931A */
--accent-4: oklch(70% 0.15 160); /* vert SimpleX #06D6A0 */
--muted: oklch(70% 0.02 260);
--tap-target: 48px;
--measure: 65ch;
--text-1: clamp(1rem, 0.95rem + 0.4vw, 1.125rem);
--text-2: clamp(1.25rem, 1.1rem + 0.6vw, 1.5rem);
--text-3: clamp(1.5rem, 1.3rem + 1vw, 2rem);
--text-4: clamp(2rem, 1.8rem + 1.2vw, 3rem);
--space-1: 0.25rem; --space-2: 0.5rem; --space-3: 1rem;
--space-4: 1.5rem; --space-5: 2.5rem; --space-6: 4rem;
}
Chaque composant Svelte utilise <style> scopé et consomme les tokens — jamais de valeur brute.
4. STRUCTURE SVELTEKIT
src/
routes/
+page.svelte /* Accueil : hero + sections */
+page.ts /* prerender = true */
nostr/
+page.svelte
simplex/
+page.svelte
data/
+server.ts /* API JSON pour les donnees */
lib/
components/
Header.svelte
Footer.svelte
HeroShader.svelte /* Shader WebGL ocean */
NetworkGraph.svelte /* Graphe 3D Three.js + D3 */
Timeline.svelte /* Chronologie */
SoftwareCatalog.svelte /* Catalogue filtrable */
ProtocolSection.svelte /* Protocoles */
ProtocolStream.svelte /* Data stream animé */
data/
fediverse.ts /* 105 logiciels, protocoles, categories */
timeline.ts /* 30 evenements 2008-2026 */
bridges.ts /* Ponts Nostr-AP */
styles/
tokens.css, reset.css, base.css, layouts.css
app.html
app.css
service-worker.ts /* PWA offline-first */
static/
manifest.json /* Web App Manifest */
icons/ /* 192x192, 512x512 */
5. PWA OFFLINE-FIRST (OBLIGATOIRE)
// src/service-worker.ts
// Strategy : Cache-First pour les assets statiques
// Network-First pour les donnees JSON
// File d'attente pour les actions hors-ligne
- Service Worker : cache les pages visitées, les donnees JSON, les assets statiques
- Manifest :
name: "Atlas Fediverse",short_name: "Atlas",display: standalone,theme_color: #001219 - Icons : generer a partir du SVG logo (globe + couleurs du projet)
- Offline : le catalogue et les pages Nostr/SimpleX doivent fonctionner hors-ligne apres premiere visite
- Installable : bouton "Installer" dans le header si beforeinstallprompt disponible
6. PERFORMANCE (OBLIGATOIRE — seuils a respecter)
| Métrique | Seuil |
|---|---|
| JS initial | < 100 Ko compressé (Three.js lazy loaded) |
| CSS total | < 50 Ko |
| Page totale | < 500 Ko |
| Premier rendu | < 3s en Slow 4G |
| Interactions | < 400 ms (skeleton screens si > 1s) |
| Polices | ≤ 2 fichiers WOFF2, auto-hebergees, font-display: swap |
Lazy loading : Three.js et D3 ne chargent que sur la route / (graphe 3D). Pages Nostr et SimpleX n'embarquent pas Three.js.
7. ACCESSIBILITÉ (OBLIGATOIRE — WCAG 2.2 AA minimum)
- Contraste 4.5:1 texte courant, 3:1 grand texte (palette oklch calculée)
- Information jamais portee par la couleur seule (doubler par icone/texte/forme)
prefers-color-scheme,prefers-reduced-motion,prefers-contrastrespectes- Tout en
rem, jamais defont-sizeenpxsurhtml - HTML semantique : landmarks, hiérarchie titres,
<button>pour actions - Focus visible sur tous les elements interactifs
- Ordre de tabulation logique
- Navigation clavier complete (desktop) :
?pour raccourcis,/pour recherche
8. DOCTRINE MOBILE-FIRST (OBLIGATOIRE)
- Actions primaires dans le tiers inferieur (barre de nav basse si justifiée)
- Cibles tactiles ≥ 48 px, espacement ≥ 8 px, corps ≥ 16 px
- Une colonne, un flux : pas de multi-colonnes sur mobile
- Valeur livree en < 5 secondes par ecran
- Reprennabilite : etat sauvegarde (filtres catalogue, position scroll)
- Frugalite data : lazy loading, AVIF/WebP, pas de police web au-dela de 2 fichiers
9. ÉTHIQUE ATTENTIONNELLE (OBLIGATOIRE — calm technology)
- Pagination ou marqueur "vous etes a jour" dans les listes (PAS de scroll infini)
- Notifications : actionnables uniquement, jamais de re-engagement artificiel
- Pas de compteurs anxiogenes masques/optionnels uniquement
- Pas de dark patterns
- Points d'arret naturels dans les flux
10. DONNÉES (reutiliser telles quelles)
Les fichiers de donnees du projet actuel sont dans /public/data/ :
fediverse.json: 105 logiciels + protocoles + categoriessoftware.json,protocols.json,categories.json,network.json
Les importer comme modules JSON dans SvelteKit (import data from './data.json' assert { type: 'json' }).
11. FEATURES A CONSERVER (parité fonctionnelle)
Page d'accueil (/)
- Hero : Shader WebGL ocean (Le réseau social, sans les chaînes) + CTA "Plonger"
- Graphe 3D : Three.js + D3-force, 105 noeuds colorés par categorie, survol tooltip, filtres par categorie
- Timeline : Chronologie verticale 2008-2026, filtres par type, alternance gauche/droite
- Catalogue : Grille logiciels, recherche instantanee, filtres categorie/statut, modal detail
- Protocoles : 12 protocoles en cartes, data stream animé en fond
Page Nostr (/nostr)
- Hero, comment ca marche (3 etapes), 6 features, 15 clients, tableau comparatif AP vs Nostr
Page SimpleX (/simplex)
- Hero, 3 etapes, 8 features, tableau comparatif (SimpleX vs Signal vs WhatsApp vs Matrix), cas d'usage
Global
- Header fixe glassmorphism avec nav + liens Nostr/SimpleX
- Footer avec credits CC BY-SA 4.0
- Telechargement des donnees JSON / YAML
- Infographie SVG/PDF telechargeable
12. FEATURES A AJOUTER
- Bouton installer PWA dans le header (detecter beforeinstallprompt)
- Indicateur offline discret quand pas de connexion
- Marqueur "vous etes a jour" en fin de catalogue (ethique attentionnelle)
- Raccourcis clavier :
/recherche,?aide,j/knavigation catalogue - Preparation i18n : structure de cles pour FR et créole (creole guadeloupeen)
13. STEPS D'IMPLEMENTATION (ordre)
- Init :
npm create svelte@latest atlas-fediverse→ skeleton → TypeScript, ESLint, Prettier, Vitest - Config :
svelte.config.jsavecadapter-static, prerender all routes - Styles : Creer
src/styles/(tokens, reset, base, layouts) +app.cssavec@layer - Data : Copier les fichiers de donnees JSON dans
src/lib/data/, importer comme modules - Layout :
+layout.svelteavec Header + Footer, slot pour le contenu - Accueil : Sections hero (sans shader d'abord), protocoles, timeline, catalogue
- Graphe 3D : Migrer NetworkGraph (Three.js + D3) — lazy loaded via
await import() - Shader : Migrer HeroShader (Three.js) — lazy loaded
- Pages : Nostr + SimpleX
- PWA : service-worker.ts, manifest.json, icons
- Polish : accessibilite, raccourcis clavier, reduced-motion, offline indicator
- Build :
npm run build→ verifiez les seuils perf (JS < 100Ko, page < 500Ko)
14. VERIFICATION FINALE (checklist doctrine OKI)
Avant de livrer, verifier :
- Pas de Tailwind, pas de shadcn, pas de framework CSS — CSS natif + tokens uniquement
- Svelte 5 runes utilises ($state, $derived, $effect) — pas de syntaxe Svelte 4
- Service Worker fonctionnel, PWA installable, offline-first
- JS initial < 100 Ko (sans Three.js qui est lazy loaded)
- Page totale < 500 Ko
- Contraste WCAG 2.2 AA verifie sur tous les textes
- prefers-reduced-motion, prefers-color-scheme, prefers-contrast gérés
- Navigation clavier complete
- Cibles tactiles ≥ 48 px
- Pas de scroll infini — pagination ou marqueur de fin
- Polices auto-hebergees ≤ 2 fichiers WOFF2
- Container queries pour le responsive des composants (pas seulement media queries)
- Fonctionne a 50% de largeur d'ecran (multi-fenêtrage desktop)
NOTES POUR KIMI CLI
- Le projet actuel est accessible sur https://vhgsr7e3fioam.kimi.page pour reference visuelle
- Les donnees JSON sont telechargeables depuis https://vhgsr7e3fioam.kimi.page/data/fediverse.json
- Le code source React actuel est dans
/mnt/agents/output/app/src/(reference pour les donnees et la logique, mais PAS pour le style — tout le CSS est a recrire selon la doctrine) - Le graphe 3D et le shader sont les composants les plus complexes — les migrer en dernier
- Priorite : fonctionnel + beau + performant + accessible, dans cet ordre
- Ne pas hesiter a simplifier visuellement si necessaire pour respecter les budgets perf