refactor(desktop): migrate about/update page onto the design system

Merged
CH
9d ago
+173-67

D33 of the design-system migration (Desktop stack, base feature/desktop-d32-experimental-settings, #3410).

What

Settings › About (apps/desktop/src/renderer/settings/updates.tsx) moves onto @luke/ui:

  • The group is SettingsSection, replacing the desktop's SettingsGroup.
  • The update line and the Changelog line are SettingsRows. Each sits in a wrapper div that carries its search anchor, because the shared row takes no caller attributes (the same approach Voice uses).
  • Restart to update, Download, Try again, Check for updates and Open are the outline Button, replacing .toolbar-button.bordered-button.
  • While a check runs, Check for updates is the busy Button named "Checking for updates", replacing the desktop's BusyLabel inside a disabled button.

The failure is still its own role="alert" element inside the row's description, so it's announced when it appears. The progress bar (.update-progress) still sits under the detail words.

No caller here imported @luke/ui/compat. No selector became unused: SettingsGroup, .settings-name, .settings-copy .error-message and .update-progress all have callers still.

Visible changes

  • Button words use the shared button's weight instead of the bold toolbar-button weight.
  • Download and Open show their external glyph before the words instead of after, as Notifications' Open System Settings does.
  • While checking, the button shows the shared spinner as soon as the check starts. Before, it was greyed-out words with a spinner that appeared after 180ms. The button stays focusable but ignores presses (aria-disabled) instead of being disabled.
  • The row with the progress bar is 3px shorter. The shared row's description spacing replaces the old copy block's.

Tests

  • updates.test.ts (new, jsdom) covers the one behaviour change: while a check runs, the button named "Checking for updates" takes focus and a press asks for no second check; at rest, a press of Check for updates turns the row to its checking state. The busy test fails against the previous implementation.
  • The existing settings tests pass untouched, including "Check for updates" search landing on About › Updates (desktop-settings.test.ts).
  • pnpm check:affected exits 0.

Evidence

Captured on Linux with headless Chrome at 1280×840, the same way as #3410. A throwaway, uncommitted jsdom test rendered the real UpdatesSection inside SettingsPage once per state: up to date, checking, downloading at 42%, ready, and failed install. That markup was framed with the built desktop stylesheet. Each card is one state; the real page shows only one.

LightDark
Before
After

Not verified on a Mac

  • glyph and type rendering in SF Pro
  • the page's scroll and drag strip in the real window
  • a real update check, download and restart (the states above were rendered from synthetic snapshots)

🤖 Generated with Claude Code