Skip to content

feat(mobile): render settled threads as slim history rows - #283

Merged
patroza merged 1 commit into
fork/changesfrom
t3code/mobile-settled-slim-rows
Aug 1, 2026
Merged

feat(mobile): render settled threads as slim history rows#283
patroza merged 1 commit into
fork/changesfrom
t3code/mobile-settled-slim-rows

Conversation

@omegent-app

@omegent-app omegent-app Bot commented Aug 1, 2026

Copy link
Copy Markdown

Why

On mobile, the settled area did not read as compact: the classic thread lists (phone Home and the iPad navigation sidebar) rendered settled threads with the same three-line chrome as active work — favicon, title, status pill, branch/server subtitle, PR badge, chevron. Only the Settled section header distinguished history from inbox.

Web has had a distinct slim settled row in both list modes for a while (Sidebar.tsx settled shelf, SidebarV2 variant === "slim"), and mobile's own Thread List v2 settled tail already ships one (thread-list-v2-items.tsx). The classic mobile path was the only surface missing it — HomeScreen / ThreadNavigationSidebar pushed plain { type: "thread" } items into the shelf and ThreadListRow had no settled rendering, only a settled-aware long-press menu.

What changed

ThreadListRow now renders a slim row whenever isSettled is true, in both the compact (phone) and sidebar (iPad) variants:

  • dimmed favicon (40%), one muted title line, draft dot, trailing time — nothing else
  • status pill, subtitle, PR badge, provider icon and chevron all drop
  • keeps the 44pt tap target, swipe actions, and long-press settle/unsettle menu

isSettled is already passed at both call sites from settledThreadKeys, so this applies to settled rows wherever they appear — the Settled shelf in recency/flat mode and settled rows sitting inline in a project group when hide-settled is off. That matches web, which passes isSettled for every row rather than only shelf rows.

The trailing label uses resolveSettledRowTimestamp (new pure helper in threadPresentation.ts): settle stamp when the server recorded one, otherwise last activity — mirroring web's resolveSettledTimestamp so the shelf reads in the order it is sorted.

Settled rows lead with a favicon only where the row already carries project context (recency / flat / Needs attention); project-grouped lists already show one in the group header.

Notes / deliberate divergences

  • Follows mobile Thread List v2 slim chrome rather than web's, so the two mobile list modes render settled history identically. Consequence: the PR badge is dropped on mobile settled rows (web keeps it dimmed). The PR is still announced in the row's accessibility label.
  • No separator hairline on settled rows, same as the v2 settled tail and web.
  • Swipe primary action is unchanged (Archive) — this PR is presentation only.

Tests

  • apps/mobile/src/features/threads/threadPresentation.test.ts (new) — resolveSettledRowTimestamp precedence and shelf-order agreement.
  • apps/mobile/src/mobileSurfaceExistence.test.ts — existence contract for the slim settled row: testID="thread-list-row-settled", the isSettled ? settledRowContent(close) branch staying wired into the shared renderer, and the dimmed-favicon / muted-title chrome. Fails if a stack conflict resolve keeps the helper but drops the branch.

Gate

  • vp check — 0 errors (24 pre-existing warnings, none in touched files)
  • ELECTRON_SKIP_BINARY_DOWNLOAD=1 vp run -r --cache typecheck — exit 0, 0 errors
  • vp test run apps/mobile/src — 107 files, 680 tests passed

Client-visible verification not run: this Linux host has no iOS Simulator or Android Emulator (adb/emulator/xcrun all absent), so the test-t3-mobile pass could not be performed. Needs a look on a device before merge.

🤖 Generated with Claude Code

The classic mobile thread lists (phone Home and the iPad navigation
sidebar) rendered settled threads with the same three-line chrome as
active work — favicon, title, status pill, branch/server subtitle, PR
badge, chevron — so the "Settled" shelf read as more inbox rather than
history. Web has had a distinct slim settled row in both list modes
(Sidebar.tsx settled shelf, SidebarV2 slim variant), and mobile's own
Thread List v2 settled tail already ships one; only the classic mobile
path was missing it.

Settled rows now collapse to a single dimmed line — dimmed favicon,
muted one-line title, draft dot, trailing settle time — in both the
compact and sidebar variants, matching thread-list-v2-items.tsx. The
row keeps its tap target (44pt), swipe actions, and long-press
settle/unsettle menu.

The trailing label uses the settle stamp when the server recorded one
and falls back to last activity, so the shelf reads in the order it is
sorted (resolveSettledRowTimestamp mirrors web's
resolveSettledTimestamp).

