@massimo-cassandro/minimo 1.41.4 → 1.41.6
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 +12 -12
- package/charts/src/node-helpers/create-svg-canvas-node.mjs +2 -2
- package/charts/src/node-helpers/svg-text-to-path.js +9 -9
- package/charts/src/rating-display/index.js +1 -1
- package/charts/src/rating-display/ratindDisplayAnimation.js +3 -3
- package/design-tokens/README.md +2 -2
- package/design-tokens/_src/_readme.md +26 -26
- package/dev-tools/README.md +16 -16
- package/dev-tools/create-favicons/README.md +31 -31
- package/dev-tools/create-favicons/src/create-ico.mjs +2 -2
- package/dev-tools/create-favicons/src/default-params.mjs +1 -1
- package/dev-tools/create-favicons/src/init.mjs +1 -1
- package/dev-tools/design-tokens-builder/README.md +102 -102
- package/dev-tools/design-tokens-builder/build-tokens-src/build-source-modes.mjs +85 -73
- package/dev-tools/design-tokens-builder/build-tokens-src/config.mjs +109 -85
- package/dev-tools/design-tokens-builder/build-tokens-src/formats/css.mjs +113 -90
- package/dev-tools/design-tokens-builder/build-tokens-src/formats/json.mjs +107 -95
- package/dev-tools/design-tokens-builder/build-tokens-src/legacy-tokens-parser.mjs +71 -64
- package/dev-tools/design-tokens-builder/build-tokens-src/light-dark.mjs +75 -65
- package/dev-tools/design-tokens-builder/build-tokens-src/merge-css.mjs +113 -102
- package/dev-tools/design-tokens-builder/build-tokens-src/platforms.mjs +36 -30
- package/dev-tools/design-tokens-builder/build-tokens-src/resolve-source-paths.mjs +15 -13
- package/dev-tools/design-tokens-builder/build-tokens-src/source-prefixes.mjs +44 -42
- package/dev-tools/design-tokens-builder/build-tokens-src/source-transforms.mjs +89 -83
- package/dev-tools/design-tokens-builder/build-tokens-src/token-rename-parser.mjs +99 -86
- package/dev-tools/design-tokens-builder/build-tokens-src/transforms.mjs +64 -48
- package/dev-tools/design-tokens-builder/build-tokens.mjs +80 -68
- package/dev-tools/design-tokens-builder/check-unresolved-custom-props.mjs +103 -77
- package/dev-tools/design-tokens-builder/tokens-config-sample.mjs +275 -238
- package/dev-tools/find-orphan-css-classes/find-orphan-css-classes.mjs +2 -2
- package/dev-tools/starter-kit/source_files/app/CLAUDE.md +4 -2
- package/dev-tools/starter-kit/source_files/app/{css/index.css → index.css} +2 -2
- package/dev-tools/starter-kit/source_files/app/index.js +1 -1
- package/dev-tools/starter-kit/source_files/root/_sf/controller/ImgViewerController.php +3 -3
- package/dev-tools/starter-kit/source_files/root/_sf/controller/ViewerController.php +2 -2
- package/dev-tools/starter-kit/source_files/root/stylelint.config.mjs +1 -1
- package/dev-tools/starter-kit/source_files/root/webpack-config-modules/css-rules.mjs +1 -1
- package/dev-tools/starter-kit/source_files/root/webpack.config.mjs +15 -1
- package/dev-tools/starter-kit/webpack-config-upg.md +12 -0
- package/dev-tools/stylelint-config/README.md +7 -7
- package/dev-tools/svg-icons-tools/README.md +32 -32
- package/dev-tools/svg-icons-tools/src/config-manager.mjs +1 -1
- package/dev-tools/svg-icons-tools/src/default-config.mjs +118 -118
- package/dev-tools/svg-icons-tools/src/jsx-icon-file-builder.mjs +24 -24
- package/dev-tools/svg-icons-tools/src/parse-svg-filename.mjs +3 -3
- package/dev-tools/svg-icons-tools/src/parse-svg-files.mjs +1 -1
- package/dev-tools/svg-icons-tools/src/parse-svg-markup.mjs +4 -4
- package/dev-tools/svg-icons-tools/src/svg-to-jsx.mjs +2 -2
- package/dev-tools/svg-icons-tools/src/svg-to-optimized.mjs +2 -2
- package/dev-tools/svg-icons-tools/src/svg-to-symbols.mjs +2 -2
- package/dev-tools/upd@m/README.md +1 -1
- package/dev-tools/upd@m/index.mjs +1 -1
- package/dev-tools/update-version/README.md +9 -9
- package/package.json +1 -1
- package/snippets/unsplash-browser-app/README.md +1 -1
- package/snippets/unsplash-browser-app/unsplash-utilities.js +9 -9
- package/src/components/autocomplete/README.md +3 -3
- package/src/components/autocomplete/autocomplete-engine.js +75 -63
- package/src/components/autocomplete/check-autocomplete.js +3 -3
- package/src/components/dismiss-alerts.js +3 -3
- package/src/components/form-reset-submit.js +6 -6
- package/src/components/inner-nav/inner-nav.js +2 -2
- package/src/components/modal-alert/modal-alert.js +67 -65
- package/src/components/modal-alert/modal-alert.minimo.tokens.mjs +1 -1
- package/src/components/modal-popup/modal-popup.js +56 -56
- package/src/components/overlay/overlay.js +3 -3
- package/src/components/sf-macro/readme.md +1 -1
- package/src/components/sf-macro/sf-macro.js +27 -23
- package/src/components/slide-up-down-toggle/slide-up-down-toggle.js +83 -79
- package/src/components/slide-up-down-toggle/slide-up-down-toggle.module.css +44 -44
- package/src/components/snackbar/snackbar.js +19 -19
- package/src/components/spinner/spinner.js +3 -3
- package/src/components/unsplash-page/README.md +8 -8
- package/src/components/unsplash-page/fetch-unsplash-data.js +3 -3
- package/src/components/unsplash-page/unsplash-page.js +33 -33
- package/src/components/unsplash-page/unsplash-page.module.css +1 -1
- package/src/css/alerts.css +2 -2
- package/src/css/forms/forms.css +4 -4
- package/src/css/forms/validation.css +1 -1
- package/src/css/margin-padding-media.css +4 -4
- package/src/css/margin-padding.css +4 -4
- package/src/css/reset.css +11 -11
- package/src/icons/read-me.md +1 -1
- package/src/minimo.css +3 -3
- package/src/utilities/better-text-with-places.js +22 -22
- package/src/utilities/better-text.js +42 -35
- package/src/utilities/classnames.js +8 -8
- package/src/utilities/cookies.js +6 -6
- package/src/utilities/create-id.js +3 -3
- package/src/utilities/disable-btns-on-submit.js +2 -2
- package/src/utilities/dom-builder/dom-builder.js +89 -86
- package/src/utilities/dom-builder/domBuilderBasicSetup.js +9 -9
- package/src/utilities/dom-builder/parseDomString.js +23 -23
- package/src/utilities/dom-builder-helpers/README.md +2 -2
- package/src/utilities/dom-builder-helpers/form-tags.js +100 -100
- package/src/utilities/dom-builder-helpers/picture-tag.js +39 -39
- package/src/utilities/enable-submit-btns.js +1 -1
- package/src/utilities/escape-html.js +2 -2
- package/src/utilities/generate-pwd.js +4 -4
- package/src/utilities/linked-dates.js +13 -13
- package/src/utilities/parse-file-size.js +6 -6
- package/src/utilities/random-id.js +3 -3
- package/src/utilities/relative-date.js +40 -40
- package/src/utilities/sentence-case.js +1 -1
- package/src/utilities/strip-tags.js +1 -1
- package/src/utilities/title-case.js +1 -1
- package/src/utilities/truncate-string.js +5 -5
- package/src/utilities/validation-error-class.js +12 -12
- package/src/web-components/json-table/json-table-component.js +123 -121
- package/src/web-components/json-table/json-table-component.module.css +6 -6
- package/src/web-components/json-table/json-table.minimo.tokens.mjs +6 -6
- package/src/web-components/json-table/jt-docs/parametri.md +124 -0
- package/src/web-components/json-table/jt-docs.md +622 -0
- package/src/web-components/json-table/readme.md +3 -763
- package/src/web-components/json-table/src/cell-content.js +25 -25
- package/src/web-components/json-table/src/content-utils.js +21 -21
- package/src/web-components/json-table/src/data-types.js +32 -32
- package/src/web-components/json-table/src/defaults.js +230 -191
- package/src/web-components/json-table/src/get-data.js +55 -38
- package/src/web-components/json-table/src/icons.js +17 -17
- package/src/web-components/json-table/src/info-section.js +18 -18
- package/src/web-components/json-table/src/main-builder.js +45 -45
- package/src/web-components/json-table/src/pagination.js +32 -32
- package/src/web-components/json-table/src/parse-cols.js +18 -18
- package/src/web-components/json-table/src/parse-rows.js +17 -17
- package/src/web-components/json-table/src/resolve-params.js +53 -41
- package/src/web-components/json-table/src/search.js +13 -13
- package/src/web-components/json-table/src/sorting.js +20 -20
- package/src/web-components/json-table/src/table-body.js +13 -13
- package/src/web-components/json-table/src/table-builder.js +34 -34
- package/src/web-components/json-table/src/table-tfoot.js +8 -8
- package/src/web-components/json-table/src/table-thead.js +21 -21
- package/src/web-components/json-table/src/update-info.js +11 -11
- package/types/classes.d.ts +2 -2
- package/types/global.d.ts +18 -12
|
@@ -45,7 +45,7 @@ export default {
|
|
|
45
45
|
}
|
|
46
46
|
},
|
|
47
47
|
|
|
48
|
-
//
|
|
48
|
+
// colonne ordinabili (thead)
|
|
49
49
|
thead: {
|
|
50
50
|
hover: {
|
|
51
51
|
background: {
|
|
@@ -58,7 +58,7 @@ export default {
|
|
|
58
58
|
},
|
|
59
59
|
|
|
60
60
|
sort: {
|
|
61
|
-
//
|
|
61
|
+
// il pulsante di ordinamento riempie l'intero th: stesso padding/line-height delle celle tabella di minimo
|
|
62
62
|
btn: {
|
|
63
63
|
padding: {
|
|
64
64
|
block: {
|
|
@@ -84,7 +84,7 @@ export default {
|
|
|
84
84
|
$type: 'dimension',
|
|
85
85
|
$value: '.4em'
|
|
86
86
|
},
|
|
87
|
-
//
|
|
87
|
+
// opacità dell'icona quando non c'è alcun ordinamento attivo
|
|
88
88
|
none: {
|
|
89
89
|
opacity: {
|
|
90
90
|
$type: 'number',
|
|
@@ -94,7 +94,7 @@ export default {
|
|
|
94
94
|
}
|
|
95
95
|
},
|
|
96
96
|
|
|
97
|
-
//
|
|
97
|
+
// celle booleane
|
|
98
98
|
bool: {
|
|
99
99
|
icon: {
|
|
100
100
|
size: {
|
|
@@ -116,7 +116,7 @@ export default {
|
|
|
116
116
|
}
|
|
117
117
|
},
|
|
118
118
|
|
|
119
|
-
//
|
|
119
|
+
// opacità della tabella mentre è in corso una richiesta server-side
|
|
120
120
|
busy: {
|
|
121
121
|
opacity: {
|
|
122
122
|
$type: 'number',
|
|
@@ -124,7 +124,7 @@ export default {
|
|
|
124
124
|
}
|
|
125
125
|
},
|
|
126
126
|
|
|
127
|
-
// footer
|
|
127
|
+
// barra del footer sotto la tabella (caption + paginazione)
|
|
128
128
|
'table-footer': {
|
|
129
129
|
padding: {
|
|
130
130
|
block: {
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Parametri
|
|
2
|
+
|
|
3
|
+
[Torna alla pagina iniziale](../jt-docs.md)
|
|
4
|
+
|
|
5
|
+
Tutti i parametri sono impostabili sia da attributo HTML che come oggetto in `init({...})`. I valori di tipo funzione solo da `init()`.
|
|
6
|
+
|
|
7
|
+
| Parametro | Tipo / default | Descrizione |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| `debug` | boolean (`false`) | Log in console di parametri, colonne, dati, stato ed elementi generati |
|
|
10
|
+
| `jsonUrl` | string (`null`) | URL del JSON da caricare. Ignorato se `data` è presente |
|
|
11
|
+
| `jqDatatableMode` | boolean (`false`) | Se `true` imposta come default i valori compatibili con il formato server-side di jQuery DataTables: `jsonDataField: 'data'`, `totRecField: 'recordsTotal'`, `filteredRecField: 'recordsFiltered'`, `serverSide: true` e i `serverParams` indicati in "Modalità jQuery DataTables". Ogni valore resta sovrascrivibile |
|
|
12
|
+
| `jsonDataField` | string o null (`'data'`) | Chiave del JSON che contiene l'array delle righe (es. `'data'` per `{ data: [...] }`); `null` o `''` = la root del JSON è l'array stesso |
|
|
13
|
+
| `totRecField` | string (`'totRec'`) | Chiave del JSON con il totale dei record (numerico); se assente o non numerico il totale è la lunghezza dell'array |
|
|
14
|
+
| `filteredRecField` | string (`'filteredRec'`) | Solo server-side: chiave del JSON con il numero di record che soddisfano la ricerca corrente; se assente vale `totRecField` |
|
|
15
|
+
| `data` | Array<Object> (`null`) | Righe inline; prevale su `jsonUrl`. Da attributo va passato come stringa JSON ed è sempre inteso come array delle righe (`jsonDataField` ignorato) |
|
|
16
|
+
| `cols` | ColDefinition[] | **OBBLIGATORIO**: definizione delle colonne (vedi sotto). Se assente o vuoto viene segnalato un errore in console e la tabella non viene generata |
|
|
17
|
+
| `dataTypes` | Object (`{}`) | Tipi di dato personalizzati, uniti a quelli predefiniti (vedi sotto) |
|
|
18
|
+
| `caption` | string o Function (`null`) | Caption della tabella (testo o HTML), oppure funzione che restituisce stringa o Node. Mostrata sotto la tabella (vedi "Caption e paginazione") |
|
|
19
|
+
| `search` | boolean (`true`) | Genera l'input di ricerca |
|
|
20
|
+
| `searchDebounce` | number (`300`) | Millisecondi di attesa dopo l'ultimo tasto prima di eseguire la ricerca |
|
|
21
|
+
| `perPage` | number (`25`) | Righe per pagina; `0` = nessuna paginazione (tutte le righe, nessuna navigazione) |
|
|
22
|
+
| `paginationDelta` | number (`2`) | Pulsanti pagina mostrati a ciascun lato della pagina corrente |
|
|
23
|
+
| `serverSide` | boolean (`false`) | Paginazione, ordinamento e ricerca delegati al server (vedi "Modalità server-side"). Richiede `jsonUrl` |
|
|
24
|
+
| `serverParams` | Object | Nomi dei parametri di query string in modalità server-side, uniti ai default (vedi sotto) |
|
|
25
|
+
| `initialSort` | { key, dir } o null (`null`) | Ordinamento applicato al caricamento, es. `{ key: 'name', dir: 'asc' }` |
|
|
26
|
+
| `tfoot` | boolean (`false`) | Genera il tfoot (vedi `tfootRender` delle colonne). Non disponibile in modalità server-side |
|
|
27
|
+
| `updateFooterOnPageChange` | boolean (`false`) | Se `true` `tfootRender` riceve solo i record della pagina corrente (subtotali di pagina) e il footer si aggiorna a ogni cambio pagina; se `false` riceve l'intero set filtrato e si aggiorna solo al cambio filtro |
|
|
28
|
+
| `infoText` | string, Function o null (`null`) | Contenuto dell'area info: stringa mustache-like con i segnaposto `{start}`, `{end}`, `{totRec}`, `{filteredRec}`, `{page}`, `{totPages}`, oppure funzione `(start, end, totRec, filteredRec, page, totPages) => string\|Node`. `null` = viene usato `labels.info` |
|
|
29
|
+
| `template` | Array (`[{ slot: 'infoSection' }, { slot: 'table' }]`) | Layout del contenitore principale (vedi "Template") |
|
|
30
|
+
| `locale` | string (`'it-IT'`) | Locale per numeri, date e confronto stringhe nell'ordinamento |
|
|
31
|
+
| `currency` | string (`'EUR'`) | Codice ISO 4217 usato dal tipo `currency` |
|
|
32
|
+
| `datesLocaleOpts` | Intl.DateTimeFormatOptions (`{ year: 'numeric', month: 'short', day: 'numeric' }`) | Parte data dei tipi date/datetime |
|
|
33
|
+
| `timesLocaleOpts` | Intl.DateTimeFormatOptions (`{ hour12: false, hour: '2-digit', minute: '2-digit' }`) | Parte ora del tipo datetime |
|
|
34
|
+
| `numbersLocaleOpts` | Intl.NumberFormatOptions (`{ maximumFractionDigits: 2 }`) | Tipo `num` |
|
|
35
|
+
| `currPercLocaleOpts` | Intl.NumberFormatOptions (`{ minimumFractionDigits: 2, maximumFractionDigits: 2 }`) | Tipi currency/euro/perc/percDecimal |
|
|
36
|
+
| `renderNullAs` | string o null (`'—'`) | Contenuto per i valori null/undefined |
|
|
37
|
+
| `renderZeroAs` | string o null (`null`) | Se non null, contenuto per i valori numerici pari a zero |
|
|
38
|
+
| `renderNaNAs` | string o null (`'—'`) | Contenuto per i valori non numerici nei tipi numerici |
|
|
39
|
+
| `boolTrueIcon` | icona, vedi nota (icona `check-bold` di minimo (Phosphor)) | Icona per i valori `true` (tipo bool) |
|
|
40
|
+
| `boolFalseIcon` | icona, vedi nota (icona `x-bold`) | Icona per i valori `false` |
|
|
41
|
+
| `sortAscArrowIcon` | icona, vedi nota (icona `arrow-up`) | Icona del pulsante di ordinamento, ordinamento asc attivo |
|
|
42
|
+
| `sortDescArrowIcon` | icona, vedi nota (icona `arrow-down`) | Icona del pulsante di ordinamento, ordinamento desc attivo |
|
|
43
|
+
| `sortNoneArrowIcon` | icona, vedi nota (icona `arrows-down-up`) | Icona del pulsante di ordinamento, nessun ordinamento |
|
|
44
|
+
| `paginationPrevIcon` | icona, vedi nota (icona `caret-left`) | Icona del pulsante "pagina precedente" |
|
|
45
|
+
| `paginationNextIcon` | icona, vedi nota (icona `caret-right`) | Icona del pulsante "pagina successiva" |
|
|
46
|
+
| `trCallback` | (tr, row, params) => void (`null`) | Callback invocata dopo il rendering di ogni riga del body |
|
|
47
|
+
| `tableId` | string (`null`) | Id del tag `<table>` |
|
|
48
|
+
| `classes` | Object | Classi consumer (vedi sotto), unite ai default |
|
|
49
|
+
| `labels` | Object | Testi (vedi sotto), uniti ai default |
|
|
50
|
+
|
|
51
|
+
**Nota sulle icone**: ogni icona può essere una stringa SVG/HTML (es. import `?inline`), un Node, un oggetto domBuilder o una funzione che restituisce uno di questi valori.
|
|
52
|
+
|
|
53
|
+
## `classes`
|
|
54
|
+
|
|
55
|
+
Nomi delle classi assegnate agli elementi generati. Le classi interne di layout (CSS module)
|
|
56
|
+
vengono **sempre** applicate in aggiunta a queste; ogni valore sostituisce interamente il
|
|
57
|
+
default della stessa chiave.
|
|
58
|
+
|
|
59
|
+
```javascript
|
|
60
|
+
classes: {
|
|
61
|
+
wrapper: null, // contenitore principale (<section>: info + tabella)
|
|
62
|
+
infoOuter: null, // contenitore esterno della sezione info
|
|
63
|
+
info: null, // sezione info (testo + ricerca)
|
|
64
|
+
resultInfo: null, // contenitore del testo info
|
|
65
|
+
search: null, // wrapper dell'input di ricerca
|
|
66
|
+
searchInput: 'form-control form-control-sm', // input di ricerca
|
|
67
|
+
tableWrapper: 'table-responsive', // div che racchiude la tabella
|
|
68
|
+
table: 'table table-bordered', // tag <table>
|
|
69
|
+
tableFooter: null, // barra sotto la tabella (caption + paginazione)
|
|
70
|
+
caption: null, // contenitore della caption
|
|
71
|
+
pagination: null, // <nav> della paginazione
|
|
72
|
+
paginationBtn: 'btn-reset', // pulsanti della paginazione
|
|
73
|
+
sortBtn: 'btn-reset', // pulsanti di ordinamento nei <th>
|
|
74
|
+
empty: null, // cella unica mostrata in assenza di righe
|
|
75
|
+
textStart: null, // allineamento inline-start (le celle minimo lo sono già)
|
|
76
|
+
textCenter: 'text-center', // allineamento al centro
|
|
77
|
+
textEnd: 'text-end', // allineamento inline-end
|
|
78
|
+
nowrap: 'text-nowrap', // no-wrap
|
|
79
|
+
numeric: 'text-numeric', // cifre tabulari (tipi numerici)
|
|
80
|
+
boolCell: null, // classe aggiuntiva per tutte le celle di tipo bool
|
|
81
|
+
boolTrue: null, // classe aggiuntiva per le celle bool con valore true
|
|
82
|
+
boolFalse: null // classe aggiuntiva per le celle bool con valore false
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Le classi di allineamento (`textEnd`, `textCenter`, `nowrap`, `numeric`) sono quelle usate dai
|
|
87
|
+
tipi di dato predefiniti: modificandole si cambiano le classi di tutte le colonne di quel tipo.
|
|
88
|
+
|
|
89
|
+
## `labels`
|
|
90
|
+
|
|
91
|
+
```javascript
|
|
92
|
+
labels: {
|
|
93
|
+
loading: 'Caricamento dati…', // segnaposto di caricamento (visually hidden)
|
|
94
|
+
searchPlaceholder: 'Cerca...', // placeholder dell'input di ricerca
|
|
95
|
+
searchTitle: 'Cerca nella tabella', // attributo title dell'input
|
|
96
|
+
searchAriaLabel: 'Filtra risultati', // aria-label dell'input
|
|
97
|
+
info: 'Stai visualizzando le righe da {start} a {end}, su un totale di {filteredRec} record trovati',
|
|
98
|
+
// template del testo info (vedi `infoText`)
|
|
99
|
+
noRows: 'Nessun record trovato', // testo info e cella unica con set di dati vuoto
|
|
100
|
+
noResults: 'Nessun risultato per la ricerca', // idem, con ricerca senza risultati
|
|
101
|
+
sortAsc: 'Ordina questa colonna in senso ascendente (A → Z)', // title/aria-label del
|
|
102
|
+
sortDesc: 'Ordina questa colonna in senso discendente (Z → A)', // pulsante di ordinamento:
|
|
103
|
+
sortNone: 'Rimuovi l’ordinamento a questa colonna', // descrivono l'azione del
|
|
104
|
+
// prossimo click
|
|
105
|
+
paginationAriaLabel: 'Navigazione pagine', // aria-label del <nav>
|
|
106
|
+
prevPage: 'Pagina precedente', // title/aria-label del pulsante precedente
|
|
107
|
+
nextPage: 'Pagina successiva', // idem, successivo
|
|
108
|
+
pageTitle: 'Vai a pagina {page}', // idem, pulsanti pagina
|
|
109
|
+
currentPage: 'Pagina {page}, corrente' // idem, pagina corrente
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
I segnaposto di `labels.info` / `infoText`:
|
|
114
|
+
|
|
115
|
+
| Segnaposto | Valore |
|
|
116
|
+
|---|---|
|
|
117
|
+
| `{start}` | indice (da 1) del primo record della pagina corrente, nel set filtrato |
|
|
118
|
+
| `{end}` | indice dell'ultimo record della pagina corrente |
|
|
119
|
+
| `{totRec}` | totale dei record non filtrati (dal JSON, vedi `totRecField`, o lunghezza dei dati) |
|
|
120
|
+
| `{filteredRec}` | totale dei record dopo il filtro |
|
|
121
|
+
| `{page}` | pagina corrente |
|
|
122
|
+
| `{totPages}` | numero di pagine |
|
|
123
|
+
|
|
124
|
+
I numeri vengono formattati secondo `locale`.
|