#!/usr/bin/env python3
"""Genereert T18 Loodsbewustzijn e-learning - Phoenix Metals B.V."""
import os
OUTPUT = '/root/projects/jg/2026-PM-eLearning/deliverables/PM_EL_T18_Loodsbewustzijn_eLearning_v1.1.html'
TITLE = "T18: Loodsbewustzijn"; SUBTITLE = "Training Loodsbewustzijn (TR-302-10)"
CERT_TRAINING = "T18: Loodsbewustzijn (TR-302-10)"; CERT_TITLE = "Loodsbewustzijn"
MODULES = [
    {"title": "Lood in staalslakkencontext", "paragraphs": ["Lood (Pb) is een zwaar metaal dat van nature voorkomt in staalslakken, een bijproduct van de staalproductie dat Phoenix Metals verwerkt. Bij de extractie van vanadium uit staalslakken kan lood vrijkomen als stof, damp of in opgeloste vorm.", "Staalslakken bevatten typisch 0,01-0,1% lood, afhankelijk van de herkomst van het staalschroot en het productieproces. Bij het verwerken van staalslakken (breken, malen, zeven, thermische behandeling) kan loodhoudend stof vrijkomen dat door inademing in het lichaam terechtkomt.", "Lood is een cumulatief gif: het hoopt zich op in het lichaam, vooral in de botten, nieren en het zenuwstelsel. Het lichaam scheidt lood zeer langzaam uit (halveringstijd in bloed ca. 30 dagen, in botten 10-30 jaar). Elke blootstelling draagt bij aan de totale lichaamsbelasting.", "In de verwerkingsketen van Phoenix Metals zijn de belangrijkste blootstellingssituaties: droog breken en malen van staalslakken (stofvorming), thermische processen bij hoge temperatuur (looddamp), hanteren van loodhoudende residuen, en onderhoud en reiniging van installaties waar zich loodhoudend stof heeft opgehoopt.", "De gezondheidswaarde van lood is al bekend bij zeer lage concentraties. De EU beroepsmatige grenswaarde is recent verlaagd naar 0,15 mg/m3 (als loodinhoudende stof). Voor reproductieve toxiciteit (Repr. 1A) geldt dat blootstelling moet worden geminimaliseerd."], "fact": "Lood is een van de oudst bekende giften. De Romeinen gebruikten lood voor waterleidingen en kookgerei, wat naar schatting heeft bijgedragen aan de val van het Romeinse Rijk door chronische loodvergiftiging van de elite.", "practice": "Phoenix Metals monitort de loodconcentratie in staalslakken per charge. Bij gehalten boven 0,05% worden extra stofbeheersmaatregelen getroffen: gesloten verwerking, extra afzuiging en verhoogde PBM-eisen.", "question": "Waarom is lood in staalslakken een risico bij verwerking?", "options": ["Het is radioactief", "Het kan vrijkomen als stof of damp bij breken en verhitten", "Het reageert explosief met zuurstof", "Het is alleen een risico bij ingestie"], "correct": 1},
    {"title": "Gezondheidseffecten: loodvergiftiging, neurologisch, nieren", "paragraphs": ["Loodvergiftiging (saturnisme) is een ernstige aandoening die optreedt bij accumulatie van lood in het lichaam. De effecten zijn afhankelijk van de blootstellingsduur, concentratie en individuele gevoeligheid. Kinderen en ongeboren kinderen zijn extra gevoelig.", "Neurologische effecten: Lood beschadigt het centraal en perifere zenuwstelsel. Symptomen: hoofdpijn, geheugenverlies, concentratieproblemen, slapeloosheid, prikkelbaarheid en tremoren. Bij ernstige blootstelling: encefalopathie, stuipen en coma. Chronische blootstelling leidt tot permanente cognitieve achteruitgang.", "Niereffecten: Lood hoopt zich op in de nieren en beschadigt de tubuli (nierbuisjes). Dit leidt tot verminderde nierfunctie, proteine in de urine en bij langdurige blootstelling tot chronisch nierfalen. Nierschade door lood is grotendeels onomkeerbaar.", "Reproductieve effecten: Lood is geclassificeerd als Repr. 1A (bekend reproductief toxisch). Effecten: verminderde vruchtbaarheid bij mannen, verhoogd risico op miskraam, en ontwikkelingsstoornissen bij het ongeboren kind. Zwangere vrouwen mogen niet worden blootgesteld aan lood.", "Hematologische effecten: Lood verstoort de aanmaak van hemoglobine (bloedarmoede), remt enzymen nodig voor de bloedaanmaak en verkort de levensduur van rode bloedcellen. Symptomen zijn vermoeidheid, bleekheid en kortademigheid."], "fact": "De WHO stelt dat er geen veilig niveau van loodblootstelling bestaat. Zelfs bloedloodwaarden onder 5 ug/dL zijn geassocieerd met cognitieve effecten bij kinderen.", "practice": "Phoenix Metals biedt medewerkers die werken met staalslakken periodieke medische controle aan inclusief bloedloodbepaling. Bij waarden boven 20 ug/dL worden extra maatregelen getroffen.", "question": "Welk orgaansysteem is HET MEEST gevoelig voor lood bij kinderen?", "options": ["Het hart- en vaatstelsel", "Het zenuwstelsel (neurologisch)", "De longen", "De lever"], "correct": 1},
    {"title": "Routes van opname: inhalatie en ingestie", "paragraphs": ["Lood komt het lichaam binnen via drie routes: inhalatie (inademen), ingestie (inslikken) en in beperkte mate dermaal (door de huid). Bij beroepsmatige blootstelling zijn inhalatie en ingestie de belangrijkste routes.", "Inhalatie: Het inademen van loodhoudend stof of damp is de belangrijkste blootstellingsroute bij Phoenix Metals. Fijn stof (<10 um) bereikt de longen en wordt daar opgenomen in de bloedbaan. Looddamp bij hoge temperaturen wordt bijna volledig geabsorbeerd.", "Ingestie: Het inslikken van looddeeltjes via hand-mond contact is de tweede belangrijke route. Dit gebeurt door niet gewassen handen bij eten of drinken, roken met besmette handen, of loodhoudend stof dat uit de luchtwegen wordt doorgeslikt.", "Dermale opname: Anorganisch lood wordt slechts in zeer beperkte mate door de huid opgenomen. Bij Phoenix Metals gaat het voornamelijk om anorganisch lood, maar huidcontact moet toch worden vermeden.", "De opname via inhalatie is ca. 30-50% van de ingeademde hoeveelheid; via ingestie bij volwassenen ca. 10%. Goede hygiene en stofbeheersing zijn beide cruciaal om alle opnameroutes af te dekken."], "fact": "Een werknemer die na een shift niet de handen wast en een boterham eet, kan via ingestie evenveel lood opnemen als via inademing tijdens de hele werkdag.", "practice": "Phoenix Metals hanteert een strikt hygieneprotocol: wassen van handen en gezicht voor eten, drinken en roken; werk- en straatkleding scheiden; douchen na afloop van de shift; eten en drinken ALLEEN in de kantine.", "question": "Welke twee routes zijn het belangrijkst bij beroepsmatige loodblootstelling?", "options": ["Dermaal en inhalatie", "Inhalatie en ingestie", "Ingestie en dermaal", "Alleen inhalatie"], "correct": 1},
    {"title": "H-gevaar: Repr. 1A en STOT RE 2", "paragraphs": ["Volgens de CLP-verordening wordt lood geclassificeerd met specifieke H-zinnen. Voor Phoenix Metals zijn vooral Repr. 1A en STOT RE 2 relevant.", "Repr. 1A (H360Df): Kan het ongeboren kind beschadigen. Vermoedelijk schadelijk voor de vruchtbaarheid. Dit is de strengste categorie voor reproductieve toxiciteit, gebaseerd op voldoende bewijs bij de mens.", "STOT RE 2 (H373): Kan schade aan organen toebrengen bij langdurige of herhaalde blootstelling. Voor lood zijn de doelorganen: het zenuwstelsel, de nieren en het bloedsysteem.", "Andere classificaties: Acute toxiciteit (H302, H332), mogelijke carcinogeniteit (H351 voor sommige loodverbindingen), en milieugevaarlijkheid (H410). Deze classificaties hebben directe consequenties voor etikettering, VIB's en medische surveillance.", "Phoenix Metals moet al deze classificaties communiceren op werkplekinstructies en etiketten, en de bijbehorende veiligheidsmaatregelen implementeren volgens het VIB en de RI&E."], "fact": "De H360Df classificatie betekent dat lood een van de weinige stoffen is met bewezen effecten op de menselijke voortplanting. Het staat op de EU SVHC-lijst (stoffen van zeer hoge zorg).", "practice": "Phoenix Metals communiceert de H-zinnen van lood op alle werkplekinstructies. Medewerkers worden getraind in de betekenis van Repr. 1A en STOT RE 2 en de bijbehorende veiligheidsmaatregelen.", "question": "Wat betekent Repr. 1A (H360Df)?", "options": ["Mogelijk irriterend", "Bewezen reproductief toxisch, schade ongeboren kind en vruchtbaarheid", "Brandgevaarlijk", "Alleen milieugevaarlijk"], "correct": 1},
    {"title": "Blootstellingslimiet: 0,15 mg/m3", "paragraphs": ["De wettelijke beroepsmatige blootstellingslimiet (OEL) voor lood in lucht bedraagt 0,15 mg/m3 (als tijdsgewogen gemiddelde over 8 uur). Deze limiet is recent verlaagd van 0,45 mg/m3.", "Naast de luchtlimiet is er een biologische grenswaarde: het loodgehalte in bloed (BLL) mag niet hoger zijn dan 30 ug/dL (mannen) en 20 ug/dL (vrouwen in vruchtbare leeftijd). Bij overschrijding worden onmiddellijk maatregelen genomen.", "De grenswaarde geldt voor de totale loodconcentratie in inadembare lucht. Voor specifieke loodverbindingen kunnen strengere limieten gelden, bijvoorbeeld voor loodchromaten.", "Blootstellingsmetingen worden uitgevoerd met persoonlijke monsternamepompen met filters of stationaire metingen. De meetresultaten worden geregistreerd en gebruikt om beheersmaatregelen te evalueren.", "Phoenix Metals voert minimaal tweemaal per jaar blootstellingsmetingen uit bij medewerkers die werken met loodhoudende materialen. Resultaten worden vergeleken met de OEL en besproken met bedrijfsarts en OR."], "fact": "De EU werkt aan een verdere verlaging van de OEL voor lood naar 0,03 mg/m3. Blootstellingslimieten worden steeds verder verlaagd naarmate wetenschap meer gezondheidseffecten aantoont.", "practice": "Phoenix Metals streeft naar blootstelling onder 50% van de OEL (dus < 0,075 mg/m3) als interne streefwaarde. Bij overschrijding van de OEL wordt werk direct stilgelegd.", "question": "Wat is de huidige wettelijke OEL voor lood in lucht?", "options": ["0,05 mg/m3", "0,10 mg/m3", "0,15 mg/m3", "0,50 mg/m3"], "correct": 2},
    {"title": "PBM: FFP3 masker en nitril handschoenen", "paragraphs": ["PBM zijn de laatste schakel in de bescherming tegen loodblootstelling. Bij Phoenix Metals zijn FFP3 maskers en nitril handschoenen de minimale PBM-eisen bij werkzaamheden met loodhoudende materialen.", "FFP3 masker: Filtert minimaal 99% van de deeltjes uit de inademingslucht. Vereist bij werkzaamheden met loodhoudend stof: breken, malen, zeven, transport, onderhoud en reiniging. Het masker moet goed aansluiten op het gezicht; baardgroei verhindert een goede afdichting.", "Nitril handschoenen: Nitril vormt een goede barrier en is bestand tegen de meeste chemicalien bij Phoenix Metals. Handschoenen bij beschadiging direct vervangen. Na het uitdoen: handen wassen.", "Overige PBM: veiligheidsbril (stof in de ogen), overall of wegwerpkleding (voorkomt stof op huid en onderkleding), en gescheiden schoeisel. Wegwerpkleding wordt na de shift ingezameld als besmet afval.", "PBM is een aanvulling op, geen vervanging van, collectieve beheersmaatregelen zoals afzuiging, gesloten verwerking en stofonderdrukking. De STOP-hierarchie blijft gelden."], "fact": "Een FFP2 masker filtert 94% en een FFP3 filtert 99% van de deeltjes. Voor lood is FFP3 vereist vanwege de toxiciteit bij zeer lage concentraties.", "practice": "Phoenix Metals verstrekt FFP3 maskers met uitademklep voor comfort bij langdurig gebruik. Maskers worden per shift verstrekt en na gebruik weggegooid. Pas-op-testen zorgen voor de juiste maat per medewerker.", "question": "Waarom is een FFP3 masker vereist en geen FFP2?", "options": ["FFP3 is goedkoper", "FFP3 filtert 99% vs FFP2 94% — lood vereist maximale filtratie", "FFP2 bestaat niet", "FFP3 is comfortabeler"], "correct": 1},
    {"title": "Hygieneregels: niet eten, drinken, roken", "paragraphs": ["Persoonlijke hygiene is een van de belangrijkste maatregelen om loodopname via ingestie te voorkomen. Bij Phoenix Metals gelden strikte hygieneregels voor alle medewerkers die werken met loodhoudende materialen.", "Niet eten, drinken of roken in het werkgebied: deze basisregel voorkomt dat looddeeltjes via de handen of via de lucht in voedsel, drinken of de sigaret terechtkomen. Eten en drinken is uitsluitend toegestaan in de aangewezen kantine.", "Handen wassen: Altijd handen wassen met water en zeep voor het eten, drinken, roken, naar het toilet gaan en voor het verlaten van het werkgebied. Desinfectiegel alleen is onvoldoende — looddeeltjes moeten fysiek worden verwijderd.", "Kleding: Werkkleding en straatkleding strikt gescheiden houden. Werkkleding op de werkplek aan- en uittrekken in de kleedruimte. Werkkleding door het bedrijf laten wassen — NOOIT meenemen naar huis. Lood op thuiskleding brengt het gezin in gevaar.", "Thuisbesmetting (take-home exposure) is een erkend probleem. Kinderen van werkers die loodstof meenemen op kleding of schoenen hebben significant hogere bloedloodwaarden dan gemiddeld."], "fact": "Kinderen van loodwerkers die hun werkschoenen meenemen naar huis bleken tot 5 keer hogere bloedloodwaarden te hebben dan leeftijdsgenoten. Dit fenomeen heet 'take-home lead exposure'.", "practice": "Phoenix Metals faciliteert gescheiden kleedruimtes met lockers voor werk- en straatkleding. Douches zijn beschikbaar en hun gebruik wordt sterk aangemoedigd na elke shift met loodblootstelling.", "question": "Waarom mag werkkleding NIET mee naar huis?", "options": ["Het is te vies", "Thuisbesmetting met lood brengt gezin (vooral kinderen) in gevaar", "Het is bedrijfseigendom", "Het mag niet in de wasmachine"], "correct": 1},
    {"title": "Medische controle bij loodblootstelling", "paragraphs": ["Medische surveillance is verplicht voor medewerkers die beroepsmatig worden blootgesteld aan lood. De Arbowetgeving vereist periodiek gezondheidstoezicht door een bedrijfsarts.", "Bloedloodbepaling: De belangrijkste maat voor de loodbelasting is het loodgehalte in bloed (BLL). De bloedafname gebeurt door de bedrijfsarts of een medisch laboratorium. De uitslag wordt vergeleken met de biologische grenswaarde.", "Frequentie: Pre-employment (baseline bij indiensttreding), daarna periodiek. Bij blootstelling boven 50% van de OEL: minimaal halfjaarlijks. Bij blootstelling onder 50% van de OEL: jaarlijks. Bij overschrijding van de biologische grenswaarde: extra monitoring.", "Aanvullend onderzoek: bloedbeeld (hemoglobine, hematocriet), nierfunctie (creatinine, urine-eiwit), zenuwgeleidingsonderzoek (bij klachten), en vruchtbaarheidsonderzoek (op verzoek).", "Bij overschrijding van de biologische grenswaarde wordt de medewerker tijdelijk overgeplaatst naar werkzaamheden zonder loodblootstelling, de bron wordt onderzocht en beheersmaatregelen worden aangescherpt."], "fact": "De halfwaardetijd van lood in bloed is ca. 30 dagen, maar in botten 10-30 jaar. Chronische blootstelling leidt tot een opbouw die jaren aanhoudt na stopzetten van de blootstelling.", "practice": "Phoenix Metals heeft een medisch surveillanteprogramma via een gespecialiseerde bedrijfsarts. Alle resultaten worden vertrouwelijk behandeld en besproken met de medewerker. Jaarlijks wordt een rapportage opgesteld over groepsresultaten.", "question": "Wat is de belangrijkste maat voor de loodbelasting van het lichaam?", "options": ["Urinetest", "Haaranalyse", "Bloedloodbepaling (BLL)", "Rontgenfoto van de botten"], "correct": 2},
    {"title": "Phoenix Metals risicosituaties met lood", "paragraphs": ["Op de Phoenix Metals locaties zijn specifieke situaties waarbij een verhoogd risico op loodblootstelling bestaat. Het herkennen van deze situaties is essentieel.", "Breken en malen van staalslakken: het mechanisch verkleinen is de belangrijkste bron van loodhoudend stof. De combinatie van droog materiaal, hoge energie-inbreng en fijn deeltjes creert een aanzienlijk stofrisico. Maatregelen: gesloten systeem, afzuiging bij de bron, stofonderdrukking.", "Thermische verwerking: Bij hoge temperaturen in de reactor kan lood verdampen (kookpunt 1749C, maar dampvorming begint al bij 500C). Looddamp condenseert tot zeer fijne deeltjes die diep in de longen doordringen. Maatregelen: gesloten reactor, adequate afzuiging, continue luchtmonitoring.", "Onderhoud en reiniging: Bij het openen van installaties kan zich loodhoudend stof hebben opgehoopt. Schoonmaken met perslucht of droog vegen is VERBODEN. Maatregelen: HEPA-stofzuiger, nat schoonmaken, FFP3 masker, overall.", "Opslag en transport: Loodhoudend materiaal moet zodanig worden opgeslagen en getransporteerd dat geen stofverspreiding optreedt. Afgedekte containers, gesloten transportbanden en bevochtigd materiaal voorkomen emissie."], "fact": "Bij temperaturen boven 500C ontstaat zichtbare looddamp. Bij 1000C bedraagt de dampdruk voldoende om binnen enkele uren een significante blootstelling te veroorzaken in een niet-geventileerde ruimte.", "practice": "Phoenix Metals hanteert een stofbeheersplan: (1) Bronmaatregelen (gesloten systemen, bevochtigen), (2) Afzuiging (lokale afzuiging bij alle stofbronnen), (3) PBM (FFP3 bij alle werkzaamheden met mogelijk loodstof).", "question": "Wat is de belangrijkste bron van loodhoudend stof bij Phoenix Metals?", "options": ["Kantoorwerkzaamheden", "Breken en malen van staalslakken", "Externe vergaderingen", "ICT-activiteiten"], "correct": 1},
    {"title": "Monitoring en registratie van loodblootstelling", "paragraphs": ["Systematische monitoring en registratie van loodblootstelling zijn verplicht en vormen de basis voor het evalueren en verbeteren van beheersmaatregelen. Phoenix Metals hanteert een uitgebreid monitoringprogramma.", "Persoonlijke blootstellingsmetingen: Medewerkers dragen een persoonlijke monsternamepomp met filter gedurende een representatieve periode (meestal een volledige shift). Het filter wordt geanalyseerd op loodgehalte, uitgedrukt als mg/m3 (tijdsgewogen gemiddelde over 8 uur).", "Stationaire metingen: Op vaste locaties worden luchtmonsters genomen om de achtergrondblootstelling te bepalen. Dit helpt bij het identificeren van hotspots en het evalueren van ventilatie en afzuiging.", "Biologische monitoring: Naast luchtmetingen worden bloedloodbepalingen uitgevoerd. De combinatie van lucht- en bloedmetingen geeft een compleet beeld van de werkelijke blootstelling en de effectiviteit van PBM en hygienemaatregelen.", "Registratie en rapportage: Alle meetresultaten worden geregistreerd in een blootstellingsregister. Per medewerker wordt een dossier bijgehouden met alle metingen, medische controles en genomen maatregelen. Jaarlijks wordt een overzicht geproduceerd voor directie, OR en Arbeidsinspectie."], "fact": "Sinds de invoering van systematische blootstellingsregistratie bij Phoenix Metals is de gemiddelde loodblootstelling gedaald met 40% in twee jaar tijd. Monitoring werkt.", "practice": "Phoenix Metals publiceert quarterly een geannonimiseerd overzicht van de meetresultaten op het mededelingenbord. Transparantie over blootstelling draagt bij aan bewustwording en veiligheidscultuur.", "question": "Wat is het doel van het blootstellingsregister?", "options": ["Alleen voor de boekhouding", "Evalueren en verbeteren van beheersmaatregelen en documenteren blootstelling per medewerker", "Alleen voor de Arbeidsinspectie", "Alleen bij ongevallen"], "correct": 1}
]
QUIZ = [
    {"question": "Waarom is lood in staalslakken een risico?", "options": ["Radioactief", "Vrijkomen als stof/damp bij breken en verhitten", "Explosief met zuurstof", "Alleen risico bij ingestie"], "correct": 1},
    {"question": "Welk orgaansysteem is meest gevoelig voor lood bij kinderen?", "options": ["Hart-vaatstelsel", "Zenuwstelsel", "Longen", "Lever"], "correct": 1},
    {"question": "Belangrijkste opnameroutes bij beroepsmatige loodblootstelling?", "options": ["Dermaal en inhalatie", "Inhalatie en ingestie", "Ingestie en dermaal", "Alleen inhalatie"], "correct": 1},
    {"question": "Wat betekent Repr. 1A (H360Df)?", "options": ["Irriterend", "Bewezen reproductief toxisch", "Brandgevaarlijk", "Milieugevaarlijk"], "correct": 1},
    {"question": "Wat is de wettelijke OEL voor lood in lucht?", "options": ["0,05 mg/m3", "0,10 mg/m3", "0,15 mg/m3", "0,50 mg/m3"], "correct": 2},
    {"question": "Waarom FFP3 en geen FFP2?", "options": ["Goedkoper", "FFP3 filtert 99% vs FFP2 94%", "FFP2 bestaat niet", "Comfortabeler"], "correct": 1},
    {"question": "Waarom geen werkkleding mee naar huis?", "options": ["Te vies", "Thuisbesmetting brengt gezin in gevaar", "Bedrijfseigendom", "Niet in wasmachine"], "correct": 1},
    {"question": "Belangrijkste maat voor loodbelasting?", "options": ["Urinetest", "Haaranalyse", "Bloedloodbepaling (BLL)", "Rontgenfoto"], "correct": 2},
    {"question": "Belangrijkste bron loodhoudend stof bij Phoenix Metals?", "options": ["Kantoor", "Breken en malen staalslakken", "Vergaderingen", "ICT"], "correct": 1},
    {"question": "Doel blootstellingsregister?", "options": ["Boekhouding", "Evalueren/verbeteren beheersmaatregelen", "Alleen Arbeidsinspectie", "Alleen bij ongevallen"], "correct": 1}
]

