healthy-meals-core 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/bmr.d.ts +3 -0
  2. package/dist/bmr.js +14 -0
  3. package/dist/dailyMealPlanGenerator.d.ts +3 -0
  4. package/dist/dailyMealPlanGenerator.js +211 -0
  5. package/dist/data/detailed-recipes-bs.json +417 -0
  6. package/dist/data/detailed-recipes.json +744 -0
  7. package/dist/foodConversion.d.ts +55 -0
  8. package/dist/foodConversion.js +200 -0
  9. package/dist/index.d.ts +12 -0
  10. package/dist/index.js +27 -0
  11. package/dist/planner.d.ts +2 -0
  12. package/dist/planner.js +24 -0
  13. package/dist/recipeBasedMealPlanGenerator.d.ts +17 -0
  14. package/dist/recipeBasedMealPlanGenerator.js +255 -0
  15. package/dist/recipeService.d.ts +28 -0
  16. package/dist/recipeService.js +136 -0
  17. package/dist/rules/cholesterol.d.ts +2 -0
  18. package/dist/rules/cholesterol.js +7 -0
  19. package/dist/rules/diabetes.d.ts +2 -0
  20. package/dist/rules/diabetes.js +7 -0
  21. package/dist/rules/fattyLiver.d.ts +2 -0
  22. package/dist/rules/fattyLiver.js +7 -0
  23. package/dist/rules/index.d.ts +7 -0
  24. package/dist/rules/index.js +47 -0
  25. package/dist/rules/lowCarb.d.ts +2 -0
  26. package/dist/rules/lowCarb.js +7 -0
  27. package/dist/rules/triglycerides.d.ts +2 -0
  28. package/dist/rules/triglycerides.js +7 -0
  29. package/dist/src/bmr.d.ts +3 -0
  30. package/dist/src/bmr.js +13 -0
  31. package/dist/src/dailyMealPlanGenerator.d.ts +3 -0
  32. package/dist/src/dailyMealPlanGenerator.js +210 -0
  33. package/dist/src/foodConversion.d.ts +55 -0
  34. package/dist/src/foodConversion.js +199 -0
  35. package/dist/src/index.d.ts +12 -0
  36. package/dist/src/index.js +27 -0
  37. package/dist/src/planner.d.ts +2 -0
  38. package/dist/src/planner.js +23 -0
  39. package/dist/src/recipeBasedMealPlanGenerator.d.ts +17 -0
  40. package/dist/src/recipeBasedMealPlanGenerator.js +254 -0
  41. package/dist/src/recipeService.d.ts +28 -0
  42. package/dist/src/recipeService.js +136 -0
  43. package/dist/src/rules/cholesterol.d.ts +2 -0
  44. package/dist/src/rules/cholesterol.js +6 -0
  45. package/dist/src/rules/diabetes.d.ts +2 -0
  46. package/dist/src/rules/diabetes.js +6 -0
  47. package/dist/src/rules/fattyLiver.d.ts +2 -0
  48. package/dist/src/rules/fattyLiver.js +6 -0
  49. package/dist/src/rules/index.d.ts +7 -0
  50. package/dist/src/rules/index.js +46 -0
  51. package/dist/src/rules/lowCarb.d.ts +2 -0
  52. package/dist/src/rules/lowCarb.js +6 -0
  53. package/dist/src/rules/triglycerides.d.ts +2 -0
  54. package/dist/src/rules/triglycerides.js +6 -0
  55. package/dist/src/types/firestore.d.ts +100 -0
  56. package/dist/src/types/firestore.js +2 -0
  57. package/dist/src/types/openfoodfacts.d.ts +113 -0
  58. package/dist/src/types/openfoodfacts.js +3 -0
  59. package/dist/src/types/recipe.d.ts +36 -0
  60. package/dist/src/types/recipe.js +2 -0
  61. package/dist/src/types.d.ts +24 -0
  62. package/dist/src/types.js +2 -0
  63. package/dist/src/variety.d.ts +17 -0
  64. package/dist/src/variety.js +129 -0
  65. package/dist/src/weeklyMealPlanGenerator.d.ts +3 -0
  66. package/dist/src/weeklyMealPlanGenerator.js +468 -0
  67. package/dist/src/weeklyPlanner.d.ts +12 -0
  68. package/dist/src/weeklyPlanner.js +31 -0
  69. package/dist/types/firestore.d.ts +100 -0
  70. package/dist/types/firestore.js +2 -0
  71. package/dist/types/openfoodfacts.d.ts +113 -0
  72. package/dist/types/openfoodfacts.js +3 -0
  73. package/dist/types/recipe.d.ts +36 -0
  74. package/dist/types/recipe.js +2 -0
  75. package/dist/types.d.ts +24 -0
  76. package/dist/types.js +2 -0
  77. package/dist/variety.d.ts +17 -0
  78. package/dist/variety.js +130 -0
  79. package/dist/weeklyMealPlanGenerator.d.ts +3 -0
  80. package/dist/weeklyMealPlanGenerator.js +469 -0
  81. package/dist/weeklyPlanner.d.ts +12 -0
  82. package/dist/weeklyPlanner.js +32 -0
  83. package/package.json +66 -0
