refactor(desktop): migrate move-plan dialog onto the design system

Merged
CH
8d ago
+85-71

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 Dialog at the confirm measure (DIALOG_SIZE.CONFIRM), not the compat ModalShell with a move-dialog class. Role, labelling, initial focus (the chosen row, or Cancel when none can take the task), busy stilling and dismissal are unchanged.
  • Title is Text in 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", as BusyLabel did, and stays disabled while no workspace can take the task.
  • A refused move is ErrorState, still role="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 and ListRow doesn't fit), the effects well, and the answers' row. Their rules now read --luke-* tokens (the same values their legacy aliases held), and .move-dialog is 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-message still 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).

BeforeAfter
Lightbefore lightafter light
Darkbefore darkafter dark
Refused, lightbefore refused lightafter refused light
Refused, darkbefore refused darkafter 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