fix(split+quality): paginadoel volgt de tekstkolom naast een afbeelding (#1279) + ondertitel-contrasttoets (#1290) #1292

Merged
brenno merged 5 commits from fix/1279-split-fit-scale into main 2026-08-06 00:00:31 +00:00
Owner

Twee kwaliteitsfixes

1. Splits slide naast een afbeelding schaalt het lettertype niet op (#1279)

"Verdeel over meerdere slides" op een overvolle bullets+afbeelding-dia gebruikte het volle-breedte-paginadoel van acht bullets per pagina. Naast een afbeelding is de tekstkolom veel smaller, dus de volste pagina drukte de gedeelde run-schaal omlaag en bleven de deel-slides klein renderen terwijl er ruimte over was.

Richting B (productowner-bevestigd, invariant behouden): het paginadoel schaalt nu mee met de kolombreedte via bulletsImageTextColumnFraction (bij 40% beeld vijf i.p.v. acht per pagina, kMinPageBullets als vloer). Het bewuste invariant "één split-run rendert op één gedeelde grootte" blijft ongemoeid — de run wint grootte doordat de volste pagina minder draagt.

Beeldkeuring bevestigde 20% → 52% ontwerpgrootte, leesbaar, uniforme run. Toen de keurder een render-hoogteschatter-overschatting vermoedde, heb ik dat met een echte widget-rendermeting weerlegd: een werkelijk volle pagina vult 94% van de tekstkolom op zijn eigen fit-schaal. Er is geen overschatting; de restruimte op dunnere pagina's is de bewuste prijs van de uniforme run.

Regressietests (eerst-rood): paginadoel, gestegen gedeelde schaal, én — per repo-regel heuristiek-tegen-echte-render — de effectieve fontgrootte in een echte widget-render van een vervolgpagina.

2. Contrastpoort miste de ondertitel van titel- en tussentiteldia's (#1290)

Gevonden tijdens de keuring van #1279. De contrastcontrole toetste de volle titeltekst tegen zijn achtergrond, maar de ondertitel eronder rendert op verlaagde dekking (kTitleSubtitleAlpha = 0,72) — een lichtere, dus zwakker contrasterende variant van dezelfde kleur. Op een donkerblauwe achtergrond met een lichterblauwe titel haalde de volle titel nog net de drempel voor grote tekst terwijl de lichtere ondertitel er ruim onder zakte en tóch geen waarschuwing kreeg.

_checkSlideContrast toetst nu ook de ondertitel (gemengd op de gedeelde constante kTitleSubtitleAlpha, kleur volgt de render inclusief per-dia titleTextColorOverride) voor titel- en tussentiteldia's. De 0,72 is nu één constante die render en toets delen. Label hergebruikt de bestaande, in 31 talen vertaalde string Ondertitel — geen nieuwe l10n. Regressietest eerst-rood met een kleurenpaar waarin de volle titel de drempel haalt maar de 0,72-ondertitel niet.

Verantwoording

  • Bewaker bewust overgeslagen: geen van de vijf triggers (bestandsformaat, opslag, afhankelijkheid, uitgaand verkeer, publieke belofte) wordt geraakt. continuesSplit round-tript ongewijzigd; de contrastfix maakt de poort alleen strenger.
  • make check groen (8641 tests, coverage 87,2%, geen golden-drift); ge-rebaset op main na #1288.
  • Aparte observatie #1289 (waarschuwingsexplosie na een aanbevolen splitsing) apart ingediend, niet in deze PR.

Closes #1279
Closes #1290

🤖 Generated with Claude Code

## Twee kwaliteitsfixes ### 1. Splits slide naast een afbeelding schaalt het lettertype niet op (#1279) "Verdeel over meerdere slides" op een overvolle bullets+afbeelding-dia gebruikte het volle-breedte-paginadoel van acht bullets per pagina. Naast een afbeelding is de tekstkolom veel smaller, dus de volste pagina drukte de gedeelde run-schaal omlaag en bleven de deel-slides klein renderen terwijl er ruimte over was. **Richting B** (productowner-bevestigd, invariant behouden): het paginadoel schaalt nu mee met de kolombreedte via `bulletsImageTextColumnFraction` (bij 40% beeld vijf i.p.v. acht per pagina, `kMinPageBullets` als vloer). Het bewuste invariant "één split-run rendert op één gedeelde grootte" blijft ongemoeid — de run wint grootte doordat de volste pagina minder draagt. Beeldkeuring bevestigde 20% → 52% ontwerpgrootte, leesbaar, uniforme run. Toen de keurder een render-hoogteschatter-overschatting vermoedde, heb ik dat met een echte widget-rendermeting weerlegd: een werkelijk volle pagina vult 94% van de tekstkolom op zijn eigen fit-schaal. Er is geen overschatting; de restruimte op dunnere pagina's is de bewuste prijs van de uniforme run. Regressietests (eerst-rood): paginadoel, gestegen gedeelde schaal, én — per repo-regel heuristiek-tegen-echte-render — de effectieve fontgrootte in een echte widget-render van een vervolgpagina. ### 2. Contrastpoort miste de ondertitel van titel- en tussentiteldia's (#1290) Gevonden tijdens de keuring van #1279. De contrastcontrole toetste de volle titeltekst tegen zijn achtergrond, maar de ondertitel eronder rendert op verlaagde dekking (`kTitleSubtitleAlpha` = 0,72) — een lichtere, dus zwakker contrasterende variant van dezelfde kleur. Op een donkerblauwe achtergrond met een lichterblauwe titel haalde de volle titel nog net de drempel voor grote tekst terwijl de lichtere ondertitel er ruim onder zakte en tóch geen waarschuwing kreeg. `_checkSlideContrast` toetst nu ook de ondertitel (gemengd op de gedeelde constante `kTitleSubtitleAlpha`, kleur volgt de render inclusief per-dia `titleTextColorOverride`) voor titel- en tussentiteldia's. De 0,72 is nu één constante die render en toets delen. Label hergebruikt de bestaande, in 31 talen vertaalde string `Ondertitel` — geen nieuwe l10n. Regressietest eerst-rood met een kleurenpaar waarin de volle titel de drempel haalt maar de 0,72-ondertitel niet. ### Verantwoording - **Bewaker bewust overgeslagen:** geen van de vijf triggers (bestandsformaat, opslag, afhankelijkheid, uitgaand verkeer, publieke belofte) wordt geraakt. `continuesSplit` round-tript ongewijzigd; de contrastfix maakt de poort alleen strenger. - `make check` groen (8641 tests, coverage 87,2%, geen golden-drift); ge-rebaset op main na #1288. - Aparte observatie #1289 (waarschuwingsexplosie na een aanbevolen splitsing) apart ingediend, niet in deze PR. Closes #1279 Closes #1290 🤖 Generated with [Claude Code](https://claude.com/claude-code)
De splitsactie gebruikte voor bullets+afbeelding-slides het
volle-breedte-doel van acht bullets per pagina. Naast een afbeelding is
de tekstkolom veel smaller, dus de volste pagina drukte de gedeelde
run-schaal omlaag en bleven de deel-slides klein renderen terwijl er
ruimte over was. Het paginadoel schaalt nu mee met de kolombreedte
(naar rato van de beeldfractie, met de paginavloer als ondergrens),
zodat de splitsing pagina's oplevert die de ruimte vullen — mét behoud
van het invariant dat één run op één gedeelde grootte rendert.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
De nieuwe regressietest tript format-check (collection-literal-opmaak) en
analyze --fatal-infos (rendering.dart en split_run.dart onnodig — hun
symbolen komen al via material.dart resp. slide_preview.dart).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
De contrastcontrole toetste de volle titeltekst tegen zijn achtergrond,
maar de ondertitel eronder rendert op 0,72 dekking — een lichtere, dus
zwakker contrasterende variant van dezelfde kleur. Op een donkerblauwe
achtergrond met een lichterblauwe titel haalde de volle titel nog net de
drempel terwijl de lichtere ondertitel er ruim onder zakte en tóch niet
gemeld werd. _checkSlideContrast toetst nu ook de ondertitel (gemengd op
de gedeelde constante kTitleSubtitleAlpha, kleur volgt de render inclusief
een per-dia titleTextColorOverride) voor de titel- en tussentiteldia. De
0,72 is nu één constante die render en toets delen. Label hergebruikt de
bestaande vertaalde string 'Ondertitel' — geen nieuwe l10n.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
fix(quality): houd contrast-emitters onder het klasseplafond en formatteer de test
All checks were successful
scans / scans (pull_request) Successful in 1m38s
static-gate / static-gate (pull_request) Successful in 4m2s
15841deeca
De ondertitel-contrastfix tripte drie poorten:
- format-check: test/subtitle_contrast_test.dart was ongeformatteerd.
- class-size ratchet: de nieuwe helper duwde SlideQualityAnalyzer over 1130.
  _addSubtitleContrastIssue en zijn zusje _addSlidePairIssue zijn nu top-level
  functies in dezelfde library (minContrastRatio als parameter); zuiver gedrag,
  telt niet meer tegen de klasse (1176 -> 1108).
- file-size ratchet: de gesplitste title_contrast-import duwde slide_preview.dart
  van 1076 naar 1077. _splitTextLogoSafeInsets verhuist naar zijn enige gebruiker
  bullets_image_preview.dart (part van dezelfde library); wortel weer 1072.

Geen gedragswijziging: render-alpha blijft kTitleSubtitleAlpha (0.72), goldens
schuiven niet. make check volledig groen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
brenno merged commit abcfab8057 into main 2026-08-06 00:00:31 +00:00
Sign in to join this conversation.
No description provided.