130:function openModal(title, bodyNode, { buttons = [], wide = false, xw = false, onClose } = {}) { 131- const back = el("div", { class: "modal-back open" }); 132- const modal = el("div", { class: "modal" + (wide ? " wide" : "") + (xw ? " xw" : "") }); 133- const close = () => { back.remove(); document.body.style.overflow = ""; onClose && onClose(); }; 134- const hd = el("div", { class: "m-hd" }, el("h3", {}, title), el("button", { class: "x-btn", onclick: close }, "×")); 135- const ft = el("div", { class: "m-ft" }); 136- if (!buttons.length) buttons = [{ label: "Close", onClick: close }]; 137- for (const b of buttons) { 138- ft.append(el("button", { class: "btn " + (b.cls || b.kind || "secondary"), onclick: () => b.onClick ? b.onClick(close, modal) : close() }, b.label)); 139- } 140- modal.append(hd, el("div", { class: "m-bd" }, bodyNode), ft); 141- back.append(modal); 142- back.addEventListener("mousedown", e => { if (e.target === back) close(); }); 3: toasts, modals, confirm dialogs, helpers. 131: const back = el("div", { class: "modal-back open" }); 132: const modal = el("div", { class: "modal" + (wide ? " wide" : "") + (xw ? " xw" : "") }); 138: ft.append(el("button", { class: "btn " + (b.cls || b.kind || "secondary"), onclick: () => b.onClick ? b.onClick(close, modal) : close() }, b.label)); 140: modal.append(hd, el("div", { class: "m-bd" }, bodyNode), ft); 141: back.append(modal); 145: return { close, modal };