@massimo-cassandro/minimo 1.39.2 → 1.40.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.
Files changed (29) hide show
  1. package/dev-tools/create-favicons/src/default-params.mjs +5 -5
  2. package/dev-tools/design-tokens-builder/tokens-config-sample.mjs +1 -1
  3. package/dev-tools/find-orphan-css-classes/find-orphan-css-classes.mjs +451 -0
  4. package/dev-tools/find-orphan-css-classes/orphan-css-classes.config.mjs +44 -0
  5. package/dev-tools/starter-kit/source_files/app/css/fonts.css +2 -2
  6. package/dev-tools/starter-kit/source_files/root/__project__.code-workspace +4 -0
  7. package/dev-tools/starter-kit/source_files/root/_editorconfig +10 -1
  8. package/dev-tools/starter-kit/source_files/root/_gitignore +1 -0
  9. package/dev-tools/starter-kit/source_files/root/_sf/controller/UnsplashController.php +2 -1
  10. package/dev-tools/starter-kit/source_files/root/_sf/symfony-webpack-setup.md +1 -1
  11. package/dev-tools/starter-kit/source_files/root/_sf/templates/_main-tpl.html.twig +9 -2
  12. package/dev-tools/starter-kit/source_files/root/_sf/templates/bundles/TwigBundle/Exception/error.html.twig +5 -1
  13. package/dev-tools/starter-kit/source_files/root/_sf/templates/home.html.twig +17 -0
  14. package/dev-tools/starter-kit/source_files/root/package-tpl.json +5 -4
  15. package/dev-tools/starter-kit/source_files/root/webpack-config-modules/custom-props-purgecss-plugin.mjs +30 -6
  16. package/dev-tools/starter-kit/source_files/root/webpack.config.mjs +140 -58
  17. package/dev-tools/starter-kit/starter-install.sh +24 -13
  18. package/dev-tools/starter-kit/webpack-config-upg.md +99 -5
  19. package/package.json +2 -1
  20. package/src/components/unsplash-page/unsplash-page.module.css +6 -5
  21. package/src/minimo.css +3 -6
  22. package/types/classes.d.ts +0 -525
  23. package/dev-tools/starter-kit/source_files/app/api/.gitkeep +0 -0
  24. package/dev-tools/starter-kit/source_files/app/src/components/.gitkeep +0 -0
  25. package/dev-tools/starter-kit/source_files/app/src/js/.gitkeep +0 -0
  26. package/dev-tools/starter-kit/source_files/app/src/pagine/.gitkeep +0 -0
  27. package/dev-tools/starter-kit/source_files/app/src/web-components/.gitkeep +0 -0
  28. package/src/css/margin-padding-bootstrap-media.css +0 -1845
  29. package/src/css/margin-padding-bootstrap.css +0 -465
@@ -50,14 +50,12 @@ Non servono nuovi pacchetti npm: il plugin usa `postcss` e `glob`, già presenti
50
50
  }
51
51
  ```
52
52
 
53
- 3. **Aggiungere** i nuovi flag e le costanti derivate (dopo `purgeCSSOptions`):
53
+ 3. **Aggiungere** i nuovi flag e la costante derivata (dopo `purgeCSSOptions`):
54
54
 
55
55
  ```js
56
56
  ,useCustomPropsPlugin = true // false: il plugin non viene caricato, le custom properties restano a carico del progetto
57
57
  ,customPropsFile = path.resolve(__dirname, './app/css/custom-properties.css')
58
58
  ,purgeCssInDev = false // true (solo per test): purge e plugin attivi anche in dev
59
- ,inlineCssInDev = inlineCssInDevMode && !purgeCssInDev
60
- ,runPurgeCss = usePurgeCss && (!isDevelopment || purgeCssInDev)
61
59
  ,runCustomPropsPlugin = useCustomPropsPlugin && (!isDevelopment || purgeCssInDev)
62
60
  ```
63
61
 
@@ -81,7 +79,7 @@ Non servono nuovi pacchetti npm: il plugin usa `postcss` e `glob`, già presenti
81
79
  ```
82
80
 
83
81
  6. **`optimization`**: sostituire il commento `// realContentHash: true,` con `realContentHash: !isDevelopment || purgeCssInDev,`.
