'checkbox', 'items' => []]]; if (!is_array($listsPrefill) || count($listsPrefill) === 0) { $listsPrefill = [['type' => 'checkbox', 'items' => []]]; } $firstList = $listsPrefill[0]; $listType = in_array($firstList['type'] ?? '', ['ordered', 'unordered', 'checkbox'], true) ? $firstList['type'] : 'checkbox'; $listItems = $firstList['items'] ?? []; if (!is_array($listItems)) { $listItems = []; } $mealEditorNotFound = $editMealId !== '' && $editMealId !== 'new' && $prefillMeal === null && $canManageMeals; $mealEditorAllowed = ($editMealId === 'new' && $canManageMeals) || ($prefillMeal !== null && $canEditMeal($prefillMeal)); $showMealEditorPage = $editMealId !== '' && ($mealEditorAllowed || $mealEditorNotFound); $mealEditorForbidden = $editMealId !== '' && !$showMealEditorPage; ?>

← Back to meal plan

0): ?>

Edit meal

Shopping list

Items to buy for this recipe. Choose a store and add each line to the grocery tab as pending review.

None listed for this meal.

Pantry / staples

Ingredients you may already have. Add one line to the grocery list if you need to restock.

None listed.

Recipe checklist

Quick reminders while you cook (not interactive).

Directions

← Back to meal plan

Meal not found.
>

Per row: name, optional store, quantity, size, notes — store blank uses your first grocery store.

'', 'storeId' => '', 'quantity' => '1', 'size' => '', 'description' => '', 'price' => '', 'image' => '']]; } foreach ($shopItems as $si): ?>
Cancel

← Back to meal plan

Meal plan

Week starts on (day 0). Assign meals to each slot; shopping items go to the grocery list as pending review.

Choose who is using the hub to use the meal planner.
Breakfast Lunch Dinner

Meal library

New meal

Only a verified Head of household can add or import meals.

No meals in the library yet.