Skip to content

feat(ui): let ListRow carry hints, a dense density and keep-focus presses - #3576

Merged
charleslpan merged 32 commits into
mainfrom
p2/s13-let-listrow-carry-hints-a-dense-dens
Oct 18, 2026
Merged

charleslpan merged 32 commits into
mainfrom
p2/s13-let-listrow-carry-hints-a-dense-dens

Conversation

@charleslpan

@charleslpan charleslpan commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

What

S13 of phase 2. @luke/ui's ListRow gets the options the remaining bespoke rows needed, and those rows now draw with it.

New ListRow options. Each is an as const value or a plain boolean, and none takes a class.

  • LIST_DENSITY.DENSE: one line at a control's height. The title is in body type, with the description after it on the same line. Set it on a List, or on a single ListRow (density) when the row stands in the app's own list, such as the sidebar's drag lists.
  • LIST_ROW_INK {TEXT, SIDEBAR}: SIDEBAR draws the title in --luke-color-sidebar-ink, and full ink while the row is hovered, current, unread or has its menu open.
  • actionsShown: ACTIONS_SHOWN.ON_HOVER: the row's acts sit over the meta. They show while the row is hovered, focused from the keyboard, or has its menu open.
  • menuOpen: rings the row while its menu is open, as Finder does.
  • chevron: a chevron at the row's end, shown while the row is hovered, focused or current.
  • keepFocus and tabbable: work like Button's props of the same names.
  • id: set on the row's <li>, so a search field can point aria-activedescendant at the row.
  • disabled.
  • onTitleClipped(clipped): tells the app whether the title is cut short, so it can show the full title in a hint only then.

This builds on #3555 (LIST_VARIANT/LIST_DENSITY) and #3571 (hint, unread, LIST_ROW_CURRENT). On the desktop side, RowHint/RowHintOptions (tooltip.tsx) pass the window's Tooltip into the hint slot. The card and the shortcut it shows come through context, so the hint component stays the same component across renders.

Rows moved:

  • Sidebar task, pinned-tab and agent rows (task-actions.tsx, sidebar-pinned-tab.tsx, sidebar-agent.tsx).
  • Factory rows.
  • Task summary rows. The Files section keeps its file-tree rows.
  • Integration tool rows. The pointer highlight now comes through the hint slot.
  • Person page agent and automation rows.
  • Version and section rows.
  • Terminal shell rows.
  • Pull request check and deployment rows.
  • The published row (onTitleClipped).
  • The Inbox's "Next" row.

Screenshots (Linux, Xvfb, --fixture smoke)

Before After
before after
before after

Sidebar rows are unchanged: same height, inset, ink and current fill.

Visible changes (cleanup-level)

  • Sidebar rows: corner radius 9 → 8px. A pinned tab's long name ends in an ellipsis instead of fading out.
  • Version history:
    • Row side padding 8 → 12px.
    • The time and the ⋯ are centred on the row instead of sitting on the author's line.
    • A row with its menu open is ringed.
    • Section rows: padding 6/8 → 8/12px.
  • Terminal shells: compact rows (4px top and bottom, about 44px tall instead of 40px). The detail text is muted instead of subtle. A row with its menu open is ringed.
  • Pull request checks and deployments: a card on the surface colour (it used to be a transparent box). Rows are dense, 30px. Check names go from 12.5 to 13px. "Show all" sits under the card.
  • Integration tool rows:
    • Title weight 400 → 500 (label type).
    • Hover uses the hover fill; the current row keeps the strong fill.
    • Tool id 11 → 12px.
    • The chevron also shows on hover and focus.
  • Factory rows: regular ListRows like Home's Inbox rows (12px inset, title weight 500).
  • Task summary rows: same size as before. A long label ends in an ellipsis instead of fading out.
  • Person page rows: like Home's Recent rows; the task or trigger moves to the meta.
  • Published row: a card, still 36px tall. Title 12px → 13px at weight 500.
  • Inbox "Next": a card instead of a filled bar. The agent's tile now comes before "Next". The title is in ListRow's unread weight (700, was 600).

Bundle budget

No change in this PR. #3305 re-recorded `apps/desktop/bundle-budget.json` on main (`renderer/panel.js` 901,571). This branch measures 902,302 there, so it adds 731 gzipped bytes and stays under the ceiling. The bytes come from ListRow's new options, `RowHint`/`RowHintOptions`, and the moved rows' markup.

Tests

jsdom tests of behaviour only:

  • list-row.test.ts: keep-focus press; a row out of the tab order; an unavailable row; a row found by id; the chevron hidden from screen readers; acts shown on hover still reached by Tab; title-clip reporting.
  • agent-servers.test.ts: the pointer moves the tool highlight. This test fails without the hint wiring.
  • Existing suites now find rows through the lists and roles, not the old classes.
  • A check's state ("failed", "passed") is now part of its row's accessible name, because the glyph is decoration.

Not verified on a Mac.

🤖 Generated with Claude Code

charleslpan and others added 7 commits October 18, 2026 14:27
…h the shared ListRow

The automations list and an automation's runs panel drew bespoke rows.
Both now draw @luke/ui's List and ListRow. List gains a finite variant
(PLAIN, CARD) so the automations keep their card, and a finite density
(REGULAR, COMPACT) so run rows keep their 44px height.

A right-click on an automation's switch stays the switch's own, and the
row's Copy-link menu hands focus back to the row's press as it closes.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… ListRow

The Issues list's rows and Home's Recent rows (also a person page's
Created rows) are now @luke/ui List/ListRow. An issue row hands its
press to the page through ListRow's ref for focus return, opens Issue
actions on right-click through onContextMenu (focus going back to the
row's press) and on the menu key or Shift-F10 through onKeyDown. The
arrow keys keep moving through the page's rows, now ListRow presses too.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…and keep Recent's time at narrow widths

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
ListRow gains unread (the title in the bold weight), a finite current kind
(LIST_ROW_CURRENT: PAGE or ITEM, announced as aria-current page or true),
and a hint slot that wraps the row's press with the app's tooltip, as
FoldingButton's does. The Inbox's item rows, on the Inbox page, a task's
Inbox tab, Home, and a person's page, move onto it; the Inbox finds a row's
press through a map its rows' refs keep, in place of data-item-id queries.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
luke-web Ready Ready Preview Oct 18, 2026 6:25pm UTC

Request Review

charleslpan added a commit that referenced this pull request Oct 18, 2026
@charleslpan
charleslpan marked this pull request as ready for review October 18, 2026 15:32
@charleslpan
charleslpan enabled auto-merge October 18, 2026 15:32
devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

@charleslpan
charleslpan added this pull request to the merge queue Oct 18, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Oct 18, 2026
@charleslpan
charleslpan added this pull request to the merge queue Oct 18, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Oct 18, 2026
@charleslpan
charleslpan enabled auto-merge October 18, 2026 18:11
@charleslpan
charleslpan added this pull request to the merge queue Oct 18, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Oct 18, 2026
@charleslpan
charleslpan enabled auto-merge October 18, 2026 18:22
@charleslpan
charleslpan added this pull request to the merge queue Oct 18, 2026
Merged via the queue into main with commit 78185c2 Oct 18, 2026
12 checks passed
@charleslpan
charleslpan deleted the p2/s13-let-listrow-carry-hints-a-dense-dens branch October 18, 2026 18:33

This branch was successfully deployed

1 active deployment
Preview — daec2aae Deployed Oct 18, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant