53:          <button class="btn xs secondary" data-pdf="${t.id}">Test PDF</button>
54:          <button class="btn xs secondary" data-dup="${t.id}">Duplicate</button>
55:          <button class="btn xs danger-o" data-del="${t.id}">Delete</button>
60:    $$("#gal [data-pdf]").forEach(b => b.onclick = () => testPdf(+b.dataset.pdf));
61:    $$("#gal [data-dup]").forEach(b => b.onclick = async () => {
62:      try { const d = await POST(`/templates/${b.dataset.dup}/duplicate`); toast(`Duplicated — new template #${d.id}`, "ok"); load(); }
63:      catch (e) { toast(e.message, "err", 6000); }
65:    $$("#gal [data-del]").forEach(b => b.onclick = () =>
74:    catch (e) { toast(e.message, "err", 6000); return; }
90:    toast("Rendering PDF via WeasyPrint…", "info");
95:      toast(`PDF generated — ${fmtBytes(d.size_bytes)} (${d.engine})`, "ok");
96:    } catch (e) { toast(e.message, "err", 6000); }
101:  $("#btnClear").onclick = () =>
