@pure-ds/core 0.7.48 → 0.7.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/types/pds.d.ts +7 -5
  2. package/dist/types/public/assets/pds/components/pds-toaster.d.ts +4 -1
  3. package/dist/types/public/assets/pds/components/pds-toaster.d.ts.map +1 -1
  4. package/dist/types/src/js/common/toast.d.ts +9 -0
  5. package/dist/types/src/js/common/toast.d.ts.map +1 -1
  6. package/package.json +1 -1
  7. package/public/assets/js/app.js +2131 -5
  8. package/public/assets/js/app.js.map +7 -0
  9. package/public/assets/js/lit.js +1031 -3
  10. package/public/assets/js/lit.js.map +7 -0
  11. package/public/assets/js/pds-ask.js +464 -9
  12. package/public/assets/js/pds-ask.js.map +7 -0
  13. package/public/assets/js/pds-autocomplete.js +639 -7
  14. package/public/assets/js/pds-autocomplete.js.map +7 -0
  15. package/public/assets/js/pds-enhancers.js +1471 -1
  16. package/public/assets/js/pds-enhancers.js.map +7 -0
  17. package/public/assets/js/pds-manager.js +17568 -3384
  18. package/public/assets/js/pds-manager.js.map +7 -0
  19. package/public/assets/js/pds-toast.js +30 -1
  20. package/public/assets/js/pds-toast.js.map +7 -0
  21. package/public/assets/js/pds.js +1969 -2
  22. package/public/assets/js/pds.js.map +7 -0
  23. package/public/assets/pds/components/pds-toaster.js +25 -7
  24. package/public/assets/pds/core/pds-ask.js +464 -9
  25. package/public/assets/pds/core/pds-autocomplete.js +639 -7
  26. package/public/assets/pds/core/pds-enhancers.js +1471 -1
  27. package/public/assets/pds/core/pds-manager.js +17568 -3384
  28. package/public/assets/pds/core/pds-toast.js +30 -1
  29. package/public/assets/pds/core.js +1969 -2
  30. package/public/assets/pds/external/lit.js +1031 -3
  31. package/src/js/common/toast.js +8 -0
  32. package/src/js/pds-core/pds-generator.js +1 -1
  33. package/src/js/pds.d.ts +7 -5