Settled rows lead with a favicon only where the row already carries
project context (recency / flat / Needs attention); project-grouped
lists already show one in the group header.
@patroza
patroza enabled auto-merge (squash) August 1, 2026 18:30
@patroza
patroza merged commit c570717 into fork/changes Aug 1, 2026
8 checks passed
patroza pushed a commit that referenced this pull request Aug 4, 2026
The classic mobile thread lists (phone Home and the iPad navigation
sidebar) rendered settled threads with the same three-line chrome as
active work — favicon, title, status pill, branch/server subtitle, PR
badge, chevron — so the "Settled" shelf read as more inbox rather than
history. Web has had a distinct slim settled row in both list modes
(Sidebar.tsx settled shelf, SidebarV2 slim variant), and mobile's own
Thread List v2 settled tail already ships one; only the classic mobile
path was missing it.

Settled rows now collapse to a single dimmed line — dimmed favicon,
muted one-line title, draft dot, trailing settle time — in both the
compact and sidebar variants, matching thread-list-v2-items.tsx. The
row keeps its tap target (44pt), swipe actions, and long-press
settle/unsettle menu.

The trailing label uses the settle stamp when the server recorded one
and falls back to last activity, so the shelf reads in the order it is
sorted (resolveSettledRowTimestamp mirrors web's
resolveSettledTimestamp).

Settled rows lead with a favicon only where the row already carries
project context (recency / flat / Needs attention); project-grouped
lists already show one in the group header.

Co-authored-by: omegent-app[bot] <306514130+omegent-app[bot]@users.noreply.github.com>
patroza pushed a commit that referenced this pull request Aug 4, 2026
The classic mobile thread lists (phone Home and the iPad navigation
sidebar) rendered settled threads with the same three-line chrome as
active work — favicon, title, status pill, branch/server subtitle, PR
badge, chevron — so the "Settled" shelf read as more inbox rather than
history. Web has had a distinct slim settled row in both list modes
(Sidebar.tsx settled shelf, SidebarV2 slim variant), and mobile's own
Thread List v2 settled tail already ships one; only the classic mobile
path was missing it.

Settled rows now collapse to a single dimmed line — dimmed favicon,
muted one-line title, draft dot, trailing settle time — in both the
compact and sidebar variants, matching thread-list-v2-items.tsx. The
row keeps its tap target (44pt), swipe actions, and long-press
settle/unsettle menu.

The trailing label uses the settle stamp when the server recorded one
and falls back to last activity, so the shelf reads in the order it is
sorted (resolveSettledRowTimestamp mirrors web's
resolveSettledTimestamp).

Settled rows lead with a favicon only where the row already carries
project context (recency / flat / Needs attention); project-grouped
lists already show one in the group header.

Co-authored-by: omegent-app[bot] <306514130+omegent-app[bot]@users.noreply.github.com>
patroza pushed a commit that referenced this pull request Aug 4, 2026
The classic mobile thread lists (phone Home and the iPad navigation
sidebar) rendered settled threads with the same three-line chrome as
active work — favicon, title, status pill, branch/server subtitle, PR
badge, chevron — so the "Settled" shelf read as more inbox rather than
history. Web has had a distinct slim settled row in both list modes
(Sidebar.tsx settled shelf, SidebarV2 slim variant), and mobile's own
Thread List v2 settled tail already ships one; only the classic mobile
path was missing it.

Settled rows now collapse to a single dimmed line — dimmed favicon,
muted one-line title, draft dot, trailing settle time — in both the
compact and sidebar variants, matching thread-list-v2-items.tsx. The
row keeps its tap target (44pt), swipe actions, and long-press
settle/unsettle menu.

The trailing label uses the settle stamp when the server recorded one
and falls back to last activity, so the shelf reads in the order it is
sorted (resolveSettledRowTimestamp mirrors web's
resolveSettledTimestamp).

Settled rows lead with a favicon only where the row already carries
project context (recency / flat / Needs attention); project-grouped
lists already show one in the group header.

Co-authored-by: omegent-app[bot] <306514130+omegent-app[bot]@users.noreply.github.com>
patroza pushed a commit that referenced this pull request Aug 5, 2026
The classic mobile thread lists (phone Home and the iPad navigation
sidebar) rendered settled threads with the same three-line chrome as
active work — favicon, title, status pill, branch/server subtitle, PR
badge, chevron — so the "Settled" shelf read as more inbox rather than
history. Web has had a distinct slim settled row in both list modes
(Sidebar.tsx settled shelf, SidebarV2 slim variant), and mobile's own
Thread List v2 settled tail already ships one; only the classic mobile
path was missing it.

Settled rows now collapse to a single dimmed line — dimmed favicon,
muted one-line title, draft dot, trailing settle time — in both the
compact and sidebar variants, matching thread-list-v2-items.tsx. The
row keeps its tap target (44pt), swipe actions, and long-press
settle/unsettle menu.

The trailing label uses the settle stamp when the server recorded one
and falls back to last activity, so the shelf reads in the order it is
sorted (resolveSettledRowTimestamp mirrors web's
resolveSettledTimestamp).

Settled rows lead with a favicon only where the row already carries
project context (recency / flat / Needs attention); project-grouped
lists already show one in the group header.

Co-authored-by: omegent-app[bot] <306514130+omegent-app[bot]@users.noreply.github.com>
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