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.
Files changed (88) hide show
  1. package/AGENTS.md +2 -2
  2. package/assets/javascript/components/_accordion.js +2 -2
  3. package/assets/javascript/components/_modals.js +159 -136
  4. package/assets/javascript/components/_notifications.js +19 -9
  5. package/assets/javascript/components/_search.js +2 -2
  6. package/assets/javascript/components/_slides.js +66 -32
  7. package/assets/javascript/components/_stepTabs.js +4 -4
  8. package/assets/javascript/components/_steps.js +2 -2
  9. package/assets/javascript/components/_summary.js +2 -2
  10. package/assets/javascript/functions/_formValidate.js +97 -53
  11. package/assets/javascript/functions/_scrollY.js +10 -10
  12. package/assets/javascript/layout/_header.js +3 -0
  13. package/assets/scss/base/_html.scss +2 -2
  14. package/assets/scss/base/_variables.scss +2 -2
  15. package/assets/scss/components/_form.scss +2 -2
  16. package/assets/scss/components/_notification.scss +23 -30
  17. package/assets/scss/components/_search.scss +27 -21
  18. package/assets/scss/layout/_pageShell.scss +18 -15
  19. package/assets/scss/mixin/_mx-form.scss +7 -7
  20. package/{templates/html → demo}/demo.html +1 -1
  21. package/demo/demo.js +240 -0
  22. package/dist/css/index.css +86 -92
  23. package/dist/css/index.css.map +1 -1
  24. package/dist/css/index.min.css +1 -1
  25. package/dist/javascript/index.js +356 -255
  26. package/dist/javascript/index.js.map +1 -1
  27. package/dist/javascript/index.min.js +1 -1
  28. package/docs/componenti-e-markup.md +26 -27
  29. package/docs/components/accordion.md +61 -0
  30. package/docs/components/badges.md +67 -0
  31. package/docs/components/breadcumbs.md +43 -0
  32. package/docs/components/button.md +59 -0
  33. package/docs/components/card.md +50 -0
  34. package/docs/components/dropdown.md +135 -0
  35. package/docs/components/form.md +113 -0
  36. package/docs/components/logo.md +36 -0
  37. package/docs/components/menu.md +90 -0
  38. package/docs/components/modal.md +131 -0
  39. package/docs/components/notification.md +81 -0
  40. package/docs/components/search.md +117 -0
  41. package/docs/components/slides.md +85 -0
  42. package/docs/components/stepTabs.md +93 -0
  43. package/docs/components/steps.md +56 -0
  44. package/docs/components/summary.md +49 -0
  45. package/docs/components/table.md +42 -0
  46. package/docs/components/tooltip.md +53 -0
  47. package/docs/helper-javascript.md +68 -3
  48. package/docs/layout/body.md +41 -0
  49. package/docs/layout/flex.md +116 -0
  50. package/docs/layout/footer.md +71 -0
  51. package/docs/layout/grid.md +116 -0
  52. package/docs/layout/header.md +116 -0
  53. package/docs/layout/pageShell.md +94 -0
  54. package/docs/layout/section.md +69 -0
  55. package/docs/patterns/cookieConsent.md +89 -0
  56. package/package.json +2 -1
  57. package/scripts/generate-component-docs.js +557 -0
  58. package/templates/html/components/accordion.html +33 -4
  59. package/templates/html/components/badges.html +23 -0
  60. package/templates/html/components/breadcumbs.html +14 -0
  61. package/templates/html/components/button.html +22 -0
  62. package/templates/html/components/card.html +20 -0
  63. package/templates/html/components/dropdown.html +34 -0
  64. package/templates/html/components/form.html +82 -4
  65. package/templates/html/components/logo.html +21 -0
  66. package/templates/html/components/menu.html +33 -6
  67. package/templates/html/components/modal.html +44 -0
  68. package/templates/html/components/notification.html +68 -32
  69. package/templates/html/components/search.html +76 -0
  70. package/templates/html/components/slides.html +43 -0
  71. package/templates/html/components/stepTabs.html +47 -0
  72. package/templates/html/components/steps.html +24 -0
  73. package/templates/html/components/summary.html +27 -0
  74. package/templates/html/components/table.html +12 -0
  75. package/templates/html/components/tooltip.html +35 -0
  76. package/templates/html/layout/body.html +20 -5
  77. package/templates/html/layout/flex.html +20 -0
  78. package/templates/html/layout/footer.html +29 -1
  79. package/templates/html/layout/grid.html +20 -0
  80. package/templates/html/layout/header.html +41 -0
  81. package/templates/html/layout/pageShell.html +19 -0
  82. package/templates/html/layout/section.html +32 -10
  83. package/templates/html/patterns/cookieConsent.html +31 -0
  84. package/templates/react/components/form.jsx +3 -3
  85. package/templates/react/components/notification.jsx +4 -4
  86. package/templates/react/patterns/footer.jsx +1 -1
  87. package/templates/html/demo.js +0 -130
  88. /package/{templates/html → demo}/demo.css +0 -0
