from pathlib import Path
from weasyprint import HTML
import subprocess
root=Path('/mnt/data/next_rc57_work')
qa=root/'qa_static'; shots=root/'qa_screenshots'
qa.mkdir(exist_ok=True); shots.mkdir(exist_ok=True)
CSS=r'''
@page{margin:0}*{box-sizing:border-box}html,body{margin:0;background:#030912;color:#f8fbff;font-family:Arial,Helvetica,sans-serif}body{padding:20px 16px 96px;background:radial-gradient(620px 360px at 85% 4%,rgba(44,160,255,.18),transparent 58%),linear-gradient(180deg,#030914,#071426 58%,#020811)}.top{height:68px;border:1px solid rgba(110,220,255,.26);border-radius:24px;background:linear-gradient(180deg,rgba(10,23,42,.94),rgba(5,13,25,.96));display:flex;align-items:center;justify-content:space-between;padding:0 24px;margin-bottom:14px;box-shadow:0 14px 36px rgba(0,0,0,.24)}.menu,.person{color:#6eeaff;text-align:center;font-size:30px;font-weight:300;line-height:1;width:46px}.logo{text-align:center}.logo b{display:block;font-size:40px;line-height:.75;letter-spacing:.16em}.logo b span{color:#5ce4ff}.logo small{font-size:8px;letter-spacing:.35em;color:#77f0ff;font-weight:800}.page{max-width:1120px;margin:0 auto;display:grid;gap:14px}.head h1{font-size:48px;line-height:.9;margin:0 0 8px;font-weight:950;letter-spacing:-.055em}.head p{font-size:16px;line-height:1.35;margin:0;color:#b9c5d5;max-width:44ch}.strip{display:flex;align-items:center;gap:8px;flex-wrap:wrap;border:1px solid rgba(104,222,255,.22);border-radius:20px;background:linear-gradient(180deg,rgba(12,28,48,.76),rgba(6,15,28,.70));padding:10px 12px}.strip strong{font-size:20px;font-weight:930;width:100%}.chip{display:inline-flex;align-items:center;gap:6px;min-height:28px;border-radius:999px;border:1px solid rgba(104,222,255,.22);background:rgba(8,20,36,.62);padding:6px 9px;color:#f6fbff;font-size:12px;font-weight:830;white-space:nowrap}.section{color:#7ef1ff;text-transform:uppercase;letter-spacing:.24em;font-size:12px;font-weight:950;margin-top:6px}.card{position:relative;overflow:hidden;border:1px solid rgba(104,222,255,.24);border-radius:24px;background:radial-gradient(650px 260px at 88% 18%,rgba(45,165,255,.20),transparent 56%),linear-gradient(180deg,rgba(9,23,42,.88),rgba(4,12,24,.92));box-shadow:inset 0 1px 0 rgba(255,255,255,.04),0 18px 42px rgba(0,0,0,.20)}.featured{min-height:260px}.featured.best{border-color:rgba(126,241,255,.66);box-shadow:0 0 34px rgba(0,210,255,.13),inset 0 0 0 1px rgba(111,231,255,.08)}.img{position:absolute;inset:0 0 0 auto;width:58%;height:100%;background:radial-gradient(circle at 60% 44%,rgba(86,204,255,.35),transparent 34%),linear-gradient(135deg,transparent,rgba(30,136,220,.36));opacity:.27}.content{position:relative;z-index:1;padding:17px;display:grid;gap:10px}.badge{display:inline-flex;align-items:center;justify-self:start;min-height:27px;padding:5px 10px;border-radius:999px;border:1px solid rgba(113,231,255,.34);background:rgba(7,22,40,.58);color:#80efff;text-transform:uppercase;letter-spacing:.12em;font-size:11px;font-weight:950}.card h2{margin:0;font-size:28px;line-height:1;letter-spacing:-.045em;font-weight:950;max-width:12ch}.target{margin:0;color:#73ecff;font-weight:850;font-size:15px}.desc{margin:0;max-width:26ch;color:rgba(232,242,255,.78);line-height:1.32;font-weight:650}.chips{display:flex;flex-wrap:wrap;gap:7px}.actions{display:grid;grid-template-columns:1fr 1fr;gap:8px}.btn{min-height:44px;border:1px solid rgba(109,222,255,.32);border-radius:15px;background:rgba(5,15,30,.64);display:flex;align-items:center;justify-content:center;font-weight:900;color:#f6fbff;font-size:14px}.btn.primary{border-color:rgba(89,216,255,.85);background:linear-gradient(180deg,#73c7ff,#48a9ff);color:#061226}.list{display:grid;gap:8px}.listCard{display:grid;grid-template-columns:44px minmax(0,1fr);gap:10px;align-items:center;padding:12px;border:1px solid rgba(104,222,255,.22);border-radius:20px;background:linear-gradient(180deg,rgba(9,23,42,.82),rgba(4,12,24,.88))}.ico{width:40px;height:40px;border-radius:14px;border:1px solid rgba(104,222,255,.22);display:grid;place-items:center;color:#6eeaff}.listCard h3{margin:0 0 3px;font-size:18px;line-height:1;font-weight:940}.listCard p{margin:0;color:#73ecff;font-size:14px;font-weight:820}.listActions{grid-column:1/-1;display:grid;grid-template-columns:1fr 1fr;gap:8px}.desktop{padding:28px 28px 60px}.desktop .top{height:90px;border-radius:30px}.desktop .logo b{font-size:54px}.desktop .menu,.desktop .person{font-size:36px}.desktop .head h1{font-size:64px}.desktop .head p{font-size:22px}.desktop .strip strong{width:auto;margin-right:auto}.desktop .featuredGrid{display:grid;grid-template-columns:1fr 1fr;gap:16px}.desktop .featured{min-height:330px}.desktop .content{padding:24px}.desktop .card h2{font-size:40px;max-width:none}.desktop .listCard{grid-template-columns:58px minmax(0,1fr) 320px}.desktop .listActions{grid-column:auto;grid-template-columns:1fr 1fr}.tablet{padding:26px 24px 60px}.tablet .top{height:88px;border-radius:30px}.tablet .logo b{font-size:54px}.tablet .head h1{font-size:60px}.tablet .head p{font-size:21px}.tablet .strip strong{width:auto;margin-right:auto}.tablet .featuredGrid{display:grid;grid-template-columns:1fr 1fr;gap:14px}.tablet .content{padding:22px}.tablet .featured{min-height:330px}.tablet .card h2{font-size:34px;max-width:12ch}.tablet .listCard{grid-template-columns:54px minmax(0,1fr) 280px}.tablet .listActions{grid-column:auto;grid-template-columns:1fr 1fr}
/* QA fixture stabilizers */.listCard{display:block!important}.listCard .ico{float:left;margin:0 10px 8px 0}.listActions{clear:both;display:grid!important;grid-template-columns:1fr 1fr!important;gap:8px;margin-top:10px}.desktop .listCard,.tablet .listCard{display:grid!important}.desktop .listActions,.tablet .listActions{clear:none;margin-top:0}
'''