84
- 7. **PurgeCSS**: la condizione `...(usePurgeCss ? createPurgeCSSPlugins({...}) : [])` diventa `...(runPurgeCss ? ... : [])`, e nella chiamata a `createPurgeCSSPlugins` va **rimosso** il blocco `variablesSafelist: { declarationGlobs, shadowGlobs, seeds }`. I glob `shadowGlobs` e `seeds` si spostano nel plugin (punto seguente, come `extraUsageGlobs` e `seeds`).
82
+ 7. **PurgeCSS**: la condizione `...(usePurgeCss ? createPurgeCSSPlugins({...}) : [])` diventa `...(usePurgeCss && (!isDevelopment || purgeCssInDev) ? ... : [])`, e nella chiamata a `createPurgeCSSPlugins` va **rimosso** il blocco `variablesSafelist: { declarationGlobs, shadowGlobs, seeds }`. I glob `shadowGlobs` e `seeds` si spostano nel plugin (punto seguente, come `extraUsageGlobs` e `seeds`).
85
83
  8. **Chunk `shared` anche per i css** (in v2 i css restavano nel css di ogni entry, duplicati). Nel commento e nella funzione `shared_chunk_paths` **rimuovere** la riga `if (module.type === 'css/mini-extract') return false;` (e il vecchio commento/`TODO` che spiegava perché i css restavano fuori dallo `shared`), e nel cacheGroup `shared` (`optimization.splitChunks.cacheGroups`) sostituire `chunks: 'all'` con:
86
84
 
87
85
  ```js
@@ -113,7 +111,7 @@ Non servono nuovi pacchetti npm: il plugin usa `postcss` e `glob`, già presenti
113
111
  ```
114
112
 
115
113
  I `sets` vanno adattati alle entry del progetto: `sources` è l'elenco dei nomi degli asset CSS compilati (con l'hash nel nome, si usa `*`, oppure una RegExp) e `target` (opzionale) l'asset in cui iniettare le definizioni; se omesso è il primo asset del set. Ogni entry con un proprio css deve comparire in un set, altrimenti l'uso di custom properties in quel css non viene rilevato e le definizioni corrispondenti mancano.
116
- 10. **`cssRules`**: passare `inlineCssInDevMode: inlineCssInDev` (non più `inlineCssInDevMode`).
114
+ 10. **`cssRules`**: passare `inlineCssInDevMode: inlineCssInDevMode && !purgeCssInDev` (non più `inlineCssInDevMode`).
117
115
  11. Aggiornare, se presenti, i commenti che citano `variables: true`, `safelist.variables` o `purgecss-variables-safelist.mjs`.
118
116
 
119
117
  ### 3. Template
@@ -149,3 +147,99 @@ Con `HtmlWebpackPlugin` (`inject`) `shared.css` è inserito automaticamente. Se
149
147
  3. In `build/` esiste `shared.<hash>.css` (con le definizioni delle custom properties), le pagine lo linkano prima del css della entry senza 404, i css delle entry non duplicano gli stili condivisi e la entry `.critical` resta autosufficiente.
150
148
  4. `NODE_ENV=development` (con `webpack serve`): le pagine mostrano stili e colori corretti; il master viene caricato per intero come primo modulo delle entry.
151
149
  5. Se qualche componente perde stili solo in produzione, provare `useCustomPropsPlugin = false` per isolare il problema.
