refactor(desktop): migrate plan action menu and inline rename onto the design system

Merged
CH
8d ago
+15-16

D38 of the design-system migration (Desktop stack, base feature/desktop-d37-plans-collection, #3416).

Which surface

"Plan action menu and inline rename" maps to the task's actions (task-actions.tsx, task-menu-items.tsx) and the in-place name field (task-name-field.tsx), as the sidebar row's rename uses it.

What

  • The open task's ⋯ in the toolbar is now the barrel IconButton. It replaces a raw <button class="icon-button">. Its name ("Task actions"), tooltip, menu (trigger()), and being unavailable while a delete runs are unchanged. D37 made the same change to Issues' View options.
  • The menu itself was already the barrel Menu, through the desktop's ActionMenu adapter, which only adds each item's chord. Its items, groups, submenu (Move to section), danger item, footer, keys, and dismissal are unchanged.
  • The "Created by / Last edited" footer lines: the two .task-menu-note rules, which sat about 400 lines apart in desktop.css, are now one rule. It's the same declarations at the same specificity, so nothing changes visually.
  • The sidebar row's rename field (.sidebar-task-field) reads its 13px size from --luke-type-body-size, which is the same value.
  • No caller here imported @luke/ui/compat. No selector became unused: .icon-button still has other callers.

Why the rename field stays bespoke

TaskNameField is a desktop-local input drawn over the name it renames. The open task's tab, a terminal tab, Settings › Workspace, and an integration's name all use it as well as the sidebar row. Moving it onto the barrel TextField would need two things:

  • A shared API change. TextField is controlled and has no blur or Escape callback. The field needs to be uncontrolled, open with all its text selected, keep what was typed on blur, and stop Escape before the window's own Escape.
  • A visible change. The field would get the 30px bordered control look in place of the row's inline overlay.

So it keeps its own markup and only moved onto tokens. Every caller still passes the field's class, but that's not a class on a barrel control. Each caller's own field class belongs to its row (D02 tab strip, D86 terminal, D17/D26 settings).

Visible changes

  • None. Before and after captures are byte-identical in both themes.

Tests

  • No behaviour changed, so no tests were added. task-actions.test.ts and move-task-dialog.test.ts (18 tests) pass unchanged; they find the ⋯ by its name.
  • pnpm check:affected exits 0.

Evidence

Captured on Linux under Xvfb with --fixture smoke --profile tasks --capture-evidence (1280×840 window; dark via --force-dark-mode). The ⋯ is at the toolbar's end, beside Start. The capture on the base (#3416) is byte-identical in both themes.

LightDark
Open task, lightOpen task, dark

Not captured: the open menu and the rename field. Neither changed visibly, and the fixture can't open either.

Not verified on a Mac

  • The ⋯ staying no-drag in the toolbar's drag region (.luke-button is in the no-drag list).
  • Glyph rendering in SF Pro.

🤖 Generated with Claude Code