Skip to content

Commit eb0672a

Browse files
authored
Merge pull request #2 from RedTurtle/templates
test: using HTML templates
2 parents e0708ad + 0fa7dbe commit eb0672a

16 files changed

+471
-86
lines changed

docs/01-cosa-si-usa.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22

33
## Obiettivo
44

5-
Usare un setup semplice e adatto a profili junior per creare pagine statiche del modello Comuni.
5+
Setup semplice e adatto a profili junior per creare pagine statiche del modello Scuole.
66

77
## Stack
88

9-
- HTML statico (una pagina = un file `.html` in `pages/`)
10-
- JavaScript separato (`js/main.js` + `js/pages/*`)
9+
- HTML statico (una pagina = un file `.html` in `src/pages/`)
10+
- JavaScript separato (`src/js/main.js` + `src/js/pages/*`)
11+
- CSS in `src/styles/`
1112
- Vite come dev server e build tool multipagina
1213
- Dev Kit Italia (`@italia/dev-kit-italia`) per i Web Components
1314
- GitHub Actions per CI e deploy su Pages
@@ -16,4 +17,4 @@ Usare un setup semplice e adatto a profili junior per creare pagine statiche del
1617

1718
- niente Handlebars/webpack da imparare
1819
- avvio rapido locale
19-
- output finale statico e pubblicabile facilmente
20+
- output finale statico e pubblicabile facilmente su GitHub Pages

docs/02-come-si-usa.md

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,49 @@
55
- Node.js 24 (gestito con `nvm`)
66
- pnpm 10+
77

8-
## Comandi principali
8+
## Primo avvio
99

1010
```bash
1111
nvm use
1212
pnpm install
1313
pnpm dev
1414
```
1515

16-
Comandi utili:
16+
Il dev server si apre su `http://localhost:5173` con la pagina indice.
17+
18+
## Comandi utili
1719

1820
```bash
19-
pnpm run lint:html
20-
pnpm run build
21-
pnpm run preview
21+
pnpm run lint:html # valida gli HTML
22+
pnpm run lint:js # linta il JS
23+
pnpm run lint:css # linta il CSS
24+
pnpm run format:check # controlla la formattazione con Prettier
25+
pnpm run build # build di produzione in dist/
26+
pnpm run preview # anteprima del build
2227
```
2328

24-
## Struttura minima
29+
## Struttura sorgente
30+
31+
```
32+
src/
33+
├── index.html # pagina indice con link alle pagine
34+
├── pages/
35+
│ ├── index.html # pagina di test rapida
36+
│ └── servizio.html # esempio pagina servizio
37+
├── js/
38+
│ ├── main.js # import CSS/font/componenti Dev Kit
39+
│ └── pages/
40+
│ ├── index.js # JS specifico per index
41+
│ └── servizio.js # JS specifico per servizio
42+
└── styles/
43+
└── main.css # stili del progetto
44+
```
2545

26-
- `pages/index.html`: pagina di test rapida
27-
- `pages/servizio.html`: esempio pagina servizio
28-
- `js/main.js`: import di CSS/font/componenti del Dev Kit
29-
- `js/pages/*.js`: JavaScript specifico per pagina
46+
## Output build
47+
48+
```
49+
dist/
50+
├── index.html # pagina indice
51+
├── pages/ # pagine HTML con path asset corretti
52+
└── assets/ # JS, CSS e font bundlati
53+
```

docs/03-come-si-sviluppa.md

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,34 @@
33
## Flusso consigliato
44

55
1. Crea un branch da `main`.
6-
2. Modifica i file HTML in `pages/` e il JS in `js/pages/`.
6+
2. Modifica i file HTML in `src/pages/` e il JS in `src/js/pages/`.
77
3. Verifica in locale (`pnpm dev`, `pnpm run lint:html`, `pnpm run build`).
8-
4. Apri Pull Request.
8+
4. Apri Pull Request — parte automaticamente la preview del branch.
9+
5. Fai merge su `main`.
910

