- Adds GET /api/products/{kind}/{id}/section?storeId=... exposing the
per-store memory the list page mirrors when a product is picked, so the
section dropdown reflects what the backend would auto-assign on POST.
- Treats backend warnings as errors via Directory.Build.props; fixes the
surfaced warnings (obsolete PostgreSqlBuilder ctor, nullable string[]
in IsEquivalentTo, redundant nullable flow).
- Annotates wire-exposed enums (ProductKind, UnitKind, UnitCategory,
UnitCategoryFlags) with JsonStringEnumConverter so they round-trip as
strings regardless of caller options. Unblocks the integration tests
that deserialize DTOs via GetFromJsonAsync without the global converter.
Replace the speculative product-catalog design notes with a
shipped/remaining breakdown, capture the decisions made along the way
(visible override pill, whole-override reset, unconditional family-product
delete, recipes share the catalog), and tighten the auto-assign-section
item to reflect that only the frontend pre-fill on product pick is left.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Tapping "+ New list" with zero stores now shows a warning toast with an
"Add a store" action linking to /stores, instead of opening a form whose
required store dropdown would be empty.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Archived lists are no longer part of anyone''s workflow, so they
shouldn''t block a store from being deleted. The handler now blocks
only on non-archived lists and purges archived ones (items cascade)
in the same transaction.
Also grooms BACKLOG.md to remove items already shipped (Family/multi-
tenant epic, password reset, email invites, auth rate limiting,
picked-up-vs-removed, per-store sections base feature, add-recipe-to-
list, store delete confirm + duplicate-name 409).
Introduces a runes-based toast module (`$lib/toast.svelte.ts`) with
success/info/warning/error variants, auto-dismiss, optional action
button, plus a `Toaster` viewport mounted in the root layout.
Migrates the lone `alert(e.message)` call site (stores delete) to
`toast.error()`. Backlog updated to remove the now-completed
foundational item and rewrite dependent items to reference the
shipped API.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>