Files
InsanityLab-web/.superpowers/sdd/task-2-report.md
T
Adriano 4445c422f8 fix: loghi insanitylab estratti dal pdf figma al posto dei loghi template
- logo-dark.png (600×108) e logo-light.png (600×342) ora estratti da
  FigmaDoc/Homepage.pdf via pdftoppm 300dpi + ImageMagick, con alpha
- scripts/extract-logos.sh: pipeline riproducibile e idempotente (md5 stabile)
- asset-map.json: rimossa sezione fallbacks ../Dati (fonte errata PROWESS++)
- apply-asset-map.mjs: commento pipeline aggiornato a 4 step

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 00:25:18 +02:00

248 lines
13 KiB
Markdown
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.
# 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.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 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 (68 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.**
---
## 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.
---
## Fix round 3
**Data:** 2026-07-02
### Problema chiuso
`public/img/logo-dark.png` e `logo-light.png` contenevano i loghi del template "PROWESS++" copiati da `../Dati/` (sorgente errato). Sostituiti con i loghi reali "insanitylab" estratti vettorialmente dal PDF Figma.
### Metodo
Sorgente: `../FigmaDoc/Homepage.pdf` (1334×10460 pt, 1 pagina).
Render esplorativi a 72150 dpi per individuare le zone logo:
- **Logo dark** (header, fondo bianco): riga nav in alto, x≈25pt, y≈10pt
- **Logo light** (footer, fondo scuro `srgb(58,41,41)`): sezione footer, y≈8490pt
Estrazione finale con `pdftoppm -r 300`, poi ImageMagick:
- Dark: `-fuzz 8% -transparent white -trim -resize 600x -strip`
- Light: `-crop 850x660+130+60` (esclude tagline e colonne destra), `-fuzz 12% -transparent 'srgb(58,41,41)' -trim -resize 600x -strip`
`-strip` su entrambi garantisce idempotenza md5sum tra esecuzioni successive.
### Coordinate pdftoppm a 300 dpi (pixel)
| Logo | -x | -y | -W | -H | crop interno |
|---|---|---|---|---|---|
| dark | 104 | 41 | 895 | 250 | — |
| light | 0 | 35375 | 1800 | 833 | `850x660+130+60` |
### Dimensioni finali
| File | Dimensioni | Tipo |
|---|---|---|
| `public/img/logo-dark.png` | **600×108 px** | TrueColorAlpha (PNG trasparente) |
| `public/img/logo-light.png` | **600×342 px** | TrueColorAlpha (PNG trasparente) |
### Aggiornamenti pipeline
- Creato `scripts/extract-logos.sh` (bash, `set -euo pipefail`, coordinate fisse, idempotente)
- `scripts/asset-map.json`: rimossa sezione `fallbacks` (loghi ora da extract-logos.sh, non da `../Dati`)
- `scripts/apply-asset-map.mjs`: commento pipeline aggiornato a step 4
- Ordine pipeline: `extract-fig-images.sh → apply-asset-map.mjs → optimize-assets.sh → extract-logos.sh`
### Verifica visiva
- `logo-dark.png`: icona onda/battito cardiaco beige + scritta "insanitylab" scura, layout orizzontale, sfondo trasparente. **Nessun residuo PROWESS++.**
- `logo-light.png`: icona onda/battito cardiaco beige sopra, scritta "insanitylab" beige sotto, layout stacked, sfondo trasparente. **Nessun residuo PROWESS++.**
### Idempotenza
```
md5sum run1 = md5sum run2 → IDEMPOTENTE ✓
```