(() => {
let root = null;
let resolveFn = null;
function ensure() {
if (root) return root;
root = document.createElement("div");
root.id = "confirm-modal";
root.className = "modal-root hidden";
root.setAttribute("role", "dialog");
root.setAttribute("aria-modal", "true");
root.innerHTML = `
`;
document.body.appendChild(root);
root.addEventListener("click", (e) => {
const t = e.target;
if (!(t instanceof Element)) return;
if (t.closest("[data-modal-cancel]")) finish(false);
if (t.closest("[data-modal-ok]")) finish(true);
});
document.addEventListener("keydown", (e) => {
if (!root || root.classList.contains("hidden")) return;
if (e.key === "Escape") {
e.preventDefault();
finish(false);
}
});
return root;
}
function finish(ok) {
if (!root || root.classList.contains("hidden")) return;
root.classList.add("hidden");
document.body.classList.remove("modal-open");
const fn = resolveFn;
resolveFn = null;
if (fn) fn(ok);
}
function t(key, fallback) {
return window.WrappedI18n?.t(key) || fallback;
}
/**
* @param {{ title?: string, message: string, confirmLabel?: string, cancelLabel?: string, danger?: boolean }} opts
* @returns {Promise}
*/
function confirm(opts) {
const el = ensure();
const title = opts.title || t("modal.confirm.title", "Confirm");
const message = opts.message || "";
const confirmLabel = opts.confirmLabel || t("modal.confirm.ok", "Confirm");
const cancelLabel = opts.cancelLabel || t("modal.confirm.cancel", "Cancel");
const danger = opts.danger !== false;
el.querySelector("#confirm-modal-title").textContent = title;
el.querySelector("#confirm-modal-message").textContent = message;
const okBtn = el.querySelector("#confirm-modal-ok");
const cancelBtn = el.querySelector("#confirm-modal-cancel");
okBtn.textContent = confirmLabel;
cancelBtn.textContent = cancelLabel;
okBtn.className = danger ? "btn danger" : "btn primary";
el.classList.remove("hidden");
document.body.classList.add("modal-open");
okBtn.focus();
return new Promise((resolve) => {
resolveFn = resolve;
});
}
window.WrappedModal = { confirm };
})();