fix: limite altezza in optimize-assets, pesi immagini e report dimensioni

- optimize-assets.sh: resize da 1400x> a 1400x1600> (vincola anche altezza);
  qualità JPG 85→83; tutti i JPG esistenti ri-codificati (non solo PNG→JPG)
- asset-map.json: aggiunta chiave _nota con avviso conversione PNG→JPG
- apply-asset-map.mjs: skip chiavi JSON con prefisso _ (chiavi meta)
- src/assets/img: 11 MB → 3.7 MB, nessun file >500 KB (max: quote-bg 460 KB)
- task-2-report.md: sezione "Dimensioni finali" corretta + "Fix round 2"

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-02 00:14:56 +02:00
parent 551957e2e1
commit 810e5d8dcd
31 changed files with 62 additions and 17 deletions
+44 -3
View File
@@ -97,11 +97,13 @@ Tutti e 4 i loghi partner sono stati trovati nel Figma. Nessuna altra immagine r
## Dimensioni finali ## Dimensioni finali
``` ```
src/assets/img/ 3.4 MB (31 file JPG + 4 PNG partner loghi) src/assets/img/ 3.7 MB (31 file JPG + 4 PNG partner loghi)
public/img/ ~50 KB (2 PNG logo fallback) public/img/ ~3.4 KB (2 PNG logo: logo-dark.png 1.7 KB, logo-light.png 1.7 KB)
``` ```
Tutte le immagini sono ≤ 1400 px larghezza o ≤ 1200 px (ritratti). Nessun file supera 400 KB. Tutte le immagini sono ≤ 1400 px larghezza e ≤ 1600 px altezza. Il file più pesante è quote-bg.jpg a 460 KB. Nessun file supera 500 KB.
*Aggiornato dopo fix round 2 — i numeri precedenti (3.4 MB / nessun file >400 KB) erano errati: la pipeline originale non vincolava l'altezza, lasciando immagini portrait a 2-3 MB ciascuna.*
--- ---
@@ -148,3 +150,42 @@ git status --short → elenco file identico al pre-fix (31 img + 4
- **`method-step-3.jpg`** (184×276): sorgente in `assets-src/a3e84d7daf0b25c750ef694f4b9fc10bf0f2f1a8.jpg` è già 184×276 — stessa risoluzione del file committato. Nessuna versione ad alta risoluzione disponibile in `assets-src/`. **Richiede sorgente migliore dal cliente.** - **`method-step-3.jpg`** (184×276): sorgente in `assets-src/a3e84d7daf0b25c750ef694f4b9fc10bf0f2f1a8.jpg` è già 184×276 — stessa risoluzione del file committato. Nessuna versione ad alta risoluzione disponibile in `assets-src/`. **Richiede sorgente migliore dal cliente.**
- **`about-team-group.jpg`** (270×480): sorgente in `assets-src/32ecd00a20321e58c700fbaf739e53ac3bf03876.png` è già 270×480. Nessuna versione ad alta risoluzione disponibile. **Richiede sorgente migliore dal cliente.** - **`about-team-group.jpg`** (270×480): sorgente in `assets-src/32ecd00a20321e58c700fbaf739e53ac3bf03876.png` è già 270×480. Nessuna versione ad alta risoluzione disponibile. **Richiede sorgente migliore dal cliente.**
---
## Fix round 2
**Data:** 2026-07-02
### Numeri finali
```
src/assets/img/ 3.7 MB totale (31 JPG + 4 PNG partner)
```
Top-5 per peso:
| File | Dimensioni | Peso |
|---|---|---|
| quote-bg.jpg | 1087×1600 | 460 KB |
| info-performance.jpg | 1200×1500 | 256 KB |
| info-longevity.jpg | 1095×1600 | 248 KB |
| training-performance-class.jpg | 1400×1400 | 240 KB |
| about-exterior.jpg | 1400×781 | 188 KB |
Nessun file supera 500 KB. Precedente info-longevity.jpg era 2.7 MB, info-balance.jpg 2.0 MB.
### Cosa cambiato
1. **`scripts/optimize-assets.sh`** — vincolo resize cambiato da `'1400x>'` (solo larghezza) a `'1400x1600>'` (larghezza E altezza). Qualità JPG da 85 a 83. Tutti i JPG già esistenti vengono ri-codificati a q83 con nuovo vincolo (loop separato, skip file appena convertiti per evitare doppia codifica). Risultato: portrait da 2-3 MB → 248-460 KB.
2. **`scripts/asset-map.json`** — aggiunta chiave `"_nota"` in testa per documentare la conversione PNG→JPG operata da optimize-assets.sh (JSON non supporta commenti, chiave dedicata con prefisso `_`).
3. **`scripts/apply-asset-map.mjs`** — aggiunto `destDir.startsWith('_')` nella condizione di skip, così le chiavi meta `_*` del JSON vengono ignorate nella pipeline.
### Esito idempotenza
Terza esecuzione `apply-asset-map.mjs + optimize-assets.sh`: md5sum su tutti i .jpg identico prima e dopo → **IDEMPOTENTE**
### Esito verifica loghi
`public/img/logo-dark.png` (130×19, 1725 B) e `logo-light.png` (135×19, 1701 B) sono **identici** ai file sorgente in `../Dati/logo-dark.png` e `../Dati/logo-light.png` (stessa dimensione byte-level). Non sono placeholder: sono i loghi reali InsanityLab copiati dalla sezione `fallbacks` di asset-map.json tramite apply-asset-map.mjs. Le dimensioni in pixel ridotte (130×19 px) sono caratteristiche del PNG sorgente in Dati/, non di un errore di pipeline.
+1 -1
View File
@@ -14,7 +14,7 @@ let n = 0, missing = 0;
// Sezione principale: copia da assets-src/ // Sezione principale: copia da assets-src/
for (const [destDir, entries] of Object.entries(map)) { for (const [destDir, entries] of Object.entries(map)) {
if (destDir === 'fallbacks') continue; if (destDir.startsWith('_') || destDir === 'fallbacks') continue;
mkdirSync(join(root, destDir), { recursive: true }); mkdirSync(join(root, destDir), { recursive: true });
for (const [src, dest] of Object.entries(entries)) { for (const [src, dest] of Object.entries(entries)) {
const from = join(root, 'assets-src', src); const from = join(root, 'assets-src', src);
+1
View File
@@ -1,4 +1,5 @@
{ {
"_nota": "Le destinazioni .png fotografiche vengono convertite in .jpg da optimize-assets.sh; il nome finale su disco ha estensione .jpg",
"src/assets/img": { "src/assets/img": {
"8b71f158c30a0a23cc5113bfe1cd9a6c4f19e4c4.jpg": "hero-1.jpg", "8b71f158c30a0a23cc5113bfe1cd9a6c4f19e4c4.jpg": "hero-1.jpg",
"0f8034394657985cc4cf35eb8441ae93a7ce5302.jpg": "info-performance.jpg", "0f8034394657985cc4cf35eb8441ae93a7ce5302.jpg": "info-performance.jpg",
+16 -13
View File
@@ -1,8 +1,10 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Passo 3 della pipeline asset (dopo apply-asset-map.mjs). # Passo 3 della pipeline asset (dopo apply-asset-map.mjs).
# Converte PNG fotografici in src/assets/img/ → JPG q85 e ridimensiona a ≤1400px larghezza. # Converte PNG fotografici in src/assets/img/ → JPG q83 e ridimensiona a ≤1400x1600px.
# I PNG partner-* (loghi con trasparenza) restano PNG. # I PNG partner-* (loghi con trasparenza) restano PNG.
# Idempotente: se il .png non esiste (già convertito), salta. # Tutti i JPG esistenti vengono ri-codificati a q83 con vincolo 1400x1600>
# (larghezza ≤1400 px E altezza ≤1600 px, aspect ratio preservato).
# Idempotente se abbinato a apply-asset-map.mjs (che ripristina i sorgenti originali).
set -euo pipefail set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
@@ -11,27 +13,28 @@ IMG_DIR="$ROOT/src/assets/img"
cd "$IMG_DIR" cd "$IMG_DIR"
# --- PNG fotografici → JPG q85 + resize ≤1400px --- # --- PNG fotografici → JPG q83 + resize ≤1400x1600 ---
shopt -s nullglob shopt -s nullglob
declare -A just_converted
converted=0 converted=0
for png in *.png; do for png in *.png; do
[[ "$png" == partner-* ]] && continue [[ "$png" == partner-* ]] && continue
jpg="${png%.png}.jpg" jpg="${png%.png}.jpg"
convert "$png" -quality 85 -resize '1400x>' "$jpg" convert "$png" -quality 83 -resize '1400x1600>' "$jpg"
rm "$png" rm "$png"
echo " PNG→JPG: $png$jpg" echo " PNG→JPG: $png$jpg"
just_converted["$jpg"]=1
(( converted++ )) || true (( converted++ )) || true
done done
# --- Resize JPG già esistenti se >1400px --- # --- Ri-codifica JPG esistenti a q83 + vincolo 1400x1600 ---
resized=0 # Skip file appena convertiti (già a q83), elabora tutti gli altri.
reencoded=0
for jpg in *.jpg; do for jpg in *.jpg; do
w=$(identify -format '%w' "$jpg") [[ -n "${just_converted[$jpg]+x}" ]] && continue
if (( w > 1400 )); then mogrify -quality 83 -resize '1400x1600>' "$jpg"
mogrify -resize '1400x>' "$jpg" echo " Ricodificato: $jpg"
echo " Resize: $jpg (era ${w}px → ≤1400px)" (( reencoded++ )) || true
(( resized++ )) || true
fi
done done
echo "Ottimizzazione completata: ${converted} PNG→JPG, ${resized} JPG ridimensionati." echo "Ottimizzazione completata: ${converted} PNG→JPG, ${reencoded} JPG ricodificati (q83, ≤1400x1600)."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 KiB

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 KiB

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 KiB

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 633 KiB

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 MiB

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 237 KiB

After

Width:  |  Height:  |  Size: 254 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 860 KiB

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 789 KiB

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 723 KiB

After

Width:  |  Height:  |  Size: 458 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 KiB

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 KiB

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 215 KiB

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 253 KiB

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 177 KiB

After

Width:  |  Height:  |  Size: 140 KiB