mypgs 1.6.0 → 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 +2 -2
- package/assets/javascript/components/_accordion.js +2 -2
- package/assets/javascript/components/_modals.js +159 -136
- package/assets/javascript/components/_notifications.js +19 -9
- package/assets/javascript/components/_search.js +2 -2
- 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/layout/_header.js +3 -0
- package/assets/scss/base/_html.scss +2 -2
- package/assets/scss/base/_variables.scss +2 -2
- package/assets/scss/components/_form.scss +2 -2
- package/assets/scss/components/_notification.scss +23 -30
- package/assets/scss/components/_search.scss +27 -21
- package/assets/scss/layout/_pageShell.scss +18 -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 +86 -92
- package/dist/css/index.css.map +1 -1
- package/dist/css/index.min.css +1 -1
- package/dist/javascript/index.js +356 -255
- package/dist/javascript/index.js.map +1 -1
- package/dist/javascript/index.min.js +1 -1
- package/docs/componenti-e-markup.md +26 -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 +68 -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 +21 -0
- package/templates/html/components/menu.html +33 -6
- package/templates/html/components/modal.html +44 -0
- package/templates/html/components/notification.html +68 -32
- package/templates/html/components/search.html +76 -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 +41 -0
- 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/notification.jsx +4 -4
- package/templates/react/patterns/footer.jsx +1 -1
- package/templates/html/demo.js +0 -130
- /package/{templates/html → demo}/demo.css +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAgC;;AAES;AACkB;AACF;AACR;AACG;AACc;AACb;AACA;AACI;AACN;AACI;AACS;AACD;;AAE/D,wCAAG;AACH,SAAS,iDAAO;AAChB,eAAe,mEAAa;AAC5B,cAAc,iEAAY;AAC1B,UAAU,yDAAQ;AAClB,WAAW,4DAAS;AACpB,kBAAkB,0EAAgB;AAClC,YAAY,6DAAU;AACtB,YAAY,6DAAU;AACtB,cAAc,iEAAY;AAC1B,WAAW,4DAAS;AACpB,aAAa,gEAAW;AACxB,kBAAkB,yEAAgB;AAClC,sBAAsB,wEAAoB;AAC1C,CAAC;;;;;;;;;;;;;;;;AC9BD;AACA,WAAW,oBAAoB;AAC/B;AACO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,mCAAmC,wBAAwB,IAAI,WAAW;AAC1E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,KAAK,KAAK,EAAE;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,sCAAsC;AAC1D,qBAAqB;AACrB,SAAS;;AAET;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa;;AAEb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,0DAA0D;;AAE1D,0CAA0C,QAAQ;AAClD;AACA;;AAEA;AACA;AACA,0DAA0D;;AAE1D;AACA,uCAAuC,QAAQ;AAC/C;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,8BAA8B,UAAU,GAAG,qBAAqB;AAChE;;AAEA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,sCAAsC;AAC1D,qBAAqB;AACrB,SAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA,4CAA4C;AAC5C;AACA;AACA;;AAEA;AACA;AACA,uDAAuD,IAAI;AAC3D;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;;AAEA,4DAA4D,KAAK;;AAEjE;AACA;AACA,KAAK,IAAI;AACT;;AAEA;;;;;;;;;;;ACjVA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,qEAAqE,UAAU,cAAc;AAC7F;;;;AAIA;AACA;AACA;;AAEA;AACA;AACA;AACA,CAAC;;;;;;;;;;;AC1CD;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;;AAEb;AACA;AACA;;AAEA;AACA,kDAAkD,YAAY;AAC9D,KAAK;;AAEL;AACA,CAAC;;;;;;;;;;;;;;;;ACzCD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA,wBAAwB,QAAQ;AAChC;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;;AAET,KAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT,KAAK;AACL;;AAEA;;AAEO;AACP;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;ACtGA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,iCAAiC,GAAG;AACpC,qCAAqC,GAAG;;AAExC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,4BAA4B,EAAE,kBAAkB;AACjG;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,qEAAqE,qCAAqC;AAC1G;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;;AAEA;AACO;AACP;AACA;;AAEO;AACP;AACA;AACA;;;;;;;;;;;;;;;;AC5HA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,YAAY,mBAAmB;AAC/B,YAAY,cAAc;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,oDAAoD,iBAAiB;AACrE,mDAAmD,gBAAgB;AACnE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,sDAAsD,GAAG;AACzD,wDAAwD,GAAG;;AAE3D;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,CAAC;;AAED;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;;;;;;;;;;;;;;;;;AChN2C;;AAE3C;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,iDAAiD;AACjD;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,QAAQ,mDAAY;AACpB,KAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA;AACO;AACP;AACA;AACA;;;;;;;;;;;;;;;;;;ACrDA;AACA;;AAEO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,UAAU;AAC3D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kDAAkD,UAAU;AAC5D;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sEAAsE,oBAAoB;AAC1F;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,gEAAgE;AAChH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAyD,kBAAkB;AAC3E,+CAA+C,qCAAqC;AACpF,kBAAkB;AAClB,aAAa;AACb,kCAAkC,6CAA6C;;AAE/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;;AAEA;AACO;AACP;AACA;;AAEO;AACP;AACA;AACA;;;;;;;;;;;;;;;;;ACnKA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;AACA,8DAA8D;AAC9D,UAAU;AACV;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA,2EAA2E,UAAU;;AAErF;AACA,qDAAqD,UAAU;AAC/D;AACA,uDAAuD,YAAY;AACnE;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,MAAM,KAAK,KAAK;AACpD;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C,sBAAsB;;AAElE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,mCAAmC;AACnC,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,SAAS;AACT;AACA;;AAEA;AACO;AACP;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;;;;;;;;;;;;;;;;ACjKA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB,mDAAmD;AAC5E;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,+CAA+C;AAC/C,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,kDAAkD,GAAG;AACrD,sDAAsD,GAAG;;AAEzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,wCAAwC,kBAAkB;AAC1D,cAAc;AACd;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kCAAkC,wBAAwB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,+BAA+B,QAAQ,UAAU,MAAM;AACvD;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa;;AAEb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA,8BAA8B,+BAA+B;AAC7D,iBAAiB;AACjB;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,6BAA6B;AAC7B,wEAAwE,uBAAuB;AAC/F;;AAEA;AACA;AACA;AACA;;AAEA,2CAA2C;AAC3C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6CAA6C,QAAQ;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,KAAK;AACL,CAAC;;AAED;;AAEO;AACP;AACA;;AAEO;AACP;AACA;AACA;;;;;;;;;;;;;;;;;;;ACtY4D;AAC5D;;AAEA;AACA;AACA,kBAAkB,2DAA2D,uBAAuB,IAAI;AACxG;AACA;;AAEA;AACA,oCAAoC,aAAa;AACjD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,sBAAsB,qBAAqB;AAC3C;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,qBAAqB;AAC3C;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sFAAsF,eAAe;AACrG;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,iCAAiC,wEAAoB;;AAErD;AACA;AACA,2EAA2E,eAAe;AAC1F,uEAAuE,eAAe;;AAEtF;AACA;AACA;AACA,cAAc;AACd;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;;AAEA;AACO;AACP;AACA;;AAEA,0CAA0C,cAAc;AACxD;AACA,KAAK;AACL;;AAEA;;AAEA;AACO;AACP;AACA;;AAEO;AACP;AACA;AACA;;;;;;;;;;;;;;;;;;AChMA;;AAEO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,UAAU;;AAEhE;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,6CAA6C,oCAAoC;AACjF;;AAEA,0EAA0E,UAAU,kBAAkB;AACtG;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,2DAA2D,mDAAmD;;AAE9G;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,gEAAgE,eAAe;;AAE/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,+BAA+B,gBAAgB;AAC/C,SAAS;AACT,KAAK;AACL;;AAEA;;AAEO;AACP;AACA;;AAEO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA,qDAAqD,UAAU,WAAW;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,UAAU,uBAAuB;AAC/F;AACA;AACA,8DAA8D,UAAU,wBAAwB;AAChG;AACA;AACA,sDAAsD,UAAU,wCAAwC;AACxG;;;;;;;;;;;;;;;;;;ACxKA;;AAEO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;;AAEA;AACA;;AAEA;AACO;AACP;AACA;;AAEO;AACP;AACA;AACA;;;;;;;;;;;;;;;;;;ACpDA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEO;AACP;AACA;;AAEA;AACA;AACA;;AAEA;AACA,2DAA2D,GAAG;AAC9D;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,yEAAyE,WAAW;AACpF;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,qDAAqD,eAAe;;AAEpE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;;AAEA;AACO;AACP;AACA;;AAEO;AACP;AACA;AACA;;;;;;;;;;;;;;;;;ACxGmE;;;AAG5D;AACP,kBAAkB,OAAO,IAAI;AAC7B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,+BAA+B,0EAAgB;AAC/C,yBAAyB,0EAAgB;AACzC;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8CAA8C;AAC9C,SAAS;AACT;AACA,iCAAiC,4CAA4C;AAC7E;AACA,+BAA+B,4CAA4C;AAC3E;AACA,8BAA8B;AAC9B;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,sCAAsC;;AAEtC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA,qCAAqC,0EAAgB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACvNO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C;AAC5C,2CAA2C;AAC3C;;AAEA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,0BAA0B;AAC1B;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK,IAAI,gBAAgB;AACzB;;;;;;;;;;;AC5EA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;;AAErB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;AACL;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sEAAsE,OAAO;AAC7E,4EAA4E,aAAa;AACzF;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,0DAA0D,eAAe;;;;;AAKzE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,UAAU;AACV,sDAAsD;AACtD;AACA;AACA;AACA;;AAEA,CAAC;;;;;;;;;;;;ACpJD;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6BAA6B,+CAA+C;AAC5E;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,gEAAgE,cAAc;AAC9E;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA,iCAAiC,+BAA+B;AAChE;AACA;AACA,2CAA2C,8BAA8B;AACzE;AACA,MAAM;AACN,2CAA2C,6BAA6B;AACxE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,yCAAyC,mEAAmE;AAC5G;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oCAAoC,mEAAmE;;AAEvG;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA,wCAAwC,6BAA6B;;AAErE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV,uCAAuC,qBAAqB;AAC5D;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,0BAA0B,2BAA2B;AACrD;AACA;AACA,gCAAgC,iDAAiD;AACjF;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;;;;;;;UCtNA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;;;;;WC5BA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA,E;;;;;WCPA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,2CAA2C,0CAA0C;WACrF,MAAM;WACN,2CAA2C,gCAAgC;WAC3E;WACA,KAAK,yBAAyB;WAC9B;WACA,GAAG;WACH;WACA;WACA,0CAA0C,wCAAwC;WAClF;WACA;WACA;WACA,E;;;;;WCtBA,wF;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D,E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNA;AACgC;AACA;;AAEhC;AAC6B;AACL;AACG;;AAE3B;AACoC;AACD;AACL;AACG;AACA;AACD;AACA;AACG;AACD;AACM;;AAExC;AACuB;;AAEvB;AAC6B;;AAE7B;AACsC","sources":["webpack://mypgs/./assets/javascript/_imports.js","webpack://mypgs/./assets/javascript/_pgs.js","webpack://mypgs/./assets/javascript/base/_darkmode.js","webpack://mypgs/./assets/javascript/base/_object.js","webpack://mypgs/./assets/javascript/base/_svg.js","webpack://mypgs/./assets/javascript/components/_accordion.js","webpack://mypgs/./assets/javascript/components/_dropdown.js","webpack://mypgs/./assets/javascript/components/_menu.js","webpack://mypgs/./assets/javascript/components/_modals.js","webpack://mypgs/./assets/javascript/components/_notifications.js","webpack://mypgs/./assets/javascript/components/_search.js","webpack://mypgs/./assets/javascript/components/_slides.js","webpack://mypgs/./assets/javascript/components/_stepTabs.js","webpack://mypgs/./assets/javascript/components/_steps.js","webpack://mypgs/./assets/javascript/components/_summary.js","webpack://mypgs/./assets/javascript/functions/_formValidate.js","webpack://mypgs/./assets/javascript/functions/_scrollY.js","webpack://mypgs/./assets/javascript/layout/_header.js","webpack://mypgs/./assets/javascript/patterns/_cookieConsent.js","webpack://mypgs/webpack/bootstrap","webpack://mypgs/webpack/runtime/compat get default export","webpack://mypgs/webpack/runtime/define property getters","webpack://mypgs/webpack/runtime/hasOwnProperty shorthand","webpack://mypgs/webpack/runtime/make namespace object","webpack://mypgs/./assets/javascript/index.js"],"sourcesContent":["import { pgs } from \"./_pgs.js\";\n\nimport { PGS_svg } from \"./base/_svg.js\";\nimport { PGS_accordion } from \"./components/_accordion.js\";\nimport { PGS_dropdown } from \"./components/_dropdown.js\";\nimport { PGS_menu } from \"./components/_menu.js\";\nimport { PGS_modal } from \"./components/_modals.js\";\nimport { PGS_notification } from \"./components/_notifications.js\";\nimport { PGS_search } from \"./components/_search.js\";\nimport { PGS_slides } from \"./components/_slides.js\";\nimport { PGS_stepTabs } from \"./components/_stepTabs.js\";\nimport { PGS_steps } from \"./components/_steps.js\";\nimport { PGS_summary } from \"./components/_summary.js\";\nimport { PGS_formValidate } from \"./functions/_formValidate.js\";\nimport { PGS_scrollHorizontal } from \"./functions/_scrollY.js\";\n\npgs.registerModules({\n svg: PGS_svg,\n accordion: PGS_accordion,\n dropdown: PGS_dropdown,\n menu: PGS_menu,\n modal: PGS_modal,\n notification: PGS_notification,\n search: PGS_search,\n slides: PGS_slides,\n stepTabs: PGS_stepTabs,\n steps: PGS_steps,\n summary: PGS_summary,\n formValidate: PGS_formValidate,\n scrollHorizontal: PGS_scrollHorizontal,\n});\n","/**\n * @param {Element | Document} root\n*/\nexport function pgs(root) {\n const ATTR = \"pgs\";\n if (!root) throw new TypeError(\"pgs(root): root richiesto\");\n\n const canAttr = typeof root.getAttribute === \"function\" && typeof root.setAttribute === \"function\";\n const canQuery = typeof root.querySelector === \"function\" && typeof root.querySelectorAll === \"function\";\n\n if (!canQuery) {\n throw new TypeError(\"pgs(root): root deve supportare querySelector/querySelectorAll\");\n }\n\n //+\n function attrOnlyForElements(methodName) {\n throw new TypeError(`pgs(${root.nodeName || \"root\"}).${methodName}(): disponibile solo su Element (non su Document)`);\n };\n\n //+\n function concactSelector(value) {\n if (Array.isArray(value)) value = value.join(\",\");\n return String(value)\n .split(\",\")\n .map(v => v.trim())\n .filter(Boolean)\n .map(v => `[${ATTR}~=\"${v}\"]`)\n .join(\",\");\n }\n\n //+\n function getValues(el, separator = \" \") {\n return (el.getAttribute(ATTR) || \"\")\n .split(separator)\n .filter(Boolean);\n }\n\n //+\n function setValues(el, values, separator = \" \") {\n el.setAttribute(ATTR, values.join(separator));\n }\n\n //= BASE PGS \n function createBasePgs() {\n function api() {\n return api;\n }\n\n api.querySelector = function (value) {\n return root.querySelector(concactSelector(value));\n };\n\n api.querySelectorAll = function (value) {\n return root.querySelectorAll(concactSelector(value));\n };\n\n api.add = function (...values) {\n if (!canAttr) return attrOnlyForElements(\"add\");\n const current = getValues(root);\n for (const v of values) if (!current.includes(v)) current.push(v);\n setValues(root, current);\n return api;\n };\n\n api.remove = function (...values) {\n if (!canAttr) return attrOnlyForElements(\"remove\");\n setValues(root, getValues(root).filter(v => !values.includes(v)));\n return api;\n };\n\n api.toggle = function (value, force) {\n if (!canAttr) return attrOnlyForElements(\"toggle\");\n\n const exists = getValues(root).includes(value);\n\n if (force !== undefined) {\n if (force && !exists) api.add(value);\n if (!force && exists) api.remove(value);\n return !!force;\n }\n\n if (exists) {\n api.remove(value);\n return false;\n }\n\n api.add(value);\n return true;\n };\n\n api.contains = function (value) {\n if (!canAttr) return attrOnlyForElements(\"contains\");\n return getValues(root).includes(value);\n };\n\n Object.defineProperty(api, \"value\", {\n get() {\n if (!canAttr) return undefined;\n return root.getAttribute(ATTR);\n },\n set(v) {\n if (!canAttr) return attrOnlyForElements(\"value\");\n root.setAttribute(ATTR, v);\n }\n });\n\n return api;\n }\n\n //= STATE\n function createState(attribute) {\n if (!canAttr) return undefined;\n\n const read = (sep = \" \") =>\n (root.getAttribute(attribute) || \"\").split(sep).filter(Boolean);\n\n const write = (vals, sep = \" \") =>\n root.setAttribute(attribute, vals.join(sep));\n\n // funzione chiamabile: state(\"active\") == add(\"active\")\n function api(...values) {\n api.add(...values);\n return api;\n }\n\n api.add = function (...values) {\n const toAdd = values.flat().map(v => String(v).trim()).filter(Boolean);\n const current = read();\n for (const v of toAdd) if (!current.includes(v)) current.push(v);\n write(current);\n return api;\n };\n\n api.remove = function (...values) {\n const toRemove = values.flat().map(v => String(v).trim()).filter(Boolean);\n const current = read().filter(v => !toRemove.includes(v));\n write(current);\n return api;\n };\n\n api.toggle = function (value, force) {\n const v = String(value).trim();\n if (!v) return false;\n const current = read();\n const exists = current.includes(v);\n\n if (force !== undefined) {\n if (force && !exists) {\n current.push(v);\n write(current);\n }\n\n if (!force && exists) {\n write(current.filter(x => x !== v));\n }\n\n return !!force;\n }\n\n if (exists) {\n write(current.filter(x => x !== v));\n return false;\n }\n \n current.push(v);\n write(current);\n return true;\n };\n\n api.contains = function (value) {\n const v = String(value).trim();\n if (!v) return false;\n return read().includes(v);\n };\n\n Object.defineProperty(api, \"value\", {\n get() { return root.getAttribute(attribute); },\n set(v) { root.setAttribute(attribute, v); }\n });\n\n return api;\n }\n\n //= OPTION\n function createOption(attribute) {\n if (!canAttr) return undefined;\n\n const read = () => (root.getAttribute(attribute) || \"\").match(/[^\\s[\\]]+(?:\\[[^\\]]*\\])?/g) || [];\n const write = values => root.setAttribute(attribute, values.join(\" \"));\n const getKey = value => String(value).trim().match(/^[^\\s[\\]]+/)?.[0] || \"\";\n const getValues = values => values\n .flat()\n .flatMap(value => String(value).match(/[^\\s[\\]]+(?:\\[[^\\]]*\\])?/g) || [])\n .filter(Boolean);\n\n function api() {\n return api;\n }\n\n api.add = function (...values) {\n const current = read();\n\n getValues(values).forEach(value => {\n if (!current.includes(value)) current.push(value);\n });\n\n write(current);\n return api;\n };\n\n api.remove = function (...values) {\n const keys = getValues(values).map(getKey).filter(Boolean);\n write(read().filter(value => !keys.includes(getKey(value))));\n return api;\n };\n\n api.toggle = function (value, force) {\n const key = getKey(value);\n if (!key) return false;\n\n const exists = api.contains(key);\n\n if (force !== undefined) {\n if (force && !exists) api.add(value);\n if (!force && exists) api.remove(key);\n return !!force;\n }\n\n if (exists) {\n api.remove(key);\n return false;\n }\n\n api.add(value);\n return true;\n };\n\n api.contains = function (key) {\n const source = root.getAttribute(attribute) || \"\";\n const safeKey = String(key).replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n return new RegExp(`(?:^|\\\\s)${safeKey}(?:\\\\[[^\\\\]]*\\\\])?(?=\\\\s|$)`)\n .test(source);\n };\n\n api.getValueBrackets = function (key) {\n const source = root.getAttribute(attribute) || \"\";\n const safeKey = String(key).replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n const match = source.match(\n new RegExp(`(?:^|\\\\s)${safeKey}\\\\[([^\\\\]]*)\\\\]`)\n );\n\n return match ? match[1] : undefined;\n };\n\n api.setValueBrackets = function (key, value = \"\") {\n const optionKey = getKey(key);\n if (!optionKey) return api;\n\n const option = `${optionKey}[${String(value).trim()}]`;\n const options = read().filter(item => getKey(item) !== optionKey);\n\n options.push(option);\n write(options);\n return api;\n };\n\n Object.defineProperty(api, \"value\", {\n get() { return root.getAttribute(attribute); },\n set(v) { root.setAttribute(attribute, v); }\n });\n\n return api;\n }\n\n //# RETURN \n const api = createBasePgs();\n api.state = createState(\"pgs-state\");\n api.option = createOption(\"pgs-option\");\n return api;\n}\n\nconst PGS_IMPORTS = {};\n\nfunction registerImportModule(name, module) {\n const key = String(name || \"\").trim().replace(/^pgs[_-\\s]*/i, \"\").toLowerCase();\n\n if (!key) throw new TypeError(\"pgs.registerImport(...modules): ogni modulo deve avere name o PGS_name\");\n\n PGS_IMPORTS[key] = {\n name,\n module\n };\n}\n\npgs.registerImport = function (...modules) {\n modules.flat().forEach(item => {\n if (item && typeof item === \"object\" && !item.PGS_name && !item.name) {\n Object.entries(item).forEach(([name, module]) => registerImportModule(name, module));\n return;\n }\n\n registerImportModule(item?.PGS_name || item?.name, item);\n });\n\n return pgs;\n};\n\npgs.registerModules = function (modules = {}) {\n Object.entries(modules).forEach(([name, module]) => {\n const key = String(name || \"\").trim();\n if (!key) return;\n\n const hasOwn = Object.prototype.hasOwnProperty.call(pgs, key);\n if (hasOwn && pgs[key] !== module) {\n throw new Error(`pgs.registerModules(): \"${key}\" e' gia' definito su pgs`);\n }\n\n pgs[key] = module;\n });\n\n return pgs;\n};\n\npgs.import = function (...names) {\n return names.flat().reduce((imports, name) => {\n const key = String(name || \"\").trim().replace(/^pgs[_-\\s]*/i, \"\").toLowerCase();\n const item = PGS_IMPORTS[key];\n\n if (!item) throw new Error(`pgs.import(): modulo \"${name}\" non registrato`);\n\n imports[item.name] = item.module;\n return imports;\n }, {});\n};\n\nglobalThis.pgs ??= pgs;\n","//# DARKMODE\n\nconst EVENT_SVG_CHANGE_COLOR = \"pgs:svg:changeColor\";\n\n//+ CHANGE ICON\nfunction changeIcon(selector, isDarkMode) {\n selector.forEach(button => {\n const ICON = button.querySelector(\"i\");\n if (!ICON) return;\n\n ICON.classList.toggle(\"fa-moon\", !isDarkMode);\n ICON.classList.toggle(\"fa-sun\", isDarkMode);\n });\n}\n\n//+ SET STATUS\nfunction setDarkmodeStatus(toggle = false, button) {\n let isDarkMode = localStorage.getItem(\"screenIsDarkMode\") === \"true\";\n\n if (toggle) {\n isDarkMode = !isDarkMode;\n localStorage.setItem(\"screenIsDarkMode\", isDarkMode);\n }\n\n // SET\n pgs(document.documentElement).state.toggle(\"darkmode\", isDarkMode);\n pgs(document.body).state.toggle(\"darkmode\", isDarkMode);\n // END SET\n\n changeIcon(button, isDarkMode);\n document.dispatchEvent(new CustomEvent(EVENT_SVG_CHANGE_COLOR, { detail: { isDarkMode } }));\n}\n\n\n\n//= INIT\nconst toggleDarkmode = pgs(document).querySelectorAll(\"toggleDarkmode\");\nsetDarkmodeStatus(false, toggleDarkmode);\n\n//= BUTTON DARKMODE\ntoggleDarkmode.forEach(button => {\n button.addEventListener(\"click\", () => setDarkmodeStatus(true, toggleDarkmode));\n});\n","document.addEventListener('DOMContentLoaded', () => {\n const objects = document.querySelectorAll('object[type=\"image/svg+xml\"]');\n\n objects.forEach(obj => {\n function applyAspectRatio(svgDoc) {\n if (!svgDoc) return;\n const svg = svgDoc.querySelector(\"svg\");\n if (!svg) return;\n\n const computedStyle = window.getComputedStyle(obj);\n svg.setAttribute(\"preserveAspectRatio\", computedStyle.objectFit === 'cover' ? \"xMidYMid slice\" : \"xMidYMid meet\");\n }\n\n function init() {\n const svgDoc = obj.contentDocument;\n if (!svgDoc) return;\n\n const svg = svgDoc.querySelector('svg');\n if (!svg) return;\n\n applyAspectRatio(svgDoc);\n if (obj.__objectResizeObserver) return;\n\n let rafId = 0;\n const resizeObserver = new ResizeObserver(() => {\n if (rafId) return;\n rafId = requestAnimationFrame(() => {\n rafId = 0;\n applyAspectRatio(svgDoc);\n });\n });\n\n resizeObserver.observe(obj);\n obj.__objectResizeObserver = resizeObserver;\n }\n\n if (obj.contentDocument && obj.contentDocument.querySelector('svg')) init();\n else obj.addEventListener('load', init, { once: true });\n });\n\n document.body.classList.add(\"object-loaded\");\n});\n","//# SVG & LOTTIE COLORS\n\nconst svgColors = {\n eventChangeColor: \"pgs:svg:changeColor\",\n watchedObjects: new WeakSet(),\n watchedLotties: new WeakSet(),\n\n _normalizeColor: (color = \"\") => {\n return color.replace(/\\s/g, \"\").toLocaleLowerCase();\n },\n\n _getCurrentDarkmode: () => {\n return pgs(document.documentElement).state.contains(\"darkmode\");\n },\n\n searchColor(type = \"svg\") {\n const ROOT = getComputedStyle(document.documentElement);\n const colors = [];\n\n for (let I = 0; I < 20; I++) {\n const color = ROOT.getPropertyValue(\"--\" + type + \"-color-\" + I).toLocaleLowerCase().split(\"&\").map(value => value.trim());\n if (color[0] && color[1]) colors.push([color[0], color[1]]);\n }\n\n return colors;\n },\n\n _changeColor(svgDoc, isDarkMode, colors) {\n if (!svgDoc) return;\n\n svgDoc.querySelectorAll(\"[fill], [stroke]\").forEach(fillStroke => {\n for (const color of colors) {\n const OLD = svgColors._normalizeColor(color[0]);\n const NEW = svgColors._normalizeColor(color[1]);\n\n [\"fill\", \"stroke\"].forEach(attr => {\n const current = svgColors._normalizeColor(fillStroke.getAttribute(attr) || \"\");\n if (!current) return;\n\n fillStroke.style.transition = \"fill 0.5s ease, stroke 0.5s ease\";\n\n if (isDarkMode && current === OLD) fillStroke.setAttribute(attr, NEW);\n if (!isDarkMode && current === NEW) fillStroke.setAttribute(attr, OLD);\n });\n }\n });\n },\n\n _getLottieSvg(lottiePlayer) {\n return lottiePlayer.shadowRoot?.querySelector(\"svg\") || null;\n },\n\n init() {\n document.addEventListener(svgColors.eventChangeColor, event => {\n svgColors.applyColorsSVG(event.detail?.isDarkMode ?? svgColors._getCurrentDarkmode());\n svgColors.applyColorsLottie(event.detail?.isDarkMode ?? svgColors._getCurrentDarkmode());\n });\n\n document.addEventListener(\"DOMContentLoaded\", () => {\n svgColors.applyColorsSVG();\n svgColors.applyColorsLottie();\n });\n },\n\n applyColorsSVG(isDarkMode = svgColors._getCurrentDarkmode()) {\n const colorsSvg = svgColors.searchColor(\"svg\");\n\n if (!pgs(document).querySelector(\"svgChangeColor\")) return;\n\n document.querySelectorAll('object[type=\"image/svg+xml\"]').forEach(obj => {\n if (!svgColors.watchedObjects.has(obj)) {\n obj.addEventListener(\"load\", () => svgColors._changeColor(obj.contentDocument, svgColors._getCurrentDarkmode(), svgColors.searchColor(\"svg\")));\n svgColors.watchedObjects.add(obj);\n }\n\n if (obj.contentDocument) svgColors._changeColor(obj.contentDocument, isDarkMode, colorsSvg);\n });\n\n },\n\n applyColorsLottie(isDarkMode = svgColors._getCurrentDarkmode()) {\n const colorsLottie = svgColors.searchColor(\"svg\");\n\n if (!pgs(document).querySelector(\"lottieChangeColor\")) return;\n\n document.querySelectorAll(\"lottie-player\").forEach(lottiePlayer => {\n if (!svgColors.watchedLotties.has(lottiePlayer)) {\n lottiePlayer.addEventListener(\"load\", () => svgColors._changeColor(svgColors._getLottieSvg(lottiePlayer), svgColors._getCurrentDarkmode(), svgColors.searchColor(\"svg\")));\n svgColors.watchedLotties.add(lottiePlayer);\n }\n\n if (lottiePlayer.shadowRoot) svgColors._changeColor(svgColors._getLottieSvg(lottiePlayer), isDarkMode, colorsLottie);\n });\n },\n};\n\nsvgColors.init();\n\nexport const PGS_svg = {\n eventChangeColor: svgColors.eventChangeColor,\n applyColorsSVG: isDarkMode => svgColors.applyColorsSVG(isDarkMode),\n applyColorsLottie: isDarkMode => svgColors.applyColorsLottie(isDarkMode),\n};\n","//= ACCORDION\nconst API = new WeakMap();\nlet accordionId = 0;\n\nfunction nextAccordionId() {\n accordionId += 1;\n return accordionId;\n}\n\nfunction directPgsChild(element, token) {\n return Array.from(element.children).find(child => pgs(child).contains(token));\n}\n\nexport function PGS_accordion_init(root = document) {\n pgs(root).querySelectorAll(\"accordion\").forEach((accordion) => {\n if (API.has(accordion)) return;\n\n const BUTTON = directPgsChild(accordion, \"accordion-button\");\n const CONTENT = directPgsChild(accordion, \"accordion-content\");\n if (!BUTTON || !CONTENT) return;\n\n //== ID univoci per aria-controls / aria-labelledby\n const ID = nextAccordionId();\n const btnId = `acc-btn-${ID}`;\n const panelId = `acc-panel-${ID}`;\n\n //== Stato iniziale\n const isOpenInit = pgs(accordion).state.contains(\"open\");\n\n //== Accessibilità (setup una volta)\n BUTTON.setAttribute(\"role\", \"button\");\n BUTTON.setAttribute(\"tabindex\", \"0\");\n if (!BUTTON.id) BUTTON.setAttribute(\"id\", btnId);\n\n if (!CONTENT.id) CONTENT.setAttribute(\"id\", panelId);\n BUTTON.setAttribute(\"aria-controls\", CONTENT.id);\n CONTENT.setAttribute(\"role\", \"region\");\n CONTENT.setAttribute(\"aria-labelledby\", BUTTON.id);\n\n //+ Accessibility (applica stato aperto/chiuso)\n function accordionAccessibility(isOpen, button, content) {\n const text = (button?.textContent || \"\").trim().replace(/\\s+/g, \" \");\n button.setAttribute(\"aria-label\", `${isOpen ? \"Chiudi\" : \"Apri\"} ${text || \"sezione\"}`);\n button.setAttribute(\"aria-expanded\", String(isOpen));\n content.hidden = !isOpen;\n }\n\n //+ Chiudi tutti gli altri\n function closeOltherAccordion() {\n for (const otherLi of pgs(document).querySelectorAll(\"accordion\")) {\n if (otherLi === accordion) continue;\n\n const otherBtn = pgs(otherLi).querySelector(\"accordion-button\");\n const otherContent = pgs(otherLi).querySelector(\"accordion-content\");\n if (!otherBtn || !otherContent) continue;\n\n pgs(otherLi).state().remove(\"open\");\n accordionAccessibility(false, otherBtn, otherContent);\n }\n }\n\n //+ FN ACCORDION\n function accordionFunction() {\n const isOpen = pgs(accordion).state.contains(\"open\");\n const nowOpen = !isOpen;\n\n pgs(accordion).state.toggle(\"open\", nowOpen);\n accordionAccessibility(nowOpen, BUTTON, CONTENT);\n\n closeOltherAccordion();\n\n //== scroll to view\n if (nowOpen) setTimeout(() => accordion.scrollIntoView({ block: \"nearest\", inline: \"nearest\" }), 100);\n }\n\n function open() {\n if (!pgs(accordion).state.contains(\"open\")) accordionFunction();\n }\n\n function close() {\n if (pgs(accordion).state.contains(\"open\")) accordionFunction();\n }\n\n // applica stato iniziale\n accordionAccessibility(isOpenInit, BUTTON, CONTENT);\n\n //- Eventi\n BUTTON.addEventListener(\"click\", accordionFunction);\n\n //- Tastiera: Enter / Space\n BUTTON.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n accordionFunction();\n }\n });\n\n API.set(accordion, {\n element: accordion,\n button: BUTTON,\n content: CONTENT,\n open,\n close,\n toggle: accordionFunction,\n refresh: () => {\n PGS_accordion_init(accordion.parentNode || document);\n return API.get(accordion);\n },\n isOpen: () => pgs(accordion).state.contains(\"open\"),\n });\n });\n}\n\n//# INIT\nPGS_accordion_init();\n\n//# API\nexport function PGS_accordion_api(selector) {\n return API.get(selector);\n}\n\nexport const PGS_accordion = {\n init: PGS_accordion_init,\n api: PGS_accordion_api\n};\n","// + dropdown\nconst API = new WeakMap();\nconst OPEN_DROPDOWNS = new Set();\nconst VIEWPORT_GAP = 8;\nlet dropdownId = 0;\n\nfunction nextDropdownId() {\n dropdownId += 1;\n return dropdownId;\n}\n\nfunction isDropdownContent(element) {\n return element instanceof Element && pgs(element).contains(\"dropdown-content\");\n}\n\nfunction getDropdownTrigger(dropdown, content) {\n const children = Array.from(dropdown.children).filter(child => child !== content);\n const dropdownButton = children.find(child => pgs(child).contains(\"dropdown-button\"));\n\n return dropdownButton || children.find(child => !isDropdownContent(child)) || dropdown;\n}\n\nfunction getDropdownContent(dropdown) {\n return Array.from(dropdown.children).find(isDropdownContent) || pgs(dropdown).querySelector(\"dropdown-content\");\n}\n\nfunction getDropdowns(root) {\n const dropdowns = root instanceof Element && pgs(root).contains(\"dropdown\") ? [root] : [];\n dropdowns.push(...pgs(root).querySelectorAll(\"dropdown\"));\n return dropdowns;\n}\n\nfunction getposition(dropdown) {\n const option = pgs(dropdown).option;\n const optionValue = option.getValueBrackets(\"position\");\n const raw = (optionValue || \"bottom center\").trim().toLowerCase();\n const parts = raw.split(/\\s+/).filter(Boolean);\n const side = parts.find(part => [\"top\", \"right\", \"bottom\", \"left\"].includes(part)) || \"bottom\";\n const align = parts.find(part => [\"top\", \"right\", \"bottom\", \"left\", \"center\"].includes(part) && part !== side) || \"center\";\n\n return { side, align };\n}\n\nfunction clamp(value, min, max) {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction updateposition(dropdown) {\n const data = API.get(dropdown);\n if (!data || !data.isOpen()) return;\n\n const { trigger, content } = data;\n const { side, align } = getposition(dropdown);\n const triggerRect = trigger.getBoundingClientRect();\n const contentRect = content.getBoundingClientRect();\n const viewportWidth = document.documentElement.clientWidth;\n const maxLeft = Math.max(VIEWPORT_GAP, viewportWidth - contentRect.width - VIEWPORT_GAP);\n let left = triggerRect.left + (triggerRect.width - contentRect.width) / 2;\n let top = triggerRect.bottom + VIEWPORT_GAP;\n\n if (side === \"top\" || side === \"bottom\") {\n top = side === \"top\"\n ? triggerRect.top - contentRect.height - VIEWPORT_GAP\n : triggerRect.bottom + VIEWPORT_GAP;\n\n if (align === \"left\") left = triggerRect.left;\n if (align === \"right\") left = triggerRect.right - contentRect.width;\n }\n\n if (side === \"left\" || side === \"right\") {\n left = side === \"left\"\n ? triggerRect.left - contentRect.width - VIEWPORT_GAP\n : triggerRect.right + VIEWPORT_GAP;\n top = triggerRect.top + (triggerRect.height - contentRect.height) / 2;\n\n if (align === \"top\") top = triggerRect.top;\n if (align === \"bottom\") top = triggerRect.bottom - contentRect.height;\n }\n\n if (side === \"left\" && left < VIEWPORT_GAP) {\n left = triggerRect.right + VIEWPORT_GAP;\n }\n\n if (side === \"right\" && left + contentRect.width > viewportWidth - VIEWPORT_GAP) {\n left = triggerRect.left - contentRect.width - VIEWPORT_GAP;\n }\n\n left = clamp(left, VIEWPORT_GAP, maxLeft);\n\n content.style.setProperty(\"--dropdown-left\", `${Math.round(left)}px`);\n content.style.setProperty(\"--dropdown-top\", `${Math.round(top)}px`);\n}\n\nfunction updateOpenDropdowns() {\n OPEN_DROPDOWNS.forEach(updateposition);\n}\n\nfunction closeDropdown(dropdown) {\n const data = API.get(dropdown);\n if (!data || !data.isOpen()) return;\n\n pgs(dropdown).state.remove(\"open\");\n data.trigger.setAttribute(\"aria-expanded\", \"false\");\n OPEN_DROPDOWNS.delete(dropdown);\n}\n\nfunction openDropdown(dropdown) {\n const data = API.get(dropdown);\n if (!data || data.isOpen()) return;\n\n OPEN_DROPDOWNS.forEach(item => {\n if (item !== dropdown) closeDropdown(item);\n });\n\n pgs(dropdown).state.add(\"open\");\n data.trigger.setAttribute(\"aria-expanded\", \"true\");\n OPEN_DROPDOWNS.add(dropdown);\n updateposition(dropdown);\n}\n\nfunction toggleDropdown(dropdown) {\n const data = API.get(dropdown);\n if (!data) return;\n\n if (data.isOpen()) closeDropdown(dropdown);\n else openDropdown(dropdown);\n}\n\nfunction isInsideAnyDropdown(target) {\n return Array.from(OPEN_DROPDOWNS).some(dropdown => dropdown.contains(target));\n}\n\nfunction PGS_dropdown_init(root = document) {\n getDropdowns(root).forEach((DROPDOWN) => {\n if (API.has(DROPDOWN)) return;\n\n const CONTENT = getDropdownContent(DROPDOWN);\n if (!CONTENT) return;\n\n const TRIGGER = getDropdownTrigger(DROPDOWN, CONTENT);\n const id = nextDropdownId();\n\n if (!TRIGGER.id) TRIGGER.id = `dropdown-btn-${id}`;\n if (!CONTENT.id) CONTENT.id = `dropdown-panel-${id}`;\n\n if (TRIGGER.matches(\"button\") && !TRIGGER.hasAttribute(\"type\")) {\n TRIGGER.setAttribute(\"type\", \"button\");\n }\n\n TRIGGER.setAttribute(\"aria-haspopup\", \"true\");\n TRIGGER.setAttribute(\"aria-controls\", CONTENT.id);\n TRIGGER.setAttribute(\"aria-expanded\", String(pgs(DROPDOWN).state.contains(\"open\")));\n CONTENT.setAttribute(\"aria-labelledby\", TRIGGER.id);\n\n const data = {\n element: DROPDOWN,\n trigger: TRIGGER,\n content: CONTENT,\n open: () => openDropdown(DROPDOWN),\n close: () => closeDropdown(DROPDOWN),\n toggle: () => toggleDropdown(DROPDOWN),\n refresh: () => {\n PGS_dropdown_init(DROPDOWN.parentNode || document);\n updateposition(DROPDOWN);\n return API.get(DROPDOWN);\n },\n isOpen: () => pgs(DROPDOWN).state.contains(\"open\")\n };\n\n TRIGGER.addEventListener(\"click\", (event) => {\n if (isDropdownContent(event.target)) return;\n event.preventDefault();\n event.stopPropagation();\n toggleDropdown(DROPDOWN);\n });\n\n CONTENT.addEventListener(\"click\", event => event.stopPropagation());\n API.set(DROPDOWN, data);\n\n if (data.isOpen()) OPEN_DROPDOWNS.add(DROPDOWN);\n updateposition(DROPDOWN);\n });\n}\n\ndocument.addEventListener(\"click\", (event) => {\n if (isInsideAnyDropdown(event.target)) return;\n OPEN_DROPDOWNS.forEach(closeDropdown);\n});\n\ndocument.addEventListener(\"keydown\", (event) => {\n if (event.key !== \"Escape\") return;\n OPEN_DROPDOWNS.forEach(closeDropdown);\n});\n\nwindow.addEventListener(\"resize\", updateOpenDropdowns);\nwindow.addEventListener(\"scroll\", updateOpenDropdowns, true);\n\n// # INIT\nPGS_dropdown_init();\n\n// # API\nfunction PGS_dropdown_api(selector) {\n return API.get(selector);\n}\n\nexport const PGS_dropdown = {\n init: PGS_dropdown_init,\n api: PGS_dropdown_api\n};\n","import { PGS_dropdown } from \"./_dropdown\";\n\nconst API = new WeakMap();\n\n//= DROP DOWN MENU\nfunction PGS_menu_init(root = document) {\n\n pgs(root).querySelectorAll('menu').forEach(MENU => {\n if (API.has(MENU)) return;\n\n MENU.querySelectorAll('li').forEach(li => {\n const ul = li.querySelector(\"ul\");\n\n if (ul) {\n\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.innerHTML = \"<span>⏷</span>\";\n pgs(button).add(\"menu-buttonIcon\");\n li.querySelector(\"a\").insertAdjacentElement(\"afterend\", button);\n\n pgs(li).add(\"dropdown\")\n pgs(li).option.setValueBrackets(\"position\", \"bottom right\")\n pgs(button).add(\"dropdown-button\")\n pgs(button).add(\"buttonNohover\")\n pgs(ul).add(\"dropdown-content\")\n\n }\n });\n\n API.set(MENU, {\n element: MENU,\n type: \"horizontal\",\n refresh: () => {\n PGS_menu_init(MENU.parentNode || document);\n return API.get(MENU);\n },\n });\n PGS_dropdown.init(MENU);\n });\n\n}\n\nPGS_menu_init()\n\nfunction PGS_menu_api(selector) {\n return API.get(selector);\n}\n\n//# EXPORT\nexport const PGS_menu = {\n init: PGS_menu_init,\n api: PGS_menu_api\n};\n","//# MODAL\nconst API = new WeakMap();\n\nexport function PGS_modal_init(selector = \"modal\") {\n pgs(document).querySelectorAll(selector).forEach(MODAL => {\n if (API.has(MODAL)) return;\n\n const BUTTON_OPEN = pgs(MODAL).querySelector(\"modal-button\"); \n const DIALOG = MODAL.querySelector(\"dialog\");\n if (!BUTTON_OPEN || !DIALOG) return;\n\n //== SELECTOR\n const DOMButtonClose = '<button pgs=\"buttonClose modal-close\" type=\"button\" tabindex=\"0\" aria-label=\"Chiudi\"><i class=\"fa-solid fa-close\"></i></button>';\n const modalContentHeader = pgs(MODAL)?.querySelector(\"modal-dialog-content-header\")\n \n \n //== OPTION ATTRIBUTES MODAL\n const disableBackdropClose = pgs(MODAL).option.contains(\"disableBackdropClose\")\n const data_history = pgs(MODAL).option.contains(\"history\");\n const data_container = pgs(MODAL).option.getValueBrackets(\"containerID\");\n const data_containerPGS = pgs(MODAL).option.getValueBrackets(\"containerPGS\");\n \n //== OPTION ATTRIBUTES DIALOG\n const topLevel = pgs(DIALOG).option.contains(\"topLevel\")\n\n \n //== BUTTON CLOSE\n if (pgs(MODAL).querySelector(\"modal-close\")) null\n else if (modalContentHeader) modalContentHeader.insertAdjacentHTML(\"beforeend\", DOMButtonClose)\n else DIALOG.insertAdjacentHTML(\"beforeend\", DOMButtonClose)\n const BUTTON_CLOSE = pgs(MODAL).querySelector(\"modal-close\")\n\n\n //== SET\n pgs(DIALOG).add(\"dialog modal-dialog\");\n\n //== BUTTON OPEN\n BUTTON_OPEN.setAttribute(\"role\", \"button\");\n BUTTON_OPEN.setAttribute(\"aria-label\", \"apri modale\");\n\n\n //== POSITION\n if(!topLevel){ \n if (data_container) document.querySelector(\"#\" + data_container)?.append(DIALOG);\n else if (data_containerPGS) pgs(document).querySelector(data_containerPGS)?.append(DIALOG);\n else document.body.append(DIALOG);\n }\n\n\n //+ FN STATUS \n function statusModal(status = true) {\n BUTTON_OPEN?.setAttribute(\"aria-expanded\", status);\n DIALOG?.setAttribute(\"aria-expanded\", status);\n }\n\n //+ FN OPEN \n function openModal(e) {\n e?.stopImmediatePropagation();\n if (DIALOG.open) {\n closeModal(e);\n return;\n }\n\n if (!DIALOG.open) document.querySelectorAll(\"dialog[open]\").forEach((dlg) => dlg.close());\n statusModal(true);\n topLevel ? DIALOG.showModal() : DIALOG.show();\n // modalCustomEvents('modal:open', { event: e });\n MODAL.dispatchEvent(new CustomEvent('modal:open'));\n DIALOG.dispatchEvent(new CustomEvent('modal:open'));\n }\n\n //+ FN CLOSE \n function closeModal(e) {\n e?.stopImmediatePropagation()\n statusModal(false);\n DIALOG.close();\n // modalCustomEvents('modal:close', { event: e });\n MODAL.dispatchEvent(new CustomEvent('modal:close'));\n DIALOG.dispatchEvent(new CustomEvent('modal:close'));\n }\n\n function forceOpen(e) {\n if (!DIALOG.open) openModal(e);\n }\n\n function forceClose(e) {\n if (DIALOG.open) closeModal(e);\n }\n\n //+ fn OPEN ON HISTORY\n function openModalOnHistory() {\n const params = new URLSearchParams(window.location.search);\n if (params.get('modal') !== BUTTON_OPEN.id) return;\n document.getElementById(BUTTON_OPEN.id)?.scrollIntoView({ behavior: 'smooth' });\n openModal();\n }\n\n\n //= OPEN \n BUTTON_OPEN.addEventListener(\"click\", (e) => openModal(e));\n BUTTON_OPEN.addEventListener(\"keypress\", (e) => !DIALOG.open && (e.key === \"Enter\" || e.key === \" \") && openModal(e));\n \n //= CLOSE \n DIALOG.addEventListener(\"close\", () => statusModal(false));\n DIALOG.addEventListener(\"click\", e => { if (e.target == DIALOG && !disableBackdropClose) closeModal(e) });\n BUTTON_CLOSE?.addEventListener(\"click\", e => closeModal(e));\n \n //= UPDATE HISTORY\n if (data_history && BUTTON_OPEN.id) {\n setTimeout(openModalOnHistory, 1);\n\n //== Aggiorna URL quando cambia l'attributo \"open\" del dialog\n const obs = new MutationObserver(() => {\n let isOpen = DIALOG.hasAttribute(\"open\");\n try {\n const url = new URL(window.location.href);\n const params = new URLSearchParams(url.search);\n isOpen ? params.set('modal', BUTTON_OPEN.id) : params.delete('modal');\n url.search = params.toString() ? `?${params.toString()}` : \"\";\n window.history.pushState({ modal: BUTTON_OPEN.id, open: isOpen }, \"\", url);\n } catch (_) { }\n });\n obs.observe(DIALOG, { attributes: true, attributeFilter: [\"open\"] });\n\n //== Gestisce back/forward del browser per aprire/chiudere il dialog coerentemente\n window.addEventListener(\"popstate\", () => {\n try {\n const params = new URLSearchParams(window.location.search);\n const shouldOpen = params.get('modal') === BUTTON_OPEN.id;\n if (shouldOpen && !DIALOG.open) DIALOG.showModal();\n if (!shouldOpen && DIALOG.open) closeModal()\n } catch (_) { }\n });\n }\n\n API.set(MODAL, {\n element: MODAL,\n button: BUTTON_OPEN,\n dialog: DIALOG,\n closeButton: BUTTON_CLOSE,\n open: forceOpen,\n close: forceClose,\n toggle: openModal,\n refresh: () => {\n PGS_modal_init(selector);\n return API.get(MODAL);\n },\n isOpen: () => DIALOG.open,\n });\n });\n}\n\n//# INIT PGS_modal\nPGS_modal_init()\n\n//# API\nexport function PGS_modal_api(selector) {\n return API.get(selector);\n}\n\nexport const PGS_modal = {\n init: PGS_modal_init,\n api: PGS_modal_api\n};\n","//= PGS_notification\nconst fn_notification = {\n _escapeHtml(value) {\n return String(value ?? \"\");\n },\n\n _getDuration(notification) {\n const rawDuration = notification.duration;\n const duration = Number.parseInt(rawDuration, 10);\n\n return Number.isNaN(duration) ? 5000 : duration;\n },\n\n _getApi(notification) {\n const element = String(notification.element || \"notification\").trim();\n\n return element === \"toast\" ? PGS_notification.toast : PGS_notification.alert;\n },\n\n _getType(notification, api) {\n const type = String(notification.type || \"info\").trim();\n\n return typeof api[type] === \"function\" ? type : \"info\";\n },\n\n _getData(root) {\n try {\n return JSON.parse(root.dataset.notification || \"{}\");\n } catch (error) {\n console.warn(\"PGS notification: dati non validi\", error);\n return {};\n }\n },\n\n _getContent(title, content) {\n const safeContent = this._escapeHtml(content);\n const safeTitle = this._escapeHtml(title);\n\n if (!safeTitle) return safeContent;\n if (!safeContent) return `<span pgs=\"notification-element-title\">${safeTitle}</span>`;\n\n return `\n <span pgs=\"notification-element-title\">${safeTitle}</span>\n <br>\n <span pgs=\"notification-element-content\">${safeContent}</span>\n `;\n },\n\n initNotification(type, containerToken, icon, text, timeout, methodDelete = \"replace\", link = null) {\n let containerNotification = pgs(document).querySelector(containerToken);\n\n //== Create Container\n if (!containerNotification) {\n const newContainer = document.createElement(\"div\");\n pgs(newContainer).add(containerToken);\n newContainer.setAttribute(\"aria-live\", \"polite\");\n newContainer.setAttribute(\"aria-relevant\", \"additions\");\n document.body.appendChild(newContainer);\n containerNotification = newContainer;\n }\n\n //== Create Notification\n const notification = document.createElement(link ? \"a\" : \"div\");\n if (methodDelete == \"replace\") containerNotification.innerHTML = \"\";\n if (link) notification.href = link;\n if (timeout > 0) notification.style.setProperty(\"--notification-timeout\", timeout + \"ms\");\n pgs(notification).state.add(type);\n pgs(notification).add(\"notification-element\");\n notification.setAttribute(\"role\", type == \"error\" ? \"alert\" : \"status\")\n notification.innerHTML = `${icon} <p>${text}</p>`;\n containerNotification.appendChild(notification);\n\n\n //+ Animation delete \n function deleteNotification() {\n methodDelete == \"stack\" ? notification.style.translate = \"120%\" : notification.style.opacity = \"0\";\n setTimeout(() => notification.remove(), 300);\n }\n\n //== Timeout delete\n if (timeout > 0) setTimeout(() => { deleteNotification() }, timeout);\n\n //== button delete\n const btnDelete = document.createElement(\"button\");\n btnDelete.type = \"button\";\n btnDelete.ariaLabel = \"Rimuovi notifica\";\n btnDelete.innerHTML = '<i class=\"fa-solid fa-xmark\"></i>';\n btnDelete.setAttribute(\"pgs\", \"buttonClose\");\n notification.insertAdjacentElement(\"afterbegin\", btnDelete);\n\n //== event\n\n btnDelete.addEventListener(\"click\", function (e) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation()\n deleteNotification(e); // Esegue la tua funzione\n });\n },\n\n deleteAll(containerToken) {\n let containerNotification = pgs(document).querySelector(containerToken);\n if (containerNotification) containerNotification.innerHTML = \"\";\n },\n\n trigger(root = document) {\n pgs(root).querySelectorAll(\"notificationTrigger\").forEach(element => {\n if (!element || element.dataset.initialize === \"true\") return;\n\n element.dataset.initialize = \"true\";\n\n const notification = this._getData(element);\n const title = String(notification.title || \"\").trim();\n const content = String(notification.message || \"\").trim();\n\n if (!title && !content) {\n element.remove();\n return;\n }\n\n const link = notification.link || null;\n const icon = notification.icon || undefined;\n const duration = this._getDuration(notification);\n const api = this._getApi(notification);\n const type = this._getType(notification, api);\n const formattedContent = this._getContent(title, content);\n\n if (api === PGS_notification.toast) api[type](formattedContent, duration, icon);\n else api[type](formattedContent, link, duration, icon);\n\n element.remove();\n });\n }\n};\n\n//# EXPORT \nexport function PGS_notificationTrigger_init(root = document) {\n return fn_notification.trigger(root);\n}\n\nexport const PGS_notification = {\n trigger: PGS_notificationTrigger_init,\n alert: {\n error: (text = \"Errore\", link = null, timeout = 0, icon = '<i class=\"fa-solid fa-circle-xmark\"></i>') => fn_notification.initNotification(\"error\", \"notification\", icon, text, timeout, \"stack\", link),\n success: (text = \"Aggiornato\", link = null, timeout = 0, icon = '<i class=\"fa-solid fa-check\"></i>') => fn_notification.initNotification(\"success\", \"notification\", icon, text, timeout, \"stack\", link),\n info: (text = \"Aggiornamento\", link = null, timeout = 0, icon = '<i class=\"fa-solid fa-circle-info\"></i>',) => fn_notification.initNotification(\"info\", \"notification\", icon, text, timeout, \"stack\", link),\n warning: (text = \"Attenzione\", link = null, timeout = 0, icon = '<i class=\"fa-solid fa-triangle-exclamation\"></i>') => fn_notification.initNotification(\"warning\", \"notification\", icon, text, timeout, \"stack\", link),\n deleteAll: () => fn_notification.deleteAll(\"notification\")\n },\n toast: {\n error: (text = \"Errore\", timeout = 4000, icon = '<i class=\"fa-solid fa-circle-xmark\"></i>',) => fn_notification.initNotification(\"error\", \"toast\", icon, text, timeout),\n success: (text = \"Aggiornato\", timeout = 4000, icon = '<i class=\"fa-solid fa-check\"></i>',) => fn_notification.initNotification(\"success\", \"toast\", icon, text, timeout),\n info: (text = \"Aggiornamento\", timeout = 0, icon = '<i class=\"fa-solid fa-circle-info\"></i>',) => fn_notification.initNotification(\"info\", \"toast\", icon, text, timeout),\n warning: (text = \"Attenzione\", timeout = 4000, icon = '<i class=\"fa-solid fa-triangle-exclamation\"></i>',) => fn_notification.initNotification(\"warning\", \"toast\", icon, text, timeout),\n deleteAll: () => fn_notification.deleteAll(\"toast\")\n }\n};\n\n\n//= EXECUTE \nif (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", () => PGS_notificationTrigger_init());\nelse PGS_notificationTrigger_init();\n","const API = new WeakMap();\nconst OPEN_SEARCHES = new Set();\nlet searchId = 0;\n\nconst DEFAULT_OPTIONS = {\n minLength: 2,\n debounce: 200,\n limit: 8,\n submitOnSelect: false,\n searchOnFocus: true,\n source: null,\n onSelect: null,\n};\n\nfunction nextSearchId() {\n searchId += 1;\n return searchId;\n}\n\nfunction getSearches(root) {\n const searches = root instanceof Element && pgs(root).contains(\"search\") ? [root] : [];\n searches.push(...pgs(root).querySelectorAll(\"search\"));\n return searches;\n}\n\nfunction directPgsChild(element, token) {\n return Array.from(element.children).find(child => pgs(child).contains(token));\n}\n\nfunction normalizeItem(item) {\n if (typeof item === \"string\" || typeof item === \"number\") {\n const value = String(item).trim();\n return value ? { label: value, value, disabled: false, data: item } : null;\n }\n\n if (!item || typeof item !== \"object\") return null;\n\n const label = String(item.label ?? item.value ?? \"\").trim();\n if (!label) return null;\n\n return {\n label,\n value: String(item.value ?? label),\n disabled: Boolean(item.disabled),\n data: Object.prototype.hasOwnProperty.call(item, \"data\") ? item.data : item,\n };\n}\n\nfunction normalizeOptions(current, options = {}) {\n const next = { ...current, ...options };\n next.minLength = Math.max(0, Number.parseInt(next.minLength, 10) || 0);\n next.debounce = Math.max(0, Number.parseInt(next.debounce, 10) || 0);\n next.limit = Math.max(1, Number.parseInt(next.limit, 10) || DEFAULT_OPTIONS.limit);\n next.submitOnSelect = Boolean(next.submitOnSelect);\n next.searchOnFocus = Boolean(next.searchOnFocus);\n next.source = typeof next.source === \"function\" || Array.isArray(next.source) ? next.source : null;\n next.onSelect = typeof next.onSelect === \"function\" ? next.onSelect : null;\n return next;\n}\n\nfunction closeSearch(search) {\n const data = API.get(search);\n if (!data) return;\n\n pgs(search).state.remove(\"open\");\n data.input.setAttribute(\"aria-expanded\", \"false\");\n data.input.removeAttribute(\"aria-activedescendant\");\n data.list.setAttribute(\"aria-hidden\", \"true\");\n data.setActiveIndex(-1);\n OPEN_SEARCHES.delete(search);\n}\n\nfunction openSearch(search) {\n const data = API.get(search);\n if (!data || data.items().length === 0) return;\n\n pgs(search).state.add(\"open\");\n data.input.setAttribute(\"aria-expanded\", \"true\");\n data.list.setAttribute(\"aria-hidden\", \"false\");\n OPEN_SEARCHES.add(search);\n}\n\nfunction PGS_search_init(root = document) {\n getSearches(root).forEach(search => {\n if (API.has(search)) return;\n\n const input = search.querySelector('input[type=\"search\"]');\n const list = directPgsChild(search, \"search-suggestions\");\n if (!input || !list) return;\n\n const id = nextSearchId();\n if (!input.id) input.id = `search-input-${id}`;\n if (!list.id) list.id = `search-suggestions-${id}`;\n\n input.setAttribute(\"role\", \"combobox\");\n input.setAttribute(\"aria-autocomplete\", \"list\");\n input.setAttribute(\"aria-haspopup\", \"listbox\");\n input.setAttribute(\"aria-controls\", list.id);\n input.setAttribute(\"aria-expanded\", \"false\");\n input.setAttribute(\"autocomplete\", \"off\");\n list.setAttribute(\"role\", \"listbox\");\n list.setAttribute(\"aria-labelledby\", input.id);\n list.setAttribute(\"aria-hidden\", \"true\");\n\n\n let options = { ...DEFAULT_OPTIONS };\n let items = [];\n let activeIndex = -1;\n let timer = null;\n let controller = null;\n let requestNumber = 0;\n\n function setLoading(loading) {\n pgs(search).state.toggle(\"loading\", loading);\n input.setAttribute(\"aria-busy\", String(loading));\n }\n\n function setActiveIndex(index) {\n activeIndex = index;\n const elements = Array.from(list.querySelectorAll('[pgs~=\"search-suggestions-item\"]'));\n\n elements.forEach((element, itemIndex) => {\n const selected = itemIndex === activeIndex;\n element.setAttribute(\"aria-selected\", String(selected));\n pgs(element).state.toggle(\"selected\", selected);\n });\n\n const active = elements[activeIndex];\n if (active) {\n input.setAttribute(\"aria-activedescendant\", active.id);\n active.scrollIntoView({ block: \"nearest\" });\n } else {\n input.removeAttribute(\"aria-activedescendant\");\n }\n }\n\n function moveActive(step) {\n if (!items.length) return;\n\n let next = activeIndex;\n for (let checked = 0; checked < items.length; checked += 1) {\n next = (next + step + items.length) % items.length;\n if (!items[next].disabled) {\n setActiveIndex(next);\n return;\n }\n }\n }\n\n function clear() {\n items = [];\n activeIndex = -1;\n list.replaceChildren();\n closeSearch(search);\n }\n\n function cancel() {\n if (timer !== null) window.clearTimeout(timer);\n timer = null;\n if (controller) controller.abort();\n controller = null;\n requestNumber += 1;\n setLoading(false);\n }\n\n function render(nextItems) {\n items = Array.from(nextItems || [])\n .map(normalizeItem)\n .filter(Boolean)\n .slice(0, options.limit);\n\n const fragment = document.createDocumentFragment();\n items.forEach((item, index) => {\n const option = document.createElement(\"li\");\n pgs(option).add(\"search-suggestions-item\");\n pgs(option).add(\"flexRow\");\n option.id = `${list.id}-option-${index}`;\n option.dataset.index = String(index);\n option.setAttribute(\"role\", \"option\");\n option.setAttribute(\"aria-selected\", \"false\");\n option.setAttribute(\"aria-disabled\", String(item.disabled));\n option.innerHTML = '<i class=\"fa-solid fa-magnifying-glass\"></i>' + item.label;\n fragment.append(option);\n\n });\n\n activeIndex = -1;\n list.replaceChildren(fragment);\n pgs(search).state.remove(\"error\");\n\n if (items.length) openSearch(search);\n else closeSearch(search);\n\n return items;\n }\n\n async function resolveSource(query, signal) {\n if (Array.isArray(options.source)) {\n const normalizedQuery = query.toLocaleLowerCase();\n return options.source.filter(item => {\n const normalized = normalizeItem(item);\n return normalized && normalized.label.toLocaleLowerCase().includes(normalizedQuery);\n });\n }\n\n if (typeof options.source !== \"function\") return [];\n return await options.source({\n query,\n signal,\n limit: options.limit,\n element: search,\n input,\n });\n }\n\n async function runSearch(query = input.value) {\n cancel();\n clear();\n\n const normalizedQuery = String(query ?? \"\").trim();\n if (normalizedQuery.length < options.minLength || !options.source) return [];\n\n const currentRequest = requestNumber;\n controller = new AbortController();\n const currentController = controller;\n setLoading(true);\n\n try {\n const result = await resolveSource(normalizedQuery, currentController.signal);\n if (currentRequest !== requestNumber || currentController.signal.aborted) return [];\n return render(result);\n } catch (error) {\n if (error?.name === \"AbortError\") return [];\n if (currentRequest !== requestNumber) return [];\n\n clear();\n pgs(search).state.add(\"error\");\n search.dispatchEvent(new CustomEvent(\"pgs:search:error\", {\n bubbles: true,\n detail: { error, query: normalizedQuery },\n }));\n return [];\n } finally {\n if (controller === currentController) controller = null;\n if (currentRequest === requestNumber) setLoading(false);\n }\n }\n\n function schedule() {\n cancel();\n clear();\n pgs(search).state.remove(\"error\");\n\n if (input.value.trim().length < options.minLength || !options.source) return;\n timer = window.setTimeout(() => {\n timer = null;\n runSearch(input.value);\n }, options.debounce);\n }\n\n function select(index = activeIndex, submit = options.submitOnSelect) {\n const item = items[index];\n if (!item || item.disabled) return null;\n\n input.value = item.value;\n cancel();\n clear();\n\n const detail = { item, index, value: item.value, input, element: search };\n search.dispatchEvent(new CustomEvent(\"pgs:search:select\", { bubbles: true, detail }));\n options.onSelect?.(detail);\n\n input.focus();\n if (submit && typeof search.requestSubmit === \"function\") search.requestSubmit();\n return item;\n }\n\n function configure(nextOptions = {}) {\n options = normalizeOptions(options, nextOptions);\n return api;\n }\n\n function onInput() {\n schedule();\n }\n\n function onFocus() {\n if (items.length) openSearch(search);\n else if (options.searchOnFocus) schedule();\n }\n\n function onKeydown(event) {\n if (event.key === \"ArrowDown\") {\n if (!pgs(search).state.contains(\"open\")) schedule();\n if (items.length) {\n event.preventDefault();\n moveActive(1);\n }\n return;\n }\n\n if (event.key === \"ArrowUp\" && items.length) {\n event.preventDefault();\n moveActive(-1);\n return;\n }\n\n if (event.key === \"Enter\" && activeIndex >= 0) {\n event.preventDefault();\n select(activeIndex);\n return;\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n cancel();\n closeSearch(search);\n return;\n }\n\n if (event.key === \"Tab\") closeSearch(search);\n }\n\n function onListPointerDown(event) {\n const option = event.target.closest('[pgs~=\"search-suggestions-item\"]');\n if (!option || !list.contains(option)) return;\n event.preventDefault();\n select(Number.parseInt(option.dataset.index, 10));\n }\n\n function onSubmit() {\n cancel();\n closeSearch(search);\n }\n\n function destroy() {\n cancel();\n clear();\n input.removeEventListener(\"input\", onInput);\n input.removeEventListener(\"focus\", onFocus);\n input.removeEventListener(\"keydown\", onKeydown);\n list.removeEventListener(\"pointerdown\", onListPointerDown);\n search.removeEventListener(\"submit\", onSubmit);\n API.delete(search);\n }\n\n const api = {\n element: search,\n input,\n list,\n configure,\n setSource: source => configure({ source }),\n search: runSearch,\n open: () => openSearch(search),\n close: () => closeSearch(search),\n clear,\n cancel,\n select,\n refresh: () => runSearch(input.value),\n destroy,\n items: () => [...items],\n isOpen: () => pgs(search).state.contains(\"open\"),\n isLoading: () => pgs(search).state.contains(\"loading\"),\n setActiveIndex,\n };\n\n input.addEventListener(\"input\", onInput);\n input.addEventListener(\"focus\", onFocus);\n input.addEventListener(\"keydown\", onKeydown);\n list.addEventListener(\"pointerdown\", onListPointerDown);\n search.addEventListener(\"submit\", onSubmit);\n API.set(search, api);\n });\n}\n\ndocument.addEventListener(\"pointerdown\", event => {\n OPEN_SEARCHES.forEach(search => {\n if (!search.contains(event.target)) closeSearch(search);\n });\n});\n\nPGS_search_init();\n\nexport function PGS_search_api(selector) {\n return API.get(selector);\n}\n\nexport const PGS_search = {\n init: PGS_search_init,\n api: PGS_search_api,\n};\n","import { PGS_scrollHorizontal } from \"../functions/_scrollY\"\nconst API = new WeakMap();\n\nclass PGS_Slides {\n //- CONSTRUCTOR\n constructor({ selector, viewRatio = 0.97, optionIntersectionObserver = {}, scrollOptions = {} } = {}) {\n this.selector = selector;\n this.viewRatio = viewRatio;\n\n this.optionIntersectionObserver = {\n threshold: Array.from({ length: 101 }, (_, i) => i / 100), // 0%,1%,2%...100%\n rootMargin: \"0px\",\n ...optionIntersectionObserver,\n };\n\n this.scrollOptions = {\n behavior: \"smooth\",\n inline: \"center\",\n block: \"nearest\",\n container: \"nearest\",\n ...scrollOptions,\n };\n\n this.container = this.selector ? pgs(this.selector).querySelector(\"slides-container\") : null;\n }\n \n //+ CREATE BUTTON \n #createButtonsAndDots() {\n const EL = this.selector\n\n //== PULSANTI\n if (!pgs(EL).querySelector('slides-prec') && !pgs(EL).querySelector('slides-next')) {\n 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>`);\n 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>`);\n }\n\n //== DOTS\n if (!pgs(EL).querySelector('slides-dots')) {\n EL.insertAdjacentHTML(\"beforeend\", `<div pgs=\"slides-dots\" class=\"slides-dots\"></div>`);\n\n Array.from(this.container.children).forEach(() => {\n pgs(EL).querySelector('slides-dots')\n .insertAdjacentHTML(\"beforeend\", `<button type=\"button\" class=\"slide-dot\" aria-label=\"vai alla prossima slide\"></button>`);\n });\n }\n }\n\n //+ PREV \n #previousSlide() {\n const currents = this.container.querySelectorAll('.view');\n let current;\n \n\n if (pgs(this.selector).option.contains('singleScroll')) current = currents[currents.length - 1];\n else current = currents[0];\n\n const prev = current?.previousElementSibling;\n\n prev?.scrollIntoView(this.scrollOptions);\n prev?.focus({ preventScroll: true });\n }\n\n //+ NEXT \n #nextSlide() {\n const currents = this.container.querySelectorAll('.view');\n let current;\n\n \n \n if (pgs(this.selector).option.contains('singleScroll')) current = currents[0];\n else current = currents[currents.length - 1];\n \n const next = current?.nextElementSibling;\n console.log(current, next);\n\n next?.scrollIntoView(this.scrollOptions);\n next?.focus({ preventScroll: true });\n }\n\n //+ GO TO NUMBER SLIDE \n #goToNumberSlide(index) {\n this.container.children[index].scrollIntoView(this.scrollOptions)\n }\n\n //+ CALLBACK\n #callback(allLi, container, precButton, nextButton, dots) {\n allLi.forEach(LI => {\n const visiblePercent = 0.9 + LI.intersectionRatio * 0.1;\n const isView = visiblePercent >= 0.98;\n\n //== SCROLL ANIMATION\n if (!pgs(LI.target).option.contains('notScrollAnimation') && LI.target.firstElementChild) {\n LI.target.firstElementChild.style.setProperty('--visible-percent', `${visiblePercent}`);\n };\n\n //== VIEW & NOT-VIEW \n LI.target.classList.toggle(\"view\", isView);\n LI.target.classList.toggle(\"notView\", !isView);\n\n //== VIEW PREC e NEXT\n const all = LI.target.parentNode.children;\n const atStart = all[0].classList.contains(\"view\");\n const atEnd = all[all.length - 1].classList.contains(\"view\");\n nextButton.disabled = atEnd;\n precButton.disabled = atStart;\n nextButton.setAttribute('aria-disabled', String(atEnd));\n precButton.setAttribute('aria-disabled', String(atStart));\n\n //== ACTIVE DOT\n const viewElements = Array.from(container.children).filter(el => el.classList.contains('view'));\n dots.forEach((btn, i) => {\n const isActive = viewElements.some(el => Array.from(container.children).indexOf(el) === i);\n btn.classList.toggle('active', isActive);\n btn.setAttribute('aria-current', isActive ? 'true' : 'false');\n });\n })\n }\n\n //= EXECUTE\n execute() {\n const slides = this.selector;\n if (!this.container) return\n\n //== elements\n this.#createButtonsAndDots();\n const precButton = pgs(slides).querySelector('slides-prec');\n const nextButton = pgs(slides).querySelector('slides-next');\n const dots = Array.from(pgs(slides).querySelector('slides-dots').children);\n\n //== option\n const notScrollWithMouse = pgs(slides).option.contains('notScrollWithMouse');\n\n //== scroll\n if (!notScrollWithMouse) PGS_scrollHorizontal(this.container, 5);\n\n //==Listener: DOT, PREC, NEXT\n dots.forEach((dot, index) => dot.addEventListener(\"click\", e => this.#goToNumberSlide(index)));\n precButton.addEventListener(\"click\", e => this.#previousSlide(), { passive: true });\n nextButton.addEventListener(\"click\", e => this.#nextSlide(), { passive: true });\n\n //== observer\n const observer = new IntersectionObserver(\n (allLi) => this.#callback(allLi, this.container, precButton, nextButton, dots),\n { root: this.container, ...this.optionIntersectionObserver }\n );\n Array.from(this.container.children).forEach(allLi => observer.observe(allLi));\n\n\n //- API\n API.set(this.selector, {\n element: this.selector,\n container: this.container,\n previous: () => this.#previousSlide(),\n next: () => this.#nextSlide(),\n goTo: (index) => this.#goToNumberSlide(index),\n getCurrentIndexes: () => Array.from(this.container.children).map((el, i) => el.classList.contains(\"view\") ? i : -1).filter(i => i !== -1),\n getCurrentElements: () => Array.from(this.container.children).filter(el => el.classList.contains(\"view\")),\n getTotal: () => this.container.children.length,\n isAtStart: () => this.container.children[0]?.classList.contains(\"view\") || false,\n isAtEnd: () => {\n const children = this.container.children;\n const last = children[children.length - 1];\n return last?.classList.contains(\"view\") || false;\n },\n refresh: () => {\n PGS_slides_init(this.selector.parentNode || document);\n return API.get(this.selector);\n },\n });\n }\n}\n\n//# INIT \nexport function PGS_slides_init(root = document) {\n pgs(root).querySelectorAll(\"slides\").forEach(el => {\n if (API.has(el)) return;\n\n const instance = new PGS_Slides({ selector: el });\n instance.execute();\n });\n}\n\nPGS_slides_init();\n\n//# API \nexport function PGS_slides_api(selector) {\n return API.get(selector);\n}\n\nexport const PGS_slides = {\n init: PGS_slides_init,\n api: PGS_slides_api\n};\n","const API = new WeakMap();\n\nexport function PGS_stepTabs_init(root = document) {\n pgs(root).querySelectorAll(\"stepTabs\").forEach(tabsWizard => {\n if (tabsWizard.dataset.stepTabsInitialized === \"true\") return;\n tabsWizard.dataset.stepTabsInitialized = \"true\";\n\n //= SELECTOR\n const prev = pgs(tabsWizard).querySelector(\"stepTabs-prev\")\n const next = pgs(tabsWizard).querySelector(\"stepTabs-next\")\n const restart = pgs(tabsWizard).querySelector(\"stepTabs-restart\")\n const dots = pgs(tabsWizard).querySelector(\"stepTabs-dots\")\n const tabsContainer = pgs(tabsWizard).querySelector(\"stepTabs-container\");\n const allTab = pgs(tabsContainer).querySelectorAll(\"tab\");\n\n //= SETTING\n const total = allTab.length;\n const defaultTabLocked = Array.from(allTab).filter(tab => pgs(tab).state.contains(\"is-locked\")) \n let current = 0;\n if (prev) prev.disabled = true;\n let isRendering = false;\n\n if (!tabsContainer || total === 0) return;\n\n //- CREAZIONE DOTS\n const tabDots = [];\n if (dots) {\n dots.innerHTML = \"\";\n\n allTab.forEach((tab, index) => {\n const iconClass = pgs(tab).option.getValueBrackets(\"tabIcon\") || \"fa-circle\";\n const dot = document.createElement(\"button\");\n dot.type = \"button\";\n pgs(dot).add(\"stepTabs-dots-dot\");\n dot.setAttribute(\"data-step\", index);\n dot.innerHTML = `<i class=\"fa-solid ${iconClass}\"></i>`;\n\n dot.addEventListener(\"click\", () => {\n if (pgs(dot).state.contains(\"is-completed\")) {\n goTo(index, true);\n }\n });\n\n dots.appendChild(dot);\n tabDots.push(dot);\n });\n }\n\n //+ DOTS\n function updateDots() {\n tabDots.forEach((dot, i) => {\n setState(dot, \"is-active\", i === current);\n setState(dot, \"is-completed\", i < current);\n });\n }\n\n //+ STATE\n function setState(element, state, active) {\n if (!element) return;\n const hasState = pgs(element).state.contains(state);\n if (active === hasState) return;\n pgs(element).state.toggle(state, active);\n }\n\n //+ CONTROLS\n function updateControls() {\n const tab = allTab[current];\n if (prev) prev.disabled = current === 0;\n if (next) next.disabled = current === total - 1 || pgs(tab).state.contains(\"is-locked\");\n }\n\n //+ Step\n function goTo(index, scroll = true) {\n current = Math.min(Math.max(index, 0), total - 1);\n const tab = allTab[current]\n\n isRendering = true;\n allTab.forEach((tab, i) => setState(tab, \"is-active\", i === current));\n updateControls();\n updateDots();\n isRendering = false;\n\n if (scroll && !tabsWizard.closest(\"dialog\")) {\n tab?.focus();\n tabsWizard?.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }\n\n tabsWizard.dispatchEvent(new CustomEvent('stepTabs:change', { detail: { current, total } }));\n }\n\n //+ restart\n function restartTab() {\n goTo(0);\n defaultTabLocked.forEach(tab => pgs(tab).state.add(\"is-locked\"));\n }\n\n //= INIT\n goTo(0, false);\n\n //= data-tab-locked\n const observer = new MutationObserver(() => {\n if (isRendering) return;\n updateControls();\n });\n allTab?.forEach(tabEl => observer.observe(tabEl, { attributes: true, attributeFilter: [\"pgs-state\"], }));\n\n //= Click su Avanti/Indietro\n prev?.addEventListener(\"click\", e => goTo(current - 1));\n next?.addEventListener(\"click\", e => {\n updateControls();\n if (next.disabled) return;\n goTo(current + 1);\n });\n restart?.addEventListener(\"click\", e => restartTab(), { capture: true });\n\n //-(API) \n // tabsWizard.addEventListener(\"stepTabs:reset\", () => restartTab());\n API.set(tabsWizard, {\n element: tabsWizard,\n container: tabsContainer,\n restart: restartTab,\n goTo,\n next: () => goTo(current + 1),\n prev: () => goTo(current - 1),\n toggleLock: (step, lock = true) => typeof step === \"number\" && allTab[step] && (pgs(allTab[step]).state.toggle(\"is-locked\", lock), goTo(current)),\n refresh: () => {\n PGS_stepTabs_init(tabsWizard.parentNode || document);\n return API.get(tabsWizard);\n },\n getCurrent: () => current,\n getState: () => ({ current, total }),\n });\n });\n}\n\nPGS_stepTabs_init()\n\nexport function PGS_stepTabs_api(selector) {\n return API.get(selector);\n}\n\nexport const PGS_stepTabs = {\n init: PGS_stepTabs_init,\n api: PGS_stepTabs_api\n};\n\n/* \n / EXAMPLE\n // vai allo step 2\n w.dispatchEvent(new CustomEvent(\"stepTabs:go\", { detail: { step: 2 } }));\n \n // next\n w.dispatchEvent(new CustomEvent(\"stepTabs:next\"));\n \n // prev\n w.dispatchEvent(new CustomEvent(\"stepTabs:prev\"));\n \n // reset a 0 senza relock\n w.dispatchEvent(new CustomEvent(\"stepTabs:reset\"));\n \n // lock step 3\n w.dispatchEvent(new CustomEvent(\"stepTabs:toggle-lock\", { detail: { step: 3, lock: true } }));\n \n // unlock step 3\n w.dispatchEvent(new CustomEvent(\"stepTabs:toggle-lock\", { detail: { step: 3, lock: false } }));\n \n // leggi stato\n w.dispatchEvent(new CustomEvent(\"stepTabs:get\", { detail: { reply: (state) => console.log(state) } }));\n*/\n","const API = new WeakMap();\n\nexport function PGS_steps_init(root = document) {\n pgs(root).querySelectorAll(\"steps\").forEach(steps => {\n if (API.has(steps)) return;\n\n pgs(steps).querySelectorAll(\"steps-step\").forEach((li, index) => {\n \n //= CIRCLE\n let circleLi;\n if (!pgs(li).querySelector(\"steps-step-circle\")) {\n circleLi = document.createElement(\"span\");\n pgs(circleLi).add(\"steps-step-circle\")\n circleLi.textContent = index + 1;\n li.insertAdjacentElement(\"afterbegin\", circleLi);\n } else{\n circleLi = pgs(li).querySelector(\"steps-step-circle\");\n }\n \n //= line\n if (!pgs(li).querySelector(\"steps-step-line\")) {\n const line = document.createElement(\"span\");\n pgs(line).add(\"steps-step-line\")\n li.insertAdjacentElement(\"afterbegin\", line);\n }\n });\n\n API.set(steps, {\n element: steps,\n steps: () => Array.from(pgs(steps).querySelectorAll(\"steps-step\")),\n getStep: (index) => pgs(steps).querySelectorAll(\"steps-step\")[index],\n getTotal: () => pgs(steps).querySelectorAll(\"steps-step\").length,\n refresh: () => {\n API.delete(steps);\n PGS_steps_init(steps.parentNode || document);\n return API.get(steps);\n },\n });\n });\n}\n\n//# INIT PGS_ol\nPGS_steps_init()\n\n//# API\nexport function PGS_steps_api(selector) {\n return API.get(selector);\n}\n\nexport const PGS_steps = {\n init: PGS_steps_init,\n api: PGS_steps_api\n};\n","//= SUMMARY\nconst API = new WeakMap();\nlet summaryId = 0;\n\nfunction nextSummaryId() {\n summaryId += 1;\n return summaryId;\n}\n\nfunction getLineHeight(element) {\n const style = window.getComputedStyle(element);\n const lineHeight = parseFloat(style.lineHeight);\n if (Number.isFinite(lineHeight)) return lineHeight;\n\n const fontSize = parseFloat(style.fontSize);\n return Number.isFinite(fontSize) ? fontSize * 1.2 : 0;\n}\n\nfunction directPgsChild(element, token) {\n return Array.from(element.children).find(child => pgs(child).contains(token));\n}\n\nexport function PGS_summary_init(root = document) {\n pgs(root).querySelectorAll(\"summary\").forEach((summary) => {\n if (API.has(summary)) return;\n\n const content = directPgsChild(summary, \"summary-content\");\n const button = directPgsChild(summary, \"summary-button\");\n if (!content || !button) return;\n\n const id = nextSummaryId();\n const contentId = content.id || `summary-content-${id}`;\n content.id = contentId;\n\n button.type ||= \"button\";\n button.setAttribute(\"aria-controls\", content.id);\n\n function isOpen() {\n return pgs(summary).state.contains(\"open\");\n }\n\n function getCollapsedHeight() {\n return getLineHeight(content) * 3;\n }\n\n function isOverflowing() {\n return content.scrollHeight > Math.ceil(getCollapsedHeight()) + 1;\n }\n\n function setExpanded(expanded) {\n const overflow = isOverflowing();\n\n pgs(summary).state.toggle(\"overflow\", overflow);\n pgs(summary).state.toggle(\"open\", expanded && overflow);\n\n button.hidden = !overflow;\n button.setAttribute(\"aria-hidden\", String(!overflow));\n button.setAttribute(\"aria-expanded\", String(expanded && overflow));\n button.textContent = expanded && overflow ? \"Mostra meno\" : \"Mostra di più\";\n\n const nextHeight = expanded && overflow ? content.scrollHeight : getCollapsedHeight();\n content.style.setProperty(\"--summary-content-max-height\", `${nextHeight}px`);\n }\n\n function refresh() {\n const wasOpen = isOpen();\n content.style.setProperty(\"--summary-content-max-height\", \"none\");\n setExpanded(wasOpen);\n }\n\n function toggle() {\n setExpanded(!isOpen());\n }\n\n button.addEventListener(\"click\", toggle);\n window.addEventListener(\"resize\", refresh, { passive: true });\n\n refresh();\n requestAnimationFrame(refresh);\n\n API.set(summary, {\n element: summary,\n content,\n button,\n open: () => setExpanded(true),\n close: () => setExpanded(false),\n toggle,\n refresh,\n isOpen,\n });\n });\n}\n\n//# INIT\nPGS_summary_init();\n\n//# API\nexport function PGS_summary_api(selector) {\n return API.get(selector);\n}\n\nexport const PGS_summary = {\n init: PGS_summary_init,\n api: PGS_summary_api\n};\n","import { PGS_notification } from \"../components/_notifications.js\";\n\n\nexport class PGS_formValidate {\n constructor({ form } = {}) {\n this.container = form;\n this._rules = [];\n // pgs(this.container).add(\"formError\"); \n }\n\n //+ ADD\n addError(field, i) {\n field.setAttribute(\"data-form-field-status\", \"error\");\n if (i == 0) field.scrollIntoView();\n\n let message = field.getAttribute(\"data-form-field-message\");\n\n if (i == 0 && message) PGS_notification.toast.error(message);\n else if (i == 0) PGS_notification.toast.error(\"Compila tutti i campi!\");\n }\n\n //+ REMOVE\n removeError(field) {\n field.setAttribute(\"data-form-field-status\", \"\");\n }\n\n #removeErrorOnClick(allFields) {\n allFields.forEach(element => {\n element.addEventListener(\"click\", e => this.removeError(element))\n });\n }\n\n // + --------------------------\n // + Helpers \n // + --------------------------\n help = {\n // supporta sia required nativo, sia data-required=\"true\"\n isRequired(field) {\n if (!field) return false;\n\n const required = field.required === true || field?.dataset?.required === \"true\" || field?.getAttribute('aria-required') == \"true\";\n return required && !field.hidden; // solo attributo/proprietà \"hidden\"\n },\n // input (non speciali), textarea\n isEmptyTextLike(field) { return !String(field?.value ?? \"\").trim(); },\n // select: vuoto se value == \"\" o null\n isEmptySelect(field) { return !String(field?.value ?? \"\").trim(); },\n // recupera name in modo sicuro\n getGroupName(field) { return field?.name || field?.getAttribute?.(\"name\") || \"\"; }\n };\n\n\n // + --------------------------\n // + input + altri elementi. \n // + --------------------------\n #inputValue(container) {\n\n //++ add rule\n const ruleInvalidFields = [];\n for (const rule of this._rules) {\n const res = rule(container);\n\n // la rule può tornare:\n // • null/undefined => ok\n // • un elemento => invalido\n // • un array di elementi => invalidi\n if (!res) continue;\n\n if (Array.isArray(res)) ruleInvalidFields.push(...res);\n else ruleInvalidFields.push(res);\n }\n\n //== INPUT \n // \"testuali\" (esclude hidden/disabled/checkbox/radio/file come nel tuo snippet)\n const textInputs = Array.from(container.querySelectorAll(\"input\")).filter((input) => {\n if (input.disabled) return false;\n if (input.type === \"hidden\") return false;\n if (input.type === \"checkbox\" || input.type === \"radio\" || input.type === \"file\") return false;\n\n // valida solo se required (o data-required=\"true\")\n if (!this.help.isRequired(input)) return false;\n\n return this.help.isEmptyTextLike(input);\n });\n\n //== TEXTAREA \n // required vuote\n const textareas = Array.from(container.querySelectorAll(\"textarea\")).filter((ta) => {\n if (ta.disabled) return false;\n if (!this.help.isRequired(ta)) return false;\n return this.help.isEmptyTextLike(ta);\n });\n\n //== SELECT \n // required vuoti\n const selects = Array.from(container.querySelectorAll(\"select\")).filter((sel) => {\n if (sel.disabled) return false;\n if (!this.help.isRequired(sel)) return false;\n return this.help.isEmptySelect(sel);\n });\n\n //== RADIO \n // required: se in un gruppo required non ce n'è uno checked => errore sul \"primo\" radio del gruppo\n const radios = Array.from(container.querySelectorAll('input[type=\"radio\"]')).filter((r) => !r.disabled);\n const requiredRadioGroups = new Map(); // name -> [elements]\n for (const r of radios) {\n if (!this.help.isRequired(r)) continue;\n const name = this.help.getGroupName(r);\n if (!name) continue;\n if (!requiredRadioGroups.has(name)) requiredRadioGroups.set(name, []);\n requiredRadioGroups.get(name).push(r);\n }\n const radioGroupErrors = [];\n for (const [name, group] of requiredRadioGroups.entries()) {\n const anyChecked = group.some((r) => r.checked);\n if (!anyChecked) {\n // scegli dove mettere l'errore: tipicamente sul primo radio del gruppo\n radioGroupErrors.push(group[0]);\n }\n }\n\n //== CHECKBOX \n // required: può essere singola checkbox required (checked obbligatorio)\n // oppure gruppo di checkbox (stesso name) con almeno una selezionata\n const checkboxes = Array.from(container.querySelectorAll('input[type=\"checkbox\"]')).filter((c) => !c.disabled);\n const requiredCheckboxSingles = [];\n const requiredCheckboxGroups = new Map(); // name -> [elements]\n for (const c of checkboxes) {\n if (!this.help.isRequired(c)) continue;\n\n const name = this.help.getGroupName(c);\n if (!name) {\n // checkbox senza name: trattala come singola required\n if (!c.checked) requiredCheckboxSingles.push(c);\n continue;\n }\n\n // se vuoi trattare come gruppo, raggruppa per name\n if (!requiredCheckboxGroups.has(name)) requiredCheckboxGroups.set(name, []);\n requiredCheckboxGroups.get(name).push(c);\n }\n const checkboxGroupErrors = [];\n for (const [name, group] of requiredCheckboxGroups.entries()) {\n // se è un gruppo (>=2) richiedi almeno una spuntata\n // se è 1 sola, si comporta come singola\n const anyChecked = group.some((c) => c.checked);\n if (!anyChecked) checkboxGroupErrors.push(group[0]);\n }\n\n //== FILE \n // required: se vuoi includerlo\n const fileInputs = Array.from(container.querySelectorAll('input[type=\"file\"]')).filter((f) => {\n if (f.disabled) return false;\n if (!this.help.isRequired(f)) return false;\n return !(f.files && f.files.length > 0);\n });\n\n //== risultato finale: tutti i campi da marcare come errore\n const invalidFields = [\n textInputs,\n textareas,\n selects,\n radioGroupErrors,\n requiredCheckboxSingles,\n checkboxGroupErrors,\n fileInputs,\n ruleInvalidFields\n ];\n\n return invalidFields.flat();\n }\n\n // + -------------------------\n // + VALIDATE \n // + -------------------------\n validate() {\n const invalid = this.#inputValue(this.container);\n const allFields = this.container.querySelectorAll(\"input, textarea, select\")\n\n //== pulizia/aggiornamento errori: \n // prima rimuovo errori dai campi \"non più invalidi\"\n Array.from(allFields).filter((el) => !el.disabled);\n\n //== per radio/checkbox in gruppo: \n // rimuovi l'errore solo sull'elemento che lo ospita (qui: se presente)\n for (const el of allFields) { if (!invalid.includes(el)) this.removeError(el); }\n\n //== aggiungo errori dove serve\n invalid.forEach((el, i) => this.addError(el, i))\n\n //== rimuove l'errore al click\n this.#removeErrorOnClick(allFields)\n\n //== status form\n if (invalid.length) {\n this.container.setAttribute(\"data-form-status\", \"error\");\n return false;\n } else {\n this.container.setAttribute(\"data-form-status\", \"success\");\n return true;\n }\n }\n\n ifSuccess(text = \"Inviato con successo\") {\n if (this.validate() == true) PGS_notification.toast.success(text)\n }\n\n // + -------------------------\n // + ADD RULE \n // + -------------------------\n addNewRule(container) {\n if (typeof container !== \"function\") throw new Error(\"Rule must be a function\");\n this._rules.push(container);\n return this;\n }\n}\n","export function PGS_scrollHorizontal(querySelector, dataSpeed) {\n // Se hai più contenitori, selezionali tutti:\n // Semplice \"singleton\" per stimare se la sorgente è trackpad\n const TrackpadDetector = (() => {\n let lastTs = 0;\n let smallAndFast = 0;\n let samples = 0;\n let isTrackpad = false;\n\n function update(e) {\n const now = performance.now();\n const dt = now - lastTs;\n\n // Porta delta in px (0: px, 1: linee, 2: pagine)\n let dy = Math.abs(e.deltaY);\n if (e.deltaMode === 1) dy *= 16;\n else if (e.deltaMode === 2) dy *= e.currentTarget?.clientHeight || 800;\n\n // Heuristica: eventi piccoli e ravvicinati → prob. trackpad\n const small = dy < 30; // soglia prudente\n const fast = dt < 35; // alta frequenza\n if (small && fast) smallAndFast++;\n\n samples++;\n if (samples >= 6) { // aggiorna il giudizio ogni N eventi\n isTrackpad = smallAndFast >= 3;\n smallAndFast = 0;\n samples = 0;\n }\n\n lastTs = now;\n return isTrackpad;\n }\n\n return {\n update,\n get value() { return isTrackpad; }\n };\n })();\n\n //= Scorrimento orizzontale con rotella (evita il trackpad)\n \n let el = querySelector\n el.addEventListener('wheel', (e) => {\n const speed = dataSpeed;\n\n //== lascia lo scroll naturale del trackpad\n if (TrackpadDetector.update(e)) return;\n\n //== Evita interferenze con zoom o scroll orizzontale nativo\n if (e.ctrlKey) return;\n if (Math.abs(e.deltaX) > Math.abs(e.deltaY)) return;\n\n //== Converti delta in px per lo shift orizzontale\n let delta = e.deltaY;\n if (e.deltaMode === 1) delta *= 16;\n else if (e.deltaMode === 2) delta *= el.clientHeight;\n\n //== Verifica se il contenitore può ancora scrollare orizzontalmente\n const atStart = el.scrollLeft <= 0;\n const atEnd = el.scrollLeft + el.clientWidth >= el.scrollWidth - 1;\n const scrollingRight = delta > 0;\n const scrollingLeft = delta < 0;\n const canScrollHoriz =\n (scrollingRight && !atEnd) ||\n (scrollingLeft && !atStart);\n\n // Se non può più scrollare in quella direzione, lascia che la pagina gestisca lo scroll verticale\n if (!canScrollHoriz) return;\n\n //== Previeni il default solo quando facciamo noi lo scroll orizzontale\n e.preventDefault();\n\n //== rotella giù => destra\n el.scrollLeft += delta * speed;\n }, { passive: false });\n}\n","//# HEADER\nconst header = pgs(document).querySelector(\"header\");\n\n//= HEADER\nfunction PGS_header(selectHeader = document) {\n\n if (!header) return;\n\n const headerElements = pgs(header).querySelectorAll(\"header-element\");\n\n if (!headerElements.length) return;\n\n headerElements.forEach(selectHeader => {\n\n //== ACTIVE MOBILE \n let menuAttivate = false;\n let childsWidthSAVE;\n\n function mobileActive(headerElement) {\n\n //=== header\n let style = window.getComputedStyle(headerElement);\n let padding = parseFloat(style.paddingLeft) + parseFloat(style.paddingRight);\n let gap = parseFloat(style.gap);\n let headerElementWidth = parseInt(headerElement.offsetWidth - padding);\n let childsWidth;\n\n if (menuAttivate) {\n childsWidth = childsWidthSAVE;\n } else {\n let childs = [];\n\n // Esclude l'area mobile dedicata e l'hamburger, poi misura i figli sempre visibili su desktop.\n Array.from(headerElement.children)\n .filter(el => !pgs(el).contains(\"header-element-onlyMobile\"))\n .forEach(child => {\n if (pgs(child).contains(\"header-element-hamburger\")) return;\n childs.push(...child.children);\n });\n\n gap = Math.round(gap * (childs.length - 1));\n let childsReduce = childs.reduce((totalWidth, child) => totalWidth + child.offsetWidth, 0) - 2;\n\n childsWidth = childsReduce + gap;\n }\n\n //===set data\n if (window.innerWidth < 600) {\n pgs(header).state.add(\"mobileActive\");\n pgs(selectHeader).state.add(\"mobileActive\");\n } else if (headerElementWidth < childsWidth) {\n pgs(header).state.add(\"mobileActive\");\n pgs(headerElement).state.add(\"mobileActive\");\n menuAttivate = true;\n childsWidthSAVE = childsWidth;\n } else {\n pgs(header).state.remove(\"mobileActive\");\n pgs(headerElement).state.remove(\"mobileActive\");\n }\n }\n\n //== observer (throttled to avoid ResizeObserver loop warnings)\n let resizeRafId = 0;\n const scheduleMobileActive = () => {\n if (resizeRafId) return;\n resizeRafId = requestAnimationFrame(() => {\n resizeRafId = 0;\n mobileActive(selectHeader);\n });\n };\n\n let observer = new ResizeObserver(scheduleMobileActive);\n observer.observe(selectHeader);\n scheduleMobileActive();\n });\n\n // Ripristina la posizione dell'header quando si esce dalla modalità mobile\n window.addEventListener(\"resize\", () => {\n if (window.innerWidth > 768) header.style.transform = \"translateY(0)\";\n });\n}\nPGS_header();\n\n\n//= HEADER HEIGHT\nfunction headerHeight() {\n if (!header) return;\n const wordPressBar = window.getComputedStyle(document.documentElement).marginTop ?? 0;\n const headerHeight = header.offsetHeight\n const height = headerHeight + parseInt(wordPressBar);\n const scrollHeight = document.querySelector(\"header\").getAttribute(\"data-header-scroll\") === \"true\" ? 0 : height;\n\n document.documentElement.style.setProperty(\"--heightOfHeader\", `${height}px`);\n document.documentElement.style.setProperty(\"--heightOfHeaderScroll\", `${scrollHeight}px`);\n}\n\n// Il modulo può essere caricato nel footer: rimanda il primo calcolo al frame\n// successivo, quando il browser ha già composto l'header, senza aspettare il\n// caricamento completo della pagina.\nlet headerHeightRafId = 0;\nfunction scheduleHeaderHeight() {\n if (headerHeightRafId) return;\n\n headerHeightRafId = requestAnimationFrame(() => {\n headerHeightRafId = 0;\n headerHeight();\n });\n}\n\nif (header) {\n const headerHeightObserver = new ResizeObserver(scheduleHeaderHeight);\n headerHeightObserver.observe(header);\n\n // Un font web può modificare la larghezza del menu e quindi l'altezza\n // dell'header, anche dopo il primo frame.\n document.fonts?.ready?.then(scheduleHeaderHeight);\n}\n\nscheduleHeaderHeight();\nwindow.addEventListener(\"resize\", scheduleHeaderHeight);\nwindow.addEventListener(\"scroll\", scheduleHeaderHeight, { passive: true });\n\n\n\n\n//= SCROLL\n// Nasconde l'header quando si scorre verso il basso e lo mostra quando si scorre verso l'alto su dispositivi con larghezza fino a 900px.\nlet lastScrollY = window.scrollY;\nwindow.addEventListener(\"scroll\", () => {\n if (!header) return;\n let currentScrollY = window.scrollY;\n\n if (window.innerHeight <= 900) {\n if (currentScrollY >= 80) {\n if (currentScrollY > lastScrollY) {\n header.style.transform = \"translateY(-100%)\";\n header.setAttribute(\"data-header-scroll\", true)\n } else {\n header.style.transform = \"translateY(0px)\";\n header.setAttribute(\"data-header-scroll\", false)\n }\n } else {\n header.style.transform = \"translateY(0)\"; // Mostra sempre l'header se il scroll è inferiore a 80px\n header.setAttribute(\"data-header-scroll\", false)\n }\n }\n lastScrollY = currentScrollY;\n\n});\n\n","const STORAGE_KEY = 'pgs_cookie_preferences_v1';\nconst focusableSelectors = 'a[href], button:not([disabled]), input:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n//+ \nfunction safeJsonParse(value) {\n try {\n return value ? JSON.parse(value) : null;\n } catch (error) {\n console.warn('PGS cookie consent: impossibile leggere le preferenze', error);\n return null;\n }\n}\n\n//+ \nfunction readPreferences() {\n try {\n return safeJsonParse(localStorage.getItem(STORAGE_KEY));\n } catch (error) {\n return null;\n }\n}\n\n//+ \nfunction savePreferences(prefs) {\n try {\n localStorage.setItem(\n STORAGE_KEY,\n JSON.stringify({ ...prefs, updatedAt: new Date().toISOString() })\n );\n } catch (error) {\n console.warn('PGS cookie consent: impossibile salvare le preferenze', error);\n }\n}\n\n//+ \nfunction bootstrapGtag() {\n window.dataLayer = window.dataLayer || [];\n window.gtag = window.gtag || function gtag() {\n window.dataLayer.push(arguments);\n };\n}\n\n//+ \nfunction loadGoogleAnalytics(measurementId) {\n if (!measurementId || window.__PGS_gaLoaded) return;\n window.__PGS_gaLoaded = true;\n\n const script = document.createElement('script');\n script.async = true;\n script.src = `https://www.googletagmanager.com/gtag/js?id=${measurementId}`;\n document.head.appendChild(script);\n\n window.gtag('js', new Date());\n window.gtag('config', measurementId, {\n anonymize_ip: true,\n allow_google_signals: false,\n });\n}\n\n//+ \nfunction applyAnalyticsConsent({ allowAnalytics, measurementId }) {\n bootstrapGtag();\n if (allowAnalytics) {\n window.gtag('consent', 'update', { analytics_storage: 'granted' });\n loadGoogleAnalytics(measurementId);\n } else {\n window.gtag('consent', 'update', { analytics_storage: 'denied' });\n }\n}\n\n//+\nfunction setPgsFlag(element, token, enabled) {\n if (!(element instanceof HTMLElement) || !token) return;\n const current = (element.getAttribute('pgs') || '').split(/\\s+/).filter(Boolean);\n const next = enabled ? [...new Set([...current, token])] : current.filter((item) => item !== token);\n if (next.length > 0) {\n element.setAttribute('pgs', next.join(' '));\n } else {\n element.removeAttribute('pgs');\n }\n}\n\n//+\nfunction assignCookieRuntimeAttributes({ root, analyticsToggle, acceptAllButton, rejectButton, openButtons }) {\n root.dataset.cookieComponent = 'consent';\n analyticsToggle?.setAttribute('data-cookie-toggle', 'analytics');\n acceptAllButton?.setAttribute('data-cookie-action', 'accept');\n rejectButton?.setAttribute('data-cookie-action', 'reject');\n\n root.querySelector('[pgs~=\"cookieConsent-featureEssential\"]')?.setAttribute('data-cookie-feature', 'essential');\n root.querySelector('[pgs~=\"cookieConsent-featureAnalytics\"]')?.setAttribute('data-cookie-feature', 'analytics');\n\n openButtons.forEach((button) => {\n button.setAttribute('data-cookie-action', 'open');\n });\n}\n\n//= CookieConsent\nfunction initCookieConsent() {\n const root = pgs(document).querySelector('cookieConsent');\n if (!root) return;\n\n const analyticsToggle = root.querySelector('[pgs~=\"cookieConsent-toggleAnalytics\"]');\n const acceptAllButton = root.querySelector('[pgs~=\"cookieConsent-actionAccept\"]');\n const rejectButton = root.querySelector('[pgs~=\"cookieConsent-actionReject\"]');\n const openButtons = document.querySelectorAll('[pgs~=\"cookieConsent-actionOpen\"]');\n const measurementId = (root.dataset.gaId || '').trim();\n const prefersGa = measurementId.length > 0;\n let lastFocusedElement = null;\n\n assignCookieRuntimeAttributes({ root, analyticsToggle, acceptAllButton, rejectButton, openButtons });\n\n if (analyticsToggle) {\n analyticsToggle.disabled = !prefersGa;\n if (!prefersGa) {\n analyticsToggle.checked = false;\n setPgsFlag(root, 'cookieConsent-gaUnavailable', true);\n } else {\n setPgsFlag(root, 'cookieConsent-gaUnavailable', false);\n }\n }\n\n bootstrapGtag();\n window.gtag('consent', 'default', { analytics_storage: 'denied' });\n\n function setBannerVisibility(show) {\n root.hidden = !show;\n root.setAttribute('aria-hidden', String(!show));\n document.body.classList.toggle('cookieConsent-open', show);\n if (show) {\n lastFocusedElement = document.activeElement;\n setTimeout(() => {\n root.focus();\n }, 0);\n } else if (lastFocusedElement instanceof HTMLElement) {\n lastFocusedElement.focus({ preventScroll: true });\n }\n }\n\n function closeBanner() {\n setBannerVisibility(false);\n }\n\n function openBanner() {\n setBannerVisibility(true);\n }\n\n function persistAndApply(allowAnalytics) {\n savePreferences({ analytics: allowAnalytics });\n setPgsFlag(root, 'cookieConsent-accepted', !!allowAnalytics);\n setPgsFlag(root, 'cookieConsent-declined', !allowAnalytics);\n applyAnalyticsConsent({ allowAnalytics: !!allowAnalytics, measurementId });\n }\n\n acceptAllButton?.addEventListener('click', () => {\n if (analyticsToggle && prefersGa) analyticsToggle.checked = true;\n persistAndApply(!!prefersGa);\n closeBanner();\n });\n\n rejectButton?.addEventListener('click', () => {\n const allowAnalytics = analyticsToggle ? analyticsToggle.checked && prefersGa : false;\n if (!allowAnalytics && analyticsToggle) analyticsToggle.checked = false;\n persistAndApply(allowAnalytics);\n closeBanner();\n });\n\n analyticsToggle?.addEventListener('change', (event) => {\n if (!prefersGa && event.target instanceof HTMLInputElement) {\n event.target.checked = false;\n }\n });\n\n root.addEventListener('keydown', (event) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n closeBanner();\n } else if (event.key === 'Tab') {\n const focusables = root.querySelectorAll(focusableSelectors);\n if (focusables.length === 0) return;\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n }\n }\n });\n\n openButtons.forEach((button) => {\n button.addEventListener('click', (event) => {\n event.preventDefault();\n openBanner();\n });\n });\n\n const savedPrefs = readPreferences();\n if (savedPrefs && typeof savedPrefs.analytics === 'boolean') {\n if (analyticsToggle) analyticsToggle.checked = !!savedPrefs.analytics && prefersGa;\n persistAndApply(savedPrefs.analytics && prefersGa);\n closeBanner();\n } else {\n setBannerVisibility(true);\n }\n}\n\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initCookieConsent);\n} else {\n initCookieConsent();\n}\n","// The module cache\nconst __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tconst cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tconst module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\tif (!(moduleId in __webpack_modules__)) {\n\t\tdelete __webpack_module_cache__[moduleId];\n\t\tconst e = new Error(\"Cannot find module '\" + moduleId + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tconst getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter/value functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tif(Array.isArray(definition)) {\n\t\tvar i = 0;\n\t\twhile(i < definition.length) {\n\t\t\tvar key = definition[i++];\n\t\t\tvar binding = definition[i++];\n\t\t\tif(!__webpack_require__.o(exports, key)) {\n\t\t\t\tif(binding === 0) {\n\t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, value: definition[i++] });\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: binding });\n\t\t\t\t}\n\t\t\t} else if(binding === 0) { i++; }\n\t\t}\n\t} else {\n\t\tfor(var key in definition) {\n\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t\t}\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","//= PGS\nimport { pgs } from \"./_pgs.js\";\nexport { pgs } from \"./_pgs.js\";\n\n//= BASE\nimport \"./base/_darkmode.js\";\nimport \"./base/_svg.js\";\nimport \"./base/_object.js\";\n\n//= CN \nimport \"./components/_accordion.js\";\nimport \"./components/_dropdown.js\";\nimport \"./components/_menu.js\"\nimport \"./components/_modals.js\";\nimport \"./components/_search.js\";\nimport \"./components/_slides.js\"\nimport \"./components/_steps.js\";\nimport \"./components/_stepTabs.js\";\nimport \"./components/_summary.js\";\nimport \"./components/_notifications.js\";\n\n//= IMPORT REGISTRY\nimport \"./_imports.js\";\n\n//= LAYOUT \nimport \"./layout/_header.js\";\n\n//= PATTERNS \nimport \"./patterns/_cookieConsent.js\";\n"],"names":[],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"index.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAgC;;AAES;AACkB;AACF;AACR;AACG;AACc;AACb;AACA;AACI;AACN;AACI;AACS;AACD;;AAE/D,wCAAG;AACH,SAAS,iDAAO;AAChB,eAAe,mEAAa;AAC5B,cAAc,iEAAY;AAC1B,UAAU,yDAAQ;AAClB,WAAW,4DAAS;AACpB,kBAAkB,0EAAgB;AAClC,YAAY,6DAAU;AACtB,YAAY,6DAAU;AACtB,cAAc,iEAAY;AAC1B,WAAW,4DAAS;AACpB,aAAa,gEAAW;AACxB,kBAAkB,yEAAgB;AAClC,sBAAsB,wEAAoB;AAC1C,CAAC;;;;;;;;;;;;;;;;AC9BD;AACA,WAAW,oBAAoB;AAC/B;AACO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,mCAAmC,wBAAwB,IAAI,WAAW;AAC1E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,KAAK,KAAK,EAAE;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,sCAAsC;AAC1D,qBAAqB;AACrB,SAAS;;AAET;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa;;AAEb;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,0DAA0D;;AAE1D,0CAA0C,QAAQ;AAClD;AACA;;AAEA;AACA;AACA,0DAA0D;;AAE1D;AACA,uCAAuC,QAAQ;AAC/C;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,8BAA8B,UAAU,GAAG,qBAAqB;AAChE;;AAEA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,sCAAsC;AAC1D,qBAAqB;AACrB,SAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA,4CAA4C;AAC5C;AACA;AACA;;AAEA;AACA;AACA,uDAAuD,IAAI;AAC3D;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;;AAEA,4DAA4D,KAAK;;AAEjE;AACA;AACA,KAAK,IAAI;AACT;;AAEA;;;;;;;;;;;ACjVA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,qEAAqE,UAAU,cAAc;AAC7F;;;;AAIA;AACA;AACA;;AAEA;AACA;AACA;AACA,CAAC;;;;;;;;;;;AC1CD;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;;AAEb;AACA;AACA;;AAEA;AACA,kDAAkD,YAAY;AAC9D,KAAK;;AAEL;AACA,CAAC;;;;;;;;;;;;;;;;ACzCD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA,wBAAwB,QAAQ;AAChC;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;;AAET,KAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT,KAAK;AACL;;AAEA;;AAEO;AACP;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACtGA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,iCAAiC,GAAG;AACpC,qCAAqC,GAAG;;AAExC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,4BAA4B,EAAE,kBAAkB;AACjG;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,qEAAqE,qCAAqC;AAC1G;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;;;;;;;;;;;;;;;;AC5HA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,YAAY,mBAAmB;AAC/B,YAAY,cAAc;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,oDAAoD,iBAAiB;AACrE,mDAAmD,gBAAgB;AACnE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,sDAAsD,GAAG;AACzD,wDAAwD,GAAG;;AAE3D;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,CAAC;;AAED;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;;;;;;;;;;;;;;;;;AChN2C;;AAE3C;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,iDAAiD;AACjD;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,QAAQ,mDAAY;AACpB,KAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA;AACO;AACP;AACA;AACA;;;;;;;;;;;;;;;;ACrDA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,SAAS;AACrB;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,6CAA6C,UAAU;AACvD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,8CAA8C,UAAU;AACxD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,kEAAkE,oBAAoB;AACtF;AACA;;;AAGA;AACA,iEAAiE,QAAQ;AACzE,4HAA4H,QAAQ;;AAEpI;AACA,iEAAiE,QAAQ;AACzE,4CAA4C,gEAAgE,IAAI,QAAQ;AACxH,kEAAkE,QAAQ;;AAE1E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,kBAAkB;AACvE,2CAA2C,qCAAqC;AAChF,cAAc;AACd,SAAS;AACT,0CAA0C,6CAA6C;;AAEvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd,SAAS,IAAI,QAAQ;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;;;;;;;;;;;;;;;;AC1LA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA,KAAK;;AAEL;AACA,wFAAwF;;AAExF;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;AACA,2EAA2E,UAAU;;AAErF;AACA,qDAAqD,UAAU;AAC/D;AACA,uDAAuD,YAAY;AACnE;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,MAAM,KAAK,KAAK;AACpD;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C,sBAAsB;;AAElE;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,mCAAmC;AACnC,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;;;;;;;;;;;;;;;AC3KA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,yBAAyB,mDAAmD;AAC5E;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,+CAA+C;AAC/C,mBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,kDAAkD,GAAG;AACrD,sDAAsD,GAAG;;AAEzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,wBAAwB;AACxB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA;AACA,wCAAwC,kBAAkB;AAC1D,cAAc;AACd;AACA;AACA;;AAEA;AACA;;AAEA;AACA,kCAAkC,wBAAwB;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,+BAA+B,QAAQ,UAAU,MAAM;AACvD;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAa;;AAEb;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA,8BAA8B,+BAA+B;AAC7D,iBAAiB;AACjB;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,6BAA6B;AAC7B,wEAAwE,uBAAuB;AAC/F;;AAEA;AACA;AACA;AACA;;AAEA,2CAA2C;AAC3C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6CAA6C,QAAQ;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,KAAK;AACL,CAAC;;AAED;;AAEA;AACA;AACA;;AAEO;AACP;AACA;AACA;;;;;;;;;;;;;;;;;ACtYgE;AAChE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,0DAA0D,uBAAuB,IAAI;AACvG;AACA;;AAEA;AACA,oCAAoC,aAAa;AACjD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6DAA6D,UAAU;AACvE,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,sBAAsB,qBAAqB;AAC3C;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qBAAqB;AAC3C;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sFAAsF,eAAe;AACrG;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,SAAS;;AAEzB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,cAAc,2EAAoB;;AAElC;AACA,yGAAyG,QAAQ;AACjH,4EAA4E,uBAAuB;AACnG,wEAAwE,uBAAuB;;AAE/F;AACA;AACA;AACA,cAAc;AACd;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,0CAA0C,SAAS;AACnD;AACA,KAAK;AACL;;AAEA;;AAEA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;;;;;;;;;;;;;;;;AClOA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsD,UAAU;;AAEhE;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,6CAA6C,oCAAoC;AACjF;;AAEA,0EAA0E,UAAU,kBAAkB;AACtG;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,2DAA2D,mDAAmD;;AAE9G;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,gEAAgE,eAAe;;AAE/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,+BAA+B,gBAAgB;AAC/C,SAAS;AACT,KAAK;AACL;;AAEA;;AAEA;AACA;AACA;;AAEO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA,qDAAqD,UAAU,WAAW;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D,UAAU,uBAAuB;AAC/F;AACA;AACA,8DAA8D,UAAU,wBAAwB;AAChG;AACA;AACA,sDAAsD,UAAU,wCAAwC;AACxG;;;;;;;;;;;;;;;;ACxKA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;;;;;;;;;;;;;;;;ACpDA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,2DAA2D,GAAG;AAC9D;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,yEAAyE,WAAW;AACpF;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,qDAAqD,eAAe;;AAEpE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;;;;;;;;;;;;;;;;;;ACxGiC;AACkC;;;AAG5D;AACP;AACA;;AAEA,kCAAkC;AAClC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;;AAEA,0BAA0B;AAC1B;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,8CAA8C;AAC9C,SAAS;AACT;AACA,iCAAiC,4CAA4C;AAC7E;AACA,+BAA+B,4CAA4C;AAC3E;AACA,8BAA8B;AAC9B;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ,4CAAG;AACX;;AAEA;;AAEA;AACA,YAAY,0EAAgB;AAC5B;AACA;;AAEA,wBAAwB,4CAAG;AAC3B,QAAQ,0EAAgB;AACxB;;AAEA;AACA;AACA,QAAQ,4CAAG;AACX;;AAEA;AACA;AACA,uEAAuE,0EAAgB;AACvF;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,sCAAsC;;AAEtC;AACA;;AAEA;AACA;;AAEA;AACA;AACA,YAAY,4CAAG;AACf;AACA,UAAU;AACV,YAAY,4CAAG;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACnQO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,4CAA4C;AAC5C,2CAA2C;AAC3C;;AAEA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,0BAA0B;AAC1B;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,iDAAiD,gBAAgB;AACjE;AACA;;;;;;;;;;;AC5EA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;;AAErB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;AACL;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sEAAsE,OAAO;AAC7E,4EAA4E,aAAa;AACzF;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,0DAA0D,eAAe;;;;;AAKzE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,UAAU;AACV,sDAAsD;AACtD;AACA;AACA;AACA;;AAEA,CAAC;;;;;;;;;;;;ACvJD;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,6BAA6B,+CAA+C;AAC5E;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,gEAAgE,cAAc;AAC9E;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA,iCAAiC,+BAA+B;AAChE;AACA;AACA,2CAA2C,8BAA8B;AACzE;AACA,MAAM;AACN,2CAA2C,6BAA6B;AACxE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA,yCAAyC,mEAAmE;AAC5G;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oCAAoC,mEAAmE;;AAEvG;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA,wCAAwC,6BAA6B;;AAErE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,UAAU;AACV,uCAAuC,qBAAqB;AAC5D;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,0BAA0B,2BAA2B;AACrD;AACA;AACA,gCAAgC,iDAAiD;AACjF;;AAEA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;;;;;;;UCtNA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;;;;;WC5BA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA,E;;;;;WCPA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,2CAA2C,0CAA0C;WACrF,MAAM;WACN,2CAA2C,gCAAgC;WAC3E;WACA,KAAK,yBAAyB;WAC9B;WACA,GAAG;WACH;WACA;WACA,0CAA0C,wCAAwC;WAClF;WACA;WACA;WACA,E;;;;;WCtBA,wF;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D,E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNA;AACgC;AACA;;AAEhC;AAC6B;AACL;AACG;;AAE3B;AACoC;AACD;AACL;AACG;AACA;AACD;AACA;AACG;AACD;AACM;;AAExC;AACuB;;AAEvB;AAC6B;;AAE7B;AACsC","sources":["webpack://mypgs/./assets/javascript/_imports.js","webpack://mypgs/./assets/javascript/_pgs.js","webpack://mypgs/./assets/javascript/base/_darkmode.js","webpack://mypgs/./assets/javascript/base/_object.js","webpack://mypgs/./assets/javascript/base/_svg.js","webpack://mypgs/./assets/javascript/components/_accordion.js","webpack://mypgs/./assets/javascript/components/_dropdown.js","webpack://mypgs/./assets/javascript/components/_menu.js","webpack://mypgs/./assets/javascript/components/_modals.js","webpack://mypgs/./assets/javascript/components/_notifications.js","webpack://mypgs/./assets/javascript/components/_search.js","webpack://mypgs/./assets/javascript/components/_slides.js","webpack://mypgs/./assets/javascript/components/_stepTabs.js","webpack://mypgs/./assets/javascript/components/_steps.js","webpack://mypgs/./assets/javascript/components/_summary.js","webpack://mypgs/./assets/javascript/functions/_formValidate.js","webpack://mypgs/./assets/javascript/functions/_scrollY.js","webpack://mypgs/./assets/javascript/layout/_header.js","webpack://mypgs/./assets/javascript/patterns/_cookieConsent.js","webpack://mypgs/webpack/bootstrap","webpack://mypgs/webpack/runtime/compat get default export","webpack://mypgs/webpack/runtime/define property getters","webpack://mypgs/webpack/runtime/hasOwnProperty shorthand","webpack://mypgs/webpack/runtime/make namespace object","webpack://mypgs/./assets/javascript/index.js"],"sourcesContent":["import { pgs } from \"./_pgs.js\";\n\nimport { PGS_svg } from \"./base/_svg.js\";\nimport { PGS_accordion } from \"./components/_accordion.js\";\nimport { PGS_dropdown } from \"./components/_dropdown.js\";\nimport { PGS_menu } from \"./components/_menu.js\";\nimport { PGS_modal } from \"./components/_modals.js\";\nimport { PGS_notification } from \"./components/_notifications.js\";\nimport { PGS_search } from \"./components/_search.js\";\nimport { PGS_slides } from \"./components/_slides.js\";\nimport { PGS_stepTabs } from \"./components/_stepTabs.js\";\nimport { PGS_steps } from \"./components/_steps.js\";\nimport { PGS_summary } from \"./components/_summary.js\";\nimport { PGS_formValidate } from \"./functions/_formValidate.js\";\nimport { PGS_scrollHorizontal } from \"./functions/_scrollY.js\";\n\npgs.registerModules({\n svg: PGS_svg,\n accordion: PGS_accordion,\n dropdown: PGS_dropdown,\n menu: PGS_menu,\n modal: PGS_modal,\n notification: PGS_notification,\n search: PGS_search,\n slides: PGS_slides,\n stepTabs: PGS_stepTabs,\n steps: PGS_steps,\n summary: PGS_summary,\n formValidate: PGS_formValidate,\n scrollHorizontal: PGS_scrollHorizontal,\n});\n","/**\n * @param {Element | Document} root\n*/\nexport function pgs(root) {\n const ATTR = \"pgs\";\n if (!root) throw new TypeError(\"pgs(root): root richiesto\");\n\n const canAttr = typeof root.getAttribute === \"function\" && typeof root.setAttribute === \"function\";\n const canQuery = typeof root.querySelector === \"function\" && typeof root.querySelectorAll === \"function\";\n\n if (!canQuery) {\n throw new TypeError(\"pgs(root): root deve supportare querySelector/querySelectorAll\");\n }\n\n //+\n function attrOnlyForElements(methodName) {\n throw new TypeError(`pgs(${root.nodeName || \"root\"}).${methodName}(): disponibile solo su Element (non su Document)`);\n };\n\n //+\n function concactSelector(value) {\n if (Array.isArray(value)) value = value.join(\",\");\n return String(value)\n .split(\",\")\n .map(v => v.trim())\n .filter(Boolean)\n .map(v => `[${ATTR}~=\"${v}\"]`)\n .join(\",\");\n }\n\n //+\n function getValues(el, separator = \" \") {\n return (el.getAttribute(ATTR) || \"\")\n .split(separator)\n .filter(Boolean);\n }\n\n //+\n function setValues(el, values, separator = \" \") {\n el.setAttribute(ATTR, values.join(separator));\n }\n\n //= BASE PGS \n function createBasePgs() {\n function api() {\n return api;\n }\n\n api.querySelector = function (value) {\n return root.querySelector(concactSelector(value));\n };\n\n api.querySelectorAll = function (value) {\n return root.querySelectorAll(concactSelector(value));\n };\n\n api.add = function (...values) {\n if (!canAttr) return attrOnlyForElements(\"add\");\n const current = getValues(root);\n for (const v of values) if (!current.includes(v)) current.push(v);\n setValues(root, current);\n return api;\n };\n\n api.remove = function (...values) {\n if (!canAttr) return attrOnlyForElements(\"remove\");\n setValues(root, getValues(root).filter(v => !values.includes(v)));\n return api;\n };\n\n api.toggle = function (value, force) {\n if (!canAttr) return attrOnlyForElements(\"toggle\");\n\n const exists = getValues(root).includes(value);\n\n if (force !== undefined) {\n if (force && !exists) api.add(value);\n if (!force && exists) api.remove(value);\n return !!force;\n }\n\n if (exists) {\n api.remove(value);\n return false;\n }\n\n api.add(value);\n return true;\n };\n\n api.contains = function (value) {\n if (!canAttr) return attrOnlyForElements(\"contains\");\n return getValues(root).includes(value);\n };\n\n Object.defineProperty(api, \"value\", {\n get() {\n if (!canAttr) return undefined;\n return root.getAttribute(ATTR);\n },\n set(v) {\n if (!canAttr) return attrOnlyForElements(\"value\");\n root.setAttribute(ATTR, v);\n }\n });\n\n return api;\n }\n\n //= STATE\n function createState(attribute) {\n if (!canAttr) return undefined;\n\n const read = (sep = \" \") =>\n (root.getAttribute(attribute) || \"\").split(sep).filter(Boolean);\n\n const write = (vals, sep = \" \") =>\n root.setAttribute(attribute, vals.join(sep));\n\n // funzione chiamabile: state(\"active\") == add(\"active\")\n function api(...values) {\n api.add(...values);\n return api;\n }\n\n api.add = function (...values) {\n const toAdd = values.flat().map(v => String(v).trim()).filter(Boolean);\n const current = read();\n for (const v of toAdd) if (!current.includes(v)) current.push(v);\n write(current);\n return api;\n };\n\n api.remove = function (...values) {\n const toRemove = values.flat().map(v => String(v).trim()).filter(Boolean);\n const current = read().filter(v => !toRemove.includes(v));\n write(current);\n return api;\n };\n\n api.toggle = function (value, force) {\n const v = String(value).trim();\n if (!v) return false;\n const current = read();\n const exists = current.includes(v);\n\n if (force !== undefined) {\n if (force && !exists) {\n current.push(v);\n write(current);\n }\n\n if (!force && exists) {\n write(current.filter(x => x !== v));\n }\n\n return !!force;\n }\n\n if (exists) {\n write(current.filter(x => x !== v));\n return false;\n }\n \n current.push(v);\n write(current);\n return true;\n };\n\n api.contains = function (value) {\n const v = String(value).trim();\n if (!v) return false;\n return read().includes(v);\n };\n\n Object.defineProperty(api, \"value\", {\n get() { return root.getAttribute(attribute); },\n set(v) { root.setAttribute(attribute, v); }\n });\n\n return api;\n }\n\n //= OPTION\n function createOption(attribute) {\n if (!canAttr) return undefined;\n\n const read = () => (root.getAttribute(attribute) || \"\").match(/[^\\s[\\]]+(?:\\[[^\\]]*\\])?/g) || [];\n const write = values => root.setAttribute(attribute, values.join(\" \"));\n const getKey = value => String(value).trim().match(/^[^\\s[\\]]+/)?.[0] || \"\";\n const getValues = values => values\n .flat()\n .flatMap(value => String(value).match(/[^\\s[\\]]+(?:\\[[^\\]]*\\])?/g) || [])\n .filter(Boolean);\n\n function api() {\n return api;\n }\n\n api.add = function (...values) {\n const current = read();\n\n getValues(values).forEach(value => {\n if (!current.includes(value)) current.push(value);\n });\n\n write(current);\n return api;\n };\n\n api.remove = function (...values) {\n const keys = getValues(values).map(getKey).filter(Boolean);\n write(read().filter(value => !keys.includes(getKey(value))));\n return api;\n };\n\n api.toggle = function (value, force) {\n const key = getKey(value);\n if (!key) return false;\n\n const exists = api.contains(key);\n\n if (force !== undefined) {\n if (force && !exists) api.add(value);\n if (!force && exists) api.remove(key);\n return !!force;\n }\n\n if (exists) {\n api.remove(key);\n return false;\n }\n\n api.add(value);\n return true;\n };\n\n api.contains = function (key) {\n const source = root.getAttribute(attribute) || \"\";\n const safeKey = String(key).replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n return new RegExp(`(?:^|\\\\s)${safeKey}(?:\\\\[[^\\\\]]*\\\\])?(?=\\\\s|$)`)\n .test(source);\n };\n\n api.getValueBrackets = function (key) {\n const source = root.getAttribute(attribute) || \"\";\n const safeKey = String(key).replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n const match = source.match(\n new RegExp(`(?:^|\\\\s)${safeKey}\\\\[([^\\\\]]*)\\\\]`)\n );\n\n return match ? match[1] : undefined;\n };\n\n api.setValueBrackets = function (key, value = \"\") {\n const optionKey = getKey(key);\n if (!optionKey) return api;\n\n const option = `${optionKey}[${String(value).trim()}]`;\n const options = read().filter(item => getKey(item) !== optionKey);\n\n options.push(option);\n write(options);\n return api;\n };\n\n Object.defineProperty(api, \"value\", {\n get() { return root.getAttribute(attribute); },\n set(v) { root.setAttribute(attribute, v); }\n });\n\n return api;\n }\n\n //# RETURN \n const api = createBasePgs();\n api.state = createState(\"pgs-state\");\n api.option = createOption(\"pgs-option\");\n return api;\n}\n\nconst PGS_IMPORTS = {};\n\nfunction registerImportModule(name, module) {\n const key = String(name || \"\").trim().replace(/^pgs[_-\\s]*/i, \"\").toLowerCase();\n\n if (!key) throw new TypeError(\"pgs.registerImport(...modules): ogni modulo deve avere name o PGS_name\");\n\n PGS_IMPORTS[key] = {\n name,\n module\n };\n}\n\npgs.registerImport = function (...modules) {\n modules.flat().forEach(item => {\n if (item && typeof item === \"object\" && !item.PGS_name && !item.name) {\n Object.entries(item).forEach(([name, module]) => registerImportModule(name, module));\n return;\n }\n\n registerImportModule(item?.PGS_name || item?.name, item);\n });\n\n return pgs;\n};\n\npgs.registerModules = function (modules = {}) {\n Object.entries(modules).forEach(([name, module]) => {\n const key = String(name || \"\").trim();\n if (!key) return;\n\n const hasOwn = Object.prototype.hasOwnProperty.call(pgs, key);\n if (hasOwn && pgs[key] !== module) {\n throw new Error(`pgs.registerModules(): \"${key}\" e' gia' definito su pgs`);\n }\n\n pgs[key] = module;\n });\n\n return pgs;\n};\n\npgs.import = function (...names) {\n return names.flat().reduce((imports, name) => {\n const key = String(name || \"\").trim().replace(/^pgs[_-\\s]*/i, \"\").toLowerCase();\n const item = PGS_IMPORTS[key];\n\n if (!item) throw new Error(`pgs.import(): modulo \"${name}\" non registrato`);\n\n imports[item.name] = item.module;\n return imports;\n }, {});\n};\n\nglobalThis.pgs ??= pgs;\n","//# DARKMODE\n\nconst EVENT_SVG_CHANGE_COLOR = \"pgs:svg:changeColor\";\n\n//+ CHANGE ICON\nfunction changeIcon(selector, isDarkMode) {\n selector.forEach(button => {\n const ICON = button.querySelector(\"i\");\n if (!ICON) return;\n\n ICON.classList.toggle(\"fa-moon\", !isDarkMode);\n ICON.classList.toggle(\"fa-sun\", isDarkMode);\n });\n}\n\n//+ SET STATUS\nfunction setDarkmodeStatus(toggle = false, button) {\n let isDarkMode = localStorage.getItem(\"screenIsDarkMode\") === \"true\";\n\n if (toggle) {\n isDarkMode = !isDarkMode;\n localStorage.setItem(\"screenIsDarkMode\", isDarkMode);\n }\n\n // SET\n pgs(document.documentElement).state.toggle(\"darkmode\", isDarkMode);\n pgs(document.body).state.toggle(\"darkmode\", isDarkMode);\n // END SET\n\n changeIcon(button, isDarkMode);\n document.dispatchEvent(new CustomEvent(EVENT_SVG_CHANGE_COLOR, { detail: { isDarkMode } }));\n}\n\n\n\n//= INIT\nconst toggleDarkmode = pgs(document).querySelectorAll(\"toggleDarkmode\");\nsetDarkmodeStatus(false, toggleDarkmode);\n\n//= BUTTON DARKMODE\ntoggleDarkmode.forEach(button => {\n button.addEventListener(\"click\", () => setDarkmodeStatus(true, toggleDarkmode));\n});\n","document.addEventListener('DOMContentLoaded', () => {\n const objects = document.querySelectorAll('object[type=\"image/svg+xml\"]');\n\n objects.forEach(obj => {\n function applyAspectRatio(svgDoc) {\n if (!svgDoc) return;\n const svg = svgDoc.querySelector(\"svg\");\n if (!svg) return;\n\n const computedStyle = window.getComputedStyle(obj);\n svg.setAttribute(\"preserveAspectRatio\", computedStyle.objectFit === 'cover' ? \"xMidYMid slice\" : \"xMidYMid meet\");\n }\n\n function init() {\n const svgDoc = obj.contentDocument;\n if (!svgDoc) return;\n\n const svg = svgDoc.querySelector('svg');\n if (!svg) return;\n\n applyAspectRatio(svgDoc);\n if (obj.__objectResizeObserver) return;\n\n let rafId = 0;\n const resizeObserver = new ResizeObserver(() => {\n if (rafId) return;\n rafId = requestAnimationFrame(() => {\n rafId = 0;\n applyAspectRatio(svgDoc);\n });\n });\n\n resizeObserver.observe(obj);\n obj.__objectResizeObserver = resizeObserver;\n }\n\n if (obj.contentDocument && obj.contentDocument.querySelector('svg')) init();\n else obj.addEventListener('load', init, { once: true });\n });\n\n document.body.classList.add(\"object-loaded\");\n});\n","//# SVG & LOTTIE COLORS\n\nconst svgColors = {\n eventChangeColor: \"pgs:svg:changeColor\",\n watchedObjects: new WeakSet(),\n watchedLotties: new WeakSet(),\n\n _normalizeColor: (color = \"\") => {\n return color.replace(/\\s/g, \"\").toLocaleLowerCase();\n },\n\n _getCurrentDarkmode: () => {\n return pgs(document.documentElement).state.contains(\"darkmode\");\n },\n\n searchColor(type = \"svg\") {\n const ROOT = getComputedStyle(document.documentElement);\n const colors = [];\n\n for (let I = 0; I < 20; I++) {\n const color = ROOT.getPropertyValue(\"--\" + type + \"-color-\" + I).toLocaleLowerCase().split(\"&\").map(value => value.trim());\n if (color[0] && color[1]) colors.push([color[0], color[1]]);\n }\n\n return colors;\n },\n\n _changeColor(svgDoc, isDarkMode, colors) {\n if (!svgDoc) return;\n\n svgDoc.querySelectorAll(\"[fill], [stroke]\").forEach(fillStroke => {\n for (const color of colors) {\n const OLD = svgColors._normalizeColor(color[0]);\n const NEW = svgColors._normalizeColor(color[1]);\n\n [\"fill\", \"stroke\"].forEach(attr => {\n const current = svgColors._normalizeColor(fillStroke.getAttribute(attr) || \"\");\n if (!current) return;\n\n fillStroke.style.transition = \"fill 0.5s ease, stroke 0.5s ease\";\n\n if (isDarkMode && current === OLD) fillStroke.setAttribute(attr, NEW);\n if (!isDarkMode && current === NEW) fillStroke.setAttribute(attr, OLD);\n });\n }\n });\n },\n\n _getLottieSvg(lottiePlayer) {\n return lottiePlayer.shadowRoot?.querySelector(\"svg\") || null;\n },\n\n init() {\n document.addEventListener(svgColors.eventChangeColor, event => {\n svgColors.applyColorsSVG(event.detail?.isDarkMode ?? svgColors._getCurrentDarkmode());\n svgColors.applyColorsLottie(event.detail?.isDarkMode ?? svgColors._getCurrentDarkmode());\n });\n\n document.addEventListener(\"DOMContentLoaded\", () => {\n svgColors.applyColorsSVG();\n svgColors.applyColorsLottie();\n });\n },\n\n applyColorsSVG(isDarkMode = svgColors._getCurrentDarkmode()) {\n const colorsSvg = svgColors.searchColor(\"svg\");\n\n if (!pgs(document).querySelector(\"svgChangeColor\")) return;\n\n document.querySelectorAll('object[type=\"image/svg+xml\"]').forEach(obj => {\n if (!svgColors.watchedObjects.has(obj)) {\n obj.addEventListener(\"load\", () => svgColors._changeColor(obj.contentDocument, svgColors._getCurrentDarkmode(), svgColors.searchColor(\"svg\")));\n svgColors.watchedObjects.add(obj);\n }\n\n if (obj.contentDocument) svgColors._changeColor(obj.contentDocument, isDarkMode, colorsSvg);\n });\n\n },\n\n applyColorsLottie(isDarkMode = svgColors._getCurrentDarkmode()) {\n const colorsLottie = svgColors.searchColor(\"svg\");\n\n if (!pgs(document).querySelector(\"lottieChangeColor\")) return;\n\n document.querySelectorAll(\"lottie-player\").forEach(lottiePlayer => {\n if (!svgColors.watchedLotties.has(lottiePlayer)) {\n lottiePlayer.addEventListener(\"load\", () => svgColors._changeColor(svgColors._getLottieSvg(lottiePlayer), svgColors._getCurrentDarkmode(), svgColors.searchColor(\"svg\")));\n svgColors.watchedLotties.add(lottiePlayer);\n }\n\n if (lottiePlayer.shadowRoot) svgColors._changeColor(svgColors._getLottieSvg(lottiePlayer), isDarkMode, colorsLottie);\n });\n },\n};\n\nsvgColors.init();\n\nexport const PGS_svg = {\n eventChangeColor: svgColors.eventChangeColor,\n applyColorsSVG: isDarkMode => svgColors.applyColorsSVG(isDarkMode),\n applyColorsLottie: isDarkMode => svgColors.applyColorsLottie(isDarkMode),\n};\n","//= ACCORDION\nconst API = new WeakMap();\nlet accordionId = 0;\n\nfunction nextAccordionId() {\n accordionId += 1;\n return accordionId;\n}\n\nfunction directPgsChild(element, token) {\n return Array.from(element.children).find(child => pgs(child).contains(token));\n}\n\nfunction PGS_accordion_init(root = document) {\n pgs(root).querySelectorAll(\"accordion\").forEach((accordion) => {\n if (API.has(accordion)) return;\n\n const BUTTON = directPgsChild(accordion, \"accordion-button\");\n const CONTENT = directPgsChild(accordion, \"accordion-content\");\n if (!BUTTON || !CONTENT) return;\n\n //== ID univoci per aria-controls / aria-labelledby\n const ID = nextAccordionId();\n const btnId = `acc-btn-${ID}`;\n const panelId = `acc-panel-${ID}`;\n\n //== Stato iniziale\n const isOpenInit = pgs(accordion).state.contains(\"open\");\n\n //== Accessibilità (setup una volta)\n BUTTON.setAttribute(\"role\", \"button\");\n BUTTON.setAttribute(\"tabindex\", \"0\");\n if (!BUTTON.id) BUTTON.setAttribute(\"id\", btnId);\n\n if (!CONTENT.id) CONTENT.setAttribute(\"id\", panelId);\n BUTTON.setAttribute(\"aria-controls\", CONTENT.id);\n CONTENT.setAttribute(\"role\", \"region\");\n CONTENT.setAttribute(\"aria-labelledby\", BUTTON.id);\n\n //+ Accessibility (applica stato aperto/chiuso)\n function accordionAccessibility(isOpen, button, content) {\n const text = (button?.textContent || \"\").trim().replace(/\\s+/g, \" \");\n button.setAttribute(\"aria-label\", `${isOpen ? \"Chiudi\" : \"Apri\"} ${text || \"sezione\"}`);\n button.setAttribute(\"aria-expanded\", String(isOpen));\n content.hidden = !isOpen;\n }\n\n //+ Chiudi tutti gli altri\n function closeOltherAccordion() {\n for (const otherLi of pgs(document).querySelectorAll(\"accordion\")) {\n if (otherLi === accordion) continue;\n\n const otherBtn = pgs(otherLi).querySelector(\"accordion-button\");\n const otherContent = pgs(otherLi).querySelector(\"accordion-content\");\n if (!otherBtn || !otherContent) continue;\n\n pgs(otherLi).state().remove(\"open\");\n accordionAccessibility(false, otherBtn, otherContent);\n }\n }\n\n //+ FN ACCORDION\n function accordionFunction() {\n const isOpen = pgs(accordion).state.contains(\"open\");\n const nowOpen = !isOpen;\n\n pgs(accordion).state.toggle(\"open\", nowOpen);\n accordionAccessibility(nowOpen, BUTTON, CONTENT);\n\n closeOltherAccordion();\n\n //== scroll to view\n if (nowOpen) setTimeout(() => accordion.scrollIntoView({ block: \"nearest\", inline: \"nearest\" }), 100);\n }\n\n function open() {\n if (!pgs(accordion).state.contains(\"open\")) accordionFunction();\n }\n\n function close() {\n if (pgs(accordion).state.contains(\"open\")) accordionFunction();\n }\n\n // applica stato iniziale\n accordionAccessibility(isOpenInit, BUTTON, CONTENT);\n\n //- Eventi\n BUTTON.addEventListener(\"click\", accordionFunction);\n\n //- Tastiera: Enter / Space\n BUTTON.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n accordionFunction();\n }\n });\n\n API.set(accordion, {\n element: accordion,\n button: BUTTON,\n content: CONTENT,\n open,\n close,\n toggle: accordionFunction,\n refresh: () => {\n PGS_accordion_init(accordion.parentNode || document);\n return API.get(accordion);\n },\n isOpen: () => pgs(accordion).state.contains(\"open\"),\n });\n });\n}\n\n//# INIT\nPGS_accordion_init();\n\n//# API\nfunction PGS_accordion_api(selector) {\n return API.get(selector);\n}\n\nexport const PGS_accordion = {\n init: PGS_accordion_init,\n api: PGS_accordion_api\n};\n","// + dropdown\nconst API = new WeakMap();\nconst OPEN_DROPDOWNS = new Set();\nconst VIEWPORT_GAP = 8;\nlet dropdownId = 0;\n\nfunction nextDropdownId() {\n dropdownId += 1;\n return dropdownId;\n}\n\nfunction isDropdownContent(element) {\n return element instanceof Element && pgs(element).contains(\"dropdown-content\");\n}\n\nfunction getDropdownTrigger(dropdown, content) {\n const children = Array.from(dropdown.children).filter(child => child !== content);\n const dropdownButton = children.find(child => pgs(child).contains(\"dropdown-button\"));\n\n return dropdownButton || children.find(child => !isDropdownContent(child)) || dropdown;\n}\n\nfunction getDropdownContent(dropdown) {\n return Array.from(dropdown.children).find(isDropdownContent) || pgs(dropdown).querySelector(\"dropdown-content\");\n}\n\nfunction getDropdowns(root) {\n const dropdowns = root instanceof Element && pgs(root).contains(\"dropdown\") ? [root] : [];\n dropdowns.push(...pgs(root).querySelectorAll(\"dropdown\"));\n return dropdowns;\n}\n\nfunction getposition(dropdown) {\n const option = pgs(dropdown).option;\n const optionValue = option.getValueBrackets(\"position\");\n const raw = (optionValue || \"bottom center\").trim().toLowerCase();\n const parts = raw.split(/\\s+/).filter(Boolean);\n const side = parts.find(part => [\"top\", \"right\", \"bottom\", \"left\"].includes(part)) || \"bottom\";\n const align = parts.find(part => [\"top\", \"right\", \"bottom\", \"left\", \"center\"].includes(part) && part !== side) || \"center\";\n\n return { side, align };\n}\n\nfunction clamp(value, min, max) {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction updateposition(dropdown) {\n const data = API.get(dropdown);\n if (!data || !data.isOpen()) return;\n\n const { trigger, content } = data;\n const { side, align } = getposition(dropdown);\n const triggerRect = trigger.getBoundingClientRect();\n const contentRect = content.getBoundingClientRect();\n const viewportWidth = document.documentElement.clientWidth;\n const maxLeft = Math.max(VIEWPORT_GAP, viewportWidth - contentRect.width - VIEWPORT_GAP);\n let left = triggerRect.left + (triggerRect.width - contentRect.width) / 2;\n let top = triggerRect.bottom + VIEWPORT_GAP;\n\n if (side === \"top\" || side === \"bottom\") {\n top = side === \"top\"\n ? triggerRect.top - contentRect.height - VIEWPORT_GAP\n : triggerRect.bottom + VIEWPORT_GAP;\n\n if (align === \"left\") left = triggerRect.left;\n if (align === \"right\") left = triggerRect.right - contentRect.width;\n }\n\n if (side === \"left\" || side === \"right\") {\n left = side === \"left\"\n ? triggerRect.left - contentRect.width - VIEWPORT_GAP\n : triggerRect.right + VIEWPORT_GAP;\n top = triggerRect.top + (triggerRect.height - contentRect.height) / 2;\n\n if (align === \"top\") top = triggerRect.top;\n if (align === \"bottom\") top = triggerRect.bottom - contentRect.height;\n }\n\n if (side === \"left\" && left < VIEWPORT_GAP) {\n left = triggerRect.right + VIEWPORT_GAP;\n }\n\n if (side === \"right\" && left + contentRect.width > viewportWidth - VIEWPORT_GAP) {\n left = triggerRect.left - contentRect.width - VIEWPORT_GAP;\n }\n\n left = clamp(left, VIEWPORT_GAP, maxLeft);\n\n content.style.setProperty(\"--dropdown-left\", `${Math.round(left)}px`);\n content.style.setProperty(\"--dropdown-top\", `${Math.round(top)}px`);\n}\n\nfunction updateOpenDropdowns() {\n OPEN_DROPDOWNS.forEach(updateposition);\n}\n\nfunction closeDropdown(dropdown) {\n const data = API.get(dropdown);\n if (!data || !data.isOpen()) return;\n\n pgs(dropdown).state.remove(\"open\");\n data.trigger.setAttribute(\"aria-expanded\", \"false\");\n OPEN_DROPDOWNS.delete(dropdown);\n}\n\nfunction openDropdown(dropdown) {\n const data = API.get(dropdown);\n if (!data || data.isOpen()) return;\n\n OPEN_DROPDOWNS.forEach(item => {\n if (item !== dropdown) closeDropdown(item);\n });\n\n pgs(dropdown).state.add(\"open\");\n data.trigger.setAttribute(\"aria-expanded\", \"true\");\n OPEN_DROPDOWNS.add(dropdown);\n updateposition(dropdown);\n}\n\nfunction toggleDropdown(dropdown) {\n const data = API.get(dropdown);\n if (!data) return;\n\n if (data.isOpen()) closeDropdown(dropdown);\n else openDropdown(dropdown);\n}\n\nfunction isInsideAnyDropdown(target) {\n return Array.from(OPEN_DROPDOWNS).some(dropdown => dropdown.contains(target));\n}\n\nfunction PGS_dropdown_init(root = document) {\n getDropdowns(root).forEach((DROPDOWN) => {\n if (API.has(DROPDOWN)) return;\n\n const CONTENT = getDropdownContent(DROPDOWN);\n if (!CONTENT) return;\n\n const TRIGGER = getDropdownTrigger(DROPDOWN, CONTENT);\n const id = nextDropdownId();\n\n if (!TRIGGER.id) TRIGGER.id = `dropdown-btn-${id}`;\n if (!CONTENT.id) CONTENT.id = `dropdown-panel-${id}`;\n\n if (TRIGGER.matches(\"button\") && !TRIGGER.hasAttribute(\"type\")) {\n TRIGGER.setAttribute(\"type\", \"button\");\n }\n\n TRIGGER.setAttribute(\"aria-haspopup\", \"true\");\n TRIGGER.setAttribute(\"aria-controls\", CONTENT.id);\n TRIGGER.setAttribute(\"aria-expanded\", String(pgs(DROPDOWN).state.contains(\"open\")));\n CONTENT.setAttribute(\"aria-labelledby\", TRIGGER.id);\n\n const data = {\n element: DROPDOWN,\n trigger: TRIGGER,\n content: CONTENT,\n open: () => openDropdown(DROPDOWN),\n close: () => closeDropdown(DROPDOWN),\n toggle: () => toggleDropdown(DROPDOWN),\n refresh: () => {\n PGS_dropdown_init(DROPDOWN.parentNode || document);\n updateposition(DROPDOWN);\n return API.get(DROPDOWN);\n },\n isOpen: () => pgs(DROPDOWN).state.contains(\"open\")\n };\n\n TRIGGER.addEventListener(\"click\", (event) => {\n if (isDropdownContent(event.target)) return;\n event.preventDefault();\n event.stopPropagation();\n toggleDropdown(DROPDOWN);\n });\n\n CONTENT.addEventListener(\"click\", event => event.stopPropagation());\n API.set(DROPDOWN, data);\n\n if (data.isOpen()) OPEN_DROPDOWNS.add(DROPDOWN);\n updateposition(DROPDOWN);\n });\n}\n\ndocument.addEventListener(\"click\", (event) => {\n if (isInsideAnyDropdown(event.target)) return;\n OPEN_DROPDOWNS.forEach(closeDropdown);\n});\n\ndocument.addEventListener(\"keydown\", (event) => {\n if (event.key !== \"Escape\") return;\n OPEN_DROPDOWNS.forEach(closeDropdown);\n});\n\nwindow.addEventListener(\"resize\", updateOpenDropdowns);\nwindow.addEventListener(\"scroll\", updateOpenDropdowns, true);\n\n// # INIT\nPGS_dropdown_init();\n\n// # API\nfunction PGS_dropdown_api(selector) {\n return API.get(selector);\n}\n\nexport const PGS_dropdown = {\n init: PGS_dropdown_init,\n api: PGS_dropdown_api\n};\n","import { PGS_dropdown } from \"./_dropdown\";\n\nconst API = new WeakMap();\n\n//= DROP DOWN MENU\nfunction PGS_menu_init(root = document) {\n\n pgs(root).querySelectorAll('menu').forEach(MENU => {\n if (API.has(MENU)) return;\n\n MENU.querySelectorAll('li').forEach(li => {\n const ul = li.querySelector(\"ul\");\n\n if (ul) {\n\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.innerHTML = \"<span>⏷</span>\";\n pgs(button).add(\"menu-buttonIcon\");\n li.querySelector(\"a\").insertAdjacentElement(\"afterend\", button);\n\n pgs(li).add(\"dropdown\")\n pgs(li).option.setValueBrackets(\"position\", \"bottom right\")\n pgs(button).add(\"dropdown-button\")\n pgs(button).add(\"buttonNohover\")\n pgs(ul).add(\"dropdown-content\")\n\n }\n });\n\n API.set(MENU, {\n element: MENU,\n type: \"horizontal\",\n refresh: () => {\n PGS_menu_init(MENU.parentNode || document);\n return API.get(MENU);\n },\n });\n PGS_dropdown.init(MENU);\n });\n\n}\n\nPGS_menu_init()\n\nfunction PGS_menu_api(selector) {\n return API.get(selector);\n}\n\n//# EXPORT\nexport const PGS_menu = {\n init: PGS_menu_init,\n api: PGS_menu_api\n};\n","//# MODAL\nconst API = new WeakMap();\n\nfunction getModals(root) {\n const modals = root instanceof Element && pgs(root).contains(\"modal\") ? [root] : [];\n modals.push(...pgs(root).querySelectorAll(\"modal\"));\n return modals;\n}\n\nfunction initializeModal(MODAL, existingDialog = null) {\n if (API.has(MODAL)) return;\n\n const BUTTON_OPEN = pgs(MODAL).querySelector(\"modal-button\");\n const DIALOG = existingDialog || MODAL.querySelector(\"dialog\");\n if (!BUTTON_OPEN || !DIALOG) return;\n const eventController = new AbortController();\n const { signal } = eventController;\n let historyObserver = null;\n let historyTimeout = null;\n\n //== SELECTOR\n const DOMButtonClose = '<button pgs=\"buttonClose modal-close\" type=\"button\" tabindex=\"0\" aria-label=\"Chiudi\"><i class=\"fa-solid fa-close\"></i></button>';\n const modalContentHeader = pgs(DIALOG).querySelector(\"modal-dialog-content-header\");\n\n\n //== OPTION ATTRIBUTES MODAL\n const disableBackdropClose = pgs(MODAL).option.contains(\"disableBackdropClose\");\n const data_history = pgs(MODAL).option.contains(\"history\");\n const data_container = pgs(MODAL).option.getValueBrackets(\"containerID\");\n const data_containerPGS = pgs(MODAL).option.getValueBrackets(\"containerPGS\");\n\n //== OPTION ATTRIBUTES DIALOG\n const topLevel = pgs(DIALOG).option.contains(\"topLevel\");\n\n\n //== BUTTON CLOSE\n if (!pgs(DIALOG).querySelector(\"modal-close\") && !pgs(MODAL).querySelector(\"modal-close\")) {\n if (modalContentHeader) modalContentHeader.insertAdjacentHTML(\"beforeend\", DOMButtonClose);\n else DIALOG.insertAdjacentHTML(\"beforeend\", DOMButtonClose);\n }\n const BUTTON_CLOSE = pgs(DIALOG).querySelector(\"modal-close\") || pgs(MODAL).querySelector(\"modal-close\");\n\n\n //== SET\n pgs(DIALOG).add(\"dialog modal-dialog\");\n\n //== BUTTON OPEN\n BUTTON_OPEN.setAttribute(\"role\", \"button\");\n BUTTON_OPEN.setAttribute(\"aria-label\", \"apri modale\");\n\n\n //== POSITION\n if (topLevel && !MODAL.contains(DIALOG)) MODAL.append(DIALOG);\n else if (!topLevel) {\n if (data_container) document.querySelector(\"#\" + data_container)?.append(DIALOG);\n else if (data_containerPGS) pgs(document).querySelector(data_containerPGS)?.append(DIALOG);\n else document.body.append(DIALOG);\n }\n\n\n //+ FN STATUS\n function statusModal(status = true) {\n BUTTON_OPEN?.setAttribute(\"aria-expanded\", status);\n DIALOG?.setAttribute(\"aria-expanded\", status);\n }\n\n //+ FN OPEN\n function openModal(e) {\n e?.stopImmediatePropagation();\n if (DIALOG.open) {\n closeModal(e);\n return;\n }\n\n if (!DIALOG.open) document.querySelectorAll(\"dialog[open]\").forEach((dlg) => dlg.close());\n statusModal(true);\n topLevel ? DIALOG.showModal() : DIALOG.show();\n // modalCustomEvents('modal:open', { event: e });\n MODAL.dispatchEvent(new CustomEvent('modal:open'));\n DIALOG.dispatchEvent(new CustomEvent('modal:open'));\n }\n\n //+ FN CLOSE\n function closeModal(e) {\n e?.stopImmediatePropagation()\n statusModal(false);\n DIALOG.close();\n // modalCustomEvents('modal:close', { event: e });\n MODAL.dispatchEvent(new CustomEvent('modal:close'));\n DIALOG.dispatchEvent(new CustomEvent('modal:close'));\n }\n\n function forceOpen(e) {\n if (!DIALOG.open) openModal(e);\n }\n\n function forceClose(e) {\n if (DIALOG.open) closeModal(e);\n }\n\n //+ fn OPEN ON HISTORY\n function openModalOnHistory() {\n const params = new URLSearchParams(window.location.search);\n if (params.get('modal') !== BUTTON_OPEN.id) return;\n document.getElementById(BUTTON_OPEN.id)?.scrollIntoView({ behavior: 'smooth' });\n openModal();\n }\n\n\n //= OPEN\n BUTTON_OPEN.addEventListener(\"click\", (e) => openModal(e), { signal });\n BUTTON_OPEN.addEventListener(\"keypress\", (e) => !DIALOG.open && (e.key === \"Enter\" || e.key === \" \") && openModal(e), { signal });\n\n //= CLOSE\n DIALOG.addEventListener(\"close\", () => statusModal(false), { signal });\n DIALOG.addEventListener(\"click\", e => { if (e.target == DIALOG && !disableBackdropClose) closeModal(e) }, { signal });\n BUTTON_CLOSE?.addEventListener(\"click\", e => closeModal(e), { signal });\n\n //= UPDATE HISTORY\n if (data_history && BUTTON_OPEN.id) {\n historyTimeout = window.setTimeout(openModalOnHistory, 1);\n\n //== Aggiorna URL quando cambia l'attributo \"open\" del dialog\n historyObserver = new MutationObserver(() => {\n let isOpen = DIALOG.hasAttribute(\"open\");\n try {\n const url = new URL(window.location.href);\n const params = new URLSearchParams(url.search);\n isOpen ? params.set('modal', BUTTON_OPEN.id) : params.delete('modal');\n url.search = params.toString() ? `?${params.toString()}` : \"\";\n window.history.pushState({ modal: BUTTON_OPEN.id, open: isOpen }, \"\", url);\n } catch (_) { }\n });\n historyObserver.observe(DIALOG, { attributes: true, attributeFilter: [\"open\"] });\n\n //== Gestisce back/forward del browser per aprire/chiudere il dialog coerentemente\n window.addEventListener(\"popstate\", () => {\n try {\n const params = new URLSearchParams(window.location.search);\n const shouldOpen = params.get('modal') === BUTTON_OPEN.id;\n if (shouldOpen && !DIALOG.open) DIALOG.showModal();\n if (!shouldOpen && DIALOG.open) closeModal()\n } catch (_) { }\n }, { signal });\n }\n\n function destroy() {\n eventController.abort();\n historyObserver?.disconnect();\n if (historyTimeout !== null) window.clearTimeout(historyTimeout);\n API.delete(MODAL);\n }\n\n API.set(MODAL, {\n element: MODAL,\n button: BUTTON_OPEN,\n dialog: DIALOG,\n closeButton: BUTTON_CLOSE,\n open: forceOpen,\n close: forceClose,\n toggle: openModal,\n refresh: () => {\n const nextDialog = MODAL.querySelector(\"dialog\") || DIALOG;\n destroy();\n initializeModal(MODAL, nextDialog);\n return API.get(MODAL);\n },\n isOpen: () => DIALOG.open,\n });\n}\n\nfunction PGS_modal_init(root = document) {\n getModals(root).forEach(MODAL => initializeModal(MODAL));\n}\n\n//# INIT PGS_modal\nPGS_modal_init()\n\n//# API\nfunction PGS_modal_api(element) {\n return API.get(element);\n}\n\nexport const PGS_modal = {\n init: PGS_modal_init,\n api: PGS_modal_api\n};\n","//= PGS_notification\nconst fn_notification = {\n _escapeHtml(value) {\n return String(value ?? \"\");\n },\n\n _getDuration(notification) {\n const rawDuration = notification.duration;\n const duration = Number.parseInt(rawDuration, 10);\n\n return Number.isNaN(duration) ? 5000 : duration;\n },\n\n _getApi(notification) {\n const element = String(notification.element || \"notification\").trim();\n\n return element === \"toast\" ? PGS_notification.toast : PGS_notification.alert;\n },\n\n _getType(notification, api) {\n const type = String(notification.type || \"info\").trim();\n\n return typeof api[type] === \"function\" ? type : \"info\";\n },\n\n _getData(root) {\n const rawNotification = pgs(root).option.getValueBrackets(\"notification\") || \"{}\";\n\n try {\n return JSON.parse(rawNotification);\n } catch (error) {\n console.warn(\"PGS notification: configurazione JSON non valida\", error);\n return {};\n }\n },\n\n _getContent(title, content) {\n const safeContent = this._escapeHtml(content);\n const safeTitle = this._escapeHtml(title);\n\n if (!safeTitle) return safeContent;\n if (!safeContent) return `<span pgs=\"notification-element-title\">${safeTitle}</span>`;\n\n return `\n <span pgs=\"notification-element-title\">${safeTitle}</span>\n <br>\n <span pgs=\"notification-element-content\">${safeContent}</span>\n `;\n },\n\n _getContainer(containerType) {\n return Array.from(pgs(document).querySelectorAll(\"notification\")).find(container => {\n const isToast = pgs(container).option.contains(\"toast\");\n return containerType === \"toast\" ? isToast : !isToast;\n });\n },\n\n initNotification(type, containerType, icon, text, timeout, methodDelete = \"replace\", link = null) {\n let containerNotification = this._getContainer(containerType);\n\n //== Create Container\n if (!containerNotification) {\n const newContainer = document.createElement(\"div\");\n pgs(newContainer).add(\"notification\");\n if (containerType === \"toast\") pgs(newContainer).option.add(\"toast\");\n newContainer.setAttribute(\"aria-live\", \"polite\");\n newContainer.setAttribute(\"aria-relevant\", \"additions\");\n document.body.appendChild(newContainer);\n containerNotification = newContainer;\n }\n\n //== Create Notification\n const notification = document.createElement(link ? \"a\" : \"div\");\n if (methodDelete == \"replace\") containerNotification.innerHTML = \"\";\n if (link) notification.href = link;\n if (timeout > 0) notification.style.setProperty(\"--notification-timeout\", timeout + \"ms\");\n pgs(notification).state.add(type);\n pgs(notification).add(\"notification-element\");\n notification.setAttribute(\"role\", type == \"error\" ? \"alert\" : \"status\")\n notification.innerHTML = `${icon} <p>${text}</p>`;\n containerNotification.appendChild(notification);\n\n\n //+ Animation delete \n function deleteNotification() {\n methodDelete == \"stack\" ? notification.style.translate = \"120%\" : notification.style.opacity = \"0\";\n setTimeout(() => notification.remove(), 300);\n }\n\n //== Timeout delete\n if (timeout > 0) setTimeout(() => { deleteNotification() }, timeout);\n\n //== button delete\n const btnDelete = document.createElement(\"button\");\n btnDelete.type = \"button\";\n btnDelete.ariaLabel = \"Rimuovi notifica\";\n btnDelete.innerHTML = '<i class=\"fa-solid fa-xmark\"></i>';\n btnDelete.setAttribute(\"pgs\", \"buttonClose\");\n notification.insertAdjacentElement(\"afterbegin\", btnDelete);\n\n //== event\n\n btnDelete.addEventListener(\"click\", function (e) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation()\n deleteNotification(e); // Esegue la tua funzione\n });\n },\n\n deleteAll(containerType) {\n let containerNotification = this._getContainer(containerType);\n if (containerNotification) containerNotification.innerHTML = \"\";\n },\n\n trigger(root = document) {\n pgs(root).querySelectorAll(\"notificationTrigger\").forEach(element => {\n if (!element || element.dataset.initialize === \"true\") return;\n\n element.dataset.initialize = \"true\";\n\n const notification = this._getData(element);\n const title = String(notification.title || \"\").trim();\n const content = String(notification.message || \"\").trim();\n\n if (!title && !content) {\n element.remove();\n return;\n }\n\n const link = notification.link || null;\n const icon = notification.icon || undefined;\n const duration = this._getDuration(notification);\n const api = this._getApi(notification);\n const type = this._getType(notification, api);\n const formattedContent = this._getContent(title, content);\n\n if (api === PGS_notification.toast) api[type](formattedContent, duration, icon);\n else api[type](formattedContent, link, duration, icon);\n\n element.remove();\n });\n }\n};\n\n//# TRIGGER\nfunction PGS_notificationTrigger_init(root = document) {\n return fn_notification.trigger(root);\n}\n\nexport const PGS_notification = {\n trigger: PGS_notificationTrigger_init,\n alert: {\n error: (text = \"Errore\", link = null, timeout = 0, icon = '<i class=\"fa-solid fa-circle-xmark\"></i>') => fn_notification.initNotification(\"error\", \"notification\", icon, text, timeout, \"stack\", link),\n success: (text = \"Aggiornato\", link = null, timeout = 0, icon = '<i class=\"fa-solid fa-check\"></i>') => fn_notification.initNotification(\"success\", \"notification\", icon, text, timeout, \"stack\", link),\n info: (text = \"Aggiornamento\", link = null, timeout = 0, icon = '<i class=\"fa-solid fa-circle-info\"></i>',) => fn_notification.initNotification(\"info\", \"notification\", icon, text, timeout, \"stack\", link),\n warning: (text = \"Attenzione\", link = null, timeout = 0, icon = '<i class=\"fa-solid fa-triangle-exclamation\"></i>') => fn_notification.initNotification(\"warning\", \"notification\", icon, text, timeout, \"stack\", link),\n deleteAll: () => fn_notification.deleteAll(\"notification\")\n },\n toast: {\n error: (text = \"Errore\", timeout = 4000, icon = '<i class=\"fa-solid fa-circle-xmark\"></i>',) => fn_notification.initNotification(\"error\", \"toast\", icon, text, timeout),\n success: (text = \"Aggiornato\", timeout = 4000, icon = '<i class=\"fa-solid fa-check\"></i>',) => fn_notification.initNotification(\"success\", \"toast\", icon, text, timeout),\n info: (text = \"Aggiornamento\", timeout = 0, icon = '<i class=\"fa-solid fa-circle-info\"></i>',) => fn_notification.initNotification(\"info\", \"toast\", icon, text, timeout),\n warning: (text = \"Attenzione\", timeout = 4000, icon = '<i class=\"fa-solid fa-triangle-exclamation\"></i>',) => fn_notification.initNotification(\"warning\", \"toast\", icon, text, timeout),\n deleteAll: () => fn_notification.deleteAll(\"toast\")\n }\n};\n\n\n//= EXECUTE \nif (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", () => PGS_notificationTrigger_init());\nelse PGS_notificationTrigger_init();\n","const API = new WeakMap();\nconst OPEN_SEARCHES = new Set();\nlet searchId = 0;\n\nconst DEFAULT_OPTIONS = {\n minLength: 2,\n debounce: 200,\n limit: 6,\n submitOnSelect: false,\n searchOnFocus: true,\n source: null,\n onSelect: null,\n};\n\nfunction nextSearchId() {\n searchId += 1;\n return searchId;\n}\n\nfunction getSearches(root) {\n const searches = root instanceof Element && pgs(root).contains(\"search\") ? [root] : [];\n searches.push(...pgs(root).querySelectorAll(\"search\"));\n return searches;\n}\n\nfunction directPgsChild(element, token) {\n return Array.from(element.children).find(child => pgs(child).contains(token));\n}\n\nfunction normalizeItem(item) {\n if (typeof item === \"string\" || typeof item === \"number\") {\n const value = String(item).trim();\n return value ? { label: value, value, disabled: false, data: item } : null;\n }\n\n if (!item || typeof item !== \"object\") return null;\n\n const label = String(item.label ?? item.value ?? \"\").trim();\n if (!label) return null;\n\n return {\n label,\n value: String(item.value ?? label),\n disabled: Boolean(item.disabled),\n data: Object.prototype.hasOwnProperty.call(item, \"data\") ? item.data : item,\n };\n}\n\nfunction normalizeOptions(current, options = {}) {\n const next = { ...current, ...options };\n next.minLength = Math.max(0, Number.parseInt(next.minLength, 10) || 0);\n next.debounce = Math.max(0, Number.parseInt(next.debounce, 10) || 0);\n next.limit = Math.max(1, Number.parseInt(next.limit, 10) || DEFAULT_OPTIONS.limit);\n next.submitOnSelect = Boolean(next.submitOnSelect);\n next.searchOnFocus = Boolean(next.searchOnFocus);\n next.source = typeof next.source === \"function\" || Array.isArray(next.source) ? next.source : null;\n next.onSelect = typeof next.onSelect === \"function\" ? next.onSelect : null;\n return next;\n}\n\nfunction closeSearch(search) {\n const data = API.get(search);\n if (!data) return;\n\n pgs(search).state.remove(\"open\");\n data.input.setAttribute(\"aria-expanded\", \"false\");\n data.input.removeAttribute(\"aria-activedescendant\");\n data.list.setAttribute(\"aria-hidden\", \"true\");\n data.setActiveIndex(-1);\n OPEN_SEARCHES.delete(search);\n}\n\nfunction openSearch(search) {\n const data = API.get(search);\n if (!data || data.items().length === 0) return;\n\n pgs(search).state.add(\"open\");\n data.input.setAttribute(\"aria-expanded\", \"true\");\n data.list.setAttribute(\"aria-hidden\", \"false\");\n OPEN_SEARCHES.add(search);\n}\n\nfunction PGS_search_init(root = document) {\n getSearches(root).forEach(search => {\n if (API.has(search)) return;\n\n const input = search.querySelector('input[type=\"search\"]');\n const list = directPgsChild(search, \"search-suggestions\");\n if (!input || !list) return;\n\n const id = nextSearchId();\n if (!input.id) input.id = `search-input-${id}`;\n if (!list.id) list.id = `search-suggestions-${id}`;\n\n input.setAttribute(\"role\", \"combobox\");\n input.setAttribute(\"aria-autocomplete\", \"list\");\n input.setAttribute(\"aria-haspopup\", \"listbox\");\n input.setAttribute(\"aria-controls\", list.id);\n input.setAttribute(\"aria-expanded\", \"false\");\n input.setAttribute(\"autocomplete\", \"off\");\n list.setAttribute(\"role\", \"listbox\");\n list.setAttribute(\"aria-labelledby\", input.id);\n list.setAttribute(\"aria-hidden\", \"true\");\n\n\n let options = { ...DEFAULT_OPTIONS };\n let items = [];\n let activeIndex = -1;\n let timer = null;\n let controller = null;\n let requestNumber = 0;\n\n function setLoading(loading) {\n pgs(search).state.toggle(\"loading\", loading);\n input.setAttribute(\"aria-busy\", String(loading));\n }\n\n function setActiveIndex(index) {\n activeIndex = index;\n const elements = Array.from(list.querySelectorAll('[pgs~=\"search-suggestions-item\"]'));\n\n elements.forEach((element, itemIndex) => {\n const selected = itemIndex === activeIndex;\n element.setAttribute(\"aria-selected\", String(selected));\n pgs(element).state.toggle(\"selected\", selected);\n });\n\n const active = elements[activeIndex];\n if (active) {\n input.setAttribute(\"aria-activedescendant\", active.id);\n active.scrollIntoView({ block: \"nearest\" });\n } else {\n input.removeAttribute(\"aria-activedescendant\");\n }\n }\n\n function moveActive(step) {\n if (!items.length) return;\n\n let next = activeIndex;\n for (let checked = 0; checked < items.length; checked += 1) {\n next = (next + step + items.length) % items.length;\n if (!items[next].disabled) {\n setActiveIndex(next);\n return;\n }\n }\n }\n\n function clear() {\n items = [];\n activeIndex = -1;\n list.replaceChildren();\n closeSearch(search);\n }\n\n function cancel() {\n if (timer !== null) window.clearTimeout(timer);\n timer = null;\n if (controller) controller.abort();\n controller = null;\n requestNumber += 1;\n setLoading(false);\n }\n\n function render(nextItems) {\n items = Array.from(nextItems || [])\n .map(normalizeItem)\n .filter(Boolean)\n .slice(0, options.limit);\n\n const fragment = document.createDocumentFragment();\n items.forEach((item, index) => {\n const option = document.createElement(\"li\");\n pgs(option).add(\"search-suggestions-item\");\n pgs(option).add(\"flexRow\");\n option.id = `${list.id}-option-${index}`;\n option.dataset.index = String(index);\n option.setAttribute(\"role\", \"option\");\n option.setAttribute(\"aria-selected\", \"false\");\n option.setAttribute(\"aria-disabled\", String(item.disabled));\n option.innerHTML = '<i class=\"fa-solid fa-magnifying-glass\"></i>' + item.label;\n fragment.append(option);\n\n });\n\n activeIndex = -1;\n list.replaceChildren(fragment);\n pgs(search).state.remove(\"error\");\n\n if (items.length) openSearch(search);\n else closeSearch(search);\n\n return items;\n }\n\n async function resolveSource(query, signal) {\n if (Array.isArray(options.source)) {\n const normalizedQuery = query.toLocaleLowerCase();\n return options.source.filter(item => {\n const normalized = normalizeItem(item);\n return normalized && normalized.label.toLocaleLowerCase().includes(normalizedQuery);\n });\n }\n\n if (typeof options.source !== \"function\") return [];\n return await options.source({\n query,\n signal,\n limit: options.limit,\n element: search,\n input,\n });\n }\n\n async function runSearch(query = input.value) {\n cancel();\n clear();\n\n const normalizedQuery = String(query ?? \"\").trim();\n if (normalizedQuery.length < options.minLength || !options.source) return [];\n\n const currentRequest = requestNumber;\n controller = new AbortController();\n const currentController = controller;\n setLoading(true);\n\n try {\n const result = await resolveSource(normalizedQuery, currentController.signal);\n if (currentRequest !== requestNumber || currentController.signal.aborted) return [];\n return render(result);\n } catch (error) {\n if (error?.name === \"AbortError\") return [];\n if (currentRequest !== requestNumber) return [];\n\n clear();\n pgs(search).state.add(\"error\");\n search.dispatchEvent(new CustomEvent(\"pgs:search:error\", {\n bubbles: true,\n detail: { error, query: normalizedQuery },\n }));\n return [];\n } finally {\n if (controller === currentController) controller = null;\n if (currentRequest === requestNumber) setLoading(false);\n }\n }\n\n function schedule() {\n cancel();\n clear();\n pgs(search).state.remove(\"error\");\n\n if (input.value.trim().length < options.minLength || !options.source) return;\n timer = window.setTimeout(() => {\n timer = null;\n runSearch(input.value);\n }, options.debounce);\n }\n\n function select(index = activeIndex, submit = options.submitOnSelect) {\n const item = items[index];\n if (!item || item.disabled) return null;\n\n input.value = item.value;\n cancel();\n clear();\n\n const detail = { item, index, value: item.value, input, element: search };\n search.dispatchEvent(new CustomEvent(\"pgs:search:select\", { bubbles: true, detail }));\n options.onSelect?.(detail);\n\n input.focus();\n if (submit && typeof search.requestSubmit === \"function\") search.requestSubmit();\n return item;\n }\n\n function configure(nextOptions = {}) {\n options = normalizeOptions(options, nextOptions);\n return api;\n }\n\n function onInput() {\n schedule();\n }\n\n function onFocus() {\n if (items.length) openSearch(search);\n else if (options.searchOnFocus) schedule();\n }\n\n function onKeydown(event) {\n if (event.key === \"ArrowDown\") {\n if (!pgs(search).state.contains(\"open\")) schedule();\n if (items.length) {\n event.preventDefault();\n moveActive(1);\n }\n return;\n }\n\n if (event.key === \"ArrowUp\" && items.length) {\n event.preventDefault();\n moveActive(-1);\n return;\n }\n\n if (event.key === \"Enter\" && activeIndex >= 0) {\n event.preventDefault();\n select(activeIndex);\n return;\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n cancel();\n closeSearch(search);\n return;\n }\n\n if (event.key === \"Tab\") closeSearch(search);\n }\n\n function onListPointerDown(event) {\n const option = event.target.closest('[pgs~=\"search-suggestions-item\"]');\n if (!option || !list.contains(option)) return;\n event.preventDefault();\n select(Number.parseInt(option.dataset.index, 10));\n }\n\n function onSubmit() {\n cancel();\n closeSearch(search);\n }\n\n function destroy() {\n cancel();\n clear();\n input.removeEventListener(\"input\", onInput);\n input.removeEventListener(\"focus\", onFocus);\n input.removeEventListener(\"keydown\", onKeydown);\n list.removeEventListener(\"pointerdown\", onListPointerDown);\n search.removeEventListener(\"submit\", onSubmit);\n API.delete(search);\n }\n\n const api = {\n element: search,\n input,\n list,\n configure,\n setSource: source => configure({ source }),\n search: runSearch,\n open: () => openSearch(search),\n close: () => closeSearch(search),\n clear,\n cancel,\n select,\n refresh: () => runSearch(input.value),\n destroy,\n items: () => [...items],\n isOpen: () => pgs(search).state.contains(\"open\"),\n isLoading: () => pgs(search).state.contains(\"loading\"),\n setActiveIndex,\n };\n\n input.addEventListener(\"input\", onInput);\n input.addEventListener(\"focus\", onFocus);\n input.addEventListener(\"keydown\", onKeydown);\n list.addEventListener(\"pointerdown\", onListPointerDown);\n search.addEventListener(\"submit\", onSubmit);\n API.set(search, api);\n });\n}\n\ndocument.addEventListener(\"pointerdown\", event => {\n OPEN_SEARCHES.forEach(search => {\n if (!search.contains(event.target)) closeSearch(search);\n });\n});\n\nPGS_search_init();\n\nfunction PGS_search_api(selector) {\n return API.get(selector);\n}\n\nexport const PGS_search = {\n init: PGS_search_init,\n api: PGS_search_api,\n};\n","import { PGS_scrollHorizontal } from \"../functions/_scrollY.js\";\nconst API = new WeakMap();\n\nfunction getSlides(root) {\n const slides = root instanceof Element && pgs(root).contains(\"slides\") ? [root] : [];\n slides.push(...pgs(root).querySelectorAll(\"slides\"));\n return slides;\n}\n\nclass PGS_Slides {\n //- CONSTRUCTOR\n constructor({ element, viewRatio = 0.97, optionIntersectionObserver = {}, scrollOptions = {} } = {}) {\n this.element = element;\n this.viewRatio = viewRatio;\n\n this.optionIntersectionObserver = {\n threshold: Array.from({ length: 101 }, (_, i) => i / 100), // 0%,1%,2%...100%\n rootMargin: \"0px\",\n ...optionIntersectionObserver,\n };\n\n this.scrollOptions = {\n behavior: \"smooth\",\n inline: \"center\",\n block: \"nearest\",\n container: \"nearest\",\n ...scrollOptions,\n };\n\n this.container = this.element ? pgs(this.element).querySelector(\"slides-container\") : null;\n }\n \n //+ CREATE BUTTON \n #createButtonsAndDots() {\n const EL = this.element;\n\n //== PULSANTI\n if (!pgs(EL).querySelector('slides-prec')) {\n 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>`);\n }\n if (!pgs(EL).querySelector('slides-next')) {\n 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>`);\n }\n\n //== DOTS\n if (!pgs(EL).querySelector('slides-dots')) {\n EL.insertAdjacentHTML(\"beforeend\", `<div pgs=\"slides-dots\" class=\"slides-dots\"></div>`);\n }\n\n const dotsContainer = pgs(EL).querySelector('slides-dots');\n while (dotsContainer.children.length < this.container.children.length) {\n dotsContainer.insertAdjacentHTML(\"beforeend\", `<button type=\"button\" class=\"slide-dot\"></button>`);\n }\n while (dotsContainer.children.length > this.container.children.length) {\n dotsContainer.lastElementChild.remove();\n }\n Array.from(dotsContainer.children).forEach((dot, index) => {\n dot.setAttribute(\"aria-label\", `vai alla slide ${index + 1}`);\n });\n }\n\n //+ PREV \n #previousSlide() {\n const currents = this.container.querySelectorAll('.view');\n let current;\n \n\n if (pgs(this.element).option.contains('singleScroll')) current = currents[currents.length - 1];\n else current = currents[0];\n\n const prev = current?.previousElementSibling;\n\n prev?.scrollIntoView(this.scrollOptions);\n prev?.focus({ preventScroll: true });\n }\n\n //+ NEXT \n #nextSlide() {\n const currents = this.container.querySelectorAll('.view');\n let current;\n\n \n \n if (pgs(this.element).option.contains('singleScroll')) current = currents[0];\n else current = currents[currents.length - 1];\n \n const next = current?.nextElementSibling;\n next?.scrollIntoView(this.scrollOptions);\n next?.focus({ preventScroll: true });\n }\n\n //+ GO TO NUMBER SLIDE \n #goToNumberSlide(index) {\n this.container.children[index]?.scrollIntoView(this.scrollOptions);\n }\n\n //+ CALLBACK\n #callback(allLi, container, precButton, nextButton, dots) {\n allLi.forEach(LI => {\n const visiblePercent = 0.9 + LI.intersectionRatio * 0.1;\n const isView = visiblePercent >= 0.98;\n\n //== SCROLL ANIMATION\n if (!pgs(LI.target).option.contains('notScrollAnimation') && LI.target.firstElementChild) {\n LI.target.firstElementChild.style.setProperty('--visible-percent', `${visiblePercent}`);\n };\n\n //== VIEW & NOT-VIEW \n LI.target.classList.toggle(\"view\", isView);\n LI.target.classList.toggle(\"notView\", !isView);\n\n //== VIEW PREC e NEXT\n const all = LI.target.parentNode.children;\n const atStart = all[0].classList.contains(\"view\");\n const atEnd = all[all.length - 1].classList.contains(\"view\");\n nextButton.disabled = atEnd;\n precButton.disabled = atStart;\n nextButton.setAttribute('aria-disabled', String(atEnd));\n precButton.setAttribute('aria-disabled', String(atStart));\n\n //== ACTIVE DOT\n const viewElements = Array.from(container.children).filter(el => el.classList.contains('view'));\n dots.forEach((btn, i) => {\n const isActive = viewElements.some(el => Array.from(container.children).indexOf(el) === i);\n btn.classList.toggle('active', isActive);\n btn.setAttribute('aria-current', isActive ? 'true' : 'false');\n });\n })\n }\n\n //= EXECUTE\n execute() {\n const slides = this.element;\n if (!this.container) return;\n const eventController = new AbortController();\n const { signal } = eventController;\n\n //== elements\n this.#createButtonsAndDots();\n const precButton = pgs(slides).querySelector('slides-prec');\n const nextButton = pgs(slides).querySelector('slides-next');\n const dots = Array.from(pgs(slides).querySelector('slides-dots').children);\n\n //== option\n const notScrollWithMouse = pgs(slides).option.contains('notScrollWithMouse');\n\n //== scroll\n const removeHorizontalScroll = notScrollWithMouse\n ? null\n : PGS_scrollHorizontal(this.container, 5);\n\n //==Listener: DOT, PREC, NEXT\n dots.forEach((dot, index) => dot.addEventListener(\"click\", () => this.#goToNumberSlide(index), { signal }));\n precButton.addEventListener(\"click\", () => this.#previousSlide(), { passive: true, signal });\n nextButton.addEventListener(\"click\", () => this.#nextSlide(), { passive: true, signal });\n\n //== observer\n const observer = new IntersectionObserver(\n (allLi) => this.#callback(allLi, this.container, precButton, nextButton, dots),\n { root: this.container, ...this.optionIntersectionObserver }\n );\n Array.from(this.container.children).forEach(allLi => observer.observe(allLi));\n\n\n let api;\n const destroy = () => {\n if (API.get(this.element) !== api) return;\n eventController.abort();\n observer.disconnect();\n removeHorizontalScroll?.();\n API.delete(this.element);\n };\n\n //- API\n api = {\n element: this.element,\n container: this.container,\n previous: () => this.#previousSlide(),\n next: () => this.#nextSlide(),\n goTo: (index) => this.#goToNumberSlide(index),\n getCurrentIndexes: () => Array.from(this.container.children).map((el, i) => el.classList.contains(\"view\") ? i : -1).filter(i => i !== -1),\n getCurrentElements: () => Array.from(this.container.children).filter(el => el.classList.contains(\"view\")),\n getTotal: () => this.container.children.length,\n isAtStart: () => this.container.children[0]?.classList.contains(\"view\") || false,\n isAtEnd: () => {\n const children = this.container.children;\n const last = children[children.length - 1];\n return last?.classList.contains(\"view\") || false;\n },\n refresh: () => {\n if (API.get(this.element) !== api) return API.get(this.element);\n destroy();\n const instance = new PGS_Slides({\n element: this.element,\n viewRatio: this.viewRatio,\n optionIntersectionObserver: this.optionIntersectionObserver,\n scrollOptions: this.scrollOptions,\n });\n instance.execute();\n return API.get(this.element);\n },\n };\n API.set(this.element, api);\n }\n}\n\n//# INIT \nfunction PGS_slides_init(root = document) {\n getSlides(root).forEach(element => {\n if (API.has(element)) return;\n\n const instance = new PGS_Slides({ element });\n instance.execute();\n });\n}\n\nPGS_slides_init();\n\n//# API \nfunction PGS_slides_api(element) {\n return API.get(element);\n}\n\nexport const PGS_slides = {\n init: PGS_slides_init,\n api: PGS_slides_api\n};\n","const API = new WeakMap();\n\nfunction PGS_stepTabs_init(root = document) {\n pgs(root).querySelectorAll(\"stepTabs\").forEach(tabsWizard => {\n if (tabsWizard.dataset.stepTabsInitialized === \"true\") return;\n tabsWizard.dataset.stepTabsInitialized = \"true\";\n\n //= SELECTOR\n const prev = pgs(tabsWizard).querySelector(\"stepTabs-prev\")\n const next = pgs(tabsWizard).querySelector(\"stepTabs-next\")\n const restart = pgs(tabsWizard).querySelector(\"stepTabs-restart\")\n const dots = pgs(tabsWizard).querySelector(\"stepTabs-dots\")\n const tabsContainer = pgs(tabsWizard).querySelector(\"stepTabs-container\");\n const allTab = pgs(tabsContainer).querySelectorAll(\"tab\");\n\n //= SETTING\n const total = allTab.length;\n const defaultTabLocked = Array.from(allTab).filter(tab => pgs(tab).state.contains(\"is-locked\")) \n let current = 0;\n if (prev) prev.disabled = true;\n let isRendering = false;\n\n if (!tabsContainer || total === 0) return;\n\n //- CREAZIONE DOTS\n const tabDots = [];\n if (dots) {\n dots.innerHTML = \"\";\n\n allTab.forEach((tab, index) => {\n const iconClass = pgs(tab).option.getValueBrackets(\"tabIcon\") || \"fa-circle\";\n const dot = document.createElement(\"button\");\n dot.type = \"button\";\n pgs(dot).add(\"stepTabs-dots-dot\");\n pgs(dot).option.setValueBrackets(\"step\", index);\n dot.innerHTML = `<i class=\"fa-solid ${iconClass}\"></i>`;\n\n dot.addEventListener(\"click\", () => {\n if (pgs(dot).state.contains(\"is-completed\")) {\n goTo(index, true);\n }\n });\n\n dots.appendChild(dot);\n tabDots.push(dot);\n });\n }\n\n //+ DOTS\n function updateDots() {\n tabDots.forEach((dot, i) => {\n setState(dot, \"is-active\", i === current);\n setState(dot, \"is-completed\", i < current);\n });\n }\n\n //+ STATE\n function setState(element, state, active) {\n if (!element) return;\n const hasState = pgs(element).state.contains(state);\n if (active === hasState) return;\n pgs(element).state.toggle(state, active);\n }\n\n //+ CONTROLS\n function updateControls() {\n const tab = allTab[current];\n if (prev) prev.disabled = current === 0;\n if (next) next.disabled = current === total - 1 || pgs(tab).state.contains(\"is-locked\");\n }\n\n //+ Step\n function goTo(index, scroll = true) {\n current = Math.min(Math.max(index, 0), total - 1);\n const tab = allTab[current]\n\n isRendering = true;\n allTab.forEach((tab, i) => setState(tab, \"is-active\", i === current));\n updateControls();\n updateDots();\n isRendering = false;\n\n if (scroll && !tabsWizard.closest(\"dialog\")) {\n tab?.focus();\n tabsWizard?.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }\n\n tabsWizard.dispatchEvent(new CustomEvent('stepTabs:change', { detail: { current, total } }));\n }\n\n //+ restart\n function restartTab() {\n goTo(0);\n defaultTabLocked.forEach(tab => pgs(tab).state.add(\"is-locked\"));\n }\n\n //= INIT\n goTo(0, false);\n\n //= tab-locked\n const observer = new MutationObserver(() => {\n if (isRendering) return;\n updateControls();\n });\n allTab?.forEach(tabEl => observer.observe(tabEl, { attributes: true, attributeFilter: [\"pgs-state\"], }));\n\n //= Click su Avanti/Indietro\n prev?.addEventListener(\"click\", e => goTo(current - 1));\n next?.addEventListener(\"click\", e => {\n updateControls();\n if (next.disabled) return;\n goTo(current + 1);\n });\n restart?.addEventListener(\"click\", e => restartTab(), { capture: true });\n\n //-(API) \n // tabsWizard.addEventListener(\"stepTabs:reset\", () => restartTab());\n API.set(tabsWizard, {\n element: tabsWizard,\n container: tabsContainer,\n restart: restartTab,\n goTo,\n next: () => goTo(current + 1),\n prev: () => goTo(current - 1),\n toggleLock: (step, lock = true) => typeof step === \"number\" && allTab[step] && (pgs(allTab[step]).state.toggle(\"is-locked\", lock), goTo(current)),\n refresh: () => {\n PGS_stepTabs_init(tabsWizard.parentNode || document);\n return API.get(tabsWizard);\n },\n getCurrent: () => current,\n getState: () => ({ current, total }),\n });\n });\n}\n\nPGS_stepTabs_init()\n\nfunction PGS_stepTabs_api(selector) {\n return API.get(selector);\n}\n\nexport const PGS_stepTabs = {\n init: PGS_stepTabs_init,\n api: PGS_stepTabs_api\n};\n\n/* \n / EXAMPLE\n // vai allo step 2\n w.dispatchEvent(new CustomEvent(\"stepTabs:go\", { detail: { step: 2 } }));\n \n // next\n w.dispatchEvent(new CustomEvent(\"stepTabs:next\"));\n \n // prev\n w.dispatchEvent(new CustomEvent(\"stepTabs:prev\"));\n \n // reset a 0 senza relock\n w.dispatchEvent(new CustomEvent(\"stepTabs:reset\"));\n \n // lock step 3\n w.dispatchEvent(new CustomEvent(\"stepTabs:toggle-lock\", { detail: { step: 3, lock: true } }));\n \n // unlock step 3\n w.dispatchEvent(new CustomEvent(\"stepTabs:toggle-lock\", { detail: { step: 3, lock: false } }));\n \n // leggi stato\n w.dispatchEvent(new CustomEvent(\"stepTabs:get\", { detail: { reply: (state) => console.log(state) } }));\n*/\n","const API = new WeakMap();\n\nfunction PGS_steps_init(root = document) {\n pgs(root).querySelectorAll(\"steps\").forEach(steps => {\n if (API.has(steps)) return;\n\n pgs(steps).querySelectorAll(\"steps-step\").forEach((li, index) => {\n \n //= CIRCLE\n let circleLi;\n if (!pgs(li).querySelector(\"steps-step-circle\")) {\n circleLi = document.createElement(\"span\");\n pgs(circleLi).add(\"steps-step-circle\")\n circleLi.textContent = index + 1;\n li.insertAdjacentElement(\"afterbegin\", circleLi);\n } else{\n circleLi = pgs(li).querySelector(\"steps-step-circle\");\n }\n \n //= line\n if (!pgs(li).querySelector(\"steps-step-line\")) {\n const line = document.createElement(\"span\");\n pgs(line).add(\"steps-step-line\")\n li.insertAdjacentElement(\"afterbegin\", line);\n }\n });\n\n API.set(steps, {\n element: steps,\n steps: () => Array.from(pgs(steps).querySelectorAll(\"steps-step\")),\n getStep: (index) => pgs(steps).querySelectorAll(\"steps-step\")[index],\n getTotal: () => pgs(steps).querySelectorAll(\"steps-step\").length,\n refresh: () => {\n API.delete(steps);\n PGS_steps_init(steps.parentNode || document);\n return API.get(steps);\n },\n });\n });\n}\n\n//# INIT PGS_ol\nPGS_steps_init()\n\n//# API\nfunction PGS_steps_api(selector) {\n return API.get(selector);\n}\n\nexport const PGS_steps = {\n init: PGS_steps_init,\n api: PGS_steps_api\n};\n","//= SUMMARY\nconst API = new WeakMap();\nlet summaryId = 0;\n\nfunction nextSummaryId() {\n summaryId += 1;\n return summaryId;\n}\n\nfunction getLineHeight(element) {\n const style = window.getComputedStyle(element);\n const lineHeight = parseFloat(style.lineHeight);\n if (Number.isFinite(lineHeight)) return lineHeight;\n\n const fontSize = parseFloat(style.fontSize);\n return Number.isFinite(fontSize) ? fontSize * 1.2 : 0;\n}\n\nfunction directPgsChild(element, token) {\n return Array.from(element.children).find(child => pgs(child).contains(token));\n}\n\nfunction PGS_summary_init(root = document) {\n pgs(root).querySelectorAll(\"summary\").forEach((summary) => {\n if (API.has(summary)) return;\n\n const content = directPgsChild(summary, \"summary-content\");\n const button = directPgsChild(summary, \"summary-button\");\n if (!content || !button) return;\n\n const id = nextSummaryId();\n const contentId = content.id || `summary-content-${id}`;\n content.id = contentId;\n\n button.type ||= \"button\";\n button.setAttribute(\"aria-controls\", content.id);\n\n function isOpen() {\n return pgs(summary).state.contains(\"open\");\n }\n\n function getCollapsedHeight() {\n return getLineHeight(content) * 3;\n }\n\n function isOverflowing() {\n return content.scrollHeight > Math.ceil(getCollapsedHeight()) + 1;\n }\n\n function setExpanded(expanded) {\n const overflow = isOverflowing();\n\n pgs(summary).state.toggle(\"overflow\", overflow);\n pgs(summary).state.toggle(\"open\", expanded && overflow);\n\n button.hidden = !overflow;\n button.setAttribute(\"aria-hidden\", String(!overflow));\n button.setAttribute(\"aria-expanded\", String(expanded && overflow));\n button.textContent = expanded && overflow ? \"Mostra meno\" : \"Mostra di più\";\n\n const nextHeight = expanded && overflow ? content.scrollHeight : getCollapsedHeight();\n content.style.setProperty(\"--summary-content-max-height\", `${nextHeight}px`);\n }\n\n function refresh() {\n const wasOpen = isOpen();\n content.style.setProperty(\"--summary-content-max-height\", \"none\");\n setExpanded(wasOpen);\n }\n\n function toggle() {\n setExpanded(!isOpen());\n }\n\n button.addEventListener(\"click\", toggle);\n window.addEventListener(\"resize\", refresh, { passive: true });\n\n refresh();\n requestAnimationFrame(refresh);\n\n API.set(summary, {\n element: summary,\n content,\n button,\n open: () => setExpanded(true),\n close: () => setExpanded(false),\n toggle,\n refresh,\n isOpen,\n });\n });\n}\n\n//# INIT\nPGS_summary_init();\n\n//# API\nfunction PGS_summary_api(selector) {\n return API.get(selector);\n}\n\nexport const PGS_summary = {\n init: PGS_summary_init,\n api: PGS_summary_api\n};\n","import { pgs } from \"../_pgs.js\";\nimport { PGS_notification } from \"../components/_notifications.js\";\n\n\nexport class PGS_formValidate {\n #message = {};\n #insideValidatedCallback = false;\n\n constructor(form, options = {}) {\n if (!options || typeof options !== \"object\" || Array.isArray(options)) {\n throw new TypeError(\"options must be an object\");\n }\n\n this.container = form;\n this._rules = [];\n this.message = {\n fieldError: \"Please complete this field.\",\n fieldsError: \"Please complete all required fields.\",\n success: \"Submitted successfully.\"\n };\n\n if (options.message !== undefined) this.message = options.message;\n this.container?.setAttribute(\"novalidate\", \"\");\n }\n\n get message() {\n return { ...this.#message };\n }\n\n set message(value) {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new TypeError(\"message must be an object\");\n }\n\n this.#message = { ...this.#message, ...value };\n }\n\n // - Helpers\n #help = {\n // supporta sia required nativo\n isRequired(field) {\n if (!field) return false;\n\n const required = field.required === true || field?.dataset?.required === \"true\" || field?.getAttribute('aria-required') == \"true\";\n return required && !field.hidden; // solo attributo/proprietà \"hidden\"\n },\n // input (non speciali), textarea\n isEmptyTextLike(field) { return !String(field?.value ?? \"\").trim(); },\n // select: vuoto se value == \"\" o null\n isEmptySelect(field) { return !String(field?.value ?? \"\").trim(); },\n // recupera name in modo sicuro\n getGroupName(field) { return field?.name || field?.getAttribute?.(\"name\") || \"\"; }\n };\n\n\n // + --------------------------\n // + input + altri elementi. \n // + --------------------------\n #inputValue(container) {\n\n //++ add rule\n const ruleInvalidFields = [];\n for (const rule of this._rules) {\n const res = rule(container);\n\n // la rule può tornare:\n // • null/undefined => ok\n // • un elemento => invalido\n // • un array di elementi => invalidi\n if (!res) continue;\n\n if (Array.isArray(res)) ruleInvalidFields.push(...res);\n else ruleInvalidFields.push(res);\n }\n\n //== INPUT \n // \"testuali\" (esclude hidden/disabled/checkbox/radio/file come nel tuo snippet)\n const textInputs = Array.from(container.querySelectorAll(\"input\")).filter((input) => {\n if (input.disabled) return false;\n if (input.type === \"hidden\") return false;\n if (input.type === \"checkbox\" || input.type === \"radio\" || input.type === \"file\") return false;\n\n // valida solo se required\n if (!this.#help.isRequired(input)) return false;\n\n return this.#help.isEmptyTextLike(input);\n });\n\n //== TEXTAREA \n // required vuote\n const textareas = Array.from(container.querySelectorAll(\"textarea\")).filter((ta) => {\n if (ta.disabled) return false;\n if (!this.#help.isRequired(ta)) return false;\n return this.#help.isEmptyTextLike(ta);\n });\n\n //== SELECT \n // required vuoti\n const selects = Array.from(container.querySelectorAll(\"select\")).filter((sel) => {\n if (sel.disabled) return false;\n if (!this.#help.isRequired(sel)) return false;\n return this.#help.isEmptySelect(sel);\n });\n\n //== RADIO \n // required: se in un gruppo required non ce n'è uno checked => errore sul \"primo\" radio del gruppo\n const radios = Array.from(container.querySelectorAll('input[type=\"radio\"]')).filter((r) => !r.disabled);\n const requiredRadioGroups = new Map(); // name -> [elements]\n for (const r of radios) {\n if (!this.#help.isRequired(r)) continue;\n const name = this.#help.getGroupName(r);\n if (!name) continue;\n if (!requiredRadioGroups.has(name)) requiredRadioGroups.set(name, []);\n requiredRadioGroups.get(name).push(r);\n }\n const radioGroupErrors = [];\n for (const [name, group] of requiredRadioGroups.entries()) {\n const anyChecked = group.some((r) => r.checked);\n if (!anyChecked) {\n // scegli dove mettere l'errore: tipicamente sul primo radio del gruppo\n radioGroupErrors.push(group[0]);\n }\n }\n\n //== CHECKBOX \n // required: può essere singola checkbox required (checked obbligatorio)\n // oppure gruppo di checkbox (stesso name) con almeno una selezionata\n const checkboxes = Array.from(container.querySelectorAll('input[type=\"checkbox\"]')).filter((c) => !c.disabled);\n const requiredCheckboxSingles = [];\n const requiredCheckboxGroups = new Map(); // name -> [elements]\n for (const c of checkboxes) {\n if (!this.#help.isRequired(c)) continue;\n\n const name = this.#help.getGroupName(c);\n if (!name) {\n // checkbox senza name: trattala come singola required\n if (!c.checked) requiredCheckboxSingles.push(c);\n continue;\n }\n\n // se vuoi trattare come gruppo, raggruppa per name\n if (!requiredCheckboxGroups.has(name)) requiredCheckboxGroups.set(name, []);\n requiredCheckboxGroups.get(name).push(c);\n }\n const checkboxGroupErrors = [];\n for (const [name, group] of requiredCheckboxGroups.entries()) {\n // se è un gruppo (>=2) richiedi almeno una spuntata\n // se è 1 sola, si comporta come singola\n const anyChecked = group.some((c) => c.checked);\n if (!anyChecked) checkboxGroupErrors.push(group[0]);\n }\n\n //== FILE \n // required: se vuoi includerlo\n const fileInputs = Array.from(container.querySelectorAll('input[type=\"file\"]')).filter((f) => {\n if (f.disabled) return false;\n if (!this.#help.isRequired(f)) return false;\n return !(f.files && f.files.length > 0);\n });\n\n //== risultato finale: tutti i campi da marcare come errore\n const invalidFields = [\n textInputs,\n textareas,\n selects,\n radioGroupErrors,\n requiredCheckboxSingles,\n checkboxGroupErrors,\n fileInputs,\n ruleInvalidFields\n ];\n\n return [...new Set(invalidFields.flat())];\n }\n\n //+ ADD\n addFieldError(field, i = 0, total = 1) {\n pgs(field).option.add(\"error\");\n if (i === 0) field.scrollIntoView();\n\n if (i !== 0) return;\n\n if (total > 1) {\n PGS_notification.toast.error(this.message.fieldsError);\n return;\n }\n\n const message = pgs(field).option.getValueBrackets(\"message\");\n PGS_notification.toast.error(message || this.message.fieldError);\n }\n\n //+ REMOVE\n removeFieldError(field) {\n pgs(field).option.remove(\"error\");\n }\n\n // + SUCCESS\n success(text = this.message.success) {\n if (this.#insideValidatedCallback || this.validate() === true) PGS_notification.toast.success(text)\n }\n\n\n // + VALIDATE\n validate() {\n const invalid = this.#inputValue(this.container);\n const allFields = this.container.querySelectorAll(\"input, textarea, select\")\n\n //== pulizia/aggiornamento errori: \n // prima rimuovo errori dai campi \"non più invalidi\"\n Array.from(allFields).filter((el) => !el.disabled);\n\n //== per radio/checkbox in gruppo: \n // rimuovi l'errore solo sull'elemento che lo ospita (qui: se presente)\n for (const el of allFields) { if (!invalid.includes(el)) this.removeFieldError(el); }\n\n //== aggiungo errori dove serve\n invalid.forEach((el, i) => this.addFieldError(el, i, invalid.length))\n\n //== rimuove l'errore al click\n allFields.forEach(element => element.addEventListener(\"click\", e => this.removeFieldError(element)));\n\n //== status form\n if (invalid.length) {\n pgs(this.container).option.remove(\"success\").add(\"error\");\n return false;\n } else {\n pgs(this.container).option.remove(\"error\").add(\"success\");\n return true;\n }\n }\n\n // + EVENT VALIDATOR\n validator(callback, eventName = \"submit\") {\n if (typeof callback !== \"function\") throw new TypeError(\"callback must be a function\");\n if (typeof eventName !== \"string\" || !eventName.trim()) throw new TypeError(\"eventName must be a non-empty string\");\n\n this.container.addEventListener(eventName, event => {\n event.preventDefault();\n if (!this.validate()) return;\n\n this.#insideValidatedCallback = true;\n\n try {\n this.success();\n callback(event);\n } finally {\n this.#insideValidatedCallback = false;\n }\n });\n\n return this;\n }\n\n // + ADD RULE\n addNewRule(rule) {\n if (typeof rule !== \"function\") throw new Error(\"Rule must be a function\");\n this._rules.push(rule);\n return this;\n }\n}\n","export function PGS_scrollHorizontal(element, speed) {\n // Se hai più contenitori, selezionali tutti:\n // Semplice \"singleton\" per stimare se la sorgente è trackpad\n const TrackpadDetector = (() => {\n let lastTs = 0;\n let smallAndFast = 0;\n let samples = 0;\n let isTrackpad = false;\n\n function update(e) {\n const now = performance.now();\n const dt = now - lastTs;\n\n // Porta delta in px (0: px, 1: linee, 2: pagine)\n let dy = Math.abs(e.deltaY);\n if (e.deltaMode === 1) dy *= 16;\n else if (e.deltaMode === 2) dy *= e.currentTarget?.clientHeight || 800;\n\n // Heuristica: eventi piccoli e ravvicinati → prob. trackpad\n const small = dy < 30; // soglia prudente\n const fast = dt < 35; // alta frequenza\n if (small && fast) smallAndFast++;\n\n samples++;\n if (samples >= 6) { // aggiorna il giudizio ogni N eventi\n isTrackpad = smallAndFast >= 3;\n smallAndFast = 0;\n samples = 0;\n }\n\n lastTs = now;\n return isTrackpad;\n }\n\n return {\n update,\n get value() { return isTrackpad; }\n };\n })();\n\n //= Scorrimento orizzontale con rotella (evita il trackpad)\n \n const onWheel = (e) => {\n //== lascia lo scroll naturale del trackpad\n if (TrackpadDetector.update(e)) return;\n\n //== Evita interferenze con zoom o scroll orizzontale nativo\n if (e.ctrlKey) return;\n if (Math.abs(e.deltaX) > Math.abs(e.deltaY)) return;\n\n //== Converti delta in px per lo shift orizzontale\n let delta = e.deltaY;\n if (e.deltaMode === 1) delta *= 16;\n else if (e.deltaMode === 2) delta *= element.clientHeight;\n\n //== Verifica se il contenitore può ancora scrollare orizzontalmente\n const atStart = element.scrollLeft <= 0;\n const atEnd = element.scrollLeft + element.clientWidth >= element.scrollWidth - 1;\n const scrollingRight = delta > 0;\n const scrollingLeft = delta < 0;\n const canScrollHoriz =\n (scrollingRight && !atEnd) ||\n (scrollingLeft && !atStart);\n\n // Se non può più scrollare in quella direzione, lascia che la pagina gestisca lo scroll verticale\n if (!canScrollHoriz) return;\n\n //== Previeni il default solo quando facciamo noi lo scroll orizzontale\n e.preventDefault();\n\n //== rotella giù => destra\n element.scrollLeft += delta * speed;\n };\n\n element.addEventListener('wheel', onWheel, { passive: false });\n return () => element.removeEventListener('wheel', onWheel);\n}\n","//# HEADER\nconst header = pgs(document).querySelector(\"header\");\n\n//= HEADER\nfunction PGS_header(selectHeader = document) {\n\n if (!header) return;\n\n const headerElements = pgs(header).querySelectorAll(\"header-element\");\n\n if (!headerElements.length) console.log('For the header to work correctly, insert \"header-element\" under \"header\"');\n if (!headerElements.length) return;\n \n \n\n headerElements.forEach(selectHeader => {\n\n //== ACTIVE MOBILE \n let menuAttivate = false;\n let childsWidthSAVE;\n\n function mobileActive(headerElement) {\n\n //=== header\n let style = window.getComputedStyle(headerElement);\n let padding = parseFloat(style.paddingLeft) + parseFloat(style.paddingRight);\n let gap = parseFloat(style.gap);\n let headerElementWidth = parseInt(headerElement.offsetWidth - padding);\n let childsWidth;\n\n if (menuAttivate) {\n childsWidth = childsWidthSAVE;\n } else {\n let childs = [];\n\n // Esclude l'area mobile dedicata e l'hamburger, poi misura i figli sempre visibili su desktop.\n Array.from(headerElement.children)\n .filter(el => !pgs(el).contains(\"header-element-onlyMobile\"))\n .forEach(child => {\n if (pgs(child).contains(\"header-element-hamburger\")) return;\n childs.push(...child.children);\n });\n\n gap = Math.round(gap * (childs.length - 1));\n let childsReduce = childs.reduce((totalWidth, child) => totalWidth + child.offsetWidth, 0) - 2;\n\n childsWidth = childsReduce + gap;\n }\n\n //===set data\n if (window.innerWidth < 600) {\n pgs(header).state.add(\"mobileActive\");\n pgs(selectHeader).state.add(\"mobileActive\");\n } else if (headerElementWidth < childsWidth) {\n pgs(header).state.add(\"mobileActive\");\n pgs(headerElement).state.add(\"mobileActive\");\n menuAttivate = true;\n childsWidthSAVE = childsWidth;\n } else {\n pgs(header).state.remove(\"mobileActive\");\n pgs(headerElement).state.remove(\"mobileActive\");\n }\n }\n\n //== observer (throttled to avoid ResizeObserver loop warnings)\n let resizeRafId = 0;\n const scheduleMobileActive = () => {\n if (resizeRafId) return;\n resizeRafId = requestAnimationFrame(() => {\n resizeRafId = 0;\n mobileActive(selectHeader);\n });\n };\n\n let observer = new ResizeObserver(scheduleMobileActive);\n observer.observe(selectHeader);\n scheduleMobileActive();\n });\n\n // Ripristina la posizione dell'header quando si esce dalla modalità mobile\n window.addEventListener(\"resize\", () => {\n if (window.innerWidth > 768) header.style.transform = \"translateY(0)\";\n });\n}\nPGS_header();\n\n\n//= HEADER HEIGHT\nfunction headerHeight() {\n if (!header) return;\n const wordPressBar = window.getComputedStyle(document.documentElement).marginTop ?? 0;\n const headerHeight = header.offsetHeight\n const height = headerHeight + parseInt(wordPressBar);\n const scrollHeight = document.querySelector(\"header\").getAttribute(\"data-header-scroll\") === \"true\" ? 0 : height;\n\n document.documentElement.style.setProperty(\"--heightOfHeader\", `${height}px`);\n document.documentElement.style.setProperty(\"--heightOfHeaderScroll\", `${scrollHeight}px`);\n}\n\n// Il modulo può essere caricato nel footer: rimanda il primo calcolo al frame\n// successivo, quando il browser ha già composto l'header, senza aspettare il\n// caricamento completo della pagina.\nlet headerHeightRafId = 0;\nfunction scheduleHeaderHeight() {\n if (headerHeightRafId) return;\n\n headerHeightRafId = requestAnimationFrame(() => {\n headerHeightRafId = 0;\n headerHeight();\n });\n}\n\nif (header) {\n const headerHeightObserver = new ResizeObserver(scheduleHeaderHeight);\n headerHeightObserver.observe(header);\n\n // Un font web può modificare la larghezza del menu e quindi l'altezza\n // dell'header, anche dopo il primo frame.\n document.fonts?.ready?.then(scheduleHeaderHeight);\n}\n\nscheduleHeaderHeight();\nwindow.addEventListener(\"resize\", scheduleHeaderHeight);\nwindow.addEventListener(\"scroll\", scheduleHeaderHeight, { passive: true });\n\n\n\n\n//= SCROLL\n// Nasconde l'header quando si scorre verso il basso e lo mostra quando si scorre verso l'alto su dispositivi con larghezza fino a 900px.\nlet lastScrollY = window.scrollY;\nwindow.addEventListener(\"scroll\", () => {\n if (!header) return;\n let currentScrollY = window.scrollY;\n\n if (window.innerHeight <= 900) {\n if (currentScrollY >= 80) {\n if (currentScrollY > lastScrollY) {\n header.style.transform = \"translateY(-100%)\";\n header.setAttribute(\"data-header-scroll\", true)\n } else {\n header.style.transform = \"translateY(0px)\";\n header.setAttribute(\"data-header-scroll\", false)\n }\n } else {\n header.style.transform = \"translateY(0)\"; // Mostra sempre l'header se il scroll è inferiore a 80px\n header.setAttribute(\"data-header-scroll\", false)\n }\n }\n lastScrollY = currentScrollY;\n\n});\n\n","const STORAGE_KEY = 'pgs_cookie_preferences_v1';\nconst focusableSelectors = 'a[href], button:not([disabled]), input:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n//+ \nfunction safeJsonParse(value) {\n try {\n return value ? JSON.parse(value) : null;\n } catch (error) {\n console.warn('PGS cookie consent: impossibile leggere le preferenze', error);\n return null;\n }\n}\n\n//+ \nfunction readPreferences() {\n try {\n return safeJsonParse(localStorage.getItem(STORAGE_KEY));\n } catch (error) {\n return null;\n }\n}\n\n//+ \nfunction savePreferences(prefs) {\n try {\n localStorage.setItem(\n STORAGE_KEY,\n JSON.stringify({ ...prefs, updatedAt: new Date().toISOString() })\n );\n } catch (error) {\n console.warn('PGS cookie consent: impossibile salvare le preferenze', error);\n }\n}\n\n//+ \nfunction bootstrapGtag() {\n window.dataLayer = window.dataLayer || [];\n window.gtag = window.gtag || function gtag() {\n window.dataLayer.push(arguments);\n };\n}\n\n//+ \nfunction loadGoogleAnalytics(measurementId) {\n if (!measurementId || window.__PGS_gaLoaded) return;\n window.__PGS_gaLoaded = true;\n\n const script = document.createElement('script');\n script.async = true;\n script.src = `https://www.googletagmanager.com/gtag/js?id=${measurementId}`;\n document.head.appendChild(script);\n\n window.gtag('js', new Date());\n window.gtag('config', measurementId, {\n anonymize_ip: true,\n allow_google_signals: false,\n });\n}\n\n//+ \nfunction applyAnalyticsConsent({ allowAnalytics, measurementId }) {\n bootstrapGtag();\n if (allowAnalytics) {\n window.gtag('consent', 'update', { analytics_storage: 'granted' });\n loadGoogleAnalytics(measurementId);\n } else {\n window.gtag('consent', 'update', { analytics_storage: 'denied' });\n }\n}\n\n//+\nfunction setPgsFlag(element, token, enabled) {\n if (!(element instanceof HTMLElement) || !token) return;\n const current = (element.getAttribute('pgs') || '').split(/\\s+/).filter(Boolean);\n const next = enabled ? [...new Set([...current, token])] : current.filter((item) => item !== token);\n if (next.length > 0) {\n element.setAttribute('pgs', next.join(' '));\n } else {\n element.removeAttribute('pgs');\n }\n}\n\n//+\nfunction assignCookieRuntimeAttributes({ root, analyticsToggle, acceptAllButton, rejectButton, openButtons }) {\n root.dataset.cookieComponent = 'consent';\n analyticsToggle?.setAttribute('data-cookie-toggle', 'analytics');\n acceptAllButton?.setAttribute('data-cookie-action', 'accept');\n rejectButton?.setAttribute('data-cookie-action', 'reject');\n\n root.querySelector('[pgs~=\"cookieConsent-featureEssential\"]')?.setAttribute('data-cookie-feature', 'essential');\n root.querySelector('[pgs~=\"cookieConsent-featureAnalytics\"]')?.setAttribute('data-cookie-feature', 'analytics');\n\n openButtons.forEach((button) => {\n button.setAttribute('data-cookie-action', 'open');\n });\n}\n\n//= CookieConsent\nfunction initCookieConsent() {\n const root = pgs(document).querySelector('cookieConsent');\n if (!root) return;\n\n const analyticsToggle = root.querySelector('[pgs~=\"cookieConsent-toggleAnalytics\"]');\n const acceptAllButton = root.querySelector('[pgs~=\"cookieConsent-actionAccept\"]');\n const rejectButton = root.querySelector('[pgs~=\"cookieConsent-actionReject\"]');\n const openButtons = document.querySelectorAll('[pgs~=\"cookieConsent-actionOpen\"]');\n const measurementId = (root.dataset.gaId || '').trim();\n const prefersGa = measurementId.length > 0;\n let lastFocusedElement = null;\n\n assignCookieRuntimeAttributes({ root, analyticsToggle, acceptAllButton, rejectButton, openButtons });\n\n if (analyticsToggle) {\n analyticsToggle.disabled = !prefersGa;\n if (!prefersGa) {\n analyticsToggle.checked = false;\n setPgsFlag(root, 'cookieConsent-gaUnavailable', true);\n } else {\n setPgsFlag(root, 'cookieConsent-gaUnavailable', false);\n }\n }\n\n bootstrapGtag();\n window.gtag('consent', 'default', { analytics_storage: 'denied' });\n\n function setBannerVisibility(show) {\n root.hidden = !show;\n root.setAttribute('aria-hidden', String(!show));\n document.body.classList.toggle('cookieConsent-open', show);\n if (show) {\n lastFocusedElement = document.activeElement;\n setTimeout(() => {\n root.focus();\n }, 0);\n } else if (lastFocusedElement instanceof HTMLElement) {\n lastFocusedElement.focus({ preventScroll: true });\n }\n }\n\n function closeBanner() {\n setBannerVisibility(false);\n }\n\n function openBanner() {\n setBannerVisibility(true);\n }\n\n function persistAndApply(allowAnalytics) {\n savePreferences({ analytics: allowAnalytics });\n setPgsFlag(root, 'cookieConsent-accepted', !!allowAnalytics);\n setPgsFlag(root, 'cookieConsent-declined', !allowAnalytics);\n applyAnalyticsConsent({ allowAnalytics: !!allowAnalytics, measurementId });\n }\n\n acceptAllButton?.addEventListener('click', () => {\n if (analyticsToggle && prefersGa) analyticsToggle.checked = true;\n persistAndApply(!!prefersGa);\n closeBanner();\n });\n\n rejectButton?.addEventListener('click', () => {\n const allowAnalytics = analyticsToggle ? analyticsToggle.checked && prefersGa : false;\n if (!allowAnalytics && analyticsToggle) analyticsToggle.checked = false;\n persistAndApply(allowAnalytics);\n closeBanner();\n });\n\n analyticsToggle?.addEventListener('change', (event) => {\n if (!prefersGa && event.target instanceof HTMLInputElement) {\n event.target.checked = false;\n }\n });\n\n root.addEventListener('keydown', (event) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n closeBanner();\n } else if (event.key === 'Tab') {\n const focusables = root.querySelectorAll(focusableSelectors);\n if (focusables.length === 0) return;\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n }\n }\n });\n\n openButtons.forEach((button) => {\n button.addEventListener('click', (event) => {\n event.preventDefault();\n openBanner();\n });\n });\n\n const savedPrefs = readPreferences();\n if (savedPrefs && typeof savedPrefs.analytics === 'boolean') {\n if (analyticsToggle) analyticsToggle.checked = !!savedPrefs.analytics && prefersGa;\n persistAndApply(savedPrefs.analytics && prefersGa);\n closeBanner();\n } else {\n setBannerVisibility(true);\n }\n}\n\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initCookieConsent);\n} else {\n initCookieConsent();\n}\n","// The module cache\nconst __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tconst cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tconst module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\tif (!(moduleId in __webpack_modules__)) {\n\t\tdelete __webpack_module_cache__[moduleId];\n\t\tconst e = new Error(\"Cannot find module '\" + moduleId + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tconst getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter/value functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tif(Array.isArray(definition)) {\n\t\tvar i = 0;\n\t\twhile(i < definition.length) {\n\t\t\tvar key = definition[i++];\n\t\t\tvar binding = definition[i++];\n\t\t\tif(!__webpack_require__.o(exports, key)) {\n\t\t\t\tif(binding === 0) {\n\t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, value: definition[i++] });\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: binding });\n\t\t\t\t}\n\t\t\t} else if(binding === 0) { i++; }\n\t\t}\n\t} else {\n\t\tfor(var key in definition) {\n\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t\t}\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","//= PGS\nimport { pgs } from \"./_pgs.js\";\nexport { pgs } from \"./_pgs.js\";\n\n//= BASE\nimport \"./base/_darkmode.js\";\nimport \"./base/_svg.js\";\nimport \"./base/_object.js\";\n\n//= CN \nimport \"./components/_accordion.js\";\nimport \"./components/_dropdown.js\";\nimport \"./components/_menu.js\"\nimport \"./components/_modals.js\";\nimport \"./components/_search.js\";\nimport \"./components/_slides.js\"\nimport \"./components/_steps.js\";\nimport \"./components/_stepTabs.js\";\nimport \"./components/_summary.js\";\nimport \"./components/_notifications.js\";\n\n//= IMPORT REGISTRY\nimport \"./_imports.js\";\n\n//= LAYOUT \nimport \"./layout/_header.js\";\n\n//= PATTERNS \nimport \"./patterns/_cookieConsent.js\";\n"],"names":[],"sourceRoot":""}
|