Commit Graph

65 Commits

Author SHA1 Message Date
davide 404a5f44ac feat: aggrega duplicati nella lista della spesa con quantità
Quando si genera la lista dal piano pasti, gli alimenti ripetuti in
più giorni o slot vengono aggregati in un unico elemento con contatore.
Es. zucchine lunedì + mercoledì → "zucchine (x2)".

- ShoppingItem: aggiunto campo quantity (default 1, persistito in JSON)
- ShoppingListProvider.addAll: conta le occorrenze per nome
  (case-insensitive) e crea un ShoppingItem con quantity = conteggio
- ShoppingItemTile: mostra "(xN)" colorato in primary quando quantity > 1,
  diventa muted insieme al nome quando l'elemento è completato

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 18:54:22 +02:00
davide cba83c9559 feat: aggiungi guida utente e icona launcher
Guida utente:
- Pulsante info nell'AppBar principale
- InfoBottomSheet: icona app, versione, autore, licenza, link alla guida
- GuidePage: tre tab (Pasti / Converti / Spesa) con card e step numerati,
  portata dalla DocsPanel Vue originale

AppBar globale in app.dart con titolo dinamico per tab corrente.

Icona launcher:
- flutter_launcher_icons eseguito in build.sh prima di flutter build apk
  (sia debug che release) per applicare assets/icon-only.png all'APK.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 18:38:02 +02:00
davide 36e8034efd feat: aggiungi container Docker dev e build per Flutter
docker/build/: build headless APK Android
- Dockerfile: Ubuntu 22.04 + Java 17 + Flutter stable + Android SDK
- build.sh: genera android/ automaticamente se mancante, poi
  flutter build apk; --release aggiunge zipalign + apksigner

docker/dev/: ambiente di sviluppo web con hot reload
- Dockerfile: Ubuntu 22.04 + Flutter stable (solo web, senza Android SDK)
- docker-compose.yml: espone porta 5173, monta il progetto come volume
- entrypoint.sh: inizializza web/ se mancante, flutter pub get,
  flutter run -d web-server su 0.0.0.0:5173

docker/README.md: documentazione aggiornata per entrambi i container;
rimossi Dockerfile e build.sh Vue/Capacitor non più usati.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 18:25:48 +02:00
davide aa88e2095b chore: aggiorna .gitignore e CLAUDE.md per Flutter
.gitignore: aggiunti scaffold Flutter (/android/, /ios/, /web/, ecc.),
file IDE (/.idea/, *.iml), .metadata; corretto /build/ (solo root).

CLAUDE.md: aggiornato con architettura Flutter, comandi dev/build/test
e stato avanzamento roadmap (checklist SOP).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 17:41:45 +02:00
davide 9a865a1479 test: aggiungi suite di test Flutter
Struttura specchia lib/features/:
- test/features/meal_planner/ — unit (DayPlan, MealPlan, provider) + widget (MealCard)
- test/features/converter/ — unit (ConversionEntry, formule rawToCooked/cookedToRaw)
- test/features/shopping_list/ — unit (ShoppingItem, provider) + widget (ShoppingItemTile)
- test/helpers/pump_app.dart — estensione PumpApp condivisa tra widget test
- integration_test/app_test.dart — e2e navigazione, shopping list, convertitore, meal planner

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 17:41:38 +02:00
davide eb7912421c feat: riscrivi app in Flutter
Riscrittura completa da Vue 3 + Capacitor a Flutter/Dart.

Architettura feature-based (lib/features/):
- meal_planner: modello MealPlan/DayPlan, provider, pagina e widget
- converter: modello ConversionEntry, provider con ricerca, pagina
- shopping_list: modello ShoppingItem, provider con deduplicazione, pagina e widget