package/dist/bmr.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { UserProfile } from './types';
2
+ export declare function calculateBMR(profile: UserProfile): number;
3
+ export declare function calculateTDEE(profile: UserProfile): number;
package/dist/bmr.js ADDED
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateTDEE = exports.calculateBMR = void 0;
4
+ function calculateBMR(profile) {
5
+ const { weightKg, heightCm, age, gender } = profile;
6
+ return gender === 'male'
7
+ ? 10 * weightKg + 6.25 * heightCm - 5 * age + 5
8
+ : 10 * weightKg + 6.25 * heightCm - 5 * age - 161;
9
+ }
10
+ exports.calculateBMR = calculateBMR;
11
+ function calculateTDEE(profile) {
12
+ return calculateBMR(profile) * profile.activityLevel;
13
+ }
14
+ exports.calculateTDEE = calculateTDEE;
@@ -0,0 +1,3 @@
1
+ import { UserProfile } from './types/firestore';
2
+ import { MealPlan } from './types/firestore';
3
+ export declare function generateDailyMealPlan(profile: UserProfile, userId: string): MealPlan;
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateDailyMealPlan = void 0;
4
+ const foodConversion_1 = require("./foodConversion");
5
+ // Mock food data - in a real app, this would come from Open Food Facts search
6
+ const mockFoods = {
7
+ // Breakfast foods
8
+ oatmeal: {
9
+ id: 'oatmeal',
10
+ name: 'Oatmeal',
11
+ brand: 'Generic',
12
+ nutritionPer100g: { calories: 379, protein: 13.2, carbs: 66.3, fat: 6.9 },
13
+ servingSize: 40,
14
+ unit: 'g'
15
+ },
16
+ banana: {
17
+ id: 'banana',
18
+ name: 'Banana',
19
+ brand: 'Generic',
20
+ nutritionPer100g: { calories: 89, protein: 1.1, carbs: 22.8, fat: 0.3 },
21
+ servingSize: 118,
22
+ unit: 'g'
23
+ },
24
+ milk: {
25
+ id: 'milk',
26
+ name: 'Whole Milk',
27
+ brand: 'Generic',
28
+ nutritionPer100g: { calories: 61, protein: 3.2, carbs: 4.8, fat: 3.3 },
29
+ servingSize: 244,
30
+ unit: 'ml'
31
+ },
32
+ // Lunch/Dinner proteins
33
+ chicken: {
34
+ id: 'chicken',
35
+ name: 'Chicken Breast',
36
+ brand: 'Generic',
37
+ nutritionPer100g: { calories: 165, protein: 31, carbs: 0, fat: 3.6 },
38
+ servingSize: 100,
39
+ unit: 'g'
40
+ },
41
+ salmon: {
42
+ id: 'salmon',
43
+ name: 'Salmon',
44
+ brand: 'Generic',
45
+ nutritionPer100g: { calories: 206, protein: 22, carbs: 0, fat: 13 },
46
+ servingSize: 100,
47
+ unit: 'g'
48
+ },
49
+ // Carbs
50
+ rice: {
51
+ id: 'rice',
52
+ name: 'White Rice',
53
+ brand: 'Generic',
54
+ nutritionPer100g: { calories: 130, protein: 2.7, carbs: 28, fat: 0.3 },
55
+ servingSize: 185,
56
+ unit: 'g'
57
+ },
58
+ bread: {
59
+ id: 'bread',
60
+ name: 'Whole Wheat Bread',
61
+ brand: 'Generic',
62
+ nutritionPer100g: { calories: 247, protein: 13, carbs: 41, fat: 3.5 },
63
+ servingSize: 45,
64
+ unit: 'g'
65
+ },
66
+ // Veggies
67
+ broccoli: {
68
+ id: 'broccoli',
69
+ name: 'Broccoli',
70
+ brand: 'Generic',
71
+ nutritionPer100g: { calories: 34, protein: 2.8, carbs: 7, fat: 0.4 },
72
+ servingSize: 91,
73
+ unit: 'g'
74
+ },
75
+ spinach: {
76
+ id: 'spinach',
77
+ name: 'Spinach',
78
+ brand: 'Generic',
79
+ nutritionPer100g: { calories: 23, protein: 2.9, carbs: 3.6, fat: 0.4 },
80
+ servingSize: 30,
81
+ unit: 'g'
82
+ },
83
+ // Snacks
84
+ apple: {
85
+ id: 'apple',
86
+ name: 'Apple',
87
+ brand: 'Generic',
88
+ nutritionPer100g: { calories: 52, protein: 0.3, carbs: 13.8, fat: 0.2 },
89
+ servingSize: 182,
90
+ unit: 'g'
91
+ },
92
+ almonds: {
93
+ id: 'almonds',
94
+ name: 'Almonds',
95
+ brand: 'Generic',
96
+ nutritionPer100g: { calories: 579, protein: 21.2, carbs: 21.6, fat: 49.9 },
97
+ servingSize: 28,
98
+ unit: 'g'
99
+ }
100
+ };
101
+ function calculateDailyNeeds(profile) {
102
+ // Provide defaults for missing profile data
103
+ const age = profile.age || 30;
104
+ const height = profile.height || 170; // cm
105
+ const weight = profile.weight || 70; // kg
106
+ const gender = profile.gender || 'male';
107
+ const activityLevel = profile.activityLevel || 'moderately_active';
108
+ // Basic BMR calculation (simplified)
109
+ const bmr = gender === 'male'
110
+ ? 88.362 + (13.397 * weight) + (4.799 * height) - (5.677 * age)
111
+ : 447.593 + (9.247 * weight) + (3.098 * height) - (4.330 * age);
112
+ // Activity multiplier
113
+ const activityMultipliers = {
114
+ sedentary: 1.2,
115
+ lightly_active: 1.375,
116
+ moderately_active: 1.55,
117
+ very_active: 1.725,
118
+ extremely_active: 1.9
119
+ };
120
+ const tdee = bmr * (activityMultipliers[activityLevel] || 1.2);
121
+ // Adjust based on goals
122
+ let dailyCalories = tdee;
123
+ if (profile.healthGoals?.includes('weight_loss')) {
124
+ dailyCalories -= 500;
125
+ }
126
+ else if (profile.healthGoals?.includes('weight_gain')) {
127
+ dailyCalories += 500;
128
+ }
129
+ return {
130
+ calories: Math.round(Math.max(dailyCalories, 1200)),
131
+ protein: Math.round(Math.max(dailyCalories * 0.3 / 4, 50)),
132
+ carbs: Math.round(Math.max(dailyCalories * 0.4 / 4, 100)),
133
+ fat: Math.round(Math.max(dailyCalories * 0.3 / 9, 30)) // Minimum 30g fat
134
+ };
135
+ }
136
+ function createMeal(name, type, foods) {
137
+ const ingredients = foods.map(({ food, amount, unit }) => (0, foodConversion_1.convertFoodItemToIngredient)(food, amount, unit));
138
+ const meal = (0, foodConversion_1.createMealFromFoodItems)(name, type, foods.map(({ food, amount, unit }, index) => ({
139
+ food: food,
140
+ amount,
141
+ unit
142
+ })));
143
+ return {
144
+ ...meal,
145
+ instructions: [`Prepare ${name} according to recipe`],
146
+ };
147
+ }
148
+ function generateDailyMealPlan(profile, userId) {
149
+ const needs = calculateDailyNeeds(profile);
150
+ // Check dietary restrictions
151
+ const isVegetarian = profile.dietaryRestrictions?.includes('vegetarian');
152
+ const isVegan = profile.dietaryRestrictions?.includes('vegan');
153
+ // Breakfast: Oatmeal with fruit
154
+ const breakfast = createMeal('Healthy Oatmeal Breakfast', 'breakfast', [
155
+ { food: mockFoods.oatmeal, amount: 50, unit: 'g' },
156
+ { food: mockFoods.banana, amount: 100, unit: 'g' },
157
+ { food: mockFoods.milk, amount: 200, unit: 'ml' }
158
+ ]);
159
+ // Lunch: Chicken salad (or vegetarian alternative)
160
+ const lunchProtein = isVegan ? mockFoods.broccoli : (isVegetarian ? mockFoods.broccoli : mockFoods.chicken);
161
+ const lunch = createMeal('Nutritious Lunch Salad', 'lunch', [
162
+ { food: lunchProtein, amount: lunchProtein === mockFoods.chicken ? 150 : 200, unit: 'g' },
163
+ { food: mockFoods.spinach, amount: 100, unit: 'g' },
164
+ { food: mockFoods.broccoli, amount: 150, unit: 'g' },
165
+ { food: mockFoods.bread, amount: 90, unit: 'g' }
166
+ ]);
167
+ // Dinner: Salmon with rice and veggies (or vegetarian alternative)
168
+ const dinnerProtein = isVegan ? mockFoods.broccoli : (isVegetarian ? mockFoods.broccoli : mockFoods.salmon);
169
+ const dinner = createMeal('Balanced Dinner', 'dinner', [
170
+ { food: dinnerProtein, amount: dinnerProtein === mockFoods.salmon ? 150 : 200, unit: 'g' },
171
+ { food: mockFoods.rice, amount: 150, unit: 'g' },
172
+ { food: mockFoods.broccoli, amount: 100, unit: 'g' }
173
+ ]);
174
+ // Snack: Apple and almonds
175
+ const snack = createMeal('Healthy Snack', 'snack', [
176
+ { food: mockFoods.apple, amount: 150, unit: 'g' },
177
+ { food: mockFoods.almonds, amount: 20, unit: 'g' }
178
+ ]);
179
+ const meals = [breakfast, lunch, dinner, snack];
180
+ const totalNutrition = meals.reduce((total, meal) => ({
181
+ calories: total.calories + (meal.nutrition?.calories || 0),
182
+ protein: Math.round((total.protein + (meal.nutrition?.protein || 0)) * 10) / 10,
183
+ carbs: total.carbs + (meal.nutrition?.carbs || 0),
184
+ fat: total.fat + (meal.nutrition?.fat || 0)
185
+ }), { calories: 0, protein: 0, carbs: 0, fat: 0 });
186
+ const today = new Date();
187
+ return {
188
+ id: `daily-plan-${Date.now()}`,
189
+ userId: userId,
190
+ name: `Daily Meal Plan - ${today.toLocaleDateString()}`,
191
+ description: `Personalized daily meal plan based on your profile (${Math.round(totalNutrition.calories)} cal)`,
192
+ startDate: today.toISOString().split('T')[0],
193
+ endDate: today.toISOString().split('T')[0],
194
+ dailyPlans: [],
195
+ meals,
196
+ totalCalories: totalNutrition.calories,
197
+ totalProtein: totalNutrition.protein,
198
+ totalCarbs: totalNutrition.carbs,
199
+ totalFat: totalNutrition.fat,
200
+ uid: userId,
201
+ goals: {
202
+ dailyCalories: Math.round(totalNutrition.calories),
203
+ proteinPercentage: 25,
204
+ carbsPercentage: 45,
205
+ fatPercentage: 30,
206
+ },
207
+ createdAt: new Date(),
208
+ updatedAt: new Date()
209
+ };
210
+ }
211
+ exports.generateDailyMealPlan = generateDailyMealPlan;
@@ -0,0 +1,417 @@
1
+ [
2
+ {
3
+ "id": "breakfast-1",
4
+ "name": "Ovsena kaša sa bananom i medom",
5
+ "category": "breakfast",
6
+ "prepTime": 5,
7
+ "cookTime": 10,
8
+ "servings": 1,
9
+ "difficulty": "easy",
10
+ "ingredients": [
11
+ { "name": "Ovseni pahuljice", "quantity": 50, "unit": "g" },
12
+ { "name": "Banana", "quantity": 1, "unit": "srednja" },
13
+ { "name": "Med", "quantity": 1, "unit": "žličica" },
14
+ { "name": "Mlijeko ili voda", "quantity": 250, "unit": "ml" },
15
+ { "name": "Cimet", "quantity": 0.5, "unit": "žličica" }
16
+ ],
17
+ "instructions": [
18
+ "Zagrijte mlijeko ili vodu u maloj posudi",
19
+ "Dodajte ovsene pahuljice i smanjite vatru na srednju",
20
+ "Kuhajte 5-7 minuta, povremeno miješajući",
21
+ "Narežite bananu",
22
+ "Prebacite ovsenu kašu u zdjelu",
23
+ "Poslužite sa kriškama banane, preliveno medom i posuto cimetom"
24
+ ],
25
+ "nutrition": {
26
+ "calories": 380,
27
+ "protein": 12,
28
+ "carbs": 68,
29
+ "fat": 7,
30
+ "fiber": 8,
31
+ "sugar": 25,
32
+ "sodium": 45
33
+ },
34
+ "tags": ["vegetarijanski", "zdrav za srce", "visoko vlakno", "holesterol", "trigliceridi"]
35
+ },
36
+ {
37
+ "id": "breakfast-2",
38
+ "name": "Grčki jogurt parfé sa bobicama",
39
+ "category": "breakfast",
40
+ "prepTime": 5,
41
+ "cookTime": 0,
42
+ "servings": 1,
43
+ "difficulty": "easy",
44
+ "ingredients": [
45
+ { "name": "Grčki jogurt", "quantity": 200, "unit": "g" },
46
+ { "name": "Mješane bobice (jagode, borovnice, maline)", "quantity": 100, "unit": "g" },
47
+ { "name": "Granola", "quantity": 30, "unit": "g" },
48
+ { "name": "Med", "quantity": 1, "unit": "žličica" },
49
+ { "name": "Sjemenke chia", "quantity": 1, "unit": "žličica" }
50
+ ],
51
+ "instructions": [
52
+ "Stavite polovinu grčkog jogurta u čašu ili zdjelu",
53
+ "Dodajte polovinu bobica povrh toga",
54
+ "Pospite polovinu granole",
55
+ "Ponovi slojeve sa preostalim jogurtom, bobicama i granolom",
56
+ "Prelijte medom i pospite sjemenkama chia"
57
+ ],
58
+ "nutrition": {
59
+ "calories": 320,
60
+ "protein": 22,
61
+ "carbs": 42,
62
+ "fat": 8,
63
+ "fiber": 7,
64
+ "sugar": 24,
65
+ "sodium": 85
66
+ },
67
+ "tags": ["vegetarijanski", "visoko protein", "probiotik", "holesterol", "trigliceridi"]
68
+ },
69
+ {
70
+ "id": "breakfast-3",
71
+ "name": "Pržena jaja sa špinatom i paradajzom",
72
+ "category": "breakfast",
73
+ "prepTime": 5,
74
+ "cookTime": 8,
75
+ "servings": 1,
76
+ "difficulty": "easy",
77
+ "ingredients": [
78
+ { "name": "Jaja", "quantity": 2, "unit": "velika" },
79
+ { "name": "Svježi špinat", "quantity": 50, "unit": "g" },
80
+ { "name": "Cherry paradajz", "quantity": 6, "unit": "komada" },
81
+ { "name": "Maslinovo ulje", "quantity": 1, "unit": "žličica" },
82
+ { "name": "So i biber", "quantity": 1, "unit": "prstohvat" },
83
+ { "name": "Pšenični tost", "quantity": 1, "unit": "kriška" }
84
+ ],
85
+ "instructions": [
86
+ "Zagrijte maslinovo ulje u tavi bez prijanjanja na srednjoj vatri",
87
+ "Dodajte špinat i kuhajte dok se ne uvene (2 minute)",
88
+ "Dodajte prepolovljeni cherry paradajz i kuhajte još 1 minutu",
89
+ "Umutite jaja u zdjeli sa so i biberom",
90
+ "Ulijte jaja u tavu i lagano promiješajte",
91
+ "Kuhajte dok jaja nisu gotova (3-4 minute)",
92
+ "Poslužite sa pšeničnim tostrom"
93
+ ],
94
+ "nutrition": {
95
+ "calories": 310,
96
+ "protein": 20,
97
+ "carbs": 22,
98
+ "fat": 16,
99
+ "fiber": 4,
100
+ "sugar": 4,
101
+ "sodium": 320
102
+ },
103
+ "tags": ["visoko protein", "nisko ugljeni hidrati", "dijabetes", "masna jetra"]
104
+ },
105
+ {
106
+ "id": "breakfast-4",
107
+ "name": "Tost sa avokadom i poširanim jajetom",
108
+ "category": "breakfast",
109
+ "prepTime": 5,
110
+ "cookTime": 10,
111
+ "servings": 1,
112
+ "difficulty": "medium",
113
+ "ingredients": [
114
+ { "name": "Pšenični hljeb", "quantity": 2, "unit": "kriške" },
115
+ { "name": "Avokado", "quantity": 0.5, "unit": "srednji" },
116
+ { "name": "Jaje", "quantity": 1, "unit": "veliko" },
117
+ { "name": "Limunov sok", "quantity": 1, "unit": "žličica" },
118
+ { "name": "Crvena paprika", "quantity": 1, "unit": "prstohvat" },
119
+ { "name": "So i biber", "quantity": 1, "unit": "prstohvat" }
120
+ ],
121
+ "instructions": [
122
+ "Popržite kriške hljeba u tosteru",
123
+ "Zagrijte lonac vode do blagog ključanja",
124
+ "Razbijte jaje u malu zdjelu",
125
+ "Napravite blagi vrtlog u vodi i ubacite jaje",
126
+ "Poširajte 3-4 minute",
127
+ "Izmrvite avokado sa limunovim sokom, so i biberom",
128
+ "Namažite avokado na tost",
129
+ "Položite poširano jaje povrh i pospite crvenom paprikom"
130
+ ],
131
+ "nutrition": {
132
+ "calories": 420,
133
+ "protein": 18,
134
+ "carbs": 38,
135
+ "fat": 24,
136
+ "fiber": 12,
137
+ "sugar": 3,
138
+ "sodium": 380
139
+ },
140
+ "tags": ["vegetarijanski", "zdrav za srce", "visoko vlakno", "holesterol"]
141
+ },
142
+ {
143
+ "id": "breakfast-5",
144
+ "name": "Proteinski smoothie bowl",
145
+ "category": "breakfast",
146
+ "prepTime": 10,
147
+ "cookTime": 0,
148
+ "servings": 1,
149
+ "difficulty": "easy",
150
+ "ingredients": [
151
+ { "name": "Zamrznuta banana", "quantity": 1, "unit": "srednja" },
152
+ { "name": "Proteinski prah", "quantity": 30, "unit": "g" },
153
+ { "name": "Bademovo mlijeko", "quantity": 150, "unit": "ml" },
154
+ { "name": "Špinat", "quantity": 30, "unit": "g" },
155
+ { "name": "Borovnice", "quantity": 50, "unit": "g" },
156
+ { "name": "Sječeni bademi", "quantity": 15, "unit": "g" },
157
+ { "name": "Sjemenke chia", "quantity": 1, "unit": "žličica" }
158
+ ],
159
+ "instructions": [
160
+ "Blendajte zamrznutu bananu, proteinski prah, bademovo mlijeko i špinat dok ne postane glatko",
161
+ "Ulijte u zdjelu",
162
+ "Poslužite sa borovnicama, sječenim bademima i sjemenkama chia",
163
+ "Poslužite odmah"
164
+ ],
165
+ "nutrition": {
166
+ "calories": 380,
167
+ "protein": 32,
168
+ "carbs": 42,
169
+ "fat": 12,
170
+ "fiber": 10,
171
+ "sugar": 20,
172
+ "sodium": 180
173
+ },
174
+ "tags": ["visoko protein", "vegetarijanski", "nakon treninga", "dijabetes"]
175
+ },
176
+ {
177
+ "id": "lunch-1",
178
+ "name": "Salata od grilovanog pilećeg mesa sa kinoom",
179
+ "category": "lunch",
180
+ "prepTime": 15,
181
+ "cookTime": 20,
182
+ "servings": 1,
183
+ "difficulty": "medium",
184
+ "ingredients": [
185
+ { "name": "Pileća prsa", "quantity": 150, "unit": "g" },
186
+ { "name": "Kinoa", "quantity": 60, "unit": "g" },
187
+ { "name": "Mješana zelena salata", "quantity": 100, "unit": "g" },
188
+ { "name": "Cherry paradajz", "quantity": 80, "unit": "g" },
189
+ { "name": "Kravica", "quantity": 50, "unit": "g" },
190
+ { "name": "Crveni luk", "quantity": 20, "unit": "g" },
191
+ { "name": "Maslinovo ulje", "quantity": 1, "unit": "žličica" },
192
+ { "name": "Limunov sok", "quantity": 2, "unit": "žličice" },
193
+ { "name": "Bijeli luk", "quantity": 1, "unit": "čehnjak" }
194
+ ],
195
+ "instructions": [
196
+ "Skuhajte kinoju prema uputstvima na pakovanju",
197
+ "Začinite pileća prsa so, biberom i sjeckanim bijelim lukom",
198
+ "Grilujte pileća prsa po 6-7 minuta sa svake strane dok nisu gotova",
199
+ "Ostavite pileća prsa da odmaraju 5 minuta, zatim narežite",
200
+ "Iseckajte povrće i pomiješajte sa zelenom salatom",
201
+ "Dodajte skuhanu kinoju u salatu",
202
+ "Položite narezana pileća prsa povrh salate",
203
+ "Umiješajte maslinovo ulje i limunov sok za preliv",
204
+ "Prelijte preljevom preko salate"
205
+ ],
206
+ "nutrition": {
207
+ "calories": 480,
208
+ "protein": 42,
209
+ "carbs": 38,
210
+ "fat": 18,
211
+ "fiber": 8,
212
+ "sugar": 6,
213
+ "sodium": 280
214
+ },
215
+ "tags": ["visoko protein", "bez glutena", "zdrav za srce", "holesterol", "masna jetra"]
216
+ },
217
+ {
218
+ "id": "lunch-2",
219
+ "name": "Bowl sa lososom, smeđom rižom i povrćem",
220
+ "category": "lunch",
221
+ "prepTime": 10,
222
+ "cookTime": 25,
223
+ "servings": 1,
224
+ "difficulty": "medium",
225
+ "ingredients": [
226
+ { "name": "File lososa", "quantity": 150, "unit": "g" },
227
+ { "name": "Smeđa riža", "quantity": 75, "unit": "g" },
228
+ { "name": "Brokoli", "quantity": 100, "unit": "g" },
229
+ { "name": "Šargarepa", "quantity": 80, "unit": "g" },
230
+ { "name": "Edamame", "quantity": 50, "unit": "g" },
231
+ { "name": "Sezamovo ulje", "quantity": 1, "unit": "žličica" },
232
+ { "name": "Soja sos", "quantity": 1, "unit": "žličica" },
233
+ { "name": "Đumbir", "quantity": 1, "unit": "žličica" },
234
+ { "name": "Sezamovo sjeme", "quantity": 1, "unit": "žličica" }
235
+ ],
236
+ "instructions": [
237
+ "Skuhajte smeđu rižu prema uputstvima na pakovanju",
238
+ "Na pari skuhamo brokoli i narezanu šargarepu 5-7 minuta",
239
+ "Začinite lososa đumbirom, so i biberom",
240
+ "Pržite lososa u sezamovom ulju po 4-5 minuta sa svake strane",
241
+ "Rasporedite rižu u zdjelu",
242
+ "Dodajte povrće na pari i edamame",
243
+ "Položite lososa povrh",
244
+ "Prelijte soja sosom i pospite sezamovim sjemenkama"
245
+ ],
246
+ "nutrition": {
247
+ "calories": 520,
248
+ "protein": 38,
249
+ "carbs": 52,
250
+ "fat": 18,
251
+ "fiber": 8,
252
+ "sugar": 6,
253
+ "sodium": 680
254
+ },
255
+ "tags": ["visoko protein", "omega-3", "zdrav za srce", "holesterol", "masna jetra"]
256
+ },
257
+ {
258
+ "id": "lunch-3",
259
+ "name": "Mediterranska salata sa leblebijama",
260
+ "category": "lunch",
261
+ "prepTime": 15,
262
+ "cookTime": 0,
263
+ "servings": 1,
264
+ "difficulty": "easy",
265
+ "ingredients": [
266
+ { "name": "Leblebije (skuhane)", "quantity": 200, "unit": "g" },
267
+ { "name": "Kravica", "quantity": 100, "unit": "g" },
268
+ { "name": "Cherry paradajz", "quantity": 100, "unit": "g" },
269
+ { "name": "Crvena paprička", "quantity": 80, "unit": "g" },
270
+ { "name": "Crveni luk", "quantity": 30, "unit": "g" },
271
+ { "name": "Feta sir", "quantity": 40, "unit": "g" },
272
+ { "name": "Kalamata masline", "quantity": 30, "unit": "g" },
273
+ { "name": "Maslinovo ulje", "quantity": 2, "unit": "žličice" },
274
+ { "name": "Limunov sok", "quantity": 2, "unit": "žličice" },
275
+ { "name": "Svježi peršun", "quantity": 10, "unit": "g" }
276
+ ],
277
+ "instructions": [
278
+ "Iseckajte krvicu, paradajz, papriku i crveni luk",
279
+ "Pomiješajte leblebije i isjeckano povrće u zdjeli",
280
+ "Dodajte izmrvljeni feta sir i narezane masline",
281
+ "Umiješajte maslinovo ulje, limunov sok, so i biber",
282
+ "Prelijte preljevom preko salate i promiješajte",
283
+ "Ukrašite svježim peršunom",
284
+ "Ostavite da odstoji 5 minuta prije serviranja"
285
+ ],
286
+ "nutrition": {
287
+ "calories": 450,
288
+ "protein": 18,
289
+ "carbs": 48,
290
+ "fat": 22,
291
+ "fiber": 14,
292
+ "sugar": 10,
293
+ "sodium": 620
294
+ },
295
+ "tags": ["vegetarijanski", "visoko vlakno", "mediteranski", "holesterol", "trigliceridi"]
296
+ },
297
+ {
298
+ "id": "lunch-4",
299
+ "name": "Pure od puretine i avokada",
300
+ "category": "lunch",
301
+ "prepTime": 10,
302
+ "cookTime": 0,
303
+ "servings": 1,
304
+ "difficulty": "easy",
305
+ "ingredients": [
306
+ { "name": "Pšenična tortilja", "quantity": 1, "unit": "velika" },
307
+ { "name": "Pureća prsa (narezana)", "quantity": 100, "unit": "g" },
308
+ { "name": "Avokado", "quantity": 0.5, "unit": "srednji" },
309
+ { "name": "Zelena salata", "quantity": 50, "unit": "g" },
310
+ { "name": "Paradajz", "quantity": 1, "unit": "srednji" },
311
+ { "name": "Crveni luk", "quantity": 20, "unit": "g" },
312
+ { "name": "Senf", "quantity": 1, "unit": "žličica" },
313
+ { "name": "Hummus", "quantity": 2, "unit": "žličice" }
314
+ ],
315
+ "instructions": [
316
+ "Rasporedite tortilju ravno na čistu površinu",
317
+ "Namažite hummus i senf na tortilju",
318
+ "Složite narezana pureća prsa u sredinu",
319
+ "Dodajte narezani avokado, zelenu salatu, paradajz i crveni luk",
320
+ "Preklopite strane i zarolajte čvrsto",
321
+ "Narežite dijagonalno na pola",
322
+ "Poslužite odmah ili zamotajte u foliju"
323
+ ],
324
+ "nutrition": {
325
+ "calories": 420,
326
+ "protein": 32,
327
+ "carbs": 38,
328
+ "fat": 18,
329
+ "fiber": 10,
330
+ "sugar": 5,
331
+ "sodium": 780
332
+ },
333
+ "tags": ["visoko protein", "portabilno", "nisko ugljeni hidrati", "masna jetra", "dijabetes"]
334
+ },
335
+ {
336
+ "id": "lunch-5",
337
+ "name": "Supa od leće i povrća",
338
+ "category": "lunch",
339
+ "prepTime": 10,
340
+ "cookTime": 35,
341
+ "servings": 2,
342
+ "difficulty": "easy",
343
+ "ingredients": [
344
+ { "name": "Crvena leća", "quantity": 150, "unit": "g" },
345
+ { "name": "Šargarepa", "quantity": 100, "unit": "g" },
346
+ { "name": "Celer", "quantity": 80, "unit": "g" },
347
+ { "name": "Luk", "quantity": 1, "unit": "srednji" },
348
+ { "name": "Bijeli luk", "quantity": 3, "unit": "čehnjaka" },
349
+ { "name": "Povrtna supa", "quantity": 800, "unit": "ml" },
350
+ { "name": "Narezani paradajz", "quantity": 200, "unit": "g" },
351
+ { "name": "Kumin", "quantity": 1, "unit": "žličica" },
352
+ { "name": "Maslinovo ulje", "quantity": 1, "unit": "žličica" },
353
+ { "name": "Svježi peršun", "quantity": 10, "unit": "g" }
354
+ ],
355
+ "instructions": [
356
+ "Zagrijte maslinovo ulje u velikoj posudi na srednjoj vatri",
357
+ "Pržite narezani luk, šargarepu i celer 5 minuta",
358
+ "Dodajte sjeckani bijeli luk i kumin, kuhajte još 1 minutu",
359
+ "Dodajte leću, narezane paradajze i povrtnu supu",
360
+ "Zavrijte, zatim smanjite vatru i pustite da se krčka",
361
+ "Kuhajte 25-30 minuta dok leća ne omekša",
362
+ "Začinite so i biberom",
363
+ "Ukrašite svježim peršunom prije serviranja"
364
+ ],
365
+ "nutrition": {
366
+ "calories": 380,
367
+ "protein": 22,
368
+ "carbs": 58,
369
+ "fiber": 16,
370
+ "sugar": 10,
371
+ "sodium": 620
372
+ },
373
+ "tags": ["veganski", "visoko vlakno", "visoko protein", "holesterol", "trigliceridi"]
374
+ },
375
+ {
376
+ "id": "dinner-1",
377
+ "name": "Pečeni losos sa pečenim povrćem",
378
+ "category": "dinner",
379
+ "prepTime": 15,
380
+ "cookTime": 25,
381
+ "servings": 1,
382
+ "difficulty": "medium",
383
+ "ingredients": [
384
+ { "name": "File lososa", "quantity": 180, "unit": "g" },
385
+ { "name": "Slatki krompir", "quantity": 200, "unit": "g" },
386
+ { "name": "Brokoli", "quantity": 150, "unit": "g" },
387
+ { "name": "Paprika", "quantity": 100, "unit": "g" },
388
+ { "name": "Maslinovo ulje", "quantity": 2, "unit": "žličice" },
389
+ { "name": "Limun", "quantity": 0.5, "unit": "srednji" },
390
+ { "name": "Bijeli luk", "quantity": 2, "unit": "čehnjaka" },
391
+ { "name": "Svježi kopar", "quantity": 5, "unit": "g" },
392
+ { "name": "Paprika", "quantity": 0.5, "unit": "žličica" }
393
+ ],
394
+ "instructions": [
395
+ "Zagrijte pećnicu na 200°C (400°F)",
396
+ "Iseckajte slatki krompir i povrće na komade",
397
+ "Začinite povrće 1 žličicom maslinovog ulja, so i biberom",
398
+ "Rasporedite povrće na pleh za pečenje",
399
+ "Položite file lososa povrh povrća",
400
+ "Premažite lososa preostalim maslinovim uljem",
401
+ "Začinite paprikom, sjeckanim bijelim lukom, so i biberom",
402
+ "Položite kriške limuna i svježi kopar povrh",
403
+ "Pecite 20-25 minuta dok losos ne bude gotov",
404
+ "Poslužite sa kriškama limuna"
405
+ ],
406
+ "nutrition": {
407
+ "calories": 580,
408
+ "protein": 42,
409
+ "carbs": 48,
410
+ "fat": 24,
411
+ "fiber": 10,
412
+ "sugar": 12,
413
+ "sodium": 320
414
+ },
415
+ "tags": ["visoko protein", "omega-3", "bez glutena", "holesterol", "masna jetra"]
416
+ }
417
+ ]