feat: unified food calendar — extend home screen to future dates + planned meals

Phase 1: date strip now covers today + 7 future days; right chevron enabled;
future pills rendered in lighter style.

Phase 2: home screen shows DateContext (past/today/future):
- future dates: hide calorie ring + macros, show PlanningBanner
- plannedMealsProvider derives from cached menuProvider (no extra API call)
- _MealCard shows ghost PlannedSlotTile for unconfirmed menu slots
- "Mark as eaten" creates a diary entry (source: menu_plan) via existing API

New l10n keys (12 locales): planningForDate, markAsEaten, plannedMealLabel

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
dbastrikin
2026-03-21 22:56:17 +02:00
parent bf8dce36c5
commit 9306d59d36
28 changed files with 500 additions and 41 deletions

View File

@@ -123,5 +123,13 @@
},
"servingsLabel": "حصص",
"addToDiary": "إضافة إلى اليومية",
"scanDishPhoto": "مسح الصورة"
"scanDishPhoto": "مسح الصورة",
"planningForDate": "",
"@planningForDate": {
"placeholders": {
"date": { "type": "String" }
}
},
"markAsEaten": "",
"plannedMealLabel": ""
}

View File

@@ -123,5 +123,13 @@
},
"servingsLabel": "Portionen",
"addToDiary": "Zum Tagebuch hinzufügen",
"scanDishPhoto": "Foto scannen"
"scanDishPhoto": "Foto scannen",
"planningForDate": "",
"@planningForDate": {
"placeholders": {
"date": { "type": "String" }
}
},
"markAsEaten": "",
"plannedMealLabel": ""
}

View File

@@ -121,5 +121,13 @@
},
"servingsLabel": "Servings",
"addToDiary": "Add to diary",
"scanDishPhoto": "Scan photo"
"scanDishPhoto": "Scan photo",
"planningForDate": "Planning for {date}",
"@planningForDate": {
"placeholders": {
"date": { "type": "String" }
}
},
"markAsEaten": "Mark as eaten",
"plannedMealLabel": "Planned"
}

View File

@@ -123,5 +123,13 @@
},
"servingsLabel": "Porciones",
"addToDiary": "Añadir al diario",
"scanDishPhoto": "Escanear foto"
"scanDishPhoto": "Escanear foto",
"planningForDate": "",
"@planningForDate": {
"placeholders": {
"date": { "type": "String" }
}
},
"markAsEaten": "",
"plannedMealLabel": ""
}

View File

@@ -123,5 +123,13 @@
},
"servingsLabel": "Portions",
"addToDiary": "Ajouter au journal",
"scanDishPhoto": "Scanner une photo"
"scanDishPhoto": "Scanner une photo",
"planningForDate": "",
"@planningForDate": {
"placeholders": {
"date": { "type": "String" }
}
},
"markAsEaten": "",
"plannedMealLabel": ""
}

View File

@@ -123,5 +123,13 @@
},
"servingsLabel": "सर्विंग",
"addToDiary": "डायरी में जोड़ें",
"scanDishPhoto": "फ़ोटो स्कैन करें"
"scanDishPhoto": "फ़ोटो स्कैन करें",
"planningForDate": "",
"@planningForDate": {
"placeholders": {
"date": { "type": "String" }
}
},
"markAsEaten": "",
"plannedMealLabel": ""
}

View File

@@ -123,5 +123,13 @@
},
"servingsLabel": "Porzioni",
"addToDiary": "Aggiungi al diario",
"scanDishPhoto": "Scansiona foto"
"scanDishPhoto": "Scansiona foto",
"planningForDate": "",
"@planningForDate": {
"placeholders": {
"date": { "type": "String" }
}
},
"markAsEaten": "",
"plannedMealLabel": ""
}

View File

@@ -123,5 +123,13 @@
},
"servingsLabel": "人前",
"addToDiary": "日記に追加",
"scanDishPhoto": "写真をスキャン"
"scanDishPhoto": "写真をスキャン",
"planningForDate": "",
"@planningForDate": {
"placeholders": {
"date": { "type": "String" }
}
},
"markAsEaten": "",
"plannedMealLabel": ""
}

View File

@@ -123,5 +123,13 @@
},
"servingsLabel": "인분",
"addToDiary": "일기에 추가",
"scanDishPhoto": "사진 스캔"
"scanDishPhoto": "사진 스캔",
"planningForDate": "",
"@planningForDate": {
"placeholders": {
"date": { "type": "String" }
}
},
"markAsEaten": "",
"plannedMealLabel": ""
}

View File

