# 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)** : ```css :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 `