Bundle → autonómny strategy plan → P1–P8 / canonical 1→39 execution → format-native copy → media plan → whole-page audit → lokálny auto-repair. Regenerate je iba fine-tuning detailu.
Najprv načítaj bundle a vygeneruj page.
Runtime log pripravený.
`,`text/html`)}
async function loadBundleFromFile(file){const txt=await file.text();state.bundle=JSON.parse(txt);state.strategy=null;state.sections={};state.mediaPlan=[];state.audit=null;validateBundle();renderAll();status("Bundle načítaný.","ok")}
async function loadSample(){try{const r=await fetch("./native_page_engine_context_bundle%20(1).json");if(!r.ok)throw new Error("Sample bundle sa nedá načítať cez relatívnu URL. Vyber ho cez file input.");state.bundle=await r.json();validateBundle();renderAll()}catch(e){handleError(e)}}
$("bundleFile").addEventListener("change",e=>{const f=e.target.files?.[0];if(f)loadBundleFromFile(f).catch(handleError)});
$("mediaFiles").addEventListener("change",async e=>{for(const f of e.target.files||[]){const dataUrl=await new Promise((res,rej)=>{const r=new FileReader();r.onload=()=>res(r.result);r.onerror=rej;r.readAsDataURL(f)});state.mediaAssets.push({asset_id:"MEDIA_"+String(state.mediaAssets.length+1).padStart(3,"0"),name:f.name,type:f.type||"application/octet-stream",description:"",group_hint:"",dataUrl})}e.target.value="";renderAll();saveLocal()});
$("validateBundle").onclick=()=>{try{const v=validateBundle();status(`Bundle OK: ${v.format}, ${v.coverage}/39, ${v.sections} sections.`,`ok`);updateBundleStatus()}catch(e){handleError(e)}};
$("loadSample").onclick=()=>loadSample();$("generateFull").onclick=()=>generateFullPage();$("auditPage").onclick=()=>auditPage().catch(handleError);$("repairPage").onclick=()=>autoRepair().catch(handleError);$("exportHtml").onclick=()=>exportPage();$("saveProject").onclick=()=>saveProject();$("resetProject").onclick=()=>reset();document.querySelectorAll(".tab").forEach(b=>b.onclick=()=>switchTab(b.dataset.tab));
renderAll();