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 };