@@ -1,25 +1,480 @@
1
- function F(a){let e=Array.isArray(a?.strings)?a.strings:[],l=Array.isArray(a?.values)?a.values:[],f=new Set,y=[],v=/(\s)(\.[\w-]+)=\s*$/;for(let o=0;o<e.length;o+=1){let t=e[o]??"",d=t.match(v);if(d&&o<l.length){let n=d[2].slice(1),i=`pds-val-${o}`;t=t.replace(v,`$1data-pds-prop="${n}:${i}"`),f.add(o)}y.push(t),o<l.length&&!f.has(o)&&y.push(`<!--pds-val-${o}-->`)}let s=document.createElement("template");s.innerHTML=y.join("");let r=(o,t)=>{let d=o.parentNode;if(!d)return;if(t==null){d.removeChild(o);return}let b=n=>{if(n!=null){if(n instanceof Node){d.insertBefore(n,o);return}if(Array.isArray(n)){n.forEach(i=>b(i));return}d.insertBefore(document.createTextNode(String(n)),o)}};b(t),d.removeChild(o)},c=document.createTreeWalker(s.content,NodeFilter.SHOW_COMMENT),u=[];for(;c.nextNode();){let o=c.currentNode;o?.nodeValue?.startsWith("pds-val-")&&u.push(o)}return u.forEach(o=>{let t=Number(o.nodeValue.replace("pds-val-",""));r(o,l[t])}),s.content.querySelectorAll("*").forEach(o=>{let t=o.getAttribute("data-pds-prop");if(!t)return;let[d,b]=t.split(":"),n=Number(String(b).replace("pds-val-",""));d&&Number.isInteger(n)&&(o[d]=l[n]),o.removeAttribute("data-pds-prop")}),s.content}var x=class extends EventTarget{constructor(){super(),this.mode=null,this.compiled=null,this.log=()=>{},this.logHandler=null}},L="__PURE_DS_PDS_SINGLETON__",O=typeof globalThis<"u"?globalThis:window,E=O?.[L],h=E&&typeof E.addEventListener=="function"?E:new x;O&&(O[L]=h);typeof h.log!="function"&&(h.log=(a="log",e,...l)=>{if(typeof console>"u")return;let f=typeof console[a]=="function"?console[a].bind(console):typeof console.log=="function"?console.log.bind(console):null;f&&(l.length>0?f(e,...l):f(e))});typeof h.logHandler!="function"&&(h.logHandler=null);function T(a,e){if(e==null)return;if(typeof e=="object"&&Array.isArray(e.strings)&&Array.isArray(e.values)){a.appendChild(F(e));return}if(e instanceof Node){a.appendChild(e);return}if(Array.isArray(e)){e.forEach(f=>T(a,f));return}let l=typeof e=="string"?e:String(e);a.appendChild(document.createTextNode(l))}function V(a){if(!a)return!0;let e=!0,l=r=>{if(!r||typeof r!="object")return"<unknown>";let c=r.tagName?String(r.tagName).toLowerCase():"node",u=r.id?`#${r.id}`:"",g=typeof r.getAttribute=="function"?r.getAttribute("name"):null,o=g?`[name="${g}"]`:"";return`${c}${u}${o}`},f=(r,c)=>{if(!r||typeof r.querySelectorAll!="function")return;let u=Array.from(r.querySelectorAll(":invalid"));if(!u.length)return;let g=u.map(o=>{let t=typeof o.validationMessage=="string"?o.validationMessage:"";return`${l(o)}${t?` \u2014 ${t}`:""}`});h.log("warn",`ask.validateDialogFormTree: invalid controls in ${c}:`,g)},y=(r,c)=>{try{let u=typeof r.reportValidity=="function"?r.reportValidity():r.checkValidity?.()??!0;return u||f(r,c),u}catch(u){return h.log("error",`ask.validateDialogFormTree: validation threw in ${c}`,u),!1}};e=y(a,"host dialog form")&&e;let v=Array.from(a.querySelectorAll("form"));for(let r of v){if(r===a)continue;e=y(r,`nested light DOM form ${l(r)}`)&&e}let s=Array.from(a.querySelectorAll("*"));for(let r of s){let c=r?.shadowRoot;if(!c)continue;let u=Array.from(c.querySelectorAll("form"));for(let g of u)e=y(g,`shadow form under ${l(r)}`)&&e}return e}function k(){let a=navigator.userAgent,e=/Safari/i.test(a),l=/(Chrome|Chromium|CriOS|FxiOS|EdgiOS|OPiOS|Opera)/i.test(a);return e&&!l}function D(a){if(window.matchMedia?.("(prefers-reduced-motion: reduce)").matches)return;let e=window.matchMedia?.("(max-width: 639px)").matches,l=a.classList.contains("dialog-no-scale-animation")?"pds-dialog-fade-enter":e?"pds-dialog-enter-mobile":"pds-dialog-enter";a.style.animation="none",a.offsetWidth,a.style.animation=`${l} var(--transition-normal) ease`,a.addEventListener("animationend",()=>{a.style.animation=""},{once:!0})}function P(a={}){return a?.liquidGlassEffects===!0}async function j(a,e={}){let l={title:"Confirm",type:"confirm",buttons:{ok:{name:"OK",primary:!0},cancel:{name:"Cancel",cancel:!0}}};e={...l,...e};let f=e.buttons&&typeof e.buttons=="object"?e.buttons:l.buttons,y=s=>{if(s==null)return{actionCode:"dismiss",actionKind:"dismiss",button:null};let r=f?.[s]??null,c=s==="ok"?"ok":s==="dismiss"?"dismiss":r?.cancel||s==="cancel"?"cancel":"custom";return{actionCode:s,actionKind:c,button:r}},v=s=>{if(typeof s>"u"||s===null||s===!0)return{allow:!0};if(s===!1)return{allow:!1};if(typeof s=="object"){let r=Object.prototype.hasOwnProperty.call(s,"result")||Object.prototype.hasOwnProperty.call(s,"value");return{allow:s.allow!==!1,hasResult:r,result:Object.prototype.hasOwnProperty.call(s,"result")?s.result:s.value}}return{allow:!!s}};return new Promise(s=>{let r=!1,c=(n,i,{shouldClose:m=!0}={})=>{if(!r&&(r=!0,s(n),!(!m||!i?.open)))try{i.close()}catch(p){h.log("warn","ask: dialog.close() failed",p)}},u=async n=>{if(n.actionKind!=="ok"||typeof e.beforeClose!="function")return{allow:!0};try{let i=await e.beforeClose(n);return v(i)}catch(i){return h.log("error","ask.beforeClose: validation failed",i),{allow:!1}}},g=({actionKind:n,form:i})=>n==="ok"?e.useForm&&i?new FormData(i):!0:!1,o=async({actionCode:n,form:i,submitter:m,originalEvent:p,bypassValidation:S=!1,shouldClose:N=!0})=>{if(r)return;let{actionKind:w,button:q}=y(n),A=i||t.querySelector("form")||null;if(e.useForm&&w==="ok"&&A&&!S&&!V(A))return;let C=g({actionKind:w,form:A}),$=await u({actionCode:n,actionKind:w,dialog:t,form:A,formData:e.useForm&&w==="ok"&&A?C:null,submitter:m,originalEvent:p,options:e,button:q,defaultResult:C});if(!$.allow)return;let M=$.hasResult?$.result:C;c(M,t,{shouldClose:N})},t=document.createElement("dialog");k()&&t.classList.add("dialog-no-scale-animation"),P(e)&&t.classList.add("liquid-glass"),e.size&&t.classList.add(`dialog-${e.size}`),e.type&&t.classList.add(`dialog-${e.type}`),e.class&&(Array.isArray(e.class)?t.classList.add(...e.class):t.classList.add(e.class)),e.maxHeight&&t.style.setProperty("--dialog-max-height",e.maxHeight);let d=Object.entries(f).map(([n,i])=>{let m=i.primary?"btn-primary btn-sm":"btn-outline btn-sm",p=i.cancel?"button":"submit",S=i.formNoValidate?" formnovalidate":"";return`<button type="${p}" class="${m}" value="${n}"${S}>${i.name}</button>`});if(e.useForm){let n=document.createElement("div");T(n,a);let i=n.querySelector("form");if(i){t.innerHTML=`
1
+ // src/js/common/common.js
2
+ function fragmentFromTemplateLike(templateLike) {
3
+ const strings = Array.isArray(templateLike?.strings) ? templateLike.strings : [];
4
+ const values = Array.isArray(templateLike?.values) ? templateLike.values : [];
5
+ const consumedValues = /* @__PURE__ */ new Set();
6
+ const htmlParts = [];
7
+ const propBindingPattern = /(\s)(\.[\w-]+)=\s*$/;
8
+ for (let i = 0; i < strings.length; i += 1) {
9
+ let chunk = strings[i] ?? "";
10
+ const match = chunk.match(propBindingPattern);
11
+ if (match && i < values.length) {
12
+ const propToken = match[2];
13
+ const propName = propToken.slice(1);
14
+ const marker = `pds-val-${i}`;
15
+ chunk = chunk.replace(
16
+ propBindingPattern,
17
+ `$1data-pds-prop="${propName}:${marker}"`
18
+ );
19
+ consumedValues.add(i);
20
+ }
21
+ htmlParts.push(chunk);
22
+ if (i < values.length && !consumedValues.has(i)) {
23
+ htmlParts.push(`<!--pds-val-${i}-->`);
24
+ }
25
+ }
26
+ const tpl = document.createElement("template");
27
+ tpl.innerHTML = htmlParts.join("");
28
+ const replaceValueAtMarker = (markerNode, value) => {
29
+ const parent = markerNode.parentNode;
30
+ if (!parent)
31
+ return;
32
+ if (value == null) {
33
+ parent.removeChild(markerNode);
34
+ return;
35
+ }
36
+ const insertValue = (val) => {
37
+ if (val == null)
38
+ return;
39
+ if (val instanceof Node) {
40
+ parent.insertBefore(val, markerNode);
41
+ return;
42
+ }
43
+ if (Array.isArray(val)) {
44
+ val.forEach((item) => insertValue(item));
45
+ return;
46
+ }
47
+ parent.insertBefore(document.createTextNode(String(val)), markerNode);
48
+ };
49
+ insertValue(value);
50
+ parent.removeChild(markerNode);
51
+ };
52
+ const walker = document.createTreeWalker(tpl.content, NodeFilter.SHOW_COMMENT);
53
+ const markers = [];
54
+ while (walker.nextNode()) {
55
+ const node = walker.currentNode;
56
+ if (node?.nodeValue?.startsWith("pds-val-")) {
57
+ markers.push(node);
58
+ }
59
+ }
60
+ markers.forEach((node) => {
61
+ const index = Number(node.nodeValue.replace("pds-val-", ""));
62
+ replaceValueAtMarker(node, values[index]);
63
+ });
64
+ const elements = tpl.content.querySelectorAll("*");
65
+ elements.forEach((el) => {
66
+ const propAttr = el.getAttribute("data-pds-prop");
67
+ if (!propAttr)
68
+ return;
69
+ const [propName, markerValue] = propAttr.split(":");
70
+ const index = Number(String(markerValue).replace("pds-val-", ""));
71
+ if (propName && Number.isInteger(index)) {
72
+ el[propName] = values[index];
73
+ }
74
+ el.removeAttribute("data-pds-prop");
75
+ });
76
+ return tpl.content;
77
+ }
78
+
79
+ // src/js/pds-singleton.js
80
+ var PDSBase = class extends EventTarget {
81
+ constructor() {
82
+ super();
83
+ this.mode = null;
84
+ this.compiled = null;
85
+ this.log = () => {
86
+ };
87
+ this.logHandler = null;
88
+ }
89
+ };
90
+ var PDS_SINGLETON_KEY = "__PURE_DS_PDS_SINGLETON__";
91
+ var globalScope = typeof globalThis !== "undefined" ? globalThis : window;
92
+ var existingPDS = globalScope?.[PDS_SINGLETON_KEY];
93
+ var PDS = existingPDS && typeof existingPDS.addEventListener === "function" ? existingPDS : new PDSBase();
94
+ if (globalScope) {
95
+ globalScope[PDS_SINGLETON_KEY] = PDS;
96
+ }
97
+ if (typeof PDS.log !== "function") {
98
+ PDS.log = (level = "log", message, ...data) => {
99
+ if (typeof console === "undefined")
100
+ return;
101
+ const method = typeof console[level] === "function" ? console[level].bind(console) : typeof console.log === "function" ? console.log.bind(console) : null;
102
+ if (!method)
103
+ return;
104
+ if (data.length > 0) {
105
+ method(message, ...data);
106
+ } else {
107
+ method(message);
108
+ }
109
+ };
110
+ }
111
+ if (typeof PDS.logHandler !== "function") {
112
+ PDS.logHandler = null;
113
+ }
114
+
115
+ // src/js/common/ask.js
116
+ function appendMessageContent(container, message) {
117
+ if (message == null)
118
+ return;
119
+ if (typeof message === "object" && Array.isArray(message.strings) && Array.isArray(message.values)) {
120
+ container.appendChild(fragmentFromTemplateLike(message));
121
+ return;
122
+ }
123
+ if (message instanceof Node) {
124
+ container.appendChild(message);
125
+ return;
126
+ }
127
+ if (Array.isArray(message)) {
128
+ message.forEach((item) => appendMessageContent(container, item));
129
+ return;
130
+ }
131
+ const text = typeof message === "string" ? message : String(message);
132
+ container.appendChild(document.createTextNode(text));
133
+ }
134
+ function validateDialogFormTree(form) {
135
+ if (!form)
136
+ return true;
137
+ let valid = true;
138
+ const describeElement = (el) => {
139
+ if (!el || typeof el !== "object")
140
+ return "<unknown>";
141
+ const tag = el.tagName ? String(el.tagName).toLowerCase() : "node";
142
+ const id = el.id ? `#${el.id}` : "";
143
+ const name = typeof el.getAttribute === "function" ? el.getAttribute("name") : null;
144
+ const namePart = name ? `[name="${name}"]` : "";
145
+ return `${tag}${id}${namePart}`;
146
+ };
147
+ const reportInvalidControls = (root, scopeLabel) => {
148
+ if (!root || typeof root.querySelectorAll !== "function")
149
+ return;
150
+ const invalidControls = Array.from(root.querySelectorAll(":invalid"));
151
+ if (!invalidControls.length)
152
+ return;
153
+ const list = invalidControls.map((el) => {
154
+ const message = typeof el.validationMessage === "string" ? el.validationMessage : "";
155
+ return `${describeElement(el)}${message ? ` \u2014 ${message}` : ""}`;
156
+ });
157
+ PDS.log("warn", `ask.validateDialogFormTree: invalid controls in ${scopeLabel}:`, list);
158
+ };
159
+ const runValidity = (target, scopeLabel) => {
160
+ try {
161
+ const targetValid = typeof target.reportValidity === "function" ? target.reportValidity() : target.checkValidity?.() ?? true;
162
+ if (!targetValid) {
163
+ reportInvalidControls(target, scopeLabel);
164
+ }
165
+ return targetValid;
166
+ } catch (error) {
167
+ PDS.log("error", `ask.validateDialogFormTree: validation threw in ${scopeLabel}`, error);
168
+ return false;
169
+ }
170
+ };
171
+ valid = runValidity(form, "host dialog form") && valid;
172
+ const nestedLightDomForms = Array.from(form.querySelectorAll("form"));
173
+ for (const nestedForm of nestedLightDomForms) {
174
+ if (nestedForm === form)
175
+ continue;
176
+ const nestedValid = runValidity(nestedForm, `nested light DOM form ${describeElement(nestedForm)}`);
177
+ valid = nestedValid && valid;
178
+ }
179
+ const descendants = Array.from(form.querySelectorAll("*"));
180
+ for (const host of descendants) {
181
+ const root = host?.shadowRoot;
182
+ if (!root)
183
+ continue;
184
+ const nestedForms = Array.from(root.querySelectorAll("form"));
185
+ for (const nestedForm of nestedForms) {
186
+ const nestedValid = runValidity(
187
+ nestedForm,
188
+ `shadow form under ${describeElement(host)}`
189
+ );
190
+ valid = nestedValid && valid;
191
+ }
192
+ }
193
+ return valid;
194
+ }
195
+ function isSafariBrowser() {
196
+ const userAgent = navigator.userAgent;
197
+ const isSafariEngine = /Safari/i.test(userAgent);
198
+ const isOtherBrowser = /(Chrome|Chromium|CriOS|FxiOS|EdgiOS|OPiOS|Opera)/i.test(userAgent);
199
+ return isSafariEngine && !isOtherBrowser;
200
+ }
201
+ function playDialogEnterAnimation(dialog) {
202
+ if (window.matchMedia?.("(prefers-reduced-motion: reduce)").matches) {
203
+ return;
204
+ }
205
+ const isMobile = window.matchMedia?.("(max-width: 639px)").matches;
206
+ const animationName = dialog.classList.contains("dialog-no-scale-animation") ? "pds-dialog-fade-enter" : isMobile ? "pds-dialog-enter-mobile" : "pds-dialog-enter";
207
+ dialog.style.animation = "none";
208
+ void dialog.offsetWidth;
209
+ dialog.style.animation = `${animationName} var(--transition-normal) ease`;
210
+ dialog.addEventListener("animationend", () => {
211
+ dialog.style.animation = "";
212
+ }, { once: true });
213
+ }
214
+ function shouldUseLiquidGlass(options = {}) {
215
+ return options?.liquidGlassEffects === true;
216
+ }
217
+ async function ask(message, options = {}) {
218
+ const defaults = {
219
+ title: "Confirm",
220
+ type: "confirm",
221
+ // 'alert', 'confirm', 'custom'
222
+ buttons: {
223
+ ok: { name: "OK", primary: true },
224
+ cancel: { name: "Cancel", cancel: true }
225
+ }
226
+ };
227
+ options = { ...defaults, ...options };
228
+ const buttonConfigs = options.buttons && typeof options.buttons === "object" ? options.buttons : defaults.buttons;
229
+ const resolveActionMeta = (actionCode) => {
230
+ if (actionCode == null) {
231
+ return {
232
+ actionCode: "dismiss",
233
+ actionKind: "dismiss",
234
+ button: null
235
+ };
236
+ }
237
+ const button = buttonConfigs?.[actionCode] ?? null;
238
+ const actionKind = actionCode === "ok" ? "ok" : actionCode === "dismiss" ? "dismiss" : button?.cancel || actionCode === "cancel" ? "cancel" : "custom";
239
+ return {
240
+ actionCode,
241
+ actionKind,
242
+ button
243
+ };
244
+ };
245
+ const normalizeBeforeCloseResult = (result) => {
246
+ if (typeof result === "undefined" || result === null || result === true) {
247
+ return { allow: true };
248
+ }
249
+ if (result === false) {
250
+ return { allow: false };
251
+ }
252
+ if (typeof result === "object") {
253
+ const hasResult = Object.prototype.hasOwnProperty.call(result, "result") || Object.prototype.hasOwnProperty.call(result, "value");
254
+ return {
255
+ allow: result.allow !== false,
256
+ hasResult,
257
+ result: Object.prototype.hasOwnProperty.call(result, "result") ? result.result : result.value
258
+ };
259
+ }
260
+ return { allow: Boolean(result) };
261
+ };
262
+ return new Promise((resolve) => {
263
+ let settled = false;
264
+ const settle = (value, dialog2, { shouldClose = true } = {}) => {
265
+ if (settled)
266
+ return;
267
+ settled = true;
268
+ resolve(value);
269
+ if (!shouldClose || !dialog2?.open) {
270
+ return;
271
+ }
272
+ try {
273
+ dialog2.close();
274
+ } catch (error) {
275
+ PDS.log("warn", "ask: dialog.close() failed", error);
276
+ }
277
+ };
278
+ const runBeforeClose = async (context) => {
279
+ if (context.actionKind !== "ok" || typeof options.beforeClose !== "function") {
280
+ return { allow: true };
281
+ }
282
+ try {
283
+ const beforeCloseResult = await options.beforeClose(context);
284
+ return normalizeBeforeCloseResult(beforeCloseResult);
285
+ } catch (error) {
286
+ PDS.log("error", "ask.beforeClose: validation failed", error);
287
+ return { allow: false };
288
+ }
289
+ };
290
+ const resolveDefaultResult = ({ actionKind, form }) => {
291
+ if (actionKind === "ok") {
292
+ if (options.useForm && form) {
293
+ return new FormData(form);
294
+ }
295
+ return true;
296
+ }
297
+ return false;
298
+ };
299
+ const attemptResolve = async ({
300
+ actionCode,
301
+ form,
302
+ submitter,
303
+ originalEvent,
304
+ bypassValidation = false,
305
+ shouldClose = true
306
+ }) => {
307
+ if (settled)
308
+ return;
309
+ const { actionKind, button } = resolveActionMeta(actionCode);
310
+ const activeForm = form || dialog.querySelector("form") || null;
311
+ if (options.useForm && actionKind === "ok" && activeForm && !bypassValidation) {
312
+ const valid = validateDialogFormTree(activeForm);
313
+ if (!valid) {
314
+ return;
315
+ }
316
+ }
317
+ const defaultResult = resolveDefaultResult({
318
+ actionKind,
319
+ form: activeForm
320
+ });
321
+ const guard = await runBeforeClose({
322
+ actionCode,
323
+ actionKind,
324
+ dialog,
325
+ form: activeForm,
326
+ formData: options.useForm && actionKind === "ok" && activeForm ? defaultResult : null,
327
+ submitter,
328
+ originalEvent,
329
+ options,
330
+ button,
331
+ defaultResult
332
+ });
333
+ if (!guard.allow) {
334
+ return;
335
+ }
336
+ const result = guard.hasResult ? guard.result : defaultResult;
337
+ settle(result, dialog, { shouldClose });
338
+ };
339
+ const dialog = document.createElement("dialog");
340
+ if (isSafariBrowser()) {
341
+ dialog.classList.add("dialog-no-scale-animation");
342
+ }
343
+ if (shouldUseLiquidGlass(options))
344
+ dialog.classList.add("liquid-glass");
345
+ if (options.size) {
346
+ dialog.classList.add(`dialog-${options.size}`);
347
+ }
348
+ if (options.type) {
349
+ dialog.classList.add(`dialog-${options.type}`);
350
+ }
351
+ if (options.class) {
352
+ if (Array.isArray(options.class)) {
353
+ dialog.classList.add(...options.class);
354
+ } else {
355
+ dialog.classList.add(options.class);
356
+ }
357
+ }
358
+ if (options.maxHeight) {
359
+ dialog.style.setProperty("--dialog-max-height", options.maxHeight);
360
+ }
361
+ const buttons = Object.entries(buttonConfigs).map(([code, obj]) => {
362
+ const btnClass = obj.primary ? "btn-primary btn-sm" : "btn-outline btn-sm";
363
+ const btnType = obj.cancel ? "button" : "submit";
364
+ const formNoValidate = obj.formNoValidate ? " formnovalidate" : "";
365
+ return `<button type="${btnType}" class="${btnClass}" value="${code}"${formNoValidate}>${obj.name}</button>`;
366
+ });
367
+ if (options.useForm) {
368
+ const tempContainer = document.createElement("div");
369
+ appendMessageContent(tempContainer, message);
370
+ const form = tempContainer.querySelector("form");
371
+ if (form) {
372
+ dialog.innerHTML = /*html*/
373
+ `
2
374
  <header>
3
- <h2>${e.title}</h2>
375
+ <h2>${options.title}</h2>
4
376
  </header>
5
- `;let m=document.createElement("article");for(m.className="dialog-body";i.firstChild;)m.appendChild(i.firstChild);i.appendChild(m);let p=document.createElement("footer");p.innerHTML=d.join(""),i.appendChild(p),t.appendChild(i)}else t.innerHTML=`
377
+ `;
378
+ const article = document.createElement("article");
379
+ article.className = "dialog-body";
380
+ while (form.firstChild) {
381
+ article.appendChild(form.firstChild);
382
+ }
383
+ form.appendChild(article);
384
+ const footer = document.createElement("footer");
385
+ footer.innerHTML = buttons.join("");
386
+ form.appendChild(footer);
387
+ dialog.appendChild(form);
388
+ } else {
389
+ dialog.innerHTML = /*html*/
390
+ `
6
391
  <header>
7
- <h2>${e.title}</h2>
392
+ <h2>${options.title}</h2>
8
393
  </header>
9
394
  <article id="msg-container"></article>
10
395
  <footer>
11
- ${d.join("")}
396
+ ${buttons.join("")}
12
397
  </footer>
13
- `,t.querySelector("#msg-container").appendChild(n)}else{t.innerHTML=`
398
+ `;
399
+ const article = dialog.querySelector("#msg-container");
400
+ article.appendChild(tempContainer);
401
+ }
402
+ } else {
403
+ dialog.innerHTML = /*html*/
404
+ `
14
405
  <form method="dialog">
15
406
  <header>
16
- <h2>${e.title}</h2>
407
+ <h2>${options.title}</h2>
17
408
  </header>
18
409
 
19
410
  <article id="msg-container"></article>
20
411
 
21
412
  <footer>
22
- ${d.join("")}
413
+ ${buttons.join("")}
23
414
  </footer>
24
415
  </form>
25
- `;let n=t.querySelector("#msg-container");T(n,a)}t.addEventListener("click",n=>{let i=n.target.closest('button[value="cancel"]');i&&o({actionCode:"cancel",form:t.querySelector("form"),submitter:i,originalEvent:n})});let b=()=>{let n=t.querySelector("form");if(n){if(n.dataset.askSubmitBound==="true")return;n.dataset.askSubmitBound="true",n.addEventListener("submit",i=>{i.preventDefault();let m=i.submitter?.value??(e.useForm?"ok":void 0),p=!!i.submitter?.hasAttribute("formnovalidate");o({actionCode:m,form:n,submitter:i.submitter,originalEvent:i,bypassValidation:p})})}else requestAnimationFrame(b)};t.addEventListener("cancel",n=>{n.preventDefault(),o({actionCode:"dismiss",form:t.querySelector("form"),originalEvent:n})}),t.addEventListener("close",()=>{r||c(!1,t,{shouldClose:!1}),setTimeout(()=>t.remove(),200)}),document.body.appendChild(t),requestAnimationFrame(b),typeof e.rendered=="function"&&e.rendered(t),t.showModal(),requestAnimationFrame(()=>D(t))})}export{j as ask};
416
+ `;
417
+ const article = dialog.querySelector("#msg-container");
418
+ appendMessageContent(article, message);
419
+ }
420
+ dialog.addEventListener("click", (e) => {
421
+ const btn = e.target.closest('button[value="cancel"]');
422
+ if (btn) {
423
+ attemptResolve({
424
+ actionCode: "cancel",
425
+ form: dialog.querySelector("form"),
426
+ submitter: btn,
427
+ originalEvent: e
428
+ });
429
+ }
430
+ });
431
+ const setupFormListener = () => {
432
+ const form = dialog.querySelector("form");
433
+ if (form) {
434
+ if (form.dataset.askSubmitBound === "true") {
435
+ return;
436
+ }
437
+ form.dataset.askSubmitBound = "true";
438
+ form.addEventListener("submit", (event) => {
439
+ event.preventDefault();
440
+ const submitValue = event.submitter?.value ?? (options.useForm ? "ok" : void 0);
441
+ const bypassValidation = Boolean(event.submitter?.hasAttribute("formnovalidate"));
442
+ attemptResolve({
443
+ actionCode: submitValue,
444
+ form,
445
+ submitter: event.submitter,
446
+ originalEvent: event,
447
+ bypassValidation
448
+ });
449
+ });
450
+ } else {
451
+ requestAnimationFrame(setupFormListener);
452
+ }
453
+ };
454
+ dialog.addEventListener("cancel", (event) => {
455
+ event.preventDefault();
456
+ attemptResolve({
457
+ actionCode: "dismiss",
458
+ form: dialog.querySelector("form"),
459
+ originalEvent: event
460
+ });
461
+ });
462
+ dialog.addEventListener("close", () => {
463
+ if (!settled) {
464
+ settle(false, dialog, { shouldClose: false });
465
+ }
466
+ setTimeout(() => dialog.remove(), 200);
467
+ });
468
+ document.body.appendChild(dialog);
469
+ requestAnimationFrame(setupFormListener);
470
+ if (typeof options.rendered === "function") {
471
+ options.rendered(dialog);
472
+ }
473
+ dialog.showModal();
474
+ requestAnimationFrame(() => playDialogEnterAnimation(dialog));
475
+ });
476
+ }
477
+ export {
478
+ ask
479
+ };
480
+ //# sourceMappingURL=pds-ask.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/js/common/common.js", "../../../src/js/pds-singleton.js", "../../../src/js/common/ask.js"],
4
+ "sourcesContent": ["export function isObject(item) {\n return item && typeof item === 'object' && !Array.isArray(item);\n}\n\nexport function deepMerge(target, source) {\n const output = { ...target };\n if (isObject(target) && isObject(source)) {\n Object.keys(source).forEach(key => {\n if (isObject(source[key])) {\n if (!(key in target))\n Object.assign(output, { [key]: source[key] });\n else\n output[key] = deepMerge(target[key], source[key]);\n } else {\n Object.assign(output, { [key]: source[key] });\n }\n });\n }\n return output;\n }\n\n/**\n * Build a DocumentFragment from a template-like object (strings + values)\n * @param {{strings: string[], values: unknown[]}} templateLike\n * @returns {DocumentFragment}\n */\nexport function fragmentFromTemplateLike(templateLike) {\n const strings = Array.isArray(templateLike?.strings) ? templateLike.strings : [];\n const values = Array.isArray(templateLike?.values) ? templateLike.values : [];\n const consumedValues = new Set();\n const htmlParts = [];\n\n const propBindingPattern = /(\\s)(\\.[\\w-]+)=\\s*$/;\n\n for (let i = 0; i < strings.length; i += 1) {\n let chunk = strings[i] ?? \"\";\n const match = chunk.match(propBindingPattern);\n\n if (match && i < values.length) {\n const propToken = match[2];\n const propName = propToken.slice(1);\n const marker = `pds-val-${i}`;\n chunk = chunk.replace(\n propBindingPattern,\n `$1data-pds-prop=\"${propName}:${marker}\"`\n );\n consumedValues.add(i);\n }\n\n htmlParts.push(chunk);\n\n if (i < values.length && !consumedValues.has(i)) {\n htmlParts.push(`<!--pds-val-${i}-->`);\n }\n }\n\n const tpl = document.createElement(\"template\");\n tpl.innerHTML = htmlParts.join(\"\");\n\n const replaceValueAtMarker = (markerNode, value) => {\n const parent = markerNode.parentNode;\n if (!parent) return;\n\n if (value == null) {\n parent.removeChild(markerNode);\n return;\n }\n\n const insertValue = (val) => {\n if (val == null) return;\n if (val instanceof Node) {\n parent.insertBefore(val, markerNode);\n return;\n }\n if (Array.isArray(val)) {\n val.forEach((item) => insertValue(item));\n return;\n }\n parent.insertBefore(document.createTextNode(String(val)), markerNode);\n };\n\n insertValue(value);\n parent.removeChild(markerNode);\n };\n\n const walker = document.createTreeWalker(tpl.content, NodeFilter.SHOW_COMMENT);\n const markers = [];\n while (walker.nextNode()) {\n const node = walker.currentNode;\n if (node?.nodeValue?.startsWith(\"pds-val-\")) {\n markers.push(node);\n }\n }\n\n markers.forEach((node) => {\n const index = Number(node.nodeValue.replace(\"pds-val-\", \"\"));\n replaceValueAtMarker(node, values[index]);\n });\n\n const elements = tpl.content.querySelectorAll(\"*\");\n elements.forEach((el) => {\n const propAttr = el.getAttribute(\"data-pds-prop\");\n if (!propAttr) return;\n const [propName, markerValue] = propAttr.split(\":\");\n const index = Number(String(markerValue).replace(\"pds-val-\", \"\"));\n if (propName && Number.isInteger(index)) {\n el[propName] = values[index];\n }\n el.removeAttribute(\"data-pds-prop\");\n });\n\n return tpl.content;\n}\n\n/**\n * Parses an HTML string into a NodeList\n * @param {String} html\n * @returns {NodeListOf<ChildNode>}\n */\nexport function parseHTML(html) {\n return new DOMParser().parseFromString(html, \"text/html\").body.childNodes;\n}", "export class PDSBase extends EventTarget {\r\n constructor() {\r\n super();\r\n /** @type {'live' | 'static' | null} */\r\n this.mode = null;\r\n /** @type {Record<string, any> | null} */\r\n this.compiled = null;\r\n /** @type {(level: 'log' | 'warn' | 'error' | 'debug' | 'info', message?: any, ...data: any[]) => void} */\r\n this.log = () => {};\r\n /** @type {((level: 'log' | 'warn' | 'error' | 'debug' | 'info', message?: any, ...data: any[]) => void) | null} */\r\n this.logHandler = null;\r\n }\r\n}\r\n\r\nexport const PDS_SINGLETON_KEY = \"__PURE_DS_PDS_SINGLETON__\";\r\n\r\nconst globalScope = typeof globalThis !== \"undefined\" ? globalThis : window;\r\nconst existingPDS = globalScope?.[PDS_SINGLETON_KEY];\r\n\r\nexport const PDS =\r\n existingPDS && typeof existingPDS.addEventListener === \"function\"\r\n ? existingPDS\r\n : new PDSBase();\r\n\r\nif (globalScope) {\r\n globalScope[PDS_SINGLETON_KEY] = PDS;\r\n}\r\n\r\nif (typeof PDS.log !== \"function\") {\r\n PDS.log = (level = \"log\", message, ...data) => {\r\n if (typeof console === \"undefined\") return;\r\n const method =\r\n typeof console[level] === \"function\"\r\n ? console[level].bind(console)\r\n : typeof console.log === \"function\"\r\n ? console.log.bind(console)\r\n : null;\r\n if (!method) return;\r\n if (data.length > 0) {\r\n method(message, ...data);\r\n } else {\r\n method(message);\r\n }\r\n };\r\n}\r\n\r\nif (typeof PDS.logHandler !== \"function\") {\r\n PDS.logHandler = null;\r\n}\r\n", "import { fragmentFromTemplateLike } from \"./common.js\";\r\nimport { PDS } from \"../pds-singleton.js\";\r\n\r\n/**\r\n * Get the current page title for dialogs\r\n */\r\nfunction getPageTitle() {\r\n return document.title || \r\n document.querySelector('h1')?.textContent || \r\n 'Application';\r\n}\r\n\r\n/**\r\n * Append message content using vanilla DOM APIs\r\n * @param {HTMLElement} container\r\n * @param {unknown} message\r\n */\r\nfunction appendMessageContent(container, message) {\r\n if (message == null) return;\r\n\r\n if (\r\n typeof message === \"object\" &&\r\n Array.isArray(message.strings) &&\r\n Array.isArray(message.values)\r\n ) {\r\n container.appendChild(fragmentFromTemplateLike(message));\r\n return;\r\n }\r\n\r\n if (message instanceof Node) {\r\n container.appendChild(message);\r\n return;\r\n }\r\n\r\n if (Array.isArray(message)) {\r\n message.forEach((item) => appendMessageContent(container, item));\r\n return;\r\n }\r\n\r\n const text = typeof message === \"string\" ? message : String(message);\r\n container.appendChild(document.createTextNode(text));\r\n}\r\n\r\n/**\r\n * Validate host form plus nested shadow-root forms (e.g. inside custom elements like pds-form).\r\n * @param {HTMLFormElement} form\r\n * @returns {boolean}\r\n */\r\nfunction validateDialogFormTree(form) {\r\n if (!form) return true;\r\n\r\n let valid = true;\r\n\r\n const describeElement = (el) => {\r\n if (!el || typeof el !== \"object\") return \"<unknown>\";\r\n const tag = el.tagName ? String(el.tagName).toLowerCase() : \"node\";\r\n const id = el.id ? `#${el.id}` : \"\";\r\n const name = typeof el.getAttribute === \"function\" ? el.getAttribute(\"name\") : null;\r\n const namePart = name ? `[name=\"${name}\"]` : \"\";\r\n return `${tag}${id}${namePart}`;\r\n };\r\n\r\n const reportInvalidControls = (root, scopeLabel) => {\r\n if (!root || typeof root.querySelectorAll !== \"function\") return;\r\n const invalidControls = Array.from(root.querySelectorAll(\":invalid\"));\r\n if (!invalidControls.length) return;\r\n const list = invalidControls.map((el) => {\r\n const message = typeof el.validationMessage === \"string\" ? el.validationMessage : \"\";\r\n return `${describeElement(el)}${message ? ` \u2014 ${message}` : \"\"}`;\r\n });\r\n PDS.log(\"warn\", `ask.validateDialogFormTree: invalid controls in ${scopeLabel}:`, list);\r\n };\r\n\r\n const runValidity = (target, scopeLabel) => {\r\n try {\r\n const targetValid = typeof target.reportValidity === \"function\"\r\n ? target.reportValidity()\r\n : target.checkValidity?.() ?? true;\r\n if (!targetValid) {\r\n reportInvalidControls(target, scopeLabel);\r\n }\r\n return targetValid;\r\n } catch (error) {\r\n PDS.log(\"error\", `ask.validateDialogFormTree: validation threw in ${scopeLabel}`, error);\r\n return false;\r\n }\r\n };\r\n\r\n valid = runValidity(form, \"host dialog form\") && valid;\r\n\r\n const nestedLightDomForms = Array.from(form.querySelectorAll(\"form\"));\r\n for (const nestedForm of nestedLightDomForms) {\r\n if (nestedForm === form) continue;\r\n const nestedValid = runValidity(nestedForm, `nested light DOM form ${describeElement(nestedForm)}`);\r\n valid = nestedValid && valid;\r\n }\r\n\r\n const descendants = Array.from(form.querySelectorAll(\"*\"));\r\n for (const host of descendants) {\r\n const root = host?.shadowRoot;\r\n if (!root) continue;\r\n\r\n const nestedForms = Array.from(root.querySelectorAll(\"form\"));\r\n for (const nestedForm of nestedForms) {\r\n const nestedValid = runValidity(\r\n nestedForm,\r\n `shadow form under ${describeElement(host)}`\r\n );\r\n valid = nestedValid && valid;\r\n }\r\n }\r\n\r\n return valid;\r\n}\r\n\r\nfunction isSafariBrowser() {\r\n const userAgent = navigator.userAgent;\r\n const isSafariEngine = /Safari/i.test(userAgent);\r\n const isOtherBrowser = /(Chrome|Chromium|CriOS|FxiOS|EdgiOS|OPiOS|Opera)/i.test(userAgent);\r\n return isSafariEngine && !isOtherBrowser;\r\n}\r\n\r\nfunction playDialogEnterAnimation(dialog) {\r\n if (window.matchMedia?.('(prefers-reduced-motion: reduce)').matches) {\r\n return;\r\n }\r\n\r\n const isMobile = window.matchMedia?.('(max-width: 639px)').matches;\r\n const animationName = dialog.classList.contains('dialog-no-scale-animation')\r\n ? 'pds-dialog-fade-enter'\r\n : isMobile\r\n ? 'pds-dialog-enter-mobile'\r\n : 'pds-dialog-enter';\r\n\r\n dialog.style.animation = 'none';\r\n void dialog.offsetWidth;\r\n dialog.style.animation = `${animationName} var(--transition-normal) ease`;\r\n\r\n dialog.addEventListener('animationend', () => {\r\n dialog.style.animation = '';\r\n }, { once: true });\r\n}\r\n\r\nfunction shouldUseLiquidGlass(options = {}) {\r\n return options?.liquidGlassEffects === true;\r\n}\r\n\r\n/**\r\n * Create a PDS-compliant dialog with proper semantic structure\r\n * @param {string|Node|Array} message - Message content (string or DOM nodes)\r\n * @param {Object} options - Dialog options\r\n * @returns {Promise} Resolves with result when dialog closes\r\n */\r\nexport async function ask(message, options = {}) {\r\n \r\n const defaults = {\r\n title: \"Confirm\",\r\n type: \"confirm\", // 'alert', 'confirm', 'custom'\r\n buttons: {\r\n ok: { name: \"OK\", primary: true },\r\n cancel: { name: \"Cancel\", cancel: true },\r\n },\r\n };\r\n \r\n options = { ...defaults, ...options };\r\n\r\n const buttonConfigs = options.buttons && typeof options.buttons === \"object\"\r\n ? options.buttons\r\n : defaults.buttons;\r\n\r\n const resolveActionMeta = (actionCode) => {\r\n if (actionCode == null) {\r\n return {\r\n actionCode: \"dismiss\",\r\n actionKind: \"dismiss\",\r\n button: null,\r\n };\r\n }\r\n\r\n const button = buttonConfigs?.[actionCode] ?? null;\r\n const actionKind = actionCode === \"ok\"\r\n ? \"ok\"\r\n : actionCode === \"dismiss\"\r\n ? \"dismiss\"\r\n : (button?.cancel || actionCode === \"cancel\")\r\n ? \"cancel\"\r\n : \"custom\";\r\n\r\n return {\r\n actionCode,\r\n actionKind,\r\n button,\r\n };\r\n };\r\n\r\n const normalizeBeforeCloseResult = (result) => {\r\n if (typeof result === \"undefined\" || result === null || result === true) {\r\n return { allow: true };\r\n }\r\n\r\n if (result === false) {\r\n return { allow: false };\r\n }\r\n\r\n if (typeof result === \"object\") {\r\n const hasResult = Object.prototype.hasOwnProperty.call(result, \"result\")\r\n || Object.prototype.hasOwnProperty.call(result, \"value\");\r\n\r\n return {\r\n allow: result.allow !== false,\r\n hasResult,\r\n result: Object.prototype.hasOwnProperty.call(result, \"result\")\r\n ? result.result\r\n : result.value,\r\n };\r\n }\r\n\r\n return { allow: Boolean(result) };\r\n };\r\n \r\n return new Promise((resolve) => {\r\n let settled = false;\r\n const settle = (value, dialog, { shouldClose = true } = {}) => {\r\n if (settled) return;\r\n settled = true;\r\n resolve(value);\r\n\r\n if (!shouldClose || !dialog?.open) {\r\n return;\r\n }\r\n\r\n try {\r\n dialog.close();\r\n } catch (error) {\r\n PDS.log(\"warn\", \"ask: dialog.close() failed\", error);\r\n }\r\n };\r\n\r\n const runBeforeClose = async (context) => {\r\n if (context.actionKind !== \"ok\" || typeof options.beforeClose !== \"function\") {\r\n return { allow: true };\r\n }\r\n\r\n try {\r\n const beforeCloseResult = await options.beforeClose(context);\r\n return normalizeBeforeCloseResult(beforeCloseResult);\r\n } catch (error) {\r\n PDS.log(\"error\", \"ask.beforeClose: validation failed\", error);\r\n return { allow: false };\r\n }\r\n };\r\n\r\n const resolveDefaultResult = ({ actionKind, form }) => {\r\n if (actionKind === \"ok\") {\r\n if (options.useForm && form) {\r\n return new FormData(form);\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n const attemptResolve = async ({\r\n actionCode,\r\n form,\r\n submitter,\r\n originalEvent,\r\n bypassValidation = false,\r\n shouldClose = true,\r\n }) => {\r\n if (settled) return;\r\n\r\n const { actionKind, button } = resolveActionMeta(actionCode);\r\n const activeForm = form || dialog.querySelector(\"form\") || null;\r\n\r\n if (options.useForm && actionKind === \"ok\" && activeForm && !bypassValidation) {\r\n const valid = validateDialogFormTree(activeForm);\r\n if (!valid) {\r\n return;\r\n }\r\n }\r\n\r\n const defaultResult = resolveDefaultResult({\r\n actionKind,\r\n form: activeForm,\r\n });\r\n\r\n const guard = await runBeforeClose({\r\n actionCode,\r\n actionKind,\r\n dialog,\r\n form: activeForm,\r\n formData: options.useForm && actionKind === \"ok\" && activeForm\r\n ? defaultResult\r\n : null,\r\n submitter,\r\n originalEvent,\r\n options,\r\n button,\r\n defaultResult,\r\n });\r\n\r\n if (!guard.allow) {\r\n return;\r\n }\r\n\r\n const result = guard.hasResult ? guard.result : defaultResult;\r\n settle(result, dialog, { shouldClose });\r\n };\r\n\r\n // Create native dialog element\r\n const dialog = document.createElement(\"dialog\");\r\n\r\n if (isSafariBrowser()) {\r\n dialog.classList.add(\"dialog-no-scale-animation\");\r\n }\r\n \r\n if (shouldUseLiquidGlass(options))\r\n dialog.classList.add(\"liquid-glass\");\r\n \r\n // Add optional CSS classes\r\n if (options.size) {\r\n dialog.classList.add(`dialog-${options.size}`); // dialog-sm, dialog-lg, dialog-xl\r\n }\r\n if (options.type) {\r\n dialog.classList.add(`dialog-${options.type}`);\r\n }\r\n if (options.class) {\r\n if (Array.isArray(options.class)) {\r\n dialog.classList.add(...options.class);\r\n } else {\r\n dialog.classList.add(options.class);\r\n }\r\n }\r\n \r\n // Set maxHeight via CSS custom property (constrained to 90vh by default)\r\n if (options.maxHeight) {\r\n dialog.style.setProperty('--dialog-max-height', options.maxHeight);\r\n }\r\n\r\n // Build button elements\r\n const buttons = Object.entries(buttonConfigs).map(([code, obj]) => {\r\n const btnClass = obj.primary ? \"btn-primary btn-sm\" : \"btn-outline btn-sm\";\r\n const btnType = obj.cancel ? \"button\" : \"submit\";\r\n const formNoValidate = obj.formNoValidate ? \" formnovalidate\" : \"\";\r\n return `<button type=\"${btnType}\" class=\"${btnClass}\" value=\"${code}\"${formNoValidate}>${obj.name}</button>`;\r\n });\r\n\r\n // Create PDS-compliant dialog structure\r\n // When useForm is true, don't wrap in a form - let the content provide the form\r\n if (options.useForm) {\r\n // Create a temporary container to render the message content\r\n const tempContainer = document.createElement(\"div\");\r\n appendMessageContent(tempContainer, message);\r\n \r\n // Find the form in the rendered content\r\n const form = tempContainer.querySelector(\"form\");\r\n if (form) {\r\n // Build dialog structure with form as direct child for proper flex layout\r\n dialog.innerHTML = /*html*/ `\r\n <header>\r\n <h2>${options.title}</h2>\r\n </header>\r\n `;\r\n \r\n // Create article wrapper and move form children into it (preserves DOM nodes & bindings)\r\n const article = document.createElement(\"article\");\r\n article.className = \"dialog-body\";\r\n while (form.firstChild) {\r\n article.appendChild(form.firstChild);\r\n }\r\n form.appendChild(article);\r\n \r\n // Add footer with buttons\r\n const footer = document.createElement(\"footer\");\r\n footer.innerHTML = buttons.join(\"\");\r\n form.appendChild(footer);\r\n \r\n // Append the restructured form to dialog\r\n dialog.appendChild(form);\r\n } else {\r\n // No form found, use standard article structure\r\n dialog.innerHTML = /*html*/ `\r\n <header>\r\n <h2>${options.title}</h2>\r\n </header>\r\n <article id=\"msg-container\"></article>\r\n <footer>\r\n ${buttons.join(\"\")}\r\n </footer>\r\n `;\r\n const article = dialog.querySelector(\"#msg-container\");\r\n article.appendChild(tempContainer);\r\n }\r\n } else {\r\n dialog.innerHTML = /*html*/ `\r\n <form method=\"dialog\">\r\n <header>\r\n <h2>${options.title}</h2>\r\n </header>\r\n \r\n <article id=\"msg-container\"></article>\r\n \r\n <footer>\r\n ${buttons.join(\"\")}\r\n </footer>\r\n </form>\r\n `;\r\n\r\n // Render message content\r\n const article = dialog.querySelector(\"#msg-container\");\r\n appendMessageContent(article, message);\r\n }\r\n\r\n // Handle cancel button clicks\r\n dialog.addEventListener(\"click\", (e) => {\r\n const btn = e.target.closest('button[value=\"cancel\"]');\r\n if (btn) {\r\n attemptResolve({\r\n actionCode: \"cancel\",\r\n form: dialog.querySelector(\"form\"),\r\n submitter: btn,\r\n originalEvent: e,\r\n });\r\n }\r\n });\r\n\r\n // Wait for form to exist before adding submit listener\r\n const setupFormListener = () => {\r\n const form = dialog.querySelector(\"form\");\r\n if (form) {\r\n if (form.dataset.askSubmitBound === \"true\") {\r\n return;\r\n }\r\n form.dataset.askSubmitBound = \"true\";\r\n\r\n form.addEventListener(\"submit\", (event) => {\r\n event.preventDefault();\r\n\r\n const submitValue = event.submitter?.value ?? (options.useForm ? \"ok\" : undefined);\r\n const bypassValidation = Boolean(event.submitter?.hasAttribute(\"formnovalidate\"));\r\n\r\n attemptResolve({\r\n actionCode: submitValue,\r\n form,\r\n submitter: event.submitter,\r\n originalEvent: event,\r\n bypassValidation,\r\n });\r\n });\r\n } else {\r\n // Form doesn't exist yet, wait and try again\r\n requestAnimationFrame(setupFormListener);\r\n }\r\n };\r\n\r\n dialog.addEventListener(\"cancel\", (event) => {\r\n event.preventDefault();\r\n attemptResolve({\r\n actionCode: \"dismiss\",\r\n form: dialog.querySelector(\"form\"),\r\n originalEvent: event,\r\n });\r\n });\r\n\r\n // Handle dialog close event\r\n dialog.addEventListener(\"close\", () => {\r\n if (!settled) {\r\n settle(false, dialog, { shouldClose: false });\r\n }\r\n\r\n // Small delay to allow exit animation\r\n setTimeout(() => dialog.remove(), 200);\r\n });\r\n\r\n // Append to body and show\r\n document.body.appendChild(dialog);\r\n\r\n // Bind submit behavior after element is connected so lazy-rendered forms are discoverable\r\n requestAnimationFrame(setupFormListener);\r\n\r\n // Call optional rendered callback\r\n if (typeof options.rendered === \"function\") {\r\n options.rendered(dialog);\r\n }\r\n\r\n // Show the dialog as modal\r\n dialog.showModal();\r\n\r\n requestAnimationFrame(() => playDialogEnterAnimation(dialog));\r\n });\r\n}\r\n\r\n/**\r\n * Show an alert dialog\r\n * @param {string|Node|Array} message - Alert message\r\n * @param {Object} options - Optional dialog options\r\n * @returns {Promise}\r\n */\r\nexport async function alert(message, options = {}) {\r\n const defaults = {\r\n title: getPageTitle(),\r\n type: \"alert\",\r\n buttons: {\r\n ok: { name: \"OK\", primary: true },\r\n },\r\n };\r\n\r\n return ask(message, { ...defaults, ...options });\r\n}\r\n\r\n/**\r\n * Show a confirmation dialog\r\n * @param {string|Node|Array} message - Confirmation message\r\n * @param {Object} options - Optional dialog options\r\n * @returns {Promise<boolean>}\r\n */\r\nexport async function confirm(message, options = {}) {\r\n const defaults = {\r\n title: \"Confirm Action\",\r\n type: \"confirm\",\r\n buttons: {\r\n ok: { name: \"Confirm\", primary: true },\r\n cancel: { name: \"Cancel\", cancel: true },\r\n },\r\n };\r\n\r\n return ask(message, { ...defaults, ...options });\r\n}\r\n"],
5
+ "mappings": "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",
6
+ "names": ["dialog"]
7
+ }