Aggiunge sezione "Aggiornamenti" in docs/guida-utente.md con rimando
dalla sezione "Informazioni app". Aggiunge TipCard nella tab Pasti
della guida in-app che descrive il controllo automatico all'avvio.
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>
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>
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>
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>