def shell(content,w,h,klass=''):
    return f'<!doctype html><html><head><meta charset="utf-8"><style>@page{{size:{w}px {h}px;margin:0}}{CSS}</style></head><body class="{klass}"><div class="top"><div class="menu">☰</div><div class="logo"><b>NE<span>X</span>T</b><small>ATHLETE OS</small></div><div class="person">◯</div></div>{content}</body></html>'

content='''<main class="page"><header class="head"><h1>Program</h1><p>Välj program för aktiv profil. Kalendern planerar pass utifrån programmet.</p></header><section class="strip"><strong>Isak</strong><span class="chip">⌞ Hockey</span><span class="chip">◎ 9–12 år</span><span class="chip">▥ Utveckling</span></section><div class="section">Rekommenderade program</div><section class="featuredGrid"><article class="card featured best"><div class="img"></div><div class="content"><span class="badge">★ Bäst match</span><h2>Explosiv hockeygrund</h2><p class="target">9–12 år · Utveckling</p><p class="desc">Snabbhet, styrka och koordination för unga hockeyspelare.</p><div class="chips"><span class="chip">▦ 12 pass</span><span class="chip">▦ 4 veckor</span><span class="chip">↯ 3 pass/vecka</span></div><div class="chips"><span class="chip">↯ Snabbhet</span><span class="chip">▥ Styrka</span><span class="chip">◎ Koordination</span></div><div class="actions"><div class="btn">◉ Förhandsvisa</div><div class="btn primary">✓ Välj program</div></div></div></article><article class="card featured"><div class="img"></div><div class="content"><h2>Rörlighet & kontroll</h2><p class="target">9–12 år · Utveckling</p><p class="desc">Balans, teknik och kroppskontroll med lätt utrustning.</p><div class="chips"><span class="chip">▦ 12 pass</span><span class="chip">▦ 4 veckor</span><span class="chip">↯ 3 pass/vecka</span></div><div class="chips"><span class="chip">♙ Rörlighet</span><span class="chip">♢ Kontroll</span><span class="chip">◇ Stabilitet</span></div><div class="actions"><div class="btn">◉ Förhandsvisa</div><div class="btn primary">✓ Välj program</div></div></div></article></section><div class="section">Alla program</div><section class="list"><article class="listCard"><div class="ico">▥</div><div><h3>Helkropp Bas</h3><p>9–12 år · Utveckling</p><div class="chips"><span class="chip">▥ Styrka</span><span class="chip">◎ Koordination</span><span class="chip">⌞ Teknik</span></div></div><div class="listActions"><div class="btn">◉ Förhandsvisa</div><div class="btn primary">✓ Välj program</div></div></article><article class="listCard"><div class="ico">↯</div><div><h3>Snabbhetsmix</h3><p>9–12 år · Utveckling</p><div class="chips"><span class="chip">↯ Snabbhet</span><span class="chip">⇅ Smidighet</span><span class="chip">♢ Reaktion</span></div></div><div class="listActions"><div class="btn">◉ Förhandsvisa</div><div class="btn primary">✓ Välj program</div></div></article></section></main>'''
for name,w,h,klass in [('rc57_program_mobile_390x844',390,844,''),('rc57_program_full_mobile_390x1600',390,1600,''),('rc57_program_ipad_820x1180',820,1180,'tablet'),('rc57_program_desktop_1440x1024',1440,1024,'desktop')]:
    html=qa/f'{name}.html'; pdf=qa/f'{name}.pdf'; base=shots/name
    html.write_text(shell(content,w,h,klass),encoding='utf-8')
    HTML(filename=str(html), base_url=str(root)).write_pdf(str(pdf))
    subprocess.run(['pdftoppm','-png','-singlefile','-r','144',str(pdf),str(base)],check=True)
    print(shots/f'{name}.png')
