Backlog: structured multi-step recipe instructions

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Josh Rogers
2026-05-14 20:03:59 -05:00
parent 0d20e446e0
commit bd540e506f
+17
View File
@@ -177,6 +177,23 @@ This is the "per-store ingredient memory" item above, stated from the user's per
**Scope note:** the section pre-fill should be scoped to the family's own memory (`ProductStoreSection` rows they've created), not a global default — different families organize differently. **Scope note:** the section pre-fill should be scoped to the family's own memory (`ProductStoreSection` rows they've created), not a global default — different families organize differently.
## Recipes
### Structured multi-step instructions
Replace the single free-form instructions textarea with an ordered list of discrete steps, each in its own text box.
**UX:** steps are numbered automatically. Users can add a step, remove a step, and reorder steps (drag or up/down arrows). Each step is a short textarea (23 rows) rather than a single-line input, to accommodate steps with sub-detail.
**Data model:** a new `RecipeStep` entity — `(Id, RecipeId, SortOrder, Text)` — replaces the `Recipe.Instructions` string. Migration: split existing `Instructions` on double-newline (or numbered-list pattern) into individual rows; anything that doesn't parse cleanly lands as a single step.
**API:** `Recipe` GET returns `steps: [{ id, sortOrder, text }]` instead of `instructions: string`. POST/PUT accept the same shape. The old `Instructions` column can be kept nullable for backward compatibility during the migration window, then dropped.
**Backward compatibility:** the recipe detail view currently renders `instructions` as `whitespace-pre-wrap`. Switch it to a numbered `<ol>` once steps are in place; the edit page replaces the textarea with the step list.
**Open questions:**
- Keep `Instructions` as a migration fallback column, or do a single-step cutover migration?
- Should steps support rich text (bold ingredient names, timers) or stay plain text for v1?
## Lists ## Lists
### Block create-list flow when no stores exist ### Block create-list flow when no stores exist