Keuze-menu-dia met blokken + per-dia sprong naar een andere dia #1162
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#1162
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Wat willen we bereiken
Een presentatie moet niet-lineair kunnen zijn. Twee samenhangende wensen:
1. Een keuze-menu-dia (nieuw slidetype).
Een dia waarop je blokken neerzet — ingevoerd als bullets in de editor —
waarbij elk blok verwijst naar een andere dia in het deck. In de weergave
worden die blokken als een net raster van keuzeblokken getoond, zodat de dia
werkt als een menu: klik/tik een blok en de presentatie springt naar de
bijbehorende dia. Elk blok kan optioneel een afbeelding dragen (geen plicht;
een blok zonder afbeelding is een gewoon tekstblok).
2. Sprong-uit op elke dia.
Iedere dia moet kunnen aangeven dat de volgende dia een andere is dan de
eerstvolgende in de bronvolgorde — een per-dia "spring hierna naar dia X".
Zonder zo'n sprong geldt gewoon de bestaande lineaire volgorde. Hiermee kun je
vanaf een menu-tak weer terugkeren naar het menu, of een zijpad afsluiten.
Samen leveren deze twee een eenvoudige presentatie-branching op: een menu-dia
biedt keuzes, elke keuze leidt naar een tak, en de tak springt aan het eind
terug.
Wat mist er nu
hyperlinksop een dia zijnuitsluitend externe URL's (
slide_factory.dart, importkant); er bestaat geenconcept "verwijs naar dia N van dit deck".
Look and feel (cruciaal)
De blokken en het menu moeten kloppen met het actieve deck-thema en écht mooi
ogen: kleuren uit het actieve ColorScheme (surface/onSurface — nooit een eigen
palet hardcoderen), consistent met de bestaande dia-esthetiek, nette
raster-layout, en degelijk gedrag bij 200% tekst en krappe viewports
(overflow-stresspoort). Dit valt of staat met de beeldkeuring — een test
bevestigt de waarden, niet of het mooi is.
Formaat-gevolgen — eerst ontwerpen
Dit raakt het bestandsformaat en verdient een afgetoetst ontwerp vóór de bouw
(zie de werkwijze "formaat eerst ontwerpen"). Open ontwerpvragen die op elkaar
ingrijpen:
vast id in het huidige formaat; posities verschuiven bij invoegen/verwijderen.
Een index is fragiel. Kandidaat: een stabiel dia-anker/id, óf verwijzen op
kop/slug. Dit is de kernbeslissing en bepaalt de rest.
round-trippend en leesbaar, zonder base64.
de bestaande bullet-/afbeeldingsconventies; een blok is bullet-tekst +
doelverwijzing + optioneel een
mem:/asset-afbeelding.crash; zichtbaar in de editor.
Wat kost dit (grofweg)
nieuw-slidetype; vergeet_tableBackedTypes/registraties niet).serialiser, editor, preview, presentator en export moet.
inclusief toetsenbord/afstandsbediening en "terug".
l10n.d('…')(31 vertalingen).slidestrook-navigatie.
Aanpak
Voorstel: eerst een klein formaat-ontwerp (de vier ontwerpvragen hierboven,
gebundeld), aftoetsen, en dan pas bouwen. De sprong-uit (2) en het menu-type (1)
delen hetzelfde navigatie-fundament, dus samen ontwerpen, gefaseerd bouwen —
navigatiemodel eerst, dan het menu-slidetype erop.
Formaatontwerp — niet-lineaire navigatie
Aftoetsbaar formaatontwerp voor de vier ontwerpvragen. Uitgangspunt: één ankersysteem draagt beide features. Een dia die een doel is (van een menublok óf van een sprong-uit) krijgt een stabiel anker; verwijzen gebeurt naar dat anker. Alles is leesbare Markdown; een gewone Markdown-lezer ziet een bulletlijst met links en negeert de
<!-- ocideck_* -->-comments. Geen base64, degradeert netjes.Vraag 1 — Hoe verwijs je stabiel naar een andere dia? (de kernbeslissing)
Voorstel: een expliciet opgeslagen, mens-leesbaar anker per dia — géén uuid, géén index.
# Prijzen→prijzen), maar daarna bevroren en expliciet opgeslagen. Hernoem je de kop naar "Tarieven", dan blijft het ankerprijzen— de link breekt niet.prijzen-2. Botsing door handmatig bewerken → parser houdt de eerste aan, markeert de rest als kapot doel (zichtbaar in de editor, geen crash).#-fragment, zoals een HTML-ankerlink:[Prijzen](#prijzen). Werkt letterlijk als echt anker in de HTML-export.Afgewezen: index (schuift, fragiel — precies wat het issue vreest); kale uuid (robuust maar onleesbaar in de ruwe
.md, botst met de mens-leesbare lijn —finding_idis bewust óók genummerd, niet uuid); kop/slug live afleiden (breekt bij hernoemen of dubbele koppen — het bevriezen lost precies dat op).De gebruiker ziet dit anker nooit rechtstreeks: in de editor kiest die een doeldia uit een lijst-op-titel/miniatuur, de app schrijft het anker.
Vraag 2 — Waar leeft de sprong-uit?
Voorstel: een dia-eigenschap als HTML-comment op de brondia.
ocideck_nextverwijst naar het anker van de doeldia. Afwezig = de bestaande lineaire volgorde — geen gedragswijziging voor bestaande decks, nul migratie.Slide.nextAnchor(leeg = lineair), round-trippend, leesbaar. Volgt exact het patroon vanocideck_checklist_scope/ocideck_finding_id, staat bij de andere per-dia directives.<!-- ocideck_* -->.Vraag 3 — Hoe codeert een menublok zijn doel + optionele afbeelding?
Voorstel: de bullets ván de menu-dia zíjn de blokken; elk blok is een Markdown-link, met de afbeelding via de bestaande
mem:-conventie.#anker-fragmentlink. De parser onderscheidt#…(in-deck sprong) vanhttp(s)://…(bestaande externe hyperlink) — één check, geen nieuw mechanisme.of asset-pad, exact de conventie diebulletsImage/twoImagesal gebruiken. Geen afbeelding = gewoon tekstblok._class: menu-token voor het slidetype.Afgewezen: doelen in een parallelle comment (
<!-- ocideck_menu_targets: … -->) naast kale bullets — dat splitst tekst en doel over twee plekken die uit de pas kunnen lopen (dezelfde stille val als het ooit vergeten_tableBackedTypes). De inline-link houdt tekst + doel + beeld op één regel bij elkaar.Vraag 4 — Kapotte verwijzing + verliesvrije round-trip
ocideck_next/menu-ankers wanneer aanwezig, anders lineair. Geen verlies t.o.v. nu.id=-attributen op de dia-secties, links worden fragment-links — branching werkt in de geëxporteerde HTML. Print/PDF: links zijn inert (statisch medium), inhoud blijft volledig.Modeluitbreiding (minimaal)
Slide.anchor<!-- ocideck_slide_anchor: … -->Slide.nextAnchor<!-- ocideck_next: … -->bullets+hyperlinks(nu ook#-fragment) + afbeelding-per-bullet- [tekst](#anker) De enige echte modeluitbreiding buiten de twee ankervelden is een afbeelding per bullet (die bullets nu niet dragen). De rest leunt op bestaande velden.
Bewust weggelaten
Openstaand om te bevestigen
De grootste keuze is Vraag 1 (bevroren mens-leesbaar anker vs. kale uuid) — daar hangt de rest aan. Zodra dat vaststaat kan gefaseerd gebouwd worden: navigatiefundament (anker +
nextAnchor) → sprong-uit → menu-slidetype.Ik pak dit op — het formaatontwerp hierboven staat vast (bevroren mens-leesbaar anker). Gefaseerd bouwen op branch
feat/1162-nietlineaire-navigatie: Fase 1 = navigatiefundament (Slide.anchor+Slide.nextAnchor, verliesvrije round-trip + migratie), daarna sprong-uit in de presentator, daarna het menu-slidetype.PR voor fase 1+2 (de sprong-uit) staat klaar: #1189
Bevat het navigatiefundament (stabiel bevroren dia-anker +
nextAnchor, verliesvrije round-trip), de sprong-uit werkend in de presentator met een navigatiestack als "terug", en de editor-UI ("Hierna"-keuzelijst per dia).make checkvolledig groen, secrets/SAST schoon, docs + l10n (31 talen) bij.Issue blijft open: feature 1, het keuze-menu-diatype, volgt als aparte PR op dit fundament (nieuw SlideType + blokkenraster + klik-om-te-springen + beeldkeuring — dat laatste is het visuele "valt of staat"-oppervlak uit dit issue).
Fase 3 — het keuze-menu-diatype staat nu ook klaar: #1192 (gestapeld op #1189, landt daarna).
Daarmee is de volledige issue-scope geïmplementeerd:
Beide:
make checkvolledig groen, secrets/SAST schoon, docs + l10n (31 talen) bij, en de beeldkeuring gedaan (één overflow-bevinding op een afbeeldingsblok opgelost mét regressietest). Formaat blijft leesbare Markdown — een menu is in het.mdgewoon een lijst van links.Eén niet-blokkerende opvolging apart geflagd: het menu-raster in de HTML-export stylen (nu vermoedelijk een linklijst i.p.v. kaarten; de PDF is wél WYSIWYG). Zodra beide PR's gemerged zijn kan dit issue dicht.
Beide PR's gemerged in main: #1189 (sprong-uit, merge
bb7b7d03) en #1192 (keuze-menudiatype, merge9148b2d9). CI-poort (static-gate + scans) groen op beide, branches opgeruimd. De volledige issue-scope — sprong-uit én keuze-menu met branching — staat op main.Sluit dit issue. De enige resterende, niet-blokkerende verfraaiing (menu-raster in de HTML-export i.p.v. een linklijst) loopt apart als losse taak.