Twee gelijkwaardige startknoppen, en 'Leeg deck' is echt leeg #1548

Closed
brenno wants to merge 2 commits from startknoppen-en-leeg-sjabloon into main
Owner

Wat er mis was

Twee waarnemingen van de gebruiker op het startscherm, en ze horen bij elkaar.

1. De twee manieren om te beginnen zagen er niet uit als twee manieren. Onder de kop Nieuwe presentatie stond een gele knop Kiezen, en daaronder een witte Nieuw document. De kop noemde de soort, de knop zei alleen "kiezen", en de omlijnde knop ernaast las als de mindere van de twee. Wie het scherm voor het eerst ziet, leest één weg met een aanhangsel.

Nu: kop Nieuw, daaronder Nieuwe presentatie en Nieuw document, allebei in de accentkleur van het stijlprofiel, allebei met een label dat zelf zegt wat het maakt. De sjabloonregel ("87 sjablonen om mee te beginnen, of leeg") is meeverhuisd naar direct onder de presentatieknop — hij gold nooit voor een document, en boven de groep las hij als een belofte over allebei.

2. "Leeg deck" was niet leeg. Het sjabloon leverde een titelpagina met de ingetypte titel er al op. Leeg deck geeft nu één lege dia. De titel blijft de deck-titel (front matter, tabblad, bestandsnaam) en spreekt zich nergens op een dia uit; de omschrijving in de kiezer is meeveranderd naar "Alleen een lege dia." (31 talen).

Daarmee is het lege deck het enige sjabloon zonder document in assets/templates/ — leeg is de afwezigheid van een document, geen document dat toevallig één dia telt. De 31 empty.*.md zijn verwijderd en de sjabloonpoorten (elk sjabloon heeft een document, elk document begint met een titeldia, nl/en-pariteit, rondgang) slaan het lege deck expliciet over via documentTemplates.

3. En daardoor: de lege-dia-melding kwam meteen op. Een lege dia levert de kwaliteitsmelding "Deze dia is leeg: hij toont niets op het scherm en in de export." — dus begroette een vers deck de gebruiker met een verwijt over precies wat hij net zelf had gevraagd. Die ene melding zwijgt nu zolang het deck nog niet is aangeraakt (geen ongedaan-maken-stap, geen bestandspad, geen download op web). Eén toetsaanslag zet hem weer aan; dan is een lege dia wél iets om te weten vóór de export. De andere meldingen blijven vanaf de eerste seconde staan — die gaan over wat er wél is.

Hoe het is getoetst

  • Met eigen ogen, in de draaiende app op macOS: de twee knoppen (kleur, labels, uitlijning bij de sjabloonregel), het aanmaken van een leeg deck (één dia, type Alleen Bullets, lege titel, titel alleen in tabblad en deck-kop), en het uitblijven van de kwaliteitsbadge op de miniatuur.
  • Regressietests. template_content_service_test: leeg levert één lege bullets-dia, leest niets uit de bundel (een lader die zou ontploffen als het toch gebeurde) en zet de titel niet op de dia. deck_template_test: het lege deck draagt in geen enkele taal nog een document. empty_deck_quality_silence_test (nieuw, vier gevallen): vers deck zwijgt (ook de ruwe analyse, anders zet de miniatuur alsnog een badge), na een bewerking telt de melding weer mee, een geopend deck met een lege dia waarschuwt gewoon, en andere meldingen blijven ook op een vers deck staan. Alle vier zijn één keer rood gezien tegen de onherstelde code.

Wat je moet weten over de rondgang

Een lege dia heeft geen Markdown-representatie: sla een onaangeraakt leeg deck op en het bestand bevat alleen front matter; heropen je het, dan komt die ene lege dia terug als Titelpagina in plaats van Alleen Bullets. Er gaat niets verloren (er staat niets in), maar het type van een nog lege dia overleeft de rondgang niet. Bewust niet opgelost door een _class-token voor een verder lege dia in het bestand te zetten: dat zou een OciDeck-specifiek spoor in het .md van de gebruiker achterlaten voor precies nul inhoud.

Afweging (bewaker)

Raakt wat er in het .md terechtkomt en een belofte in de interface, dus langs de bewaker gehaald. Uitkomst: het .md wordt soberder, niet rijker — er komt geen token, geen fenced blok en geen sidecar bij, en een vers leeg deck is voor elke Marp-lezer triviaal leesbaar. De kiezer belooft nu "Alleen een lege dia" en dat is nagemeten in de draaiende app. De accentkleur van beide knoppen komt uit het stijlprofiel (ElevatedButton-thema), niet uit een hardgecodeerde waarde, dus de contrastregels en donkere profielen blijven gelden; het onderscheid tussen de twee knoppen zit in de labels en iconen, niet in kleur alleen.

