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

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, SidebarV2variant === "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/changesAug 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 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 freeto 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

@patroza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
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

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, SidebarV2variant === "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/changesAug 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 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 freeto 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

@patroza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

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, SidebarV2variant === "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/changesAug 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 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 freeto 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

@patroza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

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, SidebarV2variant === "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/changesAug 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 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 freeto 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

@patroza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
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

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, SidebarV2variant === "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/changesAug 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 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 freeto 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

@patroza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

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, SidebarV2variant === "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/changesAug 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 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 freeto 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

@patroza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

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, SidebarV2variant === "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/changesAug 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 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 freeto 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

@patroza
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
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

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, SidebarV2variant === "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/changesAug 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 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 freeto 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

@patroza