feat: AI suggestions, smart shopping qty, shelf life fixes, UX polish

- bringSuggestItems(): Gemini AI for seasonal/complementary suggestions (6h cache)
- renderSuggestions(): AI badge (🤖 AI) for AI-sourced items + CSS .priority-ai
- smartShopping(): suggested_qty/unit/approx with package-aware tiers
- autoSyncUrgencySpecs(): sync suggested quantities to Bring! spec field
- estimateOpenedExpiryDays(): dairy-outside-fridge rules (panna 3d, yogurt 2d, latte 1d)
- AI shelf-life upper bound tightened to max(rule×4, 30) days
- Opened section: fix 0g display (remainderAmt >= 0.5 threshold, pkgSize guard)
- guessCategoryFromName(): expanded with 50+ new patterns (uova, herbs, vegetables...)
- Suggestions panel: excludes already-added Bring! items
- Shopping list: no re-render while suggestions panel is open
- Translations: remove duplicate 🍳 from dashboard.quick_recipe (all 3 langs)
- Scale icon: always white via filter:brightness(0)invert(1)
- opened_shelf_cache.json: remove 3 bad dairy entries (60d outside fridge)
This commit is contained in:
dadaloop82
2026-05-07 06:19:07 +00:00
parent ffb0341eb6
commit 4196130835
8 changed files with 581 additions and 145 deletions
+10 -1
View File
@@ -84,7 +84,7 @@
"opened_title": "📦 Prodotti Aperti",
"review_title": "🔍 Da revisionare",
"review_hint": "Quantità che sembrano anomale. Conferma se corrette o modifica.",
"quick_recipe": "🍳 Ricetta veloce con prodotti in scadenza",
"quick_recipe": "Ricetta veloce con prodotti in scadenza",
"banner_review_title": "Quantità anomala",
"banner_review_action_ok": "È corretto",
"banner_review_action_finish": "🗑️ È finito tutto",
@@ -104,6 +104,11 @@
"banner_expired_action_edit": "Correggi data",
"banner_anomaly_action_edit": "Correggi inventario",
"banner_anomaly_action_dismiss": "La quantità è giusta",
"banner_no_expiry_title": "Scadenza mancante: {name}",
"banner_no_expiry_detail": "Questo prodotto non ha una data di scadenza. Vuoi aggiungerla o confermare che non scade?",
"banner_no_expiry_action_set": "Imposta scadenza",
"banner_no_expiry_action_dismiss": "Non scade ✓",
"banner_no_expiry_toast_dismissed": "Segnato come 'non scade'",
"banner_expiring_title": "In scadenza",
"banner_expiring_today": "Scade oggi!",
"banner_expiring_tomorrow": "Scade domani",
@@ -357,6 +362,10 @@
"all_searched": "Tutti i prodotti sono già stati cercati. Usa 🔄 per ricercare singoli.",
"search_complete": "Ricerca completata: {count} prodotti",
"removed_sufficient": "🧹 {removed} prodotto/i con scorte sufficienti rimosso/i dalla lista",
"suggest_buy": "🛒 Compra: {qty} {unit}",
"suggest_buy_approx": "🛒 Almeno: {qty} {unit}",
"suggest_buy_tip": "Quantità suggerita in base al consumo degli ultimi 14 giorni",
"suggest_buy_approx_tip": "Stima minima basata sul consumo (compra la confezione più vicina)",
"bring_badge": "🛒 Già su Bring!",
"add_urgent_toast": "🔴 {n} prodotto/i urgente/i aggiunto/i automaticamente a Bring!",
"migration_done": "✅ {migrated} aggiornati, {skipped} già ok",