Core:
- Material 3 con seed color #2d6a4f
- NavigationBar + IndexedStack (preserva stato dei tab)
- Portrait lock via SystemChrome
- Persistenza con shared_preferences
- 50+ alimenti × metodi cottura in assets/data/conversions.json

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 17:41:26 +02:00
davide d49b31f21d chore: rimuovi sorgente Vue 3, Vite e Playwright
Il progetto viene riscritto in Flutter. Eliminati tutti i file
Vue 3 (src/, tests/, public/), le configurazioni Vite/Vitest e
i test Playwright che non saranno più mantenuti.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 17:41:14 +02:00
davide 3f79e30ecd chore: aggiorna SOP e CLAUDE.md per migrazione a Flutter
Riscritto sop.md con stack Flutter + Docker (container dev noVNC +
container build headless). Aggiornato CLAUDE.md con roadmap, architettura
target e mapping Vue→Flutter come riferimento per la riscrittura.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 16:43:26 +02:00
davide 6293743fa1 chore: aggiungi CLAUDE.md e rimuovi skill UX locale
Aggiunta documentazione per Claude Code (comandi, architettura, testing,
pipeline Android). Rimossa la skill UX da .claude/skills/ non più necessaria.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 16:38:23 +02:00
davide febf2efb86 chore: bump version a 1.2.1 e aggiorna changelog
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 18:47:11 +02:00
davide 47f4bcba28 feat: blocca orientamento in portrait su APK e browser
- Dockerfile: aggiunge android:screenOrientation="portrait" all'activity
  in AndroidManifest.xml per bloccare il portrait nativamente sull'APK
- App.vue: fixOrientation() rileva il landscape tramite dimensioni viewport
  e applica un counter-rotate CSS in modo che l'app rimanga visivamente
  in portrait anche da browser mobile (dev server)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 18:41:22 +02:00
davide 3bd2b04a06 chore: bump version to 1.2.0 e aggiorna changelog
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 16:32:45 +02:00
davide f1bfa9a88c feat: aggiungi pulsante svuota piano settimanale
- Sposta .btn-clear da ShoppingList.vue (scoped) a style.css (globale)
- Aggiunge hasMeals, clearAll e btn-clear in MealPlanner.vue
- Aggiunge 4 test di integrazione per il nuovo pulsante

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 16:28:07 +02:00
davide cc866ae78c fix: aggiorna vite a 6.4.2 (path traversal, arbitrary file read)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 16:27:52 +02:00
davide 36cd84f32e chore: bump version to 1.1.0 e aggiorna documentazione
- package.json: versione 1.0.0 → 1.1.0
- CHANGELOG.md: aggiunta sezione [1.1.0]
- docs/guida-utente.md: aggiunte sezioni QR code condivisione/ricezione
- src/components/DocsPanel.vue: aggiunte card condivisione e ricezione piano
2026-04-02 23:06:32 +02:00
davide d79ce06278 feat: condivisione piano pasti via QR code
Merge branch 'qrcode'
2026-03-31 10:44:54 +02:00
davide 55257f849d fix: aggiungi permesso CAMERA all'AndroidManifest.xml generato da Capacitor 2026-03-31 10:44:09 +02:00
davide 7dd1bce80f chore: merge main nel branch qrcode (fix vulnerabilità npm)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 10:20:03 +02:00
davide 9b099dac83 fix: risolvi 6 vulnerabilità npm aggiornando vite e vitest
- Upgrade vite 5 → 6 (fix GHSA-67mh-4wv8-2f99: esbuild CORS dev server)
- Upgrade vitest 2 → 3 e @vitest/coverage-v8 2 → 3
- Rinomina vite.config.js → vite.config.mjs (richiesto da vite 6 ESM)
- Aggiorna requisito Node.js in README: 18.x → >= 20.x LTS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 10:15:55 +02:00
davide 8685ea0aca feat: condivisione piano pasti via QR code
Aggiunge due pulsanti in fondo alla schermata Piano Pasti:
- "Condividi": genera un QR code con i dati della settimana
- "Ricevi": apre la fotocamera per scansionare il QR e importare il piano

Dipendenze aggiunte: qrcode, jsqr

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-30 23:13:21 +02:00
davide 7a63706af5 chore: aggiorna versione a 1.0.0 e CHANGELOG
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-28 12:16:45 +01:00
davide 5df7956069 fix: crea dist/ prima del docker run per evitare ownership root
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-28 11:57:33 +01:00
davide 76cf672d80 fix: APK con --head ora copiato in dist/ invece di andare perso nella tmpdir
Con --head la DIST_DIR puntava alla directory temporanea che veniva cancellata
dal trap EXIT prima che l'utente potesse recuperare l'APK. L'APK viene ora
copiato esplicitamente in PROJECT_ROOT/dist/ dopo il docker run.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-28 11:50:55 +01:00
davide 96f75df6f2 feat: supporto build APK release firmato nella pipeline Docker
- Dockerfile: CMD condizionale su BUILD_TYPE (debug default, release con
  assembleRelease + zipalign + apksigner)
