refactor(desktop): draw the Issues list and Home rows with the shared ListRow

Merged
CH
7d ago
+173-73

What

D36/D37 kept these rows bespoke because ListRow had no ref, onContextMenu, or onKeyDown. FX2 (#3417) added them, so this moves two sets of rows onto @luke/ui's List/ListRow:

  • Issues list (issue-list.tsx). Each status group is a List (named by its status) of ListRows:
    • leading: the status glyph
    • title: identifier, then title
    • meta: priority mark, then time
    • press: opens the issue
    • Focus return when coming back from an issue goes through ListRow's ref.
    • Right-click opens Issue actions through onContextMenu, handing focus back to the row's press on close.
    • The menu key and ⇧F10 open Issue actions through onKeyDown.
    • The menu and its archive question now render beside the row rather than inside its item, so a press inside them can't reach the row's right-click.
  • Home's Recent (RecentRow in desktop-home.tsx; it also draws the "Created" rows on a person's page). Each row is a ListRow:
    • leading: repository picture
    • title: task name
    • meta: repository, teammate's face, status mark, then time
  • ↑/↓ through the page's rows (use-row-keys.ts, Home, Issues list, Factory) now also reaches ListRow presses, so keyboard order and Return work as before.

Home's Inbox rows (InboxItemRow) are not in this PR. They need ListRow to gain unread, current-kind, and hint support. That comes in a follow-up PR stacked on this one, agreed with the orchestrator.

Visible changes (not screenshotted, see below)

Issues list rows, before → after:

  • Row inset 8px → 12px (ListRow's). The group headings stay at 8px, so row contents sit 4px right of the heading.
  • Title weight 400 → 500 (the contract's label type). The identifier keeps weight 400.
  • Time and priority: 11.5px subtle ink → ListRow meta (12px caption, muted ink).
  • Hover and focus fills come from ListRow, not the sidebar row. The gap between rows is the same 2px.

Home Recent (and a person page's Created) rows, before → after:

  • The repository name used to sit right after the task name. It now sits in the meta slot at the row's end, just before the face, mark, and time.
  • Same inset, weight, and meta-type changes as the Issues list.
  • Until the follow-up lands, Recent's row contents sit 4px right of the Inbox section's rows above it.

Tests

jsdom, behaviour only:

  • New: a list row's right-click opens its menu, and Escape hands the keyboard back to the row. It fails without the opener ref.
  • Existing: Issues ⇧F10, arrow keys, focus-return, and grouping tests pass. Home's arrow keys, Recent, and faces tests pass. Person page tests pass.
  • Test helpers that found these rows by .sidebar-task/data-issue-id now find them by li or by the identifier the row reads.

Not verified

  • No screenshots. Rendered fixture capture is Mac-only (scripts/evidence.sh), and this was built in a Linux sandbox.
  • Nothing was checked on a Mac.

Checks

pnpm check:affected passes.

🤖 Generated with Claude Code


Open workspace in Conductor


Devin Review


Summary by cubic

Moves the Issues list and Home's Recent rows (also a person page's Created rows) onto @luke/ui's shared List/ListRow, which now supports the ref, onContextMenu, and onKeyDown the bespoke rows needed. Existing right-click, ⇧F10/menu-key, focus-return, and arrow-key behavior is preserved; the issue actions menu now renders beside the row instead of inside it, so a press inside the menu can't trigger the row's right-click. When a menu change (like picking a status) moves the issue to another group, the keyboard follows it to the row under its new heading, and Recent's time stays visible at narrow widths because the repository context truncates before the marks and time.

Visible changes

  • Issues rows: inset 8px → 12px, title weight 400 → 500 (identifier stays 400), and time/priority use ListRow's meta styling.
  • Recent rows: the repository name moves from after the task name to the meta slot at the row's end.
  • Home's Inbox rows are unchanged; a follow-up PR will move them once ListRow gains unread, current-kind, and hint support.