10-
## Regole pratiche per mantenere semplicità
11+
## Aggiungere una nuova pagina
12+
13+
1. Crea `src/pages/nuova-pagina.html` — Vite la raccoglie automaticamente come entry point.
14+
2. Crea `src/js/pages/nuova-pagina.js` con almeno:
15+
```js
16+
import '../main.js';
17+
```
18+
3. Aggiungi il `<script>` nell'HTML:
19+
```html
20+
<script type="module" src="../js/pages/nuova-pagina.js"></script>
21+
```
22+
4. Aggiungi il link in `src/index.html`.
23+
24+
## Regole pratiche
1125

1226
- una pagina per file
13-
- niente templating lato build
1427
- JS separato per pagina
1528
- naming chiaro dei file (`home.html`, `servizio-x.html`, ecc.)
29+
- non modificare `dist/` a mano — è generato dal build
1630

17-
## Strategia di migrazione
31+
## Strategia di migrazione dal repo storico
1832

19-
- partire da pagine prioritarie
33+
- partire dalle pagine prioritarie
2034
- creare versione HTML base
2135
- sostituire blocchi UI con Web Components Dev Kit
22-
- validare visualmente e con lint HTML
36+
- validare visivamente e con lint HTML

docs/04-actions-github.md

Lines changed: 27 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,65 +2,54 @@
22

33
## Chi builda
44

5-
Build e deploy vengono eseguiti da **GitHub Actions** su runner hosted `ubuntu-latest`.
6-
In pratica, è GitHub (non una persona) che esegue i job quando parte un trigger.
5+
Build e deploy vengono eseguiti da **GitHub Actions** su runner `ubuntu-latest`.
6+
È GitHub (non una persona) che esegue i job quando parte un trigger.
77

88
## Workflow presenti
99

10-
### 1) CI (`.github/workflows/ci.yml`)
10+
### 1) Lint (`.github/workflows/lint.yml`)
1111

12-
Eseguito su `push` e `pull_request`.
12+
Eseguito su ogni **pull request**.
1313

1414
Fa:
15-
16-
- setup Node da `.nvmrc` (Node 24)
17-
- setup unificato tramite action locale `.github/actions/node_env_setup`
18-
- install dipendenze (`pnpm install --frozen-lockfile`)
15+
- format check con Prettier
1916
- lint HTML (`pnpm run lint:html`)
20-
- build (`pnpm run build`)
17+
- lint JS (`pnpm run lint:js`)
18+
- lint CSS (`pnpm run lint:css`)
2119

2220
### 2) Deploy Pages (`.github/workflows/pages.yml`)
2321

24-
Eseguito su push su branch `main`.
22+
Eseguito **manualmente** da GitHub (`workflow_dispatch`).
2523

2624
Fa:
25+
- build del progetto
26+
- upload artifact statico (`dist/`)
27+
- deploy su GitHub Pages (environment `github-pages`)
2728

28-
- build progetto
29-
- upload artifact statico (`dist`)
30-
- deploy automatico su GitHub Pages
31-
32-
### 3) Generate new release (`.github/workflows/publish-release.yml`)
29+
### 3) Preview (`.github/workflows/preview.yml`)
3330

34-
Compatibile con il flusso del repository `design-scuole-pagine-statiche`.
31+
Eseguito su ogni **pull request** (open, sync, close).
3532

3633
Fa:
34+
- **deploy**: build + push di `dist/` in `previews/<branch>/` sulla branch `gh-pages`
35+
- **commento PR**: posta o aggiorna un commento con l'URL della preview
36+
- **cleanup**: alla chiusura della PR rimuove la cartella preview da `gh-pages`
3737

38-
- trigger su tag `v*`
39-
- build del progetto
40-
- generazione zip release (`dist/zip/*.zip`)
41-
- pubblicazione GitHub Release
42-
- pubblicazione documentazione su branch `gh-pages`
38+
### 4) CodeQL
4339