150
+
151
+
152
+ ## Da v3 a v3.1
153
+
154
+ Novità della v3.1: il chunk `shared` diventa opzionale (`useSharedChunk`), i `sets` del plugin custom properties sono derivati da `projectEntries` e usano regexp al posto dei wildcard, e il plugin rileva le custom properties dei css `?raw` (web components) nei js dei chunk, per cui `extraUsageGlobs` non serve più per i web components.
155
+
156
+ Riepilogo delle modifiche:
157
+
158
+ | Cosa | Dove |
159
+ |---|---|
160
+ | Flag `useSharedChunk` (chunk `shared` opzionale), `mainEntry`, `standaloneEntries` | `webpack.config.mjs` |
161
+ | `sets` derivati da `projectEntries`, con regexp (`cssAssetRegexp`) al posto dei wildcard | `webpack.config.mjs` |
162
+ | Scansione dei js dei chunk per i css `?raw`; `extraUsageGlobs: []` | `custom-props-purgecss-plugin.mjs`, `webpack.config.mjs` |
163
+ | Riferimenti a `shared.*` / `runtime.js` commentati come opzionali | `_sf/templates/_main-tpl.html.twig`, pagina di errore e template del progetto |
164
+ | `MiniCssExtractPlugin` presente una sola volta; entry `error-pages`; commenti `NB symfony` | `webpack.config.mjs` |
165
+
166
+ ### 1. Moduli in `webpack-config-modules/`
167
+
168
+ - **Sostituire** `custom-props-purgecss-plugin.mjs` con la versione v3.1 (`// v.3.1`). Gli altri moduli non cambiano.
169
+
170
+ ### 2. Modifiche a `webpack.config.mjs`
171
+
172
+ 1. Riga 2: `// v.3` → `// v.3.1`.
173
+ 2. **Aggiungere** i flag tra le costanti di configurazione (dopo `customPropsFile`):
174
+
175
+ ```js
176
+ ,useSharedChunk = true // false: nessun chunk shared né runtime, per progetti con una sola pagina (più al massimo una pagina di errore)
177
+ ,mainEntry = 'index' // entry sempre caricata: con useSharedChunk false riceve le definizioni delle custom properties
178
+ ,standaloneEntries = [] // con useSharedChunk false: entry non `.critical` che non caricano il css di mainEntry (set proprio)
179
+ ```
180
+
181
+ 3. **`optimization`**: rendere condizionali `runtimeChunk: 'single'` e `splitChunks.cacheGroups.shared`:
182
+
183
+ ```js
184
+ optimization: {
185
+ // ...
186
+ ...(useSharedChunk
187
+ ? {
188
+ runtimeChunk: 'single',
189
+ splitChunks: { cacheGroups: { shared: { /* come in v3 */ } } }
190
+ }
191
+ : {})
192
+ },
193
+ ```
194
+
195
+ 4. **Sets del plugin**: prima di `const config`, definire l'helper `cssAssetRegexp` e i set `customPropsSets`, derivati da `projectEntries` (aggiungendo una entry non serve modificare altro):
196
+
197
+ ```js
198
+ // corrisponde a `nome.css` (dev con WEBPACK_SERVE) e `nome.<hash>.css`, NON a `nome.critical.<hash>.css`
199
+ const cssAssetRegexp = (entryName) =>
200
+ new RegExp(`^${entryName.replace(/[.+?^${}()|[\]\\]/g, '\\$&')}(\\.[^./]+)?\\.css$`);
201
+
202
+ const cssEntries = Object.keys(projectEntries).filter(name => !/\.critical/.test(name))
203
+ ,criticalEntries = Object.keys(projectEntries).filter(name => /\.critical/.test(name))
204
+ ,customPropsSets = [
205
+ // i critical css sono inline nei template: restano autosufficienti
206
+ ...criticalEntries.map(name => ({ sources: [cssAssetRegexp(name)] })),
207
+ ...(useSharedChunk
208
+ // shared.css è linkato in tutte le pagine e contiene le definizioni per tutti i css delle entry
209
+ ? [{
210
+ sources: [cssAssetRegexp('shared'), ...cssEntries.map(cssAssetRegexp)],
211
+ target: cssAssetRegexp('shared')
212
+ }]
213
+ // senza shared: definizioni solo nel css di `mainEntry`; le entry che non lo caricano hanno un set proprio
214
+ : [
215
+ {
216
+ sources: cssEntries.filter(name => !standaloneEntries.includes(name)).map(cssAssetRegexp),
217
+ target: cssAssetRegexp(mainEntry)
218
+ },
219
+ ...standaloneEntries.map(name => ({ sources: [cssAssetRegexp(name)] }))
220
+ ]
221
+ )
222
+ ];
223
+ ```
224
+
225
+ Nel plugin sostituire i `sets` con `sets: customPropsSets`. Si usano RegExp e non i wildcard `*`: `'index.*.css'` non corrisponde a `index.css` (dev con `WEBPACK_SERVE`) e corrisponde invece a `index.critical.<hash>.css`.
226
+ 5. **`extraUsageGlobs`**: sostituire i glob dei web components con `extraUsageGlobs: []` (i glob precedenti possono restare commentati). `minimo_path` resta, perché è usato anche nei `contentGlobs` di PurgeCSS.
227
+
228
+ 6. **`MiniCssExtractPlugin`**: nell'array `plugins` deve comparire **una sola volta**. Se il config ne contiene due, eliminare quello con `filename: '[name].[contenthash].css'` e tenere quello con la logica `process.env.WEBPACK_SERVE ? '[name].css' : '[name].[contenthash].css'` (e il corrispondente `chunkFilename`).
229
+ 7. **Entry `error-pages`**: nel template di base `projectEntries` include `'error-pages': './app/error-pages/error-pages.js'` (pagina di errore, che carica anche il css di `index`). Nei progetti con pagina di errore va aggiunta; non serve altro per i `sets`, perché derivano da `projectEntries`.
230
+ 8. **Commenti `NB symfony`** (facoltativo, solo leggibilità): le indicazioni per Symfony (`sf:`, `SYMFONY:`) sono state uniformate in commenti `NB symfony` che dicono cosa commentare, decommentare o rimuovere (import di `HtmlWebpackPlugin` / `HtmlWebpackInjectPreload`, `apiPort`, `output_dir`, `WebpackManifestPlugin`, plugin html). `apiPort` nel template è ora commentato. Nessuna modifica di comportamento.
231
+
232
+ ### 3. Template
233
+
234
+ Con `useSharedChunk = false` i template **non** devono referenziare `shared.css`, `shared.js` e `runtime.js` (preload, link e script): nei template di esempio (`_main-tpl.html.twig` e pagina di errore) un commento Twig indica le righe da rimuovere. Le definizioni delle custom properties sono nel css di `mainEntry`, che deve essere linkato in ogni pagina; le entry elencate in `standaloneEntries` hanno invece le proprie definizioni nel loro css. Con `useSharedChunk = true` i template restano invariati.
235
+
236
+ ### 4. Cambiamenti di comportamento
237
+
238
+ - **Scansione dei js:** per ogni set il plugin analizza, oltre ai css, i js dei chunk che li contengono (e dei chunk da essi raggiunti). I css importati con `?raw` (shadow DOM dei web components) sono stringhe nel bundle: le loro props entrano nel css solo per i componenti realmente importati. `extraUsageGlobs` va quindi lasciato vuoto salvo css caricati fuori dal bundle: un glob largo (es. `src/web-components/**/*.css` di minimo) porta nel css anche le props di componenti non importati. Una entry solo js, senza css nei `sources`, non viene scansionata.
239
+ - Anche gli usi di `var(--…)` presenti nei js (es. stili generati a runtime) contano come usati.
240
+
241
+ ### 5. Verifica dopo l'aggiornamento
242
+
243
+ 1. `NODE_ENV=production npx webpack --config ./webpack.config.mjs --stats minimal`: nessun errore o warning del plugin.
244
+ 2. Nel css con le definizioni non compaiono props di web components non importati (es. `--jt-*`, `--sdt-*`); per un componente importato con `?raw` le sue props sono presenti.
245
+ 3. Con `useSharedChunk = false`: in `build/` non esistono `shared.*` né `runtime.*` e le definizioni sono nel solo css di `mainEntry`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@massimo-cassandro/minimo",
3
- "version": "1.39.2",
3
+ "version": "1.40.1",
4
4
  "description": "Light css framework & utilities",