De onderdrukking van de lege-dia-melding is een afweging tussen betrouwbaar melden en de gebruiker niet corrigeren voor wat hij vroeg. De grens ligt bij "nog nooit aangeraakt", en dat is de nauwste die er is: één toetsaanslag of één opslag zet de melding terug. Zou blijken dat mensen tóch met een lege dia exporteren, dan komt de melding eerder terug (bijvoorbeeld al bij de eerste opslag in plaats van bij de eerste bewerking) — niet door de exportpoort te verzwakken.

Kleine bijvangst

welcome_screen.dart liep tegen het regelplafond (1022 > 1000). De gedeelde knopvormen, de Vigilis-credit en de sjabloontaal-tooltip staan nu in welcome_screen_chrome.dart, geregistreerd in app_shell.dart en in SOURCE_MAP.md.

Poorten

make check groen (9655 tests, dekkingsvloer, per-bestandsvloer, overflow-stress bij 200% tekst). make check-secrets groen (geen leaks, werkboom en historie). make sast groen: 4 regels over 1101 bestanden, 0 findings. DAST niet gedraaid — deze wijziging raakt geen geserveerd oppervlak.

## Wat er mis was Twee waarnemingen van de gebruiker op het startscherm, en ze horen bij elkaar. **1. De twee manieren om te beginnen zagen er niet uit als twee manieren.** Onder de kop *Nieuwe presentatie* stond een gele knop **Kiezen**, en daaronder een witte **Nieuw document**. De kop noemde de soort, de knop zei alleen "kiezen", en de omlijnde knop ernaast las als de mindere van de twee. Wie het scherm voor het eerst ziet, leest één weg met een aanhangsel. Nu: kop **Nieuw**, daaronder **Nieuwe presentatie** en **Nieuw document**, allebei in de accentkleur van het stijlprofiel, allebei met een label dat zelf zegt wat het maakt. De sjabloonregel ("87 sjablonen om mee te beginnen, of leeg") is meeverhuisd naar direct onder de presentatieknop — hij gold nooit voor een document, en boven de groep las hij als een belofte over allebei. **2. "Leeg deck" was niet leeg.** Het sjabloon leverde een titelpagina met de ingetypte titel er al op. *Leeg deck* geeft nu één lege dia. De titel blijft de deck-titel (front matter, tabblad, bestandsnaam) en spreekt zich nergens op een dia uit; de omschrijving in de kiezer is meeveranderd naar "Alleen een lege dia." (31 talen). Daarmee is het lege deck het enige sjabloon **zonder** document in `assets/templates/` — leeg is de afwezigheid van een document, geen document dat toevallig één dia telt. De 31 `empty.*.md` zijn verwijderd en de sjabloonpoorten (elk sjabloon heeft een document, elk document begint met een titeldia, nl/en-pariteit, rondgang) slaan het lege deck expliciet over via `documentTemplates`. **3. En daardoor: de lege-dia-melding kwam meteen op.** Een lege dia levert de kwaliteitsmelding *"Deze dia is leeg: hij toont niets op het scherm en in de export."* — dus begroette een vers deck de gebruiker met een verwijt over precies wat hij net zelf had gevraagd. Die ene melding zwijgt nu zolang het deck nog niet is aangeraakt (geen ongedaan-maken-stap, geen bestandspad, geen download op web). Eén toetsaanslag zet hem weer aan; dan is een lege dia wél iets om te weten vóór de export. De andere meldingen blijven vanaf de eerste seconde staan — die gaan over wat er wél is. ## Hoe het is getoetst - **Met eigen ogen**, in de draaiende app op macOS: de twee knoppen (kleur, labels, uitlijning bij de sjabloonregel), het aanmaken van een leeg deck (één dia, type *Alleen Bullets*, lege titel, titel alleen in tabblad en deck-kop), en het uitblijven van de kwaliteitsbadge op de miniatuur. - **Regressietests.** `template_content_service_test`: leeg levert één lege bullets-dia, leest niets uit de bundel (een lader die zou ontploffen als het toch gebeurde) en zet de titel niet op de dia. `deck_template_test`: het lege deck draagt in geen enkele taal nog een document. `empty_deck_quality_silence_test` (nieuw, vier gevallen): vers deck zwijgt (ook de ruwe analyse, anders zet de miniatuur alsnog een badge), na een bewerking telt de melding weer mee, een geopend deck met een lege dia waarschuwt gewoon, en andere meldingen blijven ook op een vers deck staan. Alle vier zijn één keer rood gezien tegen de onherstelde code. ## Wat je moet weten over de rondgang Een lege dia heeft geen Markdown-representatie: sla een onaangeraakt leeg deck op en het bestand bevat alleen front matter; heropen je het, dan komt die ene lege dia terug als *Titelpagina* in plaats van *Alleen Bullets*. Er gaat niets verloren (er staat niets in), maar het type van een nog lege dia overleeft de rondgang niet. Bewust niet opgelost door een `_class`-token voor een verder lege dia in het bestand te zetten: dat zou een OciDeck-specifiek spoor in het `.md` van de gebruiker achterlaten voor precies nul inhoud. ## Afweging (bewaker) Raakt wat er in het `.md` terechtkomt en een belofte in de interface, dus langs de bewaker gehaald. Uitkomst: het `.md` wordt **soberder**, niet rijker — er komt geen token, geen fenced blok en geen sidecar bij, en een vers leeg deck is voor elke Marp-lezer triviaal leesbaar. De kiezer belooft nu "Alleen een lege dia" en dat is nagemeten in de draaiende app. De accentkleur van beide knoppen komt uit het stijlprofiel (`ElevatedButton`-thema), niet uit een hardgecodeerde waarde, dus de contrastregels en donkere profielen blijven gelden; het onderscheid tussen de twee knoppen zit in de labels en iconen, niet in kleur alleen. De onderdrukking van de lege-dia-melding is een afweging tussen *betrouwbaar melden* en *de gebruiker niet corrigeren voor wat hij vroeg*. De grens ligt bij "nog nooit aangeraakt", en dat is de nauwste die er is: één toetsaanslag of één opslag zet de melding terug. Zou blijken dat mensen tóch met een lege dia exporteren, dan komt de melding eerder terug (bijvoorbeeld al bij de eerste opslag in plaats van bij de eerste bewerking) — niet door de exportpoort te verzwakken. ## Kleine bijvangst `welcome_screen.dart` liep tegen het regelplafond (1022 > 1000). De gedeelde knopvormen, de Vigilis-credit en de sjabloontaal-tooltip staan nu in `welcome_screen_chrome.dart`, geregistreerd in `app_shell.dart` en in `SOURCE_MAP.md`. ## Poorten `make check` groen (9655 tests, dekkingsvloer, per-bestandsvloer, overflow-stress bij 200% tekst). `make check-secrets` groen (geen leaks, werkboom en historie). `make sast` groen: 4 regels over 1101 bestanden, 0 findings. DAST niet gedraaid — deze wijziging raakt geen geserveerd oppervlak.
Het startscherm zette een gele knop 'Kiezen' onder de kop 'Nieuwe
presentatie', met daaronder een witte 'Nieuw document'. Dat las als één weg
met een aanhangsel: de kop noemde de soort, de knop zei alleen "kiezen", en
de witte knop ernaast leek de mindere van de twee. Het zijn twee
gelijkwaardige manieren om te beginnen, dus staan ze er nu ook zo bij — kop
'Nieuw', daaronder 'Nieuwe presentatie' en 'Nieuw document', allebei in de
accentkleur, allebei met een label dat zelf zegt wat het maakt. De
sjabloonregel is meeverhuisd naar onder de presentatieknop; hij gold nooit
voor een document.

