mypgs 1.5.1 → 2.0.0
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.
- package/AGENTS.md +8 -5
- package/README.md +1 -1
- package/assets/javascript/_imports.js +4 -0
- package/assets/javascript/_pgs.js +58 -0
- package/assets/javascript/base/_darkmode.js +27 -105
- package/assets/javascript/base/_svg.js +103 -0
- package/assets/javascript/components/_accordion.js +2 -2
- package/assets/javascript/components/_menu.js +1 -3
- package/assets/javascript/components/_modals.js +159 -136
- package/assets/javascript/components/_notifications.js +19 -9
- package/assets/javascript/components/_search.js +391 -0
- package/assets/javascript/components/_slides.js +66 -32
- package/assets/javascript/components/_stepTabs.js +4 -4
- package/assets/javascript/components/_steps.js +2 -2
- package/assets/javascript/components/_summary.js +2 -2
- package/assets/javascript/functions/_formValidate.js +97 -53
- package/assets/javascript/functions/_scrollY.js +10 -10
- package/assets/javascript/index.js +2 -0
- package/assets/javascript/layout/_header.js +29 -7
- package/assets/scss/base/_color.scss +5 -5
- package/assets/scss/base/_html.scss +2 -2
- package/assets/scss/base/_variables.scss +4 -2
- package/assets/scss/components/_dropdown.scss +2 -1
- package/assets/scss/components/_form.scss +2 -2
- package/assets/scss/components/_logo.scss +2 -2
- package/assets/scss/components/_menu.scss +20 -27
- package/assets/scss/components/_modals.scss +11 -1
- package/assets/scss/components/_notification.scss +23 -30
- package/assets/scss/components/_search.scss +140 -0
- package/assets/scss/index.scss +2 -2
- package/assets/scss/layout/_header.scss +1 -1
- package/assets/scss/layout/_pageShell.scss +19 -15
- package/assets/scss/mixin/_mx-form.scss +7 -7
- package/{templates/html → demo}/demo.html +1 -1
- package/demo/demo.js +240 -0
- package/dist/css/index.css +188 -125
- package/dist/css/index.css.map +1 -1
- package/dist/css/index.min.css +1 -1
- package/dist/index.d.ts +70 -0
- package/dist/javascript/index.js +1038 -405
- package/dist/javascript/index.js.map +1 -1
- package/dist/javascript/index.min.js +1 -1
- package/docs/componenti-e-markup.md +62 -27
- package/docs/components/accordion.md +61 -0
- package/docs/components/badges.md +67 -0
- package/docs/components/breadcumbs.md +43 -0
- package/docs/components/button.md +59 -0
- package/docs/components/card.md +50 -0
- package/docs/components/dropdown.md +135 -0
- package/docs/components/form.md +113 -0
- package/docs/components/logo.md +36 -0
- package/docs/components/menu.md +90 -0
- package/docs/components/modal.md +131 -0
- package/docs/components/notification.md +81 -0
- package/docs/components/search.md +117 -0
- package/docs/components/slides.md +85 -0
- package/docs/components/stepTabs.md +93 -0
- package/docs/components/steps.md +56 -0
- package/docs/components/summary.md +49 -0
- package/docs/components/table.md +42 -0
- package/docs/components/tooltip.md +53 -0
- package/docs/helper-javascript.md +71 -3
- package/docs/layout/body.md +41 -0
- package/docs/layout/flex.md +116 -0
- package/docs/layout/footer.md +71 -0
- package/docs/layout/grid.md +116 -0
- package/docs/layout/header.md +116 -0
- package/docs/layout/pageShell.md +94 -0
- package/docs/layout/section.md +69 -0
- package/docs/patterns/cookieConsent.md +89 -0
- package/package.json +2 -1
- package/scripts/generate-component-docs.js +557 -0
- package/templates/html/components/accordion.html +33 -4
- package/templates/html/components/badges.html +23 -0
- package/templates/html/components/breadcumbs.html +14 -0
- package/templates/html/components/button.html +22 -0
- package/templates/html/components/card.html +20 -0
- package/templates/html/components/dropdown.html +34 -0
- package/templates/html/components/form.html +82 -4
- package/templates/html/components/logo.html +22 -1
- package/templates/html/components/menu.html +40 -1
- package/templates/html/components/modal.html +44 -0
- package/templates/html/components/notification.html +68 -32
- package/templates/html/components/search.html +107 -0
- package/templates/html/components/slides.html +43 -0
- package/templates/html/components/stepTabs.html +47 -0
- package/templates/html/components/steps.html +24 -0
- package/templates/html/components/summary.html +27 -0
- package/templates/html/components/table.html +12 -0
- package/templates/html/components/tooltip.html +35 -0
- package/templates/html/layout/body.html +20 -5
- package/templates/html/layout/flex.html +20 -0
- package/templates/html/layout/footer.html +29 -1
- package/templates/html/layout/grid.html +20 -0
- package/templates/html/layout/header.html +52 -5
- package/templates/html/layout/pageShell.html +19 -0
- package/templates/html/layout/section.html +32 -10
- package/templates/html/patterns/cookieConsent.html +31 -0
- package/templates/react/components/form.jsx +3 -3
- package/templates/react/components/logo.jsx +1 -1
- package/templates/react/components/notification.jsx +4 -4
- package/templates/react/components/{searchbar.jsx → search.jsx} +9 -7
- package/templates/react/patterns/footer.jsx +1 -1
- package/templates/react/patterns/header.jsx +16 -10
- package/assets/scss/components/_searchbar.scss +0 -70
- package/templates/html/components/searchbar.html +0 -29
- package/templates/html/demo.js +0 -137
- /package/{templates/html → demo}/demo.css +0 -0
package/dist/javascript/index.js
CHANGED
|
@@ -10,17 +10,21 @@
|
|
|
10
10
|
"use strict";
|
|
11
11
|
__webpack_require__.r(__webpack_exports__);
|
|
12
12
|
/* harmony import */ var _pgs_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_pgs.js */ "./assets/javascript/_pgs.js");
|
|
13
|
-
/* harmony import */ var
|
|
14
|
-
/* harmony import */ var
|
|
15
|
-
/* harmony import */ var
|
|
16
|
-
/* harmony import */ var
|
|
17
|
-
/* harmony import */ var
|
|
18
|
-
/* harmony import */ var
|
|
19
|
-
/* harmony import */ var
|
|
20
|
-
/* harmony import */ var
|
|
21
|
-
/* harmony import */ var
|
|
22
|
-
/* harmony import */ var
|
|
23
|
-
/* harmony import */ var
|
|
13
|
+
/* harmony import */ var _base_svg_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base/_svg.js */ "./assets/javascript/base/_svg.js");
|
|
14
|
+
/* harmony import */ var _components_accordion_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/_accordion.js */ "./assets/javascript/components/_accordion.js");
|
|
15
|
+
/* harmony import */ var _components_dropdown_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/_dropdown.js */ "./assets/javascript/components/_dropdown.js");
|
|
16
|
+
/* harmony import */ var _components_menu_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/_menu.js */ "./assets/javascript/components/_menu.js");
|
|
17
|
+
/* harmony import */ var _components_modals_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/_modals.js */ "./assets/javascript/components/_modals.js");
|
|
18
|
+
/* harmony import */ var _components_notifications_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/_notifications.js */ "./assets/javascript/components/_notifications.js");
|
|
19
|
+
/* harmony import */ var _components_search_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/_search.js */ "./assets/javascript/components/_search.js");
|
|
20
|
+
/* harmony import */ var _components_slides_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./components/_slides.js */ "./assets/javascript/components/_slides.js");
|
|
21
|
+
/* harmony import */ var _components_stepTabs_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./components/_stepTabs.js */ "./assets/javascript/components/_stepTabs.js");
|
|
22
|
+
/* harmony import */ var _components_steps_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./components/_steps.js */ "./assets/javascript/components/_steps.js");
|
|
23
|
+
/* harmony import */ var _components_summary_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./components/_summary.js */ "./assets/javascript/components/_summary.js");
|
|
24
|
+
/* harmony import */ var _functions_formValidate_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./functions/_formValidate.js */ "./assets/javascript/functions/_formValidate.js");
|
|
25
|
+
/* harmony import */ var _functions_scrollY_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./functions/_scrollY.js */ "./assets/javascript/functions/_scrollY.js");
|
|
26
|
+
|
|
27
|
+
|
|
24
28
|
|
|
25
29
|
|
|
26
30
|
|
|
@@ -36,17 +40,19 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
36
40
|
|
|
37
41
|
|
|
38
42
|
_pgs_js__WEBPACK_IMPORTED_MODULE_0__.pgs.registerModules({
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
43
|
+
svg: _base_svg_js__WEBPACK_IMPORTED_MODULE_1__.PGS_svg,
|
|
44
|
+
accordion: _components_accordion_js__WEBPACK_IMPORTED_MODULE_2__.PGS_accordion,
|
|
45
|
+
dropdown: _components_dropdown_js__WEBPACK_IMPORTED_MODULE_3__.PGS_dropdown,
|
|
46
|
+
menu: _components_menu_js__WEBPACK_IMPORTED_MODULE_4__.PGS_menu,
|
|
47
|
+
modal: _components_modals_js__WEBPACK_IMPORTED_MODULE_5__.PGS_modal,
|
|
48
|
+
notification: _components_notifications_js__WEBPACK_IMPORTED_MODULE_6__.PGS_notification,
|
|
49
|
+
search: _components_search_js__WEBPACK_IMPORTED_MODULE_7__.PGS_search,
|
|
50
|
+
slides: _components_slides_js__WEBPACK_IMPORTED_MODULE_8__.PGS_slides,
|
|
51
|
+
stepTabs: _components_stepTabs_js__WEBPACK_IMPORTED_MODULE_9__.PGS_stepTabs,
|
|
52
|
+
steps: _components_steps_js__WEBPACK_IMPORTED_MODULE_10__.PGS_steps,
|
|
53
|
+
summary: _components_summary_js__WEBPACK_IMPORTED_MODULE_11__.PGS_summary,
|
|
54
|
+
formValidate: _functions_formValidate_js__WEBPACK_IMPORTED_MODULE_12__.PGS_formValidate,
|
|
55
|
+
scrollHorizontal: _functions_scrollY_js__WEBPACK_IMPORTED_MODULE_13__.PGS_scrollHorizontal,
|
|
50
56
|
});
|
|
51
57
|
|
|
52
58
|
|
|
@@ -250,10 +256,56 @@ function pgs(root) {
|
|
|
250
256
|
function createOption(attribute) {
|
|
251
257
|
if (!canAttr) return undefined;
|
|
252
258
|
|
|
259
|
+
const read = () => (root.getAttribute(attribute) || "").match(/[^\s[\]]+(?:\[[^\]]*\])?/g) || [];
|
|
260
|
+
const write = values => root.setAttribute(attribute, values.join(" "));
|
|
261
|
+
const getKey = value => String(value).trim().match(/^[^\s[\]]+/)?.[0] || "";
|
|
262
|
+
const getValues = values => values
|
|
263
|
+
.flat()
|
|
264
|
+
.flatMap(value => String(value).match(/[^\s[\]]+(?:\[[^\]]*\])?/g) || [])
|
|
265
|
+
.filter(Boolean);
|
|
266
|
+
|
|
253
267
|
function api() {
|
|
254
268
|
return api;
|
|
255
269
|
}
|
|
256
270
|
|
|
271
|
+
api.add = function (...values) {
|
|
272
|
+
const current = read();
|
|
273
|
+
|
|
274
|
+
getValues(values).forEach(value => {
|
|
275
|
+
if (!current.includes(value)) current.push(value);
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
write(current);
|
|
279
|
+
return api;
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
api.remove = function (...values) {
|
|
283
|
+
const keys = getValues(values).map(getKey).filter(Boolean);
|
|
284
|
+
write(read().filter(value => !keys.includes(getKey(value))));
|
|
285
|
+
return api;
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
api.toggle = function (value, force) {
|
|
289
|
+
const key = getKey(value);
|
|
290
|
+
if (!key) return false;
|
|
291
|
+
|
|
292
|
+
const exists = api.contains(key);
|
|
293
|
+
|
|
294
|
+
if (force !== undefined) {
|
|
295
|
+
if (force && !exists) api.add(value);
|
|
296
|
+
if (!force && exists) api.remove(key);
|
|
297
|
+
return !!force;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
if (exists) {
|
|
301
|
+
api.remove(key);
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
api.add(value);
|
|
306
|
+
return true;
|
|
307
|
+
};
|
|
308
|
+
|
|
257
309
|
api.contains = function (key) {
|
|
258
310
|
const source = root.getAttribute(attribute) || "";
|
|
259
311
|
const safeKey = String(key).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
@@ -273,6 +325,18 @@ function pgs(root) {
|
|
|
273
325
|
return match ? match[1] : undefined;
|
|
274
326
|
};
|
|
275
327
|
|
|
328
|
+
api.setValueBrackets = function (key, value = "") {
|
|
329
|
+
const optionKey = getKey(key);
|
|
330
|
+
if (!optionKey) return api;
|
|
331
|
+
|
|
332
|
+
const option = `${optionKey}[${String(value).trim()}]`;
|
|
333
|
+
const options = read().filter(item => getKey(item) !== optionKey);
|
|
334
|
+
|
|
335
|
+
options.push(option);
|
|
336
|
+
write(options);
|
|
337
|
+
return api;
|
|
338
|
+
};
|
|
339
|
+
|
|
276
340
|
Object.defineProperty(api, "value", {
|
|
277
341
|
get() { return root.getAttribute(attribute); },
|
|
278
342
|
set(v) { root.setAttribute(attribute, v); }
|
|
@@ -355,124 +419,46 @@ globalThis.pgs ??= pgs;
|
|
|
355
419
|
|
|
356
420
|
//# DARKMODE
|
|
357
421
|
|
|
422
|
+
const EVENT_SVG_CHANGE_COLOR = "pgs:svg:changeColor";
|
|
358
423
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
for (let I = 0; I < 20; I++) {
|
|
365
|
-
const color = ROOT.getPropertyValue('--' + type + '-color-' + I).toLocaleLowerCase().split("&");
|
|
366
|
-
if (!color[0] == "" && !color[1] == "") {
|
|
367
|
-
let lightDark = [color[0], color[1]]
|
|
368
|
-
colors.push(lightDark)
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
return colors;
|
|
372
|
-
}
|
|
373
|
-
const colors_svg_lottie = [searchColor("svg"), searchColor("lottie")];
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
//+ change COLORS
|
|
377
|
-
function darkmodeColorSVG() {
|
|
378
|
-
function changecolor(svgDoc, type = "svg") {
|
|
379
|
-
let isDarkMode = (document.documentElement.getAttribute("data-darkmode") === "true") ? false : true;
|
|
380
|
-
|
|
381
|
-
svgDoc.querySelectorAll('[fill], [stroke]').forEach(fillStroke => {
|
|
382
|
-
|
|
383
|
-
for (const colors of colors_svg_lottie) {
|
|
384
|
-
for (const color of colors) {
|
|
385
|
-
let OLD = (color[0] || '').replace(/\s/g, '');
|
|
386
|
-
let NEW = (color[1] || '').replace(/\s/g, '');
|
|
387
|
-
|
|
388
|
-
["fill", "stroke"].forEach(attr => {
|
|
389
|
-
const current = fillStroke.getAttribute(attr);
|
|
390
|
-
|
|
391
|
-
fillStroke.style.transition = "fill 0.5s ease, stroke 0.5s ease";
|
|
392
|
-
|
|
393
|
-
if (!isDarkMode) {
|
|
394
|
-
if (current == OLD) fillStroke.setAttribute(attr, NEW)
|
|
395
|
-
} else {
|
|
396
|
-
if (current == NEW) fillStroke.setAttribute(attr, OLD)
|
|
397
|
-
}
|
|
398
|
-
});
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
});
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
//== OBJECTS
|
|
405
|
-
const objects = document.querySelectorAll('object[type="image/svg+xml"]');
|
|
406
|
-
objects.forEach(obj => {
|
|
407
|
-
|
|
408
|
-
//=== ALL FILL / STROKE
|
|
409
|
-
obj.addEventListener("load", () => {
|
|
410
|
-
const svgDoc = obj.contentDocument;
|
|
411
|
-
if (svgDoc) changecolor(svgDoc, "svg")
|
|
412
|
-
});
|
|
413
|
-
|
|
414
|
-
//=== In caso l'object sia già caricato
|
|
415
|
-
if (obj.contentDocument) {
|
|
416
|
-
const event = new Event("load");
|
|
417
|
-
obj.dispatchEvent(event);
|
|
418
|
-
}
|
|
419
|
-
});
|
|
420
|
-
|
|
421
|
-
//== LOTTIE
|
|
422
|
-
const lottiePlayers = document.querySelectorAll('lottie-player');
|
|
423
|
-
lottiePlayers.forEach(lottiePlayer => {
|
|
424
|
-
|
|
425
|
-
//=== ALL FILL / STROKE
|
|
426
|
-
lottiePlayer.addEventListener("load", () => {
|
|
427
|
-
const svg = lottiePlayer.shadowRoot.querySelector('svg');
|
|
428
|
-
if (svg) changecolor(svg, "lottie")
|
|
429
|
-
});
|
|
424
|
+
//+ CHANGE ICON
|
|
425
|
+
function changeIcon(selector, isDarkMode) {
|
|
426
|
+
selector.forEach(button => {
|
|
427
|
+
const ICON = button.querySelector("i");
|
|
428
|
+
if (!ICON) return;
|
|
430
429
|
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
const event = new Event("load");
|
|
434
|
-
lottiePlayer.dispatchEvent(event);
|
|
435
|
-
}
|
|
430
|
+
ICON.classList.toggle("fa-moon", !isDarkMode);
|
|
431
|
+
ICON.classList.toggle("fa-sun", isDarkMode);
|
|
436
432
|
});
|
|
437
433
|
}
|
|
438
434
|
|
|
435
|
+
//+ SET STATUS
|
|
436
|
+
function setDarkmodeStatus(toggle = false, button) {
|
|
437
|
+
let isDarkMode = localStorage.getItem("screenIsDarkMode") === "true";
|
|
439
438
|
|
|
439
|
+
if (toggle) {
|
|
440
|
+
isDarkMode = !isDarkMode;
|
|
441
|
+
localStorage.setItem("screenIsDarkMode", isDarkMode);
|
|
442
|
+
}
|
|
440
443
|
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
document.body.classList.add("darkmode");
|
|
446
|
-
document.querySelector(":root").setAttribute("data-darkmode", "true");
|
|
447
|
-
document.body.setAttribute("data-darkmode", "true");
|
|
448
|
-
}
|
|
444
|
+
// SET
|
|
445
|
+
pgs(document.documentElement).state.toggle("darkmode", isDarkMode);
|
|
446
|
+
pgs(document.body).state.toggle("darkmode", isDarkMode);
|
|
447
|
+
// END SET
|
|
449
448
|
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
const ICON = button.querySelector("i");
|
|
453
|
-
if (!ICON) return;
|
|
454
|
-
ICON.classList.toggle("fa-moon", !isDarkMode);
|
|
455
|
-
ICON.classList.toggle("fa-sun", isDarkMode);
|
|
456
|
-
});
|
|
457
|
-
darkmodeColorSVG();
|
|
449
|
+
changeIcon(button, isDarkMode);
|
|
450
|
+
document.dispatchEvent(new CustomEvent(EVENT_SVG_CHANGE_COLOR, { detail: { isDarkMode } }));
|
|
458
451
|
}
|
|
459
452
|
|
|
460
|
-
toggleDarkmode.forEach(button => {
|
|
461
453
|
|
|
462
|
-
//== EXECUTE IMMEDIATELY
|
|
463
|
-
let isDarkMode = document.documentElement.getAttribute("data-darkmode") === "true";
|
|
464
|
-
change(toggleDarkmode, isDarkMode);
|
|
465
454
|
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
localStorage.setItem("screenIsDarkMode", isDarkMode);
|
|
455
|
+
//= INIT
|
|
456
|
+
const toggleDarkmode = pgs(document).querySelectorAll("toggleDarkmode");
|
|
457
|
+
setDarkmodeStatus(false, toggleDarkmode);
|
|
470
458
|
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
change(toggleDarkmode, isDarkMode);
|
|
475
|
-
});
|
|
459
|
+
//= BUTTON DARKMODE
|
|
460
|
+
toggleDarkmode.forEach(button => {
|
|
461
|
+
button.addEventListener("click", () => setDarkmodeStatus(true, toggleDarkmode));
|
|
476
462
|
});
|
|
477
463
|
|
|
478
464
|
|
|
@@ -528,6 +514,124 @@ document.addEventListener('DOMContentLoaded', () => {
|
|
|
528
514
|
});
|
|
529
515
|
|
|
530
516
|
|
|
517
|
+
/***/ },
|
|
518
|
+
|
|
519
|
+
/***/ "./assets/javascript/base/_svg.js"
|
|
520
|
+
/*!****************************************!*\
|
|
521
|
+
!*** ./assets/javascript/base/_svg.js ***!
|
|
522
|
+
\****************************************/
|
|
523
|
+
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
524
|
+
|
|
525
|
+
"use strict";
|
|
526
|
+
__webpack_require__.r(__webpack_exports__);
|
|
527
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
528
|
+
/* harmony export */ PGS_svg: () => (/* binding */ PGS_svg)
|
|
529
|
+
/* harmony export */ });
|
|
530
|
+
//# SVG & LOTTIE COLORS
|
|
531
|
+
|
|
532
|
+
const svgColors = {
|
|
533
|
+
eventChangeColor: "pgs:svg:changeColor",
|
|
534
|
+
watchedObjects: new WeakSet(),
|
|
535
|
+
watchedLotties: new WeakSet(),
|
|
536
|
+
|
|
537
|
+
_normalizeColor: (color = "") => {
|
|
538
|
+
return color.replace(/\s/g, "").toLocaleLowerCase();
|
|
539
|
+
},
|
|
540
|
+
|
|
541
|
+
_getCurrentDarkmode: () => {
|
|
542
|
+
return pgs(document.documentElement).state.contains("darkmode");
|
|
543
|
+
},
|
|
544
|
+
|
|
545
|
+
searchColor(type = "svg") {
|
|
546
|
+
const ROOT = getComputedStyle(document.documentElement);
|
|
547
|
+
const colors = [];
|
|
548
|
+
|
|
549
|
+
for (let I = 0; I < 20; I++) {
|
|
550
|
+
const color = ROOT.getPropertyValue("--" + type + "-color-" + I).toLocaleLowerCase().split("&").map(value => value.trim());
|
|
551
|
+
if (color[0] && color[1]) colors.push([color[0], color[1]]);
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
return colors;
|
|
555
|
+
},
|
|
556
|
+
|
|
557
|
+
_changeColor(svgDoc, isDarkMode, colors) {
|
|
558
|
+
if (!svgDoc) return;
|
|
559
|
+
|
|
560
|
+
svgDoc.querySelectorAll("[fill], [stroke]").forEach(fillStroke => {
|
|
561
|
+
for (const color of colors) {
|
|
562
|
+
const OLD = svgColors._normalizeColor(color[0]);
|
|
563
|
+
const NEW = svgColors._normalizeColor(color[1]);
|
|
564
|
+
|
|
565
|
+
["fill", "stroke"].forEach(attr => {
|
|
566
|
+
const current = svgColors._normalizeColor(fillStroke.getAttribute(attr) || "");
|
|
567
|
+
if (!current) return;
|
|
568
|
+
|
|
569
|
+
fillStroke.style.transition = "fill 0.5s ease, stroke 0.5s ease";
|
|
570
|
+
|
|
571
|
+
if (isDarkMode && current === OLD) fillStroke.setAttribute(attr, NEW);
|
|
572
|
+
if (!isDarkMode && current === NEW) fillStroke.setAttribute(attr, OLD);
|
|
573
|
+
});
|
|
574
|
+
}
|
|
575
|
+
});
|
|
576
|
+
},
|
|
577
|
+
|
|
578
|
+
_getLottieSvg(lottiePlayer) {
|
|
579
|
+
return lottiePlayer.shadowRoot?.querySelector("svg") || null;
|
|
580
|
+
},
|
|
581
|
+
|
|
582
|
+
init() {
|
|
583
|
+
document.addEventListener(svgColors.eventChangeColor, event => {
|
|
584
|
+
svgColors.applyColorsSVG(event.detail?.isDarkMode ?? svgColors._getCurrentDarkmode());
|
|
585
|
+
svgColors.applyColorsLottie(event.detail?.isDarkMode ?? svgColors._getCurrentDarkmode());
|
|
586
|
+
});
|
|
587
|
+
|
|
588
|
+
document.addEventListener("DOMContentLoaded", () => {
|
|
589
|
+
svgColors.applyColorsSVG();
|
|
590
|
+
svgColors.applyColorsLottie();
|
|
591
|
+
});
|
|
592
|
+
},
|
|
593
|
+
|
|
594
|
+
applyColorsSVG(isDarkMode = svgColors._getCurrentDarkmode()) {
|
|
595
|
+
const colorsSvg = svgColors.searchColor("svg");
|
|
596
|
+
|
|
597
|
+
if (!pgs(document).querySelector("svgChangeColor")) return;
|
|
598
|
+
|
|
599
|
+
document.querySelectorAll('object[type="image/svg+xml"]').forEach(obj => {
|
|
600
|
+
if (!svgColors.watchedObjects.has(obj)) {
|
|
601
|
+
obj.addEventListener("load", () => svgColors._changeColor(obj.contentDocument, svgColors._getCurrentDarkmode(), svgColors.searchColor("svg")));
|
|
602
|
+
svgColors.watchedObjects.add(obj);
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
if (obj.contentDocument) svgColors._changeColor(obj.contentDocument, isDarkMode, colorsSvg);
|
|
606
|
+
});
|
|
607
|
+
|
|
608
|
+
},
|
|
609
|
+
|
|
610
|
+
applyColorsLottie(isDarkMode = svgColors._getCurrentDarkmode()) {
|
|
611
|
+
const colorsLottie = svgColors.searchColor("svg");
|
|
612
|
+
|
|
613
|
+
if (!pgs(document).querySelector("lottieChangeColor")) return;
|
|
614
|
+
|
|
615
|
+
document.querySelectorAll("lottie-player").forEach(lottiePlayer => {
|
|
616
|
+
if (!svgColors.watchedLotties.has(lottiePlayer)) {
|
|
617
|
+
lottiePlayer.addEventListener("load", () => svgColors._changeColor(svgColors._getLottieSvg(lottiePlayer), svgColors._getCurrentDarkmode(), svgColors.searchColor("svg")));
|
|
618
|
+
svgColors.watchedLotties.add(lottiePlayer);
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
if (lottiePlayer.shadowRoot) svgColors._changeColor(svgColors._getLottieSvg(lottiePlayer), isDarkMode, colorsLottie);
|
|
622
|
+
});
|
|
623
|
+
},
|
|
624
|
+
};
|
|
625
|
+
|
|
626
|
+
svgColors.init();
|
|
627
|
+
|
|
628
|
+
const PGS_svg = {
|
|
629
|
+
eventChangeColor: svgColors.eventChangeColor,
|
|
630
|
+
applyColorsSVG: isDarkMode => svgColors.applyColorsSVG(isDarkMode),
|
|
631
|
+
applyColorsLottie: isDarkMode => svgColors.applyColorsLottie(isDarkMode),
|
|
632
|
+
};
|
|
633
|
+
|
|
634
|
+
|
|
531
635
|
/***/ },
|
|
532
636
|
|
|
533
637
|
/***/ "./assets/javascript/components/_accordion.js"
|
|
@@ -539,9 +643,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
|
|
539
643
|
"use strict";
|
|
540
644
|
__webpack_require__.r(__webpack_exports__);
|
|
541
645
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
542
|
-
/* harmony export */ PGS_accordion: () => (/* binding */ PGS_accordion)
|
|
543
|
-
/* harmony export */ PGS_accordion_api: () => (/* binding */ PGS_accordion_api),
|
|
544
|
-
/* harmony export */ PGS_accordion_init: () => (/* binding */ PGS_accordion_init)
|
|
646
|
+
/* harmony export */ PGS_accordion: () => (/* binding */ PGS_accordion)
|
|
545
647
|
/* harmony export */ });
|
|
546
648
|
//= ACCORDION
|
|
547
649
|
const API = new WeakMap();
|
|
@@ -930,6 +1032,7 @@ function PGS_menu_init(root = document) {
|
|
|
930
1032
|
li.querySelector("a").insertAdjacentElement("afterend", button);
|
|
931
1033
|
|
|
932
1034
|
pgs(li).add("dropdown")
|
|
1035
|
+
pgs(li).option.setValueBrackets("position", "bottom right")
|
|
933
1036
|
pgs(button).add("dropdown-button")
|
|
934
1037
|
pgs(button).add("buttonNohover")
|
|
935
1038
|
pgs(ul).add("dropdown-content")
|
|
@@ -940,9 +1043,6 @@ function PGS_menu_init(root = document) {
|
|
|
940
1043
|
API.set(MENU, {
|
|
941
1044
|
element: MENU,
|
|
942
1045
|
type: "horizontal",
|
|
943
|
-
// items: () => Array.from(MENU.querySelectorAll('nav > ul > li')),
|
|
944
|
-
// submenus: () => Array.from(MENU.querySelectorAll('.menu-item-has-children > ul')),
|
|
945
|
-
// dropdowns: () => Array.from(MENU.querySelectorAll('.menu-item-has-children')).map(PGS_dropdown_api).filter(Boolean),
|
|
946
1046
|
refresh: () => {
|
|
947
1047
|
PGS_menu_init(MENU.parentNode || document);
|
|
948
1048
|
return API.get(MENU);
|
|
@@ -977,168 +1077,189 @@ const PGS_menu = {
|
|
|
977
1077
|
"use strict";
|
|
978
1078
|
__webpack_require__.r(__webpack_exports__);
|
|
979
1079
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
980
|
-
/* harmony export */ PGS_modal: () => (/* binding */ PGS_modal)
|
|
981
|
-
/* harmony export */ PGS_modal_api: () => (/* binding */ PGS_modal_api),
|
|
982
|
-
/* harmony export */ PGS_modal_init: () => (/* binding */ PGS_modal_init)
|
|
1080
|
+
/* harmony export */ PGS_modal: () => (/* binding */ PGS_modal)
|
|
983
1081
|
/* harmony export */ });
|
|
984
1082
|
//# MODAL
|
|
985
1083
|
const API = new WeakMap();
|
|
986
1084
|
|
|
987
|
-
function
|
|
988
|
-
pgs(
|
|
989
|
-
|
|
1085
|
+
function getModals(root) {
|
|
1086
|
+
const modals = root instanceof Element && pgs(root).contains("modal") ? [root] : [];
|
|
1087
|
+
modals.push(...pgs(root).querySelectorAll("modal"));
|
|
1088
|
+
return modals;
|
|
1089
|
+
}
|
|
990
1090
|
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
if (!BUTTON_OPEN || !DIALOG) return;
|
|
1091
|
+
function initializeModal(MODAL, existingDialog = null) {
|
|
1092
|
+
if (API.has(MODAL)) return;
|
|
994
1093
|
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
const data_history = pgs(MODAL).option.contains("history");
|
|
1003
|
-
const data_container = pgs(MODAL).option.getValueBrackets("containerID");
|
|
1004
|
-
const data_containerPGS = pgs(MODAL).option.getValueBrackets("containerPGS");
|
|
1005
|
-
|
|
1006
|
-
//== OPTION ATTRIBUTES DIALOG
|
|
1007
|
-
const topLevel = pgs(DIALOG).option.contains("topLevel")
|
|
1094
|
+
const BUTTON_OPEN = pgs(MODAL).querySelector("modal-button");
|
|
1095
|
+
const DIALOG = existingDialog || MODAL.querySelector("dialog");
|
|
1096
|
+
if (!BUTTON_OPEN || !DIALOG) return;
|
|
1097
|
+
const eventController = new AbortController();
|
|
1098
|
+
const { signal } = eventController;
|
|
1099
|
+
let historyObserver = null;
|
|
1100
|
+
let historyTimeout = null;
|
|
1008
1101
|
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
else if (modalContentHeader) modalContentHeader.insertAdjacentHTML("beforeend", DOMButtonClose)
|
|
1013
|
-
else DIALOG.insertAdjacentHTML("beforeend", DOMButtonClose)
|
|
1014
|
-
const BUTTON_CLOSE = pgs(MODAL).querySelector("modal-close")
|
|
1102
|
+
//== SELECTOR
|
|
1103
|
+
const DOMButtonClose = '<button pgs="buttonClose modal-close" type="button" tabindex="0" aria-label="Chiudi"><i class="fa-solid fa-close"></i></button>';
|
|
1104
|
+
const modalContentHeader = pgs(DIALOG).querySelector("modal-dialog-content-header");
|
|
1015
1105
|
|
|
1016
1106
|
|
|
1017
|
-
|
|
1018
|
-
|
|
1107
|
+
//== OPTION ATTRIBUTES MODAL
|
|
1108
|
+
const disableBackdropClose = pgs(MODAL).option.contains("disableBackdropClose");
|
|
1109
|
+
const data_history = pgs(MODAL).option.contains("history");
|
|
1110
|
+
const data_container = pgs(MODAL).option.getValueBrackets("containerID");
|
|
1111
|
+
const data_containerPGS = pgs(MODAL).option.getValueBrackets("containerPGS");
|
|
1019
1112
|
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
BUTTON_OPEN.setAttribute("aria-label", "apri modale");
|
|
1113
|
+
//== OPTION ATTRIBUTES DIALOG
|
|
1114
|
+
const topLevel = pgs(DIALOG).option.contains("topLevel");
|
|
1023
1115
|
|
|
1024
1116
|
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1117
|
+
//== BUTTON CLOSE
|
|
1118
|
+
if (!pgs(DIALOG).querySelector("modal-close") && !pgs(MODAL).querySelector("modal-close")) {
|
|
1119
|
+
if (modalContentHeader) modalContentHeader.insertAdjacentHTML("beforeend", DOMButtonClose);
|
|
1120
|
+
else DIALOG.insertAdjacentHTML("beforeend", DOMButtonClose);
|
|
1121
|
+
}
|
|
1122
|
+
const BUTTON_CLOSE = pgs(DIALOG).querySelector("modal-close") || pgs(MODAL).querySelector("modal-close");
|
|
1031
1123
|
|
|
1032
1124
|
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
BUTTON_OPEN?.setAttribute("aria-expanded", status);
|
|
1036
|
-
DIALOG?.setAttribute("aria-expanded", status);
|
|
1037
|
-
}
|
|
1125
|
+
//== SET
|
|
1126
|
+
pgs(DIALOG).add("dialog modal-dialog");
|
|
1038
1127
|
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
if (DIALOG.open) {
|
|
1043
|
-
closeModal(e);
|
|
1044
|
-
return;
|
|
1045
|
-
}
|
|
1128
|
+
//== BUTTON OPEN
|
|
1129
|
+
BUTTON_OPEN.setAttribute("role", "button");
|
|
1130
|
+
BUTTON_OPEN.setAttribute("aria-label", "apri modale");
|
|
1046
1131
|
|
|
1047
|
-
if (!DIALOG.open) document.querySelectorAll("dialog[open]").forEach((dlg) => dlg.close());
|
|
1048
|
-
statusModal(true);
|
|
1049
|
-
topLevel ? DIALOG.showModal() : DIALOG.show();
|
|
1050
|
-
// modalCustomEvents('modal:open', { event: e });
|
|
1051
|
-
MODAL.dispatchEvent(new CustomEvent('modal:open'));
|
|
1052
|
-
DIALOG.dispatchEvent(new CustomEvent('modal:open'));
|
|
1053
|
-
}
|
|
1054
1132
|
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
DIALOG.dispatchEvent(new CustomEvent('modal:close'));
|
|
1063
|
-
}
|
|
1133
|
+
//== POSITION
|
|
1134
|
+
if (topLevel && !MODAL.contains(DIALOG)) MODAL.append(DIALOG);
|
|
1135
|
+
else if (!topLevel) {
|
|
1136
|
+
if (data_container) document.querySelector("#" + data_container)?.append(DIALOG);
|
|
1137
|
+
else if (data_containerPGS) pgs(document).querySelector(data_containerPGS)?.append(DIALOG);
|
|
1138
|
+
else document.body.append(DIALOG);
|
|
1139
|
+
}
|
|
1064
1140
|
|
|
1065
|
-
function forceOpen(e) {
|
|
1066
|
-
if (!DIALOG.open) openModal(e);
|
|
1067
|
-
}
|
|
1068
1141
|
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1142
|
+
//+ FN STATUS
|
|
1143
|
+
function statusModal(status = true) {
|
|
1144
|
+
BUTTON_OPEN?.setAttribute("aria-expanded", status);
|
|
1145
|
+
DIALOG?.setAttribute("aria-expanded", status);
|
|
1146
|
+
}
|
|
1072
1147
|
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1148
|
+
//+ FN OPEN
|
|
1149
|
+
function openModal(e) {
|
|
1150
|
+
e?.stopImmediatePropagation();
|
|
1151
|
+
if (DIALOG.open) {
|
|
1152
|
+
closeModal(e);
|
|
1153
|
+
return;
|
|
1079
1154
|
}
|
|
1080
1155
|
|
|
1156
|
+
if (!DIALOG.open) document.querySelectorAll("dialog[open]").forEach((dlg) => dlg.close());
|
|
1157
|
+
statusModal(true);
|
|
1158
|
+
topLevel ? DIALOG.showModal() : DIALOG.show();
|
|
1159
|
+
// modalCustomEvents('modal:open', { event: e });
|
|
1160
|
+
MODAL.dispatchEvent(new CustomEvent('modal:open'));
|
|
1161
|
+
DIALOG.dispatchEvent(new CustomEvent('modal:open'));
|
|
1162
|
+
}
|
|
1081
1163
|
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
//= UPDATE HISTORY
|
|
1092
|
-
if (data_history && BUTTON_OPEN.id) {
|
|
1093
|
-
setTimeout(openModalOnHistory, 1);
|
|
1094
|
-
|
|
1095
|
-
//== Aggiorna URL quando cambia l'attributo "open" del dialog
|
|
1096
|
-
const obs = new MutationObserver(() => {
|
|
1097
|
-
let isOpen = DIALOG.hasAttribute("open");
|
|
1098
|
-
try {
|
|
1099
|
-
const url = new URL(window.location.href);
|
|
1100
|
-
const params = new URLSearchParams(url.search);
|
|
1101
|
-
isOpen ? params.set('modal', BUTTON_OPEN.id) : params.delete('modal');
|
|
1102
|
-
url.search = params.toString() ? `?${params.toString()}` : "";
|
|
1103
|
-
window.history.pushState({ modal: BUTTON_OPEN.id, open: isOpen }, "", url);
|
|
1104
|
-
} catch (_) { }
|
|
1105
|
-
});
|
|
1106
|
-
obs.observe(DIALOG, { attributes: true, attributeFilter: ["open"] });
|
|
1107
|
-
|
|
1108
|
-
//== Gestisce back/forward del browser per aprire/chiudere il dialog coerentemente
|
|
1109
|
-
window.addEventListener("popstate", () => {
|
|
1110
|
-
try {
|
|
1111
|
-
const params = new URLSearchParams(window.location.search);
|
|
1112
|
-
const shouldOpen = params.get('modal') === BUTTON_OPEN.id;
|
|
1113
|
-
if (shouldOpen && !DIALOG.open) DIALOG.showModal();
|
|
1114
|
-
if (!shouldOpen && DIALOG.open) closeModal()
|
|
1115
|
-
} catch (_) { }
|
|
1116
|
-
});
|
|
1117
|
-
}
|
|
1164
|
+
//+ FN CLOSE
|
|
1165
|
+
function closeModal(e) {
|
|
1166
|
+
e?.stopImmediatePropagation()
|
|
1167
|
+
statusModal(false);
|
|
1168
|
+
DIALOG.close();
|
|
1169
|
+
// modalCustomEvents('modal:close', { event: e });
|
|
1170
|
+
MODAL.dispatchEvent(new CustomEvent('modal:close'));
|
|
1171
|
+
DIALOG.dispatchEvent(new CustomEvent('modal:close'));
|
|
1172
|
+
}
|
|
1118
1173
|
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1174
|
+
function forceOpen(e) {
|
|
1175
|
+
if (!DIALOG.open) openModal(e);
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
function forceClose(e) {
|
|
1179
|
+
if (DIALOG.open) closeModal(e);
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
//+ fn OPEN ON HISTORY
|
|
1183
|
+
function openModalOnHistory() {
|
|
1184
|
+
const params = new URLSearchParams(window.location.search);
|
|
1185
|
+
if (params.get('modal') !== BUTTON_OPEN.id) return;
|
|
1186
|
+
document.getElementById(BUTTON_OPEN.id)?.scrollIntoView({ behavior: 'smooth' });
|
|
1187
|
+
openModal();
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
|
|
1191
|
+
//= OPEN
|
|
1192
|
+
BUTTON_OPEN.addEventListener("click", (e) => openModal(e), { signal });
|
|
1193
|
+
BUTTON_OPEN.addEventListener("keypress", (e) => !DIALOG.open && (e.key === "Enter" || e.key === " ") && openModal(e), { signal });
|
|
1194
|
+
|
|
1195
|
+
//= CLOSE
|
|
1196
|
+
DIALOG.addEventListener("close", () => statusModal(false), { signal });
|
|
1197
|
+
DIALOG.addEventListener("click", e => { if (e.target == DIALOG && !disableBackdropClose) closeModal(e) }, { signal });
|
|
1198
|
+
BUTTON_CLOSE?.addEventListener("click", e => closeModal(e), { signal });
|
|
1199
|
+
|
|
1200
|
+
//= UPDATE HISTORY
|
|
1201
|
+
if (data_history && BUTTON_OPEN.id) {
|
|
1202
|
+
historyTimeout = window.setTimeout(openModalOnHistory, 1);
|
|
1203
|
+
|
|
1204
|
+
//== Aggiorna URL quando cambia l'attributo "open" del dialog
|
|
1205
|
+
historyObserver = new MutationObserver(() => {
|
|
1206
|
+
let isOpen = DIALOG.hasAttribute("open");
|
|
1207
|
+
try {
|
|
1208
|
+
const url = new URL(window.location.href);
|
|
1209
|
+
const params = new URLSearchParams(url.search);
|
|
1210
|
+
isOpen ? params.set('modal', BUTTON_OPEN.id) : params.delete('modal');
|
|
1211
|
+
url.search = params.toString() ? `?${params.toString()}` : "";
|
|
1212
|
+
window.history.pushState({ modal: BUTTON_OPEN.id, open: isOpen }, "", url);
|
|
1213
|
+
} catch (_) { }
|
|
1132
1214
|
});
|
|
1215
|
+
historyObserver.observe(DIALOG, { attributes: true, attributeFilter: ["open"] });
|
|
1216
|
+
|
|
1217
|
+
//== Gestisce back/forward del browser per aprire/chiudere il dialog coerentemente
|
|
1218
|
+
window.addEventListener("popstate", () => {
|
|
1219
|
+
try {
|
|
1220
|
+
const params = new URLSearchParams(window.location.search);
|
|
1221
|
+
const shouldOpen = params.get('modal') === BUTTON_OPEN.id;
|
|
1222
|
+
if (shouldOpen && !DIALOG.open) DIALOG.showModal();
|
|
1223
|
+
if (!shouldOpen && DIALOG.open) closeModal()
|
|
1224
|
+
} catch (_) { }
|
|
1225
|
+
}, { signal });
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1228
|
+
function destroy() {
|
|
1229
|
+
eventController.abort();
|
|
1230
|
+
historyObserver?.disconnect();
|
|
1231
|
+
if (historyTimeout !== null) window.clearTimeout(historyTimeout);
|
|
1232
|
+
API.delete(MODAL);
|
|
1233
|
+
}
|
|
1234
|
+
|
|
1235
|
+
API.set(MODAL, {
|
|
1236
|
+
element: MODAL,
|
|
1237
|
+
button: BUTTON_OPEN,
|
|
1238
|
+
dialog: DIALOG,
|
|
1239
|
+
closeButton: BUTTON_CLOSE,
|
|
1240
|
+
open: forceOpen,
|
|
1241
|
+
close: forceClose,
|
|
1242
|
+
toggle: openModal,
|
|
1243
|
+
refresh: () => {
|
|
1244
|
+
const nextDialog = MODAL.querySelector("dialog") || DIALOG;
|
|
1245
|
+
destroy();
|
|
1246
|
+
initializeModal(MODAL, nextDialog);
|
|
1247
|
+
return API.get(MODAL);
|
|
1248
|
+
},
|
|
1249
|
+
isOpen: () => DIALOG.open,
|
|
1133
1250
|
});
|
|
1134
1251
|
}
|
|
1135
1252
|
|
|
1253
|
+
function PGS_modal_init(root = document) {
|
|
1254
|
+
getModals(root).forEach(MODAL => initializeModal(MODAL));
|
|
1255
|
+
}
|
|
1256
|
+
|
|
1136
1257
|
//# INIT PGS_modal
|
|
1137
1258
|
PGS_modal_init()
|
|
1138
1259
|
|
|
1139
1260
|
//# API
|
|
1140
|
-
function PGS_modal_api(
|
|
1141
|
-
return API.get(
|
|
1261
|
+
function PGS_modal_api(element) {
|
|
1262
|
+
return API.get(element);
|
|
1142
1263
|
}
|
|
1143
1264
|
|
|
1144
1265
|
const PGS_modal = {
|
|
@@ -1158,8 +1279,7 @@ const PGS_modal = {
|
|
|
1158
1279
|
"use strict";
|
|
1159
1280
|
__webpack_require__.r(__webpack_exports__);
|
|
1160
1281
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1161
|
-
/* harmony export */ PGS_notification: () => (/* binding */ PGS_notification)
|
|
1162
|
-
/* harmony export */ PGS_notificationTrigger_init: () => (/* binding */ PGS_notificationTrigger_init)
|
|
1282
|
+
/* harmony export */ PGS_notification: () => (/* binding */ PGS_notification)
|
|
1163
1283
|
/* harmony export */ });
|
|
1164
1284
|
//= PGS_notification
|
|
1165
1285
|
const fn_notification = {
|
|
@@ -1187,10 +1307,12 @@ const fn_notification = {
|
|
|
1187
1307
|
},
|
|
1188
1308
|
|
|
1189
1309
|
_getData(root) {
|
|
1310
|
+
const rawNotification = pgs(root).option.getValueBrackets("notification") || "{}";
|
|
1311
|
+
|
|
1190
1312
|
try {
|
|
1191
|
-
return JSON.parse(
|
|
1313
|
+
return JSON.parse(rawNotification);
|
|
1192
1314
|
} catch (error) {
|
|
1193
|
-
console.warn("PGS notification:
|
|
1315
|
+
console.warn("PGS notification: configurazione JSON non valida", error);
|
|
1194
1316
|
return {};
|
|
1195
1317
|
}
|
|
1196
1318
|
},
|
|
@@ -1209,13 +1331,21 @@ const fn_notification = {
|
|
|
1209
1331
|
`;
|
|
1210
1332
|
},
|
|
1211
1333
|
|
|
1212
|
-
|
|
1213
|
-
|
|
1334
|
+
_getContainer(containerType) {
|
|
1335
|
+
return Array.from(pgs(document).querySelectorAll("notification")).find(container => {
|
|
1336
|
+
const isToast = pgs(container).option.contains("toast");
|
|
1337
|
+
return containerType === "toast" ? isToast : !isToast;
|
|
1338
|
+
});
|
|
1339
|
+
},
|
|
1340
|
+
|
|
1341
|
+
initNotification(type, containerType, icon, text, timeout, methodDelete = "replace", link = null) {
|
|
1342
|
+
let containerNotification = this._getContainer(containerType);
|
|
1214
1343
|
|
|
1215
1344
|
//== Create Container
|
|
1216
1345
|
if (!containerNotification) {
|
|
1217
1346
|
const newContainer = document.createElement("div");
|
|
1218
|
-
pgs(newContainer).add(
|
|
1347
|
+
pgs(newContainer).add("notification");
|
|
1348
|
+
if (containerType === "toast") pgs(newContainer).option.add("toast");
|
|
1219
1349
|
newContainer.setAttribute("aria-live", "polite");
|
|
1220
1350
|
newContainer.setAttribute("aria-relevant", "additions");
|
|
1221
1351
|
document.body.appendChild(newContainer);
|
|
@@ -1261,8 +1391,8 @@ const fn_notification = {
|
|
|
1261
1391
|
});
|
|
1262
1392
|
},
|
|
1263
1393
|
|
|
1264
|
-
deleteAll(
|
|
1265
|
-
let containerNotification =
|
|
1394
|
+
deleteAll(containerType) {
|
|
1395
|
+
let containerNotification = this._getContainer(containerType);
|
|
1266
1396
|
if (containerNotification) containerNotification.innerHTML = "";
|
|
1267
1397
|
},
|
|
1268
1398
|
|
|
@@ -1296,7 +1426,7 @@ const fn_notification = {
|
|
|
1296
1426
|
}
|
|
1297
1427
|
};
|
|
1298
1428
|
|
|
1299
|
-
//#
|
|
1429
|
+
//# TRIGGER
|
|
1300
1430
|
function PGS_notificationTrigger_init(root = document) {
|
|
1301
1431
|
return fn_notification.trigger(root);
|
|
1302
1432
|
}
|
|
@@ -1325,6 +1455,412 @@ if (document.readyState === "loading") document.addEventListener("DOMContentLoad
|
|
|
1325
1455
|
else PGS_notificationTrigger_init();
|
|
1326
1456
|
|
|
1327
1457
|
|
|
1458
|
+
/***/ },
|
|
1459
|
+
|
|
1460
|
+
/***/ "./assets/javascript/components/_search.js"
|
|
1461
|
+
/*!*************************************************!*\
|
|
1462
|
+
!*** ./assets/javascript/components/_search.js ***!
|
|
1463
|
+
\*************************************************/
|
|
1464
|
+
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
1465
|
+
|
|
1466
|
+
"use strict";
|
|
1467
|
+
__webpack_require__.r(__webpack_exports__);
|
|
1468
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1469
|
+
/* harmony export */ PGS_search: () => (/* binding */ PGS_search)
|
|
1470
|
+
/* harmony export */ });
|
|
1471
|
+
const API = new WeakMap();
|
|
1472
|
+
const OPEN_SEARCHES = new Set();
|
|
1473
|
+
let searchId = 0;
|
|
1474
|
+
|
|
1475
|
+
const DEFAULT_OPTIONS = {
|
|
1476
|
+
minLength: 2,
|
|
1477
|
+
debounce: 200,
|
|
1478
|
+
limit: 6,
|
|
1479
|
+
submitOnSelect: false,
|
|
1480
|
+
searchOnFocus: true,
|
|
1481
|
+
source: null,
|
|
1482
|
+
onSelect: null,
|
|
1483
|
+
};
|
|
1484
|
+
|
|
1485
|
+
function nextSearchId() {
|
|
1486
|
+
searchId += 1;
|
|
1487
|
+
return searchId;
|
|
1488
|
+
}
|
|
1489
|
+
|
|
1490
|
+
function getSearches(root) {
|
|
1491
|
+
const searches = root instanceof Element && pgs(root).contains("search") ? [root] : [];
|
|
1492
|
+
searches.push(...pgs(root).querySelectorAll("search"));
|
|
1493
|
+
return searches;
|
|
1494
|
+
}
|
|
1495
|
+
|
|
1496
|
+
function directPgsChild(element, token) {
|
|
1497
|
+
return Array.from(element.children).find(child => pgs(child).contains(token));
|
|
1498
|
+
}
|
|
1499
|
+
|
|
1500
|
+
function normalizeItem(item) {
|
|
1501
|
+
if (typeof item === "string" || typeof item === "number") {
|
|
1502
|
+
const value = String(item).trim();
|
|
1503
|
+
return value ? { label: value, value, disabled: false, data: item } : null;
|
|
1504
|
+
}
|
|
1505
|
+
|
|
1506
|
+
if (!item || typeof item !== "object") return null;
|
|
1507
|
+
|
|
1508
|
+
const label = String(item.label ?? item.value ?? "").trim();
|
|
1509
|
+
if (!label) return null;
|
|
1510
|
+
|
|
1511
|
+
return {
|
|
1512
|
+
label,
|
|
1513
|
+
value: String(item.value ?? label),
|
|
1514
|
+
disabled: Boolean(item.disabled),
|
|
1515
|
+
data: Object.prototype.hasOwnProperty.call(item, "data") ? item.data : item,
|
|
1516
|
+
};
|
|
1517
|
+
}
|
|
1518
|
+
|
|
1519
|
+
function normalizeOptions(current, options = {}) {
|
|
1520
|
+
const next = { ...current, ...options };
|
|
1521
|
+
next.minLength = Math.max(0, Number.parseInt(next.minLength, 10) || 0);
|
|
1522
|
+
next.debounce = Math.max(0, Number.parseInt(next.debounce, 10) || 0);
|
|
1523
|
+
next.limit = Math.max(1, Number.parseInt(next.limit, 10) || DEFAULT_OPTIONS.limit);
|
|
1524
|
+
next.submitOnSelect = Boolean(next.submitOnSelect);
|
|
1525
|
+
next.searchOnFocus = Boolean(next.searchOnFocus);
|
|
1526
|
+
next.source = typeof next.source === "function" || Array.isArray(next.source) ? next.source : null;
|
|
1527
|
+
next.onSelect = typeof next.onSelect === "function" ? next.onSelect : null;
|
|
1528
|
+
return next;
|
|
1529
|
+
}
|
|
1530
|
+
|
|
1531
|
+
function closeSearch(search) {
|
|
1532
|
+
const data = API.get(search);
|
|
1533
|
+
if (!data) return;
|
|
1534
|
+
|
|
1535
|
+
pgs(search).state.remove("open");
|
|
1536
|
+
data.input.setAttribute("aria-expanded", "false");
|
|
1537
|
+
data.input.removeAttribute("aria-activedescendant");
|
|
1538
|
+
data.list.setAttribute("aria-hidden", "true");
|
|
1539
|
+
data.setActiveIndex(-1);
|
|
1540
|
+
OPEN_SEARCHES.delete(search);
|
|
1541
|
+
}
|
|
1542
|
+
|
|
1543
|
+
function openSearch(search) {
|
|
1544
|
+
const data = API.get(search);
|
|
1545
|
+
if (!data || data.items().length === 0) return;
|
|
1546
|
+
|
|
1547
|
+
pgs(search).state.add("open");
|
|
1548
|
+
data.input.setAttribute("aria-expanded", "true");
|
|
1549
|
+
data.list.setAttribute("aria-hidden", "false");
|
|
1550
|
+
OPEN_SEARCHES.add(search);
|
|
1551
|
+
}
|
|
1552
|
+
|
|
1553
|
+
function PGS_search_init(root = document) {
|
|
1554
|
+
getSearches(root).forEach(search => {
|
|
1555
|
+
if (API.has(search)) return;
|
|
1556
|
+
|
|
1557
|
+
const input = search.querySelector('input[type="search"]');
|
|
1558
|
+
const list = directPgsChild(search, "search-suggestions");
|
|
1559
|
+
if (!input || !list) return;
|
|
1560
|
+
|
|
1561
|
+
const id = nextSearchId();
|
|
1562
|
+
if (!input.id) input.id = `search-input-${id}`;
|
|
1563
|
+
if (!list.id) list.id = `search-suggestions-${id}`;
|
|
1564
|
+
|
|
1565
|
+
input.setAttribute("role", "combobox");
|
|
1566
|
+
input.setAttribute("aria-autocomplete", "list");
|
|
1567
|
+
input.setAttribute("aria-haspopup", "listbox");
|
|
1568
|
+
input.setAttribute("aria-controls", list.id);
|
|
1569
|
+
input.setAttribute("aria-expanded", "false");
|
|
1570
|
+
input.setAttribute("autocomplete", "off");
|
|
1571
|
+
list.setAttribute("role", "listbox");
|
|
1572
|
+
list.setAttribute("aria-labelledby", input.id);
|
|
1573
|
+
list.setAttribute("aria-hidden", "true");
|
|
1574
|
+
|
|
1575
|
+
|
|
1576
|
+
let options = { ...DEFAULT_OPTIONS };
|
|
1577
|
+
let items = [];
|
|
1578
|
+
let activeIndex = -1;
|
|
1579
|
+
let timer = null;
|
|
1580
|
+
let controller = null;
|
|
1581
|
+
let requestNumber = 0;
|
|
1582
|
+
|
|
1583
|
+
function setLoading(loading) {
|
|
1584
|
+
pgs(search).state.toggle("loading", loading);
|
|
1585
|
+
input.setAttribute("aria-busy", String(loading));
|
|
1586
|
+
}
|
|
1587
|
+
|
|
1588
|
+
function setActiveIndex(index) {
|
|
1589
|
+
activeIndex = index;
|
|
1590
|
+
const elements = Array.from(list.querySelectorAll('[pgs~="search-suggestions-item"]'));
|
|
1591
|
+
|
|
1592
|
+
elements.forEach((element, itemIndex) => {
|
|
1593
|
+
const selected = itemIndex === activeIndex;
|
|
1594
|
+
element.setAttribute("aria-selected", String(selected));
|
|
1595
|
+
pgs(element).state.toggle("selected", selected);
|
|
1596
|
+
});
|
|
1597
|
+
|
|
1598
|
+
const active = elements[activeIndex];
|
|
1599
|
+
if (active) {
|
|
1600
|
+
input.setAttribute("aria-activedescendant", active.id);
|
|
1601
|
+
active.scrollIntoView({ block: "nearest" });
|
|
1602
|
+
} else {
|
|
1603
|
+
input.removeAttribute("aria-activedescendant");
|
|
1604
|
+
}
|
|
1605
|
+
}
|
|
1606
|
+
|
|
1607
|
+
function moveActive(step) {
|
|
1608
|
+
if (!items.length) return;
|
|
1609
|
+
|
|
1610
|
+
let next = activeIndex;
|
|
1611
|
+
for (let checked = 0; checked < items.length; checked += 1) {
|
|
1612
|
+
next = (next + step + items.length) % items.length;
|
|
1613
|
+
if (!items[next].disabled) {
|
|
1614
|
+
setActiveIndex(next);
|
|
1615
|
+
return;
|
|
1616
|
+
}
|
|
1617
|
+
}
|
|
1618
|
+
}
|
|
1619
|
+
|
|
1620
|
+
function clear() {
|
|
1621
|
+
items = [];
|
|
1622
|
+
activeIndex = -1;
|
|
1623
|
+
list.replaceChildren();
|
|
1624
|
+
closeSearch(search);
|
|
1625
|
+
}
|
|
1626
|
+
|
|
1627
|
+
function cancel() {
|
|
1628
|
+
if (timer !== null) window.clearTimeout(timer);
|
|
1629
|
+
timer = null;
|
|
1630
|
+
if (controller) controller.abort();
|
|
1631
|
+
controller = null;
|
|
1632
|
+
requestNumber += 1;
|
|
1633
|
+
setLoading(false);
|
|
1634
|
+
}
|
|
1635
|
+
|
|
1636
|
+
function render(nextItems) {
|
|
1637
|
+
items = Array.from(nextItems || [])
|
|
1638
|
+
.map(normalizeItem)
|
|
1639
|
+
.filter(Boolean)
|
|
1640
|
+
.slice(0, options.limit);
|
|
1641
|
+
|
|
1642
|
+
const fragment = document.createDocumentFragment();
|
|
1643
|
+
items.forEach((item, index) => {
|
|
1644
|
+
const option = document.createElement("li");
|
|
1645
|
+
pgs(option).add("search-suggestions-item");
|
|
1646
|
+
pgs(option).add("flexRow");
|
|
1647
|
+
option.id = `${list.id}-option-${index}`;
|
|
1648
|
+
option.dataset.index = String(index);
|
|
1649
|
+
option.setAttribute("role", "option");
|
|
1650
|
+
option.setAttribute("aria-selected", "false");
|
|
1651
|
+
option.setAttribute("aria-disabled", String(item.disabled));
|
|
1652
|
+
option.innerHTML = '<i class="fa-solid fa-magnifying-glass"></i>' + item.label;
|
|
1653
|
+
fragment.append(option);
|
|
1654
|
+
|
|
1655
|
+
});
|
|
1656
|
+
|
|
1657
|
+
activeIndex = -1;
|
|
1658
|
+
list.replaceChildren(fragment);
|
|
1659
|
+
pgs(search).state.remove("error");
|
|
1660
|
+
|
|
1661
|
+
if (items.length) openSearch(search);
|
|
1662
|
+
else closeSearch(search);
|
|
1663
|
+
|
|
1664
|
+
return items;
|
|
1665
|
+
}
|
|
1666
|
+
|
|
1667
|
+
async function resolveSource(query, signal) {
|
|
1668
|
+
if (Array.isArray(options.source)) {
|
|
1669
|
+
const normalizedQuery = query.toLocaleLowerCase();
|
|
1670
|
+
return options.source.filter(item => {
|
|
1671
|
+
const normalized = normalizeItem(item);
|
|
1672
|
+
return normalized && normalized.label.toLocaleLowerCase().includes(normalizedQuery);
|
|
1673
|
+
});
|
|
1674
|
+
}
|
|
1675
|
+
|
|
1676
|
+
if (typeof options.source !== "function") return [];
|
|
1677
|
+
return await options.source({
|
|
1678
|
+
query,
|
|
1679
|
+
signal,
|
|
1680
|
+
limit: options.limit,
|
|
1681
|
+
element: search,
|
|
1682
|
+
input,
|
|
1683
|
+
});
|
|
1684
|
+
}
|
|
1685
|
+
|
|
1686
|
+
async function runSearch(query = input.value) {
|
|
1687
|
+
cancel();
|
|
1688
|
+
clear();
|
|
1689
|
+
|
|
1690
|
+
const normalizedQuery = String(query ?? "").trim();
|
|
1691
|
+
if (normalizedQuery.length < options.minLength || !options.source) return [];
|
|
1692
|
+
|
|
1693
|
+
const currentRequest = requestNumber;
|
|
1694
|
+
controller = new AbortController();
|
|
1695
|
+
const currentController = controller;
|
|
1696
|
+
setLoading(true);
|
|
1697
|
+
|
|
1698
|
+
try {
|
|
1699
|
+
const result = await resolveSource(normalizedQuery, currentController.signal);
|
|
1700
|
+
if (currentRequest !== requestNumber || currentController.signal.aborted) return [];
|
|
1701
|
+
return render(result);
|
|
1702
|
+
} catch (error) {
|
|
1703
|
+
if (error?.name === "AbortError") return [];
|
|
1704
|
+
if (currentRequest !== requestNumber) return [];
|
|
1705
|
+
|
|
1706
|
+
clear();
|
|
1707
|
+
pgs(search).state.add("error");
|
|
1708
|
+
search.dispatchEvent(new CustomEvent("pgs:search:error", {
|
|
1709
|
+
bubbles: true,
|
|
1710
|
+
detail: { error, query: normalizedQuery },
|
|
1711
|
+
}));
|
|
1712
|
+
return [];
|
|
1713
|
+
} finally {
|
|
1714
|
+
if (controller === currentController) controller = null;
|
|
1715
|
+
if (currentRequest === requestNumber) setLoading(false);
|
|
1716
|
+
}
|
|
1717
|
+
}
|
|
1718
|
+
|
|
1719
|
+
function schedule() {
|
|
1720
|
+
cancel();
|
|
1721
|
+
clear();
|
|
1722
|
+
pgs(search).state.remove("error");
|
|
1723
|
+
|
|
1724
|
+
if (input.value.trim().length < options.minLength || !options.source) return;
|
|
1725
|
+
timer = window.setTimeout(() => {
|
|
1726
|
+
timer = null;
|
|
1727
|
+
runSearch(input.value);
|
|
1728
|
+
}, options.debounce);
|
|
1729
|
+
}
|
|
1730
|
+
|
|
1731
|
+
function select(index = activeIndex, submit = options.submitOnSelect) {
|
|
1732
|
+
const item = items[index];
|
|
1733
|
+
if (!item || item.disabled) return null;
|
|
1734
|
+
|
|
1735
|
+
input.value = item.value;
|
|
1736
|
+
cancel();
|
|
1737
|
+
clear();
|
|
1738
|
+
|
|
1739
|
+
const detail = { item, index, value: item.value, input, element: search };
|
|
1740
|
+
search.dispatchEvent(new CustomEvent("pgs:search:select", { bubbles: true, detail }));
|
|
1741
|
+
options.onSelect?.(detail);
|
|
1742
|
+
|
|
1743
|
+
input.focus();
|
|
1744
|
+
if (submit && typeof search.requestSubmit === "function") search.requestSubmit();
|
|
1745
|
+
return item;
|
|
1746
|
+
}
|
|
1747
|
+
|
|
1748
|
+
function configure(nextOptions = {}) {
|
|
1749
|
+
options = normalizeOptions(options, nextOptions);
|
|
1750
|
+
return api;
|
|
1751
|
+
}
|
|
1752
|
+
|
|
1753
|
+
function onInput() {
|
|
1754
|
+
schedule();
|
|
1755
|
+
}
|
|
1756
|
+
|
|
1757
|
+
function onFocus() {
|
|
1758
|
+
if (items.length) openSearch(search);
|
|
1759
|
+
else if (options.searchOnFocus) schedule();
|
|
1760
|
+
}
|
|
1761
|
+
|
|
1762
|
+
function onKeydown(event) {
|
|
1763
|
+
if (event.key === "ArrowDown") {
|
|
1764
|
+
if (!pgs(search).state.contains("open")) schedule();
|
|
1765
|
+
if (items.length) {
|
|
1766
|
+
event.preventDefault();
|
|
1767
|
+
moveActive(1);
|
|
1768
|
+
}
|
|
1769
|
+
return;
|
|
1770
|
+
}
|
|
1771
|
+
|
|
1772
|
+
if (event.key === "ArrowUp" && items.length) {
|
|
1773
|
+
event.preventDefault();
|
|
1774
|
+
moveActive(-1);
|
|
1775
|
+
return;
|
|
1776
|
+
}
|
|
1777
|
+
|
|
1778
|
+
if (event.key === "Enter" && activeIndex >= 0) {
|
|
1779
|
+
event.preventDefault();
|
|
1780
|
+
select(activeIndex);
|
|
1781
|
+
return;
|
|
1782
|
+
}
|
|
1783
|
+
|
|
1784
|
+
if (event.key === "Escape") {
|
|
1785
|
+
event.preventDefault();
|
|
1786
|
+
cancel();
|
|
1787
|
+
closeSearch(search);
|
|
1788
|
+
return;
|
|
1789
|
+
}
|
|
1790
|
+
|
|
1791
|
+
if (event.key === "Tab") closeSearch(search);
|
|
1792
|
+
}
|
|
1793
|
+
|
|
1794
|
+
function onListPointerDown(event) {
|
|
1795
|
+
const option = event.target.closest('[pgs~="search-suggestions-item"]');
|
|
1796
|
+
if (!option || !list.contains(option)) return;
|
|
1797
|
+
event.preventDefault();
|
|
1798
|
+
select(Number.parseInt(option.dataset.index, 10));
|
|
1799
|
+
}
|
|
1800
|
+
|
|
1801
|
+
function onSubmit() {
|
|
1802
|
+
cancel();
|
|
1803
|
+
closeSearch(search);
|
|
1804
|
+
}
|
|
1805
|
+
|
|
1806
|
+
function destroy() {
|
|
1807
|
+
cancel();
|
|
1808
|
+
clear();
|
|
1809
|
+
input.removeEventListener("input", onInput);
|
|
1810
|
+
input.removeEventListener("focus", onFocus);
|
|
1811
|
+
input.removeEventListener("keydown", onKeydown);
|
|
1812
|
+
list.removeEventListener("pointerdown", onListPointerDown);
|
|
1813
|
+
search.removeEventListener("submit", onSubmit);
|
|
1814
|
+
API.delete(search);
|
|
1815
|
+
}
|
|
1816
|
+
|
|
1817
|
+
const api = {
|
|
1818
|
+
element: search,
|
|
1819
|
+
input,
|
|
1820
|
+
list,
|
|
1821
|
+
configure,
|
|
1822
|
+
setSource: source => configure({ source }),
|
|
1823
|
+
search: runSearch,
|
|
1824
|
+
open: () => openSearch(search),
|
|
1825
|
+
close: () => closeSearch(search),
|
|
1826
|
+
clear,
|
|
1827
|
+
cancel,
|
|
1828
|
+
select,
|
|
1829
|
+
refresh: () => runSearch(input.value),
|
|
1830
|
+
destroy,
|
|
1831
|
+
items: () => [...items],
|
|
1832
|
+
isOpen: () => pgs(search).state.contains("open"),
|
|
1833
|
+
isLoading: () => pgs(search).state.contains("loading"),
|
|
1834
|
+
setActiveIndex,
|
|
1835
|
+
};
|
|
1836
|
+
|
|
1837
|
+
input.addEventListener("input", onInput);
|
|
1838
|
+
input.addEventListener("focus", onFocus);
|
|
1839
|
+
input.addEventListener("keydown", onKeydown);
|
|
1840
|
+
list.addEventListener("pointerdown", onListPointerDown);
|
|
1841
|
+
search.addEventListener("submit", onSubmit);
|
|
1842
|
+
API.set(search, api);
|
|
1843
|
+
});
|
|
1844
|
+
}
|
|
1845
|
+
|
|
1846
|
+
document.addEventListener("pointerdown", event => {
|
|
1847
|
+
OPEN_SEARCHES.forEach(search => {
|
|
1848
|
+
if (!search.contains(event.target)) closeSearch(search);
|
|
1849
|
+
});
|
|
1850
|
+
});
|
|
1851
|
+
|
|
1852
|
+
PGS_search_init();
|
|
1853
|
+
|
|
1854
|
+
function PGS_search_api(selector) {
|
|
1855
|
+
return API.get(selector);
|
|
1856
|
+
}
|
|
1857
|
+
|
|
1858
|
+
const PGS_search = {
|
|
1859
|
+
init: PGS_search_init,
|
|
1860
|
+
api: PGS_search_api,
|
|
1861
|
+
};
|
|
1862
|
+
|
|
1863
|
+
|
|
1328
1864
|
/***/ },
|
|
1329
1865
|
|
|
1330
1866
|
/***/ "./assets/javascript/components/_slides.js"
|
|
@@ -1336,18 +1872,22 @@ else PGS_notificationTrigger_init();
|
|
|
1336
1872
|
"use strict";
|
|
1337
1873
|
__webpack_require__.r(__webpack_exports__);
|
|
1338
1874
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1339
|
-
/* harmony export */ PGS_slides: () => (/* binding */ PGS_slides)
|
|
1340
|
-
/* harmony export */ PGS_slides_api: () => (/* binding */ PGS_slides_api),
|
|
1341
|
-
/* harmony export */ PGS_slides_init: () => (/* binding */ PGS_slides_init)
|
|
1875
|
+
/* harmony export */ PGS_slides: () => (/* binding */ PGS_slides)
|
|
1342
1876
|
/* harmony export */ });
|
|
1343
|
-
/* harmony import */ var
|
|
1877
|
+
/* harmony import */ var _functions_scrollY_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../functions/_scrollY.js */ "./assets/javascript/functions/_scrollY.js");
|
|
1344
1878
|
|
|
1345
1879
|
const API = new WeakMap();
|
|
1346
1880
|
|
|
1881
|
+
function getSlides(root) {
|
|
1882
|
+
const slides = root instanceof Element && pgs(root).contains("slides") ? [root] : [];
|
|
1883
|
+
slides.push(...pgs(root).querySelectorAll("slides"));
|
|
1884
|
+
return slides;
|
|
1885
|
+
}
|
|
1886
|
+
|
|
1347
1887
|
class PGS_Slides {
|
|
1348
1888
|
//- CONSTRUCTOR
|
|
1349
|
-
constructor({
|
|
1350
|
-
this.
|
|
1889
|
+
constructor({ element, viewRatio = 0.97, optionIntersectionObserver = {}, scrollOptions = {} } = {}) {
|
|
1890
|
+
this.element = element;
|
|
1351
1891
|
this.viewRatio = viewRatio;
|
|
1352
1892
|
|
|
1353
1893
|
this.optionIntersectionObserver = {
|
|
@@ -1364,28 +1904,36 @@ class PGS_Slides {
|
|
|
1364
1904
|
...scrollOptions,
|
|
1365
1905
|
};
|
|
1366
1906
|
|
|
1367
|
-
this.container = this.
|
|
1907
|
+
this.container = this.element ? pgs(this.element).querySelector("slides-container") : null;
|
|
1368
1908
|
}
|
|
1369
1909
|
|
|
1370
1910
|
//+ CREATE BUTTON
|
|
1371
1911
|
#createButtonsAndDots() {
|
|
1372
|
-
const EL = this.
|
|
1912
|
+
const EL = this.element;
|
|
1373
1913
|
|
|
1374
1914
|
//== PULSANTI
|
|
1375
|
-
if (!pgs(EL).querySelector('slides-prec')
|
|
1915
|
+
if (!pgs(EL).querySelector('slides-prec')) {
|
|
1376
1916
|
EL.insertAdjacentHTML("afterbegin", `<button pgs="slides-prec buttonIcon" type="button" class="precButton" aria-label="slide precedente"> <span> <i class="fa-solid fa-arrow-left"></i></span></button>`);
|
|
1917
|
+
}
|
|
1918
|
+
if (!pgs(EL).querySelector('slides-next')) {
|
|
1377
1919
|
EL.insertAdjacentHTML("beforeend", `<button pgs="slides-next buttonIcon" type="button" class="nextButton" aria-label="prossima slide"> <span> <i class="fa-solid fa-arrow-right"></i></span></button>`);
|
|
1378
1920
|
}
|
|
1379
1921
|
|
|
1380
1922
|
//== DOTS
|
|
1381
1923
|
if (!pgs(EL).querySelector('slides-dots')) {
|
|
1382
1924
|
EL.insertAdjacentHTML("beforeend", `<div pgs="slides-dots" class="slides-dots"></div>`);
|
|
1925
|
+
}
|
|
1383
1926
|
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1927
|
+
const dotsContainer = pgs(EL).querySelector('slides-dots');
|
|
1928
|
+
while (dotsContainer.children.length < this.container.children.length) {
|
|
1929
|
+
dotsContainer.insertAdjacentHTML("beforeend", `<button type="button" class="slide-dot"></button>`);
|
|
1930
|
+
}
|
|
1931
|
+
while (dotsContainer.children.length > this.container.children.length) {
|
|
1932
|
+
dotsContainer.lastElementChild.remove();
|
|
1388
1933
|
}
|
|
1934
|
+
Array.from(dotsContainer.children).forEach((dot, index) => {
|
|
1935
|
+
dot.setAttribute("aria-label", `vai alla slide ${index + 1}`);
|
|
1936
|
+
});
|
|
1389
1937
|
}
|
|
1390
1938
|
|
|
1391
1939
|
//+ PREV
|
|
@@ -1394,7 +1942,7 @@ class PGS_Slides {
|
|
|
1394
1942
|
let current;
|
|
1395
1943
|
|
|
1396
1944
|
|
|
1397
|
-
if (pgs(this.
|
|
1945
|
+
if (pgs(this.element).option.contains('singleScroll')) current = currents[currents.length - 1];
|
|
1398
1946
|
else current = currents[0];
|
|
1399
1947
|
|
|
1400
1948
|
const prev = current?.previousElementSibling;
|
|
@@ -1410,19 +1958,17 @@ class PGS_Slides {
|
|
|
1410
1958
|
|
|
1411
1959
|
|
|
1412
1960
|
|
|
1413
|
-
if (pgs(this.
|
|
1961
|
+
if (pgs(this.element).option.contains('singleScroll')) current = currents[0];
|
|
1414
1962
|
else current = currents[currents.length - 1];
|
|
1415
1963
|
|
|
1416
1964
|
const next = current?.nextElementSibling;
|
|
1417
|
-
console.log(current, next);
|
|
1418
|
-
|
|
1419
1965
|
next?.scrollIntoView(this.scrollOptions);
|
|
1420
1966
|
next?.focus({ preventScroll: true });
|
|
1421
1967
|
}
|
|
1422
1968
|
|
|
1423
1969
|
//+ GO TO NUMBER SLIDE
|
|
1424
1970
|
#goToNumberSlide(index) {
|
|
1425
|
-
this.container.children[index]
|
|
1971
|
+
this.container.children[index]?.scrollIntoView(this.scrollOptions);
|
|
1426
1972
|
}
|
|
1427
1973
|
|
|
1428
1974
|
//+ CALLBACK
|
|
@@ -1461,8 +2007,10 @@ class PGS_Slides {
|
|
|
1461
2007
|
|
|
1462
2008
|
//= EXECUTE
|
|
1463
2009
|
execute() {
|
|
1464
|
-
const slides = this.
|
|
1465
|
-
if (!this.container) return
|
|
2010
|
+
const slides = this.element;
|
|
2011
|
+
if (!this.container) return;
|
|
2012
|
+
const eventController = new AbortController();
|
|
2013
|
+
const { signal } = eventController;
|
|
1466
2014
|
|
|
1467
2015
|
//== elements
|
|
1468
2016
|
this.#createButtonsAndDots();
|
|
@@ -1474,12 +2022,14 @@ class PGS_Slides {
|
|
|
1474
2022
|
const notScrollWithMouse = pgs(slides).option.contains('notScrollWithMouse');
|
|
1475
2023
|
|
|
1476
2024
|
//== scroll
|
|
1477
|
-
|
|
2025
|
+
const removeHorizontalScroll = notScrollWithMouse
|
|
2026
|
+
? null
|
|
2027
|
+
: (0,_functions_scrollY_js__WEBPACK_IMPORTED_MODULE_0__.PGS_scrollHorizontal)(this.container, 5);
|
|
1478
2028
|
|
|
1479
2029
|
//==Listener: DOT, PREC, NEXT
|
|
1480
|
-
dots.forEach((dot, index) => dot.addEventListener("click",
|
|
1481
|
-
precButton.addEventListener("click",
|
|
1482
|
-
nextButton.addEventListener("click",
|
|
2030
|
+
dots.forEach((dot, index) => dot.addEventListener("click", () => this.#goToNumberSlide(index), { signal }));
|
|
2031
|
+
precButton.addEventListener("click", () => this.#previousSlide(), { passive: true, signal });
|
|
2032
|
+
nextButton.addEventListener("click", () => this.#nextSlide(), { passive: true, signal });
|
|
1483
2033
|
|
|
1484
2034
|
//== observer
|
|
1485
2035
|
const observer = new IntersectionObserver(
|
|
@@ -1489,9 +2039,18 @@ class PGS_Slides {
|
|
|
1489
2039
|
Array.from(this.container.children).forEach(allLi => observer.observe(allLi));
|
|
1490
2040
|
|
|
1491
2041
|
|
|
2042
|
+
let api;
|
|
2043
|
+
const destroy = () => {
|
|
2044
|
+
if (API.get(this.element) !== api) return;
|
|
2045
|
+
eventController.abort();
|
|
2046
|
+
observer.disconnect();
|
|
2047
|
+
removeHorizontalScroll?.();
|
|
2048
|
+
API.delete(this.element);
|
|
2049
|
+
};
|
|
2050
|
+
|
|
1492
2051
|
//- API
|
|
1493
|
-
|
|
1494
|
-
element: this.
|
|
2052
|
+
api = {
|
|
2053
|
+
element: this.element,
|
|
1495
2054
|
container: this.container,
|
|
1496
2055
|
previous: () => this.#previousSlide(),
|
|
1497
2056
|
next: () => this.#nextSlide(),
|
|
@@ -1506,19 +2065,28 @@ class PGS_Slides {
|
|
|
1506
2065
|
return last?.classList.contains("view") || false;
|
|
1507
2066
|
},
|
|
1508
2067
|
refresh: () => {
|
|
1509
|
-
|
|
1510
|
-
|
|
2068
|
+
if (API.get(this.element) !== api) return API.get(this.element);
|
|
2069
|
+
destroy();
|
|
2070
|
+
const instance = new PGS_Slides({
|
|
2071
|
+
element: this.element,
|
|
2072
|
+
viewRatio: this.viewRatio,
|
|
2073
|
+
optionIntersectionObserver: this.optionIntersectionObserver,
|
|
2074
|
+
scrollOptions: this.scrollOptions,
|
|
2075
|
+
});
|
|
2076
|
+
instance.execute();
|
|
2077
|
+
return API.get(this.element);
|
|
1511
2078
|
},
|
|
1512
|
-
}
|
|
2079
|
+
};
|
|
2080
|
+
API.set(this.element, api);
|
|
1513
2081
|
}
|
|
1514
2082
|
}
|
|
1515
2083
|
|
|
1516
2084
|
//# INIT
|
|
1517
2085
|
function PGS_slides_init(root = document) {
|
|
1518
|
-
|
|
1519
|
-
if (API.has(
|
|
2086
|
+
getSlides(root).forEach(element => {
|
|
2087
|
+
if (API.has(element)) return;
|
|
1520
2088
|
|
|
1521
|
-
const instance = new PGS_Slides({
|
|
2089
|
+
const instance = new PGS_Slides({ element });
|
|
1522
2090
|
instance.execute();
|
|
1523
2091
|
});
|
|
1524
2092
|
}
|
|
@@ -1526,8 +2094,8 @@ function PGS_slides_init(root = document) {
|
|
|
1526
2094
|
PGS_slides_init();
|
|
1527
2095
|
|
|
1528
2096
|
//# API
|
|
1529
|
-
function PGS_slides_api(
|
|
1530
|
-
return API.get(
|
|
2097
|
+
function PGS_slides_api(element) {
|
|
2098
|
+
return API.get(element);
|
|
1531
2099
|
}
|
|
1532
2100
|
|
|
1533
2101
|
const PGS_slides = {
|
|
@@ -1547,9 +2115,7 @@ const PGS_slides = {
|
|
|
1547
2115
|
"use strict";
|
|
1548
2116
|
__webpack_require__.r(__webpack_exports__);
|
|
1549
2117
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1550
|
-
/* harmony export */ PGS_stepTabs: () => (/* binding */ PGS_stepTabs)
|
|
1551
|
-
/* harmony export */ PGS_stepTabs_api: () => (/* binding */ PGS_stepTabs_api),
|
|
1552
|
-
/* harmony export */ PGS_stepTabs_init: () => (/* binding */ PGS_stepTabs_init)
|
|
2118
|
+
/* harmony export */ PGS_stepTabs: () => (/* binding */ PGS_stepTabs)
|
|
1553
2119
|
/* harmony export */ });
|
|
1554
2120
|
const API = new WeakMap();
|
|
1555
2121
|
|
|
@@ -1585,7 +2151,7 @@ function PGS_stepTabs_init(root = document) {
|
|
|
1585
2151
|
const dot = document.createElement("button");
|
|
1586
2152
|
dot.type = "button";
|
|
1587
2153
|
pgs(dot).add("stepTabs-dots-dot");
|
|
1588
|
-
dot.
|
|
2154
|
+
pgs(dot).option.setValueBrackets("step", index);
|
|
1589
2155
|
dot.innerHTML = `<i class="fa-solid ${iconClass}"></i>`;
|
|
1590
2156
|
|
|
1591
2157
|
dot.addEventListener("click", () => {
|
|
@@ -1650,7 +2216,7 @@ function PGS_stepTabs_init(root = document) {
|
|
|
1650
2216
|
//= INIT
|
|
1651
2217
|
goTo(0, false);
|
|
1652
2218
|
|
|
1653
|
-
//=
|
|
2219
|
+
//= tab-locked
|
|
1654
2220
|
const observer = new MutationObserver(() => {
|
|
1655
2221
|
if (isRendering) return;
|
|
1656
2222
|
updateControls();
|
|
@@ -1733,9 +2299,7 @@ const PGS_stepTabs = {
|
|
|
1733
2299
|
"use strict";
|
|
1734
2300
|
__webpack_require__.r(__webpack_exports__);
|
|
1735
2301
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1736
|
-
/* harmony export */ PGS_steps: () => (/* binding */ PGS_steps)
|
|
1737
|
-
/* harmony export */ PGS_steps_api: () => (/* binding */ PGS_steps_api),
|
|
1738
|
-
/* harmony export */ PGS_steps_init: () => (/* binding */ PGS_steps_init)
|
|
2302
|
+
/* harmony export */ PGS_steps: () => (/* binding */ PGS_steps)
|
|
1739
2303
|
/* harmony export */ });
|
|
1740
2304
|
const API = new WeakMap();
|
|
1741
2305
|
|
|
@@ -1803,9 +2367,7 @@ const PGS_steps = {
|
|
|
1803
2367
|
"use strict";
|
|
1804
2368
|
__webpack_require__.r(__webpack_exports__);
|
|
1805
2369
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1806
|
-
/* harmony export */ PGS_summary: () => (/* binding */ PGS_summary)
|
|
1807
|
-
/* harmony export */ PGS_summary_api: () => (/* binding */ PGS_summary_api),
|
|
1808
|
-
/* harmony export */ PGS_summary_init: () => (/* binding */ PGS_summary_init)
|
|
2370
|
+
/* harmony export */ PGS_summary: () => (/* binding */ PGS_summary)
|
|
1809
2371
|
/* harmony export */ });
|
|
1810
2372
|
//= SUMMARY
|
|
1811
2373
|
const API = new WeakMap();
|
|
@@ -1927,44 +2489,48 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
1927
2489
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1928
2490
|
/* harmony export */ PGS_formValidate: () => (/* binding */ PGS_formValidate)
|
|
1929
2491
|
/* harmony export */ });
|
|
1930
|
-
/* harmony import */ var
|
|
2492
|
+
/* harmony import */ var _pgs_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../_pgs.js */ "./assets/javascript/_pgs.js");
|
|
2493
|
+
/* harmony import */ var _components_notifications_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/_notifications.js */ "./assets/javascript/components/_notifications.js");
|
|
2494
|
+
|
|
1931
2495
|
|
|
1932
2496
|
|
|
1933
2497
|
|
|
1934
2498
|
class PGS_formValidate {
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
this._rules = [];
|
|
1938
|
-
// pgs(this.container).add("formError");
|
|
1939
|
-
}
|
|
2499
|
+
#message = {};
|
|
2500
|
+
#insideValidatedCallback = false;
|
|
1940
2501
|
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
2502
|
+
constructor(form, options = {}) {
|
|
2503
|
+
if (!options || typeof options !== "object" || Array.isArray(options)) {
|
|
2504
|
+
throw new TypeError("options must be an object");
|
|
2505
|
+
}
|
|
1945
2506
|
|
|
1946
|
-
|
|
2507
|
+
this.container = form;
|
|
2508
|
+
this._rules = [];
|
|
2509
|
+
this.message = {
|
|
2510
|
+
fieldError: "Please complete this field.",
|
|
2511
|
+
fieldsError: "Please complete all required fields.",
|
|
2512
|
+
success: "Submitted successfully."
|
|
2513
|
+
};
|
|
1947
2514
|
|
|
1948
|
-
if (
|
|
1949
|
-
|
|
2515
|
+
if (options.message !== undefined) this.message = options.message;
|
|
2516
|
+
this.container?.setAttribute("novalidate", "");
|
|
1950
2517
|
}
|
|
1951
2518
|
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
field.setAttribute("data-form-field-status", "");
|
|
2519
|
+
get message() {
|
|
2520
|
+
return { ...this.#message };
|
|
1955
2521
|
}
|
|
1956
2522
|
|
|
1957
|
-
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
}
|
|
2523
|
+
set message(value) {
|
|
2524
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
2525
|
+
throw new TypeError("message must be an object");
|
|
2526
|
+
}
|
|
2527
|
+
|
|
2528
|
+
this.#message = { ...this.#message, ...value };
|
|
1961
2529
|
}
|
|
1962
2530
|
|
|
1963
|
-
//
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
help = {
|
|
1967
|
-
// supporta sia required nativo, sia data-required="true"
|
|
2531
|
+
// - Helpers
|
|
2532
|
+
#help = {
|
|
2533
|
+
// supporta sia required nativo
|
|
1968
2534
|
isRequired(field) {
|
|
1969
2535
|
if (!field) return false;
|
|
1970
2536
|
|
|
@@ -2007,26 +2573,26 @@ class PGS_formValidate {
|
|
|
2007
2573
|
if (input.type === "hidden") return false;
|
|
2008
2574
|
if (input.type === "checkbox" || input.type === "radio" || input.type === "file") return false;
|
|
2009
2575
|
|
|
2010
|
-
// valida solo se required
|
|
2011
|
-
if (!this
|
|
2576
|
+
// valida solo se required
|
|
2577
|
+
if (!this.#help.isRequired(input)) return false;
|
|
2012
2578
|
|
|
2013
|
-
return this
|
|
2579
|
+
return this.#help.isEmptyTextLike(input);
|
|
2014
2580
|
});
|
|
2015
2581
|
|
|
2016
2582
|
//== TEXTAREA
|
|
2017
2583
|
// required vuote
|
|
2018
2584
|
const textareas = Array.from(container.querySelectorAll("textarea")).filter((ta) => {
|
|
2019
2585
|
if (ta.disabled) return false;
|
|
2020
|
-
if (!this
|
|
2021
|
-
return this
|
|
2586
|
+
if (!this.#help.isRequired(ta)) return false;
|
|
2587
|
+
return this.#help.isEmptyTextLike(ta);
|
|
2022
2588
|
});
|
|
2023
2589
|
|
|
2024
2590
|
//== SELECT
|
|
2025
2591
|
// required vuoti
|
|
2026
2592
|
const selects = Array.from(container.querySelectorAll("select")).filter((sel) => {
|
|
2027
2593
|
if (sel.disabled) return false;
|
|
2028
|
-
if (!this
|
|
2029
|
-
return this
|
|
2594
|
+
if (!this.#help.isRequired(sel)) return false;
|
|
2595
|
+
return this.#help.isEmptySelect(sel);
|
|
2030
2596
|
});
|
|
2031
2597
|
|
|
2032
2598
|
//== RADIO
|
|
@@ -2034,8 +2600,8 @@ class PGS_formValidate {
|
|
|
2034
2600
|
const radios = Array.from(container.querySelectorAll('input[type="radio"]')).filter((r) => !r.disabled);
|
|
2035
2601
|
const requiredRadioGroups = new Map(); // name -> [elements]
|
|
2036
2602
|
for (const r of radios) {
|
|
2037
|
-
if (!this
|
|
2038
|
-
const name = this
|
|
2603
|
+
if (!this.#help.isRequired(r)) continue;
|
|
2604
|
+
const name = this.#help.getGroupName(r);
|
|
2039
2605
|
if (!name) continue;
|
|
2040
2606
|
if (!requiredRadioGroups.has(name)) requiredRadioGroups.set(name, []);
|
|
2041
2607
|
requiredRadioGroups.get(name).push(r);
|
|
@@ -2056,9 +2622,9 @@ class PGS_formValidate {
|
|
|
2056
2622
|
const requiredCheckboxSingles = [];
|
|
2057
2623
|
const requiredCheckboxGroups = new Map(); // name -> [elements]
|
|
2058
2624
|
for (const c of checkboxes) {
|
|
2059
|
-
if (!this
|
|
2625
|
+
if (!this.#help.isRequired(c)) continue;
|
|
2060
2626
|
|
|
2061
|
-
const name = this
|
|
2627
|
+
const name = this.#help.getGroupName(c);
|
|
2062
2628
|
if (!name) {
|
|
2063
2629
|
// checkbox senza name: trattala come singola required
|
|
2064
2630
|
if (!c.checked) requiredCheckboxSingles.push(c);
|
|
@@ -2081,7 +2647,7 @@ class PGS_formValidate {
|
|
|
2081
2647
|
// required: se vuoi includerlo
|
|
2082
2648
|
const fileInputs = Array.from(container.querySelectorAll('input[type="file"]')).filter((f) => {
|
|
2083
2649
|
if (f.disabled) return false;
|
|
2084
|
-
if (!this
|
|
2650
|
+
if (!this.#help.isRequired(f)) return false;
|
|
2085
2651
|
return !(f.files && f.files.length > 0);
|
|
2086
2652
|
});
|
|
2087
2653
|
|
|
@@ -2097,12 +2663,37 @@ class PGS_formValidate {
|
|
|
2097
2663
|
ruleInvalidFields
|
|
2098
2664
|
];
|
|
2099
2665
|
|
|
2100
|
-
return invalidFields.flat();
|
|
2666
|
+
return [...new Set(invalidFields.flat())];
|
|
2667
|
+
}
|
|
2668
|
+
|
|
2669
|
+
//+ ADD
|
|
2670
|
+
addFieldError(field, i = 0, total = 1) {
|
|
2671
|
+
(0,_pgs_js__WEBPACK_IMPORTED_MODULE_0__.pgs)(field).option.add("error");
|
|
2672
|
+
if (i === 0) field.scrollIntoView();
|
|
2673
|
+
|
|
2674
|
+
if (i !== 0) return;
|
|
2675
|
+
|
|
2676
|
+
if (total > 1) {
|
|
2677
|
+
_components_notifications_js__WEBPACK_IMPORTED_MODULE_1__.PGS_notification.toast.error(this.message.fieldsError);
|
|
2678
|
+
return;
|
|
2679
|
+
}
|
|
2680
|
+
|
|
2681
|
+
const message = (0,_pgs_js__WEBPACK_IMPORTED_MODULE_0__.pgs)(field).option.getValueBrackets("message");
|
|
2682
|
+
_components_notifications_js__WEBPACK_IMPORTED_MODULE_1__.PGS_notification.toast.error(message || this.message.fieldError);
|
|
2683
|
+
}
|
|
2684
|
+
|
|
2685
|
+
//+ REMOVE
|
|
2686
|
+
removeFieldError(field) {
|
|
2687
|
+
(0,_pgs_js__WEBPACK_IMPORTED_MODULE_0__.pgs)(field).option.remove("error");
|
|
2688
|
+
}
|
|
2689
|
+
|
|
2690
|
+
// + SUCCESS
|
|
2691
|
+
success(text = this.message.success) {
|
|
2692
|
+
if (this.#insideValidatedCallback || this.validate() === true) _components_notifications_js__WEBPACK_IMPORTED_MODULE_1__.PGS_notification.toast.success(text)
|
|
2101
2693
|
}
|
|
2102
2694
|
|
|
2103
|
-
|
|
2104
|
-
// + VALIDATE
|
|
2105
|
-
// + -------------------------
|
|
2695
|
+
|
|
2696
|
+
// + VALIDATE
|
|
2106
2697
|
validate() {
|
|
2107
2698
|
const invalid = this.#inputValue(this.container);
|
|
2108
2699
|
const allFields = this.container.querySelectorAll("input, textarea, select")
|
|
@@ -2113,34 +2704,50 @@ class PGS_formValidate {
|
|
|
2113
2704
|
|
|
2114
2705
|
//== per radio/checkbox in gruppo:
|
|
2115
2706
|
// rimuovi l'errore solo sull'elemento che lo ospita (qui: se presente)
|
|
2116
|
-
for (const el of allFields) { if (!invalid.includes(el)) this.
|
|
2707
|
+
for (const el of allFields) { if (!invalid.includes(el)) this.removeFieldError(el); }
|
|
2117
2708
|
|
|
2118
2709
|
//== aggiungo errori dove serve
|
|
2119
|
-
invalid.forEach((el, i) => this.
|
|
2710
|
+
invalid.forEach((el, i) => this.addFieldError(el, i, invalid.length))
|
|
2120
2711
|
|
|
2121
2712
|
//== rimuove l'errore al click
|
|
2122
|
-
this
|
|
2713
|
+
allFields.forEach(element => element.addEventListener("click", e => this.removeFieldError(element)));
|
|
2123
2714
|
|
|
2124
2715
|
//== status form
|
|
2125
2716
|
if (invalid.length) {
|
|
2126
|
-
this.container.
|
|
2717
|
+
(0,_pgs_js__WEBPACK_IMPORTED_MODULE_0__.pgs)(this.container).option.remove("success").add("error");
|
|
2127
2718
|
return false;
|
|
2128
2719
|
} else {
|
|
2129
|
-
this.container.
|
|
2720
|
+
(0,_pgs_js__WEBPACK_IMPORTED_MODULE_0__.pgs)(this.container).option.remove("error").add("success");
|
|
2130
2721
|
return true;
|
|
2131
2722
|
}
|
|
2132
2723
|
}
|
|
2133
2724
|
|
|
2134
|
-
|
|
2135
|
-
|
|
2725
|
+
// + EVENT VALIDATOR
|
|
2726
|
+
validator(callback, eventName = "submit") {
|
|
2727
|
+
if (typeof callback !== "function") throw new TypeError("callback must be a function");
|
|
2728
|
+
if (typeof eventName !== "string" || !eventName.trim()) throw new TypeError("eventName must be a non-empty string");
|
|
2729
|
+
|
|
2730
|
+
this.container.addEventListener(eventName, event => {
|
|
2731
|
+
event.preventDefault();
|
|
2732
|
+
if (!this.validate()) return;
|
|
2733
|
+
|
|
2734
|
+
this.#insideValidatedCallback = true;
|
|
2735
|
+
|
|
2736
|
+
try {
|
|
2737
|
+
this.success();
|
|
2738
|
+
callback(event);
|
|
2739
|
+
} finally {
|
|
2740
|
+
this.#insideValidatedCallback = false;
|
|
2741
|
+
}
|
|
2742
|
+
});
|
|
2743
|
+
|
|
2744
|
+
return this;
|
|
2136
2745
|
}
|
|
2137
2746
|
|
|
2138
|
-
// +
|
|
2139
|
-
|
|
2140
|
-
|
|
2141
|
-
|
|
2142
|
-
if (typeof container !== "function") throw new Error("Rule must be a function");
|
|
2143
|
-
this._rules.push(container);
|
|
2747
|
+
// + ADD RULE
|
|
2748
|
+
addNewRule(rule) {
|
|
2749
|
+
if (typeof rule !== "function") throw new Error("Rule must be a function");
|
|
2750
|
+
this._rules.push(rule);
|
|
2144
2751
|
return this;
|
|
2145
2752
|
}
|
|
2146
2753
|
}
|
|
@@ -2159,7 +2766,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
2159
2766
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
2160
2767
|
/* harmony export */ PGS_scrollHorizontal: () => (/* binding */ PGS_scrollHorizontal)
|
|
2161
2768
|
/* harmony export */ });
|
|
2162
|
-
function PGS_scrollHorizontal(
|
|
2769
|
+
function PGS_scrollHorizontal(element, speed) {
|
|
2163
2770
|
// Se hai più contenitori, selezionali tutti:
|
|
2164
2771
|
// Semplice "singleton" per stimare se la sorgente è trackpad
|
|
2165
2772
|
const TrackpadDetector = (() => {
|
|
@@ -2201,10 +2808,7 @@ function PGS_scrollHorizontal(querySelector, dataSpeed) {
|
|
|
2201
2808
|
|
|
2202
2809
|
//= Scorrimento orizzontale con rotella (evita il trackpad)
|
|
2203
2810
|
|
|
2204
|
-
|
|
2205
|
-
el.addEventListener('wheel', (e) => {
|
|
2206
|
-
const speed = dataSpeed;
|
|
2207
|
-
|
|
2811
|
+
const onWheel = (e) => {
|
|
2208
2812
|
//== lascia lo scroll naturale del trackpad
|
|
2209
2813
|
if (TrackpadDetector.update(e)) return;
|
|
2210
2814
|
|
|
@@ -2215,11 +2819,11 @@ function PGS_scrollHorizontal(querySelector, dataSpeed) {
|
|
|
2215
2819
|
//== Converti delta in px per lo shift orizzontale
|
|
2216
2820
|
let delta = e.deltaY;
|
|
2217
2821
|
if (e.deltaMode === 1) delta *= 16;
|
|
2218
|
-
else if (e.deltaMode === 2) delta *=
|
|
2822
|
+
else if (e.deltaMode === 2) delta *= element.clientHeight;
|
|
2219
2823
|
|
|
2220
2824
|
//== Verifica se il contenitore può ancora scrollare orizzontalmente
|
|
2221
|
-
const atStart =
|
|
2222
|
-
const atEnd =
|
|
2825
|
+
const atStart = element.scrollLeft <= 0;
|
|
2826
|
+
const atEnd = element.scrollLeft + element.clientWidth >= element.scrollWidth - 1;
|
|
2223
2827
|
const scrollingRight = delta > 0;
|
|
2224
2828
|
const scrollingLeft = delta < 0;
|
|
2225
2829
|
const canScrollHoriz =
|
|
@@ -2233,8 +2837,11 @@ function PGS_scrollHorizontal(querySelector, dataSpeed) {
|
|
|
2233
2837
|
e.preventDefault();
|
|
2234
2838
|
|
|
2235
2839
|
//== rotella giù => destra
|
|
2236
|
-
|
|
2237
|
-
}
|
|
2840
|
+
element.scrollLeft += delta * speed;
|
|
2841
|
+
};
|
|
2842
|
+
|
|
2843
|
+
element.addEventListener('wheel', onWheel, { passive: false });
|
|
2844
|
+
return () => element.removeEventListener('wheel', onWheel);
|
|
2238
2845
|
}
|
|
2239
2846
|
|
|
2240
2847
|
|
|
@@ -2256,7 +2863,10 @@ function PGS_header(selectHeader = document) {
|
|
|
2256
2863
|
|
|
2257
2864
|
const headerElements = pgs(header).querySelectorAll("header-element");
|
|
2258
2865
|
|
|
2866
|
+
if (!headerElements.length) console.log('For the header to work correctly, insert "header-element" under "header"');
|
|
2259
2867
|
if (!headerElements.length) return;
|
|
2868
|
+
|
|
2869
|
+
|
|
2260
2870
|
|
|
2261
2871
|
headerElements.forEach(selectHeader => {
|
|
2262
2872
|
|
|
@@ -2341,9 +2951,32 @@ function headerHeight() {
|
|
|
2341
2951
|
document.documentElement.style.setProperty("--heightOfHeader", `${height}px`);
|
|
2342
2952
|
document.documentElement.style.setProperty("--heightOfHeaderScroll", `${scrollHeight}px`);
|
|
2343
2953
|
}
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2954
|
+
|
|
2955
|
+
// Il modulo può essere caricato nel footer: rimanda il primo calcolo al frame
|
|
2956
|
+
// successivo, quando il browser ha già composto l'header, senza aspettare il
|
|
2957
|
+
// caricamento completo della pagina.
|
|
2958
|
+
let headerHeightRafId = 0;
|
|
2959
|
+
function scheduleHeaderHeight() {
|
|
2960
|
+
if (headerHeightRafId) return;
|
|
2961
|
+
|
|
2962
|
+
headerHeightRafId = requestAnimationFrame(() => {
|
|
2963
|
+
headerHeightRafId = 0;
|
|
2964
|
+
headerHeight();
|
|
2965
|
+
});
|
|
2966
|
+
}
|
|
2967
|
+
|
|
2968
|
+
if (header) {
|
|
2969
|
+
const headerHeightObserver = new ResizeObserver(scheduleHeaderHeight);
|
|
2970
|
+
headerHeightObserver.observe(header);
|
|
2971
|
+
|
|
2972
|
+
// Un font web può modificare la larghezza del menu e quindi l'altezza
|
|
2973
|
+
// dell'header, anche dopo il primo frame.
|
|
2974
|
+
document.fonts?.ready?.then(scheduleHeaderHeight);
|
|
2975
|
+
}
|
|
2976
|
+
|
|
2977
|
+
scheduleHeaderHeight();
|
|
2978
|
+
window.addEventListener("resize", scheduleHeaderHeight);
|
|
2979
|
+
window.addEventListener("scroll", scheduleHeaderHeight, { passive: true });
|
|
2347
2980
|
|
|
2348
2981
|
|
|
2349
2982
|
|
|
@@ -2375,10 +3008,6 @@ window.addEventListener("scroll", () => {
|
|
|
2375
3008
|
|
|
2376
3009
|
|
|
2377
3010
|
|
|
2378
|
-
|
|
2379
|
-
|
|
2380
|
-
|
|
2381
|
-
|
|
2382
3011
|
/***/ },
|
|
2383
3012
|
|
|
2384
3013
|
/***/ "./assets/javascript/patterns/_cookieConsent.js"
|
|
@@ -2709,22 +3338,24 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
2709
3338
|
/* harmony import */ var _pgs_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_pgs.js */ "./assets/javascript/_pgs.js");
|
|
2710
3339
|
/* harmony import */ var _base_darkmode_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base/_darkmode.js */ "./assets/javascript/base/_darkmode.js");
|
|
2711
3340
|
/* harmony import */ var _base_darkmode_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_base_darkmode_js__WEBPACK_IMPORTED_MODULE_1__);
|
|
2712
|
-
/* harmony import */ var
|
|
2713
|
-
/* harmony import */ var
|
|
2714
|
-
/* harmony import */ var
|
|
2715
|
-
/* harmony import */ var
|
|
2716
|
-
/* harmony import */ var
|
|
2717
|
-
/* harmony import */ var
|
|
2718
|
-
/* harmony import */ var
|
|
2719
|
-
/* harmony import */ var
|
|
2720
|
-
/* harmony import */ var
|
|
2721
|
-
/* harmony import */ var
|
|
2722
|
-
/* harmony import */ var
|
|
2723
|
-
/* harmony import */ var
|
|
2724
|
-
/* harmony import */ var
|
|
2725
|
-
/* harmony import */ var
|
|
2726
|
-
/* harmony import */ var
|
|
2727
|
-
/* harmony import */ var
|
|
3341
|
+
/* harmony import */ var _base_svg_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base/_svg.js */ "./assets/javascript/base/_svg.js");
|
|
3342
|
+
/* harmony import */ var _base_object_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./base/_object.js */ "./assets/javascript/base/_object.js");
|
|
3343
|
+
/* harmony import */ var _base_object_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_base_object_js__WEBPACK_IMPORTED_MODULE_3__);
|
|
3344
|
+
/* harmony import */ var _components_accordion_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/_accordion.js */ "./assets/javascript/components/_accordion.js");
|
|
3345
|
+
/* harmony import */ var _components_dropdown_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/_dropdown.js */ "./assets/javascript/components/_dropdown.js");
|
|
3346
|
+
/* harmony import */ var _components_menu_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/_menu.js */ "./assets/javascript/components/_menu.js");
|
|
3347
|
+
/* harmony import */ var _components_modals_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/_modals.js */ "./assets/javascript/components/_modals.js");
|
|
3348
|
+
/* harmony import */ var _components_search_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./components/_search.js */ "./assets/javascript/components/_search.js");
|
|
3349
|
+
/* harmony import */ var _components_slides_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./components/_slides.js */ "./assets/javascript/components/_slides.js");
|
|
3350
|
+
/* harmony import */ var _components_steps_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./components/_steps.js */ "./assets/javascript/components/_steps.js");
|
|
3351
|
+
/* harmony import */ var _components_stepTabs_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./components/_stepTabs.js */ "./assets/javascript/components/_stepTabs.js");
|
|
3352
|
+
/* harmony import */ var _components_summary_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./components/_summary.js */ "./assets/javascript/components/_summary.js");
|
|
3353
|
+
/* harmony import */ var _components_notifications_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./components/_notifications.js */ "./assets/javascript/components/_notifications.js");
|
|
3354
|
+
/* harmony import */ var _imports_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./_imports.js */ "./assets/javascript/_imports.js");
|
|
3355
|
+
/* harmony import */ var _layout_header_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./layout/_header.js */ "./assets/javascript/layout/_header.js");
|
|
3356
|
+
/* harmony import */ var _layout_header_js__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(_layout_header_js__WEBPACK_IMPORTED_MODULE_15__);
|
|
3357
|
+
/* harmony import */ var _patterns_cookieConsent_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./patterns/_cookieConsent.js */ "./assets/javascript/patterns/_cookieConsent.js");
|
|
3358
|
+
/* harmony import */ var _patterns_cookieConsent_js__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(_patterns_cookieConsent_js__WEBPACK_IMPORTED_MODULE_16__);
|
|
2728
3359
|
//= PGS
|
|
2729
3360
|
|
|
2730
3361
|
|
|
@@ -2733,6 +3364,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
2733
3364
|
|
|
2734
3365
|
|
|
2735
3366
|
|
|
3367
|
+
|
|
2736
3368
|
//= CN
|
|
2737
3369
|
|
|
2738
3370
|
|
|
@@ -2744,6 +3376,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
2744
3376
|
|
|
2745
3377
|
|
|
2746
3378
|
|
|
3379
|
+
|
|
2747
3380
|
//= IMPORT REGISTRY
|
|
2748
3381
|
|
|
2749
3382
|
|