feat(session-1): socle SvelteKit et encyclopédie /zerbaj/ prérendue

SvelteKit 2 + Svelte 5 runes + TS strict, adapter-static en prérendu
intégral, trailingSlash always, paths.relative false.

Mesures de la porte de sortie
- 56 pages HTML prérendues (13 fiches × 3 langues + pages de service)
- 59 Ko de JS gzip (budget : 170) · build total 1,4 Mo (budget : 2 Mo)
- 0 chargement tiers, vérifié par grep du build
- fiche lisible sans JS : 1694 caractères de texte rendu
- npm run check : 248 fichiers, 0 erreur, 0 warning
- 0 erreur console au chargement
Lighthouse non exécuté : porte encore ouverte, à vérifier avant la S6.

Charte OKI
Tokens partagés, thème sombre par défaut, Archivo et Inter self-hébergées
(124 Ko de woff2), flag-bar à segments francs, bouton à balayage or,
gate prefers-reduced-motion unique. CSP stricte en .htaccess et _headers,
404 statique autonome, PWA avec registerSW à chemin absolu (playbook 2.9).

L'interface kréyòl n'est pas écrite par l'agent
Le catalogue gcf ne contient que les termes venant des documents du
porteur — 10 chaînes sur 132. Le reste vaut null et se replie sur le
français ; check:i18n produit la liste des 122 phrases à traduire, par
écran. <html lang> annonce la langue réellement écrite : fr tant que la
couverture reste sous 60 %, avec les fragments kréyòl marqués un par un.
Des tournures kréyòl que j'avais inventées ont été retirées.

Corrections en cours de build
- vite-plugin-pwa/sveltekit n'existe pas sans @vite-pwa/sveltekit :
  VitePWA en direct, comme le prescrivait déjà le playbook.
- @sveltejs/vite-plugin-svelte v7 n'exporte plus sveltekit : import
  depuis @sveltejs/kit/vite, vérifié sur les exports réels.
- Le sélecteur de langue fabriquait /fr/offline/, page inexistante.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
OKI
2026-07-27 11:44:21 -04:00
co-authored by Claude Opus 5
parent 8cba5adfa5
commit ccad7177b3
58 changed files with 9946 additions and 3 deletions
+34
View File
@@ -0,0 +1,34 @@
import { sveltekit } from '@sveltejs/kit/vite';
import { VitePWA } from 'vite-plugin-pwa';
import { defineConfig } from 'vite';
export default defineConfig({
plugins: [
sveltekit(),
// `VitePWA` directement, et non `@vite-pwa/sveltekit` : le playbook §2.9 impose
// l'enregistrement par fichier statique, l'intégration n'apporterait rien de plus
// et ajouterait une dépendance.
VitePWA({
registerType: 'autoUpdate',
// Enregistrement par fichier statique (playbook §2.9) : l'injection du plugin
// n'atteint pas le HTML prérendu et produit un chemin relatif cassé sur les
// routes imbriquées comme /fr/zerbaj/kowosol/.
injectRegister: false,
manifest: false,
workbox: {
globPatterns: ['**/*.{js,css,html,woff2,svg,webp,avif,png,opus}'],
navigateFallback: '/offline/index.html',
navigateFallbackDenylist: [/\.(?:png|jpg|jpeg|svg|webp|avif|woff2|opus)$/],
maximumFileSizeToCacheInBytes: 3 * 1024 * 1024,
cleanupOutdatedCaches: true,
clientsClaim: true,
skipWaiting: true
}
})
],
server: { fs: { strict: true } },
build: {
// Un budget se surveille : Vite prévient au-delà, on ne le découvre pas en production.
chunkSizeWarningLimit: 170
}
});