Extract the two remaining inline ConfirmModal blocks at the bottom of
EditorLayout into their own modules under components/EditorLayout/,
matching the pattern established by CreateStackDialog (B4-2):
- DeleteStackDialog: takes open/onOpenChange/stackName/onConfirm; owns
the prune-volumes checkbox state internally and resets it on close.
EditorLayout's deleteStack handler now accepts pruneVolumes as a
parameter instead of reading parent state.
- UnsavedChangesDialog: takes open/onCancel/onConfirm. The discard
body is hoisted to a named handler in EditorLayout
(discardAndLoadPending) so the dialog stays a thin presentational
wrapper.
Also removes a dead label-bulk-action surface that had no live entry
point: bulkActionLabel and bulkAction were declared without setters,
and setBulkActionOpen(true) was never called from anywhere. The
multi-select bulk-stack-actions live elsewhere via useBulkStackActions
and SidebarBulkBar; this removed code was unrelated and unreachable.
Drops the BulkActionResult interface, four useState lines, the
bulkAffected useMemo, the runLabelBulkAction handler, and the inline
ConfirmModal.
EditorLayout.tsx: 2,852 -> 2,747 LOC (-105). useState count: 66 -> 61.