fix(document): vijf visuele-editorbugs — frontmatter, plakken, tabelbalk, overzicht, zoeken #2144

Merged
brenno merged 8 commits from fix/visual-editor-bugs into main 2026-09-20 23:36:22 +00:00
Owner

Samenvatting

Vijf openstaande editorbugs, één commit per probleem:

  • #2142 — Opslaan vanuit Visueel dupliceerde het frontmatter in de body: splitDocumentFrontMatter houdt het blok nu buiten de save-patch.
  • #2138 — Plakken in visuele documentmodus voegde een blok onder de regel in i.p.v. op de caret: inline tekst gaat nu via de Quill-caret (caret vóór de async klembordlezing gevangen, actieve selectie wordt vervangen).
  • #2140 — De tabelwerkbalk verdween onder de cursor bij rij toevoegen op desktop: holdActiveCell houdt de cel nu vast via pointerRouter tot pointer-up/cancel, niet één frame.
  • #2141 — De overzicht-markering flippte door twee concurrerende caret-berekeningen: in Visueel is de Quill-caret nu leidend en synchroniseert de broncontroller niet meer mee.
  • #2137 — Zoeken/vervangen telde en herschreef onzichtbare Markdown (link-doelen, comments, code, voetnootmarkeringen): treffers in machinesyntax worden gemaskeerd en overgeslagen.

Plus één refactor-commit die plak- en dialoogpaden uit de staat-klasse haalt (conventie-ratchets).

Testplan

  • make check groen (format, analyze, conventies, volledige suite 11838 tests, dekkingsvloer, goldens)
  • make check-secrets — geen vondsten
  • make sast — 0 findings
  • Per fix een regressietest die rood is zonder de wijziging en groen ermee

Fixes #2142, fixes #2141, fixes #2140, fixes #2138, fixes #2137.

## Samenvatting Vijf openstaande editorbugs, één commit per probleem: - **#2142** — Opslaan vanuit Visueel dupliceerde het frontmatter in de body: `splitDocumentFrontMatter` houdt het blok nu buiten de save-patch. - **#2138** — Plakken in visuele documentmodus voegde een blok onder de regel in i.p.v. op de caret: inline tekst gaat nu via de Quill-caret (caret vóór de async klembordlezing gevangen, actieve selectie wordt vervangen). - **#2140** — De tabelwerkbalk verdween onder de cursor bij rij toevoegen op desktop: `holdActiveCell` houdt de cel nu vast via `pointerRouter` tot pointer-up/cancel, niet één frame. - **#2141** — De overzicht-markering flippte door twee concurrerende caret-berekeningen: in Visueel is de Quill-caret nu leidend en synchroniseert de broncontroller niet meer mee. - **#2137** — Zoeken/vervangen telde en herschreef onzichtbare Markdown (link-doelen, comments, code, voetnootmarkeringen): treffers in machinesyntax worden gemaskeerd en overgeslagen. Plus één refactor-commit die plak- en dialoogpaden uit de staat-klasse haalt (conventie-ratchets). ## Testplan - [x] `make check` groen (format, analyze, conventies, volledige suite 11838 tests, dekkingsvloer, goldens) - [x] `make check-secrets` — geen vondsten - [x] `make sast` — 0 findings - [x] Per fix een regressietest die rood is zonder de wijziging en groen ermee Fixes #2142, fixes #2141, fixes #2140, fixes #2138, fixes #2137.
De baseline van _patchVisualSave liep over de hele bron inclusief het
frontmatter-blok. De Quill-codec kent geen YAML en las 'theme: rvs\n---'
als setext-kop, waarna de regel-diff het frontmatter-verschil als een
gebruikersbewerking midden in de body plantte — zichtbaar als gelekte
theme:/--- regels na Opslaan vanuit Visueel.

Splits het blok met splitDocumentFrontMatter vóór de patch en neem het
huidige blok terug in het resultaat, zodat ook een tussentijdse
stijl-/TLP-wijziging de opslag overleeft.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
De slimme-plakroute stuurde elke geplakte tekst via _requestVisualInsert
naar het blokpad, dat bewust het einde van de regel zoekt — bedoeld voor
tabellen en afbeeldingen. Een zin plakken midden in een zin zette hem er
ónder, en een invalide selectie na de async klembordlezing liet de plak
op het documenteinde vallen.

Tekst (ClipboardMarkdownKind.markdown) gaat nu als delta op de Quill-caret
erin, met vervanging van een actieve selectie; de verplichte
document-terminator wordt van het fragment gesneden zodat de regel niet
breekt. De caret wordt voorafgaand aan de async klembordlezing gevangen.
Tabellen en afbeeldingen blijven het blokpad gebruiken.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Op desktop unfocust EditableText.onTapOutside de cel al bij pointer-down.
De hold liep één frame later af, terwijl pointer-up — en dus onPressed —
pas daarna komt: de werkbalk verdween onder de cursor en de klik deed
niets. De pointerRouter volgt nu de aanraking tot up of cancel, en
releaseActiveCell ruimt de selectie alleen op als de tik geen actie
opleverde.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
De broncontroller-listener berekende de actieve kop ook in de visuele
stand, uit _controller.selection — die daar juist náár de Quill-caret
wordt gezet. Elke visuele bewerking liet de markering daardoor tussen
twee berekeningen flippen. De bronselectie geldt nu alleen in Bron of
wanneer Visueel terugvalt op de platte editor (geen Quill gebouwd).

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
findAllMatches deed een kale substring-scan over de ruwe Markdown-bron,
dus een term telde óók in linkdoelen, labels, comments, fenced code en
voetnootmarkeringen — en "alles vervangen" herschreef ze stilletjes mee.
markdownNonTextRanges maskeert die regio's met behoud van bron-offsets;
de sessie zoekt en vervangt alleen nog in tekst die echt rendert.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
De fixes voor #2138 en #2141 duwden _DocumentEditorScreenState over het
omvangplafond. De plakhelpers en de export-/conversiedialoog staan nu als
top-level functies in de parts — zelfde gedrag, kleinere klasse. De test
wacht met pumpUntil op de plakuitkomst in plaats van op een gokgetal.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
refactor(document): vouw exportpaden in de layouts-part
All checks were successful
scans / scans (pull_request) Successful in 3m36s
static-gate / static-gate (pull_request) Successful in 7m2s
352e401ba9
brenno merged commit c2db80a563 into main 2026-09-20 23:36:22 +00:00
Sign in to join this conversation.
No description provided.