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.
Files changed (108) hide show
  1. package/AGENTS.md +8 -5
  2. package/README.md +1 -1
  3. package/assets/javascript/_imports.js +4 -0
  4. package/assets/javascript/_pgs.js +58 -0
  5. package/assets/javascript/base/_darkmode.js +27 -105
  6. package/assets/javascript/base/_svg.js +103 -0
  7. package/assets/javascript/components/_accordion.js +2 -2
  8. package/assets/javascript/components/_menu.js +1 -3
  9. package/assets/javascript/components/_modals.js +159 -136
  10. package/assets/javascript/components/_notifications.js +19 -9
  11. package/assets/javascript/components/_search.js +391 -0
  12. package/assets/javascript/components/_slides.js +66 -32
  13. package/assets/javascript/components/_stepTabs.js +4 -4
  14. package/assets/javascript/components/_steps.js +2 -2
  15. package/assets/javascript/components/_summary.js +2 -2
  16. package/assets/javascript/functions/_formValidate.js +97 -53
  17. package/assets/javascript/functions/_scrollY.js +10 -10
  18. package/assets/javascript/index.js +2 -0
  19. package/assets/javascript/layout/_header.js +29 -7
  20. package/assets/scss/base/_color.scss +5 -5
  21. package/assets/scss/base/_html.scss +2 -2
  22. package/assets/scss/base/_variables.scss +4 -2
  23. package/assets/scss/components/_dropdown.scss +2 -1
  24. package/assets/scss/components/_form.scss +2 -2
  25. package/assets/scss/components/_logo.scss +2 -2
  26. package/assets/scss/components/_menu.scss +20 -27
  27. package/assets/scss/components/_modals.scss +11 -1
  28. package/assets/scss/components/_notification.scss +23 -30
  29. package/assets/scss/components/_search.scss +140 -0
  30. package/assets/scss/index.scss +2 -2
  31. package/assets/scss/layout/_header.scss +1 -1
  32. package/assets/scss/layout/_pageShell.scss +19 -15
  33. package/assets/scss/mixin/_mx-form.scss +7 -7
  34. package/{templates/html → demo}/demo.html +1 -1
  35. package/demo/demo.js +240 -0
  36. package/dist/css/index.css +188 -125
  37. package/dist/css/index.css.map +1 -1
  38. package/dist/css/index.min.css +1 -1
  39. package/dist/index.d.ts +70 -0
  40. package/dist/javascript/index.js +1038 -405
  41. package/dist/javascript/index.js.map +1 -1
  42. package/dist/javascript/index.min.js +1 -1
  43. package/docs/componenti-e-markup.md +62 -27
  44. package/docs/components/accordion.md +61 -0
  45. package/docs/components/badges.md +67 -0
  46. package/docs/components/breadcumbs.md +43 -0
  47. package/docs/components/button.md +59 -0
  48. package/docs/components/card.md +50 -0
  49. package/docs/components/dropdown.md +135 -0
  50. package/docs/components/form.md +113 -0
  51. package/docs/components/logo.md +36 -0
  52. package/docs/components/menu.md +90 -0
  53. package/docs/components/modal.md +131 -0
  54. package/docs/components/notification.md +81 -0
  55. package/docs/components/search.md +117 -0
  56. package/docs/components/slides.md +85 -0
  57. package/docs/components/stepTabs.md +93 -0
  58. package/docs/components/steps.md +56 -0
  59. package/docs/components/summary.md +49 -0
  60. package/docs/components/table.md +42 -0
  61. package/docs/components/tooltip.md +53 -0
  62. package/docs/helper-javascript.md +71 -3
  63. package/docs/layout/body.md +41 -0
  64. package/docs/layout/flex.md +116 -0
  65. package/docs/layout/footer.md +71 -0
  66. package/docs/layout/grid.md +116 -0
  67. package/docs/layout/header.md +116 -0
  68. package/docs/layout/pageShell.md +94 -0
  69. package/docs/layout/section.md +69 -0
  70. package/docs/patterns/cookieConsent.md +89 -0
  71. package/package.json +2 -1
  72. package/scripts/generate-component-docs.js +557 -0
  73. package/templates/html/components/accordion.html +33 -4
  74. package/templates/html/components/badges.html +23 -0
  75. package/templates/html/components/breadcumbs.html +14 -0
  76. package/templates/html/components/button.html +22 -0
  77. package/templates/html/components/card.html +20 -0
  78. package/templates/html/components/dropdown.html +34 -0
  79. package/templates/html/components/form.html +82 -4
  80. package/templates/html/components/logo.html +22 -1
  81. package/templates/html/components/menu.html +40 -1
  82. package/templates/html/components/modal.html +44 -0
  83. package/templates/html/components/notification.html +68 -32
  84. package/templates/html/components/search.html +107 -0
  85. package/templates/html/components/slides.html +43 -0
  86. package/templates/html/components/stepTabs.html +47 -0
  87. package/templates/html/components/steps.html +24 -0
  88. package/templates/html/components/summary.html +27 -0
  89. package/templates/html/components/table.html +12 -0
  90. package/templates/html/components/tooltip.html +35 -0
  91. package/templates/html/layout/body.html +20 -5
  92. package/templates/html/layout/flex.html +20 -0
  93. package/templates/html/layout/footer.html +29 -1
  94. package/templates/html/layout/grid.html +20 -0
  95. package/templates/html/layout/header.html +52 -5
  96. package/templates/html/layout/pageShell.html +19 -0
  97. package/templates/html/layout/section.html +32 -10
  98. package/templates/html/patterns/cookieConsent.html +31 -0
  99. package/templates/react/components/form.jsx +3 -3
  100. package/templates/react/components/logo.jsx +1 -1
  101. package/templates/react/components/notification.jsx +4 -4
  102. package/templates/react/components/{searchbar.jsx → search.jsx} +9 -7
  103. package/templates/react/patterns/footer.jsx +1 -1
  104. package/templates/react/patterns/header.jsx +16 -10
  105. package/assets/scss/components/_searchbar.scss +0 -70
  106. package/templates/html/components/searchbar.html +0 -29
  107. package/templates/html/demo.js +0 -137
  108. /package/{templates/html → demo}/demo.css +0 -0
