# Changelog - FlowDeck ## v7.51.0 (2026-10-06) — Menu + de l'assistant : hub de contexte (phase 1/8) ### Added - **Menu à sections sur le bouton +** (`agent_panel.html` + `agent_panel_2.js`) : le + ouvre *Ajouter des fichiers ou répertoires*, *Compétences-skills*, *Connecteurs*, *Design System – Canevas*, *Add plugins*, *Mémoire (on/off)*. Sections pas encore livrées affichées « bientôt (phase N) » et **désactivées** (décision D3 : le menu ne promet rien que le code ne fait). Navigation clavier ↑/↓/Entrée/Échap, focus visible, Échap revient d'un niveau. - **Parcours fichiers & répertoires** — « Parcourir… » affiche un niveau à la fois via `/api/nav/menu` (contrat : dossier = `icon === 'folder'`) avec fil d'Ariane cliquable ; un document s'épingle (`document:`), un dossier s'épingle depuis la ligne « 📌 Épingler le dossier » (`folder:`). - **Jeton `folder:`** résolu par `ContextBuilder._mentions_context` : titre du dossier + documents directs, budget ~12k caractères (marqueur « contenu du dossier tronqué »). Enfants directs seulement — récursion à ajouter si les arbres profonds deviennent réels. - **« Rechercher… »** conserve l'ancien sélecteur de mentions (recherche par nom, `@` inline) à l'identique : zéro régression du chemin existant. ### Tests - `tests/test_v751_plus_menu.py` — **7 tests** : résolution du dossier, budget borné, id inconnu, contrat `/api/nav/menu`, rendu du menu dans la page, 6 sections dont 5 désactivées, jeton `folder:` côté front et côté backend. - **Suite complète : 1273 passed / 0 failed** (`-n auto`), `ruff check app tests` propre, `eslint static/js` **0 erreur**. ## v7.50.2 (2026-10-06) — Peek de Library : nu comme local-workspace (plus de bande ni double scrollbar) ### Fixed - **Le document ouvert par le bouton « Open » de Library n'occupait pas le panneau** — `.peek-body` gardait un `padding:16px 20px` + `overflow-y:auto` (héritage de l'ancien peek à rendu HTML) : l'iframe était amochée (519×816 mesurés contre 559×848 en local-workspace) avec une bande grise autour du document et une double scrollbar. Corps nu (`padding:0`, `overflow:hidden`) : l'éditeur remplit le panneau, exactement comme le peek « parfait » de /local-workspace (mesuré Playwright, cookie de session forgé). ### Tests - `test_library_peek_body_has_no_inset_padding`. Suite 1266 passed / 0 failed (-n auto) + ruff 0. ## v7.50.1 (2026-10-06) — Peek des bases : le contenu se rend enfin + tableau pleine largeur ### Fixed - **Une base ouverte en side peek restait à « Loading database… »** — `page_editor_embed.html` (le peek de `/pages/{id}?embed=1`) n'incluait pas `database_table.js` : `window.FlowDeckDB` était undefined dans l'iframe et le bloc `embed/collection` ne s'hydrat jamais. Inclus désormais (même traitement que `page_editor.html`). - **L'icône « Open » de fin de ligne d'un tableau de base ne faisait rien hors page dédiée** — le panneau `#db-side-peek` n'existait que dans le markup de `_database_table.html` ; sans lui, `openPageInSidePeek` était un no-op. Le panneau est créé à la demande par `database_table.js` (`ensureDbPeek`, comme `mt-peek` de My Tasks) : markup unique, le partial ne contient plus le panneau statique. - **Barre de scroll sous le tableau des bases** — `.database-table-container` plafonnait à 1100 px (règle héritée de Library) : le tableau ne prenait pas la largeur du document. Plafond retiré ; `max-width: 100%` aussi pour les conteneurs `.db-first` (base embarquée en premier bloc) et le titre des pages de base — les colonnes dictent seules le scroll horizontal. ### Tests - `test_embed_editor_can_render_inline_databases` (include peek + panneau créé à la demande, source unique de markup). Suite 1265 passed / 0 failed (-n auto) + ruff 0. ## v7.50.0 (2026-10-06) — Side peek : le document seul (mode édition), sans sidebar ni barre ### Fixed - **Tous les boutons « Open » ouvraient l'habillage pleine page dans le panneau latéral** — `library.js` (OPEN de hover), `local_workspace.js` (↢ Open + « Open in side peek » du menu contextuel) et `my_tasks.js` (peek des tâches) chargeaient `/pages/{id}` SANS `?embed=1` : le peek affichait sidebar + barre de navigation + éditeur (régression v7.49.0). Tous repassent en `/pages/{id}?embed=1` = le document en mode édition SEUL ; le cadre du panneau (garde/close/resize partagés `fdWirePeekResize`) reste identique. - **Le bouton « Open » du calendrier My Tasks ne faisait rien** — cause racine : le handler de clic testait `e.target.dataset.openRow`, mais les boutons `.mt-cal-open` du calendrier (et du Kanban) ne contiennent que leur `` : cliquer l'icône donnait `e.target` = `` sans dataset. Le handler résout désormais `t.closest('[data-open-row]')` — un seul chemin pour tableau, calendrier (5 vues) et Kanban. - **Menu contextuel global « Open in side peek »** — le clic ne faisait qu'afficher « Side peek not available in browser » : il route maintenant vers le peek de la page courante (`_libData.openPeekById` en Library, `_wsData.openSidePeek` en workspace local), repli nouvel onglet ailleurs. - **Peek d'une page de base (`content_format='collection'`)** — `?embed=1` forçait le template éditeur : une base ouverte dans le peek montrait un éditeur de blocs vide au lieu du tableau. Le template collection est gardé en mode embed (body.embed-mode retire sidebar + barre, le tableau reste). ### Added - **Bouton « Open » sur les tuiles du Kanban My Tasks** — le même que les lignes du tableau (`openButton(t)`, `.mt-hover-only` révélé au survol de la carte, overlay absolu pour ne pas déformer la tuile) ; ouvre le contenu de la tâche dans le panneau latéral. - **Bouton « pleine page » des peeks de bases** — navigue vers `/pages/{pageId}` (pleine page, sidebar + barre conservées) au lieu de l'URL `?embed=1` de l'iframe ; `dataset.page` porte l'id résolu. ### Tests - `test_my_tasks_workspace_coherence.py` : les 4 peek JS (`library`, `my_tasks`, `database_table`, `local_workspace`) doivent porter `?embed=1` (gate de cohérence inversé — l'ancien test imposait l'URL nue) ; nouveaux : résolution `closest('[data-open-row]')`, bouton Open sur tuiles Kanban, collection embed = tableau. Suite 1264 passed / 0 failed (-n auto) + ruff 0. ## v7.49.2 (2026-10-05) — Pages de base : titre au-dessus, tableau à gauche ### Fixed - **Le tableau d'une page de base commençait au 1/3 de la page** — une base créée depuis un document est un bloc `embed collection` rendu dans la colonne éditeur `.blocks-container` (`max-width: 900px; margin: 0 auto`) : centrée sur un grand écran, donc décalée loin du sidebar (mesuré x=694 sur 1920 px). Nouvelle classe `.db-first` sur le wrapper éditeur quand le premier bloc est une base : titre et blocs passent à `margin: 0` + `padding-left: var(--space-lg)` (liseré de la topbar) — tableau au ras du sidebar (x=256 mesuré), titre au-dessus, plus de débordement de l'embed (`max-width: 100%`, le scroll horizontal reste géré par `.db-table-wrapper`). - **Les pages de base dédiées (`content_format='collection'`) n'avaient pas de titre** — `page_editor_collection.html` rend le tableau sans en-tête de page. Un `

