@fylgja/alpinejs-dialog
Version:
Bring the power of AlpineJs to the HTML dialog
119 lines (115 loc) • 4.18 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/module.js
var module_exports = {};
__export(module_exports, {
default: () => module_default
});
module.exports = __toCommonJS(module_exports);
// src/dialog.js
function dialog_default(Alpine) {
Alpine.directive("htmldialog", fylgjaAlpineDialog);
function fylgjaAlpineDialog(el, { expression, modifiers }, { evaluateLater, cleanup }) {
const evaluate = expression.length ? evaluateLater(expression) : () => {
};
const lockPageScroll = modifiers.includes("noscroll");
const isModeless = modifiers.includes("modeless");
const closeBy = el.getAttribute("closeby") || modifierValue(modifiers, "closeby", "closerequest");
el.style.display = null;
el.style.length === 0 && el.removeAttribute("style");
if (el._x_isShown) {
open();
}
const closeBySupported = (() => {
return "closedBy" in HTMLDialogElement.prototype;
})();
function scrollLock(use = true) {
document.body.style.overflow = use ? "hidden" : "";
}
function dialogSubmit(event) {
var _a;
if (event.target.getAttribute("method") === "dialog" || ((_a = event.submitter) == null ? void 0 : _a.getAttribute("formmethod")) === "dialog") {
event.preventDefault();
evaluate();
}
}
function escapeDialog(event) {
if (event.key !== "Escape") return;
event.preventDefault();
if (closeBy === "none") return;
evaluate();
}
function handleCloseByEvent(event) {
if (event.target !== el) return;
const rect = el.getBoundingClientRect();
const isInDialog = rect.top <= event.clientY && event.clientY <= rect.top + rect.height && rect.left <= event.clientX && event.clientX <= rect.left + rect.width;
if (!isInDialog) {
if (closeBy === "any") {
if (closeBySupported) {
event.preventDefault();
}
evaluate();
}
}
}
function handleCloseEvent() {
evaluate();
}
function open() {
if (el.hasAttribute("open")) return;
isModeless ? el.show() : el.showModal();
scrollLock(lockPageScroll);
}
function close() {
if (!el.hasAttribute("open")) return;
el.close();
scrollLock(false);
}
el._x_doShow = () => open();
el._x_doHide = () => close();
el.addEventListener("keydown", escapeDialog);
el.addEventListener("submit", dialogSubmit);
el.addEventListener("click", handleCloseByEvent);
el.addEventListener("cancel", handleCloseEvent);
cleanup(() => {
el.removeEventListener("keydown", escapeDialog);
el.removeEventListener("submit", dialogSubmit);
el.removeEventListener("click", handleCloseByEvent);
el.removeEventListener("cancel", handleCloseEvent);
scrollLock(false);
});
}
}
function modifierValue(modifiers, key, fallback) {
if (modifiers.indexOf(key) === -1) return fallback;
const rawValue = modifiers[modifiers.indexOf(key) + 1];
if (!rawValue) return fallback;
if (key === "closeby") {
const allowedValues = ["auto", "none", "closerequest", "any"];
const options = allowedValues.join(", ");
if (!allowedValues.includes(rawValue)) {
console.warn(
`"${rawValue}" is not one of the allowed values for closeby: ${options}`
);
return fallback;
}
}
return rawValue;
}
// src/module.js
var module_default = dialog_default;