# SAFE_REBUILD_NOTES — JvG Training v1.3 (PowerPoint-safe rebuild van v1.2-look) **Datum:** 2026-08-18 · **Script:** `scripts/polish_safe.py` (reguliere python-pptx API) **Bestanden:** `deliverables/JvG_Training_Inhaleerbaar_Stof_v1.3.pptx` · `deliverables/JvG_Training_Master_v1.3.pptx` ## Wat v1.3 wél doet (alleen v1.1-veilige constructies) - **(a) Titelfolie (beide decks):** gelaagde solide rects — full-bleed `#003366` (master hergebruikt bestaande rect; training voegt toe achter alles), donkere bovenband `#0a1628` (1,75"), oranje diagonaal accentvlak via `MSO_SHAPE.PARALLELOGRAM` solide `#FF6D00`, geen lijn, **geen rot** (default adj 25000 geeft de diagonale schuine zijden). Training-titelrun navy→wit (leesbaarheid; alleen stijl, tekst ongewijzigd). - **(b) Elke content-slide:** accentbalk plain rect 0,04" (`36576` EMU) hoog, `#FF6D00`, geen lijn, direct onder het titelblok (titel+subtitel +0,05" gap). Training: 30× toegevoegd (y=1051560 resp. 777240 zonder subtitel); master: 9× bestaande balken (Rectangle 4) genormaliseerd naar 0,04" (y=1143000) — geen duplicaten toegevoegd. - **(c) Bullet-panelen:** `fill.solid()` `#F8F9FA` + lijn `#E5E7EB` 0,75pt (training 158, master 23 panelen). - **(d) Tabelheaders** (master slide 6, 5×4): `#003366` + witte bold runs; body zebra `FFFFFF`/`F8F9FA` per rij. Training-deck bevat geen tabellen. - **(e) Runs beginnend met ✓:** kleur `#00A859` + bold (training 16, master 6). Runs worden **niet gesplitst** (run-set blijft byte-voor-byte gelijk aan v1.1). ## Bewust weggelaten t.o.v. v1.2 — en waarom | v1.2-feature | Constructie | Waarom weg in v1.3 | |---|---|---| | Schaduw op kaarten/balken | handgebouwd `` in spPr | v1.2-crash veroorzaaker: PowerPoint herstelde/hing bij non-standaard effectLst-volgorde; voegt `effectLst`-count toe waardoor XML niet meer v1.1-equivalent is. Kaarten krijgen definitie nu uit fill+lijn i.p.v. schaduw. | | Transparantie oranje diag. vlak | `` in srgbClr | a:alpha op fill is eveneens verdachte crash-trigger; v1.3 gebruikt een solide smaller parallelogram-accent (geen alpha nodig). | | `rotation = 20°` op diag. vlak | `rot`-attribuut | rot op off-slide-rect gaf verkeerde bounding/renderafwijkingen in PowerPoint; parallelogram-prstGeom geeft het diagonale effect zonder enige rot. | | Gradient full-bleed (2 stops, angle) | `gradient()` API | gradient_stops-manipulatie is fragiel (remove-last-gs hack); vervangen door twee solide gelaagde rects — zelfde visuele dieptewerking, 100% v1.1-veilig. | | ✓-run-splitsing (los ✓-run) | deepcopy run-element | wijzigt de run-structuur; v1.3-eis is run-set identiek aan v1.1, dus hele run kleuren i.p.v. splitsen. | ## QC-resultaten (v1.3 t.o.v. v1.1) | Check | Stof (32 sl.) | Master (10 sl.) | |---|---|---| | Open-test python-pptx | OK | OK | | `effectLst` count | 95 = 95 ✓ (0 toegevoegd) | 124 = 124 ✓ (0 toegevoegd) | | `a:alpha` count | 9 = 9 ✓ (0 toegevoegd) | 9 = 9 ✓ (0 toegevoegd) | | `slide://` | 0 ✓ | 0 ✓ | | XML-parsefouten (alle parts) | 0 ✓ | 0 ✓ | | Tekst-runs (geordende lijst) | 742 = 742 ✓ identiek | 213 = 213 ✓ identiek | | `rot` toegevoegd | 0 (base 1, ongewijzigd) | 0 | | LibreOffice render → PDF | OK (32 p., pixelverificatie) | OK (10 p., pixelverificatie) | | md5 ≠ v1.1 | `ea5464187dfe3499d41f119983ac28cd` ≠ `3a10e9e131f02e076ee2e9d745588b6a` | `505123f701396996746b0a7eaa60d02d` ≠ `dbe15b1f0f8fd484574eaa29733e5115` | Pixelverificatie render @60dpi: titelfolie gelaagd (navy ~48%, donkere band ~23%, oranje parallelogram-band volledig aanwezig); accentbalken exact 96 px (1,60") op verwachte y-positie; tabelheader navy + zebra zichtbaar. ## Interne links Bestaande slide-links blijven ongewijzigd (`ppaction://hlinksldjump`, slide-rel); `slide://` komt 0× voor — voldoet aan MASTER_STYLEGUIDE §3.5.