Visuele documentmodus: een pijl in een tabel, je plek bij het wisselen, en opmaak die opmaak blijft (#1565, #1566, #1567) #1574

Merged
brenno merged 7 commits from fix/visuele-modus-bron into main 2026-08-19 11:14:56 +00:00
Owner

Drie klachten uit één sessie schrijven in de documentmodus. Ze bleken elkaars
buren, dus ze zitten in één tak — elk met een eigen commit en een eigen test.

#1565 — een pijl in een tabel gooide je stil naar de brontekst

Een invulbare cel is een tekstveld binnen een Quill-embed, en een
EditableText laat zijn tekstbewerkingsacties bewust overschrijven door een
Actions hoger in de boom (Action.overridable) — precies waar Quill die van
hem zet. Gevolg: elke pijltjestoets in een cel liet Quill de cursor van het
document verzetten en dat resultaat ín de cel schrijven. De hele
documenttekst belandde met <br>-tekens in één cel, en omdat rauwe HTML de
visuele stand op brontekst terugwerpt, viel de editor om. Zonder dat er iets van
te zien was: de standknop zei nog "Visueel" en de melding was een grijze regel
van 10,5 punt.

  • EmbeddedFieldActions zet dezelfde acties dichter bij het veld en laat ze de
    eigen standaardactie van het veld aanroepen (Action.callingAction). Ook om
    de notenregel heen, want die had hetzelfde probleem.
  • tableArrowTarget onderscheidt nu "binnen de cel", "naar een buurcel" en
    "aan de rand van de tabel". Die laatste eet de toets op in plaats van hem door
    te laten — wat de regel eromheen altijd al beloofde.
  • De visuele editor schrijft het document niet meer opnieuw weg wanneer alleen
    de cursor verschoof. De heen-en-terugweg naar Markdown is niet byte-getrouw,
    dus één klik in het schrijfvlak was genoeg voor een bewerking (en een
    ongedaan-stap) die niemand had gemaakt.
  • De melding "je bewerkt nu de bron" is een zichtbare balk geworden.

#1566 — wisselen van stand bracht je bij het begin

MarkdownCaretMap vertaalt de cursor heen en weer. Per regel, want zo staat de
tekst er aan beide kanten in: de visuele editor zet elk blok op een eigen regel,
laat lege bronregels weg en vervangt een tabel, een scheidingslijn of een
afbeelding door één objectteken. Binnen een regel lopen bron en zichtbare tekst
samen door — die zichtbare tekst is altijd een deelrij van de bron, want opmaak
haalt tekens weg en voegt er nooit een toe. Zo klopt de kolom ook midden in
**vet**.

De toets legt de kaart naast de échte platte tekst van de omzetting in
plaats van naast zelfbedachte getallen: waar een woord in de visuele editor
staat, is waar de cursor heen moet.

#1567 — sterretjes bleven in tabelcellen staan

De cel was een kaal tekstveld met de rauwe celtekst erin. Nu toont de cel waar je
niet in staat de opgemaakte lezing (dezelfde InlineMarkdownText als de
gelezen tabel), over het tekstveld heen; het veld blijft eronder staan met
onzichtbare tekst, zodat focus, cursor, kolombreedte en rijhoogte niet
verspringen op het moment dat je erin klikt. De cel waar de cursor in staat toont
zijn Markdown — dát is wat je bewerkt. En code kreeg in de documentweergave
hetzelfde vlakje als in het schrijfvlak.

Getoetst

  • make check groen (volledige suite + beide dekkingsvloeren), make check-secrets en make sast groen. make dast niet gedraaid: colima draait
    niet op deze machine, en deze wijziging raakt geen geserveerd oppervlak.
  • Elke reparatie heeft een regressietest die één keer rood is gemaakt tegen de
    ónherstelde code (document_visual_table_navigation_test,
    document_visual_inline_markup_test, document_caret_across_modes_test).
  • En met eigen ogen in de draaiende app gekeken. Dat leverde nog een echte
    bevinding op die geen test zag: de opgemaakte lezing kwam een haar hoger uit
    dan het tekstveld, en de rij sneed de staarten van de letters af. Zie de
    laatste commit.

Weging (bewaker)

Er verandert niets aan wat er in het .md staat — #1565 haalt juist een pad wég
dat de bron stukschreef. Geen nieuwe afhankelijkheid, geen netwerk, geen opslag.
Eén botsing hardop: "een cel leest zoals hij drukt" tegen "de gebruiker moet de
Markdown-drager blijven zien". Uitwisselbaarheid gaat voor — de cel waar de
cursor in staat toont zijn Markdown, en Bron toont het hele bestand. Ik kom
hierop terug als blijkt dat mensen de tekens juist tijdens het typen in álle
cellen willen; dan wordt het een instelling, geen stille wijziging.

Sluit #1565, #1566 en #1567.

Drie klachten uit één sessie schrijven in de documentmodus. Ze bleken elkaars buren, dus ze zitten in één tak — elk met een eigen commit en een eigen test. ## #1565 — een pijl in een tabel gooide je stil naar de brontekst Een invulbare cel is een tekstveld binnen een Quill-embed, en een `EditableText` laat zijn tekstbewerkingsacties bewust overschrijven door een `Actions` hoger in de boom (`Action.overridable`) — precies waar Quill die van hem zet. Gevolg: elke pijltjestoets in een cel liet *Quill* de cursor van het **document** verzetten en dat resultaat ín de cel schrijven. De hele documenttekst belandde met `<br>`-tekens in één cel, en omdat rauwe HTML de visuele stand op brontekst terugwerpt, viel de editor om. Zonder dat er iets van te zien was: de standknop zei nog "Visueel" en de melding was een grijze regel van 10,5 punt. - `EmbeddedFieldActions` zet dezelfde acties dichter bij het veld en laat ze de eigen standaardactie van het veld aanroepen (`Action.callingAction`). Ook om de notenregel heen, want die had hetzelfde probleem. - `tableArrowTarget` onderscheidt nu "binnen de cel", "naar een buurcel" en "aan de rand van de tabel". Die laatste eet de toets op in plaats van hem door te laten — wat de regel eromheen altijd al beloofde. - De visuele editor schrijft het document niet meer opnieuw weg wanneer alleen de cursor verschoof. De heen-en-terugweg naar Markdown is niet byte-getrouw, dus één klik in het schrijfvlak was genoeg voor een bewerking (en een ongedaan-stap) die niemand had gemaakt. - De melding "je bewerkt nu de bron" is een zichtbare balk geworden. ## #1566 — wisselen van stand bracht je bij het begin `MarkdownCaretMap` vertaalt de cursor heen en weer. Per regel, want zo staat de tekst er aan beide kanten in: de visuele editor zet elk blok op een eigen regel, laat lege bronregels weg en vervangt een tabel, een scheidingslijn of een afbeelding door één objectteken. Binnen een regel lopen bron en zichtbare tekst samen door — die zichtbare tekst is altijd een *deelrij* van de bron, want opmaak haalt tekens weg en voegt er nooit een toe. Zo klopt de kolom ook midden in `**vet**`. De toets legt de kaart naast de **échte** platte tekst van de omzetting in plaats van naast zelfbedachte getallen: waar een woord in de visuele editor staat, is waar de cursor heen moet. ## #1567 — sterretjes bleven in tabelcellen staan De cel was een kaal tekstveld met de rauwe celtekst erin. Nu toont de cel waar je *niet* in staat de opgemaakte lezing (dezelfde `InlineMarkdownText` als de gelezen tabel), over het tekstveld heen; het veld blijft eronder staan met onzichtbare tekst, zodat focus, cursor, kolombreedte en rijhoogte niet verspringen op het moment dat je erin klikt. De cel waar de cursor in staat toont zijn Markdown — dát is wat je bewerkt. En `code` kreeg in de documentweergave hetzelfde vlakje als in het schrijfvlak. ## Getoetst - `make check` groen (volledige suite + beide dekkingsvloeren), `make check-secrets` en `make sast` groen. `make dast` niet gedraaid: colima draait niet op deze machine, en deze wijziging raakt geen geserveerd oppervlak. - Elke reparatie heeft een regressietest die één keer rood is gemaakt tegen de ónherstelde code (`document_visual_table_navigation_test`, `document_visual_inline_markup_test`, `document_caret_across_modes_test`). - **En met eigen ogen in de draaiende app gekeken.** Dat leverde nog een echte bevinding op die geen test zag: de opgemaakte lezing kwam een haar hoger uit dan het tekstveld, en de rij sneed de staarten van de letters af. Zie de laatste commit. ## Weging (bewaker) Er verandert niets aan wat er in het `.md` staat — #1565 haalt juist een pad wég dat de bron stukschreef. Geen nieuwe afhankelijkheid, geen netwerk, geen opslag. Eén botsing hardop: "een cel leest zoals hij drukt" tegen "de gebruiker moet de Markdown-drager blijven zien". Uitwisselbaarheid gaat voor — de cel waar de cursor in staat toont zijn Markdown, en Bron toont het hele bestand. Ik kom hierop terug als blijkt dat mensen de tekens juist tijdens het typen in álle cellen willen; dan wordt het een instelling, geen stille wijziging. Sluit #1565, #1566 en #1567.
Een invulbare tabelcel is een tekstveld binnen een Quill-embed. Quill zet zijn
eigen tekstbewerkingsacties in een Actions boven die embed, en een EditableText
laat zijn acties daar bewust door overschrijven. Gevolg: elke pijltjestoets in
een cel liet *Quill* de cursor van het document verzetten en dat resultaat in de
cel schrijven. De hele documenttekst belandde met <br>-tekens in één cel; die
tekens zijn rauwe HTML, dus viel de visuele stand terug op brontekst — zonder
dat er iets van te zien was.

- EmbeddedFieldActions zet die acties nóg een keer, dichter bij het veld, en
  roept de eigen standaardactie van het veld aan. Ook om de notenregel heen.
- tableArrowTarget onderscheidt nu "binnen de cel", "naar een buurcel" en "aan
  de rand van de tabel"; die laatste eet de toets op in plaats van hem door te
  laten, zoals de regel altijd al beloofde.
- De visuele editor schrijft het document niet meer opnieuw weg wanneer alleen
  de cursor verschoof — de heen-en-terugweg is niet byte-getrouw, dus dat gaf
  een bewerking (en een ongedaan-stap) die niemand had gemaakt.
- De melding "je bewerkt nu de bron" is een zichtbare balk in plaats van een
  grijze regel van 10,5 punt.

Sluit #1565.
De cel was een kaal tekstveld met de rauwe celtekst erin, dus `**vet**` en
`` `code` `` bleven in de visuele stand als tekens staan terwijl het voorbeeld
bij de bron ze netjes opmaakte. Twee weergaven van hetzelfde document die er
anders uitzagen — en dan weet je niet meer welke van de twee de druk voorspelt.

- De cel waar je niet in staat toont de opgemaakte lezing (dezelfde
  InlineMarkdownText als de gelezen tabel), over het tekstveld heen. Het veld
  blijft eronder staan met onzichtbare tekst, zodat focus, cursor, kolombreedte
  en rijhoogte niet verspringen op het moment dat je erin klikt.
- De cel waar de cursor in staat toont zijn Markdown: dát is wat je bewerkt.
- `code` krijgt in de documentweergave hetzelfde vlakje als in het schrijfvlak
  van de visuele editor — dezelfde kleur als het codeblok.
- De tabel-editor in het dia-paneel volgt de nieuwe drie standen van
  tableArrowTarget (#1565), zodat beide tabellen dezelfde regel houden.

Sluit #1567.
Wisselen tussen Visueel en Bron zette je terug bij het begin van het document.
Juist die wissel doe je omdat je op één plek iets in de bron wilt zien of
zetten, dus je raakte precies kwijt waar het om ging — en in een lang document
was de bronstand daarmee iets om te vermijden.

MarkdownCaretMap vertaalt een cursorpositie heen en weer. Per regel, want zo
staat de tekst er aan beide kanten in: de visuele editor zet elk blok op een
eigen regel, laat lege bronregels weg en vervangt een tabel of scheidingslijn
door één objectteken. Binnen een regel loopt hij de bron en de zichtbare tekst
samen door — die zichtbare tekst is altijd een deelrij van de bron, want opmaak
haalt tekens weg en voegt er nooit een toe. Zo klopt de kolom ook midden in
`**vet**`.

De kaart wordt in de test niet tegen zelfbedachte getallen gelegd maar tegen de
échte platte tekst van de omzetting: waar een woord in de visuele editor staat,
is waar de cursor heen moet.

Sluit #1566.
SOURCE_MAP krijgt markdown_caret_map en embedded_field_actions, en de regel over
de invulbare cel klopt weer. De gebruikersgids zegt nu wat er zichtbaar
veranderde: wisselen houdt je plek, een tabelcel leest zoals hij drukt, en de
melding dat je in de bron staat is een balk.
- table_cell_navigation_test en table_inplace_edit_test toetsen nu de drie
  uitkomsten van tableArrowTarget; aan de rand van de tabel wordt de toets
  opgegeten, en dat is precies wat #1565 nodig had.
- Na een wissel van stand krijgt het schrijfvlak de focus, want zonder focus
  schuift het de cursor niet in beeld — dan staat hij wel goed maar buiten het
  venster (#1566).
- markdown_caret_map: een regel die alleen een afbeelding is telt als één
  objectteken, zoals een tabel.
fix(documentmodus): de tabelrij snijdt de letters niet meer af
All checks were successful
scans / scans (pull_request) Successful in 2m37s
static-gate / static-gate (pull_request) Successful in 6m16s
db60e7caab
De opgemaakte lezing van een cel kwam een haar hoger uit dan het tekstveld
eronder, en de stapel knipte dat weg — in de draaiende app zag je de staarten
van de letters in elke rij afgesneden. Met StackFit.passthrough krijgen beide
lagen de breedte van de cel en wordt de cel zo hoog als de hoogste van de twee.
brenno force-pushed fix/visuele-modus-bron from db60e7caab
All checks were successful
scans / scans (pull_request) Successful in 2m37s
static-gate / static-gate (pull_request) Successful in 6m16s
to ece7478546
Some checks failed
scans / scans (pull_request) Successful in 2m32s
static-gate / static-gate (pull_request) Has been cancelled
2026-08-19 11:02:35 +00:00
Compare
brenno force-pushed fix/visuele-modus-bron from ece7478546
Some checks failed
scans / scans (pull_request) Successful in 2m32s
static-gate / static-gate (pull_request) Has been cancelled
to 952a0c5eba
All checks were successful
scans / scans (pull_request) Successful in 2m51s
static-gate / static-gate (pull_request) Successful in 6m35s
2026-08-19 11:07:26 +00:00
Compare
brenno merged commit f3389a4933 into main 2026-08-19 11:14:56 +00:00
Sign in to join this conversation.
No description provided.