@@ -1,5 +1,34 @@
1
- <ul pgs="grid-1 gapTexts">
2
- <li pgs="accordion" >
1
+ <!--
2
+ /**
3
+ * @title Accordion
4
+ * @description Componente interattivo che espande un pannello alla volta, sincronizzando visibilità, attributi ARIA e navigazione da tastiera.
5
+ *
6
+ * @pgs
7
+ * - accordion: identifica ogni elemento espandibile inizializzato dal modulo JavaScript.
8
+ * - accordion-button: identifica il controllo che apre o chiude il pannello associato.
9
+ * - accordion-content: identifica il pannello di contenuto gestito tramite l'attributo hidden.
10
+ *
11
+ * @pgs-state
12
+ * - open: indica l'elemento accordion attualmente aperto e visibile.
13
+ *
14
+ * @api
15
+ * - pgs.accordion.init(root): inizializza gli accordion non ancora registrati dentro Document o Element indicato.
16
+ * - pgs.accordion.api(element): restituisce l'istanza associata a un root accordion inizializzato.
17
+ * - instance.open(): apre il pannello e chiude gli altri accordion presenti nella pagina.
18
+ * - instance.close(): chiude il pannello corrente.
19
+ * - instance.toggle(): inverte lo stato aperto o chiuso del pannello.
20
+ * - instance.refresh(): riesegue l'inizializzazione nel contenitore dell'accordion e restituisce l'istanza.
21
+ * - instance.isOpen(): restituisce true quando lo stato open è attivo.
22
+ *
23
+ * @related
24
+ * - flexColumnTexts: applica la spaziatura testuale tra gli elementi della lista.
25
+ *
26
+ * @return Lista HTML di elementi accordion accessibili con pulsante e pannello associato.
27
+ */
28
+ -->
29
+
30
+ <ul pgs="flexColumnTexts">
31
+ <li pgs="accordion">
3
32
  <button pgs="accordion-button" type="button">
4
33
  <i class="fa-solid fa-circle-question" aria-hidden="true"></i>
5
34
  <span>Domanda frequente</span>
@@ -10,7 +39,7 @@
10
39
  </div>
11
40
  </li>
12
41
 
13
- <li pgs="accordion" >
42
+ <li pgs="accordion">
14
43
  <button pgs="accordion-button" type="button">
15
44
  <i class="fa-solid fa-circle-info" aria-hidden="true"></i>
16
45
  <span>Seconda sezione</span>
@@ -20,4 +49,4 @@
20
49
  <p>Altro contenuto del pannello accordion.</p>
21
50
  </div>
22
51
  </li>
23
- </ul>
52
+ </ul>
@@ -1,3 +1,26 @@
1
+ <!--
2
+ /**
3
+ * @title Badge
4
+ * @description Raccolta di indicatori compatti per mostrare categorie, priorità e stati visivi con varianti cromatiche coerenti.
5
+ *
6
+ * @pgs
7
+ * - badge: identifica la variante base del badge.
8
+ * - badgePrimary: applica la variante con colore primario.
9
+ * - badgeStrong: applica la variante ad alto contrasto.
10
+ * - badgeSuccess: rappresenta un esito positivo.
11
+ * - badgeDot: aggiunge un indicatore puntiforme al badge.
12
+ * - badgeWarning: rappresenta un avviso.
13
+ * - badgeError: rappresenta un errore.
14
+ * - badgeInfo: rappresenta un'informazione.
15
+ * - badgeNeutral: applica la variante neutra.
16
+ *
17
+ * @related
18
+ * - flexRow: dispone i badge orizzontalmente consentendo il ritorno a capo.
19
+ *
20
+ * @return Esempi HTML delle varianti badge disponibili.
21
+ */
22
+ -->
23
+
1
24
  <div pgs="flexRow">
2
25
  <span pgs="badge">
3
26
  Base
@@ -1,3 +1,17 @@
1
+ <!--
2
+ /**
3
+ * @title Breadcrumb
4
+ * @description Navigazione gerarchica che mostra il percorso della pagina corrente con collegamenti, separatori e indicazione semantica dell'elemento attivo.
5
+ *
6
+ * @pgs
7
+ * - breadcrumb: identifica la lista principale del percorso di navigazione.
8
+ * - breadcrumb-item: identifica ogni livello del percorso.
9
+ * - breadcrumb-item-separator: identifica il separatore decorativo nascosto alle tecnologie assistive.
10
+ *
11
+ * @return Struttura HTML semantica di una breadcrumb racchiusa in un elemento nav.
12
+ */
13
+ -->
14
+
1
15
  <nav aria-label="Breadcrumb">
2
16
  <ul pgs="breadcrumb">
3
17
  <li pgs="breadcrumb-item">
