cmux NEXT: cancel the update download; text left, a bigger cancel on the right, vertically centred

Merged
TE
7d ago
+318-9

Leo (2026-10-31): "AND WHY CAN'T I CANCEL THE DOWNLOAD OPTIONALLY AND WHY IS THE SYMBOL SO FING SMALL THIS IS STUFF ASS SPACING WHY NOT JUST LEFT ALIGN THE TEXT PUT A BIGGER SYMBOL ON THE RIGHT" / "I SHOULDN'T HAVE TO SAY THIS, EVER:" / "ALSO CENTER THE FING BUTTON ON THE RIGHT VERTICALLY"

What changes

The sidebar's update notice card (SidebarNoticeCardView, fed by SidebarCardFeed.notice):

  • Text left. Update status cards drop the small leading glyph and the leading spinner. The title, detail and progress bar all start at the card's padding (Metrics.space3).
  • Bigger control on the right, vertically centred. A running download shows a cancel (xmark.circle.fill, 18 pt glyph in a 28 pt hit square, both from Metrics.space*) on the card's right padding, centred on the card's height. The text and the bar stop space4 short of it. The new SidebarNoticeCard.trailing drives it, so other notice cards (tip, announcements, Tidy Up) are unchanged.
  • Cancellable download. UpdateCardAction.cancelDownload calls Sparkle's download cancellation (UpdateState.Downloading.cancel, the SPUUserDriver showDownloadInitiated(cancellation:) callback), which stops the transfer and removes the partial file. The card then goes back to the found update ("Update Available", with Update / Release Notes / Hide). Update checks again and downloads what that check finds. Hide clears the card. Any later Sparkle move clears the cancelled card.

Spec: leo-workspace design/sidebar.md gains the rule "status cards: text left, primary control right and vertically centred; long operations are cancellable".

Tests

UpdateDownloadCancelTests (new):

  • the downloading card has a cancel and no leading glyph; checking and unpacking have no cancel
  • the title starts at the padding; the cancel is ≄ 24 pt, on the right padding and vertically centred; pressing it sends cancel_download
  • cancel stops the download, the card returns to the found update with Update, a second cancel does nothing, and Update checks again and downloads once
  • an Update click whose check ends empty never downloads a later scheduled update
  • a new check ends the cancelled card

Fleet: cmux-ci compile-check --app passed; the touched suites (UpdateDownloadCancel, UpdateLoadingIndicator, UpdateCheckFeedback, SidebarNoticeCardClose/Switch, ThemedSpinnerAndSegments, UpdateFeedCard, SidebarCardTransition) were run with package-test-lane.sh at the head.

Risk: low. The change covers only the update status card's layout and a new cancel path. The other notice cards get trailing == nil and keep their layout.

Follow-ups (from review): after a cancel, the found-update card no longer claims the slot over Now Playing (userAsked is false); the cancelled card's Remind-me-later options clear it without recording a snooze.

šŸ¤– Generated with Claude Code

Agent session: agent session


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

Makes the sidebar's update status card cancellable and reworks its layout: text is left-aligned at the card's padding, and a running download shows a larger, vertically centered cancel button on the right.

  • The cancel stops Sparkle's transfer and deletes the partial file; the card returns to the found update, whose Update checks again and downloads what it finds.
  • A cancel after the download already finished does nothing; Hide clears the cancelled card, and any later Sparkle move ends it.
  • Other notice cards (tips, announcements, Tidy Up) keep their current layout.