From d96fb4171e7a9b960860b26208cff3e0f2f7f4db Mon Sep 17 00:00:00 2001 From: Bruno Charest Date: Mon, 7 Sep 2026 12:06:18 -0400 Subject: [PATCH] fix(editor): placeholder des blocs disparait des la frappe (input bascule .empty) La classe .empty (qui pilote les placeholders "Press 'space' for AI or '/' for commands", "Heading 1", "List", etc.) n'etait basculee qu'au render(). Pendant la frappe, l'evenement input mettait a jour dirty/autoSave mais jamais .empty : le texte d'aide restait visible sur un bloc plein. Le listener input des blocs bascule desormais .empty en direct : texte saisi -> placeholder disparait; bloc vide -> placeholder reapparait. v5.1.5 --- CHANGELOG.md | 18 +++++++++++++++++- VERSION | 2 +- app/main.py | 2 +- app/templates/_page_editor_scripts.html | 2 +- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f8ad62..e526418 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,22 @@ # Changelog — FlowDeck -## v5.1.4 (2026-09-07) — Corrections : placeholder invisible, flèches `/`, item vocabulaire, largeur AI +## v5.1.5 (2026-09-07) — Placeholder des blocs : disparaît dès la frappe + +> Les textes d'aide « Press 'space' for AI or '/' for commands », « Heading 1 », +> « List », etc. restaient affichés pendant l'édition. + +### Cause +- La classe `.empty` (qui pilote les placeholders) n'était basculée qu'au + `render()`. Pendant la frappe, l'événement `input` mettait à jour `dirty` et + `autoSave` mais **jamais** `.empty` : le texte d'aide persistait sur un bloc qui + avait pourtant du contenu. + +### Correctif +- Le listener `input` des blocs (rendu `render()`) bascule désormais `.empty` en + direct selon le contenu : dès qu'un caractère est saisi, `.empty` est retiré et + le placeholder disparaît ; quand le bloc est vidé, `.empty` revient et le + placeholder réapparaît (mécanisme identique pour les titres « Heading 1… », + listes, callout, etc.). > Résout les derniers retours UI de l'éditeur v5.1.2/5.1.3. diff --git a/VERSION b/VERSION index 76e9e61..ed95ef7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.1.4 +5.1.5 \ No newline at end of file diff --git a/app/main.py b/app/main.py index 7652367..0d7a31e 100644 --- a/app/main.py +++ b/app/main.py @@ -60,7 +60,7 @@ async def lifespan(_app: FastAPI): app = FastAPI( title="FlowDeck", - version="5.1.4", + version="5.1.5", docs_url="/docs" if settings.log_level == "DEBUG" else None, redoc_url=None, lifespan=lifespan, diff --git a/app/templates/_page_editor_scripts.html b/app/templates/_page_editor_scripts.html index 8e9be54..3b3bf4b 100644 --- a/app/templates/_page_editor_scripts.html +++ b/app/templates/_page_editor_scripts.html @@ -751,7 +751,7 @@ setTimeout(()=>{ct.querySelectorAll('.block-embed-collection').forEach(el=>{const cid=parseInt(el.id.replace('inline-db-',''));if(cid&&window.FlowDeckDB)window.FlowDeckDB.renderInto(el,cid,null);});},50); // Initialize AI Meeting Note widgets (block type 'meeting') setTimeout(()=>{ct.querySelectorAll('[data-meeting-bid]').forEach(function(el){if(window.FDMeeting)window.FDMeeting.mount(el.getAttribute('data-meeting-bid'),el);});},50); - ct.querySelectorAll('[data-bid]').forEach(el=>{el.addEventListener('input',()=>{self.dirty=true;self.autoSave();})}); + ct.querySelectorAll('[data-bid]').forEach(el=>{el.addEventListener('input',()=>{self.dirty=true;self.autoSave();if(el.hasAttribute&&el.hasAttribute('data-placeholder'))el.classList.toggle('empty',!(el.textContent||'').trim());})}); ct.querySelectorAll('[data-placeholder]').forEach(el=>{el.innerHTML=el.innerHTML.replace(/]*>/gi,'').trim()!==''?el.innerHTML:'';el.classList.toggle('empty',!el.textContent.trim());}); }, _renderKatex(el,tex){