b913a2bf90
Refs gitea:Adriano/AI-OS#310 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
309 lines
17 KiB
Diff
309 lines
17 KiB
Diff
# Review package: 551957e..HEAD
|
||
|
||
## Commits
|
||
810e5d8 fix: limite altezza in optimize-assets, pesi immagini e report dimensioni
|
||
|
||
## Files changed
|
||
.superpowers/sdd/task-2-report.md | 47 ++++++++++++++++++++++++--
|
||
scripts/apply-asset-map.mjs | 2 +-
|
||
scripts/asset-map.json | 1 +
|
||
scripts/optimize-assets.sh | 29 +++++++++-------
|
||
src/assets/img/about-exterior.jpg | Bin 202579 -> 190714 bytes
|
||
src/assets/img/about-team-group.jpg | Bin 26902 -> 25553 bytes
|
||
src/assets/img/about-trainer-1.jpg | Bin 189023 -> 148343 bytes
|
||
src/assets/img/about-trainer-2.jpg | Bin 173351 -> 135795 bytes
|
||
src/assets/img/about-trainer-3.jpg | Bin 148483 -> 118975 bytes
|
||
src/assets/img/about-trainer-4.jpg | Bin 214745 -> 162617 bytes
|
||
src/assets/img/about-training-group.jpg | Bin 153758 -> 143401 bytes
|
||
src/assets/img/feature-balance.jpg | Bin 96137 -> 101290 bytes
|
||
src/assets/img/feature-longevity.jpg | Bin 27449 -> 25258 bytes
|
||
src/assets/img/feature-performance.jpg | Bin 79280 -> 79834 bytes
|
||
src/assets/img/hero-1.jpg | Bin 648492 -> 97196 bytes
|
||
src/assets/img/info-balance.jpg | Bin 2030838 -> 136394 bytes
|
||
src/assets/img/info-longevity.jpg | Bin 2813013 -> 252166 bytes
|
||
src/assets/img/info-performance.jpg | Bin 243040 -> 260295 bytes
|
||
src/assets/img/method-step-1.jpg | Bin 880847 -> 105410 bytes
|
||
src/assets/img/method-step-2.jpg | Bin 808269 -> 175977 bytes
|
||
src/assets/img/method-step-3.jpg | Bin 44942 -> 11290 bytes
|
||
src/assets/img/method-step-4.jpg | Bin 30953 -> 30346 bytes
|
||
src/assets/img/quote-bg.jpg | Bin 740531 -> 469103 bytes
|
||
src/assets/img/team-antonello.jpg | Bin 193104 -> 149301 bytes
|
||
src/assets/img/team-donata.jpg | Bin 180165 -> 138907 bytes
|
||
src/assets/img/team-eleonora.jpg | Bin 184226 -> 145996 bytes
|
||
src/assets/img/team-nicola.jpg | Bin 220263 -> 171336 bytes
|
||
src/assets/img/training-fit-remote.jpg | Bin 193144 -> 38375 bytes
|
||
src/assets/img/training-one-to-one.jpg | Bin 40927 -> 38837 bytes
|
||
src/assets/img/training-performance-class.jpg | Bin 259348 -> 242256 bytes
|
||
src/assets/img/training-small-groups.jpg | Bin 181470 -> 142807 bytes
|
||
31 files changed, 62 insertions(+), 17 deletions(-)
|
||
|
||
## Diff
|
||
diff --git a/.superpowers/sdd/task-2-report.md b/.superpowers/sdd/task-2-report.md
|
||
index e11e41f..3531a59 100644
|
||
--- a/.superpowers/sdd/task-2-report.md
|
||
+++ b/.superpowers/sdd/task-2-report.md
|
||
@@ -90,25 +90,27 @@
|
||
| `logo-dark.png` | Assente in `Web Insanity.fig` | Fallback da `../Dati/logo-dark.png` ✓ |
|
||
| `logo-light.png` | Assente in `Web Insanity.fig` | Fallback da `../Dati/logo-light.png` ✓ |
|
||
|
||
Tutti e 4 i loghi partner sono stati trovati nel Figma. Nessuna altra immagine richiesta dal brief risulta mancante.
|
||
|
||
---
|
||
|
||
## Dimensioni finali
|
||
|
||
```
|
||
-src/assets/img/ 3.4 MB (31 file JPG + 4 PNG partner loghi)
|
||
-public/img/ ~50 KB (2 PNG logo fallback)
|
||
+src/assets/img/ 3.7 MB (31 file JPG + 4 PNG partner loghi)
|
||
+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.*
|
||
|
||
---
|
||
|
||
## Note tecnica — PNG → JPG
|
||
|
||
Le foto trainer e training erano estratte dal Figma come PNG lossless (6–8 MB ciascuna). Convertite a JPG qualità 85 con resize a 1200 px max → risparmio ~98% per file. I loghi partner restano PNG per preservare sfondo trasparente.
|
||
|
||
Il file `asset-map.json` referenzia gli hash originali (estensione .png/.jpg come estratti). I file di destinazione finali hanno tutti estensione .jpg (eccetto loghi partner .png), il che diverge dai nomi originali nel map ma i file in `src/assets/img/` riflettono il formato convertito.
|
||
|
||
---
|
||
@@ -141,10 +143,49 @@ node scripts/apply-asset-map.mjs → "Copiate 33 immagini"
|
||
./scripts/optimize-assets.sh → 16 PNG→JPG, 5 JPG ridimensionati (hero-1, info-balance, info-longevity, method-step-1, method-step-2)
|
||
git status --short → elenco file identico al pre-fix (31 img + 4 PNG partner)
|
||
18 file binari rigenerati (ricompressione diversa da conversione manuale originale)
|
||
→ ricommittati: repo = output pipeline ✓
|
||
```
|
||
|
||
### Esito punto 4 — bassa risoluzione
|
||
|
||
- **`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.**
|
||
+
|
||
+---
|
||
+
|
||
+## 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.
|
||
diff --git a/scripts/apply-asset-map.mjs b/scripts/apply-asset-map.mjs
|
||
index f018d3c..38b06a1 100644
|
||
--- a/scripts/apply-asset-map.mjs
|
||
+++ b/scripts/apply-asset-map.mjs
|
||
@@ -7,21 +7,21 @@ import { copyFileSync, mkdirSync, existsSync } from 'node:fs';
|
||
import { readFileSync } from 'node:fs';
|
||
import { join, dirname } from 'node:path';
|
||
import { fileURLToPath } from 'node:url';
|
||
|
||
const root = join(dirname(fileURLToPath(import.meta.url)), '..');
|
||
const map = JSON.parse(readFileSync(join(root, 'scripts/asset-map.json'), 'utf8'));
|
||
let n = 0, missing = 0;
|
||
|
||
// Sezione principale: copia da assets-src/
|
||
for (const [destDir, entries] of Object.entries(map)) {
|
||
- if (destDir === 'fallbacks') continue;
|
||
+ if (destDir.startsWith('_') || destDir === 'fallbacks') continue;
|
||
mkdirSync(join(root, destDir), { recursive: true });
|
||
for (const [src, dest] of Object.entries(entries)) {
|
||
const from = join(root, 'assets-src', src);
|
||
if (!existsSync(from)) { console.error(`MANCANTE: ${src}`); missing++; continue; }
|
||
copyFileSync(from, join(root, destDir, dest));
|
||
n++;
|
||
}
|
||
}
|
||
|
||
// Sezione fallbacks: copia da path relativo alla root del repo (es. ../Dati/)
|
||
diff --git a/scripts/asset-map.json b/scripts/asset-map.json
|
||
index 0907eb3..4662a28 100644
|
||
--- a/scripts/asset-map.json
|
||
+++ b/scripts/asset-map.json
|
||
@@ -1,11 +1,12 @@
|
||
{
|
||
+ "_nota": "Le destinazioni .png fotografiche vengono convertite in .jpg da optimize-assets.sh; il nome finale su disco ha estensione .jpg",
|
||
"src/assets/img": {
|
||
"8b71f158c30a0a23cc5113bfe1cd9a6c4f19e4c4.jpg": "hero-1.jpg",
|
||
"0f8034394657985cc4cf35eb8441ae93a7ce5302.jpg": "info-performance.jpg",
|
||
"432d397a342b4e8312a3a13a4fea836b3e867a64.jpg": "info-balance.jpg",
|
||
"d7fcf0aa827ec50f660145c0d319049b9153fefb.jpg": "info-longevity.jpg",
|
||
"6d6025730c3d0b73c0052fa67b1bb111c8462a08.jpg": "feature-performance.jpg",
|
||
"16e611de84f51bf5d01486a5e74ba0f8249850be.jpg": "feature-balance.jpg",
|
||
"98f1f8d257dfeffbaf35507d033e5bb51e08895e.png": "feature-longevity.png",
|
||
"28e8157dc88a42cffdbcd028e4cb02a6eb3de337.png": "quote-bg.png",
|
||
"85808a0c9aeb461c70c059b013eab47faa4fc4f1.png": "training-one-to-one.png",
|
||
diff --git a/scripts/optimize-assets.sh b/scripts/optimize-assets.sh
|
||
index 690a2fb..01bb004 100755
|
||
--- a/scripts/optimize-assets.sh
|
||
+++ b/scripts/optimize-assets.sh
|
||
@@ -1,37 +1,40 @@
|
||
#!/usr/bin/env bash
|
||
# 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.
|
||
-# 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
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||
IMG_DIR="$ROOT/src/assets/img"
|
||
|
||
cd "$IMG_DIR"
|
||
|
||
-# --- PNG fotografici → JPG q85 + resize ≤1400px ---
|
||
+# --- PNG fotografici → JPG q83 + resize ≤1400x1600 ---
|
||
shopt -s nullglob
|
||
+declare -A just_converted
|
||
converted=0
|
||
for png in *.png; do
|
||
[[ "$png" == partner-* ]] && continue
|
||
jpg="${png%.png}.jpg"
|
||
- convert "$png" -quality 85 -resize '1400x>' "$jpg"
|
||
+ convert "$png" -quality 83 -resize '1400x1600>' "$jpg"
|
||
rm "$png"
|
||
echo " PNG→JPG: $png → $jpg"
|
||
+ just_converted["$jpg"]=1
|
||
(( converted++ )) || true
|
||
done
|
||
|
||
-# --- Resize JPG già esistenti se >1400px ---
|
||
-resized=0
|
||
+# --- Ri-codifica JPG esistenti a q83 + vincolo 1400x1600 ---
|
||
+# Skip file appena convertiti (già a q83), elabora tutti gli altri.
|
||
+reencoded=0
|
||
for jpg in *.jpg; do
|
||
- w=$(identify -format '%w' "$jpg")
|
||
- if (( w > 1400 )); then
|
||
- mogrify -resize '1400x>' "$jpg"
|
||
- echo " Resize: $jpg (era ${w}px → ≤1400px)"
|
||
- (( resized++ )) || true
|
||
- fi
|
||
+ [[ -n "${just_converted[$jpg]+x}" ]] && continue
|
||
+ mogrify -quality 83 -resize '1400x1600>' "$jpg"
|
||
+ echo " Ricodificato: $jpg"
|
||
+ (( reencoded++ )) || true
|
||
done
|
||
|
||
-echo "Ottimizzazione completata: ${converted} PNG→JPG, ${resized} JPG ridimensionati."
|
||
+echo "Ottimizzazione completata: ${converted} PNG→JPG, ${reencoded} JPG ricodificati (q83, ≤1400x1600)."
|
||
diff --git a/src/assets/img/about-exterior.jpg b/src/assets/img/about-exterior.jpg
|
||
index f9acbb9..99a44e7 100644
|
||
Binary files a/src/assets/img/about-exterior.jpg and b/src/assets/img/about-exterior.jpg differ
|
||
diff --git a/src/assets/img/about-team-group.jpg b/src/assets/img/about-team-group.jpg
|
||
index 69b2d35..a37d5ad 100644
|
||
Binary files a/src/assets/img/about-team-group.jpg and b/src/assets/img/about-team-group.jpg differ
|
||
diff --git a/src/assets/img/about-trainer-1.jpg b/src/assets/img/about-trainer-1.jpg
|
||
index 0888fc2..b958d89 100644
|
||
Binary files a/src/assets/img/about-trainer-1.jpg and b/src/assets/img/about-trainer-1.jpg differ
|
||
diff --git a/src/assets/img/about-trainer-2.jpg b/src/assets/img/about-trainer-2.jpg
|
||
index 4791b00..76cfa77 100644
|
||
Binary files a/src/assets/img/about-trainer-2.jpg and b/src/assets/img/about-trainer-2.jpg differ
|
||
diff --git a/src/assets/img/about-trainer-3.jpg b/src/assets/img/about-trainer-3.jpg
|
||
index 1046caf..e17f529 100644
|
||
Binary files a/src/assets/img/about-trainer-3.jpg and b/src/assets/img/about-trainer-3.jpg differ
|
||
diff --git a/src/assets/img/about-trainer-4.jpg b/src/assets/img/about-trainer-4.jpg
|
||
index 00aa1bb..54c1470 100644
|
||
Binary files a/src/assets/img/about-trainer-4.jpg and b/src/assets/img/about-trainer-4.jpg differ
|
||
diff --git a/src/assets/img/about-training-group.jpg b/src/assets/img/about-training-group.jpg
|
||
index 959e60e..6c795a3 100644
|
||
Binary files a/src/assets/img/about-training-group.jpg and b/src/assets/img/about-training-group.jpg differ
|
||
diff --git a/src/assets/img/feature-balance.jpg b/src/assets/img/feature-balance.jpg
|
||
index 48d6c74..416d835 100644
|
||
Binary files a/src/assets/img/feature-balance.jpg and b/src/assets/img/feature-balance.jpg differ
|
||
diff --git a/src/assets/img/feature-longevity.jpg b/src/assets/img/feature-longevity.jpg
|
||
index 6f26b10..06ec041 100644
|
||
Binary files a/src/assets/img/feature-longevity.jpg and b/src/assets/img/feature-longevity.jpg differ
|
||
diff --git a/src/assets/img/feature-performance.jpg b/src/assets/img/feature-performance.jpg
|
||
index 3c16e7d..f7209e7 100644
|
||
Binary files a/src/assets/img/feature-performance.jpg and b/src/assets/img/feature-performance.jpg differ
|
||
diff --git a/src/assets/img/hero-1.jpg b/src/assets/img/hero-1.jpg
|
||
index eb13ceb..edaa600 100644
|
||
Binary files a/src/assets/img/hero-1.jpg and b/src/assets/img/hero-1.jpg differ
|
||
diff --git a/src/assets/img/info-balance.jpg b/src/assets/img/info-balance.jpg
|
||
index 43f7989..57ffdac 100644
|
||
Binary files a/src/assets/img/info-balance.jpg and b/src/assets/img/info-balance.jpg differ
|
||
diff --git a/src/assets/img/info-longevity.jpg b/src/assets/img/info-longevity.jpg
|
||
index b153873..e7b194d 100644
|
||
Binary files a/src/assets/img/info-longevity.jpg and b/src/assets/img/info-longevity.jpg differ
|
||
diff --git a/src/assets/img/info-performance.jpg b/src/assets/img/info-performance.jpg
|
||
index a514f75..bdc360c 100644
|
||
Binary files a/src/assets/img/info-performance.jpg and b/src/assets/img/info-performance.jpg differ
|
||
diff --git a/src/assets/img/method-step-1.jpg b/src/assets/img/method-step-1.jpg
|
||
index d8d000c..3c3748d 100644
|
||
Binary files a/src/assets/img/method-step-1.jpg and b/src/assets/img/method-step-1.jpg differ
|
||
diff --git a/src/assets/img/method-step-2.jpg b/src/assets/img/method-step-2.jpg
|
||
index ca23451..81dfb8a 100644
|
||
Binary files a/src/assets/img/method-step-2.jpg and b/src/assets/img/method-step-2.jpg differ
|
||
diff --git a/src/assets/img/method-step-3.jpg b/src/assets/img/method-step-3.jpg
|
||
index c818d32..d8e7b96 100644
|
||
Binary files a/src/assets/img/method-step-3.jpg and b/src/assets/img/method-step-3.jpg differ
|
||
diff --git a/src/assets/img/method-step-4.jpg b/src/assets/img/method-step-4.jpg
|
||
index f2206da..ec6fc69 100644
|
||
Binary files a/src/assets/img/method-step-4.jpg and b/src/assets/img/method-step-4.jpg differ
|
||
diff --git a/src/assets/img/quote-bg.jpg b/src/assets/img/quote-bg.jpg
|
||
index 23bc137..e5ab31d 100644
|
||
Binary files a/src/assets/img/quote-bg.jpg and b/src/assets/img/quote-bg.jpg differ
|
||
diff --git a/src/assets/img/team-antonello.jpg b/src/assets/img/team-antonello.jpg
|
||
index e14d8b6..0c8a08c 100644
|
||
Binary files a/src/assets/img/team-antonello.jpg and b/src/assets/img/team-antonello.jpg differ
|
||
diff --git a/src/assets/img/team-donata.jpg b/src/assets/img/team-donata.jpg
|
||
index 06beba4..71ddb49 100644
|
||
Binary files a/src/assets/img/team-donata.jpg and b/src/assets/img/team-donata.jpg differ
|
||
diff --git a/src/assets/img/team-eleonora.jpg b/src/assets/img/team-eleonora.jpg
|
||
index ec473b3..003469f 100644
|
||
Binary files a/src/assets/img/team-eleonora.jpg and b/src/assets/img/team-eleonora.jpg differ
|
||
diff --git a/src/assets/img/team-nicola.jpg b/src/assets/img/team-nicola.jpg
|
||
index 6a44984..2e0befd 100644
|
||
Binary files a/src/assets/img/team-nicola.jpg and b/src/assets/img/team-nicola.jpg differ
|
||
diff --git a/src/assets/img/training-fit-remote.jpg b/src/assets/img/training-fit-remote.jpg
|
||
index e4fb107..c7602b4 100644
|
||
Binary files a/src/assets/img/training-fit-remote.jpg and b/src/assets/img/training-fit-remote.jpg differ
|
||
diff --git a/src/assets/img/training-one-to-one.jpg b/src/assets/img/training-one-to-one.jpg
|
||
index d84d102..6a81d1f 100644
|
||
Binary files a/src/assets/img/training-one-to-one.jpg and b/src/assets/img/training-one-to-one.jpg differ
|
||
diff --git a/src/assets/img/training-performance-class.jpg b/src/assets/img/training-performance-class.jpg
|
||
index c4cde4d..434a95f 100644
|
||
Binary files a/src/assets/img/training-performance-class.jpg and b/src/assets/img/training-performance-class.jpg differ
|
||
diff --git a/src/assets/img/training-small-groups.jpg b/src/assets/img/training-small-groups.jpg
|
||
index 01b5fc5..885e2b7 100644
|
||
Binary files a/src/assets/img/training-small-groups.jpg and b/src/assets/img/training-small-groups.jpg differ
|