5
5
  "type": "module",
6
6
  "main": "./index.js",
@@ -22,6 +22,7 @@
22
22
  "bin": {
23
23
  "buildTokens": "dev-tools/design-tokens-builder/build-tokens.mjs",
24
24
  "checkUnresolvedProps": "dev-tools/design-tokens-builder/check-unresolved-custom-props.mjs",
25
+ "findOrphanCssClasses": "dev-tools/find-orphan-css-classes/find-orphan-css-classes.mjs",
25
26
  "update-version": "dev-tools/update-version/index.mjs",
26
27
  "upd@m": "dev-tools/upd@m/index.mjs",
27
28
  "svgIconsTools": "dev-tools/svg-icons-tools/index.mjs",
@@ -32,11 +32,12 @@ custom propeties:
32
32
 
33
33
  /* stylelint-disable declaration-no-important */
34
34
 
35
- html, body {
36
- height: 100%;
37
- padding: 0;
38
- margin: 0;
39
-
35
+ html.uspg {
36
+ &, & body {
37
+ height: 100%;
38
+ padding: 0;
39
+ margin: 0;
40
+ }
40
41
  }
41
42
 
42
43
  *, *::before, *::after {
package/src/minimo.css CHANGED
@@ -1,9 +1,9 @@
1
1
  /* decomment if you want to use layers. see https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/At-rules/@layer */
2
2
  /* @layer reset, base, components, utilities, project, overrides; */
3
3
 
4
- /* @import '@css/fonts.css'; */
4
+ @import '@css/fonts.css';
5
5
  /* @import '@css/custom-media.css'; */ /* managed by postcss */
6
- /* @import '@css/custom-properties.css' layer('base'); */ /* managed by postcss-jit-props */
6
+ /* @import '@css/custom-properties.css'; */ /* layer('base'); */ /* comment if managed by postcss-jit-props */
7
7
 
8
8
  @import '@minimoSrc/css/reset.css';
9
9
  @import '@minimoSrc/css/layout-base.css';
@@ -41,10 +41,7 @@
41
41
  @import '@minimoSrc/css/display.css';
42
42
  @import '@minimoSrc/css/margin-padding.css';
43
43
  /* @import '@minimoSrc/css/margin-padding-media.css'; responsive version */
44
- /* alternative boostrap naming
45
- @import '@minimoSrc/css/margin-padding-bootstrap.css';
46
- @import '@minimoSrc/css/margin-padding-bootsrap-media.css';
47
- */
44
+
48
45
  @import '@minimoSrc/css/overflow.css';
49
46
  @import '@minimoSrc/css/position.css';
50
47
  @import '@minimoSrc/css/visibility.css';