@@ -1,3 +1,25 @@
1
+ <!--
2
+ /**
3
+ * @title Button
4
+ * @description Varianti di pulsante e collegamento d'azione con dimensioni, enfasi e composizione icona-testo definite dal design system.
5
+ *
6
+ * @pgs
7
+ * - button: identifica il pulsante standard utilizzabile anche su elementi a.
8
+ * - buttonStrong: applica la variante con maggiore enfasi visiva.
9
+ * - buttonIcon: identifica un pulsante compatto composto principalmente da un'icona.
10
+ * - buttonMini: applica la variante di dimensione minima.
11
+ * - buttonBig: applica la variante di dimensione ampia.
12
+ *
13
+ * @pgs-option
14
+ * - buttonReverse: inverte l'ordine visivo di testo e icona sul pulsante a cui è applicata.
15
+ *
16
+ * @related
17
+ * - flexRow: dispone gli esempi di pulsante su una riga flessibile.
18
+ *
19
+ * @return Raccolta HTML delle principali varianti di button.
20
+ */
21
+ -->
22
+
1
23
  <div pgs="flexRow">
2
24
  <a pgs="button" href="#">
3
25
  <i class="fa-duotone fa-solid fa-store"></i>
@@ -1,3 +1,23 @@
1
+ <!--
2
+ /**
3
+ * @title Card
4
+ * @description Contenitore riutilizzabile per raggruppare immagine, titolo, testo e azioni in anteprime o raccolte responsive.
5
+ *
6
+ * @pgs
7
+ * - card: identifica il contenitore principale della scheda.
8
+ * - card-img: identifica l'immagine principale della card.
9
+ *
10
+ * @related
11
+ * - flex-2: dispone le card in un layout responsive a due elementi.
12
+ * - flexColumn: organizza verticalmente il contenuto della card o del relativo link.
13
+ * - imgCover: adatta l'immagine riempiendo l'area disponibile.
14
+ * - flexColumnTexts: applica la spaziatura verticale ai contenuti testuali.
15
+ * - button: presenta il collegamento finale come pulsante standard.
16
+ *
17
+ * @return Due strutture HTML di card, una con azione separata e una interamente cliccabile.
18
+ */
19
+ -->
20
+
1
21
  <div pgs="flex-2">
2
22
 
3
23
  <article pgs="card flexColumn">
@@ -1,3 +1,37 @@
1
+ <!--
2
+ /**
3
+ * @title Dropdown
4
+ * @description Componente a comparsa che associa un controllo a un contenuto posizionato rispetto al trigger e gestisce apertura, chiusura, click esterno ed Escape.
5
+ *
6
+ * @pgs
7
+ * - dropdown: identifica il contenitore inizializzato dal modulo dropdown.
8
+ * - dropdown-button: identifica il controllo che apre o chiude il contenuto.
9
+ * - dropdown-content: identifica il pannello posizionato rispetto al controllo.
10
+ *
11
+ * @pgs-option
12
+ * - position: configura il root come position[lato allineamento]; lato accetta top, right, bottom o left e l'allineamento compatibile accetta top, right, bottom, left o center. Il valore predefinito è bottom center.
13
+ * - buttonReverse: inverte testo e icona sui pulsanti di esempio e appartiene al componente button.
14
+ *
15
+ * @pgs-state
16
+ * - open: indica che il dropdown è aperto e che il contenuto è visibile.
17
+ *
18
+ * @api
19
+ * - pgs.dropdown.init(root): inizializza i dropdown non ancora registrati dentro Document o Element indicato.
20
+ * - pgs.dropdown.api(element): restituisce l'istanza associata a un root dropdown inizializzato.
21
+ * - instance.open(): apre il dropdown, chiudendo eventuali altri dropdown aperti.
22
+ * - instance.close(): chiude il dropdown corrente.
23
+ * - instance.toggle(): inverte lo stato aperto o chiuso.
24
+ * - instance.refresh(): reinizializza il contesto e ricalcola il posizionamento del contenuto.
25
+ * - instance.isOpen(): restituisce true quando il dropdown è aperto.
26
+ *
27
+ * @related
28
+ * - flexRow: dispone i diversi esempi di posizionamento sulla stessa riga flessibile.
29
+ * - button: applica lo stile standard ai controlli del dropdown.
30
+ *
31
+ * @return Serie di dropdown HTML che dimostra le direzioni di posizionamento supportate.
32
+ */
33
+ -->
34
+
1
35
  <div pgs="flexRow">
2
36
 
3
37
  <span pgs="dropdown">
