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>
@@ -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.
|
||||||
|
|||||||
@@ -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,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",
|
||||||
|
|||||||
@@ -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)."
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 198 KiB After Width: | Height: | Size: 186 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 185 KiB After Width: | Height: | Size: 145 KiB |
|
Before Width: | Height: | Size: 169 KiB After Width: | Height: | Size: 133 KiB |
|
Before Width: | Height: | Size: 145 KiB After Width: | Height: | Size: 116 KiB |
|
Before Width: | Height: | Size: 210 KiB After Width: | Height: | Size: 159 KiB |
|
Before Width: | Height: | Size: 150 KiB After Width: | Height: | Size: 140 KiB |
|
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 99 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 633 KiB After Width: | Height: | Size: 95 KiB |
|
Before Width: | Height: | Size: 1.9 MiB After Width: | Height: | Size: 133 KiB |
|
Before Width: | Height: | Size: 2.7 MiB After Width: | Height: | Size: 246 KiB |
|
Before Width: | Height: | Size: 237 KiB After Width: | Height: | Size: 254 KiB |
|
Before Width: | Height: | Size: 860 KiB After Width: | Height: | Size: 103 KiB |
|
Before Width: | Height: | Size: 789 KiB After Width: | Height: | Size: 172 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 723 KiB After Width: | Height: | Size: 458 KiB |
|
Before Width: | Height: | Size: 189 KiB After Width: | Height: | Size: 146 KiB |
|
Before Width: | Height: | Size: 176 KiB After Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 180 KiB After Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 215 KiB After Width: | Height: | Size: 167 KiB |
|
Before Width: | Height: | Size: 189 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 253 KiB After Width: | Height: | Size: 237 KiB |
|
Before Width: | Height: | Size: 177 KiB After Width: | Height: | Size: 140 KiB |