# Use the same build_html and boilerplate as T17
def esc(s): return s.replace("\\","\\\\").replace('"','\\"').replace("\n"," ")

def build_html():
    mods_js = "[\n"
    for m in MODULES:
        mods_js += "            {{\n"
        mods_js += '                title: "' + esc(m["title"]) + '",\n                paragraphs: [\n'
        for p in m["paragraphs"]: mods_js += '                    "' + esc(p) + '",\n'
        mods_js += '                ],\n                fact: "' + esc(m["fact"]) + '",\n'
        mods_js += '                practice: "' + esc(m["practice"]) + '",\n'
        mods_js += '                question: "' + esc(m["question"]) + '",\n                options: [\n'
        for o in m["options"]: mods_js += '                    "' + esc(o) + '",\n'
        mods_js += "                ],\n                correct: " + str(m["correct"]) + "\n            }},\n"
    mods_js += "        ]"
    quiz_js = "[\n"
    for q in QUIZ:
        quiz_js += '            {{ question: "' + esc(q["question"]) + '", options: ['
        quiz_js += ",".join(['"' + esc(o) + '"' for o in q["options"]])
        quiz_js += "], correct: " + str(q["correct"]) + " }},\n"
    quiz_js += "        ]"
    CSS = ":root{--primary:#003366;--secondary:#1a5276;--bg:#e8f4f8;--accent:#f39c12;--error:#e74c3c;--correct:#27ae60}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Arial,sans-serif;background:var(--bg);color:#333;line-height:1.6}.container{max-width:1200px;margin:0 auto;padding:20px}header{background:var(--primary);color:#fff;padding:20px 0;text-align:center;position:sticky;top:0;z-index:100;box-shadow:0 2px 10px rgba(0,0,0,.1)}.progress-bar{background:#ddd;height:20px;width:100%;position:sticky;top:80px;z-index:99;margin-bottom:20px;border-radius:10px;overflow:hidden}.progress{background:var(--accent);height:100%;width:0%;transition:width .5s ease}.module{background:#fff;padding:25px;margin-bottom:25px;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,.1)}.module h2{color:var(--primary);border-bottom:2px solid var(--accent);padding-bottom:10px;margin-bottom:15px}.paragraph{margin-bottom:15px;text-align:justify}.info-box{background:#f0f8ff;border-left:4px solid var(--secondary);padding:15px;margin:15px 0;border-radius:0 5px 5px 0}.info-box h3{color:var(--secondary);margin-bottom:10px;display:flex;align-items:center}.practice-box{background:#fff8dc;border:1px solid var(--accent);padding:15px;margin:15px 0;border-radius:5px}.practice-box h3{color:var(--accent);margin-bottom:10px}.question{background:#fff;border:1px solid #ddd;padding:15px;margin:15px 0;border-radius:5px}.question h3{color:var(--primary);margin-bottom:10px}.options{display:grid;gap:10px}.option{padding:10px;border:1px solid #ddd;border-radius:5px;cursor:pointer;transition:all .3s}.option:hover{background:#f0f0f0}.option.selected{border-color:var(--primary);background:#f0f8ff}.option.correct{background:var(--correct);color:#fff}.option.incorrect{background:var(--error);color:#fff}.certificate{background:linear-gradient(135deg,#f5f7fa 0%,#c3cfe2 100%);padding:30px;text-align:center;border-radius:10px;margin-top:30px}.certificate h2{color:var(--primary);margin-bottom:20px}.certificate-content{background:#fff;padding:30px;border-radius:10px;box-shadow:0 4px 15px rgba(0,0,0,.1)}.button{background:var(--primary);color:#fff;border:none;padding:12px 25px;border-radius:5px;cursor:pointer;font-size:16px;transition:background .3s}.button:hover{background:var(--secondary)}.hidden{display:none}.quiz-container{margin-top:30px}footer{background:var(--primary);color:#fff;text-align:center;padding:20px;margin-top:40px}"
    JS = "const totalModules=10,totalQuestions=10;let currentProgress=0,correctAnswers=0;const modules="+mods_js+";const quizQuestions="+quiz_js+";function initModules(){const mc=document.getElementById('modules');modules.forEach((mod,i)=>{const d=document.createElement('div');d.className='module';d.innerHTML='<h2>Module '+(i+1)+': '+mod.title+'</h2>'+mod.paragraphs.map(p=>'<p class=\"paragraph\">'+p+'</p>').join('')+'<div class=\"info-box\"><h3>&#x1F4D6; Wist je dat?</h3><p>'+mod.fact+'</p></div><div class=\"practice-box\"><h3>&#x1F3ED; Phoenix Metals Praktijk</h3><p>'+mod.practice+'</p></div><div class=\"question\"><h3>Controlevraag</h3><p><strong>'+mod.question+'</strong></p><div class=\"options\">'+mod.options.map((o,oi)=>'<div class=\"option\" onclick=\"selectOption(this,'+oi+','+mod.correct+')\">'+String.fromCharCode(65+oi)+'. '+o+'</div>').join('')+'</div></div>';mc.appendChild(d);updateProgress(((i+1)/totalModules)*100)});const qb=document.createElement('div');qb.innerHTML='<button class=\"button\" onclick=\"showQuiz()\">Quiz Voltooien</button>';mc.appendChild(qb)}function updateProgress(p){document.getElementById('progress').style.width=p+'%';currentProgress=p}function selectOption(el,si,ci){const opts=el.parentElement.querySelectorAll('.option');opts.forEach(o=>o.classList.remove('selected','correct','incorrect'));el.classList.add('selected');setTimeout(()=>{if(si===ci)el.classList.add('correct');else{el.classList.add('incorrect');opts[ci].classList.add('correct')}opts.forEach(o=>o.style.pointerEvents='none')},300)}function showQuiz(){document.getElementById('modules').classList.add('hidden');document.getElementById('quiz-container').classList.remove('hidden');updateProgress(100);initQuiz()}function initQuiz(){const qc=document.getElementById('quiz-questions');quizQuestions.forEach((q,i)=>{const d=document.createElement('div');d.className='question';d.innerHTML='<h3>Vraag '+(i+1)+': '+q.question+'</h3><div class=\"options\">'+q.options.map((o,oi)=>'<div class=\"option quiz-option\" onclick=\"selectQuizOption(this,'+oi+','+q.correct+')\">'+String.fromCharCode(65+oi)+'. '+o+'</div>').join('')+'</div>';qc.appendChild(d)})}function selectQuizOption(el,si,ci){const qe=el.closest('.question');const opts=qe.querySelectorAll('.option');opts.forEach(o=>{o.classList.remove('selected','correct','incorrect');o.style.pointerEvents='none'});el.classList.add('selected');if(si===ci){el.classList.add('correct');correctAnswers++}else{el.classList.add('incorrect');opts[ci].classList.add('correct')}}function checkQuiz(){const pct=(correctAnswers/totalQuestions)*100;const msg=pct>=80?'Gefeliciteerd! '+correctAnswers+'/'+totalQuestions+' correct ('+pct.toFixed(1)+'%).':'Helaas, '+correctAnswers+'/'+totalQuestions+' correct ('+pct.toFixed(1)+'%). 80% vereist.';alert(msg);if(pct>=80)document.getElementById('certificate-button').classList.remove('hidden');else document.getElementById('retry-button').classList.remove('hidden')}function resetQuiz(){document.getElementById('quiz-questions').innerHTML='';document.getElementById('retry-button').classList.add('hidden');document.getElementById('certificate-button').classList.add('hidden');correctAnswers=0;initQuiz()}function showCertificate(){document.getElementById('quiz-container').classList.add('hidden');document.getElementById('certificate').classList.remove('hidden')}window.onload=function(){initModules()}"
    return f"""<!DOCTYPE html><html lang="nl"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>Phoenix Metals - {TITLE}</title><style>{CSS}</style></head><body><div class="progress-bar"><div class="progress" id="progress"></div></div><header><h1>Phoenix Metals B.V. - {TITLE}</h1><p>{SUBTITLE}</p></header><div class="container" id="modules"></div><div class="quiz-container hidden" id="quiz-container"><div class="module"><h2>Quiz - 10 vragen (80% cesuur)</h2><div id="quiz-questions"></div><button class="button" onclick="checkQuiz()">Resultaten Controleren</button><button class="button hidden" id="retry-button" onclick="resetQuiz()">Opnieuw Proberen</button><button class="button hidden" id="certificate-button" onclick="showCertificate()">Certificaat Bekijken</button></div></div><div class="certificate hidden" id="certificate"><h2>Bewijs van Voltooiing</h2><div class="certificate-content"><p>Deze certificeert dat de deelnemer de training <strong>{CERT_TITLE}</strong> met succes heeft afgerond.</p><p><strong>Deelnemer:</strong> _________________________</p><p><strong>Bedrijf:</strong> Phoenix Metals B.V.</p><p><strong>Training:</strong> {CERT_TRAINING}</p><p><strong>Datum:</strong> _________________________</p><p><strong>Resultaat:</strong> _________________________</p></div></div><footer><p>Phoenix Metals B.V. | Safety &amp; Governance &amp; Advisory | &amp;copy; 2026</p></footer><script>{JS}</script></body></html>"""

if __name__ == "__main__":
    os.makedirs(os.path.dirname(OUTPUT), exist_ok=True)
    with open(OUTPUT, 'w', encoding='utf-8') as f:
        f.write(build_html())
    sz = os.path.getsize(OUTPUT)
    print(f"T18: {sz} bytes ({sz/1024:.1f} KB)" + (" ⚠️ <30KB!" if sz < 30000 else " ✅"))
