#!/usr/bin/env python3 """Genereer rapport_v1.0.html — responsive, JvG-branding (STYLEGUIDE v1.5 CSS-variabelen).""" import base64, os, sys sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from rapport_content import SECTIES OUT = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "deliverables", "rapport_v1.0.html") LOGO_B64 = "" b64file = "/root/projects/jg/assets/branding/logo-white-base64.txt" if os.path.isfile(b64file): LOGO_B64 = open(b64file).read().strip() if not LOGO_B64: png = "/root/projects/jg/assets/branding/jvg-consultancy-logo-white.png" if os.path.isfile(png): LOGO_B64 = base64.b64encode(open(png, "rb").read()).decode() logo_html = f'JvG Consultancy' if LOGO_B64 else "" nav = "".join(f'{titel.split(".")[0]}. {titel.split(". ",1)[1].split(" (")[0]}' for sid, titel, _ in SECTIES) secties_html = "".join(f'

{titel}

{body}
' for sid, titel, body in SECTIES) CSS = """ :root { --primair:#003366; --donker:#0a1628; --succes:#00A859; --waarschuwing:#F59E0B; --fout:#C0392B; --bg:#f4f6f9; --tekst:#1f2937; } * { margin:0; padding:0; box-sizing:border-box; } body { font-family:'Segoe UI',Roboto,Arial,sans-serif; background:var(--bg); color:var(--tekst); line-height:1.65; } header { background:var(--donker); color:#fff; padding:3rem 2rem 2.5rem; text-align:center; } header img { max-height:70px; margin-bottom:1.2rem; } header h1 { font-size:2.1rem; color:#fff; } header .sub { color:#9fb3c8; margin-top:.5rem; font-size:1.05rem; } .meta { display:flex; flex-wrap:wrap; gap:.6rem; justify-content:center; margin-top:1.4rem; } .meta span { background:rgba(255,255,255,.08); border:1px solid rgba(255,255,255,.15); padding:.25rem .8rem; border-radius:999px; font-size:.8rem; color:#cdd9e5; } nav { position:sticky; top:0; background:var(--primair); display:flex; flex-wrap:wrap; justify-content:center; gap:.2rem; padding:.6rem 1rem; z-index:10; box-shadow:0 2px 8px rgba(0,0,0,.25); } nav a { color:#dce8f5; text-decoration:none; font-size:.83rem; padding:.35rem .7rem; border-radius:6px; } nav a:hover { background:rgba(255,255,255,.12); } main { max-width:960px; margin:0 auto; padding:2rem 1.2rem 3rem; } section { background:#fff; border-radius:10px; padding:1.8rem 2rem; margin-bottom:1.6rem; box-shadow:0 1px 4px rgba(0,20,40,.08); scroll-margin-top:70px; } h2 { color:var(--primair); border-bottom:2px solid var(--primair); padding-bottom:.4rem; margin-bottom:1rem; font-size:1.35rem; } h3 { color:var(--primair); margin:1.2rem 0 .4rem; font-size:1.08rem; } p { margin-bottom:.8rem; } table { width:100%; border-collapse:collapse; margin:1rem 0; font-size:.9rem; } th { background:var(--primair); color:#fff; text-align:left; padding:.5rem .6rem; } td { border:1px solid #d7dee6; padding:.45rem .6rem; vertical-align:top; } tr:nth-child(even) td { background:#f2f5f9; } code { background:#eef2f7; padding:.1rem .35rem; border-radius:4px; font-size:.88em; } .callout { border-left:4px solid; border-radius:0 8px 8px 0; padding:.9rem 1.1rem; margin:1rem 0; } .callout.rood { background:#fdeceb; border-color:var(--fout); } .callout.amber { background:#fef6e7; border-color:var(--waarschuwing); } .callout.groen { background:#e8f7f0; border-color:var(--succes); } .kpis { display:flex; flex-wrap:wrap; gap:.8rem; margin:1rem 0; } .kpi { flex:1 1 180px; border-radius:8px; padding:.8rem 1rem; font-weight:600; text-align:center; color:#fff; } .kpi.kritiek { background:var(--fout); } .kpi.hoog { background:var(--waarschuwing); } .kpi.ok { background:var(--succes); } td.ok { color:#00703c; font-weight:600; } td.kritiek { color:var(--fout); font-weight:600; } td.hoog { color:#B47A00; font-weight:600; } ul, ol { margin:.6rem 0 .8rem 1.4rem; } footer { text-align:center; color:#7a8ba0; font-size:.8rem; padding:1.5rem; } footer a { color:var(--primair); } @media (max-width:768px) { header h1 { font-size:1.5rem; } section { padding:1.2rem 1rem; } body { font-size:15px; } h2 { font-size:1.15rem; } } """ html = f""" Uniforme Deliverables Borging — Rapport v1.0
{logo_html}

Uniforme Deliverables Borging

Foutanalyse en automatische kwaliteitsborging naar aanleiding van drie productiefouten op 24 augustus 2026
Project 2026-repair-clan-uniform-deliverablesVersie 1.024 augustus 2026Intern — Procesverbetering
{secties_html}
""" os.makedirs(os.path.dirname(OUT), exist_ok=True) with open(OUT, "w") as fh: fh.write(html) print(f"OK — {OUT} ({os.path.getsize(OUT)} bytes)")