#61: expiry badge now shows relative + calendar date ("5d · Apr 15") with tooltip "Expires in 5 days (Apr 15)"; traffic-light colors already in place #64: RecipeDetailPanel.handleCook() calls recipesStore.logCook(); SavedRecipesPanel shows "Last made: X ago" below each card using cookLog entries #66: Serving multiplier (1x/2x/3x/4x) in RecipeDetailPanel scales ingredient quantities using regex; handles integers, decimals, fractions (1/2, 3/4), mixed numbers (1 1/2), and ranges (2-3); leaves unrecognised strings unchanged #59: migration 030 adds opened_date column; ExpirationPredictor gains SHELF_LIFE_AFTER_OPENING table + days_after_opening(); POST /inventory/items/{id}/open sets opened_date=today and returns computed opened_expiry_date; InventoryList shows lock-open button for unopened items and an "📂 5d · Apr 15" badge once opened |
||
|---|---|---|
| .. | ||
| __init__.py | ||
| household.py | ||
| inventory.py | ||
| meal_plan.py | ||
| ocr.py | ||
| quality.py | ||
| receipt.py | ||
| recipe.py | ||
| saved_recipe.py | ||