` est ajouté au-dessus du conteneur, avec le même liseré gauche que le tableau. ## v7.49.1 (2026-10-05) — Tableau des bases aligné sur le titre ### Fixed - **Le tableau d'une page de base était décalé sous le titre** — le conteneur `.database-table-container` avait `padding: 0 24px` tandis que la topbar (fil d'Ariane/titre) est à `var(--space-lg)` = 16 px : deux marges gauches différentes. Le conteneur passe à la même valeur que la topbar, `margin: 0` conservé — le bord gauche du tableau s'aligne désormais au ras du titre et de la marge. ## v7.49.0 (2026-10-05) — Side peek : l'éditeur plein écran, et un calendrier complet ### Added - **Calendrier My Tasks : cinq vues** — Mois, Année, Semaine, Jour et Planning, avec une navigation propre à chaque granularité (`←` / `→` et « Aujourd'hui » se recalculent : par exemple 5 – 11 octobre → 12 – 18 octobre en semaine, ou un jour en année). L'Année affiche les douze mini-mois de l'année courante et le Planning une ligne par jour avec ses tâches réparties par statut. - **Icône d'ouverture sur chaque tâche du calendrier** — même bouton « Open in side peek » que le tableau, révélé au survol. Elle porte le même attribut de ligne (`data-open-row`), donc un seul gestionnaire de clic pour toutes les vues : le titre est transmis par `data-open-title`, disponible là où il n'y a pas de ligne `.mt-row` (vues Jour, Semaine et Année). ### Fixed - **Impossible d'ajuster la largeur du side peek des bases** — le panneau avait été réécrit en bindings Alpine (`:class="dbPeekOpen"`, `@click.outside`) alors que le conteneur n'a aucun `x-data` : bindings inertes, `openPageInSidePeek` passait par `container.__x.$data` (undefined), le panneau ne s'ouvrait pas et la poignée de redimensionnement ne réagissait pas. Repassé en vanilla JS (câblage direct sur le document, repli discret pour les collections embarquées inline). Au passage : les quatre implémentations dupliquées du drag de largeur (Library, workspace local, My Tasks, bases) sont remplacées par un helper unique `window.fdWirePeekResize` (`app.js`) — pointer capture, borne 300 px–90 vw, clic = fermer, largeur persistée (`fd_peek_width`) et commune à tous les peeks, restaurée au chargement. My Tasks ne capturait ni le pointeur ni la largeur : son drag était erratique et non mémorisé. - **Largeur des pages standardisée sur celle de Library (1100 px)** — le conteneur des bases (`.database-table-container`) passe à `margin: 0` : le tableau est collé à gauche, au ras de la marge, au lieu d'être centré dans la page. `/trash` utilisait la classe `.lib-container` dont la règle vivait dans le `