From aa88cf6665feca44e646fdaf298afa7b0f15708d Mon Sep 17 00:00:00 2001 From: Bruno Charest Date: Sat, 3 Oct 2026 00:54:28 -0400 Subject: [PATCH] fix: anti-FOUC au chargement complet (x-cloak sur .app-layout) + nettoyage (v7.45.4) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Symptôme rapporté : clic sur Home → rafale de menus/fenêtres + bande rouge « You are offline. Changes will sync when connection is restored. ». - Constat : le masquage de v7.45.3 ne couvrait QUE les swaps partiels fdLoad. Un chargement COMPLET de document (F5, première visite, navigation servie par le service worker) peignait toute l'app tant qu'Alpine n'avait pas initialisé .app-layout : sidebar brute (sections ouvertes, menu utilisateur) + zone brute dont la bande hors ligne (aucun x-cloak dessus). Le symptôme Home n'est par ailleurs PAS rejouable en navigateur frais (nav, clic Home en ligne/hors ligne, plein chargement → 0 frame de contenu brut, 0 erreur console). - Fix : x-cloak sur le nœud racine Alpine .app-layout (base.html) — sidebar + zone + bandeau masqués jusqu'au montage d'appState(), retrait par Alpine à l'init. Le probe asserte que l'attribut est bien retiré et que le node est visible en fin de parcours (garde-fou contre la page blanche). - Suppression de la classe fd-navigating (posée à chaque fdLoad, aucune règle CSS dans le dépôt → code mort). - e2e/probe_nav_perf.spec.js : 4 scénarios avec assertions (nav 5 pages, clic Home réel, Home hors ligne avec SW, plein chargement 3 pages) + capture screenshot auto si contenu brut + collecte console. Gates : probe_nav_perf 4/4 · regression_partial_nav + regression_editor_mount + regression_logout_dnd + smoke = 6 passed (errs=0 sur 7 pages × 3 passages) · pytest 1094 passed · ruff OK · OpenAPI 7.45.4. --- CHANGELOG.md | 36 ++++++++ ROADMAP.md | 3 +- VERSION | 2 +- WORKLOAD.md | 2 +- app/main.py | 2 +- app/templates/base.html | 2 +- docs/openapi-v2.json | 2 +- e2e/probe_nav_perf.spec.js | 184 ++++++++++++++++++++++++++++++++++++- static/js/app.js | 2 - 9 files changed, 223 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 688a720..44daba4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,41 @@ # Changelog - FlowDeck +## v7.45.4 (2026-10-03) — Anti-FOUC au chargement complet + morts nettoyés + +### Fixed + +- **Flashs au chargement COMPLET** (F5, première visite, navigation servie par + le service worker) : le masquage `x-cloak`/`opacity` de v7.45.3 ne couvrait + que les swaps partiels fdLoad — un chargement de document peignait la page + tant qu'Alpine n'avait pas initialisé `.app-layout`, donc sidebar brute (toutes + sections ouvertes, menu utilisateur visible) **et** contenu de la zone dont la + bande rouge « You are offline. Changes will sync when connection is + restored. » (aucun `x-cloak` sur elle). Fix : `x-cloak` sur le nœud racine + Alpine `.app-layout` (base.html) — tout l'app (sidebar + zone + bandeau) reste + masqué tant que `appState()` n'est pas monté, puis Alpine retire l'attribut. + Vérifié par le probe (3 pages × plein chargement) : 0 frame de contenu brut, + `x-cloak` retiré et `display:flex` à la fin (donc pas de page blanche). + +### Changed + +- **`fd-navigating` supprimée** : classe posée/retirée à chaque `fdLoad` mais + sans aucune règle CSS dans le dépôt (grep css/js/html → seulement app.js) — + code mort. +- **`e2e/probe_nav_perf.spec.js` étendu à 4 scénarios avec assertions** : + navigations partielles (5 pages), **clic réel sur le bouton Home**, Home avec + réseau coupé (SW actif), et plein chargement. Asserte : 0 frame de contenu + brut peint, zone révélée (`opacity:1`) et montée (`0 [x-show]` non montés, + `x-ignore` absent), `.app-layout` sans `x-cloak` et visible. Capture + screenshot automatique si du contenu brut est peint + collecte console. + +### Not reproduced + +- Le symptôme rapporté (Home → rafale de menus/fenêtres + bande rouge) n'est + **pas rejouable** dans un navigateur frais : clic Home en ligne comme hors + ligne, nav partielle et plein chargement donnent 0 frame de contenu brut et 0 + erreur console. Reste à confirmer côté navigateur signalé (recharge dure + après deploy, URL/instance testée). + ## v7.45.3 (2026-10-03) — Navigation partielle : le contenu brut n'est plus peint ### Fixed diff --git a/ROADMAP.md b/ROADMAP.md index e24a2f9..7f2548f 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1005,7 +1005,8 @@ Détails livrés : - [x] **Fix SW + CSRF uploads** (v7.45.1) — logout ne sert plus la page « hors ligne » (le fetch event de navigation est en `redirect:'manual'` → 302 lue `opaqueredirect` → rejet ; rejoué en `redirect:'follow'` + **302 synthétique vers l'URL finale**, Chromium refusant les responses `redirected` servies à une navigation) et drag & drop de fichiers/dossiers réparé (`_doUpload` + `toggleFavorite` sans `X-CSRF-Token` = oublis A19, derniers appels mutants du front). `timeoutFetch` annule enfin ses requêtes. Gate `e2e/regression_logout_dnd.spec.js` (2 tests verts). - [x] **Navigation partielle Alpine** (v7.45.2) — les swaps fdLoad initialisaient `.main-wrapper` avant l'exécution des scripts de page (courses : « Undefined variable » sur l'éditeur, `reading 'has'` sur `$store.fdCtx`, `SyntaxError: 'LW' already declared` à la 2ᵉ visite). Fix maison dans `app.js` : `x-ignore` sur la zone swapée (nœud remplacé uniquement) → démontage unique à tous ` -
+