Files
InsanityLab-web/.superpowers/sdd/review-d8ef59e..551957e.diff
T
Adriano b913a2bf90 registri dei piani in git (AI-OS#309)
Refs gitea:Adriano/AI-OS#310

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-06 10:36:26 +02:00

356 lines
19 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Review package: d8ef59e..HEAD
## Commits
551957e fix: pipeline asset riproducibile con script di ottimizzazione
## Files changed
.superpowers/sdd/task-2-report.md | 150 ++++++++++++++++++++++++++
scripts/apply-asset-map.mjs | 22 ++++
scripts/asset-map.json | 8 +-
scripts/optimize-assets.sh | 37 +++++++
src/assets/img/about-exterior.jpg | Bin 155994 -> 202579 bytes
src/assets/img/about-trainer-1.jpg | Bin 93486 -> 189023 bytes
src/assets/img/about-trainer-2.jpg | Bin 85699 -> 173351 bytes
src/assets/img/about-trainer-3.jpg | Bin 77509 -> 148483 bytes
src/assets/img/about-trainer-4.jpg | Bin 97025 -> 214745 bytes
src/assets/img/about-training-group.jpg | Bin 116690 -> 153758 bytes
src/assets/img/hero-1.jpg | Bin 92869 -> 648492 bytes
src/assets/img/info-balance.jpg | Bin 225953 -> 2030838 bytes
src/assets/img/info-longevity.jpg | Bin 407013 -> 2813013 bytes
src/assets/img/method-step-1.jpg | Bin 101994 -> 880847 bytes
src/assets/img/method-step-2.jpg | Bin 171003 -> 808269 bytes
src/assets/img/quote-bg.jpg | Bin 309033 -> 740531 bytes
src/assets/img/team-antonello.jpg | Bin 91870 -> 193104 bytes
src/assets/img/team-donata.jpg | Bin 87105 -> 180165 bytes
src/assets/img/team-eleonora.jpg | Bin 93030 -> 184226 bytes
src/assets/img/team-nicola.jpg | Bin 104205 -> 220263 bytes
src/assets/img/training-performance-class.jpg | Bin 188850 -> 259348 bytes
src/assets/img/training-small-groups.jpg | Bin 97881 -> 181470 bytes
22 files changed, 214 insertions(+), 3 deletions(-)
## Diff
diff --git a/.superpowers/sdd/task-2-report.md b/.superpowers/sdd/task-2-report.md
new file mode 100644
index 0000000..e11e41f
--- /dev/null
+++ b/.superpowers/sdd/task-2-report.md
@@ -0,0 +1,150 @@
+# Task 2 Report — Estrazione e mappatura asset immagine da Figma
+
+**Data:** 2026-07-01
+**Fonte:** `../FigmaDoc/Web Insanity.fig` (60 immagini uniche + ~66 duplicati = 126 estratte)
+**Destinazione:** `src/assets/img/` (31 file) + `public/img/` (2 loghi)
+
+---
+
+## Mappature completate
+
+### Hero
+| File destinazione | Hash sorgente | Descrizione |
+|---|---|---|
+| `hero-1.jpg` | `8b71f158...` | Uomo con palla medica (medicine ball) che la tiene verso donna in posizione crunch, palestra scura — "uomo con palla medica + donna" ✓ |
+
+### Info sezioni (PERFORMANCE / BALANCE / LONGEVITY)
+| File destinazione | Hash sorgente | Descrizione |
+|---|---|---|
+| `info-performance.jpg` | `0f803439...` | Uomo muscoloso in planche su sfondo grigio neutro |
+| `info-balance.jpg` | `432d397a...` | Due donne sedute schiena a schiena in abiti sportivi beige/neutri |
+| `info-longevity.jpg` | `d7fcf0aa...` | Donna anziana in posizione push-up — longevità attiva |
+
+### Feature sezioni (immagini più grandi per ciascun pilastro)
+| File destinazione | Hash sorgente | Descrizione |
+|---|---|---|
+| `feature-performance.jpg` | `6d602573...` | Uomo con chalk sulle mani — preparazione sollevamento pesi, performance atletica |
+| `feature-balance.jpg` | `16e611de...` | Gruppo yoga all'aperto al tramonto — equilibrio e benessere |
+| `feature-longevity.jpg` | `98f1f8d2...` | Donna anziana in piedi con bottiglia d'acqua, outfit sportivo beige — longevità sana |
+
+### Quote background
+| File destinazione | Hash sorgente | Descrizione |
+|---|---|---|
+| `quote-bg.jpg` | `28e8157d...` | Scritta "PERFORMANCE. BALANCE. LONGEVITY." su muro di intonaco — elemento visivo identitario |
+
+### Training programs
+| File destinazione | Hash sorgente | Descrizione |
+|---|---|---|
+| `training-one-to-one.jpg` | `85808a0c...` | Trainer e cliente a colloquio in palestra, tablet in mano — consulenza personalizzata |
+| `training-small-groups.jpg` | `bb632b8d...` | Due donne con manubri leggeri in posizione atletica — small group training |
+| `training-performance-class.jpg` | `91aa82b5...` | Grande gruppo in sala fitness/danza con palle fitball — performance class |
+| `training-fit-remote.jpg` | `86c1363b...` | Donna a casa sul tappetino con laptop — allenamento remoto online |
+
+### Team Trainer (homepage — 4 ritratti luce dorata)
+| File destinazione | Hash sorgente | Persona identificata |
+|---|---|---|
+| `team-donata.jpg` | `0b6cf694...` | Donna capelli lunghi scuri dritti, luce dorada laterale — Donata ✓ |
+| `team-nicola.jpg` | `1cc33c41...` | Uomo barba folta, turtleneck scuro, luce dorata — Nicola ✓ |
+| `team-eleonora.jpg` | `a75ca105...` | Donna capelli biondi/chiari, stessa luce dorata — Eleonora ✓ |
+| `team-antonello.jpg` | `e3c84f99...` | Uomo occhiali tondi, capelli rasatissimi, luce dorata — Antonello ✓ |
+
+### Il Metodo (4 passi circolari)
+| File destinazione | Hash sorgente | Step identificato |
+|---|---|---|
+| `method-step-1.jpg` | `88cfcd5f...` | Calibro plicometro su addome — valutazione composizione corporea |
+| `method-step-2.jpg` | `d21671bb...` | Donna in cucina con verdure fresche e metro — pianificazione nutrizionale |
+| `method-step-3.jpg` | `a3e84d7d...` | Silhouette uomo in palestra in controluce — sessione allenamento |
+| `method-step-4.jpg` | `e50b6f78...` | Scarpe su tapis roulant — monitoraggio continuo e progressione |
+
+### Partner loghi
+| File destinazione | Hash sorgente | Logo identificato |
+|---|---|---|
+| `partner-edenred.png` | `bee22f37...` | "Ticket Welfare Edenred" — logo rosso/blu su sfondo trasparente ✓ |
+| `partner-welbee.png` | `cf079250...` | "welbee" — logo verde su sfondo bianco ✓ |
+| `partner-aon.png` | `014a7708...` | "Aon" — logo rosso su sfondo bianco ✓ |
+| `partner-howden.png` | `872c3679...` | "HOWDEN" — logo blu su sfondo bianco ✓ |
+
+### Loghi InsanityLab (public/img/)
+| File destinazione | Sorgente | Note |
+|---|---|---|
+| `logo-dark.png` | `../Dati/logo-dark.png` | **Fallback** — logo non presente nel file Figma |
+| `logo-light.png` | `../Dati/logo-light.png` | **Fallback** — logo non presente nel file Figma |
+
+### About page (bonus — non richiesti dal brief)
+| File destinazione | Hash sorgente | Descrizione |
+|---|---|---|
+| `about-exterior.jpg` | `8ffc5f7a...` | Facciata esterna palestra/studio InsanityLab, sera |
+| `about-team-group.jpg` | `32ecd00a...` | Foto di gruppo team InsanityLab in bianco e nero |
+| `about-training-group.jpg` | `d4608b10...` | Gruppo che salta con kettlebell in sala beige |
+| `about-trainer-1.jpg` | `dafcc193...` | Trainer donna capelli scuri ondulati, luce dorata |
+| `about-trainer-2.jpg` | `9c50f1d3...` | Trainer donna capelli scuri più corti, matura, luce dorata |
+| `about-trainer-3.jpg` | `c51a49b9...` | Trainer donna capelli neri lisci, sorriso, sfondo chiaro |
+| `about-trainer-4.jpg` | `3341a11b...` | Trainer uomo giovane senza barba, turtleneck scuro |
+
+---
+
+## Immagini attese ma non trovate nel Figma
+
+| Nome atteso | Motivo mancanza | Azione intrapresa |
+|---|---|---|
+| `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)
+```
+
+Tutte le immagini sono ≤ 1400 px larghezza o ≤ 1200 px (ritratti). Nessun file supera 400 KB.
+
+---
+
+## 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.
+
+---
+
+## Conteggio
+
+- **Mappate e presenti:** 33 (31 in src/assets/img + 2 in public/img)
+- **Mancanti nel Figma:** 2 (logo-dark, logo-light) → risolti con fallback
+- **Immagini estratte totali:** 126 (inclusi ~66 duplicati)
+- **Lasciate in assets-src/ (gitignored):** 126 file sorgente
+
+---
+
+## Fix round 1
+
+**Data:** 2026-07-02
+
+### Cosa cambiato
+
+1. **`scripts/asset-map.json`** — rimossa sezione `"public/img"` (chiavi non-hash, rompeva pipeline dopo `extract-fig-images.sh`). Aggiunta sezione top-level `"fallbacks"` con struttura `{ "public/img": { "../Dati/logo-dark.png": "logo-dark.png", "../Dati/logo-light.png": "logo-light.png" } }`. Le destinazioni in `src/assets/img` mantengono l'estensione REALE del sorgente estratto da Figma (`.png` per PNG Figma, `.jpg` per JPEG già presenti in assets-src).
+
+2. **`scripts/apply-asset-map.mjs`** — aggiunto commento d'intestazione sull'ordine pipeline (extract → apply → optimize). Aggiunto loop `fallbacks`: copia da path relativo alla root del repo invece che da `assets-src/`, senza exit 1 per file assenti nel .fig.
+
+3. **`scripts/optimize-assets.sh`** (nuovo) — bash, `set -euo pipefail`. Converte tutti i PNG non-partner in `src/assets/img/` → JPG qualità 85 con resize `1400x>`, poi ridimensiona JPG già esistenti se larghezza > 1400px. Idempotente (nullglob su `.png`).
+
+### Output verifica riproducibilità
+
+```
+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.**
diff --git a/scripts/apply-asset-map.mjs b/scripts/apply-asset-map.mjs
index 97c9835..f018d3c 100644
--- a/scripts/apply-asset-map.mjs
+++ b/scripts/apply-asset-map.mjs
@@ -1,19 +1,41 @@
+// Pipeline asset: extract-fig-images.sh → apply-asset-map.mjs → optimize-assets.sh
+// 1. extract-fig-images.sh: estrae hash-named images da .fig → assets-src/
+// 2. apply-asset-map.mjs: copia da assets-src/ → destinazioni (src/assets/img, public/img)
+// 3. optimize-assets.sh: converte PNG fotografici → JPG q85, ridimensiona ≤1400px
+
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;
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/)
+if (map.fallbacks) {
+ for (const [destDir, entries] of Object.entries(map.fallbacks)) {
+ mkdirSync(join(root, destDir), { recursive: true });
+ for (const [srcRelPath, dest] of Object.entries(entries)) {
+ const from = join(root, srcRelPath);
+ if (!existsSync(from)) { console.error(`MANCANTE (fallback): ${srcRelPath}`); missing++; continue; }
+ copyFileSync(from, join(root, destDir, dest));
+ n++;
+ }
+ }
+}
+
console.log(`Copiate ${n} immagini${missing ? `, ${missing} mancanti` : ''}`);
process.exit(missing ? 1 : 0);
diff --git a/scripts/asset-map.json b/scripts/asset-map.json
index e421329..0907eb3 100644
--- a/scripts/asset-map.json
+++ b/scripts/asset-map.json
@@ -25,15 +25,17 @@
"872c3679df24bd0d3fdca7c4cb9a24d1836309a0.png": "partner-howden.png",
"014a7708ad61b12c5765ad4a60539d2fa325f9aa.png": "partner-aon.png",
"8ffc5f7a2428b0d0eabd09f676ab98d3e5644f0d.png": "about-exterior.png",
"32ecd00a20321e58c700fbaf739e53ac3bf03876.png": "about-team-group.png",
"d4608b102eb67ac067e6585250b3c37963db1d34.png": "about-training-group.png",
"dafcc19362e3a76dd20e9a656499a8068a3a9fca.png": "about-trainer-1.png",
"9c50f1d3b3a0477e80e03c0849d3d4687610b461.png": "about-trainer-2.png",
"c51a49b9be7f1b1a31de6b2f5261c8c5b5fdab52.png": "about-trainer-3.png",
"3341a11b7153349a23c75b1fa2a9a62d48953330.png": "about-trainer-4.png"
},
- "public/img": {
- "logo-dark.png": "logo-dark.png",
- "logo-light.png": "logo-light.png"
+ "fallbacks": {
+ "public/img": {
+ "../Dati/logo-dark.png": "logo-dark.png",
+ "../Dati/logo-light.png": "logo-light.png"
+ }
}
}
diff --git a/scripts/optimize-assets.sh b/scripts/optimize-assets.sh
new file mode 100755
index 0000000..690a2fb
--- /dev/null
+++ b/scripts/optimize-assets.sh
@@ -0,0 +1,37 @@
+#!/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.
+# I PNG partner-* (loghi con trasparenza) restano PNG.
+# Idempotente: se il .png non esiste (già convertito), salta.
+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 ---
+shopt -s nullglob
+converted=0
+for png in *.png; do
+ [[ "$png" == partner-* ]] && continue
+ jpg="${png%.png}.jpg"
+ convert "$png" -quality 85 -resize '1400x>' "$jpg"
+ rm "$png"
+ echo " PNG→JPG: $png → $jpg"
+ (( converted++ )) || true
+done
+
+# --- Resize JPG già esistenti se >1400px ---
+resized=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
+done
+
+echo "Ottimizzazione completata: ${converted} PNG→JPG, ${resized} JPG ridimensionati."
diff --git a/src/assets/img/about-exterior.jpg b/src/assets/img/about-exterior.jpg
index 21365fe..f9acbb9 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-trainer-1.jpg b/src/assets/img/about-trainer-1.jpg
index 355ebc8..0888fc2 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 7899a91..4791b00 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 19ce4e8..1046caf 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 a376cc8..00aa1bb 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 7cffc63..959e60e 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/hero-1.jpg b/src/assets/img/hero-1.jpg
index fbd901b..eb13ceb 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 d5c0ba6..43f7989 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 ce65397..b153873 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/method-step-1.jpg b/src/assets/img/method-step-1.jpg
index 1b477d8..d8d000c 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 a8a3ba9..ca23451 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/quote-bg.jpg b/src/assets/img/quote-bg.jpg
index 07ceb83..23bc137 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 b2056da..e14d8b6 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 fb880e9..06beba4 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 e32db0a..ec473b3 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 0979b57..6a44984 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-performance-class.jpg b/src/assets/img/training-performance-class.jpg
index 42e88cd..c4cde4d 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 b23ca00..01b5fc5 100644
Binary files a/src/assets/img/training-small-groups.jpg and b/src/assets/img/training-small-groups.jpg differ