Tegelijk het lege sjabloon: dat leverde een titelpagina met de ingetypte
titel er al op, en dat is geen leeg vel. 'Leeg deck' geeft nu één lege dia;
de titel blijft de deck-titel (front matter, tabblad, bestandsnaam) en
spreekt zich nergens op een dia uit. Daarmee is het lege deck het enige
sjabloon zonder document in assets/templates/ — leeg is de afwezigheid van
een document, geen document dat toevallig één dia telt.

De knopvormen zijn afgesplitst naar welcome_screen_chrome.dart, want
welcome_screen.dart liep tegen het regelplafond.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
fix(kwaliteit): zwijg over een lege dia zolang het deck onaangeraakt is
All checks were successful
scans / scans (pull_request) Successful in 1m52s
static-gate / static-gate (pull_request) Successful in 4m36s
b521286d3a
Een lege dia levert de melding "Deze dia is leeg: hij toont niets op het
scherm en in de export." Sinds 'Leeg deck' echt één lege dia geeft, begroette
een vers deck de gebruiker daar meteen mee — een verwijt over precies wat hij
net zelf had gevraagd, met een badge op de miniatuur erbij.

Die ene melding zwijgt nu zolang het deck nog niet is aangeraakt: geen
ongedaan-maken-stap, geen bestandspad, en op web geen download. Eén
toetsaanslag zet hem weer aan, en dat is precies het moment waarop een lege
dia wél iets is om te weten vóór de export. De filter zit in de rúwe provider,
anders zet de miniatuur alsnog een badge op een dia waar niemand iets mee
heeft gedaan. Andere meldingen blijven vanaf de eerste seconde staan: die gaan
over wat er wél is.

Vier regressietests, alle vier eerst rood gezien tegen de onherstelde code.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
brenno closed this pull request 2026-08-19 09:16:00 +00:00
All checks were successful
scans / scans (pull_request) Successful in 1m52s
Required
Details
static-gate / static-gate (pull_request) Successful in 4m36s
Required
Details

Pull request closed

Sign in to join this conversation.
No description provided.