feat: recipe favorites (#124), portion rescaler (#123), financial waste report (#117), macronutrient panel (#118)

- #124: star toggle on recipe view + favorites shown first in archive with gold border
- #123: +/- persons buttons on recipe to scale ingredient quantities
- #117: wasted value in EUR displayed in monthly stats section
- #118: macronutrient breakdown panel (P/C/F/fiber bars) with 4th insight rotation phase
- DB: is_favorite column on recipes, nutriments_json on products (auto-migrated)
- OFF API: nutriments fields fetched and stored per product
- Translations: it/en/de/fr/es updated with new keys
This commit is contained in:
dadaloop82
2026-05-26 18:09:32 +00:00
parent 6120fad40b
commit f46b12e3ad
10 changed files with 491 additions and 35 deletions
+11 -2
View File
@@ -384,7 +384,10 @@
"scale_wait_stable": "10s stabiles Gewicht für Auto-Ausfüllen abwarten…",
"ingredient_scaled_toast": "📦 Zutat vom Vorrat abgezogen!",
"finished_added_bring_toast": "🛒 Produkt aufgebraucht → zu Bring! hinzugefügt!",
"load_error": "Fehler beim Laden"
"load_error": "Fehler beim Laden",
"favorite": "Zu Favoriten hinzufügen",
"unfavorite": "Aus Favoriten entfernen",
"adjust_persons": "Personen"
},
"shopping": {
"title": "🛒 Einkaufsliste",
@@ -1247,7 +1250,13 @@
"source": "Basierend auf {n} Produkten in deiner Vorratskammer · EverShelf",
"products_count": "Produkte",
"today_title": "🥗 Deine Vorratskammer heute",
"products_n": "{n} Produkte"
"products_n": "{n} Produkte",
"macros_title": "Geschätzte Makronährstoffe",
"macros_proteins": "Proteine",
"macros_carbs": "Kohlenhydrate",
"macros_fat": "Fett",
"macros_fiber": "Ballaststoffe",
"macros_source": "Schätzung basierend auf {n} Vorratsprodukten"
},
"facts": {
"greeting_morning": "Guten Morgen",
+11 -2
View File
@@ -384,7 +384,10 @@
"scale_wait_stable": "Wait 10s of stable weight for auto-fill…",
"ingredient_scaled_toast": "📦 Ingredient deducted from pantry!",
"finished_added_bring_toast": "🛒 Finished product → added to Bring!",
"load_error": "Loading error"
"load_error": "Loading error",
"favorite": "Add to favourites",
"unfavorite": "Remove from favourites",
"adjust_persons": "Persons"
},
"shopping": {
"title": "🛒 Shopping List",
@@ -1247,7 +1250,13 @@
"source": "Based on {n} products in your pantry · EverShelf",
"products_count": "products",
"today_title": "🥗 Your pantry today",
"products_n": "{n} products"
"products_n": "{n} products",
"macros_title": "Estimated Macronutrients",
"macros_proteins": "Proteins",
"macros_carbs": "Carbohydrates",
"macros_fat": "Fat",
"macros_fiber": "Fibre",
"macros_source": "Estimate based on {n} pantry products"
},
"facts": {
"greeting_morning": "Good morning",
+11 -2
View File
@@ -379,7 +379,10 @@
"scale_wait_stable": "Espera 10s de peso estable para el relleno automático…",
"ingredient_scaled_toast": "📦 ¡Ingrediente deducido de la despensa!",
"finished_added_bring_toast": "🛒 Producto terminado → ¡añadido a Bring!",
"load_error": "Error de carga"
"load_error": "Error de carga",
"favorite": "Añadir a favoritos",
"unfavorite": "Quitar de favoritos",
"adjust_persons": "Personas"
},
"shopping": {
"title": "🛒 Lista de la compra",
@@ -1195,7 +1198,13 @@
"source": "Basado en {n} productos en tu despensa · EverShelf",
"products_count": "productos",
"today_title": "🥗 Tu despensa hoy",
"products_n": "{n} productos"
"products_n": "{n} productos",
"macros_title": "Macronutrientes estimados",
"macros_proteins": "Proteínas",
"macros_carbs": "Carbohidratos",
"macros_fat": "Grasas",
"macros_fiber": "Fibra",
"macros_source": "Estimación basada en {n} productos en despensa"
},
"facts": {
"greeting_morning": "Buenos días",
+11 -2
View File
@@ -379,7 +379,10 @@
"scale_wait_stable": "Attendez 10s de poids stable pour le remplissage automatique…",
"ingredient_scaled_toast": "📦 Ingrédient déduit du garde-manger !",
"finished_added_bring_toast": "🛒 Produit terminé → ajouté à Bring !",
"load_error": "Erreur de chargement"
"load_error": "Erreur de chargement",
"favorite": "Ajouter aux favoris",
"unfavorite": "Retirer des favoris",
"adjust_persons": "Personnes"
},
"shopping": {
"title": "🛒 Liste de courses",
@@ -1195,7 +1198,13 @@
"source": "Basé sur {n} produits dans votre garde-manger · EverShelf",
"products_count": "produits",
"today_title": "🥗 Votre garde-manger aujourd'hui",
"products_n": "{n} produits"
"products_n": "{n} produits",
"macros_title": "Macronutriments estimés",
"macros_proteins": "Protéines",
"macros_carbs": "Glucides",
"macros_fat": "Lipides",
"macros_fiber": "Fibres",
"macros_source": "Estimation basée sur {n} produits en stock"
},
"facts": {
"greeting_morning": "Bonjour",
+11 -2
View File
@@ -384,7 +384,10 @@
"scale_wait_stable": "Attendi 10s di stabilità per la compilazione automatica…",
"ingredient_scaled_toast": "📦 Ingrediente scalato dalla dispensa!",
"finished_added_bring_toast": "🛒 Prodotto finito → aggiunto a Bring!",
"load_error": "Errore nel caricamento"
"load_error": "Errore nel caricamento",
"favorite": "Aggiungi ai preferiti",
"unfavorite": "Rimuovi dai preferiti",
"adjust_persons": "Persone"
},
"shopping": {
"title": "🛒 Lista della Spesa",
@@ -1258,7 +1261,13 @@
"source": "Basato su {n} prodotti in dispensa · EverShelf",
"products_count": "prodotti",
"today_title": "🥗 La tua dispensa oggi",
"products_n": "{n} prodotti"
"products_n": "{n} prodotti",
"macros_title": "Macronutrienti stimati",
"macros_proteins": "Proteine",
"macros_carbs": "Carboidrati",
"macros_fat": "Grassi",
"macros_fiber": "Fibre",
"macros_source": "Stima basata su {n} prodotti in dispensa"
},
"facts": {
"greeting_morning": "Buongiorno",