cmux NEXT: cancel the update download; text left, a bigger cancel on the right, vertically centred
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 fromMetrics.space*) on the card's right padding, centred on the card's height. The text and the bar stopspace4short of it. The newSidebarNoticeCard.trailingdrives it, so other notice cards (tip, announcements, Tidy Up) are unchanged. - Cancellable download.
UpdateCardAction.cancelDownloadcalls Sparkle's download cancellation (UpdateState.Downloading.cancel, theSPUUserDrivershowDownloadInitiated(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](https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-dark-v3-3x.png)
![Autofix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark-3x.png)
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.