Corrige deux régressions de /local-workspace :
- le chemin du header restait bloqué sur « Home / <workspace> » quel que
soit le dossier affiché : la route rend désormais breadcrumb_items
(Home / <workspace> / <dossier> / <sous-dossier>, niveaux cliquables,
collapse « … » au-delà de 4) et la navigation sans rechargement recalcule
le chemin via l'event flowdeck:breadcrumb-changed ;
- le clic sur un dossier du sidebar affichait TOUS les composants à la
fois : Alpine.data('wsInitData') retournait le même objet singleton, le
2e montage (navigation partielle) levait « Cannot redefine property:
\ » et initTree abandonnait, laissant tout le contenu au state
brut. La factory retourne désormais une enveloppe fraîche par montage
qui délègue à l'état réactif partagé. #lw-config est aussi relu à chaque
exécution (le 2e montage gardait le folder_id du 1er chargement).
Inclus également le travail en cours de l'arbre : Library (colonnes Last
visited/Source, ordre d'en-tête, favoris à icônes Workspace), Meeting
Notes (bloc, CSS, routes, docs), coloration de code hljs, badges
favori/publié dans l'arbre local-workspace, docs (DATA_MODEL,
architectures) et tests associés.
Le favicon était un carré bleu #2383E2 avec les lettres « FD » écrites en
<text> SVG : génériques, sans aucun lien avec la marque, et rendues avec la
police installée chez le visiteur (donc instables).
static/favicon.ico est désormais généré depuis assets/logo.jpg — la même
source que la bannière et les icônes PWA. 16/32/48 px dans un seul fichier,
un seul <link> pour tous les navigateurs, 4,1 Ko.
Pourquoi un fond sombre et pas le logo nu :
le logo est blanc à ~82 % (mesuré via Pillow — 50,7 % de blanc pur, plus
32 % de blancs proches). Posé nu, il se dissoudrait sur un onglet clair,
qui est le cas nominal de Firefox et de Safari. Il est donc posé sur un
carré #191919 arrondi, LE MÊME fond que les icônes PWA générées en
v7.69.0, ce qui garde l'identité cohérente entre onglet, écran d'accueil
et partage.
Contraste mesuré à 16 px : σ = 106 avec le fond sombre, contre σ = 49 pour
le logo seul — le fond sombre double littéralement la lisibilité à cette
taille. Le test statique verrouille les tailles embarquées dans l'ICO.
Mise à jour des 5 templates qui pointaient vers l'ancien SVG (base, import,
landing, public_page, welcome) + la liste de pré-cache du service worker.
static/favicon.svg SUPPRIMÉ : plus aucune référence dans le dépôt, le test
le vérifie pour éviter qu'il revienne.
pytest 1416 passed / 0 failed · ruff OK · OpenAPI 526 chemins / 7.69.2
- SW : le fetch event de navigation arrive en redirect:'manual' → toute 302
du serveur (logout → /auth/login) se lisait opaqueredirect (status 0) →
« bad status » → page hors ligne. networkFirst rejoue la requête en
redirect:'follow' et sert une 302 synthétique vers l'URL finale (Chromium
refuse une response 'redirected' servie à une navigation → ERR_FAILED).
timeoutFetch annule désormais réellement (AbortController branchée).
- Local workspace : _doUpload (upload/upload-folder) et toggleFavorite
n'envoyaient pas X-CSRF-Token → 403 systématique depuis A19 (derniers
appels mutants du front, balayage complet refait).
- Porte : e2e/regression_logout_dnd.spec.js (2 tests verts, joués sur
l'image rebuildée) · pytest 1094 passed · ruff OK · OpenAPI 7.45.1.