refactor(desktop): migrate move-plan dialog onto the design system
D39 of the design-system migration (Desktop stack, base feature/desktop-d38-plan-action-menu-and-inline-rename, #3418).
What
- Move to workspace stands in the barrel
Dialogat the confirm measure (DIALOG_SIZE.CONFIRM), not the compatModalShellwith amove-dialogclass. Role, labelling, initial focus (the chosen row, or Cancel when none can take the task), busy stilling and dismissal are unchanged. - Title is
Textin the dialog role (h2, same id as before). - Cancel and the move are barrel
Buttons (quiet and primary). The move shows the busy ring named "Moving", asBusyLabeldid, and stays disabled while no workspace can take the task. - A refused move is
ErrorState, stillrole="alert"with the same sentence. - Kept as the dialog's own container layout: the workspace rows (a radio group of buttons holding a
WorkspaceRef, with arrow-key stepping; the barrel has no radio row andListRowdoesn't fit), the effects well, and the answers' row. Their rules now read--luke-*tokens (the same values their legacy aliases held), and.move-dialogis a flex column inside the card. - Removed:
.move-dialog's width rule on the card. Nothing else became unused (.confirm-dialog-*,.primary-button,.toolbar-button,.error-messagestill have other callers).
Visible changes
- The card is 400px wide (the contract's confirm width), not 440px, so a long title wraps one line sooner.
- Cancel and Move use the barrel button's type: regular weight, not semibold.
- The refusal is drawn as
ErrorState: an alert glyph and muted text, not red text alone (the same look the feedback dialog's refusal has). - The effects well's lines are caption type, 12/16, not 12px at 1.45 line height.
Tests
No behavior changed, so no new tests. move-task-dialog.test.ts (7 tests: offering, rows and their reasons, the chosen default, the effects, the move, the refusal, the stranded banner) passes unchanged. pnpm check:affected exits 0.
Evidence
Captured on Linux under Xvfb with --fixture smoke --profile tasks (1280×840 window, content 1280×812; dark via --force-dark-mode), the dialog opened from the ⋯ over CDP. For these shots only, the fixture task's repository was set to none (not committed), so that Acme can take the task and the effects well shows. The fixture refuses every move, which gives the refused state. Before is the base (#3418).
| Before | After | |
|---|---|---|
| Light | ![]() | ![]() |
| Dark | ![]() | ![]() |
| Refused, light | ![]() | ![]() |
| Refused, dark | ![]() | ![]() |
Not verified on a Mac
- The dialog over the window's drag regions (the backdrop is no-drag).
- Glyph and text rendering in SF Pro.
🤖 Generated with Claude Code