- build.sh: flag --release, richiesta password interattiva, mount keystore
  come volume read-only (mai nell'immagine)
- .gitignore: aggiunto *.jks
- docker/README.md: documentazione build debug/release, keytool, flag combinabili

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-28 10:10:43 +01:00
davide 0c2a227be2 chore: aggiorna versione a 0.9.1 e CHANGELOG
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 14:47:57 +01:00
davide e10bb2df4c test: aggiungi suite completa unit, integration ed e2e
- Unit (12+9): conversion.js (rawToCooked/cookedToRaw, edge case, inversa)
  e storage.js (save/load, round-trip, default fallback)
- Integration (17+12+14): Converter (ricerca, selezione, calcolo, swap, reset),
  MealPlanner (rendering, add/remove, generateShopping, deduplicazione),
  ShoppingList (add, toggle, remove, clearAll, contatore)
- E2E Playwright (6+6+7+10): navigation, meal-planner, converter, shopping-list
- Configurazione: vitest.config.js + playwright.config.js + tests/setup.js
- Script: test, test:coverage, test:e2e, test:e2e:ui

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 14:45:31 +01:00
davide 09c9706938 docs: aggiungi requisiti di sviluppo al README
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 14:35:11 +01:00
davide ecbae836b3 feat: guida utente in-app e fix grafici Convertitore
- DocsPanel: pannello documentazione slide-from-right con nav a pill,
  IntersectionObserver per sezione attiva, card con step numerati e callout tip
- InfoPanel: bottone "Guida" emette open-docs invece di aprire link esterno
- App: integra DocsPanel con v-model showDocs
- Converter: fix capitalize food names (capFirst invece di text-transform),
  simmetria visiva input/output (stesso underline e font-size 1.6rem),
  rimosso CSS morto (doppio align-items, doppio background, visibility hack)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 14:32:36 +01:00
davide f24e591ca0 docs: riscrivi guida utente allineata allo stato attuale dell'app
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 14:10:00 +01:00
davide eef38a74cc Merge branch 'new-logo' 2026-03-27 14:07:32 +01:00
davide c44fc6b4ec chore: aggiorna icona app e favicon circolare con sfondo trasparente 2026-03-27 13:31:14 +01:00
davide 32d8a267b9 chore: aggiorna CHANGELOG per v0.9.0
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 10:39:39 +01:00
davide 74084767af fix docs: correggi percorso APK da output/ a dist/ in docker/README.md
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 10:24:49 +01:00
davide d2e6ac9186 docs: riscrivi README con funzionalità aggiornate e accesso da mobile
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 10:24:42 +01:00
davide 91e2bf5664 chore: aggiorna versione a 0.9.0 2026-03-27 09:58:25 +01:00
davide b12ab225cd fix Converter: sentence case per metodo di cottura
Sostituisce text-transform:capitalize (che maiuscolava ogni parola)
con capFirst() — solo la prima lettera del metodo è maiuscola.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 09:55:06 +01:00
davide bf18165dd5 espandi metodi di cottura per tutte le verdure
Aggiunge forno e friggitrice ad aria a ogni voce verdura dove
applicabile; aggiunge padella alle verdure che ne erano prive.
Documenta ogni valore derivato con metodologia e k-factor.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 09:54:58 +01:00
davide 864d004cbd aggiungi generazione lista spesa dal piano pasti
Bottone "Genera lista della spesa" in fondo alla pagina Piano Pasti:
- raccoglie tutti gli item da tutti i giorni e pasti
- deduplica (case-insensitive) e salta item già presenti in lista
- aggiunge come non spuntati alla lista esistente
- naviga automaticamente alla tab Lista della spesa

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 23:35:14 +01:00
davide a3726ae3cc dev: esponi server Vite sulla rete locale (--host)
Permette di connettersi da altri dispositivi sulla stessa rete
tramite http://<ip>:5173 durante lo sviluppo.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 19:51:00 +01:00
davide 414153f7d3 fix App.vue: usa safe-area-inset-top per btn-info su telefoni con notch
Su dispositivi con status bar alta o notch il bottone info finiva
sotto l'area di sistema e non era toccabile. Aggiunto env(safe-area-inset-top)
per posizionarlo sempre nell'area visibile.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 19:48:07 +01:00
davide 79ecbb0729 aggiorna conversioni: dati reali con fonti verificate, aggiunge friggitrice ad aria
- docs/conversioni.md: sostituisce coefficienti placeholder con dati da fonti
  ufficiali (SINU, Istituto Muzzone, AEMMEDI, Nutrizionistadoc); aggiunge
  sezione friggitrice ad aria con regola derivata dal forno; nuovi alimenti:
  orzo, riso (4 varietà), spigola, sogliola, vitello, uova, verdure miste
- src/data/conversions.json: allineato al documento, include metodi friggitrice
  ad aria per pollo, tacchino, pesce, verdure e tuberi

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 19:41:52 +01:00
davide 13ae623531 aggiorna docs/conversioni: dati reali da alimentinutrizione.it
- Sostituisce coefficienti placeholder con dati verificati (39 voci)
- Riorganizza in 5 categorie: cereali e pasta, legumi, verdure, carne, pesce
- Patate e funghi inclusi in Verdure
- Fonte: https://www.alimentinutrizione.it/presentazione-dati

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 13:45:45 +01:00
davide 0e78955fe4 aggiungi documentazione e changelog
- README.md: panoramica app, stack, avvio dev, build APK, link docs
- CHANGELOG.md: standard Keep a Changelog, release 0.1.0-alpha completa
- docs/guida-utente.md: istruzioni Piano Pasti, Convertitore, Lista spesa
- docs/conversioni.md: tabella coefficienti con fonte alimentinutrizione.it

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 14:53:32 +01:00
davide 053c84aaa0 Merge branch 'wip-docker-build'
Aggiunge pipeline Docker per build APK Android:
- Dockerfile con Java 21, Android SDK 34, ImageMagick per icone
- build.sh con flag --head per build da ultimo commit
- Icone generate da assets/icon-only.png via ImageMagick
- Fix kotlin-stdlib conflict e versione da package.json
2026-03-25 12:30:20 +01:00
davide 595fe4310f fix Dockerfile: icone custom e versione da package.json
- Rimuove mipmap-anydpi-v26 per usare i PNG custom al posto delle
  adaptive icons di default; semplifica il loop con bash parameter
  expansion e cp invece di doppio convert
- Patcha android/app/build.gradle con versionName/versionCode letti
  da package.json prima della compilazione Gradle
2026-03-25 12:29:07 +01:00
davide 083a38f858 fix Dockerfile: usa ImageMagick per icone Android invece di @capacitor/assets
@capacitor/assets usa sharp (nativo Node.js) che falliva silenziosamente
nel container Docker. ImageMagick è più affidabile e senza dipendenze native.
Genera ic_launcher.png e ic_launcher_round.png per tutte le densità mipmap.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 11:49:26 +01:00
davide 51ad99d8c0 fix Dockerfile: genera icone Android da assets/icon-only.png
Aggiunge COPY assets/ e npx @capacitor/assets generate --android
per popolare i mipmap Android prima della build Gradle.
Senza questo step l'app mostrava l'icona di default di Capacitor.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 11:27:18 +01:00
davide e499ce6945 fix docker: APK in dist/ invece di output/
Rimuove la cartella output/ e monta dist/ in lettura/scrittura
così l'APK viene scritto direttamente in dist/biteplan.apk
2026-03-25 11:25:22 +01:00
davide 0516d1e819 fix Dockerfile: risolvi conflitto kotlin-stdlib duplicato
Kotlin 1.8+ incorpora jdk7/jdk8 nel main stdlib; Capacitor generava
un conflitto tra kotlin-stdlib:1.8.22 e kotlin-stdlib-jdk8:1.6.21.
Aggiunge una resolutionStrategy Gradle per forzare tutte le varianti
stdlib alla versione 1.8.22 dopo `npx cap add android`
2026-03-25 11:17:00 +01:00
davide a4e605d914 fix Dockerfile: cambia base image per Java 21
node:20-slim (Debian Bookworm) non ha openjdk-21 nei repo.
Usa eclipse-temurin:21-jdk-jammy (Adoptium/Ubuntu) come base
e installa Node.js 20 via NodeSource.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 11:02:51 +01:00