44-
Nota: il trigger è impostato a `v2*` per allineamento al repo scuole.
40+
Gestito dal **default setup** di GitHub (Settings → Code security → Code scanning).
41+
Nessun file di workflow nel repo — gira automaticamente su push/PR su `main` e con schedule settimanale.
4542

46-
### 4) Update documentation (`.github/workflows/update_docs.yml`)
43+
### 5) Generate release (`.github/workflows/publish-release.yml`)
4744

48-
Compatibile con il flusso del repository `design-scuole-pagine-statiche`.
45+
Eseguito su tag `v2*`.
4946

5047
Fa:
48+
- build e zip del progetto
49+
- pubblicazione GitHub Release con allegato zip
5150

52-
- trigger manuale (`workflow_dispatch`)
53-
- build + deploy documentazione su `gh-pages`
54-
55-
## Modernizzazione e uniformità
56-
57-
Rispetto al flusso storico scuole, qui sono stati aggiunti:
58-
59-
- action composita riusabile per setup ambiente (`.github/actions/node_env_setup`)
60-
- `permissions` espliciti per principio di minimo privilegio
61-
- `concurrency` per evitare esecuzioni duplicate
62-
- runtime aggiornato (`Node 24` + `pnpm`)
63-
64-
## Risultato
51+
## Note
6552

66-
Il repo supporta sia il flusso CI moderno sia i workflow legacy-compatibili del repo scuole per agevolare un merge futuro plug-and-play.
53+
- Il **deploy su Pages è manuale**: si lancia a mano da GitHub Actions quando si vuole pubblicare.
54+
- Le **preview dei branch** sono automatiche su ogni PR e si trovano a `https://<org>.github.io/<repo>/previews/<branch>/`.
55+
- La branch `gh-pages` viene gestita dai workflow — non modificarla a mano.