@@ -789,6 +789,24 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Scan photo'**
String get scanDishPhoto;
/// No description provided for @planningForDate.
///
/// In en, this message translates to:
/// **'Planning for {date}'**
String planningForDate(String date);
/// No description provided for @markAsEaten.
///
/// In en, this message translates to:
/// **'Mark as eaten'**
String get markAsEaten;
/// No description provided for @plannedMealLabel.
///
/// In en, this message translates to:
/// **'Planned'**
String get plannedMealLabel;
}
class _AppLocalizationsDelegate

View File

@@ -348,4 +348,15 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get scanDishPhoto => 'مسح الصورة';
@override
String planningForDate(String date) {
return '';
}
@override
String get markAsEaten => '';
@override
String get plannedMealLabel => '';
}

View File

@@ -350,4 +350,15 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get scanDishPhoto => 'Foto scannen';
@override
String planningForDate(String date) {
return '';
}
@override
String get markAsEaten => '';
@override
String get plannedMealLabel => '';
}

View File

@@ -348,4 +348,15 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get scanDishPhoto => 'Scan photo';
@override
String planningForDate(String date) {
return 'Planning for $date';
}
@override
String get markAsEaten => 'Mark as eaten';
@override
String get plannedMealLabel => 'Planned';
}

View File

@@ -350,4 +350,15 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get scanDishPhoto => 'Escanear foto';
@override
String planningForDate(String date) {
return '';
}
@override
String get markAsEaten => '';
@override
String get plannedMealLabel => '';
}

View File

@@ -351,4 +351,15 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get scanDishPhoto => 'Scanner une photo';
@override
String planningForDate(String date) {
return '';
}
@override
String get markAsEaten => '';
@override
String get plannedMealLabel => '';
}

View File

@@ -349,4 +349,15 @@ class AppLocalizationsHi extends AppLocalizations {
@override
String get scanDishPhoto => 'फ़ोटो स्कैन करें';
@override
String planningForDate(String date) {
return '';
}
@override
String get markAsEaten => '';
@override
String get plannedMealLabel => '';
}

View File

@@ -350,4 +350,15 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get scanDishPhoto => 'Scansiona foto';
@override
String planningForDate(String date) {
return '';
}
@override
String get markAsEaten => '';
@override
String get plannedMealLabel => '';
}

View File

@@ -347,4 +347,15 @@ class AppLocalizationsJa extends AppLocalizations {
@override
String get scanDishPhoto => '写真をスキャン';
@override
String planningForDate(String date) {
return '';
}
@override
String get markAsEaten => '';
@override
String get plannedMealLabel => '';
}

View File

@@ -347,4 +347,15 @@ class AppLocalizationsKo extends AppLocalizations {
@override
String get scanDishPhoto => '사진 스캔';
@override
String planningForDate(String date) {
return '';
}
@override
String get markAsEaten => '';
@override
String get plannedMealLabel => '';
}

View File

@@ -350,4 +350,15 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get scanDishPhoto => 'Escanear foto';
@override
String planningForDate(String date) {
return '';
}
@override
String get markAsEaten => '';
@override
String get plannedMealLabel => '';
}

View File

@@ -348,4 +348,15 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get scanDishPhoto => 'Сканировать фото';
@override
String planningForDate(String date) {
return 'Планирование на $date';
}
@override
String get markAsEaten => 'Отметить как съеденное';
@override
String get plannedMealLabel => 'Запланировано';
}

View File

@@ -347,4 +347,15 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get scanDishPhoto => '扫描照片';
@override
String planningForDate(String date) {
return '';
}
@override
String get markAsEaten => '';
@override
String get plannedMealLabel => '';
}

View File

@@ -123,5 +123,13 @@
},
"servingsLabel": "Porções",
"addToDiary": "Adicionar ao diário",
"scanDishPhoto": "Escanear foto"
"scanDishPhoto": "Escanear foto",
"planningForDate": "",
"@planningForDate": {
"placeholders": {
"date": { "type": "String" }
}
},
"markAsEaten": "",
"plannedMealLabel": ""
}

View File

@@ -121,5 +121,13 @@
},
"servingsLabel": "Порций",
"addToDiary": "Добавить в дневник",
"scanDishPhoto": "Сканировать фото"
"scanDishPhoto": "Сканировать фото",
"planningForDate": "Планирование на {date}",
"@planningForDate": {
"placeholders": {
"date": { "type": "String" }
}
},
"markAsEaten": "Отметить как съеденное",
"plannedMealLabel": "Запланировано"
}

View File

@@ -123,5 +123,13 @@
},
"servingsLabel": "份数",
"addToDiary": "添加到日记",
"scanDishPhoto": "扫描照片"
"scanDishPhoto": "扫描照片",
"planningForDate": "",
"@planningForDate": {
"placeholders": {
"date": { "type": "String" }
}
},
"markAsEaten": "",
"plannedMealLabel": ""
}