@@ -1,18 +1,62 @@
1
- <form pgs="form" action="#" method="post">
1
+ <!--
2
+ /**
3
+ * @title Form
4
+ * @description Struttura di modulo con etichette, campi testuali, textarea e controllo toggle compatibile con i vincoli HTML e con regole personalizzate di PGS_formValidate.
5
+ *
6
+ * @pgs
7
+ * - form: identifica il contenitore del modulo e applica il layout dei campi.
8
+ * - formValidate: abilita gli stili associati agli stati di validazione gestiti dalla utility JavaScript.
9
+ * - label: identifica le etichette associate ai controlli.
10
+ * - input: applica lo stile condiviso agli input testuali.
11
+ * - textarea: applica lo stile condiviso all'area di testo.
12
+ * - toggle: presenta una checkbox come controllo a due stati.
13
+ *
14
+ * @pgs-option
15
+ * - message: definisce il messaggio specifico del campo con la sintassi message[Testo del messaggio].
16
+ * - error: viene applicata a runtime al form e ai campi che non superano la validazione.
17
+ * - success: viene applicata a runtime al form quando la validazione ha esito positivo.
18
+ *
19
+ * @api
20
+ * - new pgs.formValidate(form, options): crea una utility associata direttamente al form, aggiunge automaticamente novalidate e accetta fieldError, fieldsError e success in options.message; i messaggi restano modificabili tramite instance.message.
21
+ * - instance.validator(callback, eventName): intercetta l'evento indicato, previene il comportamento predefinito, valida il form, mostra il messaggio di successo e richiama callback solo quando è valido; eventName usa submit come valore predefinito.
22
+ * - instance.validate(): valida i campi required, aggiorna gli attributi di stato e restituisce true o false.
23
+ * - instance.success(text): valida il form e mostra un toast positivo quando non sono presenti errori.
24
+ * - instance.addNewRule(rule): aggiunge una funzione che restituisce uno o più campi non validi; validate applica automaticamente addFieldError a ciascun campo.
25
+ * - instance.addFieldError(field, index, total): marca un campo come non valido; mostra il messaggio specifico per un solo errore o un messaggio riepilogativo per più errori.
26
+ * - instance.removeFieldError(field): rimuove lo stato di errore dal campo indicato.
27
+ *
28
+ * @related
29
+ * - buttonStrong: presenta l'invio del modulo come azione primaria.
30
+ *
31
+ * @return Modulo HTML completo con campi required e script di esempio per una regola personalizzata, la validazione e il messaggio di successo.
32
+ */
33
+ -->
34
+
35
+ <form pgs="form formValidate" action="#" method="post">
2
36
  <label pgs="label" for="form-name">
3
37
  Nome
4
38
  </label>
5
- <input id="form-name" pgs="input" type="text" name="name" placeholder="Mario Rossi" required data-form-field-message="Inserisci il nome">
39
+ <input id="form-name" pgs="input" pgs-option="message[Inserisci il nome]" type="text" name="name" placeholder="Mario Rossi" required>
6
40
 
7
41
  <label pgs="label" for="form-email">
8
42
  Email
9
43
  </label>
10
- <input id="form-email" pgs="input" type="email" name="email" placeholder="nome@example.com" required data-form-field-message="Inserisci una email valida">
44
+ <input id="form-email" pgs="input" pgs-option="message[Inserisci una email valida]" type="email" name="email" placeholder="nome@example.com" required>
45
+
46
+ <label pgs="label" for="form-password">
47
+ Password
48
+ </label>
49
+ <input id="form-password" pgs="input" pgs-option="message[Inserisci una password]" type="password" name="password" autocomplete="new-password" required>
50
+
51
+ <label pgs="label" for="form-confirm-password">
52
+ Conferma password
53
+ </label>
54
+ <input id="form-confirm-password" pgs="input" pgs-option="message[Conferma la password]" type="password" name="confirmPassword" autocomplete="new-password" required>
11
55
 
12
56
  <label pgs="label" for="form-message">
13
57
  Messaggio
14
58
  </label>
15
- <textarea id="form-message" pgs="textarea" name="message" rows="5" placeholder="Scrivi il messaggio"></textarea>
59
+ <textarea id="form-message" pgs="textarea" name="message" rows="5" placeholder="Scrivi il messaggio" required></textarea>
16
60
 
17
61
  <label pgs="toggle">
18
62
  <span>Accetto la privacy policy</span>
@@ -24,3 +68,37 @@
24
68
  Invia
25
69
  </button>
26
70
  </form>
71
+
72
+ <script type="module">
73
+ import { pgs } from "mypgs";
74
+
75
+ const form = pgs(document).querySelector("form");
76
+
77
+ const password = form.querySelector('input[name="password"]');
78
+ const confirmPassword = form.querySelector('input[name="confirmPassword"]');
79
+ if (!password || !confirmPassword) return;
80
+
81
+ const formValidate = new pgs.formValidate(form, {
82
+ message: {
83
+ fieldError: "Completa questo campo",
84
+ fieldsError: "Completa tutti i campi obbligatori",
85
+ success: "Inviato con successo"
86
+ }
87
+ });
88
+
89
+ //== new roules
90
+ formValidate.addNewRule(() => {
91
+ if (password.value && confirmPassword.value && password.value !== confirmPassword.value) {
92
+ pgs(confirmPassword).option.setValueBrackets("message", "Le password non coincidono");
93
+ return [confirmPassword, password];
94
+ }
95
+ });
96
+
97
+ //== validate
98
+ formValidate.validator(event => {
99
+ const values = Object.fromEntries(new FormData(form));
100
+
101
+ // Sostituisci questo log con l'invio dei dati al tuo backend.
102
+ console.log(values);
103
+ }, "submit");
104
+ </script>
@@ -1,3 +1,24 @@
1
+ <!--
2
+ /**
3
+ * @title Logo
4
+ * @description Componente per mostrare un logo grafico o testuale, con supporto alle varianti dell'immagine legate al tema scuro.
5
+ *
6
+ * @pgs
7
+ * - logo: identifica il collegamento contenitore del marchio.
8
+ * - logo-image: identifica l'immagine grafica del logo.
9
+ * - logo-text: identifica la variante testuale del marchio.
10
+ *
11
+ * @pgs-option
12
+ * - logoDarkmode: inverte l'immagine del logo quando lo stato globale darkmode è attivo.
13
+ * - logoDarkmodeFixed: mantiene applicata l'inversione dell'immagine indipendentemente dal tema corrente.
14
+ *
15
+ * @pgs-state
16
+ * - darkmode: stato globale applicato al documento che attiva la variante logoDarkmode.
17
+ *
18
+ * @return Esempi HTML del logo grafico sensibile al tema e del logo testuale.
19
+ */
20
+ -->
21
+
1
22
  <a aria-label="Logo" pgs="logo" pgs-option="logoDarkmode" href="/">