docs/06-template-system.md

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
# Sistema di template
2+
3+
Ogni elemento riutilizzabile di una pagina (header, footer, card, sezioni) è definito
4+
come un elemento [`<template>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/template)
5+
in un file HTML separato nella cartella `src/templates/`.
6+
7+
Non si usa nessuna libreria di templating esterna: è HTML e JavaScript standard,
8+
bundlato da Vite.
9+
10+
## Struttura
11+
12+
```
13+
src/
14+
├── templates/
15+
│ ├── header.html # header del sito
16+
│ ├── footer.html # footer del sito
17+
│ ├── breadcrumb.html # navigazione breadcrumb
18+
│ ├── hero.html # sezione hero con titolo e descrizione
19+
│ ├── service-section.html # sezione con griglia di card
20+
│ └── service-card.html # singola card di servizio
21+
└── js/
22+
└── templates.js # helper: fromHTML, render, renderList
23+
```
24+
25+
## Come funziona un template
26+
27+
Ogni file in `src/templates/` contiene un unico elemento `<template>`.
28+
Vite lo importa come stringa (`?raw`) a build time — zero fetch a runtime.
29+
30+
### Slot di testo — `data-tpl`
31+
32+
```html
33+
<!-- src/templates/hero.html -->
34+
<template>
35+
<section class="hero">
36+
<h1 data-tpl="titolo"></h1>
37+
<p data-tpl="descrizione"></p>
38+
</section>
39+
</template>
40+
```
41+
42+
```js
43+
render(tpl.hero, {
44+
titolo: 'Servizi',
45+
descrizione: 'I servizi della scuola.',
46+
});
47+
```
48+
49+
### Slot attributi — `data-tpl-href`
50+
51+
```html
52+
<!-- src/templates/service-card.html -->
53+
<template>
54+
<article class="service-card">
55+
<a data-tpl-href="url">
56+
<strong data-tpl="titolo"></strong>
57+
<p data-tpl="descrizione"></p>
58+
</a>
59+
</article>
60+
</template>
61+
```
62+
63+
### Liste — `renderList`
64+
65+
```js
66+
const cards = [
67+
{ titolo: 'Iscrizioni', descrizione: '...', url: '#' },
68+
{ titolo: 'Pagamenti', descrizione: '...', url: '#' },
69+
];
70+
71+
// riempie il container con una card per ogni elemento dell'array
72+
contenitore.append(renderList(tpl.serviceCard, cards));
73+
```
74+
75+
### Template con container per lista — `data-cards`
76+
77+
Il template `service-section.html` contiene un `<div data-cards>` che serve
78+
come punto di iniezione per le card. Il JS lo trova e ci inietta la lista:
79+
80+
```js
81+
const sectionFrag = render(tpl.serviceSection, { titolo: sezione.titolo });
82+
sectionFrag.querySelector('[data-cards]').append(renderList(tpl.serviceCard, sezione.cards));
83+
rootSections.append(sectionFrag);
84+
```
85+
86+
## Aggiungere una nuova pagina con template
87+
88+
1. Crea `src/pages/mia-pagina.html` (shell minimale — solo `<div id="root-*">`).
89+
2. Crea `src/js/pages/mia-pagina.js`.
90+
3. Importa i template che ti servono:
91+
```js
92+
import { render, renderList, fromHTML } from '../templates.js';
93+
import heroHTML from '../../templates/hero.html?raw';
94+
const tpl = { hero: fromHTML(heroHTML) };
95+
```
96+
4. Definisci i dati e chiama `render()` / `renderList()`.
97+
5. Aggiungi il link in `src/index.html`.
98+
99+
## Aggiungere un nuovo template
100+
101+
1. Crea `src/templates/mio-template.html`:
102+
```html
103+
<template>
104+
<div class="mio-componente">
105+
<h3 data-tpl="titolo"></h3>
106+
<a data-tpl-href="url" data-tpl="etichetta"></a>
107+
</div>
108+
</template>
109+
```
110+
2. Importalo nel JS della pagina:
111+
```js
112+
import mioHTML from '../../templates/mio-template.html?raw';
113+
const tpl = { mio: fromHTML(mioHTML) };
114+
```
115+
3. Usalo con `render(tpl.mio, { titolo: '...', url: '#', etichetta: '...' })`.
116+
117+
## API dell'helper (`src/js/templates.js`)
118+
119+
| Funzione | Parametri | Restituisce | Descrizione |
120+
|---|---|---|---|
121+
| `fromHTML(html)` | `string` | `HTMLTemplateElement` | Parsa una stringa `?raw` e restituisce il `<template>` |
122+
| `render(tpl, data)` | `HTMLTemplateElement`, `object` | `DocumentFragment` | Clona il template e riempie gli slot |
123+
| `renderList(tpl, items)` | `HTMLTemplateElement`, `object[]` | `DocumentFragment` | Chiama `render` per ogni elemento dell'array |
124+
125+
## Riferimento — pagina esempio
126+
127+
Vedi `src/pages/servizio.html` + `src/js/pages/servizio.js` per un esempio
128+
completo con header, footer, breadcrumb, hero e tre sezioni di card.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
"preview": "vite preview",
1111
"lint:html": "html-validate \"src/pages/**/*.html\"",
1212
"lint:html:fix": "html-validate --fix \"src/pages/**/*.html\"",
13-
"format": "prettier --write --ignore-path .prettierignore \"**/*.{js,css,html,json,md}\"",
14-
"format:check": "prettier --check --ignore-path .prettierignore \"**/*.{js,css,html,json,md}\"",
13+
"format": "prettier --write --ignore-path .prettierignore \"**/*.{js,css,html,json}\"",
14+
"format:check": "prettier --check --ignore-path .prettierignore \"**/*.{js,css,html,json}\"",
1515
"lint:js": "eslint \"src/js/**/*.js\"",
1616
"lint:js:fix": "eslint --fix \"src/js/**/*.js\"",
1717
"lint:css": "stylelint \"src/styles/**/*.css\"",

0 commit comments

Comments
 (0)