- Join screen utilise le design V2 (app-mark paper-grid, Fredoka, palette V2)
- Fix : parentElement null avant mount → wrappers séparés pour toggle join/create
- try-catch sur le rendu des vues pour capturer les erreurs silencieuses
- try-catch autour du switch de rendu pour capturer les erreurs silencieuses
- Nav flottante V2 vérifiée sur émulateur : bouton Plus accessible au-dessus de la barre système
- Settings page fonctionne (thème, serveur, session, identité visuelle)
- Nav : label 'Paramètres' → 'Plus' (débordait dans la grille)
- Tempête : tourbillon CSS animé (2 anneaux + noyau) au lieu d'un radial-gradient moche
- Fin du monde : champignon nucléaire CSS avec glow, plus lisible
- Gradient hero tempête aligné sur la nouvelle illustration
- Seed : plus de membres fictifs, seuls les vrais apparaissent
- Panel admin centralise TOUT :
- Flash info du jour
- Édition de la classe (nom + niveau)
- Gestion des évaluations (liste, ajout, modification, suppression)
- Météo par jour (override admin avec bouton forcé/auto)
- Gestion des membres (promotion/rétrogradation)
- Formulaire d'évaluation complet (matière, prof, salle, chapitre, date, heure, durée, coeff, note)
- Modale météo par jour (soleil, brouillard, vent, orage, tempête)
- joinClass : si aucun admin 'réel' (is_creator=0) n'existe, le nouveau membre est admin
- Seed : ne crée plus de membre admin — la première personne qui rejoint gère la classe
- Régression : 'Mathis' rejoignant TERMS2 devient admin au lieu d'élève
- v0.4.1
- joinClass vérifie si un membre porte déjà ce pseudo dans la classe
- Si oui : nouveau jeton + retourne le rôle existant (admin conservé)
- Si non : création d'un nouvel élève
- L'admin peut se reconnecter avec son pseudo pour retrouver ses droits
- SW v3 : network-first sur index.html (plus de cache périmé)
- Assets versionnés (hash) : cache-first
- index.html : auto-update du SW + rechargement quand une nouvelle version prend le contrôle
- Résout le 'Unable to open asset URL' (référence à un JS/CSS qui n'existe plus)
- @capacitor/filesystem : téléchargement natif de l'APK (OkHttp)
- @capawesome-team/capacitor-file-opener : ouverture de l'installateur Android
- L'APK est écrit dans le cache de l'app puis ouvert via un Intent natif
- Plus de passage par le navigateur — tout se passe dans l'app
- file_paths.xml mis à jour pour couvrir le cache
- DB : colonne is_creator sur members + migration automatique
- API : GET /api/config/members (liste admin), PATCH /api/config/members/:id (rôle)
- Règles : créateur non rétrogradable, admin non auto-rétrogradable, dernier admin protégé
- Front : panneau 'Membres de la classe' dans l'onglet Plus (admin)
- Chaque membre affiche son badge (Créateur / Admin / Élève) + boutons promote/demote
- Server : GET /api/version (version + APK URL + taille), GET /download/latest.apk
- Server : releases/latest.apk servi avec Content-Type APK
- Web : checkForUpdate() compare version locale vs serveur au démarrage
- Web : modale de mise à jour (télécharger + installer, ou plus tard)
- Web : version affichée dans l'onglet Plus
- Vite : __APP_VERSION__ injecté au build depuis shared/APP_VERSION
- Workflow : bump APP_VERSION → build APK → copier vers server/releases/latest.apk
- DB : table day_weather (override admin par jour), flash_message sur classes
- API : PUT/DELETE /api/config/day-weather, PUT /api/config/flash, PATCH /api/config/class
- SSE : day_weather.updated/deleted, flash.updated, class.updated
- Front : bandeau flash info, indicateur 'forcé' sur la frise, modale météo admin
- Onglet Plus : panneau admin (flash info + édition classe), tout admin modifiable
- PWA : manifest.webmanifest, service worker, meta Apple, icônes 192/512
- Web version accessible sur iOS via Safari (Ajouter à l'écran d'accueil)