2
23
  <img pgs="logo-image" src="https://placehold.co/240x80?text=MyPGS" alt="MyPGS">
3
24
  </a>
@@ -1,3 +1,36 @@
1
+ <!--
2
+ /**
3
+ * @title Menu
4
+ * @description Navigazione orizzontale o verticale che trasforma le voci con sottomenu in dropdown accessibili e inizializzati automaticamente.
5
+ *
6
+ * @pgs
7
+ * - menu: identifica il contenitore di navigazione elaborato dal modulo menu.
8
+ * - menu-buttonIcon: identifica il controllo creato dinamicamente accanto alle voci con sottomenu.
9
+ *
10
+ * @pgs-option
11
+ * - horizontal: dispone il menu e i suoi elementi in orizzontale.
12
+ * - vertical: dispone il menu e i suoi elementi in verticale.
13
+ * - menuHeader: adatta spaziature e comportamento del menu quando è inserito nell'header.
14
+ * - position: viene impostata come position[bottom right] sui dropdown creati per i sottomenu.
15
+ *
16
+ * @pgs-state
17
+ * - open: indica il sottomenu trasformato in dropdown attualmente aperto.
18
+ *
19
+ * @api
20
+ * - pgs.menu.init(root): inizializza i menu non ancora registrati dentro Document o Element indicato e prepara i sottomenu.
21
+ * - pgs.menu.api(element): restituisce l'istanza associata a un root menu inizializzato.
22
+ * - instance.refresh(): riesegue l'inizializzazione nel contenitore del menu e restituisce l'istanza.
23
+ *
24
+ * @related
25
+ * - dropdown: viene aggiunto dinamicamente alle voci che contengono una lista annidata.
26
+ * - dropdown-button: identifica il controllo dinamico del sottomenu.
27
+ * - buttonNohover: neutralizza lo stile hover del controllo dinamico.
28
+ * - dropdown-content: identifica la lista annidata mostrata come pannello dropdown.
29
+ *
30
+ * @return Due strutture nav complete per le varianti orizzontale e verticale del menu.
31
+ */
32
+ -->
33
+
1
34
  <nav pgs="menu" pgs-option="horizontal" aria-label="Menu orizzontale">
2
35
  <ul>
3
36
  <li>
@@ -16,12 +49,6 @@
16
49
  <li><a href="/servizi/due">Servizio due</a></li>
17
50
  </ul>
18
51
  </li>
19
- <li>
20
- <a href="/about">
21
- <i class="fa-solid fa-info-circle" aria-hidden="true"></i>
22
- <span>about</span>
23
- </a>
24
- </li>
25
52
  </ul>
26
53
  </nav>
27
54
 
