From 3b69857be66a3e757f7733806ffa8f68148993e9 Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Tue, 24 Mar 2026 23:19:26 +0100 Subject: [PATCH] Implementazione completa dell'app BitePlan - 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 --- src/App.vue | 26 +++++ src/components/BottomNav.vue | 67 +++++++++++++ src/components/CheckboxItem.vue | 58 +++++++++++ src/components/MealCard.vue | 126 ++++++++++++++++++++++++ src/data/conversions.json | 16 +++ src/pages/Converter.vue | 169 ++++++++++++++++++++++++++++++++ src/pages/MealPlanner.vue | 45 +++++++++ src/pages/ShoppingList.vue | 96 ++++++++++++++++++ src/utils/conversion.js | 2 + src/utils/storage.js | 5 + 10 files changed, 610 insertions(+) create mode 100644 src/App.vue create mode 100644 src/components/BottomNav.vue create mode 100644 src/components/CheckboxItem.vue create mode 100644 src/components/MealCard.vue create mode 100644 src/data/conversions.json create mode 100644 src/pages/Converter.vue create mode 100644 src/pages/MealPlanner.vue create mode 100644 src/pages/ShoppingList.vue create mode 100644 src/utils/conversion.js create mode 100644 src/utils/storage.js diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..b021114 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/components/BottomNav.vue b/src/components/BottomNav.vue new file mode 100644 index 0000000..5489ddb --- /dev/null +++ b/src/components/BottomNav.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/src/components/CheckboxItem.vue b/src/components/CheckboxItem.vue new file mode 100644 index 0000000..9b7a3f2 --- /dev/null +++ b/src/components/CheckboxItem.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/src/components/MealCard.vue b/src/components/MealCard.vue new file mode 100644 index 0000000..9443670 --- /dev/null +++ b/src/components/MealCard.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/src/data/conversions.json b/src/data/conversions.json new file mode 100644 index 0000000..fb21e36 --- /dev/null +++ b/src/data/conversions.json @@ -0,0 +1,16 @@ +{ + "pollo": { "forno": { "yield": 0.75 }, "padella": { "yield": 0.70 } }, + "manzo": { "forno": { "yield": 0.70 }, "padella": { "yield": 0.72 } }, + "maiale": { "forno": { "yield": 0.68 }, "padella": { "yield": 0.70 } }, + "salmone": { "forno": { "yield": 0.80 }, "padella": { "yield": 0.78 } }, + "tonno": { "forno": { "yield": 0.75 } }, + "uova": { "bollite": { "yield": 0.88 } }, + "riso": { "bollito": { "yield": 2.50 } }, + "pasta": { "bollita": { "yield": 2.20 } }, + "lenticchie": { "bollite": { "yield": 2.30 } }, + "zucchine": { "padella": { "yield": 0.80 }, "bollite": { "yield": 0.85 } }, + "carote": { "bollite": { "yield": 0.90 }, "forno": { "yield": 0.85 } }, + "patate": { "forno": { "yield": 0.75 }, "bollite": { "yield": 0.90 } }, + "spinaci": { "padella": { "yield": 0.35 }, "bolliti": { "yield": 0.30 } }, + "broccoli": { "bolliti": { "yield": 0.85 }, "forno": { "yield": 0.80 } } +} diff --git a/src/pages/Converter.vue b/src/pages/Converter.vue new file mode 100644 index 0000000..f9b91ea --- /dev/null +++ b/src/pages/Converter.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/src/pages/MealPlanner.vue b/src/pages/MealPlanner.vue new file mode 100644 index 0000000..b4a5612 --- /dev/null +++ b/src/pages/MealPlanner.vue @@ -0,0 +1,45 @@ + + + diff --git a/src/pages/ShoppingList.vue b/src/pages/ShoppingList.vue new file mode 100644 index 0000000..39c4b61 --- /dev/null +++ b/src/pages/ShoppingList.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/src/utils/conversion.js b/src/utils/conversion.js new file mode 100644 index 0000000..081342c --- /dev/null +++ b/src/utils/conversion.js @@ -0,0 +1,2 @@ +export const rawToCooked = (food, method, raw, db) => raw * db[food][method].yield +export const cookedToRaw = (food, method, cooked, db) => cooked / db[food][method].yield diff --git a/src/utils/storage.js b/src/utils/storage.js new file mode 100644 index 0000000..03a1f5b --- /dev/null +++ b/src/utils/storage.js @@ -0,0 +1,5 @@ +export const save = (key, val) => localStorage.setItem(key, JSON.stringify(val)) +export const load = (key, def) => { + const v = localStorage.getItem(key) + return v ? JSON.parse(v) : def +}