Confirm + progress
The app-wide pattern for a big change to the DB or the public experience: an isolated card over a scrim that dims everything else, with three phases — confirm (state the blast radius) → progress (non-dismissable) → complete (success or partial failure with a per-item list). Use it for bulk mutations, publishing, destructive deletes — anything consequential enough to warrant a beat of deliberate confirmation and visible progress.
Driven by a spec whose run(onProgress) does the work and reports { done, total }; the modal renders the phases. Set danger for destructive / irreversible actions. ESC and scrim-click cancel only before the run starts.
import from @halwel/ui/components/feedback/ConfirmProgressModal
Variants
Success (determinate progress)
Danger + partial failure