The pending state reached the confirmation only on a later render, so
Keep it, Escape, the scrim or a second Remove straight after Remove could
still close the confirmation or send a second DELETE. QuestLogSheet now
latches the removal synchronously in a ref, refuses dismissal and a
repeated confirmation while it is set, and renders busy from it until
the removal settles.
A focused button that becomes disabled loses focus to the page, outside
the dialog. Confirm now moves focus to its dialog when the focused
control is disabled by busy or dismissible changing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
After a removal, focus moves to the remove button of the dinner now in
the removed one's place, the one before it when it was the last, or the
Quest log sheet when none is left, instead of the removed row's detached
button. While the DELETE is pending, the confirmation can no longer be
dismissed: Confirm gains a dismissible prop that disables the cancel
button and ignores Escape and the scrim.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tapping "Quest log · N" opens a bottom sheet listing the Quest log, each
dinner with its 48 px washed photo, name, difficulty and minutes. A row
opens /dinner/:id; its remove button asks to confirm, then archives the
dinner (DELETE /api/v1/dinners/{id}) and takes it off the count. An empty
Quest log says "Your Quest log is empty — swipe right on a side quest to
add one." The sheet replaces the pill's interim name list.
The Quest log is the dinners accepted and not yet scheduled, so GET
/api/v1/dinners?status=quest_log now leaves out a dinner on the plan for
the household's current week (by its timezone) or a later week, read
from week_plans and plan_days. The pill's count and the sheet both come
from that one read.
Task: 5ad0b188-176e-4107-91dd-5d667ca6a4d2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>