- Pinna Flutter a 3.41.9 (ARG FLUTTER_VERSION) in entrambi i Dockerfile
- Aggiunge /opt/android-sdk/build-tools/34.0.0 al PATH (zipalign era missing)
- Sostituisce mount ${HOME}/.gradle con named volume gradle-cache
- Aggiunge --enforce-lockfile a flutter pub get per bloccare le dipendenze
- Aggiunge .flutter-version con la versione Flutter attesa
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Migrazione completa da Vue 3 + Vite a Flutter:
- rimossa sorgente Vue 3/Vite/Playwright
- app riscritta in Flutter con Material 3, Provider, SharedPreferences
- aggiunto supporto QR code per condivisione piano pasti
- aggregazione duplicati nella lista della spesa
- guida utente con 3 tab (Pasti, Converti, Spesa)
- containerizzazione Docker per dev e build APK
- suite di 110 test (unit + widget)
- ottimizzazioni APK: spazio e allocazioni a runtime
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Comprimi icon-only.png da 5.2 MB a 72 KB (512×512, quantizzazione 256 colori)
- Rimuovi setState() ridondante in ConverterPage.onChanged: search() chiama già notifyListeners()
- Cattura pendingItems/checkedItems in variabili locali nel build di ShoppingListPage per evitare filtraggio ripetuto a ogni paint
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
CLAUDE.md: rimossi riferimenti a noVNC/Vue3/sop.md, aggiornata
architettura reale (features/*/presentation/), rimossi file fantasma
(checkbox_item.dart, conversion_service.dart), aggiunta feature guide,
corretta struttura test, aggiornati comandi Docker.
README.md: riscritto per Flutter (rimosso stack Vue3/Node.js), aggiunta
sezione test con comandi e struttura cartelle, link docs/.
docker/README.md: aggiunta sezione test completa con comandi per tutti
i test, singolo file e singola feature; aggiornato flusso completo.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
add() usava millisecondsSinceEpoch come ID: chiamate ravvicinate nello
stesso millisecondo producevano ID identici, causando toggle e remove
incorretti su più elementi. Introdotto _idSeq come contatore progressivo,
allineato all'approccio già usato in addAll().
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
buildQrPayload e parseMealPlanFromQr erano metodi privati non testabili.
Estratti in un modulo dedicato e importati da qr_share_sheet e qr_scan_page.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
build.sh: il permesso CAMERA viene iniettato dentro il container
Docker subito dopo flutter create (sed gira come root, evita il
problema di permessi su android/ owned by root).
entrypoint.sh: stesso approccio, sed eseguito già dentro il container.
Il sed inserisce <uses-permission android:name="android.permission.CAMERA" />
prima di <application>, posizione corretta nel manifest Android.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Porta la funzionalità QR code dalla versione Vue a Flutter.
Condividi: pulsante in fondo alla tab Pasti (attivo solo con piano
non vuoto) → bottom sheet con QR code generato da qr_flutter.
Payload: { "v": 1, "meals": { ... } }, limite 2953 byte.
Ricevi: pulsante sempre visibile → QrScanPage full-screen con
fotocamera via mobile_scanner, cornice di mira, validazione
struttura JSON e importazione via MealPlannerProvider.importPlan().
Nuovi package: qr_flutter ^4.1.0, mobile_scanner ^5.0.0
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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>
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>
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>
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>
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>
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>
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>
- 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>
- 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>
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>
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>
- 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>
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>
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>
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>
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>
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>
- 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>
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
- 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
@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>
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>
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`
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>
- docker/Dockerfile: ambiente Node 20 + OpenJDK 17 + Android SDK 34
dist/ ricevuto come volume montato dall'host (non buildata nel container)
- docker/build.sh: esegue npm run build locale poi lancia il container
flag --head per buildare da HEAD ignorando modifiche non committate
- docker/README.md: requisiti host (x86_64 obbligatorio), utilizzo,
pipeline e note su prima build (~10-15 min)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- assets/icon-only.png: icona 1024×1024 da usare con
npx @capacitor/assets generate per generare le icone Android/iOS
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Rimuove versione duplicata (era nell'header e nella lista)
- Rimuove descrizione ridondante e bottone Chiudi full-width
- Aggiunge icona app (quadrato verde con iniziale B)
- X per chiudere in alto a destra, tap overlay per dismissione
- Righe info in card con bordo, pattern iOS/Android settings
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- InfoPanel.vue: bottom sheet con nome, versione (da package.json),
autore (Davide Grilli), licenza EUPL v1.2 e link documentazione
- App.vue: bottone info fisso in alto a destra, visibile da tutte
le pagine, con animazione slide-up sul pannello
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
MealPlanner:
- Titolo "Piano Pasti" (più breve e da app)
- Sottotitolo "Oggi, mercoledì 25 marzo" con data completa formattata
Converter:
- Layout calcolatrice: input sinistra | swap | risultato destra
- Card unificata con header alimento e footer fattore di resa
- Icona ricerca nell'input, stato iniziale con hint
- Titolo "Convertitore", sottotitolo descrittivo
- Tasto swap per invertire direzione invece del toggle
MealCard:
- Fix emoji pranzo 🌤️ → 🍽️ (rendering universale)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Slash command che attiva il profilo senior frontend/UX designer.
Include checklist di revisione (touch, accessibilità, CSS, Vue 3)
e pattern di riferimento con le variabili CSS e componenti del progetto.
Formato SKILL.md conforme alla documentazione ufficiale Claude Code.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Licenza europea copyleft: chi distribuisce o modifica il software
deve rilasciare il sorgente sotto EUPL o licenza compatibile.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- App.vue: root con navigazione tra le tre pagine
- BottomNav.vue: barra navigazione inferiore (Pasti, Converti, Spesa)
- MealPlanner.vue + MealCard.vue: pianificatore settimanale con lista voci per pasto
- Converter.vue: convertitore crudo/cotto con ricerca testuale
- ShoppingList.vue + CheckboxItem.vue: lista spesa con checkbox
- utils/storage.js: wrapper LocalStorage (save/load)
- utils/conversion.js: rawToCooked e cookedToRaw
- data/conversions.json: 14 alimenti con coefficienti di resa
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Aggiunge struttura base del progetto: package.json, vite.config.js,
index.html con viewport mobile, main.js, CSS globale mobile-first
e .gitignore.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Documento di specifiche per BitePlan: meal planner settimanale,
convertitore peso crudo/cotto e lista della spesa.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>