@@ -1,3 +1,47 @@
1
+ <!--
2
+ /**
3
+ * @title Modal
4
+ * @description Componente che collega un pulsante a un dialog nativo, ne gestisce apertura e chiusura e può spostarlo in un contenitore configurato.
5
+ *
6
+ * @pgs
7
+ * - modal: identifica il contenitore logico inizializzato dal modulo modal.
8
+ * - modal-button: identifica il controllo di apertura della finestra.
9
+ * - dialog: token aggiunto dinamicamente all'elemento dialog inizializzato.
10
+ * - modal-dialog: identifica il dialog nativo dopo l'inizializzazione JavaScript.
11
+ * - modal-dialog-content: identifica il contenitore visivo della finestra.
12
+ * - modal-dialog-content-header: identifica l'intestazione che può ricevere il pulsante di chiusura automatico.
13
+ * - modal-dialog-content-scroll: identifica l'area interna scorrevole.
14
+ * - modal-close: identifica un controllo che chiude la finestra.
15
+ *
16
+ * @pgs-option
17
+ * - containerID: sul root usa containerID[id] per spostare il dialog nell'elemento con l'id indicato.
18
+ * - containerPGS: sul root usa containerPGS[token] per spostare il dialog nel primo elemento con quel token pgs.
19
+ * - disableBackdropClose: sul root impedisce la chiusura tramite click sul backdrop.
20
+ * - history: sul root sincronizza l'apertura con il parametro modal nella cronologia del browser e richiede un id sul pulsante.
21
+ * - topLevel: sul dialog mantiene la finestra nel componente e usa showModal per una modale top-level.
22
+ * - left: sul dialog posiziona e anima il contenuto dal lato sinistro.
23
+ * - right: sul dialog posiziona e anima il contenuto dal lato destro.
24
+ *
25
+ * @api
26
+ * - pgs.modal.init(root): inizializza le modali presenti nel Document o Element indicato; il valore predefinito è document.
27
+ * - pgs.modal.api(element): restituisce l'istanza associata a un root modal inizializzato.
28
+ * - instance.open(): apre la finestra se non è già aperta.
29
+ * - instance.close(): chiude la finestra se è aperta.
30
+ * - instance.toggle(): apre la finestra oppure la chiude quando è già aperta.
31
+ * - instance.refresh(): rilegge opzioni e collegamenti della modale, sostituisce listener e observer precedenti e restituisce la nuova API.
32
+ * - instance.isOpen(): restituisce true quando l'elemento dialog possiede lo stato nativo open.
33
+ *
34
+ * @related
35
+ * - button: presenta i controlli di apertura, chiusura e annullamento come pulsanti standard.
36
+ * - buttonStrong: presenta l'azione di conferma con maggiore enfasi.
37
+ * - buttonClose: viene aggiunto automaticamente al controllo di chiusura quando manca nel markup.
38
+ * - flexColumnElements: organizza verticalmente il contenuto della modale di conferma.
39
+ * - flexRow: dispone affiancate le azioni della modale di conferma.
40
+ *
41
+ * @return Quattro esempi basati su dialog nativo e un contenitore opzionale usato da containerID.
42
+ */
43
+ -->
44
+
1
45
  <div pgs="modal" pgs-option="containerID[modal-container]">
2
46
  <button pgs="modal-button button" type="button">
3
47
  <i class="fa-solid fa-window-maximize"></i> Apri modale
@@ -1,35 +1,71 @@
1
+ <!--
2
+ /**
3
+ * @title Notification
4
+ * @description Sistema di notifiche persistenti o toast temporanei, generati dall'API oppure da una configurazione JSON dichiarativa contenuta nell'opzione notification.
5
+ *
6
+ * @pgs
7
+ * - notification: identifica il contenitore delle notifiche, sia persistenti sia temporanee.
8
+ * - notificationTrigger: identifica una configurazione dichiarativa elaborata e rimossa all'inizializzazione.
9
+ * - notification-element: identifica ogni messaggio creato dinamicamente.
10
+ * - notification-element-title: identifica il titolo generato del messaggio.
11
+ * - notification-element-content: identifica il contenuto generato del messaggio.
12
+ *
13
+ * @pgs-option
14
+ * - toast: sul contenitore notification abilita il posizionamento centrale e la sostituzione del messaggio temporaneo corrente.
15
+ * - notification: contiene un oggetto JSON con title, message, element, type, icon, duration e link usando la sintassi notification[{...}].
16
+ *
17
+ * @pgs-state
18
+ * - success: applica la variante positiva al messaggio generato.
19
+ * - error: applica la variante di errore e il ruolo alert.
20
+ * - warning: applica la variante di avviso.
21
+ * - info: applica la variante informativa predefinita.
22
+ *
23
+ * @api
24
+ * - pgs.notification.trigger(root): elabora e rimuove i notificationTrigger dichiarativi presenti nel contesto indicato.
25
+ * - pgs.notification.alert.error(text, link, timeout, icon): crea una notifica persistente di errore, opzionalmente cliccabile e temporizzata.
26
+ * - pgs.notification.alert.success(text, link, timeout, icon): crea una notifica persistente di successo.
27
+ * - pgs.notification.alert.info(text, link, timeout, icon): crea una notifica persistente informativa.
28
+ * - pgs.notification.alert.warning(text, link, timeout, icon): crea una notifica persistente di avviso.
29
+ * - pgs.notification.alert.deleteAll(): rimuove tutte le notifiche persistenti.
30
+ * - pgs.notification.toast.error(text, timeout, icon): crea un toast di errore sostituendo quello eventualmente presente.
31
+ * - pgs.notification.toast.success(text, timeout, icon): crea un toast di successo.
32
+ * - pgs.notification.toast.info(text, timeout, icon): crea un toast informativo.
33
+ * - pgs.notification.toast.warning(text, timeout, icon): crea un toast di avviso.
34
+ * - pgs.notification.toast.deleteAll(): rimuove il toast corrente.
35
+ *
36
+ * @related
37
+ * - hidden: nasconde i trigger dichiarativi prima che vengano elaborati.
38
+ * - buttonClose: identifica il pulsante di rimozione aggiunto a ogni messaggio.
39
+ *
40
+ * @return Due contenitori notification, uno persistente e uno configurato con l'opzione toast, con trigger dichiarativi configurati tramite pgs-option.
41
+ */
42
+ -->
43
+
1
44
  <div pgs="notification" aria-live="polite"></div>
2
- <div pgs="toast" aria-live="polite"></div>
45
+ <div pgs="notification" pgs-option="toast" aria-live="polite"></div>
3
46
 
4
- <div pgs="hidden notificationTrigger" data-notification='{
5
- "title":"Titolo",
6
- "message":"Messaggio",
7
- "element":"notification",
8
- "type":"info",
9
- "icon":null,
10
- "duration":"-1",
11
- "link":null
12
- }'>
13
- </div>
14
- <div pgs="hidden notificationTrigger" data-notification='{
15
- "title":"Benvetuto",
16
- "message":"Messaggio",
17
- "element":"toast",
18
- "type":"info",
19
- "icon":null,
20
- "duration":"3000",
21
- "link":null
22
- }'>
23
- </div>
47
+ <div pgs="hidden notificationTrigger" pgs-option='notification[{
48
+ "title": "Titolo",
49
+ "message": "Messaggio",
50
+ "element": "notification",
51
+ "type": "info",
52
+ "icon": null,
53
+ "duration": "-1",
54
+ "link": null
55
+ }]'></div>
56
+
57
+ <div pgs="hidden notificationTrigger" pgs-option='notification[{
58
+ "title": "Benvenuto",
59
+ "message": "Messaggio",
60
+ "element": "toast",
61
+ "type": "info",
62
+ "icon": null,
63
+ "duration": "3000",
64
+ "link": null
65
+ }]'></div>
24
66
  <!--
25
- <div pgs="hidden notificationTrigger" data-notification='{
26
- "title":"Titolo",
27
- "message":"Messaggio",
28
- "element":"notification | toast",
29
- "type":"info | success | warning | error",
30
- "icon":"null | <i class=\"fa-solid fa-rocket\"></i>",
31
- "duration":"-1 | 0 | 4000 | 5000",
32
- "link":"null | /pagina/"
33
- }'>
34
- </div>
35
- -->
67
+ <div
68
+ pgs="hidden notificationTrigger"
69
+ pgs-option='notification[{"title":"Titolo","message":"Messaggio","element":"notification","type":"info","icon":"<i class=\"fa-solid fa-rocket\"></i>","duration":"4000","link":"/pagina/"}]'>
70
+ </div>
71
+ -->
@@ -1,3 +1,55 @@
1
+ <!--
2
+ /**
3
+ * @title Search
4
+ * @description Ricerca componibile con suggerimenti asincroni o locali, navigazione da tastiera, selezione, annullamento richieste e attributi ARIA gestiti dal modulo search.
5
+ *
6
+ * @pgs
7
+ * - search: identifica il form inizializzato come ricerca con suggerimenti.
8
+ * - search-suggestions: identifica la lista opzionale che riceve i risultati.
9
+ * - search-suggestions-item: identifica ogni risultato creato dinamicamente nella lista.
10
+ * - search-modal: identifica la variante di ricerca inserita in una modale per dispositivi mobili.
11
+ * - search-mobile: identifica il contenitore interno della ricerca mobile.
12
+ *
13
+ * @pgs-option
14
+ * - containerPGS: sul wrapper modal usa containerPGS[header] per spostare il dialog nell'header.
15
+ *
16
+ * @pgs-state
17
+ * - open: sul root search indica che la lista dei suggerimenti è aperta.
18
+ * - loading: sul root search indica una sorgente dati in caricamento.
19
+ * - error: sul root search indica che il recupero dei suggerimenti è fallito.
20
+ * - selected: sul risultato generato indica l'elemento attivo durante la navigazione.
21
+ *
22
+ * @api
23
+ * - pgs.search.init(root): inizializza le ricerche non ancora registrate dentro Document o Element indicato.
24
+ * - pgs.search.api(element): restituisce l'istanza associata a un form search inizializzato.
25
+ * - instance.configure(options): aggiorna minLength, debounce, limit, submitOnSelect, searchOnFocus, source e onSelect e restituisce l'istanza.
26
+ * - instance.setSource(source): configura una sorgente array o funzione asincrona per i suggerimenti.
27
+ * - instance.search(query): esegue subito la ricerca e restituisce una Promise con i suggerimenti normalizzati.
28
+ * - instance.open(): apre la lista quando sono disponibili risultati.
29
+ * - instance.close(): chiude la lista e azzera la selezione attiva.
30
+ * - instance.clear(): rimuove risultati e selezione e chiude la lista.
31
+ * - instance.cancel(): annulla debounce e richiesta attiva.
32
+ * - instance.select(index, submit): seleziona un risultato, emette pgs:search:select e può inviare il form.
33
+ * - instance.refresh(): ripete la ricerca usando il valore corrente dell'input.
34
+ * - instance.destroy(): rimuove listener, annulla le operazioni e scollega l'istanza.
35
+ * - instance.items(): restituisce una copia dei suggerimenti correnti.
36
+ * - instance.isOpen(): restituisce true quando la lista dei suggerimenti è aperta.
37
+ * - instance.isLoading(): restituisce true durante il caricamento della sorgente.
38
+ * - instance.setActiveIndex(index): imposta il suggerimento attivo e aggiorna selezione e attributi ARIA.
39
+ *
40
+ * @related
41
+ * - buttonNohover: applica al form l'aspetto compatto condiviso con i controlli button.
42
+ * - modal: fornisce il contenitore e il comportamento della variante mobile.
43
+ * - modal-button: apre la ricerca mobile.
44
+ * - modal-close: chiude la ricerca mobile.
45
+ * - buttonIcon: presenta apertura e chiusura come pulsanti a icona.
46
+ * - flexRow: organizza il contenuto della variante mobile e gli elementi dei suggerimenti generati.
47
+ * - section: applica la spaziatura di sezione alla ricerca mobile.
48
+ *
49
+ * @return Form di ricerca autonomo, variante mobile integrata in una modal e script di esempio con sorgente locale.
50
+ */
51
+ -->
52
+
1
53
  <form pgs="buttonNohover search" autocomplete="off" action="" method="get">
2
54
  <button type="submit" title="Cerca"><i class="fa-solid fa-search"></i></button>
3
55
  <input type="search" name="s" placeholder="Cerca" value="">
@@ -29,3 +81,27 @@
29
81
  </div>
30
82
  </dialog>
31
83
  </div>
84
+
85
+ <script type="module">
86
+ import { pgs } from "mypgs";
87
+
88
+ const components = [
89
+ { label: "Accordion", value: "/componenti/accordion", data: { category: "component" } },
90
+ { label: "Dropdown", value: "/componenti/dropdown", data: { category: "component" } },
91
+ { label: "Modal", value: "/componenti/modal", data: { category: "component" } },
92
+ { label: "Search", value: "/componenti/search", data: { category: "component" } },
93
+ { label: "Page Shell", value: "/layout/page-shell", data: { category: "layout" } },
94
+ ];
95
+
96
+ pgs(document).querySelectorAll("search").forEach(search => {
97
+ pgs.search.api(search)?.configure({
98
+ minLength: 1,
99
+ debounce: 150,
100
+ limit: 5,
101
+ source: components,
102
+ onSelect: ({ item, value }) => {
103
+ console.log(`Selezionato ${item.label}: ${value}`);
104
+ },
105
+ });
106
+ });
107
+ </script>
@@ -1,3 +1,46 @@
1
+ <!--
2
+ /**
3
+ * @title Slides
4
+ * @description Carosello orizzontale che osserva gli elementi visibili e crea automaticamente controlli precedente, successivo e indicatori di posizione.
5
+ *
6
+ * @pgs
7
+ * - slides: identifica il root inizializzato dal modulo slides.
8
+ * - slides-container: identifica la lista orizzontale degli elementi scorrevoli.
9
+ * - slides-prec: identifica il pulsante precedente creato dinamicamente.
10
+ * - slides-next: identifica il pulsante successivo creato dinamicamente.
11
+ * - slides-dots: identifica il contenitore degli indicatori creato dinamicamente.
12
+ *
13
+ * @pgs-option
14
+ * - singleScroll: usa un solo elemento visibile come riferimento per la navigazione precedente e successiva.
15
+ * - shadowDesktop: abilita l'ombreggiatura laterale del carosello sui layout desktop.
16
+ * - notScrollAnimation: applicata a un elemento li disabilita l'animazione visiva basata sulla percentuale di visibilità.
17
+ * - notScrollWithMouse: sul root disabilita la gestione dello scorrimento orizzontale tramite mouse.
18
+ *
19
+ * @api
20
+ * - pgs.slides.init(root): inizializza il root stesso quando è un carosello e tutti i caroselli discendenti non ancora registrati; il valore predefinito è document.
21
+ * - pgs.slides.api(element): restituisce l'istanza associata a un root slides inizializzato.
22
+ * - instance.previous(): porta in vista la slide precedente.
23
+ * - instance.next(): porta in vista la slide successiva.
24
+ * - instance.goTo(index): porta in vista la slide con l'indice indicato.
25
+ * - instance.getCurrentIndexes(): restituisce gli indici delle slide attualmente visibili.
26
+ * - instance.getCurrentElements(): restituisce gli elementi slide attualmente visibili.
27
+ * - instance.getTotal(): restituisce il numero totale di slide.
28
+ * - instance.isAtStart(): restituisce true quando la prima slide è visibile.
29
+ * - instance.isAtEnd(): restituisce true quando l'ultima slide è visibile.
30
+ * - instance.refresh(): sincronizza controlli e dots, sostituisce listener e observer precedenti e restituisce la nuova API.
31
+ *
32
+ * @related
33
+ * - card: usa card come contenuto dimostrativo di ogni slide.
34
+ * - card-img: identifica l'immagine delle card dimostrative.
35
+ * - imgCover: adatta le immagini allo spazio disponibile.
36
+ * - flexColumn: organizza verticalmente ogni card.
37
+ * - flexColumnTexts: applica la spaziatura ai testi delle card.
38
+ * - buttonIcon: viene applicato ai controlli precedente e successivo generati.
39
+ *
40
+ * @return Lista di slide basate su card, completata a runtime con pulsanti e indicatori.
41
+ */
42
+ -->
43
+
1
44
  <div pgs="slides" pgs-option="singleScroll shadowDesktop">
2
45
  <ul pgs="slides-container">
3
46
  <li>