@pure-ds/core 0.7.5 → 0.7.7

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.
@@ -1,255 +1,25 @@
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/common/ask.js
80
- function appendMessageContent(container, message) {
81
- if (message == null)
82
- return;
83
- if (typeof message === "object" && Array.isArray(message.strings) && Array.isArray(message.values)) {
84
- container.appendChild(fragmentFromTemplateLike(message));
85
- return;
86
- }
87
- if (message instanceof Node) {
88
- container.appendChild(message);
89
- return;
90
- }
91
- if (Array.isArray(message)) {
92
- message.forEach((item) => appendMessageContent(container, item));
93
- return;
94
- }
95
- const text = typeof message === "string" ? message : String(message);
96
- container.appendChild(document.createTextNode(text));
97
- }
98
- function isSafariBrowser() {
99
- const userAgent = navigator.userAgent;
100
- const isSafariEngine = /Safari/i.test(userAgent);
101
- const isOtherBrowser = /(Chrome|Chromium|CriOS|FxiOS|EdgiOS|OPiOS|Opera)/i.test(userAgent);
102
- return isSafariEngine && !isOtherBrowser;
103
- }
104
- function playDialogEnterAnimation(dialog) {
105
- if (window.matchMedia?.("(prefers-reduced-motion: reduce)").matches) {
106
- return;
107
- }
108
- const isMobile = window.matchMedia?.("(max-width: 639px)").matches;
109
- const animationName = dialog.classList.contains("dialog-no-scale-animation") ? "pds-dialog-fade-enter" : isMobile ? "pds-dialog-enter-mobile" : "pds-dialog-enter";
110
- dialog.style.animation = "none";
111
- void dialog.offsetWidth;
112
- dialog.style.animation = `${animationName} var(--transition-normal) ease`;
113
- dialog.addEventListener("animationend", () => {
114
- dialog.style.animation = "";
115
- }, { once: true });
116
- }
117
- function shouldUseLiquidGlass(options = {}) {
118
- return options?.liquidGlassEffects === true;
119
- }
120
- async function ask(message, options = {}) {
121
- const defaults = {
122
- title: "Confirm",
123
- type: "confirm",
124
- // 'alert', 'confirm', 'custom'
125
- buttons: {
126
- ok: { name: "OK", primary: true },
127
- cancel: { name: "Cancel", cancel: true }
128
- }
129
- };
130
- options = { ...defaults, ...options };
131
- return new Promise((resolve) => {
132
- const dialog = document.createElement("dialog");
133
- if (isSafariBrowser()) {
134
- dialog.classList.add("dialog-no-scale-animation");
135
- }
136
- if (shouldUseLiquidGlass(options))
137
- dialog.classList.add("liquid-glass");
138
- if (options.size) {
139
- dialog.classList.add(`dialog-${options.size}`);
140
- }
141
- if (options.type) {
142
- dialog.classList.add(`dialog-${options.type}`);
143
- }
144
- if (options.class) {
145
- if (Array.isArray(options.class)) {
146
- dialog.classList.add(...options.class);
147
- } else {
148
- dialog.classList.add(options.class);
149
- }
150
- }
151
- if (options.maxHeight) {
152
- dialog.style.setProperty("--dialog-max-height", options.maxHeight);
153
- }
154
- const buttons = Object.entries(options.buttons).map(([code, obj]) => {
155
- const btnClass = obj.primary ? "btn-primary btn-sm" : "btn-outline btn-sm";
156
- const btnType = obj.cancel ? "button" : "submit";
157
- return `<button type="${btnType}" class="${btnClass}" value="${code}">${obj.name}</button>`;
158
- });
159
- if (options.useForm) {
160
- const tempContainer = document.createElement("div");
161
- appendMessageContent(tempContainer, message);
162
- const form = tempContainer.querySelector("form");
163
- if (form) {
164
- dialog.innerHTML = /*html*/
165
- `
1
+ function g(n){let e=Array.isArray(n?.strings)?n.strings:[],c=Array.isArray(n?.values)?n.values:[],u=new Set,t=[],f=/(\s)(\.[\w-]+)=\s*$/;for(let r=0;r<e.length;r+=1){let s=e[r]??"",l=s.match(f);if(l&&r<c.length){let d=l[2].slice(1),y=`pds-val-${r}`;s=s.replace(f,`$1data-pds-prop="${d}:${y}"`),u.add(r)}t.push(s),r<c.length&&!u.has(r)&&t.push(`<!--pds-val-${r}-->`)}let m=document.createElement("template");m.innerHTML=t.join("");let a=(r,s)=>{let l=r.parentNode;if(!l)return;if(s==null){l.removeChild(r);return}let p=d=>{if(d!=null){if(d instanceof Node){l.insertBefore(d,r);return}if(Array.isArray(d)){d.forEach(y=>p(y));return}l.insertBefore(document.createTextNode(String(d)),r)}};p(s),l.removeChild(r)},i=document.createTreeWalker(m.content,NodeFilter.SHOW_COMMENT),o=[];for(;i.nextNode();){let r=i.currentNode;r?.nodeValue?.startsWith("pds-val-")&&o.push(r)}return o.forEach(r=>{let s=Number(r.nodeValue.replace("pds-val-",""));a(r,c[s])}),m.content.querySelectorAll("*").forEach(r=>{let s=r.getAttribute("data-pds-prop");if(!s)return;let[l,p]=s.split(":"),d=Number(String(p).replace("pds-val-",""));l&&Number.isInteger(d)&&(r[l]=c[d]),r.removeAttribute("data-pds-prop")}),m.content}function b(n,e){if(e==null)return;if(typeof e=="object"&&Array.isArray(e.strings)&&Array.isArray(e.values)){n.appendChild(g(e));return}if(e instanceof Node){n.appendChild(e);return}if(Array.isArray(e)){e.forEach(u=>b(n,u));return}let c=typeof e=="string"?e:String(e);n.appendChild(document.createTextNode(c))}function A(){let n=navigator.userAgent,e=/Safari/i.test(n),c=/(Chrome|Chromium|CriOS|FxiOS|EdgiOS|OPiOS|Opera)/i.test(n);return e&&!c}function C(n){if(window.matchMedia?.("(prefers-reduced-motion: reduce)").matches)return;let e=window.matchMedia?.("(max-width: 639px)").matches,c=n.classList.contains("dialog-no-scale-animation")?"pds-dialog-fade-enter":e?"pds-dialog-enter-mobile":"pds-dialog-enter";n.style.animation="none",n.offsetWidth,n.style.animation=`${c} var(--transition-normal) ease`,n.addEventListener("animationend",()=>{n.style.animation=""},{once:!0})}function x(n={}){return n?.liquidGlassEffects===!0}async function E(n,e={}){return e={...{title:"Confirm",type:"confirm",buttons:{ok:{name:"OK",primary:!0},cancel:{name:"Cancel",cancel:!0}}},...e},new Promise(u=>{let t=document.createElement("dialog");A()&&t.classList.add("dialog-no-scale-animation"),x(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 f=Object.entries(e.buttons).map(([a,i])=>{let o=i.primary?"btn-primary btn-sm":"btn-outline btn-sm";return`<button type="${i.cancel?"button":"submit"}" class="${o}" value="${a}">${i.name}</button>`});if(e.useForm){let a=document.createElement("div");b(a,n);let i=a.querySelector("form");if(i){t.innerHTML=`
166
2
  <header>
167
- <h2>${options.title}</h2>
3
+ <h2>${e.title}</h2>
168
4
  </header>
169
- `;
170
- const article = document.createElement("article");
171
- article.className = "dialog-body";
172
- while (form.firstChild) {
173
- article.appendChild(form.firstChild);
174
- }
175
- form.appendChild(article);
176
- const footer = document.createElement("footer");
177
- footer.innerHTML = buttons.join("");
178
- form.appendChild(footer);
179
- dialog.appendChild(form);
180
- } else {
181
- dialog.innerHTML = /*html*/
182
- `
5
+ `;let o=document.createElement("article");for(o.className="dialog-body";i.firstChild;)o.appendChild(i.firstChild);i.appendChild(o);let h=document.createElement("footer");h.innerHTML=f.join(""),i.appendChild(h),t.appendChild(i)}else t.innerHTML=`
183
6
  <header>
184
- <h2>${options.title}</h2>
7
+ <h2>${e.title}</h2>
185
8
  </header>
186
9
  <article id="msg-container"></article>
187
10
  <footer>
188
- ${buttons.join("")}
11
+ ${f.join("")}
189
12
  </footer>
190
- `;
191
- const article = dialog.querySelector("#msg-container");
192
- article.appendChild(tempContainer);
193
- }
194
- } else {
195
- dialog.innerHTML = /*html*/
196
- `
13
+ `,t.querySelector("#msg-container").appendChild(a)}else{t.innerHTML=`
197
14
  <form method="dialog">
198
15
  <header>
199
- <h2>${options.title}</h2>
16
+ <h2>${e.title}</h2>
200
17
  </header>
201
18
 
202
19
  <article id="msg-container"></article>
203
20
 
204
21
  <footer>
205
- ${buttons.join("")}
22
+ ${f.join("")}
206
23
  </footer>
207
24
  </form>
208
- `;
209
- const article = dialog.querySelector("#msg-container");
210
- appendMessageContent(article, message);
211
- }
212
- dialog.addEventListener("click", (e) => {
213
- const btn = e.target.closest('button[value="cancel"]');
214
- if (btn) {
215
- dialog.close();
216
- resolve(false);
217
- }
218
- });
219
- const setupFormListener = () => {
220
- const form = dialog.querySelector("form");
221
- if (form) {
222
- form.addEventListener("submit", (event) => {
223
- event.preventDefault();
224
- let result;
225
- if (options.useForm && event.submitter.value === "ok") {
226
- console.log("Found form:", form);
227
- console.log("Form elements:", form ? Array.from(form.elements) : "no form");
228
- result = new FormData(form);
229
- console.log("FormData entries:", Array.from(result.entries()));
230
- } else {
231
- result = event.submitter.value === "ok";
232
- }
233
- dialog.close();
234
- resolve(result);
235
- });
236
- } else {
237
- requestAnimationFrame(setupFormListener);
238
- }
239
- };
240
- setupFormListener();
241
- dialog.addEventListener("close", () => {
242
- setTimeout(() => dialog.remove(), 200);
243
- });
244
- document.body.appendChild(dialog);
245
- if (typeof options.rendered === "function") {
246
- options.rendered(dialog);
247
- }
248
- dialog.showModal();
249
- requestAnimationFrame(() => playDialogEnterAnimation(dialog));
250
- });
251
- }
252
- export {
253
- ask
254
- };
255
- //# sourceMappingURL=pds-ask.js.map
25
+ `;let a=t.querySelector("#msg-container");b(a,n)}t.addEventListener("click",a=>{a.target.closest('button[value="cancel"]')&&(t.close(),u(!1))});let m=()=>{let a=t.querySelector("form");a?a.addEventListener("submit",i=>{i.preventDefault();let o;e.useForm&&i.submitter.value==="ok"?(console.log("Found form:",a),console.log("Form elements:",a?Array.from(a.elements):"no form"),o=new FormData(a),console.log("FormData entries:",Array.from(o.entries()))):o=i.submitter.value==="ok",t.close(),u(o)}):requestAnimationFrame(m)};m(),t.addEventListener("close",()=>{setTimeout(()=>t.remove(),200)}),document.body.appendChild(t),typeof e.rendered=="function"&&e.rendered(t),t.showModal(),requestAnimationFrame(()=>C(t))})}export{E as ask};