@@ -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 _components_accordion_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/_accordion.js */ "./assets/javascript/components/_accordion.js");
14
- /* harmony import */ var _components_dropdown_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./components/_dropdown.js */ "./assets/javascript/components/_dropdown.js");
15
- /* harmony import */ var _components_menu_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/_menu.js */ "./assets/javascript/components/_menu.js");
16
- /* harmony import */ var _components_modals_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/_modals.js */ "./assets/javascript/components/_modals.js");
17
- /* harmony import */ var _components_notifications_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/_notifications.js */ "./assets/javascript/components/_notifications.js");
18
- /* harmony import */ var _components_slides_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/_slides.js */ "./assets/javascript/components/_slides.js");
19
- /* harmony import */ var _components_stepTabs_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/_stepTabs.js */ "./assets/javascript/components/_stepTabs.js");
20
- /* harmony import */ var _components_steps_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./components/_steps.js */ "./assets/javascript/components/_steps.js");
21
- /* harmony import */ var _components_summary_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./components/_summary.js */ "./assets/javascript/components/_summary.js");
22
- /* harmony import */ var _functions_formValidate_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./functions/_formValidate.js */ "./assets/javascript/functions/_formValidate.js");
23
- /* harmony import */ var _functions_scrollY_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./functions/_scrollY.js */ "./assets/javascript/functions/_scrollY.js");
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
- accordion: _components_accordion_js__WEBPACK_IMPORTED_MODULE_1__.PGS_accordion,
40
- dropdown: _components_dropdown_js__WEBPACK_IMPORTED_MODULE_2__.PGS_dropdown,
41
- menu: _components_menu_js__WEBPACK_IMPORTED_MODULE_3__.PGS_menu,
42
- modal: _components_modals_js__WEBPACK_IMPORTED_MODULE_4__.PGS_modal,
43
- notification: _components_notifications_js__WEBPACK_IMPORTED_MODULE_5__.PGS_notification,
44
- slides: _components_slides_js__WEBPACK_IMPORTED_MODULE_6__.PGS_slides,
45
- stepTabs: _components_stepTabs_js__WEBPACK_IMPORTED_MODULE_7__.PGS_stepTabs,
46
- steps: _components_steps_js__WEBPACK_IMPORTED_MODULE_8__.PGS_steps,
47
- summary: _components_summary_js__WEBPACK_IMPORTED_MODULE_9__.PGS_summary,
48
- formValidate: _functions_formValidate_js__WEBPACK_IMPORTED_MODULE_10__.PGS_formValidate,
49
- scrollHorizontal: _functions_scrollY_js__WEBPACK_IMPORTED_MODULE_11__.PGS_scrollHorizontal,
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
- //= CHANGE COLOR SVG & LOTTIE
360
- //+ SEARCH COLOR
361
- function searchColor(type = "svg") {
362
- const ROOT = getComputedStyle(document.documentElement);
363
- const colors = []
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
- //=== In caso lottie sia già caricato
432
- if (lottiePlayer.shadowRoot) {
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
- //= BUTTON DARKMODE
442
- //+ CHANGE ICON AND SVG
443
- let toggleDarkmode = pgs(document).querySelectorAll("toggleDarkmode");
444
- if (localStorage.getItem("screenIsDarkMode") === "true") {
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
- function change(selector, isDarkMode) {
451
- selector.forEach(button => {
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
- //== CLICK BUTTON
467
- button.addEventListener("click", () => {
468
- let isDarkMode = (document.documentElement.getAttribute("data-darkmode") === "true") ? false : true;
469
- localStorage.setItem("screenIsDarkMode", isDarkMode);
455
+ //= INIT
456
+ const toggleDarkmode = pgs(document).querySelectorAll("toggleDarkmode");
457
+ setDarkmodeStatus(false, toggleDarkmode);
470
458
 
471
- document.body.classList.toggle("darkmode", isDarkMode);
472
- document.body.setAttribute("data-darkmode", isDarkMode);
473
- document.querySelector(":root").setAttribute("data-darkmode", isDarkMode);
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 PGS_modal_init(selector = "modal") {
988
- pgs(document).querySelectorAll(selector).forEach(MODAL => {
989
- if (API.has(MODAL)) return;
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
- const BUTTON_OPEN = pgs(MODAL).querySelector("modal-button");
992
- const DIALOG = MODAL.querySelector("dialog");
993
- if (!BUTTON_OPEN || !DIALOG) return;
1091
+ function initializeModal(MODAL, existingDialog = null) {
1092
+ if (API.has(MODAL)) return;
994
1093
 
995
- //== SELECTOR
996
- const DOMButtonClose = '<button pgs="buttonClose modal-close" type="button" tabindex="0" aria-label="Chiudi"><i class="fa-solid fa-close"></i></button>';
997
- const modalContentHeader = pgs(MODAL)?.querySelector("modal-dialog-content-header")
998
-
999
-
1000
- //== OPTION ATTRIBUTES MODAL
1001
- const disableBackdropClose = pgs(MODAL).option.contains("disableBackdropClose")
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
- //== BUTTON CLOSE
1011
- if (pgs(MODAL).querySelector("modal-close")) null
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
- //== SET
1018
- pgs(DIALOG).add("dialog modal-dialog");
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
- //== BUTTON OPEN
1021
- BUTTON_OPEN.setAttribute("role", "button");
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
- //== POSITION
1026
- if(!topLevel){
1027
- if (data_container) document.querySelector("#" + data_container)?.append(DIALOG);
1028
- else if (data_containerPGS) pgs(document).querySelector(data_containerPGS)?.append(DIALOG);
1029
- else document.body.append(DIALOG);
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
- //+ FN STATUS
1034
- function statusModal(status = true) {
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
- //+ FN OPEN
1040
- function openModal(e) {
1041
- e?.stopImmediatePropagation();
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
- //+ FN CLOSE
1056
- function closeModal(e) {
1057
- e?.stopImmediatePropagation()
1058
- statusModal(false);
1059
- DIALOG.close();
1060
- // modalCustomEvents('modal:close', { event: e });
1061
- MODAL.dispatchEvent(new CustomEvent('modal:close'));
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
- function forceClose(e) {
1070
- if (DIALOG.open) closeModal(e);
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
- //+ fn OPEN ON HISTORY
1074
- function openModalOnHistory() {
1075
- const params = new URLSearchParams(window.location.search);
1076
- if (params.get('modal') !== BUTTON_OPEN.id) return;
1077
- document.getElementById(BUTTON_OPEN.id)?.scrollIntoView({ behavior: 'smooth' });
1078
- openModal();
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
- //= OPEN
1083
- BUTTON_OPEN.addEventListener("click", (e) => openModal(e));
1084
- BUTTON_OPEN.addEventListener("keypress", (e) => !DIALOG.open && (e.key === "Enter" || e.key === " ") && openModal(e));
1085
-
1086
- //= CLOSE
1087
- DIALOG.addEventListener("close", () => statusModal(false));
1088
- DIALOG.addEventListener("click", e => { if (e.target == DIALOG && !disableBackdropClose) closeModal(e) });
1089
- BUTTON_CLOSE?.addEventListener("click", e => closeModal(e));
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
- API.set(MODAL, {
1120
- element: MODAL,
1121
- button: BUTTON_OPEN,
1122
- dialog: DIALOG,
1123
- closeButton: BUTTON_CLOSE,
1124
- open: forceOpen,
1125
- close: forceClose,
1126
- toggle: openModal,
1127
- refresh: () => {
1128
- PGS_modal_init(selector);
1129
- return API.get(MODAL);
1130
- },
1131
- isOpen: () => DIALOG.open,
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(selector) {
1141
- return API.get(selector);
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(root.dataset.notification || "{}");
1313
+ return JSON.parse(rawNotification);
1192
1314
  } catch (error) {
1193
- console.warn("PGS notification: dati non validi", error);
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
- initNotification(type, containerToken, icon, text, timeout, methodDelete = "replace", link = null) {
1213
- let containerNotification = pgs(document).querySelector(containerToken);
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(containerToken);
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(containerToken) {
1265
- let containerNotification = pgs(document).querySelector(containerToken);
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
- //# EXPORT
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 _functions_scrollY__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../functions/_scrollY */ "./assets/javascript/functions/_scrollY.js");
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({ selector, viewRatio = 0.97, optionIntersectionObserver = {}, scrollOptions = {} } = {}) {
1350
- this.selector = selector;
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.selector ? pgs(this.selector).querySelector("slides-container") : null;
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.selector
1912
+ const EL = this.element;
1373
1913
 
1374
1914
  //== PULSANTI
1375
- if (!pgs(EL).querySelector('slides-prec') && !pgs(EL).querySelector('slides-next')) {
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
- Array.from(this.container.children).forEach(() => {
1385
- pgs(EL).querySelector('slides-dots')
1386
- .insertAdjacentHTML("beforeend", `<button type="button" class="slide-dot" aria-label="vai alla prossima slide"></button>`);
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.selector).option.contains('singleScroll')) current = currents[currents.length - 1];
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.selector).option.contains('singleScroll')) current = currents[0];
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].scrollIntoView(this.scrollOptions)
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.selector;
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
- if (!notScrollWithMouse) (0,_functions_scrollY__WEBPACK_IMPORTED_MODULE_0__.PGS_scrollHorizontal)(this.container, 5);
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", e => this.#goToNumberSlide(index)));
1481
- precButton.addEventListener("click", e => this.#previousSlide(), { passive: true });
1482
- nextButton.addEventListener("click", e => this.#nextSlide(), { passive: true });
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
- API.set(this.selector, {
1494
- element: this.selector,
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
- PGS_slides_init(this.selector.parentNode || document);
1510
- return API.get(this.selector);
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
- pgs(root).querySelectorAll("slides").forEach(el => {
1519
- if (API.has(el)) return;
2086
+ getSlides(root).forEach(element => {
2087
+ if (API.has(element)) return;
1520
2088
 
1521
- const instance = new PGS_Slides({ selector: el });
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(selector) {
1530
- return API.get(selector);
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.setAttribute("data-step", index);
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
- //= data-tab-locked
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 _components_notifications_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../components/_notifications.js */ "./assets/javascript/components/_notifications.js");
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
- constructor({ form } = {}) {
1936
- this.container = form;
1937
- this._rules = [];
1938
- // pgs(this.container).add("formError");
1939
- }
2499
+ #message = {};
2500
+ #insideValidatedCallback = false;
1940
2501
 
1941
- //+ ADD
1942
- addError(field, i) {
1943
- field.setAttribute("data-form-field-status", "error");
1944
- if (i == 0) field.scrollIntoView();
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
- let message = field.getAttribute("data-form-field-message");
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 (i == 0 && message) _components_notifications_js__WEBPACK_IMPORTED_MODULE_0__.PGS_notification.toast.error(message);
1949
- else if (i == 0) _components_notifications_js__WEBPACK_IMPORTED_MODULE_0__.PGS_notification.toast.error("Compila tutti i campi!");
2515
+ if (options.message !== undefined) this.message = options.message;
2516
+ this.container?.setAttribute("novalidate", "");
1950
2517
  }
1951
2518
 
1952
- //+ REMOVE
1953
- removeError(field) {
1954
- field.setAttribute("data-form-field-status", "");
2519
+ get message() {
2520
+ return { ...this.#message };
1955
2521
  }
1956
2522
 
1957
- #removeErrorOnClick(allFields) {
1958
- allFields.forEach(element => {
1959
- element.addEventListener("click", e => this.removeError(element))
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
- // + Helpers
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 (o data-required="true")
2011
- if (!this.help.isRequired(input)) return false;
2576
+ // valida solo se required
2577
+ if (!this.#help.isRequired(input)) return false;
2012
2578
 
2013
- return this.help.isEmptyTextLike(input);
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.help.isRequired(ta)) return false;
2021
- return this.help.isEmptyTextLike(ta);
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.help.isRequired(sel)) return false;
2029
- return this.help.isEmptySelect(sel);
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.help.isRequired(r)) continue;
2038
- const name = this.help.getGroupName(r);
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.help.isRequired(c)) continue;
2625
+ if (!this.#help.isRequired(c)) continue;
2060
2626
 
2061
- const name = this.help.getGroupName(c);
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.help.isRequired(f)) return false;
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.removeError(el); }
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.addError(el, i))
2710
+ invalid.forEach((el, i) => this.addFieldError(el, i, invalid.length))
2120
2711
 
2121
2712
  //== rimuove l'errore al click
2122
- this.#removeErrorOnClick(allFields)
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.setAttribute("data-form-status", "error");
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.setAttribute("data-form-status", "success");
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
- ifSuccess(text = "Inviato con successo") {
2135
- if (this.validate() == true) _components_notifications_js__WEBPACK_IMPORTED_MODULE_0__.PGS_notification.toast.success(text)
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
- // + ADD RULE
2140
- // + -------------------------
2141
- addNewRule(container) {
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(querySelector, dataSpeed) {
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
- let el = querySelector
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 *= el.clientHeight;
2822
+ else if (e.deltaMode === 2) delta *= element.clientHeight;
2219
2823
 
2220
2824
  //== Verifica se il contenitore può ancora scrollare orizzontalmente
2221
- const atStart = el.scrollLeft <= 0;
2222
- const atEnd = el.scrollLeft + el.clientWidth >= el.scrollWidth - 1;
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
- el.scrollLeft += delta * speed;
2237
- }, { passive: false });
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
- headerHeight()
2345
- window.addEventListener("resize", headerHeight);
2346
- window.addEventListener("scroll", headerHeight);
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 _base_object_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base/_object.js */ "./assets/javascript/base/_object.js");
2713
- /* harmony import */ var _base_object_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_base_object_js__WEBPACK_IMPORTED_MODULE_2__);
2714
- /* harmony import */ var _components_accordion_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./components/_accordion.js */ "./assets/javascript/components/_accordion.js");
2715
- /* harmony import */ var _components_dropdown_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/_dropdown.js */ "./assets/javascript/components/_dropdown.js");
2716
- /* harmony import */ var _components_menu_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/_menu.js */ "./assets/javascript/components/_menu.js");
2717
- /* harmony import */ var _components_modals_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/_modals.js */ "./assets/javascript/components/_modals.js");
2718
- /* harmony import */ var _components_slides_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/_slides.js */ "./assets/javascript/components/_slides.js");
2719
- /* harmony import */ var _components_steps_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./components/_steps.js */ "./assets/javascript/components/_steps.js");
2720
- /* harmony import */ var _components_stepTabs_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./components/_stepTabs.js */ "./assets/javascript/components/_stepTabs.js");
2721
- /* harmony import */ var _components_summary_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./components/_summary.js */ "./assets/javascript/components/_summary.js");
2722
- /* harmony import */ var _components_notifications_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./components/_notifications.js */ "./assets/javascript/components/_notifications.js");
2723
- /* harmony import */ var _imports_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./_imports.js */ "./assets/javascript/_imports.js");
2724
- /* harmony import */ var _layout_header_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./layout/_header.js */ "./assets/javascript/layout/_header.js");
2725
- /* harmony import */ var _layout_header_js__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(_layout_header_js__WEBPACK_IMPORTED_MODULE_13__);
2726
- /* harmony import */ var _patterns_cookieConsent_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./patterns/_cookieConsent.js */ "./assets/javascript/patterns/_cookieConsent.js");
2727
- /* harmony import */ var _patterns_cookieConsent_js__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(_patterns_cookieConsent_js__WEBPACK_IMPORTED_MODULE_14__);
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