Walkthrough
-
Mobile lists now apply explicit content insets and updated scroll positioning. Mobile thread feeds use revised end-follow and saved-position handling. Web lists and timelines use updated LegendList integrations, and the workspace updates the LegendList version.
Changes: Mobile list insets and positioning
Layer / File(s) Summary Bottom inset hook and file lists
apps/mobile/src/components/ui/useBarInset.ts,apps/mobile/src/features/files/*,apps/mobile/src/features/files/*.test.tsxA bottom-inset hook returns the iOS inset from column metrics or safe-area context, and returns zero on other platforms. File lists pass explicit top and bottom insets and disable automatic inset adjustment. Related test mocks return zero for the new hook. Home and pull-request list positioning
apps/mobile/src/features/home/HomeScreen.tsx,apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx,apps/mobile/src/features/pull-requests/PullRequestsScreen.tsx,apps/mobile/src/features/pull-requests/pullRequestTabScroll.*Home and pull-request lists use explicit platform-specific insets and updated scroll offsets. Pull-request tab switching and description restoration use LegendList scrolling APIs. Tests cover tab-offset thresholds, including fractional header positions. Mobile thread-feed positioning
Layer / File(s) Summary Saved row positions and submission anchors
apps/mobile/src/features/threads/thread-feed-scroll-position.*New helpers resolve saved row positions and submission anchors. Tests cover inserted rows and queued or deferred submissions. Work-log list positioning
apps/mobile/src/features/threads/thread-work-log.tsxThe work-log list saves visible-row positions, follows appended data through list configuration, and updates measurements from list events and subscriptions. Thread feed end state and disclosure positioning
apps/mobile/src/features/threads/ThreadFeed.tsx,apps/mobile/src/features/threads/ThreadDetailScreen.tsx,apps/mobile/src/features/threads/thread-feed-live-follow.*The feed uses fixed end maintenance, explicit insets, and visible-content anchoring. The screen receives feed end state and updates composer insets directly from layout. The prior live-follow and reflow helpers and their tests are removed. Web virtualized-list integrations
Layer / File(s) Summary List ref and branch pagination
apps/web/src/hooks/useLegendListRef.*,apps/web/src/components/BranchPicker.tsx,apps/web/src/state/paginatedBranches.*,pnpm-workspace.yaml,scripts/legend-list-initial-reveal.test.tsA shared hook subscribes to list size and boundary state. Branch pagination uses the list end-reached callback. The workspace updates LegendList to 3.7.2 and changes its patch and release-age entries; the initial-reveal test file is removed. Picker and command-palette lists
apps/web/src/components/CommandPaletteResults.tsx,apps/web/src/components/chat/ModelPickerContent.tsx,apps/web/src/components/settings/FontFamilyPicker.tsx,apps/web/src/components/CommandPalette.browser.test.tsxPicker fades derive from LegendList state. Command-palette results use index-based scrolling, while the font picker tracks list height and supplies expanded extra data. Browser coverage checks command-palette navigation and focus. Web timeline scrolling
Layer / File(s) Summary Timeline follow and disclosure behavior
apps/web/src/components/chat/MessagesTimeline.tsx,apps/web/src/components/chat/timelineViewport.*,apps/web/src/components/chat/useTimelineFollow.tsDisclosure changes preserve visible rows through list anchoring, and follow cancellation uses the list API. Upward-scroll navigation from an iframe requires hover or focus. Browser tests cover disclosure following and iframe scrolling. Guest send and timeline follow
apps/web/src/components/guest/GuestPage.*A successful guest send invokes a callback that scrolls the timeline to the end. The browser test sends through the composer before checking the streamed view. Estimated code review effort: 4 (Complex) | ~60 minutes
Possibly related issues
pingdotgg/t3code#31867— The issue concerns LegendList’sisAtEndstate, and this PR upgrades LegendList and changes end-follow behavior. Resolution of the reported iOS case is not verified here.pingdotgg/t3code#13706— The issue concerns scrolling after list data shrinks. This PR removes the LegendList patch and changes timeline end-follow behavior, but does not verify this case.pingdotgg/t3code#22350— The issue concerns scroll corrections during drag and momentum. This PR upgrades LegendList and changes visible-content anchoring, but does not verify the reported behavior.pingdotgg/t3code#13925— The issue concerns long-message row mounting and recycling. This PR changes long-message item types, but no measured effect is reported.
Suggested reviewers:
flamboh,juliusmarminge,macroscopeapp,t3dotgg
Merge Risk: External image Low · up to cb563
-
Reopening a deeply scrolled work group may land at the wrong row. This is a bounded navigation issue that should be fixed or explicitly accepted before merging.
Pre-merge checks: Passed 4
-
Check name Status Explanation Title check Passed The title "refactor: upgrade Legend List to 3.7.2 and drop our list workarounds" matches the main change: the @legendapp/listbump from 3.3.5 to 3.7.2 in pnpm-workspace.yaml, removal of the 3.3.5 patc…Description check Passed The description follows the repository template sections (Problem, Change, Scope and approval, Verification). Problem and Change are clear and explain the upgrade, the removed patch, and the replaced … Linked Issues check Passed Check skipped because no linked issues were found for this pull request. Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request. Full details: Title check
-
Explanation
The title "refactor: upgrade Legend List to 3.7.2 and drop our list workarounds" matches the main change: the
@legendapp/listbump from 3.3.5 to 3.7.2 in pnpm-workspace.yaml, removal of the 3.3.5 patch, and deletion of app-side scroll workarounds (thread-feed-live-follow.ts, the reveal test, shouldLoadNextBranchPageAfterScroll, and the ThreadFeed handle API). It is specific and conventional-commit formatted.
Full details: Description check
-
Explanation
The description follows the repository template sections (Problem, Change, Scope and approval, Verification). Problem and Change are clear and explain the upgrade, the removed patch, and the replaced workarounds. Scope and approval states it is a dependency upgrade with no new features, but it does not link a triaged issue or maintainer approval, which the template asks for. Verification is detailed and states what was not tested (Android, iPad, remote connections, Electron, final File/ZIP native inset edits). The description also includes a template-required agent footer that names the model and harness (Claude Opus 5.5 in Claude Code; Codex). The description is mostly complete, but the Scope and approval section is missing the approval link required for a large refactor.
Resolution
Optional improvement: in the Scope and approval section, link the triaged issue or maintainer discussion that approved upgrading Legend List and removing the patch. The template requires this for changes of this size, and the current text only states the change is a dependency upgrade.
-
Finishing Touches
-
Generate unit tests (beta)
-
- Create a new PR
-
- Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts