mypgs 1.4.1 → 1.5.1

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/README.md CHANGED
@@ -12,46 +12,44 @@ La libreria nasce come base di design system: layout, spacing, colori, bottoni,
12
12
  - `dist/css/`: CSS compilato.
13
13
  - `dist/javascript/`: bundle JavaScript compilato.
14
14
  - `dist/index.d.ts`: dichiarazioni TypeScript esportate dal pacchetto.
15
- - `AI_GUIDELINES.md`: guida operativa per AI/Codex.
16
- - `AI_GUIDELINES_EN.md`: versione inglese della guida.
15
+ - `AGENTS.md`: guida operativa per AI.
17
16
 
18
17
  ## Installazione
19
18
 
20
- Da registry npm:
19
+ Da registry **npm**:
21
20
 
22
21
  ```bash
23
22
  npm install mypgs
24
23
  ```
25
24
 
26
- ## Uso rapido
27
-
28
- Importa JavaScript e CSS compilato nell'entrypoint del progetto:
25
+ ### JavaScript
29
26
 
30
27
  ```js
31
28
  import "mypgs";
32
- import "mypgs/style.css";
33
29
  ```
34
30
 
35
31
  Se ti serve accedere direttamente all'helper:
36
32
 
37
33
  ```js
38
34
  import { pgs } from "mypgs";
39
- import "mypgs/style.css";
40
35
  ```
41
36
 
42
- Markup minimo consigliato:
37
+ **React/TSX con Vite:**
43
38
 
44
- ```html
45
- <html lang="it" pgs="htmlBase initP">
46
- <body pgs="bodyBase bodyImg bodyText bodyHeading">
47
- <main pgs="main"></main>
48
- </body>
49
- </html>
50
- ```
39
+ Configura il plugin che converte `pgsHtml` in `pgs`:
51
40
 
52
- `initP` e' importante: molti layout, componenti e pattern SCSS sono definiti sotto `[pgs~=initP]`.
41
+ ```ts
42
+ // vite.config.ts
43
+ import { defineConfig } from 'vite'
44
+ import react from "@vitejs/plugin-react";
45
+ import pgsVite from "mypgs/vite-plugin-pgs";
53
46
 
54
- ## Uso SCSS sorgente
47
+ export default {
48
+ plugins: [pgsVite(), react()],
49
+ };
50
+ ```
51
+
52
+ ### SCSS
55
53
 
56
54
  Se il progetto vuole compilare un CSS unico, importa gli SCSS sorgenti:
57
55
 
@@ -67,346 +65,22 @@ Se servono solo i mixin:
67
65
  @use "../../node_modules/mypgs/assets/scss/mixin/mixin.scss" as * ;
68
66
  ```
69
67
 
70
- La libreria espone molte custom properties da preferire agli hardcode, per esempio:
71
-
72
- ```scss
73
- :root {
74
- --color-primary: #5c7d6f;
75
- --padding: 30px;
76
- --gap-texts: 1rem;
77
- --gap-elements: 4rem;
78
- --border-radius: 4.5rem;
79
- --border-radius-input: 2.25rem;
80
- }
81
- ```
82
-
83
- Override consigliato:
84
-
85
- ```scss
86
- #danger-action {
87
- --button-background: var(--color-error);
88
- --button-color: var(--color-whiteFixed);
89
- }
90
- ```
91
-
92
- Evita di riscrivere da zero padding, gap, border-radius o colori se esiste gia' una variabile o un token PGS adatto.
93
-
94
- ## Il sistema `pgs`
95
-
96
- Il markup usa token separati da spazio dentro l'attributo `pgs`:
97
-
98
- ```html
99
- <button pgs="button buttonStrong" type="button">Salva</button>
100
- <section pgs="section flexColumnElements"></section>
101
- ```
102
-
103
- Gli stessi token collegano HTML, SCSS e JavaScript.
104
-
105
- ### Helper JavaScript
106
-
107
- `pgs(root)` permette di cercare e modificare token PGS senza scrivere selettori manuali:
108
-
109
- ```js
110
- const modal = pgs(document).querySelector("modal");
111
-
112
- pgs(modal).contains("modal");
113
- pgs(modal).add("custom-token");
114
- pgs(modal).remove("custom-token");
115
- pgs(modal).toggle("custom-token", true);
116
- ```
117
-
118
- Stati runtime:
119
-
120
- ```js
121
- pgs(modal).state.add("open");
122
- pgs(modal).state.toggle("open", false);
123
- pgs(modal).state.contains("open");
124
- ```
125
-
126
- Opzioni:
68
+ ### Markup
127
69
 
128
- ```js
129
- pgs(modal).option.contains("history");
130
- pgs(modal).option.getValueBrackets("containerID");
131
- ```
132
-
133
- Esempio markup con opzioni:
70
+ `initP` e' importante: tutti i layout, componenti e pattern SCSS sono definiti sotto `[pgs~=initP]`.
134
71
 
135
72
  ```html
136
- <div pgs="modal" pgs-option="containerID[modal-container]"></div>
137
- <div pgs="slides" pgs-option="singleScroll shadowDesktop"></div>
138
- ```
139
-
140
- ## JavaScript inizializzato automaticamente
141
-
142
- Importando `mypgs`, l'entrypoint inizializza:
143
-
144
- - helper globale `pgs`
145
- - dark mode
146
- - gestione object SVG
147
- - accordion
148
- - dropdown
149
- - menu
150
- - modali
151
- - slides
152
- - steps
153
- - step tabs
154
- - notifiche
155
- - header
156
- - cookie consent
157
-
158
- I componenti inizializzati usano `WeakMap` interne per esporre API di istanza.
159
-
160
- ## API dei moduli
161
-
162
- I moduli principali sono registrati in `assets/javascript/_imports.js` in due modi.
163
-
164
- ### Registro diretto
165
-
166
- Serve per usare i moduli direttamente da `pgs`:
167
-
168
- ```js
169
- pgs.registerModules({
170
- accordion: PGS_accordion,
171
- dropdown: PGS_dropdown,
172
- menu: PGS_menu,
173
- modal: PGS_modal,
174
- notification: PGS_notification,
175
- slides: PGS_slides,
176
- stepTabs: PGS_stepTabs,
177
- steps: PGS_steps,
178
- formValidate: PGS_formValidate,
179
- scrollHorizontal: PGS_scrollHorizontal,
180
- });
181
- ```
182
-
183
- Uso consigliato:
184
-
185
- ```js
186
- pgs.notification.toast.success("Salvato");
187
- pgs.modal.api(modalEl)?.open();
188
- pgs.dropdown.api(dropdownEl)?.close();
189
- pgs.slides.api(slidesEl)?.next();
190
- ```
191
-
192
- Shortcut disponibili dopo `import "mypgs"`:
193
-
194
- - `pgs.accordion`
195
- - `pgs.dropdown`
196
- - `pgs.menu`
197
- - `pgs.modal`
198
- - `pgs.notification`
199
- - `pgs.slides`
200
- - `pgs.stepTabs`
201
- - `pgs.steps`
202
- - `pgs.formValidate`
203
- - `pgs.scrollHorizontal`
204
-
205
- ## Struttura dei moduli componente
206
-
207
- I componenti con istanze seguono questo schema:
208
-
209
- ```js
210
- export const PGS_modal = {
211
- init: PGS_modal_init,
212
- api: PGS_modal_api
213
- };
214
- ```
215
-
216
- - `PGS_name`: nome ufficiale del modulo per il registro legacy.
217
- - `init`: inizializza o reinizializza markup, utile dopo contenuti dinamici.
218
- - `api`: recupera l'API di una singola istanza gia' inizializzata.
219
-
220
- Esempio:
221
-
222
- ```js
223
- pgs.modal.init();
224
- pgs.modal.init(container);
225
- pgs.modal.api(modalEl)?.open();
226
- ```
227
-
228
- `PGS_notification` e' un caso diverso: funziona piu' come service/helper e espone `alert`, `toast` e `trigger`.
229
-
230
- ## Componenti e markup
231
-
232
- I template completi sono in `templates/html/components/`, `templates/html/patterns/` e `templates/html/layout/`. Usa quei file come sorgente di riferimento prima di creare markup nuovo.
233
-
234
- ## Componenti disponibili
235
-
236
- Layout e utility:
237
-
238
- - `main`
239
- - `section`
240
- - `sectionFull`
241
- - `sectionMax`
242
- - `sectionNoPadding`
243
- - `container`
244
- - `pageShell`
245
- - `aside`
246
- - `flexColumn`
247
- - `flexColumnTexts`
248
- - `flexColumnElements`
249
- - `flexColumnSections`
250
- - `flexRow`
251
- - `grid-*`
252
- - `gapTexts`
253
- - `gapElements`
254
- - `gapSections`
255
- - `card`
256
- - `boxtext`
257
-
258
- Componenti:
259
-
260
- - `button`
261
- - `buttonStrong`
262
- - `buttonIcon`
263
- - `buttonMini`
264
- - `buttonBig`
265
- - `buttonClose`
266
- - `form`
267
- - `input`
268
- - `textarea`
269
- - `select`
270
- - `toggle`
271
- - `checkbox`
272
- - `radio`
273
- - `dropdown`
274
- - `tooltip`
275
- - `modal`
276
- - `accordion`
277
- - `slides`
278
- - `steps`
279
- - `stepTabs`
280
- - `notification`
281
- - `toast`
282
- - `table`
283
- - `breadcrumb`
284
- - `searchbar`
285
- - `logo`
286
- - `menuHorizontal`
287
- - `menuVertical`
288
- - `menuFooter`
289
-
290
- Pattern:
291
-
292
- - `header`
293
- - `footer`
294
- - `cookieConsent`
295
-
296
- ## Export npm
297
-
298
- Il pacchetto espone:
299
-
300
- ```json
301
- {
302
- ".": {
303
- "types": "./dist/index.d.ts",
304
- "import": "./assets/javascript/index.js",
305
- "default": "./dist/javascript/index.js"
306
- },
307
- "./style.css": "./dist/css/index.css",
308
- "./style.min.css": "./dist/css/index.min.css"
309
- }
310
- ```
311
-
312
- Uso compilato:
313
-
314
- ```js
315
- import "mypgs";
316
- import "mypgs/style.css";
317
- ```
318
-
319
- Uso sorgente SCSS:
320
-
321
- ```scss
322
- @use "sass:meta";
323
- @use "../../node_modules/mypgs/assets/scss/mixin/mixin.scss" as * ;
324
- @include meta.load-css("../../node_modules/mypgs/assets/scss/index.scss");
325
- ```
326
-
327
- ## Sviluppo
328
-
329
- Build una tantum:
330
-
331
- ```bash
332
- npm run start
333
- ```
334
-
335
- Build in watch mode:
336
-
337
- ```bash
338
- npm run "start watch"
339
- ```
340
-
341
- Creare un pacchetto locale:
342
-
343
- ```bash
344
- npm pack
345
- ```
346
-
347
- Flusso consigliato quando modifichi la libreria:
348
-
349
- 1. modifica i sorgenti in `assets/`;
350
- 2. aggiorna template o documentazione se cambia il modo d'uso;
351
- 3. ricompila con `npm run start`;
352
- 4. verifica `dist/`;
353
- 5. crea il pacchetto con `npm pack`;
354
- 6. installa il `.tgz` nel progetto che consuma la libreria.
355
-
356
- Nota: se la build Webpack fallisce, non modificare manualmente `dist/javascript` come sorgente primaria. Sistema la toolchain e rigenera gli asset compilati.
357
-
358
- ## Aggiungere un nuovo modulo
359
-
360
- Esempio componente:
361
-
362
- ```js
363
- export function PGS_myComponent_init(root = document) {
364
- pgs(root).querySelectorAll("myComponent").forEach((element) => {
365
- // init
366
- });
367
- }
368
-
369
- export function PGS_myComponent_api(element) {
370
- // return instance API
371
- }
372
-
373
- export const PGS_myComponent = {
374
- PGS_name: "PGS_myComponent",
375
- init: PGS_myComponent_init,
376
- api: PGS_myComponent_api
377
- };
378
- ```
379
-
380
- Registrazione in `assets/javascript/_imports.js`:
381
-
382
- ```js
383
- import { PGS_myComponent } from "./components/_myComponent.js";
384
-
385
- pgs.registerImport({
386
- PGS_myComponent,
387
- });
388
-
389
- pgs.registerModules({
390
- myComponent: PGS_myComponent,
391
- });
392
- ```
393
-
394
- Uso:
395
-
396
- ```js
397
- pgs.myComponent.init();
398
- pgs.myComponent.api(element);
73
+ <html lang="it" pgs="htmlBase initP">
74
+ <body pgs="bodyBase bodyImg bodyText bodyHeading">
75
+ <main pgs="main"></main>
76
+ </body>
77
+ </html>
399
78
  ```
400
79
 
401
- ## Convenzioni
80
+ ## Documentazione
402
81
 
403
- - Usa `pgs` come prima scelta per markup, layout, componenti e comportamenti.
404
- - Mantieni coerenti i token tra template, SCSS e JS.
405
- - Usa `pgs-state` per stati runtime.
406
- - Usa `pgs-option` per opzioni dichiarative.
407
- - Preferisci custom properties e mixin a CSS hardcoded.
408
- - Non duplicare componenti gia' presenti nella libreria.
409
- - Non inventare API: verifica i sorgenti in `assets/javascript/`.
410
- - Mantieni in `mypgs` solo stili e comportamenti riutilizzabili.
411
- - Mantieni nel progetto finale le personalizzazioni specifiche del progetto.
412
- - Aggiorna `AI_GUIDELINES.md` quando introduci pattern importanti.
82
+ - [Utilizzo CSS/SCSS](docs/utilizzo-css-scss.md)
83
+ - [Helper JavaScript](docs/helper-javascript.md)
84
+ - [Componenti e markup](docs/componenti-e-markup.md)
85
+ - [Export npm e sviluppo](docs/export-e-sviluppo.md)
86
+ - [Convenzioni](docs/convenzioni.md)
@@ -8,30 +8,23 @@
8
8
  &[data-darkmode=true] {
9
9
  color-scheme: dark;
10
10
  }
11
- }
12
11
 
13
- // == Primary colors
14
- :root {
12
+ // == Primary colors
15
13
  --color-primary: #5c7d6f;
16
14
  --color-secondary: #3d5f4f;
17
15
  --color-tertiary: #8fb082;
18
16
  --color-quaternary: #10201c;
19
- }
20
-
21
- // == Base colors
22
- :root {
17
+
18
+ // == Base colors
23
19
  --color-white: light-dark(#FFFFFF, #000000);
24
20
  --color-black: light-dark(#000000, #FFFFFF);
25
21
  --color-white-transparent: color-mix(in srgb, var(--color-white) 50%, transparent 100%);
26
22
  --color-black-transparent: color-mix(in srgb, var(--color-black) 50%, transparent 100%);
27
-
28
23
  --color-text: light-dark(#4a4a4a, #e3e3e3);
29
-
30
24
  --color-box: light-dark(#F8F8F8, #3A3A3A);
31
25
  --color-boxDark: light-dark(#3A3A3A, #F8F8F8);
32
26
  --color-box-transparent: light-dark(color-mix(in srgb, #eeeeee 50%, transparent 50%), color-mix(in srgb, #3A3A3A 50%, transparent 50%));
33
27
  --color-boxDark-transparent: light-dark(color-mix(in srgb, #3A3A3A 50%, transparent 50%), color-mix(in srgb, #eeeeee 50%, transparent 50%));
34
-
35
28
  --color-linkBackgorud: light-dark(#a0dbff, #002a44);
36
29
  --color-background: light-dark(#ffffff, #080808);
37
30
  --color-whiteFixed: #FFFFFF;
@@ -1,63 +1,51 @@
1
1
  @use "../mixin/mixin" as *;
2
2
 
3
3
  //# GENERAL
4
- [pgs~=initP] {
4
+ [pgs~=boxtext] {
5
+ @include boxtext();
6
+ }
5
7
 
6
- [pgs~=card],
7
- [pgs~=cardImg] {
8
- @include card();
8
+ [pgs~=darkmode] {
9
+ color-scheme: dark;
10
+ }
9
11
 
10
- [pgs~=card-img] {
11
- @include card-insideImg();
12
- }
13
- }
12
+ [pgs~=lightmode] {
13
+ color-scheme: light;
14
+ }
14
15
 
15
- [pgs~=boxtext] {
16
- @include boxtext();
17
- }
16
+ [pgs~=imgCover] {
17
+ object-fit: cover;
18
+ }
18
19
 
19
- [pgs~=darkmode] {
20
- color-scheme: dark;
21
- }
20
+ [pgs~=imgContain] {
21
+ object-fit: contain;
22
+ }
22
23
 
23
- [pgs~=lightmode] {
24
- color-scheme: light;
25
- }
24
+ [pgs~=borderRadius] {
25
+ border-radius: var(--border-radius);
26
+ }
26
27
 
27
- [pgs~=imgCover] {
28
- object-fit: cover;
29
- }
28
+ [pgs~=borderRadiusInput] {
29
+ border-radius: var(--border-radius-input);
30
+ }
30
31
 
31
- [pgs~=imgContain] {
32
- object-fit: contain;
33
- }
32
+ [pgs~=borderRadiusExternal] {
33
+ border-radius: var(--border-radius-external);
34
+ }
34
35
 
35
- [pgs~=borderRadius] {
36
- border-radius: var(--border-radius);
37
- }
36
+ [pgs~=blur] {
37
+ backdrop-filter: var(--blur);
38
+ }
38
39
 
39
- [pgs~=borderRadiusInput] {
40
- border-radius: var(--border-radius-input);
41
- }
40
+ [pgs~=appearanceNone] {
41
+ all: unset;
42
+ appearance: none;
43
+ }
42
44
 
43
- [pgs~=borderRadiusExternal] {
44
- border-radius: var(--border-radius-external);
45
- }
45
+ [pgs~=pointer] {
46
+ cursor: pointer;
47
+ }
46
48
 
47
- [pgs~=blur] {
48
- backdrop-filter: var(--blur);
49
- }
50
-
51
- [pgs~=appearanceNone] {
52
- all: unset;
53
- appearance: none;
54
- }
55
-
56
- [pgs~=pointer] {
57
- cursor: pointer;
58
- }
59
-
60
- [pgs~=hidden] {
61
- display: none !important;
62
- }
49
+ [pgs~=hidden] {
50
+ display: none !important;
63
51
  }
@@ -1,24 +1,22 @@
1
1
  @use "../mixin/mixin" as *;
2
2
 
3
3
  //# HEADING
4
- [pgs~=initP] {
5
- [pgs~=h1] {
6
- @include h1();
7
- }
4
+ [pgs~=h1] {
5
+ @include h1();
6
+ }
8
7
 
9
- [pgs~=h2] {
10
- @include h2();
11
- }
8
+ [pgs~=h2] {
9
+ @include h2();
10
+ }
12
11
 
13
- [pgs~=h3] {
14
- @include h3();
15
- }
12
+ [pgs~=h3] {
13
+ @include h3();
14
+ }
16
15
 
17
- [pgs~=h4] {
18
- @include h4();
19
- }
16
+ [pgs~=h4] {
17
+ @include h4();
18
+ }
20
19
 
21
- [pgs~=h5] {
22
- @include h5();
23
- }
20
+ [pgs~=h5] {
21
+ @include h5();
24
22
  }
@@ -0,0 +1,10 @@
1
+ @use "../mixin/mixin" as *;
2
+
3
+ [pgs~=card],
4
+ [pgs~=cardImg] {
5
+ @include card();
6
+
7
+ [pgs~=card-img] {
8
+ @include card-insideImg();
9
+ }
10
+ }
@@ -9,8 +9,11 @@
9
9
  @include meta.load-css("base/color");
10
10
  @include meta.load-css("base/html");
11
11
  @include meta.load-css("base/body");
12
- @include meta.load-css("base/heading");
13
- @include meta.load-css("base/general");
12
+
13
+ [pgs~=initP] {
14
+ @include meta.load-css("base/heading");
15
+ @include meta.load-css("base/general");
16
+ }
14
17
 
15
18
  /*
16
19
  |--------------------------------------------------------------------------
@@ -33,6 +36,7 @@
33
36
  |--------------------------------------------------------------------------
34
37
  */
35
38
  [pgs~=initP] {
39
+ @include meta.load-css("components/card");
36
40
  @include meta.load-css("components/button");
37
41
  @include meta.load-css("components/form");
38
42
  @include meta.load-css("components/menu");