feat(documentmodus): pagina-einden in de schrijfstand #1506

Merged
brenno merged 12 commits from feature/paginaeinden-schrijfstand into main 2026-08-17 09:38:20 +00:00
Owner

Waarom

De Pagina's-stand laat zien waar de vellen breken, maar tijdens het typen zag je dat niet — en juist dan wil je weten wat er nog op deze bladzijde komt. In de visuele stand lopen nu streepjeslijnen door het schrijfvlak waar het vel vol is, met het nummer van de pagina die daarna begint.

De tekst blijft doorlopen. De schrijfstand echt in vellen knippen zou betekenen dat de doorlopende Quill-editor in stukken gaat, en daarmee sneuvelen typen over een paginagrens, de cursor en het selecteren. De lijn beantwoordt de vraag zonder het schrijven te breken.

Gemeten, niet geschat

De einden komen uit de blokgeometrie van de editor zelf: elk blok levert zijn eigen hoogte en positie, en documentPageOffsets (uit #1505) bepaalt daaruit de breekpunten. Een alinea die één regel langer wordt schuift het einde meteen mee.

Wat de beeldkeuring vond, en wat daarop is hersteld

De app is echt gedraaid. Drie fouten die geen test zag:

  1. De lijn viel niet op een blokgrens maar sneed door de letters van een kop, en zakte verder weg naarmate het document vorderde. De hoogtes telden alleen size.height en lieten de ruimte tussen de blokken weg; ze komen nu uit de posities van de blokken.
  2. De telling begon bij nul terwijl de inhoud begint onder de binnenmarge van de editor — elke lijn stond die marge te hoog.
  3. Elk einde zei "2", omdat het nummer werd geteld vanaf de zichtbare lijnen. Een A4 is hoger dan het venster, dus staat er nooit meer dan één lijn in beeld. Het nummer reist nu mee met het einde waar het bij hoort.

Mijn eigen tests vingen dit niet: ze toetsten of de einden op blokgrenzen vielen volgens dezelfde optelling die zelf fout was. De nieuwe test rekent de telling na tegen de werkelijke positie van elk blok in de editor.

Schrijven in de maten van de pagina

Daarna viel de lijn op een echte blokgrens, maar nog steeds op de verkeerde: het schrijfvlak gebruikte kleinere letters dan de documentweergave, en er paste ruim een kwart te veel op een vel — over drie A4-pagina's een heel vel verschil. Gemeten, niet geschat: dezelfde tekst was in de weergave 1,29x hoger.

Het schrijfvlak neemt nu de typografie van de pagina over (lettergrootte, regelafstand, kopmaten, blokafstanden), alleen in de documentmodus; een notitieveld houdt zijn compacte maten. Die maten staan voortaan op één plek, gedeeld door weergave en schrijfvlak.

Eén verschil bleef over, en ook dat is nagemeten: Quill negeert de witruimte-na-een-alinea die wij meegeven — op honderd beeldpunten gezet veranderde de gerenderde hoogte geen pixel. Die bekende, specifieke term wordt bij het meten opgeteld en niet bij het tekenen, zodat de lijn blijft vallen waar de editor zijn blokken echt neerzet. Kopregels krijgen hun afstand van Quill wél mee en tellen die twaalf punten dus dubbel: hooguit een procent van een A4, en het valt de veilige kant op — de lijn zegt eerder "vol" dan dat hij ruimte belooft die er niet is.

writing_typography_match_test.dart pint de verhouding tussen beide werelden op 1,00. Gaat Quill de afstand ooit wél toepassen, dan valt die test om in plaats van dat de lijnen stil verschuiven.

Ook in deze tak (Pagina's-stand)

  • Elk vel draagt een zichtbaar paginanummer, als bijschrift ónder het vel. Het stond alleen in de kop-/voetband, en die bestaat alleen als je stijlprofiel er een draagt. Bewust niet óp het papier: dan zou het doen alsof het meegedrukt wordt, en een nummer in de uitvoer komt uit de voetband van het profiel.
  • Grote maten passen in beeld. De schaal stond vast op ware grootte terwijl de vellen in een verticale rol staan; A2 en groter — en A0 staat in de maatlijst die #1505 toevoegde — vielen buiten beeld zonder dat je erbij kon.
  • De kop- en voetband blijven binnen de zijmarges. Ze naar de marge verplaatsen (#1505) loste het verlies van tekst op, maar zette ze horizontaal tegen de snijrand: een woordmerk liep half van het papier af.

Bediening

De knop in de werkbalk zet de einden aan en uit. Staan ze aan, dan schrijf je op de tekstbreedte van de pagina — een einde dat op een bredere kolom is uitgerekend valt op papier ergens anders, en dan wijst de lijn nergens naar. Uit betekent: de ingestelde schrijfbreedte geldt weer.

Die knop kostte onderweg nog een echte regressie: hij duwde het ⋮-menu uit de horizontaal schuivende knoppenrij, en dat menu is in documentmodus de enige route naar Instellingen. Een bestaande test sloeg aan; het menu staat nu vast rechts.

Bewaker

Bewust overgeslagen: geen wijziging aan het bestandsformaat (de einden staan nergens in het .md), geen opslag, geen afhankelijkheid, geen uitgaand verkeer. De belofte in de interface is opzettelijk bescheiden gehouden: de lijn toont waar het vel vol is in wat je schrijft; de Pagina's-stand blijft de exacte.

l10n

Twee sleutels (Pagina-einden tonen/verbergen) in alle 31 talen.

Poorten

make check groen (9538 tests, dekking 86,9%, per-bestandsvloer 0 onder de vloer, geen golden omgevallen). make check-secrets groen, make sast groen (0 findings). DAST niet gedraaid — geen geserveerd oppervlak geraakt.

## Waarom De Pagina's-stand laat zien waar de vellen breken, maar tijdens het typen zag je dat niet — en juist dan wil je weten wat er nog op deze bladzijde komt. In de visuele stand lopen nu streepjeslijnen door het schrijfvlak waar het vel vol is, met het nummer van de pagina die daarna begint. De tekst blijft doorlopen. De schrijfstand echt in vellen knippen zou betekenen dat de doorlopende Quill-editor in stukken gaat, en daarmee sneuvelen typen over een paginagrens, de cursor en het selecteren. De lijn beantwoordt de vraag zonder het schrijven te breken. ## Gemeten, niet geschat De einden komen uit de blokgeometrie van de editor zelf: elk blok levert zijn eigen hoogte en positie, en `documentPageOffsets` (uit #1505) bepaalt daaruit de breekpunten. Een alinea die één regel langer wordt schuift het einde meteen mee. ## Wat de beeldkeuring vond, en wat daarop is hersteld De app is echt gedraaid. Drie fouten die geen test zag: 1. **De lijn viel niet op een blokgrens** maar sneed door de letters van een kop, en zakte verder weg naarmate het document vorderde. De hoogtes telden alleen `size.height` en lieten de ruimte *tussen* de blokken weg; ze komen nu uit de posities van de blokken. 2. **De telling begon bij nul** terwijl de inhoud begint onder de binnenmarge van de editor — elke lijn stond die marge te hoog. 3. **Elk einde zei "2"**, omdat het nummer werd geteld vanaf de *zichtbare* lijnen. Een A4 is hoger dan het venster, dus staat er nooit meer dan één lijn in beeld. Het nummer reist nu mee met het einde waar het bij hoort. Mijn eigen tests vingen dit niet: ze toetsten of de einden op blokgrenzen vielen volgens dezelfde optelling die zelf fout was. De nieuwe test rekent de telling na tegen de werkelijke positie van elk blok in de editor. ## Schrijven in de maten van de pagina Daarna viel de lijn op een echte blokgrens, maar nog steeds op de verkeerde: het schrijfvlak gebruikte kleinere letters dan de documentweergave, en er paste ruim een kwart te veel op een vel — over drie A4-pagina's een heel vel verschil. Gemeten, niet geschat: dezelfde tekst was in de weergave 1,29x hoger. Het schrijfvlak neemt nu de typografie van de pagina over (lettergrootte, regelafstand, kopmaten, blokafstanden), alleen in de documentmodus; een notitieveld houdt zijn compacte maten. Die maten staan voortaan op één plek, gedeeld door weergave en schrijfvlak. Eén verschil bleef over, en ook dat is nagemeten: **Quill negeert de witruimte-na-een-alinea die wij meegeven** — op honderd beeldpunten gezet veranderde de gerenderde hoogte geen pixel. Die bekende, specifieke term wordt bij het *meten* opgeteld en niet bij het tekenen, zodat de lijn blijft vallen waar de editor zijn blokken echt neerzet. Kopregels krijgen hun afstand van Quill wél mee en tellen die twaalf punten dus dubbel: hooguit een procent van een A4, en het valt de veilige kant op — de lijn zegt eerder "vol" dan dat hij ruimte belooft die er niet is. `writing_typography_match_test.dart` pint de verhouding tussen beide werelden op 1,00. Gaat Quill de afstand ooit wél toepassen, dan valt die test om in plaats van dat de lijnen stil verschuiven. ## Ook in deze tak (Pagina's-stand) - **Elk vel draagt een zichtbaar paginanummer**, als bijschrift ónder het vel. Het stond alleen in de kop-/voetband, en die bestaat alleen als je stijlprofiel er een draagt. Bewust niet óp het papier: dan zou het doen alsof het meegedrukt wordt, en een nummer in de uitvoer komt uit de voetband van het profiel. - **Grote maten passen in beeld.** De schaal stond vast op ware grootte terwijl de vellen in een verticale rol staan; A2 en groter — en A0 staat in de maatlijst die #1505 toevoegde — vielen buiten beeld zonder dat je erbij kon. - **De kop- en voetband blijven binnen de zijmarges.** Ze naar de marge verplaatsen (#1505) loste het verlies van tekst op, maar zette ze horizontaal tegen de snijrand: een woordmerk liep half van het papier af. ## Bediening De knop in de werkbalk zet de einden aan en uit. Staan ze aan, dan schrijf je op de tekstbreedte van de pagina — een einde dat op een bredere kolom is uitgerekend valt op papier ergens anders, en dan wijst de lijn nergens naar. Uit betekent: de ingestelde schrijfbreedte geldt weer. Die knop kostte onderweg nog een echte regressie: hij duwde het ⋮-menu uit de horizontaal schuivende knoppenrij, en dat menu is in documentmodus de enige route naar Instellingen. Een bestaande test sloeg aan; het menu staat nu vast rechts. ## Bewaker Bewust overgeslagen: geen wijziging aan het bestandsformaat (de einden staan nergens in het `.md`), geen opslag, geen afhankelijkheid, geen uitgaand verkeer. De belofte in de interface is opzettelijk bescheiden gehouden: de lijn toont waar het vel vol is in wat je schrijft; de Pagina's-stand blijft de exacte. ## l10n Twee sleutels (`Pagina-einden tonen`/`verbergen`) in alle 31 talen. ## Poorten `make check` groen (9538 tests, dekking 86,9%, per-bestandsvloer 0 onder de vloer, geen golden omgevallen). `make check-secrets` groen, `make sast` groen (0 findings). DAST niet gedraaid — geen geserveerd oppervlak geraakt.
De Pagina's-stand laat zien waar de vellen breken, maar tijdens het typen
zag je dat niet — en juist dan wil je weten wat er nog op deze bladzijde
komt. In de visuele stand lopen nu streepjeslijnen door het schrijfvlak
waar het vel vol is, met het nummer van de pagina die daarna begint.

Gemeten, niet geschat. De einden komen uit de blokgeometrie van de editor
zelf: elk blok in het Quill-render-object levert zijn eigen hoogte, en
documentPageOffsets bepaalt daaruit de breekpunten. Een alinea die één
regel langer wordt schuift het einde meteen mee, en een einde valt op een
blokgrens in plaats van dwars door een alinea.

De tekst blijft doorlopen: de schrijfstand in vellen knippen zou het
typen, de cursor en het selecteren kapotmaken. Wat erbij komt is de vraag
die een doorlopende rol niet beantwoordt.

Staan de einden aan, dan schrijf je op de tekstbreedte van de pagina — een
einde dat op een bredere kolom is uitgerekend valt ergens anders dan op
papier, en dan wijst de lijn nergens naar. Uit zetten kan met de knop in
de werkbalk; dan geldt de ingestelde schrijfbreedte weer.

Rollen meet de blokken niet opnieuw uit: dezelfde einden, alleen een
andere plek in beeld.

Meegenomen: een achtergebleven markeerwoord in het commentaar van de
visuele stand, plus de zin dat pagina-einden pas bij afdrukken zichtbaar
zouden zijn — dat klopt nu niet meer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
De twee standen van de icoonknop in de werkbalk van de documenteditor —
'Pagina-einden tonen' en 'Pagina-einden verbergen' — in alle 31 talen.
Het woord voor 'pagina' volgt per taal de bestaande sleutels ('Pagina',
'Pagina-einde'), en de tooltip beschrijft wat de knop dóét.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
De beeldkeuring liet zien dat de lijn dwars door de letters van een kop
liep in plaats van in de witruimte ervoor, en verder wegzakte naarmate
het document vorderde. Drie fouten, alle drie in de telling:

De blokhoogtes telden alleen `size.height` en lieten de ruimte tússen de
blokken weg, zodat de som met elk blok verder achterliep op de echte
plek. De hoogtes komen nu uit de posities van de blokken zelf, dus
inclusief die ruimte.

De telling begon bij nul terwijl de inhoud begint onder de binnenmarge
van de editor; elke lijn stond daardoor die marge te hoog.

Het paginanummer werd geteld vanaf de zichtbare lijnen. Omdat een vel
hoger is dan het venster staat er nooit meer dan één lijn in beeld, dus
zei elk einde "2". Het nummer reist nu mee met het einde waar het bij
hoort.

Een test rekent de telling na tegen de werkelijke plek van elk blok in de
editor, want dit is precies het soort afwijking dat je pas ziet als je
kijkt — en dan pas bij het tweede of derde blok.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Twee gaten uit de beeldkeuring, geen van beide een fout maar allebei een
val.

Een vel droeg alleen een paginanummer als het stijlprofiel een kop- of
voetband had. Met stijl "Geen" stond er dus nergens een nummer, terwijl je
deze stand juist opent om te zien wat op welke bladzijde komt. Het nummer
staat nu ónder het vel, niet erop: op het papier zou het doen alsof het
meegedrukt wordt, en dat is het niet — een nummer in de uitvoer komt uit
de voetband van het profiel.

En: de schaal stond vast op ware grootte terwijl de vellen in een
verticale rol staan, dus zonder horizontale schuifbalk. A2 en groter — en
A0 staat gewoon in de maatlijst die deze reeks toevoegde — vielen buiten
beeld zonder dat je erbij kon. Een vel dat breder is dan het venster
schaalt nu terug tot het past, en nooit verder omhoog dan ware grootte.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
flutter analyze --fatal-infos viel op unnecessary_import: material.dart levert
RenderBox al.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
De pagina-eindenknop duwde _DocumentEditorScreenState over 1000 regels. De
tekstbreedte van een pagina is pure meetkunde en staat nu bij kPxPerMm in
paged_document_view.dart; de alt-tekst-opschoning is een markdown-hulpje en
staat bij de andere in utils/markdown_blocks.dart. SOURCE_MAP kreeg een regel
voor writing_page_breaks.dart en de nieuwe trekken van het paginascherm.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Het paginanummer onder het vel duwde _sheet over de 150 regels. De twee banden
verschilden alleen in kop/voet, boven/onder en uitlijning; dat is nu een
parameter. En het tweede Theme.of(context) mocht weg — theme stond er al.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
De pagina-eindenknop maakte de knoppenrij breder dan een venster van 1200
punten; het overloopmenu schoof mee naar buiten beeld en daarmee verdween de
enige route naar Instellingen in documentmodus. Het menu staat nu vast rechts,
buiten de horizontaal schuivende rij.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Het hulpje verhuisde naar utils/markdown_blocks.dart en dook daarmee onder de
per-bestand-dekkingsvloer; de blokhaak-regel stond nergens vastgelegd.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
De hercontrole zag het: de banden naar de marge verplaatsen loste het
verlies van tekst op, maar zette ze horizontaal tegen de snijrand in
plaats van binnen de tekstkolom. Het woordmerk van een profiel liep
daardoor half van het papier af, en de kopregel begon links van de tekst
eronder.

Een band hoort op dezelfde lijn te beginnen en eindigen als de tekst
waar hij bij staat. Een test vergelijkt de bandbreedte met de tekstkolom.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
De pagina-einden in de schrijfstand vielen op een echte blokgrens, maar op
de verkeerde: de editor schreef in kleinere letters met een krappere
regelafstand dan de documentweergave, en daarmee paste er ruim een kwart
te veel op een vel. Over drie A4-pagina's liep de schrijfstand een heel
vel achter op de druk.

Het schrijfvlak neemt nu de typografie van de pagina over — lettergrootte,
regelafstand, kopmaten en blokafstanden. Alleen in de documentmodus; een
notitieveld houdt zijn compacte maten. De maten staan voortaan op één
plek, gedeeld door de weergave en het schrijfvlak, zodat ze niet meer stil
uit elkaar kunnen lopen.

Eén verschil bleef daarna over, en dat is nagemeten in plaats van
vermoed: Quill negeert de witruimte-na-een-alinea die wij meegeven — op
honderd beeldpunten gezet veranderde de gerenderde hoogte geen pixel. Die
bekende, specifieke term wordt bij het meten opgeteld, niet bij het
tekenen, zodat de lijn blijft vallen waar de editor zijn blokken echt
neerzet.

Een test vergelijkt de hoogte van dezelfde tekst in beide werelden en pint
de verhouding op 1,00. Gaat Quill de afstand ooit wél toepassen, dan valt
die test om in plaats van dat de lijnen stil verschuiven.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
refactor(documentmodus): bronbewerkingen van het editor-scherm in een eigen part
All checks were successful
scans / scans (pull_request) Successful in 2m4s
static-gate / static-gate (pull_request) Successful in 4m46s
ae6d2c7741
Het bewerkscherm stond op 1240 regels tegen zijn plafond van 1237. De pure,
top-level bronbewerkingen (insertBlockIntoSource, replaceNthChartBlock,
replaceNthTableBlock en _safeExportName) verhuizen ongewijzigd naar
lib/widgets/parts/document_source_rewrites.dart, naast de werkbalk die daar al
woont. Zelfde bibliotheek, zelfde imports, zelfde gedrag — alleen het scherm is
weer slank (1168 regels).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
brenno merged commit b95822d2e5 into main 2026-08-17 09:38:20 +00:00
Sign in to join this conversation.
No description provided.